UNPKG

canvace

Version:

The Canvace Visual Development Environment.

2 lines 87.1 kB
!function(a,b){function c(){function a(a){var e=c++;return b[e]=a,d++,function(){return b.hasOwnProperty(e)?(delete b[e],d--,!0):!1}}var b={},c=0,d=0;!function(b){for(var c in b)a(b[c])}(arguments),this.add=a,this.forEach=function(a){for(var c in b)if(a(b[c],function(a){return function(){return b.hasOwnProperty(a)?(delete b[a],d--,!0):!1}}(c))===!1)return!0;return!1},this.fastForEach=function(a){for(var c in b)a(b[c])},this.count=function(){return d},this.isEmpty=function(){return!d},this.clear=function(){b={},d=0}}function d(){function a(a,b){b?a.fastForEach(function(a){b(a)}):a.fastForEach(function(a){a()})}var b={},d={};this.registerHandler=function(a,d){return a in b||(b[a]=new c),b[a].add(d)},this.registerTrigger=function(a,b){return a in d||(d[a]=new c),d[a].add(b)},this.fire=function(c,e){if(c in b&&a(b[c],e),c in d){var f=d[c];delete d[c],a(f,e)}},this.fireAll=function(c){var e;for(e in b)a(b[e],c);for(e in d){var f=d[e];delete d[e],a(f,c)}},this.rehash=function(a,c){b[c]=b[a],delete b[a],d[c]=d[a],delete d[a]}}function e(){function a(a,b,d){return b in a||(a[b]=new c),a[b].add(d)}function b(b,c,d){return Array.isArray(c)?function(a){return function(){a.forEach(function(a){a()})}}(c.map(function(c){return a(b,c,d)})):a(b,c,d)}var d={},e={},f=!1,g=!1;window.addEventListener("keydown",function(a){a.keyCode in d&&d[a.keyCode].fastForEach(function(b){b()===!1&&a.preventDefault()})},!1),window.addEventListener("keyup",function(a){a.keyCode in e&&e[a.keyCode].fastForEach(function(b){b()===!1&&a.preventDefault()})},!1),a(d,window.KeyEvent.DOM_VK_SHIFT,function(){f=!0}),a(e,window.KeyEvent.DOM_VK_SHIFT,function(){f=!1}),a(d,window.KeyEvent.DOM_VK_CONTROL,function(){g=!0}),a(e,window.KeyEvent.DOM_VK_CONTROL,function(){f=!1}),this.handleDown=function(a,c){return b(d,a,c)},this.handleUp=function(a,c){return b(e,a,c)},this.isShiftDown=function(){return f},this.isControlDown=function(){return g}}function f(a,b){var c,e,f=new d,g=!1;b.addEventListener("mousedown",function(a){f.fire("start"),g=!0,c=a.clientX,e=a.clientY,a.preventDefault()},!1),b.addEventListener("mousemove",function(b){g&&(a.style.left=a.offsetLeft+b.clientX-c+"px",a.style.top=a.offsetTop+b.clientY-e+"px",c=b.clientX,e=b.clientY,b.preventDefault())},!1),b.addEventListener("mouseup",function(b){g&&(g=!1,b.preventDefault(),f.fire("end",function(b){b(a.offsetLeft,a.offsetTop)}))},!1),this.onDragStart=function(a){return a.registerHandler("start",a)},this.onDragEnd=function(a){return f.registerHandler("end",a)}}function g(){function a(a){function d(a,d,e){c.moveTo(0,0);var f=a*b[0][0]+d*b[0][1]+e*b[0][2],g=a*b[1][0]+d*b[1][1]+e*b[1][2],h=g/f;g>f?f&&h>=-1&&1>=h?c.lineTo(-75,-75*g/f):c.lineTo(75*f/g,75):f&&h>=-1&&1>=h?c.lineTo(75,75*g/f):c.lineTo(-75*f/g,-75)}function e(a,d,e,f,g,h){c.moveTo(a*b[0][0]+d*b[0][1]+e*b[0][2],a*b[1][0]+d*b[1][1]+e*b[1][2]),c.lineTo(f*b[0][0]+g*b[0][1]+h*b[0][2],f*b[1][0]+g*b[1][1]+h*b[1][2])}"undefined"==typeof a&&(a=!0),c.fillRect(-75,-75,150,150),c.beginPath(),c.lineWidth=1,d(1,0,0),d(0,1,0),d(0,0,1),c.stroke(),c.lineWidth=.5,e(0,0,0,1,0,0),e(0,0,0,0,1,0),e(1,0,0,1,1,0),e(0,1,0,1,1,0),e(0,0,1,1,0,1),e(0,0,1,0,1,1),e(1,0,1,1,1,1),e(0,1,1,1,1,1),e(0,0,0,0,0,1),e(1,0,0,1,0,1),e(0,1,0,0,1,1),e(1,1,0,1,1,1),c.stroke(),a&&["i","j","k"].forEach(function(a){var c=Ext.getCmp("projection-gripper-"+a);c.showAt(67+b[0][c.matrixColumn],67+b[1][c.matrixColumn])})}var b=function(a){for(var b=[],c=0;3>c;c++){b[c]=[];for(var d=0;3>d;d++)b[c][d]=a(c,d)}return b}(function(a,b){return parseFloat(Ext.getCmp("matrix-field-"+(a+1)+(b+1)).getValue())}),c=Ext.getDom("projection-canvas").getContext("2d");c.setTransform(1,0,0,1,75,75),c.fillStyle="#FFFFFF",function(a){for(var b=0;3>b;b++)for(var c=0;3>c;c++)Ext.getCmp("matrix-field-"+(b+1)+(c+1)).on("blur",a(b,c))}(function(c,d){return function(){b[c][d]=parseFloat(this.getValue()),a()}}),["i","j","k"].forEach(function(c){Ext.getCmp("projection-gripper-"+c).on("move",function(c){var d=c.getPosition(!0),e=c.matrixColumn;Ext.getCmp("matrix-field-1"+(e+1)).setValue(b[0][e]=-67+d[0]),Ext.getCmp("matrix-field-2"+(e+1)).setValue(b[1][e]=-67+d[1]),a(!1)})}),this.getMatrix=function(){return b},this.update=function(c){for(var d=0;3>d;d++)for(var e=0;3>e;e++)Ext.getCmp("matrix-field-"+(d+1)+(e+1)).setValue(b[d][e]=c[d][e]);a()},a()}function h(a){function b(a,b){if(a.length>=b.length){for(var c in b){var d=!1;for(var e in a)if(b[c]==a[e]){d=!0;break}if(!d)return!1}return!0}return!1}var c={};for(var d in a)for(var e in a[d])a[d][e]in c||(c[a[d][e]]=[]),c[a[d][e]].push(d);var f={},g={};for(var h in c){var i=h,j=[h];for(var k in c)h!=k&&b(c[h],c[k])&&b(c[k],c[h])&&(j.push(k),i+=", "+k,delete c[k]);f[i]=c[h],g[i]=j,delete c[h]}var l={};for(var m in f){l[m]=[];for(var n in f)m!=n&&b(f[n],f[m])&&l[m].push(n)}var o={};!function p(a,c){for(var d in l)if(b(c,l[d])&&b(l[d],c)){var e=c.slice(0);e.push(d),p(a[d]={},e)}}(o,[]),this.Root=function(a){return new function b(a,c,d){var e=d.concat(g[a]||[]);this.getName=function(){return a},this.getLabels=function(){return a in g&&g[a].slice(0)||[]},this.getAllLabels=function(){return e.slice(0)},this.hasChildren=function(){for(var a in c)return function(){}(a),!0;return!1},this.forEachChild=function(a){for(var d in c)a(new b(d,c[d],e))}}(a,o,[])}}function i(a){function b(b,e){c.push(function(){b(function(b){c.shift(),e&&e(b),c.length?c[0]():d&&a()})}),c.length<2&&c[0]()}var c=[],d=!1;this.queue=b,this.get=function(a,c){b(function(b){hb.Ajax.get(a,b)},c)},this.allQueued=function(){d||(d=!0,c.length||a())}}function j(b,c,d){var e=b,f=function(){var a=e[0][0]*e[1][1]*e[2][2]+e[0][1]*e[1][2]*e[2][0]+e[0][2]*e[1][0]*e[2][1]-e[0][2]*e[1][1]*e[2][0]-e[0][1]*e[1][0]*e[2][2]-e[0][0]*e[1][2]*e[2][1];return[[(e[1][1]*e[2][2]-e[2][1]*e[1][2])/a,(e[0][2]*e[2][1]-e[2][2]*e[0][1])/a,(e[0][1]*e[1][2]-e[1][1]*e[0][2])/a],[(e[1][2]*e[2][0]-e[2][2]*e[1][0])/a,(e[0][0]*e[2][2]-e[2][0]*e[0][2])/a,(e[0][2]*e[1][0]-e[1][2]*e[0][0])/a],[(e[1][0]*e[2][1]-e[2][0]*e[1][1])/a,(e[0][1]*e[2][0]-e[2][1]*e[0][0])/a,(e[0][0]*e[1][1]-e[1][0]*e[0][1])/a]]}();this.project=function(a,b,c){return[e[0][0]*a+e[0][1]*b+e[0][2]*c,e[1][0]*a+e[1][1]*b+e[1][2]*c,Math.round(e[2][0]*a+e[2][1]*b+e[2][2]*c)]},this.projectElement=function(a,b,c,d){return[e[0][0]*b+e[0][1]*c+e[0][2]*d+a.offset.x,e[1][0]*b+e[1][1]*c+e[1][2]*d+a.offset.y,Math.round(e[2][0]*b+e[2][1]*c+e[2][2]*d)]},this.unproject=function(a,b,e){var g=(e+f[2][0]*(c-a)+f[2][1]*(d-b))/f[2][2],h=f[0][0]*(a-c)+f[0][1]*(b-d)+f[0][2]*g,i=f[1][0]*(a-c)+f[1][1]*(b-d)+f[1][2]*g;return[h,i,e]},this.getCell=function(a,b,e){var g=(e-f[2][0]*(a-c)-f[2][1]*(b-d))/f[2][2],h=Math.floor(f[0][0]*(a-c)+f[0][1]*(b-d)+f[0][2]*g),i=Math.floor(f[1][0]*(a-c)+f[1][1]*(b-d)+f[1][2]*g);return{i:h,j:i,k:e}},this.getCell2=function(a,b,c,d,e){var g=(c-f[2][0]*(a-d)-f[2][1]*(b-e))/f[2][2],h=Math.floor(f[0][0]*(a-d)+f[0][1]*(b-e)+f[0][2]*g),i=Math.floor(f[1][0]*(a-d)+f[1][1]*(b-e)+f[1][2]*g);return{i:h,j:i,k:c}},this.calculateBoxMetrics=function(){var a=[[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]];return function(b,c,d,f,g,h){f=f||0,g=g||0,h=h||0;var i={left:0,top:0,right:0,bottom:0};return a.forEach(function(a){var j=Math.round(e[0][0]*(a[0]*b-f)+e[0][1]*(a[1]*c-g)+e[0][2]*(a[2]*d-h)),k=Math.round(e[1][0]*(a[0]*b-f)+e[1][1]*(a[1]*c-g)+e[1][2]*(a[2]*d-h));i.left=Math.min(i.left,j),i.top=Math.min(i.top,k),i.right=Math.max(i.right,j),i.bottom=Math.max(i.bottom,k)}),i.width=i.right-i.left+1,i.height=i.bottom-i.top+1,i}}(),a.generateBox=this.generateBox=function(){var a=[[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]];return function(b,c,d,f,g,h){f=f||0,g=g||0,h=h||0;var i=document.createElement("canvas"),j=0,k=0,l=0,m=0;a.forEach(function(a){var i=Math.round(e[0][0]*(a[0]*b-f)+e[0][1]*(a[1]*c-g)+e[0][2]*(a[2]*d-h)),n=Math.round(e[1][0]*(a[0]*b-f)+e[1][1]*(a[1]*c-g)+e[1][2]*(a[2]*d-h));j=Math.min(j,i),k=Math.min(k,n),l=Math.max(l,i),m=Math.max(m,n)}),i.width=l-j+1,i.height=m-k+1;var n=i.getContext("2d");return n.translate(-j,-k),function(a){var e,f,g;for(g=0;d>=g;g++){for(e=0;b>=e;e++)a(e,0,g,e,c,g);for(f=0;c>=f;f++)a(0,f,g,b,f,g)}for(e=0;b>=e;e++)for(f=0;c>=f;f++)a(e,f,0,e,f,d)}(function(a,b,c,d,i,j){n.moveTo(e[0][0]*(a-f)+e[0][1]*(b-g)+e[0][2]*(c-h),e[1][0]*(a-f)+e[1][1]*(b-g)+e[1][2]*(c-h)),n.lineTo(e[0][0]*(d-f)+e[0][1]*(i-g)+e[0][2]*(j-h),e[1][0]*(d-f)+e[1][1]*(i-g)+e[1][2]*(j-h))}),n.stroke(),i}}(),this.generateTileHighlight=function(){var a=document.createElement("canvas"),b=Math.min(0,Math.round(e[0][0]),Math.round(e[0][1]),Math.round(e[0][0]+e[0][1])),c=Math.min(0,Math.round(e[1][0]),Math.round(e[1][1]),Math.round(e[1][0]+e[1][1])),d=Math.max(0,Math.round(e[0][0]),Math.round(e[0][1]),Math.round(e[0][0]+e[0][1])),f=Math.max(0,Math.round(e[1][0]),Math.round(e[1][1]),Math.round(e[1][0]+e[1][1]));a.width=d-b+1,a.height=f-c+1;var g=a.getContext("2d");return g.translate(-b,-c),g.fillStyle="blue",g.globalAlpha=.5,g.lineTo(e[0][0],e[1][0]),g.lineTo(e[0][0]+e[0][1],e[1][0]+e[1][1]),g.lineTo(e[0][1],e[1][1]),g.lineTo(0,0),g.fill(),a},this.getOrigin=function(){return{x:c,y:d}},this.dragBy=function(a,b){c+=a,d+=b},this.dragTo=function(a,b){c=a,d=b}}function k(a){var b=io.connect("/poll/"+a);b.on("disconnect",function(){Ext.MessageBox.show({title:"Error",msg:"Server connection lost.",buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})}),this.poll=function(a,c,d){b.on(a+"/"+c,d)}}function l(a){function b(a){return a?function(b,c){var d;try{d=JSON.parse(c.response.responseText)}catch(e){d=c.response.response}a.call(b,d)}:null}a.errorReader="success";var c=b(a.success);delete a.success;var d=b(a.failure||function(a){Ext.MessageBox.show({title:"Error",msg:a.toString(),buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})});delete a.failure;var e=new Ext.form.Panel(a),f=e.submit;return e.submit=function(a){return e.getForm().isValid()?(a||(a={}),c&&(a.success=c),a.failure=d,f.call(e,a)):void 0},e}function m(a,b){function c(a){function b(b,d){var e=new Ext.form.TextField({fieldLabel:"Name"});return{title:b,layout:"vbox",items:[e,d],buttons:[{text:"Add",handler:function(){var b=e.getValue(),f=a.findChild("name",b);if(f)Ext.MessageBox.show({title:"Error",msg:'The property "'+b+'" already exists do you want to overwrite it?',buttons:Ext.MessageBox.OKCANCEL,icon:Ext.MessageBox.ERROR,fn:function(a){a===Ext.MessageBox.OK&&(f.set("value",d.getValue()),c.close())}});else{var g=d.getValue();"object"!=typeof g||null===g?a.appendChild({expandable:!1,leaf:!0,icon:Ext.BLANK_IMAGE_URL,name:b,value:g,path:a.get("path").concat([b])}).commit():a.appendChild({expandable:!0,expanded:!1,icon:Ext.BLANK_IMAGE_URL,name:b,value:"(object)",path:a.get("path").concat([b])}).commit(),a.commit(),c.close()}}}]}}var c;c=new Ext.window.Window({title:"Add new property",modal:!0,resizable:!1,layout:"accordion",items:[new b("Boolean property",new Ext.form.field.ComboBox({fieldLabel:"Value",store:[[!0,"true"],[!1,"false"]],value:!0,editable:!1})),new b("Numeric property",new Ext.form.NumberField({fieldLabel:"Value",value:0})),new b("String property",new Ext.form.field.TextArea({fieldLabel:"Value"})),new b("Object property",new Ext.create("Darblast.form.field.NullCheckbox",{boxLabel:"Set to null",checked:!1}))],buttons:[{text:"Cancel",handler:function(){c.close()}}]}),c.show()}var d,e=a.add(new Ext.tree.Panel(Ext.Object.merge(b||{},{store:{autoLoad:!0,autoSync:!0,fields:[{name:"name",type:"string"},"value",{name:"path",persist:!1}],proxy:"darblast.properties",root:{expandable:!1,leaf:!1,icon:Ext.BLANK_IMAGE_URL,name:"(no selection)"}},rowLines:!0,columnLines:!0,lines:!1,forceFit:!0,columns:[{xtype:"treecolumn",dataIndex:"name",text:"Name",hideable:!1,sortable:!0,menuDisabled:!0},{dataIndex:"value",text:"Value",hideable:!1,sortable:!1},{xtype:"actioncolumn",hideable:!1,sortable:!1,width:48,items:[{iconCls:"x-add",tooltip:"Add sub-property...",handler:function(a,b,d,e,f,g){new c(g)},isDisabled:function(a,b,c,e,f){return!d||!d.isBound()||f.isLeaf()}},{iconCls:"x-delete",tooltip:"Delete property",handler:function(a,b,c,d,e,f){f.destroy()},isDisabled:function(a,b){return!b}}]}],plugins:[{ptype:"cellediting",clicksToEdit:1,listeners:{beforeedit:function(a,b){if("value"!==b.column.dataIndex||!b.record.isLeaf())return!1;switch(typeof b.record.get("value")){case"boolean":b.column.setEditor({xtype:"combobox",store:[[!0,"true"],[!1,"false"]],editable:!1});break;case"number":b.column.setEditor({xtype:"numberfield",allowOnlyWhitespace:!1});break;case"object":return!1;default:b.column.setEditor({xtype:"textfield"})}},edit:function(a,b){b.record.commit()}}}]}))),f=e.getStore();d=f.getProxy(),this.bind=function(a,b){d.bind(a),f.setRootNode({expandable:!0,expanded:!0,icon:Ext.BLANK_IMAGE_URL,name:b,path:[]})},this.unbind=function(){d.unbind(),f.setRootNode({expandable:!1,leaf:!0,icon:Ext.BLANK_IMAGE_URL,name:"(no selection)"})}}function n(a){function b(a,b,c){function d(){c&&c(g)}var g=new Image;g.addEventListener("load",d,!1),g.addEventListener("error",d,!1),g.src="images/"+a,e[a]=g,f[a]=b}function c(a){if(!(a in e))throw"Invalid image ID: "+a;var b=e[a];this.getId=function(){return a},this.onUpdate=function(b){return j.registerHandler(a,b)},this.onDelete=function(b){return l.registerTrigger(a,b)},this.getImage=function(){return b},this.getLabels=function(){return Ext.Object.merge([],f[a])},this.setLabels=function(b){hb.Ajax.put("images/"+a,{labels:b})},this.hasLabels=function(b){for(var c in b)if(!function(b){for(var c in f[a])if(f[a][c]==b)return!0;return!1}(b[c]))return!1;return!0},this._delete=function(){hb.Ajax._delete("images/"+a)}}var e={},f={},g=new h({}),i=new d,j=new d,k=new d,l=new d;hb.Ajax.get("images/",function(c){var d=0;for(var e in c)d++,b(e,c[e],function(){--d||a&&a()});g=new h(f),d||a&&a()}),hb.poller.poll("images","create",function(a){b(a.id,a.labels,function(){i.fire(0,function(b){b(new c(a.id))})}),g=new h(f),k.fire(0)}),hb.poller.poll("images","update",function(a){b(a.id,a.labels,function(){j.fire(a.id,function(b){b(a.labels)})}),g=new h(f),k.fire(0)}),hb.poller.poll("images","delete",function(a){a.id in e&&(l.fire(a.id),delete e[a.id],delete f[a.id],g=new h(f),k.fire(0))}),this.getHierarchy=function(){return g},this.onCreate=function(a){return i.registerHandler(0,a)},this.get=function(a){if(a in e)return new c(a);throw"Invalid image ID "+a},this.getImage=function(a){if(a in e)return e[a];throw"Invalid image ID "+a},this.forEach=function(a){for(var b in e)a(new c(b))},this.getAllLabels=function(){var a={};for(var b in f)f[b].forEach(function(b){a[b]=!0});var c=[];for(var d in a)c.push(d);return c},this.onHierarchyChange=function(a){return k.registerHandler(0,a)}}function o(){function a(a){var c=a.getId();b.addImage(c,a),a.onDelete(function(){b.removeElement(c)})}var b=new ib("Images",0,!0,"image","images");b.onAddElement(function(a){var b=new Ext.window.Window({title:"Load new images",modal:!0,resizable:!1,layout:"fit",items:new l({url:"images/",method:"POST",layout:{type:"vbox",flex:"stretch"},items:[{xtype:"filefield",name:"images",buttonOnly:!0,buttonText:"Select image files...",allowBlank:!1,listeners:{afterrender:function(){this.fileInputEl.dom.multiple=!0}}},{xtype:"combobox",name:"labels",fieldLabel:"Categories",multiSelect:!0,width:300,store:hb.images.getAllLabels(),value:a}],buttons:[{text:"Load",handler:function(){this.up("form").submit()}},{text:"Cancel",handler:function(){b.close()}}],success:function(){b.close()}})}).show()}),b.onLoadSheet(function(){window.canSplitImages||Ext.MessageBox.show({title:"Additional software needed",msg:"To import image sheets into Canvace you need to install Cairo and restart the environment.<br/>Do you want to open the Cairo website now? (Another browser window will open)",buttons:Ext.MessageBox.YESNO,icon:Ext.MessageBox.INFO,fn:function(a){"yes"===a&&window.open("http://cairographics.org/")}})}),b.onActivateElement(function(a){var b=hb.images.get(a),c=new Ext.window.Window({title:"Edit image",modal:!0,resizable:!1,layout:"fit",items:new l({url:"images/"+a,method:"PUT",layout:{type:"vbox",align:"center"},items:[{xtype:"image",src:"images/"+a,width:100,height:100},{xtype:"combobox",name:"labels",fieldLabel:"Categories",width:300,multiSelect:!0,store:hb.images.getAllLabels(),value:b.getLabels()}],buttons:[{text:"OK",handler:function(){this.up("form").submit()}},{text:"Cancel",handler:function(){c.close()}}],success:function(){c.close()}})}).show()}),b.onDeleteElement(function(a){a.forEach(function(a){hb.images.get(a)._delete()})}),hb.images.forEach(a),hb.images.onCreate(a)}function p(a,b,c){a=!!a;var d=[],e=new Ext.view.View({xtype:"dataview",region:"center",cls:"view",autoScroll:!0,store:{fields:[{name:"id",type:"string"}],data:function(){var a=[];return hb.images.forEach(function(b){a.push({id:b.getId()})}),a}()},tpl:['<tpl for=".">',' <div class="thumb-wrap">',' <div class="thumb"><img src="images/{id}" alt=""></div>'," </div>","</tpl>",'<div class="x-clear"></div>'],multiSelect:a,trackOver:!0,overItemCls:"x-item-over",itemSelector:"div.thumb-wrap",emptyText:"No images",plugins:a?[Ext.create("Ext.ux.DataView.DragSelector",{})]:[],listeners:{selectionchange:function(a,b){d=b.map(function(a){return a.get("id")})}}}),f=e.getStore(),g=new Ext.window.Window({title:a?"Select one or more images":"Select an image",modal:!0,resizable:!0,width:600,height:400,layout:"border",items:[{xtype:"treepanel",region:"west",title:"Categories",header:!1,collapsible:!0,collapsed:!1,split:!0,width:150,allowDeselect:!0,fields:["text","labels"],root:function h(a){var b={text:a.getName(),labels:a.getAllLabels(),expandable:!0,expanded:a.hasChildren(),children:[]};return a.forEachChild(function(a){b.children.push(h(a))}),b}(new(hb.images.getHierarchy().Root)("All categories")),listeners:{selectionchange:function(a,b){if(b.length&&!b[0].isRoot()){var c=b[0].get("labels");f.filterBy(function(a){return hb.images.get(a.get("id")).hasLabels(c)})}else f.clearFilter()}}},e],buttons:[{text:"OK",handler:function(){g.close(),b&&b(d)}},{text:"Cancel",handler:function(){g.close(),c&&c()}}]}).show()}function q(a,b,e){function f(b,c){hb.Ajax.get(a+"/"+b,function(d){var e=new i(function(){c(d)});e.get(a+"/"+b+"/frames/",function(c){d.frames=[],c.forEach(function(c){e.get(a+"/"+b+"/frames/"+c,function(a){var b={frameId:c,imageId:a.id};"duration"in a&&(b.duration=a.duration),d.frames.push(b)})}),e.allQueued()}),e.get(a+"/"+b+"/properties/",function(a){d.properties=a}),e.allQueued()})}function g(a,b){var c=j[a].frames;for(var d in c)if(c[d].frameId==b)return parseInt(d,10)}function h(b){function c(c){this.getFrameId=function(){return c.frameId},this.getImageId=function(){return c.imageId},this.onUpdate=function(a){return p.registerHandler(b+"/"+c.frameId,a)},this.onDelete=function(a){return q.registerTrigger(b+"/"+c.frameId,a)},this.isLast=function(){return!("duration"in c)},this.setLast=function(){hb.Ajax.put(a+"/"+b+"/frames/"+c.frameId,{duration:!1})},this.getDuration=function(){return c.duration},this.setDuration=function(d){hb.Ajax.put(a+"/"+b+"/frames/"+c.frameId,{duration:parseInt(d,10)})},this._delete=function(){hb.Ajax._delete(a+"/"+b+"/frames/"+c.frameId)}}if(!(b in j))throw"Invalid element ID: "+b;b=parseInt(b,10);var d=j[b];this.onUpdate=function(a){return l.registerHandler(b,a)},this.onDelete=function(a){return m.registerTrigger(b,a)},this.getId=function(){return b},this.getOffset=function(){return{x:d.offset.x,y:d.offset.y}},this.getOffsetX=function(){return d.offset.x},this.getOffsetY=function(){return d.offset.y},this.setOffset=function(c,d){hb.Ajax.put(a+"/"+b,{offset:{x:c,y:d}})},this.setOffsetX=function(c){hb.Ajax.put(a+"/"+b,{offset:{x:c,y:d.offset.y}})},this.setOffsetY=function(c){hb.Ajax.put(a+"/"+b,{offset:{x:d.offset.x,y:c}})},this.project=function(a,b,c){return hb.view.projectElement(d,a,b,c)},this.hasFrames=function(){return!!d.frames.length},this.getDimensions=function(){if(d.frames.length){var a=hb.images.getImage(d.frames[0].imageId);return{width:a.width,height:a.height}}return{width:0,height:0}},this.getFirstFrameId=function(){return d.frames.length?d.frames[0].imageId:void 0},this.getFrame=function(a){return new c(d.frames[g(b,a)])},this.forEachFrame=function(a){d.frames.forEach(function(b){a(new c(b))})},this.addFrame=function(c,d){var e={imageId:c};arguments.length>1&&(e.duration=parseInt(d,10)),hb.Ajax.post(a+"/"+b+"/frames/",e)},this.onAddFrame=function(a){return o.registerHandler(b,a)},this.getLabels=function(){var a=[];return d.frames.forEach(function(b){a.push.apply(a,hb.images.get(b.imageId).getLabels())}),a},this.hasLabels=function(a){for(var b in a)if(!function(){for(var c in d.frames)if(function(c){for(var d in c)if(c[d]==a[b])return!0;return!1}(hb.images.get(d.frames[c].imageId).getLabels()))return!0;return!1}())return!1;return!0},this.getProperties=function(){return Ext.merge({},d.properties)},this.getProperty=function(a){return d.properties[a]},this.putProperty=function(c,d,e){hb.Ajax.put(a+"/"+b+"/properties/"+c,{value:d},e)},this.deleteProperty=function(c,d){hb.Ajax._delete(a+"/"+b+"/properties/"+c,d)},this.onPutProperty=function(a){return r.registerHandler(b,a)},this.onDeleteProperty=function(a){return s.registerHandler(b,a)},this._delete=function(c){hb.Ajax._delete(a+"/"+b,{force:!!c})}}var j={};hb.Ajax.get(a+"/",function(a){var b=new i(e);a.forEach(function(a){b.queue(function(b){f(a,function(c){j[a]=c,b()})})}),b.allQueued()});var k=new d,l=new d,m=new d,n=new c,o=new d,p=new d,q=new d,r=new d,s=new d;hb.poller.poll(a,"create",function(a){var c=a.id;f(c,function(a){j[c]=a,k.fire(0,function(a){a(new b(h,c,j[c]))})})}),hb.poller.poll(a,"update",function(a){var c=a.id;if(c in j){var d={};for(var e in a.descriptor)j[c][e]=a.descriptor[e],d[e]=!0;l.fire(c,function(a){a(d)})}else f(c,function(a){j[c]=a,k.fire(0,function(a){a(new b(h,c,j[c]))})})}),hb.poller.poll(a,"delete",function(a){n.fastForEach(function(b){b(a.id)}),m.fire(a.id),delete j[a.id]}),hb.poller.poll(a+"/frames","create",function(a){var b={frameId:a.frameId,imageId:a.imageId};"duration"in a&&(b.duration=a.duration),j[a.id].frames.push(b),o.fire(a.id,function(b){b(a.frameId)}),j[a.id].frames.length<2&&l.fire(a.id,function(a){a({firstFrameId:!0})})}),hb.poller.poll(a+"/frames","update",function(a){var b=j[a.id].frames,c=g(a.id,a.frameId);c<b.length&&("duration"in a?b[c].duration=a.duration:delete b[c].duration,p.fire(a.id+"/"+a.frameId),c||l.fire(a.id,function(a){a({firstFrameId:!0})}))}),hb.poller.poll(a+"/frames","delete",function(a){var b=g(a.id,a.frameId);j[a.id].frames.splice(b,1),q.fire(a.id+"/"+a.frameId),b||l.fire(a.id,function(a){a({firstFrameId:!0})})}),hb.poller.poll(a+"/properties","put",function(a){j[a.id].properties[a.name]=a.value,r.fire(a.id,function(b){b(a.name,a.value)})}),hb.poller.poll(a+"/properties","delete",function(a){delete j[a.id].properties[a.name],s.fire(a.id,function(b){b(a.name)})}),this.onCreate=function(a){return k.registerHandler(0,a)},this.onDelete=n.add,this.get=function(a){if(a in j)return new b(h,a,j[a]);throw"Internal error: invalid element ID "+a},this.forEach=function(a){for(var c in j)a(new b(h,c,j[c]))},this.forEachWithLabels=function(a,c){for(var d in j){var e=new b(h,d,j[d]);e.hasLabels(a)&&c(e)}}}function r(a){var b=new Ext.view.View({cls:"view",autoScroll:!0,multiSelect:!0,trackOver:!0,overItemCls:"x-item-over",width:300,height:200,resizable:{pinned:!0,handles:"e s se"},store:{autoSync:!0,fields:["frame",{name:"frameId",type:"int"},{name:"imageId",type:"string"},{name:"index",type:"int"}],sortOnLoad:!0,sorters:["frameId"],data:function(){var b=[];return a.forEachFrame(function(a){b.push({frame:a,frameId:a.getFrameId(),imageId:a.getImageId()})}),b}()},tpl:['<tpl for=".">',' <div class="thumb-wrap">',' <div class="thumb">',' <img src="/images/{imageId}" alt="{frameId}"/>'," </div>"," </div>","</tpl>",'<div class="x-clear"></div>'],itemSelector:"div.thumb-wrap",emptyText:"No frames",plugins:[Ext.create("Ext.ux.DataView.DragSelector",{})]}),c=b.getStore();return a.onAddFrame(function(b){var d=a.getFrame(b),e=c.add({frame:d,frameId:d.getFrameId(),imageId:d.getImageId()})[0];d.onDelete(function(){e.destroy()})}),a.forEachFrame(function(a){a.onDelete(function(){var b=c.findRecord("frameId",a.getFrameId());b&&b.destroy()})}),{title:"Frames",layout:"hbox",items:[{xtype:"container",layout:{type:"vbox",align:"stretch"},items:[b,{xtype:"toolbar",items:[{text:"Add frame",iconCls:"x-add",handler:function(){new p(!1,function(b){b.length&&a.addFrame(b[0],100)})}},{text:"Remove selected",iconCls:"x-delete",disabled:!0,handler:function(){b.getSelectionModel().getSelection().forEach(function(a){a.get("frame")._delete()})},listeners:{render:function(){var a=this;b.on("selectionchange",function(b,c){c.length?a.enable():a.disable()})}}}]}]},{xtype:"container",layout:"vbox",items:[function(){var a=null;return{xtype:"numberfield",fieldLabel:"Duration",disabled:!0,minValue:0,value:100,listeners:{render:function(){var c=this;b.on("selectionchange",function(b,d){1!=d.length?(a=null,c.setValue(100),c.disable()):(a=d[0].get("frame"),a.isLast()?(c.setValue(100),c.disable()):(c.enable(),c.setValue(a.getDuration())))})},change:function(b,c){a&&a.setDuration(c)}}}}(),{xtype:"checkbox",boxLabel:"Loop animation",checked:function(){var b=!1;return a.forEachFrame(function(a){b=!a.isLast()}),b}(),listeners:{change:function(b,c){var d=null;a.forEachFrame(function(a){a.isLast()&&a.setDuration(100),d=a}),!c&&d&&d.setLast()}}}]}]}}function s(a){var b=a.getLayout(),c=hb.view.calculateBoxMetrics(b.span.i,b.span.j,1,b.ref.i,b.ref.j,0),d=hb.view.generateBox(b.span.i,b.span.j,1,b.ref.i,b.ref.j,0);d.style.position="absolute",d.style.left=c.left+"px",d.style.top=c.top+"px";var e=null,g=function(){};return{title:"Positioning",layout:"hbox",items:[{xtype:"container",layout:"fit",width:250,height:250,resizable:{pinned:!0,handles:"e s se"},items:{xtype:"box",autoEl:{tag:"div",style:"position: relative; left: 0px; top: 0px; overflow: hidden",children:[{tag:"div",cls:"position-schema-reference",style:"position: absolute; left: 50%; top: 50%",children:[{tag:"div",cls:"position-schema-target",style:"position: absolute; left: "+a.getOffsetX()+"px; top: "+a.getOffsetY()+"px; opacity: 0.5",children:function(b){var c=[];return a.forEachFrame(function(a){var d=Ext.id(),e={id:d};a.isLast()||(e.duration=a.getDuration()),c.push(e),b.push({tag:"img",id:d,style:"display: none",src:"/images/"+a.getImageId()})}),g=function d(){c.forEach(function(a){Ext.get(a.id).setDisplayed("none")});var a=!1;return c.length&&function b(d){var e=Ext.get(c[d].id);e.setDisplayed("inline"),!a&&"duration"in c[d]&&setTimeout(function(){e.setDisplayed("none"),b((d+1)%c.length)},c[d].duration)}(0),g=function(){return a=!0,g=d,!1},!0},b}([])}]},{tag:"div",cls:"position-schema-handle",style:"position: absolute; left: 0px; top: 0px; width: 100%; height: 100%"}]}}},{xtype:"container",layout:"vbox",items:[{xtype:"numberfield",fieldLabel:"X",value:a.getOffsetX(),listeners:{render:function(){var b=this;a.onUpdate(function(){b.setValue(a.getOffsetX())})},change:function(b,c,d){c!=d&&a.setOffsetX(parseFloat(c))}}},{xtype:"numberfield",fieldLabel:"Y",value:a.getOffsetY(),listeners:{render:function(){var b=this;a.onUpdate(function(){b.setValue(a.getOffsetY())})},change:function(b,c,d){c!=d&&a.setOffsetY(parseFloat(c))}}},{xtype:"checkbox",boxLabel:"Transparency",checked:!0,listeners:{change:function(a,b){e.setOpacity(b?.5:1)}}},{xtype:"checkbox",boxLabel:"Animate",checked:!0,listeners:{change:function(a,b){g()!=b&&g()}}},{xtype:"button",text:"Update",handler:function(){a.updateAfterReposition()}}]}],listeners:{render:function(b){var c=b.getEl();c.down(".position-schema-reference").insertFirst(d),e=c.down(".position-schema-reference .position-schema-target"),new f(e.dom,c.down(".position-schema-handle").dom).onDragEnd(a.setOffset),a.onUpdate(function(b){b.offset&&e.setStyle({left:a.getOffsetX()+"px",top:a.getOffsetY()+"px"})}),g()}}}}function t(a){function b(a,b,c){b=parseInt(b,10),a.call(this,b),this.isStatic=function(){return c.static},this.setStatic=function(a){var c={};c.static=!!a,hb.Ajax.put("tiles/"+b,c)},this.isSolid=function(){return c.solid},this.setSolid=function(a){hb.Ajax.put("tiles/"+b,{solid:!!a})},this.getLayout=function(){return Ext.Object.merge({},c.layout)},this.updateAfterReposition=function(){hb.array.updateRepositionedTile(b),hb.renderer.render()}}q.call(this,"tiles",b,a),this.create=function(a,b,c,d,e,f){var g={layout:{ref:{i:parseInt(c,10),j:parseInt(d,10)},span:{i:parseInt(a,10),j:parseInt(b,10)}}};arguments.length>4&&(g.firstFrameId=e,g.offset=f),hb.Ajax.post("tiles/",g)}}function u(){function a(a){var c=a.getId();b.addElement(c,a),a.onDelete(function(){b.removeElement(c)})}var b=new ib("Tiles",1,!1,"tile","tiles");b.onAddElement(function(){var a=new Darblast.ux.TileSchema,b=new Ext.window.Window({title:"Create new tile",modal:!0,resizable:!1,layout:"fit",items:{layout:"vbox",items:[{xtype:"numberfield",fieldLabel:"I span",minValue:1,value:1,listeners:{change:function(b,c){var d=a.getSpan();a.setSpan(c,d.j)}}},{xtype:"numberfield",fieldLabel:"J span",minValue:1,value:1,listeners:{change:function(b,c){var d=a.getSpan();a.setSpan(d.i,c)}}},a]},buttons:[{text:"OK",handler:function(){var c=a.getSpan(),d=a.getCell();hb.tiles.create(c.i,c.j,d.i,d.j),b.close()}},{text:"Cancel",handler:function(){b.close()}}]}).show()}),b.onLoadSheet(function(){var a=[],b={x:0,y:0},c=new Ext.window.Window({title:"Create many tiles",modal:!0,resizable:!1,layout:"vbox",items:[{xtype:"button",text:"Select images...",handler:function(){new p(!0,function(b){a=b})}},{xtype:"numberfield",fieldLabel:"Offset X",value:0,listeners:{change:function(a,c){b.x=c}}},{xtype:"numberfield",fieldLabel:"Offset Y",value:0,listeners:{change:function(a,c){b.y=c}}}],buttons:[{text:"OK",handler:function(){c.close(),a.forEach(function(a){hb.tiles.create(1,1,0,0,a,b)})}},{text:"Cancel",handler:function(){c.close()}}]}).show()}),b.onActivateElement(function(a){var b=hb.tiles.get(a),c=new Ext.window.Window({title:"Tile configuration",modal:!0,resizable:!0,width:600,height:350,layout:"fit",items:{xtype:"tabpanel",layout:"fit",items:[{title:"General",layout:"vbox",items:[{xtype:"checkboxwithtooltip",boxLabel:"Solid",checked:b.isSolid(),tooltip:"Indicates whether entities with physics enabled collide with this tile",listeners:{change:function(a,c){b.setSolid(c)}}},{xtype:"checkboxwithtooltip",boxLabel:"Static",checked:b.isStatic(),tooltip:"Indicates that this tile never changes in the map during the game",listeners:{change:function(a,c){b.setStatic(c)}}}]},new r(b),new s(b),{id:"tile-properties-tab",title:"Properties",layout:"fit"}]},buttons:[{text:"Close",handler:function(){c.close()}}]});new m(Ext.getCmp("tile-properties-tab")).bind(b,"Tile "+a),c.show()}),b.onDeleteElement(function(a,b){a.forEach(function(a){hb.tiles.get(a)._delete(b)})}),hb.tiles.forEach(a),hb.tiles.onCreate(a),this.hasSelection=b.hasSelection,this.getSelectedId=b.getSelectedId,this.getSelectedIds=b.getSelectedIds,this.onSelectionChange=b.onSelectionChange}function v(a){function b(a,b,c){b=parseInt(b,10),a.call(this,b),this.hasPhysics=function(){return c.hasPhysics},this.setPhysics=function(a){hb.Ajax.put("entities/"+b,{hasPhysics:!!a})},this.getBoundingBox=function(){Ext.Object.merge({},c.box)},this.setBoundingBox=function(a){hb.Ajax.put("entities/"+b,{box:{i0:parseFloat(a.i0),j0:parseFloat(a.j0),iSpan:parseFloat(a.iSpan),jSpan:parseFloat(a.jSpan)}})},this.getLayout=function(){return{span:{i:1,j:1},ref:{i:0,j:0}}},this.updateAfterReposition=function(){hb.instances.updateRepositionedEntity(b),hb.renderer.render()}}q.call(this,"entities",b,a),this.create=function(a,b){arguments.length?hb.Ajax.post("entities/",{offset:b,firstFrameId:a}):hb.Ajax.post("entities/")}}function w(){function a(a){var c=a.getId();b.addElement(c,a),a.onDelete(function(){b.removeElement(c)})}var b=new ib("Entities",2,!1,"entity","entities");b.onAddElement(function(){hb.entities.create()}),b.onLoadSheet(function(){var a=[],b={x:0,y:0},c=new Ext.window.Window({title:"Create many entities",modal:!0,resizable:!1,layout:"vbox",items:[{xtype:"button",text:"Select images...",handler:function(){new p(!0,function(b){a=b })}},{xtype:"numberfield",fieldLabel:"Offset X",value:0,listeners:{change:function(a,c){b.x=c}}},{xtype:"numberfield",fieldLabel:"Offset Y",value:0,listeners:{change:function(a,c){b.y=c}}}],buttons:[{text:"OK",handler:function(){c.close(),a.forEach(function(a){hb.entities.create(a,b)})}},{text:"Cancel",handler:function(){c.close()}}]}).show()}),b.onActivateElement(function(a){var b=hb.entities.get(a),c=new Ext.window.Window({title:"Entity configuration",modal:!0,resizable:!0,width:600,height:350,layout:"fit",items:[{xtype:"tabpanel",layout:"fit",items:[new r(b),new s(b),{title:"Physics",layout:"vbox",items:{xtype:"checkboxwithtooltip",boxLabel:"Enable physics",checked:b.hasPhysics(),tooltip:"Enables default AABB physics",listeners:{change:function(a,c){b.setPhysics(c)}}}},{id:"entity-properties-tab",title:"Properties",layout:"fit"}]}],buttons:[{text:"Close",handler:function(){c.close()}}]});new m(Ext.getCmp("entity-properties-tab")).bind(b,"Entity "+a),c.show()}),b.onDeleteElement(function(a,b){a.forEach(function(a){hb.entities.get(a)._delete(b)})}),hb.entities.forEach(a),hb.entities.onCreate(a),this.hasSelection=b.hasSelection,this.getSelectedId=b.getSelectedId,this.getSelectedIds=b.getSelectedIds,this.onSelectionChange=b.onSelectionChange}function x(a){function b(a){if(!(a in e))throw"Invalid stage ID: "+a;var b=e[a];j.registerHandler(a,function(b){a=b}),this.getName=this.getId=function(){return a},this.rename=function(b,c){hb.Ajax.put("/stages/"+a+"/id",{newId:b},c)},this.isCurrent=function(){return a===c},this.onLoad=function(b){return g.registerHandler(a,b)},this.onUnload=function(b){return h.registerHandler(a,b)},this.onRename=function(b){return j.registerHandler(a,b)},this.onDelete=function(b){return k.registerTrigger(a,b)},this.load=function(b){hb.Ajax.get("stages/"+a,function(d){"undefined"!=typeof c&&h.fire(c),c=a,g.fire(a),b&&b(d)})},this.save=function(b,c){hb.Ajax.put("stages/"+a,{x0:b.x0,y0:b.y0,map:b.map,marks:b.marks,instances:b.instances},c)},this.getProperties=function(){return Ext.merge({},b)},this.getProperty=function(a){return b[a]},this.putProperty=function(b,c,d){hb.Ajax.put("stages/"+a+"/properties/"+b,{value:c},d)},this.deleteProperty=function(b,c){hb.Ajax._delete("stages/"+a+"/properties/"+b,c)},this.onPutProperty=function(b){return l.registerHandler(a,b)},this.onDeleteProperty=function(b){return m.registerHandler(a,b)},this._delete=function(b){hb.Ajax._delete("stages/"+a,b)}}var c,e={};hb.Ajax.get("stages/",function(b){var c=new i(a);b.forEach(function(a){c.get("stages/"+a+"/properties/",function(b){e[a]=b})}),c.allQueued()});var f=new d,g=new d,h=new d,j=new d,k=new d,l=new d,m=new d;hb.poller.poll("stages","create",function(a){hb.Ajax.get("stages/"+a.id+"/properties/",function(b){e[a.id]=b,f.fire(0,function(b){b(a.id)})})}),hb.poller.poll("stages","rename",function(a){e[a.newId]=e[a.oldId],delete e[a.oldId],f.rehash(a.oldId,a.newId),j.rehash(a.oldId,a.newId),k.rehash(a.oldId,a.newId),l.rehash(a.oldId,a.newId),m.rehash(a.oldId,a.newId),c===a.oldId&&(c=a.newId),j.fire(a.newId,function(b){b(a.newId)})}),hb.poller.poll("stages","delete",function(a){k.fire(a.id),delete e[a.id]}),hb.poller.poll("stages/properties","put",function(a){e[a.id][a.name]=a.value,l.fire(a.id,function(b){b(a.name,a.value)})}),hb.poller.poll("stages/properties","delete",function(a){delete e[a.id][a.name],m.fire(a.id,function(b){b(a.name)})}),this.get=function(a){return new b(a)},this.create=function(a){hb.Ajax.post("stages/",{name:a})},this.onCreate=function(a){return f.registerHandler(0,a)},this.forEach=function(a){for(var c in e)a(new b(c))},this.getCurrent=function(){return"undefined"!=typeof c?new b(c):void 0}}function y(){function a(a){var b,c=a.getId();b=a.isCurrent()?f.appendChild({id:c,text:c+" (current stage)",cls:"bold",leaf:!0}):f.appendChild({id:c,text:c,leaf:!0,href:"/?stage="+encodeURIComponent(c)}),a.onLoad(function(){b.set({href:"",text:c+" (current stage)",cls:"bold"}),b.commit()}),a.onUnload(function(){b.set({text:c,href:"/?stage="+encodeURIComponent(c)}),b.commit()}),a.onRename(function(c){a.isCurrent()||b.set("href","/?stage="+encodeURIComponent(c)),a.isCurrent()?b.set("text",c+" (current stage)"):b.set("text",c),b.commit()}),a.onDelete(function(){f.removeChild(b)})}var b=Ext.getCmp("stage-controls"),c=new m(b,{region:"south",split:!0,collapsible:!0,title:"Properties",height:300}),d=new Ext.grid.plugin.CellEditing({clicksToEdit:2,listeners:{beforeedit:function(a,b){if(!b.rowIdx)return!1;var c=b.record,d=hb.stages.get(c.get("id"));c.set("text",d.getId()),c.commit()},edit:function(a,b){var c=b.record,d=c.get("id"),e=c.get("text");if(e!=d)hb.stages.get(b.record.get("id")).rename(b.record.get("text"));else{var f=hb.stages.get(d);f.isCurrent()&&c.set("text",f.getId()+" (current stage)"),c.commit()}},canceledit:function(a,b){var c=b.record,d=hb.stages.get(c.get("id"));d.isCurrent()&&c.set("text",d.getId()+" (current stage)"),c.commit()}}}),e=new Ext.tree.Panel({region:"center",autoScroll:!0,tbar:{xtype:"toolbar",items:[{iconCls:"x-add",tooltip:"New stage...",handler:function(){Ext.MessageBox.prompt("Create new stage","Enter a new stage name:",function(a,b){"ok"===a&&hb.stages.create(b)})}},{icon:"/resources/images/icons/application_get.png",tooltip:"Load stage",handler:function(){var a=e.getSelectionModel().getSelection();a.length&&!a[0].isRoot()&&(window.location="/?stage="+encodeURIComponent(a[0].get("id")))}},{iconCls:"x-edit",tooltip:"Rename stage",handler:function(){var a=e.getSelectionModel().getSelection();a.length&&!a[0].isRoot()&&d.startEdit(a[0],0)}},{iconCls:"x-delete",tooltip:"Delete stage...",handler:function(){var a=e.getSelectionModel().getSelection();a.length&&!a[0].isRoot()&&Ext.MessageBox.show({title:"Confirm stage deletion",msg:"Do you actually want to permanently delete the stages "+function(a){var b=a.pop();return a.length?a.join(", ")+" and "+b:b}(a.map(function(a){return'"'+a.get("id")+'"'}))+" and all of their associated data?",buttons:Ext.MessageBox.OKCANCEL,icon:Ext.MessageBox.WARNING,fn:function(b){"ok"===b&&a.forEach(function(a){hb.stages.get(a.get("id"))._delete()})}})}}]},forceFit:!0,columns:[{xtype:"treecolumn",dataIndex:"text",resizable:!1,hideable:!1,draggable:!1,sortable:!0,flex:1,editor:"textfield"}],store:{sortOnLoad:!0,sorters:["text"]},rowLines:!1,columnLines:!1,lines:!0,hideHeaders:!0,root:{text:"Current project",expandable:!0,expanded:!0},listeners:{selectionchange:function(a,b){if(b.length&&!b[0].isRoot()){var d=hb.stages.get(b[0].get("id"));c.bind(d,d.getId())}else c.unbind()}},plugins:[d]}),f=e.getRootNode();hb.stages.forEach(a),hb.stages.onCreate(function(b){a(hb.stages.get(b))}),b.add(e)}function z(a,b){function d(){var a={},b=0,d=0;this.add=function(e,f,g,h,i){return b=Math.min(b,e[2]),d=Math.max(d,e[2]),a[e[2]]||(a[e[2]]=new c),a[e[2]].add({x:e[0],y:e[1],k:f,id:g,width:h,height:i})},this.forEach=function(c){for(var e=b;d>=e;e++)e in a&&a[e].fastForEach(c)}}function e(c,e,g,h){function i(a,b){f[a]||(f[a]={}),f[a][b]||(f[a][b]=new d),m.push(f[a][b].add(j,g,k,l.width,l.height))}if(!h.hasFrames())return function(){};var j=h.project(c,e,g),k=h.getFirstFrameId(),l=h.getDimensions(),m=[];return function(){var c=Math.floor(j[1]/b),d=Math.floor(j[0]/a);i(c-1,d-1),i(c-1,d),i(c,d-1),i(c,d);var e=h.getDimensions(),f=Math.floor((j[1]+e.height)/b),g=Math.floor((j[0]+e.width)/a);f>c&&(i(c+1,d-1),i(c+1,d)),g>d&&(i(c-1,d+1),i(c,d+1)),f>c&&g>d&&i(c+1,d+1)}(),function(){for(var a in m)m[a]();return!0}}var f={},g={};this.addTile=function(a,b,c,d){g[c]||(g[c]={}),g[c][a]||(g[c][a]={}),g[c][a][b]=function(d){return function(){return d(),delete g[c][a][b],!0}}(e(a,b,c,d))},this.eraseTile=function(a,b,c){return g[c]&&g[c][a]&&g[c][a][b]&&g[c][a][b]()||!1},this.addEntity=e,this.forEach=function(c,d,e){var g=Math.floor(-d/b);if(f[g]){var h=Math.floor(-c/a),i=f[g][h];i&&i.forEach(function(f){f.x<-c+a&&f.y<-d+b&&f.x+f.width>=-c&&f.y+f.height>=-d&&e(f)})}}}function A(a,b){function c(c,e){for(var f in d)for(var g in d[f])"number"==typeof d[f][g][c]&&hb.buckets.eraseTile(f,g,a),d[f][g][e]!==!1?("number"==typeof d[f][g][e]&&hb.buckets.addTile(f,g,a,hb.tiles.get(d[f][g][e])),b[a][f][g]=d[f][g][e]):delete b[a][f][g]}var d={};this.put=function(c,e,f){c in d||(d[c]={}),e in d[c]?d[c][e].to=f:d[c][e]={from:b[a][c][e],to:f}},this.erase=function(c,e){c in d||(d[c]={}),e in d[c]?d[c][e].to=!1:e in b[a][c]&&(d[c][e]={from:b[a][c][e],to:!1})},this.isNull=function(){for(var a in d)for(var b in d[a])if(d[a][b].from!==d[a][b].to)return!1;return!0},this.apply=function(){c("from","to")},this.reverse=function(){c("to","from")}}function B(){function a(){var a={},b=-1,c=-1,d=-1;this.record=function(d){for(var e=c;e>b;e--)delete a[e];a[c=++b]=d},this.canUndo=function(){return b>=0},this.canRedo=function(){return c>b},this.undo=function(){return b>=0?(a[b--].reverse(),!0):!1},this.redo=function(){return c>b?(a[++b].action(),!0):!1},this.erase=function(){a={},b=-1,c=-1,d=-1},this.bookmark=function(){d=b},this.isBookmark=function(){return d==b}}function b(a){e.record(a),f.fire(0,function(a){a(!0)}),g.fire(0,function(a){a(!1)})}var c=this,e=new a,f=new d,g=new d;this.record=b,this.nest=function(b,d){var e=new a,h=c.record;c.record=e.record;try{b.call(d)}finally{h({action:function(){for(;e.redo(););},reverse:function(){for(;e.undo(););}}),c.record=h,f.fire(0,function(a){a(!0)}),g.fire(0,function(a){a(!1)})}},this.canUndo=e.canUndo,this.canRedo=e.canRedo,this.onCanUndo=function(a){return f.registerHandler(0,a)},this.onCanRedo=function(a){return g.registerHandler(0,a)},this.undo=function(){e.undo()&&(f.fire(0,function(a){a(e.canUndo())}),g.fire(0,function(a){a(!0)}))},this.redo=function(){e.redo()&&(f.fire(0,function(a){a(!0)}),g.fire(0,function(a){a(e.canRedo())}))},this.erase=function(){e.erase(),f.fire(0,function(a){a(!1)}),g.fire(0,function(a){a(!1)})},this.isDirty=function(){return!e.isBookmark()},this.clearDirty=e.bookmark}function C(a){function b(a,b,c,d){if(c in e&&a in e[c]&&b in e[c][a]){if("number"!=typeof e[c][a][b]){var f=e[c][a][b];a=f.i,b=f.j}for(var g=hb.tiles.get(e[c][a][b]).getLayout(),h=a-g.ref.i;h<a-g.ref.i+g.span.i;h++)for(var i=b-g.ref.j;i<b-g.ref.j+g.span.j;i++)d&&d.erase(h,i),delete e[c][h][i]}hb.buckets.eraseTile(a,b,c)}function c(a,c,d,j,k){function l(a,c,j){a in e[d]||(e[d][a]={}),c in e[d][a]&&b(a,c,d,k),k&&k.put(a,c,j),e[d][a][c]=j,f=Math.min(f,a),g=Math.max(g,a),h=Math.min(h,c),i=Math.max(i,c)}j=parseInt(j,10),d in e||(e[d]={}),l(a,c,j);for(var m=hb.tiles.get(j),n={i:a,j:c},o=m.getLayout(),p=a-o.ref.i;p<a-o.ref.i+o.span.i;p++)for(var q=c-o.ref.j;q<c-o.ref.j+o.span.j;q++)(a!=p||c!=q)&&l(p,q,n);hb.buckets.addTile(a,c,d,m)}function d(a,b){var c=new A(a,e);b(c),c.isNull()||hb.history.record({action:c.apply,reverse:c.reverse})}var e={},f=0,g=0,h=0,i=0;for(var j in a){j=parseInt(j,10);for(var k in a[j]){k=parseInt(k,10);for(var l in a[j][k])l=parseInt(l,10),c(k,l,j,a[j][k][l])}}hb.tiles.onDelete(function(c){var d=!1;for(var e in a){e=parseInt(e,10);for(var f in a[e]){f=parseInt(f,10);for(var g in a[e][f])g=parseInt(g,10),a[e][f][g]===c&&(b(f,g,e),d=!0)}}d&&(hb.history.erase(),hb.renderer.render())}),this.get=function(a,b,c){return c in e&&a in e[c]&&b in e[c][a]?"number"!=typeof e[c][a][b]?Ext.Object.merge({},e[c][a][b]):e[c][a][b]:!1},this.getTileCountForLayer=function(a){if(a in e){var b=0;for(var c in e[a])for(var d in e[a][c])"number"==typeof e[a][c][d]&&b++;return b}return 0},this.set=function(a,b,e,f){d(e,function(d){c(a,b,e,f,d)})},this.erase=function(a,c,e){d(e,function(d){b(a,c,e,d)})},this.eraseLayer=function(a){a in e&&d(a,function(c){for(var d in e[a])for(var f in e[a][d])b(d,f,a,c)})},this.updateRepositionedTile=function(a){var b=hb.tiles.get(a);for(var c in e){c=parseInt(c,10);for(var d in e[c]){d=parseInt(d,10);for(var f in e[c][d])f=parseInt(f,10),e[c][d][f]===a&&(hb.buckets.eraseTile(d,f,c),hb.buckets.addTile(d,f,c,b))}}},this.forEachLayer=function(a){for(var b in e)a(parseInt(b,10))},this.forEach=function(a){for(var b in e){b=parseInt(b,10);for(var c in e[b]){c=parseInt(c,10);for(var d in e[b][c])d=parseInt(d,10),"number"==typeof e[b][c][d]&&a(c,d,b,e[b][c][d])}}},this.forEachInLayer=function(a,b){if(a in e)for(var c in e[a]){c=parseInt(c,10);for(var d in e[a][c])d=parseInt(d,10),"number"==typeof e[a][c][d]&&b(c,d,e[a][c][d])}},this.floodLayer=function(a,b,c,d){function j(b,c){return b in e[a]&&c in e[a][b]?"number"!=typeof e[a][b][c]?e[a][e[a][b][c].i][e[a][b][c].j]:e[a][b][c]:!1}function k(a,b,c,d){c>=f&&g>=c&&d>=h&&i>=d&&(j(a,b)!==j(c,d)||m(c,d)||(k(c,d,c+1,d),k(c,d,c-1,d),k(c,d,c,d+1),k(c,d,c,d-1)))}if(a in e){var l={},m=function(a,b){return a in l||(l[a]={}),b in l[a]?!0:(l[a][b]=!0,!1)};k(b,c,b,c),function(){for(var a in l)for(var b in l[a])d(parseInt(a,10),parseInt(b,10))}()}}}function D(a){function b(b){if(!(b in a))throw"Invalid instance ID: "+b;b=parseInt(b,10);var c=a[b],d={i:c.i,j:c.j,k:c.k};this.getId=function(){return b},this.getEntity=function(){return hb.entities.get(c.id)},this.getPosition=function(){return{i:c.i,j:c.j,k:c.k}},this.setPosition=function(a,b,e,f){function g(a,b,d){c.erase(),c.i=a,c.j=b,c.k=d,c.erase=hb.buckets.addEntity(a,b,d,hb.entities.get(c.id))}g(a,b,e),f||(function(a,b,c,d,e,f){hb.history.record({action:function(){g(d,e,f)},reverse:function(){g(a,b,c)}})}(d.i,d.j,d.k,a,b,e),d={i:a,j:b,k:e})},this._delete=function(){b in a&&(delete a[b],c.erase(),hb.history.record({action:function(){delete a[b],c.erase()},reverse:function(){c.erase=hb.buckets.addEntity(c.i,c.j,c.k,hb.entities.get(c.id)),a[b]=c}}))}}var c=0;!function(){for(var b in a){b=parseInt(b,10),b>=c&&(c=b+1);var d=a[b];d.erase=hb.buckets.addEntity(d.i,d.j,d.k,hb.entities.get(d.id))}}(),hb.entities.onDelete(function(b){var c=!1;for(var d in a)if(a[d].id==b){var e=a[d];delete a[d],e.erase(),c=!0}c&&(hb.history.erase(),hb.renderer.render())}),this.add=function(b,d,e,f){var g={id:f,i:b,j:d,k:e,erase:hb.buckets.addEntity(b,d,e,hb.entities.get(f))},h=c++;a[h]=g,hb.history.record({action:function(){g.erase=hb.buckets.addEntity(b,d,e,hb.entities.get(f)),a[h]=g},reverse:function(){delete a[h],g.erase()}})},this.pick=function(c,d){!function(){var a=hb.view.getOrigin();c-=a.x,d-=a.y}();var e=!1,f=!1;for(var g in a){var h=a[g],i=hb.entities.get(h.id),j=i.project(h.i,h.j,h.k),k=i.getDimensions();c>=j[0]&&d>=j[1]&&c<=j[0]+k.width&&d<=j[1]+k.height&&(f===!1||j[2]>f)&&(f=j[2],e=new b(g))}return e},this.forEach=function(c){for(var d in a)c(new b(d))},this.updateRepositionedEntity=function(b){var c=hb.entities.get(b);for(var d in a){var e=a[d];e.erase(),e.erase=hb.buckets.addEntity(e.i,e.j,e.k,c)}}}function E(){var a,b,d,e={},f=new c;!function(){var c=!0;hb.array.forEachLayer(function(e){c?(d=a=b=e,c=!1):(d=a=Math.min(a,e),b=Math.max(b,e))}),c&&(d=a=b=0)}(),this.addAbove=function(a){a(++b),d=b,f.fastForEach(function(a){a(d)})},this.addBelow=function(b){b(--a),d=a,f.fastForEach(function(a){a(d)})},this.forEach=function(c){for(var d=a;b>=d;d++)c(d)},this.erase=function(c){hb.array.eraseLayer(c),delete e[c];var g=!1;return a!=b&&(c==a?(a++,g=!0):c==b&&(b--,g=!0),d=Math.min(d,a),d=Math.max(d,b),f.fastForEach(function(a){a(d)})),g},this.select=function(a){d=a,f.fastForEach(function(a){a(d)})},this.getSelected=function(){return d},this.onSelect=f.add,this.toggle=function(a,b){e[a]=!b},this.isOn=function(a){return!e[a]}}function F(){var a,b=new Ext.grid.Panel({header:!1,hideHeaders:!0,store:{autoSync:!0,fields:[{name:"index",type:"int"},{name:"text",type:"string"},{name:"enabled",type:"boolean"}],sorters:[{property:"index",direction:"DESC"}]},columns:[{xtype:"checkcolumn",flex:1,dataIndex:"enabled",draggable:!1,hideable:!1,sortable:!1,listeners:{checkchange:function(b,c,d){hb.layers.toggle(a.getAt(c).get("index"),d),hb.renderer.render()}}},{flex:4,dataIndex:"text",draggable:!1,hideable:!1,sortable:!1},{xtype:"actioncolumn",flex:1,draggable:!1,hideable:!1,iconCls:"x-delete",tooltip:"Erase layer",handler:function(a,b,c,d,e,f){hb.layers.erase(f.get("index"))&&f.destroy(),hb.renderer.render()}}],forceFit:!0,tbar:[{icon:"/resources/images/icons/page_white_get.png",tooltip:"Add layer atop",handler:function(){hb.layers.addAbove(function(b){a.add({index:b,text:"Layer "+b,enabled:!0})}),hb.renderer.render()}},{icon:"/resources/images/icons/page_white_put.png",tooltip:"Add layer beneath",handler:function(){hb.layers.addBelow(function(b){a.add({index:b,text:"Layer "+b,enabled:!0})}),hb.renderer.render()}},{icon:"/resources/images/icons/layers.png",tooltip:"Toggle layer transparency",enableToggle:!0,pressed:!0,listeners:{toggle:function(a,b){hb.renderer.toggleTransparency(b)}}},{icon:"/resources/images/icons/grid_toggle.png",tooltip:"Toggle grid",enableToggle:!0,pressed:!0,listeners:{toggle:function(a,b){hb.renderer.toggleGrid(b)}}}],listeners:{selectionchange:function(a,b){b.length&&(hb.layers.select(b[0].get("index")),hb.renderer.render())}}});a=b.getStore(),hb.layers.forEach(function(b){a.add({index:b,text:"Layer "+b,enabled:hb.layers.isOn(b)})}),Ext.getCmp("layer-controls").add(b)}function G(){function a(){var a={};this.addFragment=function(b,c){function d(b,c){return a[b]||(a[b]={}),a[b][c]?!1:a[b][c]=!0}var e=hb.layers.getSelected(),f={},g=hb.array.get(b,c,e);if(g!==!1){var h;"number"!=typeof g?(b=g.i,c=g.j,h=hb.tiles.get(hb.array.get(b,c,e)).getLayout()):h=hb.tiles.get(g).getLayout();var i=b-h.ref.i,j=c-h.ref.j;for(b=i;b<i+h.span.i;b++)for(c=j;c<j+h.span.j;c++)d(b,c)&&(b in f||(f[b]={}),f[b][c]=!0);return f}return d(b,c)&&(f[b]={},f[b][c]=!0),f},this.addFragments=function(b){var c={};for(var d in b){a[d]||(a[d]={});for(var e in b[d])a[d][e]||(a[d][e]=!0,d in c||(c[d]={}),c[d][e]=!0)}return c},this.removeFragments=function(b){var c={};for(var d in b)if(a[d])for(var e in b[d])a[d][e]&&(delete a[d][e],d in c||(c[d]={}),c[d][e]=!0);return c},this.clear=function(){var