








































var svgNS="http://www.w3.org/2000/svg";
var xlinkNS="http://www.w3.org/1999/xlink";
var cartoNS="http://www.carto.net/attrib";



function toPolarDir(xdiff,ydiff){
direction=(Math.atan2(ydiff,xdiff));

return(direction);
}

function toPolarDist(xdiff,ydiff){
distance=Math.sqrt(xdiff*xdiff+ydiff*ydiff);
return(distance);
}

function toRectX(direction,distance){
x=distance*Math.cos(direction);
y=distance*Math.sin(direction);
return(x);
}

function toRectY(direction,distance){
x=distance*Math.cos(direction);
y=distance*Math.sin(direction);
return(y);
}


function DegToRad(deg){
return(deg/180.0*Math.PI);
}


function RadToDeg(rad){
return(rad/Math.PI*180.0);
}


function intBilinear(za,zb,zc,zd,xpos,ypos,ax,ay,cellsize){
e=(xpos-ax)/cellsize;
f=(ypos-ay)/cellsize;


wa=(1-e)*(1-f);
wb=e*(1-f);
wc=e*f;
wd=f*(1-e);

height_interpol=wa*zc+wb*zd+wc*za+wd*zb;

return(height_interpol);
}


function leftOfTest(pointx,pointy,linex1,liney1,linex2,liney2){
result=(liney1-pointy)*(linex2-linex1)-(linex1-pointx)*(liney2-liney1);
if(result<0){
leftof=1;
}
else{
leftof=0;
}
return(leftof);
}


function distFromLine(xpoint,ypoint,linex1,liney1,linex2,liney2){
dx=linex2-linex1;
dy=liney2-liney1;
distance=(dy*(xpoint-linex1)-dx*(ypoint-liney1))/Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));
return(distance);
}


function radian2deg(radian){
deg=radian/Math.PI*180;
return(deg);
}




function angleBetwTwoLines(a1,a2,b1,b2){
angle=Math.acos((a1*b1+a2*b2)/(Math.sqrt(Math.pow(a1,2)+Math.pow(a2,2))*Math.sqrt(Math.pow(b1,2)+Math.pow(b2,2))));
return(angle);
}




function calcBisectorVector(a1,a2,b1,b2){
betraga=Math.sqrt(Math.pow(a1,2)+Math.pow(a2,2));
betragb=Math.sqrt(Math.pow(b1,2)+Math.pow(b2,2));
c=new Array();
c[0]=a1/betraga+b1/betragb;
c[1]=a2/betraga+b2/betragb;
return(c);
}




function calcBisectorAngle(a1,a2,b1,b2){
betraga=Math.sqrt(Math.pow(a1,2)+Math.pow(a2,2));
betragb=Math.sqrt(Math.pow(b1,2)+Math.pow(b2,2));
c1=a1/betraga+b1/betragb;
c2=a2/betraga+b2/betragb;
angle=toPolarDir(c1,c2);
return(angle);
}

function intersect2lines(line1x1,line1y1,line1x2,line1y2,line2x1,line2y1,line2x2,line2y2){

var result=new Array();
var denominator=(line2y2-line2y1)*(line1x2-line1x1)-(line2x2-line2x1)*(line1y2-line1y1);
if(denominator==0){
alert("lines are parallel");
}
else{
ua=((line2x2-line2x1)*(line1y1-line2y1)-(line2y2-line2y1)*(line1x1-line2x1))/denominator;
ub=((line1x2-line1x1)*(line1y1-line2y1)-(line1y2-line1y1)*(line1x1-line2x1))/denominator;
}
result["x"]=line1x1+ua*(line1x2-line1x1);
result["y"]=line1y1+ua*(line1y2-line1y1);
return(result);
}




function mySort(a,b){
var myResulta=a.split("+");
var myResultb=b.split("+");
if(parseFloat(myResulta[0])<parseFloat(myResultb[0])){
return 1;
}
else{
return-1;
}
}





function formatNumberString(myString){
var myNewString="";
var myCounter=myString.length;
if(myString.length>3){
while(myCounter>0){
if(myCounter>3){
myNewString=","+myString.substr(myCounter-3,3)+myNewString;
}
else{
myNewString=myString.substr(0,myCounter)+myNewString;
}
myCounter-=3;
}
}
else{
myNewString=myString;
}
return myNewString;
}


function statusChange(statusText){
document.getElementById("statusText").firstChild.nodeValue="Statusbar: "+statusText;
}


function scaleObject(evt,factor){

var element=evt.currentTarget;
var myX=element.getAttributeNS(null,"x");
var myY=element.getAttributeNS(null,"y");
var newtransform="scale("+factor+") translate("+(myX*1/factor-myX)+" "+(myY*1/factor-myY)+")";
element.setAttributeNS(null,'transform',newtransform);
}


function hsv2rgb(hue,sat,val){

var rgbArr=new Array();
if(sat==0){
rgbArr["red"]=Math.round(val*255);
rgbArr["green"]=Math.round(val*255);
rgbArr["blue"]=Math.round(val*255);
}
else{
var h=hue/60;
var i=Math.floor(h);
var f=h-i;
if(i%2==0){
f=1-f;
}
var m=val*(1-sat);
var n=val*(1-sat*f);
switch(i){
case 0:
rgbArr["red"]=val;
rgbArr["green"]=n;
rgbArr["blue"]=m;
break;
case 1:
rgbArr["red"]=n;
rgbArr["green"]=val;
rgbArr["blue"]=m;
break;
case 2:
rgbArr["red"]=m;
rgbArr["green"]=val;
rgbArr["blue"]=n;
break;
case 3:
rgbArr["red"]=m;
rgbArr["green"]=n;
rgbArr["blue"]=val;
break;
case 4:
rgbArr["red"]=n;
rgbArr["green"]=m;
rgbArr["blue"]=val;
break;
case 5:
rgbArr["red"]=val;
rgbArr["green"]=m;
rgbArr["blue"]=n;
break;
case 6:
rgbArr["red"]=val;
rgbArr["green"]=n;
rgbArr["blue"]=m;
break;
}
rgbArr["red"]=Math.round(rgbArr["red"]*255);
rgbArr["green"]=Math.round(rgbArr["green"]*255);
rgbArr["blue"]=Math.round(rgbArr["blue"]*255);
}
return rgbArr;
}

function rgb2hsv(red,green,blue){


var hsvArr=new Array();
red=red/255;
green=green/255;
blue=blue/255;
myMax=Math.max(red,Math.max(green,blue));
myMin=Math.min(red,Math.min(green,blue));
v=myMax;
if(myMax>0){
s=(myMax-myMin)/myMax;
}
else{
s=0;
}
if(s>0){
myDiff=myMax-myMin;
rc=(myMax-red)/myDiff;
gc=(myMax-green)/myDiff;
bc=(myMax-blue)/myDiff;
if(red==myMax){
h=(bc-gc)/6;
}
if(green==myMax){
h=(2+rc-bc)/6;
}
if(blue==myMax){
h=(4+gc-rc)/6;
}
}
else{
h=0;
}
if(h<0){
h+=1;
}
hsvArr["hue"]=Math.round(h*360);
hsvArr["sat"]=s;
hsvArr["val"]=v;
return hsvArr;
}

function assArrayPopulate(arrayKeys,arrayValues){
var returnArray=new Array();
if(arrayKeys.length!=arrayValues.length){
alert("error: arrays do not have same length!");
}
else{
for(i=0;i<arrayKeys.length;i++){
returnArray[arrayKeys[i]]=arrayValues[i];
}
}
return returnArray;
}

function replaceSpecialChars(myString){
for(i=161;i<256;i++){
re=new RegExp("&#"+i+";","g");
myString=myString.replace(re,String.fromCharCode(i));
}
return myString;
}
