<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="Map Surfer" 
                description="Open various Map Sites with current location."
                author="Naoki Ueda"
                author_email="nao.locapoint@gmail.com"
		screenshot="http://www.locapoint.com/publicutil/mapplets/sc.png"
		thumbnail="http://www.locapoint.com/publicutil/mapplets/th.png"
                height="50">
  <Require feature="sharedmap"/>
  <Require feature="setprefs" />
</ModulePrefs>
  <UserPref
    name="mapid"
    default_value="googlemaps"
    datatype="hidden"/>
<Content type="html"><![CDATA[
<!-- MapSurfer version 1.0.  All right reserved by Locazing Inc. -->
<table border="0" width="100%" cellspacing="1">
	<tr>
		<td width="100%" colspan="3">
			Current Location:<br />
			LocaPoint: <b><span id="displocapo" title="LocaPoint">AA0.AA0.AA0.AA0</span></b>
			<br />
			(Lat, Lon: <b><span id="displatlng" title="Latitude, Longitude">0.000000, 0.000000</span></b>)
		</td>
	</tr>
	<tr>
		<td width="4%">
		 </td>
			<td width="95%" colspan="2">
			<select size="1" name="map_id" id="map_id" onclick="mapidOnClick()">
				<option value="yahoomap">Yahoo! Map(USA)</option>
				<option value="msnlive">Windows Live Local!(World wide)</option>
				<option value="mapquest">Map Quest(USA)</option>
				<option value="msnmap">MSN Map and Directions(USA)</option>
				<option value="mapion">Mapion(Japan)</option>
				<option value="mapionbb">Mapion BB(Japan)</option>
				<option value="alpslab">ALPS Lab(Japan)</option>
				<option value="navitime">Navitime(Japan)</option>
				<option value="mapfan">MapFan(Japan)</option>
				<option value="yahoomapjapan">Yahoo! Japan Map(Japan)</option>
				<option value="itsmoguide">It's-mo Guide(Japan)</option>
				<option value="goomap">Goo Map(Japan)</option>
				<option value="livedoormap">Livedoor Map(Japan)</option>
				<option value="chizumaru">Chizumaru(Japan)</option>
				<option value="msnmapjapan">MSN Japan Map(Japan)</option>
				<option value="googlemaps">Google Maps(World wide)</option>
				<option value="googlemapsjapan">Google Maps Japan(World wide)</option>
				<option value="googlemapsuk">Google Maps UK(World wide)</option>
				<option>---Links-----------</option>
				<option value="geohack">Geo Hack (More and More Maps!)</option>
				<option>---Applications----</option>
				<option value="googleearth">Google Earth(if installed)</option>
				<option value="nasaworldwind">NASA Worls Wind (if installed)</option>
				<option value="navito">NavitoGateway (if installed)</option>
				<option value="navitoop">NavitoGateway Option(if installed)</option>
			</select><input type="button" value="Surf!" name="go" onclick="surf()">
			</td>
		</tr>
	<tr>
		<td width="4%">
		 </td>
		<td width="55%">
		<font size="1">Want more? Try 
		<a href="javascript:void(window.open('http://www.locapoint.com/tool/navitogw/'))" title="Download NavitoGateway now!">
		NavitoGateway</a>.</font></td>
		<td width="40%" align="left">
		<p align="right"><font size="1">Powered by&nbsp; <a href="javascript:void(window.open('http://www.locapoint.com'))" title="LocaPoint(TM) Home">LocaPoint</a></font></td>
	</tr>
	<tr>
		<td width="100%" align="left" colspan="3">
		 </td>
	</tr>
</table>
<script>
	// Get user preferences
	var prefs = new _IG_Prefs(__MODULE_ID__);
	document.getElementById("map_id").value = prefs.getString("mapid");

	// Center the map in the Mediterranean and zoom out to a world view
	var map = new GMap2();
	map.getCenterAsync(function(center) {
		disp(center);
	});
	GEvent.addListener(map, "moveend", function() {
		map.getCenterAsync(function(center) {
			disp(center);
		});
	});
	function disp(center){
		var lp= LatLon2LocaPoint(center.lat(), center.lng());
		var ll= "" + center.lat().toFixed(6) + ", " + center.lng().toFixed(6);
		var llspan = document.getElementById("displatlng");
		llspan.innerHTML = ll;
		var lpspan = document.getElementById("displocapo");
		lpspan.innerHTML = lp;
	}
	function surf(){
		OpenMapURL(document.getElementById("displocapo").innerHTML,
				document.getElementById("map_id").value);
	}
	function mapidOnClick(){
		prefs.set("mapid", document.getElementById("map_id").value);
	}


	// To Select Map vendor, set "?mapsite=******" as above
	//	--PARAMETER--		--MAP SITE Name--	--Region--
	//	"googlemaps"		Google Maps (default)	World wide
	//	"googlemapsjapan"	Google Maps Japan	World wide
	//	"googlemapsuk"		Google Maps UK		World wide	
	//	"mapquest"		Map Quest		USA only
	//	"yahoomap"		Yahoo! Map		USA onlu
	//	"msnmap"		MSN Map and Directions	USA only
	//	"mapion"		Mapion			Japan only
	//	"mapionbb"		Mapion 			Japan only
	//	"navitime"		Navitime		Japan only
	//	"mapfan"		MapFan			Japan only
	//	"yahoomapjapan"		Yahoo! Japan Map	Japan only
	//	"itsmoguide"		It's-mo Guide (zenrin)	Japan only
	//	"goomap"		Goo Map			Japan only
	//	"livedoormap"		Livedoor Map		Japan only
	//	"chizumaru"		Chizumaru		Japan only
	//	"msnmapjapan"		MSN Japan Map		Japan only
	//	"googleearth"		Google Earth		World Wide
	//	"geohacks"
	//	"navito:"
	///////////////////////////////////////////////////////////////////////////

	function OpenMapURL(locapoint, mapsite){
		var geoloc = Locapoint2LatLon(locapoint);
		var urlstr = "http://";
		switch (mapsite) {
			case	"mapion":	//OK
				// http://www.mapion.co.jp/c/f?uc=1&grp=all&nl=34/37/43.719&el=135/37/08.946&scl=25000&bid=Mlink
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "www.mapion.co.jp/c/f?uc=1&grp=all&";
				urlstr += "nl=" + numformat(geoloc.int_latd, 2, 0) + "/" + numformat(geoloc.int_latm, 2, 0) + "/" +  numformat(geoloc.float_lats, 2, 3);
				urlstr += "&el=" + numformat(geoloc.int_lond, 3, 0) + "/" + numformat(geoloc.int_lonm, 2, 0) + "/" + numformat(geoloc.float_lons, 2, 3);
				urlstr += "&scl=25000&bid=Mlink"
				break;

			case	"mapionbb":	//OK
				// http://www.mapion.co.jp/c/f?uc=1&grp=MapionBB&nl=34/39/50.827&el=135/35/12.000&scl=25000&bid=Mlink
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "www.mapion.co.jp/c/f?uc=1&grp=MapionBB&";
				urlstr += "nl=" + numformat(geoloc.int_latd, 2, 0) + "/" + numformat(geoloc.int_latm, 2, 0) + "/" +  numformat(geoloc.float_lats, 2, 3);
				urlstr += "&el=" + numformat(geoloc.int_lond, 3, 0) + "/" + numformat(geoloc.int_lonm, 2, 0) + "/" + numformat(geoloc.float_lons, 2, 3);
				urlstr += "&scl=25000&bid=Mlink"
				break;

			case	"navitime":	//OK
				// http://www.navitime.co.jp/map/index.jsp?datum=1&unit=0&lat=+34.42.8.545&lon=+135.31.17.604
				// http://www.navitime.co.jp/map/index.jsp?datum=1&unit=0&lat=+34.37.31.765&lon=+135.36.14.499
				//geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "www.navitime.co.jp/map/index.jsp?datum=0&unit=0&";
				urlstr += "lat=" + (geoloc.int_latd>=0?"+":"-") + Math.abs(geoloc.int_latd) + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&lon=" + (geoloc.int_lond>=0?"+":"-") + Math.abs(geoloc.int_lond) + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 3);
				break;
			case	"mapfan":	//OK
				//http://kokomail.mapfan.com/receivew.cgi?MAP=E135.43.13.6N34.32.3.2&ZM=11&CI=R
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "kokomail.mapfan.com/receivew.cgi?MAP=";
				urlstr += (geoloc.int_lond >=0 ?"E":"W") + geoloc.int_lond + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 1);
				urlstr += (geoloc.int_latd >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 1);
				urlstr += "&ZM=11&CI=R";
				break;
			case	"yahoomapjapan":	//OK
				//http://map.yahoo.co.jp/pl?nl=34.32.4.798&el=135.43.12.453&CE.x=282&CE.y=300&sc=2&la=1
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "map.yahoo.co.jp/pl?";
				urlstr += "nl=" + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&el=" + geoloc.int_lond + "." + geoloc.int_lonm + "." + numformat(geoloc.float_lons, 0, 3);
				urlstr += "&CE.x=282&CE.y=300&sc=2";
				break;
			case	"yahoomapjapansc":	//OK
				//http://map.yahoo.co.jp/pl?type=scroll&lat=35/39/17.499&lon=139/44/53.479&layer=0&sc=2&ac=13103&mode=map&size=s&pointer=on
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "map.yahoo.co.jp/pl?type=scroll&";
				urlstr += "lat=" + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&lon=" + geoloc.int_lond + "." + geoloc.int_lonm + "." + numformat(geoloc.float_lons, 0, 3);
				urlstr += "&layer=0&sc=2&ac=13103&mode=map&size=s&pointer=on";
				break;
			case	"yahoomap":	//Under R&D
				//http://maps.yahoo.com/beta/index.php#mvt=m&maxp=search&trf=0&lon=-105.058308&lat=39.849074&mag=5
				urlstr += "maps.yahoo.com/beta/index.php#mvt=m&maxp=search&trf=0";
				urlstr += "&lon=" + geoloc.longitude ;
				urlstr += "&lat=" + geoloc.latitude ;
				urlstr += "&mag=5";
				break;
			case	"itsmoguide":	//OK
				//http://www.its-mo.com/z.htm?m=E135.29.55.355N34.41.57.286&l=10
				//http://mobile.its-mo.com/MapToLink/p1?c=6&sid=00320&n=34.534269444444&e=135.72043611111&x=5  <--- From Mobile ONLY
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "www.its-mo.com/z.htm?m=";
				urlstr += (geoloc.int_lond >=0 ?"E":"W") + geoloc.int_lond + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 3);
				urlstr += (geoloc.int_latd >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&ZM=11&CI=R";
				break;
			case	"goomap":	//OK
				//http://map.goo.ne.jp/map.php?MAP=E135.43.23.560N34.31.55.780&ZM=&SZ=&sw=1&C1=29&C2=210&POSTAL= 
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "map.goo.ne.jp/map.php?MAP=";
				urlstr += (geoloc.int_lond >=0 ?"E":"W") + geoloc.int_lond + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 3);
				urlstr += (geoloc.int_latd >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&ZM=11&CI=R";
				break;
			case	"livedoormap":	//OK
				//http://map.livedoor.com/map/?SZ=500,320&ZM=10&MAP=E135.43.13.7N34.32.3.1
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "map.livedoor.com/map/?SZ=500,320&ZM=10&MAP=";
				urlstr += (geoloc.int_lond >=0 ?"E":"W") + geoloc.int_lond + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 1);
				urlstr += (geoloc.int_latd >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 1);
				urlstr += "&ZM=11&CI=R";
				break;
			case	"chizumaru":	//OK
			    	//http://www.chizumaru.com/maplink.asp?SER=all&D=all&X=…&Y=…&SCL=…
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "www.chizumaru.com/maplink.asp?SER=all&D=all";
				urlstr += "&" + (geoloc.int_lond >=0 ?"E":"W") + "=" + geoloc.int_lond + "." + geoloc.int_lonm + "." +  numformat(geoloc.float_lons, 0, 3);
				urlstr += "&" + (geoloc.int_latd >=0 ?"N":"S") + "=" + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 3);
				urlstr += "&SCL=500";
				break;
			case	"msnmapjapan":	//OK     ???looks like lat and lon is opposite ??
				//http://map.msn.co.jp/mapmarking.armx?mode=1&la=139.44.55.9&lg=35.39.19.2&zm=10&smode=1
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "map.msn.co.jp/mapmarking.armx?mode=1";
				urlstr += "&la=" + geoloc.int_lond + "." + geoloc.int_lonm + "." + numformat(geoloc.float_lons, 0, 1);
				urlstr += "&lg=" + geoloc.int_latd + "." + geoloc.int_latm + "." +  numformat(geoloc.float_lats, 0, 1);
				urlstr += "&zm=9&smode=1";
				break;
			case	"msnmap":	//OK
				//http://maps.msn.com/map.aspx?C=40.689204730670525,-74.04465637740694&L=USA&A=6
				urlstr += "maps.msn.com/map.aspx?C=";
				urlstr += geoloc.latitude + "," + geoloc.longitude;
				urlstr += "&L=USA&A=6"
				break;
			case	"mapquest":	//OK
				//http://www.mapquest.com/maps/map.adp?searchtype=address&formtype=latlong&latlongtype=decimal&latitude=45.3569&longitude=-90.5484
				urlstr += "www.mapquest.com/maps/map.adp?searchtype=address&formtype=latlong&latlongtype=decimal";
				urlstr += "&latitude=" + geoloc.latitude ;
				urlstr += "&longitude=" + geoloc.longitude ;
				break;
			case	"geohack":
				//http://tools.wikimedia.de/~magnus/geo/geohack.php?params=52.41527_N_1.91615_W
				geoloc = locVariation(geoloc);
				urlstr += "tools.wikimedia.de/~magnus/geo/geohack.php?params=";
				urlstr += geoloc.latitude + "_" + (geoloc.int_latd >=0 ?"N":"S");
				urlstr += "_" + geoloc.longitude + "_" + (geoloc.int_lond >=0 ?"E":"W");
				break;
			case	"googlemapsjapan":	//OK
				// http://maps.google.co.jp/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
				urlstr += "maps.google.co.jp/?q=" + geoloc.latitude + "," + geoloc.longitude ;
				break;
			case	"googlemapsuk":	//OK
				// http://maps.google.co.uk/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
				urlstr += "maps.google.co.uk/?q=" + geoloc.latitude + "," + geoloc.longitude ;
				break;			case	"googlemaps":	//OK
			case	"googleearth":	//OK
				// http://maps.google.com/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
				urlstr += "maps.google.com/?q=" + geoloc.latitude + "," + geoloc.longitude + "&output=kml";
				break;
			case	"msnlive":
				//http://local.live.com/default.aspx?v=2&cp=$lat.d(+3.6)~$lon.d(+3.6)&style=r&lvl=12
				urlstr += "local.live.com/default.aspx?v=2&cp=";
				urlstr += geoloc.latitude + "~" + geoloc.longitude + "&style=r&lvl=12";
				break;
			case	"alpslab":	//OK
				//http://base.alpslab.jp/?s=25000;p=$lat.d(.0)/$lat.m(.0)/$lat.s(.3),$lon.d(.0)/$lon.m(.0)/$lon.s(.3)
				geoloc = WGS84toTOKYO(geoloc);
				geoloc = locVariation(geoloc);
				urlstr += "base.alpslab.jp/?s=25000;p=";
				urlstr += (geoloc.int_latd >=0 ?"":"-") + numformat(geoloc.int_latd, 2, 0) + "/" + numformat(geoloc.int_latm, 2, 0) + "/" +  numformat(geoloc.float_lats, 2, 3);
				urlstr += "," + (geoloc.int_lond >=0 ?"":"-") + numformat(geoloc.int_lond, 3, 0) + "/" + numformat(geoloc.int_lonm, 2, 0) + "/" + numformat(geoloc.float_lons, 2, 3);
				break;
			case	"navito":
				location.href= "navito:" + locapoint;
				return;
				break;
			case	"navitoop":
				location.href= "navito:option" + locapoint;
				return;
				break;
			case	"nasaworldwind":
				//worldwind://goto/world=Earth&lat=$lat.d(-.5)&lon=$lon.d(-.5)&alt=5799&dir=71&tilt=67
				urlstr = "worldwind://goto/world=Earth&lat=" + geoloc.latitude + "&" + geoloc.longitude;
				urlstr += "&alt=5799&dir=71&tilt=67";
				location.href=urlstr;
				return;
				break;
			case	"googlemaps":	//OK
				//default is googleMaps
				// http://maps.google.com/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
				urlstr += "maps.google.com/?q=" + geoloc.latitude + "," + geoloc.longitude ;
				break;
			default:
				return;
		}
		window.open(urlstr);
	}
	function WGS84toTOKYO(geoloc){
		var geolocTokyo = new Object();
		geolocTokyo.latitude = geoloc.latitude -0 + 0.00010696 * geoloc.latitude - 0.000017467 * geoloc.longitude - 0.004602;
	    	geolocTokyo.longitude = geoloc.longitude -0 + 0.000046047 * geoloc.latitude -0 + 0.000083049 * geoloc.longitude - 0.010041;
		return(geolocTokyo);
	}
	function numformat(floatnum, zerofilldigit, underdecidigit){
		var intpart, underdecipart, retstr;

		if (floatnum == ""){floatnum = "0";} //prevent error
		floatnum = floatnum + ""; //to string
		var decipos = floatnum.indexOf(".");
		if (decipos > 0) {
			var part = floatnum.split(".");
			intpart = part[0];
			underdecipart = part[1];
		}else{
			intpart = floatnum;
			underdecipart = "";
		}

		//left zerofill
		if(zerofilldigit > 0){
			intpart = "" + intpart; //string
			if(zerofilldigit == ""){zerofilldigit = 0;};
			for(var n=0; n < zerofilldigit; n++){
				intpart = "0" + intpart;
			}
			intpart = intpart.substr(intpart.length - zerofilldigit, zerofilldigit);
		}
		retstr = intpart;

		//under decimal digit
		if(underdecidigit > 0){
			for(var n=0; n < underdecidigit; n++){
				underdecipart += "0";
			}
			underdecipart = underdecipart.substr(0, underdecidigit);
			retstr += "." + underdecipart;
		}
		
		return(retstr);
	}

	function locVariation(geoloc){
		
		var lat = geoloc.latitude;
		var latabs = Math.abs(lat);
		var int_latd = Math.floor(latabs);
		var float_latm = (latabs - int_latd) * 60;
		var int_latm = Math.floor(float_latm);
		var float_lats = (float_latm - int_latm) * 60;
		if(lat < 0){
			int_latd = int_latd * (-1);
		}

		var lon = geoloc.longitude;
		var lonabs = Math.abs(lon);
		var int_lond = Math.floor(lonabs);
		var float_lonm = (lonabs - int_lond) * 60;
		var int_lonm = Math.floor(float_lonm);
		var float_lons = (float_lonm - int_lonm) * 60;
		if(lon < 0){
			int_lond = int_lond * (-1);
		}

		geoloc.latabs = latabs;
		geoloc.int_latd = int_latd;
		geoloc.float_latm = float_latm;
		geoloc.int_latm = int_latm;
		geoloc.float_lats = float_lats;
		geoloc.lonabs = lonabs;
		geoloc.int_lond = int_lond;
		geoloc.float_lonm = float_lonm;
		geoloc.int_lonm = int_lonm;
		geoloc.float_lons = float_lons;
		return(geoloc); 
	}

	//common functions
	function Locapoint2LatLon(locapoint){
		var geoloc = new Object();
		geoloc.latitude =(
			((locapoint.charCodeAt(0)-65)*1757600
			+(locapoint.charCodeAt(1)-65)*67600
			+(locapoint.charCodeAt(2)-48)*6760
			+(locapoint.charCodeAt(8)-65)*260
			+(locapoint.charCodeAt(9)-65)*10
			+(locapoint.charCodeAt(10)-48))
			*180/45697600-90).toFixed(6);
		geoloc.longitude = (
			((locapoint.charCodeAt(4)-65)*1757600
			+(locapoint.charCodeAt(5)-65)*67600
			+(locapoint.charCodeAt(6)-48)*6760
			+(locapoint.charCodeAt(12)-65)*260
			+(locapoint.charCodeAt(13)-65)*10
			+(locapoint.charCodeAt(14)-48) )
			*360/45697600-180).toFixed(6);
		return(geoloc);
	}
	function LatLon2LocaPoint(lat, lon){
		var latstep=Math.floor(((lat-(-90))*45697600/180));
		var lngstep=Math.floor(((lon-(-180))*45697600/360));
		var locapoint=String.fromCharCode(
			Math.floor(latstep/1757600%26)+65,
			Math.floor(latstep/67600%26)+65,
			Math.floor(latstep/6760%10)+48,
			46,
			Math.floor(lngstep/1757600%26)+65,
			Math.floor(lngstep/67600%26)+65,
			Math.floor(lngstep/6760%10)+48,
			46,
			Math.floor(latstep/260%26)+65,
			Math.floor(latstep/10%26)+65,
			Math.floor(latstep%10)+48,
			46,
			Math.floor(lngstep/260%26)+65,
			Math.floor(lngstep/10%26)+65,
			Math.floor(lngstep%10)+48
		); 
		return(locapoint);
	}



</script>


]]></Content>
</Module>