//********************************
// G O O G L E     M A P S    F U N C T I O N S
// author: Gursch Markus
// July 2008
/////////////////////////////////*

var map = null;
var baseIcon = new GIcon();
var searchBaseIcon = new GIcon();
var markerOptions;
var httpObject;
var rect;
var categoryMarkersList = [];
var tmpDoubleEntryMarkers = [];
var arr;

var searchArr = [];
var searchArrActive = [];

var openDirection = false;

//////////////////////////
/// C O N S T A N T S ////
//////////////////////////

var catKulinarik = '31';
var catHandwerk  = '32';
var catLeben     = '33';
var catAllgemein = '34';

//////////////////////////
/// F U N C T I O N S ////
//////////////////////////

/**
 * generates the base icon with shadow for the marker
 */
function createBaseIcon()
{
	baseIcon = new GIcon();
    baseIcon.iconSize = new GSize(22, 36);
    baseIcon.iconAnchor = new GPoint(9, 34);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
}

/** 
 * creates the search base icon
 */
function createSearchBaseIcon()
{
	searchBaseIcon = new GIcon();
    searchBaseIcon.iconSize = new GSize(22, 36);
    searchBaseIcon.iconAnchor = new GPoint(9, 34);
    searchBaseIcon.infoWindowAnchor = new GPoint(9, 2);
}
/**
 * getMap
 * like singleton pattern
 * returns an instance of the map
 * if instance is null a new will be created
 */
function getMap(){
    if (map == null) 
		{
			 map = new GMap2(document.getElementById("map_canvas"));
		   map.setCenter(new GLatLng(47.000, 15.2659));
		   map.enableDragging();
		   map.enableScrollWheelZoom();
		   map.enableInfoWindow();
		   map.addControl(new GLargeMapControl());
		 	 map.addControl(new GMapTypeControl());
			 map.addMapType(G_PHYSICAL_MAP); 
	     createBaseIcon();
	     createSearchBaseIcon();
	     GEvent.addListener(map, "zoomend", function() { 
    		 if(rect)
    			 map.removeOverlay(rect);
	     });
	  }
    return map;
} 

/**
 * setLocation
 * sets a marker for the institution
 */
function setLocation(instID, katID, openIt)
{
	httpObject1 = getHTTPObject();
	
	httpObject1.open("GET", hostFiller + "/xml/marker.php?instID=" + instID, true);
	httpObject1.setRequestHeader("If-Modified-Since","Sat, 1 Jan 2000 00:00:00 GMT");

	var d = new Date();
	var t = d.getTime();
	var thetimestring = t.toString(10);
	
	httpObject1.send(thetimestring);
	
    httpObject1.onreadystatechange = function() {
	if (httpObject1.readyState == 4) {
  		if (httpObject1.status == "200") {
		  
		  	var xml1 = httpObject1.responseXML;
			detailArr1 = prepareDetailArray(xml1, 0);
			
			if (!categoryMarkersList[katID])
				categoryMarkersList[katID] = new Array();
				
			var myMarker;
			
			//marker schon vorhanden?
			if (markersArray[instID] == null)
			{ 
				myMarker = createTabbedMarker(detailArr1, katID, 0);
				categoryMarkersList[katID][instID] = myMarker;
				markersArray[instID] = myMarker;
				cluster.addMarkers([myMarker]);
      	cluster.refresh();
     	}
     	else
     	{
     		myMarker = markersArray[instID];
				changeImage(katID, detailArr1);
				cluster.removeMarkers();
				cluster.addMarkers(searchArrActive);
				cluster.addMarkers(markersArray);
		    cluster.refresh();
     	}
			changeExportLink();
			
			if (!gdir)
			{
				map.setCenter(new GLatLng(detailArr1["x"], detailArr1["y"]));
				map.setZoom(17);
				
			}
			if (openIt == true) {
				if (katID == 87) {
					window.setTimeout(function callFunc() { GEvent.trigger(myMarker, "click"); }, 1000);
				}
				else {
					GEvent.trigger(myMarker, "click");
				}
			}
	  }
    }
  }
}

/**
 * there are more setLocation methods and this one is for the search results
 * its better not to have one method for this
 */
function setSearchLocation(instID, katID, resultNumber, zoomlevel)
{
	if (searchArr[instID])
	{
		var smarker = searchArr[instID];
		
		if (searchArrActive[instID] != null)
		{
			var element = document.getElementById("cbInst" + instID);
			if (element)
				element.checked = true;
			if (!gdir)
				map.setCenter(smarker.getLatLng());
			map.setZoom(zoomlevel);	
			GEvent.trigger(smarker, "click");
			
			return;
		}
		
		cluster.addMarkers([smarker]);
		cluster.refresh();
	
		var element = document.getElementById("cbInst" + instID);
		if (element)
			element.checked = true;
		
		if (!gdir)
			map.setCenter(smarker.getLatLng());

		if (!categoryMarkersList[katID])
			categoryMarkersList[katID] = new Array();
			
		categoryMarkersList[katID][instID] = smarker;
		map.setZoom(zoomlevel);
		searchArr[instID] = smarker;
		searchArrActive[instID] = smarker;
		GEvent.trigger(smarker, "click");
		changeExportLink();
	}
}

/**
 * searches for all instIDs in arr and builds up the output
 */
function setSearchLocationArr(arr, searchValue)
{
	globSearchValue = searchValue;

	var params = "values=" + arr + "&random=" + randomValue();
	
	http = getHTTPObject();
	http.open("POST", hostFiller + "/xml/searchStart.php", true);
	http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http.setRequestHeader("Content-length", params.length);
	http.setRequestHeader("Connection", "close");
	
	http.send(params);
	http.onreadystatechange = function() {
	if (http.readyState == 4) {
  		if (http.status == "200") {
  			
		  	var xml = http.responseXML;
		
			searchArr = null;
			searchArr = new Array();
			searchArrActive = null;
			searchArrActive = new Array();
		
			for (var i = 0; i < xml.getElementsByTagName("institution").length; i++)
			{
				var detailArr = prepareDetailArray(xml, i);
				catID = xml.getElementsByTagName("institution")[i].getElementsByTagName("katID")[0].lastChild.nodeValue;
			
				var element = document.getElementById("cbInst" + detailArr["instID"]);
				
				if (element)
					element.checked = true;
				
				var marker;
				
				if (categoryMarkersList[catID] == null)
						categoryMarkersList[catID] = new Array();
						
				marker = createTabbedMarker(detailArr, catID, i+1);
				
				searchArrActive[detailArr["instID"]] = marker;
				searchArr[detailArr["instID"]] = marker;
			}
			
			changeExportLink();
			cluster.removeMarkers();
			cluster.addMarkers(searchArrActive);
			cluster.addMarkers(markersArray);
			
     	cluster.refresh();
     	
     	//alert(globalIsUrlWithSearchText);
     	if (globalIsUrlWithSearchText == -1)
      	map.setZoom(9);
      else {
      	map.setZoom(globalIsUrlWithSearchText);
      	map.setCenter(new GLatLng(globalLat, globalLng));
      }
      	
			setLoad(false);
	  }
    }
  }
}
/**
 * this method shows every marker from one category
 */
function showMarkersToCategory(catID)
{
	httpObject = getHTTPObject();
	httpObject.open("GET", hostFiller + "/xml/instituteXML.php?katID=" + catID, true);
	httpObject.setRequestHeader("If-Modified-Since","Sat, 1 Jan 2000 00:00:00 GMT");
	d = new Date();
	t = d.getTime();
	thetimestring=t.toString(10);
	
	httpObject.send(thetimestring);
	httpObject.onreadystatechange = function() {
	if (httpObject.readyState == 4) {
 		if (httpObject.status == "200") {
	  	var xml = httpObject.responseXML;
			if (!categoryMarkersList[catID])
				categoryMarkersList[catID] = new Array();
		
			var markerArray = [];
			for (var i = 0; i < xml.getElementsByTagName("institution").length; i++)
			{
				var detailArr = prepareDetailArray(xml, i);
				
				if (categoryMarkersList[catID][detailArr["instID"]] == null)
				{
					var marker = createTabbedMarker(detailArr, catID, 0);
					
					categoryMarkersList[catID][detailArr["instID"]] = marker;
					
					if (!markersArray[detailArr["instID"]])
					{
						//markerArray.push(marker);
						markersArray[detailArr["instID"]] = marker;
					}
					else
						changeImage(catID, detailArr);
				}
			}
			changeExportLink();
			cluster.removeMarkers();
			cluster.addMarkers(searchArrActive);
			cluster.addMarkers(markersArray);
			//cluster.addMarkers(markerArray);
	    cluster.refresh();
	      	
			setLoad(false);	 
	  	}
    }
  }
}

/**
 * deletes all markers of one category
 */
function removeCategoryMarkers(katID)
{
	if (categoryMarkersList[katID])
	{
		markers = categoryMarkersList[katID];
		for (var myMarker in markers)
		{	
			if (markers[myMarker])
			{
				//var element = document.getElementById("cbInst" + markers[myMarker].tooltip);
				instID = markers[myMarker].tooltip;
				if (!doubleEntry(instID, katID))
				{
			 		delete(markersArray[instID]);
			 		if (tmpDoubleEntryMarkers[katID] != null)
			 		delete(tmpDoubleEntryMarkers[katID][instID]);
			 	}
			 	else
			 	{
			 		if (tmpDoubleEntryMarkers[katID] == null)
			 			tmpDoubleEntryMarkers[katID] = new Array();
			 		tmpDoubleEntryMarkers[katID][instID] = markers[myMarker];
			 	}
		 		delete(categoryMarkersList[katID][instID]);

				
			}
		}
	}
	
	cluster.removeMarkers();
	cluster.addMarkers(searchArrActive);
	cluster.addMarkers(markersArray);
	cluster.refresh();
	changeExportLink();
	
	setLoad(false);
}

function findDoubleMarker(instID)
{
	for (var catMarkers in categoryMarkersList)
	{
		if (categoryMarkersList[catMarkers] && catMarkers != katID)
			for(var instMarker in categoryMarkersList[catMarkers])
			{
				if (instMarker == instID)
					return categoryMarkersList[catMarkers][instMarker];
			} 
	}
}
function doubleEntry(instID, katID)
{
	for (var catMarkers in categoryMarkersList)
	{
		if (categoryMarkersList[catMarkers] && catMarkers != katID)
			for(var instMarker in categoryMarkersList[catMarkers])
			{
				if (instMarker == instID)
					return true;
			} 
	}
	return false;
}
/**
 * deletes all markers from clusterManager and adds the new one
 */
function reloadMarkers()
{
	cluster.removeMarkers();
	cluster.addMarkers(markersArray);
	cluster.refresh();
}

/**
 * removes a single marker 
 */
function removeLocation(instID, katID)
{
	if (searchArr[instID])
	{
		var marker = searchArr[instID];
		map.removeOverlay(marker);
		searchArrActive[instID] = null;
		cluster.removeMarkers();
		
		cluster.addMarkers(markersArray);
		cluster.addMarkers(searchArrActive);
		cluster.refresh();
		changeExportLink();
	}
	
}	
/**
 * builds up the detailArr array for easier use
 */
function prepareDetailArray(xml, elementCount)
{
 	var inst = xml.getElementsByTagName("institution");	
			
	arr = new Array();
	
	arr["instID"] = inst[elementCount].getElementsByTagName("instID")[0].lastChild.nodeValue;
	arr["strasse"] = inst[elementCount].getElementsByTagName("strasse")[0].lastChild.nodeValue;
	arr["plz"] = inst[elementCount].getElementsByTagName("plz")[0].lastChild.nodeValue;
	arr["ort"] = inst[elementCount].getElementsByTagName("ort")[0].lastChild.nodeValue;	
	arr["tel"] = inst[elementCount].getElementsByTagName("tel")[0].lastChild.nodeValue;
	arr["mobil"] = inst[elementCount].getElementsByTagName("mobil")[0].lastChild.nodeValue;
	arr["mail"] = inst[elementCount].getElementsByTagName("mail")[0].lastChild.nodeValue;
	arr["fax"] = inst[elementCount].getElementsByTagName("fax")[0].lastChild.nodeValue;
	arr["url"] = inst[elementCount].getElementsByTagName("url")[0].lastChild.nodeValue;
	arr["vorname"] = inst[elementCount].getElementsByTagName("vorname")[0].lastChild.nodeValue;
	arr["nachname"] = inst[elementCount].getElementsByTagName("nachname")[0].lastChild.nodeValue;
	arr["x"] = inst[elementCount].getElementsByTagName("x")[0].lastChild.nodeValue;
	arr["y"] = inst[elementCount].getElementsByTagName("y")[0].lastChild.nodeValue;
	arr["slogan"] = inst[elementCount].getElementsByTagName("slogan")[0].lastChild.nodeValue;
	arr["oeffnungszeiten"] = inst[elementCount].getElementsByTagName("oeffnungszeiten")[0].lastChild.nodeValue;
	arr["name"] = inst[elementCount].getElementsByTagName("name")[0].lastChild.nodeValue;
	arr["katID1"] = inst[elementCount].getElementsByTagName("katID1")[0].lastChild.nodeValue;
	arr["katID2"] = inst[elementCount].getElementsByTagName("katID2")[0].lastChild.nodeValue;
	arr["katID3"] = inst[elementCount].getElementsByTagName("katID3")[0].lastChild.nodeValue;
	arr["katID4"] = inst[elementCount].getElementsByTagName("katID4")[0].lastChild.nodeValue;
	arr["katID5"] = inst[elementCount].getElementsByTagName("katID5")[0].lastChild.nodeValue;
	arr["erwartung"] = inst[elementCount].getElementsByTagName("erwartung")[0].lastChild.nodeValue;
	arr["beschreibung"] = inst[elementCount].getElementsByTagName("beschreibung")[0].lastChild.nodeValue;  
	arr["einwohner"] = inst[elementCount].getElementsByTagName("einwohner")[0].lastChild.nodeValue;
	arr["seehoehe"] = inst[elementCount].getElementsByTagName("seehoehe")[0].lastChild.nodeValue;
	arr["buergermeister"] = inst[elementCount].getElementsByTagName("buergermeister")[0].lastChild.nodeValue;
	arr["bezirk"] = inst[elementCount].getElementsByTagName("bezirk")[0].lastChild.nodeValue;
	arr["gemeinde"] = inst[elementCount].getElementsByTagName("gemeinde")[0].lastChild.nodeValue;
	arr["preise"] = inst[elementCount].getElementsByTagName("preise")[0].lastChild.nodeValue;
	arr["portallink"] = inst[elementCount].getElementsByTagName("portallink")[0].lastChild.nodeValue;
	
	///////////// PRODUKTE //////////////////
	var produkte = inst[elementCount].getElementsByTagName("produkt");
	arr["produkte"] = new Object();
	for (x = 0; x < inst[elementCount].getElementsByTagName("produkt").length ; x++)
	{
		var name = produkte[x].getElementsByTagName("titel")[0].lastChild.nodeValue;
		var betriebID = produkte[x].getElementsByTagName("betriebID")[0].lastChild.nodeValue;
		var producturl = produkte[x].getElementsByTagName("producturl")[0].lastChild.nodeValue;
		var productID = produkte[x].getElementsByTagName("produktID")[0].lastChild.nodeValue;
		
		arr["produkte"][x] = new Object();
		arr["produkte"][x]["name"] = name;
		arr["produkte"][x]["producturl"] = producturl;
		arr["produkte"][x]["id"] = productID;
		 
	}
	arr["productCount"] = inst[elementCount].getElementsByTagName("produkt").length;
	
	///////////// BEWERTUNG //////////////////
	arr["bewertung"] = new Array();
		
	for (var x = 0; x < inst[elementCount].getElementsByTagName("bewertung").length; x++)
	{ 
		var rating = inst[elementCount].getElementsByTagName("bewertung");
		var titel =  rating[x].getElementsByTagName("title")[0].lastChild.nodeValue;
		var text = rating[x].getElementsByTagName("text")[0].lastChild.nodeValue;
		var rating = rating[x].getElementsByTagName("rating")[0].lastChild.nodeValue;
		
		arr["bewertung"][x] = new Object();
		arr["bewertung"][x]["titel"] = titel;
		arr["bewertung"][x]["text"] = text;
		arr["bewertung"][x]["rating"] = rating;
	}
	
	///////////// FOTOS //////////////////
	arr["foto"] = new Array();
	for (var x = 0; x < inst[elementCount].getElementsByTagName("foto").length; x++)
	{ 
		var foto = inst[elementCount].getElementsByTagName("foto");
		var titel =  foto[x].getElementsByTagName("titel")[0].lastChild.nodeValue;
		var pfad = foto[x].getElementsByTagName("pfad")[0].lastChild.nodeValue;
		var fotoID = foto[x].getElementsByTagName("fotoID")[0].lastChild.nodeValue;
		var instID = foto[x].getElementsByTagName("instID")[0].lastChild.nodeValue;
		var portalFoto = foto[x].getElementsByTagName("portalFoto")[0].lastChild.nodeValue;
		
		arr["foto"][x] = new Object();
		arr["foto"][x]["titel"] = titel;
		arr["foto"][x]["pfad"] = pfad;
		arr["foto"][x]["fotoID"] = fotoID;
		arr["foto"][x]["instID"] = instID;
		arr["foto"][x]["portalFoto"] = portalFoto;
	}
	
	///////////// VIDEOS //////////////////
	arr["video"] = new Array();
	
	for (var x = 0; x < inst[elementCount].getElementsByTagName("video").length; x++)
	{ 
		var video = inst[elementCount].getElementsByTagName("foto");
		var titel =  video[x].getElementsByTagName("titel")[0].lastChild.nodeValue;
		var pfad = video[x].getElementsByTagName("pfad")[0].lastChild.nodeValue;
		var videoID = video[x].getElementsByTagName("videoID")[0].lastChild.nodeValue;
		var instID = video[x].getElementsByTagName("instID")[0].lastChild.nodeValue;
		
		arr["video"][x] = new Object();
		arr["video"][x]["titel"] = titel;
		arr["video"][x]["pfad"] = pfad;
		arr["video"][x]["videoID"] = videoID;
		arr["video"][x]["instID"] = instID;
	}	
	
	return arr;
}

/**
 * createTabbedMarker
 * creates a marker 
 */
function createTabbedMarker(details, katID, resultNumber) 
{
	//kat icon noch nicht geladen
	if (catSymbolArray[katID] == 0)
	{
		var httpObject1 = getHTTPObject();
		httpObject1.open("GET", hostFiller + "/xml/getCatImageName.php?katID=" + katID, true);
		
		httpObject1.setRequestHeader("If-Modified-Since","Sat, 1 Jan 2000 00:00:00 GMT");
		d = new Date();
		t = d.getTime();
		thetimestring=t.toString(10);
		
		//httpObject.send(null);
		httpObject1.send(thetimestring);
	
	  httpObject1.onreadystatechange = function() {
		if (httpObject1.readyState == 4) {
  		if (httpObject1.status == "200") {
  			
  				var xml = httpObject1.responseXML;
			  
			  	var catName = xml.getElementsByTagName("katName")[0].lastChild.data;
			  	
			  	catSymbolArray[katID] = catName;
			  	return doCreateTheMarker(details, katID, resultNumber);
			     
  		}
		}
	  }
	}else { //icon bereits geladen
	  return doCreateTheMarker(details,katID,resultNumber);
	}
}

function doCreateTheMarker(details, katID, resultNumber)
{
	var point = new GLatLng(details["x"], details["y"]);
	 
	  if (resultNumber == 0)
	  {
		  	var letteredIcon = new GIcon(baseIcon);
		  	if ((details["katID1"] > 1000 || details["katID2"] > 1000 || details["katID3"] > 1000 || details["katID4"] > 1000 || details["katID5"] > 1000 || isVulkanlandBetrieb(details)) || katID > 1000) 
		  		letteredIcon.image =  hostFiller + "/images/cat/map/pfeil_orange_" + catSymbolArray[katID]; //"http://econym.googlepages.com/colour086.png";
		  	else
		  		letteredIcon.image =  hostFiller + "/images/cat/map/pfeil_" + catSymbolArray[katID]; //"http://econym.googlepages.com/colour086.png";

			// Set up our GMarkerOptions object
			markerOptions = { icon:letteredIcon, title: details["name"] };
	  }
	  else
	  {
	  	var letteredIcon = new GIcon(searchBaseIcon);
	  	letteredIcon.image =  hostFiller + "/images/icons/markerImage.php?text=" + resultNumber + "&iconset=map";
	
			// Set up our GMarkerOptions object
			markerOptions = { icon:letteredIcon, title: details["name"] };
	  }
	  
	
	  var tabs = createTabs(details, katID);
	
    var locationMarker = new GMarker(point, markerOptions);
    locationMarker.tooltip = details["instID"];
    locationMarker.kat = details["katID1"];
      
    if (!categoryMarkersList[details["katID"]])
    	categoryMarkersList[details["katID"]] = new Array();
    		  
    GEvent.addListener(locationMarker, "click", function() {  
    		  this.openInfoWindowTabsHtml(tabs);
    		  setInfoWindowMarker(this);
    		  if (rect)
    		  	getMap().removeOverlay(rect);
      });
        
    GEvent.addListener(locationMarker, "infowindowopen", function () {
   
   		
      	if (openDirection == false)
	     	{
	      	foldTabPages();
	       	foldTab4Pages();
	    		foldDescriptions(details["bewertung"].length);
	    		ratingClick = false;
    		}
      });
    GEvent.addListener(locationMarker, "infowindowclose", function () {
    	openDirection = false;
    	});
     return locationMarker;
}

function changeImage(katID, details)
{
	var instID = details["instID"];
	var marker = markersArray[instID];
	
	delete(markersArray[instID]);
	
	var newMarker = createTabbedMarker(details,katID, 0);
	
	markersArray[instID] = newMarker;
}


/**
 * creates the url to the instID for marker title tag
 */
function getMarkerTitle(details)
{
	return "http://www.vulkanland.at/maps/" + details["instID"];
}


/**
 *  stores the actual marker for the info window
 */
function setInfoWindowMarker(marker)
{
	openInfoWindowMarker = marker;
}

/**
 * returns bool (true/false) for detail tab of sights of the sights_t_sights table
 */
function isSight(details)
{
	var kat1 = details["katID1"];
	var kat2 = details["katID2"];
	var kat3 = details["katID3"];
	var kat4 = details["katID4"];
	var kat5 = details["katID5"];
	
	if ( kat1 == 1105 || kat2 == 1105  || kat3 == 1105  || kat4 == 1105  || kat5 == 1105 )
		return true;
	
	/*
	  if ( details["instID"] >= 1248 && details["instID"] <= 1273)
		return true;
	*/
	return false;
	
}

function isGemeinde(details)
{
	var kat1 = details["katID1"];
	var kat2 = details["katID2"];
	var kat3 = details["katID3"];
	var kat4 = details["katID4"];
	var kat5 = details["katID5"];
	
	if ( kat1 == 87 || kat2 == 87 || kat3 == 87 || kat4 == 87 || kat5 == 87 )
		return true;

	return false;
}

function isTheater(details) {
	
	var kat1 = details["katID1"];
	var kat2 = details["katID2"];
	var kat3 = details["katID3"];
	var kat4 = details["katID4"];
	var kat5 = details["katID5"];
	
	if ( kat1 ==  215 || kat2 == 215 || kat3 == 215 || kat4 == 215 || kat5 == 215 )
		return true;

	return false;
	
}
/**
 * reateTabs
 * creates the tabs for the detailed marker
 */
function createTabs(details, katID)
{
	var tabArr = new Array();

	var tab1Text = generateTab1Text(details, katID);
	var tab1 = new GInfoWindowTab("Basisinfos",tab1Text);
	var tab2, tab2Sight, tab2Gem, tab2Wand;
	var tab2Text, tab2TextSight, tab2TextGem, tab2TextWand;
	tabArr.push(tab1);
		
	// sights gets a additional tab
	var showTab2 = false;	
		
	if (isSight(details) && isKat(details, 1105) && ! isVulkanlandBetrieb(details))
	{
		tab2TextSight = generateSightTabText(details);
	
		tab2Sight = new GInfoWindowTab("Details",tab2TextSight);
		tabArr.push(tab2Sight);
		showTab2 = true;
	}
	
	if (isGemeinde(details))
	{
		tab2TextGem = generateGemeindeTabText(details);
	
		tab2Gem = new GInfoWindowTab("Details", tab2TextGem);
		tabArr.push(tab2Gem);
		showTab2 = true;
	}
	
	// do tab 2 if nessessarry
	if (isVulkanlandBetrieb(details) )
	{
		if ( details["productCount"] > 0 || details["erwartung"].length > 6 || details["beschreibung"].length > 6)
		{
			tab2Text = generateTab2Text(details);
			
			tab2 = new GInfoWindowTab("Details",tab2Text);
			tabArr.push(tab2);
			showTab2 = true;
		}
	}	
	else
		tab2 = null;
	
	if ( showTab2 == false )
	{
		if( details["productCount"] > 0 || details["erwartung"].length > 6 || details["beschreibung"].length > 6)
		{
			tab2Text = generateTab2Text(details);
			
			tab2 = new GInfoWindowTab("Details",tab2Text);
			tabArr.push(tab2);
		}
	}
	var tab3Text = generateTab3Text(details);

	var tab3 = new GInfoWindowTab("Kommentare", tab3Text);
	tabArr.push(tab3);
	
	var tab4Text = generateTab4Text(details);
	var tab4 = new GInfoWindowTab("Fotos", tab4Text);
	
	tabArr.push(tab4);
	
	return tabArr;
} 
function isKat(details, katID)
{/*
	alert(details["katID1"]);
	alert(details["katID2"]);
	alert(details["katID3"]);
	alert(details["katID4"]);
	alert(details["katID5"]);
	*/
	if (details["katID1"] == katID)
		return true;
	if (details["katID2"] == katID)
		return true;
	if (details["katID3"] == katID)
		return true;
	if (details["katID4"] == katID)
		return true;
	if (details["katID5"] == katID)
		return true;
	return false;
}

function generateGemeindeTabText(details)
{
	var tabText = "";
	tabText += "<div id='gemeindeTab'>";
	tabText += "<p class='title'>" + details["name"] + "</p>";
	
	if (details["portallink"].length > 1) 
		tabText += "<p id='baseQuote'>Weitere Informationen zu &raquo; <a href='" + details["portallink"] + "' target='_blank' title='" + details["name"] + "'>" + details["name"] + "</a><br /></p>";

	
	tabText += "<br />";
	
	tabText += ((details["buergermeister"].length > 2)?("<b>B&uuml;rgermeister:</b> " + details["buergermeister"] + "<br />"):"");
	tabText += ((details["einwohner"].length > 1)?("<b>Einwohner:</b> " + details["einwohner"] + "<br />"):"");
	tabText += ((details["seehoehe"].length > 1)?("<b>Seeh&ouml;he:</b> " + details["seehoehe"] + "<br />"):"");
	//tabText += ((details["bezirk"].length > 2)?("Bezirk: " + details["bezirk"] + "<br />"):"");
	//tabText += ((details["tel"].length > 2)?("Telefon: " + details["tel"] + "<br />"):"");
	//tabText += ((details["mail"].length > 2)?("Email: " + details["mail"] + "<br />"):"");
	
	tabText += "<br />" + details["beschreibung"] + "<br />";
	tabText += "</div>";
	return tabText;
}
/**
 * generates the tab for the sights
 */
function generateSightTabText(details)
{
	var text = details["beschreibung"];
	var tabText2 = "<div id='tabSight'>";
	tabText2 += "<p class='title'>" + details["name"] + "</p><br />";
	tabText2 += text;
	tabText2 += "</div>";
	return tabText2;
}
/**
 * generates the base info tab
 */
function generateTab1Text(details, katID)
{
	var l = details["x"];
	var b = details["y"];
	
	var tab1Text = "<div id='tab1'>"; 
	//tab1Text += "<div id='detailmap'></div>";
	//tab1Text += "<div id='tab1Left'>";
	tab1Text += "<p class='title'>" + details["name"] + "</p>";
	
	if (isVulkanlandBetrieb(details) || isGemeinde(details))
		tab1Text += "<div id='vulkLogo'><img src='/images/logo_kl.png' /></div>";
	if (details["slogan"].length > 1) 
		tab1Text += "<p id='baseQuote'>&quot;" + details["slogan"] + "&quot;</p>";
	
	tab1Text += "<br /><p id='baseAdress'>" + details["strasse"] + "<br />" + details["plz"] + " " + details["ort"];
	
	if (!isGemeinde(details))
		tab1Text += ((details["gemeinde"] != null)?("<br />Gemeinde: " + details["gemeinde"]):"");
	else 
		tab1Text += ((details["bezirk"] != null)?("<br />Bezirk: " + details["bezirk"]):"");
	tab1Text += "</p>";
	
	tab1Text += ((details["tel"].length > 2)?("Tel: " + details["tel"] + "<br />"):"");
	
	if (!isBeherberger(details))
		tab1Text += ((details["fax"].length > 2)?("Fax: " + details["fax"] + "<br />"):"");
		
	tab1Text += ((details["mail"].length > 2)?("Email: <a href='mailto:" + details["mail"] + "'>" + details["mail"] + "</a><br />"):"");
	tab1Text += ((details["mobil"].length > 2)?(details["mobil"] + "<br />"):"");
		
	if (details["oeffnungszeiten"].length > 1) 
		tab1Text += "<br />&Ouml;ffnungszeiten: " +details["oeffnungszeiten"];
	if (details["preise"].length > 3)
		tab1Text += "<br />Preise: " + details["preise"];
 
 	if ( l == "" || l == " " )
 		l = 0;
 	if (b == "" || b == " ")
 		b = 0;
 	if (katID == "" || katID == " " )
 		katID = 0;
 		
 	tab1Text += "<br /><br />Route berechnen: <a href='javascript:void(0);' onClick='toHere(" + l + "," + b + "," + katID + "," + details["instID"]+ ");'>Hierher</a> - ";
 	tab1Text += "<a href='javascript:void(0);' onClick='fromHere(" + l + "," + b + "," + katID + "," + details["instID"] + ");'>von hier</a><br />";

	tab1Text += "GPS Koordinaten: " + l + "-" + b;
	tab1Text += "</div>";
	
	//tab1Text += "<div id='tab1Right'>";
	//tab1Text += "<div id='detailmap'></div>";
	tab1Text += "</div>";
	tab1Text += "</div>";

	return tab1Text;
}

function isBeherberger(details)
{
	var k1 = details["katID1"];
	var k2 = details["katID2"];
	var k3 = details["katID3"];
	var k4 = details["katID4"];
	var k5 = details["katID5"];
	
	if (k1 == 23 || k1 == 24 || k1 == 25 || k1 == 102 || k1 == 1102 )
		return true;
	if (k2 == 23 || k2 == 24 || k2 == 25 || k2 == 102 || k2 == 1102 )
		return true;
	if (k3 == 23 || k3 == 24 || k3 == 25 || k3 == 102 || k3 == 1102 )
		return true;
	if (k4 == 23 || k4 == 24 || k4 == 25 || k4 == 102 || k4 == 1102 )
		return true;
	if (k5 == 23 || k5 == 24 || k5 == 25 || k5 == 102 || k5 == 1102 )
		return true;
	return false;
}

/**
 * generates the detail map for tab1
 */
function generateDetailMapTab1(details, katID)
{
	var point2 = new GLatLng(details["x"], details["y"]);
	var dMapDiv = document.getElementById("detailmap");
	var detailMap = new GMap2(dMapDiv, new GSize(220,130));
	
	detailMap.setCenter(point2 , 17);
	detailMap.disableDragging();
	
	var letteredIcon = new GIcon(baseIcon);
	if (details["katID1"] > 1000 || details["katID2"] > 1000 || details["katID3"] > 1000 || details["katID4"] > 1000 || details["katID5"] > 1000) 
  		letteredIcon.image =  hostFiller + "/images/cat/map/pfeil_orange_" + catSymbolArray[katID]; 
  	else
  		letteredIcon.image =  hostFiller + "/images/cat/map/pfeil_" + catSymbolArray[katID];

	var markerOptions = { icon:letteredIcon, title: getMarkerTitle(details) };

	var detailMarker = new GMarker(point2, markerOptions);
	detailMap.addOverlay(detailMarker);

	var CopyrightDiv = dMapDiv.firstChild.nextSibling;
	var CopyrightImg = dMapDiv.firstChild.nextSibling.nextSibling;
	CopyrightDiv.style.display = "none"; 
	CopyrightImg.style.display = "none";
	
	
	//GEvent.addListener(detailMap, "zoomend", miniMapZoomEnd);
	//GEvent.addListener(detailMap, "moveend", miniMapMoveEnd);
}

/**
 * prints the form to input the start adress
 */  
function toHere(x, y, katID, instID)
{
	
	var htmls = '<div id="toHereDiv"><br />Richtung: <b>Hierher</b> - <a href="javascript:void(0);" onClick="fromHere(\'' + x + '\'\,\'' + y + '\',\'' + katID + '\',\'' + instID + '\');">Von hier</a>' +
           '<br /><form action="javascript:getDirections(2);" method="GET" >' +
           '<table><tr>' + 
           '<td>Startstrasse</td><td><input type="text" size=40 maxlength=40 name="sstrasse" id="sstrasse" value="" /></td>' +
           '</tr><tr>' + 
           '<td>Startort(+PLZ)</td><td><input type="text" size=40 maxlength=40 name="sort" id="sort" value="" /></td>' +
           '</tr><tr>' +  
           '<td><input value="Route berechnen" type="submit"></td>' +
           '</tr></table>' + 
           '<input type="hidden" id="daddr" value="' + x + ',' + y + '" /></form></div>';


		var markers = null;
		if (categoryMarkersList[katID])
		{
    	if (categoryMarkersList[katID][instID])
    		markers = categoryMarkersList[katID][instID];
    }
   
    if (markers == null)
    {  
    	if (searchArr[instID])
    		markers = searchArr[instID];
    	else
    		markers = tmpDoubleEntryMarkers[katID][instID];
    }
    
    if (markers != null)
    {
	   	markers.closeInfoWindow();
	   	openDirection = true;
			markers.openInfoWindowHtml(htmls);
		}	
		else
		{
			alert("marker " + instID + " nicht gefunden");
		}
}

/**
 * prints the form to input the end adress
 */
function fromHere(x, y, katID, instID)
{   
	var htmlx = '<div id="toHereDiv"><br />Richtung: <a href="javascript:void(0);" onClick="toHere(\'' + x + '\'\,\'' + y + '\',\'' + katID + '\', \'' + instID + '\');">Hierher</a> - <b>Von hier</b>' +
           '<br /><form action="javascript:getDirections(1);" method="GET" >' +
           '<table><tr>' +
           '<td>Zielstrasse</td><td><input type="text" size=40 maxlength=40 name="zstrasse" id="zstrasse" value="" /></td>' +
           '</tr><tr>' +
           '<td>Zielort(+PLZ)</td><td><input type="text" size=40 maxlength=40 name="zort" id="zort" value="" /></td>' + 
           '</tr><tr>' +
           '<td><input value="Route berechnen" type="submit"></td>' +
           '</tr></table>' + 
           '<input type="hidden" id="saddr" value="' + x + ',' + y + '" /></form></div>';

	var markers = null;
		if (categoryMarkersList[katID])
		{
    	if (categoryMarkersList[katID][instID])
    		markers = categoryMarkersList[katID][instID];
    }
   
    if (markers == null)
    {  
    	if (searchArr[instID])
    		markers = searchArr[instID];
    	else
    		markers = tmpDoubleEntryMarkers[katID][instID];
    }
    
    if (markers != null)
    {
	   	markers.closeInfoWindow();
	   	openDirection = true;
			markers.openInfoWindowHtml(htmlx);
		}	
		else
		{
			alert("marker " + instID + " nicht gefunden");
		}
	
}

/**
 * prints the route to the map
 * reads parameter from the form in the infowindow
 */
function getDirections(way)
{
	var start;
	var end;
		if (way == 2)
		{
			start = document.getElementById("sstrasse").value + ", " + document.getElementById("sort").value; 
			end   = document.getElementById("daddr").value;
		} else if (way == 1)
		{
			start = document.getElementById("saddr").value
			end   =  document.getElementById("zstrasse").value + " " + document.getElementById("zort").value; 
		}
		
    if (start == null || end == null || start == ""  || end == "")
    {
    	alert("Adresse kann nicht gefunden werden");
    	cluster.refresh();
    	return 0;
    }
    
    var dirDiv = document.getElementById("directionDIV");
    
    clearChilds(dirDiv);

		if (gdir)
			gdir.clear();
		
    gdir = new GDirections(map, dirDiv );
   // GEvent.trigger(openInfoWindowMarker, "infowindowclose");
    openInfoWindowMarker.closeInfoWindow();
     // === Array for decoding the failure codes ===
    var reasons=[];
    reasons[G_GEO_SUCCESS]            = "Success";
    reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
    reasons[G_GEO_UNKNOWN_ADDRESS]    = "Adresse wurde nicht gefunden";
    reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
    reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
    reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
    reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
    reasons[G_GEO_BAD_REQUEST]        = "A directions request could not be successfully parsed.";
    reasons[G_GEO_MISSING_QUERY]      = "No query was specified in the input.";
    reasons[G_GEO_UNKNOWN_DIRECTIONS] = "The GDirections object could not compute directions between the points.";

    // === catch Directions errors ===
  
    GEvent.addListener(gdir, "error", function() {
      var code = gdir.getStatus().code;
      var reason="Code "+code;
      if (reasons[code]) {
        reason = reasons[code]
      } 

      alert("Fehler: "+reason);
      toggle("unfold", "mainUL");
      toggle("fold", "directionDIV");
      toggle("fold", "menuDIV");
      document.getElementById("treeDiv").style.height = "293px";
      document.printForm.direction.value = "";
    });
    
    toggle("fold","mainUL");
    toggle("unfold", "menuDIV");
    toggle("unfold", "directionDIV");
   
   	if (navigator.appName == "Microsoft Internet Explorer")
			document.getElementById('treeDiv').style.height = '255px';
		else
			document.getElementById('treeDiv').style.height = '270px';
		
    
    var string = "from:" + start + " to:" + end;
    
    document.printForm.direction.value = string;
    
    setDirectionCloseLink();
    
    gdir.load(string, { "getSteps":true});
}

function setDirectionCloseLink()
{
	var contextmenu = document.createElement("div");
	contextmenu.setAttribute("id", "routeClose");
  contextmenu.style.background="#ffffff";
  contextmenu.style.border="1px solid #8888FF";
  
  contextmenu.innerHTML = '<a href="javascript:void(0);" onclick="clearRoute(); return false;" ><img src=" ' +  hostFiller + '/images/deleteRoute.jpg" /></a>';
  getMap().getContainer().appendChild(contextmenu);

  var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize( 290, 7));  
  pos.apply(contextmenu);
}

/**
 * generates the product tab
 */
function generateTab2Text(details)
{
	var tab2Text = "<div id='tab2'>";	
	var showDesc = 0;
	
	tab2Text += "<p class='title'>" + details["name"] + "</p>";
		
	if (details["portallink"].length > 1) 
		tab2Text += "<p id='baseQuote'>Weitere Informationen zu &raquo; <a href='" + details["portallink"] + "' target='_blank' title='" + details["name"] + "'>" + details["name"] + "</a><br /></p>";
	
	if (details["erwartung"].length > 6)
	{
		tab2Text += "<br />";
		tab2Text += details["erwartung"];
		showDesc++;
	}
	
	if ( details["productCount"] > 0 )
	{
		tab2Text += "<br /><br /><p class='title'>Angebotspalette von " + details["name"] + "</p>";
		tab2Text += "<table id='productDetail'>";
		for (var x = 0; x < details["productCount"]; x++)
		{
			tab2Text += "<tr><td id='productTable'>";
			tab2Text += "<img src='" + getPictureName(details, details["produkte"][x]["id"], 0) + "' /></td>";
			
			if (details["produkte"][x]["producturl"].length > 1)
				tab2Text += "<td id='productTable'>&raquo; <a href='" + details["produkte"][x]["producturl"] + "' title='" + details["produkte"][x]["name"] + "' target='_blank'>" + details["produkte"][x]["name"] + "</a></td></tr>";
			else
				tab2Text += "<td id='productTable'>&raquo; " + details["produkte"][x]["name"] + "</td></tr>";
		}
		showDesc++;
	}  
	tab2Text += "</table>";
	
	if (details["beschreibung"].length > 6 && showDesc == 0)
	{
		tab2Text += "<br />";
		tab2Text += details["beschreibung"];
	}
	tab2Text += "</div>";
	return tab2Text;
}


/////////////////////////////////////////////////
/////////// not in use now //////////////////////
/////////////////////////////////////////////////
// das rote rechteck, wenn man die minimap im infowindow bewegt //

function miniMapZoomEnd(oldZ,newZ) {
	showMinimapRect(this);
}


function miniMapMoveEnd() {
	showMinimapRect(this);
}


/**
 * prints the red rectangle to the map
 */
function showRectangle(bounds) {
	if (rect) {
		map.removeOverlay(rect);
	}
	
	var offset = 10;
	//var bounds = detailMap.getBounds();
	var proj = new GMercatorProjection(20);
	
	var p1 = proj.fromLatLngToPixel(bounds.getSouthWest(),  getMap().getZoom());
	var p2 = proj.fromLatLngToPixel(new GLatLng(bounds.getSouthWest().lat(), bounds.getNorthEast().lng()), getMap().getZoom());
	var p3 = proj.fromLatLngToPixel(bounds.getNorthEast(), getMap().getZoom());
	var p4 = proj.fromLatLngToPixel(new GLatLng(bounds.getNorthEast().lat(), bounds.getSouthWest().lng() ), getMap().getZoom());
	var p5 = proj.fromLatLngToPixel(bounds.getSouthWest(), getMap().getZoom());
	
	p1.x -= offset;
	p1.y += offset;
	
	p2.x += offset;
	p2.y += offset;
	
	p3.x += offset;
	p3.y -= offset;
	
	p4.x -= offset;
	p4.y -= offset;
	
	p5.x -= offset;
	p5.y += offset;
	
	var b1 = proj.fromPixelToLatLng(p1, getMap().getZoom());
	var b2 = proj.fromPixelToLatLng(p2, getMap().getZoom());
  var b3 = proj.fromPixelToLatLng(p3, getMap().getZoom());
	var b4 = proj.fromPixelToLatLng(p4, getMap().getZoom());
	var b5 = proj.fromPixelToLatLng(p5, getMap().getZoom());
	
	
	var polyPoints = [	b1 , b2, b3, b4, b5 ];
		
//	var polyPoints = [	bounds.getSouthWest(),
//						new GLatLng(bounds.getSouthWest().lat(), bounds.getNorthEast().lng()),
//						bounds.getNorthEast(),
//						new GLatLng(bounds.getNorthEast().lat(), bounds.getSouthWest().lng() ),
//						bounds.getSouthWest()
//					]

	rect = new GPolygon(polyPoints, '#ff0000', 1, 1, '#ffffff', 0.3);
	getMap().addOverlay(rect);

}
