// _mPreferMetric=true;


var issMarker;
var poly;

// var bounds = new GLatLngBounds();


// function fit(){
//	map.panTo(bounds.getCenter()); 
//	map.setZoom(map.getBoundsZoomLevel(bounds));
//}


// Esa's Auto ZoomOut


//function esasZoomOut(){
//var paragraphs = map.getContainer().getElementsByTagName('p').length;
//GLog.write(paragraphs);
//if(paragraphs > 6){
//map.zoomOut();
//}}
//var interval = setInterval("esasZoomOut()",500);

//calling circle drawing function
function draw(pnt,radius){

	bounds = new GLatLngBounds();
	var givenRad = radius || 680
	var givenQuality = 40
	var centre = pnt || map.getCenter()
	drawCircle(centre, givenRad, givenQuality);
	//fit();
}

	////////////////////////// circle///////////////////////////////
	
function drawCircle(center, radius, nodes, liColor, liWidth, liOpa, fillColor, fillOpa)
{
// Esa 2006
	//calculating km/degree
	var latConv = center.distanceFrom(new GLatLng(center.lat()+0.1, center.lng()))/100;
	var lngConv = center.distanceFrom(new GLatLng(center.lat(), center.lng()+0.1))/100;

	//Loop 
	var points = [];
	var step = parseInt(360/nodes)||10;
	for(var i=0; i<=360; i+=step)
	{
	var pint = new GLatLng(center.lat() + (radius/latConv * Math.cos(i * Math.PI/180)), center.lng() + 
	(radius/lngConv * Math.sin(i * Math.PI/180)));
	points.push(pint);
	bounds.extend(pint); //this is for fit function
	}
	fillColor = fillColor||liColor||"#0055ff";
	liWidth = liWidth||2;
	fillOpa = fillOpa||0.1;
	liOpa = liOpa||0.3;
	poly = new GPolygon(points,liColor,liWidth,liOpa,fillColor,fillOpa);
	map.addOverlay(poly);
}
/////////////////////////////////////////////////////////////////////


function xmlLoader(url){
    if(window.XMLHttpRequest){
        var Loader = new XMLHttpRequest();
        Loader.open("GET", url ,false); 
        Loader.send(null);
        return Loader.responseXML;
    }else if(window.ActiveXObject){
        var Loader = new ActiveXObject("Msxml2.DOMDocument.3.0");
        Loader.async = false;
        Loader.load(url);
        return Loader;
    }
}

// gets the pass xml and returns as array
function parsePassData(xmldata){
	var root = xmldata.getElementsByTagName('tracking')[0];
	var rows = root.getElementsByTagName("row");
	var retArray = new Array()
	for (var i = 0 ; i < rows.length ; i++) {
		var row = rows[i];
		var latitude,longitude,footprint,unixtime,azimuth,elevation,MA,slant,orbit,visible;
		latitude = row.getElementsByTagName("latitude")[0].firstChild.nodeValue;
		longitude = parseFloat(row.getElementsByTagName("longitude")[0].firstChild.nodeValue);
		footprint = row.getElementsByTagName("footprint")[0].firstChild.nodeValue;
		unixtime = row.getElementsByTagName("unixtime")[0].firstChild.nodeValue;
		date = row.getElementsByTagName("date")[0].firstChild.nodeValue;
		time = row.getElementsByTagName("time")[0].firstChild.nodeValue;
		azimuth = row.getElementsByTagName("azimuth")[0].firstChild.nodeValue;
		elevation = row.getElementsByTagName("elevation")[0].firstChild.nodeValue;
		MA = row.getElementsByTagName("MA")[0].firstChild.nodeValue;
		slant = row.getElementsByTagName("slant")[0].firstChild.nodeValue;
		orbit = row.getElementsByTagName("orbit")[0].firstChild.nodeValue;
		visible = row.getElementsByTagName("visible")[0].firstChild.nodeValue;
		retArray[i] = new Array(latitude,longitude,footprint,unixtime,date,time,azimuth,elevation,MA,slant,orbit,visible);
	}

	return retArray;
}

// gets the live xml and returns an array (duplicated --- FIXME)
function parseLiveData(xmldata){
	var root = xmldata.getElementsByTagName('tracking')[0];
	var rows = root.getElementsByTagName("row");
	var retArray = new Array()
	for (var i = 0 ; i < rows.length ; i++) {
		var row = rows[i];
		var latitude,longitude,footprint;
		latitude = row.getElementsByTagName("latitude")[0].firstChild.nodeValue;
		longitude = row.getElementsByTagName("longitude")[0].firstChild.nodeValue;
		footprint = row.getElementsByTagName("footprint")[0].firstChild.nodeValue;
		retArray[i] = new Array(latitude,longitude,footprint);
	}
	return retArray;
}

function removeLive() {

	if (issMarker) {
		map.removeOverlay(issMarker);
		issMarker = null;
	}
	if (poly) {
		map.removeOverlay(poly);
		poly = null;
	}

}


// draws ISS on map
function drawISS(map,lat,lon,footprint){

		// alert('Points '+lat+' '+lon+' '+footprint);           
		var start = new GLatLng( parseFloat(lat), parseFloat(lon) );
		var blueIcon = new GIcon(G_DEFAULT_ICON);
		blueIcon.iconSize = new GSize(80, 28);
		blueIcon.iconAnchor = new GPoint(40,14); 
		blueIcon.image = "http://www.issfanclub.com/js/iss-icon.png";
		blueIcon.shadowSize = new GSize(0, 0);
		var markerOptions = { icon:blueIcon };
	 	//var markerOptions = { title:'ISS' };	
		
		issMarker = new GMarker(start, markerOptions);

		draw(start, footprint / 2);

			
		// Set up our GMarkerOptions object
		map.addOverlay(issMarker);
}

// Interpolates an estimanted position each 5 seconds
function calculateWaypoints(positionData) {

	var points = new Array()
	var x = 0;
	for (var i = 0 ; i < positionData.length - 1; i++) {
		points[x] = positionData[i];

		var deltaLat = (positionData[i + 1][0] - positionData[i][0]) / 12;
		var deltaLon = (positionData[i + 1][1] - positionData[i][1]) / 12;

		for (var z = 0 ; z < 11 ; z++ ) {
			x++;
			points[x] = new Array ( parseFloat(points[x - 1][0]) + parseFloat(deltaLat), 
						parseFloat(points[x - 1][1]) + parseFloat(deltaLon),
						points[x - 1][2] = positionData[i][2]);
		}
		x++;
	}

	return (points);

}

// retuns the ISS position for the next 10 minutes
function getLivePoints() {

	var xmldata = xmlLoader('http://www.issfanclub.com/iss-data.php');
	var positionData = parseLiveData(xmldata);
	var points = calculateWaypoints(positionData);
	
	return (points);

}


function getPassPoints(lat,lon,unixtime,visibleonly) {
	
	//alert('http://www.issfanclub.com/get-pass.php?lat='+lat+'&lon='+lon+'&visibleonly='+visibleonly+'&start='+unixtime);	
	var xmldata = xmlLoader('http://www.issfanclub.com/get-pass.php?lat='+lat+'&lon='+lon+'&visibleonly='+visibleonly+'&start='+unixtime);
	var positionData = parsePassData(xmldata);
	
	return (positionData);
}
