/*\r
-Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
For licensing, see LICENSE.html or http://ckeditor.com/license\r
*/\r
\r
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 = CKEDITOR.tools.trim( this.getValueOf( 'info', 'txtName' ) );\r
+ var attributes =\r
+ {\r
+ id : name,\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