/* Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved. Available via Academic Free License >= 2.1 OR the modified BSD license. see: http://dojotoolkit.org/license for details */ if(!dojo._hasResource["dijit.Editor"]){ dojo._hasResource["dijit.Editor"]=true; dojo.provide("dijit.Editor"); dojo.require("dijit._editor.RichText"); dojo.require("dijit.Toolbar"); dojo.require("dijit.ToolbarSeparator"); dojo.require("dijit._editor._Plugin"); dojo.require("dijit._editor.plugins.EnterKeyHandling"); dojo.require("dijit._editor.range"); dojo.require("dijit._Container"); dojo.require("dojo.i18n"); dojo.require("dijit.layout._LayoutWidget"); dojo.require("dijit._editor.range"); dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw"); dojo.declare("dijit.Editor",dijit._editor.RichText,{plugins:null,extraPlugins:null,constructor:function(){ if(!dojo.isArray(this.plugins)){ this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull","dijit._editor.plugins.EnterKeyHandling"]; } this._plugins=[]; this._editInterval=this.editActionInterval*1000; if(dojo.isIE){ this.events.push("onBeforeDeactivate"); this.events.push("onBeforeActivate"); } },postCreate:function(){ this._steps=this._steps.slice(0); this._undoedSteps=this._undoedSteps.slice(0); if(dojo.isArray(this.extraPlugins)){ this.plugins=this.plugins.concat(this.extraPlugins); } this.setValueDeferred=new dojo.Deferred(); this.inherited(arguments); this.commands=dojo.i18n.getLocalization("dijit._editor","commands",this.lang); if(!this.toolbar){ this.toolbar=new dijit.Toolbar({dir:this.dir,lang:this.lang}); this.header.appendChild(this.toolbar.domNode); } dojo.forEach(this.plugins,this.addPlugin,this); this.setValueDeferred.callback(true); dojo.addClass(this.iframe.parentNode,"dijitEditorIFrameContainer"); dojo.addClass(this.iframe,"dijitEditorIFrame"); dojo.attr(this.iframe,"allowTransparency",true); if(dojo.isWebKit){ dojo.style(this.domNode,"KhtmlUserSelect","none"); } this.toolbar.startup(); this.onNormalizedDisplayChanged(); },destroy:function(){ dojo.forEach(this._plugins,function(p){ if(p&&p.destroy){ p.destroy(); } }); this._plugins=[]; this.toolbar.destroyRecursive(); delete this.toolbar; this.inherited(arguments); },addPlugin:function(_1,_2){ var _3=dojo.isString(_1)?{name:_1}:_1; if(!_3.setEditor){ var o={"args":_3,"plugin":null,"editor":this}; dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]); if(!o.plugin){ var pc=dojo.getObject(_3.name); if(pc){ o.plugin=new pc(_3); } } if(!o.plugin){ console.warn("Cannot find plugin",_1); return; } _1=o.plugin; } if(arguments.length>1){ this._plugins[_2]=_1; }else{ this._plugins.push(_1); } _1.setEditor(this); if(dojo.isFunction(_1.setToolbar)){ _1.setToolbar(this.toolbar); } },startup:function(){ },resize:function(_4){ if(_4){ dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments); } },layout:function(){ var _5=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+dojo._getPadBorderExtents(this.iframe.parentNode).h+dojo._getMarginExtents(this.iframe.parentNode).h)); this.editingArea.style.height=_5+"px"; if(this.iframe){ this.iframe.style.height="100%"; } this._layoutMode=true; },_onIEMouseDown:function(e){ var _6; var b=this.document.body; var _7=b.clientWidth; var _8=b.clientHeight; var _9=b.clientLeft; var _a=b.offsetWidth; var _b=b.offsetHeight; var _c=b.offsetLeft; bodyDir=b.dir?b.dir.toLowerCase():""; if(bodyDir!="rtl"){ if(_7<_a&&e.x>_7&&e.x<_a){ _6=true; } }else{ if(e.x<_9&&e.x>_c){ _6=true; } } if(!_6){ if(_8<_b&&e.y>_8&&e.y<_b){ _6=true; } } if(!_6){ delete this._cursorToStart; delete this._savedSelection; if(e.target.tagName=="BODY"){ setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0); } this.inherited(arguments); } },onBeforeActivate:function(e){ this._restoreSelection(); },onBeforeDeactivate:function(e){ if(this.customUndo){ this.endEditing(true); } if(e.target.tagName!="BODY"){ this._saveSelection(); } },customUndo:dojo.isIE||dojo.isWebKit,editActionInterval:3,beginEditing:function(_d){ if(!this._inEditing){ this._inEditing=true; this._beginEditing(_d); } if(this.editActionInterval>0){ if(this._editTimer){ clearTimeout(this._editTimer); } this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval); } },_steps:[],_undoedSteps:[],execCommand:function(_e){ if(this.customUndo&&(_e=="undo"||_e=="redo")){ return this[_e](); }else{ if(this.customUndo){ this.endEditing(); this._beginEditing(); } var r; try{ r=this.inherited("execCommand",arguments); if(dojo.isWebKit&&_e=="paste"&&!r){ throw {code:1011}; } } catch(e){ if(e.code==1011&&/copy|cut|paste/.test(_e)){ var _f=dojo.string.substitute,_10={cut:"X",copy:"C",paste:"V"}; alert(_f(this.commands.systemShortcut,[this.commands[_e],_f(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_10[_e]])])); } r=false; } if(this.customUndo){ this._endEditing(); } return r; } },queryCommandEnabled:function(cmd){ if(this.customUndo&&(cmd=="undo"||cmd=="redo")){ return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0); }else{ return this.inherited("queryCommandEnabled",arguments); } },_moveToBookmark:function(b){ var _11=b.mark; var _12=b.mark; var col=b.isCollapsed; var r,_13,_14,sel; if(_12){ if(dojo.isIE){ if(dojo.isArray(_12)){ _11=[]; dojo.forEach(_12,function(n){ _11.push(dijit.range.getNode(n,this.editNode)); },this); dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_11,isCollapsed:col}]); }else{ if(_12.startContainer&&_12.endContainer){ sel=dijit.range.getSelection(this.window); if(sel&&sel.removeAllRanges){ sel.removeAllRanges(); r=dijit.range.create(this.window); _13=dijit.range.getNode(_12.startContainer,this.editNode); _14=dijit.range.getNode(_12.endContainer,this.editNode); if(_13&&_14){ r.setStart(_13,_12.startOffset); r.setEnd(_14,_12.endOffset); sel.addRange(r); } } } } }else{ sel=dijit.range.getSelection(this.window); if(sel&&sel.removeAllRanges){ sel.removeAllRanges(); r=dijit.range.create(this.window); _13=dijit.range.getNode(_12.startContainer,this.editNode); _14=dijit.range.getNode(_12.endContainer,this.editNode); if(_13&&_14){ r.setStart(_13,_12.startOffset); r.setEnd(_14,_12.endOffset); sel.addRange(r); } } } } },_changeToStep:function(_15,to){ this.setValue(to.text); var b=to.bookmark; if(!b){ return; } this._moveToBookmark(b); },undo:function(){ var ret=false; if(!this._undoRedoActive){ this._undoRedoActive=true; this.endEditing(true); var s=this._steps.pop(); if(s&&this._steps.length>0){ this.focus(); this._changeToStep(s,this._steps[this._steps.length-1]); this._undoedSteps.push(s); this.onDisplayChanged(); delete this._undoRedoActive; ret=true; } delete this._undoRedoActive; } return ret; },redo:function(){ var ret=false; if(!this._undoRedoActive){ this._undoRedoActive=true; this.endEditing(true); var s=this._undoedSteps.pop(); if(s&&this._steps.length>0){ this.focus(); this._changeToStep(this._steps[this._steps.length-1],s); this._steps.push(s); this.onDisplayChanged(); ret=true; } delete this._undoRedoActive; } return ret; },endEditing:function(_16){ if(this._editTimer){ clearTimeout(this._editTimer); } if(this._inEditing){ this._endEditing(_16); this._inEditing=false; } },_getBookmark:function(){ var b=dojo.withGlobal(this.window,dijit.getBookmark); var tmp=[]; if(b&&b.mark){ var _17=b.mark; if(dojo.isIE){ var sel=dijit.range.getSelection(this.window); if(!dojo.isArray(_17)){ if(sel){ var _18; if(sel.rangeCount){ _18=sel.getRangeAt(0); } if(_18){ b.mark=_18.cloneRange(); }else{ b.mark=dojo.withGlobal(this.window,dijit.getBookmark); } } }else{ dojo.forEach(b.mark,function(n){ tmp.push(dijit.range.getIndex(n,this.editNode).o); },this); b.mark=tmp; } } try{ if(b.mark&&b.mark.startContainer){ tmp=dijit.range.getIndex(b.mark.startContainer,this.editNode).o; b.mark={startContainer:tmp,startOffset:b.mark.startOffset,endContainer:b.mark.endContainer===b.mark.startContainer?tmp:dijit.range.getIndex(b.mark.endContainer,this.editNode).o,endOffset:b.mark.endOffset}; } } catch(e){ b.mark=null; } } return b; },_beginEditing:function(cmd){ if(this._steps.length===0){ this._steps.push({"text":dijit._editor.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()}); } },_endEditing:function(_19){ var v=dijit._editor.getChildrenHtml(this.editNode); this._undoedSteps=[]; this._steps.push({text:v,bookmark:this._getBookmark()}); },onKeyDown:function(e){ if(!dojo.isIE&&!this.iframe&&e.keyCode==dojo.keys.TAB&&!this.tabIndent){ this._saveSelection(); } if(!this.customUndo){ this.inherited(arguments); return; } var k=e.keyCode,ks=dojo.keys; if(e.ctrlKey&&!e.altKey){ if(k==90||k==122){ dojo.stopEvent(e); this.undo(); return; }else{ if(k==89||k==121){ dojo.stopEvent(e); this.redo(); return; } } } this.inherited(arguments); switch(k){ case ks.ENTER: case ks.BACKSPACE: case ks.DELETE: this.beginEditing(); break; case 88: case 86: if(e.ctrlKey&&!e.altKey&&!e.metaKey){ this.endEditing(); if(e.keyCode==88){ this.beginEditing("cut"); setTimeout(dojo.hitch(this,this.endEditing),1); }else{ this.beginEditing("paste"); setTimeout(dojo.hitch(this,this.endEditing),1); } break; } default: if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCodedojo.keys.F15)){ this.beginEditing(); break; } case ks.ALT: this.endEditing(); break; case ks.UP_ARROW: case ks.DOWN_ARROW: case ks.LEFT_ARROW: case ks.RIGHT_ARROW: case ks.HOME: case ks.END: case ks.PAGE_UP: case ks.PAGE_DOWN: this.endEditing(true); break; case ks.CTRL: case ks.SHIFT: case ks.TAB: break; } },_onBlur:function(){ this.inherited("_onBlur",arguments); this.endEditing(true); },_saveSelection:function(){ this._savedSelection=this._getBookmark(); },_restoreSelection:function(){ if(this._savedSelection){ delete this._cursorToStart; if(dojo.withGlobal(this.window,"isCollapsed",dijit)){ this._moveToBookmark(this._savedSelection); } delete this._savedSelection; } },onClick:function(){ this.endEditing(true); this.inherited(arguments); },_setDisabledAttr:function(_1a){ if(!this.disabled&&_1a){ this._buttonEnabledPlugins=dojo.filter(this._plugins,function(p){ if(p&&p.button&&!p.button.get("disabled")){ p.button.set("disabled",true); return true; } return false; }); }else{ if(this.disabled&&!_1a){ dojo.forEach(this._buttonEnabledPlugins,function(p){ p.button.attr("disabled",false); p.updateState&&p.updateState(); }); } } this.inherited(arguments); },_setStateClass:function(){ this.inherited(arguments); if(this.document&&this.document.body){ dojo.style(this.document.body,"color",dojo.style(this.iframe,"color")); } }}); dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){ if(o.plugin){ return; } var _1b=o.args,p; var _1c=dijit._editor._Plugin; var _1d=_1b.name; switch(_1d){ case "undo": case "redo": case "cut": case "copy": case "paste": case "insertOrderedList": case "insertUnorderedList": case "indent": case "outdent": case "justifyCenter": case "justifyFull": case "justifyLeft": case "justifyRight": case "delete": case "selectAll": case "removeFormat": case "unlink": case "insertHorizontalRule": p=new _1c({command:_1d}); break; case "bold": case "italic": case "underline": case "strikethrough": case "subscript": case "superscript": p=new _1c({buttonClass:dijit.form.ToggleButton,command:_1d}); break; case "|": p=new _1c({button:new dijit.ToolbarSeparator(),setEditor:function(_1e){ this.editor=_1e; }}); } o.plugin=p; }); }