]> git.donarmstrong.com Git - roundcube.git/blob - program/js/tiny_mce/plugins/table/jscripts/table.js
Imported Upstream version 0.1~rc2
[roundcube.git] / program / js / tiny_mce / plugins / table / jscripts / table.js
1 var action, orgTableWidth, orgTableHeight;\r
2 \r
3 function insertTable() {\r
4         var formObj = document.forms[0];\r
5         var inst = tinyMCE.selectedInstance;\r
6         var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption;\r
7         var html = '', capEl;\r
8         var elm = tinyMCE.tableElm;\r
9         var cellLimit, rowLimit, colLimit;\r
10 \r
11         if (!AutoValidator.validate(formObj)) {\r
12                 alert(tinyMCE.getLang('lang_invalid_data'));\r
13                 return false;\r
14         }\r
15 \r
16         tinyMCEPopup.restoreSelection();\r
17 \r
18         // Get form data\r
19         cols = formObj.elements['cols'].value;\r
20         rows = formObj.elements['rows'].value;\r
21         border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;\r
22         cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";\r
23         cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";\r
24         align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;\r
25         width = formObj.elements['width'].value;\r
26         height = formObj.elements['height'].value;\r
27         bordercolor = formObj.elements['bordercolor'].value;\r
28         bgcolor = formObj.elements['bgcolor'].value;\r
29         className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;\r
30         id = formObj.elements['id'].value;\r
31         summary = formObj.elements['summary'].value;\r
32         style = formObj.elements['style'].value;\r
33         dir = formObj.elements['dir'].value;\r
34         lang = formObj.elements['lang'].value;\r
35         background = formObj.elements['backgroundimage'].value;\r
36         caption = formObj.elements['caption'].checked;\r
37 \r
38         cellLimit = tinyMCE.getParam('table_cell_limit', false);\r
39         rowLimit = tinyMCE.getParam('table_row_limit', false);\r
40         colLimit = tinyMCE.getParam('table_col_limit', false);\r
41 \r
42         // Validate table size\r
43         if (colLimit && cols > colLimit) {\r
44                 alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit}));\r
45                 return false;\r
46         } else if (rowLimit && rows > rowLimit) {\r
47                 alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit}));\r
48                 return false;\r
49         } else if (cellLimit && cols * rows > cellLimit) {\r
50                 alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit}));\r
51                 return false;\r
52         }\r
53 \r
54         // Update table\r
55         if (action == "update") {\r
56                 inst.execCommand('mceBeginUndoLevel');\r
57 \r
58                 tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);\r
59                 tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);\r
60                 tinyMCE.setAttrib(elm, 'border', border, true);\r
61                 tinyMCE.setAttrib(elm, 'align', align);\r
62                 tinyMCE.setAttrib(elm, 'class', className);\r
63                 tinyMCE.setAttrib(elm, 'style', style);\r
64                 tinyMCE.setAttrib(elm, 'id', id);\r
65                 tinyMCE.setAttrib(elm, 'summary', summary);\r
66                 tinyMCE.setAttrib(elm, 'dir', dir);\r
67                 tinyMCE.setAttrib(elm, 'lang', lang);\r
68 \r
69                 capEl = elm.getElementsByTagName('caption')[0];\r
70 \r
71                 if (capEl && !caption)\r
72                         capEl.parentNode.removeChild(capEl);\r
73 \r
74                 if (!capEl && caption) {\r
75                         capEl = elm.ownerDocument.createElement('caption');\r
76                         capEl.innerHTML = ' ';\r
77                         elm.insertBefore(capEl, elm.firstChild);\r
78                 }\r
79 \r
80                 // Not inline styles\r
81                 if (!tinyMCE.getParam("inline_styles"))\r
82                         tinyMCE.setAttrib(elm, 'width', width, true);\r
83 \r
84                 // Remove these since they are not valid XHTML\r
85                 tinyMCE.setAttrib(elm, 'borderColor', '');\r
86                 tinyMCE.setAttrib(elm, 'bgColor', '');\r
87                 tinyMCE.setAttrib(elm, 'background', '');\r
88                 tinyMCE.setAttrib(elm, 'height', '');\r
89 \r
90                 if (background != '')\r
91                         elm.style.backgroundImage = "url('" + background + "')";\r
92                 else\r
93                         elm.style.backgroundImage = '';\r
94 \r
95                 if (tinyMCE.getParam("inline_styles"))\r
96                         elm.style.borderWidth = border + "px";\r
97 \r
98                 if (tinyMCE.getParam("inline_styles")) {\r
99                         if (width != '')\r
100                                 elm.style.width = getCSSSize(width);\r
101                 }\r
102 \r
103                 if (bordercolor != "") {\r
104                         elm.style.borderColor = bordercolor;\r
105                         elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;\r
106                         elm.style.borderWidth = border == "" ? "1px" : border;\r
107                 } else\r
108                         elm.style.borderColor = '';\r
109 \r
110                 elm.style.backgroundColor = bgcolor;\r
111                 elm.style.height = getCSSSize(height);\r
112 \r
113                 tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);\r
114 \r
115                 // Fix for stange MSIE align bug\r
116                 tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;\r
117 \r
118                 tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
119                 tinyMCE.triggerNodeChange();\r
120                 inst.execCommand('mceEndUndoLevel');\r
121 \r
122                 // Repaint if dimensions changed\r
123                 if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)\r
124                         inst.repaint();\r
125 \r
126                 tinyMCEPopup.close();\r
127                 return true;\r
128         }\r
129 \r
130         // Create new table\r
131         html += '<table';\r
132 \r
133         html += makeAttrib('id', id);\r
134         html += makeAttrib('border', border);\r
135         html += makeAttrib('cellpadding', cellpadding);\r
136         html += makeAttrib('cellspacing', cellspacing);\r
137         html += makeAttrib('width', width);\r
138         //html += makeAttrib('height', height);\r
139         //html += makeAttrib('bordercolor', bordercolor);\r
140         //html += makeAttrib('bgcolor', bgcolor);\r
141         html += makeAttrib('align', align);\r
142         html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));\r
143         html += makeAttrib('style', style);\r
144         html += makeAttrib('summary', summary);\r
145         html += makeAttrib('dir', dir);\r
146         html += makeAttrib('lang', lang);\r
147         html += '>';\r
148 \r
149         if (caption)\r
150                 html += '<caption>&nbsp;</caption>';\r
151 \r
152         for (var y=0; y<rows; y++) {\r
153                 html += "<tr>";\r
154 \r
155                 for (var x=0; x<cols; x++)\r
156                         html += '<td>&nbsp;</td>';\r
157 \r
158                 html += "</tr>";\r
159         }\r
160 \r
161         html += "</table>";\r
162 \r
163         inst.execCommand('mceBeginUndoLevel');\r
164         inst.execCommand('mceInsertContent', false, html);\r
165         tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);\r
166         inst.execCommand('mceEndUndoLevel');\r
167 \r
168         tinyMCEPopup.close();\r
169 }\r
170 \r
171 function makeAttrib(attrib, value) {\r
172         var formObj = document.forms[0];\r
173         var valueElm = formObj.elements[attrib];\r
174 \r
175         if (typeof(value) == "undefined" || value == null) {\r
176                 value = "";\r
177 \r
178                 if (valueElm)\r
179                         value = valueElm.value;\r
180         }\r
181 \r
182         if (value == "")\r
183                 return "";\r
184 \r
185         // XML encode it\r
186         value = value.replace(/&/g, '&amp;');\r
187         value = value.replace(/\"/g, '&quot;');\r
188         value = value.replace(/</g, '&lt;');\r
189         value = value.replace(/>/g, '&gt;');\r
190 \r
191         return ' ' + attrib + '="' + value + '"';\r
192 }\r
193 \r
194 function init() {\r
195         tinyMCEPopup.resizeToInnerSize();\r
196 \r
197         document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
198         document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
199         document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
200         document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
201 \r
202         var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', '');\r
203         var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";\r
204         var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";\r
205         var inst = tinyMCE.selectedInstance;\r
206         var formObj = document.forms[0];\r
207         var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
208 \r
209         tinyMCE.tableElm = elm;\r
210         action = tinyMCE.getWindowArg('action');\r
211         if (action == null)\r
212                 action = tinyMCE.tableElm ? "update" : "insert";\r
213 \r
214         if (tinyMCE.tableElm && action != "insert") {\r
215                 var rowsAr = tinyMCE.tableElm.rows;\r
216                 var cols = 0;\r
217                 for (var i=0; i<rowsAr.length; i++)\r
218                         if (rowsAr[i].cells.length > cols)\r
219                                 cols = rowsAr[i].cells.length;\r
220 \r
221                 cols = cols;\r
222                 rows = rowsAr.length;\r
223 \r
224                 st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));\r
225                 border = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
226                 cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");\r
227                 cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");\r
228                 width = trimSize(getStyle(elm, 'width', 'width'));\r
229                 height = trimSize(getStyle(elm, 'height', 'height'));\r
230                 bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));\r
231                 bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));\r
232                 align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);\r
233                 className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);\r
234                 id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');\r
235                 summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');\r
236                 style = tinyMCE.serializeStyle(st);\r
237                 dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');\r
238                 lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');\r
239                 background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
240                 formObj.caption.checked = tinyMCE.tableElm.getElementsByTagName('caption').length > 0;\r
241 \r
242                 orgTableWidth = width;\r
243                 orgTableHeight = height;\r
244 \r
245                 action = "update";\r
246         }\r
247 \r
248         addClassesToList('class', "table_styles");\r
249 \r
250         // Update form\r
251         selectByValue(formObj, 'align', align);\r
252         selectByValue(formObj, 'class', className);\r
253         formObj.cols.value = cols;\r
254         formObj.rows.value = rows;\r
255         formObj.border.value = border;\r
256         formObj.cellpadding.value = cellpadding;\r
257         formObj.cellspacing.value = cellspacing;\r
258         formObj.width.value = width;\r
259         formObj.height.value = height;\r
260         formObj.bordercolor.value = bordercolor;\r
261         formObj.bgcolor.value = bgcolor;\r
262         formObj.id.value = id;\r
263         formObj.summary.value = summary;\r
264         formObj.style.value = style;\r
265         formObj.dir.value = dir;\r
266         formObj.lang.value = lang;\r
267         formObj.backgroundimage.value = background;\r
268         formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
269 \r
270         updateColor('bordercolor_pick', 'bordercolor');\r
271         updateColor('bgcolor_pick', 'bgcolor');\r
272 \r
273         // Resize some elements\r
274         if (isVisible('backgroundimagebrowser'))\r
275                 document.getElementById('backgroundimage').style.width = '180px';\r
276 \r
277         // Disable some fields in update mode\r
278         if (action == "update") {\r
279                 formObj.cols.disabled = true;\r
280                 formObj.rows.disabled = true;\r
281         }\r
282 }\r
283 \r
284 function changedSize() {\r
285         var formObj = document.forms[0];\r
286         var st = tinyMCE.parseStyle(formObj.style.value);\r
287 \r
288         var width = formObj.width.value;\r
289         if (width != "")\r
290                 st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";\r
291         else\r
292                 st['width'] = "";\r
293 \r
294         var height = formObj.height.value;\r
295         if (height != "")\r
296                 st['height'] = getCSSSize(height);\r
297         else\r
298                 st['height'] = "";\r
299 \r
300         formObj.style.value = tinyMCE.serializeStyle(st);\r
301 }\r
302 \r
303 function changedBackgroundImage() {\r
304         var formObj = document.forms[0];\r
305         var st = tinyMCE.parseStyle(formObj.style.value);\r
306 \r
307         st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
308 \r
309         formObj.style.value = tinyMCE.serializeStyle(st);\r
310 }\r
311 \r
312 function changedBorder() {\r
313         var formObj = document.forms[0];\r
314         var st = tinyMCE.parseStyle(formObj.style.value);\r
315 \r
316         // Update border width if the element has a color\r
317         if (formObj.border.value != "" && formObj.bordercolor.value != "")\r
318                 st['border-width'] = formObj.border.value + "px";\r
319 \r
320         formObj.style.value = tinyMCE.serializeStyle(st);\r
321 }\r
322 \r
323 function changedColor() {\r
324         var formObj = document.forms[0];\r
325         var st = tinyMCE.parseStyle(formObj.style.value);\r
326 \r
327         st['background-color'] = formObj.bgcolor.value;\r
328 \r
329         if (formObj.bordercolor.value != "") {\r
330                 st['border-color'] = formObj.bordercolor.value;\r
331 \r
332                 // Add border-width if it's missing\r
333                 if (!st['border-width'])\r
334                         st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";\r
335         }\r
336 \r
337         formObj.style.value = tinyMCE.serializeStyle(st);\r
338 }\r
339 \r
340 function changedStyle() {\r
341         var formObj = document.forms[0];\r
342         var st = tinyMCE.parseStyle(formObj.style.value);\r
343 \r
344         if (st['background-image'])\r
345                 formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
346         else\r
347                 formObj.backgroundimage.value = '';\r
348 \r
349         if (st['width'])\r
350                 formObj.width.value = trimSize(st['width']);\r
351 \r
352         if (st['height'])\r
353                 formObj.height.value = trimSize(st['height']);\r
354 \r
355         if (st['background-color']) {\r
356                 formObj.bgcolor.value = st['background-color'];\r
357                 updateColor('bgcolor_pick','bgcolor');\r
358         }\r
359 \r
360         if (st['border-color']) {\r
361                 formObj.bordercolor.value = st['border-color'];\r
362                 updateColor('bordercolor_pick','bordercolor');\r
363         }\r
364 }\r