var map;
var markers = [];
var mapErrors = [];
var baseIcon;
var scale = 4;
var bon;
var descriptions = {};
var admin_center = false;
var markerOptions = {};
var shPoints;

function loadMap(map_view)
{
  if(GBrowserIsCompatible())
  {
  	if(map_view == 'full')
  	{
  	  //  FULL
  	  map = new GMap2($("google_map"),{mapTypes:[G_NORMAL_MAP,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP]} );
  		//map.addMapType(G_PHYSICAL_MAP);
  		map.setMapType(G_PHYSICAL_MAP);
  		map.addControl(new GLargeMapControl());
      /*var opts =
      {
        zoomInBtnTitle : "Масштаб +",
        zoomOutBtnTitle : "Масштаб -",
        moveNorthBtnTitle : "Передвинуть вверх",
        moveSouthBtnTitle : "Передвинуть вниз",
        moveEastBtnTitle : "Передвинуть вправо",
        moveWestBtnTitle : "Передвинуть влево",
        homeBtnTitle : "Вернуться к последнему результату"
      };
     	var extLargeMapControl = new ExtLargeMapControl(opts);
    	map.addControl(extLargeMapControl);*/
  		map.addControl(new GMapTypeControl());
  		GEvent.addListener(map, "load", function()
  		{
  		  shPoints = setTimeout("showPoints('"+t_href+"');",10);
  		  GEvent.addListener(map, "moveend", function(){ shPoints = setTimeout("showPoints();",10); });
  		});
  	}
  	else
  	{
  	  //  MINI
  		map = new GMap2($("google_map"));
  		//bon = new GLatLngBounds();
      map.addControl(new GSmallMapControl());
      /*var opts =
      {
        zoomInBtnTitle : "Масштаб +",
        zoomOutBtnTitle : "Масштаб -",
  	    type: "small"
  		};
      var extLargeMapControl = new ExtLargeMapControl(opts);
    	map.addControl(extLargeMapControl);*/
      map.addControl(new GMapTypeControl());
  	}

  	map.hideControls();
  	GEvent.addListener(map, "mouseover", function(){map.showControls();});
  	GEvent.addListener(map, "mouseout", function(){map.hideControls();});

    map.setCenter(new GLatLng(55.75107652,37.62336730), 10); // Москва

  	geocoder = new GClientGeocoder();

  	// Настройки иконок
  	baseIcon = new GIcon();
  	baseIcon.shadow = "/img/ico/shadow.png";
  	baseIcon.iconSize = new GSize(20, 34);
  	baseIcon.shadowSize = new GSize(37, 34);
  	baseIcon.iconAnchor = new GPoint(9, 34);
  	baseIcon.infoWindowAnchor = new GPoint(9, 2);
  	baseIcon.infoShadowAnchor = new GPoint(18, 25);

  	var letteredIcon = new GIcon(baseIcon);
  	letteredIcon.image = "/img/ico/marker.png";
  	markerOptions = { icon:letteredIcon };

  	window.onunload = GUnload;
  }
}

function startPoints(){
shPoints = setTimeout("showPoints();",10);
}

function showPoints(href){
	if (shPoints) clearTimeout(shPoints);
    if (href==undefined || href == '') { href = show_filter(true); }
	var bounds = map.getBounds(); // размеры текущего окна
	var cur_zoom = map.getZoom(); // текущий коэффициент масштаба

	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var lngSpan = northEast.lng() - southWest.lng();
	var latSpan = northEast.lat() - southWest.lat();
	var southLat = southWest.lat();
	var southLng = southWest.lng();
	var northLat = northEast.lat();
	var northLng = northEast.lng();

    var area = { 'southLat': southLat, 'southLng': southLng, 'northLat': northLat, 'northLng': northLng, 'lngSpan': lngSpan, 'latSpan': latSpan, 'cur_zoom': cur_zoom };
 	var req = new JsHttpRequest();
	req.open(null, '/js/_ajax/zem/show_points.php', true);
	var data = { 'href': href, 'area': area };
    req.send(data);

    if ($('loading-box')) show_message();

   	req.onreadystatechange = function() {
	  if (req.readyState == 4) {
	   	// if (req.responseText && $('loading-box')) close_message('info',req.responseText);
	   	 //alert(req.responseText)
	   	 	  map.clearOverlays();
              var found = req.responseJS.found;
              var m_ids = req.responseJS.ids;
              var m_titles = req.responseJS.titles;
              var m_images = req.responseJS.images;
              var m_lats = req.responseJS.lats;
              var m_lngs = req.responseJS.lngs;
              if ($('found') && found) $('found').innerHTML = found;

			  if (m_lats.length>0 && m_lngs.length>0){
			  	for (var i = 0; i < m_lats.length; i++) if (!isNaN(parseFloat(m_lats[i]))) {
			    	var point = new GLatLng(m_lats[i], m_lngs[i]);
			    	//if (m_ids[i] == 119) alert(parseFloat(m_lats[i]) + ' = ' +parseFloat(m_lngs[i]))
			    	newPoint(point,m_titles[i],m_images[i],m_ids[i]);
			  	}
			  } else if ($('found')) $('found').innerHTML = '';
              if ($('loading-box')) close_message();
           /*
			var lat = google.loader.ClientLocation.latitude;
			var lng = google.loader.ClientLocation.longitude;
			//alert(lat + ' = '+ lng);
			  map.clearOverlays();
			  for (var i = 0; i < 1000; i++) {
			    var point = new GLatLng(southWest.lat() + latSpan * Math.random(), southWest.lng() + lngSpan * Math.random());
			    newPoint(point,i);
			  }
			*/

	  }
    }


}

function newPoint(latlng, text, icon, id){
	var marker = new GMarker(latlng, markerOptions);
	//var text = (descriptions[index]) ? "<div class=\"gmap\">"+descriptions[index]+"</div>" : '<p style="margin: 0 0 20px 0;"><b>Московская область, г.Реутов</b><br>Горьковское шоссе (М7, "Волга"), <b>1.00 км</b> от МКАД<br><b>0.69 Га</b></br><b>10 757 100 руб</b><br><b>Координаты:</b>'+ latlng.lat() + ', ' +latlng.lng()+'</p>';
	//GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(text); });
	GEvent.addListener(marker, "click", new Function("echo_point("+id+");") );
	//clusterer.AddMarker(marker, text, icon, id)
	map.addOverlay(marker);
}

function echo_point(m_id){

var req = new JsHttpRequest();
	req.open(null, '/js/_ajax/zem/show_one_point.php', true);
	var data = { 'lot_id': m_id };
    req.send(data);

    show_message();

   	req.onreadystatechange = function() {
	  if (req.readyState == 4) {
	   	 if (req.responseText && $('loading-box')) close_message('info',req.responseText);
              var text = req.responseJS.result;
			  if (text) close_message('map',text);
              // else close_message();
	  }
    }

}



function get_scale(address){
if (address == undefined || address == '') scale = 4;
else if (address.indexOf(",")!=-1) {
	scale = 12;
/*	var sep = address.split(',');
	switch (sep.length) {
	   case 1: scale = 12; break;
	   case 2: scale = 14; break;
	   case 3: scale = 16; break;
	}
*/
} else scale = 4;

return scale;
}


function createMarkerAt(latlng, address, ind) {
  //var index = 0;
  //var letter = String.fromCharCode("A".charCodeAt(0) + index);
  var letteredIcon = new GIcon(baseIcon);
  letteredIcon.image = "/img/ico/marker.png";

  markerOptions = (admin_center==true) ? { icon:letteredIcon, draggable:true } : { icon:letteredIcon }; //, draggable:true
  var marker = new GMarker(latlng, markerOptions);
  if (admin_center==true) {
	GEvent.addListener(marker, "drag", function() { set_latlng(marker); } );
	GEvent.addListener(marker, "dragend", function() { set_center(marker); } );
  }
  //var text = (descriptions[ind]) ? descriptions[ind] : "<b style=font-size:14px>Адрес:<br></b> " + address;
  if (admin_center==true) var text = ($('addressTEXT').value) ? "<b style=font-size:14px>Адрес:<br></b> " + $('addressTEXT').value : 'АДРЕС';
  else var text = (descriptions[ind]) ? "<div class=\"gmap\">"+descriptions[ind]+"</div>" : "<b style=font-size:14px>Адрес:<br></b> " + address;
  GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(text); });

  if (markers.length<100) map.addOverlay(marker);
  markers.push(marker);

	if (admin_center==true && markers.length>0) {
			if ($('obj_lng')) $('obj_lng').value = markers[0].getPoint().lng();
			if ($('obj_lat')) $('obj_lat').value = markers[0].getPoint().lat();
	}


}

function set_latlng(marker){
   $('obj_lat').value = marker.getPoint().lat(); // переписываем широту
   $('obj_lng').value = marker.getPoint().lng(); // и долготу
}
function set_center(marker){
   map.panTo(marker.getPoint());
}


function AddPointLatLng(latlng,ind){
	if (ind == undefined) ind = 0;
	if ($('map_content')) $('map_content').style.visibility = 'visible';
	map.setCenter(latlng, 9);//12
	var letteredIcon = new GIcon(baseIcon);
	letteredIcon.image = "/img/ico/marker.png";
	markerOptions = (admin_center==true) ? { icon:letteredIcon, draggable:true } : { icon:letteredIcon }; //, draggable:true
	var marker = new GMarker(latlng, markerOptions);
	if (admin_center==true) {
		GEvent.addListener(marker, "drag", function() { set_latlng(marker); } );
		GEvent.addListener(marker, "dragend", function() { set_center(marker); } );
	}
	var text = (descriptions[ind]) ? "<div class=\"gmap\">"+descriptions[ind]+"</div>" : "<b style=font-size:14px>Адрес:<br></b> " + address;
	GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(text); });
	map.addOverlay(marker);
}



function clearMarkers() {
  for (var i = 0; i < markers.length; i++) {
    //alert(markers[i]['ja'].lat() + " = " +markers[i]['ja'].lng());
    map.removeOverlay(markers[i]);
  }
  markers = []; mapErrors = [];
}

function showAddress(address, pan, ind) {
  if (pan == undefined) { pan = true; ind = 0; }
  if (pan) scale = get_scale(address);

  geocoder.getLatLng(
    address,
    function(latlng) {
      if (!latlng) {
		if (pan) {
      		if ($('map_content')) $('map_content').style.visibility = 'hidden';
			if (admin_center==true) close_message('info', "Адрес: \"" + address + "\" на карте не найден");
		}
		mapErrors.push(address);
      } else {
		//close_message('info', latlng);
        if (pan) { if ($('map_content')) $('map_content').style.visibility = 'visible';  map.setCenter(latlng, scale);  }
		createMarkerAt(latlng, address, ind);
	}
    }
  );
}



function scaleMarkers(){
  var lat, lng, minLat = 0, minLng = 0, maxLat = 0, maxLng = 0;
  var len = markers.length;
  scale = 16;

if (len>0) {

  for (var i = 0; i < len; i++) {
    lat = parseFloat(markers[i].getPoint().lat());
    lng = parseFloat(markers[i].getPoint().lng());
    //map.addOverlay(markers[i]);
    //pause(20);
    if (lat<minLat || minLat == 0) minLat = lat;
    if (lat>maxLat || maxLat == 0) maxLat = lat;
    if (lng<minLng || minLng == 0) minLng = lng;
    if (lng>maxLng || maxLng == 0) maxLng = lng;
  }

  //alert("MIN: ("+minLat+", "+minLng+") MAX: ("+maxLat+", "+maxLng+")");
  var centerLat = (len>1) ? (maxLat-(-minLat))/2 : maxLat;
  var centerLng = (len>1) ? (maxLng-(-minLng))/2 : maxLng;
  var centerLatlng = new GLatLng(centerLat, centerLng);

   if (len>1) {
	  var lat1 = new GLatLng(minLat,minLng);
	  var lat2 = new GLatLng(maxLat,maxLng);
	  var dis = parseFloat(lat1.distanceFrom(lat2)/1000);
            // нужно найти как определить масштаб с помощью google функций
            if (dis < 0.5) scale = 16;
            else if (dis < 2) scale = 15;
            else if (dis < 2.5) scale = 14;
            else if (dis < 6) scale = 13;
            else if (dis < 12) scale = 12;
            else if (dis < 26) scale = 11;
            else if (dis < 64) scale = 10;
            else if (dis < 96) scale = 9;
            else if (dis < 128) scale = 8;
            else if (dis < 256) scale = 7;
            else if (dis < 512) scale = 6;
            else if (dis < 1024) scale = 5;
            else if (dis < 2048) scale = 4;
            else if (dis < 4096) scale = 3;
            else if (dis < 8192) scale = 2;
            else scale = 1;

	  		//alert(dis)
	        //var polyline = new GPolyline([lat1, lat2], "#ee5555", 5, 0.5);
            // map.addOverlay(polyline);
       	    //alert(polyline.getLength());
   }
   if (scale>0) map.setCenter(centerLatlng, scale);
   else map.setCenter(centerLatlng);

   window.setTimeout(function() { map.panTo(centerLatlng); }, 1000);
   window.setTimeout(function() { showErrors(); }, 2000);

} else {
	map.setCenter(new GLatLng(0,0), 1);
	close_message('info', 'Не найдено');
	}


}



/// ПОКАЗАТЬ ОШИБКИ
function showErrors(){
   var text = ''; var j = 0;
   if (mapErrors.length>1) {
      for (var i=0; i<mapErrors.length; i++) if (mapErrors[i]) {
      	text += ' &nbsp; &nbsp; &nbsp; '+(++j)+'. '+mapErrors[i]+'<br>';
        if (j >= 20) { text += ' &nbsp; &nbsp; &nbsp; ....<br> &nbsp; &nbsp; &nbsp; Всего не найдено адресов: '+mapErrors.length+''; break; }
      } else if (mapErrors.length == 1) text = mapErrors[0];

   	  if (mapErrors.length == markers.length && mapErrors.length>0 && markers.length==0) text = 'Ни один пункт не был найден на карте';
   	  else if (mapErrors.length < markers.length) text = 'Некоторые адреса не были найдены на карте:<br> &nbsp; &nbsp; &nbsp; (возможно адресов нет на карте, либо сервис перегружен)<br>'+text;
   	  else if (mapErrors.length == 1) text = "Адрес: \"" + text + "\" не найден";
	  else if (text) text = 'Некоторые адреса не были найдены на карте:<br> &nbsp; &nbsp; &nbsp; (возможно адресов нет на карте, либо сервис перегружен)<br>'+text;
   	  if (text) close_message('info', text);

   } else close_message();

}


function pause(ms){
var date = new Date();
var curDate = null;
do { curDate = new Date(); }
while(curDate-date < ms);
}

function AddPoints(points){
	clearMarkers();
	if (points == undefined) {
		address = $("addressTEXT").value;
		showAddress(address);
	} else {
	   var len = points.length;
	   if (len>0) for (var i=0; i<len; i++) if (points[i]) {
	   	     //if (i%20==0 && i>0) pause(500);
	   		 showAddress(points[i], false, i);
	   		///close_message('info', points[i]);
	   		}

	   //delay(1500); scaleMarkers();
	   var del = len*40;
	   //del = ((del<1000) ? 1000 : ((del>1800) ? del : 1800));
	   del = ((del<1000) ? 1000 : ((del>1800) ? ((del>5000) ? 5000 : del) : 1800));
	   window.setTimeout(function() {scaleMarkers();}, del);
	}
}

/* ФУНКЦИИ РАБОТЫ С КАРТОЙ >>>> */


function fill_map_fields()
{
	var value = '';
	if ($('obj_country'))
	{
		if ($('obj_country')) var obj_country = ($('obj_country').value>0 && $('obj_country').type!='hidden') ? $('obj_country').options[$('obj_country').selectedIndex].innerHTML+', ' : '';
		if ($('obj_oblast')) var obj_oblast = ($('obj_oblast').value>0) ? $('obj_oblast').options[$('obj_oblast').selectedIndex].innerHTML+', ' : '';
		if ($('obj_district')) var obj_district = ($('obj_district').value>0) ? $('obj_district').options[$('obj_district').selectedIndex].innerHTML+', ' : '';
		if ($('obj_city')) var obj_city = ($('obj_city').value>0) ? $('obj_city').options[$('obj_city').selectedIndex].innerHTML+', ' : '';
		if(obj_city == '')
		{
		  if($('obj_near_city'))
		  {
		    if($('obj_near_city').value > 0)
		    {
		      obj_district += $('obj_near_city').options[$('obj_near_city').selectedIndex].innerHTML+', ';
		    }
		    else if($('obj_near_city').value == 0 && $('obj_near_city').value != '')//$('obj_near_city').selectedIndex)
		    {
		      if($('obj_near_city_name'))
		      {
		        obj_district += ($('obj_near_city_name').value) ? $('obj_near_city_name').value+', ' : '';
		      }
		    }
		  }
		}
		//if ($('obj_highway')) var obj_highway = ($('obj_highway').value>0) ? $('obj_highway').options[$('obj_highway').selectedIndex].innerHTML+', ' : '';
		var obj_highway = '';
		value = ($('obj_country').value == 1) ? obj_country+obj_oblast+((obj_city!=obj_district && obj_city!=obj_oblast && obj_city)?obj_city:((obj_district!=obj_oblast && obj_district)?obj_district:''))+obj_highway : obj_country+$('obj_abroad_city').value+', ';
		value = (value.length>0) ? value.substring(0,value.length-2) : '';

		// адрес объекта застройки для многоэтажных зданий
		value+= (value.length>0 && $('obj_moscow_build_address') && $('obj_moscow_build_address').value) ? ', '+$('obj_moscow_build_address').value : '';
		// указанный вручную ближайший населенный пункт
		try
		{
		  if($('obj_type').value=='village' && $('obj_near_city_name').value)
		  {
		    value+= (value.length>0) ? ', '+$('obj_near_city_name').value : '';
		  }
		}
		catch(e)
		{
		  //
		}

		if ($('addressTEXT')) $('addressTEXT').value = value;
		return value;
	}
}

function show_marker_address(clear){
	if (clear == undefined) clear = false;
	if (clear == true) clearMarkers();
	address = $("addressTEXT").value;
	if (address) showAddress(address);
}

function goToAddress(){
	var address = fill_map_fields();
	if (address && address!=undefined) {
		  geocoder.getLatLng(
		    address,
		    function(latlng) {
		      if (!latlng) {
					//close_message('info', "Адрес: \"" + address + "\" на карте не найден", 'addressTEXT');
		      } else {
		        //map.setCenter(latlng, scale);
		        if ($('obj_oblast').value == 40 || ($('obj_oblast').value == 41 && $('obj_district').value == 0 && $('obj_city').value == 0)) {
		        	var scale = ($('obj_oblast').value == 40) ? 10 : 9;
		        	map.setCenter(new GLatLng(55.75107652,37.62336730), scale);
		        }
		        else {
		        	//if ($('obj_district').value>0 && $('obj_city').value>0) map.setZoom(12);
					if (map.getZoom()>11) map.setZoom(11);
		        	map.panTo(latlng);
				}
				//createMarkerAt(latlng, address);
			}
		    }
		  );
	}
}


function show_this_address(){
	address = $("addressTEXT").value;

	if (address && address!='свободный поиск по адресу (Страна, Область, Город)') {
    if (address) scale = get_scale(address);

	  geocoder.getLatLng(
	    address,
	    function(latlng) {
	      if (!latlng) {
				close_message('info', "Адрес: \"" + address + "\" на карте не найден", 'addressTEXT');
	      } else {
	        //map.setCenter(latlng, scale);
	        map.panTo(latlng);
			//createMarkerAt(latlng, address);
		}
	    }
	  );

	} else close_message('info','Необходимо ввести адрес','addressTEXT');
}
