var map;
var miniMap;
var trackid;
var username;
var password;
var scriptfile;

function onLoad() {

	  scriptfile = "gpstracker.php";
	  scriptfile2 = "gpsmail.php";
	  
    if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("mapdiv"));

		map.addControl(new GLargeMapControl(),new GControlPosition(G_ANCHOR_TOP_RIGHT,new GSize(5, 25)));
		map.addControl(new GScaleControl());
		overviewMap = new GOverviewMapControl(new GSize(200, 200)); 
		map.addControl(overviewMap); 

        //map.addControl(new GMapTypeControl());		

		//map.addMapType(G_SATELLITE_3D_MAP);

		showDefaultMap();
		// Changing the zoom level of the overview map not as smooth since v2.93.
		// Hopefully Google will allow proper control of overview zoom in future.
		//setTimeout("fixOverviewZoom()", 1); 
		GEvent.addListener(map,"moveend", function() {setTimeout("fixOverviewZoom()", 1)}); 
		//GEvent.addListener(map,"move", fixOverviewZoom); 
		showLogin();
    }
}

function fixOverviewZoom() {
	// http://mapki.com/index.php?title=Undocumented_Features
	// http://econym.googlepages.com/modularized.htm
	// in v2.93, getOverviewMap() returns null immediately after overview created
	var miniMap = overviewMap.getOverviewMap();
	if (miniMap)
		miniMap.setZoom(Math.round(map.getZoom() / 2.0));
}

function onResize() {
	if (document.getElementById("messagediv").style.visibility == 'visible')
		showCenteredDiv("messagediv");
	else if (document.getElementById("logindiv").style.visibility == 'visible')
		showCenteredDiv("logindiv");
	else if (document.getElementById("registerdiv").style.visibility == 'visible')
		showCenteredDiv("registerdiv");
	else if (document.getElementById("reminderdiv").style.visibility == 'visible')
		showCenteredDiv("reminderdiv");
	else if (document.getElementById("renamediv").style.visibility == 'visible')
		showCenteredDiv("renamediv");
}

function showDefaultMap() {
	trackid = -1;
    map.clearOverlays();
	map.setCenter(new GLatLng(31.4, 121.4), 3);
	map.setMapType(G_MAP_TYPE);
	document.getElementById("trackname").innerHTML = "";
}

function viewMap() {
	map.setMapType(G_MAP_TYPE);
}

function viewSatellite() {
	map.setMapType(G_SATELLITE_TYPE);
}

function viewHybrid() {
	map.setMapType(G_HYBRID_TYPE);
}

function viewEarth() {
    alert('3D地球尚在开发调试中')
	//map.setMapType(G_SATELLITE_3D_MAP);
}

function listTracks() {
    var request = GXmlHttp.create();
    request.open('GET', scriptfile + "?op=list"
    + "&username=" + encodeURIComponent(username)
    + "&password=" + encodeURIComponent(password));
    request.onreadystatechange = function() {
		if (request.readyState == 4) {
		    var xmlsource = request.responseXML;
		    var msg = xmlsource.documentElement.getElementsByTagName("message");
		    if (msg.length > 0) {
				window.alert(msg[0].getAttribute('text'));
				return;
		    }
		    var trackinfos = xmlsource.documentElement.getElementsByTagName("track");
			var trackmenu = document.getElementById("trackul");
			while (trackmenu.lastChild) {
				trackmenu.removeChild(trackmenu.lastChild);
			}
			showDefaultMap();
		    if (trackinfos.length == 0) {
			    var liObject = document.createElement("li");
			    liObject.innerHTML = '<a href="#">&nbsp;None</a>';
			    trackmenu.appendChild(liObject);
		    } else {
			    var liObject = document.createElement("li");
			    liObject.innerHTML = '<a href="javascript:listTracks()">&nbsp;Overview</a>';
			    trackmenu.appendChild(liObject);
			}
		    for (var i = 0; i < trackinfos.length; i++) {
			    var optionValue = trackinfos[i].getAttribute('id');
			    var optionText = trackinfos[i].getAttribute('name');
			    var liObject = document.createElement("li");
			    liObject.innerHTML = '<a href="javascript:loadTrack(' + optionValue + ')">&nbsp;' + optionText + '</a>';
			    trackmenu.appendChild(liObject);
				var point = new GLatLng(parseFloat(trackinfos[i].getAttribute("latitude")),
				parseFloat(trackinfos[i].getAttribute("longitude")));
				addTrackMarker(point, optionValue);
		    }
		    showTracks();
		}
    }
    request.send(null);
}

function loadTrack(newTrackid) {
	trackid = newTrackid;
    map.clearOverlays();
    var request = GXmlHttp.create();
    request.open('GET', scriptfile + "?op=load"
    + "&username=" + encodeURIComponent(username)
    + "&password=" + encodeURIComponent(password)
    + "&trackid=" + encodeURIComponent(trackid), true);
    request.onreadystatechange = function() {
		if (request.readyState == 4) {
		    var xmlsource = request.responseXML;
		    var msg = xmlsource.documentElement.getElementsByTagName("message");
		    if (msg.length > 0) {
				window.alert(msg[0].getAttribute('text'));
				return;
		    }
		    var trackinfo = xmlsource.documentElement.getElementsByTagName("track");
		    var trackname = trackinfo[0].getAttribute('name');
		    var trackpoints = xmlsource.documentElement.getElementsByTagName("point");
		    var points = [];
		    for (var i = 0; i < trackpoints.length; i++) {
				var point = new GLatLng(parseFloat(trackpoints[i].getAttribute("latitude")),
				parseFloat(trackpoints[i].getAttribute("longitude")));
				points.push(point);
		    }
		    var distance = xmlsource.documentElement.getElementsByTagName("distance");
		    var km = distance[0].getAttribute('km');
		    var miles = distance[0].getAttribute('miles');
			document.getElementById("trackname").innerHTML = trackname + " (" + km + "km/" + miles + "mi)";
		    if (points.length > 1) {
			    map.addOverlay(new GPolyline(points));
			    addmarker(points[points.length-1], 'End 终点');
			}
		    if (points.length > 0) {
			    addmarker(points[0], 'Start 起点');
			    centerAndZoomOnPoints(points);
		    }
		}
    }
    request.send(null);
}

function renameTrack() {
	if (trackid >=0) {
		document.getElementById("rename_name").value = "";
		showCenteredDiv("renamediv");
		document.getElementById("rename_name").focus();
	}
	else
	{
        window.alert("请先选择一条路径！");
	}
}

function deleteTrack() {
	if (trackid >=0 && window.confirm('Delete track of '+ document.getElementById("trackname").innerHTML +'?')) {
	    var request = GXmlHttp.create();
	    request.open('GET', scriptfile + "?op=delete"
	    + "&username=" + encodeURIComponent(username)
	    + "&password=" + encodeURIComponent(password)
	    + "&trackid=" + encodeURIComponent(trackid), true);
	    request.onreadystatechange = function() {
			if (request.readyState == 4) {
			    var xmlsource = request.responseXML;
			    var msg = xmlsource.documentElement.getElementsByTagName("message");
			    if (msg.length > 0) {
					window.alert(msg[0].getAttribute('text'));
					return;
			    }
				showDefaultMap();
				listTracks();
			}
	    }
	    request.send(null);
	}
	else
	{
        window.alert("请先选择一条路径！");
	}	
}

function menuClick()
{
	// do nothing
}

function addmarker(point,message,icon)
{
	var marker = new GMarker(point,icon);
	GEvent.addListener(marker, 'click', function() {
		marker.openInfoWindowHtml('<b>' + message + '</b>');
	});
	map.addOverlay(marker);
}

function addTrackMarker(point,trackid)
{
	var marker = new GMarker(point,null);
	GEvent.addListener(marker, 'click', function() {
		loadTrack(trackid);
	});
	map.addOverlay(marker);
}

function centerAndZoomOnPoints(points) {
    var bounds = new GLatLngBounds(); 
	for (var i = 0; i < points.length; i++) { 
		bounds.extend(points[i]); 
	}
    var lat = bounds.getSouthWest().lat() + ((bounds.getNorthEast().lat() - bounds.getSouthWest().lat()) / 2); 
    var lon = bounds.getSouthWest().lng() + ((bounds.getNorthEast().lng() - bounds.getSouthWest().lng()) / 2); 
    var zoom = map.getBoundsZoomLevel(bounds); 
    map.setCenter(new GLatLng(lat, lon), zoom); 
} 

function showCenteredDiv(divname) {
	var height, width;
	// from: http://www.quirksmode.org/viewport/compatibility.html
	if (self.innerHeight) {
		// all except Explorer
		width = self.innerWidth;
		height = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		// Explorer 6 Strict Mode
		width = document.documentElement.clientWidth;
		height = document.documentElement.clientHeight;
	} else if (document.body) {
		// other Explorers
		width = document.body.clientWidth;
		height = document.body.clientHeight;
	}
	var div = document.getElementById(divname);
	var left = (width - div.offsetWidth) / 2;
	var top = (height - div.offsetHeight) / 2;
	div.style.left = left + 'px';
	div.style.top = top + 'px';
	div.style.visibility = 'visible';
}

function hideMessage() {
	document.getElementById("messagediv").style.visibility = 'hidden';
}

function hideRename() {
	document.getElementById("renamediv").style.visibility = 'hidden';
}

function showRegister() {
	document.getElementById("register_username").value = "";
	document.getElementById("register_password").value = "";
	document.getElementById("register_password2").value = "";
	document.getElementById("register_email").value = "";
	document.getElementById("logindiv").style.visibility = 'hidden';
	showCenteredDiv("registerdiv");
	document.getElementById("register_username").focus();
}

function showReminder() {
	document.getElementById("reminder_email").value = "";
	document.getElementById("logindiv").style.visibility = 'hidden';
	showCenteredDiv("reminderdiv");
	document.getElementById("reminder_email").focus();
}

function showLogin() {
	document.getElementById("login_username").value = "";
	document.getElementById("login_password").value = "";
	document.getElementById("menudiv").style.visibility = 'hidden';
	document.getElementById("registerdiv").style.visibility = 'hidden';
	document.getElementById("reminderdiv").style.visibility = 'hidden';
	document.getElementById("renamediv").style.visibility = 'hidden';
	showCenteredDiv("logindiv");
	document.getElementById("login_username").focus();
}

function showTracks() {
	document.getElementById("logindiv").style.visibility = 'hidden';
	document.getElementById("menudiv").style.visibility = 'visible';
	var div = document.getElementById("infodiv");
}

function doLogin() {
    username = document.getElementById("login_username").value;
    password = document.getElementById("login_password").value;
	listTracks();
}

function doLoginGuest() {
    username = "guest";
    password = "";
	listTracks();
}

function doLogout() {
	showDefaultMap();
	showLogin();
}

function doRegister() {
	var username = document.getElementById("register_username").value;
	var password = document.getElementById("register_password").value;
	var password2 = document.getElementById("register_password2").value;
	var email = document.getElementById("register_email").value;
	if (username.length == 0) {
		window.alert("Please enter a username.");
		document.getElementById("register_username").focus();
	} else if (password.length == 0) {
		window.alert("Please enter a password.");
		document.getElementById("register_password").focus();
	} else if (password != password2) {
		window.alert("Please enter the same password twice.");
		document.getElementById("register_password2").focus();
	} else if (!verifyEmail(email)) {
		window.alert("The email address \"" + email + "\" is not valid.");
		document.getElementById("register_email").focus();
	} else {
		registerUser(username, password, email);
		showLogin();
	}
}

function doReminder() {
	var email = document.getElementById("reminder_email").value;
	if (!verifyEmail(email)) {
		window.alert("The email address \"" + email + "\" is not valid.");
		document.getElementById("reminder_email").focus();
	} else {
		remindUser(email);
		showLogin();
	}		
}

function doRename() {
	var name = document.getElementById("rename_name").value;
	if (name.length == 0) {
		window.alert("Please enter a new track name.");
		document.getElementById("rename_name").focus();
	} else {
		document.getElementById("renamediv").style.visibility = 'hidden';
		if (trackid >=0) {
		    var request = GXmlHttp.create();
		    request.open('GET', scriptfile + "?op=rename"
		    + "&username=" + encodeURIComponent(username)
		    + "&password=" + encodeURIComponent(password)
		    + "&trackid=" + encodeURIComponent(trackid)
		    + "&name=" + encodeURIComponent(name), true);
		    request.onreadystatechange = function() {
				if (request.readyState == 4) {
				    var xmlsource = request.responseXML;
				    var msg = xmlsource.documentElement.getElementsByTagName("message");
				    if (msg.length > 0) {
						window.alert(msg[0].getAttribute('text'));
						return;
				    } else {
						document.getElementById("trackname").innerHTML = name;
						listTracks();
					}
				}
		    }
		    request.send(null);
		}
	}
}

function validateUser(username, password) {
    var request = GXmlHttp.create();
    request.open('GET', scriptfile + "?op=validate"
    + "&username=" + encodeURIComponent(username)
    + "&password=" + encodeURIComponent(password), true);
    request.onreadystatechange = function() {
		if (request.readyState == 4) {
		    var xmlsource = request.responseXML;
		    var msg = xmlsource.documentElement.getElementsByTagName("message");
		    if (msg.length > 0) {
				window.alert(msg[0].getAttribute('text'));
		    }
		}
    }
    request.send(null);
}


function registerUser(username, password, email) {
/*
    var request = GXmlHttp.create();
    request.open('GET', scriptfile2 + "?op=register"
    + "&username=" + encodeURIComponent(username)
    + "&password=" + encodeURIComponent(password)
    + "&email=" + encodeURIComponent(email), true);
    request.onreadystatechange = function() {
		if (request.readyState == 4) {
		    var xmlsource = request.responseXML;
		    var msg = xmlsource.documentElement.getElementsByTagName("message");
		    if (msg.length > 0) {
				window.alert(msg[0].getAttribute('text'));
		    }
		}
    }
    request.send(null);
*/
        window.open(scriptfile2 + "?op=register"
             + "&username=" + encodeURIComponent(username)
            + "&password=" + encodeURIComponent(password)
            + "&email=" + encodeURIComponent(email),
            "WindownOpen",
            "toolbar=no, location=no, directories=no, status=yes, menubar=yes, scrollbars=yes, resizeable=yes, width=300, height=400");
}

function remindUser(email) {
/*
   var request = GXmlHttp.create();
    request.open('GET', scriptfile2 + "?op=remind"
    + "&email=" + encodeURIComponent(email));
    request.onreadystatechange = function() {
		if (request.readyState == 4) {
		    var xmlsource = request.responseXML;
		    var msg = xmlsource.documentElement.getElementsByTagName("message");
		    if (msg.length > 0) {
				window.alert(msg[0].getAttribute('text'));
		    }
		}
    }
    request.send(null);
*/
        window.open(scriptfile2 + "?op=remind"
             + "&username=" + encodeURIComponent(username)
            + "&password=" + encodeURIComponent(password)
            + "&email=" + encodeURIComponent(email),
            "WindownOpen",
            "toolbar=no, location=no, directories=no, status=yes, menubar=yes, scrollbars=yes, resizeable=yes, width=300, height=400");
    
}

function verifyEmail(email) {
	var regex = new RegExp("^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", "i");
	return regex.test(email);
}

function doExport(format) {
	if (trackid >= 0) {
	    window.location.href = scriptfile + "?op=export"
	    + "&username=" + encodeURIComponent(username)
	    + "&password=" + encodeURIComponent(password)
	    + "&trackid=" + encodeURIComponent(trackid)
	    + "&format=" + encodeURIComponent(format);
	}
}
