var map;
var gmarkers = [];
var gmarkersLength = 0;
var iconTiny, iconOrange, iconDefault;
var labelState;
var centerLatitude, centerLongitude, startZoom, centerLatLng;
var selectedStatePos = -1;
var key;
var isMarkersUpdated = 0;

$(document).ready(function(){
                           
   if (GBrowserIsCompatible()) {
      centerLatitude = 30;
      centerLongitude = -96;
      startZoom = 5;
      centerLatLng = new GLatLng(centerLatitude, centerLongitude);
      map = new GMap2(document.getElementById("gmap-canvas"), {
         suppressCopyright: false,
         logoPassive: true
      });
      map.setCenter(centerLatLng, startZoom);
      map.addControl(new GSmallMapControl());
      map.addControl(new GScaleControl());
      map.addControl(new GMapTypeControl());
      //map.enableScrollWheelZoom();
  
      var iconDefault = new GIcon(G_DEFAULT_ICON);
      iconDefault.shadow = "http://www.google.com/mapfiles/shadow50.png";
      iconDefault.iconSize = new GSize(20, 34);
      iconDefault.shadowSize = new GSize(37, 34);
      iconDefault.iconAnchor = new GPoint(9, 34);
      iconDefault.infoWindowAnchor = new GPoint(9, 2);

      iconTiny = new GIcon();
      iconTiny.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
      iconTiny.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
      iconTiny.iconSize = new GSize(12, 20);
      iconTiny.shadowSize = new GSize(22, 20);
      iconTiny.iconAnchor = new GPoint(6, 20);
      iconTiny.infoWindowAnchor = new GPoint(5, 1);
	
      iconOrange = new GIcon();
      iconOrange.image = "http://google.com/mapfiles/ms/micons/orange.png";
      iconOrange.iconSize = new GSize(32, 32);
      iconOrange.iconAnchor = new GPoint(15, 32);
	
      for(id in listMarkers) {
		createMarker(listMarkers[id], id);
      }
    
      gmarkersLength = gmarkers.length;

      labelState = new ELabel(new GLatLng(41.8,-97.5), null, "tooltipstate", new GSize(-20,8));
      map.addOverlay(labelState);
      labelState.hide();

      //objStates  key: [GPolygon, label, color, [centerLat, centerng], numOfTotalMarkersInside, [MarkersInsideIDs]]
      //objStates  key: [GPolygon(Points, color, 1, 0.7, color, 0.2), label, color, [center_lat, center_lng], numOfTotalMarkersInside, [MarkersInsideIDs] ]
    
      for (key in objStates) {
         map.addOverlay(objStates[key][0]);
         objStates[key][0].itemId = key;

         GEvent.addListener(objStates[key][0],'mouseover', function(){
            labelState.setPoint(new GLatLng(objStates[this.itemId][3][0], objStates[this.itemId][3][1]));
            labelState.setContents('Click for '+objStates[this.itemId][1]+'<br />affiliated doctors ('+objStates[this.itemId][4]+')');
            labelState.show();
            this.setStrokeStyle({
               color:'#f6ff00',
               weight:3,
               opacity:1
            });
         });

         GEvent.addListener(objStates[key][0], 'mouseout', function(){
            labelState.hide();
            this.setStrokeStyle({
               color:objStates[this.itemId][2],
               weight:1,
               opacity:0.7
            });
         });
		
         GEvent.addListener(objStates[key][0], 'click', function(point){
            zoomToPoly(this.itemId, true);
         });

      }


      GEvent.addListener(map,'zoomend',function() {
         updateMarkers();
      });
      GEvent.addListener(map,'moveend',function() {
         updateMarkers();
      });
 

   }
   else {
      alert("Sorry, the Google Maps API is not compatible with this browser");
   }
  

});




// objMarker [ 0:id, 1:name, 2:address, 3:phone, 4:fax, 5:state, 6:zip, 7:lat, 8:lng, 9:[docs] ]
function createMarker(objMarker, id) 
{
   var point = new GLatLng(objMarker[7], objMarker[8]);
   var marker = new GMarker(point, { icon:iconTiny, title:objMarker[1], hide:false });
   
   var zoomlevelcur;
	  
   var infoWindowHtml = '';
   if(objMarker[1] != "") { infoWindowHtml += '<h3>'+objMarker[1]+'</h3>'; }
   infoWindowHtml += '<p>';
   infoWindowHtml += objMarker[2]+ '<br />';
   if(objMarker[3] != "") { infoWindowHtml += 'Phone: '+objMarker[3]+'<br />'; }
   if(objMarker[4] != "") { infoWindowHtml += 'Fax: '+objMarker[4]; }
   infoWindowHtml += '</p>';
   
   infoWindowHtml += '<p>';
   if(objMarker[9]) {
	   var docid;
	   for(docidKey in objMarker[9]) { 
			docid = objMarker[9][docidKey];
			infoWindowHtml += listDocs[docid][0]+ ' '+listDocs[docid][1] + '<br />';
	   }
   }
   infoWindowHtml += '</p>'; 

   marker.state = objMarker[5].toLowerCase();
    
   var focusPoint = function() {
      marker.openInfoWindowHtml('<div class="gmap_infowindow">' + infoWindowHtml + '</div>', { maxWidth:300 });
      return false;
   }
    
   marker.zoommarker = focusPoint;
   marker.state = objMarker[5].toLowerCase(); 
		
		
   GEvent.addListener(marker, 'click', function() {
      zoomlevelcur = map.getZoom();
      if(zoomlevelcur < 16) {
         map.setCenter(point, (zoomlevelcur+2));
      } else if(zoomlevelcur < 17) {
         map.setCenter(point, (zoomlevelcur+1));
      } else {
         map.panTo(point);
      }
   });
	
   GEvent.addListener(marker, 'mouseover', focusPoint);
   
   map.addOverlay(marker);
    
   //gmarkers.push(marker);
   gmarkers[id] = marker;
   marker.hide();
}



function reset_gmap()
{
   

   selectedStatePos = -1;
   map.closeInfoWindow();
   labelState.hide();
   map.setCenter(centerLatLng, startZoom);

   for (key in objStates) { objStates[key][0].show(); }
   for (var i=0; i<gmarkersLength; i++) { gmarkers[i].hide(); }   
}


function zoomToPoly(pos, setCenter)
{

   selectedStatePos = pos;
   map.closeInfoWindow();
   labelState.hide();
   isMarkersUpdated = -2;
   
   var isStateVisible = false;
   for (key in objStates) {
	  if(isStateVisible) { continue; }
      if(key != pos) {
         objStates[key][0].show();
      } else {
         objStates[key][0].hide();
		 isStateVisible = true;
      }
   }

   for (var i=0; i<gmarkersLength; i++) {
      if (gmarkers[i].state == pos) {
         gmarkers[i].show();
      } else {
         gmarkers[i].hide();
      }
   }
   
   if(setCenter) {
      var bounds = objStates[pos][0].getBounds();
      map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
   }
}


function zoomToMarker(pos)
{
   zoomToPoly((listMarkers[pos][5]).toLowerCase(), false);
   map.setCenter(new GLatLng(listMarkers[pos][7], listMarkers[pos][8]), 17);
   gmarkers[pos].zoommarker();
}


function updateMarkers()
{
   if(isMarkersUpdated < 0) {
      isMarkersUpdated++;
      return(true);
   }
   
   var isStateVisible = false;
	
   if(map.getZoom() > 4){
      var mapbounds = map.getBounds();
      var itemBounds;
      var visibleStates = [];
      
      if(selectedStatePos > -1) { visibleStates.push(selectedStatePos); }
    
      for (key in objStates) {
         //if(key == selectedStatePos) { continue; }
         itemBounds = objStates[key][0].getBounds();

         isStateVisible = (mapbounds.containsBounds(itemBounds) || itemBounds.containsBounds(mapbounds)) ? true : false;
         if(!isStateVisible){
            if(map.getZoom() > 6) {
                isStateVisible = (mapbounds.intersects(itemBounds)) ? true : false;
            }
         }

         if(isStateVisible) {
			 
            visibleStates.push(key);
			
            if(selectedStatePos != key) {
				objStates[key][0].hide();
            }
         } else {
            objStates[key][0].show();
         }
      }



      for (var nm=0; nm<gmarkersLength; nm++) {
            var isMarkerInVisibleState=false;
            for(var ns=0;ns<visibleStates.length;ns++){
              if(gmarkers[nm].state == visibleStates[ns]){
                isMarkerInVisibleState=true;
                break;
              }
            }        
            if (isMarkerInVisibleState) {
                gmarkers[nm].show();
            } else {
                gmarkers[nm].hide();
            }
        }



  
   }
}


window.onunload = GUnload;