Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/locallang.xml
===================================================================
--- typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/locallang.xml	(révision 7096)
+++ typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/locallang.xml	(copie de travail)
@@ -14,6 +14,7 @@
 			<label index="Cleaning options">Type of formatting to remove</label>
 			<label index="Formatting:">HTML Formatting:</label>
 			<label index="MS Word Formatting:">MS Word Formatting:</label>
+			<label index="Spaces">Non-breaking spaces:</label>
 			<label index="Images:">Images:</label>
 			<label index="All HTML:">All HTML tags:</label>
 			<label index="Select the type of formatting you wish to remove.">Select the type of formatting to remove.</label>
Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html
===================================================================
--- typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html	(révision 7096)
+++ typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html	(copie de travail)
@@ -1,124 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<!--
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2005-2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-/*
- * Remove Format Plugin for TYPO3 htmlArea RTE
- *
- * TYPO3 SVN ID: $Id$
- */
--->
-<head>
-	<title>Remove formatting</title>
-	<meta http-equiv="Content-Style-Type" content="text/css" />
-	<script type="text/javascript">
-		/*<![CDATA[*/
-		<!--
-		var dialog = window.opener.HTMLArea.Dialog.RemoveFormat;
-
-		function Init() {
-			dialog.initialize();
-			var editor = dialog.plugin.editor;
-			if (!editor._selectionEmpty(editor._getSelection())) document.getElementById('clean_selection').checked = true;
-		}
-
-		function onOK() {
-			var param = {};
-			if (document.getElementById('clean_selection').checked) {
-				param["cleaning_area"] = "selection";
-			} else {
-				param["cleaning_area"] = "all";
-			}
-
-			var fields = ["formatting", "ms_formatting", "images", "html_all"];
-			oneChecked = false;
-			for (var i=0; i<fields.length; i++) {
-				var id = fields[i];
-				var el = document.getElementById(id);
-				if (el.checked) {
-					param[id] = true;
-					oneChecked = true;
-				}
-			}
-			if (oneChecked) {
-				dialog.performAction(param);
-				dialog.close();
-			} else {
-				alert(dialog.plugin.localize("Select the type of formatting you wish to remove."));
-			}
-			return false;
-		};
-
-		function onCancel() {
-			dialog.close();
-			return false;
-		}
-		// -->
-		/*]]>*/
-	</script>
-</head>
-<body class="popupwin htmlarea-remove-format" onload="Init();">
-<div id="content">
-<div class="title">Remove formatting</div>
-<form action="" method="get">
-	<fieldset>
-		<legend>Cleaning Area</legend>
-		<div>
-			<label for="clean_selection">Selection</label> <input type="radio" name="cleaning_area" id="clean_selection" value="selection" />
-			<label for="clean_page">All</label> <input type="radio" name="cleaning_area" id="clean_page" value="page" checked="checked" />
-		</div>
-	</fieldset>
-	<fieldset>
-		<legend>Cleaning options</legend>
-			<div>
-				<label class="fl" for="formatting">Formatting:</label>
-				<input type="checkbox" id="formatting" value="" />
-			</div>
-			<div>
-				<label class="fl" for="ms_formatting">MS Word Formatting:</label>
-				<input type="checkbox" id="ms_formatting" value="" checked="checked" />
-			</div>
-			<div>
-				<label class="fl" for="images">Images:</label>
-				<input type="checkbox" id="images" value="" />
-			</div>
-			<div>
-				<label class="fl" for="html_all">All HTML:</label>
-				<input type="checkbox" id="html_all" value="" />
-			</div>
-	</fieldset>
-	<div class="buttons">
-		<button type="button" name="ok" onclick="return onOK();">OK</button>
-		<button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-	</div>
-</form>
-</div>
-</body>
-</html>
Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/remove-format.js
===================================================================
--- typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/remove-format.js	(révision 7096)
+++ typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/remove-format.js	(copie de travail)
@@ -30,48 +30,39 @@
  * TYPO3 SVN ID: $Id$
  */
 RemoveFormat = HTMLArea.Plugin.extend({
-
-	constructor : function(editor, pluginName) {
+	constructor: function(editor, pluginName) {
 		this.base(editor, pluginName);
 	},
-
 	/*
 	 * This function gets called by the class constructor
 	 */
-	configurePlugin : function(editor) {
-
+	configurePlugin: function(editor) {
 		/*
 		 * Registering plugin "About" information
 		 */
 		var pluginInformation = {
-			version		: "1.7",
-			developer	: "Stanislas Rolland",
-			developerUrl	: "http://www.sjbr.ca/",
-			copyrightOwner	: "Stanislas Rolland",
-			sponsor		: "SJBR",
-			sponsorUrl	: "http://www.sjbr.ca/",
-			license		: "GPL"
+			version		: '2.0',
+			developer	: 'Stanislas Rolland',
+			developerUrl	: 'http://www.sjbr.ca/',
+			copyrightOwner	: 'Stanislas Rolland',
+			sponsor		: 'SJBR',
+			sponsorUrl	: 'http://www.sjbr.ca/',
+			license		: 'GPL'
 		};
 		this.registerPluginInformation(pluginInformation);
-
 		/*
 		 * Registering the button
 		 */
-		var buttonId = "RemoveFormat";
+		var buttonId = 'RemoveFormat';
 		var buttonConfiguration = {
 			id		: buttonId,
-			tooltip		: this.localize(buttonId+"Tooltip"),
-			action		: "onButtonPress",
+			tooltip		: this.localize(buttonId + 'Tooltip'),
+			action		: 'onButtonPress',
 			dialog		: true
 		};
 		this.registerButton(buttonConfiguration);
-
-		this.popupWidth = 370;
-		this.popupHeight = 260;
-
 		return true;
 	},
-
 	/*
 	 * This function gets called when the button was pressed.
 	 *
@@ -80,105 +71,211 @@
 	 *
 	 * @return	boolean		false if action is completed
 	 */
-	onButtonPress : function (editor, id, target) {
+	onButtonPress: function (editor, id, target) {
 			// Could be a button or its hotkey
 		var buttonId = this.translateHotKey(id);
 		buttonId = buttonId ? buttonId : id;
-
-		this.dialog = this.openDialog("RemoveFormat", this.makeUrlFromPopupName("removeformat"), "applyRequest", null, {width:this.popupWidth, height:this.popupHeight});
+			// Open dialogue window
+		this.openDialogue(
+			buttonId,
+			'Remove formatting',
+			this.getWindowDimensions(
+				{
+					width: 260,
+					height:260
+				},
+				buttonId
+			)
+		);
 		return false;
 	},
-
 	/*
+	 * Open the dialogue window
+	 *
+	 * @param	string		buttonId: the button id
+	 * @param	string		title: the window title
+	 * @param	object		dimensions: the opening dimensions of the window
+	 *
+	 * @return	void
+	 */
+	openDialogue: function (buttonId, title, dimensions) {
+		this.dialog = new Ext.Window({
+			title: this.localize(title),
+			cls: 'htmlarea-window',
+			border: false,
+			width: dimensions.width,
+			height: 'auto',
+				// As of ExtJS 3.1, JS error with IE when the window is resizable
+			resizable: !Ext.isIE,
+			iconCls: buttonId,
+			listeners: {
+				close: {
+					fn: this.onClose,
+					scope: this
+				}
+			},
+			items: [{
+					xtype: 'fieldset',
+					title: this.localize('Cleaning Area'),
+					defaultType: 'radio',
+					labelWidth: 150,
+					defaults: {
+						labelSeparator: ''
+					},
+					items: [{
+							itemId: 'selection',
+							fieldLabel: this.localize('Selection'),
+							name: 'htmlarea-removeFormat-area'
+						},{
+							itemId: 'allContent',
+							fieldLabel: this.localize('All'),
+							checked: true,
+							name: 'htmlarea-removeFormat-area'
+						}
+					]
+				},{
+					xtype: 'fieldset',
+					defaultType: 'checkbox',
+					title: this.localize('Cleaning options'),
+					labelWidth: 150,
+					defaults: {
+						labelSeparator: ''
+					},
+					items: [{
+							itemId: 'formatting',
+							fieldLabel: this.localize('Formatting:')
+						},{
+							itemId: 'msWordFormatting',
+							fieldLabel: this.localize('MS Word Formatting:'),
+							checked: true
+						},{
+							itemId: 'spaces',
+							fieldLabel: this.localize('Spaces')
+						},{
+							itemId: 'images',
+							fieldLabel: this.localize('Images:')
+						},{
+							itemId: 'allHtml',
+							fieldLabel: this.localize('All HTML:')
+						}
+					]
+				}
+			],
+			buttons: [
+				this.buildButtonConfig('OK', this.onOK),
+				this.buildButtonConfig('Cancel', this.onCancel)
+			]
+		});
+		this.show();
+	},
+	/*
+	 * Handler when the OK button is pressed
+	 */
+	onOK: function () {
+		var fields = [
+			'selection',
+			'allContent',
+			'formatting',
+			'msWordFormatting',
+			'spaces',
+			'images',
+			'allHtml'
+		];
+		var params = {};
+		Ext.each(fields, function (field) {
+			params[field] = this.dialog.find('itemId', field)[0].getValue();
+		}, this);
+		if (params['allHtml'] || params['formatting'] || params['spaces'] || params['images'] || params['msWordFormatting']) {
+			this.applyRequest(params);
+		} else {
+			Ext.MessageBox.alert('', this.localize('Select the type of formatting you wish to remove.'));
+		}
+		return false;
+	},
+	/*
 	 * Perform the cleaning request
-	 * .
+	 * @param	object		params: the values of the form fields
+	 *
+	 * @return	void
 	 */
-	applyRequest : function(param) {
-
+	applyRequest: function(params) {
 		var editor = this.editor;
-		editor.focusEditor();
-
-		if (param) {
-
-			if (param["cleaning_area"] == "all") {
-				var html = editor._doc.body.innerHTML;
-			} else {
-				var html = editor.getSelectedHTML();
- 			}
-
-			if (html) {
-
-				if (param["html_all"]== true) {
-					html = html.replace(/<[\!]*?[^<>]*?>/g, "");
-				}
-
-				if (param["formatting"] == true) {
-						// remove font, b, strong, i, em, u, strike, span and other tags
-					var regF1 = new RegExp("<\/?(abbr|acronym|b[^a-zA-Z]|big|cite|code|em[^a-zA-Z]|font|i[^a-zA-Z]|q|s[^a-zA-Z]|samp|small|span|strike|strong|sub|sup|u[^a-zA-Z]|var)[^>]*>", "gi");
-					html = html.replace(regF1, "");
-						// keep tags, strip attributes
-					var regF2 = new RegExp(" style=\"[^>\"]*\"", "gi");
-					var regF3 = new RegExp(" (class|align|cellpadding|cellspacing|frame|bgcolor)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
-					html = html.replace(regF2, "").replace(regF3, "");
-				}
-
-				if (param["images"] == true) {
-						// remove any IMG tag
-					html = html.replace(/<\/?img[^>]*>/gi, ""); //remove img tags
-				}
-
-				if (param["ms_formatting"] == true) {
-						// make one line
-					var regMS1 = new RegExp("(\r\n|\n|\r)", "g");
-					html = html.replace(regMS1, " ");
-						//clean up tags
-					var regMS2 = new RegExp("<(b[^r]|strong|i|em|p|li|ul) [^>]*>", "gi");
-					html = html.replace(regMS2, "<$1>");
-						// keep tags, strip attributes
-					var regMS3 = new RegExp(" style=\"[^>\"]*\"", "gi");
-					var regMS4 = new RegExp(" (class|align)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
-					html = html.replace(regMS3, "").replace(regMS4, "");
-						// mozilla doesn't like <em> tags
-					html = html.replace(/<em>/gi, "<i>").replace(/<\/em>/gi, "</i>");
-						// kill unwanted tags: span, div, ?xml:, st1:, [a-z]:, meta, link
-					html = html.replace(/<\/?span[^>]*>/gi, "").
-						replace(/<\/?div[^>]*>/gi, "").
-						replace(/<\?xml:[^>]*>/gi, "").
-						replace(/<\/?st1:[^>]*>/gi, "").
-						replace(/<\/?[a-z]:[^>]*>/g, "").
-						replace(/<\/?meta[^>]*>/g, "").
-						replace(/<\/?link[^>]*>/g, "");
-						// remove unwanted tags and their contents: style, title
-					html = html.replace(/<style[^>]*>.*<\/style[^>]*>/gi, "").
-						replace(/<title[^>]*>.*<\/title[^>]*>/gi, "");
-						// remove comments
-					html = html.replace(/<!--[^>]*>/gi, "");
+		editor.focus();
+		this.restoreSelection();
+		if (params['allContent']) {
+			var html = editor.getInnerHTML();
+		} else {
+			var html = editor.getSelectedHTML();
+		}
+		if (html) {
+			if (params['allHtml']) {
+				html = html.replace(/<[\!]*?[^<>]*?>/g, "");
+			}
+			if (params['formatting']) {
+					// remove font, b, strong, i, em, u, strike, span and other tags
+				var regF1 = new RegExp("<\/?(abbr|acronym|b[^a-zA-Z]|big|cite|code|em[^a-zA-Z]|font|i[^a-zA-Z]|q|s[^a-zA-Z]|samp|small|span|strike|strong|sub|sup|u[^a-zA-Z]|var)[^>]*>", "gi");
+				html = html.replace(regF1, "");
+					// keep tags, strip attributes
+				var regF2 = new RegExp(" style=\"[^>\"]*\"", "gi");
+				var regF3 = new RegExp(" (class|align|cellpadding|cellspacing|frame|bgcolor)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
+				html = html.replace(regF2, "").replace(regF3, "");
+			}
+			if (params['spaces']) {
+					// Replace non-breaking spaces by normal spaces
+				html = html.replace(/&nbsp;/g, " ");
+			}
+			if (params['images']) {
+					// remove any IMG tag
+				html = html.replace(/<\/?img[^>]*>/gi, "");
+			}
+			if (params['msWordFormatting']) {
+					// make one line
+				var regMS1 = new RegExp("(\r\n|\n|\r)", "g");
+				html = html.replace(regMS1, " ");
+					//clean up tags
+				var regMS2 = new RegExp("<(b[^r]|strong|i|em|p|li|ul) [^>]*>", "gi");
+				html = html.replace(regMS2, "<$1>");
+					// keep tags, strip attributes
+				var regMS3 = new RegExp(" style=\"[^>\"]*\"", "gi");
+				var regMS4 = new RegExp(" (class|align)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
+				html = html.replace(regMS3, "").replace(regMS4, "");
+					// mozilla doesn't like <em> tags
+				html = html.replace(/<em>/gi, "<i>").replace(/<\/em>/gi, "</i>");
+					// kill unwanted tags: span, div, ?xml:, st1:, [a-z]:, meta, link
+				html = html.replace(/<\/?span[^>]*>/gi, "").
+					replace(/<\/?div[^>]*>/gi, "").
+					replace(/<\?xml:[^>]*>/gi, "").
+					replace(/<\/?st1:[^>]*>/gi, "").
+					replace(/<\/?[a-z]:[^>]*>/g, "").
+					replace(/<\/?meta[^>]*>/g, "").
+					replace(/<\/?link[^>]*>/g, "");
+					// remove unwanted tags and their contents: style, title
+				html = html.replace(/<style[^>]*>.*<\/style[^>]*>/gi, "").
+					replace(/<title[^>]*>.*<\/title[^>]*>/gi, "");
+					// remove comments
+				html = html.replace(/<!--[^>]*>/gi, "");
+					// remove double tags
+				oldlen = html.length + 1;
+				var reg6 = new RegExp("<([a-z][a-z]*)> *<\/\1>", "gi");
+				var reg7 = new RegExp("<([a-z][a-z]*)> *<\/?([a-z][^>]*)> *<\/\1>", "gi");
+				var reg8 = new RegExp("<([a-z][a-z]*)><\1>", "gi");
+				var reg9 = new RegExp("<\/([a-z][a-z]*)><\/\1>", "gi");
+				var reg10 = new RegExp("[\x20]+", "gi");
+				while(oldlen > html.length) {
+					oldlen = html.length;
+						// join us now and free the tags
+					html = html.replace(reg6, " ").replace(reg7, "<$2>");
 						// remove double tags
-					oldlen = html.length + 1;
-					var reg6 = new RegExp("<([a-z][a-z]*)> *<\/\1>", "gi");
-					var reg7 = new RegExp("<([a-z][a-z]*)> *<\/?([a-z][^>]*)> *<\/\1>", "gi");
-					var reg8 = new RegExp("<([a-z][a-z]*)><\1>", "gi");
-					var reg9 = new RegExp("<\/([a-z][a-z]*)><\/\1>", "gi");
-					var reg10 = new RegExp("[\x20]+", "gi");
-					while(oldlen > html.length) {
-						oldlen = html.length;
-							// join us now and free the tags
-						html = html.replace(reg6, " ").replace(reg7, "<$2>");
-							// remove double tags
-						html = html.replace(reg8, "<$1>").replace(reg9, "<\/$1>");
-							// remove double spaces
-						html = html.replace(reg10, " ");
-					}
+					html = html.replace(reg8, "<$1>").replace(reg9, "<\/$1>");
+						// remove double spaces
+					html = html.replace(reg10, " ");
 				}
-
-				if (param["cleaning_area"] == "all") {
-					editor.setHTML(html);
-				} else {
-					editor.insertHTML(html);
-				}
 			}
-		} else {
-			return false;
+			if (params['allContent']) {
+				editor.setHTML(html);
+			} else {
+				editor.insertHTML(html);
+			}
 		}
 	}
 });
