var j = jQuery.noConflict();
jQuery(document).ready(function(){
	 
	/*----------------------
		Interactive Map 
	----------------------*/
		// Accordion style menu
		j("dl.categories dt a").click(function(){
			var hidden = j(this).parent().next('dd');
			var visible = j("dl.categories dd:visible");

			if (!hidden.is(":visible")){
				visible.slideUp();
				hidden.slideDown(); 
			}

			return false;
		});
	
		// Handle checking/unchecking of categories
		j(".interactive_map #left input:checkbox").click(function(){
			var category = j(this).attr('name');
			if (!j(this).is(":checked")){
				hideCategory(category);
			}
			else {
				var section = j(this).parents("dd").attr('class');
				var image = 'maps_' + section + '.png';
				icon.image = 'http://www.baltimorecollegetown.org/images/' + image;
				showCategory(category);
			}
		});
	
		// Hide all categories in a section
		j(".interactive_map p.controls a.hide").click(function(){
			var section = 'dd.' + j(this).attr('rel');
			j(section).find("input:checkbox").each(function(){
				var category = j(this).attr('name');
				hideCategory(category);
				j(this).attr('checked', '');
			});
			return false;
		});

		// Show all categories in a section
		j(".interactive_map p.controls a.show").click(function(){
			var image = 'maps_' + j(this).attr('rel') + '.png';
			icon.image = 'http://www.baltimorecollegetown.org/images/' + image;
			var section = 'dd.' + j(this).attr('rel');
			var categories = new Array();
			j(section).find("input:checkbox").each(function(){
				var category = j(this).attr('name');
				if (markers[category]){
					showCategory(category);
				}
				else {
					categories.push(category);
				}
				j(this).attr('checked', 'checked');
			});
			if (categories.length != 0){
				fetchCategories(categories);
			}
			return false;
		});
		
		// recenter map
		j(".interactive_map form.recenter").submit(function(){
			var latlng = j(this).find(":input[name=location]").val().split(',');
			map.setCenter(new GLatLng(latlng[0], latlng[1]));
			return false;
		});
		j(".interactive_map form.shuttlerecenter").submit(function(){
			var latlng = j(this).find(":input[name=stop]").val().split(',');
			map.setCenter(new GLatLng(latlng[0], latlng[1]));
			return false;
		});		
	
		// search for specific address
		j("#address").submit(function(){
			var address = j("#address input.search_field").val();
			var api_key = 'ABQIAAAAycKccs9Xq9Wx_iEWw1YV_BReLjC_iv6Rbstw_sBo9L-7kgRJaBQn1Zs1WEemY-2SULYo858_UV1V6g';
			var url = 'http://maps.google.com/maps/geo?q=' + address + '&output=json&key=' + api_key;
			j("#loading").show();
			j.getJSON(url + '&callback=?', function(data){
				j("#loading").hide();
				if (data.Status.code == 200 && data.Placemark[0].AddressDetails.Country.AdministrativeArea.AdministrativeAreaName == 'MD') {
					point = new GLatLng(data.Placemark[0].Point.coordinates[1], data.Placemark[0].Point.coordinates[0]);
					icon.image = 'http://www.baltimorecollegetown.org/images/maps_attractions.png';
					var marker = new GMarker(point, icon);
					GEvent.addListener(marker,'click', function(){
							this.openInfoWindowHtml('<h2>' + address + '</h2>');
					});
					map.addOverlay(marker);
					map.setCenter(point);
					GEvent.trigger(marker, 'click');
				}
				else {
					alert("Address not found!");
				}
			});
			return false;
		});
	
	/*-------------------
			Tree View
	-------------------*/
		j("dl.tree dd").hide();
	
		j("a#tree_expand").click(function(){
			j("dl.tree dd").fadeIn();
			j("dl.tree dt a").addClass("expanded");
			return false;
		});
	
		j("a#tree_collapse").click(function(){
			j("dl.tree dd").fadeOut('normal', function(){
				j("dl.tree dt a").removeClass("expanded");
			});
			return false;
		});
	
		j("dl.tree dt a").click(function(){
			if (j(this).parent().next("dd").is(":visible")){
				j(this).parent().next("dd").fadeOut('normal', function(){
					j(this).prev("dt").children("a").toggleClass("expanded");
				});
			}
			else{
				j(this).parent().next("dd").fadeIn();
				j(this).toggleClass("expanded");
			}
			return false;
		});
	
	// Tabs
	j("ul.tabs li a").click(function(){
		if (!j(this).hasClass('active')){
			j("ul.tabs li a.active").removeClass('active');
			j(this).addClass('active');
			var tab = '#' + j(this).attr('rel');
			j("div.tab:visible").hide();
			j(tab).show();
		}
		return false;
	});
 
}); // end j(document).ready();

// closure so infoWindow has access to data
function createMarker(point, icon, data){
	var marker = new GMarker(point, icon);
	GEvent.addListener(marker,'click', function(){
			search_details(data.id);
	});
	return marker;
}

// fetch all items in category
function fetchCategory(category) {
	// check if markers already cached, if not, create array and fetch JSON data via AJAX
	if (!markers[category]){
		$("loading").show();
		markers[category] = new Array();
		j.getJSON('http://www.baltimorecollegetown.org/map.php?category=' + category, function(data){
			for (var i = 0; i < data.length; i++) {
				// create markers and add to map
				markers[category][i] = createMarker(new GLatLng(data[i].latitude,data[i].longitude), icon, data[i]);
				map.addOverlay(markers[category][i]);
			}
			$("loading").hide();
		});
	}
}

// fetch items from multiple categories in one request
function fetchCategories(categories) {
	if (categories.length != 0) {
		j("#loading").show();
		cats = categories.join('&categories[]=');
		j.getJSON('http://www.baltimorecollegetown.org/map.php?categories[]=' + cats, function(data){
			for (var category in data) {
				markers[category] = new Array();
				for (var i=0; i < data[category].length; i++) {
					// create markers and add to map
					markers[category][i] = createMarker(new GLatLng(data[category][i].latitude,data[category][i].longitude), icon, data[category][i]);
					map.addOverlay(markers[category][i]);
				}
			}
			j("#loading").hide();
		});
	}
}

function showCategory(category){
	// check if category has already been fetched and cached
	if (markers[category]) {
		for (var i=0; i < markers[category].length; i++) {
			markers[category][i].show();
		}
	}
	else {
		fetchCategory(category);
	}
}

function hideCategory(category){
	if (markers[category]) {
		for (var i=0; i < markers[category].length; i++) {
			markers[category][i].hide();
		}
	}
}