/*
	This heading must remain intact at all times.
	Copyright (c) 2010 Mark Mason.

	File:	Q-Cogo-Sketch.js
	Use:	To provide sketching operations for Q-Cogo, <http://www.q-cogo.com/>.
	Ver:	1.2 (Beta)

	Created by Mark Mason. Latest version available from <http://www.q-cogo.com/>.



	This file is part of Q-Cogo.
	
	Q-Cogo is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
	
	Q-Cogo is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	
	You should have received a copy of the GNU General Public License
	along with Q-Cogo.  If not, see <http://www.gnu.org/licenses/>.
*/

function PutCanvas(Canvas,We,He,Xe,Ye){$(Canvas).css({left:-We-1,top:-He-1}).css('width',3*We).css('height',3*He);}
function DropCanvas(){var Canvas='#PointsCanvas';var Easel='#PointsEasel';var Header=qG('header').innerHTML;var CanvasPar='#'+Header+'CanvasPar';var PSP=$(CanvasPar).val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var XcReal=$(Canvas).offset().left,YcReal=$(Canvas).offset().top;var We=$(Easel).outerWidth(),He=$(Easel).outerHeight(),Xe=$(Easel).offset().left,Ye=$(Easel).offset().top;$(CanvasPar).val(Wc+' '+Hc+' '+Math.round(Xc+XcReal-Xe+We)+' '+(Yc+YcReal-Ye+He));PutCanvas(Canvas,We,He,Xe,Ye);eval(qG(Header+'CanvasSt').value);}
function PanSketch(Left,Top){var Header=qG('header').innerHTML;if(Header=='Help'||Header=='Settings')return;var Canvas='#PointsCanvas';var Easel='#PointsEasel';var We=$(Easel).outerWidth(),He=$(Easel).outerHeight(),Xe=$(Easel).offset().left,Ye=$(Easel).offset().top;var Factor=20;$(Canvas).css({left:-We+(Factor*Left)-1,top:-He+(Factor*Top)-1});DropCanvas();}
function ZoomSketch(Dir,MouseX,MouseY){var Canvas='#PointsCanvas';var Easel='#PointsEasel';var Header=qG('header').innerHTML,CanvasPar='#'+Header+'CanvasPar';if(Header=='Help'||Header=='Settings')return;Dir=((Dir<0)?-1:(Dir>0)?1:0);var PSP=$(CanvasPar).val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var We=$(Easel).outerWidth(),He=$(Easel).outerHeight(),Xe=$(Easel).offset().left,Ye=$(Easel).offset().top;var Zoom=Math.pow(1.25,Dir);if(Dir){var newWc=((Hc>200||Dir>0)?parseInt(Wc*Zoom):Wc);var newHc=parseInt(newWc*3.5/6);Xp=((MouseX)?MouseX-Xc:Xe-Xc+We/2);Yp=((MouseY)?MouseY-Yc:Ye-Yc+He/2);Xc=Xc+((newWc!=Wc)?Xp-Xp*Zoom:0);Yc=Yc+((newWc!=Wc)?Yp-Yp*Zoom:0);}
else{Xc=Xe;Yc=Ye;newWc=We;newHc=He;}
$(CanvasPar).val(newWc+' '+newHc+' '+Math.round(Xc)+' '+Math.round(Yc));PutCanvas(Canvas,We,He,Xe,Ye);eval(qG(Header+'CanvasSt').value);}
function MouseZoom(e){if(!e)var e=window.event;var normal=e.detail?e.detail*-1:e.wheelDelta/40;if(e.pageX||e.pageY){var posx=e.pageX,posy=e.pageY;}
else if(e.clientX||e.clientY){var posx=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;var posy=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;}
ZoomSketch(normal,posx,posy);cancelEvent(e);}
function hookEvent(element,eventName,callback){if(typeof(element)=="string")element=qG(element);if(element==null)return;if(element.addEventListener){if(eventName=='mousewheel')element.addEventListener('DOMMouseScroll',callback,false);element.addEventListener(eventName,callback,false);}
else if(element.attachEvent)element.attachEvent("on"+eventName,callback);}
function cancelEvent(e){e=e?e:window.event;if(e.stopPropagation)e.stopPropagation();if(e.preventDefault)e.preventDefault();e.cancelBubble=true;e.cancel=true;e.returnValue=false;return false;}
function SketchArea(ptMt,Canvas){if(ptMt){ptMt[ptMt.length]=ptMt[0];var PSP=$('#AreaCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var cM=new Array(0);var SEang=new Array(0);var cE=new Array(0);var lP=ptMt.length-1;for(var i=0;i<lP;i++){var indexM=((i==0)?ptMt.length-2:i-1);if(ptMt[i][0].search(/\*/)>=0){var R=PtPtInverse(0,ptMt[i],ptMt[i+1])[0];cM[cM.length]=['P',parseFloat(ptMt[i][1])+R,parseFloat(ptMt[i][2])-R,0,'D'];cM[cM.length]=['P',parseFloat(ptMt[i][1])-R,parseFloat(ptMt[i][2])+R,0,'D'];var Ang1=PtPtInverse(0,ptMt[i],ptMt[i+1])[2];var Ang2=PtPtInverse(0,ptMt[i],ptMt[indexM])[2];var Ang11=Math.min((5*Math.PI/2-Ang1)%(2*Math.PI),(5*Math.PI/2-Ang2)%(2*Math.PI));var Ang22=Math.max((5*Math.PI/2-Ang1)%(2*Math.PI),(5*Math.PI/2-Ang2)%(2*Math.PI));if(ptMt[i][0].search(/\*/)==0){SEang[SEang.length]=((Ang22-Ang11<Math.PI)?Ang22:Ang11);SEang[SEang.length]=((Ang22-Ang11<Math.PI)?Ang11:Ang22);}
else{SEang[SEang.length]=((Ang22-Ang11<Math.PI)?Ang11:Ang22);SEang[SEang.length]=((Ang22-Ang11<Math.PI)?Ang22:Ang11);}
Ang2=SEang[SEang.length-1];Ang1=SEang[SEang.length-2];var totAng=(Ang2-Ang1+2*Math.PI)%(2*Math.PI);var Emax=(((Ang2>0&&Ang2-totAng<0)||(Ang1<360&&Ang1+totAng>360))?parseFloat(ptMt[i][2])+R:Math.max(parseFloat(ptMt[indexM][2]),parseFloat(ptMt[i+1][2])));var Nmax=(((Ang2>Math.PI/2&&Ang2-totAng<Math.PI/2)||(Ang1<Math.PI/2&&Ang1+totAng>Math.PI/2))?parseFloat(ptMt[i][1])+R:Math.max(parseFloat(ptMt[indexM][1]),parseFloat(ptMt[i+1][1])));var Emin=(((Ang2>Math.PI&&Ang2-totAng<Math.PI)||(Ang1<Math.PI&&Ang1+totAng>Math.PI))?parseFloat(ptMt[i][2])-R:Math.min(parseFloat(ptMt[indexM][2]),parseFloat(ptMt[i+1][2])));var Nmin=(((Ang2>Math.PI*3/2&&Ang2-totAng<Math.PI*3/2)||(Ang1<Math.PI*3/2&&Ang1+totAng>Math.PI*3/2))?parseFloat(ptMt[i][1])-R:Math.min(parseFloat(ptMt[indexM][1]),parseFloat(ptMt[i+1][1])));cE[cE.length]=['P',Nmax,Emin,0,'D'];cE[cE.length]=['P',Nmin,Emax,0,'D'];}}
cM[cM.length]=[0];var SPar=FindScale(cE.concat(ptMt),Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);lP=ptMt.length-1;cM=ImgCoord(cM,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;Points(jg,ptMt,lP,'#000099');jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);var indexC=0;for(i=0;i<lP2;i++){if(ptMt2[i][0].search(/\*/)<0&&ptMt2[i+1][0].search(/\*/)<0)qLine(ptMt2[i],ptMt2[i+1],Canvas,jg);else if(ptMt2[i][0].search(/\*/)>=0){var hwC=Math.abs(parseInt(cM[indexC][2])-parseInt(cM[indexC+1][2]));qArc(parseInt(cM[indexC][2])+hwC/2,parseInt(cM[indexC][1])+hwC/2,hwC/2,SEang[indexC],SEang[indexC+1],Canvas,jg);indexC+=2;}}
jg.setStroke(1);Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();}
Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchTransform(ptMatrix,Canvas){if(ptMatrix){var ptMt=ptMatrix.slice(0);var PSP=$('#TransformCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');jg.setColor('#bbbbbb');var ptMt2=ptMt.slice(0);ptMt2.splice(0,lP-8);var lP2=ptMt2.length-1;ptMt.splice(lP-8,8);ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;qLine(ptMt2[4],ptMt2[5],Canvas,jg);qLine(ptMt2[5],ptMt2[7],Canvas,jg);qLine(ptMt2[7],ptMt2[6],Canvas,jg);qLine(ptMt2[6],ptMt2[4],Canvas,jg);if(ptMatrix.length-1==9){jg.setColor('#999999');ptMt2[4][1]-=4;ptMt2[4][2]-=4;ptMt2[6][1]+=4;ptMt2[6][2]+=4;ptMt2[7][1]+=4;ptMt2[7][2]-=4;ptMt2[5][1]-=4;ptMt2[5][2]+=4;qLine(ptMt2[4],ptMt2[6],Canvas,jg);qLine(ptMt2[7],ptMt2[5],Canvas,jg);}
jg.setColor('#666666');qLine(ptMt2[0],ptMt2[1],Canvas,jg);qLine(ptMt2[1],ptMt2[3],Canvas,jg);qLine(ptMt2[3],ptMt2[2],Canvas,jg);qLine(ptMt2[2],ptMt2[0],Canvas,jg);Points(jg,ptMt,lP,'#000099');jg.setStroke(1);Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();}
Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchBrgBrg(ptMt,Canvas){if(ptMt){var PSP=$('#IntersectCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');Points(jg,ptMt,lP,'#000099');jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);qLine(ptMt2[0],ptMt2[2],Canvas,jg);qLine(ptMt2[1],ptMt2[2],Canvas,jg);jg.setStroke(1);Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();}
Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchBrgDist(ptMt,Canvas,TwoPoints,Line){var PSP=$('#IntersectCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;Points(jg,ptMt,lP,'#000099');jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);if(TwoPoints){qLine(ptMt2[Line[0]],ptMt2[Line[1]],Canvas,jg);jg.setStroke(1);qLine(ptMt2[1],ptMt2[2],Canvas,jg);qLine(ptMt2[1],ptMt2[3],Canvas,jg);}
else{qLine(ptMt2[0],ptMt2[2],Canvas,jg);jg.setStroke(1);qLine(ptMt2[1],ptMt2[2],Canvas,jg);}
Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchDistDist(ptMt,Canvas,TwoPoints){var PSP=$('#IntersectCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;Points(jg,ptMt,lP,'#000099');jg.setColor('#666666');jg.setStroke(1);if(TwoPoints){qLine(ptMt2[0],ptMt2[2],Canvas,jg);qLine(ptMt2[0],ptMt2[3],Canvas,jg);qLine(ptMt2[1],ptMt2[2],Canvas,jg);qLine(ptMt2[1],ptMt2[3],Canvas,jg);}
else{qLine(ptMt2[0],ptMt2[2],Canvas,jg);qLine(ptMt2[1],ptMt2[2],Canvas,jg);}
Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchPtLine(ptMt,Canvas,Line){var PSP=$('#InverseCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;var dimMatrix=[ptMt[0],ptMt[1],ptMt[2],ptMt[4]];qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;dimMatrix=ImgTrim(dimMatrix,Canvas);lD=dimMatrix.length-1;Points(jg,dimMatrix,lD,'#000099');jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);qLine(ptMt2[Line[0]],ptMt2[Line[1]],Canvas,jg);qLine(ptMt2[2],ptMt2[3],Canvas,jg);jg.setStroke(1);Labels(jg,dimMatrix,lP-1,Font.BLUEBOX,'#000099');jg.paint();Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchPtPt(ptMt,Canvas){if(ptMt){var PSP=$('#'+qG('header').innerHTML+'CanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);var lP=ptMt.length-1;var sceneryMatrix=ParsePoints();sceneryMatrix=ImgCoord(sceneryMatrix,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lS=sceneryMatrix.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,sceneryMatrix,lS,'#999999');Labels(jg,sceneryMatrix,lS,Font.GREYBOX,'#999999');var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;Points(jg,ptMt,lP,'#000099');jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);for(var i=0;i<lP2-1;i++)qLine(ptMt2[i],ptMt2[i+1],Canvas,jg);jg.setStroke(1);Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();}
Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function SketchCurve(ptMt,Canvas){var PSP=$('#SolverCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var lColor='#000099';var lFont=Font.BLUEBOX;var PMdef=1;if(ptMt==''){var R=1;var D=82*Math.PI/180;T=R*Math.tan(D/2);C=2*R*Math.sin(D/2);var ptMt=new Array(11);ptMt[0]=['D',0,0,0,'D'];ptMt[1]=['BC',R*Math.cos(-1*D/2),R*Math.sin(-1*D/2),0,'BC'];ptMt[2]=['EC',R*Math.cos(D/2),R*Math.sin(D/2),0,'EC'];var tBrg1=((D<Math.PI)?Math.PI/2-D/2:3*Math.PI/2-D/2);var tBrg2=((D<Math.PI)?D/2-Math.PI/2:D/2-3*Math.PI/2);ptMt[3]=['PI',T*Math.cos(tBrg1)+ptMt[1][1],T*Math.sin(tBrg1)+ptMt[1][2],0,'PI'];ptMt[4]=['C',ptMt[1][1],ptMt[1][2]+C/2,0,'C'];ptMt[5]=['L',R,0,0,'L'];ptMt[6]=['T',T/2*Math.cos(tBrg1)+ptMt[1][1],T/2*Math.sin(tBrg1)+ptMt[1][2],0,'T'];ptMt[7]=['T',T/2*Math.cos(tBrg2)+ptMt[2][1],T/2*Math.sin(tBrg2)+ptMt[2][2],0,'T'];ptMt[8]=['R',R/2*Math.cos(-1*D/2),R/2*Math.sin(-1*D/2),0,'R'];ptMt[9]=['R',R/2*Math.cos(D/2),R/2*Math.sin(D/2),0,'R'];ptMt[10]=[0];lColor='#999999';lFont=Font.GREYBOX;PMdef=0;}
var lP=ptMt.length-1;var R=PtPtInverse(0,ptMt[0],ptMt[1])[0];var D=PtPtInverse(0,ptMt[0],ptMt[2])[2]*2;var Emax=((D>Math.PI)?R:ptMt[2][2]);var Emin=((D>Math.PI)?-1*R:ptMt[1][2]);var cE=new Array(3);cE[0]=['P',R,Emin,0,'D'];cE[1]=['P',R,Emax,0,'D'];cE[2]=[0];var toAng=(5*Math.PI/2-(2*Math.PI-D/2))%(2*Math.PI);var frAng=(5*Math.PI/2-D/2)%(2*Math.PI);if(D>175*Math.PI/180&&D<185*Math.PI/180){ptMt[3][1]=0;ptMt[3][2]=0;ptMt.splice(6,1);ptMt.splice(6,1);}
var SPar=FindScale(cE.concat(ptMt),Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;qLine(ptMt2[0],ptMt2[1],Canvas,jg);qLine(ptMt2[0],ptMt2[2],Canvas,jg);qLine(ptMt2[1],ptMt2[2],Canvas,jg);if(D<=175*Math.PI/180||D>=185*Math.PI/180){qLine(ptMt2[1],ptMt2[3],Canvas,jg);qLine(ptMt2[2],ptMt2[3],Canvas,jg);}
qArc(ptMt2[0][2],ptMt2[0][1],R*Scale,frAng,toAng,Canvas,jg);Labels(jg,ptMt,lP,lFont,lColor);jg.paint();Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);if(PMdef)ScaleBar(jg,Scale);jg.paint();}
function SketchTriangle(ptMt,Canvas){var PSP=$('#SolverCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var lColor='#000099';var lFont=Font.BLUEBOX;var PMdef=1;if(ptMt==''){ptMt=new Array(7);ptMt[0]=['B',0,0,0,'B'];ptMt[1]=['C',0,6,0,'C'];ptMt[2]=['A',4,3,0,'A'];ptMt[3]=['a',0,3,0,'a'];ptMt[4]=['c',2,1.5,0,'c'];ptMt[5]=['b',2,4.5,0,'b'];ptMt[6]=[0];lColor='#999999';lFont=Font.GREYBOX;PMdef=0;}
var lP=ptMt.length-1;var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,1,Canvas);qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);jg.setColor('#666666');jg.setStroke(Stroke.DOTTED);var ptMt2=ptMt.slice(0),lP2=lP;ptMt=ImgTrim(ptMt,Canvas);lP=ptMt.length-1;for(var i=0;i<2;i++)qLine(ptMt2[i],ptMt2[i+1],Canvas,jg);qLine(ptMt2[0],ptMt2[2],Canvas,jg);if(lP2>6){for(var i=6;i<8;i++)qLine(ptMt2[i],ptMt2[i+1],Canvas,jg);qLine(ptMt2[6],ptMt2[8],Canvas,jg);}
jg.setStroke(1);Labels(jg,ptMt,lP,lFont,lColor);jg.paint();Canvas=Canvas.replace(/Canvas/,'Control');qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);if(PMdef)ScaleBar(jg,Scale);jg.paint();}
function SketchPoints(){var ptMt=ParsePoints();var Canvas='PointsCanvas';var PSP=$('#PointsCanvasPar').val().split(' ');var Wc=parseInt(PSP[0]),Hc=parseInt(PSP[1]),Xc=parseInt(PSP[2]),Yc=parseInt(PSP[3]);var SPar=FindScale(ptMt,Wc,Hc);var Scale=SPar[0],Xmax=SPar[1],Xmin=SPar[2],Ymax=SPar[3],Ymin=SPar[4];ptMt=ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,0,Canvas);var lP=ptMt.length-1;qG(Canvas).innerHTML='';var jg=new jsGraphics(Canvas);Points(jg,ptMt,lP,'#000099');Labels(jg,ptMt,lP,Font.BLUEBOX,'#000099');jg.paint();Canvas='PointsControl';qG(Canvas).innerHTML='';jg=new jsGraphics(Canvas);ScaleBar(jg,Scale);jg.paint();}
function FindScale(ptMt,Width,Height){Width-=132;Height-=24;var lP=ptMt.length;var Ymax=-10e25,Xmax=-10e25,Ymin=10e25,Xmin=10e25;for(var i=0;i<lP;i++){var Xi=parseFloat(ptMt[i][2]),Yi=parseFloat(ptMt[i][1]);if(Yi>Ymax)Ymax=Yi;if(Yi<Ymin)Ymin=Yi;if(Xi>Xmax)Xmax=Xi;if(Xi<Xmin)Xmin=Xi;}
var RangeN=Ymax-Ymin,RangeE=Xmax-Xmin;var ScaleN=((RangeN)?Height/RangeN:10e25),ScaleE=((RangeE)?Width/RangeE:10e25);return[Math.min(ScaleE,ScaleN),Xmax,Xmin,Ymax,Ymin];}
function ImgCoord(ptMt,Scale,Xmax,Xmin,Ymax,Ymin,Xc,Yc,Wc,Hc,ForceAll,Canvas){var lP=ptMt.length-1;var Easel=Canvas.replace(/Canvas/,'Easel'),jCanvas='#'+Canvas,jEasel='#'+Easel;var WcReal=$(jCanvas).outerWidth(),HcReal=$(jCanvas).outerHeight(),XcReal=$(jCanvas).offset().left,YcReal=$(jCanvas).offset().top;var PadX=(Wc-(Xmax-Xmin)*Scale)/2,PadY=(Hc-(Ymax-Ymin)*Scale)/2;var We=$(jEasel).outerWidth(),He=$(jEasel).outerHeight(),Xe=$(jEasel).offset().left,Ye=$(jEasel).offset().top;for(var i=0;i<lP;i++){var Xval=Math.round((parseFloat(ptMt[i][2])-Xmin)*Scale+PadX-XcReal+Xc);var Yval=Math.round((Ymax-parseFloat(ptMt[i][1]))*Scale+PadY-YcReal+Yc);if((Yval<0||Yval>HcReal||Xval<0||Xval>WcReal)&&!ForceAll){ptMt.splice(i,1);lP-=1;i-=1;}
else{ptMt[i][1]=Yval;ptMt[i][2]=Xval;}}
return(ptMt);}
function ScaleBar(jg,Scale){var OptimalWidth=36,BaseScales=[10,15,20,25,40,50,75,100];if(Scale>0){var Factor=OptimalWidth/Scale;while(Factor>BaseScales[BaseScales.length-1]||Factor<BaseScales[0]){Factor=((Factor>BaseScales[BaseScales.length-1])?Factor/10:(Factor<BaseScales[0])?Factor*10:Factor);}
var Index=0,Max=100;for(var i=0;i<BaseScales.length;i++){if(Math.abs(BaseScales[i]-Factor)<Max){Index=i;Max=Math.abs(BaseScales[i]-Factor);}}
var BarWidth=Math.round(BaseScales[Index]*OptimalWidth/(Factor*2))*2;var Mult=((OptimalWidth/(Scale*Factor)>=1)?Math.round(OptimalWidth/(Scale*Factor)):1/Math.round((Scale*Factor)/OptimalWidth));Factor=BaseScales[Index]*Mult;Factor=Round(Factor,8);if(Factor>0){jg.setFont('arial','9px',Font.PLAIN);jg.setColor('#ffffff');jg.fillRect(6,79,51,16);jg.setColor('#666666');jg.drawStringRect(Factor+'',6,79,52,'center');jg.setStroke(3);jg.drawLine(30-BarWidth/2,90,30+BarWidth/2,90);}}}
function Points(jg,ptMt,lP,Color){jg.setColor(Color);for(var i=0;i<lP;i++){jg.fillRect(ptMt[i][2]-2,ptMt[i][1]-2,3,3);}}
function Labels(jg,ptMt,lP,fontStyle,Color){var Header=qG('header').innerHTML;if(Header!='Solver'){var Title=qG('LabelLink');var Titles=['Point Name','Elevation','Description','None'];var Index=[0,3,4,-1];for(var i=0;i<Titles.length;i++){if(Title.innerHTML==Titles[i])break;}
var k=Index[i];}
else var k=0;jg.setFont('monospace','11px',fontStyle,Color);if(k==0||k==4){for(i=0;i<lP;i++){jg.setColor(Color);jg.drawString(ptMt[i][k].replace(/\*/g,''),ptMt[i][2]+2,ptMt[i][1]-8);}}
else if(k==3){for(i=0;i<lP;i++){jg.setColor(Color);jg.drawString(FormatDecimal(ptMt[i][k],0,0),ptMt[i][2]+2,ptMt[i][1]-8);}}}
function qArc(Xc,Yc,R,As,Ae,Canvas,jg){var WcReal=$('#'+Canvas).outerWidth(),HcReal=$('#'+Canvas).outerHeight();if(Xc-R>0&&Yc-R>0&&Xc+R<WcReal&&Yc+R<HcReal){jg.drawEllipse(Xc-R-1,Yc-R-1,R*2,R*2,As,Ae);return;}
var Ints=new Array(10);Ints[0]=[Math.round(Xc-Math.sqrt(Math.pow(R,2)-Math.pow(Yc,2))),0,0,'A\n'];Ints[1]=[Math.round(Xc+Math.sqrt(Math.pow(R,2)-Math.pow(Yc,2))),0,0,'B\n'];Ints[2]=[Math.round(Xc-Math.sqrt(Math.pow(R,2)-Math.pow(HcReal-Yc,2))),HcReal,0,'C\n'];Ints[3]=[Math.round(Xc+Math.sqrt(Math.pow(R,2)-Math.pow(HcReal-Yc,2))),HcReal,0,'D\n'];Ints[4]=[0,Math.round(Yc-Math.sqrt(Math.pow(R,2)-Math.pow(Xc,2))),0,'E\n'];Ints[5]=[0,Math.round(Yc+Math.sqrt(Math.pow(R,2)-Math.pow(Xc,2))),0,'F\n'];Ints[6]=[WcReal,Math.round(Yc-Math.sqrt(Math.pow(R,2)-Math.pow(WcReal-Xc,2))),0,'G\n'];Ints[7]=[WcReal,Math.round(Yc+Math.sqrt(Math.pow(R,2)-Math.pow(WcReal-Xc,2))),0,'H\n'];Ints[8]=[Math.round(Xc+Math.cos(As)*R),Math.round(Yc-Math.sin(As)*R),As,'St\n'];Ints[9]=[Math.round(Xc+Math.cos(Ae)*R),Math.round(Yc-Math.sin(Ae)*R),Ae,'End\n'];var Sols=new Array(0);for(var i=0;i<=9;i++){if(Ints[i][0]>=0&&!isNaN(Ints[i][0])&&Ints[i][0]<=WcReal&&Ints[i][1]>=0&&!isNaN(Ints[i][1])&&Ints[i][1]<=HcReal){Sols[Sols.length]=Ints[i];var lS=Sols.length-1;Sols[lS][2]=Math.atan2(Sols[lS][1]-Yc,Sols[lS][0]-Xc);Sols[lS][2]=((Sols[lS][2]<0)?2*Math.PI+Sols[lS][2]:Sols[lS][2]);}}
var StAng=Math.atan2(Ints[8][1]-Yc,Ints[8][0]-Xc);StAng=((StAng<0)?2*Math.PI+StAng:StAng);var EndAng=Math.atan2(Ints[9][1]-Yc,Ints[9][0]-Xc);EndAng=((EndAng<0)?2*Math.PI+EndAng:EndAng);for(var i=0;i<=lS;i++){var AngChk=0;var Ang=Sols[i][2];if(StAng-EndAng>0&&(Ang<StAng&&Ang>EndAng))AngChk=1;if(StAng-EndAng<0&&(Ang==0||(Ang<2*Math.PI&&Ang>EndAng)||(Ang>0&&Ang<StAng)))AngChk=1;if(Ang==StAng||Ang==EndAng)AngChk=1;if(!AngChk){Sols.splice(i,1);i--;lS--;}}
if(Sols.length>0)Sols.sort(sortAng);else return;var BChk=0;for(i=0;i<=lS;i++){var E=((i<lS)?Sols[i+1][2]:Sols[0][2]),S=Sols[i][2];if(E-S>0){if(Math.PI/2<=E&&Math.PI/2>=S&&Yc+R>HcReal){BChk=1;break;}
if(Math.PI<=E&&Math.PI>S&&Xc-R<0){BChk=1;break;}
if(3*Math.PI/2<=E&&3*Math.PI/2>=S&&Yc-R<0){BChk=1;break;}}
if(E-S<0){if(Math.PI/2>=S&&Yc+R>HcReal){BChk=1;break;}
if(Math.PI>=S&&Xc-R<0){BChk=1;break;}
if(3*Math.PI/2>=S&&Yc-R<0){BChk=1;break;}
if(Xc+R>WcReal){BChk=1;break;}}}
if(i%2==0&&BChk){Sols[Sols.length]=Sols[0];Sols.splice(0,1);}
for(i=0;i<=lS-1;i+=2)jg.drawEllipse(Xc-R-1,Yc-R-1,R*2,R*2,2*Math.PI-Sols[i+1][2],2*Math.PI-Sols[i][2]);}
function sortAng(a,b){return((a[2]<b[2])?-1:((a[2]>b[2])?1:0));}
function psLineEnd(F,C,Canvas){var WcReal=$('#'+Canvas).outerWidth(),HcReal=$('#'+Canvas).outerHeight();if(C[2]>0&&C[2]<WcReal&&C[1]>0&&C[1]<HcReal)return C;if(C[2]<0){C[1]=Math.round(C[1]+(F[1]-C[1])/(F[2]-C[2])*(-1*C[2]));C[2]=0;}
else if(C[2]>WcReal){C[1]=Math.round(C[1]+(F[1]-C[1])/(F[2]-C[2])*(WcReal-C[2]));C[2]=WcReal;}
if(C[1]<0){C[2]=Math.round(C[2]+(F[2]-C[2])/(F[1]-C[1])*(-1*C[1]));C[1]=0;}
else if(C[1]>HcReal){C[2]=Math.round(C[2]+(F[2]-C[2])/(F[1]-C[1])*(HcReal-C[1]));C[1]=HcReal;}
if(isNaN(C[1])||isNaN(C[2])){C[1]=F[1];C[2]=F[2];}return C;}
function ImgTrim(ptMt,Canvas){var WcReal=$('#'+Canvas).outerWidth(),HcReal=$('#'+Canvas).outerHeight(),lP=ptMt.length-1;for(var i=0;i<lP;i++)if(ptMt[i][1]<0||ptMt[i][1]>HcReal||ptMt[i][2]<0||ptMt[i][2]>WcReal){ptMt.splice(i,1);lP-=1;i-=1;}
return ptMt;}
function qLine(F,T,Canvas,jg){var Fr=F.slice(0),To=T.slice(0);Fr=psLineEnd(To,Fr,Canvas);To=psLineEnd(Fr,To,Canvas);if(!(Fr[1]==To[1]&&Fr[2]==To[2]))jg.drawLine(Fr[2]-1,Fr[1]-1,To[2]-1,To[1]-1);}