/*@license Copyright 2009 Google Inc. */
(function(){var geo={isnamespace_:true};if(!("map"in Array.prototype))Array.prototype.map=function(mapFn){var len=this.length;if(typeof mapFn!="function")throw new TypeError("map() requires a mapping function.");var res=new Array(len);var thisp=arguments[1];for(var i=0;i<len;i++)if(i in this)res[i]=mapFn.call(thisp,this[i],i,this);return res};geo.ALTITUDE_CLAMP_TO_GROUND=0;geo.ALTITUDE_RELATIVE_TO_GROUND=1;geo.ALTITUDE_ABSOLUTE=2;geo.ALTITUDE_CLAMP_TO_SEA_FLOOR=4;geo.ALTITUDE_RELATIVE_TO_SEA_FLOOR=
5;var Sylvester={precision:1.0E-6};function Vector(){}Vector.prototype={e:function(i){return i<1||i>this.elements.length?null:this.elements[i-1]},dimensions:function(){return this.elements.length},modulus:function(){return Math.sqrt(this.dot(this))},eql:function(vector){var n=this.elements.length;var V=vector.elements||vector;if(n!=V.length)return false;while(n--)if(Math.abs(this.elements[n]-V[n])>Sylvester.precision)return false;return true},dup:function(){return Vector.create(this.elements)},map:function(fn){var elements=
[];this.each(function(x,i){elements.push(fn(x,i))});return Vector.create(elements)},each:function(fn){var n=this.elements.length;for(var i=0;i<n;i++)fn(this.elements[i],i+1)},toUnitVector:function(){var r=this.modulus();if(r===0)return this.dup();return this.map(function(x){return x/r})},angleFrom:function(vector){var V=vector.elements||vector;var n=this.elements.length,k=n,i;if(n!=V.length)return null;var dot=0,mod1=0,mod2=0;this.each(function(x,i){dot+=x*V[i-1];mod1+=x*x;mod2+=V[i-1]*V[i-1]});mod1=
Math.sqrt(mod1);mod2=Math.sqrt(mod2);if(mod1*mod2===0)return null;var theta=dot/(mod1*mod2);if(theta<-1)theta=-1;if(theta>1)theta=1;return Math.acos(theta)},isParallelTo:function(vector){var angle=this.angleFrom(vector);return angle===null?null:angle<=Sylvester.precision},isAntiparallelTo:function(vector){var angle=this.angleFrom(vector);return angle===null?null:Math.abs(angle-Math.PI)<=Sylvester.precision},isPerpendicularTo:function(vector){var dot=this.dot(vector);return dot===null?null:Math.abs(dot)<=
Sylvester.precision},add:function(vector){var V=vector.elements||vector;if(this.elements.length!=V.length)return null;return this.map(function(x,i){return x+V[i-1]})},subtract:function(vector){var V=vector.elements||vector;if(this.elements.length!=V.length)return null;return this.map(function(x,i){return x-V[i-1]})},multiply:function(k){return this.map(function(x){return x*k})},x:function(k){return this.multiply(k)},dot:function(vector){var V=vector.elements||vector;var i,product=0,n=this.elements.length;
if(n!=V.length)return null;while(n--)product+=this.elements[n]*V[n];return product},cross:function(vector){var B=vector.elements||vector;if(this.elements.length!=3||B.length!=3)return null;var A=this.elements;return Vector.create([A[1]*B[2]-A[2]*B[1],A[2]*B[0]-A[0]*B[2],A[0]*B[1]-A[1]*B[0]])},max:function(){var m=0,i=this.elements.length;while(i--)if(Math.abs(this.elements[i])>Math.abs(m))m=this.elements[i];return m},indexOf:function(x){var index=null,n=this.elements.length;for(var i=0;i<n;i++)if(index===
null&&this.elements[i]==x)index=i+1;return index},toDiagonalMatrix:function(){return Matrix.Diagonal(this.elements)},round:function(){return this.map(function(x){return Math.round(x)})},snapTo:function(x){return this.map(function(y){return Math.abs(y-x)<=Sylvester.precision?x:y})},distanceFrom:function(obj){if(obj.anchor||obj.start&&obj.end)return obj.distanceFrom(this);var V=obj.elements||obj;if(V.length!=this.elements.length)return null;var sum=0,part;this.each(function(x,i){part=x-V[i-1];sum+=
part*part});return Math.sqrt(sum)},liesOn:function(line){return line.contains(this)},liesIn:function(plane){return plane.contains(this)},rotate:function(t,obj){var V,R=null,x,y,z;if(t.determinant)R=t.elements;switch(this.elements.length){case 2:V=obj.elements||obj;if(V.length!=2)return null;if(!R)R=Matrix.Rotation(t).elements;x=this.elements[0]-V[0];y=this.elements[1]-V[1];return Vector.create([V[0]+R[0][0]*x+R[0][1]*y,V[1]+R[1][0]*x+R[1][1]*y]);break;case 3:if(!obj.direction)return null;var C=obj.pointClosestTo(this).elements;
if(!R)R=Matrix.Rotation(t,obj.direction).elements;x=this.elements[0]-C[0];y=this.elements[1]-C[1];z=this.elements[2]-C[2];return Vector.create([C[0]+R[0][0]*x+R[0][1]*y+R[0][2]*z,C[1]+R[1][0]*x+R[1][1]*y+R[1][2]*z,C[2]+R[2][0]*x+R[2][1]*y+R[2][2]*z]);break;default:return null}},reflectionIn:function(obj){if(obj.anchor){var P=this.elements.slice();var C=obj.pointClosestTo(P).elements;return Vector.create([C[0]+(C[0]-P[0]),C[1]+(C[1]-P[1]),C[2]+(C[2]-(P[2]||0))])}else{var Q=obj.elements||obj;if(this.elements.length!=
Q.length)return null;return this.map(function(x,i){return Q[i-1]+(Q[i-1]-x)})}},to3D:function(){var V=this.dup();switch(V.elements.length){case 3:break;case 2:V.elements.push(0);break;default:return null}return V},inspect:function(){return"["+this.elements.join(", ")+"]"},setElements:function(els){this.elements=(els.elements||els).slice();return this}};Vector.create=function(elements){var V=new Vector;return V.setElements(elements)};var $V=Vector.create;Vector.i=Vector.create([1,0,0]);Vector.j=Vector.create([0,
1,0]);Vector.k=Vector.create([0,0,1]);Vector.Random=function(n){var elements=[];while(n--)elements.push(Math.random());return Vector.create(elements)};Vector.Zero=function(n){var elements=[];while(n--)elements.push(0);return Vector.create(elements)};function Matrix(){}Matrix.prototype={e:function(i,j){if(i<1||i>this.elements.length||j<1||j>this.elements[0].length)return null;return this.elements[i-1][j-1]},row:function(i){if(i>this.elements.length)return null;return Vector.create(this.elements[i-
1])},col:function(j){if(j>this.elements[0].length)return null;var col=[],n=this.elements.length;for(var i=0;i<n;i++)col.push(this.elements[i][j-1]);return Vector.create(col)},dimensions:function(){return{rows:this.elements.length,cols:this.elements[0].length}},rows:function(){return this.elements.length},cols:function(){return this.elements[0].length},eql:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;if(this.elements.length!=M.length||this.elements[0].length!=
M[0].length)return false;var i=this.elements.length,nj=this.elements[0].length,j;while(i--){j=nj;while(j--)if(Math.abs(this.elements[i][j]-M[i][j])>Sylvester.precision)return false}return true},dup:function(){return Matrix.create(this.elements)},map:function(fn){var els=[],i=this.elements.length,nj=this.elements[0].length,j;while(i--){j=nj;els[i]=[];while(j--)els[i][j]=fn(this.elements[i][j],i+1,j+1)}return Matrix.create(els)},isSameSizeAs:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]==
"undefined")M=Matrix.create(M).elements;return this.elements.length==M.length&&this.elements[0].length==M[0].length},add:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;if(!this.isSameSizeAs(M))return null;return this.map(function(x,i,j){return x+M[i-1][j-1]})},subtract:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;if(!this.isSameSizeAs(M))return null;return this.map(function(x,i,
j){return x-M[i-1][j-1]})},canMultiplyFromLeft:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;return this.elements[0].length==M.length},multiply:function(matrix){if(!matrix.elements)return this.map(function(x){return x*matrix});var returnVector=matrix.modulus?true:false;var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;if(!this.canMultiplyFromLeft(M))return null;var i=this.elements.length,nj=M[0].length,
j;var cols=this.elements[0].length,c,elements=[],sum;while(i--){j=nj;elements[i]=[];while(j--){c=cols;sum=0;while(c--)sum+=this.elements[i][c]*M[c][j];elements[i][j]=sum}}var M=Matrix.create(elements);return returnVector?M.col(1):M},x:function(matrix){return this.multiply(matrix)},minor:function(a,b,c,d){var elements=[],ni=c,i,nj,j;var rows=this.elements.length,cols=this.elements[0].length;while(ni--){i=c-ni-1;elements[i]=[];nj=d;while(nj--){j=d-nj-1;elements[i][j]=this.elements[(a+i-1)%rows][(b+
j-1)%cols]}}return Matrix.create(elements)},transpose:function(){var rows=this.elements.length,i,cols=this.elements[0].length,j;var elements=[],i=cols;while(i--){j=rows;elements[i]=[];while(j--)elements[i][j]=this.elements[j][i]}return Matrix.create(elements)},isSquare:function(){return this.elements.length==this.elements[0].length},max:function(){var m=0,i=this.elements.length,nj=this.elements[0].length,j;while(i--){j=nj;while(j--)if(Math.abs(this.elements[i][j])>Math.abs(m))m=this.elements[i][j]}return m},
indexOf:function(x){var index=null,ni=this.elements.length,i,nj=this.elements[0].length,j;for(i=0;i<ni;i++)for(j=0;j<nj;j++)if(this.elements[i][j]==x)return{i:i+1,j:j+1};return null},diagonal:function(){if(!this.isSquare)return null;var els=[],n=this.elements.length;for(var i=0;i<n;i++)els.push(this.elements[i][i]);return Vector.create(els)},toRightTriangular:function(){var M=this.dup(),els;var n=this.elements.length,i,j,np=this.elements[0].length,p;for(i=0;i<n;i++){if(M.elements[i][i]==0)for(j=i+
1;j<n;j++)if(M.elements[j][i]!=0){els=[];for(p=0;p<np;p++)els.push(M.elements[i][p]+M.elements[j][p]);M.elements[i]=els;break}if(M.elements[i][i]!=0)for(j=i+1;j<n;j++){var multiplier=M.elements[j][i]/M.elements[i][i];els=[];for(p=0;p<np;p++)els.push(p<=i?0:M.elements[j][p]-M.elements[i][p]*multiplier);M.elements[j]=els}}return M},toUpperTriangular:function(){return this.toRightTriangular()},determinant:function(){if(!this.isSquare())return null;var M=this.toRightTriangular();var det=M.elements[0][0],
n=M.elements.length;for(var i=1;i<n;i++)det=det*M.elements[i][i];return det},det:function(){return this.determinant()},isSingular:function(){return this.isSquare()&&this.determinant()===0},trace:function(){if(!this.isSquare())return null;var tr=this.elements[0][0],n=this.elements.length;for(var i=1;i<n;i++)tr+=this.elements[i][i];return tr},tr:function(){return this.trace()},rank:function(){var M=this.toRightTriangular(),rank=0;var i=this.elements.length,nj=this.elements[0].length,j;while(i--){j=
nj;while(j--)if(Math.abs(M.elements[i][j])>Sylvester.precision){rank++;break}}return rank},rk:function(){return this.rank()},augment:function(matrix){var M=matrix.elements||matrix;if(typeof M[0][0]=="undefined")M=Matrix.create(M).elements;var T=this.dup(),cols=T.elements[0].length;var i=T.elements.length,nj=M[0].length,j;if(i!=M.length)return null;while(i--){j=nj;while(j--)T.elements[i][cols+j]=M[i][j]}return T},inverse:function(){if(!this.isSquare()||this.isSingular())return null;var n=this.elements.length,
i=n,j;var M=this.augment(Matrix.I(n)).toRightTriangular();var np=M.elements[0].length,p,els,divisor;var inverse_elements=[],new_element;while(i--){els=[];inverse_elements[i]=[];divisor=M.elements[i][i];for(p=0;p<np;p++){new_element=M.elements[i][p]/divisor;els.push(new_element);if(p>=n)inverse_elements[i].push(new_element)}M.elements[i]=els;j=i;while(j--){els=[];for(p=0;p<np;p++)els.push(M.elements[j][p]-M.elements[i][p]*M.elements[j][i]);M.elements[j]=els}}return Matrix.create(inverse_elements)},
inv:function(){return this.inverse()},round:function(){return this.map(function(x){return Math.round(x)})},snapTo:function(x){return this.map(function(p){return Math.abs(p-x)<=Sylvester.precision?x:p})},inspect:function(){var matrix_rows=[];var n=this.elements.length;for(var i=0;i<n;i++)matrix_rows.push(Vector.create(this.elements[i]).inspect());return matrix_rows.join("\n")},setElements:function(els){var i,j,elements=els.elements||els;if(typeof elements[0][0]!="undefined"){i=elements.length;this.elements=
[];while(i--){j=elements[i].length;this.elements[i]=[];while(j--)this.elements[i][j]=elements[i][j]}return this}var n=elements.length;this.elements=[];for(i=0;i<n;i++)this.elements.push([elements[i]]);return this}};Matrix.create=function(elements){var M=new Matrix;return M.setElements(elements)};var $M=Matrix.create;Matrix.I=function(n){var els=[],i=n,j;while(i--){j=n;els[i]=[];while(j--)els[i][j]=i==j?1:0}return Matrix.create(els)};Matrix.Diagonal=function(elements){var i=elements.length;var M=Matrix.I(i);
while(i--)M.elements[i][i]=elements[i];return M};Matrix.Rotation=function(theta,a){if(!a)return Matrix.create([[Math.cos(theta),-Math.sin(theta)],[Math.sin(theta),Math.cos(theta)]]);var axis=a.dup();if(axis.elements.length!=3)return null;var mod=axis.modulus();var x=axis.elements[0]/mod,y=axis.elements[1]/mod,z=axis.elements[2]/mod;var s=Math.sin(theta),c=Math.cos(theta),t=1-c;return Matrix.create([[t*x*x+c,t*x*y-s*z,t*x*z+s*y],[t*x*y+s*z,t*y*y+c,t*y*z-s*x],[t*x*z-s*y,t*y*z+s*x,t*z*z+c]])};Matrix.RotationX=
function(t){var c=Math.cos(t),s=Math.sin(t);return Matrix.create([[1,0,0],[0,c,-s],[0,s,c]])};Matrix.RotationY=function(t){var c=Math.cos(t),s=Math.sin(t);return Matrix.create([[c,0,s],[0,1,0],[-s,0,c]])};Matrix.RotationZ=function(t){var c=Math.cos(t),s=Math.sin(t);return Matrix.create([[c,-s,0],[s,c,0],[0,0,1]])};Matrix.Random=function(n,m){return Matrix.Zero(n,m).map(function(){return Math.random()})};Matrix.Zero=function(n,m){var els=[],i=n,j;while(i--){j=m;els[i]=[];while(j--)els[i][j]=0}return Matrix.create(els)};
function Line(){}Line.prototype={eql:function(line){return this.isParallelTo(line)&&this.contains(line.anchor)},dup:function(){return Line.create(this.anchor,this.direction)},translate:function(vector){var V=vector.elements||vector;return Line.create([this.anchor.elements[0]+V[0],this.anchor.elements[1]+V[1],this.anchor.elements[2]+(V[2]||0)],this.direction)},isParallelTo:function(obj){if(obj.normal||obj.start&&obj.end)return obj.isParallelTo(this);var theta=this.direction.angleFrom(obj.direction);
return Math.abs(theta)<=Sylvester.precision||Math.abs(theta-Math.PI)<=Sylvester.precision},distanceFrom:function(obj){if(obj.normal||obj.start&&obj.end)return obj.distanceFrom(this);if(obj.direction){if(this.isParallelTo(obj))return this.distanceFrom(obj.anchor);var N=this.direction.cross(obj.direction).toUnitVector().elements;var A=this.anchor.elements,B=obj.anchor.elements;return Math.abs((A[0]-B[0])*N[0]+(A[1]-B[1])*N[1]+(A[2]-B[2])*N[2])}else{var P=obj.elements||obj;var A=this.anchor.elements,
D=this.direction.elements;var PA1=P[0]-A[0],PA2=P[1]-A[1],PA3=(P[2]||0)-A[2];var modPA=Math.sqrt(PA1*PA1+PA2*PA2+PA3*PA3);if(modPA===0)return 0;var cosTheta=(PA1*D[0]+PA2*D[1]+PA3*D[2])/modPA;var sin2=1-cosTheta*cosTheta;return Math.abs(modPA*Math.sqrt(sin2<0?0:sin2))}},contains:function(obj){if(obj.start&&obj.end)return this.contains(obj.start)&&this.contains(obj.end);var dist=this.distanceFrom(obj);return dist!==null&&dist<=Sylvester.precision},positionOf:function(point){if(!this.contains(point))return null;
var P=point.elements||point;var A=this.anchor.elements,D=this.direction.elements;return(P[0]-A[0])*D[0]+(P[1]-A[1])*D[1]+((P[2]||0)-A[2])*D[2]},liesIn:function(plane){return plane.contains(this)},intersects:function(obj){if(obj.normal)return obj.intersects(this);return!this.isParallelTo(obj)&&this.distanceFrom(obj)<=Sylvester.precision},intersectionWith:function(obj){if(obj.normal||obj.start&&obj.end)return obj.intersectionWith(this);if(!this.intersects(obj))return null;var P=this.anchor.elements,
X=this.direction.elements,Q=obj.anchor.elements,Y=obj.direction.elements;var X1=X[0],X2=X[1],X3=X[2],Y1=Y[0],Y2=Y[1],Y3=Y[2];var PsubQ1=P[0]-Q[0],PsubQ2=P[1]-Q[1],PsubQ3=P[2]-Q[2];var XdotQsubP=-X1*PsubQ1-X2*PsubQ2-X3*PsubQ3;var YdotPsubQ=Y1*PsubQ1+Y2*PsubQ2+Y3*PsubQ3;var XdotX=X1*X1+X2*X2+X3*X3;var YdotY=Y1*Y1+Y2*Y2+Y3*Y3;var XdotY=X1*Y1+X2*Y2+X3*Y3;var k=(XdotQsubP*YdotY/XdotX+XdotY*YdotPsubQ)/(YdotY-XdotY*XdotY);return Vector.create([P[0]+k*X1,P[1]+k*X2,P[2]+k*X3])},pointClosestTo:function(obj){if(obj.start&&
obj.end){var P=obj.pointClosestTo(this);return P===null?null:this.pointClosestTo(P)}else if(obj.direction){if(this.intersects(obj))return this.intersectionWith(obj);if(this.isParallelTo(obj))return null;var D=this.direction.elements,E=obj.direction.elements;var D1=D[0],D2=D[1],D3=D[2],E1=E[0],E2=E[1],E3=E[2];var x=D3*E1-D1*E3,y=D1*E2-D2*E1,z=D2*E3-D3*E2;var N=[x*E3-y*E2,y*E1-z*E3,z*E2-x*E1];var P=Plane.create(obj.anchor,N);return P.intersectionWith(this)}else{var P=obj.elements||obj;if(this.contains(P))return Vector.create(P);
var A=this.anchor.elements,D=this.direction.elements;var D1=D[0],D2=D[1],D3=D[2],A1=A[0],A2=A[1],A3=A[2];var x=D1*(P[1]-A2)-D2*(P[0]-A1),y=D2*((P[2]||0)-A3)-D3*(P[1]-A2),z=D3*(P[0]-A1)-D1*((P[2]||0)-A3);var V=Vector.create([D2*x-D3*z,D3*y-D1*x,D1*z-D2*y]);var k=this.distanceFrom(P)/V.modulus();return Vector.create([P[0]+V.elements[0]*k,P[1]+V.elements[1]*k,(P[2]||0)+V.elements[2]*k])}},rotate:function(t,line){if(typeof line.direction=="undefined")line=Line.create(line.to3D(),Vector.k);var R=Matrix.Rotation(t,
line.direction).elements;var C=line.pointClosestTo(this.anchor).elements;var A=this.anchor.elements,D=this.direction.elements;var C1=C[0],C2=C[1],C3=C[2],A1=A[0],A2=A[1],A3=A[2];var x=A1-C1,y=A2-C2,z=A3-C3;return Line.create([C1+R[0][0]*x+R[0][1]*y+R[0][2]*z,C2+R[1][0]*x+R[1][1]*y+R[1][2]*z,C3+R[2][0]*x+R[2][1]*y+R[2][2]*z],[R[0][0]*D[0]+R[0][1]*D[1]+R[0][2]*D[2],R[1][0]*D[0]+R[1][1]*D[1]+R[1][2]*D[2],R[2][0]*D[0]+R[2][1]*D[1]+R[2][2]*D[2]])},reverse:function(){return Line.create(this.anchor,this.direction.x(-1))},
reflectionIn:function(obj){if(obj.normal){var A=this.anchor.elements,D=this.direction.elements;var A1=A[0],A2=A[1],A3=A[2],D1=D[0],D2=D[1],D3=D[2];var newA=this.anchor.reflectionIn(obj).elements;var AD1=A1+D1,AD2=A2+D2,AD3=A3+D3;var Q=obj.pointClosestTo([AD1,AD2,AD3]).elements;var newD=[Q[0]+(Q[0]-AD1)-newA[0],Q[1]+(Q[1]-AD2)-newA[1],Q[2]+(Q[2]-AD3)-newA[2]];return Line.create(newA,newD)}else if(obj.direction)return this.rotate(Math.PI,obj);else{var P=obj.elements||obj;return Line.create(this.anchor.reflectionIn([P[0],
P[1],P[2]||0]),this.direction)}},setVectors:function(anchor,direction){anchor=Vector.create(anchor);direction=Vector.create(direction);if(anchor.elements.length==2)anchor.elements.push(0);if(direction.elements.length==2)direction.elements.push(0);if(anchor.elements.length>3||direction.elements.length>3)return null;var mod=direction.modulus();if(mod===0)return null;this.anchor=anchor;this.direction=Vector.create([direction.elements[0]/mod,direction.elements[1]/mod,direction.elements[2]/mod]);return this}};
Line.create=function(anchor,direction){var L=new Line;return L.setVectors(anchor,direction)};var $L=Line.create;Line.X=Line.create(Vector.Zero(3),Vector.i);Line.Y=Line.create(Vector.Zero(3),Vector.j);Line.Z=Line.create(Vector.Zero(3),Vector.k);geo.linalg={};geo.linalg.Vector=function(){return Vector.create.apply(null,arguments)};geo.linalg.Vector.create=Vector.create;geo.linalg.Vector.i=Vector.i;geo.linalg.Vector.j=Vector.j;geo.linalg.Vector.k=Vector.k;geo.linalg.Vector.Random=Vector.Random;geo.linalg.Vector.Zero=
Vector.Zero;geo.linalg.Matrix=function(){return Matrix.create.apply(null,arguments)};geo.linalg.Matrix.create=Matrix.create;geo.linalg.Matrix.I=Matrix.I;geo.linalg.Matrix.Random=Matrix.Random;geo.linalg.Matrix.Rotation=Matrix.Rotation;geo.linalg.Matrix.RotationX=Matrix.RotationX;geo.linalg.Matrix.RotationY=Matrix.RotationY;geo.linalg.Matrix.RotationZ=Matrix.RotationZ;geo.linalg.Matrix.Zero=Matrix.Zero;geo.linalg.Line=function(){return Line.create.apply(null,arguments)};geo.linalg.Line.create=Line.create;
geo.linalg.Line.X=Line.X;geo.linalg.Line.Y=Line.Y;geo.linalg.Line.Z=Line.Z;geo.math={isnamespace_:true};if(!("toDegrees"in Number.prototype))Number.prototype.toDegrees=function(){return this*180/Math.PI};if(!("toRadians"in Number.prototype))Number.prototype.toRadians=function(){return this*Math.PI/180};geo.math.normalizeAngle=function(angleRad){angleRad=angleRad%(2*Math.PI);return angleRad>=0?angleRad:angleRad+2*Math.PI};geo.math.normalizeLat=function(lat){return Math.max(-90,Math.min(90,lat))};geo.math.normalizeLng=
function(lng){if(lng%360==180)return 180;lng=lng%360;return lng<-180?lng+360:lng>180?lng-360:lng};geo.math.reverseAngle=function(angleRad){return geo.math.normalizeAngle(angleRad+Math.PI)};geo.math.wrapValue=function(value,range,favorMin){if(!range||!geo.util.isArray(range)||range.length!=2)throw new TypeError("The range parameter must be an array of 2 numbers.");if(value===range[0])return range[0];value-=range[0];value=value%(range[1]-range[0]);if(value<0)value+=range[1]-range[0];value+=range[0];
return value===range[0]?favorMin?range[0]:range[1]:value};geo.math.constrainValue=function(value,range){if(!range||!geo.util.isArray(range)||range.length!=2)throw new TypeError("The range parameter must be an array of 2 numbers.");return Math.max(range[0],Math.min(range[1],value))};geo.math.EARTH_RADIUS=6378135;geo.math.EARTH_RADIUS_CURVATURE_AVG=6372795;geo.math.distance=function(point1,point2){return geo.math.EARTH_RADIUS*geo.math.angularDistance(point1,point2)};geo.math.angularDistance=function(point1,
point2){var phi1=point1.lat().toRadians();var phi2=point2.lat().toRadians();var d_phi=(point2.lat()-point1.lat()).toRadians();var d_lmd=(point2.lng()-point1.lng()).toRadians();var A=Math.pow(Math.sin(d_phi/2),2)+Math.cos(phi1)*Math.cos(phi2)*Math.pow(Math.sin(d_lmd/2),2);return 2*Math.atan2(Math.sqrt(A),Math.sqrt(1-A))};geo.math.heading=function(start,dest){var phi1=start.lat().toRadians();var phi2=dest.lat().toRadians();var cos_phi2=Math.cos(phi2);var d_lmd=(dest.lng()-start.lng()).toRadians();return geo.math.normalizeAngle(Math.atan2(Math.sin(d_lmd)*
cos_phi2,Math.cos(phi1)*Math.sin(phi2)-Math.sin(phi1)*cos_phi2*Math.cos(d_lmd))).toDegrees()};geo.math.bearing=geo.math.heading;geo.math.midpoint=function(point1,point2,fraction){if(geo.util.isUndefined(fraction)||fraction===null)fraction=0.5;if(point1.equals(point2))return new geo.Point(point1);var phi1=point1.lat().toRadians();var phi2=point2.lat().toRadians();var lmd1=point1.lng().toRadians();var lmd2=point2.lng().toRadians();var cos_phi1=Math.cos(phi1);var cos_phi2=Math.cos(phi2);var angularDistance=
geo.math.angularDistance(point1,point2);var sin_angularDistance=Math.sin(angularDistance);var A=Math.sin((1-fraction)*angularDistance)/sin_angularDistance;var B=Math.sin(fraction*angularDistance)/sin_angularDistance;var x=A*cos_phi1*Math.cos(lmd1)+B*cos_phi2*Math.cos(lmd2);var y=A*cos_phi1*Math.sin(lmd1)+B*cos_phi2*Math.sin(lmd2);var z=A*Math.sin(phi1)+B*Math.sin(phi2);return new geo.Point(Math.atan2(z,Math.sqrt(Math.pow(x,2)+Math.pow(y,2))).toDegrees(),Math.atan2(y,x).toDegrees())};geo.math.destination=
function(start,options){if(!("heading"in options&&"distance"in options))throw new TypeError("destination() requres both heading and "+"distance options.");var phi1=start.lat().toRadians();var sin_phi1=Math.sin(phi1);var angularDistance=options.distance/geo.math.EARTH_RADIUS;var heading_rad=options.heading.toRadians();var sin_angularDistance=Math.sin(angularDistance);var cos_angularDistance=Math.cos(angularDistance);var phi2=Math.asin(sin_phi1*cos_angularDistance+Math.cos(phi1)*sin_angularDistance*
Math.cos(heading_rad));return new geo.Point(phi2.toDegrees(),Math.atan2(Math.sin(heading_rad)*sin_angularDistance*Math.cos(phi2),cos_angularDistance-sin_phi1*Math.sin(phi2)).toDegrees()+start.lng())};geo.Point=function(){var pointArraySrc=null;if(arguments.length==1){var point=arguments[0];if(point.constructor===geo.Point){this.lat_=point.lat();this.lng_=point.lng();this.altitude_=point.altitude();this.altitudeMode_=point.altitudeMode()}else if(geo.util.isArray(point))pointArraySrc=point;else if(isEarthAPIObject_(point)){var type=
point.getType();if(type=="KmlPoint"||type=="KmlLookAt"){this.lat_=point.getLatitude();this.lng_=point.getLongitude();this.altitude_=point.getAltitude();this.altitudeMode_=point.getAltitudeMode()}else if(type=="KmlCoord"||type=="KmlLocation"){this.lat_=point.getLatitude();this.lng_=point.getLongitude();this.altitude_=point.getAltitude()}else throw new TypeError("Could not create a point from the given Earth object");}else if(isGLatLng_(point)){this.lat_=point.lat();this.lng_=point.lng()}else throw new TypeError("Could not create a point from the given arguments");
}else pointArraySrc=arguments;if(pointArraySrc){for(var i=0;i<pointArraySrc.length;i++)if(typeof pointArraySrc[i]!="number")throw new TypeError("Coordinates must be numerical");this.lat_=pointArraySrc[0];this.lng_=pointArraySrc[1];if(pointArraySrc.length>=3){this.altitude_=pointArraySrc[2];if(pointArraySrc.length>=4)this.altitudeMode_=pointArraySrc[3]}}this.lat_=geo.math.normalizeLat(this.lat_);this.lng_=geo.math.normalizeLng(this.lng_)};geo.Point.prototype.lat=function(){return this.lat_};geo.Point.prototype.lat_=
0;geo.Point.prototype.lng=function(){return this.lng_};geo.Point.prototype.lng_=0;geo.Point.prototype.altitude=function(){return this.altitude_};geo.Point.prototype.altitude_=0;geo.Point.prototype.altitudeMode=function(){return this.altitudeMode_};geo.Point.prototype.altitudeMode_=geo.ALTITUDE_RELATIVE_TO_GROUND;geo.Point.prototype.toString=function(){return"("+this.lat().toString()+", "+this.lng().toString()+", "+this.altitude().toString()+")"};geo.Point.prototype.flatten=function(){return new geo.Point(this.lat(),
this.lng())};geo.Point.prototype.is3D=function(){return this.altitude_!==0};geo.Point.prototype.equals=function(p2){return this.lat()==p2.lat()&&this.lng()==p2.lng()&&this.altitude()==p2.altitude()&&this.altitudeMode()==p2.altitudeMode()};geo.Point.prototype.angularDistance=function(dest){return geo.math.angularDistance(this,dest)};geo.Point.prototype.distance=function(dest){return geo.math.distance(this,dest)};geo.Point.prototype.heading=function(dest){return geo.math.heading(this,dest)};geo.Point.prototype.midpoint=
function(dest,fraction){return geo.math.midpoint(this,dest,fraction)};geo.Point.prototype.destination=function(options){return geo.math.destination(this,options)};geo.Point.prototype.toCartesian=function(){var sin_phi=Math.sin(this.lng().toRadians());var cos_phi=Math.cos(this.lng().toRadians());var sin_lmd=Math.sin(this.lat().toRadians());var cos_lmd=Math.cos(this.lat().toRadians());var r=geo.math.EARTH_RADIUS+this.altitude();return new geo.linalg.Vector([r*cos_phi*cos_lmd,r*sin_lmd,r*-sin_phi*cos_lmd])};
geo.Point.fromCartesian=function(cartesianVector){var r=cartesianVector.distanceFrom(geo.linalg.Vector.Zero(3));var unitVector=cartesianVector.toUnitVector();var altitude=r-geo.math.EARTH_RADIUS;var lat=Math.asin(unitVector.e(2)).toDegrees();if(lat>90)lat-=180;var lng=0;if(Math.abs(lat)<90)lng=-Math.atan2(unitVector.e(3),unitVector.e(1)).toDegrees();return new geo.Point(lat,lng,altitude)};geo.Bounds=function(){if(arguments.length==1)if(arguments[0].constructor===geo.Bounds){var bounds=arguments[0];
this.sw_=new geo.Point(bounds.southWestBottom());this.ne_=new geo.Point(bounds.northEastTop())}else this.sw_=this.ne_=new geo.Point(arguments[0]);else if(arguments.length==2){var sw=new geo.Point(arguments[0]);var ne=new geo.Point(arguments[1]);if(!sw&&!ne)return;else if(!sw)sw=ne;else if(!ne)ne=sw;if(sw.lat()>ne.lat())throw new RangeError("Bounds southwest coordinate cannot be north of "+"the northeast coordinate");if(sw.altitude()>ne.altitude())throw new RangeError("Bounds southwest coordinate cannot be north of "+
"the northeast coordinate");this.sw_=sw;this.ne_=ne}};geo.Bounds.prototype.southWestBottom=function(){return this.sw_};geo.Bounds.prototype.sw_=null;geo.Bounds.prototype.south=function(){return!this.isEmpty()?this.sw_.lat():null};geo.Bounds.prototype.west=function(){return!this.isEmpty()?this.sw_.lng():null};geo.Bounds.prototype.bottom=function(){return!this.isEmpty()?this.sw_.altitude():null};geo.Bounds.prototype.northEastTop=function(){return this.ne_};geo.Bounds.prototype.ne_=null;geo.Bounds.prototype.north=
function(){return!this.isEmpty()?this.ne_.lat():null};geo.Bounds.prototype.east=function(){return!this.isEmpty()?this.ne_.lng():null};geo.Bounds.prototype.top=function(){return!this.isEmpty()?this.ne_.altitude():null};geo.Bounds.prototype.crossesAntimeridian=function(){return!this.isEmpty()&&this.sw_.lng()>this.ne_.lng()};geo.Bounds.prototype.is3D=function(){return!this.isEmpty()&&(this.sw_.is3D()||this.ne_.is3D())};geo.Bounds.prototype.containsPoint=function(point){point=new geo.Point(point);if(this.isEmpty())return false;
if(!(this.south()<=point.lat()&&point.lat()<=this.north()))return false;if(this.is3D()&&!(this.bottom()<=point.altitude()&&point.altitude()<=this.top()))return false;return this.containsLng_(point.lng())};geo.Bounds.prototype.containsLng_=function(lng){if(this.crossesAntimeridian())return lng<=this.east()||lng>=this.west();else return this.west()<=lng&&lng<=this.east()};function lngSpan_(west,east){return west>east?east+360-west:east-west}geo.Bounds.prototype.extend=function(point){point=new geo.Point(point);
if(this.containsPoint(point))return;if(this.isEmpty()){this.sw_=this.ne_=point;return}var newBottom=this.bottom();var newTop=this.top();if(this.is3D()){newBottom=Math.min(newBottom,point.altitude());newTop=Math.max(newTop,point.altitude())}var newSouth=Math.min(this.south(),point.lat());var newNorth=Math.max(this.north(),point.lat());var newWest=this.west();var newEast=this.east();if(!this.containsLng_(point.lng())){var extendEastLngSpan=lngSpan_(newWest,point.lng());var extendWestLngSpan=lngSpan_(point.lng(),
newEast);if(extendEastLngSpan<=extendWestLngSpan)newEast=point.lng();else newWest=point.lng()}this.sw_=new geo.Point(newSouth,newWest,newBottom);this.ne_=new geo.Point(newNorth,newEast,newTop)};geo.Bounds.prototype.span=function(){if(this.isEmpty())return{lat:0,lng:0,altitude:0};return{lat:this.ne_.lat()-this.sw_.lat(),lng:lngSpan_(this.sw_.lng(),this.ne_.lng()),altitude:this.is3D()?this.ne_.altitude()-this.sw_.altitude():null}};geo.Bounds.prototype.isEmpty=function(){return this.sw_===null&&this.sw_===
null};geo.Bounds.prototype.center=function(){if(this.isEmpty())return null;return new geo.Point((this.sw_.lat()+this.ne_.lat())/2,this.crossesAntimeridian()?geo.math.normalizeLng(this.sw_.lng()+lngSpan_(this.sw_.lng(),this.ne_.lng())/2):(this.sw_.lng()+this.ne_.lng())/2,(this.sw_.altitude()+this.ne_.altitude())/2)};geo.Bounds.prototype.getCenter=geo.Bounds.prototype.center;geo.Bounds.prototype.isFullLat=function(){return!this.isEmpty()&&this.south()==-90&&this.north()==90};geo.Bounds.prototype.isFullLng=
function(){return!this.isEmpty()&&this.west()==-180&&this.east()==180};geo.Path=function(){this.coords_=[];var coordArraySrc=null;var i,n;if(arguments.length==1){var path=arguments[0];if(path.constructor===geo.Path)for(i=0;i<path.numCoords();i++)this.coords_.push(new geo.Point(path.coord(i)));else if(geo.util.isArray(path))coordArraySrc=path;else if(isEarthAPIObject_(path)){var type=path.getType();if(type=="KmlLineString"||type=="KmlLinearRing"){n=path.getCoordinates().getLength();for(i=0;i<n;i++)this.coords_.push(new geo.Point(path.getCoordinates().get(i)))}else throw new TypeError("Could not create a path from the given arguments");
}else if("getVertex"in path&&"getVertexCount"in path){n=path.getVertexCount();for(i=0;i<n;i++)this.coords_.push(new geo.Point(path.getVertex(i)))}else throw new TypeError("Could not create a path from the given arguments");}else coordArraySrc=arguments;if(coordArraySrc)for(i=0;i<coordArraySrc.length;i++)this.coords_.push(new geo.Point(coordArraySrc[i]))};geo.Path.prototype.coords_=null;geo.Path.prototype.toString=function(){return"["+this.coords_.map(function(p){return p.toString()}).join(", ")+"]"};
geo.Path.prototype.equals=function(p2){for(var i=0;i<p2.numCoords();i++)if(!this.coord(i).equals(p2.coord(i)))return false;return true};geo.Path.prototype.numCoords=function(){return this.coords_.length};geo.Path.prototype.coord=function(i){return this.coords_[i]};geo.Path.prototype.prepend=function(coord){this.coords_.unshift(new geo.Point(coord))};geo.Path.prototype.append=function(coord){this.coords_.push(new geo.Point(coord))};geo.Path.prototype.insert=function(i,coord){this.coords_.splice(i,
0,new geo.Point(coord))};geo.Path.prototype.remove=function(i){this.coords_.splice(i,1)};geo.Path.prototype.subPath=function(startIndex,endIndex){return this.coords_.slice(startIndex,endIndex)};geo.Path.prototype.reverse=function(){this.coords_.reverse()};geo.Path.prototype.distance=function(){var dist=0;for(var i=0;i<this.coords_.length-1;i++)dist+=this.coords_[i].distance(this.coords_[i+1]);return dist};geo.Path.prototype.containsPoint=function(point){var oddNodes=false;var y=point.lat();var x=
point.lng();for(var i=0;i<this.coords_.length;i++){var j=(i+1)%this.coords_.length;if((this.coords_[i].lat()<y&&this.coords_[j].lat()>=y||this.coords_[j].lat()<y&&this.coords_[i].lat()>=y)&&this.coords_[i].lng()+(y-this.coords_[i].lat())/(this.coords_[j].lat()-this.coords_[i].lat())*(this.coords_[j].lng()-this.coords_[i].lng())<x)oddNodes=!oddNodes}return oddNodes};geo.Path.prototype.bounds=function(){if(!this.numCoords())return new geo.Bounds;var bounds=new geo.Bounds(this.coord(0));var numCoords=
this.numCoords();for(var i=1;i<numCoords;i++)bounds.extend(this.coord(i));return bounds};geo.Path.prototype.signedArea_=function(){var a=0;var b=this.bounds();var x0=b.west();var y0=b.south();var numCoords=this.numCoords();for(var i=0;i<numCoords;i++){var j=(i+1)%numCoords;var x1=this.coord(i).distance(new geo.Point(this.coord(i).lat(),x0));var x2=this.coord(j).distance(new geo.Point(this.coord(j).lat(),x0));var y1=this.coord(i).distance(new geo.Point(y0,this.coord(i).lng()));var y2=this.coord(j).distance(new geo.Point(y0,
this.coord(j).lng()));a+=x1*y2-x2*y1}return a*0.5};geo.Path.prototype.area=function(){return Math.abs(this.signedArea_())};geo.Path.prototype.isCounterClockwise_=function(){return Boolean(this.signedArea_()>=0)};geo.Polygon=function(){this.outerBoundary_=new geo.Path;this.innerBoundaries_=[];var i;if(arguments.length===0);else if(arguments.length==1){var poly=arguments[0];if(poly.constructor===geo.Polygon){this.outerBoundary_=new geo.Path(poly.outerBoundary());for(i=0;i<poly.innerBoundaries().length;i++)this.innerBoundaries_.push(new geo.Path(poly.innerBoundaries()[i]))}else if(isEarthAPIObject_(poly)){var type=
poly.getType();if(type=="KmlLineString"||type=="KmlLinearRing")this.outerBoundary_=new geo.Path(poly);else if(type=="KmlPolygon"){this.outerBoundary_=new geo.Path(poly.getOuterBoundary());var ibChildNodes=poly.getInnerBoundaries().getChildNodes();var n=ibChildNodes.getLength();for(i=0;i<n;i++)this.innerBoundaries_.push(new geo.Path(ibChildNodes.item(i)))}else throw new TypeError("Could not create a polygon from the given arguments");}else this.outerBoundary_=new geo.Path(arguments[0])}else if(arguments[0].length&&
typeof arguments[0][0]=="number")this.outerBoundary_=new geo.Path(arguments);else if(arguments[1]){this.outerBoundary_=new geo.Path(arguments[0]);if(!geo.util.isArray(arguments[1]))throw new TypeError("Second argument to geo.Polygon constructor "+"must be an array of paths.");for(i=0;i<arguments[1].length;i++)this.innerBoundaries_.push(new geo.Path(arguments[1][i]))}else throw new TypeError("Cannot create a path from the given arguments.");};geo.Polygon.prototype.outerBoundary_=null;geo.Polygon.prototype.innerBoundaries_=
null;geo.Polygon.prototype.toString=function(){return"Polygon: "+this.outerBoundary().toString()+(this.innerBoundaries().length?", ("+this.innerBoundaries().length+" inner boundaries)":"")};geo.Polygon.prototype.outerBoundary=function(){return this.outerBoundary_};geo.Polygon.prototype.innerBoundaries=function(){return this.innerBoundaries_};geo.Polygon.prototype.containsPoint=function(point){if(!this.outerBoundary_.containsPoint(point))return false;for(var i=0;i<this.innerBoundaries_.length;i++)if(this.innerBoundaries_[i].containsPoint(point))return false;
return true};geo.Polygon.prototype.bounds=function(){return this.outerBoundary_.bounds()};geo.Polygon.prototype.area=function(){var area=this.outerBoundary_.area();for(var i=0;i<this.innerBoundaries_.length;i++)area-=this.innerBoundaries_[i].area();return area};geo.Polygon.prototype.isCounterClockwise=function(){return this.outerBoundary_.isCounterClockwise_()};geo.Polygon.prototype.makeCounterClockwise=function(){if(this.isCounterClockwise())this.outerBoundary_.reverse()};geo.util={isnamespace_:true};
geo.util.isUndefined=function(object){return typeof object=="undefined"};geo.util.isArray=function(object){return object!==null&&typeof object=="object"&&"splice"in object&&"join"in object};geo.util.isFunction=function(object){return object!==null&&typeof object=="function"&&"call"in object&&"apply"in object};function isEarthAPIObject_(object){return object!==null&&(typeof object=="function"||typeof object=="object")&&"getType"in object}geo.util.isObjectLiteral=function(object){return object!==null&&
typeof object=="object"&&object.constructor===Object&&!isEarthAPIObject_(object)};function isGLatLng_(object){return window.google&&window.google.maps&&window.google.maps.LatLng&&object.constructor===window.google.maps.LatLng}window.geo=geo})();
(function(){var GEarthExtensions=function(pluginInstance){var me=this;this.pluginInstance=pluginInstance;function bindFunction_(fn_){return function(){return fn_.apply(me,arguments)}}function bindNamespaceMembers_(nsParent){for(var mstr in nsParent){var member=nsParent[mstr];if(geo.util.isFunction(member))if(member.isclass_)member.extInstance_=me;else nsParent[mstr]=bindFunction_(member);if(isExtensionsNamespace_(member)){var nsDuplicate={};for(var subMstr in member)nsDuplicate[subMstr]=member[subMstr];
bindNamespaceMembers_(nsDuplicate);nsParent[mstr]=nsDuplicate}}}bindNamespaceMembers_(this)};var AUTO_=Infinity;var ALLOWED_=null;var REQUIRED_=undefined;function checkParameters_(explicitParams,allowAll,paramSpec){var finalParams={};explicitParams=explicitParams||{};paramSpec=paramSpec||{};for(var member in explicitParams){if(!allowAll&&!(member in paramSpec)){var allowed=[];for(var m in paramSpec)allowed.push(m);throw new Error("Unexpected parameter '"+member+"'. "+"Allowed parameters are: "+allowed.join(", ")+
".");}finalParams[member]=explicitParams[member]}for(member in paramSpec)if(!(member in finalParams)){if(paramSpec[member]===REQUIRED_)throw new Error("Required parameter '"+member+"' was not passed.");if(paramSpec[member]!=ALLOWED_&&paramSpec[member]!=AUTO_)finalParams[member]=paramSpec[member]}return finalParams}function createClass_(){var mixins=[];var constructorFn=null;if(geo.util.isArray(arguments[0])){mixins=arguments[0];constructorFn=arguments[1]}else constructorFn=arguments[0];constructorFn.isclass_=
true;for(var i=0;i<mixins.length;i++)for(var k in mixins[i].prototype)constructorFn.prototype[k]=mixins[i].prototype[k];return constructorFn}function isExtensionsNamespace_(object){return object!==null&&typeof object=="object"&&"isnamespace_"in object&&object.isnamespace_}GEarthExtensions.isInstanceOfEarthInterface=function(object,type){return object!==null&&(typeof object=="object"||typeof object=="function")&&"getType"in object&&object.getType()==type};GEarthExtensions.prototype.dom={isnamespace_:true};
function domBuilder_(params){if(params.apiInterface&&!geo.util.isArray(params.apiInterface))params.apiInterface=[params.apiInterface];var base=params.base;while(base){if("propertySpec"in base.builderParams){if(!("propertySpec"in params))params.propertySpec=[];for(var member in base.builderParams.propertySpec)if(!(member in params.propertySpec))params.propertySpec[member]=base.builderParams.propertySpec[member]}if(!params.apiInterface)params.apiInterface=base.builderParams.apiInterface;if(!params.apiFactoryFn)params.apiFactoryFn=
base.builderParams.apiFactoryFn;base=base.builderParams.base}var rootPropertySpec={id:""};for(member in rootPropertySpec)if(!(member in params.propertySpec))params.propertySpec[member]=rootPropertySpec[member];var builderFn=function(){var options={};var i;if(arguments.length===0)throw new TypeError("Cannot create object without any arguments!");else if(arguments.length==1){for(i=0;i<params.apiInterface.length;i++)if(GEarthExtensions.isInstanceOfEarthInterface(arguments[0],params.apiInterface[i]))return arguments[0];
var arg=arguments[0];if(geo.util.isObjectLiteral(arg))options=arg;else if("defaultProperty"in params)options[params.defaultProperty]=arg;else throw new TypeError("Expected options object");}else if(arguments.length==2)if("defaultProperty"in params){options=arguments[1];options[params.defaultProperty]=arguments[0]}else throw new Error("No default property for the DOM builder");options=checkParameters_(options,false,params.propertySpec);var newObj=this.util.callMethod(this.pluginInstance,params.apiFactoryFn,
options.id);if(!geo.util.isUndefined(params.constructor))params.constructor.call(this,newObj,options);base=params.base;while(base){if("constructor"in base.builderParams)base.builderParams.constructor.call(this,newObj,options);base=base.builderParams.base}for(var property in params.propertySpec)if(params.propertySpec[property]===AUTO_&&property in options)this.util.callMethod(newObj,"set"+property.charAt(0).toUpperCase()+property.substr(1),options[property]);return newObj};builderFn.builderParams=
params;return builderFn}GEarthExtensions.prototype.dom.buildFeature_=domBuilder_({propertySpec:{name:AUTO_,visibility:AUTO_,description:AUTO_,snippet:AUTO_,region:ALLOWED_},constructor:function(featureObj,options){if(options.region)featureObj.setRegion(this.dom.buildRegion(options.region))}});GEarthExtensions.prototype.dom.buildPlacemark=domBuilder_({apiInterface:"KmlPlacemark",base:GEarthExtensions.prototype.dom.buildFeature_,apiFactoryFn:"createPlacemark",propertySpec:{point:ALLOWED_,lineString:ALLOWED_,
linearRing:ALLOWED_,polygon:ALLOWED_,model:ALLOWED_,geometries:ALLOWED_,altitudeMode:ALLOWED_,stockIcon:ALLOWED_,icon:ALLOWED_,style:ALLOWED_,highlightStyle:ALLOWED_},constructor:function(placemarkObj,options){var geometries=[];if(options.point)geometries.push(this.dom.buildPoint(options.point));if(options.lineString)geometries.push(this.dom.buildLineString(options.lineString));if(options.linearRing)geometries.push(this.dom.buildLinearRing(options.linearRing));if(options.polygon)geometries.push(this.dom.buildPolygon(options.polygon));
if(options.model)geometries.push(this.dom.buildModel(options.model));if(options.multiGeometry)geometries.push(this.dom.buildMultiGeometry(options.multiGeometry));if(options.geometries)geometries=geometries.concat(options.geometries);if(geometries.length>1)placemarkObj.setGeometry(this.dom.buildMultiGeometry(geometries));else if(geometries.length==1)placemarkObj.setGeometry(geometries[0]);if(options.stockIcon){options.icon=options.icon||{};options.icon.stockIcon=options.stockIcon}if(options.icon){if(!options.style)options.style=
{};options.style.icon=options.icon}if("altitudeMode"in options)placemarkObj.getGeometry().setAltitudeMode(options.altitudeMode);if(options.style)if(options.highlightStyle){var styleMap=this.pluginInstance.createStyleMap("");if(typeof options.style=="string")styleMap.setNormalStyleUrl(options.style);else styleMap.setNormalStyle(this.dom.buildStyle(options.style));if(typeof options.highlightStyle=="string")styleMap.setHighlightStyleUrl(options.highlightStyle);else styleMap.setHighlightStyle(this.dom.buildStyle(options.highlightStyle));
placemarkObj.setStyleSelector(styleMap)}else if(typeof options.style=="string")placemarkObj.setStyleUrl(options.style);else placemarkObj.setStyleSelector(this.dom.buildStyle(options.style))}});GEarthExtensions.prototype.dom.buildPointPlacemark=domBuilder_({base:GEarthExtensions.prototype.dom.buildPlacemark,defaultProperty:"point"});GEarthExtensions.prototype.dom.buildLineStringPlacemark=domBuilder_({base:GEarthExtensions.prototype.dom.buildPlacemark,defaultProperty:"lineString"});GEarthExtensions.prototype.dom.buildPolygonPlacemark=
domBuilder_({base:GEarthExtensions.prototype.dom.buildPlacemark,defaultProperty:"polygon"});GEarthExtensions.prototype.dom.buildNetworkLink=domBuilder_({apiInterface:"KmlNetworkLink",base:GEarthExtensions.prototype.dom.buildFeature_,apiFactoryFn:"createNetworkLink",defaultProperty:"link",propertySpec:{link:ALLOWED_,flyToView:AUTO_,refreshVisibility:AUTO_},constructor:function(networkLinkObj,options){if(options.link)networkLinkObj.setLink(this.dom.buildLink(options.link))}});GEarthExtensions.prototype.dom.buildContainer_=
domBuilder_({base:GEarthExtensions.prototype.dom.buildFeature_,propertySpec:{children:ALLOWED_},constructor:function(containerObj,options){if(options.children)for(var i=0;i<options.children.length;i++)containerObj.getFeatures().appendChild(options.children[i])}});GEarthExtensions.prototype.dom.buildFolder=domBuilder_({apiInterface:"KmlFolder",base:GEarthExtensions.prototype.dom.buildContainer_,apiFactoryFn:"createFolder",defaultProperty:"children"});GEarthExtensions.prototype.dom.buildDocument=domBuilder_({apiInterface:"KmlDocument",
base:GEarthExtensions.prototype.dom.buildContainer_,apiFactoryFn:"createDocument",defaultProperty:"children"});GEarthExtensions.prototype.dom.buildOverlay_=domBuilder_({base:GEarthExtensions.prototype.dom.buildFeature_,propertySpec:{color:ALLOWED_,icon:ALLOWED_,drawOrder:AUTO_},constructor:function(overlayObj,options){if(options.color)overlayObj.getColor().set(this.util.parseColor(options.color));if(options.icon){var icon=this.pluginInstance.createIcon("");overlayObj.setIcon(icon);if(typeof options.icon==
"string")icon.setHref(options.icon)}}});GEarthExtensions.prototype.dom.buildGroundOverlay=domBuilder_({apiInterface:"KmlGroundOverlay",base:GEarthExtensions.prototype.dom.buildOverlay_,apiFactoryFn:"createGroundOverlay",defaultProperty:"icon",propertySpec:{box:REQUIRED_,altitude:AUTO_,altitudeMode:AUTO_},constructor:function(groundOverlayObj,options){if(options.box){var box=this.pluginInstance.createLatLonBox("");box.setBox(options.box.north,options.box.south,options.box.east,options.box.west,options.box.rotation?
options.box.rotation:0);groundOverlayObj.setLatLonBox(box)}}});GEarthExtensions.prototype.dom.buildScreenOverlay=domBuilder_({apiInterface:"KmlScreenOverlay",base:GEarthExtensions.prototype.dom.buildOverlay_,apiFactoryFn:"createScreenOverlay",defaultProperty:"icon",propertySpec:{screenXY:REQUIRED_,size:REQUIRED_,rotation:AUTO_,overlayXY:{left:0,top:0},rotationXY:ALLOWED_},constructor:function(screenOverlayObj,options){this.dom.setVec2(screenOverlayObj.getScreenXY(),options.overlayXY);this.dom.setVec2(screenOverlayObj.getOverlayXY(),
options.screenXY);this.dom.setVec2(screenOverlayObj.getSize(),options.size);if("rotationXY"in options)this.dom.setVec2(screenOverlayObj.getRotationXY(),options.rotationXY)}});var autoDomAdd_=["Placemark","PointPlacemark","LineStringPlacemark","PolygonPlacemark","Folder","NetworkLink","GroundOverlay","ScreenOverlay","Style"];for(var i=0;i<autoDomAdd_.length;i++)GEarthExtensions.prototype.dom["add"+autoDomAdd_[i]]=function(shortcutBase){return function(){var obj=this.dom["build"+shortcutBase].apply(null,
arguments);this.pluginInstance.getFeatures().appendChild(obj);return obj}}(autoDomAdd_[i]);GEarthExtensions.prototype.dom.buildExtrudableGeometry_=domBuilder_({propertySpec:{altitudeMode:AUTO_,extrude:AUTO_,tessellate:AUTO_}});GEarthExtensions.prototype.dom.buildPoint=domBuilder_({apiInterface:"KmlPoint",base:GEarthExtensions.prototype.dom.buildExtrudableGeometry_,apiFactoryFn:"createPoint",defaultProperty:"point",propertySpec:{point:REQUIRED_},constructor:function(pointObj,options){var point=new geo.Point(options.point);
pointObj.set(point.lat(),point.lng(),point.altitude(),"altitudeMode"in options?options.altitudeMode:point.altitudeMode(),false,false)}});GEarthExtensions.prototype.dom.buildLineString=domBuilder_({apiInterface:"KmlLineString",base:GEarthExtensions.prototype.dom.buildExtrudableGeometry_,apiFactoryFn:"createLineString",defaultProperty:"path",propertySpec:{path:REQUIRED_},constructor:function(lineStringObj,options){var coordsObj=lineStringObj.getCoordinates();var path=new geo.Path(options.path);var numCoords=
path.numCoords();for(var i=0;i<numCoords;i++)coordsObj.pushLatLngAlt(path.coord(i).lat(),path.coord(i).lng(),path.coord(i).altitude())}});GEarthExtensions.prototype.dom.buildLinearRing=domBuilder_({apiInterface:"KmlLinearRing",base:GEarthExtensions.prototype.dom.buildLineString,apiFactoryFn:"createLinearRing",defaultProperty:"path",constructor:function(linearRingObj,options){}});GEarthExtensions.prototype.dom.buildPolygon=domBuilder_({apiInterface:"KmlPolygon",base:GEarthExtensions.prototype.dom.buildExtrudableGeometry_,
apiFactoryFn:"createPolygon",defaultProperty:"polygon",propertySpec:{polygon:REQUIRED_},constructor:function(polygonObj,options){var polygon=new geo.Polygon(options.polygon);polygonObj.setOuterBoundary(this.dom.buildLinearRing(polygon.outerBoundary()));if(polygon.innerBoundaries().length){var innerBoundaries=polygon.innerBoundaries();for(var i=0;i<innerBoundaries.length;i++)polygonObj.getInnerBoundaries().appendChild(this.dom.buildLinearRing(innerBoundaries[i]))}}});GEarthExtensions.prototype.dom.buildModel=
domBuilder_({apiInterface:"KmlModel",apiFactoryFn:"createModel",defaultProperty:"link",propertySpec:{altitudeMode:AUTO_,link:ALLOWED_,location:ALLOWED_,scale:ALLOWED_,orientation:ALLOWED_},constructor:function(modelObj,options){if(options.link)modelObj.setLink(this.dom.buildLink(options.link));if(options.location){var pointObj=new geo.Point(options.location);var locationObj=this.pluginInstance.createLocation("");locationObj.setLatLngAlt(pointObj.lat(),pointObj.lng(),pointObj.altitude());modelObj.setLocation(locationObj);
modelObj.setAltitudeMode(pointObj.altitudeMode())}if(options.scale){var scaleObj=this.pluginInstance.createScale("");if(typeof options.scale=="number")scaleObj.set(options.scale,options.scale,options.scale);else if(geo.util.isArray(options.scale))scaleObj.set(options.scale[0],options.scale[1],options.scale[2]);modelObj.setScale(scaleObj)}if(options.orientation){var orientationObj=this.pluginInstance.createOrientation("");if("heading"in options.orientation&&"tilt"in options.orientation&&"roll"in options.orientation)orientationObj.set(options.orientation.heading,
options.orientation.tilt,options.orientation.roll);modelObj.setOrientation(orientationObj)}}});GEarthExtensions.prototype.dom.buildMultiGeometry=domBuilder_({apiInterface:"KmlMultiGeometry",apiFactoryFn:"createMultiGeometry",defaultProperty:"geometries",propertySpec:{geometries:ALLOWED_},constructor:function(multiGeometryObj,options){var geometriesObj=multiGeometryObj.getGeometries();if(geo.util.isArray(options.geometries))for(var i=0;i<options.geometries.length;i++)geometriesObj.appendChild(options.geometries[i])}});
GEarthExtensions.prototype.dom.buildLink=domBuilder_({apiInterface:"KmlLink",apiFactoryFn:"createLink",defaultProperty:"href",propertySpec:{href:AUTO_,refreshMode:AUTO_,refreshInterval:AUTO_,viewRefreshMode:AUTO_,viewBoundScale:AUTO_}});GEarthExtensions.prototype.dom.buildRegion=domBuilder_({apiInterface:"KmlRegion",apiFactoryFn:"createRegion",propertySpec:{box:REQUIRED_,lod:ALLOWED_},constructor:function(regionObj,options){var box=this.pluginInstance.createLatLonAltBox("");if(options.box.center&&
options.box.span){if(!geo.util.isArray(options.box.span)&&typeof options.box.span==="number")options.box.span=[options.box.span,options.box.span];var center=new geo.Point(options.box.center);options.box.north=center.lat()+options.box.span[0]/2;options.box.south=center.lat()-options.box.span[0]/2;options.box.east=center.lng()+options.box.span[1]/2;options.box.west=center.lng()-options.box.span[1]/2}box.setAltBox(options.box.north,options.box.south,options.box.east,options.box.west,options.box.rotation||
0,options.box.minAltitude||0,options.box.maxAltitude||0,options.box.altitudeMode||this.pluginInstance.ALTITUDE_CLAMP_TO_GROUND);var lod=this.pluginInstance.createLod("");lod.set(-1,-1,0,0);if(options.lod&&geo.util.isArray(options.lod))if(options.lod.length==2)lod.set(options.lod[0],options.lod[1],0,0);else if(options.lod.length==4)lod.set(options.lod[0],options.lod[3],options.lod[1],options.lod[2]);else;regionObj.setLatLonAltBox(box);regionObj.setLod(lod)}});GEarthExtensions.prototype.dom.buildStyle=
domBuilder_({apiInterface:["KmlStyle","KmlStyleMap"],apiFactoryFn:"createStyle",propertySpec:{icon:ALLOWED_,label:ALLOWED_,line:ALLOWED_,poly:ALLOWED_,balloon:ALLOWED_},constructor:function(styleObj,options){var pad2=function(s){return(s.length<2?"0":"")+s};var me=this;var mergeColorOpacity_=function(color,opacity){color=color?me.util.parseColor(color):"ffffffff";if(!geo.util.isUndefined(opacity))color=pad2(Math.floor(255*opacity).toString(16))+color.substring(2);return color};if(options.icon){var iconStyle=
styleObj.getIconStyle();if(typeof options.icon=="string")options.icon={href:options.icon};var icon=this.pluginInstance.createIcon("");iconStyle.setIcon(icon);if("href"in options.icon)icon.setHref(options.icon.href);else if("stockIcon"in options.icon)icon.setHref("http://maps.google.com/mapfiles/kml/"+options.icon.stockIcon+".png");else{icon.setHref("http://maps.google.com/mapfiles/kml/"+"paddle/wht-blank.png");iconStyle.getHotSpot().set(0.5,this.pluginInstance.UNITS_FRACTION,0,this.pluginInstance.UNITS_FRACTION)}if("scale"in
options.icon)iconStyle.setScale(options.icon.scale);if("heading"in options.icon)iconStyle.setHeading(options.icon.heading);if("color"in options.icon||"opacity"in options.icon){options.icon.color=mergeColorOpacity_(options.icon.color,options.icon.opacity);iconStyle.getColor().set(options.icon.color)}if("opacity"in options.icon){if(!("color"in options.icon))options.icon.color="ffffffff";options.icon.color=pad2(options.icon.opacity.toString(16))+options.icon.color.substring(2)}if("hotSpot"in options.icon)this.dom.setVec2(iconStyle.getHotSpot(),
options.icon.hotSpot)}if(options.label){var labelStyle=styleObj.getLabelStyle();if(typeof options.label=="string")options.label={color:options.label};if("scale"in options.label)labelStyle.setScale(options.label.scale);if("color"in options.label||"opacity"in options.label){options.label.color=mergeColorOpacity_(options.label.color,options.label.opacity);labelStyle.getColor().set(options.label.color)}}if(options.line){var lineStyle=styleObj.getLineStyle();if(typeof options.line=="string")options.line=
{color:options.line};if("width"in options.line)lineStyle.setWidth(options.line.width);if("color"in options.line||"opacity"in options.line){options.line.color=mergeColorOpacity_(options.line.color,options.line.opacity);lineStyle.getColor().set(options.line.color)}}if(options.poly){var polyStyle=styleObj.getPolyStyle();if(typeof options.poly=="string")options.poly={color:options.poly};if("fill"in options.poly)polyStyle.setFill(options.poly.fill);if("outline"in options.poly)polyStyle.setOutline(options.poly.outline);
if("color"in options.poly||"opacity"in options.poly){options.poly.color=mergeColorOpacity_(options.poly.color,options.poly.opacity);polyStyle.getColor().set(options.poly.color)}}if(options.balloon){var balloonStyle=styleObj.getBalloonStyle();if(typeof options.balloon=="string")options.balloon={bgColor:options.balloon};if("bgColor"in options.balloon)balloonStyle.getBgColor().set(me.util.parseColor(options.balloon.bgColor));if("textColor"in options.balloon)balloonStyle.getTextColor().set(me.util.parseColor(options.balloon.textColor));
if("text"in options.balloon)balloonStyle.setText(options.balloon.text)}}});GEarthExtensions.prototype.dom.clearFeatures=function(){var featureContainer=this.pluginInstance.getFeatures();var c;while((c=featureContainer.getLastChild())!==null)featureContainer.removeChild(c)};GEarthExtensions.prototype.dom.walk=function(){var options;if(arguments.length==1)if(geo.util.isObjectLiteral(arguments[0]))options=arguments[0];else if(geo.util.isFunction(arguments[0]))options={visitCallback:arguments[0]};else throw new TypeError("walk requires a visit callback function or "+
"options literal as a first parameter");else throw new Error("walk takes at most 1 arguments");options=checkParameters_(options,false,{visitCallback:REQUIRED_,features:true,geometries:false,rootObject:this.pluginInstance,rootContext:ALLOWED_});var recurse_=function(object,currentContext){var contextArgument={current:currentContext,child:currentContext,walkChildren:true};var retValue=options.visitCallback.call(object,contextArgument);if(!retValue&&!geo.util.isUndefined(retValue))return false;if(!contextArgument.walkChildren)return true;
var objectContainer=null;if("getFeatures"in object){if(options.features)objectContainer=object.getFeatures()}else if("getGeometry"in object){if(options.geometries&&object.getGeometry())recurse_(object.getGeometry(),contextArgument.child)}else if("getGeometries"in object){if(options.geometries)objectContainer=object.getGeometries()}else if("getOuterBoundary"in object)if(options.geometries&&object.getOuterBoundary()){recurse_(object.getOuterBoundary(),contextArgument.child);objectContainer=object.getInnerBoundaries()}if(objectContainer&&
objectContainer.hasChildNodes()){var childNodes=objectContainer.getChildNodes();var numChildNodes=childNodes.getLength();for(var i=0;i<numChildNodes;i++){var child=childNodes.item(i);if(!recurse_(child,contextArgument.child))return false}}return true};if(options.rootObject)recurse_(options.rootObject,options.rootContext)};GEarthExtensions.prototype.dom.getObjectById=function(id,options){options=checkParameters_(options,false,{recursive:true,rootObject:this.pluginInstance});if("getId"in options.rootObject&&
options.rootObject.getId()==id)return options.rootObject;var returnObject=null;this.dom.walk({rootObject:options.rootObject,features:true,geometries:true,visitCallback:function(){if("getId"in this&&this.getId()==id){returnObject=this;return false}}});return returnObject};GEarthExtensions.prototype.dom.removeObject=function(object){if(!object)return;var parent=object.getParentNode();if(!parent)throw new Error("Cannot remove an object without a parent.");var objectContainer=null;if("getFeatures"in parent)objectContainer=
parent.getFeatures();else if("getGeometries"in parent)objectContainer=parent.getGeometries();else if("getInnerBoundaries"in parent)objectContainer=parent.getInnerBoundaries();objectContainer.removeChild(object)};GEarthExtensions.prototype.dom.setVec2=function(vec2,options){if("getType"in options&&options.getType()=="KmlVec2"){vec2.set(options.getX(),options.getXUnits(),options.getY(),options.getYUnits());return}options=checkParameters_(options,false,{left:ALLOWED_,top:ALLOWED_,right:ALLOWED_,bottom:ALLOWED_,
width:ALLOWED_,height:ALLOWED_});if("width"in options)options.left=options.width;if("height"in options)options.bottom=options.height;var x=0;var xUnits=this.pluginInstance.UNITS_PIXELS;var y=0;var yUnits=this.pluginInstance.UNITS_PIXELS;if("left"in options)if(typeof options.left=="number")x=options.left;else if(typeof options.left=="string"&&options.left.charAt(options.left.length-1)=="%"){x=parseFloat(options.left)/100;xUnits=this.pluginInstance.UNITS_FRACTION}else throw new TypeError("left must be a number or string indicating a "+
"percentage");else if("right"in options)if(typeof options.right=="number"){x=options.right;xUnits=this.pluginInstance.UNITS_INSET_PIXELS}else if(typeof options.right=="string"&&options.right.charAt(options.right.length-1)=="%"){x=1-parseFloat(options.right)/100;xUnits=this.pluginInstance.UNITS_FRACTION}else throw new TypeError("right must be a number or string indicating a "+"percentage");if("bottom"in options)if(typeof options.bottom=="number")y=options.bottom;else if(typeof options.bottom=="string"&&
options.bottom.charAt(options.bottom.length-1)=="%"){y=parseFloat(options.bottom)/100;yUnits=this.pluginInstance.UNITS_FRACTION}else throw new TypeError("bottom must be a number or string indicating a "+"percentage");else if("top"in options)if(typeof options.top=="number"){y=options.top;yUnits=this.pluginInstance.UNITS_INSET_PIXELS}else if(typeof options.top=="string"&&options.top.charAt(options.top.length-1)=="%"){y=1-parseFloat(options.top)/100;yUnits=this.pluginInstance.UNITS_FRACTION}else throw new TypeError("top must be a number or string indicating a "+
"percentage");vec2.set(x,xUnits,y,yUnits)};GEarthExtensions.prototype.dom.computeBounds=function(object){var bounds=new geo.Bounds;this.dom.walk({rootObject:object,features:true,geometries:true,visitCallback:function(){if("getType"in this){var type=this.getType();switch(type){case "KmlGroundOverlay":var llb=this.getLatLonBox();if(llb){var alt=this.getAltitude();bounds.extend(new geo.Point(llb.getNorth(),llb.getEast(),alt));bounds.extend(new geo.Point(llb.getNorth(),llb.getWest(),alt));bounds.extend(new geo.Point(llb.getSouth(),
llb.getEast(),alt));bounds.extend(new geo.Point(llb.getSouth(),llb.getWest(),alt))}break;case "KmlModel":bounds.extend(new geo.Point(this.getLocation()));break;case "KmlLinearRing":case "KmlLineString":var coords=this.getCoordinates();if(coords){var n=coords.getLength();for(var i=0;i<n;i++)bounds.extend(new geo.Point(coords.get(i)))}break;case "KmlCoord":case "KmlLocation":case "KmlPoint":bounds.extend(new geo.Point(this));break}}}});return bounds};GEarthExtensions.prototype.dom.buildLookAt=domBuilder_({apiInterface:"KmlLookAt",
apiFactoryFn:"createLookAt",defaultProperty:"point",propertySpec:{copy:false,point:REQUIRED_,heading:ALLOWED_,tilt:ALLOWED_,range:ALLOWED_},constructor:function(lookAtObj,options){var point=new geo.Point(options.point);var defaults={heading:0,tilt:0,range:1E3};if(options.copy){var currentLookAt=this.util.getLookAt(defaults.altitudeMode);defaults.heading=currentLookAt.getHeading();defaults.tilt=currentLookAt.getTilt();defaults.range=currentLookAt.getRange()}options=checkParameters_(options,true,defaults);
lookAtObj.set(point.lat(),point.lng(),point.altitude(),point.altitudeMode(),options.heading,options.tilt,options.range)}});GEarthExtensions.prototype.dom.buildCamera=domBuilder_({apiInterface:"KmlCamera",apiFactoryFn:"createCamera",defaultProperty:"point",propertySpec:{copy:false,point:REQUIRED_,heading:ALLOWED_,tilt:ALLOWED_,roll:ALLOWED_},constructor:function(cameraObj,options){var point=new geo.Point(options.point);var defaults={heading:0,tilt:0,roll:0};if(options.copy){var currentCamera=this.util.getCamera(defaults.altitudeMode);
defaults.heading=currentCamera.getHeading();defaults.tilt=currentCamera.getTilt();defaults.roll=currentCamera.getRoll()}options=checkParameters_(options,true,defaults);cameraObj.set(point.lat(),point.lng(),point.altitude(),point.altitudeMode(),options.heading,options.tilt,options.roll)}});GEarthExtensions.prototype.edit={isnamespace_:true};var DRAGDATA_JSDATA_KEY="_GEarthExtensions_dragData";var currentDragContext_=null;function beginDragging_(extInstance,placemark){var placemarkDragData=extInstance.util.getJsDataValue(placemark,
DRAGDATA_JSDATA_KEY)||{};currentDragContext_={placemark:placemark,startAltitude:placemark.getGeometry().getAltitude(),draggableOptions:placemarkDragData.draggableOptions,dragged:false}}function makeMouseMoveListener_(extInstance){return function(event){if(currentDragContext_){event.preventDefault();if(!event.getDidHitGlobe())return;if(!currentDragContext_.dragged){currentDragContext_.dragged=true;if(currentDragContext_.draggableOptions.draggingStyle){currentDragContext_.oldStyle=currentDragContext_.placemark.getStyleSelector();
currentDragContext_.placemark.setStyleSelector(extInstance.dom.buildStyle(currentDragContext_.draggableOptions.draggingStyle))}if(currentDragContext_.draggableOptions.bounce){extInstance.fx.cancel(currentDragContext_.placemark);extInstance.fx.bounce(currentDragContext_.placemark,{phase:1})}if(currentDragContext_.draggableOptions.targetScreenOverlay){var overlay=extInstance.dom.buildScreenOverlay(currentDragContext_.draggableOptions.targetScreenOverlay);extInstance.pluginInstance.getFeatures().appendChild(overlay);
currentDragContext_.activeTargetScreenOverlay=overlay}}if(currentDragContext_.activeTargetScreenOverlay)extInstance.dom.setVec2(currentDragContext_.activeTargetScreenOverlay.getOverlayXY(),{left:event.getClientX(),top:event.getClientY()});var point=currentDragContext_.placemark.getGeometry();point.setLatitude(event.getLatitude());point.setLongitude(event.getLongitude());currentDragContext_.placemark.setVisibility(true);if(currentDragContext_.draggableOptions.dragCallback)currentDragContext_.draggableOptions.dragCallback.call(currentDragContext_.placemark)}}}
function stopDragging_(extInstance,abort){if(currentDragContext_){if(currentDragContext_.dragged){if(currentDragContext_.oldStyle){currentDragContext_.placemark.setStyleSelector(currentDragContext_.oldStyle);delete currentDragContext_.oldStyle}if(currentDragContext_.activeTargetScreenOverlay){extInstance.pluginInstance.getFeatures().removeChild(currentDragContext_.activeTargetScreenOverlay);delete currentDragContext_.activeTargetScreenOverlay}if(currentDragContext_.draggableOptions.bounce){extInstance.fx.cancel(currentDragContext_.placemark);
extInstance.fx.bounce(currentDragContext_.placemark,{startAltitude:currentDragContext_.startAltitude,phase:2,repeat:1,dampen:0.3})}}var dragContext_=currentDragContext_;currentDragContext_=null;if(dragContext_.dragged&&dragContext_.draggableOptions.dropCallback&&!abort)dragContext_.draggableOptions.dropCallback.call(dragContext_.placemark)}}GEarthExtensions.prototype.edit.makeDraggable=function(placemark,options){this.edit.endDraggable(placemark);options=checkParameters_(options,false,{bounce:true,
dragCallback:ALLOWED_,dropCallback:ALLOWED_,draggingStyle:ALLOWED_,targetScreenOverlay:ALLOWED_});var me=this;var mouseMoveListener=makeMouseMoveListener_(me);var mouseUpListener;mouseUpListener=function(event){if(currentDragContext_&&event.getButton()===0){google.earth.removeEventListener(me.pluginInstance.getWindow(),"mousemove",mouseMoveListener);google.earth.removeEventListener(me.pluginInstance.getWindow(),"mouseup",mouseUpListener);if(currentDragContext_.dragged)event.preventDefault();stopDragging_(me)}};
var mouseDownListener=function(event){if(event.getButton()===0){beginDragging_(me,event.getTarget());google.earth.addEventListener(me.pluginInstance.getWindow(),"mousemove",mouseMoveListener);google.earth.addEventListener(me.pluginInstance.getWindow(),"mouseup",mouseUpListener)}};this.util.setJsDataValue(placemark,DRAGDATA_JSDATA_KEY,{draggableOptions:options,abortAndEndFn:function(){if(currentDragContext_&&currentDragContext_.placemark.equals(placemark)){google.earth.removeEventListener(me.pluginInstance.getWindow(),
"mousemove",mouseMoveListener);google.earth.removeEventListener(me.pluginInstance.getWindow(),"mouseup",mouseUpListener);stopDragging_(me,true)}google.earth.removeEventListener(placemark,"mousedown",mouseDownListener)}});google.earth.addEventListener(placemark,"mousedown",mouseDownListener)};GEarthExtensions.prototype.edit.endDraggable=function(placemark){var placemarkDragData=this.util.getJsDataValue(placemark,DRAGDATA_JSDATA_KEY);if(placemarkDragData){placemarkDragData.abortAndEndFn.call(null);
this.util.clearJsDataValue(placemark,DRAGDATA_JSDATA_KEY)}};GEarthExtensions.prototype.edit.place=function(placemark,options){options=checkParameters_(options,false,{bounce:true,dragCallback:ALLOWED_,dropCallback:ALLOWED_,draggingStyle:ALLOWED_,targetScreenOverlay:ALLOWED_});var me=this;var mouseMoveListener=makeMouseMoveListener_(me);placemark.setVisibility(false);var mouseDownListener;mouseDownListener=function(event){if(currentDragContext_&&event.getButton()===0){event.preventDefault();event.stopPropagation();
google.earth.removeEventListener(me.pluginInstance.getWindow(),"mousemove",mouseMoveListener);google.earth.removeEventListener(me.pluginInstance.getWindow(),"mousedown",mouseDownListener);stopDragging_(me)}};this.util.setJsDataValue(placemark,DRAGDATA_JSDATA_KEY,{draggableOptions:options,abortAndEndFn:function(){if(currentDragContext_&&currentDragContext_.placemark.equals(placemark)){google.earth.removeEventListener(me.pluginInstance.getWindow(),"mousemove",mouseMoveListener);google.earth.removeEventListener(me.pluginInstance.getWindow(),
"mousedown",mouseDownListener);stopDragging_(me,true)}}});beginDragging_(me,placemark);google.earth.addEventListener(me.pluginInstance.getWindow(),"mousemove",mouseMoveListener);google.earth.addEventListener(me.pluginInstance.getWindow(),"mousedown",mouseDownListener)};var LINESTRINGEDITDATA_JSDATA_KEY="_GEarthExtensions_lineStringEditData";var LINESTRING_COORD_ICON="http://maps.google.com/mapfiles/kml/"+"shapes/placemark_circle.png";var LINESTRING_COORD_ICON_SCALE=0.85;var LINESTRING_MIDPOINT_ICON_SCALE=
0.6;function coordsEqual_(coord1,coord2){return coord1.getLatitude()==coord2.getLatitude()&&coord1.getLongitude()==coord2.getLongitude()&&coord1.getAltitude()==coord2.getAltitude()}GEarthExtensions.prototype.edit.drawLineString=function(lineString,options){options=checkParameters_(options,false,{bounce:true,drawCallback:ALLOWED_,finishCallback:ALLOWED_,ensureCounterClockwise:true});var lineStringEditData=this.util.getJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY)||{};if(lineStringEditData)this.edit.endEditLineString(lineString);
var me=this;var isReverse=false;var tempPoly=new geo.Polygon;var done=false;var placemarks=[];var altitudeMode=lineString.getAltitudeMode();var headPlacemark=null;var isRing=lineString.getType()=="KmlLinearRing";var coords=lineString.getCoordinates();var innerDoc=this.pluginInstance.parseKml(["<Document>",'<Style id="_GEarthExtensions_regularCoordinate"><IconStyle>',"<Icon><href>",LINESTRING_COORD_ICON,"</href></Icon>","<scale>",LINESTRING_COORD_ICON_SCALE,"</scale></IconStyle></Style>",'<Style id="_GEarthExtensions_firstCoordinateHighlight"><IconStyle>',
"<Icon><href>",LINESTRING_COORD_ICON,"</href></Icon>","<scale>",LINESTRING_COORD_ICON_SCALE*1.3,"</scale>","<color>ff00ff00</color></IconStyle></Style>",'<StyleMap id="_GEarthExtensions_firstCoordinate">',"<Pair><key>normal</key>","<styleUrl>#_GEarthExtensions_regularCoordinate</styleUrl>","</Pair><Pair><key>highlight</key>","<styleUrl>#_GEarthExtensions_firstCoordinateHighlight</styleUrl>","</Pair></StyleMap>","</Document>"].join(""));var finishListener;var endFunction=function(abort){google.earth.removeEventListener(me.pluginInstance.getWindow(),
"dblclick",finishListener);var numCoords=coords.getLength();if(numCoords&&isRing){var firstCoord=coords.get(0);var lastCoord=coords.get(numCoords-1);if(!coordsEqual_(firstCoord,lastCoord))coords.pushLatLngAlt(firstCoord.getLatitude(),firstCoord.getLongitude(),firstCoord.getAltitude())}me.edit.endDraggable(headPlacemark);me.dom.removeObject(innerDoc);me.util.clearJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY);placemarks=[];done=true;if(options.finishCallback&&!abort)options.finishCallback.call(null)};
finishListener=function(event){event.preventDefault();endFunction.call(null)};var drawNext;drawNext=function(){headPlacemark=me.dom.buildPointPlacemark([0,0],{altitudeMode:altitudeMode,style:"#_GEarthExtensions_regularCoordinate",visibility:false});innerDoc.getFeatures().appendChild(headPlacemark);if(isReverse)placemarks.unshift(headPlacemark);else placemarks.push(headPlacemark);me.edit.place(headPlacemark,{bounce:options.bounce,dropCallback:function(){if(!done){var coord=[headPlacemark.getGeometry().getLatitude(),
headPlacemark.getGeometry().getLongitude(),0];if(isReverse)coords.unshiftLatLngAlt(coord[0],coord[1],coord[2]);else coords.pushLatLngAlt(coord[0],coord[1],coord[2]);if(options.ensureCounterClockwise){if(isReverse)tempPoly.outerBoundary().prepend(coord);else tempPoly.outerBoundary().append(coord);if(!tempPoly.isCounterClockwise()){tempPoly.outerBoundary().reverse();coords.reverse();isReverse=!isReverse}}if(options.drawCallback)options.drawCallback.call(null,isReverse?0:coords.getLength()-1);if(placemarks.length==
1){placemarks[0].setStyleUrl("#_GEarthExtensions_firstCoordinate");google.earth.addEventListener(placemarks[0],"mousedown",function(firstCoord){return function(event){if(isReverse)coords.unshiftLatLngAlt(firstCoord[0],firstCoord[1],firstCoord[2]);else coords.pushLatLngAlt(firstCoord[0],firstCoord[1],firstCoord[2]);finishListener(event)}}(coord))}setTimeout(drawNext,0)}}})};drawNext.call(null);google.earth.addEventListener(me.pluginInstance.getWindow(),"dblclick",finishListener);this.pluginInstance.getFeatures().appendChild(innerDoc);
this.util.setJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY,{abortAndEndFn:function(){endFunction.call(null,true)}})};GEarthExtensions.prototype.edit.editLineString=function(lineString,options){options=checkParameters_(options,false,{editCallback:ALLOWED_});var lineStringEditData=this.util.getJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY)||{};if(lineStringEditData)this.edit.endEditLineString(lineString);var me=this;var isRing=lineString.getType()=="KmlLinearRing";var altitudeMode=lineString.getAltitudeMode();
var coords=lineString.getCoordinates();var numCoords=coords.getLength();if(numCoords&&isRing){var firstCoord=coords.get(0);var lastCoord=coords.get(numCoords-1);if(!coordsEqual_(firstCoord,lastCoord)){coords.pushLatLngAlt(firstCoord.getLatitude(),firstCoord.getLongitude(),firstCoord.getAltitude());numCoords++}}var innerDoc=this.pluginInstance.parseKml(["<Document>",'<Style id="_GEarthExtensions_regularCoordinate"><IconStyle>',"<Icon><href>",LINESTRING_COORD_ICON,"</href></Icon>","<color>ffffffff</color>",
"<scale>",LINESTRING_COORD_ICON_SCALE,"</scale></IconStyle></Style>",'<StyleMap id="_GEarthExtensions_midCoordinate">',"<Pair><key>normal</key>","<Style><IconStyle>","<Icon><href>",LINESTRING_COORD_ICON,"</href></Icon>","<color>60ffffff</color><scale>",LINESTRING_MIDPOINT_ICON_SCALE,"</scale></IconStyle></Style></Pair>","<Pair><key>highlight</key>","<styleUrl>#_GEarthExtensions_regularCoordinate</styleUrl>","</Pair></StyleMap>","</Document>"].join(""));var coordDataArr=[];var checkDupMidpoints_=function(){if(!isRing)return;
if(numCoords==3)coordDataArr[1].rightMidPlacemark.setVisibility(false);else if(numCoords>=4)coordDataArr[numCoords-2].rightMidPlacemark.setVisibility(true)};var makeRegularDeleteEventListener_=function(coordData){return function(event){event.preventDefault();var leftCoordData=null;if(coordData.index>0||isRing){var leftIndex=coordData.index-1;if(leftIndex<0)leftIndex+=numCoords;if(isRing&&coordData.index===0)leftIndex--;leftCoordData=coordDataArr[leftIndex]}for(i=coordData.index;i<numCoords-1;i++)coords.set(i,
coords.get(i+1));coords.pop();if(isRing&&coordData.index===0)coords.set(numCoords-2,coords.get(0));numCoords--;if(!coordData.rightMidPlacemark&&leftCoordData){me.edit.endDraggable(leftCoordData.rightMidPlacemark);me.dom.removeObject(leftCoordData.rightMidPlacemark);leftCoordData.rightMidPlacemark=null}if(coordData.rightMidPlacemark){me.edit.endDraggable(coordData.rightMidPlacemark);me.dom.removeObject(coordData.rightMidPlacemark)}me.edit.endDraggable(coordData.regularPlacemark);google.earth.removeEventListener(coordData.regularPlacemark,
"dblclick",coordData.deleteEventListener);me.dom.removeObject(coordData.regularPlacemark);coordDataArr.splice(coordData.index,1);for(i=0;i<numCoords;i++)coordDataArr[i].index=i;if(leftCoordData)leftCoordData.regularDragCallback.call(leftCoordData.regularPlacemark,leftCoordData);checkDupMidpoints_();if(options.editCallback)options.editCallback(null)}};var makeRegularDragCallback_=function(coordData){return function(){coords.setLatLngAlt(coordData.index,this.getGeometry().getLatitude(),this.getGeometry().getLongitude(),
this.getGeometry().getAltitude());if(isRing&&numCoords>=2&&coordData.index===0){var firstCoord=coords.get(0);var lastCoord=coords.get(numCoords-1);coords.setLatLngAlt(0,this.getGeometry().getLatitude(),this.getGeometry().getLongitude(),this.getGeometry().getAltitude());coords.setLatLngAlt(numCoords-1,this.getGeometry().getLatitude(),this.getGeometry().getLongitude(),this.getGeometry().getAltitude())}var curCoord=coords.get(coordData.index);if(coordData.index>0||isRing){var leftIndex=coordData.index-
1;if(leftIndex<0)leftIndex+=numCoords;if(isRing&&coordData.index===0)leftIndex--;var leftMidPt=(new geo.Point(coords.get(leftIndex))).midpoint(new geo.Point(curCoord));coordDataArr[leftIndex].rightMidPlacemark.getGeometry().setLatitude(leftMidPt.lat());coordDataArr[leftIndex].rightMidPlacemark.getGeometry().setLongitude(leftMidPt.lng());coordDataArr[leftIndex].rightMidPlacemark.getGeometry().setAltitude(leftMidPt.altitude())}if(coordData.index<numCoords-1||isRing){var rightCoord;if(isRing&&coordData.index==
numCoords-2||!isRing&&coordData.index==numCoords-1)rightCoord=coords.get(0);else rightCoord=coords.get(coordData.index+1);var rightMidPt=(new geo.Point(curCoord)).midpoint(new geo.Point(rightCoord));coordData.rightMidPlacemark.getGeometry().setLatitude(rightMidPt.lat());coordData.rightMidPlacemark.getGeometry().setLongitude(rightMidPt.lng());coordData.rightMidPlacemark.getGeometry().setAltitude(rightMidPt.altitude())}checkDupMidpoints_();if(options.editCallback)options.editCallback(null)}};var makeMidDragCallback_=
function(coordData){var convertedToRegular=false;var newCoordData=null;return function(){if(!convertedToRegular){convertedToRegular=true;var i;this.setStyleUrl("#_GEarthExtensions_regularCoordinate");coords.push(coords.get(numCoords-1));for(i=numCoords-1;i>coordData.index+1;i--)coords.set(i,coords.get(i-1));numCoords++;newCoordData={};newCoordData.index=coordData.index+1;newCoordData.regularPlacemark=this;coordData.rightMidPlacemark=me.dom.buildPointPlacemark({point:coords.get(coordData.index),altitudeMode:altitudeMode,
style:"#_GEarthExtensions_midCoordinate"});innerDoc.getFeatures().appendChild(coordData.rightMidPlacemark);me.edit.makeDraggable(coordData.rightMidPlacemark,{bounce:false,dragCallback:makeMidDragCallback_(coordData)});newCoordData.rightMidPlacemark=me.dom.buildPointPlacemark({point:coords.get(coordData.index),altitudeMode:altitudeMode,style:"#_GEarthExtensions_midCoordinate"});innerDoc.getFeatures().appendChild(newCoordData.rightMidPlacemark);me.edit.makeDraggable(newCoordData.rightMidPlacemark,{bounce:false,
dragCallback:makeMidDragCallback_(newCoordData)});newCoordData.deleteEventListener=makeRegularDeleteEventListener_(newCoordData);google.earth.addEventListener(this,"dblclick",newCoordData.deleteEventListener);newCoordData.regularDragCallback=makeRegularDragCallback_(newCoordData);coordDataArr.splice(newCoordData.index,0,newCoordData);for(i=0;i<numCoords;i++)coordDataArr[i].index=i}newCoordData.regularDragCallback.call(this,newCoordData)}};me.util.batchExecute(function(){for(var i=0;i<numCoords;i++){var curCoord=
coords.get(i);var nextCoord=coords.get((i+1)%numCoords);var coordData={};coordDataArr.push(coordData);coordData.index=i;if(isRing&&i==numCoords-1)continue;coordData.regularPlacemark=me.dom.buildPointPlacemark(curCoord,{altitudeMode:altitudeMode,style:"#_GEarthExtensions_regularCoordinate"});innerDoc.getFeatures().appendChild(coordData.regularPlacemark);coordData.regularDragCallback=makeRegularDragCallback_(coordData);me.edit.makeDraggable(coordData.regularPlacemark,{bounce:false,dragCallback:coordData.regularDragCallback});
coordData.deleteEventListener=makeRegularDeleteEventListener_(coordData);google.earth.addEventListener(coordData.regularPlacemark,"dblclick",coordData.deleteEventListener);if(i<numCoords-1||isRing){coordData.rightMidPlacemark=me.dom.buildPointPlacemark({point:(new geo.Point(curCoord)).midpoint(new geo.Point(nextCoord)),altitudeMode:altitudeMode,style:"#_GEarthExtensions_midCoordinate"});innerDoc.getFeatures().appendChild(coordData.rightMidPlacemark);me.edit.makeDraggable(coordData.rightMidPlacemark,
{bounce:false,dragCallback:makeMidDragCallback_(coordData)})}}checkDupMidpoints_();me.pluginInstance.getFeatures().appendChild(innerDoc)});me.util.setJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY,{innerDoc:innerDoc,abortAndEndFn:function(){me.util.batchExecute(function(){var numCoords=coords.getLength();if(numCoords&&isRing){var firstCoord=coords.get(0);var lastCoord=coords.get(numCoords-1);if(!coordsEqual_(firstCoord,lastCoord))coords.pushLatLngAlt(firstCoord.getLatitude(),firstCoord.getLongitude(),
firstCoord.getAltitude())}for(var i=0;i<coordDataArr.length;i++){if(!coordDataArr[i].regularPlacemark)continue;google.earth.removeEventListener(coordDataArr[i].regularPlacemark,"dblclick",coordDataArr[i].deleteEventListener);me.edit.endDraggable(coordDataArr[i].regularPlacemark);if(coordDataArr[i].rightMidPlacemark)me.edit.endDraggable(coordDataArr[i].rightMidPlacemark)}me.dom.removeObject(innerDoc)})}})};GEarthExtensions.prototype.edit.endEditLineString=function(lineString){var lineStringEditData=
this.util.getJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY);if(lineStringEditData){lineStringEditData.abortAndEndFn.call(null);this.util.clearJsDataValue(lineString,LINESTRINGEDITDATA_JSDATA_KEY)}};GEarthExtensions.prototype.fx={isnamespace_:true};GEarthExtensions.prototype.fx.AnimationManager_=createClass_(function(){this.extInstance=arguments.callee.extInstance_;this.animations_=[];this.running_=false;this.globalTime_=0});GEarthExtensions.prototype.fx.AnimationManager_.prototype.startAnimation=
function(anim){this.animations_.push({obj:anim,startGlobalTime:this.globalTime_});this.start_()};GEarthExtensions.prototype.fx.AnimationManager_.prototype.stopAnimation=function(anim){for(var i=0;i<this.animations_.length;i++)if(this.animations_[i].obj==anim){this.animations_.splice(i,1);return}};GEarthExtensions.prototype.fx.AnimationManager_.prototype.start_=function(){if(this.running_)return;this.startTimeStamp_=Number(new Date);this.tick_();for(var i=0;i<this.animations_.length;i++)this.animations_[i].obj.renderFrame(0);
var me=this;this.frameendListener_=function(){me.tick_()};this.tickInterval_=window.setInterval(this.frameendListener_,100);google.earth.addEventListener(this.extInstance.pluginInstance,"frameend",this.frameendListener_);this.running_=true};GEarthExtensions.prototype.fx.AnimationManager_.prototype.stop_=function(){if(!this.running_)return;google.earth.removeEventListener(this.extInstance.pluginInstance,"frameend",this.frameendListener_);this.frameendListener_=null;window.clearInterval(this.tickInterval_);
this.tickInterval_=null;this.running_=false;this.globalTime_=0};GEarthExtensions.prototype.fx.AnimationManager_.prototype.tick_=function(){if(!this.running_)return;this.globalTime_=Number(new Date)-this.startTimeStamp_;this.renderCurrentFrame_()};GEarthExtensions.prototype.fx.AnimationManager_.prototype.renderCurrentFrame_=function(){for(var i=this.animations_.length-1;i>=0;i--){var animation=this.animations_[i];animation.obj.renderFrame(this.globalTime_-animation.startGlobalTime)}if(this.animations_.length===
0)this.stop_()};GEarthExtensions.prototype.fx.getAnimationManager_=function(){if(!this.fx.animationManager_)this.fx.animationManager_=new this.fx.AnimationManager_;return this.fx.animationManager_};GEarthExtensions.prototype.fx.Animation=createClass_(function(renderFn,completionFn){this.extInstance=arguments.callee.extInstance_;this.renderFn=renderFn;this.completionFn=completionFn||function(){}});GEarthExtensions.prototype.fx.Animation.prototype.start=function(){this.extInstance.fx.getAnimationManager_().startAnimation(this)};
GEarthExtensions.prototype.fx.Animation.prototype.stop=function(completed){this.extInstance.fx.getAnimationManager_().stopAnimation(this);this.completionFn({cancelled:!Boolean(completed||geo.util.isUndefined(completed))})};GEarthExtensions.prototype.fx.Animation.prototype.rewind=function(){this.renderFrame(0);this.stop(false)};GEarthExtensions.prototype.fx.Animation.prototype.renderFrame=function(t){this.renderFn.call(this,t)};GEarthExtensions.prototype.fx.TimedAnimation=createClass_([GEarthExtensions.prototype.fx.Animation],
function(duration,renderFn,completionFn){this.extInstance=arguments.callee.extInstance_;this.duration=duration;this.renderFn=renderFn;this.complete=false;this.completionFn=completionFn||function(){}});GEarthExtensions.prototype.fx.TimedAnimation.prototype.renderFrame=function(t){if(this.complete)return;if(t>this.duration){this.renderFn.call(this,this.duration);this.stop();this.complete=true;return}this.renderFn.call(this,t)};GEarthExtensions.prototype.fx.bounce=function(placemark,options){options=
checkParameters_(options,false,{duration:300,startAltitude:ALLOWED_,altitude:this.util.getCamera().getAltitude()/5,phase:ALLOWED_,repeat:0,dampen:0.3,callback:function(){}});var me=this;this.fx.rewind(placemark);if(!"getGeometry"in placemark||!placemark.getGeometry()||placemark.getGeometry().getType()!="KmlPoint")throw new TypeError("Placemark must be a KmlPoint geometry");var point=placemark.getGeometry();var origAltitudeMode=point.getAltitudeMode();if(origAltitudeMode==this.pluginInstance.ALTITUDE_CLAMP_TO_GROUND){point.setAltitude(0);
point.setAltitudeMode(this.pluginInstance.ALTITUDE_RELATIVE_TO_GROUND)}if(origAltitudeMode==this.pluginInstance.ALTITUDE_CLAMP_TO_SEA_FLOOR){point.setAltitude(0);point.setAltitudeMode(this.pluginInstance.ALTITUDE_RELATIVE_TO_SEA_FLOOR)}if(typeof options.startAltitude!="number")options.startAltitude=point.getAltitude();var phase1,phase2;phase1=function(){me.fx.animateProperty(point,"altitude",{duration:options.duration/2,end:options.startAltitude+options.altitude,easing:"out",featureProxy:placemark,
callback:phase2||function(){}})};phase2=function(e){if(e&&e.cancelled)return;me.fx.animateProperty(point,"altitude",{duration:options.duration/2,start:options.startAltitude+options.altitude,end:options.startAltitude,easing:"in",featureProxy:placemark,callback:function(e2){point.setAltitudeMode(origAltitudeMode);if(e2.cancelled){point.setAltitude(options.startAltitude);options.callback.call(placemark,e2);return}if(options.repeat>=1){--options.repeat;options.altitude*=options.dampen;options.duration*=
Math.sqrt(options.dampen);options.phase=0;me.fx.bounce(placemark,options)}else options.callback.call(placemark,e2)}})};if(options.phase===1){phase2=null;phase1.call()}else if(options.phase===2)phase2.call();else phase1.call()};GEarthExtensions.prototype.fx.cancel=function(feature){var animations=this.util.getJsDataValue(feature,"_GEarthExtensions_anim")||[];for(var i=0;i<animations.length;i++)animations[i].stop(false)};GEarthExtensions.prototype.fx.rewind=function(feature){var animations=this.util.getJsDataValue(feature,
"_GEarthExtensions_anim")||[];for(var i=0;i<animations.length;i++)animations[i].rewind()};GEarthExtensions.prototype.fx.animateProperty=function(obj,property,options){options=checkParameters_(options,false,{duration:500,start:ALLOWED_,end:ALLOWED_,delta:ALLOWED_,easing:"none",callback:ALLOWED_,featureProxy:ALLOWED_});if(typeof options.easing=="string")options.easing={none:function(t){return t},"in":function(t){return t*t*t},out:function(t){var ts=t*t;var tc=ts*t;return tc-3*ts+3*t},both:function(t){var ts=
t*t;var tc=ts*t;return 6*tc*ts-15*ts*ts+10*tc}}[options.easing];var propertyTitleCase=property.charAt(0).toUpperCase()+property.substr(1);var me=this;var doAnimate_;if(property=="color"){if(options.delta)throw new Error("Cannot use delta with color animations.");var colorObj=obj.getColor()||{get:function(){return""}};if(!options.start)options.start=colorObj.get();if(!options.end)options.end=colorObj.get();doAnimate_=function(f){colorObj.set(me.util.blendColors(options.start,options.end,options.easing.call(null,
f)))}}else{var getter=function(){return me.util.callMethod(obj,"get"+propertyTitleCase)};var setter=function(val){return me.util.callMethod(obj,"set"+propertyTitleCase,val)};if(!isFinite(options.start)&&!isFinite(options.end)){if(!isFinite(options.delta))options.delta=0;options.start=getter();options.end=getter()+options.delta}else{if(!isFinite(options.start))options.start=getter();if(!isFinite(options.end))options.end=getter()}doAnimate_=function(f){setter(options.start+(options.end-options.start)*
options.easing.call(null,f))}}var anim=new this.fx.TimedAnimation(options.duration,function(t){doAnimate_(1*t/options.duration)},function(e){var animations=me.util.getJsDataValue(options.featureProxy||obj,"_GEarthExtensions_anim");if(animations){for(var i=0;i<animations.length;i++)if(animations[i]==this){animations.splice(i,1);break}if(!animations.length)me.util.clearJsDataValue(options.featureProxy||obj,"_GEarthExtensions_anim")}if(options.callback)options.callback.call(obj,e)});var animations=this.util.getJsDataValue(options.featureProxy||
obj,"_GEarthExtensions_anim");if(animations)animations.push(anim);else this.util.setJsDataValue(options.featureProxy||obj,"_GEarthExtensions_anim",[anim]);anim.start();return anim};GEarthExtensions.prototype.math3d={isnamespace_:true};function eulerAnglesToMatrix_(eulerAngles){var I=2;var J=0;var K=1;var m=[[0,0,0],[0,0,0],[0,0,0]];var cos_ti=Math.cos(eulerAngles[0]);var cos_tj=Math.cos(eulerAngles[1]);var cos_th=Math.cos(eulerAngles[2]);var sin_ti=Math.sin(eulerAngles[0]);var sin_tj=Math.sin(eulerAngles[1]);
var sin_th=Math.sin(eulerAngles[2]);var cos_c=cos_ti*cos_th;var cos_s=cos_ti*sin_th;var sin_c=sin_ti*cos_th;var sin_s=sin_ti*sin_th;m[I][I]=cos_tj*cos_th;m[I][J]=sin_tj*sin_c-cos_s;m[I][K]=sin_tj*cos_c+sin_s;m[J][I]=cos_tj*sin_th;m[J][J]=sin_tj*sin_s+cos_c;m[J][K]=sin_tj*cos_s-sin_c;m[K][I]=-sin_tj;m[K][J]=cos_tj*sin_ti;m[K][K]=cos_tj*cos_ti;return new geo.linalg.Matrix(m)}function matrixToEulerAngles_(matrix){var I=2+1;var J=0+1;var K=1+1;var FLT_EPSILON=1.0E-6;var cy=Math.sqrt(matrix.e(I,I)*matrix.e(I,
I)+matrix.e(J,I)*matrix.e(J,I));if(cy<=16*FLT_EPSILON)return[Math.atan2(-matrix.e(J,K),matrix.e(J,J)),Math.atan2(-matrix.e(K,I),cy),0];return[Math.atan2(matrix.e(K,J),matrix.e(K,K)),Math.atan2(-matrix.e(K,I),cy),Math.atan2(matrix.e(J,I),matrix.e(I,I))]}GEarthExtensions.prototype.math3d.htrToLocalFrame=function(htr){return eulerAnglesToMatrix_([htr[0].toRadians(),htr[1].toRadians(),htr[2].toRadians()])};GEarthExtensions.prototype.math3d.localFrameToHtr=function(matrix){var htr=matrixToEulerAngles_(matrix);
return[htr[0].toDegrees(),htr[1].toDegrees(),htr[2].toDegrees()]};GEarthExtensions.prototype.math3d.makeOrthonormalFrame=function(dir,up){var newRight=dir.cross(up).toUnitVector();if(newRight.eql(geo.linalg.Vector.Zero(3)))return null;var newDir=up.cross(newRight).toUnitVector();var newUp=newRight.cross(newDir);return new geo.linalg.Matrix([newRight.elements,newDir.elements,newUp.elements])};GEarthExtensions.prototype.math3d.makeLocalToGlobalFrame=function(point){var vertical=point.toCartesian().toUnitVector();
var east=(new geo.linalg.Vector([0,1,0])).cross(vertical).toUnitVector();var north=vertical.cross(east).toUnitVector();return new geo.linalg.Matrix([east.elements,north.elements,vertical.elements])};GEarthExtensions.prototype.util={isnamespace_:true};GEarthExtensions.NAMED_COLORS={aqua:"ffffff00",black:"ff000000",blue:"ffff0000",fuchsia:"ffff00ff",gray:"ff808080",green:"ff008000",lime:"ff00ff00",maroon:"ff000080",navy:"ff800000",olive:"ff008080",purple:"ff800080",red:"ff0000ff",silver:"ffc0c0c0",
teal:"ff808000",white:"ffffffff",yellow:"ff00ffff"};GEarthExtensions.prototype.util.parseColor=function(arg,opacity){var pad2_=function(s){return(s.length<2?"0":"")+s};if(geo.util.isArray(arg))return pad2_(arg.length>=4?arg[3].toString(16):"ff")+pad2_(arg[2].toString(16))+pad2_(arg[1].toString(16))+pad2_(arg[0].toString(16));else if(typeof arg=="string"){if(arg.toLowerCase()in GEarthExtensions.NAMED_COLORS)return GEarthExtensions.NAMED_COLORS[arg.toLowerCase()];if(arg.length>7)return arg.match(/^[0-9a-f]{8}$/i)?
arg:null;else{var kmlColor=null;if(arg.length>4)kmlColor=arg.replace(/#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i,"ff$3$2$1").toLowerCase();else kmlColor=arg.replace(/#?([0-9a-f])([0-9a-f])([0-9a-f])/i,"ff$3$3$2$2$1$1").toLowerCase();if(kmlColor==arg)return null;if(!geo.util.isUndefined(opacity))kmlColor=pad2_(Math.floor(255*opacity).toString(16))+kmlColor.substring(2);return kmlColor}}return null};GEarthExtensions.prototype.util.blendColors=function(color1,color2,fraction){if(geo.util.isUndefined(fraction)||
fraction===null)fraction=0.5;color1=this.util.parseColor(color1);color2=this.util.parseColor(color2);var pad2_=function(s){return(s.length<2?"0":"")+s};var blendHexComponent_=function(c1,c2){c1=parseInt(c1,16);c2=parseInt(c2,16);return pad2_(Math.floor((c2-c1)*fraction+c1).toString(16))};return blendHexComponent_(color1.substr(0,2),color2.substr(0,2))+blendHexComponent_(color1.substr(2,2),color2.substr(2,2))+blendHexComponent_(color1.substr(4,2),color2.substr(4,2))+blendHexComponent_(color1.substr(6,
2),color2.substr(6,2))};var jsData_={};function randomUUID_(){var s=[],itoh="0123456789ABCDEF",i=0;for(i=0;i<36;i++)s[i]=Math.floor(Math.random()*16);s[14]=4;s[19]=s[19]&3|8;for(i=0;i<36;i++)s[i]=itoh.charAt(s[i]);s[8]=s[13]=s[18]=s[23]="-";return s.join("")}function getJsTag_(object){for(var tag in jsData_)if(jsData_[tag].object.equals(object))return tag;return null}GEarthExtensions.prototype.util.hasJsData=function(object){return getJsTag_(object)?true:false};GEarthExtensions.prototype.util.clearAllJsData=
function(object){var jsTag=getJsTag_(object);if(jsTag)delete jsData_[jsTag]};GEarthExtensions.prototype.util.getJsDataValue=function(object,key){var jsTag=getJsTag_(object);if(jsTag&&key in jsData_[jsTag].data)return jsData_[jsTag].data[key];return undefined};GEarthExtensions.prototype.util.setJsDataValue=function(object,key,value){var jsTag=getJsTag_(object);if(!jsTag){jsTag=null;while(!jsTag||jsTag in jsData_)jsTag=randomUUID_();jsData_[jsTag]={object:object,data:{}}}jsData_[jsTag].data[key]=value};
GEarthExtensions.prototype.util.clearJsDataValue=function(object,key){var jsTag=getJsTag_(object);if(jsTag&&key in jsData_[jsTag].data){delete jsData_[jsTag].data[key];for(var k in jsData_[jsTag].data)return;this.util.clearAllJsData(object)}};GEarthExtensions.prototype.util.displayKml=function(url,options){options=checkParameters_(options,false,{cacheBuster:false,flyToView:false,flyToBoundsFallback:true,aspectRatio:1});if(options.cacheBuster)url+=(url.match(/\?/)?"&":"?")+"_cacheBuster="+Number(new Date).toString();
var me=this;google.earth.fetchKml(me.pluginInstance,url,function(kmlObject){if(kmlObject){me.pluginInstance.getFeatures().appendChild(kmlObject);if(options.flyToView)me.util.flyToObject(kmlObject,{boundsFallback:options.flyToBoundsFallback,aspectRatio:options.aspectRatio})}})};GEarthExtensions.prototype.util.displayKmlString=function(str,options){options=checkParameters_(options,false,{flyToView:false,flyToBoundsFallback:true,aspectRatio:1});var kmlObject=this.pluginInstance.parseKml(str);if(kmlObject){this.pluginInstance.getFeatures().appendChild(kmlObject);
if(options.flyToView)this.util.flyToObject(kmlObject,{boundsFallback:options.flyToBoundsFallback,aspectRatio:options.aspectRatio})}return kmlObject};GEarthExtensions.prototype.util.lookAt=function(){this.pluginInstance.getView().setAbstractView(this.dom.buildLookAt.apply(null,arguments))};GEarthExtensions.prototype.util.getLookAt=function(altitudeMode){if(geo.util.isUndefined(altitudeMode))altitudeMode=this.pluginInstance.ALTITUDE_ABSOLUTE;return this.pluginInstance.getView().copyAsLookAt(altitudeMode)};
GEarthExtensions.prototype.util.getCamera=function(altitudeMode){if(geo.util.isUndefined(altitudeMode))altitudeMode=this.pluginInstance.ALTITUDE_ABSOLUTE;return this.pluginInstance.getView().copyAsCamera(altitudeMode)};GEarthExtensions.prototype.util.flyToObject=function(obj,options){options=checkParameters_(options,false,{boundsFallback:true,aspectRatio:1,defaultRange:4E3});if(!obj)throw new Error("flyToObject was given an invalid object.");if("getAbstractView"in obj&&obj.getAbstractView())this.pluginInstance.getView().setAbstractView(obj.getAbstractView());
else if(options.boundsFallback){var bounds=this.dom.computeBounds(obj);if(bounds&&!bounds.isEmpty())this.view.setToBoundsView(bounds,{aspectRatio:options.aspectRatio,defaultRange:options.defaultRange})}};GEarthExtensions.prototype.util.batchExecute=function(batchFn,context){var me=this;google.earth.executeBatch(this.pluginInstance,function(){batchFn.call(me,context)})};GEarthExtensions.prototype.util.callMethod=function(object,method){"object:nomunge, method:nomunge, args:nomunge";var i;var args=
[];for(i=2;i<arguments.length;i++)args.push(arguments[i]);if(typeof object[method]=="function")return object[method].apply(object,args);else{var reprArgs=[];for(i=0;i<args.length;i++)reprArgs.push("args["+i+"]");return window["eval"]("object."+method+"("+reprArgs.join(",")+")")}};GEarthExtensions.prototype.util.takeOverCamera=function(enable){if(enable||geo.util.isUndefined(enable)){if(this.cameraControlOldProps_)return;this.cameraControlOldProps_={flyToSpeed:this.pluginInstance.getOptions().getFlyToSpeed(),
mouseNavEnabled:this.pluginInstance.getOptions().getMouseNavigationEnabled(),navControlVis:this.pluginInstance.getNavigationControl().getVisibility()};this.pluginInstance.getOptions().setFlyToSpeed(this.pluginInstance.SPEED_TELEPORT);this.pluginInstance.getOptions().setMouseNavigationEnabled(false);this.pluginInstance.getNavigationControl().setVisibility(this.pluginInstance.VISIBILITY_HIDE)}else{if(!this.cameraControlOldProps_)return;this.pluginInstance.getOptions().setFlyToSpeed(this.cameraControlOldProps_.flyToSpeed);
this.pluginInstance.getOptions().setMouseNavigationEnabled(this.cameraControlOldProps_.mouseNavEnabled);this.pluginInstance.getNavigationControl().setVisibility(this.cameraControlOldProps_.navControlVis);delete this.cameraControlOldProps_}};var ALPHABET_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";GEarthExtensions.prototype.util.encodeArray=function(arr){var s="";for(var i=0;i<arr.length;i++){var sgn_num=arr[i]<<1;sgn_num=arr[i]<0?~sgn_num:sgn_num;while(sgn_num>=32){s+=ALPHABET_.charAt(32|
sgn_num&31);sgn_num>>=5}s+=ALPHABET_.charAt(sgn_num)}return s};GEarthExtensions.prototype.util.decodeArray=function(str){var len=str.length;var index=0;var array=[];while(index<len){var b;var shift=0;var result=0;do{b=ALPHABET_.indexOf(str.charAt(index++));result|=(b&31)<<shift;shift+=5}while(b>=32);array.push(result&1?~(result>>1):result>>1)}return array};GEarthExtensions.prototype.view={isnamespace_:true};GEarthExtensions.prototype.view.createBoundsView=function(bounds,options){options=checkParameters_(options,
false,{aspectRatio:REQUIRED_,defaultRange:1E3,scaleRange:1.5});var center=bounds.center();var lookAtRange=options.defaultRange;var boundsSpan=bounds.span();if(boundsSpan.lat||boundsSpan.lng){var distEW=(new geo.Point(center.lat(),bounds.east())).distance(new geo.Point(center.lat(),bounds.west()));var distNS=(new geo.Point(bounds.north(),center.lng())).distance(new geo.Point(bounds.south(),center.lng()));var aspectRatio=Math.min(Math.max(options.aspectRatio,distEW/distNS),1);var alpha=(45/(aspectRatio+
0.4)-2).toRadians();var expandToDistance=Math.max(distNS,distEW);var beta=Math.min((90).toRadians(),alpha+expandToDistance/(2*geo.math.EARTH_RADIUS));lookAtRange=options.scaleRange*geo.math.EARTH_RADIUS*(Math.sin(beta)*Math.sqrt(1+1/Math.pow(Math.tan(alpha),2))-1)}return this.dom.buildLookAt(new geo.Point(center.lat(),center.lng(),bounds.top(),bounds.northEastTop().altitudeMode()),{range:lookAtRange})};GEarthExtensions.prototype.view.setToBoundsView=function(){this.pluginInstance.getView().setAbstractView(this.view.createBoundsView.apply(this,
arguments))};var ENC_OVERFLOW_=1073741824;function encodeCamera_(extInstance,cam){var alt=Math.floor(cam.altitude*10);return extInstance.util.encodeArray([Math.floor(geo.math.constrainValue(cam.lat,[-90,90])*1E5),Math.floor(geo.math.wrapValue(cam.lng,[-180,180])*1E5),Math.floor(alt/ENC_OVERFLOW_),alt>=0?alt%ENC_OVERFLOW_:ENC_OVERFLOW_-Math.abs(alt)%ENC_OVERFLOW_,Math.floor(geo.math.wrapValue(cam.heading,[0,360])*10),Math.floor(geo.math.wrapValue(cam.tilt,[0,180])*10),Math.floor(geo.math.wrapValue(cam.roll,
[-180,180])*10)])}function decodeCamera_(extInstance,str){var arr=extInstance.util.decodeArray(str);return{lat:geo.math.constrainValue(arr[0]*1.0E-5,[-90,90]),lng:geo.math.wrapValue(arr[1]*1.0E-5,[-180,180]),altitude:(ENC_OVERFLOW_*arr[2]+arr[3])*0.1,heading:geo.math.wrapValue(arr[4]*0.1,[0,360]),tilt:geo.math.wrapValue(arr[5]*0.1,[0,180]),roll:geo.math.wrapValue(arr[6]*0.1,[-180,180])}}GEarthExtensions.prototype.view.serialize=function(){var camera=this.pluginInstance.getView().copyAsCamera(this.pluginInstance.ALTITUDE_ABSOLUTE);
return"0"+encodeCamera_(this,{lat:camera.getLatitude(),lng:camera.getLongitude(),altitude:camera.getAltitude(),heading:camera.getHeading(),tilt:camera.getTilt(),roll:camera.getRoll()})};GEarthExtensions.prototype.view.deserialize=function(s){if(s.charAt(0)!="0")throw new Error("Invalid serialized view string.");var cameraProps=decodeCamera_(this,s.substr(1));var camera=this.pluginInstance.createCamera("");camera.set(cameraProps.lat,cameraProps.lng,cameraProps.altitude,this.pluginInstance.ALTITUDE_ABSOLUTE,
cameraProps.heading,cameraProps.tilt,cameraProps.roll);this.pluginInstance.getView().setAbstractView(camera)};GEarthExtensions.prototype.util.serializeView=GEarthExtensions.prototype.view.serialize;GEarthExtensions.prototype.util.deserializeView=GEarthExtensions.prototype.view.deserialize;GEarthExtensions.prototype.view.createVantageView=function(cameraPoint,lookAtPoint){cameraPoint=new geo.Point(cameraPoint);lookAtPoint=new geo.Point(lookAtPoint);var heading=cameraPoint.heading(lookAtPoint);var roll=
0;var cameraCartesian=cameraPoint.toCartesian();var lookAtCartesian=lookAtPoint.toCartesian();var frame=this.math3d.makeLocalToGlobalFrame(cameraPoint);var lookVec=lookAtCartesian.subtract(cameraCartesian).toUnitVector();var downVec=(new geo.linalg.Vector(frame.elements[2])).multiply(-1);var tilt=Math.acos(downVec.dot(lookVec)).toDegrees();return this.dom.buildCamera(cameraPoint,{heading:heading,tilt:tilt})};window.GEarthExtensions=GEarthExtensions})();
