// --- NYS Maple Google Maps integration script

var member_map;
var member_geocoder;
var member_dir;
var member_icons;
var member_ticons;
var member_dir_index;
var member_manager;
var member_overlay;

// http://gmaps-utility-library.googlecode.com/svn/trunk/labeledmarker/ (v1.2)
// NOTE: v1.3 appears to be broken - caused erratic scrolling, disappearing markers
if (window.GMarker) {
  function LabeledMarker(latlng,opt_opts){this.latlng_=latlng;this.opts_=opt_opts;this.labelText_=opt_opts.labelText||"";this.labelClass_=opt_opts.labelClass||"LabeledMarker_markerLabel";this.labelOffset_=opt_opts.labelOffset||new GSize(0,0);this.clickable_=opt_opts.clickable||true;this.title_=opt_opts.title||"";this.labelVisibility_=true;if(opt_opts.draggable){opt_opts.draggable=false;}GMarker.apply(this,arguments);};LabeledMarker.prototype=new GMarker(new GLatLng(0,0));LabeledMarker.prototype.initialize=function(map){GMarker.prototype.initialize.apply(this,arguments);this.map_=map;this.div_=document.createElement("div");this.div_.className=this.labelClass_;this.div_.innerHTML=this.labelText_;this.div_.style.position="absolute";this.div_.style.cursor="pointer";this.div_.title=this.title_;map.getPane(G_MAP_MARKER_PANE).appendChild(this.div_);if(this.clickable_){function newEventPassthru(obj,event){return function(){GEvent.trigger(obj,event);};}var eventPassthrus=['click','dblclick','mousedown','mouseup','mouseover','mouseout'];for(var i=0;i<eventPassthrus.length;i++){var name=eventPassthrus[i];GEvent.addDomListener(this.div_,name,newEventPassthru(this,name));}}};LabeledMarker.prototype.redraw=function(force){GMarker.prototype.redraw.apply(this,arguments);this.redrawLabel_();};LabeledMarker.prototype.redrawLabel_=function(){var p=this.map_.fromLatLngToDivPixel(this.latlng_);var z=GOverlay.getZIndex(this.latlng_.lat());this.div_.style.left=(p.x+this.labelOffset_.width)+"px";this.div_.style.top=(p.y+this.labelOffset_.height)+"px";this.div_.style.zIndex=z;};LabeledMarker.prototype.remove=function(){GEvent.clearInstanceListeners(this.div_);if(this.div_.outerHTML){this.div_.outerHTML="";}if(this.div_.parentNode){this.div_.parentNode.removeChild(this.div_);}this.div_=null;GMarker.prototype.remove.apply(this,arguments);};LabeledMarker.prototype.copy=function(){return new LabeledMarker(this.latlng_,this.opts_);};LabeledMarker.prototype.show=function(){GMarker.prototype.show.apply(this,arguments);if(this.labelVisibility_){this.showLabel();}else{this.hideLabel();}};LabeledMarker.prototype.hide=function(){GMarker.prototype.hide.apply(this,arguments);this.hideLabel();};LabeledMarker.prototype.setLatLng=function(latlng){this.latlng_=latlng;GMarker.prototype.setLatLng.apply(this,arguments);this.redrawLabel_();};LabeledMarker.prototype.setLabelVisibility=function(visibility){this.labelVisibility_=visibility;if(!this.isHidden()){if(this.labelVisibility_){this.showLabel();}else{this.hideLabel();}}};LabeledMarker.prototype.getLabelVisibility=function(){return this.labelVisibility_;};LabeledMarker.prototype.hideLabel=function(){this.div_.style.visibility='hidden';};LabeledMarker.prototype.showLabel=function(){this.div_.style.visibility='visible';};
}

function member_map_init(county, filter) {
	
	if (!show_map || GBrowserIsCompatible()) {
		
    if (show_map) {
      
  		member_map = new GMap2(document.getElementById("member_map_canvas"));
  		member_map.setCenter(new GLatLng(43.117024,-76.442871), 6);
  		
  		member_map.addControl(new GScaleControl()); // miles/km scale
  		member_map.addControl(new GMapTypeControl()); // satellite/map view
  		member_map.addControl(new GSmallMapControl()); // zoom in/out
  		
  		member_icons = new Array();
  		
  		member_icons[1] = new GIcon(G_DEFAULT_ICON);
  		member_icons[1].image = 'images/map-leaf-green.png';
  		member_icons[1].shadow = 'images/map-leaf-shadow.png';
  		member_icons[1].iconSize = new GSize(28, 29);
  		member_icons[1].shadowSize = new GSize(44, 29);
  		member_icons[1].iconAnchor = new GPoint(14, 26);
  		member_icons[1].infoWindowAnchor = new GPoint(20, 3);
  		member_icons[1].imageMap = [14,2, 24,8, 19,19, 6,19, 3,7];
  		
  		member_icons[2] = new GIcon(G_DEFAULT_ICON);
  		member_icons[2].image = 'images/map-leaf-orange.png';
  		member_icons[2].shadow = 'images/map-leaf-shadow.png';
  		member_icons[2].iconSize = new GSize(28, 29);
  		member_icons[2].shadowSize = new GSize(44, 29);
  		member_icons[2].iconAnchor = new GPoint(14, 26);
  		member_icons[2].infoWindowAnchor = new GPoint(20, 3);
  		member_icons[2].imageMap = [14,2, 24,8, 19,19, 6,19, 3,7];
  		
  		member_manager = new MarkerManager(member_map);
      
    }
		
		for (var index in member_list) {
			if ((filter == '1' && member_list[index].icon == 2) || (filter == '2' && member_list[index].icon == 1)) {
				delete member_list[index];
			} else {
				var member = member_list[index];
        var member_html = (member.image ? '<img src="map-images/' + member.image + '" />' : '') + '<strong>' + member.name + '</strong><br />' + (member.mail ? '<a href="mailto:' + member.mail + '">' + member.person + '</a>' : member.person) + '<br />' + member.addr + (member.web ? '<br />&raquo; <a target="_blank" href="http://' + member.web + '">' + member.title + '</a>' : '') + (member.phone ? '<br />phone: ' + member.phone : '');
				if (show_map) {
          var p = member_list[index].p = new GLatLng(member.lat, member.lng);
          member_map_add(p, member_html, index);
        }
				member.html = '<div class="member-' + member.icon + '"><strong>' + member.name + '</strong>';
        if (show_map) member.html += ' <span style="white-space:nowrap">&raquo; <a href="#map_anchor" onclick="member_map_show(' + index + ');">Show on map above</a></span>';
        member.html += '<br />' + (member.mail ? '<a href="mailto:' + member.mail + '">' + member.person + '</a>' : member.person) + '<br />' + member.addr + (member.phone ? '<br />phone: ' + member.phone : '') + (member.web ? '<br /><a target="_blank" href="http://' + member.web + '">' + member.title + '</a>' : '') + (member.text ? '<br /><span style="color:#888">' + member.text + '</span>' : '') + '</div>';
        if (member.ct) county_list[member.ct].amount = (county_list[member.ct].amount || 0) + 1;
			}
		}
		
    if (show_map) {
  		member_geocoder = new GClientGeocoder();
  		
  		member_dir = new GDirections(member_map, document.getElementById('member_map_dir'));
  		
  		GEvent.addListener(member_dir, "error", member_map_error);
  		GEvent.addListener(member_dir, "load", member_map_load);
    }
		
		var html = '<p>&raquo; Select a county: ';
		for (var c in county_list) {
      if (county_list[c].amount > 0) {
        html += '<a href="#map_anchor" onclick="member_map_county(\'' + c + '\');">' + c + '</a>&nbsp; ';
        if (show_map) {
          var p = county_list[c].p = new GLatLng(county_list[c].lat, county_list[c].lng);
          county_map_add(p, c, county_list[c].amount);
        }
      }
    }
		html += '</p>'; 
		document.getElementById('member_map_counties').innerHTML = html;
		
		if (county != '') member_map_county(county);
		
	} else {
		
		window.alert('Sorry...\n\nYour webbrowser is incompatible\nwith Google Maps.\n\nPlease update your browser.');
		
	}
}

function member_map_directions(memberid, address) {
	
	var member = member_list[memberid];
	
	member_dir_index = memberid;
	
	member_dir.load('from:' + address + ' to:' + member.name + ' @ ' + member.lat + ', ' + member.lng);
	
  set_tab(4);
  
}

function member_map_load() {
	document.getElementById('member_map_dir_title').innerHTML = '<h3>Driving directions to ' + member_list[member_dir_index].name + '</h3>';
}

function member_map_error() {
	window.alert('We couldn\'t find your address.\n\nDid you enter it correctly?\n\n(error ' + member_dir.getStatus().code + ')');
}

function member_map_add(p, content, memberid) {
	
	var marker = p.marker = new GMarker(p, {
    icon: member_icons[ member_list[memberid].icon ],
    title: member_list[memberid].name
  });
  
	member_manager.addMarker(marker, 9, 17);
  
	content = '<div class="member_map_flyout">' + content + '<form class="member_map_directions" onsubmit="member_map_directions(' + memberid + ', this.address.value); return false;">' +
		'<span style="color:#888">Get directions from your address:</span><br />' +
		'<input type="text" name="address" value="" /><br/>' +
		'<input type="submit" value="Get Directions" />' +
		'</form></div>';
	
	GEvent.addListener(marker, "click", marker.click = function() {
		marker.openInfoWindowHtml(content);
	});
	
}

function county_map_add(p, county, label) {
  
  var marker = p.marker = new LabeledMarker(p, {
    icon: member_icons[1],
    title: county,
    labelText: '<div class="member_map_county">' + label + '</div>',
    labelOffset: new GSize(-16,-19)
  });
  
  marker.county = county;
  
  member_manager.addMarker(marker, 0, 8);
  
	GEvent.addListener(marker, "click", marker.click = function() {
		member_map_county(this.county);
	});
  
}

function member_map_sorter(a, b) {
	return ((a.dist < b.dist) ? -1 : ((a.dist > b.dist) ? 1 : 0));
}

function member_map_show(memberid) {
	member_map.setCenter(member_list[memberid].p, 11);
	window.setTimeout('member_list['+memberid+'].p.marker.click();', 500); // small delay needed for MarkerManager to bring back hidden markers
}

function member_map_county(county) {
  
  if (show_map) member_map.setCenter(county_list[county].p, 10);
  
  var html = '<h3>Members in ' + county + ' County</h3>';
  
  for (var i in member_list) {
    var m = member_list[i];
    if (m.ct == county) {
      html += m.html;
    }
  }
  
  document.getElementById('member_map_list').innerHTML = html;
  
  set_tab(3);
	
}

function member_search(str) {
	
	str = str.toLowerCase();
	
	if (str.length < 3) {
		window.alert('The search term is too short.\n\nPlease enter a longer search term.');
		return;
	}
	
	var html = '<h3>Members matching &quot;' + str + '&quot;</h3>';
	
	var c = 0, first_index = -1;
	
	for (var i in member_list) {
		var m = member_list[i];
		var s = m.name + ',' + m.person;
		if (s.toLowerCase().indexOf(str) > -1) {
			html += m.html;
			c++;
			if (first_index == -1) first_index = i;
		}
		if (c > 50) {
			c = -1;
			break;
		}
	}
	
	if (c == 0) html += '<p>Nothing found ... please try another search.</p>';
	if (c == -1) html += '<p><em>More than 50 results found - please narrow your search...</em></p>';
	if (c == 1) member_map_show(first_index);
  
	document.getElementById('member_map_list').innerHTML = html;
  
  set_tab(3);
	
}

function member_zip_sort(a, b) {
	return ((a.dist < b.dist) ? -1 : ((a.dist > b.dist) ? 1 : 0));
}

function member_zip(zip, radius) {
  
  html = '<h3>Members within ' + radius + ' mi. of zipcode ' + zip + ' <small>(nearest first)</small></h3>';
  
  member_geocoder.getLatLng(zip, function(p) {
    
    var results = '';
    
    if (p) {
      
      var best = 9999999, best_index = 0;
      var nearest = new Array();
      var radius_m = radius * 1609.344;
      
      for (var index in member_list) {
        var dist = p.distanceFrom( member_list[index].p );
        if (dist <= radius_m) {
          nearest.push({'memberid':index, 'dist':dist});
          if (dist < best) {
            best = dist;
            best_index = index;
          }
        }
      }
      
      nearest.sort(member_zip_sort);
      
      var c = 1;
      for (var index in nearest) {
        html += member_list[ nearest[index].memberid ].html;
        if (c++ == 50) {
          html += '<p><em>More than 50 results found - please narrow your search...</em></p>';
          break;
        }
      }
      
     	if (c == 0) html += '<p>Nothing found ... please try another search.</p>';
      
      member_map_show(best_index);
      
    } else {
      
      html += '<p>Zipcode not found ... please try another search.</p>';
      
    }
    
    document.getElementById('member_map_list').innerHTML = html;
    
    set_tab(3);
    
  });
  
}
  
var current_tab = null;

function set_tab(n) {
  
  if (current_tab) {
    document.getElementById('tab-' + current_tab).className = '';
    document.getElementById('tab-body-' + current_tab).style.display = 'none';
  }
  
  document.getElementById('tab-' + n).className = 'active';
  document.getElementById('tab-body-' + n).style.display = 'block';
  
  current_tab = n;
  
}
