Index: /FCKeditor/trunk/_test/manual/fckcontextmenu/test1.htm
===================================================================
--- /FCKeditor/trunk/_test/manual/fckcontextmenu/test1.htm	(revision 682)
+++ /FCKeditor/trunk/_test/manual/fckcontextmenu/test1.htm	(revision 683)
@@ -153,4 +153,7 @@
 		</table>
 	</div>
+	<p>
+		<input type="checkbox" onclick="oContextMenu.CtrlDisable = this.checked" /> [CTRL] + [Right Click] always shows the default menu.
+	</p>
 </body>
 </html>
Index: /FCKeditor/trunk/editor/_source/classes/fckcontextmenu.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckcontextmenu.js	(revision 682)
+++ /FCKeditor/trunk/editor/_source/classes/fckcontextmenu.js	(revision 683)
@@ -49,9 +49,9 @@
 	{
 		this._Document = mouseClickWindow.document ;
-
-		// Opera doesn't provide a proper contextmenu event
-		if ( FCKBrowserInfo.IsOpera )
-			this.ConfigureOpera()
-
+		if ( FCKBrowserInfo.IsOpera && !( 'oncontextmenu' in document.createElement('foo') ) )
+		{
+			this._Document.addEventListener( 'mousedown', FCKContextMenu_Document_OnMouseDown, false ) ;
+			this._Document.addEventListener( 'mouseup', FCKContextMenu_Document_OnMouseUp, false ) ;
+		}
 		this._Document.addEventListener( 'contextmenu', FCKContextMenu_Document_OnContextMenu, false ) ;
 	}
@@ -83,6 +83,4 @@
 	else
 		element._FCKContextMenu = this ;
-
-//	element.onmouseup		= FCKContextMenu_AttachedElement_OnMouseUp ;
 }
 
@@ -107,11 +105,56 @@
 }
 
+var FCKContextMenu_OverrideButton ;
+
+function FCKContextMenu_Document_OnMouseDown( e )
+{
+	if( !e || e.button != 2 )
+		return ;
+
+	var el = e.target ;
+
+	while ( el )
+	{
+		if ( el._FCKContextMenu )
+		{
+			if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
+				return true ;
+
+			var overrideButton = FCKContextMenu_OverrideButton ;
+			if( !overrideButton )
+			{
+				var doc = e.target.ownerDocument ;
+				overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
+				overrideButton.type = 'button' ;
+				(doc.body||doc.documentElement).appendChild( overrideButton ) ;
+			}
+
+			overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) + 
+				'px;left:' + ( e.clientX - 2 ) + 
+				'px;width:5px;height:5px;opacity:0.01' ;
+		}
+		el = el.parentNode ;
+	}
+}
+
+function FCKContextMenu_Document_OnMouseUp( e )
+{
+	var overrideButton = FCKContextMenu_OverrideButton ;
+
+	if ( overrideButton )
+	{
+		overrideButton.parentNode.removeChild( overrideButton ) ;
+		FCKContextMenu_OverrideButton = undefined ;
+
+		if( e && e.button == 2 )
+		{
+			FCKContextMenu_Document_OnContextMenu( e ) ;
+			return false ;
+		}
+	}
+}
+
 function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
 {
-//	var iButton = e ? e.which - 1 : event.button ;
-
-//	if ( iButton != 2 )
-//		return ;
-
 	if ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) )
 		return true ;
@@ -149,73 +192,2 @@
 	FCKTools.RunFunction( contextMenu.OnItemClick, contextMenu, menuItem ) ;
 }
-
-
-///
-// We will take care to firing our own contextmenu event in Opera
-//
-// TODO: The menu appears way too high.
-//       Respect the preference to keep the default contextmenu on ctrl
-// 		 Provide an alternative to show the contextmenu using left click + accelerator. That's not exclusive to Opera.
-// 		 review the code and test it!
-FCKContextMenu.prototype.ConfigureOpera = function()
-{
-	doc = this._Document ;
-	
-	// If contextmenu is supported then exit, nothing to do
-	if ( 'oncontextmenu' in doc.createElement('foo') )
-		return;
-	
-	doc.addEventListener( 'mousedown', FCKContextMenu_Opera_mousedown, true ) ;
-
-	doc.addEventListener( 'mouseup', FCKContextMenu_Opera_mouseup, true) ;
-};
-
-function FCKContextMenu_Opera_dispatchCtxMenuEvent( e, evType )
-{
-	var doc = e.target.ownerDocument || (e.view ? e.view.document : null) || e.target ;
-	var newEv = doc.createEvent( 'MouseEvent' ) ;
-	newEv.initMouseEvent( evType||'contextmenu', true, true, doc.defaultView, e.detail,
-		e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey,
-		e.shiftKey, e.metaKey, e.button, e.relatedTarget ) ;
-	newEv.synthetic = true ;
-	e.target.dispatchEvent( newEv ) ;
-}
-
-function FCKContextMenu_Opera_mousedown(e)
-{
-	//right-click doesn't fire click event. Only mouseup
-	if ( e && e.button == 2 )
-	{
-		FCKContextMenu_Opera_cancelMenu( e ) ;
-		return false ;
-	}
-}
-
-var overrideButton ;
-	
-function FCKContextMenu_Opera_cancelMenu( e )
-{
-	if( !overrideButton )
-	{
-		var doc = e.target.ownerDocument ;
-		overrideButton = doc.createElement( 'input' ) ;
-		overrideButton.type = 'button' ;
-		(doc.body||doc.documentElement).appendChild( overrideButton ) ;
-	}
-	overrideButton.style = 'position:absolute;top:'+(e.clientY-2)+'px;left:'+(e.clientX-2)+'px;width:5px;height:5px;opacity:0.01' ;
-}
-
-function FCKContextMenu_Opera_mouseup( e )
-{
-	if ( overrideButton )
-	{
-		overrideButton.parentNode.removeChild( overrideButton ) ;
-		overrideButton = undefined ;
-	}
-	if( e && e.button == 2 )
-	{
-		//contextmenu must be fired here if we want to cancel the menu
-		FCKContextMenu_Opera_dispatchCtxMenuEvent( e, 'contextmenu' ) ;
-		return false ;
-	}
-}
