<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="__MSG_title__"
             description="__MSG_description__"
             author="Adam Schuck, James Macgill, and Seth LaForge"
             author_email="maps-devtools+distance@google.com"
             author_affiliation="Google, Inc."
             author_location="Sydney, AU"
             screenshot="http://www.google.com/mapfiles/mapplets/distance/distance.png"
             thumbnail="http://www.google.com/mapfiles/mapplets/distance/distance-thumb.png"
             height="150"
>
  <Require feature="sharedmap"/>
  <Require feature="dynamic-height"/>
  <Require feature="setprefs" />
  <Locale messages="http://www.google.com/mapfiles/mapplets/distance/distance_ALL_ALL.xml"/>
  <Locale lang="ca" messages="http://www.google.com/mapfiles/mapplets/distance/distance_ca_ALL.xml"/>
  <Locale lang="da" messages="http://www.google.com/mapfiles/mapplets/distance/distance_da_ALL.xml"/>
  <Locale lang="de" messages="http://www.google.com/mapfiles/mapplets/distance/distance_de_ALL.xml"/>
  <Locale lang="en" country="AU" messages="http://www.google.com/mapfiles/mapplets/distance/distance_en_AU.xml"/>
  <Locale lang="en" country="UK" messages="http://www.google.com/mapfiles/mapplets/distance/distance_en_UK.xml"/>
  <Locale lang="es" messages="http://www.google.com/mapfiles/mapplets/distance/distance_es_ALL.xml"/>
  <Locale lang="eu" messages="http://www.google.com/mapfiles/mapplets/distance/distance_eu_ALL.xml"/>
  <Locale lang="fi" messages="http://www.google.com/mapfiles/mapplets/distance/distance_fi_ALL.xml"/>
  <Locale lang="fr" messages="http://www.google.com/mapfiles/mapplets/distance/distance_fr_ALL.xml"/>
  <Locale lang="gl" messages="http://www.google.com/mapfiles/mapplets/distance/distance_gl_ALL.xml"/>
  <Locale lang="it" messages="http://www.google.com/mapfiles/mapplets/distance/distance_it_ALL.xml"/>
  <Locale lang="ja" messages="http://www.google.com/mapfiles/mapplets/distance/distance_ja_ALL.xml"/>
  <Locale lang="nl" messages="http://www.google.com/mapfiles/mapplets/distance/distance_nl_ALL.xml"/>
  <Locale lang="nn" messages="http://www.google.com/mapfiles/mapplets/distance/distance_nn_ALL.xml"/>
  <Locale lang="no" messages="http://www.google.com/mapfiles/mapplets/distance/distance_no_ALL.xml"/>
  <Locale lang="ru" messages="http://www.google.com/mapfiles/mapplets/distance/distance_ru_ALL.xml"/>
  <Locale lang="sv" messages="http://www.google.com/mapfiles/mapplets/distance/distance_sv_ALL.xml"/>
  <Locale lang="zh-CN" messages="http://www.google.com/mapfiles/mapplets/distance/distance_zh_CN.xml"/>
  <Locale lang="zh-TW" messages="http://www.google.com/mapfiles/mapplets/distance/distance_zh_TW.xml"/>
</ModulePrefs>
<UserPref name="metric"
          display_name="__MSG_metricunit__"
          datatype="bool"
          default_value="__MSG_default_to_metric__"
/>
<UserPref name="unitName"
          display_name="__MSG_units__"
          datatype="string"
          default_value=""
/>
<UserPref name="showMoreUnits"
          display_name="__MSG_show_more_units__"
          datatype="bool"
          default_value="false"
/>

<Content type="html"><![CDATA[
  <style>
    .btn {     /* Prevent long button from becoming pixellated in IE */
      padding: 0 .5em;
      width: 0;
      overflow:visible;
    }
    .btn[class] { /* IE ignores [class] */
      width: auto;
    }
  </style>

  <font face=arial size=-1>
    <form>
      __MSG_instructions__

      <div style="margin-top:0.5em">
        __MSG_units__:<br>
        <span id="baseUnits">
          <label>
            <input id="metric" name="unitsRadio" type="radio"
             onclick="setUnit('metric')"> __MSG_metricunit__
          </label>
          <label>
            <input id="english" name="unitsRadio" type="radio"
             onclick="setUnit('english')"> __MSG_englishunit__
          </label>
          <span id="moreUnitsSection" style="display: none">
            &#32;&nbsp;&#32;
            <a href="javascript:void(0)"
             onclick="showMoreUnits(true); return false">
              <nobr>__MSG_show_more_units__</nobr>
            </a>
          </span>
        </span>
        <span id="moreUnits" style="display: none">
          <select id="allUnits" onchange="setUnit(_gel('allUnits').value)">
          </select>
          &#32;&nbsp;&#32;
          <a href="javascript:void(0)" id="lessUnitsSection"
           onclick="showMoreUnits(false); return false">
            <nobr>__MSG_show_less_units__</nobr>
          </a>
        </span>
      </div>

      <div style="margin-top:1em">
        <font size=+1><b><span id="mappletMessage"></span></b></font>
      </div>

      <div style="margin-top:1em">
        <input class="btn" type="button" id="deleteButton"
         value="__MSG_deletelast__" onclick="deleteEnd()">
        <input class="btn" type="button" id="restartButton"
         value="__MSG_reset__" onclick="restart()">
      </div>
    </form>
  </font>

  <script>
var map = new GMap2();
var prefs = new _IG_Prefs(__MODULE_ID__);

var points = [];
var polyline = null;
var endMarker = null;
var listener = null;

var start_icon =
    new GIcon(G_DEFAULT_ICON, 'http://maps.google.com/mapfiles/dd-start.png');
var end_icon =
    new GIcon(G_DEFAULT_ICON, 'http://maps.google.com/mapfiles/dd-end.png');

var UNITS = [
  { name: "American football field", m: 109.728, abbr: "football fields" },
  { name: "American printer's point", m: 0.000351405622, abbr: "pt" },
  { name: "angstrom", label: "Ångström", m: 1E-10, abbr: "Å" },
  { name: "Arabic nil-cubit", m: 0.54022500, abbr: "black cubits" },
  { name: "astronomical unit", m: 149597870691, abbr: "AU" },
  { name: "Babylonian cubit", m: 0.49612500, abbr: "cubits of Lagash" },
  { name: "Babylonian trade cubit", m: 0.4465, abbr: "cubits" },
  { name: "Bohr radius", m: 5.29177210818E-11, abbr: "<i>a</i><sub>0</sub>" },
  { name: "California vara", m: 0.8382, abbr: "varas" },
  { name: "cana", m: 1.5708 },
  { name: "Didot point", m: 0.0003759715104, abbr: "pt" },
  { name: "Egyptian old royal cubit", m: 0.52388127, abbr: "cubits" },
  { name: "Egyptian old trade cubit", m: 0.44904109, abbr: "cubits" },
  { name: "Egyptian remen", m: 0.37044000, abbr: "remen" },
  { name: "Egyptian royal cubit", m: 0.52920000, abbr: "cubits" },
  { name: "english", m: 0.3048 },
  { name: "fathom", m: 1.8288 },
  { name: "foot", m: 0.3048, abbr: "ft" },
  { name: "furlong", m: 201.168 },
  { name: "Greek Kyrenaika cubit", m: 0.4631, abbr: "πεχυα" },
  { name: "Greek metrikos cubit", m: 0.47416320, abbr: "πεχυα" },
  { name: "Guard cubit", m: 0.55566000, abbr: "ammatu rabitu" },
  { name: "Gunter chain", label: "Gunter's chain", m: 20.1168, abbr: "ch" },
  { name: "Gunter link", label: "Gunter's link", m: 0.201168, abbr: "l." },
  { name: "Hashimi cubit", m: 0.65028096, abbr: "cubits" },
  { name: "inch", m: 0.0254, abbr: "in" },
  { name: "Jewish 1st Temple cubit", m: 0.4281, abbr: "cubits" },
  { name: "Jewish 2nd Temple cubit", m: 0.4445, abbr: "cubits" },
  { name: "Jewish 2nd Temple sacred cubit", m: 0.4376, abbr: "cubits" },
  { name: "league", m: 5556 },
  { name: "li", m: 500, abbr: "里" },
  { name: "light-year", m: 9460730472580800, abbr: "ly" },
  { name: "meter", m: 1, abbr: "m" },
  { name: "mile", m: 1609.344, abbr: "mi" },
  { name: "Mesopotamian nil-cubit", m: 0.53343360, abbr: "cubits" },
  { name: "metric", m: 1 },
  { name: "nautical mile", m: 1852 },
  { name: "Olympic swimming pool", m: 50, abbr: "pools" },
  { name: "parsec", m: 30856775813057300, abbr: "pc" },
  { name: "Pergamon cubit", m: 0.5209, abbr: "cubits" },
  { name: "Persian cubit", m: 0.50009400, abbr: "cubits" },
  { name: "Planck length", m: 1.6162412E-35, abbr: "<i>l<sub>P</sub></i>" },
  { name: "PostScript point", m: 0.0254 / 72, abbr: "pt" },
  { name: "potrzebie", m: 0.002263348517438173216473 },
  { name: "Ramsden's chain", m: 30.48, abbr: "ch" },
  { name: "rod / perch / pole", m: 5.0292, abbr: "rods" },
  { name: "Roman cubit", m: 0.44452800, abbr: "cubitus" },
  { name: "Roman double-pace", m: 1.48, abbr: "paces" },
  { name: "Russian verst", m: 1066.8, abbr: "верста" },
  { name: "Salamis cubit", m: 0.4840, abbr: "cubits" },
  { name: "smoot", m: 1.702 },
  { name: "Spanish vara", m: 0.8359, abbr: "varas" },
  { name: "Sumerian Nippur cubit", m: 0.51861600, abbr: "cubits" },
  { name: "TeX point", m: 0.0254 / 72.27, abbr: "pt" },
  { name: "Texas vara", m: 0.84666667, abbr: "varas" },
  { name: "vara chain", m: 26.933333333, abbr: "vara chains" },
  { name: "yard", m: 0.9144 }
];

// Local scope.
(function() {
  // Warning: IE has a bug when trying to set innerHTML on a select element:
  //   http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
  var select = _gel("allUnits");
  for (var i = 0; i < UNITS.length; ++i) {
    var unit = UNITS[i];
    var opt = document.createElement("option");
    opt.value = unit.name;
    unit.label = prefs.getMsg(unit.name + "unit") || unit.label || unit.name;
    unit.abbr = prefs.getMsg(unit.name + "unitshort") || unit.abbr;
    // Uppercase first character in unit name for menu.
    opt.innerHTML = unit.label.slice(0, 1).toUpperCase() + unit.label.slice(1);
    select.appendChild(opt);
  }
})();

listener = GEvent.addListener(map, 'click', function(target, point) {
  if (point) {
    if (polyline) {
      updateEnd(point);
    } else {
      addStart(point);
    }

    points.push(point);
    updatePolyline();

    _gel("deleteButton").disabled = false;
    _gel("restartButton").disabled = false;
  }
});

function setUnit(name, opt_startup) {
  var newUnit;
  for (var i = 0; i < UNITS.length; ++i) {
    if (UNITS[i].name == name) {
      newUnit = UNITS[i];
    }
  }
  if (newUnit && newUnit != unit) {
    unit = newUnit;
    if (!opt_startup) {
      prefs.set("unitName", unit.name);
    }
    _gel("allUnits").value = unit.name;
    if (unit.name == "metric") {
      _gel("metric").checked = true;
    }
    if (unit.name == "english") {
      _gel("english").checked = true;
    }
    if (points.length) {
      updateDistance();
    }
  }
}

function showMoreUnits(show, opt_startup) {
  if (!show && unit.name != "metric" && unit.name != "english") {
    setUnit(__MSG_default_to_metric__ ? "metric" : "english");
  }
  _gel("baseUnits").style["display"] = show ? "none" : "";
  _gel("moreUnits").style["display"] = show ? "" : "none";
  _IG_AdjustIFrameHeight();
  if (!opt_startup) {
    prefs.set("showMoreUnits", show ? 1 : 0);
  }
}

function updateDistance() {
  polyline.getLengthAsync( function(result) {
    result /= unit.m;
    var unitDesc = unit.abbr || (unit.name + 's');

    if (unit.name == "metric") {
      unitDesc = prefs.getMsg("metres");
      if (result > 1000) {
        unitDesc = prefs.getMsg("kilometres");
        result = result / 1000;
      }
    } else if (unit.name == "english") {
      var FT_PER_MILE = 5280;
      unitDesc = prefs.getMsg("feet");
      if (result > FT_PER_MILE) {
        unitDesc = prefs.getMsg("miles");
        result /= FT_PER_MILE;
      }
    }

    _gel("mappletMessage").innerHTML = prefs.getMsg("total") + "<br>" +
        result.toPrecision(6) + " " + unitDesc + " &nbsp;&nbsp;";
    _IG_AdjustIFrameHeight();
  });
}

function updatePolyline() {
  if (points) {
    if (polyline) {
      map.removeOverlay(polyline);
    }
    polyline = new GPolyline(points, "#ff0000", 8, 0.45, {"geodesic": 1});
    map.addOverlay(polyline);
    updateDistance();
  }
}

function addStart(point) {
  var markerId = 'start';
  var marker = new GMarker(point, {
    icon: start_icon,
    draggable: true,
    bouncy: false
  });
  marker.markerId = markerId;
  map.addOverlay(marker);

  GEvent.addListener(marker, 'dragend', function() {
    marker.getPointAsync(function(point) {
      points[0] = point;
      updatePolyline();
    })
  });
}

function updateEnd(point) {
  if (!endMarker) {
    endMarker = new GMarker(point, {
      icon: end_icon,
      draggable: true,
      bouncy: false
    });
    endMarker.markerId = 'end';
    map.addOverlay(endMarker);
  }
  endMarker.setPoint(point);

  GEvent.addListener(endMarker, 'dragend', function() {
    endMarker.getPointAsync(function(point) {
      points[points.length - 1] = point;
      updatePolyline();
    })
  });
}

function deleteEnd() {
  if (endMarker) {
    var oldEnd = points.pop();
    if (points.length > 1) {
      var newEnd = points[points.length - 1];
      endMarker.setPoint(newEnd);
    } else {
      map.removeOverlay(endMarker);
      endMarker = null;
      _gel("mappletMessage").innerHTML = "&nbsp;<br>&nbsp;";
      _IG_AdjustIFrameHeight();
    }
    updatePolyline();
  } else {
    restart();
  }
}

function restart() {
  map.clearOverlays();
  points = [];
  polyline = null;
  endMarker = null;
  _gel("mappletMessage").innerHTML = "&nbsp;<br>&nbsp;";
  _gel("deleteButton").disabled = true;
  _gel("restartButton").disabled = true;
  _IG_AdjustIFrameHeight();
}

unit = null;
setUnit("metric", true);  // Default
var unitName = prefs.getString("unitName");
var metric = prefs.getBool("metric");
if (unitName) {
  setUnit(unitName, true);
} else if (!metric) {
  setUnit("english", true);
}

// Show the "show more units" link only if it has text
if (prefs.getMsg("show_more_units") != "") {
  _gel("moreUnitsSection").style["display"] = "";
} else {
  prefs.set("showMoreUnits", 0);
}
var moreUnits = prefs.getBool("showMoreUnits");
showMoreUnits(moreUnits, true);
restart();
  </script>

]]></Content>

</Module>
