var waypoints;
var trailArr = new Array();
var actTrailID = 0;
var actTrailInstID = 0;
var trailMarker;
var bounds;
/**
 * creates a trail on the map
 */
function setTrail(instID, print)
{
	
	setLoad(true);
	clearTrail();
	var httpObject1 = getHTTPObject();
	
	httpObject1.open("GET", hostFiller + "/xml/getTrails.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 xml = httpObject1.responseXML;
		 
		 	var coordsXML;
			var details = prepareTrailArray(xml, waypoints);
			if (window.ActiveXObject)
			{
				coordsXML = new ActiveXObject("Microsoft.XMLDOM");
				coordsXML.async = false;
				coordsXML.loadXML(details["gpx"]);
			}
			//for Mozilla, Firefox, Opera, etc.
			else if (document.implementation && document.implementation.createDocument)
			{
				var parser = new DOMParser();
				coordsXML = parser.parseFromString(details["gpx"],"text/xml");
			}
			
			var trkpt = coordsXML.getElementsByTagName("trkpt");
			actTrailID = details["trailID"];
			actTrailInstID = details["instID"];
			waypoints = new Array();
			
			var cnt = 0;
			var arrCnt = 0;
			for (var i = 0; i < trkpt.length -1 ; i++)
			{
				var lat = trkpt[i].getAttribute("lat");
				var lng = trkpt[i].getAttribute("lon");
				var ele = trkpt[i].getElementsByTagName("ele");
				
				var arr = new Array();
				arr["point"] = new GLatLng(lat, lng);
				arr["ele"] = ele;
				waypoints.push(arr);
			}
			if (!print)
				updateExportTrailTrack(instID, 1);
			addRouteStartMarker(details, waypoints, true, "wanderweg_t_wanderwege", "wanderwegID", print);
			createTrack(getMap(), waypoints, actTrailID, "wanderweg_t_wanderwege", "wanderwegID", false);
			GEvent.trigger(trailMarker, "click");
		  setLoad(false);	
    	}
  	}
  }	
}

/**
 * draws the track to the map
 */
function createTrack(map, waypoints, trailID, table, idColumn, minimap)
{
	setLoad(true);
	bounds = new GLatLngBounds();
	if (document.printForm != null)
		saveTrackForPrint(trailID, idColumn);
	
	if (waypoints.length < 150)
	{
		for (i = 0; i < waypoints.length-1; i++)
		{			
			var polyline = new GPolyline([ waypoints[i]["point"],waypoints[i+1]["point"]], "#E99209", 3, 1);
			trailArr.push(polyline);
			map.addOverlay(polyline);
			bounds.extend(waypoints[i]["point"]);
		}
	}
	else
	{
		for (i = 0; i < waypoints.length-1; i += 3)
		{			
			if (waypoints[i+3] != null)
				var polyline = new GPolyline([ waypoints[i]["point"],waypoints[i+3]["point"]], "#E99209", 3, 1);
			else if (waypoints[i+2] != null)
				var polyline = new GPolyline([ waypoints[i]["point"],waypoints[i+2]["point"]], "#E99209", 3, 1);
			else
				var polyline = new GPolyline([ waypoints[i]["point"],waypoints[i+1]["point"]], "#E99209", 3, 1);
			trailArr.push(polyline);
			map.addOverlay(polyline);
			bounds.extend(waypoints[i]["point"]);
		}
	}
	if (document.printForm != null)
		createElevation(waypoints, trailID, table, idColumn, minimap);
		
	setLoad(false);
}

/** 
 * removes all overlays for the track
 */
function clearTrail()
{
	for (var i = 0; i < trailArr.length; i++)
		map.removeOverlay(trailArr[i]);
	actTrailID = 0;
	actTrailInstID = 0;

	if (trailMarker)
	{
		
		getMap().removeOverlay(trailMarker);
	}
}

/** 
 * creates the start marker for the route
 */
function addRouteStartMarker(details, waypoints, cycleOrTrail, table, idColumn, print)
{
	var tabArr = new Array();
	var tabArr = createTrailTabs(details, trailKatID, cycleOrTrail);
	
	var letteredIcon = new GIcon(baseIcon);
	
	if (cycleOrTrail == false)
		letteredIcon.image = hostFiller + "/images/cat/map/pfeil_" + cycleKatSymbol;
	else if (cycleOrTrail == true)
		letteredIcon.image = hostFiller + "/images/cat/map/pfeil_" + trailKatSymbol;
		
	markerOptions = { icon:letteredIcon, title: details["name"] };
	
	trailMarker = new GMarker(waypoints[0]["point"], markerOptions);
	if (print == false)
	{
		GEvent.addListener(trailMarker, "click", function() {  
	      	clearElevations();
	      	trailMarker.openInfoWindowTabsHtml(tabArr);
	      	
	    });
	    
    GEvent.addListener(trailMarker, "infowindowopen", function() {
    	generateDetailTrail(details,waypoints);
      	foldTabPages();
      	foldTab4Pages();
	    foldDescriptions(details["bewertung"].length);
	    ratingClick = false;
    });
    
     GEvent.addListener(trailMarker, "infowindowclose", function() {  
     createElevation(waypoints, details["trailID"], table, idColumn, false);
    });
	}
        
	map.addOverlay(trailMarker);
	if (!print)
		map.setCenter(waypoints[0]["point"],12);
		
	
}

/** 
 * creates the tabs for the trail
 */
function createTrailTabs(details, katID, cycleOrTrail)
{
	var tabArr = new Array();
	
	var tab1 = new GInfoWindowTab("Basisinfos", createTrailTab1(details, cycleOrTrail));
	tabArr.push(tab1);
	
	var tab4 = new GInfoWindowTab("Details", generateHeightImage(details, cycleOrTrail));
	tabArr.push(tab4);
	
	var tab2 = new GInfoWindowTab("Kommentare", generateTab3Text(details, trailKatID, cycleOrTrail));
	tabArr.push(tab2);
	
	var tab3 = new GInfoWindowTab("Fotos", generateTab4Text(details, trailKatID, cycleOrTrail));
	tabArr.push(tab3);
	
	return tabArr;
}

function generateHeightImage(details, cycleOrTrail)
{
	//var table = (cycleOrTrail == 0) ? "radweg_t_radwege": "wanderweg_t_wanderwege";
	//var column = (cycleOrTrail == 0) ? "radwegID" : "wanderwegID";
	//var url = '<img src="/vulkanland/maps/images/track.php?trackID=' + details["trailID"] + '&table=' + table + '&idColumn=' + column + '" />';
	
	var beschreibung = details["beschreibung"];
	
	var tabText = "<div id='tab2'>";
	tabText += "<br /><div id='beschreibung'>" + beschreibung + "</div>";
	tabText += "</div>";
	
	return tabText;
}

/**
 * creates tab 1 
 */
function createTrailTab1(trail, cycleOrTrail)
{
	var name = trail["name"];
	
	var laenge = trail["laenge"];
	var gehzeit = trail["gehzeit"];
	
	
	var tab1Text = "<div id='tab1'>"; 
	tab1Text += "<div id='detailmap'></div>";
	//tab1Text += "<div id='tab1Left'>";
	tab1Text += "<p class='title'>" + name + "</p>";
	if (cycleOrTrail == true)
		tab1Text += "<div id='export'><a href='" + hostFiller + "/includes/exportTrailGPX.php?trailID=" + trail["trailID"] + "'><br />&raquo; Export in gpx</a></div>";
	else
		tab1Text += "<div id='export'><a href='" + hostFiller + "/includes/exportCycleGPX.php?trailID=" + trail["trailID"] + "'><br />&raquo; Export in gpx</a></div>";
		
	tab1Text += "<p id='baseAdress'>";
	if (laenge != "" && laenge != " " )
		tab1Text += "<br /><b>L&auml;nge der Strecke:</b> " + laenge;
	if (gehzeit != "" && gehzeit != " "  )
	{
		if (cycleOrTrail == true)
			tab1Text += "<br /><b>Gehzeit:</b> " + gehzeit + "</p>";
		else
			tab1Text += "<br /><b>Fahrzeit:</b> " + gehzeit + "</p>";
	}
	tab1Text += (trail["characteristic"].length > 3)?("<br /><b>Wegcharakteristik:</b> " + trail["characteristic"]):"";
	tab1Text += "<br />";
	//tab1Text += (trail["characteristic"].length > 3)?("<b>Wegcharakteristik:</b> " + trail["characteristic"] + "<br /><br />"):"<br />";
	

	//tab1Text += "</div>";
	//tab1Text += "<div id='tab1Right'>";
	
	//tab1Text += "</div>";
	tab1Text += "</div>";

	return tab1Text;
}

/**
 * generates the detail map for tab1
 */
function generateDetailTrail(trail,points)
{
	
	var dMapDiv = document.getElementById("detailmap");

	var detailMap = new GMap2(dMapDiv);
	detailMap.disableDragging();
	
	detailMap.setCenter(bounds.getCenter(),12); 
	
	var letteredIcon = new GIcon(baseIcon);
	letteredIcon.image = hostFiller + "/images/cat/map/pfeil_" + trailKatSymbol;
	markerOptions = { icon:letteredIcon, title: trail["name"] };
	
	detailMarker = new GMarker(waypoints[0]["point"], markerOptions);
	detailMap.addOverlay(detailMarker);
	
	createTrack(detailMap, waypoints, true);
	
	detailMap.setZoom(detailMap.getBoundsZoomLevel(bounds)-1);
	detailMap.setCenter(bounds.getCenter());
	
	
	var CopyrightDiv = dMapDiv.firstChild.nextSibling;
	var CopyrightImg = dMapDiv.firstChild.nextSibling.nextSibling;
	CopyrightDiv.style.display = "none"; 
	CopyrightImg.style.display = "none";
}

/**
 * builds up the detailArr array for easier use
 */
function prepareTrailArray(xml, waypoints)
{
	elementCount = 0;
	arr = new Array();
	var inst = xml.getElementsByTagName("trail");
	
	arr["trailID"] = inst[elementCount].getElementsByTagName("trailID")[0].lastChild.nodeValue;
	arr["gpx"]     =inst[elementCount].getElementsByTagName("gpx")[0].lastChild.nodeValue;
	arr["instID"] = inst[elementCount].getElementsByTagName("instID")[0].lastChild.nodeValue;
	arr["name"] = inst[elementCount].getElementsByTagName("name")[0].lastChild.nodeValue;
	arr["katID"] = trailKatID;
	arr["beschreibung"] = inst[elementCount].getElementsByTagName("beschreibung")[0].lastChild.nodeValue;
	arr["laenge"] = inst[elementCount].getElementsByTagName("laenge")[0].lastChild.nodeValue;
	arr["gehzeit"] = inst[elementCount].getElementsByTagName("gehzeit")[0].lastChild.nodeValue;
	arr["characteristic"] = inst[elementCount].getElementsByTagName("characteristic")[0].lastChild.nodeValue;
	arr["waypoints"] = waypoints;
	
	///////////// 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;
	}
	
	return arr;
}


/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////

/**
 * creates a cycle way on the map
 * cycleID
 * print true...not clickable false...clickable
 */
function setCycle(instID, print)
{
	clearTrail();
	var httpObject1 = getHTTPObject();
	httpObject1.open("GET", hostFiller + "/xml/getCycles.php?wegID=" + 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 xml = httpObject1.responseXML;
		 
		 	var coordsXML;
			var details = prepareCycleArray(xml, waypoints);
			if (window.ActiveXObject)
			{
				coordsXML = new ActiveXObject("Microsoft.XMLDOM");
				coordsXML.async = false;
				coordsXML.loadXML(details["gpx"]);
			}
			//for Mozilla, Firefox, Opera, etc.
			else if (document.implementation && document.implementation.createDocument)
			{
				var parser = new DOMParser();
				coordsXML = parser.parseFromString(details["gpx"],"text/xml");
			}
			
			var trkpt = coordsXML.getElementsByTagName("trkpt");
			actTrailID = details["trailID"];
			waypoints = new Array();
			
			var cnt = 0;
			var arrCnt = 0;
			for (var i = 0; i < trkpt.length -1 ; i++)
			{
				var lat = trkpt[i].getAttribute("lat");
				var lng = trkpt[i].getAttribute("lon");
				var ele = trkpt[i].getElementsByTagName("ele");
				
				var arr = new Array();
				arr["point"] = new GLatLng(lat, lng);
				arr["ele"] = ele;
				waypoints.push(arr);
			}
			
			if (!print)
				updateExportTrailTrack(instID, 2);
			addRouteStartMarker(details, waypoints, false, "radweg_t_radwege", "radwegID", print);
			createTrack(getMap(), waypoints, details["trailID"], "radweg_t_radwege", "radwegID", false);
		  GEvent.trigger(trailMarker, "click");	
    	}
  	}
  }	
}



/**
 * builds up the detailArr array for easier use
 */
function prepareCycleArray(xml, waypoints)
{
	elementCount = 0;
	arr = new Array();
	var inst = xml.getElementsByTagName("cycle");
	
	arr["trailID"] = inst[elementCount].getElementsByTagName("cycleID")[0].lastChild.nodeValue;
	arr["gpx"]     =inst[elementCount].getElementsByTagName("gpx")[0].lastChild.nodeValue;
	arr["instID"] = inst[elementCount].getElementsByTagName("instID")[0].lastChild.nodeValue;
	arr["name"] = inst[elementCount].getElementsByTagName("name")[0].lastChild.nodeValue;
	arr["katID"] = trailKatID;
	arr["beschreibung"] = inst[elementCount].getElementsByTagName("beschreibung")[0].lastChild.nodeValue;
	arr["laenge"] = inst[elementCount].getElementsByTagName("laenge")[0].lastChild.nodeValue;
	arr["gehzeit"] = inst[elementCount].getElementsByTagName("gehzeit")[0].lastChild.nodeValue;
	arr["characteristic"] = inst[elementCount].getElementsByTagName("characteristic")[0].lastChild.nodeValue;
	arr["waypoints"] = waypoints;
	
	
	///////////// 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;
		
		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;
	}
	return arr;
}
