var map;
var gmarkers = [];
var gmarkersLength = 0;
var iconTiny;
var labelState;

var centerLatitude;
var centerLongitude;
var startZoom;
var centerLatLng;

var selectedStatePos = -1;
var key;

$(document).ready(function(){
                           
  if (GBrowserIsCompatible()) {
	centerLatitude = 48;
	centerLongitude = -111;
	startZoom = 4;	
	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();

	// Create our "tiny" marker icon
	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);
	
	for(id in listClinics) { 
		if(listClinics[id][11] && listClinics[id][12]) { 
			createMarker(listClinics[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();

    //objLoadedItems   key : [type, marker, label, color, [centerLat, centerng], numOfTotalMarkersInside, [MarkersInsideIDs]]
    
    for (key in objLoadedItems) {
        map.addOverlay(objLoadedItems[key][1]);
        objLoadedItems[key][1].itemId = key;
        
        GEvent.addListener(objLoadedItems[key][1],'mouseover', function(){
            labelState.setPoint(new GLatLng(objLoadedItems[this.itemId][4][0], objLoadedItems[this.itemId][4][1]));
            labelState.setContents('Click for '+objLoadedItems[this.itemId][2]+'<br />affiliated doctors ('+objLoadedItems[this.itemId][5]+')');
			labelState.show();
			this.setStrokeStyle({color:'#f6ff00',weight:3,opacity:1});
        });
		
		GEvent.addListener(objLoadedItems[key][1], 'mouseout', function(){
			//labelState.hide();
			this.setStrokeStyle({color:objLoadedItems[this.itemId][3],weight:1,opacity:0.7});
		});
		
		GEvent.addListener(objLoadedItems[key][1], '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");
  }
  

});




function createMarker(objMarker, id) 
{
	var point = new GLatLng(objMarker[11], objMarker[12]);
	var marker = new GMarker(point, { icon: iconTiny, title:objMarker[0], hide: true });
	var zoomlevelcur;
    
    marker.state = objMarker[4].toLowerCase(); 
    
	var focusPoint = function() {
		var htmlTitle='';
		var htmlPhone='';
		var htmlFax  ='';
		var htmlUrl  ='';
        var htmlDocs ='';
		if(objMarker[0]) { htmlTitle = '<h3>'+objMarker[0] + '</h3>'; }

        if(objMarker[9]) {
			var docid;
        	for(docidKey in objMarker[9]) { 
            	docid = objMarker[9][docidKey];
	            htmlDocs += '<p>'; 
            	if(listDocs[docid][4]) { htmlDocs += listDocs[docid][4] + ', '; }
                if(listDocs[docid][5]) { htmlDocs += listDocs[docid][5] + ', '; }
                if(listDocs[docid][7]) { htmlDocs += listDocs[docid][7]; }
                if(listDocs[docid][9]) { htmlEmail = '<br />Email: ' + listDocs[docid][9]; }
                htmlDocs += '</p>'; 
            }
        }

		if(objMarker[6]) { htmlPhone = '<br /><strong>Phone:</strong> ' + objMarker[6]; }
		if(objMarker[8]) { htmlFax = '<br /><strong>Fax:</strong> ' + objMarker[8]; }
		
		marker.openInfoWindowHtml('<div class="gmap_infowindow">' + htmlTitle + htmlDocs + htmlPhone + htmlFax + htmlUrl + '<p>' + objMarker[1] + ', <br />' + objMarker[4] + ', ' + objMarker[5] + '</p></div>', {maxWidth:300});
			
		return false;
	}
    
    marker.zoommarker = focusPoint;
		
		
	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);
		
	//GEvent.addListener(marker, 'mouseover', function() { marker.showMapBlowup(18, G_HYBRID_MAP); });

	map.addOverlay(marker);
    
    //gmarkers.push(marker);
    gmarkers[id] = marker;
}



function reset_gmap()
{
	selectedStatePos = -1;	
	map.closeInfoWindow();
    labelState.hide();
	map.setCenter(centerLatLng, startZoom);
    
    for (key in objLoadedItems) {
    	objLoadedItems[key][1].show();
    }
    for (var i=0; i<gmarkersLength; i++) {
	    gmarkers[i].hide();
    }
}


function zoomToPoly(pos, setCenter)
{
	selectedStatePos = pos;
	map.closeInfoWindow();
    labelState.hide();
    
    for (key in objLoadedItems) {
    	if(key != pos) {
        	objLoadedItems[key][1].show();
        } else {
        	objLoadedItems[key][1].hide();
        }
    }

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


function zoomToMarker(pos)
{
   zoomToPoly((listClinics[pos][4]).toLowerCase(), false);
   map.setCenter(new GLatLng(listClinics[pos][11], listClinics[pos][12]), 17);
   gmarkers[pos].zoommarker();
}



function updateMarkers()
{
	if(map.getZoom() > 4){
    
        var mapbounds = map.getBounds();
        var itemBounds;
        
        var visibleStates = [];
        var updateMarkers = false;
        
        visibleStates.push(selectedStatePos);
        
        for (key in objLoadedItems) {
        	if(key == selectedStatePos) { continue; }
        	itemBounds = objLoadedItems[key][1].getBounds();
            if(mapbounds.containsBounds(itemBounds) || itemBounds.containsBounds(mapbounds)) {
                visibleStates.push(key);
                if(selectedStatePos != key) {
                	objLoadedItems[key][1].hide();
                    updateMarkers = true;
                }
            } else {
                objLoadedItems[key][1].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;