/*   Google Maps API Javascript   */
/*    2007-09 William R Parke     */

// this script uses a global map object
var oMap;
var oGE;
var g_click = null;
var g_marker = null;
var map_address = "";
var map_marker = null;
var map_type = G_NORMAL_MAP;
var mark_location = null;
var poly_total = 0;
var poly_pts = [];
var poly_dists = [];
var poly_marks = [];
var poly_lines = [];
var poly_txt = "";
var poly_color = "#9900FF";
var poly_markers = true;

var ic_default = new GIcon(G_DEFAULT_ICON);

var ic_target = new GIcon();
  ic_target.image = "http://www.parkenet.com/apl/resource/wp_target.png";
  ic_target.shadow = "http://www.parkenet.com/apl/resource/wp_target_shadow.png";
  ic_target.iconSize = new GSize(33, 33);
  ic_target.shadowSize = new GSize(33, 33);
  ic_target.iconAnchor = new GPoint(17, 17);
  ic_target.infoWindowAnchor = new GPoint(17, 1);

var ic_flag = new GIcon();
  ic_flag.image = "http://www.parkenet.com/apl/resource/wp_flag_red.png";
  ic_flag.shadow = "http://www.parkenet.com/apl/resource/wp_flag_shadow.png";
  ic_flag.iconSize = new GSize(33, 33);
  ic_flag.shadowSize = new GSize(33, 33);
  ic_flag.iconAnchor = new GPoint(1, 33);
  ic_flag.infoWindowAnchor = new GPoint(16, 1);

var ic_wp = new GIcon();
  ic_wp.image = "http://www.parkenet.com/apl/resource/wp_yellow.png";
  ic_wp.shadow = "http://www.parkenet.com/apl/resource/wp_yellow_shadow.png";
  ic_wp.iconSize = new GSize(13, 13);
  ic_wp.shadowSize = new GSize(13, 13);
  ic_wp.iconAnchor = new GPoint(6, 6);
  ic_wp.infoWindowAnchor = new GPoint(6, 1);

var ic_red = new GIcon();
  ic_red.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
  ic_red.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  ic_red.iconSize = new GSize(12,20);
  ic_red.shadowSize = new GSize(22, 20);
  ic_red.iconAnchor = new GPoint(6, 20);
  ic_red.infoWindowAnchor = new GPoint(5, 1);

var ic_green = new GIcon();
  ic_green.image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
  ic_green.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  ic_green.iconSize = new GSize(12, 20);
  ic_green.shadowSize = new GSize(22, 20);
  ic_green.iconAnchor = new GPoint(6, 20);
  ic_green.infoWindowAnchor = new GPoint(5, 1);

var ic_blue = new GIcon();
  ic_blue.image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
  ic_blue.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
  ic_blue.iconSize = new GSize(12, 20);
  ic_blue.shadowSize = new GSize(22, 20);
  ic_blue.iconAnchor = new GPoint(6, 20);
  ic_blue.infoWindowAnchor = new GPoint(5, 1);

function clearLastPolyline() {
 if (0 < poly_pts.length) {
  poly_pts.pop();
  if (0 == poly_pts.length)
   if ("" != poly_txt)
    document.getElementById(poly_txt).innerHTML = "";
 } 
 if (0 < poly_marks.length) {
  oMap.removeOverlay(poly_marks[poly_marks.length-1]);
  poly_marks.pop();
 }
 if (0 < poly_lines.length) {
  oMap.removeOverlay(poly_lines[poly_lines.length-1]);
  poly_lines.pop();
  poly_total = poly_total-poly_dists[poly_dists.length-1];
  poly_dists.pop();
  if ("" != poly_txt) {
   var t = document.getElementById(poly_txt).innerHTML;
   t = t.substr(0,t.lastIndexOf('('));
   document.getElementById(poly_txt).innerHTML=t;
  }
 }
}

function clearMap()
{
 if (oMap)
 {
  oMap.clearOverlays();
  resetPolys();
  if ("" != poly_txt)
   document.getElementById(poly_txt).innerHTML="";
 }
}


function doPolyline(marker,point)
{
 if (undefined == point)
  return;
 if (null != marker)
  return;
 var url=point.toUrlValue();
 var txt="("+url+")";
 url = "(" + url + "," + oMap.getZoom() + ")";
 var gll = new GLatLng(point.lat(),point.lng());

 if (0 == poly_pts.length) {
  marker = new GMarker(point,{icon: ic_wp, title: txt});
  if ("" != poly_txt)
   url += "<br/>";
 } else {
  var pll = poly_pts[poly_pts.length-1];
  var dst = gll.distanceFrom(pll);
  poly_dists.push(dst);
  var pt = poly_total;
  poly_total = poly_total+dst;
  dst = dst/1000;
  dst = dst.toFixed(1)+"km/"+(dst/1.609334).toFixed(1)+"mi";
  if (0 < pt) {
   pt = poly_total/1000;
   dst = "+ "+dst+" = "+pt.toFixed(1)+"km/"+(pt/1.609334).toFixed(1)+"mi";
  }
  txt = txt+" "+dst;
  if (true == poly_markers)
   marker = new GMarker(point,{icon: ic_wp, title: txt});
  
  var polyline = new GPolyline([pll, gll],poly_color,6,.33);
  oMap.addOverlay(polyline);
  poly_lines.push(polyline);
  
  if ("" != poly_txt)
   url = document.getElementById(poly_txt).innerHTML+url+"<br/>";
 }
 if (marker) {
  oMap.addOverlay(marker);
  GEvent.addListener(marker, "dblclick", function() {marker.showMapBlowup();});
 }
 poly_marks.push(marker);
 poly_pts.push(gll);

 if ("" != poly_txt)
  document.getElementById(poly_txt).innerHTML=url;
 else
  if (marker)
   marker.bindInfoWindowHtml(txt);
}


function findAddressPoint(id_addr,id_pt)
{
 var address = document.getElementById(id_addr).value;
 if ("" != address)
  getPointByAddress(address);
}


function findMapAddress(id_addr,zoom,mark)
{
 // button handler to find an address entered by user
 // id_addr == id of HTML element containing user input
 // zoom?   == map zoom value (1-17) or id of HTML element containing user zoom selection 
 // assumes map object already initialized and displayed by one of the loadMap... functions
 if (!document.getElementById(id_addr))
  return;
 var address=document.getElementById(id_addr).value;
 if ("" != address)
  showMapAddress(address,zoom,mark);
}


function fromMapSize(size)
{
 switch (size)
 {
  case "fitscreen" :
   return "F";
  case "lgsquare" :
   return "G";
  case "landscape" :
   return "L";
  case "portrait" :
   return "P";
  case "smsquare" :
   return "S";
  default :
   return "F";
 }
}


function getEarthInstanceCB(object) {
  // Google Earth plugin callback for getEarthInstance method 
  oGE = object;
  if (oGE)
   oGE.getOptions().setStatusBarVisibility(true);
}

function getLatLngString(lat,lng,zoom)
{
 // convert decimal latitude, longitude to compass degree minute second
 var t = "";
 t += Math.floor(Math.abs(lat))+"&#176; ";
 var m = Math.floor(60*(Math.abs(lat)%1));
 var s = (60*(60*(Math.abs(lat)%1)%1)).toFixed(2);
 if (60 == Math.floor(s))
 {
  m = 1+m;
  s = (60*s%1).toFixed(2);
 }
 t += m+"' "+s+'"';
 t += ((0 == lat) ? "" : ((0 < lat) ? " N" : " S"))+", "
 t += Math.floor(Math.abs(lng))+"&#176; ";
 m = Math.floor(60*(Math.abs(lng)%1));
 s = (60*(60*(Math.abs(lng)%1)%1)).toFixed(2);
 if (60 == Math.floor(s))
 {
  m = 1+m;
  s = (60*s%1).toFixed(2);
 }
 t += m+"' "+s+'" ';
 t += (0 == lng) ? "" : ((0 < lng) ? "E" : "W")
 t += " ("+lat+","+lng;
 if (zoom)
  t += " zoom:"+zoom;
 t += ")";
 return t;
}


function getPointByAddress(address)
{
 if (GBrowserIsCompatible())
 {
  var geocoder = new GClientGeocoder();
  if (geocoder)
   geocoder.getLatLng(address,gpbaCallBack);
 }
}


function gmMakeUrl(addr)
{
 var url=document.URL;
 var i = url.indexOf('?');
 if (-1 != i)
  url=url.substr(0,url.indexOf('?'));
 url += "?";
 if (0 < addr.length)
 {
  addr = toUrlChr(addr);
  url += "loc="+addr;
 }
 var latlng = oMap.getCenter();
 url += "\&amp;lat="+latlng.lat();
 url += "\&amp;lng="+latlng.lng();
 url += "\&amp;zm="+oMap.getZoom();
 var map = oMap.getCurrentMapType();
 switch (map)
 {
  case G_HYBRID_MAP:
   map = "H";
   break;
  case G_PHYSICAL_MAP:
   map = "P";
   break;
  case G_NORMAL_MAP:
   map = "R";
   break;
  case G_SATELLITE_MAP:
   map = "S";
   break;
 }
 url += "\&amp;mp="+map;
 var val = getRadioValue("orient");
 if ((null == val) || ("custom" == val))
 {
  val = oMap.getSize();
  url += "\&amp;ht="+(val.height-2);
  url += "\&amp;wd="+(val.width-2);
 }
 else
   url += "\&amp;sz="+fromMapSize(val);
 if (null != g_marker)
   url += "\&amp;mrk="+toMarkerName(g_marker);
 return url;
}


function loadMap(id_map) {

 if (!GBrowserIsCompatible())
  return null;

 var objmap = document.getElementById(id_map);
 oMap = new GMap2(objmap);
 if (oMap)
 {
  var ht = objmap.style.height;
  ht = ht.substr(0,ht.indexOf("p"));
  if (400 < Number(ht))
   oMap.addControl(new GLargeMapControl());
  else
   oMap.addControl(new GSmallMapControl());
  oMap.addMapType(G_PHYSICAL_MAP);
  oMap.addMapType(G_SATELLITE_3D_MAP);
  oMap.addControl(new GHierarchicalMapTypeControl());
  oMap.enableContinuousZoom();
  oMap.enableScrollWheelZoom();
  if (document.getElementById("latlng"))
  {
   GEvent.addListener(oMap, "moveend", function() {document.getElementById("latlng").innerHTML = getLatLngString(oMap.getCenter().lat(),oMap.getCenter().lng(),oMap.getZoom());});
   GEvent.addListener(oMap, "zoomend", function() {document.getElementById("latlng").innerHTML = getLatLngString(oMap.getCenter().lat(),oMap.getCenter().lng(),oMap.getZoom());});
  }
  oMap.getEarthInstance(getEarthInstanceCB);
  return oMap;
 }
 else
  return null;
}

function loadMapByAddress(map,address,opts)
{
 // map       == id of HTML element containing map
 // address   == address string (street, city, st)
 // opts?:
 //  info     == text/HTML to display in info window at marker
 //  maptype  == initial map type (default G_NORMAL_MAP)
 //  mark     == display marker at location
 //  showinfo == show infowindow when marker is created {false || true}
 //  zoom     == initial map zoom level (0-17, default 13)
 if (!oMap)
   loadMap(map);
 if (oMap)
 {
  var gll = new GLatLng(0,0);
  if ("undefined" == typeof(opts.maptype))
   opts.maptype = G_NORMAL_MAP;
  if ("undefined" == typeof(opts.zoom))
   opts.zoom = 13;
  // Google requires map initialized before any other methods used
  oMap.setCenter(gll,opts.zoom,opts.maptype);
  showMapAddress(address,opts);
  return oMap;
 }
 else
  return null;
}


function loadMapByPoint(map,lat,lng,opts)
{
 // map       == id of HTML element containing map
 // lat       == latitude
 // lng       == longitude
 // opts?:
 //  drag     == boolean marker draggable
 //  info     == infowindow and mouseover "tooltip" {string}
 //  maptype  == initial map type (default G_NORMAL_MAP)
 //  mark     == show marker at location
 //  poly     == id of HTML element for display of polyline text information
 //  showinfo == show infowindow when marker is created {false || true}
 //  zoom     == initial map zoom level (0-17, default 13)

 if (!oMap)
   loadMap(map);

 if (oMap)
 {
  if (opts.poly)
  {
   poly_txt = opts.poly;
   g_click = GEvent.addListener(oMap,"click",doPolyline);
  }

  var gll = new GLatLng(lat,lng);
  if (!opts.zoom)
   opts.zoom = 13;
  if (!opts.maptype)
   opts.maptype = G_NORMAL_MAP;
  oMap.setCenter(gll,opts.zoom,opts.maptype);
  if (opts.mark)
  {
   g_marker = opts.mark;
   if (!opts.info)
    opts.info = "";
   var tip = opts.info;
   if (0 < tip.length)
    tip = tip.replace(/<br>/gi,", ");
   else
    tip = gll.toUrlValue();
   if (!opts.drag)
    opts.drag = false;
   map_marker = new GMarker(gll,{draggable: opts.drag, icon: opts.mark, title: tip});
   oMap.addOverlay(map_marker);
   if (0 < opts.info.length)
   {
    map_marker.bindInfoWindowHtml(opts.info+"<br/>("+gll.toUrlValue()+")");
    if (opts.showinfo)
     map_marker.openInfoWindowHtml(opts.info+"<br/>("+gll.toUrlValue()+")");
   }
   else
    GEvent.addListener(map_marker, "dblclick", function() {map_marker.showBlowupMap();});
  }
  return oMap;
 }
 else
  return null;
}


function putMarker(lat,lng,opts)
{
 // place marker at specified location
 // lat       = latitude
 // lng       = longitude
 // opts?:
 //  mark     = marker object
 //  info     = text for info window and tooltip
 //  showinfo = boolean show infow window when marker placed
 //  drag     = boolean marker draggable

 var gll = new GLatLng(lat,lng);
 if (!opts.mark)
  opts.mark = ic_default;
 if (!opts.drag)
  opts.drag = false;
 if (!opts.info)
  opts.info = "";
 var tip = opts.info;
 if (0 < tip.length)
  tip = tip.replace(/<br>/gi,", ");
 else
  tip = "("+gll.toUrlValue()+")";
 map_marker = new GMarker(gll,{draggable: opts.drag, icon: opts.mark, title: tip});
 oMap.addOverlay(map_marker);
 if (0 < opts.info.length)
 {
  map_marker.bindInfoWindowHtml(opts.info+"<br/>("+gll.toUrlValue()+")");
  if (opts.showinfo)
   map_marker.openInfoWindowHtml(opts.info+"<br/>("+gll.toUrlValue()+")");
 }
 g_marker = opts.mark;
}


function resetPolys()
{
 poly_total=0;
 poly_pts=[];
 poly_dists=[];
 poly_marks=[];
 poly_lines=[];
}


function setMapLocation(lat,lng,opts)
{
 // move map center to specified lat,lng point, with marker
 // lat      = latitude
 // lng      = longitude
 // opts?:
 //  drag    = boolean marker draggable
 //  maptype = Google map type
 //  mark    = marker object
 //  zoom    = zoom level

 var gll=new GLatLng(lat,lng);
 if (null != mark_location)
  oMap.removeOverlay(mark_location);
 if (!opts.zoom)
  opts.zoom = oMap.getZoom();
 if (!opts.maptype)
  // G_MAP_TYPE || G_SATELLITE_TYPE || G_HYBRID_TYPE
  opts.maptype = oMap.getCurrentMapType();
 oMap.setCenter(gll,opts.zoom,opts.maptype);
 if (!opts.mark)
  opts.mark = ic_flag;
 g_marker = opts.mark;
 if (!opts.drag)
  opts.drag = true;
 mark_location=new GMarker(gll,{draggable: opts.drag, icon: opts.mark});
 oMap.addOverlay(mark_location);
}


function setMapPoint(lat,lng,opts)
{
 // move map center to specified lat,lng point
 // lat = latitude
 // lng = longitude
 // opts?:
 //  maptype = Google map type
 //  zoom    == zoom level

 var gll=new GLatLng(lat,lng);
 if (!opts.zoom)
  opts.zoom=oMap.getZoom();
 if (!opts.maptype)
  // G_MAP_TYPE || G_SATELLITE_TYPE || G_HYBRID_TYPE
  opts.maptype=oMap.getCurrentMapType();
 oMap.setCenter(gll,opts.zoom,opts.maptype);
}


function setPolyColor(color)
{
 var val="#";
 switch (color)
 {
  case "blue":
   val=val+"0000FF";
   break;
  case "green":
   val=val+"00FF00";
   break;
  case "magenta":
   val=val+"FF00FF";
   break;
  case "purple":
   val=val+"9900FF";
   break;
  case "red":
   val=val+"FF0000";
   break;
  case "white":
   val=val+"FFFFFF";
   break;
  case "yellow":
   val=val+"FFFF00";
   break;
  default:
   val=val+"FF0000";
   break;
 }
 poly_color=val;
}


function showDirections(panel,fromto)
{
 if (oMap)
 {
  var directionsPanel = document.getElementById(panel);
  var directions = new GDirections(oMap, directionsPanel);
  GEvent.addListener(directions,"error",function(){geoStats(directions.getStatus().code)});
  directions.load(fromto);
 }
}

function geoStats(code)
{
 var msg = "";
 switch (code)
 {
 case 200 :
  msg = "200 OK";
  break;
 case 400 :
  msg = "400 Bad Request";
  break;
 case 500 :
  msg = "500 Server Error";
  break;
 
 case 601 :
  msg = "600 Missing Query";
  break;

 case 602 :
  msg = "602 Unknown Address";
  break;
 
 case 603 :
  msg = "603 Unavailable Address";
  break;
 
 case 604 :
  msg = "604 Unknown Directions";
  break;
 
 case 610 :
  msg = "610 Bad Key";
  break;
 
 case 620 :
  msg = "620 Too Many Queries";
  break;

 default :
  msg = code + " [unknown]";
 }
 alert(msg);
}


function showMapAddress(address,opts)
{
 // Google Geocoder function to look up point coordinates for an address string and move map to that view
 // assumes map already initialzed by one of the loadMap... functions

 // address   = location name or address to look up
 // opts?:
 //  drag     = boolean marker draggable
 //  info     = HTML for infowindow and tooltip
 //  mark     = marker object
 //  plcs     = document id of element displaying list of places
 //  showinfo = boolean show infowindow when marker placed
 //  zoom     = zoom level
 
 if (!oMap)
  return;

 if (!opts.zoom)
  opts.zoom = oMap.getZoom();

 if (!opts.info)
   opts.info = address;

 if (!opts.plcs)
   opts.plcs = "";

 if (opts.mark)
 {
  g_marker = opts.mark;
  var tip = opts.info;
  if (0 < tip.length)
   tip = tip.replace(/<br>/gi,", ");
  else
   tip = gll.toUrlValue();
  if (!opts.drag)
   opts.drag = false;
  var markeroptions = {draggable: opts.drag, icon: opts.mark, title: tip};
 }
 
 var maptype = oMap.getCurrentMapType();
 var geocoder = new GClientGeocoder();
 if (geocoder)
 {
  geocoder.getLatLng(address,
   function(point)
   {
    if (!point) {
     alert(address + " not found");
    }
    else
    {
     map_address = address;
     oMap.setCenter(point,opts.zoom,opts.maptype);
     if (opts.mark)
     {
      map_marker = new GMarker(point,markeroptions);
      oMap.addOverlay(map_marker);
      if (0 < opts.info.length)
      {
       map_marker.bindInfoWindowHtml(opts.info+"<br/>("+point.toUrlValue()+")");
       if (opts.showinfo)
        map_marker.openInfoWindowHtml(opts.info+"<br/>("+point.toUrlValue()+")");
      }
      else
       GEvent.addListener(map_marker, "dblclick", function() {map_marker.showBlowupMap();});
     }
     if (0 < opts.plcs.length)
     {
      var places = document.getElementById(opts.plcs);
      if (places)
      {
       var t = places.innerHTML;
       t += '<div style="cursor:pointer; margin-top:4px" onclick="setMapPoint('+point.lat()+','+point.lng()+')">'+address+' ('+point.toUrlValue()+')<\/div>';
       places.innerHTML = t;  
      }
     }
    }
   }
  );
 }
}


function toNameMarker(name)
{
 switch (name.substr(0,1).toLowerCase())
 {
  case "" :
   return null;
  case "b" :
   return ic_blue;
  case "d" :
   return ic_default;
  case "f" :
   return ic_flag;
  case "g" :
   return ic_green;
  case "n" :
   return null;
  case "r" :
   return ic_red;
  case "t" :
   return ic_target;
  case "w" :
   return ic_wp;
  default :
   return ic_default;
 }
}


function toMapSize(size)
{
 switch (size.toLowerCase())
 {
  case "f" :
   return "fitscreen";
  case "fitscreen" :
   return "fitscreen";
  case "g" :
   return "lgsquare";
  case "lgsquare" :
   return "lgsquare";
  case "largesquare" :
   return "lgsquare";
  case "l" :
   return "landscape";
  case "landscape" :
   return "landscape";
  case "p" :
   return "portrait";
  case "s" :
   return "smsquare";
  case "smsquare" :
   return "smsquare";
  case "smallsquare" :
   return "smsquare";
  default :
   return "fitscreen";
 }
}


function toMarkerName(marker)
{
 switch (marker)
 {
  case ic_blue :
   return "B";
  case ic_default :
   return "D";
  case ic_flag :
   return "F";
  case ic_green :
   return "G";
  case ic_red :
   return "R";
  case ic_target :
   return "T";
  case ic_wp :
   return "W";
  case null :
   return "";
  default :
   return "D";
 }
}

// end of file






