// (c) 2007 KystAtlas AS (Hans Martin Mohn)

function gtComputeArea(coords)
{var p1;var p2;if(coords.length<2)
return 0;else if(coords.length==2)
{p1=coords[0].split(",");p2=coords[1].split(",");return Math.abs((p2[0]-p1[0])*(p2[1]-p1[1]));}
else
{p2=coords[0].split(",");var n=coords.length;var a=0.0;for(var i=0;i<n;i++)
{p1=p2;p2=coords[(i+1)%n].split(",");a+=(p1[0]*p2[1]-p2[0]*p1[1]);}
return Math.abs(a/2.0);}}
function gtComputeLineLength(p1,p2)
{p1=p1.split(",");p2=p2.split(",");var dx=p2[0]-p1[0];var dy=p2[1]-p1[1];return Math.sqrt(dx*dx+dy*dy);}
function gtComputePolylineLength(coords,closed)
{if(coords.length<2)
return 0;var p1;var p2=coords[0].split(",");var n=coords.length-1;var l=0.0;if(closed)
n++;for(var i=0;i<n;i++)
{p1=p2;p2=coords[(i+1)%coords.length].split(",");var dx=p2[0]-p1[0];var dy=p2[1]-p1[1];l+=Math.sqrt(dx*dx+dy*dy);}
return l;}
function gtComputeAngle(p1,p2)
{p1=p1.split(",");p2=p2.split(",");var dx=p2[0]-p1[0];var dy=p2[1]-p1[1];var a=Math.atan2(dx,dy)/Math.PI*180.0;if(a<0.0)
a+=360.0;return a;}
function gtComputeBoundingBoxAndCenter(coords)
{if(coords.length===0)
return null;var p=coords[0].split(",");var llx=p[0];var urx=p[0];var lly=p[1];var ury=p[1];for(var i=1;i<coords.length;i++)
{p=coords[i].split(",");llx=Math.min(llx,p[0]);urx=Math.max(urx,p[0]);lly=Math.min(lly,p[1]);ury=Math.max(ury,p[1]);}
var s=new Array(new gtPoint(llx,lly));s.push(new gtPoint(urx,lly));s.push(new gtPoint(urx,ury));s.push(new gtPoint(llx,ury));s.push(new gtPoint((llx+urx)/2.0,(lly+ury)/2.0));return s;}
function gtIsPointInsidePolygon(x,y,pts)
{var inside=false;var size=pts.length;var j=size-2;for(var i=0;i<size;i+=2)
{if(((pts[i+1]<=y&&y<pts[j+1])||(pts[j+1]<=y&&y<pts[i+1]))&&x<(pts[j]-pts[i])*(y-pts[i+1])/(pts[j+1]-pts[i+1])+pts[i])
{inside=!inside;}
j=i;}
return inside;}
var gtInside=0;var gtIntersect=1;var gtEnclose=2;var gtOutside=3;function lineOverlapType(t1,t2,s1,s2)
{if(t2<s1)
return gtOutside;else if(t2<s2)
{if(t1<s1)
return gtIntersect;else
return gtInside;}
else
{if(t1>s2)
return gtOutside;else if(t1>s1)
return gtIntersect;else
return gtEnclose;}}