function isInList(list, item){
	var list_a = list.split(",");
	for(var i=0; i<list_a.length; i++){
		if(list_a[i]==item) return true;
	}
	return false;
}

var mrkmgr = null;
function MarkerManager(p_map){
  mrkmgr = this;
  this.map = p_map;
  this.pending_markers = new Array();

  if(typeof map.setMarkersArray != "function")
  {
    GMarker.prototype.isMarker = true;

    GMap2.prototype.setMarkersArray = function()
    {
      this.markers = new Array();

      var addOverlay = this.addOverlay;
      this.addOverlay = function(){
        if(arguments[0] && arguments[0].isMarker)
        {
          this.markers.push(arguments[0]);
        }
        addOverlay.apply(this, arguments);
      }

      var removeOverlay = this.removeOverlay;
      this.removeOverlay = function(){
        if(arguments[0] && arguments[0].isMarker)
        {
          for(var i=0;i<this.markers.length; i++)
          {
            if(this.markers[i]==arguments[0])
            {
              this.markers.splice(i, 1);
              break;
            }
          }
        }
        removeOverlay.apply(this, arguments);
      }

      var clearOverlays = this.clearOverlays;
      this.clearOverlays = function(){
        this.markers = new Array();
        clearOverlays.apply(this, arguments);
      }

      this.isMarkerIdExist = function(marker_id){
        for(var i=0;i<this.markers.length; i++)
        {
          if(this.markers[i].marker_id && this.markers[i].marker_id==marker_id) return true;
        }
        return false;
      }

      this.getMarkerById = function(marker_id){
        for(var i=0;i<this.markers.length; i++)
        {
          if(this.markers[i].marker_id && this.markers[i].marker_id==marker_id) return this.markers[i];
        }
        return null;
      }

      this.getMarkerByLatLng = function(latlng){
        for(var i=0;i<this.markers.length; i++)
        {
          if(this.markers[i].marker_id)
          {
            var m_latlng = this.markers[i].getLatLng();
            if(Math.abs(m_latlng.lat()-latlng.lat())<0.0000001 && Math.abs(m_latlng.lng()-latlng.lng())<0.0000001) return this.markers[i];
          }
        }
        return null;
      }
    }

    this.map.setMarkersArray();
  }
}

MarkerManager.prototype.addMarker = function(marker){
  this.pending_markers.push(marker);
}

MarkerManager.prototype.inBound = function(marker){
  var map = this.map;
  var bounds = map.getBounds();
  var southWest = bounds.getSouthWest();
  var northEast = bounds.getNorthEast();
  var lngSpan = northEast.lng() - southWest.lng();
  var latSpan = northEast.lat() - southWest.lat();

  var latlng = marker.getLatLng();
  return (latlng.lat()>southWest.lat() && latlng.lat()<southWest.lat()+latSpan &&
          latlng.lng()>southWest.lng() && latlng.lng()<southWest.lng()+lngSpan);
}

MarkerManager.prototype.refresh = function(){
  var map = this.map;
  var marker;

  if(marker=this.pending_markers.pop())
  {
    if(document.forms['myform'] && document.forms['myform'].chkMarkerTypes){
      var chkMarkerTypes = document.forms['myform'].chkMarkerTypes;
      for(var i=0;i<chkMarkerTypes.length;i++){
        if(marker.type_id && 
           (marker.type_id==chkMarkerTypes[i].value || (marker.ext_type_id && isInList(marker.ext_type_id, chkMarkerTypes[i].value))) && 
           chkMarkerTypes[i].checked){
           
          if(this.inBound(marker)) map.addOverlay(marker);
          else this.pending_markers.push(marker);
          break;
        }
      }
    }else{
      if(this.inBound(marker)) map.addOverlay(marker);
      else this.pending_markers.push(marker);
    }
    window.setTimeout("mrkmgr.refresh()", 200);
  }
}
