bsw/jbe@1309: wysihtml.commands.alignCenterStyle = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     styleProperty: "textAlign",
bsw/jbe@1309:     styleValue: "center",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.alignJustifyStyle = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     styleProperty: "textAlign",
bsw/jbe@1309:     styleValue: "justify",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.alignLeftStyle = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     styleProperty: "textAlign",
bsw/jbe@1309:     styleValue: "left",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.alignRightStyle = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     styleProperty: "textAlign",
bsw/jbe@1309:     styleValue: "right",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Sets text background color by inline styles */
bsw/jbe@1309: wysihtml.commands.bgColorStyle = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, color) {
bsw/jbe@1309:       var colorVals  = wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color"),
bsw/jbe@1309:           colString;
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, color) {
bsw/jbe@1309:       var colorVals  = color ? wysihtml.quirks.styleParser.parseColor("background-color:" + (color.color || color), "background-color") : null,
bsw/jbe@1309:           colString;
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(', ') : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: 'backgroundColor', styleValue: colString});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     remove: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: 'backgroundColor'});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     stateValue: function(composer, command, props) {
bsw/jbe@1309:       var st = this.state(composer, command),
bsw/jbe@1309:           colorStr,
bsw/jbe@1309:           val = false;
bsw/jbe@1309: 
bsw/jbe@1309:       if (st && wysihtml.lang.object(st).isArray()) {
bsw/jbe@1309:         st = st[0];
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (st) {
bsw/jbe@1309:         colorStr = st.getAttribute('style');
bsw/jbe@1309:         if (colorStr) {
bsw/jbe@1309:           val = wysihtml.quirks.styleParser.parseColor(colorStr, "background-color");
bsw/jbe@1309:           return wysihtml.quirks.styleParser.unparseColor(val, props);
bsw/jbe@1309:         }
bsw/jbe@1309:       }
bsw/jbe@1309:       return false;
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.bold = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "B",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Formats block for as a 
 block
bsw/jbe@1309:  * Useful in conjuction for sytax highlight utility: highlight.js
bsw/jbe@1309:  *
bsw/jbe@1309:  * Usage:
bsw/jbe@1309:  *
bsw/jbe@1309:  * editorInstance.composer.commands.exec("formatCode", "language-html");
bsw/jbe@1309: */
bsw/jbe@1309: wysihtml.commands.formatCode = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, classname) {
bsw/jbe@1309:       var pre = this.state(composer)[0],
bsw/jbe@1309:           code, range, selectedNodes;
bsw/jbe@1309: 
bsw/jbe@1309:       if (pre) {
bsw/jbe@1309:         // caret is already within a ...
bsw/jbe@1309:         composer.selection.executeAndRestore(function() {
bsw/jbe@1309:           code = pre.querySelector("code");
bsw/jbe@1309:           wysihtml.dom.replaceWithChildNodes(pre);
bsw/jbe@1309:           if (code) {
bsw/jbe@1309:             wysihtml.dom.replaceWithChildNodes(code);
bsw/jbe@1309:           }
bsw/jbe@1309:         });
bsw/jbe@1309:       } else {
bsw/jbe@1309:         // Wrap in ...
bsw/jbe@1309:         range = composer.selection.getRange();
bsw/jbe@1309:         selectedNodes = range.extractContents();
bsw/jbe@1309:         pre = composer.doc.createElement("pre");
bsw/jbe@1309:         code = composer.doc.createElement("code");
bsw/jbe@1309: 
bsw/jbe@1309:         if (classname) {
bsw/jbe@1309:           code.className = classname;
bsw/jbe@1309:         }
bsw/jbe@1309: 
bsw/jbe@1309:         pre.appendChild(code);
bsw/jbe@1309:         code.appendChild(selectedNodes);
bsw/jbe@1309:         range.insertNode(pre);
bsw/jbe@1309:         composer.selection.selectNode(pre);
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer) {
bsw/jbe@1309:       var selectedNode = composer.selection.getSelectedNode(), node;
bsw/jbe@1309:       if (selectedNode && selectedNode.nodeName && selectedNode.nodeName == "PRE"&&
bsw/jbe@1309:           selectedNode.firstChild && selectedNode.firstChild.nodeName && selectedNode.firstChild.nodeName == "CODE") {
bsw/jbe@1309:         return [selectedNode];
bsw/jbe@1309:       } else {
bsw/jbe@1309:         node = wysihtml.dom.getParentElement(selectedNode, { query: "pre code" });
bsw/jbe@1309:         return node ? [node.parentNode] : false;
bsw/jbe@1309:       }
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /**
bsw/jbe@1309:  * Inserts an ![]() bsw/jbe@1309:  * If selection is already an image link, it removes it
bsw/jbe@1309:  *
bsw/jbe@1309:  * @example
bsw/jbe@1309:  *    // either ...
bsw/jbe@1309:  *    wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
bsw/jbe@1309:  *    // ... or ...
bsw/jbe@1309:  *    wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" });
bsw/jbe@1309:  */
bsw/jbe@1309: wysihtml.commands.insertImage = (function() {
bsw/jbe@1309:   var NODE_NAME = "IMG";
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, value) {
bsw/jbe@1309:       value = typeof(value) === "object" ? value : { src: value };
bsw/jbe@1309: 
bsw/jbe@1309:       var doc     = composer.doc,
bsw/jbe@1309:           image   = this.state(composer),
bsw/jbe@1309:           textNode,
bsw/jbe@1309:           parent;
bsw/jbe@1309: 
bsw/jbe@1309:       // If image is selected and src ie empty, set the caret before it and delete the image
bsw/jbe@1309:       if (image && !value.src) {
bsw/jbe@1309:         composer.selection.setBefore(image);
bsw/jbe@1309:         parent = image.parentNode;
bsw/jbe@1309:         parent.removeChild(image);
bsw/jbe@1309: 
bsw/jbe@1309:         // and it's parent  too if it hasn't got any other relevant child nodes
bsw/jbe@1309:         wysihtml.dom.removeEmptyTextNodes(parent);
bsw/jbe@1309:         if (parent.nodeName === "A" && !parent.firstChild) {
bsw/jbe@1309:           composer.selection.setAfter(parent);
bsw/jbe@1309:           parent.parentNode.removeChild(parent);
bsw/jbe@1309:         }
bsw/jbe@1309: 
bsw/jbe@1309:         // firefox and ie sometimes don't remove the image handles, even though the image got removed
bsw/jbe@1309:         wysihtml.quirks.redraw(composer.element);
bsw/jbe@1309:         return;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       // If image selected change attributes accordingly
bsw/jbe@1309:       if (image) {
bsw/jbe@1309:         for (var key in value) {
bsw/jbe@1309:           if (value.hasOwnProperty(key)) {
bsw/jbe@1309:             image.setAttribute(key === "className" ? "class" : key, value[key]);
bsw/jbe@1309:           }
bsw/jbe@1309:         }
bsw/jbe@1309:         return;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       // Otherwise lets create the image
bsw/jbe@1309:       image = doc.createElement(NODE_NAME);
bsw/jbe@1309: 
bsw/jbe@1309:       for (var i in value) {
bsw/jbe@1309:         image.setAttribute(i === "className" ? "class" : i, value[i]);
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       composer.selection.insertNode(image);
bsw/jbe@1309:       if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) {
bsw/jbe@1309:         textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE);
bsw/jbe@1309:         composer.selection.insertNode(textNode);
bsw/jbe@1309:         composer.selection.setAfter(textNode);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.setAfter(image);
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer) {
bsw/jbe@1309:       var doc = composer.doc,
bsw/jbe@1309:           selectedNode,
bsw/jbe@1309:           text,
bsw/jbe@1309:           imagesInSelection;
bsw/jbe@1309: 
bsw/jbe@1309:       if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       selectedNode = composer.selection.getSelectedNode();
bsw/jbe@1309:       if (!selectedNode) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (selectedNode.nodeName === NODE_NAME) {
bsw/jbe@1309:         // This works perfectly in IE
bsw/jbe@1309:         return selectedNode;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       text = composer.selection.getText();
bsw/jbe@1309:       text = wysihtml.lang.string(text).trim();
bsw/jbe@1309:       if (text) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) {
bsw/jbe@1309:         return node.nodeName === "IMG";
bsw/jbe@1309:       });
bsw/jbe@1309: 
bsw/jbe@1309:       if (imagesInSelection.length !== 1) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       return imagesInSelection[0];
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.fontSize = (function() {
bsw/jbe@1309:   var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, size) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-font-size-" + size, classRegExp: REG_EXP, toggle: true});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, size) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-font-size-" + size});
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Set font size by inline style */
bsw/jbe@1309: wysihtml.commands.fontSizeStyle = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, size) {
bsw/jbe@1309:       size = size.size || size;
bsw/jbe@1309:       if (!(/^\s*$/).test(size)) {
bsw/jbe@1309:         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "fontSize", styleValue: size, toggle: false});
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, size) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "fontSize", styleValue: size || undefined});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     remove: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "fontSize"});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     stateValue: function(composer, command) {
bsw/jbe@1309:       var styleStr,
bsw/jbe@1309:           st = this.state(composer, command);
bsw/jbe@1309: 
bsw/jbe@1309:       if (st && wysihtml.lang.object(st).isArray()) {
bsw/jbe@1309:           st = st[0];
bsw/jbe@1309:       }
bsw/jbe@1309:       if (st) {
bsw/jbe@1309:         styleStr = st.getAttribute("style");
bsw/jbe@1309:         if (styleStr) {
bsw/jbe@1309:           return wysihtml.quirks.styleParser.parseFontSize(styleStr);
bsw/jbe@1309:         }
bsw/jbe@1309:       }
bsw/jbe@1309:       return false;
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.foreColor = (function() {
bsw/jbe@1309:   var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, color) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-color-" + color, classRegExp: REG_EXP, toggle: true});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, color) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-color-" + color});
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Sets text color by inline styles */
bsw/jbe@1309: wysihtml.commands.foreColorStyle = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, color) {
bsw/jbe@1309:       var colorVals, colString;
bsw/jbe@1309: 
bsw/jbe@1309:       if (!color) { return; }
bsw/jbe@1309: 
bsw/jbe@1309:       colorVals = wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color");
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "color", styleValue: colString});
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, color) {
bsw/jbe@1309:       var colorVals  = color ? wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color") : null,
bsw/jbe@1309:           colString;
bsw/jbe@1309: 
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "color", styleValue: colString});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     remove: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "color"});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     stateValue: function(composer, command, props) {
bsw/jbe@1309:       var st = this.state(composer, command),
bsw/jbe@1309:           colorStr,
bsw/jbe@1309:           val = false;
bsw/jbe@1309: 
bsw/jbe@1309:       if (st && wysihtml.lang.object(st).isArray()) {
bsw/jbe@1309:         st = st[0];
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (st) {
bsw/jbe@1309:         colorStr = st.getAttribute("style");
bsw/jbe@1309:         if (colorStr) {
bsw/jbe@1309:           val = wysihtml.quirks.styleParser.parseColor(colorStr, "color");
bsw/jbe@1309:           return wysihtml.quirks.styleParser.unparseColor(val, props);
bsw/jbe@1309:         }
bsw/jbe@1309:       }
bsw/jbe@1309:       return false;
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertBlockQuote = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "BLOCKQUOTE",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertHorizontalRule = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer) {
bsw/jbe@1309:       var node = composer.selection.getSelectedNode(),
bsw/jbe@1309:           phrasingOnlyParent = wysihtml.dom.getParentElement(node, { query: wysihtml.PERMITTED_PHRASING_CONTENT_ONLY }, null, composer.editableArea),
bsw/jbe@1309:           elem = document.createElement('hr'),
bsw/jbe@1309:           range, idx;
bsw/jbe@1309: 
bsw/jbe@1309:       // HR is not allowed into some elements (where only phrasing content is allowed)
bsw/jbe@1309:       // thus the HR insertion must break out of those https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories
bsw/jbe@1309:       if (phrasingOnlyParent) {
bsw/jbe@1309:         composer.selection.splitElementAtCaret(phrasingOnlyParent, elem);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.insertNode(elem);
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (elem.nextSibling) {
bsw/jbe@1309:         composer.selection.setBefore(elem.nextSibling);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.setAfter(elem);
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309:     state: function() {
bsw/jbe@1309:       return false; // :(
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertOrderedList = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.insertList.exec(composer, command, "OL");
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.insertList.state(composer, command, "OL");
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertUnorderedList = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.insertList.exec(composer, command, "UL");
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.insertList.state(composer, command, "UL");
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.italic = (function() { 
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "I",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyCenter = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-center",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyFull = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-justify",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyLeft = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-left",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyRight = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-right",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.subscript = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "SUB",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.superscript = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "SUP",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.underline = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "U",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309:  * If selection is already an image link, it removes it
bsw/jbe@1309:  *
bsw/jbe@1309:  * @example
bsw/jbe@1309:  *    // either ...
bsw/jbe@1309:  *    wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
bsw/jbe@1309:  *    // ... or ...
bsw/jbe@1309:  *    wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" });
bsw/jbe@1309:  */
bsw/jbe@1309: wysihtml.commands.insertImage = (function() {
bsw/jbe@1309:   var NODE_NAME = "IMG";
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, value) {
bsw/jbe@1309:       value = typeof(value) === "object" ? value : { src: value };
bsw/jbe@1309: 
bsw/jbe@1309:       var doc     = composer.doc,
bsw/jbe@1309:           image   = this.state(composer),
bsw/jbe@1309:           textNode,
bsw/jbe@1309:           parent;
bsw/jbe@1309: 
bsw/jbe@1309:       // If image is selected and src ie empty, set the caret before it and delete the image
bsw/jbe@1309:       if (image && !value.src) {
bsw/jbe@1309:         composer.selection.setBefore(image);
bsw/jbe@1309:         parent = image.parentNode;
bsw/jbe@1309:         parent.removeChild(image);
bsw/jbe@1309: 
bsw/jbe@1309:         // and it's parent  too if it hasn't got any other relevant child nodes
bsw/jbe@1309:         wysihtml.dom.removeEmptyTextNodes(parent);
bsw/jbe@1309:         if (parent.nodeName === "A" && !parent.firstChild) {
bsw/jbe@1309:           composer.selection.setAfter(parent);
bsw/jbe@1309:           parent.parentNode.removeChild(parent);
bsw/jbe@1309:         }
bsw/jbe@1309: 
bsw/jbe@1309:         // firefox and ie sometimes don't remove the image handles, even though the image got removed
bsw/jbe@1309:         wysihtml.quirks.redraw(composer.element);
bsw/jbe@1309:         return;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       // If image selected change attributes accordingly
bsw/jbe@1309:       if (image) {
bsw/jbe@1309:         for (var key in value) {
bsw/jbe@1309:           if (value.hasOwnProperty(key)) {
bsw/jbe@1309:             image.setAttribute(key === "className" ? "class" : key, value[key]);
bsw/jbe@1309:           }
bsw/jbe@1309:         }
bsw/jbe@1309:         return;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       // Otherwise lets create the image
bsw/jbe@1309:       image = doc.createElement(NODE_NAME);
bsw/jbe@1309: 
bsw/jbe@1309:       for (var i in value) {
bsw/jbe@1309:         image.setAttribute(i === "className" ? "class" : i, value[i]);
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       composer.selection.insertNode(image);
bsw/jbe@1309:       if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) {
bsw/jbe@1309:         textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE);
bsw/jbe@1309:         composer.selection.insertNode(textNode);
bsw/jbe@1309:         composer.selection.setAfter(textNode);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.setAfter(image);
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer) {
bsw/jbe@1309:       var doc = composer.doc,
bsw/jbe@1309:           selectedNode,
bsw/jbe@1309:           text,
bsw/jbe@1309:           imagesInSelection;
bsw/jbe@1309: 
bsw/jbe@1309:       if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       selectedNode = composer.selection.getSelectedNode();
bsw/jbe@1309:       if (!selectedNode) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (selectedNode.nodeName === NODE_NAME) {
bsw/jbe@1309:         // This works perfectly in IE
bsw/jbe@1309:         return selectedNode;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       text = composer.selection.getText();
bsw/jbe@1309:       text = wysihtml.lang.string(text).trim();
bsw/jbe@1309:       if (text) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) {
bsw/jbe@1309:         return node.nodeName === "IMG";
bsw/jbe@1309:       });
bsw/jbe@1309: 
bsw/jbe@1309:       if (imagesInSelection.length !== 1) {
bsw/jbe@1309:         return false;
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       return imagesInSelection[0];
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.fontSize = (function() {
bsw/jbe@1309:   var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g;
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, size) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-font-size-" + size, classRegExp: REG_EXP, toggle: true});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, size) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-font-size-" + size});
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Set font size by inline style */
bsw/jbe@1309: wysihtml.commands.fontSizeStyle = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, size) {
bsw/jbe@1309:       size = size.size || size;
bsw/jbe@1309:       if (!(/^\s*$/).test(size)) {
bsw/jbe@1309:         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "fontSize", styleValue: size, toggle: false});
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, size) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "fontSize", styleValue: size || undefined});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     remove: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "fontSize"});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     stateValue: function(composer, command) {
bsw/jbe@1309:       var styleStr,
bsw/jbe@1309:           st = this.state(composer, command);
bsw/jbe@1309: 
bsw/jbe@1309:       if (st && wysihtml.lang.object(st).isArray()) {
bsw/jbe@1309:           st = st[0];
bsw/jbe@1309:       }
bsw/jbe@1309:       if (st) {
bsw/jbe@1309:         styleStr = st.getAttribute("style");
bsw/jbe@1309:         if (styleStr) {
bsw/jbe@1309:           return wysihtml.quirks.styleParser.parseFontSize(styleStr);
bsw/jbe@1309:         }
bsw/jbe@1309:       }
bsw/jbe@1309:       return false;
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.foreColor = (function() {
bsw/jbe@1309:   var REG_EXP = /wysiwyg-color-[0-9a-z]+/g;
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, color) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, {className: "wysiwyg-color-" + color, classRegExp: REG_EXP, toggle: true});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, color) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {className: "wysiwyg-color-" + color});
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: /* Sets text color by inline styles */
bsw/jbe@1309: wysihtml.commands.foreColorStyle = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command, color) {
bsw/jbe@1309:       var colorVals, colString;
bsw/jbe@1309: 
bsw/jbe@1309:       if (!color) { return; }
bsw/jbe@1309: 
bsw/jbe@1309:       colorVals = wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color");
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:         wysihtml.commands.formatInline.exec(composer, command, {styleProperty: "color", styleValue: colString});
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command, color) {
bsw/jbe@1309:       var colorVals  = color ? wysihtml.quirks.styleParser.parseColor("color:" + (color.color || color), "color") : null,
bsw/jbe@1309:           colString;
bsw/jbe@1309: 
bsw/jbe@1309: 
bsw/jbe@1309:       if (colorVals) {
bsw/jbe@1309:         colString = (colorVals[3] === 1 ? "rgb(" + [colorVals[0], colorVals[1], colorVals[2]].join(", ") : "rgba(" + colorVals.join(', ')) + ')';
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, {styleProperty: "color", styleValue: colString});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     remove: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.remove(composer, command, {styleProperty: "color"});
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     stateValue: function(composer, command, props) {
bsw/jbe@1309:       var st = this.state(composer, command),
bsw/jbe@1309:           colorStr,
bsw/jbe@1309:           val = false;
bsw/jbe@1309: 
bsw/jbe@1309:       if (st && wysihtml.lang.object(st).isArray()) {
bsw/jbe@1309:         st = st[0];
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (st) {
bsw/jbe@1309:         colorStr = st.getAttribute("style");
bsw/jbe@1309:         if (colorStr) {
bsw/jbe@1309:           val = wysihtml.quirks.styleParser.parseColor(colorStr, "color");
bsw/jbe@1309:           return wysihtml.quirks.styleParser.unparseColor(val, props);
bsw/jbe@1309:         }
bsw/jbe@1309:       }
bsw/jbe@1309:       return false;
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertBlockQuote = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "BLOCKQUOTE",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertHorizontalRule = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer) {
bsw/jbe@1309:       var node = composer.selection.getSelectedNode(),
bsw/jbe@1309:           phrasingOnlyParent = wysihtml.dom.getParentElement(node, { query: wysihtml.PERMITTED_PHRASING_CONTENT_ONLY }, null, composer.editableArea),
bsw/jbe@1309:           elem = document.createElement('hr'),
bsw/jbe@1309:           range, idx;
bsw/jbe@1309: 
bsw/jbe@1309:       // HR is not allowed into some elements (where only phrasing content is allowed)
bsw/jbe@1309:       // thus the HR insertion must break out of those https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories
bsw/jbe@1309:       if (phrasingOnlyParent) {
bsw/jbe@1309:         composer.selection.splitElementAtCaret(phrasingOnlyParent, elem);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.insertNode(elem);
bsw/jbe@1309:       }
bsw/jbe@1309: 
bsw/jbe@1309:       if (elem.nextSibling) {
bsw/jbe@1309:         composer.selection.setBefore(elem.nextSibling);
bsw/jbe@1309:       } else {
bsw/jbe@1309:         composer.selection.setAfter(elem);
bsw/jbe@1309:       }
bsw/jbe@1309:     },
bsw/jbe@1309:     state: function() {
bsw/jbe@1309:       return false; // :(
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertOrderedList = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.insertList.exec(composer, command, "OL");
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.insertList.state(composer, command, "OL");
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.insertUnorderedList = (function() {
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.insertList.exec(composer, command, "UL");
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.insertList.state(composer, command, "UL");
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.italic = (function() { 
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "I",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyCenter = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-center",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309:   
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyFull = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-justify",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyLeft = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-left",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.justifyRight = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     className: "wysiwyg-text-align-right",
bsw/jbe@1309:     classRegExp: /wysiwyg-text-align-[0-9a-z]+/g,
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.exec(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatBlock.state(composer, "formatBlock", nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.subscript = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "SUB",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.superscript = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "SUP",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();
bsw/jbe@1309: 
bsw/jbe@1309: wysihtml.commands.underline = (function() {
bsw/jbe@1309:   var nodeOptions = {
bsw/jbe@1309:     nodeName: "U",
bsw/jbe@1309:     toggle: true
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309:   return {
bsw/jbe@1309:     exec: function(composer, command) {
bsw/jbe@1309:       wysihtml.commands.formatInline.exec(composer, command, nodeOptions);
bsw/jbe@1309:     },
bsw/jbe@1309: 
bsw/jbe@1309:     state: function(composer, command) {
bsw/jbe@1309:       return wysihtml.commands.formatInline.state(composer, command, nodeOptions);
bsw/jbe@1309:     }
bsw/jbe@1309:   };
bsw/jbe@1309: 
bsw/jbe@1309: })();