Skip to content

Commit 76cd8e3

Browse files
committed
Fixes bug in shortest code in getTerritoryAlphaCode
1 parent 817431d commit 76cd8e3

File tree

1 file changed

+64
-28
lines changed

1 file changed

+64
-28
lines changed

mapcode.js

Lines changed: 64 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,21 @@ var iso3166alpha = [
102102
];
103103

104104

105-
var aliases = "2UK=2UT,2CG=2CT,1GU=GUM,1UM=UMI,1VI=VIR,1AS=ASM,1MP=MNP,4CX=CXR,4CC=CCK,4NF=NFK,4HM=HMD,COL=5CL,5ME=5MX,MEX=5MX,5AG=AGU,5BC=BCN,5BS=BCS,5CM=CAM,5CS=CHP,5CH=CHH,5CO=COA,5DF=DIF,5DG=DUR,5GT=GUA,5GR=GRO,5HG=HID,5JA=JAL,5MI=MIC,5MO=MOR,5NA=NAY,5NL=NLE,5OA=OAX,5PB=PUE,5QE=QUE,5QR=ROO,5SL=SLP,5SI=SIN,5SO=SON,5TB=TAB,5TL=TLA,5VE=VER,5YU=YUC,5ZA=ZAC,811=8BJ,812=8TJ,813=8HE,814=8SX,815=8NM,821=8LN,822=8JL,823=8HL,831=8SH,832=8JS,833=8ZJ,834=8AH,835=8FJ,836=8JX,837=8SD,841=8HA,842=8HB,843=8HN,844=8GD,845=8GX,846=8HI,850=8CQ,851=8SC,852=8GZ,853=8YN,854=8XZ,861=8SN,862=8GS,863=8QH,864=8NX,865=8XJ,871=TWN,891=HKG,892=MAC,8TW=TWN,8HK=HKG,8MC=MAC,BEL=7BE,KIR=7KI,PRI=7PO,CHE=7CH,KHM=7KM,PER=7PM,TAM=7TT,0US=USA,0AU=AUS,0RU=RUS,0CN=CHN,TAA=SHN,ASC=SHN,DGA=IOT,WAK=MHL,JTN=UMI,MID=1HI,1PR=PRI,5TM=TAM,TAM=TAM,2OD=2OR,";
105+
var aliases = "2UK=2UT,2CG=2CT,1GU=GUM,1UM=UMI,1VI=VIR,1AS=ASM,1MP=MNP,4CX=CXR,4CC=CCK,4NF=NFK,4HM=HMD," +
106+
"COL=5CL,5ME=5MX,MEX=5MX,5AG=AGU,5BC=BCN,5BS=BCS,5CM=CAM,5CS=CHP,5CH=CHH,5CO=COA,5DF=DIF,5DG=DUR," +
107+
"5GT=GUA,5GR=GRO,5HG=HID,5JA=JAL,5MI=MIC,5MO=MOR,5NA=NAY,5NL=NLE,5OA=OAX,5PB=PUE,5QE=QUE,5QR=ROO," +
108+
"5SL=SLP,5SI=SIN,5SO=SON,5TB=TAB,5TL=TLA,5VE=VER,5YU=YUC,5ZA=ZAC,811=8BJ,812=8TJ,813=8HE,814=8SX," +
109+
"815=8NM,821=8LN,822=8JL,823=8HL,831=8SH,832=8JS,833=8ZJ,834=8AH,835=8FJ,836=8JX,837=8SD,841=8HA," +
110+
"842=8HB,843=8HN,844=8GD,845=8GX,846=8HI,850=8CQ,851=8SC,852=8GZ,853=8YN,854=8XZ,861=8SN,862=8GS," +
111+
"863=8QH,864=8NX,865=8XJ,871=TWN,891=HKG,892=MAC,8TW=TWN,8HK=HKG,8MC=MAC,BEL=7BE,KIR=7KI,PRI=7PO," +
112+
"CHE=7CH,KHM=7KM,PER=7PM,TAM=7TT,0US=USA,0AU=AUS,0RU=RUS,0CN=CHN,TAA=SHN,ASC=SHN,DGA=IOT,WAK=MHL," +
113+
"JTN=UMI,MID=1HI,1PR=PRI,5TM=TAM,TAM=TAM,2OD=2OR,";
106114

107115
var dependency = [
108116
27, 410, 50, 410, 26, 410, 53, 410, 48, 410, 47, 410, 76, 410, 529, 410, 38, 410,
109117
21, 408, 4, 408, 42, 408, 11, 408,
110-
18, 166, 14, 166, 15, 166, 23, 166, 32, 166, 82, 166, 2, 166, 17, 166, 51, 166, 20, 166, 19, 166, 12, 166, 35, 166, 70, 166, 59, 166,
118+
18, 166, 14, 166, 15, 166, 23, 166, 32, 166, 82, 166, 2, 166, 17, 166, 51, 166, 20, 166, 19, 166, 12, 166,
119+
35, 166, 70, 166, 59, 166,
111120
61, 528, 8, 528, 109, 528,
112121
63, 113, 265, 113,
113122
198, 181,
@@ -153,7 +162,7 @@ var mapcode_dataversion = "2.3.0";
153162

154163
// *************************** mapcode_org *********************
155164

156-
var mapcode_javaversion = '2.4.0/Data' + mapcode_dataversion;
165+
var mapcode_javaversion = '2.4.1/Data' + mapcode_dataversion;
157166

158167
/// PRIVATE returns string without leading spaces and plus-signs, and trailing spaces
159168
function trim(str) {
@@ -401,12 +410,12 @@ function isInRangeX(x, minx, maxx) {
401410

402411
/// PRIVATE returns true iff coordinate inside rectangle (all values in millionths)
403412
function fitsInside(coord, mm) {
404-
return ( mm.miny <= coord.y && coord.y < mm.maxy && isInRangeX(coord.x, mm.minx, mm.maxx) );
413+
return (mm.miny <= coord.y && coord.y < mm.maxy && isInRangeX(coord.x, mm.minx, mm.maxx));
405414
}
406415

407416
/// PRIVATE returns true iff coordinate inside rectangle with some room to spare outside (all values in millionths)
408417
function fitsInsideWithRoom(coord, mm) {
409-
if ((( mm.miny - 60) > coord.y) || (coord.y >= (mm.maxy + 60))) {
418+
if (((mm.miny - 60) > coord.y) || (coord.y >= (mm.maxy + 60))) {
410419
return false;
411420
}
412421
var xroom = xDivider4(mm.miny, mm.maxy) / 4;
@@ -415,7 +424,7 @@ function fitsInsideWithRoom(coord, mm) {
415424

416425
/// PRIVATE returns true iff coordinate inside rectangle with some room to spare inside (all values in millionths)
417426
function fitsWellInside(coord, mm) {
418-
if ((( mm.miny + 60) > coord.y) || (coord.y >= (mm.maxy - 60))) {
427+
if (((mm.miny + 60) > coord.y) || (coord.y >= (mm.maxy - 60))) {
419428
return false;
420429
}
421430
var xroom = xDivider4(mm.miny, mm.maxy) / 4;
@@ -448,14 +457,16 @@ function getTerritoryAlphaCode(territory, format) {
448457
}
449458
// shortest POSSIBLE
450459
var parent = getParentOf(territoryNumber);
460+
var n = full.substr(hyphen + 1);
451461
// see if n occurs multiple times, if not, don't bother with parent
452462
var count = 0;
453463
var i = aliases.indexOf(n + '=');
454464
if (i >= 0) {
455465
count = 2;
456466
} else {
457467
for (i = 0; i < iso3166alpha.length; i++) {
458-
if (iso3166alpha[i].indexOf("-" + short) > 0) {
468+
var pos = iso3166alpha[i].indexOf("-" + short);
469+
if ((pos >= 0) && (iso3166alpha[i].substr(pos + 1) == short)) {
459470
count++;
460471
}
461472
}
@@ -467,9 +478,11 @@ function getTerritoryAlphaCode(territory, format) {
467478
function dataFirstRecord(territoryNumber) {
468479
return data_start[territoryNumber];
469480
}
481+
470482
function dataLastRecord(territoryNumber) {
471483
return data_start[++territoryNumber] - 1;
472484
}
485+
473486
function minmaxSetup(i) {
474487
var d = data_maxy[i];
475488
if (d < 10) {
@@ -586,7 +599,7 @@ function decodeSixWide(v, width, height) {
586599
col = maxcol;
587600
D = width - maxcol * 6;
588601
}
589-
var w = v - (col * height * 6 );
602+
var w = v - (col * height * 6);
590603
var x6 = col * 6 + (w % D);
591604
var y6 = height - 1 - Math.floor(w / D);
592605
return {y: y6, x: x6}
@@ -605,6 +618,7 @@ function encodeSixWide(x, y, width, height) {
605618

606619
var getDebugInfo; // caller must set this to 1 to get debug info about first successful encode
607620
var mcInfo;
621+
608622
/*
609623
type: 1=topdown nameless, 2=sixwide nameless, 3=regulargrid 4=irregular grid 5=rounded groups 6=unrounded groups
610624
record: rectangle record used to encode
@@ -644,7 +658,7 @@ function encodeExtension(result, enc, extrax4, extray, dividerx4, dividery, extr
644658
var factorx = 810000 * dividerx4; // 810000 = 30^4
645659
var factory = 810000 * dividery;
646660
var valx = (810000 * extrax4) + (enc.fraclon);
647-
var valy = (810000 * extray ) + (enc.fraclat * ydirection);
661+
var valy = (810000 * extray) + (enc.fraclat * ydirection);
648662

649663
// protect against floating point errors
650664
if (valx < 0) {
@@ -753,7 +767,7 @@ function wrap(p) {
753767
}
754768

755769
function convertFractionsToDegrees(p) {
756-
p.y /= ( 810000 * 1000000);
770+
p.y /= (810000 * 1000000);
757771
p.x /= (3240000 * 1000000);
758772
return p;
759773
}
@@ -831,7 +845,7 @@ function decodeExtension(extensionchars, coord32, dividerx4, dividery, lon_offse
831845
}
832846

833847
var lon4 = (coord32.x * 3240000.0) + (lon32 * dividerx4) + (lon_offset4 * 810000.0);
834-
var lat1 = (coord32.y * 810000.0) + (lat32 * dividery );
848+
var lat1 = (coord32.y * 810000.0) + (lat32 * dividery);
835849

836850
// determine the range of coordinates that are encode to this mapcode
837851
var mapcodeZone;
@@ -939,7 +953,7 @@ function decodeGrid(input, extensionchars, m) {
939953
var decodeMaxx = ((relx + xgridsize) < mm.maxx) ? (relx + xgridsize) : mm.maxx;
940954
var decodeMaxy = ((rely + ygridsize) < mm.maxy) ? (rely + ygridsize) : mm.maxy;
941955
return decodeExtension(extensionchars, corner, dividerx << 2, dividery,
942-
0, decodeMaxy, decodeMaxx); // grid
956+
0, decodeMaxy, decodeMaxx); // grid
943957
}
944958

945959
function encodeBase31(value, nrchars) {
@@ -959,15 +973,17 @@ function encodeTriple(difx, dify, dividerx, dividery) {
959973
cx = (difx % 28);
960974
cy = (dify % 34);
961975
if (getDebugInfo) {
962-
mcInfo.rectRegion = asDegreeRect((1000000 * mcInfo.rectSubarea.minx) + ((28 * rx * dividerx)), (1000000 * (mcInfo.rectSubarea.maxy)) - (((34 * ry) + 34) * dividery), 28 * dividerx, 34 * dividery);
976+
mcInfo.rectRegion = asDegreeRect((1000000 * mcInfo.rectSubarea.minx) + ((28 * rx * dividerx)),
977+
(1000000 * (mcInfo.rectSubarea.maxy)) - (((34 * ry) + 34) * dividery), 28 * dividerx, 34 * dividery);
963978
}
964979
return encodeChar[(rx + 6 * ry)] + encodeBase31(cx * 34 + cy, 2);
965980
}
966981
else {
967982
rx = Math.floor(difx / 24);
968983
cx = (difx % 24);
969984
if (getDebugInfo) {
970-
mcInfo.rectRegion = asDegreeRect((1000000 * mcInfo.rectSubarea.minx) + (24 * rx * dividerx), 1000000 * mcInfo.rectSubarea.miny, 24 * dividerx, 40 * dividery);
985+
mcInfo.rectRegion = asDegreeRect((1000000 * mcInfo.rectSubarea.minx) + (24 * rx * dividerx),
986+
1000000 * mcInfo.rectSubarea.miny, 24 * dividerx, 40 * dividery);
971987
}
972988
return encodeChar[rx + 24] + encodeBase31(cx * 40 + (dify - 136), 2);
973989
}
@@ -1055,7 +1071,8 @@ function encodeGrid(enc, m, mm, headerletter, extraDigits) {
10551071
}
10561072

10571073
if (getDebugInfo && prefixlength == 4 && divx == 961 && divy == 961) {
1058-
mcInfo.rectZone = asDegreeRect(mm.minx + 31 * xgridsize * Math.floor(relx / 31), mm.miny + 31 * ygridsize * Math.floor(rely / 31), xgridsize * 31, ygridsize * 31);
1074+
mcInfo.rectZone = asDegreeRect(mm.minx + 31 * xgridsize * Math.floor(relx / 31),
1075+
mm.miny + 31 * ygridsize * Math.floor(rely / 31), xgridsize * 31, ygridsize * 31);
10591076
}
10601077

10611078
rely = mm.miny + (rely * ygridsize);
@@ -1078,7 +1095,8 @@ function encodeGrid(enc, m, mm, headerletter, extraDigits) {
10781095

10791096
if (getDebugInfo) {
10801097
mcInfo.rectSubarea = asDegreeRect(relx, rely, dividerx * xside[postfixlength], dividery * yside[postfixlength]);
1081-
mcInfo.rectCell = asDegreeRect((relx + difx * dividerx), (rely + (yside[postfixlength] - 1 - dify) * dividery), dividerx, dividery);
1098+
mcInfo.rectCell = asDegreeRect((relx + difx * dividerx), (rely + (yside[postfixlength] - 1 - dify) * dividery),
1099+
dividerx, dividery);
10821100
mcInfo.form += (postfixlength == 2 ? 'pp' : (postfixlength == 3 ? 'ppp' : 'pppp'));
10831101
mcInfo.postfixType = postfixlength;
10841102
}
@@ -1091,7 +1109,8 @@ function encodeGrid(enc, m, mm, headerletter, extraDigits) {
10911109
if (postfixlength == 4) {
10921110
postfix = postfix.charAt(0) + postfix.charAt(2) + postfix.charAt(1) + postfix.charAt(3);
10931111
if (getDebugInfo) {
1094-
mcInfo.rectRegion = asDegreeRect(relx + (31 * Math.floor(difx / 31) * dividerx), rely + (31 * Math.floor((yside[postfixlength] - 1 - dify) / 31) * dividery), 31 * dividerx, 31 * dividery);
1112+
mcInfo.rectRegion = asDegreeRect(relx + (31 * Math.floor(difx / 31) * dividerx),
1113+
rely + (31 * Math.floor((yside[postfixlength] - 1 - dify) / 31) * dividery), 31 * dividerx, 31 * dividery);
10951114
}
10961115
}
10971116
result += postfix;
@@ -1329,29 +1348,37 @@ function headerLetter(i) {
13291348
}
13301349
return '';
13311350
}
1351+
13321352
function smartdiv(i) {
13331353
return data_special1[i];
13341354
}
1355+
13351356
function isRestricted(i) {
13361357
return data_flags[i] & 512;
13371358
}
1359+
13381360
function isNameless(i) {
13391361
return data_flags[i] & 64;
13401362
}
1363+
13411364
function isAutoHeader(i) {
13421365
return data_flags[i] & (8 << 5);
13431366
}
1367+
13441368
function codexLen(i) {
13451369
var flags = data_flags[i] & 31;
13461370
return Math.floor(flags / 5) + (flags % 5) + 1;
13471371
}
1372+
13481373
function coDex(i) {
13491374
var flags = data_flags[i] & 31;
13501375
return 10 * Math.floor(flags / 5) + (flags % 5) + 1;
13511376
}
1377+
13521378
function isSpecialShape(i) {
13531379
return data_flags[i] & 1024;
13541380
}
1381+
13551382
function recType(i) {
13561383
return ((data_flags[i] >> 7) & 3); // 1=pipe 2=plus 3=star
13571384
}
@@ -1397,7 +1424,7 @@ function encodeNameless(enc, m, firstcode, extraDigits) {
13971424
storage_offset = X * (961 * 961);
13981425
}
13991426
else {
1400-
storage_offset = (62 - A + Math.floor((X - 62 + A) / 2) ) * (961 * 961);
1427+
storage_offset = (62 - A + Math.floor((X - 62 + A) / 2)) * (961 * 961);
14011428
if (((X + A) % 2) == 1) {
14021429
storage_offset += (16 * 961 * 31);
14031430
}
@@ -1467,7 +1494,8 @@ function encodeNameless(enc, m, firstcode, extraDigits) {
14671494
mcInfo.headerletter = encodeChar[storage_offset / (961 * 961)];
14681495
mcInfo.postfixType = 2;
14691496
mcInfo.regular = true;
1470-
mcInfo.rectRegion = asDegreeRect((mm.minx + (31 * Math.floor(dx / 31) * dividerx4 / 4)), mm.maxy - (31 * dividery) * (1 + Math.floor(dy / 31)), 31 * dividerx4 / 4, 31 * dividery);
1497+
mcInfo.rectRegion = asDegreeRect((mm.minx + (31 * Math.floor(dx / 31) * dividerx4 / 4)),
1498+
mm.maxy - (31 * dividery) * (1 + Math.floor(dy / 31)), 31 * dividerx4 / 4, 31 * dividery);
14711499
}
14721500
result = result.charAt(0) + result.charAt(1) + result.charAt(3) + '.' + result.charAt(2) + result.charAt(4);
14731501
} else if (codex == 13) {
@@ -1542,7 +1570,7 @@ function decodeNameless(input, extensionchars, m, firstindex) {
15421570
v = decodeBase31(input);
15431571

15441572
if (X > 0) {
1545-
v -= ( (X * p + (X < r ? X : r)) * (961 * 961) );
1573+
v -= ((X * p + (X < r ? X : r)) * (961 * 961));
15461574
}
15471575
}
15481576
else if (codex != 21 && A < 62) {
@@ -1593,7 +1621,7 @@ function decodeNameless(input, extensionchars, m, firstindex) {
15931621
x: mm.minx + Math.floor((dx * dividerx4) / 4)
15941622
};
15951623
return decodeExtension(extensionchars, corner, dividerx4, -dividery,
1596-
((dx * dividerx4) % 4), mm.miny, mm.maxx); // nameless
1624+
((dx * dividerx4) % 4), mm.miny, mm.maxx); // nameless
15971625
}
15981626

15991627
function encodeAutoHeader(enc, m, extraDigits) {
@@ -1612,7 +1640,7 @@ function encodeAutoHeader(enc, m, extraDigits) {
16121640
var mm = minmaxSetup(i);
16131641
var H = Math.floor((mm.maxy - mm.miny + 89) / 90);
16141642
var xdiv = xDivider4(mm.miny, mm.maxy);
1615-
var W = Math.floor(( (mm.maxx - mm.minx) * 4 + (xdiv - 1) ) / xdiv);
1643+
var W = Math.floor(((mm.maxx - mm.minx) * 4 + (xdiv - 1)) / xdiv);
16161644

16171645
H = 176 * Math.floor((H + 176 - 1) / 176);
16181646
W = 168 * Math.floor((W + 168 - 1) / 168);
@@ -1653,11 +1681,14 @@ function encodeAutoHeader(enc, m, extraDigits) {
16531681
mcInfo.dotPosition = codexlen - 2;
16541682
mcInfo.prefixDivx = Math.floor(W / 168);
16551683
mcInfo.prefixDivy = Math.floor(H / 176);
1656-
mcInfo.rectSubarea = asDegreeRect(mm.minx + (vx * 168 ) * dividerx, mm.maxy - ((vy + 1) * 176 ) * dividery, 168 * dividerx, 176 * dividery);
1657-
mcInfo.rectCell = asDegreeRect(mm.minx + (vx * 168 + spx) * dividerx, mm.maxy - ((vy ) * 176 + spy + 1) * dividery, dividerx, dividery);
1684+
mcInfo.rectSubarea = asDegreeRect(mm.minx + (vx * 168) * dividerx, mm.maxy - ((vy + 1) * 176) * dividery,
1685+
168 * dividerx, 176 * dividery);
1686+
mcInfo.rectCell = asDegreeRect(mm.minx + (vx * 168 + spx) * dividerx, mm.maxy - ((vy) * 176 + spy + 1) * dividery,
1687+
dividerx, dividery);
16581688
}
16591689

1660-
var mapc = encodeBase31(Math.floor(STORAGE_START / (961 * 31)) + value, codexlen - 2) + '.' + encodeTriple(spx, spy, dividerx, dividery);
1690+
var mapc = encodeBase31(Math.floor(STORAGE_START / (961 * 31)) + value, codexlen - 2) + '.' +
1691+
encodeTriple(spx, spy, dividerx, dividery);
16611692

16621693
return encodeExtension(mapc, enc, extrax << 2, extray, dividerx << 2, dividery, extraDigits, -1);
16631694
}
@@ -1680,7 +1711,7 @@ function decodeAutoHeader(input, extensionchars, m) {
16801711

16811712
var H = Math.floor((mm.maxy - mm.miny + 89) / 90);
16821713
var xdiv = xDivider4(mm.miny, mm.maxy);
1683-
var W = Math.floor(( (mm.maxx - mm.minx) * 4 + (xdiv - 1) ) / xdiv);
1714+
var W = Math.floor(((mm.maxx - mm.minx) * 4 + (xdiv - 1)) / xdiv);
16841715

16851716
H = 176 * Math.floor((H + 176 - 1) / 176);
16861717
W = 168 * Math.floor((W + 168 - 1) / 168);
@@ -1712,7 +1743,7 @@ function decodeAutoHeader(input, extensionchars, m) {
17121743
}
17131744

17141745
return decodeExtension(extensionchars, corner, dividerx << 2, -dividery,
1715-
0, mm.miny, mm.maxx); // autoheader
1746+
0, mm.miny, mm.maxx); // autoheader
17161747
}
17171748
STORAGE_START += product;
17181749
}
@@ -2087,7 +2118,8 @@ function master_decode(mapcode, territoryNumber) // returns object with y and x
20872118
zone = decodeGrid(mapcode.substr(1), extensionchars, m);
20882119
break;
20892120
}
2090-
else if (isNameless(m) && ((codex == 21 && incodex == 22 ) || (codex == 22 && incodex == 32) || (codex == 13 && incodex == 23))) {
2121+
else if (isNameless(m) && ((codex == 21 && incodex == 22) || (codex == 22 && incodex == 32) ||
2122+
(codex == 13 && incodex == 23))) {
20912123
zone = decodeNameless(mapcode, extensionchars, m, from);
20922124
break;
20932125
}
@@ -2110,15 +2142,19 @@ function master_decode(mapcode, territoryNumber) // returns object with y and x
21102142
function hasStates(territoryNumber) {
21112143
return hasSubdivision(territoryNumber);
21122144
}
2145+
21132146
function isState(territoryNumber) {
21142147
return isSubdivision(territoryNumber);
21152148
}
2149+
21162150
function StateParent(territoryNumber) {
21172151
return getParentOf(territoryNumber);
21182152
}
2153+
21192154
function ccode2iso(territoryNumber, format) {
21202155
return getTerritoryAlphaCode(territoryNumber, format);
21212156
}
2157+
21222158
function fullname(territoryNumber, keepindex) {
21232159
if (keepindex) {
21242160
return isofullname[territoryNumber];

0 commit comments

Comments
 (0)