// Run debug functions?
var debugscript = false;

// The XMLRequest Object
var http = getHTTPObject();

// The last weather data
var xmlDoc;

// Timers for refreshing the radar or weather
var timerticker;

// Records refresh rates (in seconds)
var weatherrefresh = 30;
var radarrefresh   = 1800;
var graphrefresh   = 1800;

// Records time till refreshes of data
var weatherticker;
var radarticker;
var graphticker = graphrefresh;

// URL for the XML data
var url = "remote_xml_data.php";
var directionurl = "images/compass/compass-";

// To prevent starting a new request while currently requesting
var loadingWeather = false;

// Often used items in HTML (Cached here for faster access)
var refreshbutton;
var weathercount;

// Ticks every second to refresh data
function ticker()
{
  // Lower the tickers
  weatherticker--;
  radarticker--;
  graphticker--;
  
  // Update the GUI
  updatetickers();

  // Call the refresh routines
  if (weatherticker == 0) loadweather();
  if (radarticker == 0) loadradar();
  if (graphticker == 0) loadgraphs();

  // Error routine
  if (weatherticker <= -30)
  {
    weatherticker = 0;
    http.abort();
    loadweather();
  }
}

// To update the GUI for the tickers
function updatetickers()
{
  // Set the element to the time left till refresh
  if (weatherticker > 0)
  { 
    refreshbutton.style.visibility = "visible";
    weathercount.innerHTML = "Next update in " + weatherticker + " seconds";
  }
  else
  {
    weathercount.innerHTML = "Updating now...";
    refreshbutton.style.visibility = "hidden";
  }
}

// Change the radar picture to a new one
function loadradar()
{
        // Stop the ticker going off
        radarticker = -1;

	// Get a string of date to append to the image
	d = new Date();
	datestring = d.formatDate("YmdHms")
	
	// Set the image
	document.getElementById("radarimage").src="http://mirror.bom.gov.au/radar/IDR024.gif?" + datestring;
        
        // Reset the ticker
        radarticker = radarrefresh;
}

function initialise()
{
    // Grab commonly used elements for future easy access
    weathercount = document.getElementById("weatherticker");
    refreshbutton = document.getElementById("refreshbutton");
        
    // Start the timer
    timerticker = window.setInterval('ticker()', 1000);

	// Set an initial radar image
	loadradar();
	
	//Set an initial weather image
	loadweather();
}

function loadweather() {
	// If we arent still processing a previous request
	if (!loadingWeather)
	{
                // Stop the ticker going off
                weahterticker = -1;
                updatetickers();

		// Setup the request
		http.open("GET", url, true);
		
		// Specify return function
		http.onreadystatechange = handleHttpResponse;
		
		// Send request
		http.send(null);
		
		// Tell the script the object is busy
		loadingWeather = true;
		
	}
 }
 
 
function handleHttpResponse()
{
  // If the HTTP object is ready
  if (http.readyState == 4)
  {
    var sensorsList = http.responseXML.documentElement.getElementsByTagName("sensors")[0];

    process_inside(  sensorsList.getElementsByTagName("inside")[0]  );
    process_outside( sensorsList.getElementsByTagName("outside")[0] );
    process_rain(    sensorsList.getElementsByTagName("rain")[0]    );
    process_wind(    sensorsList.getElementsByTagName("wind")[0]    );

    //Object is no longer busy
    loadingWeather = false;
    
    // Reset the ticker
    weatherticker = weatherrefresh;
  }
}

// Should generalise these functions to return objects

function process_inside( DOMinside )
{
  // Extract the variables from XML
  var time        = DOMinside.getElementsByTagName("time")[0].firstChild.data;
  var battery     = DOMinside.getElementsByTagName("batterylow")[0].firstChild.data;
  var temperature = DOMinside.getElementsByTagName("temperature")[0].firstChild.data;
  var humidity    = DOMinside.getElementsByTagName("humidity")[0].firstChild.data;
  var barometer   = DOMinside.getElementsByTagName("barometer")[0].firstChild.data;
  var prediction  = DOMinside.getElementsByTagName("prediction")[0].firstChild.data;
  var predictimage  = DOMinside.getElementsByTagName("predictimage")[0].firstChild.data;

  // Apply them to the right elements
  document.getElementById("in_time").innerHTML    = time;
  document.getElementById("in_temp").innerHTML    = temperature;
  document.getElementById("in_humid").innerHTML   = humidity;
  document.getElementById("in_baro").innerHTML    = barometer;
  document.getElementById("in_predict").innerHTML = prediction;
  document.getElementById("in_predictimage").src  = predictimage;
}

function process_outside( DOMoutside )
{
  // Extract the variables from XML
  var time        = DOMoutside.getElementsByTagName("time")[0].firstChild.data; 
  var battery     = DOMoutside.getElementsByTagName("batterylow")[0].firstChild.data;
  var temperature = DOMoutside.getElementsByTagName("temperature")[0].firstChild.data;
  var humidity    = DOMoutside.getElementsByTagName("humidity")[0].firstChild.data;

  //Apply them to the right elements 
  document.getElementById("out_temp").innerHTML  = temperature;
  document.getElementById("out_humid").innerHTML = humidity;
}

function process_rain( DOMrain )
{
  // Extract the variables from XML
  var time        = DOMrain.getElementsByTagName("time")[0].firstChild.data; 
  var battery     = DOMrain.getElementsByTagName("batterylow")[0].firstChild.data;
  var currentrate = DOMrain.getElementsByTagName("currentrate")[0].firstChild.data; 
  var yesterday   = DOMrain.getElementsByTagName("yesterday")[0].firstChild.data;
  var total       = DOMrain.getElementsByTagName("total")[0].firstChild.data;
  var totalreset  = DOMrain.getElementsByTagName("totalreset")[0].firstChild.data;
  
  //Apply them to the right elements 
  document.getElementById("rain_rate").innerHTML        = currentrate;
  document.getElementById("rain_yesterday").innerHTML   = yesterday;
  document.getElementById("rain_total").innerHTML       = total;
  document.getElementById("rain_total_since").innerHTML = totalreset;
}

function process_wind( DOMwind )
{
  // Extract the variables from XML
  var time        = DOMwind.getElementsByTagName("time")[0].firstChild.data; 
  var battery     = DOMwind.getElementsByTagName("batterylow")[0].firstChild.data;
  var gust        = DOMwind.getElementsByTagName("gust")[0].firstChild.data; 
  var average     = DOMwind.getElementsByTagName("average")[0].firstChild.data;
  var direction   = DOMwind.getElementsByTagName("direction")[0].firstChild.data;
  
  //Apply them to the right elements 
  document.getElementById("wind_gust").innerHTML      = gust;
  document.getElementById("wind_average").innerHTML   = average;
  document.getElementById("wind_direction").src       = directionurl + direction + ".png";
}

function getBattImage(battlevel)
{
	if (battlevel == "Normal")
	{
		return "images/battery-full.png";
	}
	else
	{
		return "images/battery-low.png";
	}
}

function ChangeToData(sensor)
{
	document.getElementById("data-" + sensor).style.display = "inline";
	document.getElementById("graph-" + sensor).style.display = "none";
}

function ChangeToGraph(sensor)
{
	document.getElementById("data-" + sensor).style.display = "none";
	document.getElementById("graph-" + sensor).style.display = "inline";
}

function changeMode(mode)
{
	if (mode == "overview")
	{
		// Show overviews
		document.getElementById("inside").style.display = "block";
		document.getElementById("outside").style.display = "block";
		document.getElementById("rain").style.display = "block";
		document.getElementById("wind").style.display = "block";
		
		// Hide detail screens
		document.getElementById("inside-detail").style.display = "none";
		document.getElementById("outside-detail").style.display = "none";
		document.getElementById("rain-detail").style.display = "none";
		document.getElementById("wind-detail").style.display = "none";
	}
	else
	{
		// Hide overviews
		document.getElementById("inside").style.display = "none";
		document.getElementById("outside").style.display = "none";
		document.getElementById("rain").style.display = "none";
		document.getElementById("wind").style.display = "none";
		
		// Show the details screen
		document.getElementById(mode + "-detail").style.display = "block";
	}
}

function loadgraphs()
{
    // Stop the ticker going off
    graphticker = -1;

	// Get a string of date to append to the image
	d = new Date();
	datestring = d.formatDate("YmdHms")
	
	// Set the image
	document.getElementById("outside-temp").src="images/graphs/inside-graph.php?sensor=out&date=" + datestring;
	document.getElementById("inside-temp").src ="images/graphs/inside-graph.php?sensor=in&date=" + datestring;
	document.getElementById("inside-baro").src ="images/graphs/baro-graph.php?date=" + datestring;
	document.getElementById("wind-gust").src   ="images/graphs/wind-graph.php?type=gust&date=" + datestring;
	document.getElementById("wind-average").src="images/graphs/wind-graph.php?type=average&date=" + datestring;
	document.getElementById("rain-graph").src  ="images/graphs/rain-graph.php?date=" + datestring;
        
    // Reset the ticker
    graphticker = graphrefresh;
}

