//line drawing attributes
var strokeColor = '#000000';
var strokeWeight = '2';
var strokeOpacity = '0.5';
var fillOpacity = '0.6';

//map, color, and icon variables
var map = null;
var geocoder = null;
var markerManager = null;
var fillColorMap = new Object();
var iconMap = new Object();
var populationMap = new Object(); //maps owners to populations
var ownerDataLoaded = false;
var kspMap = new Object();
var kspLastUpdatedDate = null;
var kspMapLoaded = false;
var neighborhoodKspMap = new Object();
var ownerMap = new Object();//maps neighborhoods to owners
var iconHeight = 24;
var iconWidth = 24;
//state variables for creating/editing a new region
var key = 'o07226014146959570790.6310514504095576739';
var worksheetId='od6';
var token=null;

var alertCounter = 0;
function getFillColorForOwner(ownerName) {
  return fillColorMap[ownerName];
}

/* adds a polygon and a marker to the map representing the neighborhood described by the hoodElement xml element. */
function addNeighborhoodData(hoodElement, strokeColor, strokeWeight, strokeOpacity, fillOpacity) {
	var pointElements = hoodElement.getElementsByTagName("glatlng");
	var helpFlag = hoodElement.getAttribute("help");
                 
    //sum the x and y for use in centering the marker later
	var latTotal = 0;
	var lngTotal = 0;
                 
    //create an array of all the points in the polygon for this neighborhood
	var polygonPoints = [];
	for (var j = 0; j < pointElements.length; j = j + 1) {
		var pointElement = pointElements.item(j);
		var lat = parseFloat(pointElement.getAttribute("lat"));
		latTotal += lat;
		var lng = parseFloat(pointElement.getAttribute("lng"));
		lngTotal += lng;
		var gpoint = new GLatLng(lat, lng);
		polygonPoints.push(gpoint);
	}

    //create and add the polygon
	var hoodName = hoodElement.getAttribute("neighborhoodName");
	var ownerName = ownerMap[hoodName];
	var fillColor =  getFillColorForOwner(ownerName);
	
	var gpoly = new GPolygon(polygonPoints, strokeColor, strokeWeight, strokeOpacity, fillColor, fillOpacity);
	map.addOverlay(gpoly);

	//add region marker
	var ksp = neighborhoodKspMap[hoodName];
	
	var markerLat = latTotal / pointElements.length;
	var markerLng = lngTotal / pointElements.length;
	var hoodMarkerPoint = new GLatLng(markerLat, markerLng);
	var hoodIcon = new GIcon();
	
	hoodIcon.image = iconMap[ownerName];
	hoodIcon.shadow = G_DEFAULT_ICON.shadow;
	hoodIcon.iconSize = new GSize(iconHeight, iconWidth);
	hoodIcon.shadowSize = new GSize(1, 1);
	hoodIcon.iconAnchor = new GPoint(6, 24);
	hoodIcon.infoWindowAnchor = new GPoint(5, 1);
	
	var hoodMarkerOpts = new Object();
	hoodMarkerOpts["title"] = hoodName + ", "+ksp+" KSP";
	hoodMarkerOpts["icon"] = hoodIcon;
	var hoodMarker = new GMarker(hoodMarkerPoint, hoodMarkerOpts);
	GEvent.addListener(hoodMarker, "click", function () {
		imgHtml = "<img align='left' src='" + hoodIcon["image"] + "' />";
		hoodMarker.openInfoWindowHtml(imgHtml + hoodName + ",<br /> " + ownerName+"<br /> KSP: "+ksp);
	});
	markerManager.addMarker(hoodMarker, 10);
}
function getKsp() {
   uri = "http://spreadsheets.google.com/feeds/list/o07226014146959570790.6310514504095576739/od6/public/values?alt=json-in-script&callback=kspCallback"; 
   var script = document.createElement('script');
   script.setAttribute('src', uri);
   script.setAttribute('id','jsonScript');
   script.setAttribute('type','text/javascript');
   document.documentElement.firstChild.appendChild(script);;
}

function kspCallback(json) {
  var feed = json.feed;
  kspLastUpdatedDate = feed.updated.$t.substring(0,10);
  for(i=0;i<feed.entry.length;i++){
    var entry = feed.entry[i];
    var neighborhood = entry.gsx$neighborhood.$t;
    var ownerName = entry.gsx$owner.$t;
    var ksp = entry.gsx$ksps.$t;
    updateKspMaps(neighborhood, ownerName, ksp);
  }
  kspMapLoaded = true;
}

function addPointsOfInterest() {
   uri = "http://spreadsheets.google.com/feeds/list/o07226014146959570790.6310514504095576739/oda/public/values?alt=json-in-script&callback=poiCallback";
   var script = document.createElement('script');
   script.setAttribute('src', uri);
   script.setAttribute('id', 'poiScript');
   script.setAttribute('type','text/javascript');
   document.documentElement.firstChild.appendChild(script);
}

function poiCallback(json) {
  var feed = json.feed;
  for(i=0;i<feed.entry.length;i++){
    var entry = feed.entry[i];
    var name = entry.gsx$name.$t;
    var lat = entry.gsx$latitude.$t;
    var lng = entry.gsx$longitude.$t;
    var desc = entry.gsx$description.$t;

    var point = new GLatLng(lat,lng); 
    var markerOpts = new Object();
    markerOpts["title"] = name;
    var marker = new GMarker(point, markerOpts);
    GEvent.addListener(marker, "click", function () {
        marker.openInfoWindowHtml(desc);
    });

    markerManager.addMarker(marker, 10);
  } 
}

function loadOwnerData() {
   uri = "http://spreadsheets.google.com/feeds/list/o07226014146959570790.6310514504095576739/od5/public/values?alt=json-in-script&callback=ownerCallback";
   var script = document.createElement('script');
   script.setAttribute('src', uri);
   script.setAttribute('id','ownerScript');
   script.setAttribute('type','text/javascript');
   document.documentElement.firstChild.appendChild(script);
}

function ownerCallback(json) {
   var feed = json.feed;
   for (i=0; i<feed.entry.length; i++) {
      var ownerEntry = feed.entry[i];
      var ownerName = ownerEntry.gsx$ownername.$t;
      var fillColor = ownerEntry.gsx$fillcolor.$t;
      fillColorMap[ownerName] = fillColor;
      var iconName = ownerEntry.gsx$iconurl.$t;
      iconMap[ownerName] = iconName;
      var population = ownerEntry.gsx$population.$t;
      populationMap[ownerName]=population;
   }
   ownerDataLoaded = true;
}

/* updates the kspMap hashes for owner/ksp and neighborhood/ksp */
function updateKspMaps(neighborhood, ownerName, ksp) {
    var kspTotal = kspMap[ownerName];
    if (kspTotal == null) {
        kspTotal=0;
    }
    var kspInt = parseInt(ksp);
    kspTotal = kspTotal + parseInt(ksp);    
    kspMap[ownerName] = kspTotal;
    ownerMap[neighborhood] = ownerName;
    neighborhoodKspMap[neighborhood] = ksp;
}

function writeKspLegend() {
	var legendElement = document.getElementById('legend');
	var legendHtml = "<table><tr><th>color</th><th>name</th><th>total ksps</th><th>population</th><th>feeding modifier</th></tr>";
	for (var ownerName in kspMap) {
	    var ksps = kspMap[ownerName];
	    var population = populationMap[ownerName];
	    legendHtml += "<tr>";
	    legendHtml += "<td bgcolor="+ getFillColorForOwner(ownerName)+" align='center'>"
	    	+ "<img src="+iconMap[ownerName]
	    	+" alt='"+ownerName+"' "
	    	+" width='"+iconWidth+"' "
	    	+" height='"+iconHeight+"' "
	    	+"/></td>";
	    legendHtml += "<td>"+ownerName+"</td>";
	    legendHtml += "<td>"+ksps+"</td>";
	    legendHtml += "<td>"+population+"</td>";
	    legendHtml += "<td>"+getModifier(ksps, population)+"</td>";
	    legendHtml += "</tr>";
	}
	legendHtml += "</table>";
	legendHtml += "<span>Last Updated: "+kspLastUpdatedDate+"</span>";
	legendElement.innerHTML = legendHtml;
}

function getModifier(ksps, population) {
   //-1 for every 20 you're short, +1 for every 20 you're over.
   var kspsNeeded = population * 10;
   var modifier=0;
   if (ksps == kspsNeeded) {
      modifier = 0;
   } else if (ksps < kspsNeeded) {
      var kspCounter = ksps;
      while (kspCounter < kspsNeeded) {
         modifier--;
	 kspCounter += 20;
      }
   } else {
      var kspCounter = kspsNeeded+20;
      while (ksps >= kspCounter) {
         modifier++;
	 kspCounter += 20;
      }
   }
   return modifier;
}

function getURLParam(strParamName){
  var strReturn = null;
  var strHref = window.location.href;
  if ( strHref.indexOf("?") > -1 ){
    var strQueryString = strHref.substr(strHref.indexOf("?"));
    var aQueryString = strQueryString.split("&");
    for ( var iParam = 0; iParam < aQueryString.length; iParam++ ){
       if (
          aQueryString[iParam].indexOf(strParamName + "=") > -1 ){
          var aParam = aQueryString[iParam].split("=");
          strReturn = aParam[1];
          break;
       }
    }
    strReturn = unescape(strReturn);
   }
   return strReturn;
}
function getAuthSubToken() {
//maybe rework the proxy for https?

  var url = 'http://www.zipwow.net/emeraldChronicles/mapTesting/authProxy.php?path=accounts/AuthSubToken';
  //need to set authorization header too
  var request = GXmlHttp.create();
  request.open("GET",url,false);
  request.setRequestHeader('Authorization','AuthSub token="'+token+'"');
  request.onreadystatechange=function() {
     if (request.readystate==4) {
       //alert("readystate4");
     }
  };
  request.send(null);
}

function dontresizeMap(){ 
   var mapDiv = document.getElementById("map"); 
   var windowHeight;
   var windowWidth;
   if (typeof(window.innerHeight)=="undefined") {
     var windowHeight = document.body.clientHeight;
     var windowWidth = document.body.clientWidth;
   } else {
      windowWidth = window.innerWidth; 
      windowHeight = window.innerHeight;
   }
   windowHeight = windowHeight-60; 
   windowWidth = windowWidth - 430;
   mapDiv.style.height = windowHeight + "px";  
   mapDiv.style.width = windowWidth +"px";
}

function load() {
   token = getURLParam('token');
   if (token != null) {
      getAuthSubToken();
   }
   //resizeMap();
   drawMap();
   getKsp();
   loadOwnerData();
   addPointsOfInterest();
   waitForLoad();
}
function waitForLoad() {
   if (kspMapLoaded && ownerDataLoaded) {
      loadPolygons();
      writeKspLegend();
   } else {
      setTimeout("waitForLoad()",20);
   }
}

function loadPolygons() {
   // load the polygons.xml file
   var request = GXmlHttp.create();
   request.open("GET", "polygons.xml?" + Math.random(), true);
   request.onreadystatechange = function () {
      if (request.readyState == 4) {
         //add neighborhood data
         var rootElement = request.responseXML.documentElement;
         var neighborhoodElements = rootElement.getElementsByTagName("neighborhood");
         for (var i = 0; i < neighborhoodElements.length; i = i + 1) {
            var hoodElement = neighborhoodElements[i];
            addNeighborhoodData(hoodElement, strokeColor, strokeWeight, strokeOpacity, fillOpacity);
         }
      }
   };
request.send(null);
}

function drawMap() {
   if (GBrowserIsCompatible()) {
        geocoder = new GClientGeocoder();
        map = new GMap2(document.getElementById("map"));
	var center = new GLatLng(47.60721111111111, -122.33008611111111);
	map.setCenter(center, 13);
	//map.addControl(new GLargeMapControl());
	//map.addControl(new GMapTypeControl());
	//map.addControl(new GOverviewMapControl());
    map.setUIToDefault();
	map.setZoom(9);
	markerManager = new GMarkerManager(map);

	//add polygon drawing		
	GEvent.addListener(map, "click", this.doClick);
   }
}
function showAddress(address) {
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
        alert(address + " not found");
      } else {
        map.setCenter(point, 13);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(address);
      }
    }
  );
}

