-function TinyMCE_noneditable_getInfo() {
- return {
- longname : 'Non editable elements',
- author : 'Moxiecode Systems',
- authorurl : 'http://tinymce.moxiecode.com',
- infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',
- version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
- };
-};
-
-function TinyMCE_noneditable_initInstance(inst) {
- tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");
-
- // Ugly hack
- if (tinyMCE.isMSIE5_0)
- tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');
-
- if (tinyMCE.isGecko) {
- tinyMCE.addEvent(inst.getDoc(), "keyup", TinyMCE_noneditable_fixKeyUp);
-// tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_noneditable_selectAll);
-// tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_noneditable_selectAll);
- }
-}
-
-function TinyMCE_noneditable_fixKeyUp(e) {
- var inst = tinyMCE.selectedInstance;
- var sel = inst.getSel();
- var rng = inst.getRng();
- var an = sel.anchorNode;
-
- // Move cursor outside non editable fields
- if ((e.keyCode == 38 || e.keyCode == 37 || e.keyCode == 40 || e.keyCode == 39) && (elm = TinyMCE_noneditable_isNonEditable(an)) != null) {
- rng = inst.getDoc().createRange();
- rng.selectNode(elm);
- rng.collapse(true);
- sel.removeAllRanges();
- sel.addRange(rng);
- tinyMCE.cancelEvent(e);
- }
-}
-
-function TinyMCE_noneditable_selectAll(e) {
- var inst = tinyMCE.selectedInstance;
- var sel = inst.getSel();
- var doc = inst.getDoc();
-
- if ((elm = TinyMCE_noneditable_isNonEditable(sel.focusNode)) != null) {
- inst.selectNode(elm, false);
- tinyMCE.cancelEvent(e);
- return;
- }
-
- if ((elm = TinyMCE_noneditable_isNonEditable(sel.anchorNode)) != null) {
- inst.selectNode(elm, false);
- tinyMCE.cancelEvent(e);
- return;
- }
-}
-
-function TinyMCE_noneditable_isNonEditable(elm) {
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
-
- if (!elm)
- return;
-
- do {
- var className = elm.className ? elm.className : "";
-
- if (className.indexOf(editClass) != -1)
- return null;
-
- if (className.indexOf(nonEditClass) != -1)
- return elm;
- } while (elm = elm.parentNode);
-
- return null;
-}
-
-function TinyMCE_noneditable_cleanup(type, content, inst) {
- switch (type) {
- case "insert_to_editor_dom":
- var nodes = tinyMCE.getNodeTree(content, new Array(), 1);
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
-
- for (var i=0; i<nodes.length; i++) {
- var elm = nodes[i];
-
- // Convert contenteditable to classes
- var editable = tinyMCE.getAttrib(elm, "contenteditable");
- if (new RegExp("true|false","gi").test(editable))
- TinyMCE_noneditable_setEditable(elm, editable == "true");
-
- if (tinyMCE.isMSIE) {
- var className = elm.className ? elm.className : "";
-
- if (className.indexOf(editClass) != -1)
- elm.contentEditable = true;
-
- if (className.indexOf(nonEditClass) != -1)
- elm.contentEditable = false;
- }
- }
-
- break;
-
- case "insert_to_editor":
- if (tinyMCE.isMSIE) {
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
-
- content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + editClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>');
- content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>');
- }
-
- break;
-
- case "get_from_editor_dom":
- if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {
- var nodes = tinyMCE.getNodeTree(content, new Array(), 1);
-
- for (var i=0; i<nodes.length; i++)
- nodes[i].removeAttribute("contenteditable");
- }
-
- break;
- }
-
- return content;
-}
-
-function TinyMCE_noneditable_setEditable(elm, state) {
- var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");
- var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");
-
- var className = elm.className ? elm.className : "";
-
- if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)
- return;
-
- if ((className = tinyMCE.getAttrib(elm, "class")) != "")
- className += " ";
-
- className += state ? editClass : nonEditClass;
-
- elm.setAttribute("class", className);
- elm.className = className;
-}
+/**\r
+ * editor_plugin_src.js\r
+ *\r
+ * Copyright 2009, Moxiecode Systems AB\r
+ * Released under LGPL License.\r
+ *\r
+ * License: http://tinymce.moxiecode.com/license\r
+ * Contributing: http://tinymce.moxiecode.com/contributing\r
+ */\r
+\r
+(function() {\r
+ var Event = tinymce.dom.Event;\r
+\r
+ tinymce.create('tinymce.plugins.NonEditablePlugin', {\r
+ init : function(ed, url) {\r
+ var t = this, editClass, nonEditClass, state;\r
+\r
+ t.editor = ed;\r
+ editClass = ed.getParam("noneditable_editable_class", "mceEditable");\r
+ nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+ ed.onNodeChange.addToTop(function(ed, cm, n) {\r
+ var sc, ec;\r
+\r
+ // Block if start or end is inside a non editable element\r
+ sc = ed.dom.getParent(ed.selection.getStart(), function(n) {\r
+ return ed.dom.hasClass(n, nonEditClass);\r
+ });\r
+\r
+ ec = ed.dom.getParent(ed.selection.getEnd(), function(n) {\r
+ return ed.dom.hasClass(n, nonEditClass);\r
+ });\r
+\r
+ // Block or unblock\r
+ if (sc || ec) {\r
+ state = 1;\r
+ t._setDisabled(1);\r
+ return false;\r
+ } else if (state == 1) {\r
+ t._setDisabled(0);\r
+ state = 0;\r
+ }\r
+ });\r
+ },\r
+\r
+ getInfo : function() {\r
+ return {\r
+ longname : 'Non editable elements',\r
+ author : 'Moxiecode Systems AB',\r
+ authorurl : 'http://tinymce.moxiecode.com',\r
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',\r
+ version : tinymce.majorVersion + "." + tinymce.minorVersion\r
+ };\r
+ },\r
+\r
+ _block : function(ed, e) {\r
+ var k = e.keyCode;\r
+\r
+ // Don't block arrow keys, pg up/down, and F1-F12\r
+ if ((k > 32 && k < 41) || (k > 111 && k < 124))\r
+ return;\r
+\r
+ return Event.cancel(e);\r
+ },\r
+\r
+ _setDisabled : function(s) {\r
+ var t = this, ed = t.editor;\r
+\r
+ tinymce.each(ed.controlManager.controls, function(c) {\r
+ c.setDisabled(s);\r
+ });\r
+\r
+ if (s !== t.disabled) {\r
+ if (s) {\r
+ ed.onKeyDown.addToTop(t._block);\r
+ ed.onKeyPress.addToTop(t._block);\r
+ ed.onKeyUp.addToTop(t._block);\r
+ ed.onPaste.addToTop(t._block);\r
+ ed.onContextMenu.addToTop(t._block);\r
+ } else {\r
+ ed.onKeyDown.remove(t._block);\r
+ ed.onKeyPress.remove(t._block);\r
+ ed.onKeyUp.remove(t._block);\r
+ ed.onPaste.remove(t._block);\r
+ ed.onContextMenu.remove(t._block);\r
+ }\r
+\r
+ t.disabled = s;\r
+ }\r
+ }\r
+ });\r
+\r
+ // Register plugin\r
+ tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);\r
+})();
\ No newline at end of file