var ie = document.all;
var ns = document.getElementById && !document.all;
       
var map = null;
var geocoder = null;
var myPoint = null;
var umkreisToSearch;
var resultArray = Array();
var indexCounter = new Array();

function getURLSegment(segment){
	var urlSegment = "";
	var url = document.URL;
	var pos = url.indexOf(segment + "=") + segment.length;
	var partOfURL = url.substr(url.indexOf(segment) + segment.length + 1, url.length);
	pos = partOfURL.indexOf("&");
	// logger(segment + " -> Part: " + partOfURL + " Pos: " + url.indexOf(segment + "="));
	if(url.indexOf(segment + "=") == -1) urlSegment = "";
	else if(pos > 0) urlSegment = partOfURL.substr(0, pos);
	else urlSegment = partOfURL;
	// logger(segment + " -> " + urlSegment);
	urlSegment = urlSegment.replace("#", "");
	return urlSegment;
}

function getShopData(plzToSearch, umkreisToSearch){
	var search = getURLSegment("search");
	jQuery.get("resources/ajax/getTargetShopData.php",
	{
		plz: plzToSearch,
		umkreis: umkreisToSearch,
		search:search
	}, function(data){
		document.getElementById("resultBox").value = data;
	});
}

function initialize() {
	if (GBrowserIsCompatible()) {
		try{
			// alert("los geht es ");
			// document.getElementById("ds_adress").value = "59757 Arnsberg";
			map = new GMap2(document.getElementById("mapContainer"));
			map.setMapType(G_PHYSICAL_MAP);
			map.setUIToDefault();
			// refreshSearch();
			getLocalisation(null);
			window.setTimeout("tryToDrawCircle()", 3000);
		}
		catch (e){
			// alert ("initialize: " + e);
		}
  }
}

function refreshSearch(){
	lastToggledElementID = 0;
	firstItem = 0;
	scrollPosition = 0;
	resultArray = Array();
	document.getElementById("resultList").innerHTML = "";
	document.getElementById("resultBox").value = "";
	removeIcons();
	getLocalisation(null);
	window.setTimeout("tryToDrawCircle()", 3000);

	var myPLZ = document.geoAdress.ds_adress.value.substr(0, 5);
	// logger("PLZ: " + myPLZ);
	getShopData(myPLZ, getUmkreis());
	tryToBuildResultArray();
}

function logger(msg) {
	if(document.getElementById("logger")){
	  // document.getElementById("logger").innerHTML += msg + "<br />";
	  document.getElementById("logger").value += msg + "\n";
	}
}

var buildResultCounter = 0;
function tryToBuildResultArray(){
	try{
		if(document.getElementById("resultBox").value == ""){
			buildResultCounter ++;
			if(buildResultCounter < 20){
				// logger("Box noch leer " + buildResultCounter);
				window.setTimeout("tryToBuildResultArray()", 500);
			}
			else {
				// alert("Ende ohne ergebnis");
				document.getElementsByName("resultBox")[0].value = "Keine Händler gefunden";
				buildResultArray();
				buildResultCounter = 0;
			}
		}
		else {
			buildResultArray();
			buildResultCounter = 0;
		}
	}
	catch (err){
		// logger("ERR: " + err);
	}
}

function buildResultArray(){
	var shopList = "";
	data = String(document.getElementsByName("resultBox")[0].value);
	var rows = data.split("|||");
	var countOfRows = rows.length-1;
	if(countOfRows > 0){
		for(var resultIndex=0; resultIndex < countOfRows; resultIndex++){
			var values = rows[resultIndex].split("||");
			resultArray[resultIndex] = new Array();
			for(var j=0; j<values.length; j++){
				resultArray[resultIndex][j] = values[j];
			}
			getLocalisation(resultIndex);
			
			 shopList += resultArray[resultIndex][0];
		}
	}
	else {
		shopList += "<div class='shopResultListHead'>" + data + "</div>";
		
	}
	document.getElementById("resultList").innerHTML = shopList;
}

function getLocalisation(resultIndex){
	var isMyPoint = 0;
	if(resultIndex || resultIndex == 0){
		adress = resultArray[resultIndex][2];
	}
	else {
		adress = document.geoAdress.ds_adress.value;
		isMyPoint = 1;
	}
	if(geocoder == null){
		geocoder = new GClientGeocoder();
	}
	geocoder.getLatLng(adress,function getPoint(point){
		// logger("X: " + point.x + " Y: " + point.y);
		indexCounter[resultIndex] = 1;
		if(!point){
			if(indexCounter[resultIndex] < 5) {
				indexCounter[resultIndex] = indexCounter[resultIndex] + 1;
				window.setTimeout("getLocalisation(" + resultIndex + ")", 200);
			}
		}
		else {
			if(isMyPoint == 1){
				myPoint = point;
				map.setCenter(new GLatLng(point.y,point.x),9);
			}
			setMapToAdress(point.x, point.y, resultIndex);
		}
	});
}

function setMapToAdress(x, y, resultIndex){
	var bounds = map.getBounds();
	var point = new GLatLng(y, x);
	map.addOverlay(createMarker(point, resultIndex));
}

var lastToggledElementID = 0;

function createMarker(punkt, resultIndex){
	try {
		var myHTML, p1;
		var isToggledElement = false;
		if(resultIndex || resultIndex == 0){
			number = resultIndex + 1;
			myHTML = resultArray[resultIndex][1];
			p1 = document.getElementById("p" + number);
			isToggledElement = true;
		}
		else {
			message = document.geoAdress.ds_adress.value;
			myHTML = "<b>Ihr Standort</b><br /><br />" + message;
			number = 0;
			isToggledElement = false;
		}
		
		
		if(resultIndex || resultIndex == 0){
			var baseIcon = new GIcon();
			if(resultArray[resultIndex][3] == 0){
				baseIcon.image = "images/dealer/dealer_icon.png";
				baseIcon.iconSize = new GSize(30, 40); // icon size matches image
				baseIcon.iconAnchor = new GPoint(15, 40); // *center* of the icon
			}
			else if(resultArray[resultIndex][3] == 1){
				baseIcon.image = "images/dealer/premium_dealer_icon.png";
				baseIcon.iconSize = new GSize(100, 50); // icon size matches image
				baseIcon.iconAnchor = new GPoint(50, 50); // *center* of the icon
			}
		}
		else{
			var baseIcon = new GIcon(G_DEFAULT_ICON);
		}

		baseIcon.transparent = null;
		baseIcon.shadow = null; // don't use shadow image
		baseIcon.shadowSize = null; // self-explanatory
		// baseIcon.iconAnchor = new GPoint(15, 40); // *center* of the icon
		baseIcon.infoWindowAnchor = new GPoint(9, 2);
		baseIcon.infoShadowAnchor = null;
		
		markerOptions = { icon:baseIcon, draggable:true };
		var marker = new GMarker(punkt, markerOptions);
		marker.value = number;
		GEvent.addListener(marker, "click", function() {
			if(lastToggledElementID != (resultIndex + 1)){
				openInfoMarker(punkt, myHTML);
				if(isToggledElement == true) toggleClass(resultIndex);
			}
		});
		
		if(p1){
			p1.onclick = function(){
				if(lastToggledElementID != (resultIndex + 1)){
					openInfoMarker(punkt, myHTML);
					toggleClass(resultIndex);
				}
			};
		}

		return marker;
	}
	catch (err){
		// logger("createMarker: " + err);
	}
}

function openInfoMarker(punkt, myHTML){
	map.openInfoWindowHtml(punkt, myHTML);
}

function toggleClass(index){
	if(lastToggledElementID > 0){
		// document.getElementById("p" + lastToggledElementID).style.backgroundColor = "#FFFFFF";
		if($jq("div#p" + lastToggledElementID).hasClass('premium_highlight').toString() == "true"){
			$jq("#p" + lastToggledElementID).removeClass("premium_highlight");
			$jq("#p" + lastToggledElementID).addClass("premium");
		}
		else {
			$jq("div#p" + lastToggledElementID).toggleClass("highlight");
		}
	}
	lastToggledElementID = index + 1;
	// document.getElementById("p" + (index + 1)).style.backgroundColor = "#FAFAFA";
	var highlightClass = "highlight";
	if($jq("div#p" + (index + 1)).hasClass('premium').toString() == "true"){
		$jq("#p" + (index + 1)).removeClass("premium");
		highlightClass = "premium_highlight";
	}
	$jq("#p" + (index + 1)).toggleClass(highlightClass);
}

var circle = null;

function drawCircle(umkreis){
	if(circle != null){
		map.removeOverlay(circle);
	}

	var umkreisElement = "KM";
	
	var marker = new GMarker(map.getCenter(),{draggable:true});
	
	
	var center = map.getCenter();

	var bounds = new GLatLngBounds();
	with (Math) {
		var d = umkreis /6378.8;
		var lat1 = (PI/180)* center.lat(); // radians
		var lng1 = (PI/180)* center.lng(); // radians
		var kreisPunkte = Array();
	
		for (var a = 0 ; a <= 360 ; a++ ) {
			var tc = (PI/180)*a;
			var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
			var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
			var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
			var punkt = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
			kreisPunkte.push(punkt);
			bounds.extend(punkt);
		}
		circle = new GPolygon(kreisPunkte, '#AAAAAA', 2, 1, '#FFF', 0.40);
		map.addOverlay(circle);
		map.setZoom(map.getBoundsZoomLevel(bounds));
	}
}

function getUmkreis(){
	var selectedIndex = document.geoAdress.ds_umkreis.selectedIndex;
	umkreis = document.geoAdress.ds_umkreis[selectedIndex].value;
	return umkreis;
}

function tryToDrawCircle(){
	try{
		if(myPoint && myPoint.x > 0){
			zeichneKreis();
		}
		else {
			window.setTimeout("tryToDrawCircle()", 1000);
		}
	}
	catch (err){
		// logger("ERR: " + err);
	}
}

function zeichneKreis(){
	try{
		umkreisToSearch = getUmkreis();
		drawCircle(umkreisToSearch);
	}
	catch (err){
		// logger ("zeichneKreis: " + err);
	}
}



function removeIcons(){
	map.clearOverlays();
	for(var i=0; i<resultArray.length; i++){
		p1 = document.getElementById("res_" + i);
		if(p1) p1.onclick = null;
	}
}

window.onload = initialize;
