2 * $Id: editor_plugin_src.js 205 2007-02-12 18:58:29Z spocke $
\r
5 * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
\r
8 var TinyMCE_NonEditablePlugin = {
\r
9 getInfo : function() {
\r
11 longname : 'Non editable elements',
\r
12 author : 'Moxiecode Systems AB',
\r
13 authorurl : 'http://tinymce.moxiecode.com',
\r
14 infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',
\r
15 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
\r
19 initInstance : function(inst) {
\r
20 tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");
\r
23 if (tinyMCE.isMSIE5_0)
\r
24 tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');
\r
27 handleEvent : function(e) {
\r
28 return this._moveSelection(e, tinyMCE.selectedInstance);
\r
31 cleanup : function(type, content, inst) {
\r
33 case "insert_to_editor_dom":
\r
34 var nodes, i, editClass, nonEditClass, editable, elm;
\r
36 // Pass through Gecko
\r
37 if (tinyMCE.isGecko)
\r
40 nodes = tinyMCE.getNodeTree(content, [], 1);
\r
42 editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");
\r
43 nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");
\r
45 for (i=0; i<nodes.length; i++) {
\r
48 // Convert contenteditable to classes
\r
49 editable = tinyMCE.getAttrib(elm, "contenteditable");
\r
50 if (new RegExp("true|false","gi").test(editable))
\r
51 TinyMCE_NonEditablePlugin._setEditable(elm, editable == "true");
\r
54 if (tinyMCE.hasCSSClass(elm, editClass))
\r
55 elm.contentEditable = true;
\r
57 if (tinyMCE.hasCSSClass(elm, nonEditClass))
\r
58 elm.contentEditable = false;
\r
64 case "insert_to_editor":
\r
65 var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");
\r
66 var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");
\r
68 // Replace mceItem to new school
\r
69 content = content.replace(/mceItemEditable/g, editClass);
\r
70 content = content.replace(/mceItemNonEditable/g, nonEditClass);
\r
72 if (tinyMCE.isIE && (content.indexOf(editClass) != -1 || content.indexOf(nonEditClass) != -1)) {
\r
73 content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")\"", "gi"), 'class="$1$2" contenteditable="true"');
\r
74 content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")\"", "gi"), 'class="$1$2" contenteditable="false"');
\r
75 content = content.replace(new RegExp("class=\"(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="true"');
\r
76 content = content.replace(new RegExp("class=\"(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="false"');
\r
77 content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="true"');
\r
78 content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="false"');
\r
83 case "get_from_editor_dom":
\r
84 // Pass through Gecko
\r
85 if (tinyMCE.isGecko)
\r
88 if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {
\r
89 var nodes = tinyMCE.getNodeTree(content, new Array(), 1);
\r
91 for (var i=0; i<nodes.length; i++)
\r
92 nodes[i].removeAttribute("contenteditable");
\r
101 _moveSelection : function(e, inst) {
\r
102 var s, r, sc, ec, el, c = tinyMCE.getParam('noneditable_editable_class', 'mceNonEditable');
\r
107 // Always select whole element
\r
108 if (tinyMCE.isGecko) {
\r
109 s = inst.selection.getSel();
\r
110 r = s.getRangeAt(0);
\r
111 sc = tinyMCE.getParentNode(r.startContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});
\r
112 ec = tinyMCE.getParentNode(r.endContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});
\r
114 sc && r.setStartBefore(sc);
\r
115 ec && r.setEndAfter(ec);
\r
118 if (e.type == 'keypress' && e.keyCode == 39) {
\r
124 s.removeAllRanges();
\r
127 return tinyMCE.cancelEvent(e);
\r
134 _setEditable : function(elm, state) {
\r
135 var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");
\r
136 var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");
\r
138 var className = elm.className ? elm.className : "";
\r
140 if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)
\r
143 if ((className = tinyMCE.getAttrib(elm, "class")) != "")
\r
146 className += state ? editClass : nonEditClass;
\r
148 elm.setAttribute("class", className);
\r
149 elm.className = className;
\r
153 tinyMCE.addPlugin("noneditable", TinyMCE_NonEditablePlugin);
\r