// ---------- convert lat lng to GT String
function latLng2GT(lat, lng, sub) {
	if(sub < 0) return "";

	lat = Number(lat);
	lng = Number(lng);

	// ----- validity check
	if(isNaN(lat) || isNaN(lng) || lat > 90 || lat <= -90 || lng < -180 || lng >= 180) return String(NaN);

	// ----- covert axis
	lat = 180 - (lat + 90);
	lng = lng + 180;

	// ----- main gt
	var gt = Math.floor(lat) * 500 + Math.floor(lng) + 10000;

	// ----- sub gt
	var lats = String(lat).split(".");
	var lngs = String(lng).split(".");

	lats = lats.length == 2 ? lats[1] : "";
	lngs = lngs.length == 2 ? lngs[1] : "";

	for(var i = 0; i < sub; i++) {
		gt += "." + (lats.charAt(i) == "" ? "0" : lats.charAt(i)) + (lngs.charAt(i) == "" ? "0" : lngs.charAt(i));
	}

	return gt;
}

// ---------- convert GT String to lat lng. Return lat=[0], lng=[1].
function GT2LatLng(gt) {
	var point = new Object();

	// ----- split gt string
	var gts = gt.split(".");
	gts[0] = Number(gts[0]) - 10000;

	// ----- validity check
	if(gts[0] < 0 || gts[0] > 64799) {
		point.lat = point.lng = NaN;
		return point;
	}

	// ---- calculate main
	point.lat = 90 - (gts[0] - gts[0] % 500) / 500;
	point.lng = gts[0] % 500 - 180;
	point.zoom = gts.length + 10; // approximate the zoom level

	// ---- calculate subs
	for(var i = 1; i < gts.length; i++) {
		// ----- validity check
		if(gts[i].length != 2) {
			point.lat = point.lng = NaN;
		}

		point.lat -= gts[i].charAt(0) / Math.pow(10, i);
		point.lng += gts[i].charAt(1) / Math.pow(10, i);
	}

	return point;
}