function HexToR(a){return parseInt((cutHex(a)).substring(0,2),16)}function HexToG(a){return parseInt((cutHex(a)).substring(2,4),16)}function HexToB(a){return parseInt((cutHex(a)).substring(4,6),16)}function cutHex(a){return(a.charAt(0)=="#")?a.substring(1,7):a}function ConvertHsvRgb(i,o,m){if(i<0){i+=360}var e=Math.floor(i/60)%6;var k=i/60-Math.floor(i/60);var d=m*(1-o);var c=m*(1-k*o);var n=m*(1-(1-k)*o);var a,j,l;switch(e){case 0:a=m;j=n;l=d;break;case 1:a=c;j=m;l=d;break;case 2:a=d;j=m;l=n;break;case 3:a=d;j=c;l=m;break;case 4:a=n;j=d;l=m;break;case 5:a=m;j=d;l=c;break}return{r:a,g:j,b:l,a:1}}function ConvertRgbHsv(k,j,c){var i,f,d;var a=Math.max(k,j,c);var e=Math.min(k,j,c);if(a===e){i=0}else{if(a===k){i=(60*(j-c)/(a-e)+360)%360}else{if(a===j){i=60*(c-k)/(a-e)+120}else{if(a===c){i=60*(k-j)/(a-e)+240}}}}if(a===0){f=0}else{f=1-e/a}d=a;return{h:i,s:f,v:d,a:1}}var CssColours={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function ColourWheel(u){this.div=document.createElement("div");this.canvas=document.createElement("canvas");this.width=u;this.height=u;this.canvas.width=this.width;this.canvas.height=this.height;this.ctx=this.canvas.getContext("2d");this.div.appendChild(this.canvas);this.outer=this.height;this.inner=this.height*0.8;if(ColourWheel[u]){this.data=ColourWheel[u]}else{var j=this.ctx.getImageData(0,0,this.outer,this.outer);var c=this.outer/2;var g=this.inner/2;var k;var o;for(var m=0;m<this.outer;m++){var t=Math.sqrt(c*c-(m-c)*(m-c));var i=Math.floor(-t+c);var f=Math.floor(t+c);var e;var n;var l=g*g-(m-c)*(m-c);if(l>=0){t=Math.sqrt(l);var h=Math.floor(-t+c);var d=Math.floor(t+c);e=m*this.outer*4+i*4;for(n=i;n<=h;n++){o=Math.atan2(m-c,n-c);k=ConvertHsvRgb(o/Math.PI*180,1,1);j.data[e++]=k.r*255;j.data[e++]=k.g*255;j.data[e++]=k.b*255;j.data[e++]=255}e=m*this.outer*4+d*4;for(n=d;n<=f;n++){o=Math.atan2(m-c,n-c);k=ConvertHsvRgb(o/Math.PI*180,1,1);j.data[e++]=k.r*255;j.data[e++]=k.g*255;j.data[e++]=k.b*255;j.data[e++]=255}}else{e=m*this.outer*4+i*4;for(n=i;n<=f;n++){o=Math.atan2(m-c,n-c);k=ConvertHsvRgb(o/Math.PI*180,1,1);j.data[e++]=k.r*255;j.data[e++]=k.g*255;j.data[e++]=k.b*255;j.data[e++]=255}}}this.data=j;ColourWheel[u]=j}this.hsv={h:20,s:1,v:1,a:1};this.rgb=ConvertHsvRgb(this.hsv.h,this.hsv.s,this.hsv.v);this.update();this.draw();var q=this;q.buttonDown=false;q.mouseArea="";$(this.canvas).mousedown(function(b){var p=$(q.canvas).offset();var a=(b.pageX-p.left);var r=(b.pageY-p.top);q.buttonDown=true;q.calcClick(a,r)});$(this.canvas).mousemove(function(b){if(q.buttonDown){var p=$(q.canvas).offset();var a=(b.pageX-p.left);var r=(b.pageY-p.top);q.calcClick(a,r)}});$(window).mouseup(function(a){q.buttonDown=false;q.mouseArea=""})}ColourWheel.prototype={setFromColour:function(d){if(d in CssColours){d=CssColours[d]}var h=/\#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])/i;var f,e,c;var a=h.exec(d);if(a!==null){f=parseInt(a[1],16)/255;e=parseInt(a[2],16)/255;c=parseInt(a[3],16)/255}else{f=0;e=1;c=1}this.hsv=ConvertRgbHsv(f,e,c);this.rgb.r=f;this.rgb.g=e;this.rgb.b=c;this.draw();this.update()},update:function(){function a(d){var c=Math.round(d*255).toString(16);if(c.length===1){c="0"+c}return c}var b="#"+a(this.rgb.r)+a(this.rgb.g)+a(this.rgb.b);if(this.onUpdate){this.onUpdate(b)}},draw:function(){this.ctx.save();this.ctx.lineWidth=1;this.ctx.fillStyle="rgb(128, 128, 128)";this.ctx.fillRect(0,0,this.width,this.height);this.ctx.putImageData(this.data,0,0);var e=this.hsv.h/180*Math.PI;this.ctx.beginPath();var k={x:Math.cos(e)*this.inner/2+this.outer/2,y:Math.sin(e)*this.inner/2+this.outer/2};var j={x:Math.cos(e+2*Math.PI/3)*this.inner/2+this.outer/2,y:Math.sin(e+2*Math.PI/3)*this.inner/2+this.outer/2};var g={x:Math.cos(e+4*Math.PI/3)*this.inner/2+this.outer/2,y:Math.sin(e+4*Math.PI/3)*this.inner/2+this.outer/2};var c={x:Math.cos(e)*this.outer/2+this.outer/2,y:Math.sin(e)*this.outer/2+this.outer/2};var h={x:j.x+(g.x-j.x)/2,y:j.y+(g.y-j.y)/2};this.ctx.moveTo(k.x,k.y);this.ctx.lineTo(j.x,j.y);this.ctx.lineTo(g.x,g.y);this.ctx.lineTo(k.x,k.y);this.ctx.fillStyle=this.ctx.createLinearGradient(j.x,j.y,g.x,g.y);this.ctx.fillStyle.addColorStop(0,"#ffffff");this.ctx.fillStyle.addColorStop(1,"#000000");this.ctx.fill();this.ctx.fillStyle=this.ctx.createLinearGradient(k.x,k.y,h.x,h.y);var b=ConvertHsvRgb(this.hsv.h,1,1);b.a=1;this.ctx.fillStyle.addColorStop(0,this.rgbToString(b));b.a=0;this.ctx.fillStyle.addColorStop(1,this.rgbToString(b));this.ctx.fill();this.strokeStyle="#000000";this.ctx.beginPath();this.ctx.moveTo(k.x,k.y);this.ctx.lineTo(c.x,c.y);this.ctx.stroke();var f,d,i;i=1-this.hsv.v;f=this.hsv.s*k.x+i*g.x+(1-this.hsv.s-i)*j.x;d=this.hsv.s*k.y+i*g.y+(1-this.hsv.s-i)*j.y;this.ctx.beginPath();this.ctx.arc(f,d,4,0,2*Math.PI,false);this.ctx.stroke();this.ctx.restore();this.p1=k;this.p2=j;this.p3=g;this.mid=h;this.rgb=ConvertHsvRgb(this.hsv.h,this.hsv.s,this.hsv.v);this.rgb.a=this.hsv.a},rgbToString:function(a){return"rgba("+Math.round(a.r*255)+","+Math.round(a.g*255)+","+Math.round(a.b*255)+","+a.a+")"},calcClick:function(g,e){var c=Math.sqrt((g-this.outer/2)*(g-this.outer/2)+(e-this.outer/2)*(e-this.outer/2));if(this.mouseArea==="ring"||this.mouseArea!=="triangle"&&c>=this.inner/2&&c<=this.outer/2){var f=Math.atan2(this.outer/2-e,this.outer/2-g);this.hsv.h=f/Math.PI*180+180;this.mouseArea="ring"}else{var b,l,k;var d;var j=this.p1;var i=this.p2;var h=this.p3;d=(j.x-h.x)*(i.y-h.y)-(i.x-h.x)*(j.y-h.y);b=((i.y-h.y)*(g-h.x)-(i.x-h.x)*(e-h.y))/d;l=(-(j.y-h.y)*(g-h.x)+(j.x-h.x)*(e-h.y))/d;k=1-b-l;this.hsv.s=Math.min(Math.max(b,0),1);this.hsv.v=1-Math.min(Math.max(k,0),1);this.mouseArea="triangle"}this.draw();this.update()}};var gDrawApp=null;function LoadFile(a){gDrawApp.drawView.doc.root=Loader(a);gDrawApp.drawView.update()}function radToDeg(a){return(a*180)/Math.PI}function degToRad(a){return(a*Math.PI)/180}function splitQueryString(e){var g={};var l=e.split("?");var d=l[l.length-1].split("&");for(var k=0;k<d.length;k++){var h=d[k].split("=");if(h[0]){try{if(h.length>1){if(window.decodeURIComponent){g[h[0].toLowerCase()]=decodeURIComponent(h[1].replace(/\+/g," "))}else{g[h[0].toLowerCase()]=unescape(h[1])}}else{g[h[0].toLowerCase()]=""}}catch(j){}}}return g}function DrawApp(divId){var self=this;this.undoStack=new UndoStack();this.div=document.getElementById(divId);var toolbar=new Toolbar();toolbar.addButton("/content/draw/icons/square.png",function(){self.newRect()});toolbar.addButton("/content/draw/icons/circle.png",function(){self.newCircle()});toolbar.addButton("/content/draw/icons/curve_lines.png",function(){self.lineTool()});toolbar.addButton("/content/draw/icons/curve_bezier.png",function(){self.curveTool()});toolbar.addButton("/content/draw/icons/parallelogram.png",function(){self.newParallelogram(300,300,200,50,60)});toolbar.addButton("/content/draw/icons/rhombus.png",function(){self.newRhombus(300,300,200,30)});toolbar.addButton("/content/draw/icons/trapezoid.png",function(){self.newTrapezoid(300,300,200,50,60,60)});toolbar.addButton("/content/draw/icons/text.png",function(){self.newText()});this.div.appendChild(toolbar.div);this.canvas=$("<canvas id='canvasDraw' width='700' tabindex='1' height='400'>")[0];this.canvas.style.borderColor="black";this.canvas.style.borderWidth="2px";this.canvas.style.borderStyle="solid";this.canvas.style.cssFloat="left";this.panel=new PropertyPanel();this.drawView=new DrawView(this.canvas,this.undoStack,this.panel);this.div.appendChild(this.canvas);this.div.appendChild(this.panel.div);this.div.appendChild(document.createElement("br"));this.hasFocus=false;gDrawApp=this;var query=splitQueryString(window.location.href);if("drawdoc" in query){var saved;try{saved=eval("("+query.drawdoc+")")}catch(e){alert("Error loading drawing.");return}this.drawView.doc.root=Loader(saved);this.drawView.update()}}DrawApp.prototype={undo:function(){if(this.undoStack.canUndo()){this.undoStack.undo();this.drawView.update()}},redo:function(){if(this.undoStack.canRedo()){this.undoStack.redo();this.drawView.update()}},updateView:function(a){this.undoStack.execute(new NewNodeAction(this.drawView.doc.root,a));this.drawView.update()},newRect:function(){var a=new PathNode(10,10);a.lineTo(110,10);a.lineTo(110,110);a.lineTo(10,110);a.lineTo(10,10);a.close();this.updateView(a)},newCircle:function(){var a=new PathNode(50,0);a.cornerTo(100,0,100,50);a.cornerTo(100,100,50,100);a.cornerTo(0,100,0,50);a.cornerTo(0,0,50,0);a.close();this.updateView(a)},newTrapezoid:function(b,i,d,f,e,c){var g=new PathNode(b,i,close);g.lineTo(b+d,i);g.lineTo(b+d-f/Math.tan(degToRad(c)),i-f);g.lineTo(b+f/Math.tan(degToRad(e)),i-f);g.lineTo(b,i);g.close();this.updateView(g)},newParallelogram:function(b,g,c,d,f){var e=new PathNode(b,g,close);e.lineTo(b+c,g);e.lineTo(b+c+d/Math.tan(degToRad(f)),g-d);e.lineTo(b+d/Math.tan(degToRad(f)),g-d);e.lineTo(b,g);e.close();this.updateView(e)},newRhombus:function(c,h,d,f){var b=d*Math.cos(degToRad(f));var g=d*Math.sin(degToRad(f));var e=new PathNode(c,h,close);e.lineTo(c+b,h+g);e.lineTo(c+2*b,h);e.lineTo(c+b,h-g);e.lineTo(c,h);e.close();this.updateView(e)},newText:function(){this.undoStack.execute(new NewNodeAction(this.drawView.doc.root,new TextNode("Lorum ipsum dolor")));this.drawView.update()},lineTool:function(){this.drawView.lineTool()},curveTool:function(){this.drawView.curveTool()},saveToLink:function(){var i=json(this.drawView.doc.root.save());var e="javascript:LoadFile("+i+")";var g=document.createElement("div");$(g).css("position","absolute").css("width","600px").css("height","300px");g.style.border="3px dashed blue";g.style.background="white";g.style.padding="10px";var d=document.createElement("img");d.src="wd-disk.png";d.style.cssFloat="left";g.appendChild(d);var f=document.createElement("h1");f.style.fontFamily="Tahoma";f.style.color="orange";f.appendChild(document.createTextNode("Save to link"));g.appendChild(f);var h=document.createElement("p");h.appendChild(document.createTextNode("To complete the save, bookmark the link below. When you want to retrieve it, open the bookmark after you come back to this page."));h.style.fontFamily="Tahoma";g.appendChild(h);var b=document.createElement("a");b.href=e;b.appendChild(document.createTextNode("Drawing saved on "+(new Date()).toLocaleDateString()));g.appendChild(b);d=document.createElement("img");d.src="wd-done.png";var c=this;$(d).click(function(){c.div.removeChild(g)});h=document.createElement("p");h.appendChild(d);g.appendChild(h);this.div.appendChild(g);return}};var nodes={type:"Node",matrix:{m11:1,m12:0,m21:0,m22:1,dx:0,dy:0},strokeStyle:"#000000",fillStyle:"#ffffff",lineWidth:2,children:[]};(function(){var a=false;this.Class=function(){};this.Class.prototype.init=function(){};Class.extend=function(e){a=true;var d=new this();a=false;d._super=this.prototype;for(var c in e){if(1){d[c]=e[c]}}function b(){if(!a&&this.init){this.init.apply(this,arguments)}}b.prototype=d;b.constructor=b;b.extend=arguments.callee;return b}})();function json(d){if(d===undefined){return"undefined"}switch(typeof d){case"string":return'"'+d+'"';case"number":case"boolean":case"null":return String(d);case"object":var c=[];if(d==="null"){return"null"}if(Object.prototype.toString.apply(d)==="[object Array]"){for(var b=0;b<d.length;b++){c.push(json(d[b]))}return"["+c.join(",")+"]"}for(var a in d){if(1){c.push(a+":"+json(d[a]))}}return"{"+c.join(",")+"}";default:throw"Error: can't json type "+typeof d}}function Loader(a){var b=new window[a.type]();b.load(a);return b}var Node=Class.extend({init:function(){this.id=Node.NextNodeId++;this.rect=new Rect(0,0,1,1);this.matrix=new IdentityMatrix();this.strokeStyle="#000000";this.fillStyle="#ffffff";this.lineWidth=2;this.parent=null;this.children=[]},properties:[{name:"fillStyle",display:"Kolor tla",type:"colour"},{name:"strokeStyle",display:"Kolor krawedzi",type:"colour"},{name:"lineWidth",display:"Grubosc pisaka",type:"select",values:[{name:"Zero",value:0},{name:"Olowek",value:1},{name:"Dlugopis",value:2},{name:"Marker",value:4}]}],getPropertyList:function(){var c=[];var b=[];var d=this;while(d._super!==undefined){if(d.properties){c.unshift(d.properties)}d=d._super}for(var a=0;a<c.length;a++){b=b.concat(c[a])}return b},save:function(){var b={};b.type="Node";b.matrix=this.matrix.save();b.strokeStyle=this.strokeStyle;b.fillStyle=this.fillStyle;b.lineWidth=this.lineWidth;b.children=[];for(var a=0;a<this.children.length;a++){b.children.push(this.children[a].save())}return b},load:function(b){this.matrix=IdentityMatrix.load(b.matrix);this.strokeStyle=b.strokeStyle;this.fillStyle=b.fillStyle;this.lineWidth=b.lineWidth;this.children.length=0;for(var a=0;a<b.children.length;a++){var c=Loader(b.children[a]);c.parent=this;this.children.push(c)}},duplicate:function(){var a=Loader(this.save());a.format();return a},hittest:function(b,d){for(var c=0;c<this.children.length;c++){var a=this.children[c].hittest(b,d);if(a){return a}}return null},canResize:function(){return true},edit:function(){},format:function(){for(var a=0;a<this.children.length;a++){this.children[a].format()}},transform:function(a){this.matrix=a.multiply(this.matrix);this.format()},draw:function(a){for(var b=this.children.length-1;b>=0;b--){this.children[b].draw(a)}},findParent:function(c){var a;for(var b=0;b<this.children.length;b++){if(this.children[b]===c){return this}a=this.children[b].findParent(c);if(a){return a}}return null},addChild:function(b,a){this.children.splice(a,0,b);b.parent=this},removeChild:function(b){for(var a=0;a<this.children.length;a++){if(this.children[a]===b){this.children.splice(a,1);b.parent=null;return a}}return -1},hasEditMode:function(){return false},fixate:function(){},hitTestEditHandle:function(a,b){return null},drawEditHandles:function(a){},moveEditHandle:function(b,a,c){}});Node.NextNodeId=1;function ImagePollFunction(){if(ImagePollFunction.node){ImagePollFunction.node.onImageLoaded()}}ImagePollFunction.node=null;var TextNode=Node.extend({init:function(a){this._super.init.apply(this);this.image=document.createElement("img");this.fillStyle="#000000";this.fontName="FG Virgil";this.textWidth=100;this.textHeight=15;this.fontSize=20;this.rect=new Rect(0,0,this.textWidth,this.textHeight);this.sequence=0;this.complete=false;if(a!==undefined){this.text=a;this.getImage()}},load:function(a){this._super.load.apply(this,[a]);this.fontName=a.fontName;this.fontSize=a.fontSize;this.text=a.text},save:function(){var a=this._super.save.apply(this);a.type="TextNode";a.text=this.text;a.fontName=this.fontName;a.fontSize=this.fontSize;return a},properties:[{name:"text",display:"Text",type:"text"},{name:"fontSize",display:"Wielkosc czcionki",type:"select",values:[{name:"10",value:10},{name:"12",value:12},{name:"15",value:15},{name:"20",value:20},{name:"30",value:30},{name:"40",value:40},{name:"50",value:50},{name:"60",value:60}]},{name:"fontName",display:"Font",type:"select",values:[{name:"FG Virgil",value:"FG Virgil"},{name:"Arial",value:"Arial"},{name:"Times New Roman",value:"Times New Roman"},{name:"Stinky Kitty",value:"Stinky Kitty"},{name:"FG Bunnigrrrl",value:"FG Bunnigrrrl's handwriting"},{name:"FG Amura",value:"FG Amura"}]}],hittest:function(a,b){if(a>=this.rect.x&&a<this.rect.x+this.rect.width&&b>=this.rect.y&&b<this.rect.y+this.rect.height){return this}else{return null}},getImage:function(){this.fontSizeUsed=this.fontSize;this.textUsed=this.text;this.fontNameUsed=this.fontName;this.fillUsed=this.fillStyle;this.strokeUsed=this.strokeStyle;this.lineWidthUsed=this.lineWidth;this.complete=false;var a=this;this.image=new Image();this.sequence+=1;this.image.sequence=this.sequence;$(this.image).load(function(){if(this.sequence===a.sequence){a.onImageLoaded()}});this.image.src=$.ajax({url:"/draw_text/?font_name="+this.fontName+"&font_size="+this.fontSize+"&text="+encodeURIComponent(this.text)+"&font_color="+HexToR(this.fillStyle)+","+HexToG(this.fillStyle)+","+HexToB(this.fillStyle),async:false}).responseText;return false},onImageLoaded:function(){if(!this.image.complete){ImagePollFunction.node=this;setTimeout(ImagePollFunction,250)}this.complete=true;this.format();gDrawView.calcSelection();gDrawView.draw()},format:function(){if(this.fontSizeUsed!==this.fontSize||this.textUsed!==this.text||this.fontNameUsed!==this.fontName||this.fillUsed!=this.fillStyle||this.strokeUsed!=this.strokeStyle||this.lineWidthUsed!=this.lineWidth){if(!this.getImage()){return}}if(this.image.complete){this.textWidth=this.image.width;this.textHeight=this.image.height}var a=this.matrix.apply(0,0);var c=this.matrix.apply(this.textWidth,0);var b=this.matrix.apply(this.textWidth,this.textHeight);var d=this.matrix.apply(0,this.textHeight);this.rect.x=a.x;this.rect.y=a.y;this.rect.width=0;this.rect.height=0;this.rect.unionPoint(c.x,c.y);this.rect.unionPoint(b.x,b.y);this.rect.unionPoint(d.x,d.y)},draw:function(a){a.save();a.transform(this.matrix.m11,this.matrix.m21,this.matrix.m12,this.matrix.m22,this.matrix.dx,this.matrix.dy);if(this.image.complete){a.drawImage(this.image,0,0)}else{a.strokeStyle="#008888";a.lineWidth=1;a.beginPath();a.moveTo(0,0);a.lineTo(this.textWidth,this.textHeight);a.moveTo(this.textWidth,0);a.lineTo(0,this.textHeight);a.rect(0,0,this.textWidth,this.textHeight);a.stroke()}a.restore()},edit:function(){var a=prompt("Please enter text.",this.text);if(a!=this.text){this.text=a;this.getImage()}}});var PathNode=Node.extend({LINE:1,CURVE:2,CORNER:3,KAPPA:0.5522847498,properties:[],init:function(a,b){this._super.init.apply(this);this.startX=a;this.startY=b;this.tx=a;this.ty=b;this.segments=[];this.smoothness=0.3;this.sloppiness=0;this.closed=false;this.points=[];this.shadow=false},load:function(d){this._super.load.apply(this,[d]);this.startX=d.startX;this.startY=d.startY;this.smoothness=d.smoothness;this.sloppiness=d.sloppiness;this.closed=d.closed;this.segments.length=0;this.shadow=d.shadow;for(var c=0;c<d.segments.length;c++){var b=d.segments[c];var a={};a.type=b.type;a.x=b.x;a.y=b.y;if(b.r!==undefined){a.r=b.r}if(b.x1!==undefined){a.x1=b.x1;a.y1=b.y1}this.segments.push(a)}},save:function(){var d=this._super.save.apply(this);d.type="PathNode";d.startX=this.startX;d.startY=this.startY;d.smoothness=this.smoothness;d.sloppiness=this.sloppiness;d.closed=this.closed;d.segments=[];d.shadow=this.shadow;for(var c=0;c<this.segments.length;c++){var a=this.segments[c];var b={};b.type=a.type;if(a.type===this.LINE){b.x=a.x;b.y=a.y;b.r=a.r}else{if(a.type===this.CURVE){b.x=a.x;b.y=a.y}else{if(a.type===this.CORNER){b.x=a.x;b.y=a.y;b.x1=a.x1;b.y1=a.y1;b.r=a.r}}}d.segments.push(b)}return d},clear:function(){this.segments.length=0;this.closed=false;this.points.length=0},getPointCount:function(){return this.segments.length+1},getPointByIndex:function(a){if(a===0){return{x:this.tx,y:this.ty}}else{return{x:this.segments[a-1].tx,y:this.segments[a-1].ty}}},removePoint:function(a){if(a===0){alert("error")}this.segments.splice(a-1,1)},lineTo:function(a,b){this.segments.push({type:this.LINE,x:a,y:b,c1x:0,c1y:0,c2x:0,c2y:0,r:[Math.random(),Math.random(),Math.random(),Math.random()]})},curveTo:function(a,b){this.segments.push({type:this.CURVE,x:a,y:b,c1x:0,c1y:0,c2x:0,c2y:0,length:0})},cornerTo:function(b,d,a,c){this.segments.push({type:this.CORNER,x1:b,y1:d,x:a,y:c,c1x:0,c1y:0,c2x:0,c2y:0,r:[Math.random()-0.5,Math.random()-0.5,Math.random()-0.5,Math.random()-0.5]})},format:function(){var b=this.matrix.apply(this.startX,this.startY);this.tx=b.x;this.ty=b.y;var a=b.x;var f=b.y;var e=null;var c;this.rect.x=a;this.rect.y=f;this.rect.width=0;this.rect.height=0;if(this.closed&&this.segments.length>0){c=this.segments[this.segments.length-1];c.x=this.startX;c.y=this.startY}for(var d=0;d<this.segments.length;d++){c=this.segments[d];if(c.type===this.LINE){this.formatLine(e,a,f,c)}else{if(c.type===this.CURVE){this.formatCurve(e,a,f,c)}else{if(c.type===this.CORNER){this.formatCorner(e,a,f,c)}}}e=c;a=c.tx;f=c.ty;this.rect.unionPoint(a,f)}this.points.length=0},close:function(){this.closed=true},autoclose:function(){var b=this.segments[this.segments.length-1];var a=Math.sqrt((b.x-this.startX)*(b.x-this.startX)+(b.y-this.startY)*(b.y-this.startY));if(a<=8){this.close()}},draw:function(b){var c;b.save();b.lineWidth=this.lineWidth;b.strokeStyle=this.strokeStyle;b.fillStyle=this.fillStyle;if(this.shadow){b.shadowOffsetX=3;b.shadowOffsetY=3;b.shadowBlur=5;b.shadowColor="rgba(0,0,0,0.5)"}b.beginPath();b.moveTo(this.tx,this.ty);if(0){this.calcPoints();for(c=0;c<this.points.length;c++){b.lineTo(this.points[c].x,this.points[c].y)}}else{for(c=0;c<this.segments.length;c++){var a=this.segments[c];b.bezierCurveTo(a.c1x,a.c1y,a.c2x,a.c2y,a.tx,a.ty)}}if(this.closed){b.fill();b.shadowColor="rgba(0,0,0,0)"}b.stroke();b.restore()},hasEditMode:function(){return true},hitTestEditHandle:function(a,e){var d=8;if(a>=this.tx-d&&a<this.tx+d&&e>=this.ty-d&&e<this.ty+d){return 0}var b=this.closed?this.segments.length-1:this.segments.length;for(var c=0;c<b;c++){if(a>=this.segments[c].tx-d&&a<this.segments[c].tx+d&&e>=this.segments[c].ty-d&&e<this.segments[c].ty+d){return c+1}}return null},moveEditHandle:function(b,a,c){if(b===0){this.startX=a;this.startY=c}else{this.segments[b-1].x=a;this.segments[b-1].y=c}this.format()},drawEditHandles:function(a){a.save();a.lineWidth=1;a.strokeStyle="#0050B7";a.strokeRect(this.tx-4,this.ty-4,8,8);var b=this.segments.length;if(this.closed){b-=1}for(var c=0;c<b;c++){a.strokeRect(this.segments[c].tx-4,this.segments[c].ty-4,8,8)}a.restore()},formatCorner:function(b,g,f,c){var i=this.matrix.apply(c.x,c.y);c.tx=i.x;c.ty=i.y;i=this.matrix.apply(c.x1,c.y1);var a=i.x;var d=i.y;var h=Math.sqrt((a-g)*(a-g)+(d-f)*(d-f));var e=Math.sqrt((a-c.tx)*(a-c.tx)+(d-c.ty)*(d-c.ty));c.c1x=g+this.KAPPA*(a-g)+c.r[0]*this.sloppiness*h/2;c.c1y=f+this.KAPPA*(d-f)+c.r[1]*this.sloppiness*h/2;c.c2x=c.tx+this.KAPPA*(a-c.tx)+c.r[2]*this.sloppiness*e/1.5;c.c2y=c.ty+this.KAPPA*(d-c.ty)+c.r[3]*this.sloppiness*e/1.5},formatCurve:function(g,e,c,b){var a=this.matrix.apply(b.x,b.y);b.tx=a.x;b.ty=a.y;b.length=Math.sqrt((b.tx-e)*(b.tx-e)+(b.ty-c)*(b.ty-c));if(b.length===0){b.length=1}b.vx=(b.tx-e)/b.length;b.vy=(b.ty-c)/b.length;var f=b.vx;var d=b.vy;b.c2x=b.tx-b.length*this.smoothness*f;b.c2y=b.ty-b.length*this.smoothness*d;if(g&&g.vx!==undefined){f=(f+g.vx)*0.5;d=(d+g.vy)*0.5;g.c2x=e-g.length*this.smoothness*f;g.c2y=c-g.length*this.smoothness*d}b.c1x=e+b.length*this.smoothness*f;b.c1y=c+b.length*this.smoothness*d},formatLine:function(c,h,g,f){var i=this.matrix.apply(f.x,f.y);f.tx=i.x;f.ty=i.y;var a=Math.sqrt((f.tx-h)*(f.tx-h)+(f.ty-g)*(f.ty-g));var e=a/10*this.sloppiness;if(e>20){e=20}f.tx=f.tx+this.sloppiness*f.r[0]*e/4;f.ty=f.ty+this.sloppiness*f.r[1]*e/4;var d=h;var b=g;var k=f.tx;var j=f.ty;d+=e;k+=e;b+=e;j+=e;f.c1x=d+f.r[2]*(k-d);f.c1y=b+f.r[2]*(j-b);d=h-e;k=f.tx-e;b=g-e;j=f.ty-e;f.c2x=d+f.r[3]*(k-d);f.c2y=b+f.r[3]*(j-b)},fixate:function(){var a;a=this.matrix.apply(this.startX,this.startY);this.startX=a.x;this.startY=a.y;for(var c=0;c<this.segments.length;c++){var b=this.segments[c];a=this.matrix.apply(b.x,b.y);b.x=a.x;b.y=a.y;if(b.x1!==undefined){a=this.matrix.apply(b.x1,b.y1);b.x1=a.x;b.y1=a.y}}this.matrix=new IdentityMatrix();this.format()},hittest:function(a,b){if(a>=this.rect.x&&a<this.rect.x+this.rect.width&&b>=this.rect.y&&b<this.rect.y+this.rect.height){return this}else{return null}},calcPoints:function(){if(this.points.length>0){return}this.points.push({x:this.tx,y:this.ty,seg:0});var a=this.tx;var d=this.ty;for(var c=0;c<this.segments.length;c++){var b=this.segments[c];bezier(this.points,a,d,b.c1x,b.c1y,b.c2x,b.c2y,b.tx,b.ty);a=b.tx;d=b.ty}}});function DrawDoc(){this.root=new Node()}DrawDoc.prototype={};function TransformAction(b,c,a){this.root=b;this.nodes=c;this.backups=[];this.xform=a}TransformAction.prototype={execute:function(){this.backups.length=0;for(var a=0;a<this.nodes.length;a++){this.backups.push(this.nodes[a].save());this.nodes[a].matrix=this.xform.multiply(this.nodes[a].matrix);this.nodes[a].format()}},undo:function(){for(var a=0;a<this.nodes.length;a++){this.nodes[a].load(this.backups[a]);this.nodes[a].format()}}};function NewNodeAction(a,b){this.root=a;this.node=b}NewNodeAction.prototype={execute:function(){this.root.addChild(this.node,0)},undo:function(){this.root.removeChild(this.node)}};function ChangeOrderAction(a,d,c){this.root=a;this.selection=d;this.oldPosition=0;this.type=c;for(var b=0;b<this.root.children.length;b++){if(this.root.children[b]===this.selection[0]){this.oldPosition=b}}}ChangeOrderAction.BRING_TO_FRONT=0;ChangeOrderAction.SEND_TO_BACK=1;ChangeOrderAction.prototype={execute:function(){this.root.children.splice(this.oldPosition,1);if(this.type===ChangeOrderAction.BRING_TO_FRONT){this.root.children.unshift(this.selection[0])}else{this.root.children.push(this.selection[0])}},undo:function(){if(this.type===ChangeOrderAction.BRING_TO_FRONT){this.root.children.shift()}else{this.root.children.pop()}this.root.children.splice(this.oldPosition,0,this.selection[0])}};function DeleteNodeAction(a,c){this.root=a;this.selection=c.concat();this.parents=[];this.positions=[];for(var b=0;b<this.selection.length;b++){this.parents.push(this.root.findParent(this.selection[b]))}}DeleteNodeAction.prototype={execute:function(){this.positions.length=0;for(var a=0;a<this.selection.length;a++){this.positions.push(this.parents[a].removeChild(this.selection[a]))}},undo:function(){for(var a=0;a<this.selection.length;a++){if(this.positions[a]>=0){this.parents[a].children.splice(this.positions[a],0,this.selection[a])}}}};function DuplicateNodeAction(b,a,d){this.root=a;this.nodes=[];this.view=b;this.view.sortNodes(d);for(var c=0;c<d.length;c++){this.nodes.push(d[c].duplicate())}}DuplicateNodeAction.prototype={execute:function(){this.view.clearSelection();for(var a=0;a<this.nodes.length;a++){this.root.addChild(this.nodes[a],0);this.view.addToSelection(this.nodes[a])}this.view.doneSelecting()},undo:function(){this.view.clearSelection();for(var a=0;a<this.nodes.length;a++){this.root.removeChild(this.nodes[a])}this.view.doneSelecting()}};function MoveEditHandleAction(a,b,f,d,e,c){this.node=a;this.handle=b;this.fromX=f;this.fromY=d;this.toX=e;this.toY=c}MoveEditHandleAction.prototype={execute:function(){this.node.fixate();this.node.moveEditHandle(this.handle,this.toX,this.toY)},undo:function(){this.node.fixate();this.node.moveEditHandle(this.handle,this.fromX,this.fromY)}};function GroupAction(a){this.view=a;this.nodes=this.view.selection.concat();this.view.sortNodes(this.nodes);this.oldParents=[];this.oldIndexes=[]}GroupAction.prototype={execute:function(){this.group=new Node();this.oldIndexes.length=0;this.oldParents.length=0;for(var a=0;a<this.nodes.length;a++){var b=this.nodes[a];if(b.parent===null){continue}this.oldParents.push(b.parent);this.oldIndexes.push(b.parent.removeChild(b));this.group.addChild(b)}this.view.doc.root.addChild(this.group)},undo:function(){this.view.doc.root.removeChild(this.group);for(var a=this.nodes.length-1;a>=0;a--){var b=this.nodes[a];if(b.parent===null){continue}this.oldParents[a].addChild(b,this.oldIndexes[a])}}};function UngroupAction(a){this.view=a;this.nodes=this.view.selection.concat();this.view.sortNodes(this.nodes);this.groups=[]}UngroupAction.prototype={execute:function(){var f={};for(var c=0;c<this.nodes.length;c++){var e=this.nodes[c];var d=e.parent;if(d.parent===null){continue}var h=d.parent;if(d.id in f){continue}dbg.printf("Processing node %s with %s children\n",d.id,d.children.length);f[d.id]=true;var g=h.removeChild(d);var b=d.children.concat();this.groups.push({node:d,grandparent:h,index:g,children:b});for(var a=0;a<b.length;a++){d.removeChild(b[a]);h.addChild(b[a],g+a)}}},undo:function(){for(var b=this.groups.length-1;b>=0;b--){var c=this.groups[b];for(var a=c.children.length-1;a>=0;a--){dbg.printf("Add back child id=%d\n",c.children[a].id);c.grandparent.removeChild(c.children[a]);c.node.addChild(c.children[a],0)}c.grandparent.addChild(c.node,c.index)}}};function SelectBoxBehaviour(b,c,a,d){this.view=b;this.dx=0;this.dy=0;this.dragging=false;this.previousBehaviour=c;this.onMouseDown(a,d)}SelectBoxBehaviour.prototype={onMouseDown:function(a,b){this.dx=a;this.dy=b;this.dragging=true},onMouseMove:function(a,c){if(this.dragging){var b=this.view.ctx;this.view.draw();b.save();b.strokeStyle="#0050B7";b.lineWidth=2;b.fillStyle="rgba(0, 80, 183, 0.2 )";b.fillRect(this.dx+0.5,this.dy+0.5,a-this.dx,c-this.dy);b.strokeRect(this.dx+0.5,this.dy+0.5,a-this.dx,c-this.dy);b.restore()}},onMouseUp:function(a,b){this.dragging=false;this.view.selectByRect(new Rect(this.dx,this.dy,a-this.dx,b-this.dy));this.view.doneSelecting();this.view.draw();this.view.behaviour=this.previousBehaviour}};function ExtractMatrices(b){var a=[];for(var c=0;c<b.length;c++){a.push(b[c].matrix)}return a}function TransformSelectionBehaviour(b,c,d,f,a,e){this.view=b;this.handle=d;this.previousBehaviour=c;this.toggleEditNode=f;this.view.showRotationHandle(this.handle===this.view.ROT);this.onMouseDown(a,e)}TransformSelectionBehaviour.prototype={onMouseDown:function(a,b){this.dx=a;this.dy=b;this.nodes=this.view.getSelectedNodes();this.matrices=ExtractMatrices(this.nodes);this.selRect=new Rect(this.view.selectionBounds.x,this.view.selectionBounds.y,this.view.selectionBounds.width,this.view.selectionBounds.height);if(this.handle===this.view.ROT){this.cx=this.selRect.x+this.selRect.width/2;this.cy=this.selRect.y+this.selRect.height/2;this.startAngle=Math.atan2(this.cy-b,a-this.cx)}},getTransform:function(c,h){var b=c-this.dx;var g=h-this.dy;var a;var f;var e;switch(this.handle){case this.view.NE:f=(c-this.selRect.x)/this.selRect.width;e=(this.selRect.y+this.selRect.height-h)/this.selRect.height;a=new ScaleMatrix(f,e,this.selRect.x,this.selRect.y+this.selRect.height);break;case this.view.SE:f=(c-this.selRect.x)/this.selRect.width;e=(h-this.selRect.y)/this.selRect.height;a=new ScaleMatrix(f,e,this.selRect.x,this.selRect.y);break;case this.view.SW:f=(this.selRect.x+this.selRect.width-c)/this.selRect.width;e=(h-this.selRect.y)/this.selRect.height;a=new ScaleMatrix(f,e,this.selRect.x+this.selRect.width,this.selRect.y);break;case this.view.NW:f=(this.selRect.x+this.selRect.width-c)/this.selRect.width;e=(this.selRect.y+this.selRect.height-h)/this.selRect.height;a=new ScaleMatrix(f,e,this.selRect.x+this.selRect.width,this.selRect.y+this.selRect.height);break;case this.view.ROT:var d=Math.atan2(this.cy-h,c-this.cx)-this.startAngle;a=new RotateMatrix(d,this.cx,this.cy);break;default:a=new TranslateMatrix(b,g)}return a},onMouseMove:function(b,e){var a=this.getTransform(b,e);for(var d=0;d<this.nodes.length;d++){this.nodes[d].matrix=a.multiply(this.matrices[d]);this.nodes[d].format()}this.view.transformSelectHandles(a);if(this.handle===this.view.ROT){this.view.rotHandleX=b;this.view.rotHandleY=e}this.view.draw();if(this.handle===this.view.ROT){var c=this.view.ctx;c.save();c.beginPath();c.strokeStyle="#0050B7";c.lineWidth=1;c.moveTo(this.cx,this.cy);c.lineTo(b,e);c.stroke();c.restore()}},onMouseUp:function(b,e){var d;if(b!=this.dx||e!=this.dy){var a=this.getTransform(b,e);for(var c=0;c<this.nodes.length;c++){this.nodes[c].matrix=this.matrices[c]}this.view.undoStack.execute(new TransformAction(this.view.doc.root,this.nodes,a))}else{if(this.toggleEditNode){d=this.view.doc.root.hittest(b,e);if(d&&d.hasEditMode()){this.view.clearSelection();this.view.setEditNode(d)}}}this.view.transformSelectHandles(new IdentityMatrix());this.view.showRotationHandle(true);this.view.calcSelection();this.view.draw();this.view.behaviour=this.previousBehaviour}};function MoveEditNodeBehaviour(b,c,d,e,a,f){this.view=b;this.node=d;this.handle=e;this.previousBehaviour=c;this.onMouseDown(a,f)}MoveEditNodeBehaviour.prototype={onMouseDown:function(a,b){this.dx=a;this.dy=b;this.node.fixate()},onMouseMove:function(a,b){this.node.moveEditHandle(this.handle,a,b);this.view.draw()},onMouseUp:function(a,b){if(a!=this.dx||b!=this.dy){this.view.undoStack.execute(new MoveEditHandleAction(this.node,this.handle,this.dx,this.dy,a,b),true)}else{}this.view.draw();this.view.behaviour=this.previousBehaviour}};function DrawLinesBehaviour(a,b,c){this.view=a;this.previousBehaviour=b;this.node=null;this.numPoints=0;this.isCurves=c;this.view.canvas.style.cursor="crosshair"}DrawLinesBehaviour.prototype={addPoint:function(a,b){if(this.isCurves){this.node.curveTo(a,b)}else{this.node.lineTo(a,b)}},onMouseClick:function(a,b){if(this.node===null){this.node=new PathNode(a,b);this.addPoint(a,b);this.node.format();this.view.doc.root.addChild(this.node,0);this.index=1;this.view.draw();this.numPoints=2}else{this.addPoint(a,b);this.numPoints++;this.index+=1}},onMouseMove:function(a,b){if(this.node){this.node.moveEditHandle(this.index,a,b);this.view.draw()}},onDoubleClick:function(a,c){if(this.node){var b=this.node.getPointCount();this.node.removePoint(b-1);this.node.removePoint(b-2);this.node.autoclose();this.node.format();this.view.draw()}this.view.behaviour=this.previousBehaviour;this.view.canvas.style.cursor="default"}};function DefaultBehaviour(a){this.view=a}DefaultBehaviour.prototype={onMouseMove:function(a,b){},onMouseDown:function(a,i,h){var d;var g;var b=this.view.getHandleUnderPoint(a,i);if(b){this.view.behaviour=new TransformSelectionBehaviour(this.view,this,b,false,a,i);return}if(this.view.selection.length&&this.view.selectionBounds.containsPoint(a,i)){this.view.behaviour=new TransformSelectionBehaviour(this.view,this,-1,true,a,i);return}if(!h.shiftKey){this.view.clearSelection()}if(this.view.editNode){d=this.view.editNode;g=d.hitTestEditHandle(a,i);if(g!==null){this.view.behaviour=new MoveEditNodeBehaviour(this.view,this,d,g,a,i);return}else{if(0&&this.view.editNode.rect.containsPoint(a,i)){this.view.setEditNode(null)}}}d=this.view.doc.root.hittest(a,i);if(d){var c=d===this.view.editNode;var f=this.view.isNodeSelected(d);if(!f){this.view.addToSelection(d);this.view.doneSelecting()}this.view.behaviour=new TransformSelectionBehaviour(this.view,this,-1,!c&&f,a,i)}else{this.view.setEditNode(null);this.view.behaviour=new SelectBoxBehaviour(this.view,this,a,i)}this.view.draw()},onMouseUp:function(a,b){},onKeyDown:function(b){var a=b.keyCode;if(a===36){if(this.view.selection.length){this.view.undoStack.execute(new ChangeOrderAction(this.view.doc.root,this.view.selection,ChangeOrderAction.BRING_TO_FRONT));this.view.update()}}else{if(a===35){if(this.view.selection.length){this.view.undoStack.execute(new ChangeOrderAction(this.view.doc.root,this.view.selection,ChangeOrderAction.SEND_TO_BACK));this.view.update()}}else{if(a===46){if(this.view.selection.length){this.view.undoStack.execute(new DeleteNodeAction(this.view.doc.root,this.view.selection));this.view.clearSelection();this.view.update()}}else{if(a===68&&b.ctrlKey===true){if(this.view.selection.length){this.view.undoStack.execute(new DuplicateNodeAction(this.view,this.view.doc.root,this.view.selection));this.view.update()}}else{if(a===67){this.view.behaviour=new DrawLinesBehaviour(this.view,this,true)}else{if(a===76){this.view.behaviour=new DrawLinesBehaviour(this.view,this,false)}else{if(a===71&&b.ctrlKey&&b.shiftKey){this.view.undoStack.execute(new UngroupAction(this.view))}else{if(a===71&&b.ctrlKey){this.view.undoStack.execute(new GroupAction(this.view))}else{if(a===85&&b.ctrlKey){}else{if(a===107&&b.shiftKey){this.view.scale=1;this.view.translateX=0;this.view.translateY=0;this.view.draw()}else{if(a===107){this.view.scale=this.view.scale*1.1;this.view.draw()}else{if(a===109){this.view.scale=this.view.scale/1.1;this.view.draw()}else{if(a===38){this.view.translateY=Math.min(this.view.translateY+16,0);this.view.draw()}else{if(a===39){this.view.translateX=Math.max(-this.view.width,this.view.translateX-16);this.view.draw()}else{if(a===40){this.view.translateY=Math.max(-this.view.height,this.view.translateY-16);this.view.draw()}else{if(a===37){this.view.translateX=Math.min(this.view.translateX+16,0);this.view.draw()}else{if(a===192&&b.shiftKey){this.view.canvas.height=this.view.canvas.height*1.1;this.view.height=this.view.canvas.height;this.view.draw()}else{if(a===192){this.view.canvas.height=this.view.canvas.height/1.1;this.view.height=this.view.canvas.height;this.view.draw()}}}}}}}}}}}}}}}}}}}};var gDrawView;function DrawView(d,c,a){gDrawView=this;this.width=700;this.height=700;this.canvas=d;this.ctx=this.canvas.getContext("2d");this.panel=a;a.view=this;this.doc=new DrawDoc();this.format();this.selection=[];this.selectionBounds=new Rect(0,0,0,0);this.editNode=null;this.undoStack=c;this.scale=1;this.translateX=0;this.translateY=0;this.draw();this.NE=1;this.SE=2;this.SW=3;this.NW=4;this.ROT=5;this.HANDLE_RADIUS=4;this.menu=null;this.selectHandleTransform=new IdentityMatrix();this.enableRotationHandle=true;this.selectGeneration=1;this.behaviour=new DefaultBehaviour(this);var b=this;$(this.canvas).mousemove(function(g){var h=$(b.canvas).offset();var f=(g.pageX-h.left-b.translateX)/b.scale;var i=(g.pageY-h.top-b.translateY)/b.scale;b.behaviour.onMouseMove(f,i)});$(this.canvas).mousedown(function(g){var h=$(b.canvas).offset();if(b.behaviour.onMouseDown){var f=(g.pageX-h.left-b.translateX)/b.scale;var i=(g.pageY-h.top-b.translateY)/b.scale;b.behaviour.onMouseDown(f,i,g)}});$(this.canvas).mouseup(function(g){var h=$(b.canvas).offset();if(b.behaviour.onMouseUp){var f=(g.pageX-h.left-b.translateX)/b.scale;var i=(g.pageY-h.top-b.translateY)/b.scale;b.behaviour.onMouseUp(f,i)}});$(this.canvas).click(function(g){var h=$(b.canvas).offset();$("#canvas_activated").val(1);if(b.behaviour.onMouseClick){var f=(g.pageX-h.left-b.translateX)/b.scale;var i=(g.pageY-h.top-b.translateY)/b.scale;b.behaviour.onMouseClick(f,i)}});$(this.canvas).dblclick(function(g){var h=$(b.canvas).offset();if(b.behaviour.onDoubleClick){var f=(g.pageX-h.left-b.translateX)/b.scale;var i=(g.pageY-h.top-b.translateY)/b.scale;b.behaviour.onDoubleClick(f,i)}});$(this.canvas).keydown(function(f){if(b.behaviour.onKeyDown){b.behaviour.onKeyDown(f)}f.preventDefault();return false});$(this.canvas).keyup(function(f){if(b.behaviour.onKeyUp){b.behaviour.onKeyUp(f)}f.preventDefault();return false})}DrawView.prototype={clear:function(){this.ctx.setTransform(1,0,0,1,0,0);this.ctx.clearRect(0,0,this.width,this.height)},format:function(){this.doc.root.format()},update:function(){this.doc.root.format();this.calcSelection();this.draw()},lineTool:function(){if(this.behaviour instanceof DrawLinesBehaviour){this.behaviour=this.behaviour.previousBehaviour}this.behaviour=new DrawLinesBehaviour(this,this.behaviour,false)},curveTool:function(){if(this.behaviour instanceof DrawLinesBehaviour){this.behaviour=this.behaviour.previousBehaviour}this.behaviour=new DrawLinesBehaviour(this,this.behaviour,true)},draw:function(){this.clear();this.ctx.setTransform(this.scale,0,0,this.scale,this.translateX,this.translateY);this.doc.root.draw(this.ctx);if(this.selection.length>0){this.ctx.save();this.ctx.strokeStyle="#000000";this.ctx.lineWidth=1;var e=this.selectHandleTransform.apply(this.selectionBounds.x,this.selectionBounds.y);var b=this.selectHandleTransform.apply(this.selectionBounds.x+this.selectionBounds.width,this.selectionBounds.y);var f=this.selectHandleTransform.apply(this.selectionBounds.x+this.selectionBounds.width,this.selectionBounds.y+this.selectionBounds.height);var c=this.selectHandleTransform.apply(this.selectionBounds.x,this.selectionBounds.y+this.selectionBounds.height);var a=new Point(this.rotHandleX,this.rotHandleY);var d=this.HANDLE_RADIUS;this.ctx.strokeRect(b.x-d,b.y-d,d*2,d*2);this.ctx.strokeRect(e.x-d,e.y-d,d*2,d*2);this.ctx.strokeRect(c.x-d,c.y-d,d*2,d*2);this.ctx.strokeRect(f.x-d,f.y-d,d*2,d*2);if(this.enableRotationHandle){this.ctx.beginPath();this.ctx.strokeStyle="#008000";this.ctx.lineWidth=3;this.ctx.moveTo(a.x,a.y);this.ctx.arc(a.x,a.y,6,0,1.5*Math.PI,false);this.ctx.stroke()}this.ctx.restore()}if(this.editNode){this.editNode.drawEditHandles(this.ctx)}if(this.menu){this.menu.draw(this.ctx)}},selectByRect:function(e){for(var c=0;c<this.doc.root.children.length;c++){var d=this.doc.root.children[c];if(d.children.length>0){var b=true;for(var a=0;a<d.children.length;a++){if(!e.contains(d.children[a].rect)){b=false}}if(b){this.addToSelection(d.children[0])}}else{if(e.contains(this.doc.root.children[c].rect)){this.addToSelection(d,false)}}}},transformSelectHandles:function(a){this.selectHandleTransform=a},showRotationHandle:function(a){this.enableRotationHandle=a},doneSelecting:function(){this.calcSelection();this.panel.loadFromNodes(this.selection)},setEditNode:function(a){this.editNode=a},isNodeSelected:function(a){return a.selectGeneration===this.selectGeneration},getSelectedNodes:function(){return this.selection.concat()},getHandleUnderPoint:function(a,c){if(this.selection.length){var b=this.HANDLE_RADIUS*2;if(a>=this.selectionBounds.x-b&&a<this.selectionBounds.x+b){if(c>=this.selectionBounds.y-b&&c<this.selectionBounds.y+b){return this.NW}else{if(c>=this.selectionBounds.y+this.selectionBounds.height-b&&c<this.selectionBounds.y+this.selectionBounds.height+b){return this.SW}}}else{if(a>=this.selectionBounds.x+this.selectionBounds.width-b&&a<this.selectionBounds.x+this.selectionBounds.width+b){if(c>=this.selectionBounds.y-b&&c<this.selectionBounds.y+b){return this.NE}else{if(c>=this.selectionBounds.y+this.selectionBounds.height-b&&c<this.selectionBounds.y+this.selectionBounds.height+b){return this.SE}}}}if(a>=this.rotHandleX-b&&a<this.rotHandleX+b&&c>=this.rotHandleY-b&&c<this.rotHandleY+b){return this.ROT}}return null},numSelected:function(){return this.selection.length},shiftSelection:function(a,b){this.selectionBounds.x+=a;this.selectionBounds.y+=b},addToSelection:function(d,a){this.setEditNode(null);if(d.selectGeneration===this.selectGeneration){return}if(a){this.clearSelection()}this.selection.push(d);d.selectGeneration=this.selectGeneration;if(d.parent&&d.parent.parent!==null){var c=d.parent;for(var b=0;b<c.children.length;b++){this.addToSelection(c.children[b])}}if(d.children.length>0){this.addToSelection(d.children[0])}},calcSelection:function(){if(this.selection.length===0){return}var b=this.selection[0];this.selectionBounds.x=b.rect.x;this.selectionBounds.y=b.rect.y;this.selectionBounds.width=b.rect.width;this.selectionBounds.height=b.rect.height;for(var a=1;a<this.selection.length;a++){this.selectionBounds.union(this.selection[a].rect)}this.rotHandleX=this.selectionBounds.x+this.selectionBounds.width-20;this.rotHandleY=this.selectionBounds.y},clearSelection:function(){if(this.selection.length>0){this.selectGeneration+=1;this.selection.length=0}},assignNumber:function(b){b.sortOrder=this.nextNumber++;for(var a=0;a<b.children.length;a++){this.assignNumber(b.children[a])}},sortNodes:function(a){this.nextNumber=0;this.assignNumber(this.doc.root);a.sort(function(d,c){return c.sortOrder-d.sortOrder})}};function Point(a,b){this.x=a;this.y=b}function Rect(a,d,b,c){this.x=a;this.y=d;this.width=b;this.height=c;this.repair()}Rect.load=function(a){return new Rect(a.x,a.y,a.width,a.height)};Rect.prototype={save:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},union:function(a){if(a.x<this.x){this.width+=this.x-a.x;this.x=a.x}if(a.y<this.y){this.height+=this.y-a.y;this.y=a.y}if(a.x+a.width>this.x+this.width){this.width+=a.x+a.width-this.x-this.width}if(a.y+a.height>this.y+this.height){this.height+=a.y+a.height-this.y-this.height}},unionPoint:function(a,b){if(a<this.x){this.width+=this.x-a;this.x=a}else{if(a>this.x+this.width){this.width=a-this.x}}if(b<this.y){this.height+=this.y-b;this.y=b}else{if(b>this.y+this.height){this.height=b-this.y}}},contains:function(a){return this.x<=a.x&&this.x+this.width>a.x+a.width&&this.y<=a.y&&this.y+this.height>a.y+a.height},containsPoint:function(a,b){return this.x<=a&&this.x+this.width>a&&this.y<=b&&this.y+this.height>b},repair:function(){if(this.width<0){this.x+=this.width;this.width=-this.width}if(this.height<0){this.y+=this.height;this.height=-this.height}}};function Clone(a){var c;if(a instanceof Function){return a}else{if(a instanceof Array){c=a.concat()}else{if(a instanceof Object){c={};for(var b in a){if(1){c[b]=Clone(a[b])}}}else{c=a}}}return c}function IdentityMatrix(){this.m11=1;this.m12=0;this.m21=0;this.m22=1;this.dx=0;this.dy=0}IdentityMatrix.load=function(b){var a=new IdentityMatrix();a.m11=b.m11;a.m12=b.m12;a.m21=b.m21;a.m22=b.m22;a.dx=b.dx;a.dy=b.dy;return a};IdentityMatrix.prototype={save:function(){return{m11:this.m11,m12:this.m12,m21:this.m21,m22:this.m22,dx:this.dx,dy:this.dy}},multiply:function(b){var a=new IdentityMatrix();a.m11=this.m11*b.m11+this.m12*b.m21;a.m21=this.m21*b.m11+this.m22*b.m21;a.m12=this.m11*b.m12+this.m12*b.m22;a.m22=this.m21*b.m12+this.m22*b.m22;a.dx=this.m11*b.dx+this.m12*b.dy+this.dx;a.dy=this.m21*b.dx+this.m22*b.dy+this.dy;return a},apply:function(a,b){return new Point(this.m11*a+this.m12*b+this.dx,this.m21*a+this.m22*b+this.dy)}};function ScaleMatrix(d,c,b,a){if(b===undefined){this.m11=d;this.m12=0;this.m21=0;this.m22=c;this.dx=0;this.dy=0}else{this.m11=d;this.m12=0;this.m21=0;this.m22=c;this.dx=b-d*b;this.dy=a-c*a}}ScaleMatrix.prototype=IdentityMatrix.prototype;function RotateMatrix(d,a,e){var c=Math.cos(d);var b=Math.sin(d);this.m11=c;this.m12=b;this.m21=-b;this.m22=c;this.dx=-a*c-e*b+a;this.dy=a*b-e*c+e}RotateMatrix.prototype=IdentityMatrix.prototype;function TranslateMatrix(b,a){this.m11=1;this.m12=0;this.m21=0;this.m22=1;this.dx=b;this.dy=a}TranslateMatrix.prototype=IdentityMatrix.prototype;function recursive_bezier(n,r,e,q,d,o,c,m,b){var y=(r+q)/2;var k=(e+d)/2;var h=(q+o)/2;var t=(d+c)/2;var l=(o+m)/2;var f=(c+b)/2;var u=(y+h)/2;var a=(k+t)/2;var p=(h+l)/2;var v=(t+f)/2;var g=(u+p)/2;var s=(a+v)/2;var j=m-r;var i=b-e;var x=Math.abs(((q-m)*i-(d-b)*j));var w=Math.abs(((o-m)*i-(c-b)*j));if((x+w)*(x+w)<4*(j*j+i*i)){n.push(new Point(g,s));return}recursive_bezier(n,r,e,y,k,u,a,g,s);recursive_bezier(n,g,s,p,v,l,f,m,b)}function bezier(h,c,g,b,f,a,e,i,d){recursive_bezier(h,c,g,b,f,a,e,i,d);h.push(new Point(i,d))}function SetPropertyAction(a,b,c,f){this.view=a;this.nodes=b;this.name=c;this.value=f;this.oldValues=[];for(var d=0;d<this.nodes.length;d++){var e=this.nodes[d];if(this.name in e){this.oldValues[d]=e[this.name]}}}SetPropertyAction.prototype={execute:function(b){for(var a=0;a<this.nodes.length;a++){var c=this.nodes[a];if(this.name in c){c[this.name]=this.value;if(!b){c.format()}}}this.view.draw()},undo:function(){for(var a=0;a<this.nodes.length;a++){var b=this.nodes[a];if(this.name in b){b[this.name]=this.oldValues[a];b.format()}}this.view.draw()}};function PropertyPanel(){this.div=document.createElement("div");$(this.div).addClass("PropertyPanel");this.records=[];this.recordsByName={};this.view=null;this.nodes=[];this.action=null}PropertyPanel.prototype={loadFromNodes:function(a){this.action=null;this.records.length=0;this.recordsByName={};this.nodes=a.concat();for(var d=0;d<a.length;d++){var e=a[d];var c=e.getPropertyList();for(var b=0;b<c.length;b++){this.loadFromNode(c[b],e)}}this.createControls()},loadFromNode:function(c,b){var a;if(c.name in this.recordsByName){a=this.recordsByName[c.name];if(a.value!=b[c.name]){a.value=null}}else{a={property:c,value:b[c.name]};this.records.push(a);this.recordsByName[c.name]=a}},createControls:function(){$(this.div).empty();var d;var c;var k;var n=this;for(d=0;d<this.records.length;d++){var f=this.records[d];var a=f.property;var b=document.createElement("div");var l=document.createElement("span");l.appendChild(document.createTextNode(a.display));b.appendChild(l);if(a.type==="select"){var h=document.createElement("select");for(c=0;c<a.values.length;c++){var m=a.values[c];var e=document.createElement("option");e.appendChild(document.createTextNode(m.name));e.setAttribute("value",c);if(m.value===f.value){e.setAttribute("selected","")}h.appendChild(e)}h.prop=a;h.onchange=function(){var i=parseInt(this.value,10);n.apply(this.prop.name,this.prop.values[i].value)};b.appendChild(h)}else{if(a.type==="colour"){k=document.createElement("input");k.setAttribute("type","text");k.style.width="70px";k.value=f.value;k.prop=a;$(k).keydown(function(i){if(i.keyCode===13){n.apply(this.prop.name,this.value)}});b.appendChild(k);var g=document.createElement("img");g.src="wd-wheel.png";g.style.verticalAlign="middle";g.input=k;b.appendChild(g);$(g).click(function(){n.wheelClicked(this)})}else{if(a.type==="text"){k=document.createElement("input");k.setAttribute("type","text");k.value=f.value;k.prop=a;$(k).keydown(function(i){if(i.keyCode===13){n.apply(this.prop.name,this.value)}});b.appendChild(k)}else{throw"Error: No such property"}}}this.div.appendChild(b)}},apply:function(a,b){this.view.undoStack.execute(new SetPropertyAction(this.view,this.nodes,a,b))},wheelClicked:function(c){if(c.hasWheel){return}var b=new ColourWheel(120);var a=this;b.setFromColour(c.input.value);b.onUpdate=function(d){a.colourChanged(d,c.input,c.input.prop)};c.wheel=b;c.hasWheel=true;c.parentNode.appendChild(b.div)},colourChanged:function(d,a,e){if(this.action===null||this.action.name!==e.name){this.action=new SetPropertyAction(this.view,this.nodes,e.name,d);this.view.undoStack.execute(this.action,true)}this.action.value=d;a.value=d;for(var b=0;b<this.nodes.length;b++){var c=this.nodes[b];c[e.name]=d}this.view.draw()}};function Toolbar(){this.div=document.createElement("div");this.div.style.width="500px";this.div.style.height="35px"}Toolbar.prototype={addButton:function(c,b){var a=document.createElement("img");a.src=c;this.div.appendChild(a);$(a).bind("mouseenter",function(){this.style.background="#0050B7"});$(a).bind("mouseleave",function(){this.style.background="#ffffff"});if(b){$(a).click(b)}}};function UndoStack(){this.items=[];this.next=0;this.dirty=false}UndoStack.prototype={execute:function(b,a){if(this.next<this.length){this.items.slice(this.next,this.length-this.next)}this.items.push(b);if(!a){b.execute()}this.dirty=true;this.next=this.items.length},undo:function(){if(this.canUndo()){this.items[--this.next].undo();this.dirty=true}},redo:function(){if(this.canRedo()){this.items[this.next++].execute();this.dirty=true}},canUndo:function(){return this.next>0},canRedo:function(){return this.next<this.items.length},getUndoDescription:function(){return this.items[this.next-1].description},getRedoDescription:function(){return this.items[this.next].description},clear:function(){this.items.length=0;this.next=0;this.dirty=true}};function DebugConsole(a){this.ta=a}DebugConsole.prototype.print=function(c){var a=c.split("\n");for(var b=0;b<a.length;b++){this.ta.appendChild(document.createTextNode(a[b]));if(b<a.length-1){this.ta.appendChild(document.createElement("br"))}}};DebugConsole.prototype.printf=function(){function l(p,r){if(r){p.sign=""}else{p.sign=p.negative?"-":p.sign}var i=p.min-p.argument.length+1-p.sign.length;var q=new Array(i<0?0:i).join(p.pad);if(!p.left){if(p.pad=="0"||r){return p.sign+q+p.argument}else{return q+p.sign+p.argument}}else{if(p.pad=="0"||r){return p.sign+p.argument+q.replace(/0/g," ")}else{return p.sign+p.argument+q}}}if(typeof arguments=="undefined"){return}if(arguments.length<1){return}var k=arguments;if(k[0] instanceof Array){k=k[0]}if(typeof k[0]!="string"){return}if(typeof RegExp=="undefined"){return}var h=k[0];var c=new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g);var f=[];var m=[];var a=0;var g=0;var o=0;var b=0;var j="";var e=null;var n;for(;;){e=c.exec(h);if(!e){break}if(e[9]){a+=1}g=b;o=c.lastIndex-e[0].length;m[m.length]=h.substring(g,o);b=c.lastIndex;f[f.length]={match:e[0],left:e[3]?true:false,sign:e[4]||"",pad:e[5]||" ",min:e[6]||0,precision:e[8],code:e[9]||"%",negative:parseInt(k[a],10)<0?true:false,argument:String(k[a])}}m[m.length]=h.substring(b);if((k.length-1)<a){return}var d=null;for(d=0;d<f.length;d++){if(f[d].code=="%"){n="%"}else{if(f[d].code=="b"){f[d].argument=String(Math.abs(parseInt(f[d].argument,10)).toString(2));n=l(f[d],true)}else{if(f[d].code=="c"){f[d].argument=String(String.fromCharCode(parseInt(Math.abs(parseInt(f[d].argument,10)),10)));n=l(f[d],true)}else{if(f[d].code=="d"){f[d].argument=String(Math.abs(parseInt(f[d].argument,10)));n=l(f[d])}else{if(f[d].code=="f"){f[d].argument=String(Math.abs(parseFloat(f[d].argument)).toFixed(f[d].precision?f[d].precision:6));n=l(f[d])}else{if(f[d].code=="o"){f[d].argument=String(Math.abs(parseInt(f[d].argument,10)).toString(8));n=l(f[d])}else{if(f[d].code=="s"){f[d].argument=f[d].argument.substring(0,f[d].precision?f[d].precision:f[d].argument.length);n=l(f[d],true)}else{if(f[d].code=="x"){f[d].argument=String(Math.abs(parseInt(f[d].argument,10)).toString(16));n=l(f[d])}else{if(f[d].code=="X"){f[d].argument=String(Math.abs(parseInt(f[d].argument,10)).toString(16));n=l(f[d]).toUpperCase()}else{n=f[d].match}}}}}}}}}j+=m[d];j+=n}j+=m[d];this.print(j)};function sprintf(){var c=arguments;if(c.length==1&&c[0] instanceof Array){c=c[0]}var e=c[0];var a="";var b=e.split(/%[^%]/);for(var d=0;d<b.length;d++){a+=b[d];if(c[d+1]!==undefined){a+=c[d+1]}}return a};

