/*
 PdMarker

 Purpose: extends Google Map API GMap and GMarker (hover effects, image swapping, moving)
 Details: http://www.pixeldevelopment.com/pdmarker.asp
 Updated: [see getPdMarkerRevisionInfo]
 Author:  Peter Jones
 Notes:   Relies on undocumented features of the Google Map API which may change.
      Based on my own PJToolTip and ideas from GxMarker, TLabel and the Google Maps API forum.

 Contact http://www.pixeldevelopment.com for your custom Google Map needs
*/

function getPdMarkerRevisionInfo() {
var cr = "<br/>";
var s =
"2.03  10/02/07 - fixed zindex bug (setMarkerZIndex, topMarkerZIndex)" + cr + 
"2.02  05/22/07 - fixed minor issues (blink, initDetailWin)" + cr + 
"2.01  04/29/07 - improved left hand side detail window positioning, uses new Google setImage &amp; show " + 
"routines for added reliability, fixed zoomToMarkers for single marker case." + cr +
"2.00  04/22/07 - fix for setImage when using Explorer 7." + cr +
"1.99f 07/09/06 - zoomToMarkers now takes into account markers not displayed." + cr +
"1.99e 05/05/06 - fixed zoomed tooltip positioning &amp; non-centered marker graphics." + cr +
"1.99d 05/01/06 - fixed display &amp; blink when defining .transparent." + cr +
"1.99c 04/25/06 - added display and blink." + cr +
"1.99b 04/21/06 - added 'Powered By' version &amp; marker count display." + cr +
"1.99a 04/18/06 - revised for Google Maps API Version 2, GMap2 required." + cr +
"0.99c 01/30/06 - added setDetailWinClass and resetDetailWinClass." + cr +
"0.99a 10/12/05 - now handles maps in containers with undefined widths" + cr +
"define a div with id 'pdmarkerwork' to reduce flicker" + cr +
"0.99  10/03/05 - added setImageEnabled, allowLeftTooltips (global)" + cr +
"0.98  09/30/05 - fixed zoomToMarkers" + cr +
"0.97  09/24/05 - added setHoverImage, setShowDetailOnClick, setDetailWinHTML, showDetailWin, closeDetailWin" + cr +
"0.96  09/22/05 - added setTooltipHiding, getTooltipHiding" + cr +
"0.95  09/20/05 - handle zoom for lingering tooltips mouseOutEnabled(false) " +
       "disables setImage and restoreImage" + cr +
"0.94  09/20/05 - added setTooltipClass and resetTooltipClass" + cr +
"0.93  09/19/05 - added slopPercentage [optional] parameter to zoomToMarkers" + cr +
"0.92  09/18/05 - added getMouseOutEnabled, setMouseOutEnabled" + cr +
"0.91  09/17/05 - fixed setOpacity";
return s;
}

function getPdMarkerVersion() {
  return getPdMarkerRevisionInfo().substring(0,15);
}

function getPdMarkerShortVersion() {
  return getPdMarkerRevisionInfo().substring(0,5);
}

var APIkey = "";

function getGoogleMapsVersion() {
  var i, a, b, c;
  var v = "unknown";

  if (document.getElementsByTagName)
    for(i=0; (a = document.getElementsByTagName("script")[i]); i++)
      if(a.getAttribute("src"))
      {
        b = a.getAttribute("src");
        c = b.indexOf("/mapfiles/maps"); // /mapfiles/maps
        d = b.indexOf("http://maps.google.com/maps?file=api");
        e = b.indexOf("key=");
        f = b.indexOf("/mapfiles/");
        g = b.indexOf("/maps");
        if (c > 0)
          v = parseFloat(b.substring(c+14));
        else if (f > 0)
          v = "2." + b.substring(f+10,g);
        if (d >= 0)
          if (e > 0)
            APIkey = b.substring(e+4);
      }
  return v;
}

function latLongToPixel(map,coord,zoom) {
    return map.fromLatLngToDivPixel(coord);
}


var pdMarkerExtList = [];

function PdMarkerAddToExtList(marker) {
  pdMarkerExtList.push(marker);
}

function PdMarkerRemoveFromExtList(id) {
  for (var i=0; i<pdMarkerExtList.length; i++)
    if (pdMarkerExtList[i].internalId == id)
      pdMarkerExtList.splice(i,1);
}

function PdMarkerFindInExtList(id) {
  for (var i=0; i<pdMarkerExtList.length; i++)
    if (pdMarkerExtList[i].internalId == id)
      return pdMarkerExtList[i];
}

function PdMarkerClose(id) {
  for (var i=0; i<pdMarkerExtList.length; i++)
    if (pdMarkerExtList[i].internalId == id)
      {
        pdMarkerExtList[i].closeDetailWin();
        pdMarkerExtList.splice(i,1);
      }
}

function PdMarkerBlinkOnOff(id) {
  var marker = PdMarkerFindInExtList(id);
  if (marker)
  {
    if (!marker.blinking) return;
    marker.blinkOn = !marker.blinkOn;
    marker.display(marker.blinkOn);
    setTimeout("PdMarkerBlinkOnOff(" + marker.getId() + ");", marker.blinkSpeed);
  }
}

// GMap extension for walking through PdMarker list
// Note: some overlays are not markers, some may not be PdMarkers

function isPdMarker(a) {
  if (a.isMarker)
    return true;    
  return false;
}

function getPdMarkerCount(a) {
  if (a.pdMarkers)
    return a.pdMarkers.length;
  return 0;
}

GMap2.prototype.getMarkerById = function(id) {
  var count = getPdMarkerCount(this);
  for (var i = 0; i < count; i++)
    if (isPdMarker(this.pdMarkers[i]))
      if (this.pdMarkers[i].internalId == id)
      {
        this.cursor = i;
        return this.pdMarkers[i];
      }
  return null;
}

GMap2.prototype.getFirstMarker = function() {
  var count = getPdMarkerCount(this);
  for (var i = 0; i < count; i++)
    if (isPdMarker(this.pdMarkers[i]))
    {
      this.cursor = i;
      return this.pdMarkers[i];
    }
  return null;
}

GMap2.prototype.getNextMarker = function() {
  var count = getPdMarkerCount(this);
  if (count > 0)
    if (this.cursor >= 0)
      for (var i = this.cursor+1; i < count; i++)
        if (isPdMarker(this.pdMarkers[i]))
        {
          this.cursor = i;
          return this.pdMarkers[i];
        }
  return null;
}

GMap2.prototype.getNthMarker = function(nTh) {
  var count = getPdMarkerCount(this);
  for (var i = 0; i < count; i++)
    if (isPdMarker(this.pdMarkers[i]))
    {
      nTh--;
      if (nTh == 0)
      {
        this.cursor = i;
        return this.pdMarkers[i];
      }
    }
  return null;
}

GMap2.prototype.getMarkerCount = function() {
  return getPdMarkerCount(this);
}

GMap2.prototype.boxMap = function(center, span) {
  var spec = this.spec;
  var zoom = spec.getLowestZoomLevel(center, span, this.viewSize);
  this.centerAndZoom(new GPoint(center.x, center.y), zoom);
}

GMap2.prototype.zoomToMarkers = function(slopPercentage, heightOffsetPct) {
  var count = 0;
  var thePoint, x, y, minX, maxX, minY, maxY, span;
  var marker = this.getFirstMarker();
  while (marker != null)
  {
    if (!marker.isHidden())
    {
      thePoint = marker.getPoint();
      // x = thePoint.x; y = thePoint.y;
      x = thePoint.lat(); y = thePoint.lng();
      if (count == 0)
      {
        minX = x; maxX = x; minY = y; maxY = y;
      }
      else
      {
        if (x < minX) minX = x;
        if (x > maxX) maxX = x;
        if (y < minY) minY = y;
        if (y > maxY) maxY = y;
      }
      count++;
    }
    marker = this.getNextMarker();
  }
  if (count == 1)
    this.setCenter(new GLatLng(x,y), this.getZoom());
  else if (count > 1)
  {
    var center = new GLatLng((minX + maxX) / 2, (minY + maxY) / 2)
    span = new GSize(Math.abs(maxX - minX), Math.abs(maxY - minY));
    slopWid = 0;
    slopHgt = 0;
    if (typeof slopPercentage != "undefined")
    {
      slopWid = span.width * slopPercentage / 200;
      slopHgt = span.height * slopPercentage / 200;
      span.width  *= 1 + slopPercentage / 100;
      span.height *= 1 + slopPercentage / 100;
    }
    deltaHgt = 0;
    if (typeof heightOffsetPct != "undefined")
    {
      deltaHgt = span.height * heightOffsetPct / 100;
      center = new GLatLng(center.lat() + deltaHgt, center.lng());
    }
    // needs slop
    var bounds = new GLatLngBounds(new GLatLng(minX-slopHgt, minY-slopWid), new GLatLng(maxX+slopHgt, maxY+slopWid)); // sw, ne
    var zoom = this.getBoundsZoomLevel(bounds);
    this.setCenter(center, zoom);
  }
}

function shorten(x) {
  var factor = 1000000
  return Math.round(x * factor) / factor;
}

function poweredByClick(map) {
  var center = map.getCenter();
  var span = map.getBounds().toSpan();
  var zoom = map.getZoom();
  var url = "http://maps.google.com/maps?ll=" + center.lat() + "," + center.lng() + "&spn=" + shorten(span.lat()) + "," + shorten(span.lng()) + "&z=" + zoom + "&key=" + APIkey;
  document.location = url;
}

function poweredByMouseover(map) {
  var marker = map.getFirstMarker();
  var bounds = map.getBounds();
  var visibleCount = 0;
  var totalCount = 0;
  while (marker != null) {
    if (!marker.isHidden())
    {
      var point = marker.getPoint();
      if (bounds.contains(point))
        visibleCount++;
      totalCount = totalCount + 1;
    }
    marker = map.getNextMarker();
  }
  var title = map.poweredByTitle + " (" + visibleCount + " markers of " + totalCount + " visible)"
  map.poweredByObj.setAttribute("title",title);
  map.poweredByObj.setAttribute("alt",title);
}

function getPoweredBy(map) {
  try {
    var tooltip = "GMap " + getGoogleMapsVersion() + " & PdMarker " + getPdMarkerShortVersion();
    map.poweredByTitle = tooltip;
    var b = document.createElement("img");
    b.setAttribute("src","http://www.google.com/intl/en_ALL/mapfiles/transparent.gif");
    b.setAttribute("width",62);
    b.setAttribute("alt",tooltip);
    b.setAttribute("title",tooltip);
    b.setAttribute("height",30);
    b.style.display = "block";
    b.style.position = "absolute";
    b.style.left    = "2px";
    b.style.bottom  = "0px";
    b.style.width   = "62px";
    b.style.height  = "30px";
    b.style.cursor  = "pointer";
    b.style.zIndex  = 600001;
    b.onclick = function() { poweredByClick(map); };
    b.onmouseover = function() { poweredByMouseover(map); };
        map.getPane(G_MAP_FLOAT_PANE).parentNode.parentNode.appendChild(b);
    return b;
  }
  catch (e) {
  }
  return true;
}

function setPoweredBy(map) {
  if (!map.poweredByObj) {
    getGoogleMapsVersion(); // possibly reduce IE memory leak, unchecked
    map.poweredByObj = getPoweredBy(map);
  }
}


// PdMarker code


function PdMarkerNamespace() {

var userAgent = navigator.userAgent.toLowerCase();
var n4=(document.layers);
var n6=(document.getElementById&&!document.all);
var ie=(document.all);
var o6=(userAgent.indexOf("opera") != -1);
var safari=(userAgent.indexOf("safari") != -1);
var msie  = (userAgent.indexOf("msie") != -1) && (userAgent.indexOf("opera") == -1);
var msiePre7 = false;
if (msie)
  msiePre7 = userAgent.substr(userAgent.indexOf("msie")+5,2) < 7;   

var nextMarkerId = 10;
var permitLeft = true;

var icon = new GIcon();
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(9, 34);
icon.infoWindowAnchor = new GPoint(9, 2);
icon.infoShadowAnchor = new GPoint(18, 25);
icon.image = "http://www.google.com/mapfiles/marker.png";

// Globals - careful of multiple maps

function PdMarker(a, b, tooltip) {
  this.inheritFrom = GMarker;
  if (typeof b == "undefined") // pmj oct 23, 2005
    b = icon;
  this.inheritFrom(a,b);
  if (typeof tooltip != "undefined")
    this.pendingTitle = tooltip;
  else
    this.pendingTitle = "";
  if (typeof b != "undefined")
    this.oldImagePath = b.image;
  else
    this.oldImagePath = "http://www.google.com/mapfiles/marker.png";
  this.internalId = nextMarkerId;
  nextMarkerId += 1;
  this.zIndexSaved = false;
  this.pendingCursor = "";
  this.percentOpacity = 70;
  this.mouseOutEnabled = true;
  this.setImageOn = true;
  this.hidingEnabled = true;
  this.showDetailOnClick = true;
  this.detailOpen = false;
  this.userData = "";
  this.displayed = true;
}

// PdMarker.prototype = new GMarker;
PdMarker.prototype = new GMarker(new GLatLng(1, 1));


function addMarkerToMapList(map,marker) {
  try {
    if (map.pdMarkers.length) ;
  }
  catch(e) {
    map.pdMarkers = new Array();
  }
  // add to list
  map.pdMarkers.push(marker);
}

function removeMarkerFromMapList(map,marker) {
  var id = marker.internalId;
  for (var i=0; i<map.pdMarkers.length; i++)
    if (map.pdMarkers[i].internalId == id)
    {
      map.pdMarkers.splice(i,1);
      return;
    }
}

PdMarker.prototype.initialize = function(a) {
  if (typeof a == "GMap")
  {
    GLog.write("PdMarker requires GMap2");
    return;
  }
  addMarkerToMapList(a,this);
  try
  {
    GMarker.prototype.initialize.call(this, a);
    this.isMarker = true;
    if (this.pendingTitle.length > 0)
      this.setTitle(this.pendingTitle);
    if (this.pendingCursor.length > 0)
      this.setCursor(this.pendingCursor);

    this.map = a;
    setPoweredBy(a);
    
    GEvent.bindDom(this, "mouseover", this, this.onMouseOver);
    GEvent.bindDom(this, "mouseout",  this, this.onMouseOut);
    GEvent.bindDom(this, "click",  this, this.onClick);
    GEvent.bind(this.map, "zoomend", this, this.reZoom);
  }
  catch(e) {
    alert("PdMarker initialize error: " + e);
  }
}

PdMarker.prototype.allowLeftTooltips = function(a){
  permitLeft = a;
}

PdMarker.prototype.reZoom = function(){
  var didSet = false;
  if (this.tooltipObject)
    if (this.tooltipObject.style.display == "block")
    {
      setTTPosition(this);
      didSet = true;
    }
  if (this.detailObject)
  {
    if (!didSet)
      setTTPosition(this);
    setDetailPosition(this);
  }
}

PdMarker.prototype.setId = function(id) {
  this.internalId = id;
}

PdMarker.prototype.getId = function() {
  return this.internalId;
}

PdMarker.prototype.setName = function(a) {
  this.name = a;
}

PdMarker.prototype.getName = function() {
  if (this.name)
    return this.name;
  else
    return null;
}

PdMarker.prototype.setUserData = function(a) {
  this.userData = a;
}

PdMarker.prototype.getUserData = function() {
  if (this.userData)
    return this.userData;
  else
//    return null;
    return "";
}

PdMarker.prototype.setUserData2 = function(a) {
  this.userData2 = a;
}

PdMarker.prototype.getUserData2 = function() {
  if (this.userData2)
    return this.userData2;
  else
    return "";
}

PdMarker.prototype.setImageEnabled = function(a) {
  this.setImageOn = a;
}

var PdMIN = "";
var PdMIA = "";

function PdCompPdMIN(marker) {
  if (PdMIN.length == 0)
    for (var i in marker)
      if (eval("typeof marker." + i) == "object")
        try {
          if (eval("typeof marker." + i + "[0].src") != "undefined")
          {
            PdMIA = "this." + i;
            PdMIN = PdMIA + "[0]";
          }
        }
        catch (e) {}
}

PdMarker.prototype.setImageOld = function(a) {
  //    GMarker.prototype.initialize.call(this, a);
  var msFilter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + a + '")';
  if (this.mouseOutEnabled && this.setImageOn)
  {
    PdCompPdMIN(this);
    try {
      if (this.oldImagePath.length == 0)
        eval("this.oldImagePath = " + PdMIN + ".src");
      if (msie && msiePre7)
        eval(PdMIN + ".style.filter = msFilter");
      else
        eval(PdMIN + ".src = a");
    }
    catch (e) {}
  }
}

PdMarker.prototype.setImage = function(a) {
  if (this.mouseOutEnabled && this.setImageOn)
    GMarker.prototype.setImage.call(this, a);
}

PdMarker.prototype.restoreImage = function() {
  if (this.mouseOutEnabled && this.setImageOn && this.oldImagePath.length > 0)
    this.setImage(this.oldImagePath);
}

PdMarker.prototype.display = function(a) {
  if (a)
    this.show();
  else
    this.hide();
}

PdMarker.prototype.blink = function(a,b) {
  if (a)
  {
    this.blinkOn = true;
    this.blinkSpeed = b;
    if (!this.blinking)
    {
      this.blinking = a;
      PdMarkerAddToExtList(this);
      PdMarkerBlinkOnOff(this.getId());
    }
  }
  else
  {
    this.blinking = a;
    this.display(true);
    PdMarkerRemoveFromExtList(this);
  }
}

PdMarker.prototype.setIcon = function(a) {
  this.remove();
  this.icon = a;
  this.initialize(this.map);
  this.redraw(true); 
}

PdMarker.prototype.setMarkerZIndex = function(a) {
  PdCompPdMIN(this);
  if (!this.zIndexSaved)
  {
    this.zIndexSaved = true;
    this.oldZIndex = eval(PdMIN + ".style.zIndex");
  }
  eval(PdMIN + ".style.zIndex = a")
  this.redraw(true);
}

PdMarker.prototype.topMarkerZIndex = function() {
  this.setMarkerZIndex (600000);
}

PdMarker.prototype.restoreMarkerZIndex = function() {
  PdCompPdMIN(this);
  if (this.zIndexSaved)
  {
    this.zIndexSaved = false;
    eval(PdMIN + ".style.zIndex = this.oldZIndex")
    this.redraw(true);
  }
}

PdMarker.prototype.onInfoWindowOpen = function() {
  this.hideTooltip();
  GMarker.prototype.onInfoWindowOpen.call(this);
}

PdMarker.prototype.setHoverImage = function(a) {
  this.hoverImage = a;
}

var inMouseOver = false;

PdMarker.prototype.onMouseOver = function() {
  if (inMouseOver)
    return;
  inMouseOver = true;
  if (this.hoverImage)
    this.setImage(this.hoverImage);
  if (!this.detailOpen)
    this.showTooltip();
  inMouseOver = false;
}

PdMarker.prototype.onMouseOut = function() {
  if (this.hoverImage)
    this.restoreImage();
  if (!this.detailOpen)
    if (this.mouseOutEnabled)
      this.hideTooltip();
}

PdMarker.prototype.setMouseOutEnabled = function(a) {
  this.mouseOutEnabled = a;
}

PdMarker.prototype.getMouseOutEnabled = function() {
  return this.mouseOutEnabled;
}

PdMarker.prototype.setTooltipHiding = function(a) {
  this.hidingEnabled = a;
}

PdMarker.prototype.getTooltipHiding = function() {
  return this.hidingEnabled;
}

PdMarker.prototype.setTitle = function(a) {
  this.tooltipText = "";
  PdCompPdMIN(this);
  try {
    eval(PdMIN + ".title = a");
  }
  catch (e) {
    this.pendingTitle = a;
  }
}

PdMarker.prototype.setCursor = function(a) {
  PdCompPdMIN(this);
  try {
    eval(PdMIN + ".style.cursor = a");
  }
  catch (e) {
    this.pendingCursor = a;
  }
}

PdMarker.prototype.setTooltipClass = function(a) {
  this.pendingClassName = a;
  if (this.tooltipObject)
  {
    var showing = (this.tooltipObject.style.display != "none");
    this.deleteObjects();
    if (this.tooltipRaw)
      this.setTooltipNoResize(this.tooltipRaw);
    if (showing)
      this.showTooltip();

  }
  else
    if (this.tooltipRaw)
      this.setTooltipNoResize(this.tooltipRaw);
}

PdMarker.prototype.resetTooltipClass = function() {
  this.setTooltipClass("markerTooltip");
}

PdMarker.prototype.getTooltip = function() {
  try {
    return this.tooltipRaw;
  }
  catch (e)
  {
    return "";
  }
}

PdMarker.prototype.setTooltipNoResize = function(a) {
  this.setTitle("");
  var ttClass = "markerTooltip";
  if (this.pendingClassName)
    ttClass = this.pendingClassName;
  this.tooltipRaw = a;
  this.tooltipText = "<div class='" + ttClass + "'>" + a + "</div>";
  if (this.tooltipObject)
    this.tooltipObject.innerHTML = this.tooltipText;
}

PdMarker.prototype.setTooltip = function(a) {
  this.setTooltipNoResize(a);
  this.deleteObjects();
}

PdMarker.prototype.showTooltip = function() {
  if (this.tooltipText)
  {
    if (!this.tooltipObject)
      initTooltip(this);
    setTTPosition(this);
    this.tooltipObject.style.display = "block";
  }
}

PdMarker.prototype.hideTooltip = function() {
  if (this.tooltipObject)
    if (this.hidingEnabled)
      this.tooltipObject.style.display = "none";
}

PdMarker.prototype.onClick = function(a) {
  if (this.showDetailOnClick && this.detailWinHTML)
    this.showDetailWin();
}

PdMarker.prototype.setShowDetailOnClick = function(a) {
  this.showDetailOnClick = a;
}

PdMarker.prototype.setDetailWinHTML = function(a) {
  this.detailWinHTML = a;
}




PdMarker.prototype.setDetailWinClass = function(a) {
  this.pendingDetailClassName = a;
}

PdMarker.prototype.resetDetailWinClass = function() {
  this.setDetailWinClass("markerDetail");
}



PdMarker.prototype.showDetailWin = function() {
  if (this.detailOpen)
  {
    this.closeDetailWin();
    return;
  }
  this.hideTooltip();
  this.setMouseOutEnabled(false);

  var winClass = "markerDetail";
  if (this.pendingWinClassName)
    winClass = this.pendingWinClassName;

  var html = "<table><tr><td>" + this.detailWinHTML + "<\/td><td valign='top'><a class='markerDetailClose' href='javascript:PdMarkerClose(" + this.internalId + ")'><img src='http://www.google.com/mapfiles/close.gif' width='14' height='13'><\/a><\/td><\/tr><\/table>";
  html = "<div class='" + winClass + "'>" + html + "</div>";
  this.detailOpen = true;
  if (!this.tooltipText)
  {
    this.ttWidth = 150;
    this.ttHeight = 30;
    setTTPosition(this); // compute ttTop, ttLeft
  }
  initDetailWin(this, this.ttTop, this.ttLeft, html);
  PdMarkerAddToExtList(this);
}


PdMarker.prototype.closeDetailWin = function() {
  this.detailOpen = false;
  if (this.detailObject)
  {
    this.setMouseOutEnabled(true);
    this.onMouseOut();
    // GEvent.trigger(this, "mouseout");
        this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.detailObject);
    this.detailObject = null;
  }
}

PdMarker.prototype.deleteObjects = function() {
  if (this.tooltipObject)
  {
        this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.tooltipObject);
    this.tooltipObject = null;
  }
  if (this.detailObject)
  {
    this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.detailObject);
    this.detailObject = null;
  }
}

PdMarker.prototype.remove = function(a) {
  removeMarkerFromMapList(this.map, this);
  PdMarkerRemoveFromExtList(this.getId());
  GMarker.prototype.remove.call(this);
  this.deleteObjects();
}

PdMarker.prototype.setOpacity = function(b) {
  if (b < 0)
    b=0;
  if (b >= 100)
    b=100;
  var c = b / 100;
  this.percentOpacity = b;
  var d = document.getElementById(this.objId);
  if (d)
  {
    if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+b+')';}
    if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
    if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
    if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}
  }
}

PdMarker.prototype.setOpacityNew = function(b) {
  setObjOpacity(this.objId);
  this.percentOpacity = b;
}

// ***** Private routines *****

function setObjOpacity(objId, b) {
  if (b < 0)
    b=0;
  if (b >= 100)
    b=100;
  var c = b / 100;
  var d = document.getElementById(objId);
  if (d)
  {
    if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+b+')';}
    if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
    if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
    if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}
  }
}

function idToElemId(id) {
  return "ttobj" + id;
}

function initTooltip(theObj) {
  theObj.objId = idToElemId(theObj.internalId);
  theObj.anchorLatLng = theObj.point;

  var b = document.createElement('span');
  theObj.tooltipObject = b;
  b.setAttribute('id',theObj.objId);
  b.innerHTML = theObj.tooltipText;

  // append to body for size calculations
  var c = document.body;
  var d = document.getElementById("pdmarkerwork");
  if (d)
    c = d;
  c.appendChild(b);
  b.style.position = "absolute";
  b.style.bottom = "5px";
  b.style.left = "5px";
  b.style.zIndex = 1;
  if (theObj.percentOpacity)
    theObj.setOpacity(theObj.percentOpacity);
  var tempObj = document.getElementById(theObj.objId);
  theObj.ttWidth  = tempObj.offsetWidth;
  theObj.ttHeight = tempObj.offsetHeight;
  c.removeChild(b);

  b.style.zIndex = 600000;
  b.style.bottom = "";
  b.style.left = "";
  theObj.map.getPane(G_MAP_FLOAT_PANE).appendChild(b);
}

function initDetailWin(theObj, top, left, html) {
  theObj.detailId = "detail" + theObj.internalId;
  var b = document.createElement('span');
  theObj.detailObject = b;
  b.setAttribute('id',theObj.detailId);
  b.innerHTML = html;
  b.style.display = "block";
  b.style.position = "absolute";
  b.style.top  = top + "px";
  if (theObj.rightSide)
    b.style.left = left + "px";
  else
    b.style.right = -left + "px";
  b.style.zIndex = 600001;
  theObj.map.getPane(G_MAP_FLOAT_PANE).appendChild(b);
}

function setTTPosition(theObj) {
  var gap = 5;
  var map = theObj.map;
  var pt  = theObj.getPoint();
  var ttPos = latLongToPixel(map, pt, map.getZoom());
  var theIcon = theObj.getIcon();
  
  ttPos.y -= Math.floor(theIcon.iconAnchor.y/2);

  var rightSide = true;
  var bounds = map.getBounds();
  var boundsSpan  = bounds.toSpan();
  var longSpan = boundsSpan.lng();
  var mapWidth = map.getSize().width;

  var tooltipWidthInDeg = (theObj.ttWidth + theIcon.iconSize.width + 6) / mapWidth * longSpan;
  if (pt.lng() + tooltipWidthInDeg > bounds.getNorthEast().lng() && permitLeft)
    rightSide = false;
  ttPos.y -= Math.floor(theObj.ttHeight/2);
  delta = (theIcon.iconSize.width - theIcon.iconAnchor.x) + gap;
  if (rightSide)
    ttPos.x += delta;
  else
    ttPos.x -= delta
  theObj.rightSide = rightSide;
  theObj.ttLeft = ttPos.x;
  theObj.ttTop  = ttPos.y;
  if (theObj.tooltipObject)
  {
    if (rightSide) {
      theObj.tooltipObject.style.left = ttPos.x + "px";
      theObj.tooltipObject.style.right = null;
    }
    else {
      theObj.tooltipObject.style.left = null;
      theObj.tooltipObject.style.right = -ttPos.x + "px";
    }
    theObj.tooltipObject.style.top  = ttPos.y + "px";
  }
}

function makeInterface(a) {
  var b = a || window;
  b.PdMarker = PdMarker;
}

makeInterface();
}


PdMarkerNamespace();
