// variables
drawing=false;
fill=false;
snapTo=false;
ncolor='0x000000';
shapedata=new Array();
shapes=new Array();
shapecount=0;
// keypress listeners for keyboard shortcuts
createEmptyMovieClip('_keyListener',1000);
Key.addListener(_keyListener);
_keyListener.onKeyDown=function(){
switch(Key.getCode()){
case 49 : _root.linethickness.text=1;break;
case 97 : _root.linethickness.text=1;break;
case 50 : _root.linethickness.text=2;break;
case 98 : _root.linethickness.text=2;break;
case 51 : _root.linethickness.text=3;break;
case 99 : _root.linethickness.text=3;break;
case 52 : _root.linethickness.text=4;break;
case 100 : _root.linethickness.text=4;break;
case 53 : _root.linethickness.text=5;break;
case 101 : _root.linethickness.text=5;break;
case 54 : _root.linethickness.text=6;break;
case 102 : _root.linethickness.text=6;break;
case 55 : _root.linethickness.text=7;break;
case 103 : _root.linethickness.text=7;break;
case 56 : _root.linethickness.text=8;break;
case 104 : _root.linethickness.text=8;break;
case 57 : _root.linethickness.text=9;break;
case 105 : _root.linethickness.text=9;break;
case 76 : _root.shape.text='line';break;
case 67 : _root.shape.text='curve';break;
case 82 : _root.shape.text='rectangle';break;
case 79 : _root.shape.text='circle';break;
case 80 : _root.shape.text='pen';if(drawing){moveTo(_xmouse,_ymouse);_root.tracker.clear();}break;
case 83 : if(snapTo){snapTo=false;}else{snapTo=true;}break;
case 70 : if(fill){_root.fillstatus.text='Fill '+fill=false;}else{_root.fillstatus.text='Fill '+fill=true;}break;
case 88 : for(sc=0;sc<_root.shapes.length;sc++){removeMovieClip(shapes[sc]);}_root.shapes=new Array();_root.shapedata=new Array();if(drawing && shape=='pen'){moveTo(_xmouse,_ymouse);}drawing=false;_root.tracker.clear();break;
case 90 : if(shapecount>0){removeMovieClip(shapes[shapecount]);shapes[shapecount]='';shapedata[shapecount]='';shapecount--;}break;
}
// set the rgb color picker's scale based on linethickness
_root.cp._y=220-_root.linethickness.text/2;
_root.cp._height=_root.linethickness.text;
_root.cp._yscale=Math.floor(_root.cp._yscale);
};
// end key listener
// draw curves
function curve(it,startX,startY,mouseX,mouseY){
with(eval(it)){moveTo(startX,startY);curveTo(mouseX,startY,mouseX,mouseY);}
}
// draw ovals/circles
function circle(it,x,y,mouseX,mouseY){
if(Key.isDown(Key.SHIFT)){
a=b=Math.sqrt(Math.pow(Math.abs(mouseX-x),2)+Math.pow(Math.abs(mouseY-y),2));
}else{
a=Math.abs(mouseX-x);
b=Math.abs(mouseY-y);
}
j=a*0.70711;
n=b*0.70711;
i=j-(b-n)*a/b;
m=n-(a-j)*b/a;
with(eval(it)){
if(fill){beginFill(_root.ncolor,100);}
moveTo(x+a,y);
curveTo(x+a,y-m,x+j,y-n);
curveTo(x+i,y-b,x,y-b);
curveTo(x-i,y-b,x-j,y-n);
curveTo(x-a,y-m,x-a,y);
curveTo(x-a,y+m,x-j,y+n);
curveTo(x-i,y+b,x,y+b);
curveTo(x+i,y+b,x+j,y+n);
curveTo(x+a,y+m,x+a,y);
if(fill){endFill();}
}
}
// draw rectangles
function rectangle(it,startX,startY,mouseX,mouseY){
with(eval(it)){
if(fill){beginFill(_root.ncolor,100);}
lineTo(mouseX,startY);
lineTo(mouseX,mouseY);
lineTo(startX,mouseY);
lineTo(startX,startY);
if(fill){endFill();}
}
}
// root event handlers
with(_root){
onMouseDown=function(){
// check if mouse is on canvas
// and begin drawing if so
if(_root._ymouse<200 && _root.cp.hitTest(_root._xmouse,_root._ymouse,false)==false){
drawing=true;
startX=snapTo?Math.ceil(_xmouse/10)*10:_xmouse;
startY=snapTo?Math.ceil(_ymouse/10)*10:_ymouse;
if(_root.shape.text=='pen'){
// if current shape is pen, create new MC
penX=_xmouse;
penY=_ymouse;
shapecount++;
shapes[shapecount]='SMC_'+shapecount;
_root.createEmptyMovieClip(shapes[shapecount],1000+shapecount);
with(eval(shapes[shapecount])){moveTo(penX,penY);}
}
}
};
onMouseUp=function(){
// check if mouse is still on the canvas
if(_root.canvas.hitTest(_root._xmouse,_root._ymouse,false)){
if(drawing){
drawing=false;
// clear the tracking clip and create the new shape
tracker.clear();
shapecount++;
shapes[shapecount]='SMC_'+shapecount;
_root.createEmptyMovieClip(shapes[shapecount],shapecount+1000);
thickness=_root.linethickness.text;
with(eval(shapes[shapecount])){
lineStyle(thickness,_root.ncolor);
moveTo(startX,startY);
}
endX=snapTo?Math.floor(_xmouse/10)*10:_xmouse;
endY=snapTo?Math.floor(_ymouse/10)*10:_ymouse;
if(_root.shape.text=='line'){shapedata[shapecount]='line_'+startX+'_'+startY+'_'+endX+'_'+endY+'_'+thickness+'_'+_root.ncolor+'_false-';with(eval(shapes[shapecount])){lineTo(endX,endY);}}
if(_root.shape.text=='curve'){shapedata[shapecount]='curve_'+startX+'_'+startY+'_'+endX+'_'+endY+'_'+thickness+'_'+_root.ncolor+'_false-';curve(shapes[shapecount],startX,startY,endX,endY);}
if(_root.shape.text=='rectangle'){shapedata[shapecount]='rectangle_'+startX+'_'+startY+'_'+endX+'_'+endY+'_'+thickness+'_'+_root.ncolor+'_'+fill+'-';rectangle(shapes[shapecount],startX,startY,endX,endY);}
if(_root.shape.text=='circle'){
if(Key.isDown(Key.SHIFT)){
r=Math.sqrt(Math.pow(Math.abs(startX-endX),2)+Math.pow(Math.abs(startY-endY),2));
shapedata[shapecount]='circle_'+startX+'_'+startY+'_'+(startX+r)+'_'+(startY+r)+'_'+thickness+'_'+_root.ncolor+'_'+fill+'-';circle(shapes[shapecount],startX,startY,endX,endY);
}else{
shapedata[shapecount]='circle_'+startX+'_'+startY+'_'+endX+'_'+endY+'_'+thickness+'_'+_root.ncolor+'_'+fill+'-';circle(shapes[shapecount],startX,startY,endX,endY);
}}
}
}
};
onMouseMove=function(){
// check if mouse is on the canvas
if(_ymouse<200){
// if pen tool is selected and drawing
if(_root.shape.text=='pen' && drawing==true){
// set line attributes and continue drawing
thickness=_root.linethickness.text;
shapelength=Math.sqrt(Math.pow(penX-_xmouse,2)+Math.pow(penY-_ymouse,2));
if(shapelength>5){
// only draw lines 5px or larger to prevent POST overload
shapecount++;
shapes[shapecount]='SMC_'+shapecount;
_root.createEmptyMovieClip(shapes[shapecount],1000+shapecount);
with(eval(shapes[shapecount])){moveTo(penX,penY);lineStyle(thickness,_root.ncolor);lineTo(_xmouse,_ymouse);}
shapedata[shapecount]='line_'+penX+'_'+penY+'_'+_xmouse+'_'+_ymouse+'_'+thickness+'_'+_root.ncolor+'_false-';
penX=_xmouse;
penY=_ymouse;
updateAfterEvent();
}}else{
// if any tool other than pen is selected
// create the temporary shape
if(drawing==true){
if(snapTo){endX=Math.floor(_xmouse/10)*10;}else{endX=_xmouse;}
if(snapTo){endY=Math.floor(_ymouse/10)*10;}else{endY=_ymouse;}
tracker.clear();
tracker.lineStyle(_root.linethickness.text,_root.ncolor);
tracker.moveTo(startX,startY);
if(_root.shape.text=='line'){tracker.lineTo(endX,endY);}
if(_root.shape.text=='curve'){curve('tracker',startX,startY,endX,endY);}
if(_root.shape.text=='rectangle'){rectangle('tracker',startX,startY,endX,endY);}
if(_root.shape.text=='circle'){circle('tracker',startX,startY,endX,endY);}
}
}
}
updateAfterEvent();
};
}
// end root event handlers
// create the canvas
_root.createEmptyMovieClip('canvas',1);
with(_root.canvas){
lineStyle(2);
moveTo(1,1);
lineTo(299,1);
lineTo(299,199);
lineTo(1,199);
lineTo(1,1);
}
// create the tracking movie clip
_root.createEmptyMovieClip('tracker',2000);
myformat=new TextFormat();
myformat.color=0x000000;
myformat.bullet=false;
myformat.font='Arial';
// create linethickness textfield
createTextField('linethickness',3,0,229,15,20);
linethickness.type='dynamic';
linethickness.selectable=false;
linethickness.multiline=false;
linethickness.wordWrap=false;
linethickness.text=1;
linethickness.setTextFormat(myformat);
myformat.size=10;
// create drawing tool textfield
createTextField('shape',2,0,200,45,20);
shape.type='dynamic';
shape.selectable=false;
shape.multiline=false;
shape.wordWrap=false;
shape.text='pen';
shape.setTextFormat(myformat);
// create fill status textfield
createTextField('fillstatus',4,20,220,30,40);
fillstatus.type='dynamic';
fillstatus.selectable=false;
fillstatus.multiline=true;
fillstatus.wordWrap=true;
fillstatus.text='Fill '+fill;
fillstatus.setTextFormat(myformat);
// create rgb color picker
_root.createEmptyMovieClip('cp',9500);
with(_root.cp){
_x=0;_y=218;
createEmptyMovieClip('bg',11);
with(bg){
lineStyle(1,0x000000);beginFill(0x000000);
lineTo(255/2+5,0);lineTo(255/2+5,14);lineTo(0,14);lineTo(0,0);
endFill();
}}
_root.cp.onMouseDown=function(){
if(hitTest(_root._xmouse,_root._ymouse,true) && _root.cp.r.hitTest(_root._xmouse,_root._ymouse,false)==false && _root.cp.g.hitTest(_root._xmouse,_root._ymouse,false)==false && _root.cp.b.hitTest(_root._xmouse,_root._ymouse,false)==false){
with(_root.cp){
startDrag(0,0,0,32,220);
}
}
};
_root.cp.onMouseUp=function(){
stopDrag();
};
_root.cp.onMouseMove=function(){
if(_root.cp.hitTest(_root._xmouse,_root._ymouse,false)){
this._xscale=200;
this._yscale=200;
_root.cb._visible=false;
}else{
this._xscale=30;
this._height=_root.linethickness.text;
this._yscale=Math.round(this._yscale);
this._x=0;
this._y=220-_root.linethickness.text/2;
_root.cb._visible=true;
stopDrag();
}
if(dragging){
rv=this.r._x*2+1;
gv=this.g._x*2+1;
bv=this.b._x*2+1;
rv=rv.toString(16).length<2?'0'+rv.toString(16):rv.toString(16);
gv=gv.toString(16).length<2?'0'+gv.toString(16):gv.toString(16);
bv=bv.toString(16).length<2?'0'+bv.toString(16):bv.toString(16);
_root.nc.setRGB('0x'+rv+gv+bv);
_root.ncolor='0x'+rv+gv+bv;
}
updateAfterEvent();
};
_root.cp._xscale=30;
_root.cp._yscale=20;
for(c=1;c<4;c++){
if(c==1){cv='r';cf='0xff0000';
}else{if(c==2){cv='g';cf='0x00ff00';
}else{cv='b';cf='0x0000ff';}}
_root.cp.createEmptyMovieClip(cv,c+9500);
with(eval('_root.cp.'+cv)){
lineStyle(0.25,0xffffff);
beginFill(cf);moveTo(0,-2);lineTo(5,-2);lineTo(5,2);lineTo(0,2);lineTo(0,-2);endFill();
_x=0;_y=c-3+c*4;
_root.cp[cv].onMouseDown=function(){
if(hitTest(_root._xmouse,_root._ymouse,false)){
drawing=false;
_root.dragging=true;
startDrag(0,0,_y,255/2,_y);
}
};
_root.cp[cv].onMouseUp=function(){
_root.dragging=false;
stopDrag();
};
}
}
_root.nc=new Color(_root.cp.bg);
// end rgb color picker
_root.clear();
stop();