/**!
 * Licensing information
 *
 * Author: Sandro Franchi (sandro.franchi@gmail.com)
 * (c) Copyright Sandro Franchi, 2009-2010
 * Dual licensed under the MIT and GPL licenses.
 *
 */

var dragged = false;
var loading = false;
var browser = navigator.userAgent.toLowerCase();
var ajaxJasonURI = '/ajax_json';
var isIE6 = ((browser.indexOf("msie 6") != -1) && (browser.indexOf("msie 7") == -1) && (browser.indexOf("msie 8") == -1));
var googleMap = null;

var orgs = [];
var orgids = [];
var markerClusterer = null;
var markerClustererOptions = {gridSize: 60};
google.load('maps', '2');

function map_add_marker(point, item) {
	var iconOptions = {};
	if (item.color_mapa.length == 6) {
		iconOptions.primaryColor = "#" + item.color_mapa;
	} else {
		iconOptions.primaryColor = "#ffffff";
	}
	iconOptions.strokeColor = "#000000";
	iconOptions.width = 24;
	iconOptions.height = 24;
	var icon = MapIconMaker.createMarkerIcon(iconOptions);
	var marker = new GMarker(point, {
		icon : icon
	});

	marker._item = item;
	marker._itemID = item.id;

	if (marker !== null) {
		orgs.push(marker);
		orgids.push(item.id);

		$("#org_items").append(sprintf("<option title='%s' value='%d' class='orgs_list_item {data:%d}'>%s</option>",
								item.nombre, item.id, item.tipo, item.nombre)
								);

		GEvent.addListener(marker, "click", function() {
			openOrgsList(true);
			$("#org_items").val(marker._itemID);
			showMarkerInfoWindow(marker._itemID);
		});
	}
	return point;
}

function showMarkerInfoWindow(itemID) {
	var item = null;
	var point = null;

	for ( var i = orgs.length - 1; i >= 0; i--) {
		if (orgs[i]._item.id == itemID) {
			item = orgs[i]._item;
			point = orgs[i].getLatLng();
			break;
		}
	}

	// Set the balloon information
	var balloonHTML = "<h1>%s</h1>" +
					  "<p><strong>Domicilio:</strong> %s</p>" +
					  "<p><strong>Localidad:</strong> %s <strong>Código postal:</strong> %s</p>" +
					  "<p><strong>Provincia:</strong> %s</p>" +
					  "<p><strong>Correo electrónico:</strong> %s</p>" +
					  "<p><strong>Página web:</strong> %s</p>" +
					  "<p><strong>Teléfonos:</strong> %s</p>";
	
	// Check URL protocol
	if (! empty(item.url)) {
		if(item.url.indexOf('http://') != 0) {
			item.url = 'http://' + item.url;
		}	
	}
	
	balloonHTML = sprintf(balloonHTML, 
						  item.nombre, 
						  (empty(item.direccion)) ? '---' : item.direccion, 
						  (empty(item.nombre_ciudad)) ? '---' : item.nombre_ciudad, 
						  (empty(item.codigo_postal)) ? '---' : item.codigo_postal, 
						  item.nombre_provincia,
						  (empty(item.email)) ? '---' : sprintf("<a class=\"balloon_link\" title=\"Enviar email a esta organización\" href=\"mailto:%s\">%s</a>", item.email, item.email),
						  (empty(item.url)) ? '---' : sprintf("<a class=\"balloon_link\" title=\"Visitar la página de esta organización\" href=\"%s\" target=\"_blank\" >%s</a>", item.url, item.url),
						  item.telefonos);

	var infoHTML = sprintf("<h1>%s</h1>", item.nombre);
	infoHTML += "<p><strong>Domicilio:</strong> "+ item.direccion+"</p>";
	infoHTML += "<p><strong>Localidad:</strong> "+ item.nombre_ciudad + "<strong>CP:</strong> " + item.codigo_postal +"</p>";
	infoHTML += "<p><strong>Provincia:</strong> "+item.nombre_provincia+"</p>";
	infoHTML += "<p><strong>Correo electrónico:</strong> "+ item.email+"</p>";
	infoHTML += "<p><strong>Página web:</strong> "+item.url+"</p>";
	infoHTML += "<p><strong>Teléfonos:</strong> "+item.telefonos+"</p>";

	googleMap.openInfoWindowHtml(point, sprintf(
			'<div id="org_contact_data_balloon">%s</div>', balloonHTML), {
		maxWidth : 600
	});

	// Set the activities information
	var activitiesHTML = "<h4>Areas de formación</h4><ul>%s</ul>%s<br /><br /><h4>Areas de investigación</h4><ul>%s</ul>%s<br /><br />";
	
	// "Formación" data
	var formacionHtml = '';
	$(item.areas_formacion).each(function(i, formacion){
		formacionHtml += sprintf("<li>%s</li>",formacion.nombre);
	});
	var formacionActivities = '';
	if (!empty(item.actividades_formacion)) {
		formacionActivities = sprintf("<em>Actividades:</em> %s", item.actividades_formacion);
	}

	// "Investigación" data
	var investigacionHTML = '';
	$(item.areas_investigacion).each(function(i, investigacion){
		investigacionHTML += sprintf("<li>%s</li>",investigacion.nombre);
	});
	var investigacionActivities = '';
	if (!empty(item.actividades_investigacion)) {
		investigacionActivities = sprintf("<em>Actividades:</em> %s", item.actividades_investigacion);
	}
	
	activitiesHTML = sprintf(activitiesHTML, formacionHtml, formacionActivities, investigacionHTML, investigacionActivities);
	
	$("#org_contact_data").html(activitiesHTML);
	
	// Set the responsibles information
	var responsiblesData = '';
	$(item.responsables).each(function(i, responsable){
		responsiblesData += sprintf("<li>%s (%s)</li>", 
									responsable.nombre, 
									(empty(responsable.cargo)) ? 'Cargo desconocido' : responsable.cargo);
	});
	
	var responsiblesHTML = "<ul>" + responsiblesData + "</ul>";
	$("#org_details").html(responsiblesHTML);

	return false;
}

function setContentHeight() {
	var content = document.getElementById("content");
	var content_height = document.getElementById("footer").offsetTop
	- content.offsetTop
	- document.getElementById("bottom").offsetHeight - 20;
	content.style.height = content_height + "px";
	document.getElementById("map").style.height = content_height + "px";
}

function map_initialize() {
	googleMap = new google.maps.Map2(document.getElementById("map"));
	googleMap.setMapType(G_PHYSICAL_MAP);
	googleMap.setUIToDefault();
	googleMap.disableScrollWheelZoom();
	googleMap.addControl(new GOverviewMapControl(new GSize(200,200))); 
	resetMap();
}

function resetSelector() {
	$("#selector_form input[type=checkbox]:checked").each(function(i, item) {
		var org_type = $(item).parent().metadata().data;
		var org_name = $(item).parent().metadata().name;
		$(item).attr('checked', false);
		$("#org_label_" + org_type).html(org_name);
	});
}

function resetClusterer() {
	googleMap.closeInfoWindow();
	orgs.length = 0;
	orgids.length = 0;
	if (markerClusterer != null) {
		markerClusterer.clearMarkers();
	}
	markerClusterer = new MarkerClusterer(googleMap, orgs, markerClustererOptions);
	//openOrgsList(false);
	resetOrgList();
	resetMap();
}

function resetMap() {
	var bounds = new GLatLngBounds(new GLatLng(-56.1, -75.0), new GLatLng(
			-21.7, -52.8));
	var zoom = googleMap.getBoundsZoomLevel(bounds);
	googleMap.setCenter(bounds.getCenter(), zoom);
}

function resetOrgList() {
	$("#org_contact_data").html('');
	$("#org_details").html('');
	$("#org_items").html('');
}

function do_search(form) {
	if (form.search_field.value.length < 3) {
		alert('Por favor ingrese un término de al menos tres caracteres de largo.');
		return false;
	}

	loading = true;

	$("#results_count")
	.html(
	"<img src='/img/ajax-loader.gif?v=101' width='15' height='15' alt=''/ style='vertical-align:top;'> Buscando...");
	$("#results_count").show();

	$.getJSON(
			ajaxJasonURI,
			{
				method : 'search',
				data : form.search_field.value,
				type : $('input[name=search_type]:checked').val()
			},
			function(data) {
				if (data.total > 0) {
					resetSelector();
					resetClusterer();

					var bounds = new GLatLngBounds();
					for ( var i = 0; i < data.orgs.length; i++) {
						bounds.extend(map_add_marker(new GLatLng(
								data.orgs[i].latitud,
								data.orgs[i].longitud), data.orgs[i]));
					}
					if (markerClusterer != null) {
						markerClusterer.clearMarkers();
					}
					markerClusterer = new MarkerClusterer(googleMap,
							orgs, markerClustererOptions);
					var zoom = googleMap.getBoundsZoomLevel(bounds);
					googleMap.setCenter(bounds.getCenter(), zoom);
					$("#results_count").html(
							sprintf("%d organizaciones", data.total));
					// Show the results list
					openOrgsList(true);
					// There is only one result? Click on it.
					if (data.total == 1 ){
						$('#org_items')[0].selectedIndex = 0;
						$('#org_items').change();
					}
				} else {
					$("#results_count").hide();
					alert('No se encontraron organizaciones que respondan a ese criterio de búsqueda');
				}

				loading = false;
			});

	return false;
}

function loadOrgData(element, event) {
	loading = true;

	$("input.org_type_selector").attr('disabled', 'disabled');
	$("#results_count").hide();
	$("#search_field").val("");

	googleMap.closeInfoWindow();
	$("#org_contact_data").html('');
	$("#org_details").html('');

	var checked = $(element).attr('checked');
	var org_type = $(element).parent().metadata().data;
	var org_name = $(element).parent().metadata().name;

	event.stopPropagation();

	$("#org_label_" + org_type)
	.html(
			sprintf(
					"%s <img src='/img/ajax-loader.gif?v=101' width='15' height='15' alt=''/ style='vertical-align:top;'>",
					org_name));
	if (checked) {

		if ($("#selector_form input[type=checkbox]:checked").length == 1) {
			resetClusterer();
		}

		$.getJSON(ajaxJasonURI, {
			method : 'orgs_mapa',
			data : org_type
		}, function(data) {
			for ( var i = 0; i < data.orgs.length; i++) {
				map_add_marker(new GLatLng(data.orgs[i].latitud,
						data.orgs[i].longitud), data.orgs[i]);
			}
			// Refresh the clusters
			if (markerClusterer != null) {
				markerClusterer.clearMarkers();
			}
			markerClusterer = new MarkerClusterer(googleMap, orgs, markerClustererOptions);
			$("#org_label_" + org_type).html(
					sprintf("%s (%d)", org_name, data.total));

			loading = false;
		});
	} else {
		// Delete the unselected organizations
		for ( var i = orgs.length - 1; i >= 0; i--) {
			if (orgs[i]._item.tipo == org_type) {
				// Delete the organization id from the list of ids
				for ( var n = orgs.length - 1; n >= 0; n--) {
					if (orgids[n] == orgs[i]._item.id) {
						orgids.splice(n, 1);
						break;
					}
				}
				// Now delete the organization
				orgs.splice(i, 1);
			}
		}
		var f = $("#org_items option");
		$("#org_items option").each(function(i, item) {
			var item_type = $(item).metadata().data;
			if (item_type == org_type) {
				$(item).remove();
			}
		});
		// Refresh the clusters
		if (markerClusterer != null) {
			markerClusterer.clearMarkers();
		}
		markerClusterer = new MarkerClusterer(googleMap, orgs, markerClustererOptions);
		$("#org_label_" + org_type).html(org_name);

		loading = false;
	}
	$("input.org_type_selector").removeAttr('disabled');
}

function openOrgsList(open) {

	if (open) {
		$("#bottom_content").show();
		$('#result_search').addClass('expanded');
		$('#description_one').addClass('expanded');
		$('#description_two').addClass('expanded');
	} else {
		$("#bottom_content").hide();
		$('#result_search').removeClass('expanded');
		$('#description_one').removeClass('expanded');
		$('#description_two').removeClass('expanded');
	}
	setContentHeight();
	googleMap.checkResize();
}

setContentHeight();
window.onresize = function() {
	setContentHeight();
};

$(function() {
	// Turn all the checkboxes off
	$('input[type="checkbox"]').attr('checked', false);

	// Load the map
	map_initialize();
	
	// Turn off jQuery AJAX cache
	$.ajaxSetup( {
		cache : false
	});

	$("#org_items").change(function() {
		showMarkerInfoWindow($(this).val());
	});

	$("#top_menu_help").click(function() {
		$("#tab_help").slideToggle();
	});

	$("#top_menu_about").click(function() {
		$("#tab_help").slideUp();
		$("#tab_about").slideToggle();
	});

	$("#toggle").click(function() {
		$("#bottom_content").toggle();
		$('#result_search').toggleClass('expanded');
		$('#description_one').toggleClass('expanded');
		$('#description_two').toggleClass('expanded');		
		setContentHeight();
		googleMap.checkResize();
	});

	$("#bottom_content").click(function() {
		return false;
	});

	setTimeout(function() {
		$("#tab_about").slideUp()
	}, 30000);

	$("#about_close").click(function() {
		$("#tab_about").slideUp();
	});

	$("#help_close").click(function() {
		$("#tab_help").slideUp();
	});

	$("#selector").draggable( {
		addClasses : false,
		delay : 100,
		stop : function() {
		dragged = true;
	}
	});

	$("#tab_about").draggable( {
		addClasses : false,
		delay : 0
	});

	$("#selector_title")
	.click(
			function() {
				if (dragged) {
					dragged = false;
					return false;
				}

				$("#selector_forms_wrapper").toggle();
				$("#selector_footer").toggle();
				$(this).toggleClass("collapsed");

				if (isIE6) {
					if ($(this).hasClass("collapsed")) {
						$(this)
						.css("background",
						"transparent url(/img/panel.png?v.110) no-repeat center top");
					} else {
						$(this)
						.css("background",
						"transparent url(/img/panel_top.png?v.110) no-repeat center top");
					}
					try {
						DD_belatedPNG.fix('#selector_title');
					} catch (e) {
					}
				}
			});

	$("li.org_selector, li.org_selector_hidden").click(
			function(event) {
				if (loading) {
					return false;
				}

				if (dragged) {
					dragged = false;
					return false;
				}

				var checkbox = $(this).children("input[type=checkbox]");
				$(checkbox).attr('checked',
						($(checkbox).attr('checked') ? false : true));

				loadOrgData(checkbox, event);
				return true;

			});

	$(
	"li.org_selector input[type=checkbox], li.org_selector_hidden input[type=checkbox]")
	.click(function(event) {
		if (loading) {
			return false;
		}

		loadOrgData(this, event);
		return true;
	});

	$("#view_more").click(function() {
		$("li.org_selector_hidden").slideToggle();
		var more_image = $("#more_image");
		$(more_image).toggleClass("expanded");
		if ($(more_image).hasClass("expanded")) {
			$("#more_text").html("Ver menos");
		} else {
			$("#more_text").html("Ver más");
		}
	});

	$("#map_reset").click(function() {
		resetClusterer();
		resetSelector();
	});
});


