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