function RefLandmarks(data, options, map){
//	this.apply(this,arguments);
	
	options = options || {};
	
	options.ajaxOptions = options.ajaxOptions || {};
	options.afterLoad 	 = options.afterLoad || 0;
	
	// events
	options.mouseout	= options.mouseout 	|| 0;
	options.mouseover	= options.mouseover || 0;
	options.click		= options.click 	|| 0;
	options.dblclick	= options.dblclick 	|| 0;
	
	// custom functions
	options.getTitle = options.getTitle || 0
	options.getIcon	 = options.getIcon  || 0;
	
	// filter functions
	options.filterOpts	= options.filterOpts || {};

	//options.filterOpts.
	this.options  = options;
	
	this.map 	  = map;
	this.data	  = data;
	this.ajax_url = "";

	this.mgr = new MarkerManager(map);
	};
	
RefLandmarks.prototype.loadData = function(){
	var data = this.data;
	
	if(typeof(data) == "string"){
		this.ajax_url 	= data;
		this.data	 	= [];
		this.ajaxLoadData();
	}else{
		if(this.options.afterLoad)
			this.options.afterLoad(this.map, this);
	
		this.addMarkers();
		}
	}
	
// Creation functions
RefLandmarks.prototype.addMarkers = function(){
	var data = this.data;
	
	this.hash	 = [];		
	this.markers = [];	

	var i,item;
	for(i in data){
		item = data[i];
		this.markers.push(this.addMarkerEvents(this.addMarker(item)));
		}
	
	this.mgr.addMarkers(this.markers,  12);  
	this.mgr.refresh();	
	
	if(this.options.filterOpts)
		if(this.options.filterOpts.onInit)
			this.filter();
	}

RefLandmarks.prototype.addMarker = function(item){
	var icon, opts, title, marker;
	item 	= copy_obj(item);

	opts	  = this.getDefaultOptions(item);
	opts.icon = this.getIcon(item);
	
	marker = new LabeledMarker(new GLatLng(item.lat, item.lng), opts);

	marker.item = item;
	
	if(item.id) this.hash[item.id] = marker;
	
	return marker;
	}
	

RefLandmarks.prototype.addMarkerEvents = function(marker){
	var item = copy_obj(marker.item);
	var me = this;
	
	if(this.options.click){
		GEvent.addListener(marker, "click", me.options.click);
		}
		
	if(this.options.dblclick){
		GEvent.addListener(marker, "dblclick", me.options.dblclick);
		}
		
	if(this.options.mouseover){
		GEvent.addListener(marker, "mouseover", me.options.mouseover);
		}
	
	if(this.options.mouseout){
		GEvent.addListener(marker, "mouseout", me.options.mouseout);	
		}
	
	return marker;
	}

RefLandmarks.prototype.ajaxLoadData = function(){
	var me = this;
	$.getJSON(this.ajax_url, this.options.ajaxOptions,
		function(data){
			me.data = data;
			me.loadData();
			}//places loaded
		);
	}

RefLandmarks.prototype.getTitle = function(item){
	var baseTitle = item.name;
	if(!this.options.getTitle){
		return (baseTitle)?baseTitle:"";
		}
		
	return this.options.getTitle(item, baseTitle);
	}

RefLandmarks.prototype.getIcon = function(item){
	var baseIcon = this.getBlankIcon();
	if(!this.options.getIcon){
		return baseIcon;
		}

	return this.options.getIcon(item, baseIcon);
	}

RefLandmarks.prototype.getDefaultOptions = function(item){
	var opts = {
		clickable	: true,
		draggable	: false,
		labelText	: this.getTitle(item),
		labelOffset	: new GSize(-46, -42)
		};
	return opts;
	}


RefLandmarks.prototype.getBlankIcon = function (){
	if(typeof(this.icon) == "undefined" || !this.icon){
		this.icon 			 = new GIcon();
		this.icon.image		 = WWW_ROOT + 'images/map_ref_bg2.png'; 
		this.icon.iconSize 	 = new GSize(140, 55);
		this.icon.iconAnchor = new GPoint(50, 50);
		}
	var k = copy_obj(this.icon);
	return k;
	}

// Filter functions
RefLandmarks.prototype.filter	= function(){
	var filter = this.options.filterOpts;
	if(filter.check){
		this.filterResults = [];
		var data = this.markers;
		var l = data.length,i,m;
		for(i=0;i<l;i++){
			m = data[i];
			if(filter.check(data[i].item))//check is custom function
				this.filterTrue(m,i);
			else
				this.filterFalse(m,i);
			}
		this.filterDone();
		}
	
	}
	
RefLandmarks.prototype.showIDs = function(ids){
	this.hideAll();
	var len = ids.length;
	var id, m;
	var results = [];
	for(i=0;i<len;i++){
		id = ids[i];
		if(typeof(this.hash[id]) != "undefined"){
			m = this.hash[id];
			m.show();
			results.push(m);
			}
		}
	return results;
	}
	
RefLandmarks.prototype.getMarkerByID = function(id){
	return this.hash[id];
	}

RefLandmarks.prototype.filterDone = function(){
	if(this.options.filterOpts.handle)
		return this.options.filterOpts.handle(this.filterResults, this.map);
	
	return this.filterResults;
	}
RefLandmarks.prototype.filterTrue = function(marker, index){
	marker.show();
	this.filterResults.push(marker);
	}

RefLandmarks.prototype.filterFalse = function(marker, index){
	marker.hide();
	}
RefLandmarks.prototype.getHTML = function(default_class){
	var default_id_prefix	= default_class + "_";
	var data = this.data;
	var h, cols = [],j,i,name;
	var len = data.length;
	
	var c = 2;
	for(j=0;j<len;j+=c)
		for(i=0;i<c;i++)
			if(typeof(data[j+i]) != "undefined"){
				var item = data[j+i];
				if(typeof(cols[i]) == "undefined")
					cols[i] = [];
				
				if(typeof(item) == "object"){
					
					if(item.name.length > 24)
						name = item.name.substring(0,24) + "&hellip;";
					else
						name = item.name;
					
					h = reference_icon +" "+"<a href='"+jsv0+"' class='"+default_class+"' id='"+default_id_prefix+item.id+"' title='"+item.name+"'>" + name + "</a>";
					cols[i].push(h);
					}
				}
	
	var mainDiv = $('<div></div>');
	
	for(i=0;i<c;i++){
		if(typeof(cols[i]) != "undefined"){
			var div = $('<div></div>')
			.css({
					'float'	: 'left',
					width	: Math.floor(100/c)+"%"
				});
		
			for(j=0;j<cols[i].length;j++){
				if(typeof(cols[i][j]) != "undefined"){
					var el = $(cols[i][j]);
					div.append(el).append('<br/>');
					}
				}
			mainDiv.append(div);	
			}
		}
	mainDiv.append("<div style='clear:both'></div>");
	
	return mainDiv.html();
	}

RefLandmarks.prototype.toggle = function(){
	if(typeof(this.allHidden) == "undefined")
		this.allHidden = false;
	if(this.allHidden){
		this.allHidden = false;
		return this.showAll();
		}
	this.allHidden = true;
	return this.hideAll();
	}

RefLandmarks.prototype.hideAll	= function(){
	var map = this.map;
	var data = this.markers;
	var l = data.length,i;
	for(i=0;i<l;i++){
		m = this.markers[i];
		map.removeOverlay(m);
		}
	}
RefLandmarks.prototype.showAll	= function(){
	var map = this.map;
	var data = this.markers;
	var l = data.length,i;
	for(i=0;i<l;i++){
		m = this.markers[i];
		map.addOverlay(m);
		}
	}