
var tracks = [];
var waypoints = [];			

var minlatitude  =  90;
var maxlatitude  = -90;
var minlongitude =  90;
var maxlongitude = -90;


//  Runs through all the data (tracks, routes and waypoints) extracted from the
//  GPX file and converts each point into a form suitable for use by OpenSpace.
//
function doGPXOverlay(data)
{
	var t = data.gpx.trk;
	var r = data.gpx.rte
	var wp = data.gpx.wpt;

	if  (typeOf(t) == 'array')
	{
		for (var i = 0; i < t.length; i++) 
		{
			var track = new Object();
			track.name = t[i].name;
			track.points = [];
			track.type = "track";

			var seg = t[i].trkseg;

			if (typeOf(seg) == 'array') 
			{
				for (var j = 0; j < seg.length; j++) 
				{
					for (var k = 0; k < seg[j].trkpt.length; k++)
					{
						track.points.push(storeTrackPoint(seg[j].trkpt[k]));
						
					}
				}
			}

			if (typeOf(seg) == 'object') 
			{
				for (var j = 0; j < seg.trkpt.length; j++) 
				{
					track.points.push(storeTrackPoint(seg.trkpt[j]));
				}
			}
			
			tracks.push(track);
		}
	}

	if  (typeOf(t) == 'object')
	{
		var track = new Object();
		track.name = t.name;
		track.points = [];
		track.type = "track";

		var seg = t.trkseg;

		if (typeOf(seg) == 'array') 
		{
			for (var i = 0; i < seg.length; i++) 
			{
				for (var j = 0; j < seg[i].trkpt.length; j++)
				{
					track.points.push(storeTrackPoint(seg[i].trkpt[j]));
				}
			}
		}

		if (typeOf(seg) == 'object') 
		{
			for (var i = 0; i < seg.trkpt.length; i++) 
			{
				track.points.push(storeTrackPoint(seg.trkpt[i]));
			}
		}
		
		tracks.push(track);
	}


	if  (typeOf(r) == 'object')
	{
		var route = new Object();
		route.name = r.name;
		route.points = [];
		route.type = "route";
	
		var seg = r.rtept;
		
		if (typeOf(seg) == 'array') 
		{
			for (var i = 0; i < seg.length; i++) 
			{
				route.points.push(storeTrackPoint(seg[i]));
			}
		}
		else
		{
			route.points.push(storeTrackPoint(seg));
		}
		
		tracks.push(route);
	}


	if  (typeOf(r) == 'array')
	{
		for (var i = 0; i < r.length; i++) 
		{
			var route = new Object();
			route.name = r[i].name;
			route.points = [];
			route.type = "route";
				
			var seg = r[i].rtept;
	
			if (typeOf(seg) == 'array') 
			{
				for (var j = 0; j < seg.length; j++) 
				{
					route.points.push(storeTrackPoint(seg[j]));
				}
			}
			else
			{
				route.points.push(storeTrackPoint(seg));
			}

			tracks.push(route);
		}
	}

	if  (typeOf(wp) == 'array')
	{
		for (var i = 0; i < wp.length; i++) 
		{
			storeWaypoint(wp[i]);
		}
	}

	if  (typeOf(wp) == 'object')
	{
		storeWaypoint(wp);
	}
}



function storeWaypoint(lonlat)
{
	if (!lonlat) 
	{
		return;
	}

	var waypoint = new Object();
	
	waypoint.latitude  = parseFloat(lonlat['-lat']);
	waypoint.longitude = parseFloat(lonlat['-lon']);
	waypoint.name = lonlat['name'];
	waypoint.cmt  = lonlat['cmt'];
	waypoint.desc = lonlat['desc'];
	waypoint.sym = lonlat['sym'];
	waypoint.src = lonlat['src'];
	
	checkBounds(waypoint.latitude, waypoint.longitude);
	
	waypoints.push(waypoint);

}




function storeTrackPoint(lonlat)
{
	var trackpoint = new Object();
	
	trackpoint.latitude  = parseFloat(lonlat['-lat']);
	trackpoint.longitude = parseFloat(lonlat['-lon']);

	checkBounds(trackpoint.latitude, trackpoint.longitude);

	return trackpoint;	
}


// Determines if a point lies outside the existing known bounds
// of the map, and if so extends those bounds to accommodate it. 
//
function checkBounds(lat, lon)
{
	if	(lat < minlatitude) 
	{
		minlatitude = lat;
	}

	if	(lat > maxlatitude) 
	{
		maxlatitude = lat;
	}

	if	(lon < minlongitude) 
	{
		minlongitude = lon;
	}

	if	(lon > maxlongitude) 
	{
		maxlongitude = lon;
	}
}


function typeOf(value) 
{    
	var s = typeof value;    
	
	if (s === 'object') 
	{        
		if (value) 
		{            
			if (value instanceof Array) 
			{                
				s = 'array';            
			}        
		} 
		else 
		{            
			s = 'null';        
		}    
	}    
	return s;
}


function getAvailableArea()
{
	var sizes = new Array();

    if 	(document.documentElement && document.documentElement.clientWidth)
    {
        sizes[0] = document.documentElement.clientWidth;
        sizes[1] = document.documentElement.clientHeight;
    }
    else if (document.body)
    {
        sizes[0] = document.body.clientWidth;
        sizes[1] = document.body.clientHeight;
    }
    else
    {
        sizes[0] = window.innerWidth;
        sizes[1] = window.innerHeight;
    }
    
    return sizes;
}
