* Removed the Kevin Roth rich text editor and replaced it with TinyMCE.
[citadel.git] / webcit / tiny_mce / plugins / noneditable / editor_plugin_src.js
1 function TinyMCE_noneditable_getInfo() {
2         return {
3                 longname : 'Non editable elements',
4                 author : 'Moxiecode Systems',
5                 authorurl : 'http://tinymce.moxiecode.com',
6                 infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',
7                 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
8         };
9 };
10
11 function TinyMCE_noneditable_initInstance(inst) {
12         tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");
13
14         // Ugly hack
15         if (tinyMCE.isMSIE5_0)
16                 tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');
17
18         if (tinyMCE.isGecko) {
19                 tinyMCE.addEvent(inst.getDoc(), "keyup", TinyMCE_noneditable_fixKeyUp);
20 //              tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_noneditable_selectAll);
21 //              tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_noneditable_selectAll);
22         }
23 }
24
25 function TinyMCE_noneditable_fixKeyUp(e) {
26         var inst = tinyMCE.selectedInstance;
27         var sel = inst.getSel();
28         var rng = inst.getRng();
29         var an = sel.anchorNode;
30
31         // Move cursor outside non editable fields
32         if ((e.keyCode == 38 || e.keyCode == 37 || e.keyCode == 40 || e.keyCode == 39) && (elm = TinyMCE_noneditable_isNonEditable(an)) != null) {
33                 rng = inst.getDoc().createRange();
34                 rng.selectNode(elm);
35                 rng.collapse(true);
36                 sel.removeAllRanges();
37                 sel.addRange(rng);
38                 tinyMCE.cancelEvent(e);
39         }
40 }
41
42 function TinyMCE_noneditable_selectAll(e) {
43         var inst = tinyMCE.selectedInstance;
44         var sel = inst.getSel();
45         var doc = inst.getDoc();
46
47         if ((elm = TinyMCE_noneditable_isNonEditable(sel.focusNode)) != null) {
48                 inst.selectNode(elm, false);
49                 tinyMCE.cancelEvent(e);
50                 return;
51         }
52
53         if ((elm = TinyMCE_noneditable_isNonEditable(sel.anchorNode)) != null) {
54                 inst.selectNode(elm, false);
55                 tinyMCE.cancelEvent(e);
56                 return;
57         }
58 }
59
60 function TinyMCE_noneditable_isNonEditable(elm) {
61         var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
62         var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
63
64         if (!elm)
65                 return;
66
67         do {
68                 var className = elm.className ? elm.className : "";
69
70                 if (className.indexOf(editClass) != -1)
71                         return null;
72
73                 if (className.indexOf(nonEditClass) != -1)
74                         return elm;
75         } while (elm = elm.parentNode);
76
77         return null;
78 }
79
80 function TinyMCE_noneditable_cleanup(type, content, inst) {
81         switch (type) {
82                 case "insert_to_editor_dom":
83                         var nodes = tinyMCE.getNodeTree(content, new Array(), 1);
84                         var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
85                         var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
86
87                         for (var i=0; i<nodes.length; i++) {
88                                 var elm = nodes[i];
89
90                                 // Convert contenteditable to classes
91                                 var editable = tinyMCE.getAttrib(elm, "contenteditable");
92                                 if (new RegExp("true|false","gi").test(editable))
93                                         TinyMCE_noneditable_setEditable(elm, editable == "true");
94
95                                 if (tinyMCE.isMSIE) {
96                                         var className = elm.className ? elm.className : "";
97
98                                         if (className.indexOf(editClass) != -1)
99                                                 elm.contentEditable = true;
100
101                                         if (className.indexOf(nonEditClass) != -1)
102                                                 elm.contentEditable = false;
103                                 }
104                         }
105
106                         break;
107
108                 case "insert_to_editor":
109                         if (tinyMCE.isMSIE) {
110                                 var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
111                                 var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
112
113                                 content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + editClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>');
114                                 content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>');
115                         }
116
117                         break;
118
119                 case "get_from_editor_dom":
120                         if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {
121                                 var nodes = tinyMCE.getNodeTree(content, new Array(), 1);
122
123                                 for (var i=0; i<nodes.length; i++)
124                                         nodes[i].removeAttribute("contenteditable");
125                         }
126
127                         break;
128         }
129
130         return content;
131 }
132
133 function TinyMCE_noneditable_setEditable(elm, state) {
134         var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
135         var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
136
137         var className = elm.className ? elm.className : "";
138
139         if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)
140                 return;
141
142         if ((className = tinyMCE.getAttrib(elm, "class")) != "")
143                 className += " ";
144
145         className += state ? editClass : nonEditClass;
146
147         elm.setAttribute("class", className);
148         elm.className = className;
149 }