re-added binary
[citadel.git] / webcit / tiny_mce / plugins / paste / editor_plugin_src.js
1 /* Import plugin specific language pack */ \r
2 tinyMCE.importPluginLanguagePack('paste', 'en,sv,cs,zh_cn,fr_ca,da,he,no,de,hu'); \r
3 \r
4 function TinyMCE_paste_getInfo() {\r
5         return {\r
6                 longname : 'Paste text/word',\r
7                 author : 'Moxiecode Systems',\r
8                 authorurl : 'http://tinymce.moxiecode.com',\r
9                 infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',\r
10                 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
11         };\r
12 };\r
13 \r
14 function TinyMCE_paste_initInstance(inst) {\r
15         if (tinyMCE.isMSIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false))\r
16                 tinyMCE.addEvent(inst.getBody(), "paste", TinyMCE_paste_handleEvent);\r
17 }\r
18 \r
19 function TinyMCE_paste_handleEvent(e) {\r
20         switch (e.type) {\r
21                 case "paste":\r
22                         var html = TinyMCE_paste__clipboardHTML();\r
23 \r
24                         // Removes italic, strong etc\r
25                         tinyMCE.execCommand('delete');\r
26 \r
27                         if (html && html.length > 0)\r
28                                 tinyMCE.execCommand('mcePasteWord', false, html);\r
29 \r
30                         tinyMCE.cancelEvent(e);\r
31                         return false;\r
32         }\r
33 \r
34         return true;\r
35 }\r
36 \r
37 function TinyMCE_paste_getControlHTML(control_name) { \r
38         switch (control_name) { \r
39                 case "pastetext": \r
40                         return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);" target="_self" onmousedown="return false;"><img id="{$editor_id}pastetext" src="{$pluginurl}/images/pastetext.gif" title="{$lang_paste_text_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
41 \r
42                 case "pasteword": \r
43                         return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);" target="_self" onmousedown="return false;"><img id="{$editor_id}pasteword" src="{$pluginurl}/images/pasteword.gif" title="{$lang_paste_word_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
44 \r
45                 case "selectall": \r
46                         return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');" target="_self" onmousedown="return false;"><img id="{$editor_id}selectall" src="{$pluginurl}/images/selectall.gif" title="{$lang_selectall_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
47         } \r
48 \r
49         return ''; \r
50\r
51 \r
52 function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) { \r
53         switch (command) { \r
54                 case "mcePasteText": \r
55                         if (user_interface) {\r
56                                 if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false))\r
57                                         TinyMCE_paste__insertText(clipboardData.getData("Text"), true); \r
58                                 else { \r
59                                         var template = new Array(); \r
60                                         template['file']        = '../../plugins/paste/pastetext.htm'; // Relative to theme \r
61                                         template['width']  = 450; \r
62                                         template['height'] = 400; \r
63                                         var plain_text = ""; \r
64                                         tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); \r
65                                 }\r
66                         } else\r
67                                 TinyMCE_paste__insertText(value['html'], value['linebreaks']);\r
68 \r
69                         return true;\r
70 \r
71                 case "mcePasteWord": \r
72                         if (user_interface) {\r
73                                 if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false)) {\r
74                                         var html = TinyMCE_paste__clipboardHTML();\r
75 \r
76                                         if (html && html.length > 0)\r
77                                                 TinyMCE_paste__insertWordContent(html);\r
78                                 } else { \r
79                                         var template = new Array(); \r
80                                         template['file']        = '../../plugins/paste/pasteword.htm'; // Relative to theme \r
81                                         template['width']  = 450; \r
82                                         template['height'] = 400; \r
83                                         var plain_text = ""; \r
84                                         tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});\r
85                                 }\r
86                         } else\r
87                                 TinyMCE_paste__insertWordContent(value);\r
88 \r
89                         return true;\r
90 \r
91                 case "mceSelectAll":\r
92                         tinyMCE.execInstanceCommand(editor_id, 'selectall'); \r
93                         return true; \r
94 \r
95         } \r
96 \r
97         // Pass to next handler in chain \r
98         return false; \r
99\r
100 \r
101 function TinyMCE_paste__insertText(content, bLinebreaks) { \r
102         if (content && content.length > 0) {\r
103                 if (bLinebreaks) { \r
104                         // Special paragraph treatment \r
105                         if (tinyMCE.getParam("plaintext_create_paragraphs", true)) { \r
106                                 content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi"); \r
107                                 content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi"); \r
108                                 content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi"); \r
109 \r
110                                 // Has paragraphs \r
111                                 if ((pos = content.indexOf('</p><p>')) != -1) { \r
112                                         tinyMCE.execCommand("Delete"); \r
113 \r
114                                         var node = tinyMCE.selectedInstance.getFocusElement(); \r
115 \r
116                                         // Get list of elements to break \r
117                                         var breakElms = new Array(); \r
118 \r
119                                         do { \r
120                                                 if (node.nodeType == 1) { \r
121                                                         // Don't break tables and break at body \r
122                                                         if (node.nodeName == "TD" || node.nodeName == "BODY") \r
123                                                                 break; \r
124         \r
125                                                         breakElms[breakElms.length] = node; \r
126                                                 } \r
127                                         } while(node = node.parentNode); \r
128 \r
129                                         var before = "", after = "</p>"; \r
130                                         before += content.substring(0, pos); \r
131 \r
132                                         for (var i=0; i<breakElms.length; i++) { \r
133                                                 before += "</" + breakElms[i].nodeName + ">"; \r
134                                                 after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; \r
135                                         } \r
136 \r
137                                         before += "<p>"; \r
138                                         content = before + content.substring(pos+7) + after; \r
139                                 } \r
140                         } \r
141 \r
142                         content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi"); \r
143                         content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi"); \r
144                         content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi"); \r
145                 } \r
146         \r
147                 tinyMCE.execCommand("mceInsertRawHTML", false, content); \r
148         }\r
149 }\r
150 \r
151 function TinyMCE_paste__insertWordContent(content) { \r
152         if (content && content.length > 0) {\r
153                 // Cleanup Word content\r
154                 var bull = String.fromCharCode(8226);\r
155                 var middot = String.fromCharCode(183);\r
156 \r
157                 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
158                         content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');\r
159                 }\r
160 \r
161                 content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");\r
162                 content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");\r
163                 content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list\r
164                 content = content.replace(/<o:p><\/o:p>/gi, "");\r
165                 content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks\r
166                 content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments\r
167                 content = content.replace(/<\/?span[^>]*>/gi, "");\r
168                 content = content.replace(new RegExp('<(\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");\r
169                 content = content.replace(/<\/?font[^>]*>/gi, "");\r
170                 content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");\r
171                 content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");\r
172                 content = content.replace(/<\\?\?xml[^>]*>/gi, "");\r
173                 content = content.replace(/<\/?\w+:[^>]*>/gi, "");\r
174                 content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks\r
175                 content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks\r
176 \r
177 //              content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;\r
178 //              content = content.replace(/<p>&nbsp;<\/p>/gi, '');\r
179 \r
180                 if (!tinyMCE.settings['force_p_newlines']) {\r
181                         content = content.replace('', '' ,'gi');\r
182                         content = content.replace('</p>', '<br /><br />' ,'gi');\r
183                 }\r
184 \r
185                 if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {\r
186                         content = content.replace(/<\/?p[^>]*>/gi, "");\r
187                 }\r
188 \r
189                 content = content.replace(/<\/?div[^>]*>/gi, "");\r
190 \r
191                 // Convert all middlot lists to UL lists\r
192                 if (tinyMCE.getParam("paste_convert_middot_lists", true)) {\r
193                         var div = document.createElement("div");\r
194                         div.innerHTML = content;\r
195 \r
196                         // Convert all middot paragraphs to li elements\r
197                         var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");\r
198 \r
199                         while (TinyMCE_paste_convertMiddots(div, "--list--")) ; // bull\r
200                         while (TinyMCE_paste_convertMiddots(div, middot, className)) ; // Middot\r
201                         while (TinyMCE_paste_convertMiddots(div, bull)) ; // bull\r
202 \r
203                         content = div.innerHTML;\r
204                 }\r
205 \r
206                 // Replace all headers with strong and fix some other issues\r
207                 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
208                         content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');\r
209                         content = content.replace(/<h[1-6]>/gi, '<p><b>');\r
210                         content = content.replace(/<\/h[1-6]>/gi, '</b></p>');\r
211                         content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');\r
212                         content = content.replace(/^(&nbsp;)*/gi, '');\r
213                 }\r
214 \r
215                 content = content.replace(/--list--/gi, ""); // Remove --list--\r
216 \r
217                 // Insert cleaned content\r
218                 tinyMCE.execCommand("mceInsertContent", false, content);\r
219                 tinyMCE.execCommand("mceCleanup"); // Do normal cleanup\r
220         }\r
221 }\r
222 \r
223 function TinyMCE_paste_convertMiddots(div, search, class_name) {\r
224         var mdot = String.fromCharCode(183);\r
225         var bull = String.fromCharCode(8226);\r
226 \r
227         var nodes = div.getElementsByTagName("p");\r
228         for (var i=0; i<nodes.length; i++) {\r
229                 var p = nodes[i];\r
230 \r
231                 // Is middot\r
232                 if (p.innerHTML.indexOf(search) != -1) {\r
233                         var ul = document.createElement("ul");\r
234 \r
235                         if (class_name)\r
236                                 ul.className = class_name;\r
237 \r
238                         // Add the first one\r
239                         var li = document.createElement("li");\r
240                         li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
241                         ul.appendChild(li);\r
242 \r
243                         // Add the rest\r
244                         var np = p.nextSibling;\r
245                         while (np) {\r
246                                 // Not element or middot paragraph\r
247                                 if (np.nodeType != 1 || np.innerHTML.indexOf(search) == -1)\r
248                                         break;\r
249 \r
250                                 var cp = np.nextSibling;\r
251                                 var li = document.createElement("li");\r
252                                 li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
253                                 np.parentNode.removeChild(np);\r
254                                 ul.appendChild(li);\r
255                                 np = cp;\r
256                         }\r
257 \r
258                         p.parentNode.replaceChild(ul, p);\r
259 \r
260                         return true;\r
261                 }\r
262         }\r
263 \r
264         return false;\r
265 }\r
266 \r
267 function TinyMCE_paste__clipboardHTML() {\r
268         var div = document.getElementById('_TinyMCE_clipboardHTML');\r
269 \r
270         if (!div) {\r
271                 var div = document.createElement('DIV');\r
272                 div.id = '_TinyMCE_clipboardHTML';\r
273 \r
274                 with (div.style) {\r
275                         visibility = 'hidden';\r
276                         overflow = 'hidden';\r
277                         position = 'absolute';\r
278                         width = 1;\r
279                         height = 1;\r
280                 }\r
281 \r
282                 document.body.appendChild(div);\r
283         }\r
284 \r
285         div.innerHTML = '';\r
286         var rng = document.body.createTextRange();\r
287         rng.moveToElementText(div);\r
288         rng.execCommand('Paste');\r
289         var html = div.innerHTML;\r
290         div.innerHTML = '';\r
291         return html;\r
292 }\r