/**
* Inserts an
* If selection is already an image link, it removes it
*
* @example
* // either ...
* wysihtml.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg");
* // ... or ...
* wysihtml.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" });
*/
wysihtml.commands.insertImage = (function() {
var NODE_NAME = "IMG";
return {
exec: function(composer, command, value) {
value = typeof(value) === "object" ? value : { src: value };
var doc = composer.doc,
image = this.state(composer),
textNode,
parent;
// If image is selected and src ie empty, set the caret before it and delete the image
if (image && !value.src) {
composer.selection.setBefore(image);
parent = image.parentNode;
parent.removeChild(image);
// and it's parent too if it hasn't got any other relevant child nodes
wysihtml.dom.removeEmptyTextNodes(parent);
if (parent.nodeName === "A" && !parent.firstChild) {
composer.selection.setAfter(parent);
parent.parentNode.removeChild(parent);
}
// firefox and ie sometimes don't remove the image handles, even though the image got removed
wysihtml.quirks.redraw(composer.element);
return;
}
// If image selected change attributes accordingly
if (image) {
for (var key in value) {
if (value.hasOwnProperty(key)) {
image.setAttribute(key === "className" ? "class" : key, value[key]);
}
}
return;
}
// Otherwise lets create the image
image = doc.createElement(NODE_NAME);
for (var i in value) {
image.setAttribute(i === "className" ? "class" : i, value[i]);
}
composer.selection.insertNode(image);
if (wysihtml.browser.hasProblemsSettingCaretAfterImg()) {
textNode = doc.createTextNode(wysihtml.INVISIBLE_SPACE);
composer.selection.insertNode(textNode);
composer.selection.setAfter(textNode);
} else {
composer.selection.setAfter(image);
}
},
state: function(composer) {
var doc = composer.doc,
selectedNode,
text,
imagesInSelection;
if (!wysihtml.dom.hasElementWithTagName(doc, NODE_NAME)) {
return false;
}
selectedNode = composer.selection.getSelectedNode();
if (!selectedNode) {
return false;
}
if (selectedNode.nodeName === NODE_NAME) {
// This works perfectly in IE
return selectedNode;
}
if (selectedNode.nodeType !== wysihtml.ELEMENT_NODE) {
return false;
}
text = composer.selection.getText();
text = wysihtml.lang.string(text).trim();
if (text) {
return false;
}
imagesInSelection = composer.selection.getNodes(wysihtml.ELEMENT_NODE, function(node) {
return node.nodeName === "IMG";
});
if (imagesInSelection.length !== 1) {
return false;
}
return imagesInSelection[0];
}
};
})();