JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.5.3
[ckeditor.git] / _source / plugins / clipboard / dialogs / paste.js
1 /*\r
2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 CKEDITOR.dialog.add( 'paste', function( editor )\r
7 {\r
8         var lang = editor.lang.clipboard;\r
9         var isCustomDomain = CKEDITOR.env.isCustomDomain();\r
10 \r
11         function onPasteFrameLoad( win )\r
12         {\r
13                 var doc = new CKEDITOR.dom.document( win.document ),\r
14                         docElement = doc.$;\r
15 \r
16                 var script = doc.getById( 'cke_actscrpt' );\r
17                 script && script.remove();\r
18 \r
19                 CKEDITOR.env.ie ?\r
20                         docElement.body.contentEditable = "true" :\r
21                         docElement.designMode = "on";\r
22 \r
23                 // IE before version 8 will leave cursor blinking inside the document after\r
24                 // editor blurred unless we clean up the selection. (#4716)\r
25                 if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )\r
26                 {\r
27                         doc.getWindow().on( 'blur', function()\r
28                         {\r
29                                 docElement.selection.empty();\r
30                         } );\r
31                 }\r
32 \r
33                 doc.on( "keydown", function( e )\r
34                 {\r
35                         var domEvent = e.data,\r
36                                 key = domEvent.getKeystroke(),\r
37                                 processed;\r
38 \r
39                         switch( key )\r
40                         {\r
41                                 case 27 :\r
42                                         this.hide();\r
43                                         processed = 1;\r
44                                         break;\r
45 \r
46                                 case 9 :\r
47                                 case CKEDITOR.SHIFT + 9 :\r
48                                         this.changeFocus( true );\r
49                                         processed = 1;\r
50                         }\r
51 \r
52                         processed && domEvent.preventDefault();\r
53                 }, this );\r
54 \r
55                 editor.fire( 'ariaWidget', new CKEDITOR.dom.element( win.frameElement ) );\r
56         }\r
57 \r
58         return {\r
59                 title : lang.title,\r
60 \r
61                 minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,\r
62                 minHeight : CKEDITOR.env.quirks ? 250 : 245,\r
63                 onShow : function()\r
64                 {\r
65                         // FIREFOX BUG: Force the browser to render the dialog to make the to-be-\r
66                         // inserted iframe editable. (#3366)\r
67                         this.parts.dialog.$.offsetHeight;\r
68 \r
69                         var htmlToLoad =\r
70                                 '<html dir="' + editor.config.contentsLangDirection + '"' +\r
71                                 ' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +\r
72                                         '<head><style>body { margin: 3px; height: 95%; } </style></head><body>' +\r
73                                         '<script id="cke_actscrpt" type="text/javascript">' +\r
74                                         'window.parent.CKEDITOR.tools.callFunction( ' + CKEDITOR.tools.addFunction( onPasteFrameLoad, this ) + ', this );' +\r
75                                         '</script></body>' +\r
76                                 '</html>';\r
77 \r
78                         var src =\r
79                                 CKEDITOR.env.air ?\r
80                                         'javascript:void(0)' :\r
81                                 isCustomDomain ?\r
82                                         'javascript:void((function(){' +\r
83                                                 'document.open();' +\r
84                                                 'document.domain=\'' + document.domain + '\';' +\r
85                                                 'document.close();' +\r
86                                                 '})())"'\r
87                                 :\r
88                                         '';\r
89 \r
90                         var iframe = CKEDITOR.dom.element.createFromHtml(\r
91                                                 '<iframe' +\r
92                                                 ' class="cke_pasteframe"' +\r
93                                                 ' frameborder="0" ' +\r
94                                                 ' allowTransparency="true"' +\r
95                                                 ' src="' + src + '"' +\r
96                                                 ' role="region"' +\r
97                                                 ' aria-label="' + lang.pasteArea + '"' +\r
98                                                 ' aria-describedby="' + this.getContentElement( 'general', 'pasteMsg' ).domId + '"' +\r
99                                                 ' aria-multiple="true"' +\r
100                                                 '></iframe>' );\r
101 \r
102                         iframe.on( 'load', function( e )\r
103                                 {\r
104                                         e.removeListener();\r
105 \r
106                                         var doc = iframe.getFrameDocument();\r
107                                         doc.write( htmlToLoad );\r
108 \r
109                                         if ( CKEDITOR.env.air )\r
110                                                 onPasteFrameLoad.call( this, doc.getWindow().$ );\r
111                                 },\r
112                                 this );\r
113 \r
114                         iframe.setCustomData( 'dialog', this );\r
115 \r
116                         var field = this.getContentElement( 'general', 'editing_area' ),\r
117                                 container = field.getElement();\r
118                         container.setHtml( '' );\r
119                         container.append( iframe );\r
120 \r
121                         // IE need a redirect on focus to make\r
122                         // the cursor blinking inside iframe. (#5461)\r
123                         if ( CKEDITOR.env.ie )\r
124                         {\r
125                                 var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute;" role="presentation"></span>' );\r
126                                 focusGrabber.on( 'focus', function()\r
127                                 {\r
128                                         iframe.$.contentWindow.focus();\r
129                                 });\r
130                                 container.append( focusGrabber );\r
131 \r
132                                 // Override focus handler on field.\r
133                                 field.focus = function()\r
134                                 {\r
135                                         focusGrabber.focus();\r
136                                         this.fire( 'focus' );\r
137                                 };\r
138                         }\r
139 \r
140                         field.getInputElement = function(){ return iframe; };\r
141 \r
142                         // Force container to scale in IE.\r
143                         if ( CKEDITOR.env.ie )\r
144                         {\r
145                                 container.setStyle( 'display', 'block' );\r
146                                 container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );\r
147                         }\r
148                 },\r
149 \r
150                 onHide : function()\r
151                 {\r
152                         if ( CKEDITOR.env.ie )\r
153                                 this.getParentEditor().document.getBody().$.contentEditable = 'true';\r
154                 },\r
155 \r
156                 onLoad : function()\r
157                 {\r
158                         if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )\r
159                                 this.parts.contents.setStyle( 'overflow', 'hidden' );\r
160                 },\r
161 \r
162                 onOk : function()\r
163                 {\r
164                         var container = this.getContentElement( 'general', 'editing_area' ).getElement(),\r
165                                 iframe = container.getElementsByTag( 'iframe' ).getItem( 0 ),\r
166                                 editor = this.getParentEditor(),\r
167                                 body = iframe.getFrameDocument().getBody(),\r
168                                 bogus = body.getBogus(),\r
169                                 html;\r
170                         bogus && bogus.remove();\r
171                         // Saving the contents in variable so changes until paste is complete will not take place (#7500)\r
172                         html = body.getHtml();\r
173 \r
174                         setTimeout( function(){\r
175                                 editor.fire( 'paste', { 'html' : html } );\r
176                         }, 0 );\r
177 \r
178                 },\r
179 \r
180                 contents : [\r
181                         {\r
182                                 id : 'general',\r
183                                 label : editor.lang.common.generalTab,\r
184                                 elements : [\r
185                                         {\r
186                                                 type : 'html',\r
187                                                 id : 'securityMsg',\r
188                                                 html : '<div style="white-space:normal;width:340px;">' + lang.securityMsg + '</div>'\r
189                                         },\r
190                                         {\r
191                                                 type : 'html',\r
192                                                 id : 'pasteMsg',\r
193                                                 html : '<div style="white-space:normal;width:340px;">'+lang.pasteMsg +'</div>'\r
194                                         },\r
195                                         {\r
196                                                 type : 'html',\r
197                                                 id : 'editing_area',\r
198                                                 style : 'width: 100%; height: 100%;',\r
199                                                 html : '',\r
200                                                 focus : function()\r
201                                                 {\r
202                                                         var win = this.getInputElement().$.contentWindow;\r
203 \r
204                                                         // #3291 : JAWS needs the 500ms delay to detect that the editor iframe\r
205                                                         // iframe is no longer editable. So that it will put the focus into the\r
206                                                         // Paste from Word dialog's editable area instead.\r
207                                                         setTimeout( function()\r
208                                                         {\r
209                                                                 win.focus();\r
210                                                         }, 500 );\r
211                                                 }\r
212                                         }\r
213                                 ]\r
214                         }\r
215                 ]\r
216         };\r
217 });\r