]>
Commit | Line | Data |
---|---|---|
1 | /**\r | |
2 | * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\r | |
3 | * For licensing, see LICENSE.md or http://ckeditor.com/license\r | |
4 | */\r | |
5 | \r | |
6 | CKEDITOR.dialog.add( 'anchor', function( editor ) {\r | |
7 | // Function called in onShow to load selected element.\r | |
8 | var loadElements = function( element ) {\r | |
9 | this._.selectedElement = element;\r | |
10 | \r | |
11 | var attributeValue = element.data( 'cke-saved-name' );\r | |
12 | this.setValueOf( 'info', 'txtName', attributeValue || '' );\r | |
13 | };\r | |
14 | \r | |
15 | function createFakeAnchor( editor, attributes ) {\r | |
16 | return editor.createFakeElement( editor.document.createElement( 'a', {\r | |
17 | attributes: attributes\r | |
18 | } ), 'cke_anchor', 'anchor' );\r | |
19 | }\r | |
20 | \r | |
21 | \r | |
22 | function getSelectedAnchor( selection ) {\r | |
23 | var range = selection.getRanges()[ 0 ],\r | |
24 | element = selection.getSelectedElement();\r | |
25 | \r | |
26 | // In case of table cell selection, we want to shrink selection from td to a element.\r | |
27 | range.shrink( CKEDITOR.SHRINK_ELEMENT );\r | |
28 | element = range.getEnclosedNode();\r | |
29 | \r | |
30 | if ( element && element.type === CKEDITOR.NODE_ELEMENT &&\r | |
31 | ( element.data( 'cke-real-element-type' ) === 'anchor' || element.is( 'a' ) ) ) {\r | |
32 | return element;\r | |
33 | }\r | |
34 | }\r | |
35 | \r | |
36 | return {\r | |
37 | title: editor.lang.link.anchor.title,\r | |
38 | minWidth: 300,\r | |
39 | minHeight: 60,\r | |
40 | onOk: function() {\r | |
41 | var name = CKEDITOR.tools.trim( this.getValueOf( 'info', 'txtName' ) );\r | |
42 | var attributes = {\r | |
43 | id: name,\r | |
44 | name: name,\r | |
45 | 'data-cke-saved-name': name\r | |
46 | };\r | |
47 | \r | |
48 | if ( this._.selectedElement ) {\r | |
49 | if ( this._.selectedElement.data( 'cke-realelement' ) ) {\r | |
50 | var newFake = createFakeAnchor( editor, attributes );\r | |
51 | newFake.replace( this._.selectedElement );\r | |
52 | \r | |
53 | // Selecting fake element for IE. (http://dev.ckeditor.com/ticket/11377)\r | |
54 | if ( CKEDITOR.env.ie ) {\r | |
55 | editor.getSelection().selectElement( newFake );\r | |
56 | }\r | |
57 | } else {\r | |
58 | this._.selectedElement.setAttributes( attributes );\r | |
59 | }\r | |
60 | } else {\r | |
61 | var sel = editor.getSelection(),\r | |
62 | range = sel && sel.getRanges()[ 0 ];\r | |
63 | \r | |
64 | // Empty anchor\r | |
65 | if ( range.collapsed ) {\r | |
66 | var anchor = createFakeAnchor( editor, attributes );\r | |
67 | range.insertNode( anchor );\r | |
68 | } else {\r | |
69 | if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 )\r | |
70 | attributes[ 'class' ] = 'cke_anchor';\r | |
71 | \r | |
72 | // Apply style.\r | |
73 | var style = new CKEDITOR.style( { element: 'a', attributes: attributes } );\r | |
74 | style.type = CKEDITOR.STYLE_INLINE;\r | |
75 | style.applyToRange( range );\r | |
76 | }\r | |
77 | }\r | |
78 | },\r | |
79 | \r | |
80 | onHide: function() {\r | |
81 | delete this._.selectedElement;\r | |
82 | },\r | |
83 | \r | |
84 | onShow: function() {\r | |
85 | var sel = editor.getSelection(),\r | |
86 | fullySelected = getSelectedAnchor( sel ),\r | |
87 | fakeSelected = fullySelected && fullySelected.data( 'cke-realelement' ),\r | |
88 | linkElement = fakeSelected ?\r | |
89 | CKEDITOR.plugins.link.tryRestoreFakeAnchor( editor, fullySelected ) :\r | |
90 | CKEDITOR.plugins.link.getSelectedLink( editor );\r | |
91 | \r | |
92 | if ( linkElement ) {\r | |
93 | loadElements.call( this, linkElement );\r | |
94 | !fakeSelected && sel.selectElement( linkElement );\r | |
95 | \r | |
96 | if ( fullySelected ) {\r | |
97 | this._.selectedElement = fullySelected;\r | |
98 | }\r | |
99 | }\r | |
100 | \r | |
101 | this.getContentElement( 'info', 'txtName' ).focus();\r | |
102 | },\r | |
103 | contents: [ {\r | |
104 | id: 'info',\r | |
105 | label: editor.lang.link.anchor.title,\r | |
106 | accessKey: 'I',\r | |
107 | elements: [ {\r | |
108 | type: 'text',\r | |
109 | id: 'txtName',\r | |
110 | label: editor.lang.link.anchor.name,\r | |
111 | required: true,\r | |
112 | validate: function() {\r | |
113 | if ( !this.getValue() ) {\r | |
114 | alert( editor.lang.link.anchor.errorName ); // jshint ignore:line\r | |
115 | return false;\r | |
116 | }\r | |
117 | return true;\r | |
118 | }\r | |
119 | } ]\r | |
120 | } ]\r | |
121 | };\r | |
122 | } );\r |