
/***************** GEOMAP MODULES *******************************/
/* module isCountryZoomLevel(string region) */
function isCountryZoomLevel(region){
	switch(region){
		case "world": case "021": case "005":
		case "013":   case "002": case "017":
		case "015":   case "018": case "030":
		case "034":   case "035": case "143":
		case "145":   case "151": case "154":
		case "155":   case "039":
		return true;
		break;
	}
	return false;
}



/* module consoleLog(object) */
function consoleLog(object){
	if(debugMode){
		console.log(object); //requires active console
	}
}


/* module startMap(void) */
function startMap(){	
	//create geomap Object
	geomap = new google.visualization.GeoMap(geomapContainer);	
	//load map data
	fetchLoadMapRegionData(options['region'],null);
	//add zoom out feature
	google.visualization.events.addListener(geomap, 'zoomOut',handleGeoZoomOut);		
}

/* module restartMap(void) */
function restartMap(){
	options['region'] = options['defaultregion']; 
	regionHistory = [];
	regionTypeHistory = [];
	startMap();
}

/* module resetGeoMap(void) */
function resetGeoMap(){
	consoleLog("|------ Resetting Geo Map -------|");
	geomapContainer.innerHTML="";
	geomap = new google.visualization.GeoMap(geomapContainer);
	//add zoom out feature
	google.visualization.events.addListener(geomap, 'zoomOut',handleGeoZoomOut);		
	//options['region'] = options['defaultregion']; 
	//regionHistory = [];
	//regionTypeHistory = [];
}

/* module handleGeoZoomOut(void) */
function handleGeoZoomOut(){
	consoleLog("Handing GeoMap Zoom Out (-)");

	if(regionHistory.length>1){
		regionHistory.pop();//clean current
		regionTypeHistory.pop();//clean current
	}
	options['region'] = regionHistory.pop();
	var regionType = regionTypeHistory.pop();
	fetchLoadMapRegionData(options['region'],regionType);
}

/* module handleRegionSelect(void) */
function handleRegionSelect(){
	consoleLog("Handling Region Click");
	var rowNum = geomap.getSelection()[0].row;
	var region = data.getValue(rowNum,0);
	var regionName = data.getValue(rowNum,2);
	consoleLog(region);
	resetGeoMap();
	
	options['region'] = region;//set new region
	options['regionname'] = regionName;//set new region name
	
	consoleLog("Setting Region to:"+options['region']);
		

	fetchLoadMapRegionData(region,options['regiontype']);
}

/* module fetchLoadMapRegionData(string region) */
function fetchLoadMapRegionData(region,regionType){

	//record hitory
	regionTypeHistory.push(regionType);
	regionHistory.push(options['region']);
	
	consoleLog("Fetching Map Region Data");
	//fetch country data (if needed)
	if(isCountryZoomLevel(region)){
		$.post('manageoptions.php',{ act:'fetchCountryData' },function(xml){
			loadMapData(xml);//load map data
			google.visualization.events.addListener(geomap, 'select',handleRegionSelect);
		});
	}else{//fetch state/region level data
		consoleLog("Fetching Type 2");
		$.post('manageoptions.php',{ act:'fetchregiondata',regiontype:regionType,region:region },function(xml){
			loadMapData(xml);//load map data
			google.visualization.events.addListener(geomap, 'select',handleRegionSelect);
		});
	}
	
	
}

/* module loadMapData(object xml) */
function loadMapData(xml){
	consoleLog("Loading Map Data");
	//check total rows found (exit if needed)

	
	var totalRows = parseInt($(xml).find("total").text());
	if(totalRows<1){ alert('No Map Data Found.'); return; }
	consoleLog(totalRows+" Total Regions Found");
	//proceed to add data to map
	data = new google.visualization.DataTable();
	data.addRows(totalRows);

	options['regiontype'] = $(xml).find("regiontype").text();
	options['dataMode'] = $(xml).find("datamode").text();
	
	if(options['dataMode']=="regions"){
		consoleLog('Adding Columns For Regions')
		data.addColumn('string', lang.regions);
		data.addColumn('number', lang.storesdealers);	
		data.addColumn('string','Hover Text');
	}else{
		//8-14-2010 -> Currently Google GeoMaps doesn't support a state level map, Google Maps are used instead
		startGoogleMap(xml);
		//clean history
		regionHistory.pop();
		regionTypeHistory.pop();
		return;
		
		//see note above
		consoleLog('Adding Columns For Markers')
		data.addColumn('number','Latitude');
		data.addColumn('number','Longitude');
		data.addColumn('number','Total Locations');
		data.addColumn('string','Hover Text');
	}
		
	//for each region found
	var regions = $(xml).find("region");
	for(var i=0;i<regions.length;i++){
		consoleLog("region name:"+$(regions[i]).find("name").text());
		consoleLog("region count:"+parseInt($(regions[i]).find("count").text()));
		
		if(options['dataMode']=="markers"){//add data for markers
			consoleLog("for-datamode-markers");
			var lat = $(regions[i]).find("lat").text();
			var lng = $(regions[i]).find("lng").text();
			consoleLog("Lat:"+lat+", Lng:"+lng);		
			data.setValue(i,0,Number(lat));
			data.setValue(i,1,Number(lng));
			data.setValue(i,2,parseInt($(regions[i]).find("count").text()));
			data.setValue(i,3,$(regions[i]).find("fullname").text());
		}else{//add data for regions
			consoleLog("for-datamode-regions");
			data.setValue(i,0,$(regions[i]).find("name").text());
			data.setValue(i,1,parseInt($(regions[i]).find("count").text()));
			data.setValue(i,2,$(regions[i]).find("fullname").text());	
		}
		
	}
	consoleLog("Drawing Map");
	geomap.draw(data, options);
}

/* module startGoogleMap(object) */
function startGoogleMap(xml){
	//geocode region and set center
	
	if(options['region'] == 'US-WA') options['regionname'] = options['regionname'] + " State";//workaround for us-wa, google was sending wa to dc
	
	consoleLog("Geocoding Region "+options['region']+" aka "+options['regionname']);
	consoleLog(options['region'].split("-")[0]);
	var geoCodeRegion = (options['regionname'].length>0 ? options['regionname'] + ", " + options['region'].split("-")[0] : options['region']);
	
	if(geoCodeRegion=="Ontario, CA"){
		geoCodeRegion="Ontario, Canda";
	}	
	consoleLog("GeocodeRegion:"+geoCodeRegion);
	
	geocoder = new google.maps.Geocoder();
	geocoder.geocode( { 'address': geoCodeRegion }, function(results, status){
	  if (status == google.maps.GeocoderStatus.OK){
		consoleLog("Region GeoCode Results:"+results[0].geometry.location);
		drawGoogleMapFromGeoMapXML(xml,results[0].geometry.location);
	  }else{
		alert("Error: Unable to geocode region");
		handleGeoZoomOut();
		return;//exit
	  }	  
	});
	
}

/* module drawGoogleMapFromGeoMapXML(object) */
function drawGoogleMapFromGeoMapXML(xml,centerpoint){

	consoleLog("Creating Google Map");
	geomapContainer.innerHTML="<img src='{skinLoc}/images/loading.gif'/>";
	
	//get country iso
	var country = options['region'].split("-")[0];
	consoleLog(country);
	
	//set defaut zoom level
	var zoomLevel = 5;
	switch(country){//override default zoom level for certain countries
		case "US":
		zoomLevel = 7;
		break;
		case "GB":
		zoomLevel = 5;
		break;
		case "CA":
		zoomLevel = 4;
		break;
	}
	
	//get map options and create map
	var mapOptions = {
		zoom: zoomLevel,
		center:centerpoint,
		mapTypeControl: true,
		mapTypeControlOptions: {
			style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
		},
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		navigationControl: true,
		navigationControlOptions: {
			style: google.maps.NavigationControlStyle.SMALL
		}
	};	
	geomap = new google.maps.Map(geomapContainer,mapOptions);		


	//for each region found
	consoleLog("Setting Icon Color to "+options['geomapcolor']);
	var image = "http://chart.apis.google.com/chart?cht=mm&chs=24x32&chco=FFFFFF,"+options['geomapcolor']+",000000&ext=.png";		
	var regions = $(xml).find("region");

	//add markers
	var markers = [];
	for(var i=0;i<regions.length;i++){
	  var latLng = new google.maps.LatLng(Number($(regions[i]).find("lat").text()),Number($(regions[i]).find("lng").text()));
	  var storeId = $(regions[i]).find("storeid").text();
	 
	  var marker = new google.maps.Marker({ position: latLng });
	  
	  markers.push(marker);
	  consoleLog($(regions[i]).find("message").text());
	  addInfoWindow(marker,$(regions[i]).find("message").text());
	  
	}
	var markerCluster = new MarkerClusterer(geomap, markers);
	
	//add zoom out event
	google.maps.event.addListener(geomap, 'zoom_changed', function(event) {
		var currentZoomLevel = geomap.getZoom();
		consoleLog("Current Zoom Level: "+currentZoomLevel);
		if(currentZoomLevel < zoomLevel){
			consoleLog("Loading GeoMap");
			options['region'] = regionHistory.pop();
			consoleLog('loading region: '+options['region']);
			var regiontype = regionTypeHistory.pop();
			consoleLog('loading region type: '+regiontype);
			resetGeoMap();
			fetchLoadMapRegionData(options['region'],regiontype);//markers currently not supported
		}
	});	

	  
}

function addInfoWindow(marker,message){
	var infowindow = new google.maps.InfoWindow({ 
		content: message
	});
	google.maps.event.addListener(marker, 'click', function() {
		infowindow.open(geomap,marker);
	});	
}

 
