var geocoder = null;
var map = null;

//LocationMap Section
function PopulateMapUI(map, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel)
{
    if (enableZoom)
        map.addControl(new GLargeMapControl());

    if (enableMapType)
      map.addControl(new GMapTypeControl());

    if (enableLocalSearch) 
      map.addControl(new google.maps.LocalSearch(), new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(1+1, 15)));
    
    if(enableDragZoom)
        map.addControl(new DragZoomControl({}, {backButtonEnabled: true}, {}), 
            new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(0, 35)));
        
    if (mapType)
      map.setMapType(mapType);

    if (zoomLevel)
      map.setZoom(zoomLevel);
}

function showGMapLocation(divMap, address, showInfoWindow, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel) 
{
    if (!GBrowserIsCompatible()){return;}

	if (geocoder == null) 
	{
	    geocoder = new GClientGeocoder();
	}
	
	if (geocoder) 
	{
	    geocoder.getLatLng(
    	    address,
	        function(point)
	        {
	            if (!point) 
	            {
	                divMap.innerHTML = 'location not found';
	            }
	            else 
	            {
                  if(map == undefined)
                    map = new GMap2(divMap);
    	          
	              map.setCenter(point, 13);
                  var marker = new GMarker(point);
	              map.addOverlay(marker);
    	          if (showInfoWindow)
                    marker.openInfoWindowHtml(address);
                    
	              PopulateMapUI(map, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel);
	            }
	        });
	}
}

function showGMapLatLng(divMap, latitude, longitude, showInfoWindow, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel) 
{
    if (!GBrowserIsCompatible()){return;}
    
    if(map == undefined)
        map = new GMap2(divMap);
    
    var latlng = new GLatLng(latitude, longitude);
    map.setCenter(latlng, 13);
    var marker = new GMarker(latlng);
    map.addOverlay(marker);
    if (showInfoWindow)
        marker.openInfoWindowHtml(latitude + "," + longitude);

    PopulateMapUI(map, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel);
}

function showGMap(divMap, showInfoWindow, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel) {
    if (!GBrowserIsCompatible()) { return; }

    if (map == undefined)
        map = new GMap2(divMap);
        
    var latlng = new GLatLng(0, 0);
    map.setCenter(latlng, 13);
        
    PopulateMapUI(map, enableMapType, enableZoom, enableLocalSearch, enableDragZoom, mapType, zoomLevel);
}

function showMapAndDirections(divMap, divDirectionsId, txtFromAddressId, toAddress, locale) 
{
    if (!GBrowserIsCompatible()){return;}
    
    var map = new GMap2(document.getElementById(divMap));
    
	if(! map){ return;}
	
	var divDir = document.getElementById(divDirectionsId);
	if(! divDir){ alert('divdir was null');return;}
	
	var gdir = new GDirections(map, divDir);
	
	var txtFrom = document.getElementById(txtFromAddressId);
	if(! txtFrom){ return;}
    
    var fromLocation = txtFrom.value;
	
	gdir.load("from: " + fromLocation + " to: " + toAddress,{ "locale": locale });
	
	
	/*
	var statuscode = gdir.getStatus().code;
	
	if (statuscode == G_GEO_UNKNOWN_ADDRESS)
	     divDir.innerHTML = 'No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.';
	   else if (statuscode == G_GEO_SERVER_ERROR)
	    divDir.innerHTML = 'A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.';
	     
	   else if (statuscode == G_GEO_MISSING_QUERY)
	     divDir.innerHTML = 'The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.';

	   else if (statuscode == G_GEO_BAD_KEY)
	     divDir.innerHTML = 'The given key is either invalid or does not match the domain for which it was given.';

	   else if (statuscode == G_GEO_BAD_REQUEST)
	     divDir.innerHTML = 'A directions request could not be successfully parsed.';
	*/
}    
//End of LocationMap Section

//LocationFinder Section
var data = null; 
var row_no = 0;
var markers = [];
var cLat = null;
var cLng = null;


function InitializeLocationFinder() {
    if (!GBrowserIsCompatible()){return;}
    
    setupTable(gtTableCanvas);
    
    if (geocoder == null) 
	{
	    geocoder = new GClientGeocoder();
	}
	
	if(geocoder)
	{
	    if(map == undefined)
	        map = new GMap2(gmMapCanvas);
	        
        GEvent.addListener(map, 'click', function(overlay, latlng) {       
	      if(latlng == undefined)
	        return;
	        
	      var lat = latlng.lat();
	      var lon = latlng.lng();
	      cLat = lat;
	      cLng = lon;
	      var latOffset = 0.01;
	      var lonOffset = 0.01;
	      var point = new GLatLng(lat, lon); 
          marker = new GMarker(point);
          markers.push(marker);
          map.addOverlay(new GMarker(point));
          	    
          geocoder.getLocations(latlng, showAddress);
        });
    }
}

function setupTable(table) {
  if (!GBrowserIsCompatible()){return;}

  data = new google.visualization.DataTable();
  visualization = new google.visualization.Table(table);
    
  data.addColumn('number', 'ID');
  data.addColumn('string', 'Area');
  data.addColumn('number', 'Latitude');
  data.addColumn('number', 'Longitude');
  
  visualization.draw(data, null);
}

function showAddress(response) {
  if (!response || response.Status.code != 200) {
    alert("Status Code:" + response.Status.code);
  } else {
    place = response.Placemark[0];
    point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]); 
    data.addRows(1);
	data.setCell(row_no,0,row_no + 1);
	data.setCell(row_no,1,place.address);
    data.setCell(row_no,2, cLat);
    data.setCell(row_no,3, cLng);
    ++row_no;
   
    visualization = new google.visualization.Table(gtTableCanvas);
    visualization.draw(data, null);
    google.visualization.events.addListener(visualization, 'select', selectHandler);
   
//    var marker = markers[row_no -1];
//    marker.openInfoWindowHtml(
//      '<b>orig latlng:</b>' + response.name + '<br/>' + 
//      '<b>Reverse Geocoded latlng:</b>' + place.Point.coordinates[1] + "," + place.Point.coordinates[0] + '<br>' +
//      '<b>Status Code:</b>' + response.Status.code + '<br>' +
//      '<b>Status Request:</b>' + response.Status.request + '<br>' +
//      '<b>Address:</b>' + place.address + '<br>' +
//      '<b>Accuracy:</b>' + place.AddressDetails.Accuracy + '<br>' +
//      '<b>Country code:</b> ' + place.AddressDetails.Country.CountryNameCode);
    }
}

function resetTable() {
  if (!GBrowserIsCompatible()){return;}
  
  markers = [];
  row_no = 0;
  
  if(map)
    map.clearOverlays();
  
  if(data && visualization)
  {
    data.removeRows(0,row_no);
    visualization.draw(data, null);
  }
}

function selectHandler() {
  var selection = visualization.getSelection();
  var message = '';
  var lat1;
  var lng1;
  for (var i = 0; i < selection.length; i++) {
    var item = selection[i];
    if (item.row != null && item.column != null) {
      lat1 = data.getValue(item.row,2);
      lng1 = data.getValue(item.row,3);
    } else if (item.row != null) {
      lat1 = data.getValue(item.row,2);
      lng1 = data.getValue(item.row,3);
    } else if (item.column != null) {
      lat1 = data.getValue(item.row,2);
      lng1 = data.getValue(item.row,3);
    }
    var point = new GLatLng(lat1, lng1); 
    map.addOverlay(new GMarker(point));
  }
  if (message == '') {
    //do nothing
  }   
  
}

//End of LocationFinder Section
