// Simple CSS (className) plugin for the editor // Sponsored by http://www.miro.com.au // Implementation by Mihai Bazon, http://dynarch.com/mishoo. // // (c) dynarch.com 2003 // Distributed under the same terms as HTMLArea itself. // This notice MUST stay intact for use (see license.txt). // function CSS(editor, params) { this.editor = editor; var cfg = editor.config; var toolbar = cfg.toolbar; var self = this; var i18n = CSS.I18N; var plugin_config = params[0]; var combos = plugin_config.combos; var first = true; for (var i = combos.length; --i >= 0;) { var combo = combos[i]; var id = "CSS-class" + i; var css_class = { id : id, options : combo.options, action : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); }, refresh : function(editor) { self.updateValue(editor, this); }, context : combo.context }; cfg.registerDropdown(css_class); // prepend to the toolbar toolbar[1].splice(0, 0, first ? "separator" : "space"); toolbar[1].splice(0, 0, id); if (combo.label) toolbar[1].splice(0, 0, "T[" + combo.label + "]"); first = false; } }; CSS._pluginInfo = { name : "CSS", version : "1.0", developer : "Mihai Bazon", developer_url : "http://dynarch.com/mishoo/", c_owner : "Mihai Bazon", sponsor : "Miro International", sponsor_url : "http://www.miro.com.au", license : "htmlArea" }; CSS.prototype.onSelect = function(editor, obj, context, updatecontextclass) { var tbobj = editor._toolbarObjects[obj.id]; var index = tbobj.element.selectedIndex; var className = tbobj.element.value; // retrieve parent element of the selection var parent = editor.getParentElement(); var surround = true; var is_span = (parent && parent.tagName.toLowerCase() == "span"); var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context); if (update_parent) { parent.className = className; editor.updateToolbar(); return; } if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) { while (parent.firstChild) { parent.parentNode.insertBefore(parent.firstChild, parent); } parent.parentNode.removeChild(parent); editor.updateToolbar(); return; } if (is_span) { // maybe we could simply change the class of the parent node? if (parent.childNodes.length == 1) { parent.className = className; surround = false; // in this case we should handle the toolbar updation // ourselves. editor.updateToolbar(); } } // Other possibilities could be checked but require a lot of code. We // can't afford to do that now. if (surround) { // shit happens ;-) most of the time. this method works, but // it's dangerous when selection spans multiple block-level // elements. editor.surroundHTML("", ""); } }; CSS.prototype.updateValue = function(editor, obj) { var select = editor._toolbarObjects[obj.id].element; var parent = editor.getParentElement(); if (typeof parent.className != "undefined" && /\S/.test(parent.className)) { var options = select.options; var value = parent.className; for (var i = options.length; --i >= 0;) { var option = options[i]; if (value == option.value) { select.selectedIndex = i; return; } } } select.selectedIndex = 0; };