| /* |
| 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.Editor"); |
| dojo.deprecated("dojo.widget.Editor", "is replaced by dojo.widget.Editor2", "0.5"); |
| dojo.require("dojo.io.*"); |
| dojo.require("dojo.widget.*"); |
| dojo.require("dojo.widget.Toolbar"); |
| dojo.require("dojo.widget.RichText"); |
| dojo.require("dojo.widget.ColorPalette"); |
| dojo.require("dojo.string.extras"); |
| dojo.widget.tags.addParseTreeHandler("dojo:Editor"); |
| dojo.widget.Editor = function () { |
| dojo.widget.HtmlWidget.call(this); |
| this.contentFilters = []; |
| this._toolbars = []; |
| }; |
| dojo.inherits(dojo.widget.Editor, dojo.widget.HtmlWidget); |
| dojo.widget.Editor.itemGroups = {textGroup:["bold", "italic", "underline", "strikethrough"], blockGroup:["formatBlock", "fontName", "fontSize"], justifyGroup:["justifyleft", "justifycenter", "justifyright"], commandGroup:["save", "cancel"], colorGroup:["forecolor", "hilitecolor"], listGroup:["insertorderedlist", "insertunorderedlist"], indentGroup:["outdent", "indent"], linkGroup:["createlink", "insertimage", "inserthorizontalrule"]}; |
| dojo.widget.Editor.formatBlockValues = {"Normal":"p", "Main heading":"h2", "Sub heading":"h3", "Sub sub heading":"h4", "Preformatted":"pre"}; |
| dojo.widget.Editor.fontNameValues = {"Arial":"Arial, Helvetica, sans-serif", "Verdana":"Verdana, sans-serif", "Times New Roman":"Times New Roman, serif", "Courier":"Courier New, monospace"}; |
| dojo.widget.Editor.fontSizeValues = {"1 (8 pt)":"1", "2 (10 pt)":"2", "3 (12 pt)":"3", "4 (14 pt)":"4", "5 (18 pt)":"5", "6 (24 pt)":"6", "7 (36 pt)":"7"}; |
| dojo.widget.Editor.defaultItems = ["commandGroup", "|", "blockGroup", "|", "textGroup", "|", "colorGroup", "|", "justifyGroup", "|", "listGroup", "indentGroup", "|", "linkGroup"]; |
| dojo.widget.Editor.supportedCommands = ["save", "cancel", "|", "-", "/", " "]; |
| dojo.lang.extend(dojo.widget.Editor, {widgetType:"Editor", saveUrl:"", saveMethod:"post", saveArgName:"editorContent", closeOnSave:false, items:dojo.widget.Editor.defaultItems, formatBlockItems:dojo.lang.shallowCopy(dojo.widget.Editor.formatBlockValues), fontNameItems:dojo.lang.shallowCopy(dojo.widget.Editor.fontNameValues), fontSizeItems:dojo.lang.shallowCopy(dojo.widget.Editor.fontSizeValues), getItemProperties:function (name) { |
| var props = {}; |
| switch (name.toLowerCase()) { |
| case "bold": |
| case "italic": |
| case "underline": |
| case "strikethrough": |
| props.toggleItem = true; |
| break; |
| case "justifygroup": |
| props.defaultButton = "justifyleft"; |
| props.preventDeselect = true; |
| props.buttonGroup = true; |
| break; |
| case "listgroup": |
| props.buttonGroup = true; |
| break; |
| case "save": |
| case "cancel": |
| props.label = dojo.string.capitalize(name); |
| break; |
| case "forecolor": |
| case "hilitecolor": |
| props.name = name; |
| props.toggleItem = true; |
| props.icon = this.getCommandImage(name); |
| break; |
| case "formatblock": |
| props.name = "formatBlock"; |
| props.values = this.formatBlockItems; |
| break; |
| case "fontname": |
| props.name = "fontName"; |
| props.values = this.fontNameItems; |
| case "fontsize": |
| props.name = "fontSize"; |
| props.values = this.fontSizeItems; |
| } |
| return props; |
| }, validateItems:true, focusOnLoad:true, minHeight:"1em", _richText:null, _richTextType:"RichText", _toolbarContainer:null, _toolbarContainerType:"ToolbarContainer", _toolbars:[], _toolbarType:"Toolbar", _toolbarItemType:"ToolbarItem", buildRendering:function (args, frag) { |
| var node = frag["dojo:" + this.widgetType.toLowerCase()]["nodeRef"]; |
| var trt = dojo.widget.createWidget(this._richTextType, {focusOnLoad:this.focusOnLoad, minHeight:this.minHeight}, node); |
| var _this = this; |
| setTimeout(function () { |
| _this.setRichText(trt); |
| _this.initToolbar(); |
| _this.fillInTemplate(args, frag); |
| }, 0); |
| }, setRichText:function (richText) { |
| if (this._richText && this._richText == richText) { |
| dojo.debug("Already set the richText to this richText!"); |
| return; |
| } |
| if (this._richText && !this._richText.isClosed) { |
| dojo.debug("You are switching richTexts yet you haven't closed the current one. Losing reference!"); |
| } |
| this._richText = richText; |
| dojo.event.connect(this._richText, "close", this, "onClose"); |
| dojo.event.connect(this._richText, "onLoad", this, "onLoad"); |
| dojo.event.connect(this._richText, "onDisplayChanged", this, "updateToolbar"); |
| if (this._toolbarContainer) { |
| this._toolbarContainer.enable(); |
| this.updateToolbar(true); |
| } |
| }, initToolbar:function () { |
| if (this._toolbarContainer) { |
| return; |
| } |
| this._toolbarContainer = dojo.widget.createWidget(this._toolbarContainerType); |
| var tb = this.addToolbar(); |
| var last = true; |
| for (var i = 0; i < this.items.length; i++) { |
| if (this.items[i] == "\n") { |
| tb = this.addToolbar(); |
| } else { |
| if ((this.items[i] == "|") && (!last)) { |
| last = true; |
| } else { |
| last = this.addItem(this.items[i], tb); |
| } |
| } |
| } |
| this.insertToolbar(this._toolbarContainer.domNode, this._richText.domNode); |
| }, insertToolbar:function (tbNode, richTextNode) { |
| dojo.html.insertBefore(tbNode, richTextNode); |
| }, addToolbar:function (toolbar) { |
| this.initToolbar(); |
| if (!(toolbar instanceof dojo.widget.Toolbar)) { |
| toolbar = dojo.widget.createWidget(this._toolbarType); |
| } |
| this._toolbarContainer.addChild(toolbar); |
| this._toolbars.push(toolbar); |
| return toolbar; |
| }, addItem:function (item, tb, dontValidate) { |
| if (!tb) { |
| tb = this._toolbars[0]; |
| } |
| var cmd = ((item) && (!dojo.lang.isUndefined(item["getValue"]))) ? cmd = item["getValue"]() : item; |
| var groups = dojo.widget.Editor.itemGroups; |
| if (item instanceof dojo.widget.ToolbarItem) { |
| tb.addChild(item); |
| } else { |
| if (groups[cmd]) { |
| var group = groups[cmd]; |
| var worked = true; |
| if (cmd == "justifyGroup" || cmd == "listGroup") { |
| var btnGroup = [cmd]; |
| for (var i = 0; i < group.length; i++) { |
| if (dontValidate || this.isSupportedCommand(group[i])) { |
| btnGroup.push(this.getCommandImage(group[i])); |
| } else { |
| worked = false; |
| } |
| } |
| if (btnGroup.length) { |
| var btn = tb.addChild(btnGroup, null, this.getItemProperties(cmd)); |
| dojo.event.connect(btn, "onClick", this, "_action"); |
| dojo.event.connect(btn, "onChangeSelect", this, "_action"); |
| } |
| return worked; |
| } else { |
| for (var i = 0; i < group.length; i++) { |
| if (!this.addItem(group[i], tb)) { |
| worked = false; |
| } |
| } |
| return worked; |
| } |
| } else { |
| if ((!dontValidate) && (!this.isSupportedCommand(cmd))) { |
| return false; |
| } |
| if (dontValidate || this.isSupportedCommand(cmd)) { |
| cmd = cmd.toLowerCase(); |
| if (cmd == "formatblock") { |
| var select = dojo.widget.createWidget("ToolbarSelect", {name:"formatBlock", values:this.formatBlockItems}); |
| tb.addChild(select); |
| var _this = this; |
| dojo.event.connect(select, "onSetValue", function (item, value) { |
| _this.onAction("formatBlock", value); |
| }); |
| } else { |
| if (cmd == "fontname") { |
| var select = dojo.widget.createWidget("ToolbarSelect", {name:"fontName", values:this.fontNameItems}); |
| tb.addChild(select); |
| dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function (item, value) { |
| this.onAction("fontName", value); |
| })); |
| } else { |
| if (cmd == "fontsize") { |
| var select = dojo.widget.createWidget("ToolbarSelect", {name:"fontSize", values:this.fontSizeItems}); |
| tb.addChild(select); |
| dojo.event.connect(select, "onSetValue", dojo.lang.hitch(this, function (item, value) { |
| this.onAction("fontSize", value); |
| })); |
| } else { |
| if (dojo.lang.inArray(cmd, ["forecolor", "hilitecolor"])) { |
| var btn = tb.addChild(dojo.widget.createWidget("ToolbarColorDialog", this.getItemProperties(cmd))); |
| dojo.event.connect(btn, "onSetValue", this, "_setValue"); |
| } else { |
| var btn = tb.addChild(this.getCommandImage(cmd), null, this.getItemProperties(cmd)); |
| if (cmd == "save") { |
| dojo.event.connect(btn, "onClick", this, "_save"); |
| } else { |
| if (cmd == "cancel") { |
| dojo.event.connect(btn, "onClick", this, "_close"); |
| } else { |
| dojo.event.connect(btn, "onClick", this, "_action"); |
| dojo.event.connect(btn, "onChangeSelect", this, "_action"); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| return true; |
| }, enableToolbar:function () { |
| if (this._toolbarContainer) { |
| this._toolbarContainer.domNode.style.display = ""; |
| this._toolbarContainer.enable(); |
| } |
| }, disableToolbar:function (hide) { |
| if (hide) { |
| if (this._toolbarContainer) { |
| this._toolbarContainer.domNode.style.display = "none"; |
| } |
| } else { |
| if (this._toolbarContainer) { |
| this._toolbarContainer.disable(); |
| } |
| } |
| }, _updateToolbarLastRan:null, _updateToolbarTimer:null, _updateToolbarFrequency:500, updateToolbar:function (force) { |
| if (!this._toolbarContainer) { |
| return; |
| } |
| var diff = new Date() - this._updateToolbarLastRan; |
| if (!force && this._updateToolbarLastRan && (diff < this._updateToolbarFrequency)) { |
| clearTimeout(this._updateToolbarTimer); |
| var _this = this; |
| this._updateToolbarTimer = setTimeout(function () { |
| _this.updateToolbar(); |
| }, this._updateToolbarFrequency / 2); |
| return; |
| } else { |
| this._updateToolbarLastRan = new Date(); |
| } |
| var items = this._toolbarContainer.getItems(); |
| for (var i = 0; i < items.length; i++) { |
| var item = items[i]; |
| if (item instanceof dojo.widget.ToolbarSeparator) { |
| continue; |
| } |
| var cmd = item._name; |
| if (cmd == "save" || cmd == "cancel") { |
| continue; |
| } else { |
| if (cmd == "justifyGroup") { |
| try { |
| if (!this._richText.queryCommandEnabled("justifyleft")) { |
| item.disable(false, true); |
| } else { |
| item.enable(false, true); |
| var jitems = item.getItems(); |
| for (var j = 0; j < jitems.length; j++) { |
| var name = jitems[j]._name; |
| var value = this._richText.queryCommandValue(name); |
| if (typeof value == "boolean" && value) { |
| value = name; |
| break; |
| } else { |
| if (typeof value == "string") { |
| value = "justify" + value; |
| } else { |
| value = null; |
| } |
| } |
| } |
| if (!value) { |
| value = "justifyleft"; |
| } |
| item.setValue(value, false, true); |
| } |
| } |
| catch (err) { |
| } |
| } else { |
| if (cmd == "listGroup") { |
| var litems = item.getItems(); |
| for (var j = 0; j < litems.length; j++) { |
| this.updateItem(litems[j]); |
| } |
| } else { |
| this.updateItem(item); |
| } |
| } |
| } |
| } |
| }, updateItem:function (item) { |
| try { |
| var cmd = item._name; |
| var enabled = this._richText.queryCommandEnabled(cmd); |
| item.setEnabled(enabled, false, true); |
| var active = this._richText.queryCommandState(cmd); |
| if (active && cmd == "underline") { |
| active = !this._richText.queryCommandEnabled("unlink"); |
| } |
| item.setSelected(active, false, true); |
| return true; |
| } |
| catch (err) { |
| return false; |
| } |
| }, supportedCommands:dojo.widget.Editor.supportedCommands.concat(), isSupportedCommand:function (cmd) { |
| var yes = dojo.lang.inArray(cmd, this.supportedCommands); |
| if (!yes) { |
| try { |
| var richText = this._richText || dojo.widget.HtmlRichText.prototype; |
| yes = richText.queryCommandAvailable(cmd); |
| } |
| catch (E) { |
| } |
| } |
| return yes; |
| }, getCommandImage:function (cmd) { |
| if (cmd == "|") { |
| return cmd; |
| } else { |
| return dojo.uri.moduleUri("dojo.widget", "templates/buttons/" + cmd + ".gif"); |
| } |
| }, _action:function (e) { |
| this._fire("onAction", e.getValue()); |
| }, _setValue:function (a, b) { |
| this._fire("onAction", a.getValue(), b); |
| }, _save:function (e) { |
| if (!this._richText.isClosed) { |
| if (this.saveUrl.length) { |
| var content = {}; |
| content[this.saveArgName] = this.getHtml(); |
| dojo.io.bind({method:this.saveMethod, url:this.saveUrl, content:content}); |
| } else { |
| dojo.debug("please set a saveUrl for the editor"); |
| } |
| if (this.closeOnSave) { |
| this._richText.close(e.getName().toLowerCase() == "save"); |
| } |
| } |
| }, _close:function (e) { |
| if (!this._richText.isClosed) { |
| this._richText.close(e.getName().toLowerCase() == "save"); |
| } |
| }, onAction:function (cmd, value) { |
| switch (cmd) { |
| case "createlink": |
| if (!(value = prompt("Please enter the URL of the link:", "http://"))) { |
| return; |
| } |
| break; |
| case "insertimage": |
| if (!(value = prompt("Please enter the URL of the image:", "http://"))) { |
| return; |
| } |
| break; |
| } |
| this._richText.execCommand(cmd, value); |
| }, fillInTemplate:function (args, frag) { |
| }, _fire:function (eventName) { |
| if (dojo.lang.isFunction(this[eventName])) { |
| var args = []; |
| if (arguments.length == 1) { |
| args.push(this); |
| } else { |
| for (var i = 1; i < arguments.length; i++) { |
| args.push(arguments[i]); |
| } |
| } |
| this[eventName].apply(this, args); |
| } |
| }, getHtml:function () { |
| this._richText.contentFilters = this._richText.contentFilters.concat(this.contentFilters); |
| return this._richText.getEditorContent(); |
| }, getEditorContent:function () { |
| return this.getHtml(); |
| }, onClose:function (save, hide) { |
| this.disableToolbar(hide); |
| if (save) { |
| this._fire("onSave"); |
| } else { |
| this._fire("onCancel"); |
| } |
| }, onLoad:function () { |
| }, onSave:function () { |
| }, onCancel:function () { |
| }}); |
| |