| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.widget.RichText"); |
| dojo.require("dojo.widget.*"); |
| dojo.require("dojo.html.*"); |
| dojo.require("dojo.html.layout"); |
| dojo.require("dojo.html.selection"); |
| dojo.require("dojo.event.*"); |
| dojo.require("dojo.string.extras"); |
| dojo.require("dojo.uri.Uri"); |
| dojo.require("dojo.Deferred"); |
| if (!djConfig["useXDomain"] || djConfig["allowXdRichTextSave"]) { |
| if (dojo.hostenv.post_load_) { |
| (function () { |
| var savetextarea = dojo.doc().createElement("textarea"); |
| savetextarea.id = "dojo.widget.RichText.savedContent"; |
| savetextarea.style = "display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"; |
| dojo.body().appendChild(savetextarea); |
| })(); |
| } else { |
| try { |
| dojo.doc().write("<textarea id=\"dojo.widget.RichText.savedContent\" " + "style=\"display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;\"></textarea>"); |
| } |
| catch (e) { |
| } |
| } |
| } |
| dojo.widget.defineWidget("dojo.widget.RichText", dojo.widget.HtmlWidget, function () { |
| this.contentPreFilters = []; |
| this.contentPostFilters = []; |
| this.contentDomPreFilters = []; |
| this.contentDomPostFilters = []; |
| this.editingAreaStyleSheets = []; |
| if (dojo.render.html.moz) { |
| this.contentPreFilters.push(this._fixContentForMoz); |
| } |
| this._keyHandlers = {}; |
| if (dojo.Deferred) { |
| this.onLoadDeferred = new dojo.Deferred(); |
| } |
| }, {inheritWidth:false, focusOnLoad:false, saveName:"", styleSheets:"", _content:"", height:"", minHeight:"1em", isClosed:true, isLoaded:false, useActiveX:false, relativeImageUrls:false, _SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@", onLoadDeferred:null, fillInTemplate:function () { |
| dojo.event.topic.publish("dojo.widget.RichText::init", this); |
| this.open(); |
| dojo.event.connect(this, "onKeyPressed", this, "afterKeyPress"); |
| dojo.event.connect(this, "onKeyPress", this, "keyPress"); |
| dojo.event.connect(this, "onKeyDown", this, "keyDown"); |
| dojo.event.connect(this, "onKeyUp", this, "keyUp"); |
| this.setupDefaultShortcuts(); |
| }, setupDefaultShortcuts:function () { |
| var ctrl = this.KEY_CTRL; |
| var exec = function (cmd, arg) { |
| return arguments.length == 1 ? function () { |
| this.execCommand(cmd); |
| } : function () { |
| this.execCommand(cmd, arg); |
| }; |
| }; |
| this.addKeyHandler("b", ctrl, exec("bold")); |
| this.addKeyHandler("i", ctrl, exec("italic")); |
| this.addKeyHandler("u", ctrl, exec("underline")); |
| this.addKeyHandler("a", ctrl, exec("selectall")); |
| this.addKeyHandler("s", ctrl, function () { |
| this.save(true); |
| }); |
| this.addKeyHandler("1", ctrl, exec("formatblock", "h1")); |
| this.addKeyHandler("2", ctrl, exec("formatblock", "h2")); |
| this.addKeyHandler("3", ctrl, exec("formatblock", "h3")); |
| this.addKeyHandler("4", ctrl, exec("formatblock", "h4")); |
| this.addKeyHandler("\\", ctrl, exec("insertunorderedlist")); |
| if (!dojo.render.html.ie) { |
| this.addKeyHandler("Z", ctrl, exec("redo")); |
| } |
| }, events:["onBlur", "onFocus", "onKeyPress", "onKeyDown", "onKeyUp", "onClick"], open:function (element) { |
| if (this.onLoadDeferred.fired >= 0) { |
| this.onLoadDeferred = new dojo.Deferred(); |
| } |
| var h = dojo.render.html; |
| if (!this.isClosed) { |
| this.close(); |
| } |
| dojo.event.topic.publish("dojo.widget.RichText::open", this); |
| this._content = ""; |
| if ((arguments.length == 1) && (element["nodeName"])) { |
| this.domNode = element; |
| } |
| if ((this.domNode["nodeName"]) && (this.domNode.nodeName.toLowerCase() == "textarea")) { |
| this.textarea = this.domNode; |
| var html = this._preFilterContent(this.textarea.value); |
| this.domNode = dojo.doc().createElement("div"); |
| dojo.html.copyStyle(this.domNode, this.textarea); |
| var tmpFunc = dojo.lang.hitch(this, function () { |
| with (this.textarea.style) { |
| display = "block"; |
| position = "absolute"; |
| left = top = "-1000px"; |
| if (h.ie) { |
| this.__overflow = overflow; |
| overflow = "hidden"; |
| } |
| } |
| }); |
| if (h.ie) { |
| setTimeout(tmpFunc, 10); |
| } else { |
| tmpFunc(); |
| } |
| if (!h.safari) { |
| dojo.html.insertBefore(this.domNode, this.textarea); |
| } |
| if (this.textarea.form) { |
| dojo.event.connect("before", this.textarea.form, "onsubmit", dojo.lang.hitch(this, function () { |
| this.textarea.value = this.getEditorContent(); |
| })); |
| } |
| var editor = this; |
| dojo.event.connect(this, "postCreate", function () { |
| dojo.html.insertAfter(editor.textarea, editor.domNode); |
| }); |
| } else { |
| var html = this._preFilterContent(dojo.string.trim(this.domNode.innerHTML)); |
| } |
| if (html == "") { |
| html = " "; |
| } |
| var content = dojo.html.getContentBox(this.domNode); |
| this._oldHeight = content.height; |
| this._oldWidth = content.width; |
| this._firstChildContributingMargin = this._getContributingMargin(this.domNode, "top"); |
| this._lastChildContributingMargin = this._getContributingMargin(this.domNode, "bottom"); |
| this.savedContent = html; |
| this.domNode.innerHTML = ""; |
| this.editingArea = dojo.doc().createElement("div"); |
| this.domNode.appendChild(this.editingArea); |
| if ((this.domNode["nodeName"]) && (this.domNode.nodeName == "LI")) { |
| this.domNode.innerHTML = " <br>"; |
| } |
| if (this.saveName != "" && (!djConfig["useXDomain"] || djConfig["allowXdRichTextSave"])) { |
| var saveTextarea = dojo.doc().getElementById("dojo.widget.RichText.savedContent"); |
| if (saveTextarea.value != "") { |
| var datas = saveTextarea.value.split(this._SEPARATOR); |
| for (var i = 0; i < datas.length; i++) { |
| var data = datas[i].split(":"); |
| if (data[0] == this.saveName) { |
| html = data[1]; |
| datas.splice(i, 1); |
| break; |
| } |
| } |
| } |
| dojo.event.connect("before", window, "onunload", this, "_saveContent"); |
| } |
| if (h.ie70 && this.useActiveX) { |
| dojo.debug("activeX in ie70 is not currently supported, useActiveX is ignored for now."); |
| this.useActiveX = false; |
| } |
| if (this.useActiveX && h.ie) { |
| var self = this; |
| setTimeout(function () { |
| self._drawObject(html); |
| }, 0); |
| } else { |
| if (h.ie || this._safariIsLeopard() || h.opera) { |
| this.iframe = dojo.doc().createElement("iframe"); |
| this.iframe.src = "javascript:void(0)"; |
| this.editorObject = this.iframe; |
| with (this.iframe.style) { |
| border = "0"; |
| width = "100%"; |
| } |
| this.iframe.frameBorder = 0; |
| this.editingArea.appendChild(this.iframe); |
| this.window = this.iframe.contentWindow; |
| this.document = this.window.document; |
| this.document.open(); |
| this.document.write("<html><head><style>body{margin:0;padding:0;border:0;overflow:hidden;}</style></head><body><div></div></body></html>"); |
| this.document.close(); |
| this.editNode = this.document.body.firstChild; |
| this.editNode.contentEditable = true; |
| with (this.iframe.style) { |
| if (h.ie70) { |
| if (this.height) { |
| height = this.height; |
| } |
| if (this.minHeight) { |
| minHeight = this.minHeight; |
| } |
| } else { |
| height = this.height ? this.height : this.minHeight; |
| } |
| } |
| var formats = ["p", "pre", "address", "h1", "h2", "h3", "h4", "h5", "h6", "ol", "div", "ul"]; |
| var localhtml = ""; |
| for (var i in formats) { |
| if (formats[i].charAt(1) != "l") { |
| localhtml += "<" + formats[i] + "><span>content</span></" + formats[i] + ">"; |
| } else { |
| localhtml += "<" + formats[i] + "><li>content</li></" + formats[i] + ">"; |
| } |
| } |
| with (this.editNode.style) { |
| position = "absolute"; |
| left = "-2000px"; |
| top = "-2000px"; |
| } |
| this.editNode.innerHTML = localhtml; |
| var node = this.editNode.firstChild; |
| while (node) { |
| dojo.withGlobal(this.window, "selectElement", dojo.html.selection, [node.firstChild]); |
| var nativename = node.tagName.toLowerCase(); |
| this._local2NativeFormatNames[nativename] = this.queryCommandValue("formatblock"); |
| this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename; |
| node = node.nextSibling; |
| } |
| with (this.editNode.style) { |
| position = ""; |
| left = ""; |
| top = ""; |
| } |
| this.editNode.innerHTML = html; |
| if (this.height) { |
| this.document.body.style.overflowY = "scroll"; |
| } |
| dojo.lang.forEach(this.events, function (e) { |
| dojo.event.connect(this.editNode, e.toLowerCase(), this, e); |
| }, this); |
| this.onLoad(); |
| } else { |
| this._drawIframe(html); |
| this.editorObject = this.iframe; |
| } |
| } |
| if (this.domNode.nodeName == "LI") { |
| this.domNode.lastChild.style.marginTop = "-1.2em"; |
| } |
| dojo.html.addClass(this.domNode, "RichTextEditable"); |
| this.isClosed = false; |
| }, _hasCollapseableMargin:function (element, side) { |
| if (dojo.html.getPixelValue(element, "border-" + side + "-width", false)) { |
| return false; |
| } else { |
| if (dojo.html.getPixelValue(element, "padding-" + side, false)) { |
| return false; |
| } else { |
| return true; |
| } |
| } |
| }, _getContributingMargin:function (element, topOrBottom) { |
| if (topOrBottom == "top") { |
| var siblingAttr = "previousSibling"; |
| var childSiblingAttr = "nextSibling"; |
| var childAttr = "firstChild"; |
| var marginProp = "margin-top"; |
| var siblingMarginProp = "margin-bottom"; |
| } else { |
| var siblingAttr = "nextSibling"; |
| var childSiblingAttr = "previousSibling"; |
| var childAttr = "lastChild"; |
| var marginProp = "margin-bottom"; |
| var siblingMarginProp = "margin-top"; |
| } |
| var elementMargin = dojo.html.getPixelValue(element, marginProp, false); |
| function isSignificantNode(element) { |
| return !(element.nodeType == 3 && dojo.string.isBlank(element.data)) && dojo.html.getStyle(element, "display") != "none" && !dojo.html.isPositionAbsolute(element); |
| } |
| var childMargin = 0; |
| var child = element[childAttr]; |
| while (child) { |
| while ((!isSignificantNode(child)) && child[childSiblingAttr]) { |
| child = child[childSiblingAttr]; |
| } |
| childMargin = Math.max(childMargin, dojo.html.getPixelValue(child, marginProp, false)); |
| if (!this._hasCollapseableMargin(child, topOrBottom)) { |
| break; |
| } |
| child = child[childAttr]; |
| } |
| if (!this._hasCollapseableMargin(element, topOrBottom)) { |
| return parseInt(childMargin); |
| } |
| var contextMargin = 0; |
| var sibling = element[siblingAttr]; |
| while (sibling) { |
| if (isSignificantNode(sibling)) { |
| contextMargin = dojo.html.getPixelValue(sibling, siblingMarginProp, false); |
| break; |
| } |
| sibling = sibling[siblingAttr]; |
| } |
| if (!sibling) { |
| contextMargin = dojo.html.getPixelValue(element.parentNode, marginProp, false); |
| } |
| if (childMargin > elementMargin) { |
| return parseInt(Math.max((childMargin - elementMargin) - contextMargin, 0)); |
| } else { |
| return 0; |
| } |
| }, _drawIframe:function (html) { |
| var oldMoz = Boolean(dojo.render.html.moz && (typeof window.XML == "undefined")); |
| if (!this.iframe) { |
| var currentDomain = (new dojo.uri.Uri(dojo.doc().location)).host; |
| this.iframe = dojo.doc().createElement("iframe"); |
| with (this.iframe) { |
| style.border = "none"; |
| style.lineHeight = "0"; |
| style.verticalAlign = "bottom"; |
| scrolling = this.height ? "auto" : "no"; |
| } |
| } |
| if (djConfig["useXDomain"] && !djConfig["dojoRichTextFrameUrl"]) { |
| dojo.debug("dojo.widget.RichText: When using cross-domain Dojo builds," + " please save src/widget/templates/richtextframe.html to your domain and set djConfig.dojoRichTextFrameUrl" + " to the path on your domain to richtextframe.html"); |
| } |
| this.iframe.src = (djConfig["dojoRichTextFrameUrl"] || dojo.uri.moduleUri("dojo.widget", "templates/richtextframe.html")) + ((dojo.doc().domain != currentDomain) ? ("#" + dojo.doc().domain) : ""); |
| this.iframe.width = this.inheritWidth ? this._oldWidth : "100%"; |
| if (this.height) { |
| this.iframe.style.height = this.height; |
| } else { |
| var height = this._oldHeight; |
| if (this._hasCollapseableMargin(this.domNode, "top")) { |
| height += this._firstChildContributingMargin; |
| } |
| if (this._hasCollapseableMargin(this.domNode, "bottom")) { |
| height += this._lastChildContributingMargin; |
| } |
| this.iframe.height = height; |
| } |
| var tmpContent = dojo.doc().createElement("div"); |
| tmpContent.innerHTML = html; |
| this.editingArea.appendChild(tmpContent); |
| if (this.relativeImageUrls) { |
| var imgs = tmpContent.getElementsByTagName("img"); |
| for (var i = 0; i < imgs.length; i++) { |
| imgs[i].src = (new dojo.uri.Uri(dojo.global().location, imgs[i].src)).toString(); |
| } |
| html = tmpContent.innerHTML; |
| } |
| var firstChild = dojo.html.firstElement(tmpContent); |
| var lastChild = dojo.html.lastElement(tmpContent); |
| if (firstChild) { |
| firstChild.style.marginTop = this._firstChildContributingMargin + "px"; |
| } |
| if (lastChild) { |
| lastChild.style.marginBottom = this._lastChildContributingMargin + "px"; |
| } |
| this.editingArea.appendChild(this.iframe); |
| if (dojo.render.html.safari) { |
| this.iframe.src = this.iframe.src; |
| } |
| var _iframeInitialized = false; |
| var ifrFunc = dojo.lang.hitch(this, function () { |
| if (!_iframeInitialized) { |
| _iframeInitialized = true; |
| } else { |
| return; |
| } |
| if (!this.editNode) { |
| if (this.iframe.contentWindow) { |
| this.window = this.iframe.contentWindow; |
| this.document = this.iframe.contentWindow.document; |
| } else { |
| if (this.iframe.contentDocument) { |
| this.window = this.iframe.contentDocument.window; |
| this.document = this.iframe.contentDocument; |
| } |
| } |
| var getStyle = (function (domNode) { |
| return function (style) { |
| return dojo.html.getStyle(domNode, style); |
| }; |
| })(this.domNode); |
| var font = getStyle("font-weight") + " " + getStyle("font-size") + " " + getStyle("font-family"); |
| var lineHeight = "1.0"; |
| var lineHeightStyle = dojo.html.getUnitValue(this.domNode, "line-height"); |
| if (lineHeightStyle.value && lineHeightStyle.units == "") { |
| lineHeight = lineHeightStyle.value; |
| } |
| dojo.html.insertCssText("body,html{background:transparent;padding:0;margin:0;}" + "body{top:0;left:0;right:0;" + (((this.height) || (dojo.render.html.opera)) ? "" : "position:fixed;") + "font:" + font + ";" + "min-height:" + this.minHeight + ";" + "line-height:" + lineHeight + "}" + "p{margin: 1em 0 !important;}" + "body > *:first-child{padding-top:0 !important;margin-top:" + this._firstChildContributingMargin + "px !important;}" + "body > *:last-child{padding-bottom:0 !important;margin-bottom:" + this._lastChildContributingMargin + "px !important;}" + "li > ul:-moz-first-node, li > ol:-moz-first-node{padding-top:1.2em;}\n" + "li{min-height:1.2em;}" + "", this.document); |
| dojo.html.removeNode(tmpContent); |
| this.document.body.innerHTML = html; |
| if (oldMoz || dojo.render.html.safari) { |
| this.document.designMode = "on"; |
| } |
| this.onLoad(); |
| } else { |
| dojo.html.removeNode(tmpContent); |
| this.editNode.innerHTML = html; |
| this.onDisplayChanged(); |
| } |
| }); |
| if (this.editNode) { |
| ifrFunc(); |
| } else { |
| if (dojo.render.html.moz) { |
| this.iframe.onload = function () { |
| setTimeout(ifrFunc, 250); |
| }; |
| } else { |
| this.iframe.onload = ifrFunc; |
| } |
| } |
| }, _applyEditingAreaStyleSheets:function () { |
| var files = []; |
| if (this.styleSheets) { |
| files = this.styleSheets.split(";"); |
| this.styleSheets = ""; |
| } |
| files = files.concat(this.editingAreaStyleSheets); |
| this.editingAreaStyleSheets = []; |
| if (files.length > 0) { |
| for (var i = 0; i < files.length; i++) { |
| var url = files[i]; |
| if (url) { |
| this.addStyleSheet(dojo.uri.dojoUri(url)); |
| } |
| } |
| } |
| }, addStyleSheet:function (uri) { |
| var url = uri.toString(); |
| if (dojo.lang.find(this.editingAreaStyleSheets, url) > -1) { |
| dojo.debug("dojo.widget.RichText.addStyleSheet: Style sheet " + url + " is already applied to the editing area!"); |
| return; |
| } |
| if (url.charAt(0) == "." || (url.charAt(0) != "/" && !uri.host)) { |
| url = (new dojo.uri.Uri(dojo.global().location, url)).toString(); |
| } |
| this.editingAreaStyleSheets.push(url); |
| if (this.document.createStyleSheet) { |
| this.document.createStyleSheet(url); |
| } else { |
| var head = this.document.getElementsByTagName("head")[0]; |
| var stylesheet = this.document.createElement("link"); |
| with (stylesheet) { |
| rel = "stylesheet"; |
| type = "text/css"; |
| href = url; |
| } |
| head.appendChild(stylesheet); |
| } |
| }, removeStyleSheet:function (uri) { |
| var url = uri.toString(); |
| if (url.charAt(0) == "." || (url.charAt(0) != "/" && !uri.host)) { |
| url = (new dojo.uri.Uri(dojo.global().location, url)).toString(); |
| } |
| var index = dojo.lang.find(this.editingAreaStyleSheets, url); |
| if (index == -1) { |
| dojo.debug("dojo.widget.RichText.removeStyleSheet: Style sheet " + url + " is not applied to the editing area so it can not be removed!"); |
| return; |
| } |
| delete this.editingAreaStyleSheets[index]; |
| var links = this.document.getElementsByTagName("link"); |
| for (var i = 0; i < links.length; i++) { |
| if (links[i].href == url) { |
| if (dojo.render.html.ie) { |
| links[i].href = ""; |
| } |
| dojo.html.removeNode(links[i]); |
| break; |
| } |
| } |
| }, _drawObject:function (html) { |
| this.object = dojo.html.createExternalElement(dojo.doc(), "object"); |
| with (this.object) { |
| classid = "clsid:2D360201-FFF5-11D1-8D03-00A0C959BC0A"; |
| width = this.inheritWidth ? this._oldWidth : "100%"; |
| style.height = this.height ? this.height : (this._oldHeight + "px"); |
| Scrollbars = this.height ? true : false; |
| Appearance = this._activeX.appearance.flat; |
| } |
| this.editorObject = this.object; |
| this.editingArea.appendChild(this.object); |
| this.object.attachEvent("DocumentComplete", dojo.lang.hitch(this, "onLoad")); |
| dojo.lang.forEach(this.events, function (e) { |
| this.object.attachEvent(e.toLowerCase(), dojo.lang.hitch(this, e)); |
| }, this); |
| this.object.DocumentHTML = "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<html><title></title>" + "<style type=\"text/css\">" + " body,html { padding: 0; margin: 0; }" + (this.height ? "" : " body, { overflow: hidden; }") + "</style>" + "<body><div>" + html + "<div></body></html>"; |
| this._cacheLocalBlockFormatNames(); |
| }, _local2NativeFormatNames:{}, _native2LocalFormatNames:{}, _cacheLocalBlockFormatNames:function () { |
| if (!this._native2LocalFormatNames["p"]) { |
| var obj = this.object; |
| var error = false; |
| if (!obj) { |
| try { |
| obj = dojo.html.createExternalElement(dojo.doc(), "object"); |
| obj.classid = "clsid:2D360201-FFF5-11D1-8D03-00A0C959BC0A"; |
| dojo.body().appendChild(obj); |
| obj.DocumentHTML = "<html><head></head><body></body></html>"; |
| } |
| catch (e) { |
| error = true; |
| } |
| } |
| try { |
| var oNamesParm = new ActiveXObject("DEGetBlockFmtNamesParam.DEGetBlockFmtNamesParam"); |
| obj.ExecCommand(this._activeX.command["getblockformatnames"], 0, oNamesParm); |
| var vbNamesArray = new VBArray(oNamesParm.Names); |
| var localFormats = vbNamesArray.toArray(); |
| var nativeFormats = ["p", "pre", "address", "h1", "h2", "h3", "h4", "h5", "h6", "ol", "ul", "", "", "", "", "div"]; |
| for (var i = 0; i < nativeFormats.length; ++i) { |
| if (nativeFormats[i].length > 0) { |
| this._local2NativeFormatNames[localFormats[i]] = nativeFormats[i]; |
| this._native2LocalFormatNames[nativeFormats[i]] = localFormats[i]; |
| } |
| } |
| } |
| catch (e) { |
| error = true; |
| } |
| if (obj && !this.object) { |
| dojo.body().removeChild(obj); |
| } |
| } |
| return !error; |
| }, _isResized:function () { |
| return false; |
| }, onLoad:function (e) { |
| this.isLoaded = true; |
| if (this.object) { |
| this.document = this.object.DOM; |
| this.window = this.document.parentWindow; |
| this.editNode = this.document.body.firstChild; |
| this.editingArea.style.height = this.height ? this.height : this.minHeight; |
| if (!this.height) { |
| this.connect(this, "onDisplayChanged", "_updateHeight"); |
| } |
| this.window._frameElement = this.object; |
| } else { |
| if (this.iframe && !dojo.render.html.ie) { |
| this.editNode = this.document.body; |
| if (!this.height) { |
| this.connect(this, "onDisplayChanged", "_updateHeight"); |
| } |
| try { |
| this.document.execCommand("useCSS", false, true); |
| this.document.execCommand("styleWithCSS", false, false); |
| } |
| catch (e2) { |
| } |
| if (dojo.render.html.safari) { |
| this.connect(this.editNode, "onblur", "onBlur"); |
| this.connect(this.editNode, "onfocus", "onFocus"); |
| this.connect(this.editNode, "onclick", "onFocus"); |
| this.interval = setInterval(dojo.lang.hitch(this, "onDisplayChanged"), 750); |
| } else { |
| if (dojo.render.html.mozilla || dojo.render.html.opera) { |
| var doc = this.document; |
| var addListener = dojo.event.browser.addListener; |
| var self = this; |
| dojo.lang.forEach(this.events, function (e) { |
| var l = addListener(self.document, e.substr(2).toLowerCase(), dojo.lang.hitch(self, e)); |
| if (e == "onBlur") { |
| var unBlur = {unBlur:function (e) { |
| dojo.event.browser.removeListener(doc, "blur", l); |
| }}; |
| dojo.event.connect("before", self, "close", unBlur, "unBlur"); |
| } |
| }); |
| } |
| } |
| } else { |
| if (dojo.render.html.ie) { |
| if (!this.height) { |
| this.connect(this, "onDisplayChanged", "_updateHeight"); |
| } |
| this.editNode.style.zoom = 1; |
| } |
| } |
| } |
| this._applyEditingAreaStyleSheets(); |
| if (this.focusOnLoad) { |
| this.focus(); |
| } |
| this.onDisplayChanged(e); |
| if (this.onLoadDeferred) { |
| this.onLoadDeferred.callback(true); |
| } |
| }, onKeyDown:function (e) { |
| if ((!e) && (this.object)) { |
| e = dojo.event.browser.fixEvent(this.window.event); |
| } |
| if ((dojo.render.html.ie) && (e.keyCode == e.KEY_TAB)) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| this.execCommand((e.shiftKey ? "outdent" : "indent")); |
| } else { |
| if (dojo.render.html.ie) { |
| if ((65 <= e.keyCode) && (e.keyCode <= 90)) { |
| e.charCode = e.keyCode; |
| this.onKeyPress(e); |
| } |
| } |
| } |
| }, onKeyUp:function (e) { |
| return; |
| }, KEY_CTRL:1, onKeyPress:function (e) { |
| if ((!e) && (this.object)) { |
| e = dojo.event.browser.fixEvent(this.window.event); |
| } |
| var modifiers = e.ctrlKey ? this.KEY_CTRL : 0; |
| if (this._keyHandlers[e.key]) { |
| var handlers = this._keyHandlers[e.key], i = 0, handler; |
| while (handler = handlers[i++]) { |
| if (modifiers == handler.modifiers) { |
| e.preventDefault(); |
| handler.handler.call(this); |
| break; |
| } |
| } |
| } |
| dojo.lang.setTimeout(this, this.onKeyPressed, 1, e); |
| }, addKeyHandler:function (key, modifiers, handler) { |
| if (!(this._keyHandlers[key] instanceof Array)) { |
| this._keyHandlers[key] = []; |
| } |
| this._keyHandlers[key].push({modifiers:modifiers || 0, handler:handler}); |
| }, onKeyPressed:function (e) { |
| this.onDisplayChanged(); |
| }, onClick:function (e) { |
| this.onDisplayChanged(e); |
| }, onBlur:function (e) { |
| }, _initialFocus:true, onFocus:function (e) { |
| if ((dojo.render.html.mozilla) && (this._initialFocus)) { |
| this._initialFocus = false; |
| if (dojo.string.trim(this.editNode.innerHTML) == " ") { |
| this.placeCursorAtStart(); |
| } |
| } |
| }, blur:function () { |
| if (this.iframe) { |
| this.window.blur(); |
| } else { |
| if (this.object) { |
| this.document.body.blur(); |
| } else { |
| if (this.editNode) { |
| this.editNode.blur(); |
| } |
| } |
| } |
| }, focus:function () { |
| if (this.iframe && !dojo.render.html.ie) { |
| this.window.focus(); |
| } else { |
| if (this.object) { |
| this.document.focus(); |
| } else { |
| if (this.editNode && this.editNode.focus) { |
| this.editNode.focus(); |
| } else { |
| dojo.debug("Have no idea how to focus into the editor!"); |
| } |
| } |
| } |
| }, onDisplayChanged:function (e) { |
| }, _activeX:{command:{bold:5000, italic:5023, underline:5048, justifycenter:5024, justifyleft:5025, justifyright:5026, cut:5003, copy:5002, paste:5032, "delete":5004, undo:5049, redo:5033, removeformat:5034, selectall:5035, unlink:5050, indent:5018, outdent:5031, insertorderedlist:5030, insertunorderedlist:5051, inserttable:5022, insertcell:5019, insertcol:5020, insertrow:5021, deletecells:5005, deletecols:5006, deleterows:5007, mergecells:5029, splitcell:5047, setblockformat:5043, getblockformat:5011, getblockformatnames:5012, setfontname:5044, getfontname:5013, setfontsize:5045, getfontsize:5014, setbackcolor:5042, getbackcolor:5010, setforecolor:5046, getforecolor:5015, findtext:5008, font:5009, hyperlink:5016, image:5017, lockelement:5027, makeabsolute:5028, sendbackward:5036, bringforward:5037, sendbelowtext:5038, bringabovetext:5039, sendtoback:5040, bringtofront:5041, properties:5052}, ui:{"default":0, prompt:1, noprompt:2}, status:{notsupported:0, disabled:1, enabled:3, latched:7, ninched:11}, appearance:{flat:0, inset:1}, state:{unchecked:0, checked:1, gray:2}}, _normalizeCommand:function (cmd) { |
| var drh = dojo.render.html; |
| var command = cmd.toLowerCase(); |
| if (command == "formatblock") { |
| if (drh.safari) { |
| command = "heading"; |
| } |
| } else { |
| if (this.object) { |
| switch (command) { |
| case "createlink": |
| command = "hyperlink"; |
| break; |
| case "insertimage": |
| command = "image"; |
| break; |
| } |
| } else { |
| if (command == "hilitecolor" && !drh.mozilla) { |
| command = "backcolor"; |
| } |
| } |
| } |
| return command; |
| }, _safariIsLeopard:function () { |
| var gt420 = false; |
| if (dojo.render.html.safari) { |
| var tmp = dojo.render.html.UA.split("AppleWebKit/")[1]; |
| var ver = parseFloat(tmp.split(" ")[0]); |
| if (ver >= 420) { |
| gt420 = true; |
| } |
| } |
| return gt420; |
| }, queryCommandAvailable:function (command) { |
| var ie = 1; |
| var mozilla = 1 << 1; |
| var safari = 1 << 2; |
| var opera = 1 << 3; |
| var safari420 = 1 << 4; |
| var gt420 = this._safariIsLeopard(); |
| function isSupportedBy(browsers) { |
| return {ie:Boolean(browsers & ie), mozilla:Boolean(browsers & mozilla), safari:Boolean(browsers & safari), safari420:Boolean(browsers & safari420), opera:Boolean(browsers & opera)}; |
| } |
| var supportedBy = null; |
| switch (command.toLowerCase()) { |
| case "bold": |
| case "italic": |
| case "underline": |
| case "subscript": |
| case "superscript": |
| case "fontname": |
| case "fontsize": |
| case "forecolor": |
| case "hilitecolor": |
| case "justifycenter": |
| case "justifyfull": |
| case "justifyleft": |
| case "justifyright": |
| case "delete": |
| case "selectall": |
| supportedBy = isSupportedBy(mozilla | ie | safari | opera); |
| break; |
| case "createlink": |
| case "unlink": |
| case "removeformat": |
| case "inserthorizontalrule": |
| case "insertimage": |
| case "insertorderedlist": |
| case "insertunorderedlist": |
| case "indent": |
| case "outdent": |
| case "formatblock": |
| case "inserthtml": |
| case "undo": |
| case "redo": |
| case "strikethrough": |
| supportedBy = isSupportedBy(mozilla | ie | opera | safari420); |
| break; |
| case "blockdirltr": |
| case "blockdirrtl": |
| case "dirltr": |
| case "dirrtl": |
| case "inlinedirltr": |
| case "inlinedirrtl": |
| supportedBy = isSupportedBy(ie); |
| break; |
| case "cut": |
| case "copy": |
| case "paste": |
| supportedBy = isSupportedBy(ie | mozilla | safari420); |
| break; |
| case "inserttable": |
| supportedBy = isSupportedBy(mozilla | (this.object ? ie : 0)); |
| break; |
| case "insertcell": |
| case "insertcol": |
| case "insertrow": |
| case "deletecells": |
| case "deletecols": |
| case "deleterows": |
| case "mergecells": |
| case "splitcell": |
| supportedBy = isSupportedBy(this.object ? ie : 0); |
| break; |
| default: |
| return false; |
| } |
| return (dojo.render.html.ie && supportedBy.ie) || (dojo.render.html.mozilla && supportedBy.mozilla) || (dojo.render.html.safari && supportedBy.safari) || (gt420 && supportedBy.safari420) || (dojo.render.html.opera && supportedBy.opera); |
| }, execCommand:function (command, argument) { |
| var returnValue; |
| this.focus(); |
| command = this._normalizeCommand(command); |
| if (argument != undefined) { |
| if (command == "heading") { |
| throw new Error("unimplemented"); |
| } else { |
| if (command == "formatblock") { |
| if (this.object) { |
| argument = this._native2LocalFormatNames[argument]; |
| } else { |
| if (dojo.render.html.ie) { |
| argument = "<" + argument + ">"; |
| } |
| } |
| } |
| } |
| } |
| if (this.object) { |
| switch (command) { |
| case "hilitecolor": |
| command = "setbackcolor"; |
| break; |
| case "forecolor": |
| case "backcolor": |
| case "fontsize": |
| case "fontname": |
| command = "set" + command; |
| break; |
| case "formatblock": |
| command = "setblockformat"; |
| } |
| if (command == "strikethrough") { |
| command = "inserthtml"; |
| var range = this.document.selection.createRange(); |
| if (!range.htmlText) { |
| return; |
| } |
| argument = range.htmlText.strike(); |
| } else { |
| if (command == "inserthorizontalrule") { |
| command = "inserthtml"; |
| argument = "<hr>"; |
| } |
| } |
| if (command == "inserthtml") { |
| var range = this.document.selection.createRange(); |
| if (this.document.selection.type.toUpperCase() == "CONTROL") { |
| for (var i = 0; i < range.length; i++) { |
| range.item(i).outerHTML = argument; |
| } |
| } else { |
| range.pasteHTML(argument); |
| range.select(); |
| } |
| returnValue = true; |
| } else { |
| if (arguments.length == 1) { |
| returnValue = this.object.ExecCommand(this._activeX.command[command], this._activeX.ui.noprompt); |
| } else { |
| returnValue = this.object.ExecCommand(this._activeX.command[command], this._activeX.ui.noprompt, argument); |
| } |
| } |
| } else { |
| if (command == "inserthtml") { |
| if (dojo.render.html.ie) { |
| var insertRange = this.document.selection.createRange(); |
| insertRange.pasteHTML(argument); |
| insertRange.select(); |
| return true; |
| } else { |
| return this.document.execCommand(command, false, argument); |
| } |
| } else { |
| if ((command == "unlink") && (this.queryCommandEnabled("unlink")) && (dojo.render.html.mozilla)) { |
| var selection = this.window.getSelection(); |
| var selectionRange = selection.getRangeAt(0); |
| var selectionStartContainer = selectionRange.startContainer; |
| var selectionStartOffset = selectionRange.startOffset; |
| var selectionEndContainer = selectionRange.endContainer; |
| var selectionEndOffset = selectionRange.endOffset; |
| var a = dojo.withGlobal(this.window, "getAncestorElement", dojo.html.selection, ["a"]); |
| dojo.withGlobal(this.window, "selectElement", dojo.html.selection, [a]); |
| returnValue = this.document.execCommand("unlink", false, null); |
| var selectionRange = this.document.createRange(); |
| selectionRange.setStart(selectionStartContainer, selectionStartOffset); |
| selectionRange.setEnd(selectionEndContainer, selectionEndOffset); |
| selection.removeAllRanges(); |
| selection.addRange(selectionRange); |
| return returnValue; |
| } else { |
| if ((command == "hilitecolor") && (dojo.render.html.mozilla)) { |
| this.document.execCommand("useCSS", false, false); |
| returnValue = this.document.execCommand(command, false, argument); |
| this.document.execCommand("useCSS", false, true); |
| } else { |
| if ((dojo.render.html.ie) && ((command == "backcolor") || (command == "forecolor"))) { |
| argument = arguments.length > 1 ? argument : null; |
| returnValue = this.document.execCommand(command, false, argument); |
| } else { |
| argument = arguments.length > 1 ? argument : null; |
| if (argument || command != "createlink") { |
| returnValue = this.document.execCommand(command, false, argument); |
| } |
| } |
| } |
| } |
| } |
| } |
| this.onDisplayChanged(); |
| return returnValue; |
| }, queryCommandEnabled:function (command) { |
| command = this._normalizeCommand(command); |
| if (this.object) { |
| switch (command) { |
| case "hilitecolor": |
| command = "setbackcolor"; |
| break; |
| case "forecolor": |
| case "backcolor": |
| case "fontsize": |
| case "fontname": |
| command = "set" + command; |
| break; |
| case "formatblock": |
| command = "setblockformat"; |
| break; |
| case "strikethrough": |
| command = "bold"; |
| break; |
| case "inserthorizontalrule": |
| return true; |
| } |
| if (typeof this._activeX.command[command] == "undefined") { |
| return false; |
| } |
| var status = this.object.QueryStatus(this._activeX.command[command]); |
| return ((status != this._activeX.status.notsupported) && (status != this._activeX.status.disabled)); |
| } else { |
| if (dojo.render.html.mozilla) { |
| if (command == "unlink") { |
| return dojo.withGlobal(this.window, "hasAncestorElement", dojo.html.selection, ["a"]); |
| } else { |
| if (command == "inserttable") { |
| return true; |
| } |
| } |
| } |
| var elem = (dojo.render.html.ie) ? this.document.selection.createRange() : this.document; |
| return elem.queryCommandEnabled(command); |
| } |
| }, queryCommandState:function (command) { |
| command = this._normalizeCommand(command); |
| if (this.object) { |
| if (command == "forecolor") { |
| command = "setforecolor"; |
| } else { |
| if (command == "backcolor") { |
| command = "setbackcolor"; |
| } else { |
| if (command == "strikethrough") { |
| return dojo.withGlobal(this.window, "hasAncestorElement", dojo.html.selection, ["strike"]); |
| } else { |
| if (command == "inserthorizontalrule") { |
| return false; |
| } |
| } |
| } |
| } |
| if (typeof this._activeX.command[command] == "undefined") { |
| return null; |
| } |
| var status = this.object.QueryStatus(this._activeX.command[command]); |
| return ((status == this._activeX.status.latched) || (status == this._activeX.status.ninched)); |
| } else { |
| return this.document.queryCommandState(command); |
| } |
| }, queryCommandValue:function (command) { |
| command = this._normalizeCommand(command); |
| if (this.object) { |
| switch (command) { |
| case "forecolor": |
| case "backcolor": |
| case "fontsize": |
| case "fontname": |
| command = "get" + command; |
| return this.object.execCommand(this._activeX.command[command], this._activeX.ui.noprompt); |
| case "formatblock": |
| var retvalue = this.object.execCommand(this._activeX.command["getblockformat"], this._activeX.ui.noprompt); |
| if (retvalue) { |
| return this._local2NativeFormatNames[retvalue]; |
| } |
| } |
| } else { |
| if (dojo.render.html.ie && command == "formatblock") { |
| return this._local2NativeFormatNames[this.document.queryCommandValue(command)] || this.document.queryCommandValue(command); |
| } |
| return this.document.queryCommandValue(command); |
| } |
| }, placeCursorAtStart:function () { |
| this.focus(); |
| if (dojo.render.html.moz && this.editNode.firstChild && this.editNode.firstChild.nodeType != dojo.dom.TEXT_NODE) { |
| dojo.withGlobal(this.window, "selectElementChildren", dojo.html.selection, [this.editNode.firstChild]); |
| } else { |
| dojo.withGlobal(this.window, "selectElementChildren", dojo.html.selection, [this.editNode]); |
| } |
| dojo.withGlobal(this.window, "collapse", dojo.html.selection, [true]); |
| }, placeCursorAtEnd:function () { |
| this.focus(); |
| if (dojo.render.html.moz && this.editNode.lastChild && this.editNode.lastChild.nodeType != dojo.dom.TEXT_NODE) { |
| dojo.withGlobal(this.window, "selectElementChildren", dojo.html.selection, [this.editNode.lastChild]); |
| } else { |
| dojo.withGlobal(this.window, "selectElementChildren", dojo.html.selection, [this.editNode]); |
| } |
| dojo.withGlobal(this.window, "collapse", dojo.html.selection, [false]); |
| }, replaceEditorContent:function (html) { |
| html = this._preFilterContent(html); |
| if (this.isClosed) { |
| this.domNode.innerHTML = html; |
| } else { |
| if (this.window && this.window.getSelection && !dojo.render.html.moz) { |
| this.editNode.innerHTML = html; |
| } else { |
| if ((this.window && this.window.getSelection) || (this.document && this.document.selection)) { |
| this.execCommand("selectall"); |
| if (dojo.render.html.moz && !html) { |
| html = " "; |
| } |
| this.execCommand("inserthtml", html); |
| } |
| } |
| } |
| }, _preFilterContent:function (html) { |
| var ec = html; |
| dojo.lang.forEach(this.contentPreFilters, function (ef) { |
| ec = ef(ec); |
| }); |
| if (this.contentDomPreFilters.length > 0) { |
| var dom = dojo.doc().createElement("div"); |
| dom.style.display = "none"; |
| dojo.body().appendChild(dom); |
| dom.innerHTML = ec; |
| dojo.lang.forEach(this.contentDomPreFilters, function (ef) { |
| dom = ef(dom); |
| }); |
| ec = dom.innerHTML; |
| dojo.body().removeChild(dom); |
| } |
| return ec; |
| }, _postFilterContent:function (html) { |
| var ec = html; |
| if (this.contentDomPostFilters.length > 0) { |
| var dom = this.document.createElement("div"); |
| dom.innerHTML = ec; |
| dojo.lang.forEach(this.contentDomPostFilters, function (ef) { |
| dom = ef(dom); |
| }); |
| ec = dom.innerHTML; |
| } |
| dojo.lang.forEach(this.contentPostFilters, function (ef) { |
| ec = ef(ec); |
| }); |
| return ec; |
| }, _lastHeight:0, _updateHeight:function () { |
| if (!this.isLoaded) { |
| return; |
| } |
| if (this.height) { |
| return; |
| } |
| var height = dojo.html.getBorderBox(this.editNode).height; |
| if (!height) { |
| height = dojo.html.getBorderBox(this.document.body).height; |
| } |
| if (height == 0) { |
| dojo.debug("Can not figure out the height of the editing area!"); |
| return; |
| } |
| this._lastHeight = height; |
| this.editorObject.style.height = this._lastHeight + "px"; |
| this.window.scrollTo(0, 0); |
| }, _saveContent:function (e) { |
| var saveTextarea = dojo.doc().getElementById("dojo.widget.RichText.savedContent"); |
| saveTextarea.value += this._SEPARATOR + this.saveName + ":" + this.getEditorContent(); |
| }, getEditorContent:function () { |
| var ec = ""; |
| try { |
| ec = (this._content.length > 0) ? this._content : this.editNode.innerHTML; |
| if (dojo.string.trim(ec) == " ") { |
| ec = ""; |
| } |
| } |
| catch (e) { |
| } |
| if (dojo.render.html.ie && !this.object) { |
| var re = new RegExp("(?:<p> </p>[\n\r]*)+$", "i"); |
| ec = ec.replace(re, ""); |
| } |
| ec = this._postFilterContent(ec); |
| if (this.relativeImageUrls) { |
| var siteBase = dojo.global().location.protocol + "//" + dojo.global().location.host; |
| var pathBase = dojo.global().location.pathname; |
| if (pathBase.match(/\/$/)) { |
| } else { |
| var pathParts = pathBase.split("/"); |
| if (pathParts.length) { |
| pathParts.pop(); |
| } |
| pathBase = pathParts.join("/") + "/"; |
| } |
| var sameSite = new RegExp("(<img[^>]* src=[\"'])(" + siteBase + "(" + pathBase + ")?)", "ig"); |
| ec = ec.replace(sameSite, "$1"); |
| } |
| return ec; |
| }, close:function (save, force) { |
| if (this.isClosed) { |
| return false; |
| } |
| if (arguments.length == 0) { |
| save = true; |
| } |
| this._content = this._postFilterContent(this.editNode.innerHTML); |
| var changed = (this.savedContent != this._content); |
| if (this.interval) { |
| clearInterval(this.interval); |
| } |
| if (dojo.render.html.ie && !this.object) { |
| dojo.event.browser.clean(this.editNode); |
| } |
| if (this.iframe) { |
| delete this.iframe; |
| } |
| if (this.textarea) { |
| with (this.textarea.style) { |
| position = ""; |
| left = top = ""; |
| if (dojo.render.html.ie) { |
| overflow = this.__overflow; |
| this.__overflow = null; |
| } |
| } |
| if (save) { |
| this.textarea.value = this._content; |
| } else { |
| this.textarea.value = this.savedContent; |
| } |
| dojo.html.removeNode(this.domNode); |
| this.domNode = this.textarea; |
| } else { |
| if (save) { |
| if (dojo.render.html.moz) { |
| var nc = dojo.doc().createElement("span"); |
| this.domNode.appendChild(nc); |
| nc.innerHTML = this.editNode.innerHTML; |
| } else { |
| this.domNode.innerHTML = this._content; |
| } |
| } else { |
| this.domNode.innerHTML = this.savedContent; |
| } |
| } |
| dojo.html.removeClass(this.domNode, "RichTextEditable"); |
| this.isClosed = true; |
| this.isLoaded = false; |
| delete this.editNode; |
| if (this.window._frameElement) { |
| this.window._frameElement = null; |
| } |
| this.window = null; |
| this.document = null; |
| this.object = null; |
| this.editingArea = null; |
| this.editorObject = null; |
| return changed; |
| }, destroyRendering:function () { |
| }, destroy:function () { |
| this.destroyRendering(); |
| if (!this.isClosed) { |
| this.close(false); |
| } |
| dojo.widget.RichText.superclass.destroy.call(this); |
| }, connect:function (targetObj, targetFunc, thisFunc) { |
| dojo.event.connect(targetObj, targetFunc, this, thisFunc); |
| }, disconnect:function (targetObj, targetFunc, thisFunc) { |
| dojo.event.disconnect(targetObj, targetFunc, this, thisFunc); |
| }, disconnectAllWithRoot:function (targetObj) { |
| dojo.deprecated("disconnectAllWithRoot", "is deprecated. No need to disconnect manually", "0.5"); |
| }, _fixContentForMoz:function (html) { |
| html = html.replace(/<strong([ \>])/gi, "<b$1"); |
| html = html.replace(/<\/strong>/gi, "</b>"); |
| html = html.replace(/<em([ \>])/gi, "<i$1"); |
| html = html.replace(/<\/em>/gi, "</i>"); |
| return html; |
| }}); |
| |