/* GOOGLE MAP */
var selmarker	= false;
var exml;
function GoogleMap(container, startZoom, startCoords, markersUrl, opts){
	var map							 = null;
	var mapContainer		 = document.getElementById(container);
	var markersUrl			 = markersUrl;
	var startAddress		 = 'Киев, Украина';
	var caching					 = false;
	var CACHE = [];
	var opts						 = opts || {};
	opts['icontype']		 = 'style';
	opts['sortbyname']	 = true;
	opts['nozoom']			 = true;

	this.init = function(zoom, coords){
		var zoom		= (!zoom)		? 10	 : zoom;
		var coords	= (!coords) ? null : coords;

/*
		var fParsed=false;
		var testXml='<test></test>';
		try {
		 if(typeof ActiveXObject != "undefined"){
			xmlDoc = GXml.parse(testXml);
			fParsed = xmlDoc.parsed;
		 }
		} catch(e){
		 displayError(e);
		 if(typeof window.DOMParser != "undefined"){
			var parser=new DOMParser();
			xmlDoc=parser.parseFromString(testXml,"text/xml");
			fParsed = true;
		 }
		}
*/
		fParsed = typeof ActiveXObject != "undefined" || typeof window.DOMParser != "undefined";

		if(GBrowserIsCompatible()&&fParsed){
			//var lang = new LanguageInfo();

			mapContainer.style.display='';

			map = new GMap2(mapContainer);
			map.hideControls(new Object());
			if(!opts['nocontrols']){
				//map.removeMapType(G_HYBRID_MAP);
				map.removeMapType(G_PHYSICAL_MAP);
				map.removeMapType(G_SATELLITE_MAP);
				map.removeMapType(G_NORMAL_MAP);
				//map.addMapType(G_PHYSICAL_MAP);

	      //map.getMapTypes().length = 0;

				map.addControl(new GMapTypeControl());
				map.addControl(new GLargeMapControl());
				//map.addControl(new GOverviewMapControl());
				map.enableScrollWheelZoom();
				//map.enableGoogleBar();
				map.enableDoubleClickZoom();

        G_HYBRID_MAP.FP = (window._mHL=="ru"?"Ландшафт":(window._mHL=="uk"?"Ландшафт":"Landscape"));

/*
				var msnVeTileH = function(a, b){
					if(b>16){
						b = 16;
						map.setZoom(b);
					}
					var sTile = '000000';
					sTile += (parseInt(a.y.toString(2) * 2) + parseInt(a.x.toString(2)));
					sTile = sTile.substring(sTile.length - b, sTile.length);
					s = 'http://h'
					s += sTile.substring(sTile.length-1, sTile.length);
					s += '.ortho.tiles.virtualearth.net/tiles/h'
					s += sTile;
					s += '.jpeg?g=1';
					return s;
				};
				var msnLayerH = new GTileLayer(new GCopyrightCollection(''),1,18);
				msnLayerH.getTileUrl = msnVeTileH;
				msnLayerH.getCopyright = function(a,b){return 'MSN Virtual Earth';}
				var layer1 = [msnLayerH];
				var msnMapH = new GMapType(layer1, G_SATELLITE_MAP.getProjection(), (window._mHL=="ru"?"Украина":(window._mHL=="uk"?"Україна":"Ukraine"))); // (window._mHL=="ru"?"Места":(window._mHL=="uk"?"Місцини":"Sights"))
				map.addMapType(msnMapH);
*/
				var msnVeTileR = function(a, b){
					if(b>16){
						b = 16;
						map.setZoom(b);
					}
					var sTile = '000000';
					sTile += (parseInt(a.y.toString(2) * 2) + parseInt(a.x.toString(2)));
					sTile = sTile.substring(sTile.length - b, sTile.length);
					s = 'http://r'
					s += sTile.substring(sTile.length-1, sTile.length);
					s += '.ortho.tiles.virtualearth.net/tiles/r'
					s += sTile;
					s += '.jpeg?g=1';
					return s;
				};
				var msnLayerR = new GTileLayer(new GCopyrightCollection(''),1,18);
				msnLayerR.getTileUrl = msnVeTileR;
				msnLayerR.getCopyright = function(a,b){return 'MSN Virtual Earth';}
				var layer2 = [msnLayerR];
				var msnMapR = new GMapType(layer2, G_SATELLITE_MAP.getProjection(), (window._mHL=="ru"?"Города":(window._mHL=="uk"?"Мiста":"Cities")));
				map.addMapType(msnMapR);

				var MapiaTile = function(a, b){
					/*
					var z = 21-parseInt(b);
					var s = 'http://tms.visicom.ua/1.0.1/ukraine_ru/'
					s += parseInt(z-7);
					s += '/'
					s += parseInt(Math.round(a.x-36*Math.pow(2,z-7)));
					s += '/'
					s += parseInt(Math.round(21*Math.pow(2,z-7)+Math.pow(2,z-6)+10-a.y));
					s += '.png';
					*/
					var s = 'http://mapia.com.ua/1.0.0/'
					s += (window._mHL=="uk"?"ua":"ru")
					s += '/'+parseInt(b)+'/'+parseInt(a.x)+'/'+parseInt(Math.round(Math.pow(2,b))-a.y-1)+'.png';
					//alert('z:'+b+'x:'+a.x+'y:'+a.y+' '+s);

					return s;
				};
				var MapiaLayer = new GTileLayer(new GCopyrightCollection(''),1,18);
				MapiaLayer.getTileUrl = MapiaTile;
				MapiaLayer.getCopyright = function(a,b){return 'mapia.com.ua';}
				var layer3 = [MapiaLayer];
				var MapiaMap = new GMapType(layer3, G_SATELLITE_MAP.getProjection(), (window._mHL=="ru"?"Дороги":(window._mHL=="uk"?"Дороги":"Roads")));
				map.addMapType(MapiaMap);

				var WikiTile = function(a, b){
					var num = parseInt(a.x%4+(a.y%4)*4);
					var s = 'http://i'+ num +'.wikimapia.org/?lng=1'
					s += '&x='+parseInt(a.x)+'&y='+parseInt(a.y)+'&zoom='+parseInt(b);
//					var s = 'http://i.wikimapia.org/?lng=1'
//					s += '&x='+parseInt(a.x)+'&y='+parseInt(a.y)+'&zoom='+parseInt(b-1);
					return s;
				};
				var WikiLayer = new GTileLayer(new GCopyrightCollection(''),1,18);
				WikiLayer.getTileUrl = WikiTile;
				WikiLayer.getCopyright = function(a,b){return 'WikiMapia';}
				var layer4 = [WikiLayer];
				var WikiMap = new GMapType(layer4, G_SATELLITE_MAP.getProjection(), (window._mHL=="ru"?"Объекты":(window._mHL=="uk"?"Об'єкти":"Objects")));
				map.addMapType(WikiMap);

				map.setMapType(msnMapR);
			} else {
				map.disableDragging();
				map.setMapType(G_HYBRID_MAP);
			}

			if(!opts['noreload']){
				GEvent.addListener(map, 'zoomend', zoomMap);
				GEvent.addListener(map, 'moveend', this.refresh);
			}

			GEvent.addListener(map, "mouseover", function(){map.showControls();});
			GEvent.addListener(map, "mouseout", function(){map.hideControls();map.closeInfoWindow();});

			if(coords){
				var point = new GLatLng(coords.lat, coords.lng);
				map.setCenter(point, zoom);
			} else {
				var geocoder = new GClientGeocoder();
				geocoder.getLatLng(startAddress, function(point){map.setCenter(point, zoom)});
			}
			if(!opts['display']) mapContainer.style.display='none';
			if(opts['noreload']) refreshMap(false);
		
		} else {
			mapContainer.style.display='none';
			mapContainer.style.backgroundColor = '#DDDDDD';
			mapContainer.innerHTML = 'Sorry, your Google Map cannot be displayed.';

			if(document.getElementById('openClose')) document.getElementById('openClose').parentNode.style.display='none';
			//alert('Ваш браузер не совместим с Google Maps');
			return false;
		}
	}

	this.getMap = function(){
		return map;
	}

	this.refresh = function(customData){
		var data = new Object();

		if(customData){
			for(f in customData){
				data[f] = customData[f];
			}
		}
		refreshMap(data);
	}

	//---------- PRIVATE FUNCTIONS ----------//

	function zoomMap(zoom){
		data = new Object();
		if(!zoom) return true;

		refreshMap(data);
	}

	function refreshMap(data){
		if(!map) return;
		data = getMapSection();
		data.zoom = map.getZoom();

		var Url = markersUrl+(markersUrl.indexOf("?")>=0?"&":"?")+'zoom='+data.zoom+'&ne_lat='+data.ne_lat+'&ne_lng='+data.ne_lng+'&sw_lat='+data.sw_lat+'&sw_lng='+data.sw_lng;

		if(caching&&CACHE[Url]) return false;

		opts['data']=data;
		exml = new EGeoXml("exml", map, Url, opts); exml.parse(selmarker);
		if(caching) CACHE[Url]=exml;

		//alert(Url);
	}

	function getMapSection(){
		bounds = map.getBounds();
		var mapSection = new Object();

		mapSection.ne_lat = bounds.getNorthEast().lat();
		mapSection.ne_lng = bounds.getNorthEast().lng();
		mapSection.sw_lat = bounds.getSouthWest().lat();
		mapSection.sw_lng = bounds.getSouthWest().lng();

		return mapSection;
	}
	function LanguageInfo(){
			var n = navigator;
			this.browser = n.language ? n.language : n.browserLanguage ? n.browserLanguage : null;
			this.user = n.userLanguage ? n.userLanguage : n.systemLanguage ? systemLanguage : null;
	}
	this.init(startZoom, startCoords);
}
