// URL Umzugstipps
var tippSrc = '/umzugtipps.request';
var addressSrc = '/behoerden.request';
var notepadSrc = '/notepad.request';
var autoComleteSrc = '/autocomplete.request';

// Platzhalter mit Ladeanimation
var loadingItems = '<tr><td class="loading">&nbsp;</td></tr>';
// Request-Hilfsvariable
var req = false;

var map = null;
var geocoder = null;

// Hauptthemen laden
jQuery(document).ready( function(){
	jQuery("#main_items").load(tippSrc+'?main',null,bindActions);
	jQuery("#main_items").html(loadingItems);
	jQuery.inputEnter("#div_formFrame", submitForm);
	jQuery("#notepad ul").html('<li class="loading">&nbsp;</li>');
	if(jQuery.browser.msie){
		jQuery("#notepad ul").load(notepadSrc,{time:new Date(),browser: "msie"},bindActions);
	}
	else {
		jQuery("#notepad ul").load(notepadSrc,null,bindActions);
	}
	jQuery('#notepad_body').css('height',notepadHeight);
	jQuery('#notepad_bottom').click(toggleNotepad);
	//jQuery('#notepad').mouseout(closeNotepad);
	jQuery('#notepad').hover(openNotepad,closeNotepad);

	jQuery("#new_search").click(enableSearch);

	if (jQuery("#map_canvas")[0] && GBrowserIsCompatible()) {
	    map = new GMap2(document.getElementById("map_canvas"));
	    map.setCenter(new GLatLng(37.4419, -122.1419), 13);
	    geocoder = new GClientGeocoder();
	 }

	bindActions();
});

function submitForm() {
	jQuery("#adress_search").click();
}
// EventHandler für AJAX-Content - muss als Callback-Funktion aufgerufen werden
function bindActions() {
	// Unterthemen laden
	jQuery("#main_items td").click( function(){
		var id = jQuery(this).parent().attr("id");
		if (req) req.abort();
		req = jQuery.get(tippSrc+'?items='+id,null,function(data){
				jQuery("#sub_items").html(data);
				bindActions();
		});
		jQuery("#sub_items").html(loadingItems);
		jQuery("#tipps").html('&nbsp;');
		jQuery("#tipp_content").html('<table height="'+ jQuery("#tipp_content").height() +'" width="220"><tr><td></td></tr></table>');
	});
	// Tipps laden
	jQuery("#sub_items td").click( function(){
		var id = jQuery(this).parent().attr("id");
		if (req) req.abort();
		req = jQuery.get(tippSrc+'?tipps='+id,null,function(data){
				jQuery("#tipps").html(data);
				bindActions();
		});
		jQuery("#tipps").html(loadingItems);
		jQuery("#tipp_content").html('<table height="'+ jQuery("#tipp_content").height() +'" width="220"><tr><td></td></tr></table>');
	});
	// Tipp-Text laden
	jQuery("#tipps td").click( function(){
		var id = jQuery(this).parent().attr("id");
		if (req) req.abort();
		req = jQuery.get(tippSrc+'?tipp='+id,null,function(data){
				jQuery("#tipp_content").html(data);
				bindActions();
				document.location.hash = "#notepad_top";
		});
		jQuery("#tipp_content").html('<table height="'+ jQuery("#tipp_content").height() +'" width="220">'+loadingItems+'</table>');
	});
	// Tipp von Merkzettel laden
	jQuery("#notepad li.note_tipp span").click( function(){
		var id = jQuery(this).parent().find("[name=tipp]").val();
		if (req) req.abort();
		req = jQuery.get(tippSrc+'?tipp=tipp_'+id,null,function(data){
				jQuery("#tipp_content").html(data);
				bindActions();
				document.location.hash = "#notepad_top";
		});
		jQuery("#tipp_content").html('<table height="'+ jQuery("#tipp_content").height() +'" width="220">'+loadingItems+'</table>');
	});

// Mouseover/Aktivierung in Tipp-Auswahl
	jQuery(".tipp_selector td").hover(
		function(){
			jQuery(this).parent().addClass("hover");
		},
		function(){
			jQuery(this).parent().removeClass("hover");
		}
	);
// Hihglighting der Tipp-Auswahl
	jQuery(".tipp_selector td").click(
		function(){
			jQuery(this).parent().parent().find(".active").removeClass("active");
			jQuery(this).parent().addClass("active");
		}
	);


// Accordion-Effekt für Adressen
	jQuery("#accordion").accordion({
		header: "h3",
		autoHeight: false,
		change: function() {
			loadMap("#accordion .selected");
		}
	});

}


//Umzugsort gecoordinate suchen
var route_start = "";
function searchGeoCo() {
	jQuery("#doSearchWebArts").hide();
	jQuery("#doSearch").show();
	jQuery("#formErrorGoogle").hide();
	jQuery("span.error").hide();

	jQuery("#tipp_content").empty();

	var $street = jQuery("input[name=street]");
	var $nr = jQuery("input[name=nr]");
	var $zip = jQuery("input[name=zip]");
	var $city = jQuery("input[name=city]");

	var streetOK = checkRequired($street);
	var nrOK = checkRequired($nr);
	var nrNumber = checkNumber($nr);
	var zipOK = checkRequired($zip);
	var zipZip = checkZip($zip);
	var cityOK = checkRequired($city);

	var abort = false;
	if(!streetOK || !nrOK || !zipOK || !cityOK) {
		jQuery("#formError").show();
		abort = true;
	}
	else {
		jQuery("#formError").hide();
	}

	abort = abort || !nrNumber || !zipZip;

	var $aemterE = jQuery("#aemterE");
	var $aemterA = jQuery("#aemterA");
	var $aemterK = jQuery("#aemterK");
	var $kinder = jQuery("#kinder");
	var $school = jQuery("#school");

	//Die rheinfolge ist wichtig, sonst keine val der checkboxen
	if(!checkSelectedSearch($aemterE, $aemterA, $aemterK, $kinder, $school) || abort) {
		jQuery("#errorDiv").show();
		jQuery("#doSearch").hide();
		return false;
	}
	jQuery("#errorDiv").hide();

	var address = $street.val() + " " + $nr.val() + ", " + $zip.val() + " " + $city.val() + ", GERMANY";
	route_start = address;
	geocoder.getLatLng(address,googleGeoCo);

	return false;
}

function checkSelectedSearch($aemterE, $aemterA, $aemterK, $kinder, $school) {
	var aemterEV = $aemterE.attr("checked");
	var aemterAV = $aemterA.attr("checked");
	var aemterKV = $aemterK.attr("checked");
	var kinderV = $kinder.attr("checked");
	var schoolV = $school.attr("checked");

	if(aemterEV || aemterAV || aemterKV || kinderV || schoolV) {
		jQuery("#formErrorKategorie").hide();
		$aemterE.parent().removeClass("error");
		$aemterA.parent().removeClass("error");
		$aemterK.parent().removeClass("error");
		$kinder.parent().removeClass("error");
		$school.parent().removeClass("error");
		return true;
	}
	else {
		jQuery("#formErrorKategorie").show();
		$aemterE.parent().addClass("error");
		$aemterA.parent().addClass("error");
		$aemterK.parent().addClass("error");
		$kinder.parent().addClass("error");
		$school.parent().addClass("error");
		return false;
	}
}

function checkRequired($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(!value || value == "") {
		$input.addClass("error");
		$input.prev().addClass("error");
		return false;
	}
	else {
		$input.removeClass("error");
		$input.prev().removeClass("error");
		return true;
	}
}

function checkNumber($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(value.match(/^\d{1,4}[a-z]{0,2}$/)) {
		$input.removeClass("error");
		jQuery("#formErrorNumber").hide();
		return true;
	}
	else {
		$input.addClass("error");
		jQuery("#formErrorNumber").show();
		return false;
	}
}

function checkZip($input) {
	var value = $input.val();
	value = value.replace (/^\s+/, '').replace (/\s+$/, '');
	if(value.match(/^\d{5}$/)) {
		$input.removeClass("error");
		jQuery("#formErrorZip").hide();
		return true;
	}
	else {
		$input.addClass("error");
		jQuery("#formErrorZip").show();
		return false;
	}
}

function googleGeoCo(point) {
	jQuery("#doSearchGoogle").hide();
	if (!point) {
		jQuery("#errorDiv").show();
		jQuery("#formErrorGoogle").show();
		return;
    }
	else {
		jQuery("#doSearchWebArts").show();
		doWebArtsSearch(point);

//		map.setCenter(point, 13);
//		var marker = new GMarker(point);
//		map.addOverlay(marker);
//		marker.openInfoWindowHtml(address);
	}

}

function doWebArtsSearch(point) {

	disableSearch();

	var aemterEV = jQuery("#aemterE").attr("checked");
	var aemterAV = jQuery("#aemterA").attr("checked");
	var aemterKV = jQuery("#aemterK").attr("checked");
	var kinderV = jQuery("#kinder").attr("checked");
	var schoolV = jQuery("#school").attr("checked");

	var url = addressSrc;
	url += "?lat=";
	url += point.y;
	url += "&lng=";
	url += point.x;

	url += "&zip=";
	url += jQuery("#zip").val();

	if(aemterEV)
		url += "&aemterE=";

	if(aemterAV)
		url += "&aemterA=";

	if(aemterKV)
		url += "&aemterK=";

	if(kinderV)
		url += "&kinder=";

	if(schoolV)
		url += "&school=";

	url += "&time=";
	url += new Date();

	req = jQuery.get(url, null, renderResult);
}

function renderResult(data) {
	jQuery("#doSearchWebArts").hide();

	if(data == "Paramerter is missing! Neede lat, lng and zip!") {
		jQuery("#errorMissing").show();
		return;
	}
	else if(data == "Nothing to search. Aemter, Kindergaerten and Schulen are false.") {
		jQuery("#errorNothing").show();
		return;
	}
	else if(data.indexOf("<form") == -1) {
		jQuery("#errorEmpty").show();
		return;
	}

	jQuery("#tipp_content").html(data);
	bindActions();

	jQuery("div.distKika4").hide();
	jQuery("div.distKika8").hide();

	jQuery("div.distSchool4").hide();
	jQuery("div.distSchool8").hide();

	checkAemterEmpty();
	checkKikaEmpty();
	checkSchoolEmpty();

	loadMap("#accordion .selected");

	jQuery("input[name=route_start]").val(route_start);

}

function checkAemterEmpty() {
	if(!jQuery("div.kikaCat:first")[0]){
		jQuery("#noKika").show();
		jQuery("#noKikaRadius").hide();
	}
	else if(!jQuery("div.kikaCat:visible:first")[0]) {
		jQuery("#noKika").hide();
		jQuery("#noKikaRadius").show();
	}
	else {
		jQuery("#noKika").hide();
		jQuery("#noKikaRadius").hide();
	}
}

function checkKikaEmpty() {
	if(!jQuery("div.kikaCat:first")[0]) {
		jQuery("#noKika").show();
		jQuery("#noKikaRadius").hide();

		jQuery("span.kikaU").hide();

		jQuery("a.kika2").hide();
		jQuery("span.kika2").hide();

		jQuery("a.kika4").hide();
		jQuery("span.kika4").hide();

		jQuery("a.kika8").hide();
		jQuery("span.kika8").hide();
	}
	else if(!jQuery("div.kikaCat:visible:first")[0]){
		jQuery("span.kikaU").show();
		jQuery("#noKika").hide();
		jQuery("#noKikaRadius").show();
	}
	else {
		jQuery("span.kikaU").show();
		jQuery("#noKika").hide();
		jQuery("#noKikaRadius").hide();
	}
}

function disableSearch() {
	jQuery("#adress_search").hide();
	jQuery("#new_search").show();
	jQuery("#div_formPagingFrameSpacer table input").attr("disabled", "disabled");
}

function enableSearch() {
	jQuery("#adress_search").show();
	jQuery("#new_search").hide();
	jQuery("#div_formPagingFrameSpacer table input").removeAttr("disabled");
}

// Tipp merken
function updateNotepadButton(button) {
	updateNotepad(jQuery(button).parent()[0]);
}

function updateNotepad(formNode) {
	if(jQuery.browser.msie){
		jQuery(formNode).ajaxSubmit({
			url:	notepadSrc,
			type:	'POST',
			target:	'#notepad ul',
			data: {browser: "msie"},
			skipEncodingOverride: true
		});
	}
	else {
		jQuery(formNode).ajaxSubmit({
			url:	notepadSrc,
			type:	'POST',
			target:	'#notepad ul',
			data: {browser: "msie"},
			skipEncodingOverride: true
		});
	}
	// Transfer-Effekt für Merken-Buttons
	jQuery(formNode).find("button.save_button")
			.effect("transfer", { to: "div#notepad" }, 1000)
			.attr("disabled","disabled")
			.addClass("disabled");
	if (jQuery(formNode).find("input[name=action]").val() == "remove") {
		var value = jQuery(formNode).find("input[name=tipp]")
				.add(jQuery(formNode).find("input[name=amt]"));
		jQuery("#tipp_content form:has(input[value="+ jQuery(value).val() +"]) button")
				.removeClass("disabled")
				.attr("disabled","");
	}

	return false;
}

// Merkzettel ein- / ausblenden
//var notepadHeight = '168px';
var notepadHeight = '1em';

function toggleNotepad(){
	if(jQuery('#notepad_body').css('height') == notepadHeight) {
		openNotepad();
	} else {
		closeNotepad();
	}
}
function openNotepad(){
	var listHeight = jQuery('#notepad_body ul').height();
	
//	if (jQuery("#notepad_body li").size()<2) return false;
	
	if (document.all && jQuery.browser.version <= 7) { // IE zeigt Annimation fehlerhaft an
		jQuery('#notepad_body').css('height',listHeight + 'px');
		jQuery('#notepad_bottom').addClass('up');
	} else {
		jQuery('#notepad_body').animate(
			{height: listHeight + 'px'},
			500,
			function(){jQuery('#notepad_body').css('overflow-y','auto');}
		);
		jQuery('#notepad_bottom').addClass('up');
	}
	return false;
}
function closeNotepad(){

	if (document.all && jQuery.browser.version <= 7) { // IE zeigt Annimation fehlerhaft an
		jQuery('#notepad_body').css('height',notepadHeight);
		jQuery('#notepad_bottom').removeClass('up');
	} else {
		jQuery('#notepad_body').css('overflow-y','hidden');
		jQuery('#notepad_body').animate({height:notepadHeight},300);
		jQuery('#notepad_bottom').removeClass('up');
	}
	return false;
}

// Google-Map anzeigen
// Parameter ist ein jQuery-Selector für einen Knoten, der Geo-Koordinaten und Ziel-ID der Map als
// hidden-Fields enthält
function loadMap(parent) {
	if (GBrowserIsCompatible()) {
		var $div = jQuery(parent);
		var $form = $div.find("form:first");
		var target =  jQuery("#map_" + jQuery(parent).find("input[name=amt]").val());
		var lat = jQuery(parent).find("input[name=geoLat]").val();
		var lng = jQuery(parent).find("input[name=geoLng]").val();

		var amt = target.parent().hasClass("amt");
		var kika = target.parent().hasClass("kika");
		var school = target.parent().hasClass("school");


		var posX = 0;
		var elem;
		if(amt) {
			elem = jQuery("h1.aemterCat:visible:first + div");
			if(!elem[0])
				elem = jQuery("h1.aemterCat:visible:first + span");
		}
		else if(kika) {
			elem = jQuery("div.kikaCat:visible:first");
		}
		else if(school) {
			elem = jQuery("div.schoolCat:visible:first div.distSchool2:visible:first");
			if(!elem[0])
				elem = jQuery("div.schoolCat:visible:first div.distSchool4:visible:first");
			if(!elem[0])
				elem = jQuery("div.schoolCat:visible:first div.distSchool8:visible:first");
			if(!elem[0])
				elem = jQuery("div.schoolCat:visible:first span:first");
		}

		if(elem[0]) {
			posX = elem.position().top;
		}

		var $parent = target.parent();
		$parent.css("top", posX + 1);

		jQuery("#route").css("margin-top", posX + 430);

		var $parentParent = $parent.parent();
		var $marker_text = $parentParent.find("div.marker_text");

		var map = new GMap2(target[0]);
		var point = new GLatLng(lat, lng);
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.setCenter(point, 14);
		var marker = new GMarker(point);
		map.addOverlay(marker);
		marker.openInfoWindowHtml($marker_text.html());

		return map;
	}
}

// Route zur aktuellen Adresse
function getRoute(form) {
	var map = loadMap("#accordion .selected");
	var route_target = "route";
	var route_start = jQuery(form).find("input[name=route_start]").val();
	var route_end = jQuery(form).find("input[name=route_end]").val();

	jQuery("#route").text('');

	try {
		directions = new GDirections(map, document.getElementById(route_target));
		directions.load("from: "+ route_start +" to: "+ route_end);
		GEvent.addListener(directions, "load", function() {
			jQuery("#route").prepend("<h4>Route nach/zu "+ route_end +"<br/>"+ directions.getSummaryHtml() +"</h4>");

			var printUrl = 'http://maps.google.de/maps?f=d&source=s_d&hl=de&geocode=&mra=ls&ie=UTF8&z=8&pw=2';
			printUrl += '&saddr='+encodeURIComponent(route_start);
			printUrl += '&daddr='+encodeURIComponent(route_end);

			jQuery("#route").prepend('<div style="text-align:right">'
					+'<a href="'+printUrl+'" target="_blank">'
					+'<img src="/sc/img/arrow_link.gif" alt="" /> '
					+'Route drucken</a></div>');
			// Merken-Button für Route konfigurieren und einblenden
			// Übertrag ins PDF funktioniert nicht, deshalb Funktion ausgeblendet
			/*jQuery("#accordion .selected form.save_route input[name=address]").val(route_start);
			jQuery("#accordion .selected form.save_route").show();*/
		});
		GEvent.addListener(directions, "error", function() {
			 //if (directions.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
			//	 console.log("No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: " + directions.getStatus().code);
			 //else if (directions.getStatus().code == G_GEO_SERVER_ERROR)
				// console.log("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + directions.getStatus().code);
			 //else if (directions.getStatus().code == G_GEO_MISSING_QUERY)
				// console.log("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + directions.getStatus().code);
			 //else if (directions.getStatus().code == G_UNAVAILABLE_ADDRESS) //<--- Doc bug... this is either not defined, or Doc is wrong
				// console.log("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + directions.getStatus().code);
			 //else if (directions.getStatus().code == G_GEO_BAD_KEY)
				 //console.log("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + directions.getStatus().code);
			 //else if (directions.getStatus().code == G_GEO_BAD_REQUEST)
				// console.log("A directions request could not be successfully parsed.\n Error code: " + directions.getStatus().code);
			 //else
				// console.log("An unknown error occurred.");
			 jQuery("#route").append('<h4>Die angegebene Adresse wurde von Google leider nicht gefunden.</h4>');
		});
	} catch (e) {
		//console.log("Ein Fehler in der Google-Api trat auf: %s",e);
		jQuery("#route").append('<h4>Die angegebene Adresse wurde von Google leider nicht gefunden.</h4>');
	}

	return false;
}

// Route drucken
function printRoute() {
	jQuery("#route").printArea();
}

function filterKika(radius) {
	jQuery("a.kika2").show();
	jQuery("span.kika2").hide();
	jQuery("a.kika4").show();
	jQuery("span.kika4").hide();
	jQuery("a.kika8").show();
	jQuery("span.kika8").hide();

	jQuery("a.kika" + radius).hide();
	jQuery("span.kika" + radius).show();

	jQuery("div.distKika4").hide();
	jQuery("div.distKika8").hide();

	if(radius >= 4) {
		jQuery("div.distKika4").show();
	}
	if(radius >= 8) {
		jQuery("div.distKika8").show();
	}

	checkKikaEmpty();
}

function filterSchool(radius) {
	jQuery("a.school2").show();
	jQuery("span.school2 ").hide();
	jQuery("a.school4").show();
	jQuery("span.school4").hide();
	jQuery("a.school8").show();
	jQuery("span.school8").hide();

	jQuery("a.school" + radius).hide();
	jQuery("span.school" + radius).show();

	jQuery("div.distSchool4").hide();
	jQuery("div.distSchool8").hide();

	if(radius >= 4) {
		jQuery("div.distSchool4").show();
	}
	if(radius >= 8) {
		jQuery("div.distSchool8").show();
	}

	checkSchoolEmpty();
}

var closeAcc = false;
var elemToClose;
function checkSchoolEmpty() {
	var selectedDiv = jQuery("div.schoolCat div.selected");
	var searchSelected = false;
	if(selectedDiv.css("display") == "none") {
		searchSelected = true;
	}
	jQuery("div.schoolCat").each(function(i){
		var $div = jQuery(this);
		var $errorSpan = $div.find("span.noSchoolRadius");
		$errorSpan.show();
		$div.find("div.distSchool2, div.distSchool4, div.distSchool8").each(function(y){
			if(jQuery(this).css("display") != "none") {
				$errorSpan.hide();
				if(searchSelected) {
					elemToClose = jQuery(this)
					elemToClose.find("div").show();
					loadMap(this);
					closeAcc = true;

					jQuery("#accordion h3").click(function(){
						if(closeAcc) {
							elemToClose.find("div:first").hide();
						}
						closeAcc = false;
					});


					searchSelected = false;
				}
				return false;
			}
		});
	});

	if(!jQuery("div.schoolCat2:first")[0]){
		jQuery("#noSchool").show();
		jQuery(".noSchoolRadius").hide();

		jQuery("span.schoolU").hide();

		jQuery("a.school2").hide();
		jQuery("span.school2").hide();

		jQuery("a.school4").hide();
		jQuery("span.school4").hide();

		jQuery("a.school8").hide();
		jQuery("span.school8").hide();
	}
	else {
		jQuery("span.kikaU").show();

		jQuery("#noSchool").hide();
		jQuery(".noSchoolRadius").hide();

		jQuery("div.schoolCat").each(function() {
			var $this = jQuery(this);
			if(!$this.find("div.schoolCat2:visible:first")[0]) {
				jQuery("#noSchool").hide();
				$this.find(".noSchoolRadius").show();
			}
		});

	}


}

function merkeRoute(form) {
	var $form = jQuery(form);
	var $build = $form.parent().parent().find(".map");
	var hidden = $form.find("[name=address]");
	var temp = jQuery("<div></div>");
	temp.append($build.html());
	var value = temp.html();

	temp.empty();
	temp.append(jQuery("#route").html());
	//FIXME +=
	value = temp.html();
	hidden.val(value);
	updateNotepad(form);
}

