Index: /CKEditor/branches/prototype/_source/core/config.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/config.js	(revision 2400)
+++ /CKEditor/branches/prototype/_source/core/config.js	(revision 2401)
@@ -146,5 +146,5 @@
 	 * The editor height, in CSS size format or pixel integer.
 	 * @type String|Number
-	 * @default '15em'
+	 * @default '200'
 	 * @example
 	 */
@@ -159,5 +159,5 @@
 	 * config.plugins = 'elementspath,toolbar,wysiwygarea';
 	 */
-	plugins : 'basicstyles,button,elementspath,htmldataprocessor,sourcearea,toolbar,wysiwygarea',
+	plugins : 'basicstyles,button,elementspath,htmldataprocessor,keystrokes,sourcearea,toolbar,wysiwygarea',
 
 	/**
Index: /CKEditor/branches/prototype/_source/core/dom/event.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/dom/event.js	(revision 2400)
+++ /CKEditor/branches/prototype/_source/core/dom/event.js	(revision 2401)
@@ -78,4 +78,36 @@
 
 		return keystroke;
+	},
+
+	/**
+	 * Prevents the original behavior of the event to happen. It can optionally
+	 * stop propagating the event in the event chain.
+	 * @param {Boolean} [stopPropagation] Stop propagating this event in the
+	 *		event chain.
+	 * @example
+	 * var element = CKEDITOR.document.getById( 'myElement' );
+	 * element.on( 'click', function( ev )
+	 *     {
+	 *         // The DOM event object is passed by the "data" property.
+	 *         var domEvent = ev.data;
+	 *         // Prevent the click to chave any effect in the element.
+	 *         domEvent.preventDefault();
+	 *     });
+	 */
+	preventDefault : function( stopPropagation )
+	{
+		var $ = this.$;
+		if ( $.preventDefault )
+			$.preventDefault();
+		else
+			$.returnValue = false;
+
+		if ( stopPropagation )
+		{
+			if ( $.stopPropagation )
+				$.stopPropagation();
+			else
+				$.cancelBubble = true;
+		}
 	}
 };
Index: /CKEditor/branches/prototype/_source/core/ui.js
===================================================================
--- /CKEditor/branches/prototype/_source/core/ui.js	(revision 2400)
+++ /CKEditor/branches/prototype/_source/core/ui.js	(revision 2401)
@@ -31,4 +31,8 @@
 		return editor.ui;
 
+	/**
+	 * Object used to hold private stuff.
+	 * @private
+	 */
 	this._ =
 	{
Index: /CKEditor/branches/prototype/_source/plugins/keystrokes/plugin.js
===================================================================
--- /CKEditor/branches/prototype/_source/plugins/keystrokes/plugin.js	(revision 2401)
+++ /CKEditor/branches/prototype/_source/plugins/keystrokes/plugin.js	(revision 2401)
@@ -0,0 +1,174 @@
+﻿/*
+ * CKEditor - The text editor for Internet - http://ckeditor.com
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ *  - GNU General Public License Version 2 or later (the "GPL")
+ *    http://www.gnu.org/licenses/gpl.html
+ *
+ *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ *    http://www.gnu.org/licenses/lgpl.html
+ *
+ *  - Mozilla Public License Version 1.1 or later (the "MPL")
+ *    http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+// Register a plugin named "sample".
+CKEDITOR.plugins.add( 'keystrokes',
+{
+	beforeInit : function( editor )
+	{
+		/**
+		 * Controls keystrokes typing in this editor instance.
+		 * @name CKEDITOR.editor.prototype.keystrokeHandler
+		 * @type CKEDITOR.keystrokeHandler
+		 * @example
+		 */
+		editor.keystrokeHandler = new CKEDITOR.keystrokeHandler( editor );
+	},
+
+	init : function( editor )
+	{
+		var keystrokesConfig	= editor.config.keystrokes,
+			blockedConfig		= editor.config.blockedKeystrokes;
+
+		var keystrokes			= editor.keystrokeHandler.keystrokes,
+			blockedKeystrokes	= editor.keystrokeHandler.blockedKeystrokes;
+
+		for ( var i = 0 ; i < keystrokesConfig.length ; i++ )
+		{
+			keystrokes[ keystrokesConfig[i][0] ] = keystrokesConfig[i][1];
+		}
+
+		for ( i = 0 ; i < blockedConfig.length ; i++ )
+		{
+			blockedKeystrokes[ blockedConfig[i] ] = 1;
+		}
+	}
+});
+
+/**
+ * Controls keystrokes typing in an editor instance.
+ * @constructor
+ * @param {CKEDITOR.editor} editor The editor instance.
+ * @example
+ */
+CKEDITOR.keystrokeHandler = function( editor )
+{
+	if ( editor.keystrokeHandler )
+		return editor.keystrokeHandler;
+
+	/**
+	 * List of keystrokes associated to commands. Each entry points to the
+	 * command to be executed.
+	 * @type Object
+	 * @example
+	 */
+	this.keystrokes = {};
+
+	/**
+	 * List of keystrokes that should be blocked if not defined at
+	 * {@link keystrokes}. In this way it is possible to block the default
+	 * browser behavior for those keystrokes.
+	 * @type Object
+	 * @example
+	 */
+	this.blockedKeystrokes = {};
+
+	this._ =
+	{
+		editor : editor
+	};
+	
+	return this;
+};
+
+(function()
+{
+	var onKeyDown = function( event )
+	{
+		// The DOM event object is passed by the "data" property.
+		event = event.data;
+
+		var keyCombination = event.getKeystroke();
+		var command = this.keystrokes[ keyCombination ];
+
+		var cancel = !this._.editor.fire( 'key', { keyCode : keyCombination } );
+
+		if ( !cancel )
+		{
+			if ( command )
+				cancel = ( this._.editor.execCommand( command ) !== false );
+
+			if ( !cancel )
+				cancel = !!this.blockedKeystrokes[ keyCombination ];
+		}
+
+		if ( cancel )
+			event.preventDefault( true );
+
+		return !cancel;
+	};
+
+	CKEDITOR.keystrokeHandler.prototype =
+	{
+		/**
+		 * Attaches this keystroke handle to a DOM object. Keystrokes typed
+		 ** over this object will get handled by this keystrokeHandler.
+		 * @param {CKEDITOR.dom.domObject} domObject The DOM object to attach
+		 *		to.
+		 * @example
+		 */
+		attach : function( domObject )
+		{
+			domObject.on( 'keydown', onKeyDown, this );
+		}
+	};
+})();
+
+/**
+ * A list of keystrokes to be blocked if not defined in the {@link #keystrokes}
+ * setting. In this way it is possible to block the default browser behavior
+ * for those keystrokes.
+ * @type Array
+ * @example
+ */
+CKEDITOR.config.blockedKeystrokes =
+[
+	CKEDITOR.CTRL + 66 /*B*/,
+	CKEDITOR.CTRL + 73 /*I*/,
+	CKEDITOR.CTRL + 85 /*U*/
+];
+
+/**
+ * A list associating keystrokes to editor commands. Each element in the list
+ * is an array where the first item is the keystroke, and the second is the
+ * command to be executed.
+ * @type Array
+ * @example
+ */
+CKEDITOR.config.keystrokes =
+[
+	[ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ],
+	[ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ],
+
+	[ CKEDITOR.CTRL + 86 /*V*/, 'paste' ],
+	[ CKEDITOR.SHIFT + 45 /*INS*/, 'paste' ],
+	[ CKEDITOR.CTRL + 88 /*X*/, 'cut' ],
+	[ CKEDITOR.SHIFT + 46 /*DEL*/, 'cut' ],
+	[ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
+	[ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
+	[ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ],
+	[ CKEDITOR.CTRL + 76 /*L*/, 'link' ],
+	[ CKEDITOR.CTRL + 66 /*B*/, 'bold' ],
+	[ CKEDITOR.CTRL + 73 /*I*/, 'italic' ],
+	[ CKEDITOR.CTRL + 85 /*U*/, 'underline' ],
+	[ CKEDITOR.CTRL + CKEDITOR.ALT + 13 /*ENTER*/, 'fitWindow' ],
+	[ CKEDITOR.SHIFT + 32 /*SPACE*/, 'nbsp' ]
+];
Index: /CKEditor/branches/prototype/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/prototype/_source/plugins/wysiwygarea/plugin.js	(revision 2400)
+++ /CKEditor/branches/prototype/_source/plugins/wysiwygarea/plugin.js	(revision 2401)
@@ -110,14 +110,4 @@
 						}
 
-//						iframe.on( 'blur', function()
-//							{
-//								console.log( 'iframe Blur' );
-//							});
-
-//						iframe.on( 'focus', function()
-//							{
-//								console.log( 'iframe Blur' );
-//							});
-
 						// Append the new IFRAME to the main element. For IE, it
 						// must be done after setting the "src", to avoid the
@@ -186,4 +176,8 @@
 								editor.focusManager.focus();
 							});
+
+						var keystrokeHandler = editor.keystrokeHandler;
+						if ( keystrokeHandler )
+							keystrokeHandler.attach( domDocument );
 
 						editor.fire( 'contentDom' );
Index: /CKEditor/branches/prototype/_source/themes/default/theme.js
===================================================================
--- /CKEditor/branches/prototype/_source/themes/default/theme.js	(revision 2400)
+++ /CKEditor/branches/prototype/_source/themes/default/theme.js	(revision 2401)
@@ -61,5 +61,5 @@
 		// differently by the browsers ("semi-inline").
 		var container = CKEDITOR.dom.element.createFromHtml( [
-			'<span id="cke_', name, '" class="cke_container cke_skin_', editor.config.skin, ' cke_', editor.lang.dir, '" dir="', editor.lang.dir, '">' +
+			'<span id="cke_', name, '" onmousedown="return false;" class="cke_container cke_skin_', editor.config.skin, ' cke_', editor.lang.dir, '" dir="', editor.lang.dir, '">' +
 				'<table class="cke_editor" border="0" cellspacing="0" cellpadding="0" style="width:', width, ';height:', height, '"><tbody>' +
 					'<tr', topHtml		? '' : ' style="display:none"', '><td id="cke_top_'		, name, '" class="cke_top">'		, topHtml		, '</td></tr>' +
Index: /CKEditor/branches/prototype/ckeditor.pack
===================================================================
--- /CKEditor/branches/prototype/ckeditor.pack	(revision 2400)
+++ /CKEditor/branches/prototype/ckeditor.pack	(revision 2401)
@@ -17,4 +17,7 @@
 		'CKEDITOR.ELEMENT_MODE_REPLACE' : 1,
 		'CKEDITOR.ELEMENT_MODE_APPENDTO' : 2,
+		'CKEDITOR.CTRL' : 1000,
+		'CKEDITOR.SHIFT' : 2000,
+		'CKEDITOR.ALT' : 4000,
 		'CKEDITOR.NODE_ELEMENT' : 1,
 		'CKEDITOR.NODE_TEXT' : 3,
@@ -63,4 +66,5 @@
 					'_source/core/dom/document.js',
 					'_source/core/config.js',
+					'_source/core/focusmanager.js',
 					'_source/core/lang.js',
 					'_source/core/scriptloader.js',
@@ -84,4 +88,5 @@
 					'_source/plugins/elementspath/plugin.js',
 					'_source/plugins/htmldataprocessor/plugin.js',
+					'_source/plugins/keystrokes/plugin.js',
 					'_source/plugins/sourcearea/plugin.js',
 					'_source/plugins/toolbar/plugin.js',
