+\r
+ function removeHrOnBackspace(ed) {\r
+ ed.onKeyDown.add(function(ed, e) {\r
+ if (e.keyCode === BACKSPACE) {\r
+ if (ed.selection.isCollapsed() && ed.selection.getRng(true).startOffset === 0) {\r
+ var node = ed.selection.getNode();\r
+ var previousSibling = node.previousSibling;\r
+ if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "hr") {\r
+ ed.dom.remove(previousSibling);\r
+ tinymce.dom.Event.cancel(e);\r
+ }\r
+ }\r
+ }\r
+ })\r
+ }\r
+\r
+ function focusBody(ed) {\r
+ // Fix for a focus bug in FF 3.x where the body element\r
+ // wouldn't get proper focus if the user clicked on the HTML element\r
+ if (!Range.prototype.getClientRects) { // Detect getClientRects got introduced in FF 4\r
+ ed.onMouseDown.add(function(ed, e) {\r
+ if (e.target.nodeName === "HTML") {\r
+ var body = ed.getBody();\r
+\r
+ // Blur the body it's focused but not correctly focused\r
+ body.blur();\r
+\r
+ // Refocus the body after a little while\r
+ setTimeout(function() {\r
+ body.focus();\r
+ }, 0);\r
+ }\r
+ });\r
+ }\r
+ };\r
+\r
+ function selectControlElements(ed) {\r
+ ed.onClick.add(function(ed, e) {\r
+ e = e.target;\r
+\r
+ // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250\r
+ // WebKit can't even do simple things like selecting an image\r
+ // Needs tobe the setBaseAndExtend or it will fail to select floated images\r
+ if (/^(IMG|HR)$/.test(e.nodeName))\r
+ ed.selection.getSel().setBaseAndExtent(e, 0, e, 1);\r
+\r
+ if (e.nodeName == 'A' && ed.dom.hasClass(e, 'mceItemAnchor'))\r
+ ed.selection.select(e);\r
+\r
+ ed.nodeChanged();\r
+ });\r
+ };\r
+\r
+ function removeStylesOnPTagsInheritedFromHeadingTag(ed) {\r
+ ed.onKeyDown.add(function(ed, event) {\r
+ function checkInHeadingTag(ed) {\r
+ var currentNode = ed.selection.getNode();\r
+ var headingTags = 'h1,h2,h3,h4,h5,h6';\r
+ return ed.dom.is(currentNode, headingTags) || ed.dom.getParent(currentNode, headingTags) !== null;\r
+ }\r
+\r
+ if (event.keyCode === VK.ENTER && !VK.modifierPressed(event) && checkInHeadingTag(ed)) {\r
+ setTimeout(function() {\r
+ var currentNode = ed.selection.getNode();\r
+ if (ed.dom.is(currentNode, 'p')) {\r
+ ed.dom.setAttrib(currentNode, 'style', null);\r
+ // While tiny's content is correct after this method call, the content shown is not representative of it and needs to be 'repainted'\r
+ ed.execCommand('mceCleanup');\r
+ }\r
+ }, 0);\r
+ }\r
+ });\r
+ }\r
+ function selectionChangeNodeChanged(ed) {\r
+ var lastRng, selectionTimer;\r
+\r
+ ed.dom.bind(ed.getDoc(), 'selectionchange', function() {\r
+ if (selectionTimer) {\r
+ clearTimeout(selectionTimer);\r
+ selectionTimer = 0;\r
+ }\r
+\r
+ selectionTimer = window.setTimeout(function() {\r
+ var rng = ed.selection.getRng();\r
+\r
+ // Compare the ranges to see if it was a real change or not\r
+ if (!lastRng || !tinymce.dom.RangeUtils.compareRanges(rng, lastRng)) {\r
+ ed.nodeChanged();\r
+ lastRng = rng;\r
+ }\r
+ }, 50);\r
+ });\r
+ }\r
+\r
+ function ensureBodyHasRoleApplication(ed) {\r
+ document.body.setAttribute("role", "application");\r
+ }\r