var geocoder;
var tcMap;
var tcOpenInfowindow;
var bounds = new google.maps.LatLngBounds();
var markerZIndex;
var locationURL = "";
var imgSrc = "";
var loisUsername = "TechCorridor";
var tooltipOpen = false;
var unHoverPending;
var point;
var xmlhttp;
var jsonResult;

function tcLocation(key) {
  this.markers = [];
  this.key = key;
}

function tcArea(key) {
  this.markers = [];
  this.polygons = [];
  this.key = key;
}

// Create Locations with Spreadsheet Key
tcBldgCommercial = new tcLocation("ta-8Y4Gu6gWXHsphgVmrS9Q");
tcBldgIndustrial = new tcLocation("tuhdXqFgGaf7bVmZcQBXi2Q");
tcSitesCommercial = new tcLocation("tgrqGmssC-DQDiPgZt42OBg");
tcSitesIndustrial = new tcLocation("tXPksWlgcYH-EPAmEMnZC1Q");

// Clusters
tcManufacturing = new tcLocation("tffuGb4bWQTy17v0hgpgLoA");
tcBiotech = new tcLocation("tRnrFt8u0Jpq7jeiOgMrT-g");
tcIngredient = new tcLocation("tzLAsZBBCUtAIzfPZP_9MsQ");
tcEduservices = new tcLocation("tTHW6MuFZKX8_c0IcvDKz_Q");
tcElectronics = new tcLocation("tnVv9Fli4wjnopC2T-6h_1g");
tcFood = new tcLocation("tA4NKBcGA2YeHJbrHcqnPCg");
tcIt = new tcLocation("t9NZtATfwkjIUmtqM6EcoCA");
tcInsurance = new tcLocation("t2Q0DMjksv0S4GXAdlIP9iQ");
tcLogistics = new tcLocation("tRPFMHZtkTnMRNL8UD4PcHg");
tcEnergy = new tcLocation("tPoc3LQLQV7s_3qIPWW0iVg");

// Create Areas with Spreadsheet Key
tcTif = new tcArea("tB9AGYT4N4qqeT8LfYATnkw");

var wsId = "od6";
var titleColumn = "title";
var loisID = "loisid";
var groupColumn = "group";
var descriptionColumn = "description";

var streetColumn = "street";
var cityColumn = "city";
var stateColumn = "state";
var zipColumn = "zip";

var employeesColumn = "employees";

var geocode1Column = "geocode1";
var geocode2Column = "geocode2";
var geocode3Column = "geocode3";
var geocode4Column = "geocode4";
var geocode5Column = "geocode5";
var geocode6Column = "geocode6";
var geocode7Column = "geocode7";
var geocode8Column = "geocode8";
var geocode9Column = "geocode9";
var geocode10Column = "geocode10";
var geocode11Column = "geocode11";
var geocode12Column = "geocode12";
var geocode13Column = "geocode13";
var geocode14Column = "geocode14";
var geocode15Column = "geocode15";
var geocode16Column = "geocode16";
var geocode17Column = "geocode17";
var geocode18Column = "geocode18";
var geocode19Column = "geocode19";
var geocode20Column = "geocode20";
var geocode21Column = "geocode21";
var geocode22Column = "geocode22";
var geocode23Column = "geocode23";
var geocode24Column = "geocode24";
var geocode25Column = "geocode25";
var geocode26Column = "geocode26";
var geocode27Column = "geocode27";
var geocode28Column = "geocode28";
var geocode29Column = "geocode29";
var geocode30Column = "geocode30";
var geocode31Column = "geocode31";
var geocode32Column = "geocode32";
var geocode33Column = "geocode33";
var geocode34Column = "geocode34";
var geocode35Column = "geocode35";
var geocode36Column = "geocode36";
var geocode37Column = "geocode37";
var geocode38Column = "geocode38";
var geocode39Column = "geocode39";
var geocode40Column = "geocode40";

function initialize() {
  geocoder = new google.maps.Geocoder();
  var tcLatlng = new google.maps.LatLng(41.843269, -91.60053);
  var tcOptions = {
    zoom: 10,
    center: tcLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  tcMap = new google.maps.Map(document.getElementById("tcMap"), tcOptions);
}

tcLocation.prototype.toggle = function() {
  if (this.markers.length < 1)
    tcGetJSON(this.key);
  for (var mark in this.markers) {
    this.markers[mark].setVisible(this.markers[mark].visible ? false : true);
  }
}

tcArea.prototype.toggle = function() {
  if (this.markers.length < 1) {
    tcGetJSON(this.key);
  } else {
    for (var mark in this.markers) {
      this.markers[mark].setMap(null);
      this.polygons[mark].setMap(null);
    }
    this.markers.length = 0;
    this.polygons.length = 0;
  }
}

function toggleBox(element,openElement) {
  //document.getElementById(element).className = document.getElementById(element+'Checkbox').checked ? 'checked' : '';
  
  document.getElementById(element).className = document.getElementById(element).className == '' ? 'open' : '';
  document.getElementById(openElement).style.display = document.getElementById(openElement).style.display == 'block' ? 'none' : 'block';
}

function tcGetJSON(key) {
  
  document.getElementById('loading').style.display = 'block';

  // Retrieve the JSON feed.
  var script = document.createElement('script');

  script.setAttribute('src', 'http://spreadsheets.google.com/feeds/list'
                         + '/' + key + '/' + wsId + '/public/values' +
                        '?alt=json-in-script&callback=tcLoadMap');
  script.setAttribute('id', 'jsonScript');
  script.setAttribute('type', 'text/javascript');
  document.documentElement.firstChild.appendChild(script);
}

function print_r(theObj){
  if(theObj.constructor == Array ||
     theObj.constructor == Object){
    document.write("<ul>")
    for(var p in theObj){
      if(theObj[p].constructor == Array||
         theObj[p].constructor == Object){
document.write("<li>["+p+"] => "+typeof(theObj)+"</li>");
        document.write("<ul>")
        print_r(theObj[p]);
        document.write("</ul>")
      } else {
document.write("<li>["+p+"] => "+theObj[p]+"</li>");
      }
    }
    document.write("</ul>")
  }
}

function tcLoadMap(json) {
  
  //alert(json.feed.entry.length);
  
  for (var i = 0; i < json.feed.entry.length; i++) {
    
    var entry = json.feed.entry[i];
    var marker;
    var group = entry["gsx$" + groupColumn].$t;
    
    var polyCoords = [];
    var polygon;
    
    locationURL = "";
    
    var html = "<div class=\"infobox\" onMouseOver=\"divHover()\" onMouseOut=\"divHoverOut()\">";
    
    // If LOIS ID is specified, try to link it to the correct LOIS page
    
    if(entry["gsx$" + loisID] && entry["gsx$" + loisID].$t != "") {
      
      // Building or Site?
      var imgType = "16"; // LOIS image type for buildings
      var loisGroup = "building";
      
      if (group.indexOf("sites") >= 0) {
        imgType = "32"; // LOIS image type for sites
        loisGroup = "site";
      }
      
      locationURL = 'http://www.locationone.com/lois/logon.do?username=' + loisUsername +'&appsection=' + loisGroup + 's&' + loisGroup +'_id=' + entry["gsx$"+loisID].$t;
      imgSrc = "https://secure.locationone.com/LocationOneWebService/filedownload?type=" + imgType +"&id=" + entry["gsx$"+loisID].$t + "&seq=1";
    }
    
    html += "<p class=\"title\">";
    if(locationURL != "") html += '<a href="' + locationURL + '" target="blank">'; // Add LOIS link to title
    html += entry["gsx$"+titleColumn].$t;
    if(locationURL != "") html += '</a>'; // Close LOIS link
    html += "</p>";
    
    // var label = entry["gsx$"+titleColumn].$t;
    
    // Setup Full Address
    
    if(entry["gsx$" + streetColumn] && entry["gsx$" + streetColumn].$t != "") {
      var address = entry["gsx$"+streetColumn].$t.rtrim() + ', ' + entry["gsx$"+cityColumn].$t.rtrim() + ', IA';
      if (entry["gsx$"+zipColumn] && entry["gsx$"+zipColumn].$t != "") { address += ' ' + entry["gsx$"+zipColumn].$t.rtrim(); }
      address += ', USA';
      var urlAddress = address.replace(/\s/g,"%20");
    
      if(address != "") {
        html += "<p class=\"address\">" + address + "</p>";
      }
    }
    
    if(entry["gsx$" + employeesColumn] && entry["gsx$" + employeesColumn].$t != "") {
      html += "<p>Employees: " + entry["gsx$"+employeesColumn].$t + "</p>";
    }
    
    if(imgSrc != "" && (group.indexOf("bldg") >= 0 || group.indexOf("sites") >= 0)) {
      html += "<img src=\"" + imgSrc + "\" width=\"150\" height=\"100\" />";
    }
    
    if(entry["gsx$" + descriptionColumn] && entry["gsx$" + descriptionColumn].$t != "") {
      html += "<p>" + entry["gsx$"+descriptionColumn].$t + "</p>";
    }
    
    if(locationURL != "") {
      html += '<p><a href="' + locationURL + '" target="blank">More Information (LOIS)</a></p>';
    }
    
    html += "<div class=\"clear\"></div></div>";
    // GEOCODE
    if (entry["gsx$" + geocode1Column] && entry["gsx$" + geocode1Column].$t != "") {
      
      if (group == 'tif') { // Polygon Area
        var polys = [ entry["gsx$" + geocode1Column].$t.split(","),
                      entry["gsx$" + geocode2Column].$t.split(","),
                      entry["gsx$" + geocode3Column].$t.split(","),
                      entry["gsx$" + geocode4Column].$t.split(","),
                      entry["gsx$" + geocode5Column].$t.split(","),
                      entry["gsx$" + geocode6Column].$t.split(","),
                      entry["gsx$" + geocode7Column].$t.split(","),
                      entry["gsx$" + geocode8Column].$t.split(","),
                      entry["gsx$" + geocode9Column].$t.split(","),
                      entry["gsx$" + geocode10Column].$t.split(","),
                      entry["gsx$" + geocode11Column].$t.split(","),
                      entry["gsx$" + geocode12Column].$t.split(","),
                      entry["gsx$" + geocode13Column].$t.split(","),
                      entry["gsx$" + geocode14Column].$t.split(","),
                      entry["gsx$" + geocode15Column].$t.split(","),
                      entry["gsx$" + geocode16Column].$t.split(","),
                      entry["gsx$" + geocode17Column].$t.split(","),
                      entry["gsx$" + geocode18Column].$t.split(","),
                      entry["gsx$" + geocode19Column].$t.split(","),
                      entry["gsx$" + geocode20Column].$t.split(","),
                      entry["gsx$" + geocode21Column].$t.split(","),
                      entry["gsx$" + geocode22Column].$t.split(","),
                      entry["gsx$" + geocode23Column].$t.split(","),
                      entry["gsx$" + geocode24Column].$t.split(","),
                      entry["gsx$" + geocode25Column].$t.split(","),
                      entry["gsx$" + geocode26Column].$t.split(","),
                      entry["gsx$" + geocode27Column].$t.split(","),
                      entry["gsx$" + geocode28Column].$t.split(","),
                      entry["gsx$" + geocode29Column].$t.split(","),
                      entry["gsx$" + geocode30Column].$t.split(","),
                      entry["gsx$" + geocode31Column].$t.split(","),
                      entry["gsx$" + geocode32Column].$t.split(","),
                      entry["gsx$" + geocode33Column].$t.split(","),
                      entry["gsx$" + geocode34Column].$t.split(","),
                      entry["gsx$" + geocode35Column].$t.split(","),
                      entry["gsx$" + geocode36Column].$t.split(","),
                      entry["gsx$" + geocode37Column].$t.split(","),
                      entry["gsx$" + geocode38Column].$t.split(","),
                      entry["gsx$" + geocode39Column].$t.split(","),
                      entry["gsx$" + geocode40Column].$t.split(",") ];
        
        var count = 0;
        var points = [0.0,0.0];
        
        for (var j = 0; j < polys.length; j++) {
          if (polys[j][0]) {
            polyCoords.push(new google.maps.LatLng(parseFloat(polys[j][0]), parseFloat(polys[j][1])));
            points[0] += parseFloat(polys[j][0]);
            points[1] += parseFloat(polys[j][1]);
            count++;
          }
        }
        // Get the average for the map marker
        point = new google.maps.LatLng((points[0]/count).toFixed(5), (points[1]/count).toFixed(5));
        
      } else { // Just a point
        
        var points = entry["gsx$" + geocode1Column].$t.split(",");
        point = new google.maps.LatLng(parseFloat(points[0]), parseFloat(points[1]));
        
      }
      
    } else { // Need to geocode, but we can't do this right now.
      alert('Needs Geocoding.');
      /*
      //wait(150); // Sets a delay so we don't wear out our Geocoding API Welcome
      point = null;
      // Get the points, set bounds to Tech Corridor region
      xmlhttp = new XMLHttpRequest();
      xmlhttp.open("GET", "http://maps.google.com/maps/api/geocode/xml?address="+urlAddress+"&bounds=40.867834,-92.570801|42.508552,-90.637207&region=US&sensor=false",false);
      xmlhttp.send(null);
      alert('chilis');
      eval("jsonRequest = ("+xmlhttp.responseText+")");
      alert(jsonRequest.status);
      
      var pointLat = jsonRequest.results[0].geometry.location.lat;
      var pointLng = jsonRequest.results[0].geometry.location.lng;
      alert('parsed geocode');
      point = new google.maps.LatLng(parseFloat(pointLat), parseFloat(pointLng));
      */
    }
    
    if (polyCoords.length > 0) {
      polygon = tcCreatePoly(tcMap,polyCoords,html,group);
      bounds.extend(polygon.getPath().getAt(0));
    }
    marker = tcCreateMarker(tcMap,point,html,group);
    bounds.extend(point);
    
    switch (group) {
      case 'bldgCommercial':
        tcBldgCommercial.markers.push(marker);
        break;
      case 'bldgIndustrial':
        tcBldgIndustrial.markers.push(marker);
        break;
      case 'sitesCommercial':
        tcSitesCommercial.markers.push(marker);
        break;
      case 'sitesIndustrial':
        tcSitesIndustrial.markers.push(marker);
        break;
      case 'manufacturing':
        tcManufacturing.markers.push(marker);
        break;
      case 'biotech':
        tcBiotech.markers.push(marker);
        break;
      case 'ingredient':
        tcIngredient.markers.push(marker);
        break;
      case 'eduservices':
        tcEduservices.markers.push(marker);
        break;
      case 'electronics':
        tcElectronics.markers.push(marker);
        break;
      case 'food':
        tcFood.markers.push(marker);
        break;
      case 'it':
        tcIt.markers.push(marker);
        break;
      case 'insurance':
        tcInsurance.markers.push(marker);
        break;
      case 'logistics':
        tcLogistics.markers.push(marker);
        break;
      case 'energy':
        tcEnergy.markers.push(marker);
        break;
      case 'tif':
        tcTif.markers.push(marker);
        tcTif.polygons.push(polygon);
        break;
      default:;
    }
    
  }
  document.getElementById('loading').style.display = 'none';
  
  tcMap.fitBounds(bounds);
  if (tcMap.getZoom() > 12) tcMap.setZoom(12);
  tcMap.panTo(bounds.getCenter());
}

function tcCreateMarker(map, latlng, html, group) {
  var markerOptions = {
    position: latlng,
    map: map,
    icon: '/gallery/' + group + '.png',
    visible: true
  }
  var marker = new google.maps.Marker(markerOptions);
  marker.loc = locationURL;
  
  /*
  google.maps.event.addListener(marker, 'click', function() {
    var infowindow = new google.maps.InfoWindow({
        content: html
    });
    tcSetInfowindow(infowindow);
    infowindow.open(map, marker);
    marker.setIcon(markerImageOut);
  });
  */
  
  google.maps.event.addListener(marker, 'click', function() {
    if (locationURL != "") window.open(marker.loc);
  });
  
  google.maps.event.addListener(marker, 'mouseover', function() {
    if (unHoverPending) {
      clearTimeout(unHoverPending);
      unHover();
    }
    markerZIndex = marker.getZIndex();
    marker.setZIndex(9999);
    marker.setIcon('/gallery/' + group + '-over.png');
    Tip(html);
  });
  
  google.maps.event.addListener(marker, 'mouseout', function() {
    marker.setZIndex(markerZIndex);
    marker.setIcon('/gallery/' + group + '.png');
    divHoverOut();
  });
  
  return marker;
}

function tcCreatePoly(map, polyPaths, html, group) {
  
  var marker = new google.maps.Polygon({
    paths: polyPaths,
    strokeColor: "#dd3333",
    strokeOpacity: 0.8,
    strokeWeight: 2,
    fillColor: "#ff0000",
    fillOpacity: 0.20
  });
  
  marker.setMap(map);
  
  /*
  google.maps.event.addListener(marker, 'click', function() {
    if (locationURL) window.open(locationURL);
  });
  
  google.maps.event.addListener(marker, 'mousemove', function() {
    if (unHoverPending) clearTimeout(unHoverPending);
    Tip(html);
  
    // Need to figure out a way to set a "while mouse is over polygon" since mouseout will not work.
    // http://groups.google.com/group/google-maps-js-api-v3/browse_thread/thread/8a4137e71a1fe17b/994620a2eceda0c6?lnk=gst&q=polygon+mouseover#994620a2eceda0c6
  });*/
  
  return marker;
}

function divHover() {
  if (unHoverPending) clearTimeout(unHoverPending);
}

function divHoverOut() {
  unHoverPending = setTimeout("unHover()",150);
}

function unHover() {
  UnTip();
}

function tcSetInfowindow(newInfowindow) {
  if (tcOpenInfowindow != undefined) {
    tcOpenInfowindow.close();
  }
  tcOpenInfowindow = newInfowindow;
}

function wait(milsecs){
  var to_time = new Date().getTime() + milsecs;
  while( new Date().getTime() < to_time ){}
  return true;
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}
