Ext.ux.GMapPanel = Ext.extend(Ext.Panel, {
	map: null,
	FLAG_WINDOW_OPEN: 0,
	FLAG_WINDOW_BEFORE_CLOSE: 0,
	markers: [],
	photoMarkers : [],	
	oldMarkers: [],
	defCoords: {
		SWx: 35.7989501953125,
		SWy: 55.156904807126104,
		NEx: 39.429931640625,
		NEy: 56.3439456710273,
		zoom: 8
	}, 	
	clasterType:'g_object',
	initComponent : function(){
        Ext.ux.GMapPanel.superclass.initComponent.call(this);
    },
	isAdmin: false,
	selMarker:-1,
	selPhMarker:-1,
	setMarkers: function(params, number){		
		var map = this.map;
		// this.el.mask('Подождите, загружаются маркеры...');
		var mapParams = this.getCurrentMapParams();
		var zoom = mapParams.zoom;
		var mIcon = new GIcon();
		
		mIcon.infoWindowAnchor = new GPoint(25, 2);
		if(this.clasterType=="g_object"){
			mIcon.image = "images/markers/second.png";
			mIcon.iconAnchor = new GPoint(10, 10);
			mIcon.iconSize = new GSize(20, 20);
		}else{
			mIcon.image = "images/markers/m/" + params.tname + ".png" ;
			mIcon.iconAnchor = new GPoint(0, 25);
			mIcon.iconSize = new GSize(18, 25);
		}
		this.mIcon = mIcon;
		var chIcon = new GIcon();
		chIcon.iconSize = new GSize(18, 25);
		chIcon.iconAnchor = new GPoint(0, 25);
		chIcon.infoWindowAnchor = new GPoint(25, 2);
		chIcon.image = "images/markers/ch/" + params.tname + ".png" ;
		this.chIcon = chIcon;
		
		var invIcon = new GIcon();
		invIcon.iconSize = new GSize(18, 25);
		invIcon.iconAnchor = new GPoint(0, 25);
		invIcon.infoWindowAnchor = new GPoint(25, 2);
		invIcon.image = "images/markers/inv/" + params.tname + ".png" ;
		this.invIcon = invIcon;
		
		var store = this.gMapStore;
		this.markers = new Array();
		
		for(var i=0; i<store.getTotalCount();i++){
			var rec = store.getAt(i);
			var point = new GLatLng(rec.get('lat'),rec.get('lng'));
			if(this.clasterType == "object"){
				var mark = createMarker(point, {title:"Объект № " + (i+1), icon:mIcon}, {
					description: rec.get('description'),
					objectId: rec.get('id'),
					type: rec.get('type'),
					rIndex: i
				}, this);
			}else{
				var mark = createMarker(point, {title:rec.get('dop'), icon:mIcon}, {
					SWx: rec.get('SWx'),
					SWy: rec.get('SWy'),
					NEx: rec.get('NEx'),
					NEy: rec.get('NEy'),
					lng: rec.get('lng'),
					lat: rec.get('lat'),
					params: rec.get('params')
				}, this);
			}
			mark.iconSize = new GSize(8, 8);
			map.addOverlay(mark);
			this.markers[rec.get('id')] = mark;
		};
		if(this.clasterType=="g_object") {
			store.removeAll();
		};
		
		function createMarker(p, c, paramss, myMap){
			var marker = new GMarker(p, c);
			GEvent.addListener(marker, "click", function(m){
				if(myMap.clasterType=="g_object"){
					zObject = true;
					myMap.clasterType = "object";
					myMap.map.setCenter(new GLatLng(paramss.lat,paramss.lng), 7);
				}else{
					myMap.grid.getSelectionModel().selectRow(paramss.rIndex);
					myMap.grid.fireEvent('rowclick', myMap.grid, paramss.rIndex, null);
					var oldMarker = myMap.selMarker;
					myMap.selMarker = paramss.objectId;
					if(oldMarker>-1){
						myMap.mMarkerIcon(oldMarker);
					}
					myMap.chMarkerIcon(paramss.objectId);
				};
			});
			
			if (myMap.clasterType=='object'){
				GEvent.addListener(marker, "mouseover", function() {
					myMap.invMarkerIcon(paramss.objectId);
				});
				GEvent.addListener(marker, "mouseout", function() {
					myMap.mMarkerIcon(paramss.objectId);
				});
			};
			return marker;
		};
		// this.el.unmask();
	},
//   	**************** PANORAMIO  **********************
	setPanoMarker: function(){
		if(this.PanoramEnable){
			// this.el.mask('Подождите, загружаются маркеры...');
			var zoom = this.getCurrentMapParams().zoom;
			var SWx = this.getCurrentMapParams().SWx;
			var SWy = this.getCurrentMapParams().SWy;
			var NEx = this.getCurrentMapParams().NEx;
			var NEy = this.getCurrentMapParams().NEy;
			var map = this.map;
			var pIcon = new GIcon();		
			
			pIcon.iconSize = new GSize(10, 10);
			pIcon.iconAnchor = new GPoint(5, 5);
			pIcon.infoWindowAnchor = new GPoint(10, 2);
			pIcon.image = "images/markers/pano-marker.png";
			this.pIcon = pIcon;
			var panoStore = this.gMapPanoStore;
			this.panoMarkers = new Array();
			if(zoom>8){
				function createPanoMarker(p, c, paramss, myMap){
					var pMarker = new GMarker(p, c);
					var r  = paramss.pRecord;
					GEvent.addListener(pMarker, "click", function(m){
						PanImageView(r);
					});
					myMap.pMarkerIcon(r.get('photo_id'));
					return pMarker;
				};
				var tot = panoStore.getCount();			

				for(var i=0; i<tot;i++){
					var rec = panoStore.getAt(i);
					var lat = rec.get('latitude'), lng = rec.get('longitude');
					var tit = rec.get('photo_title');
					
					if(lat>SWy&&lat<NEy&&lng>SWx&&lng<NEx){
						var point = new GLatLng(lat,lng);
						var pMark = createPanoMarker(point, {title:"Panoramio: " + tit, icon:pIcon}, {pRecord: rec}, this);
						
						pMark.iconSize = new GSize(10, 10);
						map.addOverlay(pMark);
						this.panoMarkers[rec.get('photo_id')] = pMark;
					}
				}
			}
			// this.el.unmask();
		}
	},
//   	**************** PANORAMIO  **********************

	setPhotoMarker: function(id){
		// this.el.mask('Подождите, загружаются маркеры...');
		if(id>0){
			myMap.phChMarkerIcon(id);
		}else{
			var map = this.map;
			var mapParams = this.getCurrentMapParams();
			var zoom = mapParams.zoom;
			var phIcon = new GIcon();
			phIcon.iconSize = new GSize(19, 20);
			phIcon.iconAnchor = new GPoint(0, 20);
			phIcon.infoWindowAnchor = new GPoint(25, 2);
			phIcon.image = "images/foto.png" ;
			this.phIcon = phIcon;
			
			var phChIcon = new GIcon();
			phChIcon.iconSize = new GSize(19, 20);
			phChIcon.iconAnchor = new GPoint(0, 20);
			phChIcon.infoWindowAnchor = new GPoint(25, 2);
			phChIcon.image = "images/foto-ch.png" ;
			
			this.phChIcon = phChIcon;
			var phStore = this.gMapPhStore;	
			this.photoMarkers = new Array();
			
			function createPhotoMarker(p, c, paramss, myMap){
				var phMarker = new GMarker(p, c);
				if (myMap.clasterType=='object'){
					myMap.phMarkerIcon(paramss.objectId);
				}
				return phMarker;
			};
			
			for(var i=0; i<phStore.getTotalCount();i++){
				var rec = phStore.getAt(i);
				var point = new GLatLng(rec.get('lat'),rec.get('lng'));
				
				var phMark = createPhotoMarker(point, {title:"Фото № " + (i+1), icon:phIcon}, {
					description: rec.get('description'),
					phObjectId: rec.get('id'),
					type: rec.get('type'),
					rIndex: i
				}, this);
				
				phMark.iconSize = new GSize(8, 8);
				map.addOverlay(phMark);
				
				this.photoMarkers[rec.get('id')] = phMark;
			}
		}
		// this.el.unmask();
	},
	callBack: Ext.emptyFn,
    afterRender: function (){
		var wh = this.ownerCt.getSize();
        Ext.applyIf(this, wh);
        Ext.ux.GMapPanel.superclass.afterRender.call(this);
		this.map = new GMap2(this.body.dom);
		var map = this.map;
		this.map.setCenter(new GLatLng(58.722599,77.871093), 3);
		this.map.addMapType(G_PHYSICAL_MAP);
		if(!this.isAdmin){ this.map.setMapType(G_PHYSICAL_MAP); }
		this.map.addControl(new GLargeMapControl());
		this.map.addControl(new GScaleControl());
		this.map.addControl(new GMenuMapTypeControl());
		var mod = this;

		GEvent.addListener(this.map, "moveend" , function() {
			Ext.callback(mod.callback, mod);
		});
		// GEvent.addListener(this.map, "zoomend", function(){});
		if(!this.isAdmin){
			var message = "Для работы необходимо выбрать категорию объектов в меню";
			Ext.MessageBox.show({
				title: 'Внимание',
				msg: message,
				buttons: Ext.MessageBox.OK,
				animEl: 'mb9'
			});
		};
	},

	chMapWindow: function (lat, lng, zoom){
		this.map.closeInfoWindow();
		
		this.map.setZoom(zoom);
		this.map.panTo(new GLatLng(lat, lng));
	},
	
	getCoordsAsString: function(){
		return "SWx="+ this.map.getBounds().getSouthWest().x+"&SWy="+ this.map.getBounds().getSouthWest().y+"&NEx="+ this.map.getBounds().getNorthEast().x+"&NEy="+ this.map.getBounds().getNorthEast().y;
	},
	
	chMarkerIcon: function (num_id){
		if(this.markers[num_id]) 
			this.markers[num_id].setImage(this.chIcon.image);
	},
	mMarkerIcon: function (num_id){
		if(this.markers[num_id]&&this.selMarker!=num_id){
			this.markers[num_id].setImage(this.mIcon.image);
		}
	},
	invMarkerIcon: function (num_id){
		if (this.markers[num_id]&&this.selMarker!=num_id){
			this.markers[num_id].setImage(this.invIcon.image);
		}
	},	
	
	phMarkerIcon: function (num_id){		
		if(this.photoMarkers[num_id]){
			this.photoMarkers[num_id].setImage(this.phIcon.image);
		}
	},
	pMarkerIcon: function (num_id){		
		if(this.panoMarkers[num_id]){
			this.panoMarkers[num_id].setImage(this.pIcon.image);
		}
	},
	phChMarkerIcon: function (num_id){
		if(this.photoMarkers[num_id]){
			this.photoMarkers[num_id].setImage(this.phChIcon.image);
		}
	},
	/**
	 * Function get current map parametr or default if map not loaded
	 */
	getCurrentMapParams: function(asString){
		
		var SWx = (this.map)?this.map.getBounds().getSouthWest().x:this.defCoords.SWx;
		var SWy = (this.map)?this.map.getBounds().getSouthWest().y:this.defCoords.SWy;
		var NEx = (this.map)?this.map.getBounds().getNorthEast().x:this.defCoords.NEx;
		var NEy = (this.map)?this.map.getBounds().getNorthEast().y:this.defCoords.NEy;
		var zoom = (this.map)?this.map.getZoom():this.defCoords.zoom;
		if(asString){
			return "&SWy=" + SWy + "&SWx=" + SWx + "&NEy=" + NEy + "&NEx=" + NEx + "&zoom=" + zoom;
		} else {
			return {
				SWy: SWy,
				SWx: SWx,
				NEy: NEy,
				NEx: NEx,
				zoom: zoom
			}
		}
	},
		
	goBoundsCenterZoom: function(swy, swx, ney, nex){
		var clasterBounds = new GLatLngBounds(new GLatLng(swy,swx), new GLatLng(ney,nex));
		this.chMapWindow(clasterBounds.getCenter().y, clasterBounds.getCenter().x, this.map.getBoundsZoomLevel(clasterBounds));
	}
		
	
});

Ext.reg('gmappanel', Ext.ux.GMapPanel); 
