/*
 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();
