var promatMap = null;
var locosArr = new Array();
var locosIDS = new Array();
var selectedLoco = -1;

var centerPoint = null;
var centerPointLat = 46;
var centerPointLon = 25;
var initZoomLevel = 6;

var followState = false;

function getMap()
{
	promatMap = new VEMap('promatMap');
	promatMap.AttachEvent("onmousewheel", EventMouseWheel);
	centerPoint = new VELatLong(centerPointLat, centerPointLon, 0, VEAltitudeMode.RelativeToGround)
	promatMap.LoadMap(centerPoint, initZoomLevel, VEMapStyle.Shaded, false, VEMapMode.Mode2D, true, 1);
	promatMap.AttachEvent("onclick",MouseOverHandler);
	loadLocosInfo();
}

function EventMouseWheel()
{
   return true;
}

function SetSelectedLoco(idGpsLocoStr)
{
	//var idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
	selectedLoco = idGpsLocoStr;
	setLocosInfoFromObjectInTable(locosArr[selectedLoco].values, selectedLoco);
	var c = 0;
	for(c = 0; c < locosIDS.length; c++)
	{
		locosArr[locosIDS[c]].pushpin.SetCustomIcon("./images/icons/train-icon.png");
	}
	locosArr[selectedLoco].pushpin.SetCustomIcon("./images/icons/train-icon_sel.png");
	
}

function MouseOverHandler(e)
{
    if (e.elementID != null){
		//document.getElementById('resultDiv').innerHTML = e.eventName + " event occurred on shape (id=" + e.elementID + "). "; //", title=" + e.GetTitle() + 
		var shape = promatMap.GetShapeByID(e.elementID);
		//document.getElementById('resultDiv').innerHTML = "shape " + shape.GetTitle();
		SetSelectedLoco(shape.GetTitle());
	}
    else
    {
		//document.getElementById('resultDiv').innerHTML = e.eventName + " event occurred on map.";
	}
}

function loadLocosInfo()
{	
	new Ajax.Request('./ajax_get_locos_info.php',
	{
		method: 'get',
		onSuccess: setLocosInfo,
		onFailure: function()
		{
			alert('Something went wrong... while refreshing info...')
		}
	});
	setTimeout('loadLocosInfo()', 5000);
}

function AddPoint(lat,lon)
{
	return;
    var point = new VEShape(VEShapeType.Pushpin, new VELatLong(lat, lon, 0, VEAltitudeMode.RelativeToGround));
    point.SetCustomIcon("<div>" + lat + " - " + lon + "<div>");
    promatMap.ClearInfoBoxStyles();
    point.SetTitle("<h2>Custom Pin</h2>");
    point.SetDescription(lat + " - " + lon);
    promatMap.AddShape(point);
}

var vals = Array();
vals = ['time', 'lat', 'lon', 'alt', 'speed', 'speed_f', 'cm_mt', 'cit', 'ci', 'driver', 'company'];
var color_vals = Array();
color_vals =[ 0, 1, 1, 1, 2, 2, 3, 3, 3, 0, 0];
// 0 - gray
// 1 - blue 
// 2 - red
// 3 - green
var classNames = Array();	
classNames = ['gray', 'blue', 'blue', 'blue', 'red', 'red', 'green', 'green', 'green', 'gray', 'gray'];

function ResetView()
{
	promatMap.SetCenterAndZoom(centerPoint, initZoomLevel);
}

function UpdateFollow()
{
	var el = document.getElementById('follow');
	if(el)
	{
		followState = el.checked;
	}
}

function CenterOnLoco(idGpsLocoStr, keepZoom)
{
	var cpts = locosArr[idGpsLocoStr].pushpin.GetPoints();
	if(cpts.length > 0)
	{
		if(keepZoom)
		{
			//promatMap.SetCenter(cpts[0]);
			promatMap.PanToLatLong(cpts[0]);
		}
		else
		{
			promatMap.SetCenterAndZoom(cpts[0], 12);
		}
		
	}
}

function NextLoco()
{
	var c = 0;
	var found = false;
	for(c = 0; c < locosIDS.length; c++)
	{
		if(found == true)
		{
			SetSelectedLoco(locosIDS[c]);
			CenterOnLoco(locosIDS[c], true);
			return;
		}
		if(locosIDS[c] == selectedLoco)
		{
			found = true;
		}
	}
	
	if(found == true && c == locosIDS.length)
	{
		SetSelectedLoco(locosIDS[0]);
		CenterOnLoco(locosIDS[0], true);
	}
}

function setLocosInfoInTable(locosXmlObj)
{
	var prefix = 'tbl_';
	var i = 0;
	var v;
	var o; 
	var class_name = "gray";
	for(i = 0; i < vals.length; i++)
	{
		o = document.getElementById(prefix + vals[i]);
		v = locosXmlObj.getElementsByTagName(vals[i])[0].firstChild.nodeValue;
		
		o.innerHTML = "<span class=\"" + classNames[i] + "\">" + v + "</span>" ;
	}
}

function setLocosInfoFromObjectInTable(obj, id)
{
	var prefix = 'tbl_';
	var o = document.getElementById("tbl_idlocomotive");
	if(o)
	{
		o.innerHTML = "<a href=\"javascript:CenterOnLoco('"+ id + "');\">" + id + "</a>";
	}
	var i = 0;
	for(i = 0; i < vals.length; i++)
	{
		o = document.getElementById(prefix + vals[i]);
		var v = obj[vals[i]];
		if(o)
		{
			o.innerHTML = "<span class=\"" + classNames[i] + "\">" + v + "</span>" ;
		}
		else
		{
			//alert(prefix + vals[i]);
		}
	}
}

function getIDGpsLocoStr(idGpsLoco)
{
	return 'idGpsLoco_' + idGpsLoco;
}

function setLocosInfo(transport)
{
	var response = transport.responseXML;
	var mainXmlNode = response.documentElement;
	var msg = mainXmlNode.getElementsByTagName('msg')[0].firstChild;
	if(msg != null)
	{
		alert(msg.nodeValue);
	}

	var locos = mainXmlNode.getElementsByTagName('locos').item(0).getElementsByTagName('loco');
	var locosNo = locos.length;
	if(locosNo > 0)
	{
		var i;
		var idGpsLoco;
		var idGpsLocoStr;
		for(i = 0; i < locosNo; i++)
		{	
			idGpsLoco = locos[i].getElementsByTagName('idgps_loco')[0].firstChild.nodeValue;
			idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
			/*if(selectedLoco == idGpsLocoStr)
			{
				setLocosInfoInTable(locos[i]);
			}*/
			AddPoint(parseFloat(locos[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
					parseFloat(locos[i].getElementsByTagName('lon')[0].firstChild.nodeValue));
			if(locosArr[idGpsLocoStr] != null && locosArr[idGpsLocoStr] != 'undefined') // not the first time we get the positions of the locomotives from the db
			{
				locosArr[idGpsLocoStr].pushpin.SetPoints(new VELatLong(
										parseFloat(locos[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
										parseFloat(locos[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
										parseFloat(locos[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
										VEAltitudeMode.RelativeToGround));
				locosArr[idGpsLocoStr].timestamp = locos[i].getElementsByTagName('timestamp')[0].firstChild.nodeValue;
				if(locosArr[idGpsLocoStr].visibleRoute)
				{
					loadLocoRoute(idGpsLoco);
					locosArr[idGpsLocoStr].pushpin.SetDescription(
											locos[i].getElementsByTagName('description')[0].firstChild.nodeValue
											+ '<br /><span id="show_route_' + idGpsLoco + '">'
											+ '<a onClick="showRoute(' + idGpsLoco + ',' + false + ');">'
											+ 'Hide route</a></span>');
				}
				else
				{	
					locosArr[idGpsLocoStr].pushpin.SetDescription(
												locos[i].getElementsByTagName('description')[0].firstChild.nodeValue
												+ '<br /><span id="show_route_' + idGpsLoco + '">'
												+ '<a onClick="loadLocoRoute(' + idGpsLoco + ');">'
												+ 'Show route</a></span>');
				}
			}
			else // the first time we get the positions of the locomotives from the db
			{
				locosIDS.push(idGpsLocoStr);
				AddPoint(parseFloat(parseFloat(locos[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
											parseFloat(locos[i].getElementsByTagName('lon')[0].firstChild.nodeValue)));
				
				/*
				new VEPushpin(idGpsLocoStr, new VELatLong(
											parseFloat(locos[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
											parseFloat(locos[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
											parseFloat(locos[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
											VEAltitudeMode.RelativeToGround), "./images/icons/train-icon.png", idGpsLocoStr, idGpsLocoStr)							
								*/
				locosArr[idGpsLocoStr] = {
							pushpin: new VEShape(VEShapeType.Pushpin, new VELatLong(
											parseFloat(locos[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
											parseFloat(locos[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
											parseFloat(locos[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
											VEAltitudeMode.RelativeToGround)),
							timestamp0: 0,
							timestamp: locos[i].getElementsByTagName('timestamp')[0].firstChild.nodeValue,
							values: Array(),
							visibleRoute: true
				};
				locosArr[idGpsLocoStr].pushpin.SetCustomIcon("./images/icons/train-icon.png");
				
				promatMap.AddShape(locosArr[idGpsLocoStr].pushpin);
				locosArr[idGpsLocoStr].pushpin.SetDescription(
												locos[i].getElementsByTagName('description')[0].firstChild.nodeValue
												+ '<br /><span id="show_route_' + idGpsLoco + '">'
												+ '<a onClick="loadLocoRoute(' + idGpsLoco + ');">'
												+ 'Show route</a></span>');
				//loadLocoRoute(idGpsLoco);
				//showRoute(idGpsLoco, true);
				
			}
			locosArr[idGpsLocoStr].pushpin.SetTitle(idGpsLocoStr);//locos[i].getElementsByTagName('title')[0].firstChild.nodeValue);
			
			var c = 0;
			for(c = 0; c < vals.length; c++)
			{
				//document.getElementById('status').innerHTML = vals[c] + " - " + c;
				var v = locos[i].getElementsByTagName(vals[c])[0].firstChild.nodeValue;
				locosArr[idGpsLocoStr].values[vals[c]] = v;
			}
			if(selectedLoco == idGpsLocoStr)
			{
				if(followState == true)
				{
					CenterOnLoco(idGpsLocoStr, true);
				}
				setLocosInfoFromObjectInTable(locosArr[idGpsLocoStr].values, idGpsLocoStr);
			}
		}

		if(selectedLoco == -1)
		{
			SetSelectedLoco(idGpsLocoStr);
		}
	}
	else
	{
		alert('There are no locomotives into the database.');
	}
}

function loadLocoRoute(idGpsLoco)
{	
	var idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
	var tstp = locosArr[idGpsLocoStr].timestamp;
	var tstp0 = locosArr[idGpsLocoStr].timestamp0;

	// existing route
	if(tstp0 == tstp)
	{
		showRoute(idGpsLoco, true);
		return;
	}

	new Ajax.Request('./ajax_get_loco_route.php',
	{
		method: 'get',
		parameters: {idgps_loco: idGpsLoco,
					timestamp0: tstp0,
					timestamp: tstp},
		onSuccess: function(transport) {setLocoRoute(transport, idGpsLoco);},
		onFailure: function()
		{
			alert('Something went wrong...')
		}
	});
}

function showRoute(idGpsLoco, show)
{
	var idGpsLocoStr;
	var spanId;
	var newLink;

	if(show)
	{
		idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
		if(!locosArr[idGpsLocoStr].visibleRoute)
		{
			spanId = 'show_route_' + idGpsLoco;
			newLink = '<a onClick="showRoute(' + idGpsLoco + ',' +  false + ');">Hide route</a>';
			document.getElementById(spanId).innerHTML = newLink;
			locosArr[idGpsLocoStr].pushpin.SetDescription(
					changeTextBetweenStr(locosArr[idGpsLocoStr].pushpin.GetDescription(),
										'<span id="' + spanId + '">',
										'</span>', newLink));
			locosArr[idGpsLocoStr].visibleRoute = true;
			if(locosArr[idGpsLocoStr].polyline != null)
			{
				locosArr[idGpsLocoStr].polyline.Show();
			}
		}
	}
	else
	{
		idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
		if(locosArr[idGpsLocoStr].visibleRoute)
		{
			spanId = 'show_route_' + idGpsLoco;
			newLink = '<a onClick="loadLocoRoute(' + idGpsLoco + ');">Show route</a>'
			document.getElementById(spanId).innerHTML = newLink;
			locosArr[idGpsLocoStr].pushpin.SetDescription(
					changeTextBetweenStr(locosArr[idGpsLocoStr].pushpin.GetDescription(),
										'<span id="' + spanId + '">',
										'</span>', newLink));
			locosArr[idGpsLocoStr].visibleRoute = false;
			if(locosArr[idGpsLocoStr].polyline != null)
			{
				locosArr[idGpsLocoStr].polyline.Hide();
			}
		}
	}
}

function setLocoRoute(transport, idGpsLoco)
{	
	var response = transport.responseXML;
	var mainXmlNode = response.documentElement;
	var msg = mainXmlNode.getElementsByTagName('msg')[0].firstChild;
	if(msg != null)
	{	
		alert(msg.nodeValue);
	}
	var newRoute = mainXmlNode.getElementsByTagName('new_route')[0].firstChild;
	if(newRoute != null)
	{
		newRoute = newRoute.nodeValue;
		var route;
		var pointsNo;
	
		route = mainXmlNode.getElementsByTagName('route').item(0).getElementsByTagName('point');
		pointsNo = route.length;
		if(pointsNo > 0)
		{
			var idGpsLocoStr = getIDGpsLocoStr(idGpsLoco);
			var i;
			if(newRoute == 1)
			{
				if(locosArr[idGpsLocoStr].timestamp0 != 0) // this timestamp does not matter anymore, it's from another data file
				{
					locosArr[idGpsLocoStr].routePoints = new Array();
					for(i = 0; i < pointsNo; i++)
					{	
						locosArr[idGpsLocoStr].routePoints[i] = new VELatLong(
											parseFloat(route[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
											parseFloat(route[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
											parseFloat(route[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
											VEAltitudeMode.RelativeToGround);
					}
					if(locosArr[idGpsLocoStr].polyline != null)
					{
						promatMap.DeleteShape(locosArr[idGpsLocoStr].polyline);
						locosArr[idGpsLocoStr].polyline = null;
					}
				} // first time we get the route
				else
				{
					locosArr[idGpsLocoStr].routePoints = new Array();
					for(i = 0; i < pointsNo; i++)
					{
						locosArr[idGpsLocoStr].routePoints[i] = new VELatLong(
										parseFloat(route[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
										parseFloat(route[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
										parseFloat(route[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
										VEAltitudeMode.RelativeToGround);
					}
				}
				if(pointsNo > 1)
				{
					locosArr[idGpsLocoStr].polyline = new VEShape(VEShapeType.Polyline,
													locosArr[idGpsLocoStr].routePoints);
					// locosArr[idGpsLocoStr].polyline.SetLineColor(new VEColor(18, 112, 18, 1.0));
					locosArr[idGpsLocoStr].polyline.SetLineWidth(3);
					locosArr[idGpsLocoStr].polyline.HideIcon();
					promatMap.AddShape(locosArr[idGpsLocoStr].polyline);
				}
			}
			else
			{
				for(i = 0; i < pointsNo; i++)
				{
					locosArr[idGpsLocoStr].routePoints.push(new VELatLong(
											parseFloat(route[i].getElementsByTagName('lat')[0].firstChild.nodeValue),
											parseFloat(route[i].getElementsByTagName('lon')[0].firstChild.nodeValue),
											parseFloat(route[i].getElementsByTagName('alt')[0].firstChild.nodeValue),
											VEAltitudeMode.RelativeToGround));
				}
				if(locosArr[idGpsLocoStr].routePoints.length > 1)
				{
					if(locosArr[idGpsLocoStr].polyline != null)
					{
						locosArr[idGpsLocoStr].polyline.SetPoints(locosArr[idGpsLocoStr].routePoints);
					}
					else
					{
						locosArr[idGpsLocoStr].polyline = new VEShape(VEShapeType.Polyline,
														locosArr[idGpsLocoStr].routePoints);
						// locosArr[idGpsLocoStr].polyline.SetLineColor(new VEColor(18, 112, 18, 1.0));
						locosArr[idGpsLocoStr].polyline.SetLineWidth(3);
						locosArr[idGpsLocoStr].polyline.HideIcon();
						promatMap.AddShape(locosArr[idGpsLocoStr].polyline);
					}
				}
				else
				{
					if(locosArr[idGpsLocoStr].polyline != null)
					{
						promatMap.DeleteShape(locosArr[idGpsLocoStr].polyline);
						locosArr[idGpsLocoStr].polyline = null;
					}
				}
			}
			locosArr[idGpsLocoStr].timestamp0 = locosArr[idGpsLocoStr].timestamp;
		}
/*
		showRoute(idGpsLoco, true);
	}
	else
	{
		showRoute(idGpsLoco, false);
	}
*/
	}
	showRoute(idGpsLoco, true);
}

function changeTextBetweenStr(oldStr, startStr, endStr, newMiddleStr)
{	
	var newStrPart1 = oldStr.substring(0, oldStr.indexOf(startStr)) + startStr;
	var newStrPart2 = oldStr.substring(newStrPart1.length, oldStr.length);
	newStrPart2 = newStrPart2.substring(newStrPart2.indexOf('</span>'), newStrPart2.length);
	return newStrPart1 + newMiddleStr + newStrPart2;
}