// tag for Google Maps with correct geoloc.
///// If LocaPoint is already in tag, it will NOT be converted.
///// If tag has LocaPoint in "href", this will be converted, too.
/////
///// Copyright 2005-2006 Locazing Inc.
///// Commercial use of this file need permission from Locazing Inc.
///// Non-profit purpose usage is free, and no need to contact to Locazing Inc.
/////
/////
///// V2.0 Option for various map site vender Options are following.
///// V2.1 Enable/Disable Switch
///// Avoid Global variable contamination.
///// V2.2 Convert LocaPoint in href attribute odf A tag, into Map URL.
///// V2.3 JavaScript Tuning for high performance.
//
// 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
// "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
///////////////////////////////////////////////////////////////////////////
/////Configuration Constant
//if you download this file and use locally, modify following lines.
var LPLinkifyObj = new Object();
LPLinkifyObj.AutoLinkify = true;
LPLinkifyObj.LinkifyMapSite = "";
//Add Event to onload (not overwrite)
if (LPLinkifyObj.AutoLinkify) {
//Attach LinkifyLocaPoint to Window.Onload
if (window.addEventListener) {// W3C DOM
window.addEventListener("load", LinkifyLocaPoint, false);
}else if (window.attachEvent) {// Internet Explorer
window.attachEvent("onload", LinkifyLocaPoint);
}
}
function LinkifyLocaPoint(){
if(window.LPTB){ //If LocaPoint toolbar is installed, toolbar has priority
return;
}
//Functions for each mapsite. put here for performance
var Deg2mapURLfuncs = new Object;
var isGoogle = false;
switch (LPLinkifyObj.LinkifyMapSite) {
case "mapion": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
// 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"
return(urlstr);
};
break;
case "navitime": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
// 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=1&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);
return(urlstr);
};
break;
case "mapfan": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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_lond >=0 ?"N":"S")) + geoloc.int_latd + "." + geoloc.int_latm + "." + numformat(geoloc.float_lats, 0, 1);
urlstr += "&ZM=11&CI=R";
return(urlstr);
};
break;
case "yahoomapjapan": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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";
return(urlstr);
};
break;
case "yahoomap": //Under R&D
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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=" + longitude ;
urlstr += "&lat=" + latitude ;
return(urlstr);
};
break;
case "itsmoguide": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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_lond >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." + numformat(geoloc.float_lats, 0, 3);
urlstr += "&ZM=11&CI=R";
return(urlstr);
};
break;
case "goomap": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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_lond >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." + numformat(geoloc.float_lats, 0, 3);
urlstr += "&ZM=11&CI=R";
return(urlstr);
};
break;
case "livedoormap": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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_lond >=0 ?"N":"S") + geoloc.int_latd + "." + geoloc.int_latm + "." + numformat(geoloc.float_lats, 0, 1);
urlstr += "&ZM=11&CI=R";
return(urlstr);
};
break;
case "chizumaru": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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_lond >=0 ?"N":"S") + "=" + geoloc.int_latd + "." + geoloc.int_latm + "." + numformat(geoloc.float_lats, 0, 3);
urlstr += "&SCL=500";
return(urlstr);
};
break;
case "msnmapjapan": //OK ???looks like lat and lon is opposite ??
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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";
return(urlstr);
};
break;
case "msnmap": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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"
return(urlstr);
};
break;
case "mapquest": //OK
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
//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 ;
return(urlstr);
};
break;
case "googlemapsjapan": //OK
isGoogle = true;
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
// http://maps.google.co.jp/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
urlstr += "maps.google.co.jp/?q=" + geoloc.latitude + "," + geoloc.longitude + "(" + comment + ")";
return(urlstr);
};
break;
case "googlemapsuk": //OK
isGoogle = true;
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
// http://maps.google.co.uk/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
urlstr += "maps.google.co.uk/?q=" + geoloc.latitude + "," + geoloc.longitude + "(" + comment + ")";
return(urlstr);
};
break; case "googlemaps": //OK
//break; same as default
default:
//default is googleMaps
isGoogle = true;
Deg2mapURLfuncs.funcs = function(geoloc, comment){
var urlstr = "http://";
// http://maps.google.com/?q=+35.123456,+135.123456(SA2.WU4.ZZ9.ZZ9)
urlstr += "maps.google.com/?q=" + geoloc.latitude + "," + geoloc.longitude + "(" + comment + ")";
return(urlstr);
};
}
//Linkify Main Logic
var d = document;
d.body.normalize();
F(d.body);
//remove onload event for performance
if (window.removeEventListener) {
window.removeEventListener("load", LinkifyLocaPoint, false);
}
else if (window.detachEvent) {
window.detachEvent("onload", LinkifyLocaPoint);
}
//end of logic
function F(n){
var u,A,M,R,c,x,geoloc, replaceflag, nodetype=n.nodeType, tagname=n.tagName;
if(nodetype==3){
u=n.data.search(/([A-Z]{2}\d\.){3}[A-Z]{2}\d/);
if(u>=0) {
M=n.splitText(u);
geoloc = Locapoint2LatLon(M.data);
if(M.data.length>15){ //append
replaceflag=false;
R=M.splitText(15);
}else{
replaceflag=true;
R = d.createElement("span");//dummy
M.parentNode.replaceChild(R, M);
}
A=d.createElement("A");
A.setAttribute("href", Deg2mapURLfuncs.funcs(geoloc, M.data) );
A.setAttribute("title", "lat,lon= " + geoloc.latitude + "," + geoloc.longitude);
A.appendChild(M);
if(replaceflag==true){
R.parentNode.replaceChild(A,R)
}else{
R.parentNode.insertBefore(A,R);
}
}
}else if(tagname=="A"){
//Version 2.X LocaPoint in Anchor.href --> MapURL
var hrefatt = n.getAttribute("href");
var hrefattlen = hrefatt.length;
if (hrefatt.match(/([A-Z]{2}\d\.){3}[A-Z]{2}\d$/)){
hrefatt = hrefatt.substr(hrefattlen - 15, 15);
var geoloc = Locapoint2LatLon(hrefatt);
if(isGoogle){
//GoogleならコメントにTEXTノードの内容を入れる
hrefatt = encodeURIComponent(n.firstChild.data);
}
n.setAttribute("href", Deg2mapURLfuncs.funcs(geoloc, hrefatt) );
n.setAttribute("title", "lat,lon= " + geoloc.latitude + "," + geoloc.longitude);
}
}else if(tagname!="STYLE" && tagname!="SCRIPT" && tagname!="A"){
for(c=0;x=n.childNodes[c];++c){
F(x);
}
}
}
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);
}
}
//]]>