1/* 2Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. 3For licensing, see LICENSE.html or http://ckeditor.com/license 4*/ 5 6CKEDITOR.dialog.add( 'anchor', function( editor ) 7{ 8 // Function called in onShow to load selected element. 9 var loadElements = function( element ) 10 { 11 this._.selectedElement = element; 12 13 var attributeValue = element.data( 'cke-saved-name' ); 14 this.setValueOf( 'info','txtName', attributeValue || '' ); 15 }; 16 17 function createFakeAnchor( editor, anchor ) 18 { 19 return editor.createFakeElement( anchor, 'cke_anchor', 'anchor' ); 20 } 21 22 return { 23 title : editor.lang.anchor.title, 24 minWidth : 300, 25 minHeight : 60, 26 onOk : function() 27 { 28 var name = this.getValueOf( 'info', 'txtName' ); 29 var attributes = 30 { 31 name : name, 32 'data-cke-saved-name' : name 33 }; 34 35 if ( this._.selectedElement ) 36 { 37 if ( this._.selectedElement.data( 'cke-realelement' ) ) 38 { 39 var newFake = createFakeAnchor( editor, editor.document.createElement( 'a', { attributes: attributes } ) ); 40 newFake.replace( this._.selectedElement ); 41 } 42 else 43 this._.selectedElement.setAttributes( attributes ); 44 } 45 else 46 { 47 var sel = editor.getSelection(), 48 range = sel && sel.getRanges()[ 0 ]; 49 50 // Empty anchor 51 if ( range.collapsed ) 52 { 53 if ( CKEDITOR.plugins.link.synAnchorSelector ) 54 attributes[ 'class' ] = 'cke_anchor_empty'; 55 56 if ( CKEDITOR.plugins.link.emptyAnchorFix ) 57 { 58 attributes[ 'contenteditable' ] = 'false'; 59 attributes[ 'data-cke-editable' ] = 1; 60 } 61 62 var anchor = editor.document.createElement( 'a', { attributes: attributes } ); 63 64 // Transform the anchor into a fake element for browsers that need it. 65 if ( CKEDITOR.plugins.link.fakeAnchor ) 66 anchor = createFakeAnchor( editor, anchor ); 67 68 range.insertNode( anchor ); 69 } 70 else 71 { 72 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) 73 attributes['class'] = 'cke_anchor'; 74 75 // Apply style. 76 var style = new CKEDITOR.style( { element : 'a', attributes : attributes } ); 77 style.type = CKEDITOR.STYLE_INLINE; 78 style.apply( editor.document ); 79 } 80 } 81 }, 82 83 onHide : function() 84 { 85 delete this._.selectedElement; 86 }, 87 88 onShow : function() 89 { 90 var selection = editor.getSelection(), 91 fullySelected = selection.getSelectedElement(), 92 partialSelected; 93 94 // Detect the anchor under selection. 95 if ( fullySelected ) 96 { 97 if ( CKEDITOR.plugins.link.fakeAnchor ) 98 { 99 var realElement = CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, fullySelected ); 100 realElement && loadElements.call( this, realElement ); 101 this._.selectedElement = fullySelected; 102 } 103 else if ( fullySelected.is( 'a' ) && fullySelected.hasAttribute( 'name' ) ) 104 loadElements.call( this, fullySelected ); 105 } 106 else 107 { 108 partialSelected = CKEDITOR.plugins.link.getSelectedLink( editor ); 109 if ( partialSelected ) 110 { 111 loadElements.call( this, partialSelected ); 112 selection.selectElement( partialSelected ); 113 } 114 } 115 116 this.getContentElement( 'info', 'txtName' ).focus(); 117 }, 118 contents : [ 119 { 120 id : 'info', 121 label : editor.lang.anchor.title, 122 accessKey : 'I', 123 elements : 124 [ 125 { 126 type : 'text', 127 id : 'txtName', 128 label : editor.lang.anchor.name, 129 required: true, 130 validate : function() 131 { 132 if ( !this.getValue() ) 133 { 134 alert( editor.lang.anchor.errorName ); 135 return false; 136 } 137 return true; 138 } 139 } 140 ] 141 } 142 ] 143 }; 144} ); 145