Index: /FCKeditor/trunk/_whatsnew.html
===================================================================
--- /FCKeditor/trunk/_whatsnew.html	(revision 1500)
+++ /FCKeditor/trunk/_whatsnew.html	(revision 1501)
@@ -81,4 +81,6 @@
 			to empty the box in the "Paste from Word" has been removed as it lead to confusion for some 
 			users.</li>
+		<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1682">#1682</a>] Editing control elements
+			in Firefox, Opera and Safari now works properly.</li>
 	</ul>
 	<p>
Index: /FCKeditor/trunk/editor/_source/internals/fckselection_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckselection_gecko.js	(revision 1500)
+++ /FCKeditor/trunk/editor/_source/internals/fckselection_gecko.js	(revision 1501)
@@ -52,28 +52,17 @@
 FCKSelection.GetSelectedElement = function()
 {
-	var selectedElement = null ;
-
 	var selection = !!FCK.EditorWindow && FCK.EditorWindow.getSelection() ;
-
-	if ( selection && selection.anchorNode && selection.anchorNode.nodeType == 1 )
-	{
-		if ( this.GetType() == 'Control' )
-		{
-			// This one is good for all browsers, expect Safari Mac.
-			selectedElement = selection.anchorNode.childNodes[ selection.anchorOffset ] ;
-
-			// For Safari (Mac only), the anchor node for a control selection is
-			// the control itself, which seams logic. FF and Opera use the parent
-			// as the anchor node, pointing to the control with the offset.
-			// As FF created the selection "standard", Safari would do better by
-			// following their steps.
-			if ( !selectedElement )
-				selectedElement = selection.anchorNode ;
-			else if ( selectedElement.nodeType != 1 )
-				return null ;
-		}
-	}
-
-	return selectedElement ;
+	if ( !selection || selection.rangeCount < 1 )
+		return null ;
+
+	var range = selection.getRangeAt( 0 ) ;
+	if ( range.startContainer != range.endContainer || range.startContainer.nodeType != 1 || range.startOffset != range.endOffset - 1 )
+		return null ;
+
+	var node = range.startContainer.childNodes[ range.startOffset ] ;
+	if ( node.nodeType != 1 )
+		return null ;
+
+	return node ;
 }
 
