/**
 * @author flba
 */

var SCRIPT_PATH = "scripts/";
var IMAGE_PATH = "images/";

var markerManagerGS;
var markerManagerG;
var markerManagerS;
var markerManager;

var map;
var scrollEvent;

/*
 *	AJAX-Request
 */

// Load markers
function loadAllVendors(geprueft){
	
	// Init Marker-Icon
	var icon = new GIcon();
	icon.image = IMAGE_PATH;
	icon.image +=(geprueft)?"geprueft.gif":"fachhaendler.gif";
	icon.iconAnchor = new GPoint(11,28);
	icon.infoWindowAnchor = new GPoint(11, 0);
	//icon.iconSize = new GSize(22, 28);
	
	// Init Zoomlevel
	var minZoom = (geprueft)?1:7;
	
	jQuery.get(SCRIPT_PATH+"loadVendors.php", {
		geprueft: geprueft
	}, function(data){
		var jsonData = eval("(" + data + ")");
		createMarkers(jsonData,icon,minZoom,geprueft);
		markerManagerGS.refresh();
		markerManagerG.refresh();
		markerManagerS.refresh();
		markerManager.refresh();
		
		if(geprueft){
			createListEntries(jsonData);
		}
	});	
	
};

// Load vendors depending on partial zipcode
function loadVendorOnPartialZip(partialZip){
	jQuery.get(SCRIPT_PATH+"loadVendors.php",{
		like: partialZip
	},function(data){
		var jsonData = eval("(" + data + ")");
		createListEntries(jsonData);
	});
};

//Load vendors in viewport
function loadVendorsInViewport(minlat,minlng,maxlat,maxlng,service,geprueft){
	jQuery.get(SCRIPT_PATH+"loadVendors.php",{
		minlat: minlat,
		minlng: minlng,
		maxlat: maxlat,
		maxlng: maxlng,
		service:service,
		geprueft:geprueft?"true":null
	},function(data){
		try{
			var jsonData = eval("(" + data + ")");
			createListEntries(jsonData);
		}
		catch(ex){
		}
	});
};

// Load vendors depending on full zipcode
function loadVendorOnZip(zip){
	
	var geocoder = new GClientGeocoder();
	geocoder.getLatLng(zip, function(point){
	
		if(point != null){
			
			var lat = point.lat();
			var lng = point.lng();
			
			if(
				!lat | 
				lat == 0 |
				lat < 6.17 |
				lat > 15.07 |
				lng < 47.17 |
				lng > 54.74
			){
				loadViewport(zip.substr(0,zip.length-1));
			}			
			else{
			//TODO: Get optimized limit
			var limit = 5;
			
			jQuery.get(SCRIPT_PATH+"utils.php",{
				lat: lat,
				lng: lng,
				limit: limit
			},function(data){
				try{
					
					var viewport = eval("(" + data + ")");
					
					//if there's just one entry
					if(viewport.minlat == viewport.maxlat){
						var sw = new GLatLng(viewport.minlat,viewport.minlng); 
						recalibrateMap(sw, null, true);
					}
					else{
						var sw = new GLatLng(viewport.minlat,viewport.minlng);
						var ne = new GLatLng(viewport.maxlat,viewport.maxlng);
							
						recalibrateMap(sw,ne,false);
					}
					var viewPortBounds = map.getBounds();
					var sw = viewPortBounds.getSouthWest();
					var ne = viewPortBounds.getNorthEast();
					loadVendorsInViewport(sw.lat(),sw.lng(),ne.lat(),ne.lng());
					
				}
				catch(ex){					
					var partialZip = zip.substr(0,zip.length-1);
					loadViewport(partialZip);
				}
			});
		}}
		else{
			var partialZip = zip.substr(0,zip.length-1);
			loadViewport(partialZip);
		}
	});
};

// Load Viewport
function loadViewport(partialZip,service,geprueft){
	
	jQuery.get(SCRIPT_PATH+"utils.php",{
		like: partialZip,
		service: service,
		geprueft: geprueft?"true":null
	},function(data){
		try{
			var viewport = eval("(" + data + ")");
			
			if(viewport.minlat == ""){
				if(partialZip.length > 1){
					loadViewport(partialZip.substr(0,partialZip.length-1),service,geprueft);
				}
			}
			else{
				//if there's just one entry
				if(viewport.minlat == viewport.maxlat){
					var sw = new GLatLng(viewport.minlat,viewport.minlng); 
					recalibrateMap(sw, null, true);
				}
				else{
					var sw = new GLatLng(viewport.minlat,viewport.minlng);
					var ne = new GLatLng(viewport.maxlat,viewport.maxlng);
						
					recalibrateMap(sw,ne,false);
				}
				var viewPortBounds = map.getBounds();
				var sw = viewPortBounds.getSouthWest();
				var ne = viewPortBounds.getNorthEast();
				loadVendorsInViewport(sw.lat(),sw.lng(),ne.lat(),ne.lng(),service,geprueft);
			}
		}
		catch(ex){
			if(partialZip.length > 1){
				loadViewport(partialZip.substr(0,partialZip.length-1),service,geprueft);
			}
		}
	});
};

/*
 * 	GoogleMap initialize
 */

function initialize() {
 if (GBrowserIsCompatible()) {
	 //TODO: Set div-container
	 var gMapContainer = "mapContainer";
	 map = new GMap2(document.getElementById(gMapContainer),{size:new GSize(420,400)});
	 //TODO: Get LatLng from Germany and the right zoom level
	 map.setCenter(new GLatLng(50.94124490642813, 10.17),5);
	 map.addControl(new GSmallMapControl());
	 map.enableContinuousZoom();
	 
	 markerManagerGS = new MarkerManager(map);
	 markerManagerG = new MarkerManager(map);
	 markerManagerS = new MarkerManager(map);
	 markerManager = new MarkerManager(map);	 
	 
	 loadAllVendors(true);
	 loadAllVendors(false);
	 
	 markerManagerGS.refresh();
	 markerManagerG.refresh();
	 markerManagerS.refresh();
	 markerManager.refresh();
	 
	 
	 var zoomEvent = GEvent.addListener(map,"zoomend",function(){
		 addMapMoveEvent();
		 GEvent.removeListener(zoomEvent);
	 });
	 
	 jQuery("#header_suche").show();
	 
 }
};

/*
 * Marker
 */
function createMarkers(jsonData,icon,minZoom,geprueft){
	
	var markerArray = new Array();
	var markerArrayG = new Array();
	var markerArrayS = new Array();
	var markerArrayGS = new Array();
	
	for(var i = 0; i < jsonData.markers.length; i++) {
		var markerData = jsonData.markers[i];
		var marker = new GMarker(markerData.point,{icon:icon});
		var service = (markerData["Installationsservice"] == "ja");
		if(geprueft){
			if(service){
				markerArrayGS.push(marker);
			}
			else{
				markerArrayG.push(marker);
			}
		}
		else{
			if(service){
				markerArrayS.push(marker);
			}
			else{
				markerArray.push(marker);
			}
		}		
	}
	
	markerManagerGS.addMarkers(markerArrayGS, minZoom);;
	markerManagerG.addMarkers(markerArrayG, minZoom);
	markerManagerS.addMarkers(markerArrayS, minZoom);
	markerManager.addMarkers(markerArray, minZoom);
	
}

function createInfoWindowContent(markerData){
	var content = "";
	content += "<b>"+markerData.Firma1+"</b>";
	content += "<br/>";
	content += markerData.Strasse;
	content += "<br/>";
	content += markerData.PLZ+" "+markerData.Ort;
	content += "<br/>";
//	content += "Telefon "+markerData.Telefon;
//	content += "<br/>";
//	content += "Fax "+markerData.Fax;
//	content += "<br/>";
//	content += "<a href='mailto:"+markerData.email+"'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>"+markerData.email+"</a>";
//	content += "<br/>";
//	content += "<a href='http://"+markerData.Internet+"'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>"+markerData.Internet+"</a>";
//	content += "<br/>";
	content += "<a target='_blank' href='http://maps.google.de/maps?f=d&daddr="+markerData.Strasse+",+"+markerData.PLZ+"+"+markerData.Ort+"&hl=de&geocode=&mra=lsie=UTF8&t=h'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>Routenplaner</a>";
	content += "<br/>";
	content += "<a href='#' onclick='jQuery(\"#vendor_"+markerData.id+" .clickableHead\").trigger(\"moreInfos\");'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>Weitere Informationen</a>";
		
	
	
	return content;
};

/*
 * Listentries
 */
function createListEntries(jsonData){
	if(jsonData.markers.length > 0){
		
		// Clear result list
		var listEntriesToKeep = new Array();		

		var setOpen = false;
		
		//if(jsonData.markers.length == 1){
			//setOpen = true;
		//}
		for(var i = 0; i < jsonData.markers.length; i++) {
			var markerData = jsonData.markers[i];
						
			listEntriesToKeep.push(createEnryAndAddEvents(markerData,setOpen));
			
		}
		deleteOldEntries(listEntriesToKeep);
		
	}
	else{
		deleteOldEntries(new Array());
	}
};

// change Zoomlevel and center the map
function recalibrateMap(sw,ne,singleResult){
	
	var zoomlevel = 16;
	
	var centerLat = 0;
	var centerLng = 0;
	
	if(singleResult == false){
		var zoomlevel = map.getBoundsZoomLevel(new GLatLngBounds(sw,ne));
		
		var centerLat = (ne.lat()+sw.lat())/2;
		var centerLng = (ne.lng()+sw.lng())/2;
	}
	else{
		var centerLat = sw.lat();
		var centerLng = sw.lng();
	}
	
	map.setZoom(zoomlevel);
	map.panTo(new GLatLng(centerLat,centerLng));
	
}

function createEnryAndAddEvents(markerData, setOpen){
	
	var point = markerData.point;
	var actZoom = 11;
	var marker = null;
	
	if(markerData.geprüfter_Programmberater == "ja"){
		if(markerData.Installationsservice == "ja"){
			marker = markerManagerGS.getMarker(point.lat(), point.lng(), actZoom);
		}
		else{
			marker = markerManagerG.getMarker(point.lat(), point.lng(), actZoom);
		}		
	}
	else{
		if(markerData.Installationsservice == "ja"){
			marker = markerManagerS.getMarker(point.lat(), point.lng(), actZoom);
		}
		else{
			marker = markerManager.getMarker(point.lat(), point.lng(), actZoom);
		}	
	}
	if(marker == null){
		//console.log(marker);
	}
	else{
		var node = createHTMLNode(markerData);
		var jQueryNode = jQuery(node);
		if(jQuery("#result").has("#vendor_"+markerData.id).length == 0){
			jQueryNode.fadeOut();
			
			var nodeToAdd;
			if(markerData.geprüfter_Programmberater == "ja"){
				nodeToAdd = "#geprueft";
			}
			else{
				nodeToAdd = "#fachhaendler";
			}
			jQuery(nodeToAdd).append(jQueryNode);
			
			var appendedNode = jQuery(jQueryNode,nodeToAdd);
			appendedNode.fadeIn();
			
			GEvent.addListener(marker, "mouseover", function() {
				jQuery(".clickableHead", appendedNode).addClass("hover");
				
				// Change icon
				this.setImage(IMAGE_PATH+"fachhaendler.gif");
				var newImage = this.getIcon().image.replace(".gif","_hover.png");
				this.setImage(newImage);
				
				// Open and create Infowindow
				var infoWindowContent = createInfoWindowContent(markerData,marker);
				marker.openInfoWindowHtml(infoWindowContent);
				
			});
			
			GEvent.addListener(marker, "mouseout", function() {
				jQuery(".clickableHead", appendedNode).removeClass("hover");
				
				// Change icon
				var newImage = this.getIcon().image.replace("_hover.png",".gif");
				this.setImage(newImage);
			});
			
			GEvent.addListener(marker, "click", function() {
				jQuery(".hidden",appendedNode).slideDown();
				
				// Slide to Entry				
				setTimeout(function(){
					var divOffset = jQuery("#resultScrollPane").offset().top;
					var elementOffset = jQuery("#vendor_"+markerData.id).offset().top;
					var scrollTo = elementOffset - divOffset;
					jQuery('#resultScrollPane').animate({scrollTop: '+='  + scrollTo + 'px'}, 1500);
				},1000);
				
			});
			
			GEvent.addListener(marker,"infowindowclose",function(){
				jQuery(".hidden",appendedNode).slideUp();
			});
			
			jQuery(appendedNode).mouseenter(function(){			
				jQuery(".clickableHead", appendedNode).addClass("hover");
				
				// Change icon
				marker.setImage(IMAGE_PATH+"fachhaendler.gif");
				var newImage = marker.getIcon().image.replace(".gif","_hover.png");
				marker.setImage(newImage);
				
			});
			
			jQuery(appendedNode).mouseleave(function(){				
				GEvent.trigger(marker,"mouseout");
			});
			
			jQuery(".clickableHead", appendedNode).click(function(){
				var infoWindowContent = createInfoWindowContent(markerData);
				marker.openInfoWindowHtml(infoWindowContent);
				GEvent.trigger(marker,"click");
			});
			
			jQuery(".clickableHead", appendedNode).bind("moreInfos",function(){
				GEvent.trigger(marker,"click");
			});
			
			
		}
		else{
			jQuery(("#vendor_"+markerData.id)).fadeIn();
		}
		if(setOpen){
			var infoWindowContent = createInfoWindowContent(markerData);
			marker.openInfoWindowHtml(infoWindowContent);
			GEvent.trigger(marker,"click");
		}
		
		return "vendor_"+markerData.id;
		
	}
	
}

// Create the HTML node for list entry
function createHTMLNode(markerData){
	
	var content = "";
	content += "<li id='vendor_"+markerData.id+"' class='vendor'>";
	if(markerData.geprüfter_Programmberater == "ja"){
		content += "<img src='images/geprueft_klein.png' class='vendorIcon'/>";	
	}
	else{
		content += "<img src='images/fachhaendler_klein.png' class='vendorIcon'/>";	
	}
	content += "<a class='clickableHead' href='#'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>" +
					"<b>"+markerData.Firma1+"</b>, "+markerData.PLZ+" "+markerData.Ort +
				"</a>";
	content += "<div class='hidden'>";
	content += "<div class='left'>";
	content += "<p>";
	content += markerData.Strasse;
	content += "<br/>";
	content += markerData.PLZ+" "+markerData.Ort;
	content += "<br/>";
	content += "</p>";
	content += "<p>";
	content += "Telefon "+markerData.Telefon;
	content += "<br/>";
	if(markerData.Fax && markerData.Fax != ""){
		content += "Fax "+markerData.Fax;
		content += "<br/>";
	}
	content += "</p>";
	content += "<p>";
	if(markerData.email && markerData.email != ""){
		content += "<a href='mailto:"+markerData.email+"'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>"+markerData.email+"</a>";
		content += "<br/>";
	}
	if(markerData.Internet && markerData.Internet != ""){
		content += "<a href='http://"+markerData.Internet+"' target='_blank'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>"+markerData.Internet+"</a>";
		content += "<br/>";
	}
	content += "<a target='_blank' href='http://maps.google.de/maps?f=d&daddr="+markerData.Strasse+",+"+markerData.PLZ+"+"+markerData.Ort+"&hl=de&geocode=&mra=lsie=UTF8&t=h'><span><img class='linkicon' src='css/dealerlocator/icon_link.gif'/></span>Routenplaner</a>";
	content += "</p>";
	if(markerData.geprüfter_Programmberater == "ja"){
		content += "<br/>";
		content += "<br/>";
		content += "<img src='images/geprueft_logo.png' alt='Gepruefter Lexware-Programmberater'/>";	
	}
	if(markerData.Installationsservice == "ja"){
		content += "<br/><br/><img src='images/service_partner.jpg' alt='Servicepartner'/>";
	}
	content += "</div>";
	content += "<div class='right'>";
	content += getVendorProperties(markerData);
	content += "</div>";
	content += "<div class='antifloat'></div>";
	content += "</div>";
	content += "</li>";
	
	
	
	return content;
}

function deleteOldEntries(entries){
	jQuery(".vendor").not(function(){return (entries.join().search(this.id) != -1);}).fadeOut();
}

function getVendorProperties(markerData){
	
	var properties = new Array();
	
	properties[0] = new Array();
	properties[0][0] = "Beratung";
	properties[0][1] = new Array("Inhaltliche_Beratung","Technische_Beratung","Beratung_vor_Ort");
	
	properties[1] = new Array();
	properties[1][0] = "Technik";
	properties[1][1] = new Array("Netzwerkinstallation","Einzelplatzinstallation");
	
	properties[2]  = new Array("Support", new Array("Inhaltlicher_Support","Technischer_Support"));
	
	properties[3]  = new Array("Sonstige Dienstleistungen", new Array("Formularanpassung","Schulung_und_Weiterbildung","Automatische_Softwareaktualisierung",
            "POS_Kassensysteme","Lexware_buchhalter_pro","Lexware_warenwirtschaft_pro","Lexware_lohngehalt_pro","Installationsservice"));
	
	var content = "";
	content += "<ul>";
	for(i = 0; i < properties.length; i++){
		var contentPart = "";
		var addIt = false;
		contentPart += "<li class='noMarker'>"+properties[i][0]+"</li>";
		contentPart += "<ul>";
		for(j = 0; j < properties[i][1].length;j++){
			if(markerData[properties[i][1][j]] == "ja"){
				contentPart += "<li class='checked'>"+properties[i][1][j].replace(/_/g," ")+"</li>";
				addIt = true;
			}
		}
		contentPart += "</ul>";
		if(addIt){
			content += contentPart;
		}
		
	}
	content += "</ul>";
	return content;
		
	
}

function checkForAllEmpty(markerData,properties){
	for(i = 0; i < properties[1].length; i++){
		if(markerData[properties[1][i]] == "ja"){
			return false;
		}
	}
	return true;
}

function addMapMoveEvent(){
		
	// If vendors were loaded at move-event to the map
	GEvent.addListener(map,"moveend",function(){
		
		if(jQuery("#vendorFilter").val()){
			var servicepartner = (jQuery("#vendorFilter").val() == "service");
			var geprueft = (jQuery("#vendorFilter").val() == "programm");
		}
		
		var viewPortBounds = map.getBounds();
		var sw = viewPortBounds.getSouthWest();
		var ne = viewPortBounds.getNorthEast();
		loadVendorsInViewport(sw.lat(),sw.lng(),ne.lat(),ne.lng(),servicepartner,geprueft);
		
		var zoomlevel = map.getBoundsZoomLevel(new GLatLngBounds(sw,ne));
		
		if(zoomlevel < 7){
			jQuery("#fachhaendler").fadeOut();
		}
		else if(!geprueft){
			if(jQuery("#fachhaendler").css("display")=="none"){
				jQuery("#fachhaendler").fadeIn();			
			}	
		}
	 });
}

