// Copyright 2006 comparetracks.com 
// Written by Terje Henriksen 
// Copy, modification or reuse of code is herby granted 

Communicator = function() {
  this.routeState = 0;
  this.searchState = 0;
  this.getSplitState = 0;
  
  this.readRoute = readRoute;
  this.search = search;
  this.getSplits = getSplits;
  this.serverOffset = -999999;
  this.secondsSinceMidnight = secondsSinceMidnight;
  this.printTimeDiff = printTimeDiff;
  this.getTimeString = getTimeString;
  this.getClientTimeString = getClientTimeString;

  function readRoute(xmlFile,theroute) {
	
	if(communicator.routeState == 1)
	  return;
	  communicator.routeState = 1;
	  
    GDownloadUrl(xmlFile, function(data) {
      var xml = GXml.parse(data);
      var rte = xml.documentElement.getElementsByTagName("rte");
	    for (var j=0;j<rte[0].childNodes.length;j++) {
	      if (rte[0].childNodes[j].nodeType != 1) 
	        continue;
		    if(rte[0].childNodes[j].nodeName == "name") {
		      theroute.name = rte[0].childNodes[j].firstChild.nodeValue;
		    }
	    }
      var rteName = rte[0].getElementsByTagName("name");
      var rtept = xml.documentElement.getElementsByTagName("rtept");
      for (var i = 0; i < rtept.length; i++) {

        var lat = parseFloat(rtept[i].getAttribute("lat"));
        var lon = parseFloat(rtept[i].getAttribute("lon"));  
		    var point = new TrackPoint(lat,lon);
		
	      for (var j=0;j<rtept[i].childNodes.length;j++) {
	        if (rtept[i].childNodes[j].nodeType != 1) 
	          continue;
		      if(rtept[i].childNodes[j].nodeName == "name") {
		        var pntName =  rtept[i].childNodes[j].firstChild.nodeValue;
		        if(pntName != "" && pntName.substring(0,2) != "CT") {
		          point.name = pntName;
		        }
		      }
		      if(rtept[i].childNodes[j].nodeName == "time") {
		        point.seconds = point.setXmlTime(rtept[i].childNodes[j].firstChild.nodeValue);
		      }
		      if(rtept[i].childNodes[j].nodeName == "meter") {
		        point.meter = parseInt(rtept[i].childNodes[j].firstChild.nodeValue);
		      }
		      if(rtept[i].childNodes[j].nodeName == "seconds") {
		        point.seconds = parseInt(rtept[i].childNodes[j].firstChild.nodeValue);
		      }
	      }
	      if(point.name != "" && point.seconds != 0) { 
	        theroute.splitPoints.push(point);
	      }
	      theroute.gPoints.push(new GLatLng(lat,lon));
	      theroute.trackPoints.push(point);
      }
	  //theroute.pointNo = rtept.length;
	  //message.innerHTML = "Route name = " + theroute.name;
	    theroute.computeBoundaries();
      communicator.routeState = 2;
    });
  }

  
  function search(xmlFile,resultList) {
	
	if(communicator.searchState == 1)
      return;
    communicator.searchState = 1;

    var ranNum= Math.floor(Math.random()*100000);
    xmlFile += "&random=" + ranNum;

    GDownloadUrl(xmlFile, function(data) {
      var xml = GXml.parse(data);

	    var servE = xml.documentElement.getElementsByTagName("serverTime");
	    if(servE.length > 0) {
         //var servTim = servE[0].getAttribute("time");
		    var servTime = servE[0].firstChild.nodeValue;
        var serverTime = parseInt(servTime);
       
        var curDateTime = new Date()
        var secSinceMidnight = curDateTime.getHours()*3600 + curDateTime.getMinutes() *60 + curDateTime.getSeconds();
        communicator.serverOffset =  serverTime- secSinceMidnight;
      }

      var runnerlist = xml.documentElement.getElementsByTagName("runner");
      for (var i = 0; i < runnerlist.length; i++) {
	      var name = runnerlist[i].getAttribute("name");
	      var folder = runnerlist[i].getAttribute("folder");
	      var startno = runnerlist[i].getAttribute("startno");
	      var firstSplit = runnerlist[i].getAttribute("firstSplit");
	      //var start = runnerlist[i].getAttribute("start");        
        var start = parseInt(runnerlist[i].getAttribute("start"));
        var runner = new Runner(name,folder,startno,start,firstSplit);

  	    resultList.push(runner);
	    }
	
  	   //debugWindow.innerHTML += "getSearchResult finished " + serverTime + " - " + secSinceMidnight + "<br>";
 	    communicator.searchState = 2;
    });
  }
  
  //------------------------------------------------------------------------------
  /*
  <splitTimes>
    <errorMessage type="1">Not yet started</errorMessage>
    <runner startNo="13968">0,0,0,0</runner>
  </splitTimes>
  */
  
  function getSplits(xmlFile, runner) {
	  
    if(communicator.getSplitState == 1)
	    return;
	  communicator.getSplitState = 1;

    GDownloadUrl(xmlFile, function(data) {
      var xml = GXml.parse(data);
      var splitTimes = xml.documentElement.getElementsByTagName("splitTimes");
      var errorE = xml.documentElement.getElementsByTagName("errorMessage");
      var runnerE = xml.documentElement.getElementsByTagName("runner");
	  
      if(errorE.length > 0) {
	    var txt = errorE[0].firstChild.nodeValue;
        var ty = errorE[0].getAttribute("type");
	    runner.serverMessage = txt;
      }
      if(runnerE.length > 0) {
	    runner.splits = runnerE[0].firstChild.nodeValue.split(","); 
	  }
	  communicator.getSplitState = 2;
    });
  }


  function secondsSinceMidnight() {
    var curDateTime = new Date()
    var secSinceMidnight = curDateTime.getHours()*3600 + curDateTime.getMinutes() *60 + curDateTime.getSeconds();
    if(this.serverOffset == -999999)
      return secSinceMidnight;
    return parseInt(this.serverOffset + secSinceMidnight);
  }

  function printTimeDiff(serverSsm) {
    var ssm = this.secondsSinceMidnight() - serverSsm; 
    var ee = " ago";
    if(ssm < 0) {
      ee = " from now";
      ssm = Math.abs(ssm);
    }
    var min  = Math.floor(ssm/60);ssm = ssm-min*60;
    var sec  = Math.floor(ssm);

    if(min < 1) 
      //return ssm + " seconds"  + ee;
      return "less than one minute" + ee;
    return min + " minutes" + ee;
  }

  function getClientTimeString(serverSsm,useSec) {
    var ssm = serverSsm - communicator.serverOffset;
    return getTimeString(ssm,useSec);
  }

  function getTimeString(ssm,useSec) {  
    var hour = Math.floor(ssm/3600);ssm = ssm-hour*3600;
    var min  = Math.floor(ssm/60);ssm = ssm-min*60;
    var sec  = Math.floor(ssm);
    if(hour > 24)
      hour -= 24;

    var ret = "";
    if(hour > 9) ret += hour + ":";
    else         ret += "0" + hour + ":";
    if(min > 9)  ret += min
    else         ret += "0" + min;

    if(useSec == true) {
      if(sec > 9)  ret += ":" + sec
      else         ret += ":0" + sec;
    }
    return ret;
  }

}