Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/TableOperations/table-operations.js
===================================================================
--- typo3/sysext/rtehtmlarea/htmlarea/plugins/TableOperations/table-operations.js	(révision 7141)
+++ typo3/sysext/rtehtmlarea/htmlarea/plugins/TableOperations/table-operations.js	(copie de travail)
@@ -196,24 +196,24 @@
 				if (!element) {
 					var element = this.getClosest('th');
 				}
-				this.properties = this.buttonsConfiguration.cellproperties.properties;
+				this.properties = (this.buttonsConfiguration.cellproperties && this.buttonsConfiguration.cellproperties.properties) ? this.buttonsConfiguration.cellproperties.properties : {};
 				var title = (type == 'column') ? 'Column Properties' : 'Cell Properties';
 				break;
 			case 'row':
 				var element = this.getClosest('tr');
-				this.properties = this.buttonsConfiguration.rowproperties.properties;
+				this.properties = (this.buttonsConfiguration.rowproperties && this.buttonsConfiguration.rowproperties.properties) ? this.buttonsConfiguration.rowproperties.properties : {};
 				var title = 'Row Properties';
 				break;
 			case 'table':
 				var insert = (buttonId === 'InsertTable');
 				var element = insert ? null : this.getClosest('table');
-				this.properties = this.buttonsConfiguration.table.properties;
+				this.properties = (this.buttonsConfiguration.table && this.buttonsConfiguration.table.properties) ? this.buttonsConfiguration.table.properties : {};
 				var title = insert ? 'Insert Table' : 'Table Properties';
 				break;
 		}
 		var propertySet = element ? type + 'properties' : 'table';
 		this.removedFieldsets = (this.buttonsConfiguration[propertySet] && this.buttonsConfiguration[propertySet].removeFieldsets) ? this.buttonsConfiguration[propertySet].removeFieldsets : '';
-		this.removedProperties = (this.properties && this.properties.removed) ? this.properties.removed : '';
+		this.removedProperties = this.properties.removed ? this.properties.removed : '';
 			// Open the dialogue window
 		this.openDialogue(
 			title,
@@ -396,8 +396,8 @@
 			return false;
 		});
 		var errorFlag = false;
-		if (this.buttonsConfiguration.table.properties && this.buttonsConfiguration.table.properties.required) {
-			if (this.buttonsConfiguration.table.properties.required.indexOf('captionOrSummary') != -1) {
+		if (this.properties.required) {
+			if (this.properties.required.indexOf('captionOrSummary') != -1) {
 				if (!/\S/.test(params.f_caption) && !/\S/.test(params.f_summary)) {
 					Ext.MessageBox.alert(this.localize('Error'), this.localize('captionOrSummary' + '-required'));
 					var field = this.dialog.find('itemId', 'f_caption')[0];
@@ -412,7 +412,7 @@
 					f_summary: 'summary'
 				};
 				Ext.iterate(required, function (item) {
-					if (!params[item] && this.buttonsConfiguration.table.properties.required.indexOf(required[item]) != -1) {
+					if (!params[item] && this.properties.required.indexOf(required[item]) != -1) {
 						Ext.MessageBox.alert(this.localize('Error'), this.localize(required[item] + '-required'));
 						var field = this.dialog.find('itemId', item)[0];
 						var tab = field.findParentByType('container');
@@ -1731,7 +1731,7 @@
 				fieldLabel: this.localize('Rows:'),
 				labelSeparator: '',
 				itemId: 'f_rows',
-				value: (this.properties && this.properties.numberOfRows && this.properties.numberOfRows.defaultValue) ? this.properties.numberOfRows.defaultValue : '2',
+				value: (this.properties.numberOfRows && this.properties.numberOfRows.defaultValue) ? this.properties.numberOfRows.defaultValue : '2',
 				width: 30,
 				minValue: 1,
 				helpTitle: this.localize('Number of rows')
@@ -1740,7 +1740,7 @@
 				fieldLabel: this.localize('Cols:'),
 				labelSeparator: '',
 				itemId: 'f_cols',
-				value: (this.properties && this.properties.numberOfColumns && this.properties.numberOfColumns.defaultValue) ? this.properties.numberOfColumns.defaultValue : '4',
+				value: (this.properties.numberOfColumns && this.properties.numberOfColumns.defaultValue) ? this.properties.numberOfColumns.defaultValue : '4',
 				width: 30,
 				minValue: 1,
 				helpTitle: this.localize('Number of columns')
@@ -1760,7 +1760,7 @@
 			});
 			this.removeOptions(store, 'headers');
 			if (Ext.isEmpty(table)) {
-				var selected = (this.properties && this.properties.headers && this.properties.headers.defaultValue) ? this.properties.headers.defaultValue : 'top';
+				var selected = (this.properties.headers && this.properties.headers.defaultValue) ? this.properties.headers.defaultValue : 'top';
 			} else {
 				var selected = 'none';
 				var thead = table.getElementsByTagName('thead');
@@ -1781,7 +1781,7 @@
 				itemId: 'f_headers',
 				helpTitle: this.localize('Table headers'),
 				store: store,
-				width: (this.properties && this.properties['headers'] && this.properties['headers'].width) ? this.properties['headers'].width : 200,
+				width: (this.properties['headers'] && this.properties['headers'].width) ? this.properties['headers'].width : 200,
 				value: selected
 			}, this.configDefaults['combo']));
 		}
@@ -1854,7 +1854,7 @@
 			itemId: fieldName,
 			fieldLabel: this.localize(fieldLabel),
 			helpTitle: this.localize(fieldTitle),
-			width: (this.properties && this.properties['style'] && this.properties['style'].width) ? this.properties['style'].width : 300,
+			width: (this.properties['style'] && this.properties['style'].width) ? this.properties['style'].width : 300,
 			store: new Ext.data.ArrayStore({
 				autoDestroy:  true,
 				fields: [ { name: 'text'}, { name: 'value'}, { name: 'style'} ],
@@ -1918,7 +1918,7 @@
 				itemId: 'f_lang',
 				helpTitle: this.localize('Language'),
 				store: languageStore,
-				width: (this.properties && this.properties['language'] && this.properties['language'].width) ? this.properties['language'].width : 200,
+				width: (this.properties['language'] && this.properties['language'].width) ? this.properties['language'].width : 200,
 				value: selectedLanguage
 			}, this.configDefaults['combo']));
 		}
@@ -1937,7 +1937,7 @@
 						[this.localize('LeftToRight'), 'ltr']
 					]
 				}),
-				width: (this.properties && this.properties['direction'] && this.properties['dirrection'].width) ? this.properties['direction'].width : 200,
+				width: (this.properties['direction'] && this.properties['dirrection'].width) ? this.properties['direction'].width : 200,
 				value: !Ext.isEmpty(element) && element.dir ? element.dir : 'not set'
 			}, this.configDefaults['combo']));
 		}
@@ -2019,7 +2019,7 @@
 				fieldLabel: this.localize('Width:'),
 				labelSeparator: '',
 				itemId: 'f_st_width',
-				value: element ? this.getLength(element.style.width) : ((this.properties && this.properties.width && this.properties.width.defaultValue) ? this.properties.width.defaultValue : ''),
+				value: element ? this.getLength(element.style.width) : ((this.properties.width && this.properties.width.defaultValue) ? this.properties.width.defaultValue : ''),
 				width: 30,
 				helpTitle: this.localize(widthTitle)
 			});
@@ -2029,8 +2029,8 @@
 				itemId: 'f_st_widthUnit',
 				helpTitle: this.localize('Width unit'),
 				store: widthUnitStore,
-				width: (this.properties && this.properties['widthUnit'] && this.properties['widthUnit'].width) ? this.properties['widthUnit'].width : 60,
-				value: element ? (/%/.test(element.style.width) ? '%' : (/px/.test(element.style.width) ? 'px' : 'em')) : ((this.properties && this.properties.widthUnit &&this.properties.widthUnit.defaultValue) ? this.properties.widthUnit.defaultValue : '%')
+				width: (this.properties['widthUnit'] && this.properties['widthUnit'].width) ? this.properties['widthUnit'].width : 60,
+				value: element ? (/%/.test(element.style.width) ? '%' : (/px/.test(element.style.width) ? 'px' : 'em')) : ((this.properties.widthUnit && this.properties.widthUnit.defaultValue) ? this.properties.widthUnit.defaultValue : '%')
 			}, this.configDefaults['combo']));
 		}
 		if (this.removedProperties.indexOf('height') === -1) {
@@ -2048,7 +2048,7 @@
 				fieldLabel: this.localize('Height:'),
 				labelSeparator: '',
 				itemId: 'f_st_height',
-				value: element ? this.getLength(element.style.height) : ((this.properties && this.properties.height && this.properties.height.defaultValue) ? this.properties.height.defaultValue : ''),
+				value: element ? this.getLength(element.style.height) : ((this.properties.height && this.properties.height.defaultValue) ? this.properties.height.defaultValue : ''),
 				width: 30,
 				helpTitle: this.localize(heightTitle)
 			});
@@ -2058,8 +2058,8 @@
 				itemId: 'f_st_heightUnit',
 				helpTitle: this.localize('Height unit'),
 				store: heightUnitStore,
-				width: (this.properties && this.properties['heightUnit'] && this.properties['heightUnit'].width) ? this.properties['heightUnit'].width : 60,
-				value: element ? (/%/.test(element.style.height) ? '%' : (/px/.test(element.style.height) ? 'px' : 'em')) : ((this.properties && this.properties.heightUnit &&this.properties.heightUnit.defaultValue) ? this.properties.heightUnit.defaultValue : '%')
+				width: (this.properties['heightUnit'] && this.properties['heightUnit'].width) ? this.properties['heightUnit'].width : 60,
+				value: element ? (/%/.test(element.style.height) ? '%' : (/px/.test(element.style.height) ? 'px' : 'em')) : ((this.properties.heightUnit && this.properties.heightUnit.defaultValue) ? this.properties.heightUnit.defaultValue : '%')
 			}, this.configDefaults['combo']));
 		}
 		if (nodeName == 'table' && this.removedProperties.indexOf('float') === -1) {
@@ -2080,7 +2080,7 @@
 				itemId: 'f_st_float',
 				helpTitle: this.localize('Specifies where the table should float'),
 				store: floatStore,
-				width: (this.properties && this.properties['float'] && this.properties['float'].width) ? this.properties['float'].width : 120,
+				width: (this.properties['float'] && this.properties['float'].width) ? this.properties['float'].width : 120,
 				value: element ? (Ext.get(element).hasClass(this.floatLeft) ? 'left' : (Ext.get(element).hasClass(this.floatRight) ? 'right' : 'not set')) : this.floatDefault
 			}, this.configDefaults['combo']));
 		}
@@ -2133,7 +2133,7 @@
 					[this.localize('Justify'), 'justify']
 				]
 			}),
-			width: (this.properties && this.properties['textAlign'] && this.properties['textAlign'].width) ? this.properties['textAlign'].width : 100,
+			width: (this.properties['textAlign'] && this.properties['textAlign'].width) ? this.properties['textAlign'].width : 100,
 			value: selectedTextAlign
 		}, this.configDefaults['combo']));
 			// Vertical alignment
@@ -2153,7 +2153,7 @@
 					[this.localize('Baseline'), 'baseline']
 				]
 			}),
-			width: (this.properties && this.properties['verticalAlign'] && this.properties['verticalAlign'].width) ? this.properties['verticalAlign'].width : 100,
+			width: (this.properties['verticalAlign'] && this.properties['verticalAlign'].width) ? this.properties['verticalAlign'].width : 100,
 			value: (element && element.style.verticalAlign) ? element.style.verticalAlign : 'not set'
 		}, this.configDefaults['combo']));
 		return {
@@ -2195,14 +2195,14 @@
 		this.removeOptions(borderStyleStore, 'borderStyle');
 			// Gecko reports "solid solid solid solid" for "border-style: solid".
 			// That is, "top right bottom left" -- we only consider the first value.
-		var selectedBorderStyle = element && element.style.borderStyle ? element.style.borderStyle : ((this.properties && this.properties.borderWidth) ? ((this.properties.borderStyle && this.properties.borderStyle.defaultValue) ? this.properties.borderStyle.defaultValue : 'solid') : 'not set');
+		var selectedBorderStyle = element && element.style.borderStyle ? element.style.borderStyle : ((this.properties.borderWidth) ? ((this.properties.borderStyle && this.properties.borderStyle.defaultValue) ? this.properties.borderStyle.defaultValue : 'solid') : 'not set');
 		itemsConfig.push(Ext.apply({
 			xtype: 'combo',
 			fieldLabel: this.localize('Border style:'),
 			itemId: 'f_st_borderStyle',
 			helpTitle: this.localize('Border style'),
 			store: borderStyleStore,
-			width: (this.properties && this.properties.borderStyle && this.properties.borderStyle.width) ? this.properties.borderStyle.width : 150,
+			width: (this.properties.borderStyle && this.properties.borderStyle.width) ? this.properties.borderStyle.width : 150,
 			value: selectedBorderStyle,
 			listeners: {
 				change: {
@@ -2214,7 +2214,7 @@
 		itemsConfig.push({
 			fieldLabel: this.localize('Border width:'),
 			itemId: 'f_st_borderWidth',
-			value: element ? this.getLength(element.style.borderWidth) : ((this.properties && this.properties.borderWidth && this.properties.borderWidth.defaultValue) ? this.properties.borderWidth.defaultValue : ''),
+			value: element ? this.getLength(element.style.borderWidth) : ((this.properties.borderWidth && this.properties.borderWidth.defaultValue) ? this.properties.borderWidth.defaultValue : ''),
 			width: 30,
 			minValue: 0,
 			helpTitle: this.localize('Border width'),
@@ -2227,7 +2227,7 @@
 			fieldLabel: this.localize('Color:'),
 			itemId: 'f_st_borderColor',
 			colorsConfiguration: this.editorConfiguration.colors,
-			value: HTMLArea.util.Color.colorToHex(element && element.style.borderColor ? element.style.borderColor : ((this.properties && this.properties.borderColor && this.properties.borderColor.defaultValue) ? this.properties.borderColor.defaultValue : '')).substr(1, 6),
+			value: HTMLArea.util.Color.colorToHex(element && element.style.borderColor ? element.style.borderColor : ((this.properties.borderColor && this.properties.borderColor.defaultValue) ? this.properties.borderColor.defaultValue : '')).substr(1, 6),
 			helpTitle: this.localize('Border color'),
 			disabled: (selectedBorderStyle === 'none')
 		});
@@ -2248,7 +2248,7 @@
 						[this.localize('Detached borders'), 'separate']
 					]
 				}),
-				width: (this.properties && this.properties.borderCollapse && this.properties.borderCollapse.width) ? this.properties.borderCollapse.width : 150,
+				width: (this.properties.borderCollapse && this.properties.borderCollapse.width) ? this.properties.borderCollapse.width : 150,
 				value: element && element.style.borderCollapse ? element.style.borderCollapse : 'not set',
 				disabled: (selectedBorderStyle === 'none')
 			}, this.configDefaults['combo']));
@@ -2273,7 +2273,7 @@
 						[this.localize('All four sides'), 'box']
 					]
 				}),
-				width: (this.properties && this.properties.frame && this.properties.frame.width) ? this.properties.frame.width : 250,
+				width: (this.properties.frame && this.properties.frame.width) ? this.properties.frame.width : 250,
 				value: (element && element.frame) ? element.frame : 'not set',
 				disabled: (selectedBorderStyle === 'none')
 			}, this.configDefaults['combo']));
@@ -2294,7 +2294,7 @@
 						[this.localize('Rules will appear between all rows and columns'), 'all']
 					]
 				}),
-				width: (this.properties && this.properties.rules && this.properties.rules.width) ? this.properties.rules.width : 360,
+				width: (this.properties.rules && this.properties.rules.width) ? this.properties.rules.width : 360,
 				value: (element && element.rules) ? element.rules : 'not set'
 			}, this.configDefaults['combo']));
 		}
@@ -2351,7 +2351,7 @@
 			fieldLabel: this.localize('FG Color:'),
 			itemId: 'f_st_color',
 			colorsConfiguration: this.editorConfiguration.colors,
-			value: HTMLArea.util.Color.colorToHex(element && element.style.color ? element.style.color : ((this.properties && this.properties.color && this.properties.color.defaultValue) ? this.properties.color.defaultValue : '')).substr(1, 6)
+			value: HTMLArea.util.Color.colorToHex(element && element.style.color ? element.style.color : ((this.properties.color && this.properties.color.defaultValue) ? this.properties.color.defaultValue : '')).substr(1, 6)
 		});
 			// Background color
 		itemsConfig.push({
@@ -2359,14 +2359,14 @@
 			fieldLabel: this.localize('Background:'),
 			itemId: 'f_st_backgroundColor',
 			colorsConfiguration: this.editorConfiguration.colors,
-			value: HTMLArea.util.Color.colorToHex(element && element.style.backgroundColor ? element.style.backgroundColor : ((this.properties && this.properties.backgroundColor && this.properties.backgroundColor.defaultValue) ? this.properties.backgroundColor.defaultValue : '')).substr(1, 6)
+			value: HTMLArea.util.Color.colorToHex(element && element.style.backgroundColor ? element.style.backgroundColor : ((this.properties.backgroundColor && this.properties.backgroundColor.defaultValue) ? this.properties.backgroundColor.defaultValue : '')).substr(1, 6)
 		});
 			// Background image
 		itemsConfig.push({
 			fieldLabel: this.localize('Image URL:'),
 			itemId: 'f_st_backgroundImage',
 			value: element && element.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/) ? RegExp.$1 : '',
-			width: (this.properties && this.properties.backgroundImage && this.properties.backgroundImage.width) ? this.properties.backgroundImage.width : 300,
+			width: (this.properties.backgroundImage && this.properties.backgroundImage.width) ? this.properties.backgroundImage.width : 300,
 			helpTitle: this.localize('URL of the background image'),
 			helpIcon: true
 		});
@@ -2410,7 +2410,7 @@
 			// @return	void
 		var self = this;
 		function cellTypeChange(cellTypeField, record) {
-			value = record.get('value');
+			var value = record.get('value');
 			var styleCombo = self.dialog.find('itemId', 'f_class')[0];
 			if (styleCombo) {
 				self.setStyleOptions(styleCombo, element, value.substring(0,2));
@@ -2433,7 +2433,7 @@
 				fields: [ { name: 'text'}, { name: 'value'}],
 				data: data
 			}),
-			width: (this.properties && this.properties.cellType && this.properties.cellType.width) ? this.properties.cellType.width : 250,
+			width: (this.properties.cellType && this.properties.cellType.width) ? this.properties.cellType.width : 250,
 			value: (column && selected == 'thcol') ? 'td' : selected,
 			listeners: {
 				select: {
@@ -2508,7 +2508,7 @@
 					[this.localize('Table footer'), 'tfoot']
 				]
 			}),
-			width: (this.properties && this.properties.rowGroup && this.properties.rowGroup.width) ? this.properties.rowGroup.width : 150,
+			width: (this.properties.rowGroup && this.properties.rowGroup.width) ? this.properties.rowGroup.width : 150,
 			value: current,
 			labelSeparator: '',
 			listeners: {
@@ -2544,7 +2544,7 @@
 	 *
 	 */
 	removeOptions: function (store, property) {
-		if (this.properties && this.properties[property] && this.properties[property].removeItems) {
+		if (this.properties[property] && this.properties[property].removeItems) {
 			var items = this.properties[property].removeItems.split(',');
 			var index = -1;
 			Ext.each(items, function (item) {
