var
AJAX_TYPE = 103,
AJAX_PAGE = BASE_URL + "cluster-partner/";

chemieIcon = new GIcon(G_DEFAULT_ICON);
chemieIcon.image = BASE_URL + "typo3conf/ext/f03clusterpartner/res/chemie_point.png";
var marker_options = {
	icon:chemieIcon
};
var map;

var AJAX_LOADER = new Element("img", {
	src: BASE_URL + "typo3conf/ext/f03clusterpartner/res/ajax-loader.gif",
	alt: "loading..."
});

var partnersearchtoken_value = ""
function initSearch() {
	new Ajax.CachedAutocompleter("partnersearchtoken", "partnersearchresult", AJAX_PAGE, {
		callback : function (search) {
			partnersearchtoken_value = $F(search);

			return urlBuilder({
				tx_f03clusterpartner_pi1: {
					mode: "search_partner_ajax",
					search: partnersearchtoken_value
				},
				type: AJAX_TYPE
			});
		},
		frequency: 0.1,
		minChars: 2,
		afterUpdateElement : function(input, el) {
			if (el.hasClassName("partner")) {
				if (el.id == 0) {
					search_partner(partnersearchtoken_value, false);
				} else {
					search_partner(partnersearchtoken_value, true);
					partner_click(el.id);
				}
			} else {
				[
				"focus",
				"organisation",
				"sector"
				].each(function (category) {
					if (el.hasClassName(category)) navigation_click(category, el.id)
				});
			}
		}
	});

	emptyfield("partnersearchtoken", "Partnersuche"); // aus der Haupt-'script.js'
}

function initListe() {
	Event.observe(document.onresize ? document : window, "resize", resizeListe);

	resizeListe();
}

function resizeListe() {
	var container_height = Math.max(document.viewport.getHeight() - 350, 250);
	$("letters_container").setStyle({
		height: container_height + "px"
	});
	
	var list_height = $("letters").getHeight();

	if (list_height <= container_height) {
		$("liste_up").hide();
		$("liste_down").hide();
	} else {
		$("liste_up").show();
		$("liste_down").show();
	}
}

function navigation_click(block, id) {
	$("detail").update(AJAX_LOADER);

	new Ajax.Request(AJAX_PAGE, {
		parameters: urlBuilder({
			tx_f03clusterpartner_pi1: {
				mode: "navigation",
				block: block,
				id: id
			},
			type: AJAX_TYPE
		}),
		method: "get",
		onSuccess: function(transport) {
			var json = transport.responseText.evalJSON();
			$("navigation").update(json.navigation);
			$("alphabet_liste").update(json.alphabet_liste);
			resizeListe();
			$("detail").update(json.detail);
			showOverview(json.overview, true);
		}
	});

	return false; //Ausführung des Links abbrechen
}

var scrollbar;
function init_liste_scroll() {
	scrollbar = new Control.ScrollBar("letters_container", "scrollbar_track");
	
	$('liste_down').observe('click',function(event){
		scrollbar.scrollBy(50);
		event.stop();
	});

	$('liste_up').observe('click',function(event){
		scrollbar.scrollBy(-50);
		event.stop();
	});
	
	resizeListe();
}

function search_partner(search, keep_detail) {
	$("detail").update(AJAX_LOADER);

	new Ajax.Request(AJAX_PAGE, {
		parameters: urlBuilder({
			tx_f03clusterpartner_pi1: {
				mode: "search_partner",
				search: search
			},
			type: AJAX_TYPE
		}),
		method: "get",
		onSuccess: function(transport) {
			var json = transport.responseText.evalJSON();
			$("navigation").update(json.navigation);
			$("alphabet_liste").update(json.alphabet_liste);
			resizeListe();
			if (!keep_detail) {
				$("detail").update(json.detail);
				showOverview(json.overview, true);
			}
		}
	});

	return false; //Ausführung des Links abbrechen
}

function showOverview(overview, fit) {
	if (overview.size() > 0) {
		$("no_partner_found").hide();
		$("container_map").show();
		var bounds = new GLatLngBounds(
			//Süd-West- und Nord-Ost- Ecken von Bayern
			new GLatLng(47.5, 8.5), //SW
			new GLatLng(51.0, 13.0) //NE
			);

		initMap(bounds.getCenter());

		
		//map.setCenter(new GLatLng(0,0),0);
		//var bounds = new GLatLngBounds();

		overview.each(function (p) {
			if (p.latitude != 0 && p.longitude != 0) {
				addPartnerToMap(p.latitude, p.longitude, p.description);
				if (fit) bounds.extend(new GLatLng(p.latitude, p.longitude));
			}
		});

		map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		map.savePosition();
	} else {
		$("container_map").hide();
		$("no_partner_found").show();
	}
}

function alphabet_click(letter, first_id) {
	scrollbar.scrollTo($('letter_' + letter),true);

	//Ersten eintrag anzeigen

	return false; //Ausführung des Links abbrechen
}

var lastPartner = null;
function partner_click(id) {
	$("detail").update(AJAX_LOADER);

	if (lastPartner) lastPartner.removeClassName("auswahl");
	lastPartner = $("partner_" + id);
	if (lastPartner) lastPartner.addClassName("auswahl");


	new Ajax.Request(AJAX_PAGE, {
		parameters: urlBuilder({
			tx_f03clusterpartner_pi1: {
				mode: "detail",
				id: id
			},
			type: AJAX_TYPE
		}),
		method: "get",
		onSuccess: function(transport) {
			var json = transport.responseText.evalJSON();
			$("detail").update(json.detail);

			initMap(new GLatLng(json.latitude, json.longitude));

			marker = addPartnerToMap(json.latitude, json.longitude, json.description)
			marker.openInfoWindow(json.description);

			map.checkResize();
		}
	});

	return false; //Ausführung des Links abbrechen
}

function initMap(center) {
	map = new google.maps.Map2($("container_map"));
	//var point = new google.maps.LatLng(latitude, longitude);
	//map.setCenter(point, 13);
	map.setCenter(center, 13);
	map.addControl(new google.maps.LargeMapControl());
	map.enableContinuousZoom();
	map.enableScrollWheelZoom();
	map.addControl(new MapType());
	setMapType(G_PHYSICAL_MAP, "button_physical"); // Setzt auch den entsprechenden Button auf "active"
}

function addPartnerToMap(latitude, longitude, description) {
	var point = new google.maps.LatLng(latitude, longitude);
	var marker = new GMarker(point, marker_options);
	map.addOverlay(marker);


	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindow(description);
	});
	return marker;
}

var directions;
var container_map, container_directions;
var partner_latitude, partner_longitude, way_to, address;

function init_route() {
	container_map = $("container_map");
	container_directions = $("container_directions");
	partner_latitude = $("partner_latitude").value;
	partner_longitude = $("partner_longitude").value;
	way_to = $("way_to");
	address = $("address");

	map = new GMap2(container_map);
	calculate_route();
}

function calculate_route() {
	map.setCenter(new GLatLng(partner_latitude, partner_longitude), 3);
	directions = new GDirections(map, container_directions);

	GEvent.addListener(directions, "load", onGDirectionsLoad);
	GEvent.addListener(directions, "error", handleErrors);

	directions.load($F(way_to) ?
		"from: " + $F(address) + " to: " + partner_latitude + ", " + partner_longitude :
		"from: " + partner_latitude + ", " + partner_longitude + " to: " + $F(address), {
			locale: "de_DE"
		});

	map.checkResize();
}

function onGDirectionsLoad()	{
//Um an Informationen der load()-Funktion heranzukommen.
//Bei Nichtverwendung nicht loeschen!
}

function handleErrors()	{
	var code = directions.getStatus().code;
	if (code == G_GEO_UNKNOWN_ADDRESS || code == G_GEO_SERVER_ERROR || code == G_GEO_MISSING_QUERY)
		alert("Adresse wurde nicht gefungen!\nUnter Umständen war die Adressangabe nicht eindeutig oder die angegebene Adresse wurde garnicht gefunden.\nGeben Sie die gewünschte Adresse so genau wie möglich an:\n\tStraße Hausnummer, PLZ, Ort\n(Fehler " + code + ")");
	else if (code == G_GEO_BAD_KEY)
		alert("Google Maps API Key nicht gültig! Bitte teilen Sie diesen Fehler dem Administrator der Seite mit.\n(Fehler " + code + ")");
	else if (code == G_GEO_BAD_REQUEST)
		alert("Fehler bei der Berechnung. Bitte nochmal versuchen!\n(Fehler " + code + ")");
	else alert("Unbekannter Fehler!\nBitte versuchen Sie es später noch einmal.\n(Fehler " + code + ")");
}

function urlBuilder(obj, file) {
	var return_list = new Array();

	if (typeof obj == "object" && !Object.isArray(obj)) {
		for (var key in obj) {
			append_variable(key, obj[key]);
		}
	} else {
		return_list.push(obj);
	}

	return (file ? file + "?" : "") + return_list.join("&");

	function append_variable(prefix, params) {
		if (typeof params=='object' && Object.isArray(params)) {
			i = 0;
			params.each(function (value) {
				append_variable(prefix + "[" + i++ + "]", value);
			});
		} else if (typeof params == "object") {
			for (var key in params) {
				append_variable(prefix + "[" + key + "]", params[key]);
			}
		} else {
			return_list.push(prefix + "=" + params);
		}
	}
}

Ajax.CachedAutocompleter = Class.create();
Object.extend(Object.extend(Ajax.CachedAutocompleter.prototype, Autocompleter.Base.prototype), {
	initialize: function(element, update, url, options) {
		this.baseInitialize(element, update, options);
		this.options.asynchronous = true;
		this.options.onComplete = this.onComplete.bind(this);
		this.options.defaultParams = this.options.parameters || null;
		this.url = url;
		this.cache = {};
	},
	markPrevious: function() {
		this.index = (this.index > 0) ? this.index - 1 : this.entryCount - 1;
		/* this way makes the window scrolling brutally in addition of the list scrolling
		 this.getEntry(this.index).scrollIntoView(true); */
		var entry = this.getEntry(this.index);
		var layer = entry.up(1); // "update" element (suggestions list)
		var position = entry.positionedOffset();
		var overlap = {
			top: layer.scrollTop - position[1],
			bottom: (position[1] + entry.getHeight()) - (layer.getHeight() + layer.scrollTop)
		}
		var threshold = (0.1 * entry.getHeight());
		if (overlap.top > threshold) {
			layer.scrollTop = position[1];
		} else if (overlap.bottom > threshold) {
			layer.scrollTop += overlap.bottom;
		}
	},
	markNext: function() {
		this.index = (this.index < this.entryCount - 1) ? this.index + 1 : 0;
		/* this way makes the window scrolling brutally in addition of the list scrolling
		 this.getEntry(this.index).scrollIntoView(false); */
		var entry = this.getEntry(this.index);
		var layer = entry.up(1); // "update" element (suggestions list)
		var position = entry.positionedOffset();
		var overlap = {
			top: layer.scrollTop - position[1],
			bottom: (position[1] + entry.getHeight()) - (layer.getHeight() + layer.scrollTop)
		};
		var threshold = (0.1 * entry.getHeight());
		if (overlap.top > threshold) {
			layer.scrollTop = position[1];
		} else if (overlap.bottom > threshold) {
			layer.scrollTop += overlap.bottom;
		}
	},
	getUpdatedChoices: function() {
		var t = this.getToken();
		if (this.cache[t]) {
			this.updateChoices(this.cache[t].result);
			$("search_result_persistent").update(this.cache[t].result_category);
		} else {
			entry = encodeURIComponent(this.options.paramName) + '=' + encodeURIComponent(t);
			this.options.parameters = this.options.callback ? this.options.callback(this.element, entry) : entry;
			if (this.options.defaultParams) this.options.parameters += '&' + this.options.defaultParams;
			new Ajax.Request(this.url, this.options);
		}
	},
	onComplete: function(request) {
		var json = request.responseText.evalJSON();
		if (json.search == this.getToken()) {
			this.updateChoices((this.cache[json.search] = json).result);
			$("search_result_persistent").update(json.result_category);
		}
	}
});

function MapType() {}

MapType.prototype = new GControl();
MapType.prototype.initialize = function(map) {
	var container = Builder.node("div", {
		className: "map_type"
	}, [
	type_normal = Builder.node("div", {
		id: "button_normal",
		className: "map_button left"
	}, "Karte"),
	type_satellite = Builder.node("div", {
		id: "button_satellite",
		className: "map_button middle"
	}, "Satellit"),
	type_physical = Builder.node("div", {
		id: "button_physical",
		className: "map_button middle"
	}, "Gelände"),
	type_hybrid = Builder.node("div", {
		id: "button_hybrid",
		className: "map_button right"
	}, "Hybrid"),
	Builder.node("br", {
		style: "clear:both"
	})
	]);

	Event.observe(type_normal, 'click', function() {
		setMapType(G_NORMAL_MAP, "button_normal");
	});
	Event.observe(type_satellite, 'click', function() {
		setMapType(G_SATELLITE_MAP, "button_satellite");
	});
	Event.observe(type_physical, 'click', function() {
		setMapType(G_PHYSICAL_MAP, "button_physical");
	});
	Event.observe(type_hybrid, 'click', function() {
		setMapType(G_HYBRID_MAP, "button_hybrid");
	});

	map.getContainer().appendChild(container);
	return container;
}

var activeMapType = null;
function setMapType(type, button) {
	map.setMapType(type);
	if (activeMapType) activeMapType.removeClassName("active");
	activeMapType = $(button);
	activeMapType.addClassName("active");
}

MapType.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(5, 0));
}