var URL = '/action/blog_address/dbehin/0/0/0/0';



$(document).ready(function(){
													 
		
	MAP_IS_DRAWN = false;
	
	$('#viewAgtMngMap A').bind('click', function(){
	
	if (!MAP_IS_DRAWN) {
	
	// defined in mngmap tpl
	//if (!URL) var URL = '/action/blog_address'; // JSON data address
	
	CONTROLS = [];
	
	/* The custom category filter controller */
	function CategoryFilterControl() {}
	
	CategoryFilterControl.prototype = new GControl();
	
	CategoryFilterControl.prototype.initialize = function(map) {
		
		var container = document.createElement('div');
		
		CONTROLS[0] = container;
		
		$(CONTROLS[0]).css({
		  'font-size': '0.8em',
			'width': '150px',
			'background': 'url(../css/img/i/15x15_fffsemitrans.png) 0 0 repeat',
			'padding': '3px 5px',
			'border': '1px solid #aaa',
			'margin': '0 0 5px'
		});
		
		$(CONTROLS[0]).append('<span id="CFC_loading" style="font-size:1.4em;font-weight:bold;">Please wait, loading...</span>');

		map.getContainer().appendChild(CONTROLS[0]);
		
		return CONTROLS[0];
	}

	CategoryFilterControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5, 5));
	}
	
	/**************/
	
	function TooltipControl() {};
	TooltipControl.prototype = new GControl();
	TooltipControl.prototype.initialize = function(map) {
		var container = document.createElement('div');
		CONTROLS[1] = container;
		$(container).css({
		  'font-size': '0.9em',
			'width': '150px',
			'background': '#fff',
			'padding': '3px 5px',
			'border': '2px solid #999',
			'display': 'none',
			'position': 'relative'
		});
		map.getContainer().appendChild(container);
		return container;
	};
	
	TooltipControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_TOP_LEFT);
	}
	
	
	/*
	** Begin GBrowserIsCompatible()
	*/
	
if (GBrowserIsCompatible()) {
	
	map = new GMap2(document.getElementById("mng_map1"));
	MAPSIZE = map.getSize();
	
	map.addControl(new GSmallMapControl());
	map.addControl(new CategoryFilterControl());
	map.addControl(new TooltipControl());
	
	map.setCenter(new GLatLng(40.747224, -73.973737), 12); // or, 40.740161, -73.985879 = 115 E 23rd St
	map.enableDoubleClickZoom();
	mgr = new MarkerManager(map, {trackMarkers:false});
	
	mm_array = {}; // MarkerManager array	
	markerGroups = {}; // unused at moment...	
	allmarkers = [];

	
	/* function chopName
	** @ removes 'Neighborhood Guide'
	*/
	function chopName(name) {
		var namearr = name.split(' ');
		namearr.pop(); // remove 'Guide'
		namearr.pop(); // remove 'Neighborhood'
		return namearr.join(' ');
	}
	
	var customIcons = [];
	customIcons['Notable Buildings'] = 'bldg';
	customIcons['New Developments'] = 'bldg';
	customIcons['Restaurants & Food'] = 'food';
	customIcons['Shopping'] = 'shopping';
	customIcons['Nightlife'] = 'nightlife';
	customIcons['Attractions & Events'] = 'attractions';
	customIcons['Hotels'] = 'hotels';
	customIcons['Uncategorized'] = 'blank';

		
	/* function makeIcon
	** @ give it a filename w/o extension -> GIcon
	*/
	function makeIcon(name) {
		var filename = (customIcons[name]) ? customIcons[name] : customIcons['Uncategorized'];
		return new GIcon({
										 'image': 'http://www.mns.com/css/img/i/mngico/'+filename+'.png',
										 'shadow': 'http://www.mns.com/css/img/i/mngico/shadow.png',
										 'iconSize': new GSize(25, 29),
										 'iconAnchor': new GPoint(12, 27),
										 'infoWindowAnchor': new GPoint(11, 3)
										 });
	}
			
	function createMarker(point, title, url, hood, categories) {
		
		var cat_for_icon = categories[0]; // eventually might need better method for icon selection...
		
		var marker = new GMarker(point, {icon: makeIcon(cat_for_icon)}); // remove title: title; we don't want tooltips
		
		for(var x=0; x<categories.length; x++) {
			markerGroups[categories[x]].push(marker);
			//mgtest[categories[x]][point.x+','+point.y] = marker;
		};
		
		allmarkers.push(marker);
		
		var markerHTML = '<a href="'+url+'" style="font-size:1.2em;font-weight:bold;">'+title+'</a><br>'+hood+'<br>Under: '+categories.join(', ');
		
		GEvent.addListener(marker, 'mouseover', function(){
																										 
		  var markerpos = map.fromLatLngToContainerPixel(this.getLatLng());
			
			$(CONTROLS[1]).html(markerHTML);

			var x_adjusted, y_adjusted;
			
			// Defaults
			left_adjusted = (markerpos.x+11);
			top_adjusted = markerpos.y - $(CONTROLS[1]).height() - 31;
					
			var will_overflow_top = (top_adjusted < 0);
			var will_overflow_bottom = ( (markerpos.y-25)+$(CONTROLS[1]).height() > MAPSIZE.height );
			var will_overflow_right = ( (markerpos.x+20)+$(CONTROLS[1]).width() > MAPSIZE.width );
			
			if (will_overflow_top && will_overflow_right) { // point is top right
				left_adjusted = (markerpos.x-20)-$(CONTROLS[1]).width();
				top_adjusted = (markerpos.y-3);
				
			} else if (will_overflow_top && !will_overflow_right) { // point is top but not right
				left_adjusted = (markerpos.x+12);
				top_adjusted = (markerpos.y-3);
				
			} else if (will_overflow_right) { // point is right
				left_adjusted = (markerpos.x-21)-$(CONTROLS[1]).width();
			}
			$(CONTROLS[1]).css({'left': left_adjusted+'px', 'top': top_adjusted+'px'}).show();
		});
		
		GEvent.addListener(marker, 'mouseout', function(){ $(CONTROLS[1]).empty().hide(); });
		GEvent.addListener(marker, 'click', function(){ window.location.href = url; });
		
		//fromLatLngToContainerPixel(latlng:GLatLng) 
		
		return marker;
	}
	
	
	function updateMapByFilters(arr) {
		var cats_to_show = [];
		
		// Clear markers
		for(var x=0; x<allmarkers.length; x++) {
			allmarkers[x].hide();
			allmarkers[x].pleaseHideLater = true;
		}
	
		if ($('.filterA').is(':checked')) { // is at least one checked?
		
			$('.filterA').each(function() {
				var e = $(this);
				var eltnum = e.attr('id').split('_')[1]; // eg. filtercat_0 -> 0
				
				var cat = arr[eltnum]; // contains the category associated with current checkbox element
				
				if ($(this).is(':checked')) cats_to_show.push(arr[eltnum]);
			});
			
			for (var x=0; x<cats_to_show.length; x++) {
				for (marker in markerGroups[cats_to_show[x]]) {
					markerGroups[cats_to_show[x]][marker].show();
					markerGroups[cats_to_show[x]][marker].pleaseHideLater = false;
				}
			} // all points should be visible now...
		
		} else { // show all markers
			for (var x=0; x<allmarkers.length; x++) {
				allmarkers[x].show();
				allmarkers[x].pleaseHideLater = false;
			}
		}
	} // end updateMapByFilters
	
	
		/* function generateBoundsFromMarkers
		** creates a marker
		*/
		function generateBoundsFromMarkers(markers) {
			var left, right, top, bottom;
			
			for (var x=0; x<markers.length; x++) {
				if (markers[x] != '') {
					var mpos = markers[x].getLatLng();
					if (mpos.lng()<left || !left) left = mpos.lng();
					if (mpos.lng()>right || !right) right = mpos.lng();
					if (mpos.lat()<bottom || !bottom) bottom = mpos.lat();
					if (mpos.lat()>top || !top) top = mpos.lat();
				};
			};

			var sw = new GLatLng(bottom, left);
			var ne = new GLatLng(top, right);

			return new GLatLngBounds(sw, ne);
		};

	$.getJSON(URL, function(data) {
		
		var ct = 0;
		
		// Retrieves master list of all categories used here and generates a unique MarkerManager for each category
		var usedcategories_arr = [];
		for (x in data.usedcategories) {
			usedcategories_arr.push(data.usedcategories[x].name);
			markerGroups[data.usedcategories[x].name] = [];
			mm_array[data.usedcategories[x].name] = new MarkerManager(map);
		}
		
		for (x in data.item) {
			ct++;
			var cur = data.item[x];
			var blogname = cur.blog_name;
			var hood = chopName(blogname);
			var title = cur.post_title;
			var url = cur.post_url;
			var point = new GLatLng(cur.geocodes.lat, cur.geocodes.lng);

			// createMarker generates, pushes marker into specific arrays
			var marker = createMarker(point, title, url, hood, cur.categories);

		}
				
		var gcc = CONTROLS[0]; // = custom controller container object
		
		if (allmarkers.length > 0) {
			var bounds = generateBoundsFromMarkers(allmarkers);
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		
			mgr.addMarkers( allmarkers, 5 );
			mgr.refresh();
			
			$(gcc).append('<span style="font-size:1.4em;font-weight:bold;display:block;">Filter by Category</span>');
		}	else {
			$(gcc).append('<span style="font-size:1.4em;font-weight:bold;display:block;">No posts to display</span>');
		};
		
		// Category filter links
		for (x in usedcategories_arr) {
			var postcount = markerGroups[usedcategories_arr[x]].length;
			var e = '<label for="filtercat_'+x+'" style="font-size:1.4em;display:block;"><input class="filterA" type="checkbox" id="filtercat_'+x+'" style="width:15px;" /><span style="margin-left:2px;">'+usedcategories_arr[x]+' <span style="font:0.9em Arial, Helvetica, sans-serif;color:#666;">('+postcount+')</span></span></label>';
			//$('#mng_map1').before(e);
			
			// TESTING
			$(gcc).append(e);
		}
		
		$('#CFC_loading').hide();
		
		// Bind filters to show/hide actions
		$('.filterA').each(function(i){
			$(this).bind('click', function(){
				updateMapByFilters(usedcategories_arr);
				if ($(this).is(':checked')) $(this).parent('label').addClass('labelspanred'); else $(this).parent('label').removeClass('labelspanred');
				
			});
		});
	
		//console.info('Number: ' + ct);
		
	}); // end JSON
	
} // end if(GBrowserIsCompatible())

	MAP_IS_DRAWN = true;

	}; // end MAP_IS_DRAWN
});
	
});

 
