function hbLine (linePoints, zoomSettings, color, visibility)
{
  this.linePoints = linePoints;
  this.overlays = new Array ();
  this.opacity = new Array ();
  this.visibility = visibility ? visibility : "always";
  this.mouseOverHandler = new Array ();
  this.mouseOutHandler = new Array ();

  if (zoomSettings)
  {
    for (var zs = 0; zs < zoomSettings.length; ++zs)
    {
      var width = parseInt (zoomSettings [zs] ["value"] ["width"], 10);

      if (0 < width)
      {
        var useThisColor = color ? color : zoomSettings [zs] ["value"] ["color"];
        this.opacity.push (parseFloat (zoomSettings [zs] ["value"] ["opacity"]));

        var overlay = new Object ();
        overlay ["overlay"]    = new hbPolyline (linePoints, useThisColor, width, this.opacity [this.opacity.length - 1], G_MAP_MAP_PANE);
        overlay ["minZoom"]    = parseInt (zoomSettings [zs] ["minZoom"], 10);
        overlay ["maxZoom"]    = parseInt (zoomSettings [zs] ["maxZoom"], 10);

        this.overlays.push (overlay);
      }
    }
  }
}

hbLine.prototype.destroy = function ()
{
  this.linePoints = undefined;
  this.overlays = undefined;
  this.visibility = undefined;
  
  for (var h = 0; h < this.mouseOverHandler.length; ++h)
  {
    GEvent.removeListener (this.mouseOverHandler [h]);
    delete this.mouseOverHandler [h];
  }

  this.mouseOverHandler = undefined;

  for (var h = 0; h < this.mouseOutHandler.length; ++h)
  {
    GEvent.removeListener (this.mouseOutHandler [h]);
    delete this.mouseOutHandler [h];
  }

  this.mouseOutHandler = undefined;
}

hbLine.prototype.addOverlays = function (overlayMgr)
{
  if ("always" == this.visibility)
  {
    for (var overlayObj = 0; overlayObj < this.overlays.length; ++overlayObj)
    {
      overlayMgr.addOverlay (this.overlays [overlayObj] ["overlay"], this.overlays [overlayObj] ["minZoom"], this.overlays [overlayObj] ["maxZoom"]);
    }
  }
}

hbLine.prototype.addListener = function (marker)
{
/*  if (this.mouseOverHandler [marker])
  {
    GEvent.removeListener (this.mouseOverHandler [marker]);
    delete this.mouseOverHandler [marker];
  }

  if (this.mouseOutHandler [marker])
  {
    GEvent.removeListener (this.mouseOutHandler [marker]);
    delete this.mouseOutHandler [marker];
  }
*/
  var myMarker = marker;
  var myOverlays = this.overlays;
  var myVisibility = this.visibility;
  var myOpacities = this.opacity;

  if ("always" == this.visibility)
  {
    this.mouseOverHandler.push (GEvent.addListener (myMarker, "mouseover", function ()
    {
      var zoom = map.map.getZoom ();

      for (var overlayObj in myOverlays)
      {
        if ((zoom >= myOverlays [overlayObj] ["minZoom"]) && (zoom <= myOverlays [overlayObj] ["maxZoom"]))
        {
          if (myOverlays [overlayObj] ["overlay"].setPane)
          {
            myOverlays [overlayObj] ["overlay"].setPane (G_MAP_MARKER_SHADOW_PANE);
            myOverlays [overlayObj] ["overlay"].setOpacity (1.0);
          }
          break;
        }
      }
    }));

    this.mouseOutHandler.push (GEvent.addListener (myMarker, "mouseout", function ()
    {
      var zoom = map.map.getZoom ();

      for (var overlayObj in myOverlays)
      {
        if ((zoom >= myOverlays [overlayObj] ["minZoom"]) && (zoom <= myOverlays [overlayObj] ["maxZoom"]))
        {
          if (myOverlays [overlayObj] ["overlay"].setPane)
          {
            myOverlays [overlayObj] ["overlay"].setPane (G_MAP_MAP_PANE);
            myOverlays [overlayObj] ["overlay"].setOpacity (myOpacities [overlayObj]);
          }
          break;
        }
      }
    }));
  }
  else if ("onmouseover" == myVisibility)
  {
    this.mouseOverHandler.push (GEvent.addListener (myMarker, "mouseover", function ()
    {
      var zoom = map.map.getZoom ();
      var myOverlay = null;

      for (var overlayObj in myOverlays)
      {
        if ((zoom >= myOverlays [overlayObj] ["minZoom"]) && (zoom <= myOverlays [overlayObj] ["maxZoom"]))
        {
          myOverlay = myOverlays [overlayObj] ["overlay"];
          break;
        }
      }

      if (null != myOverlay)
      {
        map.map.addOverlay (myOverlay);
      }
    }));

    this.mouseOutHandler.push (GEvent.addListener (myMarker, "mouseout", function ()
    {
      var zoom = map.map.getZoom ();
      var myOverlay = null;

      for (var overlayObj in myOverlays)
      {
        if ((zoom >= myOverlays [overlayObj] ["minZoom"]) && (zoom <= myOverlays [overlayObj] ["maxZoom"]))
        {
          myOverlay = myOverlays [overlayObj] ["overlay"];
          break;
        }
      }

      if (null != myOverlay)
      {
        map.map.removeOverlay (myOverlay);
      }
    }));
  }
}
