src/crypto.c: possible fix for memory leak related
[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,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl,nl,fr,pt_br');\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                         var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);return false;';\r
41                         return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" 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
42 \r
43                 case "pasteword":\r
44                         var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);return false;';\r
45                         return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" 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
46 \r
47                 case "selectall":\r
48                         var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');return false;';\r
49                         return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" 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
50         } \r
51 \r
52         return ''; \r
53\r
54 \r
55 function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) { \r
56         switch (command) { \r
57                 case "mcePasteText": \r
58                         if (user_interface) {\r
59                                 if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false))\r
60                                         TinyMCE_paste__insertText(clipboardData.getData("Text"), true); \r
61                                 else { \r
62                                         var template = new Array(); \r
63                                         template['file']        = '../../plugins/paste/pastetext.htm'; // Relative to theme \r
64                                         template['width']  = 450; \r
65                                         template['height'] = 400; \r
66                                         var plain_text = ""; \r
67                                         tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); \r
68                                 }\r
69                         } else\r
70                                 TinyMCE_paste__insertText(value['html'], value['linebreaks']);\r
71 \r
72                         return true;\r
73 \r
74                 case "mcePasteWord": \r
75                         if (user_interface) {\r
76                                 if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) {\r
77                                         var html = TinyMCE_paste__clipboardHTML();\r
78 \r
79                                         if (html && html.length > 0)\r
80                                                 TinyMCE_paste__insertWordContent(html);\r
81                                 } else { \r
82                                         var template = new Array(); \r
83                                         template['file']        = '../../plugins/paste/pasteword.htm'; // Relative to theme \r
84                                         template['width']  = 450; \r
85                                         template['height'] = 400; \r
86                                         var plain_text = ""; \r
87                                         tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});\r
88                                 }\r
89                         } else\r
90                                 TinyMCE_paste__insertWordContent(value);\r
91 \r
92                         return true;\r
93 \r
94                 case "mceSelectAll":\r
95                         tinyMCE.execInstanceCommand(editor_id, 'selectall'); \r
96                         return true; \r
97 \r
98         } \r
99 \r
100         // Pass to next handler in chain \r
101         return false; \r
102\r
103 \r
104 function TinyMCE_paste__insertText(content, bLinebreaks) { \r
105         if (content && content.length > 0) {\r
106                 if (bLinebreaks) { \r
107                         // Special paragraph treatment \r
108                         if (tinyMCE.getParam("paste_create_paragraphs", true)) {\r
109                                 var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
110                                 for (var i=0; i<rl.length; i+=2)\r
111                                         content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
112 \r
113                                 content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi"); \r
114                                 content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi"); \r
115                                 content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi"); \r
116 \r
117                                 // Has paragraphs \r
118                                 if ((pos = content.indexOf('</p><p>')) != -1) { \r
119                                         tinyMCE.execCommand("Delete"); \r
120 \r
121                                         var node = tinyMCE.selectedInstance.getFocusElement(); \r
122 \r
123                                         // Get list of elements to break \r
124                                         var breakElms = new Array(); \r
125 \r
126                                         do { \r
127                                                 if (node.nodeType == 1) { \r
128                                                         // Don't break tables and break at body \r
129                                                         if (node.nodeName == "TD" || node.nodeName == "BODY") \r
130                                                                 break; \r
131         \r
132                                                         breakElms[breakElms.length] = node; \r
133                                                 } \r
134                                         } while(node = node.parentNode); \r
135 \r
136                                         var before = "", after = "</p>"; \r
137                                         before += content.substring(0, pos); \r
138 \r
139                                         for (var i=0; i<breakElms.length; i++) { \r
140                                                 before += "</" + breakElms[i].nodeName + ">"; \r
141                                                 after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; \r
142                                         } \r
143 \r
144                                         before += "<p>"; \r
145                                         content = before + content.substring(pos+7) + after; \r
146                                 } \r
147                         } \r
148 \r
149                         if (tinyMCE.getParam("paste_create_linebreaks", true)) {\r
150                                 content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi"); \r
151                                 content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi"); \r
152                                 content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi"); \r
153                         }\r
154                 } \r
155         \r
156                 tinyMCE.execCommand("mceInsertRawHTML", false, content); \r
157         }\r
158 }\r
159 \r
160 function TinyMCE_paste__insertWordContent(content) { \r
161         if (content && content.length > 0) {\r
162                 // Cleanup Word content\r
163                 var bull = String.fromCharCode(8226);\r
164                 var middot = String.fromCharCode(183);\r
165 \r
166                 var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
167                 for (var i=0; i<rl.length; i+=2)\r
168                         content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
169 \r
170                 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
171                         content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');\r
172                 }\r
173 \r
174                 content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");\r
175                 content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");\r
176                 content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list\r
177                 content = content.replace(/<o:p><\/o:p>/gi, "");\r
178                 content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks\r
179                 content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments\r
180                 content = content.replace(/<\/?span[^>]*>/gi, "");\r
181                 content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");\r
182                 content = content.replace(/<\/?font[^>]*>/gi, "");\r
183 \r
184                 // Strips class attributes.\r
185                 switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) {\r
186                         case "all":\r
187                                 content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");\r
188                                 break;\r
189 \r
190                         case "mso":\r
191                                 content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");\r
192                                 break;\r
193                 }\r
194 \r
195                 content = content.replace(new RegExp('href="?' + TinyMCE_paste__reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']);\r
196                 content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");\r
197                 content = content.replace(/<\\?\?xml[^>]*>/gi, "");\r
198                 content = content.replace(/<\/?\w+:[^>]*>/gi, "");\r
199                 content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks\r
200                 content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks\r
201 \r
202 //              content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;\r
203 //              content = content.replace(/<p>&nbsp;<\/p>/gi, '');\r
204 \r
205                 if (!tinyMCE.settings['force_p_newlines']) {\r
206                         content = content.replace('', '' ,'gi');\r
207                         content = content.replace('</p>', '<br /><br />' ,'gi');\r
208                 }\r
209 \r
210                 if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {\r
211                         content = content.replace(/<\/?p[^>]*>/gi, "");\r
212                 }\r
213 \r
214                 content = content.replace(/<\/?div[^>]*>/gi, "");\r
215 \r
216                 // Convert all middlot lists to UL lists\r
217                 if (tinyMCE.getParam("paste_convert_middot_lists", true)) {\r
218                         var div = document.createElement("div");\r
219                         div.innerHTML = content;\r
220 \r
221                         // Convert all middot paragraphs to li elements\r
222                         var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");\r
223 \r
224                         while (TinyMCE_paste_convertMiddots(div, "--list--")) ; // bull\r
225                         while (TinyMCE_paste_convertMiddots(div, middot, className)) ; // Middot\r
226                         while (TinyMCE_paste_convertMiddots(div, bull)) ; // bull\r
227 \r
228                         content = div.innerHTML;\r
229                 }\r
230 \r
231                 // Replace all headers with strong and fix some other issues\r
232                 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
233                         content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');\r
234                         content = content.replace(/<h[1-6]>/gi, '<p><b>');\r
235                         content = content.replace(/<\/h[1-6]>/gi, '</b></p>');\r
236                         content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');\r
237                         content = content.replace(/^(&nbsp;)*/gi, '');\r
238                 }\r
239 \r
240                 content = content.replace(/--list--/gi, ""); // Remove --list--\r
241 \r
242                 // Insert cleaned content\r
243                 tinyMCE.execCommand("mceInsertContent", false, content);\r
244                 tinyMCE.execCommand("mceCleanup"); // Do normal cleanup\r
245         }\r
246 }\r
247 \r
248 function TinyMCE_paste__reEscape(s) {\r
249         var l = "?.\\*[](){}+^$:";\r
250         var o = "";\r
251 \r
252         for (var i=0; i<s.length; i++) {\r
253                 var c = s.charAt(i);\r
254 \r
255                 if (l.indexOf(c) != -1)\r
256                         o += '\\' + c;\r
257                 else\r
258                         o += c;\r
259         }\r
260 \r
261         return o;\r
262 }\r
263 \r
264 function TinyMCE_paste_convertMiddots(div, search, class_name) {\r
265         var mdot = String.fromCharCode(183);\r
266         var bull = String.fromCharCode(8226);\r
267 \r
268         var nodes = div.getElementsByTagName("p");\r
269         for (var i=0; i<nodes.length; i++) {\r
270                 var p = nodes[i];\r
271 \r
272                 // Is middot\r
273                 if (p.innerHTML.indexOf(search) != -1) {\r
274                         var ul = document.createElement("ul");\r
275 \r
276                         if (class_name)\r
277                                 ul.className = class_name;\r
278 \r
279                         // Add the first one\r
280                         var li = document.createElement("li");\r
281                         li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
282                         ul.appendChild(li);\r
283 \r
284                         // Add the rest\r
285                         var np = p.nextSibling;\r
286                         while (np) {\r
287                                 // Not element or middot paragraph\r
288                                 if (np.nodeType != 1 || np.innerHTML.indexOf(search) == -1)\r
289                                         break;\r
290 \r
291                                 var cp = np.nextSibling;\r
292                                 var li = document.createElement("li");\r
293                                 li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
294                                 np.parentNode.removeChild(np);\r
295                                 ul.appendChild(li);\r
296                                 np = cp;\r
297                         }\r
298 \r
299                         p.parentNode.replaceChild(ul, p);\r
300 \r
301                         return true;\r
302                 }\r
303         }\r
304 \r
305         return false;\r
306 }\r
307 \r
308 function TinyMCE_paste__clipboardHTML() {\r
309         var div = document.getElementById('_TinyMCE_clipboardHTML');\r
310 \r
311         if (!div) {\r
312                 var div = document.createElement('DIV');\r
313                 div.id = '_TinyMCE_clipboardHTML';\r
314 \r
315                 with (div.style) {\r
316                         visibility = 'hidden';\r
317                         overflow = 'hidden';\r
318                         position = 'absolute';\r
319                         width = 1;\r
320                         height = 1;\r
321                 }\r
322 \r
323                 document.body.appendChild(div);\r
324         }\r
325 \r
326         div.innerHTML = '';\r
327         var rng = document.body.createTextRange();\r
328         rng.moveToElementText(div);\r
329         rng.execCommand('Paste');\r
330         var html = div.innerHTML;\r
331         div.innerHTML = '';\r
332         return html;\r
333 }\r