var map;
var markersArray;

function initMap()
{
      map = new GMap2(document.getElementById(mapElementId));
      map.addControl(new GLargeMapControl());
      map.addControl(new GMapTypeControl());
      map.setCenter(initialPoint, initialZoom);
      
}

function zoomToLocation(lat, lng, zm)
{
	var desiredPoint = new GLatLng(lng,lat);
	map.setZoom(zm);
	map.panTo(desiredPoint);
}

function getWindowTabs(n)
{
	return getMarkerBalloonTabs(n);
}

function printMarkers()
{
	for (var i = 0; i < markers.length; i++)
	{
		document.write(markers[i]);
	}
}

function setUpMarkers(markers)
{
	markersArray = new Array(markers.length);
	for (var i = 0; i < markers.length; i++)
	{
		m = markers[i].split(",");
		var point = new GLatLng(parseFloat(m[0]),parseFloat(m[1]));
		var marker = new GMarker(point);
		markersArray[i] = marker;
		eval("GEvent.addListener(markersArray[i], 'click', function() {var s = getWindowTabs(" + i + ");markersArray[" + i + "].openInfoWindowTabsHtml(s);});");
	}
}

function showMarkerByIndex(midx)
{
		map.addOverlay(markersArray[midx]);
}

function hideMarkerByIndex(midx)
{
		map.removeOverlay(markersArray[midx]);
}


function addPolyLine(linePointsArray, colorString)
{
	var pointsArray = new Array(linePointsArray.length);
	for (var i = 0; i < linePointsArray.length; i++)
	{
		var npointa=linePointsArray[i].split(",")[0];
		var npointb=linePointsArray[i].split(",")[1];
		var npoint = new GLatLng(npointb,npointa);
		pointsArray[i] = npoint;
	}

	var polyline = new GPolyline(pointsArray, colorString, 10, 0.6);
	map.addOverlay(polyline);
	return polyline;
}

function hideCurrentPolyLine()
{
	map.removeOverlay(currentPolyLine);
}




function autoNavigate(obj) 
{
	if (map.getZoom()<15)
	{
		map.setZoom(15);
	}
	var markerId = obj.options[obj.selectedIndex].value;
	markersArray[markerId].openInfoWindowTabsHtml(getWindowTabs(markerId));
}

function autoNavigateById(idx, zm)
{

	if (map.getZoom()<zm)
	{
		map.setZoom(zm);
	}
	markersArray[idx].openInfoWindowTabsHtml(getWindowTabs(idx));
}

function encodePolyline(a) {
	var p = a.split(',');
	var d = '';
	var xo=0;
	var yo=0;
	for(c=0;c<p.length;c+=2) 
	{
		x = p[c];
		xd = x - xo;
		xo = x;
		f = (Math.abs(xd) << 1) - (xd<0);
		do 
		{
			e = f & 31;
			f>>=5;
			if(f){e|=32};
			d+=String.fromCharCode(e+63);

		} while(f!=0);

		y = p[c+1];
		yd = y - yo;
		yo = y;
		f = (Math.abs(yd)<<1)-(yd<0);

		do 
		{
			e = f & 31;
			f>>=5;
			if(f){e|=32};
			d+=String.fromCharCode(e+63);
		} while (f != 0);

	}
	return d;
}


// must return an array of strings, where each string is a long/lat pair seperated by a comma
function getMarkers()
{
	var _markersArray = new Array(placesArray.length);
	for (var i=0; i<placesArray.length; i++)
	{
		_markersArray[i] = placesArray[i].lat + "," + placesArray[i].lng;
		placesArray[i].markerindex=i;
	}
	return _markersArray;
}

function showAllPlaceMarkers()
{
	for (var i=0; i<placesArray.length; i++)
	{
		if (placesArray[i]) // only if not null
		{
			showMarkerByIndex(i);
		}
	}
}


function showPlaceMarkers(sa)
{
	for (var i=0; i<sa.length; i++)
	{
		showMarkerByIndex(sa[i]);
	}
}

function hidePlaceMarkers(sa)
{
	for (var i=0; i<sa.length; i++)
	{
		hideMarkerByIndex(sa[i]);
		map.disableInfoWindow();// Disables the info window on this map ;
		map.enableInfoWindow();
	}
}



// must return an array of GInfoWindowTab objects
function getMarkerBalloonTabs(n)
{

	var infoTabsToReturn;
	infoTabsToReturn = [new GInfoWindowTab("Info", getMarkerBalloonHtml(n))];
	return infoTabsToReturn;
}

// must return a string representing the HTML that is to be displayed for the marker n
function getMarkerBalloonHtml(n)
{
	var toRet = placesArray[n].htmlToDisplay;
	return toRet;
}

function makeMap()
{
   initMap();
   setUpMarkers(getMarkers());
   showAllPlaceMarkers();   
}

function reCenterMap()
{
 map.setCenter(initialPoint, initialZoom);
}

