annotate static/js/tiny_mce/plugins/table/js/table.js @ 555:c094c43ec99f

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