Subversion-Projekte lars-tiefland.content-management

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
// Simple CSS (className) plugin for the editor
2
// Sponsored by http://www.miro.com.au
3
// Implementation by Mihai Bazon, http://dynarch.com/mishoo.
4
//
5
// (c) dynarch.com 2003
6
// Distributed under the same terms as HTMLArea itself.
7
// This notice MUST stay intact for use (see license.txt).
8
//
9
// $Id: css.js 42 2007-04-18 10:07:34Z tiefland $
10
 
11
function CSS(editor, params) {
12
	this.editor = editor;
13
	var cfg = editor.config;
14
	var toolbar = cfg.toolbar;
15
	var self = this;
16
	var i18n = CSS.I18N;
17
	var plugin_config = params[0];
18
	var combos = plugin_config.combos;
19
 
20
	var first = true;
21
	for (var i = combos.length; --i >= 0;) {
22
		var combo = combos[i];
23
		var id = "CSS-class" + i;
24
		var css_class = {
25
			id         : id,
26
			options    : combo.options,
27
			action     : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); },
28
			refresh    : function(editor) { self.updateValue(editor, this); },
29
			context    : combo.context
30
		};
31
		cfg.registerDropdown(css_class);
32
 
33
		// prepend to the toolbar
34
		toolbar[1].splice(0, 0, first ? "separator" : "space");
35
		toolbar[1].splice(0, 0, id);
36
		if (combo.label)
37
			toolbar[1].splice(0, 0, "T[" + combo.label + "]");
38
		first = false;
39
	}
40
};
41
 
42
CSS._pluginInfo = {
43
	name          : "CSS",
44
	version       : "1.0",
45
	developer     : "Mihai Bazon",
46
	developer_url : "http://dynarch.com/mishoo/",
47
	c_owner       : "Mihai Bazon",
48
	sponsor       : "Miro International",
49
	sponsor_url   : "http://www.miro.com.au",
50
	license       : "htmlArea"
51
};
52
 
53
CSS.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
54
	var tbobj = editor._toolbarObjects[obj.id];
55
	var index = tbobj.element.selectedIndex;
56
	var className = tbobj.element.value;
57
 
58
	// retrieve parent element of the selection
59
	var parent = editor.getParentElement();
60
	var surround = true;
61
 
62
	var is_span = (parent && parent.tagName.toLowerCase() == "span");
63
	var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
64
 
65
	if (update_parent) {
66
		parent.className = className;
67
		editor.updateToolbar();
68
		return;
69
	}
70
 
71
	if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
72
		while (parent.firstChild) {
73
			parent.parentNode.insertBefore(parent.firstChild, parent);
74
		}
75
		parent.parentNode.removeChild(parent);
76
		editor.updateToolbar();
77
		return;
78
	}
79
 
80
	if (is_span) {
81
		// maybe we could simply change the class of the parent node?
82
		if (parent.childNodes.length == 1) {
83
			parent.className = className;
84
			surround = false;
85
			// in this case we should handle the toolbar updation
86
			// ourselves.
87
			editor.updateToolbar();
88
		}
89
	}
90
 
91
	// Other possibilities could be checked but require a lot of code.  We
92
	// can't afford to do that now.
93
	if (surround) {
94
		// shit happens ;-) most of the time.  this method works, but
95
		// it's dangerous when selection spans multiple block-level
96
		// elements.
97
		editor.surroundHTML("<span class='" + className + "'>", "</span>");
98
	}
99
};
100
 
101
CSS.prototype.updateValue = function(editor, obj) {
102
	var select = editor._toolbarObjects[obj.id].element;
103
	var parent = editor.getParentElement();
104
	if (typeof parent.className != "undefined" && /\S/.test(parent.className)) {
105
		var options = select.options;
106
		var value = parent.className;
107
		for (var i = options.length; --i >= 0;) {
108
			var option = options[i];
109
			if (value == option.value) {
110
				select.selectedIndex = i;
111
				return;
112
			}
113
		}
114
	}
115
	select.selectedIndex = 0;
116
};