JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6
[ckeditor.git] / _source / plugins / link / dialogs / anchor.js
index 3748e36..1fbcc2a 100644 (file)
@@ -6,68 +6,113 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 CKEDITOR.dialog.add( 'anchor', function( editor )\r
 {\r
        // Function called in onShow to load selected element.\r
-       var loadElements = function( editor, selection, element )\r
+       var loadElements = function( element )\r
        {\r
-               this.editMode = true;\r
-               this.editObj = element;\r
+               this._.selectedElement = element;\r
 \r
-               var attributeValue = this.editObj.getAttribute( 'name' );\r
-               if ( attributeValue )\r
-                       this.setValueOf( 'info','txtName', attributeValue );\r
-               else\r
-                       this.setValueOf( 'info','txtName', "" );\r
+               var attributeValue = element.data( 'cke-saved-name' );\r
+               this.setValueOf( 'info','txtName', attributeValue || '' );\r
        };\r
 \r
+       function createFakeAnchor( editor, anchor )\r
+       {\r
+               return editor.createFakeElement( anchor, 'cke_anchor', 'anchor' );\r
+       }\r
+\r
        return {\r
                title : editor.lang.anchor.title,\r
                minWidth : 300,\r
                minHeight : 60,\r
                onOk : function()\r
                {\r
-                       // Always create a new anchor, because of IE BUG.\r
-                       var name = this.getValueOf( 'info', 'txtName' ),\r
-                               element = CKEDITOR.env.ie && !( CKEDITOR.document.$.documentMode >= 8 ) ?\r
-                               editor.document.createElement( '<a name="' + CKEDITOR.tools.htmlEncode( name ) + '">' ) :\r
-                               editor.document.createElement( 'a' );\r
+                       var name = this.getValueOf( 'info', 'txtName' );\r
+                       var attributes =\r
+                       {\r
+                               name : name,\r
+                               'data-cke-saved-name' : name\r
+                       };\r
 \r
-                       // Move contents and attributes of old anchor to new anchor.\r
-                       if ( this.editMode )\r
+                       if ( this._.selectedElement )\r
                        {\r
-                               this.editObj.copyAttributes( element, { name : 1 } );\r
-                               this.editObj.moveChildren( element );\r
+                               if ( this._.selectedElement.data( 'cke-realelement' ) )\r
+                               {\r
+                                       var newFake = createFakeAnchor( editor, editor.document.createElement( 'a', { attributes: attributes } ) );\r
+                                       newFake.replace( this._.selectedElement );\r
+                               }\r
+                               else\r
+                                       this._.selectedElement.setAttributes( attributes );\r
                        }\r
-\r
-                       // Set name.\r
-                       element.data( 'cke-saved-name', false );\r
-                       element.setAttribute( 'name', name );\r
-\r
-                       // Insert a new anchor.\r
-                       var fakeElement = editor.createFakeElement( element, 'cke_anchor', 'anchor' );\r
-                       if ( !this.editMode )\r
-                               editor.insertElement( fakeElement );\r
                        else\r
                        {\r
-                               fakeElement.replace( this.fakeObj );\r
-                               editor.getSelection().selectElement( fakeElement );\r
+                               var sel = editor.getSelection(),\r
+                                               range = sel && sel.getRanges()[ 0 ];\r
+\r
+                               // Empty anchor\r
+                               if ( range.collapsed )\r
+                               {\r
+                                       if ( CKEDITOR.plugins.link.synAnchorSelector )\r
+                                               attributes[ 'class' ] = 'cke_anchor_empty';\r
+\r
+                                       if ( CKEDITOR.plugins.link.emptyAnchorFix )\r
+                                       {\r
+                                               attributes[ 'contenteditable' ] = 'false';\r
+                                               attributes[ 'data-cke-editable' ] = 1;\r
+                                       }\r
+\r
+                                       var anchor = editor.document.createElement( 'a', { attributes: attributes } );\r
+\r
+                                       // Transform the anchor into a fake element for browsers that need it.\r
+                                       if ( CKEDITOR.plugins.link.fakeAnchor )\r
+                                               anchor = createFakeAnchor( editor, anchor );\r
+\r
+                                       range.insertNode( anchor );\r
+                               }\r
+                               else\r
+                               {\r
+                                       if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 )\r
+                                               attributes['class'] = 'cke_anchor';\r
+\r
+                                       // Apply style.\r
+                                       var style = new CKEDITOR.style( { element : 'a', attributes : attributes } );\r
+                                       style.type = CKEDITOR.STYLE_INLINE;\r
+                                       style.apply( editor.document );\r
+                               }\r
                        }\r
+               },\r
 \r
-                       return true;\r
+               onHide : function()\r
+               {\r
+                       delete this._.selectedElement;\r
                },\r
+\r
                onShow : function()\r
                {\r
-                       this.editObj = false;\r
-                       this.fakeObj = false;\r
-                       this.editMode = false;\r
+                       var selection = editor.getSelection(),\r
+                               fullySelected = selection.getSelectedElement(),\r
+                               partialSelected;\r
 \r
-                       var selection = editor.getSelection();\r
-                       var element = selection.getSelectedElement();\r
-                       if ( element && element.data( 'cke-real-element-type' ) && element.data( 'cke-real-element-type' ) == 'anchor' )\r
+                       // Detect the anchor under selection.\r
+                       if ( fullySelected )\r
                        {\r
-                               this.fakeObj = element;\r
-                               element = editor.restoreRealElement( this.fakeObj );\r
-                               loadElements.apply( this, [ editor, selection, element ] );\r
-                               selection.selectElement( this.fakeObj );\r
+                               if ( CKEDITOR.plugins.link.fakeAnchor )\r
+                               {\r
+                                       var realElement = CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, fullySelected );\r
+                                       realElement && loadElements.call( this, realElement );\r
+                                       this._.selectedElement = fullySelected;\r
+                               }\r
+                               else if ( fullySelected.is( 'a' ) && fullySelected.hasAttribute( 'name' ) )\r
+                                       loadElements.call( this, fullySelected );\r
                        }\r
+                       else\r
+                       {\r
+                               partialSelected = CKEDITOR.plugins.link.getSelectedLink( editor );\r
+                               if ( partialSelected )\r
+                               {\r
+                                       loadElements.call( this, partialSelected );\r
+                                       selection.selectElement( partialSelected );\r
+                               }\r
+                       }\r
+\r
                        this.getContentElement( 'info', 'txtName' ).focus();\r
                },\r
                contents : [\r