/**
 * Returns the number of clusters in the clusterer.
 *
 * @return {number} The number of clusters.
 */
MarkerClusterer.prototype.getTotalVisibleClusters = function() {
  var visible = 0;
  mapBounds = this.map_.getBounds();
  for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {
    if(cluster.markers_.length > 1 && mapBounds.contains(cluster.getCenter())){
      visible++;
    }
  }
  return visible;
};


var iconBlue = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_blue.png',
  new google.maps.Size(12, 20),
  new google.maps.Point(0,0),
  new google.maps.Point(6, 20));
var iconRed = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_red.png',
  new google.maps.Size(12, 20),
  new google.maps.Point(0,0),
  new google.maps.Point(6, 20));
var iconYellow = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_yellow.png',
  new google.maps.Size(12, 20),
  new google.maps.Point(0,0),
  new google.maps.Point(6, 20));
var iconGreen = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_green.png',
  new google.maps.Size(12, 20),
  new google.maps.Point(0,0),
  new google.maps.Point(6, 20));    
var iconShadow = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_shadow.png',
  new google.maps.Size(22, 20),
  new google.maps.Point(0,0),
  new google.maps.Point(6, 20));

var customIcons = [];
customIcons["non-profit"] = iconBlue;
customIcons["for-profit"] = iconBlue; //iconRed;
customIcons["public"] = iconBlue;// iconGreen;
customIcons["unknown"] = iconBlue; // iconYellow;

var markersArray = [];
var hidden_markers = [];
var chicagoLatLng = new google.maps.LatLng(41.80816, -87.7776);
	
var mc = null;
var mgr = null;
var map = null;
var lastI;
var fluster = null;
var org_groups = [];
var type_groups = [];
var cookCounty = null;
var maxClusterZoom = 15;
$(function(){
    var wireMapOptions = {
      zoom: 9,
      center: chicagoLatLng,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      mapTypeControl: true,
      mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU },
      navigationControl: true
    }
    map = new google.maps.Map(document.getElementById("map"), wireMapOptions);
    
    google.maps.event.addListener(map, 'click', function() {
    	closeOpenInfoWindow();
    });
    
    google.maps.event.addListener(map, 'idle', function() {
    	checkVisibleClusters();
    });
    
    google.maps.event.addListener(map, 'projection_changed', function() {
    	var mcOptions = {gridSize: 50, maxZoom: maxClusterZoom};
		mc = new MarkerClusterer(map, [], mcOptions);
	    setupBoxes();
	    
		loadMarkers();
	});
});

function createMarker(point, lobject) {
	var nmarker = new Object;
	
	// marker.setTooltip(lobject['organization_name']);
	var html = "<div class='wire-gmap-info'>";
	html = html + "<img src='"+ lobject['icon'] +"' style='float:right;' height='100' width='100' />";
	org_link = '<a class="more_information" href="/dynamic/directory/view/'+ lobject['organization_id'] +'">'+ lobject['organization_name'] +'</a>';
	html = html + "<span class='org-name'>" + org_link + "</span><br />";
	site_name = lobject['name'];
	if(!(site_name.match(/Site \#/) || site_name == 'Main')){
		html = html + "<span class='site-name'>" + lobject['name'] + "</span> <br/>";
	}
	html = html + lobject['address'] +'';
	if(lobject['address2'] != '' && lobject['address2'] != undefined){
		html = html + '<br/>' + lobject['address2'] +'';
	}
	html = html + '<br/>' + lobject['city'] +', '+ lobject['st'] +' '+ lobject['zip'] +'';
	
	if(lobject['phone'] != '' && lobject['phone'] != undefined){
		html = html + '<br/><b>Phone:</b> ' + lobject['phone'] +'';
	}
	if(lobject['fax'] != '' && lobject['fax'] != undefined){
		html = html + '<br/><b>Fax:</b> ' + lobject['fax'] +'';
	}
	html = html + "</div>";
	
	nmarker.html = html;
	
	if(customIcons[lobject['organization_type']] != undefined){
		var icon = customIcons[lobject['organization_type']];
	}else{
		var icon = customIcons['unknown'];
	}
	
	nmarker.marker = new google.maps.Marker({
		position: point,
		title: lobject['organization_name'],
		icon: icon,
		// map: map,
		shadow: iconShadow
	});
	nmarker.marker.id = 'cjc-wire-map-marker-'+lobject['id'];

	if(org_groups[lobject['organization_id']] == undefined){ org_groups[lobject['organization_id']] = []; }
	org_groups[lobject['organization_id']].push(nmarker.marker);

	nmarker.infowindow = new google.maps.InfoWindow({
		content: html,
		maxWidth: 400
	});
	

	nmarker.listener = makeClosure(nmarker.marker.id, nmarker.marker);
	return nmarker;
}

function makeClosure(i, marker){
	return google.maps.event.addListener(marker, 'click', function(){ openInfoWindow(i); });
}

function openInfoWindow(i){
	if(lastI != undefined && typeof(markersArray[lastI].infowindow) == 'object'){
		markersArray[lastI].infowindow.close();
	}
	lastI = i;
	markersArray[i].infowindow.open(map,markersArray[i].marker);
}

function closeOpenInfoWindow(){
	if(lastI != undefined && typeof(markersArray[lastI].infowindow) == 'object'){
		markersArray[lastI].infowindow.close();
	}
}

function loadMarkers(mtime){
	$("#wire-loading-notice").show();
	closeOpenInfoWindow();
	if(mtime == undefined){
		mtime = default_location_time;
		var redraw = false;
	}else{
		var redraw = true;
	}
	
	$.ajax({
	  url: "/dynamic/directory/geoXml/"+mtime,
	  error: function(XMLHttpRequest, textStatus, errorThrown){  },
	  success:	function(data) {
					$(data).find('marker').each(function(){
						if(markersArray['cjc-wire-map-marker-'+ $(this).attr("id")] == undefined){
							lobject = [];
							lobject['id'] = $(this).attr("id");
							lobject['name'] = $(this).attr("name");
							lobject['organization_name'] = $(this).attr("organization_name");
							lobject['organization_id'] = $(this).attr("organization_id");
							lobject['organization_type'] = $(this).attr("organization_type");
							lobject['address'] = $(this).attr("address");
							lobject['address2'] = $(this).attr("address2");
							lobject['zip'] = $(this).attr("zip");
							lobject['st'] = $(this).attr("st");
							lobject['city'] = $(this).attr("city");
							lobject['phone'] = $(this).attr("phone");
							lobject['fax'] = $(this).attr("fax");
							lobject['icon'] = "http://maps.google.com/maps/api/staticmap?center="+ $(this).attr("lat") +","+ $(this).attr("lng") +"&zoom=13&markers=size:tiny|"+ $(this).attr("lat") +","+ $(this).attr("lng") +"&size=100x100&sensor=true&key="+ google_key;
							
							var point = new google.maps.LatLng(parseFloat($(this).attr("lat")), parseFloat($(this).attr("lng")));
							
							var marker = createMarker(point, lobject);
							mc.addMarker(marker.marker);
							markersArray[marker.marker.id] = marker;
						}else{
							mc.addMarker(markersArray['cjc-wire-map-marker-'+ $(this).attr("id")].marker);
						}
					});
					if(redraw){
						map.setCenter(chicagoLatLng);
						map.setZoom(9);
						mc.setMaxZoom(maxClusterZoom);
						mc.redraw();
					}
					checkVisibleClusters();
					$("#wire-loading-notice").hide();
				},
	  dataType: 'xml'
	});
}

function checkVisibleClusters(){
	if(mc.getTotalVisibleClusters() > 0){
		$("#wire-cluster-notice").show();
	}else{
		$("#wire-cluster-notice").hide();		
	}
}


function toggleClustering(){

	$("#wire-loading-notice").show();
	map.setZoom(1);
	if(maxClusterZoom == 15){
		maxClusterZoom = 1;
		$("#wire-cluster-toggle").text("Turn On Clustering");
	}else{
		maxClusterZoom = 15;
		$("#wire-cluster-toggle").text("Turn Off Clustering");
	}
	mc.setMaxZoom(maxClusterZoom);
	mc.resetViewport();
	mc.redraw(); 
	
	map.setCenter(chicagoLatLng);
	map.setZoom(9);
	
	$("#wire-loading-notice").hide();
	return true;
}

function reloadMarkers(mtime){
	removeMarkers();
	loadMarkers(mtime);
	map.setCenter(chicagoLatLng);
	map.setZoom(9);
}

cur_focused = 0;
function focusOrganization(oid){
	unhide();
	fcount = 0;
	hcount = 0;
	var bounds = new google.maps.LatLngBounds();
	hidden_markers = mc.getMarkers();
	mc.setMaxZoom(1);
	mc.clearMarkers();
	for(var i in org_groups[oid]){
		marker = org_groups[oid][i];
		mc.addMarker(marker);
		bounds.extend(marker.getPosition());
	}
	map.fitBounds(bounds);
	mc.resetViewport();
	if(map.getZoom() > 16){
		map.setZoom(16);
	}
	$("#wire-hidden-notice").show();
	return true;
}

function unhide(){
	if(cur_focused != 0){
		$("#focus-"+cur_focused).text($("#focus-"+cur_focused).data('text'));
		cur_focused = 0;
	}
	
	map.setCenter(chicagoLatLng);
	map.setZoom(20);
	
	if(hidden_markers.length > 0){
  		mc.clearMarkers();
  		mc.addMarkers(hidden_markers);
  	}
	
	mc.setMaxZoom(15);
	mc.resetViewport();
	
	map.setZoom(9);
	
	$("#wire-hidden-notice").hide();
	return true;
}

function removeMarkers(){
	$("#wire-hidden-notice").hide();
  	mc.clearMarkers();
}
 
function updateResults(data){
	if(data.content == undefined){
		alert("There wasn an error while filtering your results. Please refresh the page and try again.");
		return;
	}
    $("#query_think").hide();
    $('#filter-results').html(data.content);
   	$("#wire-results-count").html(data.org_count);
   	removeMarkers();
   	loadMarkers(data.locations_time);
   	if(data.zip_coords.lat != undefined && data.zip_coords.lon != undefined){
	   	var point = new google.maps.LatLng(parseFloat(data.zip_coords.lat), parseFloat(data.zip_coords.lon));
   		map.setCenter(point);
   	}
   	$("#wire-provider-area").fadeTo('fast', 1);
	$("#query_think").hide();
}


function setupBoxes(){
	mapDiv = map.getDiv();
	
	// hidden notice
	hidden_notice_html = '<strong><a id="wire-county-toggle" href="javascript: //" onclick="unhide();">Show Hidden Sites</a></strong>';
	hidden_notice = createBox(hidden_notice_html);
	hidden_notice.style.top = '30px';
	hidden_notice.style.right = '50%';
	hidden_notice.style.width = '120px';
	hidden_notice.style.marginRight = '-60px';
	hidden_notice.style.textAlign = 'center';
	hidden_notice.style.display = 'none';
	hidden_notice.id = "wire-hidden-notice";
	mapDiv.appendChild(hidden_notice);
	
	// loading notice
	loading_notice_html = '<strong>Loading...</strong>';
	loading_notice = createBox(loading_notice_html);
	loading_notice.style.top = '5px';
	loading_notice.style.right = '50%';
	loading_notice.style.width = '60px';
	loading_notice.style.marginRight = '-30px';
	loading_notice.style.textAlign = 'center';
	loading_notice.style.display = 'none';
	loading_notice.id = "wire-loading-notice";
	mapDiv.appendChild(loading_notice);
	
	// cluster notice
	cluster_notice_html = '<table width="100%"><tr><td style="vertical-align: middle;"><img src="/dynamic/img/cluster-key.png" /></td><td style="vertical-align: middle;"><strong>Some locations are clustered. Zoom in to see the individual site locations.</strong></td></tr></table>';
	cluster_notice = createBox(cluster_notice_html);
	cluster_notice.style.padding = '2px';
	cluster_notice.style.bottom = '20px';
	cluster_notice.style.left = '50%';
	cluster_notice.style.marginLeft = '-150px';
	cluster_notice.style.width = '300px';
	cluster_notice.style.height = '55px';
	//cluster_notice.style.display = 'none';
	cluster_notice.id = "wire-cluster-notice";
	mapDiv.appendChild(cluster_notice);
}

function createBox(content){
	// Create a div to hold the control.
	var controlDiv = document.createElement('DIV');
	
	// Set CSS styles for the DIV containing the control
	// Setting padding to 5 px will offset the control
	// from the edge of the map
	controlDiv.style.padding = '5px';
	controlDiv.style.position = 'absolute';
	controlDiv.style.zIndex = '9999999';
	controlDiv.style.opacity = '0.8';
	
	
	// Set CSS for the control border
	var controlUI = document.createElement('DIV');
	controlUI.style.backgroundColor = 'white';
	controlUI.style.borderStyle = 'solid';
	controlUI.style.borderWidth = '1px';
	controlUI.style.cursor = 'pointer';
	controlUI.style.textAlign = 'left';
	//controlUI.style.width = '100%';
	controlUI.setAttribute("class", "ui-corner-all");
	controlDiv.appendChild(controlUI);
	
	// Set CSS for the control interior
	var controlText = document.createElement('DIV');
	controlText.style.fontFamily = 'Arial,sans-serif';
	controlText.style.fontSize = '12px';
	controlText.style.paddingLeft = '4px';
	controlText.style.paddingRight = '4px';
	//controlText.style.width = '100%';
	controlText.innerHTML = content;
	controlUI.appendChild(controlText);
	
	return controlDiv;
}

/*

chicago_checked = false;
cook_checked = false;
function updateMultiCheckboxes(){
	chicago_ca = global_chicago_ca;
	cook_ca = global_cook_ca;
	$("#wire-providers-ca-list .ui-multiselect-optgroup-1 input").each(function(){ 
		if($.inArray($(this).val(), ['100']) != -1){
			if($(this).attr("checked")){
				chicago_checked = true;
			}else{
				chicago_checked = false;
			}
		}
		if($.inArray($(this).val(), ['109']) != -1){
			if($(this).attr("checked")){
				cook_checked = true;
			}else{
				cook_checked = false;
			}
		}
	});
	to_disable = [];
	if(cook_checked){
		$("#wire-providers-ca-list .ui-multiselect-optgroup-3 input").each(function(){
			$(this).attr("disabled", 'disabled');
		});
		$("#wire-providers-ca-list .ui-multiselect-optgroup-3").css("opacity", '.5');
		$("#wire-providers-ca-list li:not(.ui-multiselect-optgroup-label).ui-multiselect-optgroup-3 ").hide();
	}else{
		$("#wire-providers-ca-list .ui-multiselect-optgroup-3 input").each(function(){
			$(this).attr("disabled", false);
		});
		$("#wire-providers-ca-list .ui-multiselect-optgroup-3").css("opacity", '1');
		$("#wire-providers-ca-list li:not(.ui-multiselect-optgroup-label).ui-multiselect-optgroup-3 ").show();
	}
	
	if(chicago_checked || cook_checked){
		$("#wire-providers-ca-list .ui-multiselect-optgroup-2 input").each(function(){
			$(this).attr("disabled", 'disabled');
		});
		$("#wire-providers-ca-list .ui-multiselect-optgroup-2").css("opacity", '.5');
		$("#wire-providers-ca-list li:not(.ui-multiselect-optgroup-label).ui-multiselect-optgroup-2 ").hide();
	}else{
		$("#wire-providers-ca-list .ui-multiselect-optgroup-2 input").each(function(){
			$(this).attr("disabled", false);
		});
		$("#wire-providers-ca-list .ui-multiselect-optgroup-2").css("opacity", '1');
		$("#wire-providers-ca-list li:not(.ui-multiselect-optgroup-label).ui-multiselect-optgroup-2 ").show();
	}
}
*/
function clearForm(){
	window.location = '/dynamic/directory';
}

$(function(){
	var options = {
        success:       updateResults,
        dataType:      "json"
    };

	$("#provider-directory-filter").submit(function(){ 
		$("#wire-loading-notice").show();
		$("#query_think").show();
    	$("#wire-provider-area").fadeTo('slow', .3);
    	$(this).ajaxSubmit(options); 
    	return false; 
	});
	
	$(".multiselect").multiselect({
		header: true, 
		height: 250, 
		noneSelectedText: 'Click to select options for filter'});
		
	$(".multiselect-ca").multiselect({
		header: true, 
		height: 250, 
		noneSelectedText: 'Click to select options for filter'
		});
	$(".multiselect-ca").bind("multiselectclick", function(event, ui){
		updateMultis();
	});
	doIndent();
	updateMultis();
	//$("#legend-non-profit").hover(function(){ focusType('non-profit'); }, function(){ unhide(); });
	//$("#legend-for-profit").hover(function(){ focusType('for-profit'); }, function(){ unhide(); });
	//$("#legend-public").hover(function(){ focusType('public'); }, function(){ unhide(); });
	//$("#legend-unknown").hover(function(){ focusType('unknown'); }, function(){ unhide(); });
	
	/*
	//$(".wire-web-site-button").livequery(function(){ $(this).button(); });
	
	//$(".wire-more-information-button").livequery(function(){ 
	//	$(this).button(); 
	//});
	//$(".wire-focus-location-button").livequery(function(){ 
	//	$(this).button(); 
	//}); */
	
	//updateMultiCheckboxes();
	
	url = '';
	
	$('.more_information').live('click', function(){
		url = $(this).attr('href');
		$("#view_provider").dialog('open');
		return false;
	});
	
	$('.focus-locations-link').live('click', function(){
		oid = $(this).attr('id').replace(/focus-/, '');
		if(cur_focused == oid){
			cur_focused = 0;
			unhide();
			$(this).text($(this).data('text'));
		}else{
			$(this).data('text', $(this).text());
			$(this).text('Unhide Other Locations');
			
			focusOrganization(oid);
			cur_focused = oid;
		}
	});
	
	$("#view_provider").dialog({
        autoOpen: false,
        position: 'top',
        bgiframe: true,
        modal: true,
        resizable: false,
        width: 650,
        open: function() {
            $('#view_provider').html('<div align="center"><img alt="Loading..." src="/dynamic/img/indicator-long-bar.gif"/ > <br /> <strong>Please wait...</strong></div>');
            $('#view_provider').load(url);
                },
        buttons: {
            "Close": function() {
                $(this).dialog("close");
            }
        }
    });
});
