
/***************************************************************************
 *   Copyright (C) 2007, Paul Lutus                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

var rtod = 180.0 / Math.PI;
var dtor = Math.PI / 180.0;
var pi2 = Math.PI * 2.0;
var earth_radius = 6378138.12; // meters

// arguments in degrees, result in degrees

function bearing( lat1, lng1, lat2, lng2 ) {
  lat1 *= dtor;
  lng1 *= dtor;
  lat2 *= dtor;
  lng2 *= dtor;
  var angle = - Math.atan2(
    Math.sin( lng1 - lng2 ) * Math.cos( lat2 ),
    Math.cos( lat1 ) *
    Math.sin( lat2 ) - Math.sin( lat1 ) *
    Math.cos( lat2 ) * Math.cos( lng1 - lng2 )
  );
  if ( angle < 0.0 ) {
    angle  += pi2;
  }
  return angle * rtod;
}

// arguments in degrees, result in kilometers

function distance(lat1,lng1,lat2,lng2 ) {
  var d = Math.cos(lng2 - lng1)*Math.cos(lat2 - lat1);
  d = Math.acos(d)*earth_radius;
  return d;
}

function compute_cell_data(array,x,y) {
  if(x == y) {
    return "&nbsp;&mdash;&nbsp;";
  }
  else {
    lat1 = array[x].getLatLng().lat() * dtor;
    lng1 = array[x].getLatLng().lng() * dtor;
    lat2 = array[y].getLatLng().lat() * dtor;
    lng2 = array[y].getLatLng().lng() * dtor;
    var dist = distance(lat1,lng1,lat2,lng2 );
    var brg = bearing( lat1, lng1, lat2, lng2 );
    dist *= distance_conversions[cur_distance_units];
    dist = dist.toFixed(1);
    brg = brg.toFixed(1);
    return dist + "/" + brg;
  }
}

var distance_conversions = new Array(1,0.001,3.28084,6.213712e-04);

var distance_names = new Array("Meters","Kilometers","Feet","Miles");

function change_distance_units(v) {
  cur_distance_units = v;
  create_distance_matrix(false);
}

function generate_distance_radio_buttons() {
  output = new Array();
  output.push("Distance Units:&nbsp;");
  for(i = 0;i < 4;i++) {
    ext = (i == cur_distance_units)?"checked":"";
    output.push(wrap_tag(distance_names[i],"input","type=\"radio\" class=\"noborder\" name=\"distance_unit_selector\" onClick=\"change_distance_units(" + i + ");\" " + ext));
  }
  return output.join("\n");
}

function create_distance_matrix(read) {
  var data = "";
  if(cur_distance_visible) {
    if(read) {
      read_data_list();
    }
    var array = new Array();
    for(var i in marker_array) {
      array.push(marker_array[i]);
    }
    var len = array.length;
    var content = new Array();
    for(var y = -1;y < len;y++) {
      var row = new Array();
      for(var x = -1;x < len;x++) {
        if(x < 0) {
          if(y < 0) {
            row.push(wrap_tag("&nbsp;&mdash;&nbsp;","td"));
          }
          else {
            row.push(wrap_tag(array[y].text,"td","class=\"title_table_cell\""));
          }
        }
        else {
          if(y < 0) {
            row.push(wrap_tag(array[x].text,"td","class=\"title_table_cell\""));
          }
          else {
            var celldata = compute_cell_data(array,x,y);
            row.push(wrap_tag(celldata,"td"));
          }
        }
      }
      content.push(wrap_tag(row.join("\n"),"tr"));
    }
    data = generate_distance_radio_buttons();
    data = wrap_tag(data,"p");
    data += wrap_tag(content.join("\n"),"table","class=\"distance_matrix_table\"");
    var help = wrap_tag("Cell contents: (distance in selected units)/(true bearing from top name to left name)","i");
    data += wrap_tag(help,"p");
    data = wrap_tag(data,"center");
    data = wrap_tag(data,"td");
    data = wrap_tag(data,"tr");
    data = wrap_tag(data,"table","class=\"wrapper_table\"");
    data = wrap_tag(data,"center");
    data = wrap_tag(data,"p");
  }
  document.getElementById("dist_matrix").innerHTML = data;
}