Mercurial > hg > AnnotationManager
comparison WebContent/jscripts/tiny_mce/plugins/table/js/table.js @ 5:0be9d53a6967
editor for annotations
| author | dwinter |
|---|---|
| date | Tue, 13 Dec 2011 17:43:46 +0100 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 4:c32080f364c6 | 5:0be9d53a6967 |
|---|---|
| 1 tinyMCEPopup.requireLangPack(); | |
| 2 | |
| 3 var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom; | |
| 4 | |
| 5 function insertTable() { | |
| 6 var formObj = document.forms[0]; | |
| 7 var inst = tinyMCEPopup.editor, dom = inst.dom; | |
| 8 var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules; | |
| 9 var html = '', capEl, elm; | |
| 10 var cellLimit, rowLimit, colLimit; | |
| 11 | |
| 12 tinyMCEPopup.restoreSelection(); | |
| 13 | |
| 14 if (!AutoValidator.validate(formObj)) { | |
| 15 tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); | |
| 16 return false; | |
| 17 } | |
| 18 | |
| 19 elm = dom.getParent(inst.selection.getNode(), 'table'); | |
| 20 | |
| 21 // Get form data | |
| 22 cols = formObj.elements['cols'].value; | |
| 23 rows = formObj.elements['rows'].value; | |
| 24 border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0; | |
| 25 cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : ""; | |
| 26 cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : ""; | |
| 27 align = getSelectValue(formObj, "align"); | |
| 28 frame = getSelectValue(formObj, "tframe"); | |
| 29 rules = getSelectValue(formObj, "rules"); | |
| 30 width = formObj.elements['width'].value; | |
| 31 height = formObj.elements['height'].value; | |
| 32 bordercolor = formObj.elements['bordercolor'].value; | |
| 33 bgcolor = formObj.elements['bgcolor'].value; | |
| 34 className = getSelectValue(formObj, "class"); | |
| 35 id = formObj.elements['id'].value; | |
| 36 summary = formObj.elements['summary'].value; | |
| 37 style = formObj.elements['style'].value; | |
| 38 dir = formObj.elements['dir'].value; | |
| 39 lang = formObj.elements['lang'].value; | |
| 40 background = formObj.elements['backgroundimage'].value; | |
| 41 caption = formObj.elements['caption'].checked; | |
| 42 | |
| 43 cellLimit = tinyMCEPopup.getParam('table_cell_limit', false); | |
| 44 rowLimit = tinyMCEPopup.getParam('table_row_limit', false); | |
| 45 colLimit = tinyMCEPopup.getParam('table_col_limit', false); | |
| 46 | |
| 47 // Validate table size | |
| 48 if (colLimit && cols > colLimit) { | |
| 49 tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); | |
| 50 return false; | |
| 51 } else if (rowLimit && rows > rowLimit) { | |
| 52 tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); | |
| 53 return false; | |
| 54 } else if (cellLimit && cols * rows > cellLimit) { | |
| 55 tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); | |
| 56 return false; | |
| 57 } | |
| 58 | |
| 59 // Update table | |
| 60 if (action == "update") { | |
| 61 dom.setAttrib(elm, 'cellPadding', cellpadding, true); | |
| 62 dom.setAttrib(elm, 'cellSpacing', cellspacing, true); | |
| 63 | |
| 64 if (!isCssSize(border)) { | |
| 65 dom.setAttrib(elm, 'border', border); | |
| 66 } else { | |
| 67 dom.setAttrib(elm, 'border', ''); | |
| 68 } | |
| 69 | |
| 70 if (border == '') { | |
| 71 dom.setStyle(elm, 'border-width', ''); | |
| 72 dom.setStyle(elm, 'border', ''); | |
| 73 dom.setAttrib(elm, 'border', ''); | |
| 74 } | |
| 75 | |
| 76 dom.setAttrib(elm, 'align', align); | |
| 77 dom.setAttrib(elm, 'frame', frame); | |
| 78 dom.setAttrib(elm, 'rules', rules); | |
| 79 dom.setAttrib(elm, 'class', className); | |
| 80 dom.setAttrib(elm, 'style', style); | |
| 81 dom.setAttrib(elm, 'id', id); | |
| 82 dom.setAttrib(elm, 'summary', summary); | |
| 83 dom.setAttrib(elm, 'dir', dir); | |
| 84 dom.setAttrib(elm, 'lang', lang); | |
| 85 | |
| 86 capEl = inst.dom.select('caption', elm)[0]; | |
| 87 | |
| 88 if (capEl && !caption) | |
| 89 capEl.parentNode.removeChild(capEl); | |
| 90 | |
| 91 if (!capEl && caption) { | |
| 92 capEl = elm.ownerDocument.createElement('caption'); | |
| 93 | |
| 94 if (!tinymce.isIE) | |
| 95 capEl.innerHTML = '<br data-mce-bogus="1"/>'; | |
| 96 | |
| 97 elm.insertBefore(capEl, elm.firstChild); | |
| 98 } | |
| 99 | |
| 100 if (width && inst.settings.inline_styles) { | |
| 101 dom.setStyle(elm, 'width', width); | |
| 102 dom.setAttrib(elm, 'width', ''); | |
| 103 } else { | |
| 104 dom.setAttrib(elm, 'width', width, true); | |
| 105 dom.setStyle(elm, 'width', ''); | |
| 106 } | |
| 107 | |
| 108 // Remove these since they are not valid XHTML | |
| 109 dom.setAttrib(elm, 'borderColor', ''); | |
| 110 dom.setAttrib(elm, 'bgColor', ''); | |
| 111 dom.setAttrib(elm, 'background', ''); | |
| 112 | |
| 113 if (height && inst.settings.inline_styles) { | |
| 114 dom.setStyle(elm, 'height', height); | |
| 115 dom.setAttrib(elm, 'height', ''); | |
| 116 } else { | |
| 117 dom.setAttrib(elm, 'height', height, true); | |
| 118 dom.setStyle(elm, 'height', ''); | |
| 119 } | |
| 120 | |
| 121 if (background != '') | |
| 122 elm.style.backgroundImage = "url('" + background + "')"; | |
| 123 else | |
| 124 elm.style.backgroundImage = ''; | |
| 125 | |
| 126 /* if (tinyMCEPopup.getParam("inline_styles")) { | |
| 127 if (width != '') | |
| 128 elm.style.width = getCSSSize(width); | |
| 129 }*/ | |
| 130 | |
| 131 if (bordercolor != "") { | |
| 132 elm.style.borderColor = bordercolor; | |
| 133 elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; | |
| 134 elm.style.borderWidth = cssSize(border); | |
| 135 } else | |
| 136 elm.style.borderColor = ''; | |
| 137 | |
| 138 elm.style.backgroundColor = bgcolor; | |
| 139 elm.style.height = getCSSSize(height); | |
| 140 | |
| 141 inst.addVisual(); | |
| 142 | |
| 143 // Fix for stange MSIE align bug | |
| 144 //elm.outerHTML = elm.outerHTML; | |
| 145 | |
| 146 inst.nodeChanged(); | |
| 147 inst.execCommand('mceEndUndoLevel'); | |
| 148 | |
| 149 // Repaint if dimensions changed | |
| 150 if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) | |
| 151 inst.execCommand('mceRepaint'); | |
| 152 | |
| 153 tinyMCEPopup.close(); | |
| 154 return true; | |
| 155 } | |
| 156 | |
| 157 // Create new table | |
| 158 html += '<table'; | |
| 159 | |
| 160 html += makeAttrib('id', id); | |
| 161 if (!isCssSize(border)) { | |
| 162 html += makeAttrib('border', border); | |
| 163 } | |
| 164 | |
| 165 html += makeAttrib('cellpadding', cellpadding); | |
| 166 html += makeAttrib('cellspacing', cellspacing); | |
| 167 html += makeAttrib('data-mce-new', '1'); | |
| 168 | |
| 169 if (width && inst.settings.inline_styles) { | |
| 170 if (style) | |
| 171 style += '; '; | |
| 172 | |
| 173 // Force px | |
| 174 if (/^[0-9\.]+$/.test(width)) | |
| 175 width += 'px'; | |
| 176 | |
| 177 style += 'width: ' + width; | |
| 178 } else | |
| 179 html += makeAttrib('width', width); | |
| 180 | |
| 181 /* if (height) { | |
| 182 if (style) | |
| 183 style += '; '; | |
| 184 | |
| 185 style += 'height: ' + height; | |
| 186 }*/ | |
| 187 | |
| 188 //html += makeAttrib('height', height); | |
| 189 //html += makeAttrib('bordercolor', bordercolor); | |
| 190 //html += makeAttrib('bgcolor', bgcolor); | |
| 191 html += makeAttrib('align', align); | |
| 192 html += makeAttrib('frame', frame); | |
| 193 html += makeAttrib('rules', rules); | |
| 194 html += makeAttrib('class', className); | |
| 195 html += makeAttrib('style', style); | |
| 196 html += makeAttrib('summary', summary); | |
| 197 html += makeAttrib('dir', dir); | |
| 198 html += makeAttrib('lang', lang); | |
| 199 html += '>'; | |
| 200 | |
| 201 if (caption) { | |
| 202 if (!tinymce.isIE) | |
| 203 html += '<caption><br data-mce-bogus="1"/></caption>'; | |
| 204 else | |
| 205 html += '<caption></caption>'; | |
| 206 } | |
| 207 | |
| 208 for (var y=0; y<rows; y++) { | |
| 209 html += "<tr>"; | |
| 210 | |
| 211 for (var x=0; x<cols; x++) { | |
| 212 if (!tinymce.isIE) | |
| 213 html += '<td><br data-mce-bogus="1"/></td>'; | |
| 214 else | |
| 215 html += '<td></td>'; | |
| 216 } | |
| 217 | |
| 218 html += "</tr>"; | |
| 219 } | |
| 220 | |
| 221 html += "</table>"; | |
| 222 | |
| 223 // Move table | |
| 224 if (inst.settings.fix_table_elements) { | |
| 225 var patt = ''; | |
| 226 | |
| 227 inst.focus(); | |
| 228 inst.selection.setContent('<br class="_mce_marker" />'); | |
| 229 | |
| 230 tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { | |
| 231 if (patt) | |
| 232 patt += ','; | |
| 233 | |
| 234 patt += n + ' ._mce_marker'; | |
| 235 }); | |
| 236 | |
| 237 tinymce.each(inst.dom.select(patt), function(n) { | |
| 238 inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); | |
| 239 }); | |
| 240 | |
| 241 dom.setOuterHTML(dom.select('br._mce_marker')[0], html); | |
| 242 } else | |
| 243 inst.execCommand('mceInsertContent', false, html); | |
| 244 | |
| 245 tinymce.each(dom.select('table[data-mce-new]'), function(node) { | |
| 246 var tdorth = dom.select('td,th', node); | |
| 247 | |
| 248 try { | |
| 249 // IE9 might fail to do this selection | |
| 250 inst.selection.setCursorLocation(tdorth[0], 0); | |
| 251 } catch (ex) { | |
| 252 // Ignore | |
| 253 } | |
| 254 | |
| 255 dom.setAttrib(node, 'data-mce-new', ''); | |
| 256 }); | |
| 257 | |
| 258 inst.addVisual(); | |
| 259 inst.execCommand('mceEndUndoLevel'); | |
| 260 | |
| 261 tinyMCEPopup.close(); | |
| 262 } | |
| 263 | |
| 264 function makeAttrib(attrib, value) { | |
| 265 var formObj = document.forms[0]; | |
| 266 var valueElm = formObj.elements[attrib]; | |
| 267 | |
| 268 if (typeof(value) == "undefined" || value == null) { | |
| 269 value = ""; | |
| 270 | |
| 271 if (valueElm) | |
| 272 value = valueElm.value; | |
| 273 } | |
| 274 | |
| 275 if (value == "") | |
| 276 return ""; | |
| 277 | |
| 278 // XML encode it | |
| 279 value = value.replace(/&/g, '&'); | |
| 280 value = value.replace(/\"/g, '"'); | |
| 281 value = value.replace(/</g, '<'); | |
| 282 value = value.replace(/>/g, '>'); | |
| 283 | |
| 284 return ' ' + attrib + '="' + value + '"'; | |
| 285 } | |
| 286 | |
| 287 function init() { | |
| 288 tinyMCEPopup.resizeToInnerSize(); | |
| 289 | |
| 290 document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); | |
| 291 document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); | |
| 292 document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); | |
| 293 document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); | |
| 294 | |
| 295 var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); | |
| 296 var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; | |
| 297 var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = ""; | |
| 298 var inst = tinyMCEPopup.editor, dom = inst.dom; | |
| 299 var formObj = document.forms[0]; | |
| 300 var elm = dom.getParent(inst.selection.getNode(), "table"); | |
| 301 | |
| 302 action = tinyMCEPopup.getWindowArg('action'); | |
| 303 | |
| 304 if (!action) | |
| 305 action = elm ? "update" : "insert"; | |
| 306 | |
| 307 if (elm && action != "insert") { | |
| 308 var rowsAr = elm.rows; | |
| 309 var cols = 0; | |
| 310 for (var i=0; i<rowsAr.length; i++) | |
| 311 if (rowsAr[i].cells.length > cols) | |
| 312 cols = rowsAr[i].cells.length; | |
| 313 | |
| 314 cols = cols; | |
| 315 rows = rowsAr.length; | |
| 316 | |
| 317 st = dom.parseStyle(dom.getAttrib(elm, "style")); | |
| 318 border = trimSize(getStyle(elm, 'border', 'borderWidth')); | |
| 319 cellpadding = dom.getAttrib(elm, 'cellpadding', ""); | |
| 320 cellspacing = dom.getAttrib(elm, 'cellspacing', ""); | |
| 321 width = trimSize(getStyle(elm, 'width', 'width')); | |
| 322 height = trimSize(getStyle(elm, 'height', 'height')); | |
| 323 bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); | |
| 324 bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); | |
| 325 align = dom.getAttrib(elm, 'align', align); | |
| 326 frame = dom.getAttrib(elm, 'frame'); | |
| 327 rules = dom.getAttrib(elm, 'rules'); | |
| 328 className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); | |
| 329 id = dom.getAttrib(elm, 'id'); | |
| 330 summary = dom.getAttrib(elm, 'summary'); | |
| 331 style = dom.serializeStyle(st); | |
| 332 dir = dom.getAttrib(elm, 'dir'); | |
| 333 lang = dom.getAttrib(elm, 'lang'); | |
| 334 background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); | |
| 335 formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; | |
| 336 | |
| 337 orgTableWidth = width; | |
| 338 orgTableHeight = height; | |
| 339 | |
| 340 action = "update"; | |
| 341 formObj.insert.value = inst.getLang('update'); | |
| 342 } | |
| 343 | |
| 344 addClassesToList('class', "table_styles"); | |
| 345 TinyMCE_EditableSelects.init(); | |
| 346 | |
| 347 // Update form | |
| 348 selectByValue(formObj, 'align', align); | |
| 349 selectByValue(formObj, 'tframe', frame); | |
| 350 selectByValue(formObj, 'rules', rules); | |
| 351 selectByValue(formObj, 'class', className, true, true); | |
| 352 formObj.cols.value = cols; | |
| 353 formObj.rows.value = rows; | |
| 354 formObj.border.value = border; | |
| 355 formObj.cellpadding.value = cellpadding; | |
| 356 formObj.cellspacing.value = cellspacing; | |
| 357 formObj.width.value = width; | |
| 358 formObj.height.value = height; | |
| 359 formObj.bordercolor.value = bordercolor; | |
| 360 formObj.bgcolor.value = bgcolor; | |
| 361 formObj.id.value = id; | |
| 362 formObj.summary.value = summary; | |
| 363 formObj.style.value = style; | |
| 364 formObj.dir.value = dir; | |
| 365 formObj.lang.value = lang; | |
| 366 formObj.backgroundimage.value = background; | |
| 367 | |
| 368 updateColor('bordercolor_pick', 'bordercolor'); | |
| 369 updateColor('bgcolor_pick', 'bgcolor'); | |
| 370 | |
| 371 // Resize some elements | |
| 372 if (isVisible('backgroundimagebrowser')) | |
| 373 document.getElementById('backgroundimage').style.width = '180px'; | |
| 374 | |
| 375 // Disable some fields in update mode | |
| 376 if (action == "update") { | |
| 377 formObj.cols.disabled = true; | |
| 378 formObj.rows.disabled = true; | |
| 379 } | |
| 380 } | |
| 381 | |
| 382 function changedSize() { | |
| 383 var formObj = document.forms[0]; | |
| 384 var st = dom.parseStyle(formObj.style.value); | |
| 385 | |
| 386 /* var width = formObj.width.value; | |
| 387 if (width != "") | |
| 388 st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : ""; | |
| 389 else | |
| 390 st['width'] = "";*/ | |
| 391 | |
| 392 var height = formObj.height.value; | |
| 393 if (height != "") | |
| 394 st['height'] = getCSSSize(height); | |
| 395 else | |
| 396 st['height'] = ""; | |
| 397 | |
| 398 formObj.style.value = dom.serializeStyle(st); | |
| 399 } | |
| 400 | |
| 401 function isCssSize(value) { | |
| 402 return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value); | |
| 403 } | |
| 404 | |
| 405 function cssSize(value, def) { | |
| 406 value = tinymce.trim(value || def); | |
| 407 | |
| 408 if (!isCssSize(value)) { | |
| 409 return parseInt(value, 10) + 'px'; | |
| 410 } | |
| 411 | |
| 412 return value; | |
| 413 } | |
| 414 | |
| 415 function changedBackgroundImage() { | |
| 416 var formObj = document.forms[0]; | |
| 417 var st = dom.parseStyle(formObj.style.value); | |
| 418 | |
| 419 st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; | |
| 420 | |
| 421 formObj.style.value = dom.serializeStyle(st); | |
| 422 } | |
| 423 | |
| 424 function changedBorder() { | |
| 425 var formObj = document.forms[0]; | |
| 426 var st = dom.parseStyle(formObj.style.value); | |
| 427 | |
| 428 // Update border width if the element has a color | |
| 429 if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != "")) | |
| 430 st['border-width'] = cssSize(formObj.border.value); | |
| 431 else { | |
| 432 if (!formObj.border.value) { | |
| 433 st['border'] = ''; | |
| 434 st['border-width'] = ''; | |
| 435 } | |
| 436 } | |
| 437 | |
| 438 formObj.style.value = dom.serializeStyle(st); | |
| 439 } | |
| 440 | |
| 441 function changedColor() { | |
| 442 var formObj = document.forms[0]; | |
| 443 var st = dom.parseStyle(formObj.style.value); | |
| 444 | |
| 445 st['background-color'] = formObj.bgcolor.value; | |
| 446 | |
| 447 if (formObj.bordercolor.value != "") { | |
| 448 st['border-color'] = formObj.bordercolor.value; | |
| 449 | |
| 450 // Add border-width if it's missing | |
| 451 if (!st['border-width']) | |
| 452 st['border-width'] = cssSize(formObj.border.value, 1); | |
| 453 } | |
| 454 | |
| 455 formObj.style.value = dom.serializeStyle(st); | |
| 456 } | |
| 457 | |
| 458 function changedStyle() { | |
| 459 var formObj = document.forms[0]; | |
| 460 var st = dom.parseStyle(formObj.style.value); | |
| 461 | |
| 462 if (st['background-image']) | |
| 463 formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); | |
| 464 else | |
| 465 formObj.backgroundimage.value = ''; | |
| 466 | |
| 467 if (st['width']) | |
| 468 formObj.width.value = trimSize(st['width']); | |
| 469 | |
| 470 if (st['height']) | |
| 471 formObj.height.value = trimSize(st['height']); | |
| 472 | |
| 473 if (st['background-color']) { | |
| 474 formObj.bgcolor.value = st['background-color']; | |
| 475 updateColor('bgcolor_pick','bgcolor'); | |
| 476 } | |
| 477 | |
| 478 if (st['border-color']) { | |
| 479 formObj.bordercolor.value = st['border-color']; | |
| 480 updateColor('bordercolor_pick','bordercolor'); | |
| 481 } | |
| 482 } | |
| 483 | |
| 484 tinyMCEPopup.onInit.add(init); |
