// PolylineEncoder.js copyright Mark McClure  April/May 2007
//
// This software is placed explicitly in the public
// domain and may be freely distributed or modified.
// No warranty express or implied is provided.
//
PolylineEncoder=function(a,b,c,d){a||(a=18);b||(b=2);c||(c=1.0E-5);d||(d=!0);this.numLevels=a;this.zoomFactor=b;this.verySmall=c;this.forceEndpoints=d;this.zoomLevelBreaks=Array(a);for(d=0;d<a;d++)this.zoomLevelBreaks[d]=c*Math.pow(b,a-d-1)}; PolylineEncoder.prototype.dpEncode=function(a){var b=0,c=[],d=Array(a.length),e,h,i,f,g,j;if(a.length>2)for(c.push([0,a.length-1]);c.length>0;){f=c.pop();e=0;j=Math.pow(a[f[1]].lat()-a[f[0]].lat(),2)+Math.pow(a[f[1]].lng()-a[f[0]].lng(),2);for(g=f[0]+1;g<f[1];g++)i=this.distance(a[g],a[f[0]],a[f[1]],j),i>e&&(e=i,h=g,e>b&&(b=e));e>this.verySmall&&(d[h]=e,c.push([f[0],h]),c.push([h,f[1]]))}c=this.createEncodings(a,d);a=this.encodeLevels(a,d,b);return{encodedPoints:c,encodedLevels:a,encodedPointsLiteral:c.replace(/\\/g, "\\\\")}};PolylineEncoder.prototype.dpEncodeToJSON=function(a,b,c,d){d||(d=0.9);c||(c=3);b||(b="#0000ff");a=this.dpEncode(a);return{color:b,weight:c,opacity:d,points:a.encodedPoints,levels:a.encodedLevels,numLevels:this.numLevels,zoomFactor:this.zoomFactor}};PolylineEncoder.prototype.dpEncodeToGPolyline=function(a,b,c,d){d||(d=0.9);c||(c=3);b||(b="#0000ff");return new GPolyline.fromEncoded(this.dpEncodeToJSON(a,b,c,d))}; PolylineEncoder.prototype.dpEncodeToGPolygon=function(a,b,c,d,e,h,i,f){var g,j;b||(b="#0000ff");c||(c=3);d||(d=0.9);e||(e=b);h||(h=d/3);i==void 0&&(i=!0);f==void 0&&(f=!0);j=[];for(g=0;g<a.length;g++)j.push(this.dpEncodeToJSON(a[g],b,c,d));return new GPolygon.fromEncoded({polylines:j,color:e,opacity:h,fill:i,outline:f})}; PolylineEncoder.prototype.distance=function(a,b,c,d){var e;b.lat()===c.lat()&&b.lng()===c.lng()?e=Math.sqrt(Math.pow(c.lat()-a.lat(),2)+Math.pow(c.lng()-a.lng(),2)):(d=((a.lat()-b.lat())*(c.lat()-b.lat())+(a.lng()-b.lng())*(c.lng()-b.lng()))/d,d<=0&&(e=Math.sqrt(Math.pow(a.lat()-b.lat(),2)+Math.pow(a.lng()-b.lng(),2))),d>=1&&(e=Math.sqrt(Math.pow(a.lat()-c.lat(),2)+Math.pow(a.lng()-c.lng(),2))),0<d&&d<1&&(e=Math.sqrt(Math.pow(a.lat()-b.lat()-d*(c.lat()-b.lat()),2)+Math.pow(a.lng()-b.lng()-d*(c.lng()- b.lng()),2))));return e};PolylineEncoder.prototype.createEncodings=function(a,b){var c,d,e,h=0,i=0,f="";for(c=0;c<a.length;c++)if(b[c]!=void 0||c==0||c==a.length-1){d=a[c];var g=d.lat();d=d.lng();var g=Math.floor(g*1E5),j=Math.floor(d*1E5);d=g-h;e=j-i;h=g;i=j;f+=this.encodeSignedNumber(d)+this.encodeSignedNumber(e)}return f};PolylineEncoder.prototype.computeLevel=function(a){var b;if(a>this.verySmall){for(b=0;a<this.zoomLevelBreaks[b];)b++;return b}}; PolylineEncoder.prototype.encodeLevels=function(a,b,c){var d,e="";e+=this.forceEndpoints?this.encodeNumber(this.numLevels-1):this.encodeNumber(this.numLevels-this.computeLevel(c)-1);for(d=1;d<a.length-1;d++)b[d]!=void 0&&(e+=this.encodeNumber(this.numLevels-this.computeLevel(b[d])-1));e+=this.forceEndpoints?this.encodeNumber(this.numLevels-1):this.encodeNumber(this.numLevels-this.computeLevel(c)-1);return e}; PolylineEncoder.prototype.encodeNumber=function(a){for(var b="",c;a>=32;)c=(32|a&31)+63,b+=String.fromCharCode(c),a>>=5;b+=String.fromCharCode(a+63);return b};PolylineEncoder.prototype.encodeSignedNumber=function(a){var b=a<<1;a<0&&(b=~b);return this.encodeNumber(b)};PolylineEncoder.latLng=function(a,b){this.y=a;this.x=b};PolylineEncoder.latLng.prototype.lat=function(){return this.y};PolylineEncoder.latLng.prototype.lng=function(){return this.x}; PolylineEncoder.pointsToLatLngs=function(a){var b,c;c=[];for(b=0;b<a.length;b++)c.push(new PolylineEncoder.latLng(a[b][0],a[b][1]));return c};PolylineEncoder.pointsToGLatLngs=function(a){var b,c;c=[];for(b=0;b<a.length;b++)c.push(new GLatLng(a[b][0],a[b][1]));return c};
