	var a = 0;
	var map = 0;
	var infoWindow = 0;
	var markers_array = Array();
	var current_marker = 0;

	var image = new google.maps.MarkerImage('/img/house.png',
					  new google.maps.Size(37, 37),
					  new google.maps.Point(0,0),
					  new google.maps.Point(0, 37));

var clr_image = new google.maps.MarkerImage('/img/clear.gif',
			new google.maps.Size(37, 37),
					  new google.maps.Point(0,0),
					  new google.maps.Point(0, 37));

	var autoSearch = 0;

	function showLoading()
	{
		document.getElementById('promap_loading').style.display = "block";
	}

	function hideLoading()
	{
		document.getElementById('promap_loading').style.display = "none";
	}

  function loadmap(lat, lng) 
	{
		geocoder = new google.maps.Geocoder();
		
		if(!lat) lat = 50.451035;
		if(!lng) lng = 30.522825;
		
		map = new google.maps.Map(document.getElementById("map"), {
				center: new google.maps.LatLng(lat, lng),
				zoom: 17,
				mapTypeId: 'roadmap',
				scrollwheel: false,
				mapTypeControl: false
			}
		);

		infoWindow = new google.maps.InfoWindow( {pixelOffset: new google.maps.Size(-19, 37), disableAutoPan: true} );	

		google.maps.event.addListener(infoWindow, 'closeclick', function() {
		if(current_marker)
			current_marker.setIcon(image);
		current_marker = 0;
		});

		var _sw1 = 0;
		var _sw2 = 0;
		var _ne1 = 0;
		var _ne2 = 0;

		google.maps.event.addListener(map, 'bounds_changed', function() 
		{		
			var bounds = map.getBounds();
			if(!bounds)
				return;
			
			if(_sw1 != bounds.getSouthWest().lat() || _ne1 != bounds.getNorthEast().lat() || 
				_sw2 != bounds.getSouthWest().lng() || _ne2 != bounds.getNorthEast().lng())
			{
				_sw1 = bounds.getSouthWest().lat();
				_ne1 = bounds.getNorthEast().lat(); 
				_sw2 = bounds.getSouthWest().lng();
				_ne2 = bounds.getNorthEast().lng();

				for(i = 0; i < markers_array.length; i++)
				{
					var obj = markers_array[i];
					if(!bounds.contains(obj.getPosition()) || map.getZoom() < 16)
					{
						obj.setMap();
						delete obj;
						markers_array.splice(i, 1);
						i--;
					}
				}				

				if(map.getZoom() < 16)
					return;

				if(a)
					clearTimeout(a);
				
				a = setTimeout(function() {	showLoading();requestXmlData("/promapxml.php?sw1="+_sw1+"&sw2="+_sw2+"&ne1="+_ne1+"&ne2="+_ne2); }, 300);
			}
		});
		
		if(autoSearch)
		{
			autoSearch = false;
			findAddress();
		}
  }

	function processXmlData(data) 					
	{
		var xml = parseXml(data);
		if(!xml.documentElement)
		{
			hideLoading();
			return;
		}
		var markers = xml.documentElement.getElementsByTagName("marker");		
		for (var i = 0; i < markers.length; i++) 
		{
			var point = new google.maps.LatLng(
				parseFloat(markers[i].getAttribute("lat")),
				parseFloat(markers[i].getAttribute("lng")));

			var already_exists = false;
			for(j = 0; j < markers_array.length; j++)
			{
				var obj = markers_array[j];
				if(obj.getPosition().equals(point))							
				{
					already_exists = true;
					break;
				}
			}
			if(already_exists)
				continue;

			var html = getHtmlContent(markers[i]);
					  
			var marker = new google.maps.Marker({
				map: map,
				position: point,
				icon: image							
				});
			markers_array.push(marker);
			bindInfoWindow(marker, map, infoWindow, html);
		}		
		hideLoading();		
	}

	function getHtmlContent(xmlrow)
	{
		
		var id = xmlrow.getAttribute("id");
		var name = xmlrow.getAttribute("name");
		var address = xmlrow.getAttribute("address");
		var type = xmlrow.getAttribute("type");
		var photos = xmlrow.getAttribute("photos");
		var mainphoto = xmlrow.getAttribute("mainphoto");
		var photo1 = xmlrow.getAttribute("photo1");
		var photo2 = xmlrow.getAttribute("photo2");
		var stype = xmlrow.getAttribute("stype");
		var floor = xmlrow.getAttribute("floor");
		var year = xmlrow.getAttribute("year");
		var seo_link = xmlrow.getAttribute("seo_link");
		var newbuild = xmlrow.getAttribute("vip_template");
		
		//alert(address);

		var newbuildhtml = "";
		
		if (newbuild != undefined && newbuild!=''){
			newbuildhtml = "<div><a href='"+id+'.'+seo_link+"/newbuilds-" + newbuild + "'><img src='/img/" + newbuild + "/bubblepic.gif' style='border:0;'></a></div>";
		}
		
		var html = "<div id='infowindow'><div class='header' id='bubble_addr'>" + address + "</div>" + newbuildhtml + "<div id='photos'>";
		
		if(mainphoto){
			html += "<div id='mainphoto' style='background-image:url(/getimg.php?file=promap/"+mainphoto+"&w=144&h=96&mode=cover);'><a href='"+id+'.'+seo_link+"' title='Подробно'><img src='/img/clear.gif' width=144 height=96 border=0 /></a></div>";
			html += "<div id='addphoto'>";

			if(photo1)
				html += "<div id='photo1' style='background-image:url(/getimg.php?file=promap/"+photo1+"&w=58&h=58&mode=cover)'><a href='"+id+'.'+seo_link+"' title='Подробно'><img src='/img/clear.gif' width=58 height=58 border=0 /></a></div>";
			if(photo2)
				html += "<div id='photo2' style='background-image:url(/getimg.php?file=promap/"+photo2+"&w=58&h=58&mode=cover)'><a href='"+id+'.'+seo_link+"' title='Подробно'><img src='/img/clear.gif' width=58 height=58 border=0 /></a></div>";
															
			html+= "<div class='clr'></div><div id='totalphotos'>Всего: <b>" + photos +" фото</b></div></div><div class='clr'></div></div><div id='info'><div style='float:right;'><a href='"+id+'.'+seo_link+"' title='Подробно'><img src='img/details.gif' border='0'></a></div>";
	
		} else html += "<div style='height:105px;'><div style='float:left;'><img src='/img/pm_bbl_nophoto.gif'></div><div " +
			"style='float:left; padding-top:15px; width:185px; font:11px tahoma; color:#fff;'><strong>Извините, по данному объекту пока нет фотографий.</strong>" +
			"<br/><br/>Пожалуйста, <a id='nophototrigger' href='javascript:reinitNophotoForm(\""+address+"\");' style='color:#000;' rel='#prompt_nophoto'>сообщите нам</a>, " +
			"если вы хотите увидеть фотографии объекта как можно скорее.</div></div></div><div id='info'><div style='float:right;'><a href='"+id+'.'+seo_link+"' title='Подробно'><img " +
			"src='/img/details.gif' border='0'></a></div>";	
						  
		if(stype)
			html +="<b>"+stype+"</b><br>";
		if(floor)
			html += "Этажей: <b>"+floor+"</b><br>";
		if(year)
			html += "Год постройки: <b>"+year+"</b>";
			
		html += "<br/><br/></div>";
		
		return html;
	}

  function panMapForMarker(marker)
  {
			var INFO_HEIGHT = 450;
			var INFO_WIDTH = 220;
			
			var bounds = map.getBounds();
			_sw1 = bounds.getSouthWest().lat();
			_ne1 = bounds.getNorthEast().lat(); 
			_sw2 = bounds.getSouthWest().lng();
			_ne2 = bounds.getNorthEast().lng();

			var lat_per_pixel = (_ne1 - _sw1) / 572;
			var lng_per_pixel = (_ne2 - _sw2) / 988;

			marker_lat = marker.getPosition().lat();
			marker_lng = marker.getPosition().lng();

			var pixels_from_marker_to_top = (_ne1 - marker_lat)/lat_per_pixel;
			var pixels_from_marker_to_right = (_ne2 - marker_lng)/lng_per_pixel;
			var pixels_from_marker_to_left = (marker_lng - _sw2)/lng_per_pixel;
			//alert(pixels_from_marker_to_top+', '+pixels_from_marker_to_left+', '+pixels_from_marker_to_right);

			if(pixels_from_marker_to_top < INFO_HEIGHT ||
				pixels_from_marker_to_left < INFO_WIDTH ||
				pixels_from_marker_to_right < INFO_WIDTH)
			{
				var x_offset = 0;
				if(pixels_from_marker_to_left < INFO_WIDTH)
					x_offset = pixels_from_marker_to_left - INFO_WIDTH;
				else if(pixels_from_marker_to_right < INFO_WIDTH)
					x_offset = INFO_WIDTH - pixels_from_marker_to_right;

				var y_offset = 0;
				if(pixels_from_marker_to_top < INFO_HEIGHT)
					y_offset = pixels_from_marker_to_top - INFO_HEIGHT;

				map.panBy(x_offset, y_offset);
			}
  }

  function bindInfoWindow(marker, map, infoWindow, html) 
	{
		google.maps.event.addListener(marker, 'click', function() 
			{
			panMapForMarker(marker);

	        infoWindow.setContent(html);
		    infoWindow.open(map, marker);

			if(current_marker)
				current_marker.setIcon(image);
			current_marker = marker;
			marker.setIcon(clr_image);

			b = setTimeout(function() {	getBubbleOffers(); }, 1000);
			});
    }
		
		
function urlencode (str) {
	str = (str+'').toString();
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}
		

function getBubbleOffers(){
	if(!document.getElementById('bubble_addr'))
		return;
	
	var str = document.getElementById('bubble_addr').innerHTML;
	
	//$.get('offers.php?str='+urlencode(str.toLowerCase()), { },
	$.get('/offers.php?str='+str, { },
   function(data){
			var xml = parseXml(data);
			var elements = xml.documentElement.getElementsByTagName("p");
			var str = "";
			if(elements.length)
				str = "<div style='font:12px tahoma;color:#335282;font-weight:bold; background:#fff; padding:6px 0;'>Предложения по объекту</div>"+
					"<div id='bubble_offer' style='background:#fff; padding:0; margin:0; background:#fff;'>";
			for (var i = 0; i < elements.length; i++) 
			{
				var _id = elements[i].getAttribute("id");
				var _type = elements[i].getAttribute("type");
				var _cat_id = elements[i].getAttribute("cat_id");
				var _desc = elements[i].getAttribute("desc");
				var _price = elements[i].getAttribute("price");

				var _name = "";
				if(_type==1) _name = "Квартира, ";
				if(_type==2) _name = "Дом, ";
				if(_type==3) _name = "Коммерческая, ";
				if(_type==4) _name = "Участок, ";
				if(_type==5) _name = "Гараж ";

				if(_cat_id==1) _name += "продам ";
				if(_cat_id==2) _name += "куплю ";
				if(_cat_id==3) _name += "сдам ";
				if(_cat_id==4) _name += "сниму ";
				
				str += "<div class='p2'>"+_price+"</div><div class='p1'><a href='http://hotpro.ua/realty/id"+_id+"' target=_blank>"+_name+"</a><br/>"+_desc+"</div><div class='clr' style='background:#fff; height:10px; border-bottom:1px solid #ddd; margin-bottom:5px;'></div>";
			}
			if(elements.length)
				str += "</div></div>";

			if(str)
				infoWindow.setContent(infoWindow.getContent() + str);
   });
	
}

  function requestXmlData(url, type)
	{
		$.get(url, { },
			function(data){
				if(type==1)
					processSearchXmlData(data);
				else
					processXmlData(data);		
			}
		);
		
		
		/*var request = null;
		if (window.XMLHttpRequest) {
			try {
				var request = new XMLHttpRequest();
			} catch (e){ }
		} else if (window.ActiveXObject) {
			try {
				var request = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e){
				try {
					var request = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (e){ }
			}
		}
		request.onreadystatechange = function()
		{
			if (request.readyState == 4) 
			{
				request.onreadystatechange = doNothing;
				if(type==1)
					processSearchXmlData(request.responseText);
				else
					processXmlData(request.responseText);
			}
		}
	    request.open('GET', url, true);
		request.send(null);*/
		
	}

	function processSearchXmlData(data)
	{
		var xml = parseXml(data);
		
		var markers = xml.documentElement.getElementsByTagName("marker");
			
		if(!markers.length)
		{
			findAddressByGoogle();
			hideLoading();
			return;
		}
		for (var i = 0; i < markers.length; i++) 
		{
			var point = new google.maps.LatLng(
			  parseFloat(markers[i].getAttribute("lat")),
			  parseFloat(markers[i].getAttribute("lng")));

			var marker = 0;
			for(j = 0; j < markers_array.length; j++)
			{
				var obj = markers_array[j];
				if(obj.getPosition().equals(point))							
				{
					marker = obj;
					break;
				}
			}

			var html = getHtmlContent(markers[i]);

			if(!marker)
			{
				marker = new google.maps.Marker({
					map: map,
					position: point,
					icon: image
				});
				markers_array.push(marker);
			}
					
			map.setZoom(17);
			map.panTo(point);
			map.panBy(0, -150);
			
			bindInfoWindow(marker, map, infoWindow, html);
			//panMapForMarker(marker);

			infoWindow.setContent(html);
			infoWindow.open(map, marker);
			b = setTimeout(function() {	getBubbleOffers(); }, 1000);
			break;
		}	
		hideLoading();
	}

    function parseXml(str) {
      if (window.ActiveXObject) {
        var doc = new ActiveXObject('Microsoft.XMLDOM');
        doc.loadXML(str);
        return doc;
      } else if (window.DOMParser) {
        return (new DOMParser).parseFromString(str, 'text/xml');
      }
    }

    function doNothing() {}

	function changeMapType(type_id)
	{
		switch(type_id)
		{
			case 1:
				map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
				break;

			case 2:
				map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
				break;

			case 3:
				map.setMapTypeId(google.maps.MapTypeId.HYBRID);
				break;
		}		
		document.getElementById('id_maptype1').className = type_id==1 ? "mta" : "mt";		
		document.getElementById('id_maptype2').className = type_id==2 ? "mta" : "mt";		
		document.getElementById('id_maptype3').className = type_id==3 ? "mta" : "mt";		
		return false;
	}

	function findAddress() 
	{
		var str = document.getElementById('id_str').value;
		if(str == '')
			return false;
		showLoading();
		infoWindow.close();
		requestXmlData('/find_address.php?str='+str, 1);		
	}

	function findAddressByGoogle() 
	{
		var str = document.getElementById('id_str').value;
		if(str == '')
			return;

		alert("К сожалению, мы не смогли найти адрес: '"+str+"'");
		
		/*
		var address = "Киев "+str;
		if (geocoder) 
		{
			geocoder.geocode( { 'address': address}, function(results, status) {
				if (status == google.maps.GeocoderStatus.OK) {
					map.setZoom(17);
					map.panTo(results[0].geometry.location);

					infoWindow.setContent("<div id='infowindow'><div class='header' id='bubble_addr'>" +str+ "</div><div id='photos'><div style='height:100px;'><div style='float:left;'><img src='/img/pm_bbl_nophoto.gif'></div><div style='float:left; display:inline; padding-top:15px; width:185px; font:11px tahoma; color:#fff;'><strong>Извините, по данному объекту пока нет фотографий.</strong><br/><br/>Пожалуйста, <a href='' style='color:#000;'>сообщите нам</a>, если вы хотите увидеть фотографии объекта как можно скорее.</div></div>");
					infoWindow.setPosition(results[0].geometry.location);
					infoWindow.open(map);
					b = setTimeout(function() {	getBubbleOffers(); }, 1000);
			} 
			else 
			{
				alert("К сожалению, мы не смогли найти адрес '"+str+"'");
			}
		  });		
		}
		*/

	}
