Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / noneditable / editor_plugin_src.js
index 597b1f004e2b08dae48d8281a663708720725d84..916dce29cfc37bd755c724d36cb5f9ffa5fbfd83 100644 (file)
-function TinyMCE_noneditable_getInfo() {\r
-       return {\r
-               longname : 'Non editable elements',\r
-               author : 'Moxiecode Systems',\r
-               authorurl : 'http://tinymce.moxiecode.com',\r
-               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',\r
-               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
-       };\r
-};\r
-\r
-function TinyMCE_noneditable_initInstance(inst) {\r
-       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");\r
-\r
-       // Ugly hack\r
-       if (tinyMCE.isMSIE5_0)\r
-               tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');\r
-\r
-       if (tinyMCE.isGecko) {\r
-               tinyMCE.addEvent(inst.getDoc(), "keyup", TinyMCE_noneditable_fixKeyUp);\r
-//             tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_noneditable_selectAll);\r
-//             tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_noneditable_selectAll);\r
-       }\r
-}\r
-\r
-function TinyMCE_noneditable_fixKeyUp(e) {\r
-       var inst = tinyMCE.selectedInstance;\r
-       var sel = inst.getSel();\r
-       var rng = inst.getRng();\r
-       var an = sel.anchorNode;\r
-\r
-       // Move cursor outside non editable fields\r
-       if ((e.keyCode == 38 || e.keyCode == 37 || e.keyCode == 40 || e.keyCode == 39) && (elm = TinyMCE_noneditable_isNonEditable(an)) != null) {\r
-               rng = inst.getDoc().createRange();\r
-               rng.selectNode(elm);\r
-               rng.collapse(true);\r
-               sel.removeAllRanges();\r
-               sel.addRange(rng);\r
-               tinyMCE.cancelEvent(e);\r
-       }\r
-}\r
-\r
-function TinyMCE_noneditable_selectAll(e) {\r
-       var inst = tinyMCE.selectedInstance;\r
-       var sel = inst.getSel();\r
-       var doc = inst.getDoc();\r
-\r
-       if ((elm = TinyMCE_noneditable_isNonEditable(sel.focusNode)) != null) {\r
-               inst.selectNode(elm, false);\r
-               tinyMCE.cancelEvent(e);\r
-               return;\r
-       }\r
-\r
-       if ((elm = TinyMCE_noneditable_isNonEditable(sel.anchorNode)) != null) {\r
-               inst.selectNode(elm, false);\r
-               tinyMCE.cancelEvent(e);\r
-               return;\r
-       }\r
-}\r
-\r
-function TinyMCE_noneditable_isNonEditable(elm) {\r
-       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
-       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
-       if (!elm)\r
-               return;\r
-\r
-       do {\r
-               var className = elm.className ? elm.className : "";\r
-\r
-               if (className.indexOf(editClass) != -1)\r
-                       return null;\r
-\r
-               if (className.indexOf(nonEditClass) != -1)\r
-                       return elm;\r
-       } while (elm = elm.parentNode);\r
-\r
-       return null;\r
-}\r
-\r
-function TinyMCE_noneditable_cleanup(type, content, inst) {\r
-       switch (type) {\r
-               case "insert_to_editor_dom":\r
-                       var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
-                       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
-                       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
-                       for (var i=0; i<nodes.length; i++) {\r
-                               var elm = nodes[i];\r
-\r
-                               // Convert contenteditable to classes\r
-                               var editable = tinyMCE.getAttrib(elm, "contenteditable");\r
-                               if (new RegExp("true|false","gi").test(editable))\r
-                                       TinyMCE_noneditable_setEditable(elm, editable == "true");\r
-\r
-                               if (tinyMCE.isMSIE) {\r
-                                       var className = elm.className ? elm.className : "";\r
-\r
-                                       if (className.indexOf(editClass) != -1)\r
-                                               elm.contentEditable = true;\r
-\r
-                                       if (className.indexOf(nonEditClass) != -1)\r
-                                               elm.contentEditable = false;\r
+/**\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
-\r
-                       break;\r
-\r
-               case "insert_to_editor":\r
-                       if (tinyMCE.isMSIE) {\r
-                               var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
-                               var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
-                               content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + editClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>');\r
-                               content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>');\r
-                       }\r
-\r
-                       break;\r
-\r
-               case "get_from_editor_dom":\r
-                       if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {\r
-                               var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
 \r
-                               for (var i=0; i<nodes.length; i++)\r
-                                       nodes[i].removeAttribute("contenteditable");\r
+                               t.disabled = s;\r
                        }\r
+               }\r
+       });\r
 \r
-                       break;\r
-       }\r
-\r
-       return content;\r
-}\r
-\r
-function TinyMCE_noneditable_setEditable(elm, state) {\r
-       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
-       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
-\r
-       var className = elm.className ? elm.className : "";\r
-\r
-       if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)\r
-               return;\r
-\r
-       if ((className = tinyMCE.getAttrib(elm, "class")) != "")\r
-               className += " ";\r
-\r
-       className += state ? editClass : nonEditClass;\r
-\r
-       elm.setAttribute("class", className);\r
-       elm.className = className;\r
-}\r
+       // Register plugin\r
+       tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);\r
+})();
\ No newline at end of file