/* 
RecPath distance mapping software
Copyright (C) 2005  Andy Allen

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

You can contact the author at andy@recpath.com
*/

function RP_makePackedRoute(center, zoom, maptype, color, weight, opacity, packingPrecision, negligibleTurn) {
	var base72 = "";
	var prec = (packingPrecision || 14);
	var neg = (negligibleTurn || 0);
	
	var str = zoom + ",";
	str += MAP_TYPE + ",";
	str += color + ",";
	str += weight + ",";
	str += opacity + ",";
	str += truncDecimal(center.x, prec) + "," + truncDecimal(center.y, prec) + ",";
	for (var i = 0; i < this.Points.length; i++) {
		if (!(neg) || !(this.TurnIsNegligible(i, neg))) {
			str += truncDecimal(this.Points[i].x, prec) + "," + truncDecimal(this.Points[i].y, prec) + ",";
		}
	}
	
	var rx = new RegExp(/[^0-9\.\-\,]/);
	if (str.match(rx)) { alert("unpackable chars detected: " + str); return ""; }
	base72 = pack13to72(str)	

	return base72;
}

function RP_readPackedRoute(base72) {
	var rx = new RegExp(/[^0-9A-Za-z\!\$\(\)\*\+\,\-\.\_]/);
	if (base72.match(rx)) {	alert("illegal chars detected in packed route: " + base72);	return ""; }

	var base13 = unpack13from72(base72);
	var routeAry = base13.split(",");
	this.RemoveAllPoints();
	for (var i = 7; i < routeAry.length; i += 2) {
		var pt = new GPoint(routeAry[i], routeAry[i + 1]);
		this.AddPointToEnd(pt);
	}

	return new Array(new GPoint(routeAry[5], routeAry[6]), routeAry[0], routeAry[1], routeAry[2], routeAry[3], routeAry[4]);


}

function pack13to72(str13) {
	var str72 = "";
	while(str13.length % 5 > 0) { str13 += ","; }
	for (var i = 0; i < str13.length; i += 5) {
		var u1 = n13[str13.substr(i, 1)];
		var u2 = n13[str13.substr(i + 1, 1)];
		var u3 = n13[str13.substr(i + 2, 1)];
		var u4 = n13[str13.substr(i + 3, 1)];
		var u5 = n13[str13.substr(i + 4, 1)];
		var dec = parseInt(u1 * 28561) + parseInt(u2 * 2197) + parseInt(u3 * 169) + parseInt(u4 * 13) + parseInt(u5);
		var p1 = c72[parseInt(dec / 5184)];
		var p2 = c72[parseInt((dec % 5184) / 72)];
		var p3 = c72[parseInt(dec % 72)];
		str72 += p1 + "" + p2 + "" + p3;
	}
	return str72;
}

function unpack13from72(str72) {
	var str13 = "";
	for (var i = 0; i < str72.length; i += 3) {
		var p1 = n72[str72.substr(i, 1)];
		var p2 = n72[str72.substr(i + 1, 1)];
		var p3 = n72[str72.substr(i + 2, 1)];
		var dec = parseInt(p1 * 5184) + parseInt(p2 * 72) + parseInt(p3);
		var u1 = c13[parseInt(dec / 28561)];
		var u2 = c13[parseInt((dec % 28561) / 2197)];
		var u3 = c13[parseInt((dec % 2197) / 169)];
		var u4 = c13[parseInt((dec % 169) / 13)];
		var u5 = c13[parseInt(dec % 13)];
		str13 += u1 + "" + u2 + "" + u3 + "" + u4 + "" + u5;
	}
	while (str13.substr(str13.length - 1) == ",") { str13 = str13.substr(0, str13.length - 2); }
	return str13;
}

function RP_estPackedSize(compact) {
	var est = 0;
	if (compact) x = parseFloat(12.3);
	else         x = parseFloat(23.4);
	//TODO: replace ref to global with obj
	p = r.Points.length;
	f = parseInt(23) + parseInt(window.location.host.length) + parseInt(window.location.pathname.length);
	
	est = parseInt(p * x + f);
	return est;
}

//END// don't touch anything below this comment
var c13=new Object();
c13[0]='0';c13[1]='1';c13[2]='2';c13[3]='3';c13[4]='4';c13[5]='5';c13[6]='6';c13[7]='7';c13[8]='8';c13[9]='9';c13[10]='-';c13[11]='.';c13[12]=',';
var n13=new Object();
n13['0']=0;n13['1']=1;n13['2']=2;n13['3']=3;n13['4']=4;n13['5']=5;n13['6']=6;n13['7']=7;n13['8']=8;n13['9']=9;n13['-']=10;n13['.']=11;n13[',']=12;
var c72=new Object();
c72[0]='0';c72[1]='1';c72[2]='2';c72[3]='3';c72[4]='4';c72[5]='5';c72[6]='6';c72[7]='7';c72[8]='8';c72[9]='9';c72[10]='A';c72[11]='B';c72[12]='C';c72[13]='D';c72[14]='E';c72[15]='F';c72[16]='G';c72[17]='H';c72[18]='I';c72[19]='J';c72[20]='K';c72[21]='L';c72[22]='M';c72[23]='N';c72[24]='O';c72[25]='P';c72[26]='Q';c72[27]='R';c72[28]='S';c72[29]='T';c72[30]='U';c72[31]='V';c72[32]='W';c72[33]='X';c72[34]='Y';c72[35]='Z';c72[36]='a';c72[37]='b';c72[38]='c';c72[39]='d';c72[40]='e';c72[41]='f';c72[42]='g';c72[43]='h';c72[44]='i';c72[45]='j';c72[46]='k';c72[47]='l';c72[48]='m';c72[49]='n';c72[50]='o';c72[51]='p';c72[52]='q';c72[53]='r';c72[54]='s';c72[55]='t';c72[56]='u';c72[57]='v';c72[58]='w';c72[59]='x';c72[60]='y';c72[61]='z';c72[62]='!';c72[63]='$';c72[64]='(';c72[65]=')';c72[66]='*';c72[67]='+';c72[68]=',';c72[69]='-';c72[70]='.';c72[71]='_';
var n72=new Object();
n72['0']=0;n72['1']=1;n72['2']=2;n72['3']=3;n72['4']=4;n72['5']=5;n72['6']=6;n72['7']=7;n72['8']=8;n72['9']=9;n72['A']=10;n72['B']=11;n72['C']=12;n72['D']=13;n72['E']=14;n72['F']=15;n72['G']=16;n72['H']=17;n72['I']=18;n72['J']=19;n72['K']=20;n72['L']=21;n72['M']=22;n72['N']=23;n72['O']=24;n72['P']=25;n72['Q']=26;n72['R']=27;n72['S']=28;n72['T']=29;n72['U']=30;n72['V']=31;n72['W']=32;n72['X']=33;n72['Y']=34;n72['Z']=35;n72['a']=36;n72['b']=37;n72['c']=38;n72['d']=39;n72['e']=40;n72['f']=41;n72['g']=42;n72['h']=43;n72['i']=44;n72['j']=45;n72['k']=46;n72['l']=47;n72['m']=48;n72['n']=49;n72['o']=50;n72['p']=51;n72['q']=52;n72['r']=53;n72['s']=54;n72['t']=55;n72['u']=56;n72['v']=57;n72['w']=58;n72['x']=59;n72['y']=60;n72['z']=61;n72['!']=62;n72['$']=63;n72['(']=64;n72[')']=65;n72['*']=66;n72['+']=67;n72[',']=68;n72['-']=69;n72['.']=70;n72['_']=71;
