MWF.xApplication.MinderEditor.History=new Class({initialize:function(e){this.minder=e;this.MAX_HISTORY=100;this.lastSnap;this.patchLock;this.undoDiffs=[];this.redoDiffs=[];this.reset();e.on("contentchange",this.changed.bind(this));e.on("import",this.reset.bind(this));e.on("patch",this.updateSelection.bind(this))},reset:function(){this.undoDiffs=[];this.redoDiffs=[];this.lastSnap=this.minder.exportJson()},makeUndoDiff:function(){var e=this.minder.exportJson();var t=MWF.xApplication.MinderEditor.JsonDiff(e,this.lastSnap);if(t.length){this.undoDiffs.push(t);while(this.undoDiffs.length>this.MAX_HISTORY){this.undoDiffs.shift()}this.lastSnap=e;return true}},makeRedoDiff:function(){var e=this.minder.exportJson();this.redoDiffs.push(MWF.xApplication.MinderEditor.JsonDiff(e,this.lastSnap));this.lastSnap=e},undo:function(){this.patchLock=true;var e=this.undoDiffs.pop();if(e){this.minder.applyPatches(e);this.makeRedoDiff()}this.patchLock=false},redo:function(){this.patchLock=true;var e=this.redoDiffs.pop();if(e){this.minder.applyPatches(e);this.makeUndoDiff()}this.patchLock=false},changed:function(){if(this.patchLock)return;if(this.makeUndoDiff())this.redoDiffs=[]},hasUndo:function(){return!!this.undoDiffs.length},hasRedo:function(){return!!this.redoDiffs.length},updateSelection:function(e){if(!this.patchLock)return;var t=e.patch;switch(t.express){case"node.add":this.minder.select(t.node.getChild(t.index),true);break;case"node.remove":case"data.replace":case"data.remove":case"data.add":this.minder.select(t.node,true);break}}});MWF.xApplication.MinderEditor.ClipboardMimeType=new Class({initialize:function(){this.SPLITOR="\ufeff";this.MIMETYPE={"application/km":"￿"};this.SIGN={"\ufeff":"SPLITOR","￿":"application/km"}},process:function(e,t){t=t||"";if(!this.isPureText(t)){var i=this.whichMimeType(t);if(!i){throw new Error("unknow mimetype!")}t=this.getPureText(t)}if(e===false){return t}return e+this.SPLITOR+t},registMimeTypeProtocol:function(e,t){if(t&&this.SIGN[t]){throw new Error("sing has registed!")}if(e&&!!this.MIMETYPE[e]){throw new Error("mimetype has registed!")}this.SIGN[t]=e;this.MIMETYPE[e]=t},getMimeTypeProtocol:function(e,t){var i=this.MIMETYPE[e]||false;if(t===undefined){return this.process(i)}return this.process(i,t)},getSpitor:function(){return this.SPLITOR},getMimeType:function(e){if(e!==undefined){return this.SIGN[e]||null}return this.MIMETYPE},isPureText:function(e){if(!e)return true;return!~e.indexOf(this.getSpitor())},getPureText:function(e){if(this.isPureText(e)){return e}return e.split(this.getSpitor())[1]},whichMimeType:function(e){if(this.isPureText(e)){return null}return this.getMimeType(e.split(this.getSpitor())[0])}});MWF.xApplication.MinderEditor.Clipboard=new Class({initialize:function(e){this.editor=e;this.minder=e.minder;this.Data=window.kityminder.data;if(!this.minder.supportClipboardEvent||kity.Browser.gecko){return}this.fsm=this.editor.fsm;this.receiver=this.editor.receiver;this.MimeType=this.editor.MimeType;this.kmencode=this.MimeType.getMimeTypeProtocol("application/km");this.decode=this.Data.getRegisterProtocol("json").decode;this._selectedNodes=[];document.addEventListener("copy",this.beforeCopy.bind(this));document.addEventListener("cut",this.beforeCut.bind(this));document.addEventListener("paste",this.beforePaste.bind(this))},encode:function(e){var t=[];for(var i=0,n=e.length;i1){var r;n.sort(function(e,t){return e.getLevel()-t.getLevel()});r=n[0].getLevel();if(r!==n[n.length-1].getLevel()){var s,o,a=0,h=n.length,l=h-1;o=n[l];while(o.getLevel()!==r){a=0;while(a=0;t--){o=this.minder.createNode(null,e);this.minder.importNode(o,s[t]);this._selectedNodes.push(o);e.appendChild(o)}});this.minder.select(this._selectedNodes,true);this._selectedNodes=[];this.minder.refresh()}else if(t.clipboardData&&t.clipboardData.items[0].type.indexOf("image")>-1){}else{r.forEach(function(e){this.minder.Text2Children(e,n)})}e.preventDefault();break}}}}});MWF.xApplication.MinderEditor.Input=new Class({initialize:function(e){this.editor=e;this.fsm=e.fsm;this.minder=e.minder;this.receiver=e.receiver;this.receiverElement=this.receiver.element;this.isGecko=window.kity.Browser.gecko;this.debug=this.editor.debug;this.setupReciverElement();this.setupFsm()},setupFsm:function(){this.fsm.when("* -> input",this.enterInputMode.bind(this));this.fsm.when("input -> *",function(e,t,i){switch(i){case"input-cancel":return this.exitInputMode();case"input-commit":default:return this.commitInputResult()}}.bind(this));this.receiver.onblur(function(e){if(this.fsm.state()=="input"){this.fsm.jump("normal","input-commit")}}.bind(this));this.minder.on("beforemousedown",function(){if(this.fsm.state()=="input"){this.fsm.jump("normal","input-commit")}}.bind(this));this.minder.on("dblclick",function(){if(this.minder.getSelectedNode()&&this.minder._status!=="readonly"){this.editText()}}.bind(this))},setupReciverElement:function(){if(this.debug.flaged){this.receiverElement.classList.add("debug")}this.receiverElement.onmousedown=function(e){e.stopPropagation()};this.minder.on("layoutallfinish viewchange viewchanged selectionchange",function(e){if(e.type=="viewchange"&&this.fsm.state()!="input")return;this.updatePosition()}.bind(this));this.updatePosition()},setupHotbox:function(){hotbox.state("main").button({position:"center",label:"编辑",key:"F2",enable:function(){return minder.queryCommandState("text")!=-1},action:editText})},editText:function(){var e=this.minder.getSelectedNode();if(!e){return}var t=this.receiverElement;this.receiverElement.innerText="";if(e.getData("font-weight")==="bold"){var i=document.createElement("b");t.appendChild(i);t=i}if(e.getData("font-style")==="italic"){var n=document.createElement("i");t.appendChild(n);t=n}t.innerText=this.minder.queryCommandValue("text")||"";if(this.isGecko){this.receiver.fixFFCaretDisappeared()}this.fsm.jump("input","input-request");this.receiver.selectAll()},enterInputMode:function(){var e=this.minder.getSelectedNode();var t=this.receiverElement;if(e){var i=e.getData("font-size")||e.getStyle("font-size");t.style.fontSize=i+"px";t.style.minWidth=0;t.style.minWidth=t.clientWidth+"px";t.style.fontWeight=e.getData("font-weight")||"";t.style.fontStyle=e.getData("font-style")||"";t.classList.add("input");t.focus()}},commitInputText:function(e){var t="";var i="\t",n="\n",r=/\S/,s=" ",o=new RegExp("( |"+String.fromCharCode(160)+")"),a=document.createElement("br");var h=false,l=false;for(var d,c,u,f,m,p=0,v=e.length;ps||Math.abs(n-e.originEvent.clientY)>s)){l=e.originEvent.clientX;d=e.originEvent.clientY-c;if(la-s){this.move("left",s+l-a)}else{u=true}if(dh-s){this.move("top",s+d-h)}else{f=true}if(u&&f){this.move(false)}}if(this.fsm.state()!=="drag"&&o===r&&this.minder.getSelectedNode()&&(Math.abs(i-e.originEvent.clientX)>s||Math.abs(n-e.originEvent.clientY)>s)){if(this.fsm.state()==="hotbox"){}return this.fsm.jump("drag","user-drag")}}.bind(this));window.addEventListener("mouseup",function(){o=t;if(this.fsm.state()==="drag"){this.move(false);return this.fsm.jump("normal","drag-finish")}}.bind(this),false)},setupFsm:function(){this.fsm.when("* -> drag",function(){});this.fsm.when("drag -> *",function(e,t,i){if(i=="drag-finish"){}})},move:function(e,t){if(!e){this.freeHorizen=this.freeVirtical=false;this.frame&&kity.releaseFrame(this.frame);this.frame=null;return}if(!this.frame){this.frame=kity.requestFrame(function(t,i,n){return function(e){switch(t){case"left":n._viewDragger.move({x:-i,y:0},0);break;case"top":n._viewDragger.move({x:0,y:-i},0);break;case"right":n._viewDragger.move({x:i,y:0},0);break;case"bottom":n._viewDragger.move({x:0,y:i},0);break;default:return}e.next()}}(e,t,this.minder))}}});MWF.xApplication.MinderEditor.FSM=new Class({initialize:function(e){this.currentState=e;this.BEFORE_ARROW=" - ";this.AFTER_ARROW=" -> ";this.handlers=[];this.debug=new MWF.xApplication.MinderEditor.Debug("fsm")},jump:function(e,t){if(!t)throw new Error("Please tell fsm the reason to jump");var i=this.currentState;var n=[i,e].concat([].slice.call(arguments,1));var r,s;for(r=0;r {2}",t,i,e);for(r=0;r *"}var i,n,r,s;n=e.split(this.BEFORE_ARROW);if(n.length==2){i="before"}else{n=e.split(this.AFTER_ARROW);if(n.length==2){i="after"}}if(!i)throw new Error("Illegal fsm condition: "+e);r=n[0];s=n[1];t.condition={when:i,exit:r,enter:s};this.handlers.push(t)},handlerConditionMatch:function(e,t,i,n){if(e.when!=t)return false;if(e.enter!="*"&&e.enter!=n)return false;if(e.exit!="*"&&e.exit!=i)return;return true}});MWF.xApplication.MinderEditor.Jumping=function(){var i=this.fsm;var t=this.minder;var n=this.receiver;var e=this.container;var r=n.element;var s=this.hotbox;function o(e){if(e.ctrlKey||e.metaKey||e.altKey)return false;if(e.keyCode>=65&&e.keyCode<=90)return true;if(e.keyCode>=48&&e.keyCode<=57)return true;if(e.keyCode!=108&&e.keyCode>=96&&e.keyCode<=111)return true;if(e.keyCode!=108&&e.keyCode>=96&&e.keyCode<=111)return true;if(e.keyCode==229||e.keyCode===0)return true;return false}n.listen("normal",function(e){n.enable();if(e.is("Space")){e.preventDefault();if(kity.Browser.safari){r.innerHTML=""}return i.jump("hotbox","space-trigger")}switch(e.type){case"keydown":{if(t.getSelectedNode()){if(o(e)){return i.jump("input","user-input")}}else{r.innerHTML=""}i.jump("normal","shortcut-handle",e);break}case"keyup":{break}default:{}}});n.listen("hotbox",function(e){n.disable();e.preventDefault();var t=s.dispatch(e);if(s.state()==Hotbox.STATE_IDLE&&i.state()=="hotbox"){return i.jump("normal","hotbox-idle")}});n.listen("input",function(e){n.enable();if(e.type=="keydown"){if(e.is("Enter")){e.preventDefault();return i.jump("normal","input-commit")}if(e.is("Esc")){e.preventDefault();return i.jump("normal","input-cancel")}if(e.is("Tab")||e.is("Shift + Tab")){e.preventDefault()}}else if(e.type=="keyup"&&e.is("Esc")){e.preventDefault();return i.jump("normal","input-cancel")}});var a,h;var l=2;e.addEventListener("mousedown",function(e){if(e.button==l){e.preventDefault()}if(i.state()=="hotbox"){s.active(Hotbox.STATE_IDLE);i.jump("normal","blur")}else if(i.state()=="normal"&&e.button==l){a=e.clientX;h=e.clientY}},false);e.addEventListener("mousewheel",function(e){if(i.state()=="hotbox"){s.active(Hotbox.STATE_IDLE);i.jump("normal","mousemove-blur")}},false);e.addEventListener("contextmenu",function(e){e.preventDefault()});e.addEventListener("mouseup",function(e){if(i.state()!="normal"){return}if(e.button!=l||e.clientX!=a||e.clientY!=h){return}if(!t.getSelectedNode()){return}i.jump("hotbox","content-menu")},false);s.$element.addEventListener("mousedown",function(e){e.stopPropagation()})};MWF.xApplication.MinderEditor.Receiver=new Class({initialize:function(e){this.editor=e;this.minder=e.minder;this.fsm=e.fsm;var t=this.element=document.createElement("div");t.contentEditable=true;t.setAttribute("tabindex",-1);t.classList.add("receiver");t.onkeydown=t.onkeypress=t.onkeyup=this.dispatchKeyEvent.bind(this);this.editor.contentNode.appendChild(t);this.selectAll();this.minder.on("beforemousedown",this.selectAll.bind(this));this.minder.on("receiverfocus",this.selectAll.bind(this));this.minder.on("readonly",function(){this.minder.disable();this.element.parentElement.removeChild(this.element)}.bind(this));this.listeners=[]},selectAll:function(){if(!this.element.innerHTML)this.element.innerHTML=" ";var e=document.createRange();var t=window.getSelection();e.selectNodeContents(this.element);t.removeAllRanges();t.addRange(e);this.element.focus()},enable:function(){this.element.setAttribute("contenteditable",true)},disable:function(){this.element.setAttribute("contenteditable",false)},fixFFCaretDisappeared:function(){this.element.removeAttribute("contenteditable");this.element.setAttribute("contenteditable","true");this.element.blur();this.element.focus()},onblur:function(e){this.element.onblur=e},listen:function(e,t){if(arguments.length==1){t=e;e="*"}t.notifyState=e;listeners.push(t)},dispatchKeyEvent:function(e){e.is=function(e){var t=e.split("|");for(var i=0;i