// 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 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
  };


  // Initialize Team Info table
  initStatusTable();

  // Define the map
  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( 
    "14<sup>th</sup> America's Challenge", 
    "ac.json?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(true);
  map.addLayer( ac_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 America's Challenge on first load
  ac_map.events.register("loadend", ac_map, onMainLayerLoad);

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

  var ac_select = new OpenLayers.Control.SelectFeature(ac_map,ac_options);
  map.addControl(ac_select);
  ac_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 (ac_map.getDataExtent());
    firstLoad=false;
  }
}

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

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

  ac_map.setUrl("ac.json?ts="+ts);
}

var images = new Array(
  "images/balloons/Balloon_1.png", "images/balloons/Balloon_2.png", 
  "images/balloons/Balloon_3.png", "images/balloons/Balloon_4.png", 
  "images/balloons/Balloon_5.png", "images/balloons/Balloon_6.png", 
  "images/balloons/Balloon_7.png", "images/balloons/Balloon_8.png", 
  "images/balloons/Balloon_9.png",
  "images/balloons/Balloon_LS.png", "images/balloons/star.gif",
  "images/balloons/Balloon_USA.png",

  "images/flags/e/CAN_3.gif", "images/flags/e/USA_3.gif",

  "images/teams/AbruzzoRichard.jpg", "images/teams/JohnsonGary.jpg", "images/teams/N96YD.jpg",
  "images/teams/BryantPhilip.jpg", "images/teams/MannElbert.jpg", "images/teams/N257P.jpg", 
  "images/teams/KnappKevin.jpg", "images/teams/CaytonAndy.jpg", "images/teams/N9041W.jpg",
  "images/teams/FrickeBarbara.jpg", "images/teams/CuneoPeter.jpg", "images/teams/N47FC.jpg",
  "images/teams/MacNuttPhillip.jpg", "images/teams/CritelliBrian.jpg", "images/teams/N601ZG.jpg",
  "images/teams/KuglerJohn.jpg", "images/teams/SheeseRalph.jpg", "images/teams/N61533.jpg",
  "images/teams/FancoeurDanielle.jpg", "images/teams/EllisLinda.jpg", "images/teams/N91599.jpg",
  "images/teams/PadeltBert.jpg", "images/teams/VitanzaLouis.jpg", "images/teams/N6395V.jpg",
  "images/teams/SullivanMark.jpg", "images/teams/WhiteCheri.jpg", "images/teams/N707GH.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 = ac_map.selectedFeatures[0].geometry["CLASS_NAME"];
  var attr=ac_map.selectedFeatures[0].attributes;
  
  if( attr["country"]!="LS" ) {
    // Selected feature is NOT the Launch site
    msg = updateStatusTable(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"];


    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
} // onSelect()

function updateStatusTable( team ) {
  
  if( team["country"]!="LS" ) {
    // Selected feature is NOT the Launch site
    msg = genStatusTable(team);
    document.getElementById("infodiv").innerHTML = msg;
  } // Selected feature is NOT Launch site

} // updateStatusTable()

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

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

  var ruleTeam1 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("1"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_1.png" }
    }
  );

  var ruleTeam2 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("2"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_2.png" }
    }
  );

  var ruleTeam3 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("3"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_3.png" }
    }
  );

  var ruleTeam4 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("4"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_4.png" }
    }
  );

  var ruleTeam5 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("5"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_5.png" }
    }
  );

  var ruleTeam6 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("6"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_6.png" }
    }
  );

  var ruleTeam7 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("7"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_7.png" }
    }
  );

  var ruleTeam8 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("8"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_8.png" }
    }
  );

  var ruleTeam9 = new OpenLayers.Rule( 
    { 'filter': comp_team_number_equal("9"),
      'symbolizer': { 'externalGraphic': "./images/balloons/Balloon_9.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([
    ruleTeam1,
    ruleTeam2,
    ruleTeam3,
    ruleTeam4,
    ruleTeam5,
    ruleTeam6,
    ruleTeam7,
    ruleTeam8,
    ruleTeam9,
    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 comp_team_number_equal( val ) {
  var val;
  var comp = new OpenLayers.Filter.Comparison(
    { 'type': OpenLayers.Filter.Comparison.EQUAL_TO,
      'property': "team_number",
      '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 genStatusTable(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>';

  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 += '</tr></tbody></table>';
  return content;
} // genStatusTable()

function initStatusTable() {
  var content = '<table id="mapstatus" class="race" width="935"><thead><tr id="title">';
  content += '<th><p>Hover mouse over balloon icon for team information</p></th></tr></thead><tbody>';

  content += '<tr id="row_0" class="d0">';
  content += '<td><p>&nbsp;</p></td>';
  content += '</tr></tbody></table>';
  document.getElementById("infodiv").innerHTML = content;
} // initStatusTable()


