Index: typo3/sysext/rtehtmlarea/htmlarea/plugins/TYPO3Link/typo3link.js
===================================================================
--- typo3/sysext/rtehtmlarea/htmlarea/plugins/TYPO3Link/typo3link.js (révision 9337)
+++ typo3/sysext/rtehtmlarea/htmlarea/plugins/TYPO3Link/typo3link.js (copie de travail)
@@ -162,53 +162,68 @@
var selection, range, anchorClass, imageNode = null, addIconAfterLink;
this.editor.focusEditor();
var node = this.editor.getParentElement();
- var el = HTMLArea.getElementObject(node, "a");
- if (el != null && /^a$/i.test(el.nodeName)) node = el;
- if (node != null && /^a$/i.test(node.nodeName)) this.editor.selectNode(node);
- // Clean images from existing anchors otherwise Mozilla may create nested anchors
- if (HTMLArea.classesAnchorSetup) {
+ var el = HTMLArea.getElementObject(node, 'a');
+ if (el != null && /^a$/i.test(el.nodeName)) {
+ node = el;
+ }
+ if (HTMLArea.classesAnchorSetup && cur_class) {
+ for (var i = HTMLArea.classesAnchorSetup.length; --i >= 0;) {
+ anchorClass = HTMLArea.classesAnchorSetup[i];
+ if (anchorClass.name == cur_class && anchorClass.image) {
+ imageNode = this.editor._doc.createElement('img');
+ imageNode.src = anchorClass.image;
+ imageNode.alt = anchorClass.altText;
+ addIconAfterLink = anchorClass.addIconAfterLink;
+ break;
+ }
+ }
+ }
+ if (node != null && /^a$/i.test(node.nodeName)) {
+ // Update existing link
+ this.editor.selectNode(node);
selection = this.editor._getSelection();
range = this.editor._createRange(selection);
- this.cleanAllLinks(node, range, true);
- }
- // In FF, if the url is the same except for upper/lower case of a file name, the link is not updated.
- // Therefore, we remove the link before creating a new one.
- if (HTMLArea.is_gecko && node != null && /^a$/i.test(node.nodeName)) {
- // If the class attribute is not removed, UnLink folowed by CreateLink will create a span element inside the new link
- node.removeAttribute("class");
- // Moreover, the selection is sometimes lost after the unlink operation
+ // Clean images
+ if (HTMLArea.classesAnchorSetup) {
+ this.cleanAllLinks(node, range, true);
+ }
+ // Update link href
+ node.href = (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) ? encodeURI(theLink) : theLink;
+ // Update link attributes
+ this.setLinkAttributes(node, range, cur_target, cur_class, cur_title, imageNode, addIconAfterLink, additionalValues);
+ } else {
+ // Create new link
+ // Clean existing anchors otherwise Mozilla may create nested anchors
selection = this.editor._getSelection();
range = this.editor._createRange(selection);
+ // Selection may be lost when cleaning links
var bookmark = this.editor.getBookmark(range);
- this.editor._doc.execCommand("UnLink", false, null);
+ this.cleanAllLinks(node, range);
this.editor.selectRange(this.editor.moveToBookmark(bookmark));
- }
- if (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) {
- this.editor._doc.execCommand("CreateLink", false, encodeURI(theLink));
- } else {
- this.editor._doc.execCommand("CreateLink", false, theLink);
- }
-
- selection = this.editor._getSelection();
- range = this.editor._createRange(selection);
- node = this.editor.getParentElement();
- el = HTMLArea.getElementObject(node, "a");
- if (el != null && /^a$/i.test(el.nodeName)) node = el;
- if (node) {
- if (HTMLArea.classesAnchorSetup && cur_class) {
- for (var i = HTMLArea.classesAnchorSetup.length; --i >= 0;) {
- anchorClass = HTMLArea.classesAnchorSetup[i];
- if (anchorClass.name == cur_class && anchorClass.image) {
- imageNode = this.editor._doc.createElement("img");
- imageNode.src = anchorClass.image;
- imageNode.alt = anchorClass.altText;
- addIconAfterLink = anchorClass.addIconAfterLink;
- break;
+ if (HTMLArea.is_gecko && !HTMLArea.is_safari && !HTMLArea.is_opera) {
+ this.editor._doc.execCommand('CreateLink', false, encodeURI(theLink));
+ } else {
+ this.editor._doc.execCommand('CreateLink', false, theLink);
+ }
+ // Get the created link
+ selection = this.editor._getSelection();
+ range = this.editor._createRange(selection);
+ node = this.editor.getParentElement();
+ el = HTMLArea.getElementObject(node, 'a');
+ if (el != null && /^a$/i.test(el.nodeName)) {
+ node = el;
+ }
+ if (node) {
+ // Export trailing br that IE may include in the link
+ if (HTMLArea.is_ie) {
+ if (node.lastChild && /^br$/i.test(node.lastChild.nodeName)) {
+ HTMLArea.removeFromParent(node.lastChild);
+ node.parentNode.insertBefore(this.editor._doc.createElement('br'), node.nextSibling);
}
}
+ // We may have created multiple links in as many blocks
+ this.setLinkAttributes(node, range, cur_target, cur_class, cur_title, imageNode, addIconAfterLink, additionalValues);
}
- // We may have created multiple links in as many blocks
- this.setLinkAttributes(node, range, cur_target, cur_class, cur_title, imageNode, addIconAfterLink, additionalValues);
}
this.dialog.close();
},