/static/scripts/tiny_mce/plugins/table/js/table.js

http://n23.googlecode.com/ · JavaScript · 410 lines · 295 code · 83 blank · 32 comment · 72 complexity · 427314b4196fb4c485c1c7fb266b5226 MD5 · raw file

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