function Map(element, options) {
	GMap2.apply(this,arguments);
	options = options || {};
	
	options.continuousZoom  = options.continuousZoom  || 0;
	options.scrollWheelZoom = options.scrollWheelZoom || 0;
	options.afterLoad		= options.afterLoad  || 0;
	
	options.startLat 		= options.startLat  || 0;
	options.startLng 		= options.startLng  || 0;
	options.startZoom		= options.startZoom || 17;
	
	options.mapType			= options.mapType	|| G_HYBRID_MAP;
	options.copyright		= options.copyright || "clujnights.ro";
	
	options.controls		= (options.controls === false)?false:new GLargeMapControl();
	
	//events
	options.moveEnd	= options.moveEnd || 0;
	options.zoomEnd	= options.zoomEnd || 0;
	
	this.options = options;
	
	if(options.continuousZoom)
		this.enableContinuousZoom(); 
	
	if(options.scrollWheelZoom)
		this.enableScrollWheelZoom();
		
	if(options.startLat && options.startLng){
		this.centerGLatLng = new GLatLng(options.startLat, options.startLng);
		this.setCenter(this.centerGLatLng, options.startZoom);
		}
		
	// Controls
	if(options.controls)
		this.addControl(options.controls);
	
	// Map type
	var mapTypeControl = new GMapTypeControl();
	var bottomRight    = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
	this.removeMapType( G_NORMAL_MAP);
	this.removeMapType( G_SATELLITE_MAP);
	this.addControl(mapTypeControl, bottomRight);
	
	this.loadOSMapType();
	//this.loadCJNmapType();
	//this.loadCMMapType();
	//this.setMapType(options.mapType);
	
	
	// Events
	if(options.afterLoad){
		var me = this;
		setTimeout(function(){options.afterLoad(me)}, 0);
		}
	
	if(options.moveEnd){
		GEvent.addListener(this,"moveend", function(){options.moveEnd(this)});
		}
	if(options.zoomEnd){
		GEvent.addListener(this,"zoomend", options.zoomEnd);
		}
	//private
	this._controllers = new Object();
	}

Map.prototype.loadOSMapType = function(){
	var copycol = new GCopyrightCollection("");
    var copy 	= new GCopyright(
					1, new GLatLngBounds(
							new GLatLng(-90,-180), 
							new GLatLng(90,180)
							),
					0, "OpenStreetMap"
					);
	copycol.addCopyright(copy);
	
	var tileMapnik;
	tileMapnik = new GTileLayer(copycol,1,17);
	tileMapnik.myBaseURL 	= "http://tile.openstreetmap.org/";
	tileMapnik.isPng 		= function(){return true;}
	tileMapnik.getOpacity 	= function(){return  1.0;}
	tileMapnik.getTileUrl 	= 
		function (a,b,c) {
			var url = this.myBaseURL + "/mapnik_tiles/" + b + "/" + a.x + "/" + a.y + ".png";
			return url;
			}

         
    var layer0 		= [tileMapnik];
    var mapnikMap 	= new GMapType(layer0, G_SATELLITE_MAP.getProjection(), "OSM", G_SATELLITE_MAP);
    this.addMapType(mapnikMap);
	this.setMapType(mapnikMap);
	}

Map.prototype.loadCMMapType = function(){
	var copycol = new GCopyrightCollection("");
    var copy 	= new GCopyright(
					1, new GLatLngBounds(
							new GLatLng(-90,-180), 
							new GLatLng(90,180)
							),
					0, "Cloud Made"
					);
	copycol.addCopyright(copy);
	
	var tileMapnik;
	tileMapnik = new GTileLayer(copycol,1,17);
	tileMapnik.myBaseURL 	= "http://b.tile.cloudmade.com/";
	tileMapnik.isPng 		= function(){return true;}
	tileMapnik.getOpacity 	= function(){return  1.0;}
	tileMapnik.getTileUrl 	= 
		function (a,b,c) {
			var serv  = ["a","b","c"];
			
			var base  = "http://"+serv[Math.floor(Math.random()*3)]+".tile.cloudmade.com/";
				base  = "http://"+serv[Math.floor(Math.random()*3)]+".tile.openstreetmap.com/";
			
			var code  = "384343b77dc351879e420def32dff45f";
			var style = "2172";
				style = "6"
			var size  = "256";
			
			var url = 	base  + "/" + 
						//code  + "/" +
						style + "/" + 
						//size  + "/" + 
						b + "/" + a.x + "/" + a.y + ".png";
			return url;
			}

         
    var layer0 		= [tileMapnik];
    var mapnikMap 	= new GMapType(layer0, G_SATELLITE_MAP.getProjection(), "Street", G_SATELLITE_MAP);
    this.addMapType(mapnikMap);
	this.setMapType(mapnikMap);
	}


Map.prototype.loadCJNmapType = function(){
	var copycol = new GCopyrightCollection("");
	var copy 	= new GCopyright(
					1, new GLatLngBounds(
						new GLatLng(-90,-180), 
						new GLatLng(90,180)),
					0, this.options.copyright
					);
	
	var tileCJN;
	tileCJN = new GTileLayer(copycol,1,17);
	tileCJN.myBaseURL 	= "http://tile.clujnights.ro/";
	tileCJN.isPng 		= function(){return true;}
	tileCJN.getOpacity 	= function(){return 1.0; }
	tileCJN.getTileUrl 	= 
		function (a,b,c) {
			var url = this.myBaseURL + "/mapnik_tiles/" + b + "/" + a.x + "/" + a.y + ".png";
			return url;
			}
			
    var layer1 	= [tileCJN];
    var CJNMap 	= new GMapType(layer1, G_SATELLITE_MAP.getProjection(), "Cluj Nights", G_SATELLITE_MAP);	
	this.addMapType(CJNMap);
	}
Map.prototype.addPlaces = function(arr, options) {
	if(typeof(Landmarks) == "undefined" ){
		console.log("PlacesController not loaded.");
		return -1;
	}

	this._controllers.places = new Landmarks(arr, options, this);
	this._controllers.places.loadData();
	
	//this.filterIT= this._controllers.places.filter;
  };
Map.prototype.addRefPlaces	= function(arr, options){
	if(!arr){
		alert('bad!');
		return;
		}
	if(typeof(RefLandmarks) == "undefined" ){
		console.log("References Controller not loaded.");
		return -1;
	}
	
	
	this._controllers.refs = new RefLandmarks(arr, options, this);
	this._controllers.refs.loadData();
	}
Map.prototype.addStreets = function(arr, options) {
	if(!arr){
		alert('bad!');
		return;
		}
	if(typeof(Streets) == "undefined" ){
		console.log("StreetsController not loaded.");
		return -1;
	}
	
	
	this._controllers.streets = new Streets(arr, options, this);
	this._controllers.streets.loadData();
	
	//this.filterIT= this._controllers.places.filter;
  };

Map.prototype.parseLength = function(len){
	var unit = "m";
	len = Math.ceil(len);
	if(len > 1000){len /= 1000;unit = "km";}
	return len+unit;
	}
	
//INIT

	for(var prop in GMap2.prototype)
		Map.prototype[prop] = GMap2.prototype[prop];

