From a2e09c950d8716346b151f7980df1b51ebfbdd78 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Tue, 15 Apr 2014 12:35:33 -0400
Subject: [PATCH] Use methods chaining, don't use deprecated row_init method

---
 program/js/tiny_mce/plugins/table/js/table.js |  117 ++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 89 insertions(+), 28 deletions(-)

diff --git a/program/js/tiny_mce/plugins/table/js/table.js b/program/js/tiny_mce/plugins/table/js/table.js
index 182589d..f427f5f 100644
--- a/program/js/tiny_mce/plugins/table/js/table.js
+++ b/program/js/tiny_mce/plugins/table/js/table.js
@@ -12,7 +12,7 @@
 	tinyMCEPopup.restoreSelection();
 
 	if (!AutoValidator.validate(formObj)) {
-		tinyMCEPopup.alert(inst.getLang('invalid_data'));
+		tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');
 		return false;
 	}
 
@@ -21,7 +21,7 @@
 	// Get form data
 	cols = formObj.elements['cols'].value;
 	rows = formObj.elements['rows'].value;
-	border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;
+	border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0;
 	cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";
 	cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";
 	align = getSelectValue(formObj, "align");
@@ -58,11 +58,21 @@
 
 	// Update table
 	if (action == "update") {
-		inst.execCommand('mceBeginUndoLevel');
-
 		dom.setAttrib(elm, 'cellPadding', cellpadding, true);
 		dom.setAttrib(elm, 'cellSpacing', cellspacing, true);
-		dom.setAttrib(elm, 'border', border);
+
+		if (!isCssSize(border)) {
+			dom.setAttrib(elm, 'border', border);
+		} else {
+			dom.setAttrib(elm, 'border', '');
+		}
+
+		if (border == '') {
+			dom.setStyle(elm, 'border-width', '');
+			dom.setStyle(elm, 'border', '');
+			dom.setAttrib(elm, 'border', '');
+		}
+
 		dom.setAttrib(elm, 'align', align);
 		dom.setAttrib(elm, 'frame', frame);
 		dom.setAttrib(elm, 'rules', rules);
@@ -81,8 +91,8 @@
 		if (!capEl && caption) {
 			capEl = elm.ownerDocument.createElement('caption');
 
-			if (!tinymce.isIE)
-				capEl.innerHTML = '<br mce_bogus="1"/>';
+			if (!tinymce.isIE || tinymce.isIE11)
+				capEl.innerHTML = '<br data-mce-bogus="1"/>';
 
 			elm.insertBefore(capEl, elm.firstChild);
 		}
@@ -121,7 +131,7 @@
 		if (bordercolor != "") {
 			elm.style.borderColor = bordercolor;
 			elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
-			elm.style.borderWidth = border == "" ? "1px" : border;
+			elm.style.borderWidth = cssSize(border);
 		} else
 			elm.style.borderColor = '';
 
@@ -134,7 +144,7 @@
 		//elm.outerHTML = elm.outerHTML;
 
 		inst.nodeChanged();
-		inst.execCommand('mceEndUndoLevel');
+		inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true});
 
 		// Repaint if dimensions changed
 		if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)
@@ -148,9 +158,13 @@
 	html += '<table';
 
 	html += makeAttrib('id', id);
-	html += makeAttrib('border', border);
+	if (!isCssSize(border)) {
+		html += makeAttrib('border', border);
+	}
+
 	html += makeAttrib('cellpadding', cellpadding);
 	html += makeAttrib('cellspacing', cellspacing);
+	html += makeAttrib('data-mce-new', '1');
 
 	if (width && inst.settings.inline_styles) {
 		if (style)
@@ -185,8 +199,8 @@
 	html += '>';
 
 	if (caption) {
-		if (!tinymce.isIE)
-			html += '<caption><br mce_bogus="1"/></caption>';
+		if (!tinymce.isIE || tinymce.isIE11)
+			html += '<caption><br data-mce-bogus="1"/></caption>';
 		else
 			html += '<caption></caption>';
 	}
@@ -195,8 +209,8 @@
 		html += "<tr>";
 
 		for (var x=0; x<cols; x++) {
-			if (!tinymce.isIE)
-				html += '<td><br mce_bogus="1"/></td>';
+			if (!tinymce.isIE || tinymce.isIE11)
+				html += '<td><br data-mce-bogus="1"/></td>';
 			else
 				html += '<td></td>';
 		}
@@ -206,13 +220,12 @@
 
 	html += "</table>";
 
-	inst.execCommand('mceBeginUndoLevel');
-
 	// Move table
 	if (inst.settings.fix_table_elements) {
-		var bm = inst.selection.getBookmark(), patt = '';
+		var patt = '';
 
-		inst.execCommand('mceInsertContent', false, '<br class="_mce_marker" />');
+		inst.focus();
+		inst.selection.setContent('<br class="_mce_marker" />');
 
 		tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) {
 			if (patt)
@@ -225,14 +238,33 @@
 			inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n);
 		});
 
-		dom.setOuterHTML(dom.select('._mce_marker')[0], html);
-
-		inst.selection.moveToBookmark(bm);
+		dom.setOuterHTML(dom.select('br._mce_marker')[0], html);
 	} else
 		inst.execCommand('mceInsertContent', false, html);
 
+	tinymce.each(dom.select('table[data-mce-new]'), function(node) {
+		var tdorth = dom.select('td,th', node);
+
+		// Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document
+		if (tinymce.isIE && !tinymce.isIE11 && node.nextSibling == null) {
+			if (inst.settings.forced_root_block)
+				dom.insertAfter(dom.create(inst.settings.forced_root_block), node);
+			else
+				dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node);
+		}
+
+		try {
+			// IE9 might fail to do this selection 
+			inst.selection.setCursorLocation(tdorth[0], 0);
+		} catch (ex) {
+			// Ignore
+		}
+
+		dom.setAttrib(node, 'data-mce-new', '');
+	});
+
 	inst.addVisual();
-	inst.execCommand('mceEndUndoLevel');
+	inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true});
 
 	tinyMCEPopup.close();
 }
@@ -270,10 +302,19 @@
 
 	var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', '');
 	var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";
-	var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules, frame;
+	var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = "";
 	var inst = tinyMCEPopup.editor, dom = inst.dom;
 	var formObj = document.forms[0];
 	var elm = dom.getParent(inst.selection.getNode(), "table");
+
+	// Hide advanced fields that isn't available in the schema
+	tinymce.each("summary id rules dir style frame".split(" "), function(name) {
+		var tr = tinyMCEPopup.dom.getParent(name, "tr") || tinyMCEPopup.dom.getParent("t" + name, "tr");
+
+		if (tr && !tinyMCEPopup.editor.schema.isValid("table", name)) {
+			tr.style.display = 'none';
+		}
+	});
 
 	action = tinyMCEPopup.getWindowArg('action');
 
@@ -307,7 +348,7 @@
 		style = dom.serializeStyle(st);
 		dir = dom.getAttrib(elm, 'dir');
 		lang = dom.getAttrib(elm, 'lang');
-		background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+		background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");
 		formObj.caption.checked = elm.getElementsByTagName('caption').length > 0;
 
 		orgTableWidth = width;
@@ -374,6 +415,20 @@
 	formObj.style.value = dom.serializeStyle(st);
 }
 
+function isCssSize(value) {
+	return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value);
+}
+
+function cssSize(value, def) {
+	value = tinymce.trim(value || def);
+
+	if (!isCssSize(value)) {
+		return parseInt(value, 10) + 'px';
+	}
+
+	return value;
+}
+
 function changedBackgroundImage() {
 	var formObj = document.forms[0];
 	var st = dom.parseStyle(formObj.style.value);
@@ -388,8 +443,14 @@
 	var st = dom.parseStyle(formObj.style.value);
 
 	// Update border width if the element has a color
-	if (formObj.border.value != "" && formObj.bordercolor.value != "")
-		st['border-width'] = formObj.border.value + "px";
+	if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != ""))
+		st['border-width'] = cssSize(formObj.border.value);
+	else {
+		if (!formObj.border.value) {
+			st['border'] = '';
+			st['border-width'] = '';
+		}
+	}
 
 	formObj.style.value = dom.serializeStyle(st);
 }
@@ -405,7 +466,7 @@
 
 		// Add border-width if it's missing
 		if (!st['border-width'])
-			st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";
+			st['border-width'] = cssSize(formObj.border.value, 1);
 	}
 
 	formObj.style.value = dom.serializeStyle(st);
@@ -416,7 +477,7 @@
 	var st = dom.parseStyle(formObj.style.value);
 
 	if (st['background-image'])
-		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");
 	else
 		formObj.backgroundimage.value = '';
 

--
Gitblit v1.9.1