// JavaScript Document
var markerCounter = 0;
var markers = new Array();
var markerPoints = new Array();
var markerLabels = new Array();
var infoWindows = new Array();
var interval_name;
var lis;
var currentMarker;

var geocoder;
var theMap; 
var pos1LatLng = new google.maps.LatLng(53.547759, 9.966981);

function initializeMap(country){
	// Sets map options and initialise map
	var myMapOptions = {
		zoom: 12
		,center: pos1LatLng
		,mapTypeId: google.maps.MapTypeId.SATELLITE
	};
	theMap = new google.maps.Map(document.getElementById("headerbildInner"), myMapOptions);
	
	geocoder = new google.maps.Geocoder();
	if (geocoder) {
		geocoder.geocode( { 'address': country}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				theMap.panTo(results[0].geometry.location);
			} else {
				alert("Initial Position: Geocode was not successful for the following reason: " + status);
			}
		});
	}
}

function codeAddress(marker, address) {
	if (geocoder) {
		geocoder.geocode( { 'address': address}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				marker.position = results[0].geometry.location;
				showMarker(marker);
			} else {
				alert("Set Marker: Geocode was not successful for the following reason: " + status + address);
			}
		});
	}
}

// Adds a new marker to the map
function addNewMarker(opt_opts){
	
	opt_opts = opt_opts || {};
	
	// Save data
	var latlng = opt_opts.latlng;
	var position = opt_opts.position;
	var headline = opt_opts.headline;
	var content = opt_opts.content;
	var contact = opt_opts.contact;
	var subcontent = opt_opts.subcontent;
	var imgaeUrl = opt_opts.imageUrl;
	var label = opt_opts.label;
	
	// Create Google Maps standard Marker
	var marker = new google.maps.Marker({
		map: theMap
		,position: latlng
		,visible: false
	});
	//codeAddress(marker, position);
	
	// Create InfoWindow and Custom Marker
	var ib = getCustomInfoWindow(headline,content,contact,subcontent,imgaeUrl);
	var mark = getCustomMarker(label);
	
	// Set Event-Listener
	google.maps.event.addListener(theMap, 'click', function(){
   		ib.close();
 	});
		
	google.maps.event.addListener(mark, "click", function(event) {		
		closeOtherInfoWindows();
		theMap.panTo(marker.getPosition());
        ib.open(theMap, marker);
		theMap.panTo(marker.getPosition());
		currentMarker = mark;
		interval_name = setInterval(testInfoBox, 100);
    });
	
	google.maps.event.addListener(theMap, "zoom_changed", function(event) {
		closeOtherInfoWindows();	
		//theMap.panTo(marker.getPosition());
	});
	
	// Save marker into Arrays
	markers.push(marker);
	markerPoints.push(mark);
	markerLabels.push(label);
	infoWindows.push(ib);
	showMarker(marker);
}

function testInfoBox(){
	var markerID = getMarkerId(currentMarker)
	if($('.mapInfoBox').lenght==0){
		return;	
	}else{
		clearInterval(interval_name);
		var pan = parseInt($('#mapMarker'+markerID).parent().css('top'))-parseInt($('.mapInfoBox').parent().height())-20;
		$('.mapInfoBox').parent().css('top',parseInt($('#mapMarker'+markerID).parent().css('top'))-parseInt($('.mapInfoBox').parent().height())-20);
		if(pan<0){
			theMap.panBy(0,-120);
		}
	}
}

// Shows marker by its label
function showMarkerByLabel(label){
	closeOtherMarker();
	var labelNum = -1;
	var i;
	for(i=0; i<markerLabels.length; i++){
		if(markerLabels[i] == label){
			labelNum = i;	
		}
	}
	if(labelNum==-1){ return; }
	markerPoints[labelNum].open(theMap, markers[labelNum]);
	theMap.panTo(markers[labelNum].getPosition());
}

function showMarker(marker){
	var markerNum = -1;
	var i;
	for(i=0; i<markers.length; i++){
		if(markers[i] == marker){
			markerNum = i;	
		}
	}
	if(markerNum==-1){ return; }
	markerPoints[markerNum].open(theMap, markers[markerNum]);
}

function getMarkerId(mark){
	var markNum = -1;
	var i;
	for(i=0; i<markerPoints.length; i++){
		if(markerPoints[i] == mark){
			markNum = i;	
		}
	}
	if(markNum==-1){ return; }
	//alert(markNum);
	return markNum;
}

// Show marker by its id
function showMarkerByID(id){
	//closeOtherMarker();
	if(id>=markerLabels.length){ return; }
	markerPoints[id].open(theMap, markers[id]);
	theMap.panTo(markers[id].getPosition());
}

// Close all other InfoWindows
function closeOtherInfoWindows(){
	var i;
	for(i=0; i<infoWindows.length; i++){
		infoWindows[i].close();
	}
}

// Close all other marker
function closeOtherMarker(){
	var i;
	for(i=0; i<markerPoints.length; i++){
		markerPoints[i].close();
	}
}

// Creates a custiom InfoWindow
function getCustomInfoWindow(headline, content, contact, subcontent, imageUrl){
	// Window content and style goes here
	var boxText = "<div class='mapInfoBox'>";
		boxText += "<div>"
		boxText += "	<table><tr><td>";
		boxText += "		<h1>"+headline+"</h1>";
		boxText += "		<p>"+content+"</p>";
		boxText += "		<p>"+contact+"</p>";
		boxText += "	</td><td>";
		boxText += "    	<img src='"+imageUrl+"' />"
		boxText += "	</td></tr><tr><td colspan='2'>";
		boxText += "		<p>"+subcontent+"</p>";
		boxText += "		</td></tr></table>";
		boxText += "</div>";
		boxText += "</div>";
	
	// Set InfoWindow options
	var myOptions = {
		 content: boxText
		,disableAutoPan: false
		,maxWidth: 0
		,pixelOffset: new google.maps.Size(-37, -159)			
		,zIndex: null
		,boxStyle: { 
		  opacity: 1.0,
		  border: "solid black 10px",
		  background: "white"
		 }
		,closeBoxMargin: "5px 5px 0px 0px"
		,closeBoxURL: "fileadmin/res/img/Maps_closeIcon.gif"
		,infoBoxClearance: new google.maps.Size(1, 1)
		,isHidden: false
		,pane: "floatPane"
		,enableEventPropagation: false
	};
	
	var ib = new InfoBox(myOptions);	
	return ib;
}

// Creates a custiom marker
function getCustomMarker(content){
	// Marker content and style goes here
	var boxText = "<div class='mapMarkerBox' id='mapMarker"+markerCounter+"'>";
		boxText += "<p>"+content+"</p>";
		boxText += "</div>";
		boxText += "<div class='mapMarkerBoxArrow'>&nbsp;</div>";
	
	// Set marker options
	var myOptions = {
		 content: boxText
		,disableAutoPan: true
		,maxWidth: 0
		,pixelOffset: new google.maps.Size(-37, -46)			
		,zIndex: null
		,boxStyle: { 
		  opacity: 1.0,
		  cursor: "pointer"
		 }
		,closeBoxMargin: "0px 0px 0px 0px"
		,closeBoxURL: ""
		,infoBoxClearance: new google.maps.Size(1, 1)
		,isHidden: false
		,pane: "overlayImage"
		,enableEventPropagation: false
	};
		
	var ib = new InfoBox(myOptions);	
	markerCounter++;
	return ib;

}
