// vim:ts=2:sw=2:et:ai:
// ------------------------------------------------------------
// Globals
// ------------------------------------------------------------
var map;
// Base layers
var mystreets;
var ymap, ymap_sat, ymap_hybrid;
var gmap, gmap_sat, gmap_hybrid, gmap_phys;
// Overlay layers
var gb_map, ac_map;


// ------------------------------------------------------------
// ------------------------------------------------------------
// init
// ------------------------------------------------------------
// ------------------------------------------------------------
function init(){
  var now=new Date();
  var ts=now.getTime();

  var extent = new OpenLayers.Bounds(-15000000, 2000000, -5000000, 8700000);

  var options = {
      projection: new OpenLayers.Projection("EPGS:900913"),
      displayProjection: new OpenLayers.Projection("EPSG:4326"),
      units: "m",
      maxResolution: 14286,
      maxExtent: extent,
      restrictedExtent: extent
  };

  map = new OpenLayers.Map( 'map', options );

  // Base Layers
  gmap = new OpenLayers.Layer.Google(
    "Google Street", 
    { 'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( gmap );
  
  gmap_sat = new OpenLayers.Layer.Google(
    "Google Satellite",
    { 'type': G_SATELLITE_MAP,
      'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( gmap_sat );
  
  gmap_hybrid = new OpenLayers.Layer.Google(
    "Google Hybrid",
    { 'type': G_HYBRID_MAP,
      'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( gmap_hybrid );
  
  gmap_phys = new OpenLayers.Layer.Google(
    "Google Terrain",
    { 'type': G_PHYSICAL_MAP,
      'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( gmap_phys );
  
  ymap = new OpenLayers.Layer.Yahoo(
    "Yahoo Street",
    { 'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( ymap );
  
  ymap_sat = new OpenLayers.Layer.Yahoo(
    "Yahoo Satellite",
    { 'type': YAHOO_MAP_SAT,
      'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( ymap_sat );
  
  ymap_hybrid = new OpenLayers.Layer.Yahoo(
    "Yahoo Hybrid",
    { 'type': YAHOO_MAP_HYB,
      'sphericalMercator': true,
      'minZoomLevel' : 4,
      'isBaseLayer': true
    }
  );
  map.addLayer( ymap_hybrid );
  
  // ------------------------------------------------------------
  // Overlays
  // ------------------------------------------------------------

  ac_map = new OpenLayers.Layer.GML( 
    "13<sup>th</sup> America's Challenge", 
    "ac.php?ts="+ts,
    { 'format': OpenLayers.Format.GeoJSON,
      'styleMap': build_ac_styles(),
      'minZoomLevel' : 4,
      'projection': new OpenLayers.Projection("EPSG:4326"), 

      'units':"dd",
      'isBaseLayer': false
    }
  );
  ac_map.setVisibility(false);
  map.addLayer( ac_map );

  gb_map = new OpenLayers.Layer.GML( 
    "52<sup>nd</sup> Gordon Bennett", 
    "gb.php?ts="+ts,
    { 'format': OpenLayers.Format.GeoJSON,
      'styleMap': build_gb_styles(),
      'minZoomLevel' : 4,
      'projection': new OpenLayers.Projection("EPSG:4326"), 

      'units':"dd",
      'isBaseLayer': false
    }
  );
  gb_map.setVisibility(true);
  map.addLayer( gb_map );


  // ------------------------------------------------------------
  // Map Instance
  // ------------------------------------------------------------

  map.addControl(new OpenLayers.Control.LayerSwitcher());
  map.addControl(new OpenLayers.Control.PanZoomBar());
  map.addControl(new OpenLayers.Control.NavToolbar());
  map.addControl(new OpenLayers.Control.Scale($('scalediv')));
  map.addControl(new OpenLayers.Control.ScaleLine({'div':OpenLayers.Util.getElement('scalelinediv')}));
  map.addControl(new OpenLayers.Control.MousePosition({'div':OpenLayers.Util.getElement('mouseposdiv')}));

//var center = new OpenLayers.LonLat(-106.6,35.2); //Albuquerque, NM
  var center = new OpenLayers.LonLat(-10821037, 4750248); // Somewhere in Kansas/Nebraska
  map.setCenter(center,0);

  // Zoom to extent of Gordon Bennett on first load
  gb_map.events.register("loadend", gb_map, onMainLayerLoad);

  var gb_options = {
    'hover': true,
    'onSelect': onSelect,
//  'onUnselect': onUnselect,
    'multiple' : false
  };

  var gb_select = new OpenLayers.Control.SelectFeature(gb_map,gb_options);
  map.addControl(gb_select);
  gb_select.activate();

  // Reload our balloon position/track data periodically
  setInterval(reload, 300000);

  // Preload our images for faster updating
  imagePreload();

} // init()

var firstLoad = true;
function onMainLayerLoad(e) {
  if (firstLoad) {
    map.zoomToExtent (gb_map.getDataExtent());
    firstLoad=false;
  }
}

function zoomToMainLayer() {
    map.zoomToExtent (gb_map.getDataExtent());
}

function reload() {
  var now=new Date();
  var ts=now.getTime();

  gb_map.setUrl("gb.php?ts="+ts);
  ac_map.setUrl("ac.php?ts="+ts);
}

var images = new Array(
  "images/balloons/Balloon_AUT1.png", "images/balloons/Balloon_FRA1.png", "images/balloons/Balloon_GBR1.png",
  "images/balloons/Balloon_GBR2.png", "images/balloons/Balloon_GER1.png", "images/balloons/Balloon_GER2.png",
  "images/balloons/Balloon_GER3.png", "images/balloons/Balloon_LS.png", "images/balloons/Balloon_SUI1.png",
  "images/balloons/Balloon_SUI2.png", "images/balloons/Balloon_USA1.png", "images/balloons/Balloon_USA2.png",
  "images/balloons/Balloon_USA3.png", "images/balloons/Balloon_USA.png", "images/balloons/star.gif",

  "images/flags/e/AUT_3.gif", "images/flags/e/FRA_3.gif", "images/flags/e/GBR_3.gif",
  "images/flags/e/GER_3.gif", "images/flags/e/SUI_3.gif", "images/flags/e/USA_3.gif",

  "images/teams/AbruzzoRichard.jpg", "images/teams/AnzenederTobias.jpg", "images/teams/BradleyTroy.jpg",
  "images/teams/BrielmannKevin.jpg", "images/teams/BryantPhilip.jpg", "images/teams/Buron-PilatrePhilippe.jpg",
  "images/teams/CaytonAndy.jpg", "images/teams/CuneoPeter.jpg", "images/teams/DORZL.jpg",
  "images/teams/DOWBA.jpg", "images/teams/DOWBI.jpg", "images/teams/EimersWilhelm.jpg",
  "images/teams/EnloeStuart.jpg", "images/teams/FGIRE.jpg", "images/teams/ForseSimon.jpg",
  "images/teams/FrickeBarbara.jpg", "images/teams/FriedenKurt.jpg", "images/teams/GBWOK.jpg",
  "images/teams/HBQHJ.jpg", "images/teams/HBQHP.jpg", "images/teams/Hempleman-AdamsDavid.jpg",
  "images/teams/HoraTomas.jpg", "images/teams/KrafczykPeter.jpg", "images/teams/KrebsMax.jpg",
  "images/teams/LoeschhornVolker.jpg", "images/teams/MacNuttPhillip.jpg", "images/teams/MasonJonathan.jpg",
  "images/teams/MeierhoferHelmut.jpg", "images/teams/N1636S.jpg", "images/teams/N47FC.jpg",
  "images/teams/N5054.jpg", "images/teams/N6326T.jpg", "images/teams/N6395V.jpg",
  "images/teams/N64KD.jpg", "images/teams/N707GH.jpg", "images/teams/N9041W.jpg",
  "images/teams/N91599.jpg", "images/teams/N96YD.jpg", "images/teams/NimmoAllan.jpg",
  "images/teams/OHENI.jpg", "images/teams/PadeltBert.jpg", "images/teams/Rymer-DavisCarol.jpg",
  "images/teams/SeelUllrich.jpg", "images/teams/StuerzlingerGerald.jpg", "images/teams/SullivanMark.jpg",
  "images/teams/TrappeJonathan.jpg", "images/teams/Villey-DesmeseretsThierry.jpg", "images/teams/VitanzaLouis.jpg",
  "images/teams/VollenweiderWalter.jpg", "images/teams/WallaceJohn.jpg", "images/teams/WhiteCheri.jpg",
  "images/teams/WitpraechtigerPascal.jpg"
);

function imagePreload() {
  var i;
  document.imageArray = new Array(images.length);
  for(i=0;i<images.length;i++) {
    document.imageArray[i] = new Image;
    document.imageArray[i].src=images[i];
  }
} // imagePreload()

function onSelect() {
  var msg;
  var teamdata;
  var pilot;
  var pilot_img;
  var pilot_country;
  var copilot;
  var copilot_country;
  var copilot_img;
  var balloon_img;
  var balloon_name;
  var geomType = gb_map.selectedFeatures[0].geometry["CLASS_NAME"];
  var attr=gb_map.selectedFeatures[0].attributes;
  
  if( attr["country"]!="LS" ) {
    // Selected feature is NOT the Launch site
    msg = gen_status_table(attr);

    pilot = attr["pilot"];
    pilot_img = "images/teams/"+attr["pilot_img"];
    pilot_country = attr["pilot_country"];
    copilot = attr["copilot"];
    copilot_country = attr["copilot_country"];
    copilot_img = "images/teams/"+attr["copilot_img"];
    balloon_img = "images/teams/"+attr["reg_num"]+".jpg";
    balloon_name = attr["balloon_name"];

    document.getElementById("infodiv").innerHTML = msg;
//  document.getElementById("pilotname").innerHTML = "Pilot:<br/>"+pilot;
//  document.getElementById("pilotflag").src="images/flags/e/"+pilot_country+"_3.gif";
//  document.getElementById("pilotflag").alt=pilot_country+" Flag";
//  document.getElementById("pilot_img").src=pilot_img;
//  document.getElementById("pilot_img").alt=pilot;
//  document.getElementById("copilotname").innerHTML = "CoPilot:<br/>"+copilot;
//  document.getElementById("copilotflag").src="images/flags/e/"+copilot_country+"_3.gif";
//  document.getElementById("copilotflag").alt=copilot_country+" Flag";
//  document.getElementById("copilot_img").src=copilot_img;
//  document.getElementById("copilot_img").alt=copilot;
//  document.getElementById("balloon_img").src=balloon_img;
//  document.getElementById("balloon_img").alt=balloon_name;
//  document.getElementById("balloon_img").setAttribute('style',"");
//  document.getElementById("balloonname").innerHTML = balloon_name;

    teamdata  = '<table width="100%" border="0" cellspacing="0" cellpadding="0">';
    // Balloon
    teamdata +=   '<tr>';
    teamdata +=     '<td colspan="2" align="center" valign="top" height="260">';
    teamdata +=       '<img id="balloon_img" src="'+balloon_img+'"/>';
    teamdata +=       '<p id="balloonname">'+balloon_name+'</p>';
    teamdata +=     '</td>';
    teamdata +=   '</tr>';
    // Pilot
    teamdata +=   '<tr>';
    teamdata +=     '<td width="50%" align="center" valign="top">';
    teamdata +=       '<img src="'+pilot_img+'" id="pilot_img" />';
    teamdata +=     '</td>';
    // CoPilot
    teamdata +=     '<td align="center" valign="top">';
    teamdata +=       '<img src="'+copilot_img+'" id="copilot_img" />';
    teamdata +=     '</td>';
    teamdata +=   '</tr>';
    teamdata +=   '<tr>';
    teamdata +=     '<td width="50%" align="center" valign="top">';
    teamdata +=       '<div style="height:50px;"><p style="font-size:10px;" id="pilotname">'+pilot+'<br><span style="font-size:9px;">Pilot</span></div>';
    teamdata +=       '<img id="pilotflag" src="images/flags/e/'+pilot_country+'_3.gif"/>';
    teamdata +=     '</td>';
    teamdata +=     '<td align="center" valign="top">';
    teamdata +=       '<div style="height:50px;"><p style="font-size:10px;" id="copilotname">'+copilot+'<br><span style="font-size:9px;">Co-Pilot</span></div>';
    teamdata +=       '<img id="copilotflag" src="images/flags/e/'+copilot_country+'_3.gif"/>';
    teamdata +=     '</td>';
    teamdata +=   '</tr>';
    teamdata += '</table>';
    document.getElementById("teamdata").innerHTML = teamdata;
  } // Selected feature is NOT Launch site
}

function onUnselect() {
  document.getElementById("infodiv").innerHTML = "<p>Hover mouse over balloon icon</p>";
}


function build_gb_styles() {
  var gb_line_color = "#A020C6";  // Purplish
  var ac_line_color = "#40C620";  // Greenish
  var theme = new OpenLayers.Style(
      {
        'graphicWidth': 21,
        'graphicHeight': 21,
        'graphicXOffset': -21/2,
        'graphicYOffset': -21,
        'graphicOpacity': 1,
        'strokeColor': gb_line_color,
        'strokeWidth': 1
      }
  );

  var ruleAUT1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("AUT-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_AUT1.png" }
    }
  );

  var ruleAUT2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("AUT-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_AUT2.png" }
    }
  );

  var ruleAUT3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("AUT-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_AUT3.png" }
    }
  );

  var ruleBEL1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("BEL-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_BEL1.png" }
    }
  );

  var ruleBEL2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("BEL-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_BEL2.png" }
    }
  );

  var ruleBEL3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("BEL-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_BEL3.png" }
    }
  );

  var ruleCAN1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("CAN-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_CAN1.png" }
    }
  );

  var ruleCAN2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("CAN-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_CAN2.png" }
    }
  );

  var ruleCAN3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("CAN-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_CAN3.png" }
    }
  );

  var ruleFRA1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("FRA-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_FRA1.png" }
    }
  );

  var ruleFRA2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("FRA-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_FRA2.png" }
    }
  );

  var ruleFRA3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("FRA-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_FRA3.png" }
    }
  );

  var ruleGBR1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GBR-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GBR1.png" }
    }
  );

  var ruleGBR2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GBR-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GBR2.png" }
    }
  );

  var ruleGBR3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GBR-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GBR3.png" }
    }
  );

  var ruleGER1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GER-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GER1.png" }
    }
  );

  var ruleGER2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GER-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GER2.png" }
    }
  );

  var ruleGER3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("GER-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GER3.png" }
    }
  );

  var ruleJPN1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("JPN-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_JPN1.png" }
    }
  );

  var ruleSUI1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("SUI-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_SUI1.png" }
    }
  );

  var ruleSUI2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("SUI-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_SUI2.png" }
    }
  );

  var ruleSUI3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("SUI-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_SUI3.png" }
    }
  );

  var ruleUSA1 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("USA-1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_USA1.png" }
    }
  );

  var ruleUSA2 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("USA-2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_USA2.png" }
    }
  );

  var ruleUSA3 = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("USA-3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_USA3.png" }
    }
  );

  var ruleIKE = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("IKEATO"),
      'symbolizer': {
        'externalGraphic': "./images/balloons/Hurricane_Cat2.png",
        'graphicWidth': 14,
        'graphicHeight': 23,
        'graphicXOffset': -14/2,
        'graphicYOffset': -23/2
      }
    }
  );

  var ruleLaunch = new OpenLayers.Rule( 
    { 'filter': comp_label_equal("Launch"),
      'symbolizer': {
        'externalGraphic': "./images/balloons/star.gif",
        'graphicWidth': 17,
        'graphicHeight': 17,
        'graphicXOffset': -17/2,
        'graphicYOffset': -17/2
      }
    }
  );

  theme.addRules([
    ruleAUT1, ruleAUT2, ruleAUT3,
    ruleBEL1, ruleBEL2, ruleBEL3,
    ruleCAN1, ruleCAN2, ruleCAN3,
    ruleFRA1, ruleFRA2, ruleFRA3,
    ruleGBR1, ruleGBR2, ruleGBR3,
    ruleGER1, ruleGER2, ruleGER3,
    ruleJPN1,
    ruleSUI1, ruleSUI2, ruleSUI3,
    ruleUSA1, ruleUSA2, ruleUSA3,
    ruleIKE,  ruleLaunch
  ]);

  var stylemap = new OpenLayers.StyleMap(
    { 'default':theme,
      'select': {
        'graphicOpacity': 1,
        'strokeWidth': 2
      }
    }
  );
  return stylemap;
} 

function comp_label_equal( val ) {
  var val;
  var comp = new OpenLayers.Filter.Comparison(
    { 'type': OpenLayers.Filter.Comparison.EQUAL_TO,
      'property': "label",
      'value': val
    }
  );
  return comp;
}

function build_ac_styles() {
  var gb_line_color = "#A020C6";  // Purplish
  var ac_line_color = "#40C620";  // Greenish
  var theme = new OpenLayers.Style(
      {
        'graphicWidth': 21,
        'graphicHeight': 21,
        'graphicXOffset': -21/2,
        'graphicYOffset': -21,
        'graphicOpacity': 0.5,
        'strokeColor': ac_line_color,
        'strokeWidth': 1
      }
  );

  var ruleAUT = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("AUT"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_AUT.png" }
    }
  );

  var ruleBEL = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("BEL"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_BEL.png" }
    }
  );

  var ruleCAN = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("CAN"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_CAN.png" }
    }
  );

  var ruleFRA = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("FRA"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_FRA.png" }
    }
  );

  var ruleGBR = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("GBR"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GBR.png" }
    }
  );

  var ruleGER = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("GER"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_GER.png" }
    }
  );

  var ruleJPN = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("JPN"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_JPN.png" }
    }
  );

  var ruleSUI = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("SUI"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_SUI.png" }
    }
  );

  var ruleUSA = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("USA"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_USA.png" }
    }
  );

  var ruleLaunch = new OpenLayers.Rule( 
    { 'filter': comp_country_equal("LS"),
      'symbolizer': {
        'externalGraphic': "./images/balloons/star.gif",
        'graphicWidth': 17,
        'graphicHeight': 17,
        'graphicXOffset': -17/2,
        'graphicYOffset': -17/2
      }
    }
  );

  theme.addRules([
    ruleAUT,
    ruleBEL,
    ruleCAN,
    ruleFRA,
    ruleGBR,
    ruleGER,
    ruleJPN,
    ruleSUI,
    ruleUSA,
    ruleLaunch
  ]);

  var stylemap = new OpenLayers.StyleMap(
    { 'default':theme,
      'select': {
        'graphicOpacity': 1,
        'strokeWidth': 2
      }
    }
  );
  return stylemap;
} 

function comp_country_equal( val ) {
  var val;
  var comp = new OpenLayers.Filter.Comparison(
    { 'type': OpenLayers.Filter.Comparison.EQUAL_TO,
      'property': "country",
      'value': val
    }
  );
  return comp;
}

function getLocalCalendarDate(ts)
{
   var dtime= new Date();
   dtime.setTime(ts*1000);  // requires milliseconds from epoch
   var months = new Array(13);
   months[0]  = "Jan";
   months[1]  = "Feb";
   months[2]  = "Mar";
   months[3]  = "Apr";
   months[4]  = "May";
   months[5]  = "Jun";
   months[6]  = "Jul";
   months[7]  = "Aug";
   months[8]  = "Sept";
   months[9]  = "Oct";
   months[10] = "Nov";
   months[11] = "Dec";
   var monthnumber = dtime.getMonth();
   var monthname   = months[monthnumber];
   var monthday    = dtime.getDate();
   var year        = dtime.getFullYear();
   if(year < 2000) { year = year + 1900; }
   var dateString = monthday + ' ' + monthname + ' ' + year;
   return dateString;
} // function getLocalCalendarDate()

function getLocalClockTime(ts)
{
   var dtime= new Date();
   dtime.setTime(ts*1000);
   var localstr=dtime.toLocaleString();
   var local=localstr.split(/ /);
//   var tz=local.pop();
   var tz='Local';
   var hour   = dtime.getHours();
   var minute = dtime.getMinutes();
   if (hour   < 10) { hour   = "0" + hour;   }
   if (minute < 10) { minute = "0" + minute; }
   var timeString = hour + ':' + minute+'&nbsp;'+tz;
   return timeString;
} // function getLocalClockTime()


function gen_status_table(team) {
  var team;
  var label;
  var update_time=team['update_time'];  // in seconds from unix epoch
  var stat = team['status'];
  stat = stat.replace(/Launch/g,'Awaiting<br/>Launch');
  var content = '<table id="mapstatus" class="race" width="935"><thead><tr id="title">';
  content += '<th>Team</th><th>Pilot<br/>Co-Pilot</th>';
  content += '<th>Distance</th><th>Duration</th><th>Status</th><th>Heading</th><th>Speed</th><th>Position</th><th>Location</th><th>Last Update</th></tr></thead><tbody>';

  label = team['label'].replace(/GBR/g,'UK');
  content += '<tr id="row_0" class="d0">';
  content += '<td>'+label+'</td>';
  content += '<td>'+team['pilot']+'<br/>'+team['copilot']+'</td>';
  content += '<td>'+team['dist_km']+'&nbsp;km<br>'+team['dist_mi']+'&nbsp;mi</td>';
  content += '<td>'+team['duration']+'</td>';
  content += '<td>'+stat+'</td>';
  content += '<td>'+team['cse_true']+'&deg&nbsp;True</td>';
  content += '<td>'+team['spd_kph']+'&nbsp;km/hr<br>'+team['spd_mph']+'&nbsp;mph</td>';
  content += '<td>'+team['lat']+'<br/>'+team['lon']+'</td>';
  content += '<td>'+team['pos_mi']+' mi / '+team['pos_km']+' km<br/>'+team['pos_desc']+'</td>';
  if(update_time==0) {
    content += '<td>-</td>';
  }
  else {
    content += '<td>'+getLocalCalendarDate(update_time)+'<br>'+getLocalClockTime(update_time)+'</td>';
  }
  content += '</tbody></table>';
  return content;
}

