-/***************************************************************\r
-* Copyright notice\r
-*\r
-* (c) 2008-2009 Stanislas Rolland <typo3(arobas)sjbr.ca>\r
-* All rights reserved\r
-*\r
-* This script is part of the TYPO3 project. The TYPO3 project is\r
-* free software; you can redistribute it and/or modify\r
-* it under the terms of the GNU General Public License as published by\r
-* the Free Software Foundation; either version 2 of the License, or\r
-* (at your option) any later version.\r
-*\r
-* The GNU General Public License can be found at\r
-* http://www.gnu.org/copyleft/gpl.html.\r
-* A copy is found in the textfile GPL.txt and important notices to the license\r
-* from the author is found in LICENSE.txt distributed with these scripts.\r
-*\r
-*\r
-* This script is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-* GNU General Public License for more details.\r
-*\r
-*\r
-* This copyright notice MUST APPEAR in all copies of the script!\r
-***************************************************************/\r
-/*\r
- * DefinitionList Plugin for TYPO3 htmlArea RTE\r
- *\r
- * TYPO3 SVN ID: $Id: definition-list.js $\r
- */\r
-DefinitionList = BlockElements.extend({\r
- \r
- constructor : function(editor, pluginName) {\r
- this.base(editor, pluginName);\r
- },\r
- \r
- /*\r
- * This function gets called by the class constructor\r
- */\r
- configurePlugin : function (editor) {\r
- \r
- /*\r
- * Setting up some properties from PageTSConfig\r
- */\r
- this.buttonsConfiguration = this.editorConfiguration.buttons;\r
- var parentPlugin = this.editor.plugins.BlockElements.instance;\r
- this.tags = parentPlugin.tags;\r
- this.useClass = parentPlugin.useClass;\r
- this.useBlockquote = parentPlugin.useBlockquote;\r
- this.useAlignAttribute = parentPlugin.useAlignAttribute;\r
- this.allowedBlockElements = parentPlugin.allowedBlockElements;\r
- this.indentedList = null;\r
- \r
- /*\r
- * Registering plugin "About" information\r
- */\r
- var pluginInformation = {\r
- version : "0.4",\r
- developer : "Stanislas Rolland",\r
- developerUrl : "http://www.sjbr.ca/",\r
- copyrightOwner : "Stanislas Rolland",\r
- sponsor : this.localize("Technische Universitat Ilmenau"),\r
- sponsorUrl : "http://www.tu-ilmenau.de/",\r
- license : "GPL"\r
- };\r
- this.registerPluginInformation(pluginInformation);\r
- \r
- /*\r
- * Registering the buttons\r
- */\r
- for (var buttonId in this.buttonList) {\r
- if (this.buttonList.hasOwnProperty(buttonId)) {\r
- var button = this.buttonList[buttonId];\r
- var buttonConfiguration = {\r
- id : buttonId,\r
- tooltip : this.localize(buttonId + "-Tooltip"),\r
- action : "onButtonPress",\r
- context : button[0],\r
- hotKey : (this.buttonsConfiguration[button[2]] ? this.buttonsConfiguration[button[2]].hotKey : (button[1] ? button[1] : null))\r
- };\r
- this.registerButton(buttonConfiguration);\r
- }\r
- }\r
- \r
- return true;\r
- },\r
- \r
- /*\r
- * The list of buttons added by this plugin\r
- */\r
- buttonList : {\r
- Indent : [null, "TAB", "indent"],\r
- Outdent : [null, "SHIFT-TAB", "outdent"],\r
- DefinitionList : [null, null, "definitionlist"],\r
- DefinitionItem : ["dd,dt", null, "definitionitem"]\r
- },\r
- \r
- /*\r
- * This function gets called when a button was pressed.\r
- *\r
- * @param object editor: the editor instance\r
- * @param string id: the button id or the key\r
- * @param object target: the target element of the contextmenu event, when invoked from the context menu\r
- *\r
- * @return boolean false if action is completed\r
- */\r
- onButtonPress : function (editor, id, target) {\r
- // Could be a button or its hotkey\r
- var buttonId = this.translateHotKey(id);\r
- buttonId = buttonId ? buttonId : id;\r
- this.editor.focusEditor();\r
- var selection = editor._getSelection();\r
- var range = editor._createRange(selection);\r
- var statusBarSelection = editor.getPluginInstance("StatusBar") ? editor.getPluginInstance("StatusBar").getSelection() : null;\r
- var parentElement = statusBarSelection ? statusBarSelection : this.editor.getParentElement(selection, range);\r
- if (target) {\r
- parentElement = target;\r
- }\r
- while (parentElement && (!HTMLArea.isBlockElement(parentElement) || /^(li)$/i.test(parentElement.nodeName))) {\r
- parentElement = parentElement.parentNode;\r
- }\r
- \r
- switch (buttonId) {\r
- case "Indent" :\r
- if (/^(dd|dt)$/i.test(parentElement.nodeName) && this.indentDefinitionList(parentElement, range)) {\r
- break;\r
- } else {\r
- this.base(editor, id, target);\r
- }\r
- break;\r
- case "Outdent" :\r
- if (/^(dt)$/i.test(parentElement.nodeName) && this.outdentDefinitionList(selection, range)) {\r
- break;\r
- } else {\r
- this.base(editor, id, target);\r
- }\r
- break;\r
- case "DefinitionList":\r
- var bookmark = this.editor.getBookmark(range);\r
- this.insertDefinitionList();\r
- this.editor.selectRange(this.editor.moveToBookmark(bookmark));\r
- break;\r
- case "DefinitionItem":\r
- var bookmark = this.editor.getBookmark(range);\r
- this.remapNode(parentElement, (parentElement.nodeName.toLowerCase() === "dt") ? "dd" : "dt");\r
- this.editor.selectRange(this.editor.moveToBookmark(bookmark));\r
- break;\r
- default:\r
- this.base(editor, id, target);\r
- }\r
- return false;\r
- },\r
- \r
- /*\r
- * This function remaps a node to the specified node name\r
- */\r
- remapNode : function(node, nodeName) {\r
- var newNode = this.editor.convertNode(node, nodeName);\r
- var attributes = node.attributes, attributeName, attributeValue;\r
- for (var i = attributes.length; --i >= 0;) {\r
- attributeName = attributes.item(i).nodeName;\r
- attributeValue = node.getAttribute(attributeName);\r
- if (attributeValue) newNode.setAttribute(attributeName, attributeValue);\r
- }\r
- // In IE, the above fails to update the classname and style attributes.\r
- if (HTMLArea.is_ie) {\r
- if (node.style.cssText) {\r
- newNode.style.cssText = node.style.cssText;\r
- }\r
- if (node.className) {\r
- newNode.setAttribute("className", node.className);\r
- } else {\r
- newNode.removeAttribute("className");\r
- }\r
- }\r
- \r
- if (this.tags && this.tags[nodeName] && this.tags[nodeName].allowedClasses) {\r
- if (newNode.className && /\S/.test(newNode.className)) {\r
- var allowedClasses = this.tags[nodeName].allowedClasses;\r
- var classNames = newNode.className.trim().split(" ");\r
- for (var i = classNames.length; --i >= 0;) {\r
- if (!allowedClasses.test(classNames[i])) {\r
- HTMLArea._removeClass(newNode, classNames[i]);\r
- }\r
- }\r
- }\r
- }\r
- return newNode;\r
- },\r
- \r
- /*\r
- * Insert a definition list\r
- */\r
- insertDefinitionList : function () {\r
- var selection = this.editor._getSelection();\r
- var endBlocks = this.editor.getEndBlocks(selection);\r
- var list = null;\r
- if (this.editor._selectionEmpty(selection)) {\r
- if (/^(body|div|address|pre|blockquote|li|td|dd)$/i.test(endBlocks.start.nodeName)) {\r
- list = this.editor._doc.createElement("dl");\r
- var term = list.appendChild(this.editor._doc.createElement("dt"));\r
- while (endBlocks.start.firstChild) {\r
- term.appendChild(endBlocks.start.firstChild);\r
- }\r
- list = endBlocks.start.appendChild(list);\r
- } else if (/^(p|h[1-6])$/i.test(endBlocks.start.nodeName)) {\r
- var list = endBlocks.start.parentNode.insertBefore(this.editor._doc.createElement("dl"), endBlocks.start);\r
- endBlocks.start = list.appendChild(endBlocks.start);\r
- endBlocks.start = this.remapNode(endBlocks.start, "dt");\r
- }\r
- } else if (endBlocks.start != endBlocks.end && /^(p|h[1-6])$/i.test(endBlocks.start.nodeName)) {\r
- // We wrap the selected elements in a dl element\r
- var paragraphs = endBlocks.start.nodeName.toLowerCase() === "p";\r
- list = this.wrapSelectionInBlockElement("dl");\r
- var items = list.childNodes;\r
- for (var i = 0, n = items.length; i < n; ++i) {\r
- var paragraphItem = items[i].nodeName.toLowerCase() === "p";\r
- this.remapNode(items[i], paragraphs ? ((i % 2) ? "dd" : "dt") : (paragraphItem ? "dd" : "dt"));\r
- }\r
- }\r
- return list;\r
- },\r
- \r
- /*\r
- * Indent a definition list\r
- */\r
- indentDefinitionList : function (parentElement, range) {\r
- var selection = this.editor._getSelection();\r
- var endBlocks = this.editor.getEndBlocks(selection);\r
- if (this.editor._selectionEmpty(selection) && /^dd$/i.test(parentElement.nodeName)) {\r
- var list = parentElement.appendChild(this.editor._doc.createElement("dl"));\r
- var term = list.appendChild(this.editor._doc.createElement("dt"));\r
- if (HTMLArea.is_gecko) {\r
- if (HTMLArea.is_safari) {\r
- term.innerHTML = "<br />";\r
- } else {\r
- term.appendChild(this.editor._doc.createTextNode(""));\r
- }\r
- } else {\r
- term.innerHTML = "\x20";\r
- }\r
- this.editor.selectNodeContents(term, false);\r
- return true;\r
- } else if (endBlocks.start && /^dt$/i.test(endBlocks.start.nodeName) && endBlocks.start.previousSibling) {\r
- var sibling = endBlocks.start.previousSibling;\r
- var bookmark = this.editor.getBookmark(range);\r
- if (/^dd$/i.test(sibling.nodeName)) {\r
- var list = this.wrapSelectionInBlockElement("dl");\r
- list = sibling.appendChild(list);\r
- // May need to merge the list if it has a previous sibling\r
- if (list.previousSibling && /^dl$/i.test(list.previousSibling.nodeName)) {\r
- while (list.firstChild) {\r
- list.previousSibling.appendChild(list.firstChild);\r
- }\r
- HTMLArea.removeFromParent(list);\r
- }\r
- } else if (/^dt$/i.test(sibling.nodeName)) {\r
- var definition = this.editor._doc.createElement("dd");\r
- definition.appendChild(this.wrapSelectionInBlockElement("dl"));\r
- sibling.parentNode.insertBefore(definition, sibling.nextSibling);\r
- }\r
- this.editor.selectRange(this.editor.moveToBookmark(bookmark));\r
- return true;\r
- }\r
- return false;\r
- },\r
- \r
- /*\r
- * Outdent a definition list\r
- */\r
- outdentDefinitionList : function (selection, range) {\r
- var endBlocks = this.editor.getEndBlocks(selection);\r
- if (/^dt$/i.test(endBlocks.start.nodeName)\r
- && /^dl$/i.test(endBlocks.start.parentNode.nodeName)\r
- && /^dd$/i.test(endBlocks.start.parentNode.parentNode.nodeName)\r
- && !endBlocks.end.nextSibling) {\r
- var bookmark = this.editor.getBookmark(range);\r
- var dl = endBlocks.start.parentNode;\r
- var dd = dl.parentNode;\r
- if (this.editor._selectionEmpty(selection)) {\r
- dd.parentNode.insertBefore(endBlocks.start, dd.nextSibling);\r
- } else {\r
- var selected = this.wrapSelectionInBlockElement("dl");\r
- while (selected.lastChild) {\r
- dd.parentNode.insertBefore(selected.lastChild, dd.nextSibling);\r
- }\r
- selected.parentNode.removeChild(selected);\r
- }\r
- // We may have outdented all the child nodes of a list\r
- if (!dl.hasChildNodes()) {\r
- dd.removeChild(dl);\r
- if (!dd.hasChildNodes()) {\r
- dd.parentNode.removeChild(dd);\r
- }\r
- }\r
- this.editor.selectRange(this.editor.moveToBookmark(bookmark));\r
- return true;\r
- }\r
- return false;\r
- },\r
- \r
- /*\r
- * This function gets called when the toolbar is updated\r
- */\r
- onUpdateToolbar : function () {\r
- if (this.getEditorMode() === "textmode" || !this.editor.isEditable()) {\r
- return false;\r
- }\r
- var statusBarSelection = this.editor.getPluginInstance("StatusBar") ? this.editor.getPluginInstance("StatusBar").getSelection() : null;\r
- var parentElement = statusBarSelection ? statusBarSelection : this.editor.getParentElement();\r
- if (parentElement.nodeName.toLowerCase() === "body") return false;\r
- while (parentElement && (!HTMLArea.isBlockElement(parentElement) || /^(li)$/i.test(parentElement.nodeName))) {\r
- parentElement = parentElement.parentNode;\r
- }\r
- var blockAncestors = this.getBlockAncestors(parentElement);\r
- var selection = this.editor._getSelection();\r
- var endBlocks = this.editor.getEndBlocks(selection);\r
- for (var buttonId in this.buttonList) {\r
- commandState = false;\r
- if (this.buttonList.hasOwnProperty(buttonId) && this.isButtonInToolbar(buttonId)) {\r
- switch (buttonId) {\r
- case "Outdent" :\r
- if (/^(dt)$/i.test(endBlocks.start.nodeName)\r
- && /^(dl)$/i.test(endBlocks.start.parentNode.nodeName)\r
- && /^(dd)$/i.test(endBlocks.start.parentNode.parentNode.nodeName)\r
- && !endBlocks.end.nextSibling) {\r
- this.editor._toolbarObjects[buttonId].state("enabled", true);\r
- } else {\r
- this.base();\r
- }\r
- break;\r
- case "DefinitionList" :\r
- this.editor._toolbarObjects[buttonId].state("enabled", (this.editor._selectionEmpty() && /^(p|div|address|pre|blockquote|h[1-6]|li|td|dd)$/i.test(endBlocks.start.nodeName))\r
- || (endBlocks.start != endBlocks.end && /^(p|h[1-6])$/i.test(endBlocks.start.nodeName)));\r
- break;\r
- }\r
- }\r
- }\r
- }\r
-});\r
-\r
+/***************************************************************
+* Copyright notice
+*
+* (c) 2008-2009 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!
+***************************************************************/
+/*
+ * DefinitionList Plugin for TYPO3 htmlArea RTE
+ *
+ * TYPO3 SVN ID: $Id$
+ */
+DefinitionList = BlockElements.extend({
+
+ constructor : function(editor, pluginName) {
+ this.base(editor, pluginName);
+ },
+
+ /*
+ * This function gets called by the class constructor
+ */
+ configurePlugin : function (editor) {
+
+ /*
+ * Setting up some properties from PageTSConfig
+ */
+ this.buttonsConfiguration = this.editorConfiguration.buttons;
+ var parentPlugin = this.editor.plugins.BlockElements.instance;
+ this.tags = parentPlugin.tags;
+ this.useClass = parentPlugin.useClass;
+ this.useBlockquote = parentPlugin.useBlockquote;
+ this.useAlignAttribute = parentPlugin.useAlignAttribute;
+ this.allowedBlockElements = parentPlugin.allowedBlockElements;
+ this.indentedList = null;
+
+ /*
+ * Registering plugin "About" information
+ */
+ var pluginInformation = {
+ version : "0.4",
+ developer : "Stanislas Rolland",
+ developerUrl : "http://www.sjbr.ca/",
+ copyrightOwner : "Stanislas Rolland",
+ sponsor : this.localize("Technische Universitat Ilmenau"),
+ sponsorUrl : "http://www.tu-ilmenau.de/",
+ license : "GPL"
+ };
+ this.registerPluginInformation(pluginInformation);
+
+ /*
+ * Registering the buttons
+ */
+ for (var buttonId in this.buttonList) {
+ if (this.buttonList.hasOwnProperty(buttonId)) {
+ var button = this.buttonList[buttonId];
+ var buttonConfiguration = {
+ id : buttonId,
+ tooltip : this.localize(buttonId + "-Tooltip"),
+ action : "onButtonPress",
+ context : button[0],
+ hotKey : (this.buttonsConfiguration[button[2]] ? this.buttonsConfiguration[button[2]].hotKey : (button[1] ? button[1] : null))
+ };
+ this.registerButton(buttonConfiguration);
+ }
+ }
+
+ return true;
+ },
+
+ /*
+ * The list of buttons added by this plugin
+ */
+ buttonList : {
+ Indent : [null, "TAB", "indent"],
+ Outdent : [null, "SHIFT-TAB", "outdent"],
+ DefinitionList : [null, null, "definitionlist"],
+ DefinitionItem : ["dd,dt", null, "definitionitem"]
+ },
+
+ /*
+ * This function gets called when a button was pressed.
+ *
+ * @param object editor: the editor instance
+ * @param string id: the button id or the key
+ * @param object target: the target element of the contextmenu event, when invoked from the context menu
+ *
+ * @return boolean false if action is completed
+ */
+ onButtonPress : function (editor, id, target) {
+ // Could be a button or its hotkey
+ var buttonId = this.translateHotKey(id);
+ buttonId = buttonId ? buttonId : id;
+ this.editor.focusEditor();
+ var selection = editor._getSelection();
+ var range = editor._createRange(selection);
+ var statusBarSelection = editor.getPluginInstance("StatusBar") ? editor.getPluginInstance("StatusBar").getSelection() : null;
+ var parentElement = statusBarSelection ? statusBarSelection : this.editor.getParentElement(selection, range);
+ if (target) {
+ parentElement = target;
+ }
+ while (parentElement && (!HTMLArea.isBlockElement(parentElement) || /^(li)$/i.test(parentElement.nodeName))) {
+ parentElement = parentElement.parentNode;
+ }
+
+ switch (buttonId) {
+ case "Indent" :
+ if (/^(dd|dt)$/i.test(parentElement.nodeName) && this.indentDefinitionList(parentElement, range)) {
+ break;
+ } else {
+ this.base(editor, id, target);
+ }
+ break;
+ case "Outdent" :
+ if (/^(dt)$/i.test(parentElement.nodeName) && this.outdentDefinitionList(selection, range)) {
+ break;
+ } else {
+ this.base(editor, id, target);
+ }
+ break;
+ case "DefinitionList":
+ var bookmark = this.editor.getBookmark(range);
+ this.insertDefinitionList();
+ this.editor.selectRange(this.editor.moveToBookmark(bookmark));
+ break;
+ case "DefinitionItem":
+ var bookmark = this.editor.getBookmark(range);
+ this.remapNode(parentElement, (parentElement.nodeName.toLowerCase() === "dt") ? "dd" : "dt");
+ this.editor.selectRange(this.editor.moveToBookmark(bookmark));
+ break;
+ default:
+ this.base(editor, id, target);
+ }
+ return false;
+ },
+
+ /*
+ * This function remaps a node to the specified node name
+ */
+ remapNode : function(node, nodeName) {
+ var newNode = this.editor.convertNode(node, nodeName);
+ var attributes = node.attributes, attributeName, attributeValue;
+ for (var i = attributes.length; --i >= 0;) {
+ attributeName = attributes.item(i).nodeName;
+ attributeValue = node.getAttribute(attributeName);
+ if (attributeValue) newNode.setAttribute(attributeName, attributeValue);
+ }
+ // In IE, the above fails to update the classname and style attributes.
+ if (HTMLArea.is_ie) {
+ if (node.style.cssText) {
+ newNode.style.cssText = node.style.cssText;
+ }
+ if (node.className) {
+ newNode.setAttribute("className", node.className);
+ } else {
+ newNode.removeAttribute("className");
+ }
+ }
+
+ if (this.tags && this.tags[nodeName] && this.tags[nodeName].allowedClasses) {
+ if (newNode.className && /\S/.test(newNode.className)) {
+ var allowedClasses = this.tags[nodeName].allowedClasses;
+ var classNames = newNode.className.trim().split(" ");
+ for (var i = classNames.length; --i >= 0;) {
+ if (!allowedClasses.test(classNames[i])) {
+ HTMLArea._removeClass(newNode, classNames[i]);
+ }
+ }
+ }
+ }
+ return newNode;
+ },
+
+ /*
+ * Insert a definition list
+ */
+ insertDefinitionList : function () {
+ var selection = this.editor._getSelection();
+ var endBlocks = this.editor.getEndBlocks(selection);
+ var list = null;
+ if (this.editor._selectionEmpty(selection)) {
+ if (/^(body|div|address|pre|blockquote|li|td|dd)$/i.test(endBlocks.start.nodeName)) {
+ list = this.editor._doc.createElement("dl");
+ var term = list.appendChild(this.editor._doc.createElement("dt"));
+ while (endBlocks.start.firstChild) {
+ term.appendChild(endBlocks.start.firstChild);
+ }
+ list = endBlocks.start.appendChild(list);
+ } else if (/^(p|h[1-6])$/i.test(endBlocks.start.nodeName)) {
+ var list = endBlocks.start.parentNode.insertBefore(this.editor._doc.createElement("dl"), endBlocks.start);
+ endBlocks.start = list.appendChild(endBlocks.start);
+ endBlocks.start = this.remapNode(endBlocks.start, "dt");
+ }
+ } else if (endBlocks.start != endBlocks.end && /^(p|h[1-6])$/i.test(endBlocks.start.nodeName)) {
+ // We wrap the selected elements in a dl element
+ var paragraphs = endBlocks.start.nodeName.toLowerCase() === "p";
+ list = this.wrapSelectionInBlockElement("dl");
+ var items = list.childNodes;
+ for (var i = 0, n = items.length; i < n; ++i) {
+ var paragraphItem = items[i].nodeName.toLowerCase() === "p";
+ this.remapNode(items[i], paragraphs ? ((i % 2) ? "dd" : "dt") : (paragraphItem ? "dd" : "dt"));
+ }
+ }
+ return list;
+ },
+
+ /*
+ * Indent a definition list
+ */
+ indentDefinitionList : function (parentElement, range) {
+ var selection = this.editor._getSelection();
+ var endBlocks = this.editor.getEndBlocks(selection);
+ if (this.editor._selectionEmpty(selection) && /^dd$/i.test(parentElement.nodeName)) {
+ var list = parentElement.appendChild(this.editor._doc.createElement("dl"));
+ var term = list.appendChild(this.editor._doc.createElement("dt"));
+ if (HTMLArea.is_gecko) {
+ if (HTMLArea.is_safari) {
+ term.innerHTML = "<br />";
+ } else {
+ term.appendChild(this.editor._doc.createTextNode(""));
+ }
+ } else {
+ term.innerHTML = "\x20";
+ }
+ this.editor.selectNodeContents(term, false);
+ return true;
+ } else if (endBlocks.start && /^dt$/i.test(endBlocks.start.nodeName) && endBlocks.start.previousSibling) {
+ var sibling = endBlocks.start.previousSibling;
+ var bookmark = this.editor.getBookmark(range);
+ if (/^dd$/i.test(sibling.nodeName)) {
+ var list = this.wrapSelectionInBlockElement("dl");
+ list = sibling.appendChild(list);
+ // May need to merge the list if it has a previous sibling
+ if (list.previousSibling && /^dl$/i.test(list.previousSibling.nodeName)) {
+ while (list.firstChild) {
+ list.previousSibling.appendChild(list.firstChild);
+ }
+ HTMLArea.removeFromParent(list);
+ }
+ } else if (/^dt$/i.test(sibling.nodeName)) {
+ var definition = this.editor._doc.createElement("dd");
+ definition.appendChild(this.wrapSelectionInBlockElement("dl"));
+ sibling.parentNode.insertBefore(definition, sibling.nextSibling);
+ }
+ this.editor.selectRange(this.editor.moveToBookmark(bookmark));
+ return true;
+ }
+ return false;
+ },
+
+ /*
+ * Outdent a definition list
+ */
+ outdentDefinitionList : function (selection, range) {
+ var endBlocks = this.editor.getEndBlocks(selection);
+ if (/^dt$/i.test(endBlocks.start.nodeName)
+ && /^dl$/i.test(endBlocks.start.parentNode.nodeName)
+ && /^dd$/i.test(endBlocks.start.parentNode.parentNode.nodeName)
+ && !endBlocks.end.nextSibling) {
+ var bookmark = this.editor.getBookmark(range);
+ var dl = endBlocks.start.parentNode;
+ var dd = dl.parentNode;
+ if (this.editor._selectionEmpty(selection)) {
+ dd.parentNode.insertBefore(endBlocks.start, dd.nextSibling);
+ } else {
+ var selected = this.wrapSelectionInBlockElement("dl");
+ while (selected.lastChild) {
+ dd.parentNode.insertBefore(selected.lastChild, dd.nextSibling);
+ }
+ selected.parentNode.removeChild(selected);
+ }
+ // We may have outdented all the child nodes of a list
+ if (!dl.hasChildNodes()) {
+ dd.removeChild(dl);
+ if (!dd.hasChildNodes()) {
+ dd.parentNode.removeChild(dd);
+ }
+ }
+ this.editor.selectRange(this.editor.moveToBookmark(bookmark));
+ return true;
+ }
+ return false;
+ },
+
+ /*
+ * This function gets called when the toolbar is updated
+ */
+ onUpdateToolbar : function () {
+ if (this.getEditorMode() === "textmode" || !this.editor.isEditable()) {
+ return false;
+ }
+ var statusBarSelection = this.editor.getPluginInstance("StatusBar") ? this.editor.getPluginInstance("StatusBar").getSelection() : null;
+ var parentElement = statusBarSelection ? statusBarSelection : this.editor.getParentElement();
+ if (parentElement.nodeName.toLowerCase() === "body") return false;
+ while (parentElement && (!HTMLArea.isBlockElement(parentElement) || /^(li)$/i.test(parentElement.nodeName))) {
+ parentElement = parentElement.parentNode;
+ }
+ var blockAncestors = this.getBlockAncestors(parentElement);
+ var selection = this.editor._getSelection();
+ var endBlocks = this.editor.getEndBlocks(selection);
+ for (var buttonId in this.buttonList) {
+ commandState = false;
+ if (this.buttonList.hasOwnProperty(buttonId) && this.isButtonInToolbar(buttonId)) {
+ switch (buttonId) {
+ case "Outdent" :
+ if (/^(dt)$/i.test(endBlocks.start.nodeName)
+ && /^(dl)$/i.test(endBlocks.start.parentNode.nodeName)
+ && /^(dd)$/i.test(endBlocks.start.parentNode.parentNode.nodeName)
+ && !endBlocks.end.nextSibling) {
+ this.editor._toolbarObjects[buttonId].state("enabled", true);
+ } else {
+ this.base();
+ }
+ break;
+ case "DefinitionList" :
+ this.editor._toolbarObjects[buttonId].state("enabled", (this.editor._selectionEmpty() && /^(p|div|address|pre|blockquote|h[1-6]|li|td|dd)$/i.test(endBlocks.start.nodeName))
+ || (endBlocks.start != endBlocks.end && /^(p|h[1-6])$/i.test(endBlocks.start.nodeName)));
+ break;
+ }
+ }
+ }
+ }
+});
+