/* Lib fuer seminarAnmeldung.tmpl */
var geocoder;
var map;
var seminarAnmeldungZoom1=9; // Detail
var seminarAnmeldungZoom2=4; // Uebersicht
var centerLat=51.31705359999999; // Kassel
var centerLng=9.492455199999995;
var marker= new Array();
var curSeminarId=false; // welches Seminar wurde ausgewählt


// +++++++++++++++++ Diverse ++++++++++++++++++++++++++++++++++++++++++++++++++++
// hier wird alles initialisiert: config.js
function initSeminarAnmeldung() {
	if(!$("idSeminarPlzOrt")) return;

	$("idSeminarPlzOrt").observe('keyup', function () {findSeminar();});
	$("idSeminarUmkreis").observe('change', function () {findSeminar();});
	$("idSeminarSprache").observe('change', function () {findSeminar()});

	if($browser!=="IE 7") $("seminarHidebox").hide();
	$("seminarTeaserKlick").observe('click', function () {toggleHideBox()});

	$("seminar-content-box").hide();
	$("seminar-teaser-all").hide();

	initializeSeminarMaps();
}

// plz-Eintrag mit bestimmter id finden
function findPlzEntry(id) {
	for(var i=0; i<plz.length; i++) {
		if(plz[i][3]==id) return plz[i];
	}
	return false;
}

// Treffer (hits) nach Entfernung aufsteigend sortieren
function sortSeminarHits(a, b) {
	// 4: distance, 25: 20120227
	if(a[4]<b[4]) return -1;
	if(a[4]>b[4]) return 1;

	// Entfernung ist identisch:
	if(a[25]<b[25]) return -1;
	if(a[25]>b[25]) return 1;
	return 0;
}


// +++++++++++++++++ FRONTEND +++++++++++++++++++++++++++++++++++++++++++++++++++
// mehr als 3 Anmeldungen ein-/ausblenden
function toggleHideBox() {
	if($browser=="IE 7") return; // IE7: Toggeln funzt nicht

	$("seminarHidebox").toggle();

	if($("seminarTeaserKlick").innerHTML==seminarTeaserKlick_1) {
		$("seminarTeaserKlick").innerHTML=seminarTeaserKlick_2;
	} else {
		$("seminarTeaserKlick").innerHTML=seminarTeaserKlick_1;
	}
}

// Klick auf Eintrag
function toggleEntryObserver(item) {
	resetAllEntry();
	item.down(".seminar-teaser-info").toggle();
	item.addClassName("seminar-teaser-entry-sel");
	$("seminar-content-box").show(); // immer sichtbar nach erstem Anklicken

	var id = item.readAttribute("id");
	id = id.substr(id.indexOf("_")+1);
	curSeminarId = id;

	insertSeminarContentBox(id);
	var p = findPlzEntry(id);
	map.setOptions({center:new google.maps.LatLng(p[1], p[2])});
	map.setZoom(seminarAnmeldungZoom1);
}
// Alle Einträge zurücksetzen
function resetAllEntry() {
	$$(".seminar-teaser-entry .seminar-teaser-info").each(function(item){
		item.show();
		item.up().removeClassName("seminar-teaser-entry-sel");
	});
}

// bei Änderung eines Inputs eine Seminarsuche ausführen
function findSeminar() {
	var minLength=1; // ab 1 Zeichen wird gesucht
	var PlzOrt = $F("idSeminarPlzOrt");
	var Umkreis = $F("idSeminarUmkreis");
	var Sprache = $F("idSeminarSprache");

	if(PlzOrt=="") return; // keine Eingabe
	if(PlzOrt.length<minLength) return; // zu kurz

	var isNumber=false;
	if( PlzOrt.match(/^[0-9]*$/) ) isNumber=true; // Eingabe = nur Ziffern
	
	if( (PlzOrt.length<5) && isNumber ){
		uiNoPlz();
		return; // nur Ziffern, aber keine PLZ, <5 Zeichen
	}

	if( (PlzOrt.length==5) && isNumber ) { // PLZ
		getAllSeminar(Umkreis, "deutschland "+PlzOrt, Sprache);
		return;
	}

	if( isNumber ) {
		uiNoPlz();
		return; // nur Ziffern, aber keine PLZ, >5 Zeichen
	}

	// nach Ort suchen
	getAllSeminar(Umkreis, "deutschland "+PlzOrt, Sprache);
}

// Inhalte aus plz-Array in SeminarContentBox einfügen
function insertSeminarContentBox(id) {
	for(var i=0; i<plz.length; i++) {
		if(plz[i][3]==id) {
			curSeminarId=id;
			$("leftbox-title").update(plz[i][16] + ', ' + plz[i][8] + ' von ' + plz[i][14] + ' - ' + plz[i][15] + ' in ' + plz[i][11] );
			$("leftbox-subtitle").down("span").update(plz[i][13]);
			$("leftbox-zielgruppe-id").update(plz[i][19]);
			$("leftbox-ort-id").update(plz[i][18]+'<br />'+plz[i][17]+ addSeparator(plz[i][9], plz[i][17]) +'<br />'+plz[i][12]+' '+plz[i][11]);
			$("rightbox-ansprechpartner-id").update(plz[i][5]);
			$("rightbox-kontakt-id").update(plz[i][23]);
			$("rightbox-kontakt-id").writeAttribute("href", "mailto:" + plz[i][23]);
			$("rightbox-image-id").src=plz[i][22]; // /__we_thumbs__/558_8_Bergfeld.jpg
			break;
		}
	}
}

// Komma + Space hinzufügen, fall text vorhanden
// wenn control leer ist: kein Komma
function addSeparator(text, control) {
	if( (text!='') && (control!='') ) return ', ' + text;
	return text;
}

// Darstellung der passenden Seminare in Karte und HTML
function showAllSeminar(hits) {
	removeMarker();

	// Marker setzen
	for(var i=0; i<hits.length;i++) {addMarker(hits[i][1], hits[i][2]);}

	centerMap();
	
	// Ergebnisliste anpassen
	insertSeminarTeaser(hits);

	curSeminarId=false;
}

// HTML-Darstellung der Seminar-Teaser-Inhalte
function insertSeminarTeaser(hits) {
	$("seminar-entry-box").update('<div id="seminarHidebox"></div>');
	$("seminarHidebox").hide();
	$("seminarTeaserKlick").innerHTML=seminarTeaserKlick_1; // Default

	var old="####DEAFULT####";
	for(i=0; i<hits.length; i++) {
		var h = "";
		if( (old!=hits[i][4]) && (old!="####DEAFULT####") ) h += "<p class='seminar-entry-spacer'></p>";
		h += '<h3>'+hits[i][11]+" ("+Math.round(hits[i][4])+" km)"+'</h3><p id="id_'+hits[i][3]+'" class="seminar-teaser-entry">';
		h += hits[i][8] + ' - ' + hits[i][13];
		h += ' <span class="seminar-teaser-info2">[<a href="#module" onclick="return _openSeminarForm(\''+hits[i][3]+'\');">'+ixTransSeminarAnmeldenLink+'</a>]</span> <span class="seminar-teaser-info">['+'<a href="#details">'+seminarWeitereInfos+']</a></span></p>';
		old=hits[i][4];
		if(i<3) {
			$("seminar-entry-box").down("#seminarHidebox").insert({before:h});
			$("seminar-teaser-all").hide();
		} else {
			$("seminar-entry-box").down("#seminarHidebox").insert(h);
			$("seminar-teaser-all").show();
		}
	}
	// Observer setzen
	$$(".seminar-teaser-entry .seminar-teaser-info").each(function(item){
		item.observe('click', function () {toggleEntryObserver(item.up())});
	});

	$("seminar-content-box").hide();
}


// +++++++++++++++++++++++++++++++++++++++++ FORMULAR ++++++++++++++++++++++++++++++++++++++++++
function openSeminarForm() {
	if( curSeminarId==false ) return;
	_openSeminarForm(curSeminarId);
}
// helper fuer: openSeminarForm()
function _openSeminarForm(tmpId) {
	var hit = findPlzEntry(tmpId);
	hs.htmlExpand($("seminarButton"), { contentId: 'seminarFormHtml', dimmingOpacity: 0.5} );
	$("seminarFormTopTermin").update(hit[11] + ' - ' + hit[16] + ', den ' + hit[8] + ' von ' + hit[14] + ' - ' + hit[15]);
	$("seminarFormTopSeminar").down("span").update(hit[13]);
	$("seminarFormTopOrt").down("span").update(hit[18]+'<br />'+hit[17]+'<br />'+hit[12]+' '+hit[11]);
	$("Kampagnen_ID").value=tmpId;
	$("Lead_Inhaber").value=hit[5];
	$("Inhaber_ID").value=hit[24];
}


// +++++++++++++++++++++++++++++++++++++++++ GOOGLE ++++++++++++++++++++++++++++++++++++++++++++
// Google-Maps-Objekte initialisieren
function initializeSeminarMaps() { 
	geocoder = new google.maps.Geocoder();
	
	var latlng = new google.maps.LatLng(centerLat, centerLng);
	var myOptions = {
		zoom: seminarAnmeldungZoom2,
		center: latlng,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

	// latlng für alle PLZ setzen
	var c=0;
	for(var i=0; i<plz.length; i++) {
		// wenn kein Lat-Wert gesetzt ist: latlng setzen
		if(plz[i][1] == null) {
			c++;
			//getLatlng(plz[i][0], "deutschland");
			window.setTimeout("getLatlng('"+plz[i][0]+"', 'deutschland')", c*1000); // 1s=1000
		}
	}

	if (directId)
	{
		$("seminar-content-box").show();
		insertSeminarContentBox(directId);
		location.href = location.href+'#details';
	}
}

// in einer Schleife alle PLZ durchlaufen und in einer DB-Tabelle speichern
function getLatlng(aPlz, aLand) {
	if(aPlz=="")return;
	var address = aLand + " " + aPlz;
	if(geocoder) {
		geocoder.geocode( { 'address': address}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) { 
				var url = "/libPhp/seminarAnmeldung.php";	
				new Ajax.Request(url, {
 					method: 'POST',
 					postBody: 'plz=!'+aPlz+'&lng='+results[0].geometry.location.lng()+'&lat='+results[0].geometry.location.lat(),
					onSuccess: function(transport) {
						var answer = transport.responseText;
						if(answer!=="")alert(answer);
					},
					onFailure: function(transport) {
						// fehler
						alert("Ajax-Error");
					}
				});

				
				// plz-Array in JS aktualisieren
				for(var i=0; i<plz.length; i++) {
					if(plz[i][0]==aPlz) {
						plz[i][1]=results[0].geometry.location.lat();
						plz[i][2]=results[0].geometry.location.lng();
						//break;	
					}
				}
			} else {
				alert("Geocode was not successful for the following reason: " + status);
			}
		});			
	}
}

// keine Treffer
function uiNoHits() {
	$("status").innerHTML= ixTransSeminarStatusNoFound;
	$("seminarHitsHl").hide();
	$("seminar-content-box").hide();
	$("seminar-teaser-all").hide();
	$("seminar-entry-box").innerHTML="";
	if($("seminarHidebox")) $("seminarHidebox").innerHTML="";
}
// PLZ hat mehr oder weniger als 5 Stellen
function uiNoPlz() {
	$("status").innerHTML= "<span class='seminar-error'>" + ixTransSeminarPLZ5 + "</span>";
	$("seminarHitsHl").hide();
	$("seminar-content-box").hide();
	$("seminar-teaser-all").hide();
	$("seminar-entry-box").innerHTML="";
	if($("seminarHidebox")) $("seminarHidebox").innerHTML="";
}


// alle Seminare, die im Umkreis von km Kilometern von adress liegen
// und Aufruf von showAllSeminar()
function getAllSeminar(km, address, sprache) {
	if(geocoder) {
		geocoder.geocode( { 'address': address}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) { 
				var hits = new Array();
				var p = results[0].geometry.location;
				var treffer=0;
				for(var i=0; i<plz.length; i++) {
					var d=isInRadius(p, plz[i][1], plz[i][2], km);
					if( (d!==false) && (plz[i][20]==sprache) ) {
						var l = hits.length; 
						hits[l]=plz[i];
						hits[l][4]=d;
						treffer++;
					}	
				}
				if(treffer==0){ //---- Es gibt keine Treffer
					uiNoHits();
				}else{
					$("status").innerHTML=hits.length+" "+ixTransSeminarStatusFound;
					$("seminarHitsHl").show();
					$("seminar-content-box").show();
					$("seminar-teaser-all").show();
					hits.sort(sortSeminarHits); 
					showAllSeminar(hits);
				}
				
			} else {
				if(status=="ZERO_RESULTS") {
					//$("seminar-entry-box").down("#seminarHidebox").replace(status);
				}
			}
		});			
	}
}

// ist der Abstand zw p1 und p2 kleiner gleich km Kilometer?
// p1: LatLng
// p2Lat, p2Lng: Koord.
function isInRadius(p1, p2Lat, p2Lng, km) {
	var p2 = new google.maps.LatLng(p2Lat,p2Lng);	
	var d = Math.round( getDistanceBetweenPoints(p1,p2)/10 ) * 10; // 123.4545 -> 120
	if( d<=km ) return d;
	return false;
}

// LatLng p1, LatLng p2
// returns: Abstand in km
function getDistanceBetweenPoints(p1, p2) {
	if (!p1 || !p2) {return 0;}
	
	var R = 6371; // Radius of the Earth in km
	var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
	var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
	var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
		Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *
		Math.sin(dLon / 2) * Math.sin(dLon / 2);
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
	var d = R * c;
	return d;
};

// Uebersichts-Zoom + Zentrieren
function centerMap() {
	map.setZoom(seminarAnmeldungZoom2);
	map.setOptions({center:new google.maps.LatLng(centerLat, centerLng)});
}

// alle Marker entfernen
function removeMarker() {
	for(var i=0; i<marker.length; i++) {
		if(marker[i]) marker[i].setMap(null);
	}
}

// Marker auf die Karte setzen
//addMarker(51.31705359999999, 9.492455199999995);
//addMarker(new google.maps.LatLng(51.31705359999999, 9.492455199999995));
function addMarker(Lat, Lng) {
	if(map) {
		var position;
		if(typeof Lat == "object") position = Lat;
		else position = new google.maps.LatLng(Lat, Lng);
		
		map.setCenter(position);
		marker[marker.length] = new google.maps.Marker({
			map: map, 
			position: position
		});		
	}
}
