Upgrade TinyMCE to v3.4.5
[citadel.git] / webcit / tiny_mce / plugins / noneditable / editor_plugin_src.js
index 80121c162d93e7b90d875a3f73af06714f73d7db..916dce29cfc37bd755c724d36cb5f9ffa5fbfd83 100644 (file)
-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