function Landmarks(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;
	
	// Lazy load 
	this.lazy_load = options.lazy_load || 0;
	this.lazy_ajax = options.lazy_ajax || 0;
	
	this.map 	  = map;
	this.data	  = data;
	this.ajax_url = "";

	this.mgr = new MarkerManager(map);
	
	// Init
	this.hash	 = [];		
	this.markers = [];	
	};
	
Landmarks.prototype.loadData = function(){
	var data = this.data;
	
	if(!data) return false;
	if(typeof(data) == "string"){
		this.ajax_url 	= data;
		this.ajaxLoadData();
	}else{
		this.addMarkers();
		if(this.options.afterLoad)
			this.options.afterLoad(this.map);
		}
	}
	
// Creation functions
Landmarks.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();
	
	}
Landmarks.prototype.secvAppendMarkers = function(data){
	this.markers = [];
	this.data	 = [];
	
	var i,item;
	for(i in data){
		item = data[i];
		this.data.push(item);
		this.markers.push(this.addMarkerEvents(this.addMarker(item)));
		}
	
	this.mgr.clearMarkers()
	this.mgr.addMarkers(this.markers,  12);  
	this.mgr.refresh();
	}
	
Landmarks.prototype.addMarker = function(item){
	var icon, title, marker;
	item 	= copy_obj(item);

	icon	= this.getIcon(item);
	title	= this.getTitle(item);

	marker = new GMarker(new GLatLng(item.lat, item.lng), {icon:icon, title:title});

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

Landmarks.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;
	}

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

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

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

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

Landmarks.prototype.getBlankIcon = function (){
	if(typeof(this.smallIcon) == "undefined" || !this.smallIcon){
		this.smallIcon = new GIcon(G_DEFAULT_ICON);
		this.smallIcon.image  = ROOT + "images/markers/default_small_marker.png";
		this.smallIcon.shadow = ROOT + "images/markers/default_mini_marker_shadow.png";
		this.smallIcon.iconSize = new GSize(13, 20);
		
		this.smallIcon.shadowSize = new GSize(24, 22);
		this.smallIcon.iconAnchor = new GPoint(6, 19);
		this.smallIcon.infoWindowAnchor = new GPoint(10, 1);
		}
	var k = copy_obj(this.smallIcon);
	return k;
	}

// Filter functions
Landmarks.prototype.filter	= function(){
	var filter = this.options.filterOpts;
	var data = this.markers;
	if(filter.check){
		this.filterResults = [];
		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();
		}
	
	}
	
Landmarks.prototype.showIDs = function(ids, notFound){
	if(typeof(notFound) == "undefined") notFound = 0; //notFound function deals with items that were not in the hash table
	
	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);
			}else{
				if(notFound)
					notFound(id);
				}
		}
	return results;
	}
	
Landmarks.prototype.filterDone = function(){
	if(this.options.filterOpts.handle)
		return this.options.filterOpts.handle(this.filterResults, this.map);
	
	return this.filterResults;
	}
Landmarks.prototype.filterTrue = function(marker, index){
	marker.show();
	this.filterResults.push(marker);
	}

Landmarks.prototype.filterFalse = function(marker, index){
	marker.hide();
	}
Landmarks.prototype.hideAll	= function(){
	var data = this.markers;
	var l = data.length,i;
	for(i=0;i<l;i++){
		data[i].hide();
		}
	}
Landmarks.prototype.showAll	= function(){
	var data = this.markers;
	var l = data.length,i;
	for(i=0;i<l;i++){
		data[i].show();
		}
	}
	
Landmarks.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();
	}


Landmarks.prototype.getMarkerByID = function(id){
	return this.hash[id];
	}
	
// Lazy
Landmarks.prototype.inView = function(){
	var me	= this;
	var map = this.map;
	var b = map.getBounds();
	var o = this.composeBoundParamObject(b);
	//o.ex  = this.composeExcludeParam();
	$.getJSON(this.lazy_ajax, o,function(data){
		me.secvAppendMarkers(data);
		});
	}
Landmarks.prototype.composeExcludeParam = function(){
	data = this.data;
	var arr = [];
	
	for(var i in data){
		arr.push(data[i].id);
		}
	return arr.join("|");
	}
	
Landmarks.prototype.composeBoundParamObject = function(b){
    var sw = b.getSouthWest();
    var ne = b.getNorthEast();
    
    var s = sw.lat();
    var w = sw.lng();

    
    var n = ne.lat();
    var e = ne.lng();
	
	var diff_ns = b.toSpan().lat();
	var diff_we = b.toSpan().lng();
	
    var obj = new Object({
				s:	s-diff_ns,
				n:	n+diff_ns,
				e:	e+diff_we,
				w:	w-diff_we
				});
	return obj;
	}


// Helpers
GMarker.prototype.hide = function (){
		if (this.getPoint().lat() < 90)
		  try {
			this.savePoint = this.getPoint();
			this.setPoint(new GLatLng(90, 0));
		  } catch(e) {}
	  }
	  
GMarker.prototype.show = function (){
	if (this.getPoint().lat() == 90)
	if (this.savePoint)
	  try {
		this.setPoint(this.savePoint);
		this.savePoint = null;
	  } catch(e) {}
  }