// JavaScript Document

function Track(xml)
{
	this.trackpoints;	
	this.trackpoints = new Array();
	this.trackpointsGlatt;
	this.trackpointsGlatt = new Array();
	this.readXml(xml)
	this.dis;
	
	this.alpha = "ff";
	this.colors = new Array();
	this.colors["UG1"] = this.alpha+"c2c2c2";
	this.colors["UG2"] = this.alpha+"676564";
	this.colors["UG3"] = this.alpha+"14896a";
	this.colors["UG4"] = this.alpha+"0ac29f";
	this.colors["UG5"] = this.alpha+"2fe1ce";
	this.colors["UG6"] = this.alpha+"a0e6df"; 
	this.colors["UG7"] = this.alpha+"f8e9c8";
}

Track.prototype.getUG = function (ug)
{
	return this.colors[ug];	
}

Track.prototype.getTrackpoints = function()
{
	return this.trackpoints;
}

Track.prototype.addTrackpoint = function(tp)
{
	this.trackpoints.push(tp);	
}

Track.prototype.getTrackpointAt = function(i)
{
	return this.trackpoints[i];	
}
	

Track.prototype.readXml = function(xml)
{
	var i=0;
	var dis = 0;
	var pretp;
	var head = 0;
	var anst = 0;
	
	var a = new Array();
	
//	if(baum) alert($(xml).find("trkpt"));
	
	$(xml).find("trkpt").each(function()
	{

		var lat = $(this).find("lat").text();
		var lon = $(this).find("lon").text();
		var ele = $(this).find("ele").text();
		var ug  = $(this).find("ug").text();
		
		lat = lat*10/10;
		lon = lon*10/10;
		ele = ele*10/10;
		
		if(i==0)
			dis = 0;
		else
		{
			dis = dis + getDistance(pretp.lat, pretp.lon, lat, lon);
		}
		
		var tp = new Trackpoint(lat, lon, ele, ug, dis);
				
		pretp = tp;
		a.push(tp);
		i++;			
	});	
	
	for(i=0;i<a.length;i++)
	{
		if(i<a.length-1)
		{
			var tp = a[i];
			var tppos = a[i+1];
			
			head = getAngle(tppos.lat, tppos.lon, tp.lat, tp.lon);	
			anst = getAnstieg(tppos.lat, tppos.lon, tppos.ele, tp.lat, tp.lon, tp.ele);
		}
		a[i].anst = anst;
		a[i].head = head;
	}
	
	this.trackpoints = a;
	this.dis = dis;
	
	
	
	this.trackpointsGlatt = this.trackGlatten(a);
	this.trackpointsGlatt = this.trackGlatten(this.trackpointsGlatt);
	
	i=0;
	var b = new Array();
	while(i*6<this.trackpointsGlatt.length)
	{
		var tp =this.trackpointsGlatt[i*6];
		b[i] = tp.clone();
		i++;
	}
	b[i] = this.trackpointsGlatt[this.trackpointsGlatt.length-1];
	
	this.trackpointsGlatt = b;
		
	this.trackpointsGlatt = this.trackGlatten(this.trackpointsGlatt);
	
}

Track.prototype.drawTrack = function(ge, glatt)
{
	var lineStringPlacemark = ge.createPlacemark('');
	var lineString = ge.createLineString('');
	var aktUG = "";
	
	lineStringPlacemark.setGeometry(lineString);	
	
	var trackpoints = Array();
	
	if(glatt == null)
		trackpoints = this.trackpoints;
	else
		trackpoints = this.trackpointsGlatt;
	
	
	for(var i=0;i<trackpoints.length;i++)
	{
		var tp = trackpoints[i];
		
		if(aktUG != "" && aktUG != tp.ug)
		{
			lineString.getCoordinates().pushLatLngAlt(tp.lat, tp.lon, 0);
	
			if(glatt == null)
				this.drawLine(lineStringPlacemark, aktUG, ge);
			else
				this.drawLine(lineStringPlacemark, null, ge);
				
			lineStringPlacemark = ge.createPlacemark('');
			lineString = ge.createLineString('');
			lineStringPlacemark.setGeometry(lineString);
		}
		
		aktUG = tp.ug;
		
		if(aktUG == "" || aktUG == tp.ug)
		{

			lineString.getCoordinates().pushLatLngAlt(tp.lat, tp.lon, 0);
		}

	}
	
	this.drawLine(lineStringPlacemark, aktUG, ge);
		
	//google.earth.addEventListener(ge.getView(), 'viewchangeend', function() {next()});	
}

Track.prototype.drawLine = function(lineStringPlacemark, aktUG, ge)
{
	lineStringPlacemark.setStyleSelector(ge.createStyle(''));
	var lineStyle = lineStringPlacemark.getStyleSelector().getLineStyle();
	lineStyle.setWidth(6);
	if(aktUG != null)
		lineStyle.getColor().set(this.getUG(aktUG));
	ge.getFeatures().appendChild(lineStringPlacemark);	
}

Track.prototype.profilGlatten = function(profile)
{
	var g = 7;
	var sum;
	var p;
	var n, i;

	for(var b=0;b<4;b++)
	for(n = 1; n<= profile.length-2; n++)
	{
		if(n<=3)
			g = 2*n+1;
		else if(n>profile.length-4)
			g = (profile.length-n-1)*2+1;
		else
			g=7;
		
		sum = 0;		
		for(i = n-(g-1)/2; i<= n+(g-1)/2;i++)
		{	
			sum = sum + profile[i].ele;
		}				
		p = profile[n];
		p.ele = sum / g;
		profile[n] = p;			
	}	
		
	return profile;		
}

Track.prototype.ArrayGlatten = function(profile)
{
	var g = 7;
	var sum;
	var p;
	var n, i;

	for(var b=0;b<4;b++)
	for(n = 1; n<= profile.length-2; n++)
	{
		if(n<=3)
			g = 2*n+1;
		else if(n>profile.length-4)
			g = (profile.length-n-1)*2+1;
		else
			g=7;
		
		sum = 0;		
		for(i = n-(g-1)/2; i<= n+(g-1)/2;i++)
		{	
			sum = sum + profile[i];
		}				
		p = profile[n];
		p = sum / g;
		profile[n] = p;			
	}	
		
	return profile;		
}

Track.prototype.trackGlatten = function(a)
{
	var g = 7;
	var sumLat;
	var sumLon;
	var p;
	var n, i;
	
	var profile = new Array();
	
	for(i=0;i<a.length;i++)
	{
		profile[i] = a[i].clone();	
	}

	for(var b=0;b<4;b++)
	for(n = 1; n<= profile.length-2; n++)
	{
		if(n<=3)
			g = 2*n+1;
		else if(n>profile.length-4)
			g = (profile.length-n-1)*2+1;
		else
			g=7;
		
		sumLat = 0;
		sumLon = 0;
		
		for(i = n-(g-1)/2; i<= n+(g-1)/2;i++)
		{	
			sumLat = sumLat + profile[i].lat;
			sumLon = sumLon + profile[i].lon;
		}				
		p = profile[n].clone();
		p.lat = sumLat/g;
		p.lon = sumLon/g;
		profile[n] = p;			
	}	
	
	return profile;		
}

Track.prototype.getTpAtAnteil = function(ant)
{
	var at = this.dis * ant;
	var i=0;
	
	while(this.trackpoints[i].dis < at)
	{
		i++;
	}
	
	tppre = this.trackpoints[i-1];
	tppos = this.trackpoints[i];
	
	var dif = tppos.dis-tppre.dis;
	var tem = at-tppre.dis;
	dif = tem/dif;
	
	var lat = tppre.lat + (tppos.lat-tppre.lat)*dif;
	var lon = tppre.lon + (tppos.lon-tppre.lon)*dif;
	var ele = tppre.ele + (tppos.ele-tppre.ele)*dif;
	
	var tp = new Trackpoint(lat, lon, ele,0,at);
	tp.head = tppre.head;
	
	return tp;
		
}
	

function Trackpoint(lat, lon, ele, ug, dis)
{
	this.lat = lat;
	this.lon = lon;
	this.ele = ele;
	this.ug = ug;
	this.dis = dis;
	this.head;
	this.anst;
	
}

Trackpoint.prototype.clone = function()
{
	return new Trackpoint(this.lat, this.lon, this.ele, this.ug, this.dis);	
}
