var alphabet='ABCDEFGHJKLMNPQRTU@WXY0123456789';function calculate_soc(lat,lon){lat+=90.0;lon+=180.0;lat*=10000.0;lon*=10000.0;lat=Math.floor(lat);lon=Math.floor(lon);var p=lat*3600000.0+ lon;var soc_num=p*32.0;var c=0;for(i=1;i<10;++i){c+=(p%32)*i;p=Math.floor(p/32);}
c%=29;soc_num+=c;soc_num=Math.floor(soc_num);var soc="";for(i=0;i<10;++i){d=soc_num%32;if((i==4)||(i==7)){soc=" "+ soc;}
soc=alphabet.charAt(d)+ soc;soc_num=Math.floor(soc_num/32);}
return soc;}
function showSOC(e){var soc=e.value;if(soc.match(/[ABCDEFGHJKLMNPQRTU@WXY0123456789 ]{10,12}/)){var soc_num=0.0;var checksum=0.0;var offset=9.0;for(i=0;i<soc.length;++i){if(soc.charAt(i)==' '){continue;}
soc_num*=32.0;var character=soc.charAt(i);var pos=alphabet.search(character);checksum+=offset*pos;--offset;soc_num+=pos;}
checksum%=29;var check=soc_num%32;if(check!=checksum){alert("Bad SOC (bad checksum "+ check+" "+ checksum+")");return;}
soc_num/=32.0;var lon=Math.floor(soc_num%3600000.0);var lat=Math.floor(soc_num/3600000.0);lon/=10000.0;lat/=10000.0;lat-=90.0;lon-=180.0;var point=new GLatLng(lat,lon);map.setCenter(point,13);var marker=new GMarker(point);map.addOverlay(marker);marker.openInfoWindowHtml(lat+" "+ lon);}else{alert("Bad SOC");}}
var geocoder=new GClientGeocoder();function showAddress(e){var address=e.value;geocoder.getLatLng(address,function(point){if(!point){alert(address+" not found");}else{map.setCenter(point,13);var marker=new GMarker(point);map.addOverlay(marker);marker.openInfoWindowHtml("SOC: "+ calculate_soc(point.lat(),point.lng()));}});}
function isenter(myfield,e)
{var keycode;if(window.event)keycode=window.event.keyCode;else if(e)keycode=e.which;else return;if(keycode==13)
{if(myfield.name=='soc'){showSOC(myfield);}else{showAddress(myfield);}}}
var map=new GMap2(document.getElementById("map"));map.setCenter(new GLatLng(37.4419,-122.1419),13);
