/*   
Модуль "MAP INTERFACE", 
Версия: 2.0
Разработчик: Гринько В.Г. (perlaws@bitbybit.ru)
Зависимости: JQuery Lib, Google Maps API, некоторые функции из main.js
*/

with (mapInterface = function (canvasId, mapId) {this._constructor(canvasId, mapId);}) {
  /*БАЗОВЫЕ ЭЛЕМЕНТЫ ИНИЦИАЛИЗАЦИИ*/
  prototype.active = false;
  prototype.canvasId = null;
  /*ОБЩИЕ ГЛОБАЛЬНЫЕ ОБЪЕКТЫ*/
  prototype.map = null; //Основной объект карты
  //prototype.geocoder = new GClientGeocoder(); //Основной объект геокодера
  /*ОБЩИЕ ДЛЯ ТЕКЩУЙ КАРТЫ ЗНАЧЕНИЯ*/
  prototype.mapId = 0; //переопределено в СЕРВЕРНОЙ ЧАСТИ
  prototype.pointsInfo = []; //информация о точках, добавленнух ранее или только что
  prototype.pointsFullInfo = []; //полная информация о точках
  prototype.supplies = {0:{}, 1:{}, 2:{}, 3:{}, 4:{},  5:{},  6:{}, 7:{}, 8:{}}; //дополнительная информация для разных режимов
  prototype.isIMapPreloaded = false;
  prototype.curMarkerCounter = 0;
  prototype.bounds = null; //набор данных о точках для автоподбора зума
  //Режимы работы:
  //1 - Режим редактирования, 
  //0 - просмотра, 
  //2 - режим выбора одной точки, 
  //3 - просмотр вида режима одной точки, 
  //4 - режим отмечания одной фото, 
  //5 - вывод набора фотографий
  //6 - режим интерактивной карты (I-Map)
  //7 - режим фильтра объектов (для второго уровня) - урезанный вариант режима 6 (I-Map) - есть общие методы
  //8 - Мой Маршрут на I-Map
  prototype.editMode = 0; 
  /*УПРАВЛЕНИЕ СОБЫТИЯМИ*/
  prototype.clickHandler = null;  
  prototype.zoomendHandler = null;  
  prototype.dragendHandler = null;  
  //prototype.clusterer = null;  

  /*РЕАЛИЗАЦИЯ МЕТОДОВ*/
  //Конструктор
  prototype._constructor = function(canvasId, mapId) {
    this.canvasId = canvasId; //Задаём ID для холста. Например, canvas (предпочтительно) или myCanvas1, (!) # подставляется автоматически
    this.mapId = mapId; //Задаём ID самой карты (БД)
    this.curMarkerCounter = 0;
  }
  
  prototype.getMapId = function ()
  {
	return this.canvasId;
  }
  /*Передаём доп. данные через соотв-ий параметр*/
  prototype.setSupplies = function (supplies) {
    this.supplies[this.editMode] = supplies;
    return this;
  }
  //Смена режима работы с картой (1 - Режим редактирования, 0 - просмотра, 2 - режим выбора одной точки, 3 - просмотр вида режима одной точки, 4 - режим отмечания одной фото)
  prototype.setMode = function (modeCode) {
    if (this.clickHandler) {
      GEvent.removeListener(this.clickHandler);
      this.clickHandler = null;
    }
    if (this.zoomendHandler) {
      GEvent.removeListener(this.zoomendHandler);
      this.zoomendHandler = null;
    }
   if (this.dragendHandler) {
      GEvent.removeListener(this.dragendHandler);
      this.dragendHandler = null;
	  
   }
    if (this.editMode) this.resetOverlays();
    this.editMode = modeCode; //Задаём режим рабоыт с картой
    if (modeCode == 6) {
      this.isIMapPreloaded = false;
    }
    //alert(print_r(IMap.arrUserRoute))
    return this;
  }
  
  //Полная общая инициализация карт
  prototype.init = function (modeAddr) { //0 - по уже заданному геокоду, 'массив' - по широте и долготе + 3-й параметр - текст для InfoWindow //'название' - по адресу
    if (GBrowserIsCompatible()) {
      if (is_array(modeAddr) && empty(modeAddr[0]) && empty(modeAddr[1])) //Если массив но с пустыми значениями - включаем базовую инициализацию
        modeAddr = 0;
      this.map = new GMap2(document.getElementById(this.canvasId));
      this.bounds = new GLatLngBounds();
      this.map.addControl(new GLargeMapControl3D());
      if ((modeAddr == 0) || is_array(modeAddr)) {
        if (modeAddr == 0) {
          var latitude = parseFloat($("#" + this.canvasId).attr("latitude"));
          var longitude = parseFloat($("#" + this.canvasId).attr("longitude"));
        } else if (is_array(modeAddr)) {
          var latitude = modeAddr[0];
          var longitude = modeAddr[1];
          this.pointsInfo[this.curMarkerCounter] = {point_description: modeAddr[2], extraData: modeAddr[3]};
        }
        this.map.setCenter(new GLatLng(latitude, longitude));

        var objectName = $("#" + this.canvasId).attr("objectName");
        var objectAddress = $("#" + this.canvasId).attr("address");
        if (is_array(modeAddr)) {
          this.parseOnePoint(new GLatLng(latitude, longitude));
       		this.recalculateBounds();
        }
      } else {
        alert('Функция недоступна');
      }

      //Получаем некоторые параметры, необходимы для НЕКОТОРЫХ режимов
      var strZoom = $("#" + this.canvasId).attr("zoom");
      var strLat = $("#" + this.canvasId).attr("lat_center");
      var strLng = $("#" + this.canvasId).attr("lng_center");
	  


      if (empty(strZoom)) strZoom = '12';
      if (empty(strLat)) strLat = '59.939';
      if (empty(strLng)) strLng = '30.3158';
      if (this.editMode == 0) {
        this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom));
        } else if (this.editMode == 1) {
        this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom));
        this.startCatchMapPosListening();
      } else if (this.editMode == 2){ //если по координатам и это режим выбора одной точки-маркера
        this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom));
        this.startClickListening();
        this.startCatchMapPosListening();
      } else if (this.editMode == 3) {
        this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom)); 
      } else if (this.editMode == 4){ //это режим выбора одной фотографии
        if (modeAddr == 0) { //если нет данных
          this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom));
        } else {
          this.recalculateBounds();
        }
        this.startClickListening();
      } else if (this.editMode == 5) {
        this.startUpdateByBoundsListening();
        if (!empty(this.supplies[5]) && this.supplies[5]['lat'] && this.supplies[5]['long']) {
          this.map.setCenter(new GLatLng(this.supplies[5]['lat'], this.supplies[5]['long']), 16);
        } else this.map.setZoom(12); //одновременно является триггером события onZoom  
      } else if (this.editMode == 6) { //режим i-map
        if (empty(this.pointsFullInfo)) this.pointsFullInfo = arrIMapPointsData;
         this.map.setCenter(new GLatLng(parseFloat(strLat), parseFloat(strLng)), parseInt(strZoom)); 

      }  else if (this.editMode == 7) { //режим фильтра
      } else {this.map.setZoom(12);}
	  var curObject = this;
	  
	this.dragendHandler = GEvent.addListener(this.map, "dragend", function () {
			
			curPoint = curObject.map.getCenter();
			curZoom = curObject.map.getZoom();
			 str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		yamapka = eval( str );
		if (yamapka)
		{
			yamapka.setCenter(new YMaps.GeoPoint(curPoint.lng(),curPoint.lat()), curZoom);
		}
			
		
		  var oldLevel = curObject.map.getZoom();
		  var newLevel = oldLevel;

		  switch (curObject.editMode) {
		  
			case 5:curObject.updatePhotosInBounds(oldLevel, newLevel);break;
			//case 6:curObject.updateIMapInBounds(oldLevel, newLevel);break;
		  }
    });

	
		this.dragendHandler = GEvent.addListener(this.map, "zoomend", function () {
			
			curPoint = curObject.map.getCenter();
			curZoom = curObject.map.getZoom();
			
			 str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		yamapka = eval( str );
		if (yamapka)
	{
	
		yamapka.setCenter(new YMaps.GeoPoint(curPoint.lng(),curPoint.lat()), curZoom);
	}
		
		
		  var oldLevel = curObject.map.getZoom();
		  var newLevel = oldLevel;
	
      switch (curObject.editMode) {
        case 5:curObject.updatePhotosInBounds(oldLevel, newLevel);break;
        //case 6:curObject.updateIMapInBounds(oldLevel, newLevel);break;
      }
    }); 
	
    var curObject = this; //передаём с помощью данной объекта this в inline-функции
    this.zoomendHandler = GEvent.addListener(this.map, "zoomend", function (oldLevel, newLevel) {
	

	
      switch (curObject.editMode) {
        case 5:curObject.updatePhotosInBounds(oldLevel, newLevel);break;
        //case 6:curObject.updateIMapInBounds(oldLevel, newLevel);break;
      }
    }); 	

	
	
	curPoint = curObject.map.getCenter();
	curZoom = curObject.map.getZoom();
			 str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		yamapka = eval( str );
		if (yamapka)
	{
	
		yamapka.setCenter(new YMaps.GeoPoint(curPoint.lng(),curPoint.lat()), curZoom);
	}
    }
    return this;
  }
  
  if (parseInt($("#" + this.canvasId).attr("showControls"))) {
    GSearch.setOnLoadCallback(this.init);
  }
    
  //Включаем режим ожидания изменения МАСШТАБА карты
  prototype.startUpdateByBoundsListening = function () {
    

  }
  
  //Включаем режим сохранения масштаба и центровки
  prototype.startCatchMapPosListening = function () {
  	var curObject = this; //передаём с помощью данной объекта this в inline-функции
    GEvent.addListener(this.map, "zoomend", function (oldLevel, newLevel) {
      $("#map_zoom").html(newLevel);
      switch (curObject.editMode) {
        case 1:
          $("#Map_zoom").val(newLevel);
          break;
        case 2:  
          $("#ObjectInfo_zoom").val(newLevel);
          break;
      }
    });     
    GEvent.addListener(curObject.map, "moveend", function () {
      var center = curObject.map.getCenter();
      $("#map_lat_center").html(center.lat().toPrecision(6));
      $("#map_lng_center").html(center.lng().toPrecision(6));
      $("#map_zoom").html(curObject.map.getZoom());
      switch (curObject.editMode) {
        case 1:
          $("#Map_lat_center").val(center.lat());
          $("#Map_lng_center").val(center.lng());
          //$("#Map_lng_center").val(curObject.map.getZoom());
          $("#map_zoom").val(curObject.map.getZoom());
          break;
        case 2:  
          $("#ObjectInfo_lat_center").val(center.lat());
          $("#ObjectInfo_lng_center").val(center.lng());
          $("#ObjectInfo_zoom").val(curObject.map.getZoom());
          break;
      }
    });     
  }
  
  //Обновить маркеры в текущих размерах (фото-карта)
  prototype.updatePhotosInBounds =  function(oldLevel, newLevel){
      this.showAjaxLoader();
      var bounds = this.map.getBounds();
      var southWest = bounds.getSouthWest();
      var northEast = bounds.getNorthEast();
      var curObject = this; //передаём с помощью данной объекта this в inline-функции
    	$.ajax({
      	type: "GET",
        url: W_AJAX + 'photo/getPointsPhotosByBounds/' + $(".googleMap").attr("str_id_album") + '/' + southWest.lat() + '/' + southWest.lng() + '/' + northEast.lat() + '/' + northEast.lng() + '/' + curObject.map.getZoom(),
        success: function(responseText){
        	if (navigator.userAgent.indexOf ("Opera") != -1) var arrInfo = eval('(' + responseText + ')');
    	    else var arrInfo = JSON.parse(responseText);
    	    if (arrInfo['result'] == 'OK') {
    	      curObject.resetOverlays();
    	      curObject.parsePointsArray(arrInfo['arrPoints']); //выводим все загруженные точки
    	    }
    	    else {
        		alert(arrInfo['err_text']);
        	}
        	curObject.hideAjaxLoader();
        }
      });
    }
    //Обновить маркеры в текущих размерах (i-map)
    prototype.updateIMapInBounds =  function(oldLevel, newLevel){ //PS: Значения из параметров не используются - сохранены для понятности кода - для соответствия API
      //if (!this.map.getZoom()) return;
      this.showAjaxLoader();
      var bounds = this.map.getBounds();
	 var center =  this.map.getCenter();

	setCookie('imapclat',center.lat(),'Mon, 04-Jan-2021 00:00:00 GMT','/');
	setCookie('imapclng',center.lng(),'Mon, 04-Jan-2021 00:00:00 GMT','/');
	setCookie('imapzoom',this.map.getZoom(),'Mon, 04-Jan-2021 00:00:00 GMT','/');
	
				
      var southWest = bounds.getSouthWest();
      var northEast = bounds.getNorthEast();
      //Формируем список корневых разделов, если они выбраны если они не выбраны - по умолчанию - поиск по всем подразделам
      var strRoots = '';
      if (isset(this.supplies[6].rootsIDs) && !empty(this.supplies[6].rootsIDs)) { 
        for (var i = 0; i < this.supplies[6].rootsIDs.length; i++)  
          strRoots += '&roots[]=' + this.supplies[6].rootsIDs[i];
      }
      var curObject = this; //передаём с помощью данной объекта this в inline-функции
    	$.ajax({
      	type: "POST",
        url: W_AJAX + 'i-map/getPointsByBounds/',
        data: 'sw_lat=' + southWest.lat() + '&sw_lng=' + southWest.lng() + '&ne_lat=' + northEast.lat() + '&ne_lng=' + northEast.lng() + '&zoom=' + curObject.map.getZoom() + strRoots,
        success: function(responseText){
        	if (navigator.userAgent.indexOf ("Opera") != -1) var arrInfo = eval('(' + responseText + ')');
    	    else var arrInfo = JSON.parse(responseText);
    	    if (arrInfo['result'] == 'OK') {
    	      curObject.resetOverlays();
    	      curObject.parsePointsArray(arrInfo['arrPoints']); //выводим все загруженные точки
    	      if (!curObject.isIMapPreloaded) {
    	        curObject.isIMapPreloaded = true;
    	        curObject.startUpdateByBoundsListening();
    	      }
    	    }
    	    else {
        		alert(arrInfo['err_text']);
        	}
        	curObject.hideAjaxLoader();
        }
      });
    }
    
  //Обработка нажатия на кнопку - включить режим  по клику
  prototype.pointByClickToggle = function (objLink) {
  
    if ($(objLink).hasClass('active')) { //если сейчас уже активна
      $(objLink).removeClass('active');
      this.stopClickListening(); //Выключаем режим - по клику
    }
    else {//если ещё не активна
      $(objLink).addClass('active');
      this.startClickListening(/*objLink*/); //Включаем режим - по клику
    }
  }

  
  //Включаем режим ожидания клика по карте для добавления иконки туда
  prototype.startClickListening = function () {
    var curObject = this; //передаём с помощью данной объекта this в inline-функции
    GEvent.addListener(this.map, "mouseover", function(){
        curObject.map.getDragObject().setDraggingCursor("pointer");
        curObject.map.getDragObject().setDraggableCursor("pointer");
    }); 

	str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
    yamapka = eval( str );
	if (yamapka)
	{
	
	yamapka.addCursor("pointer");
	
		YMaps.Events.observe(yamapka, yamapka.Events.Click, function (yamapka, mEvent) {
                if (curObject.editMode == 2) {
				
				curObject.map.clearOverlays(); 
				yamapka.removeAllOverlays();
				
				gp = mEvent.getGeoPoint();
				
				
				mEvent.getGeoPoint()
				  $("#ObjectInfo_lat, #ObjectInfo_long").remove();
				 $("#ObjectInfo_ID_typical_page").after($("<input type='hidden' name='ObjectInfo[lat]' id='ObjectInfo_lat' value='" + gp.getLat() + "' />"))
				 $("#ObjectInfo_lat").after($("<input type='hidden' name='ObjectInfo[long]' id='ObjectInfo_long' value='" + gp.getLng() + "' />"))
				
				 curObject.curMarkerCounter++;
				var hPoint = curObject.parseOnePoint(new GLatLng(gp.getLat(),gp.getLng()));
				}
            });
			

	}
	

	
	
    this.clickHandler = GEvent.addListener(this.map, "click", function(overlay, latlng) {
		
      if (latlng) {
        if (curObject.editMode == 2) { //Режим одной точки
	
          curObject.map.clearOverlays(); //удаляем все остальные точки
          //Устанавливаем значения координат в форму (в этом случае они будут переопределы в БД)
          $("#ObjectInfo_lat, #ObjectInfo_long").remove();
          $("#ObjectInfo_ID_typical_page").after($("<input type='hidden' name='ObjectInfo[lat]' id='ObjectInfo_lat' value='" + latlng.lat() + "' />"))
          $("#ObjectInfo_lat").after($("<input type='hidden' name='ObjectInfo[long]' id='ObjectInfo_long' value='" + latlng.lng() + "' />"))
       


	  str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
	  yamapka = eval( str );
		if (yamapka)
		{
			yamapka.removeAllOverlays();
			
			curPoint = curObject.map.getCenter();
			curZoom = curObject.map.getZoom();
			yamapka.setCenter(new YMaps.GeoPoint(curPoint.lng(),curPoint.lat()), curZoom);
		
		}

	   }
        if (curObject.editMode == 4) { //Режим одной фотографии
          curObject.map.clearOverlays(); //удаляем все остальные точки
          curObject.pointsInfo[0] = {point_description: 'Фотография с описанием: <br />"' + $("#descrBody").text() + '"'};
          //Устанавливаем значения координат в форму (в этом случае они будут переопределы в БД)
          $("#idPhotoLat").val(latlng.lat());
          $("#idPhotoLong").val(latlng.lng());
          $("#approveMapChoice").attr("disabled", "");
        }
        curObject.curMarkerCounter++;
        var hPoint = curObject.parseOnePoint(latlng);
        marker = hPoint.marker;
    		marker.openInfoWindow(hPoint.objFormDom);
      }
    });
  }
  //Обработка и отображение одной точки на карте (+ все события)
  prototype.parseOnePoint = function (latlng) {
    var curObject = this; //передаём с помощью данной объекта this в inline-функции
    var lat = latlng.lat();
    var lon = latlng.lng();
    cLat = lat;
    cLng = lon;
    var latOffset = 0.01;
    var lonOffset = 0.01;
    var point = new GLatLng(lat, lon); 
    this.bounds.extend(latlng);
    //задаём параметры для маркера
	
    if (this.editMode == 5) { //если режим вывода фотографий
      var myexIcon = new GIcon();
      if (this.pointsInfo[this.curMarkerCounter]['big']) {

        myexIcon.iconAnchor = new GPoint(22, 5); 
        myexIcon.image = W_IMAGES + this.pointsInfo[this.curMarkerCounter]['pic_folder'] + 'thb_' + this.pointsInfo[this.curMarkerCounter]['pic_file'];
        myexIcon.infoWindowAnchor = new GPoint(20, 5); //смещение для инфо-окна
      }
      else {
	
        myexIcon.iconAnchor = new GPoint(0, 3); 
        myexIcon.image = W_IMAGES + this.pointsInfo[this.curMarkerCounter]['pic_folder'] + 'ths_' + this.pointsInfo[this.curMarkerCounter]['pic_file'];
        myexIcon.infoWindowAnchor = new GPoint(5, 5); //смещение для инфо-окна
      }
      var markerOptions = {icon: myexIcon, title: ''};
      marker = new GMarker(point, markerOptions);
      marker.id = 'photo_' + this.curMarkerCounter;
//      var arrTmpInMData = marker.Ez(this).split('_');
//      arrTmpInMData[2] = (parseInt(arrTmpInMData[2]) + 1);
//      strId = arrTmpInMData[0] + "_" + arrTmpInMData[1] + "_" + String(arrTmpInMData[2]);
      this.pointsInfo[this.curMarkerCounter]['dom_id'] = 'mtgt_' + marker.id;
      
    } else if (in_array(this.editMode, [3,6,7,8])) { //если режим I-Map и при этом не localhost

	 if (this.editMode == 3) this.pointsInfo[this.curMarkerCounter]['ID_abs_root'] = this.pointsInfo[this.curMarkerCounter]['extraData']['ID_abs_root'];
      var myexIcon = new GIcon();
      myexIcon.iconSize = new GSize(38, 34);
      //myexIcon.shadowSize = new GSize(37, 38);
      myexIcon.iconAnchor = new GPoint(12, 34);
      myexIcon.infoWindowAnchor = new GPoint(8, 7);
      //myexIcon.image = W_IMAGES + 'icons/map/i_20.png';
      myexIcon.image = W_IMAGES + 'icons/map/i_' + this.pointsInfo[this.curMarkerCounter]['ID_abs_root'] + '.png';
      //myexIcon.shadow = W_IMAGES + 'icons/map/i_shadow.png';
      var markerOptions = {icon: myexIcon, title: ''};
      marker = new GMarker(point, markerOptions);

    } else if  (this.editMode == 0 || this.editMode == 1) { //если это отмечание на карте в блоке "Карта"
      var myexIcon = new GIcon();
      myexIcon.iconSize = new GSize(38, 34);
      //myexIcon.shadowSize = new GSize(37, 38);
      myexIcon.iconAnchor = new GPoint(12,34);
      myexIcon.infoWindowAnchor = new GPoint(8, 7);
      myexIcon.image = W_IMAGES + 'icons/map/i_regular.png';
     // myexIcon.shadow = W_IMAGES + 'icons/map/i_shadow.png';
      var markerOptions = {icon: myexIcon, title: ''};
      marker = new GMarker(point, markerOptions);
	  
		
    } else {
      var myexIcon = new GIcon();
      myexIcon.iconSize = new GSize(38, 34);
      myexIcon.iconAnchor = new GPoint(12, 34);
      myexIcon.infoWindowAnchor = new GPoint(15, 15);
      myexIcon.image = W_IMAGES + 'icons/map/i_regular.png';
      var markerOptions = {icon: myexIcon, title: ''};
      marker = new GMarker(point, markerOptions);
	  
	  
	  
		
    }
    //markers.push(marker);
    if (this.editMode == 1) { //Режим редактирования, выбора многих точек
      this.createMarkerClickEvent_Edit(marker, this.curMarkerCounter);
      var objFormDom= $(this.getWhiteBoxPointForm(marker)).get(0);
      $(objFormDom).find("#newPointLat").val(lat);
      $(objFormDom).find("#newPointLon").val(lon);
      $(objFormDom).find("#newPointCancel").click (function () { //отмена
        marker.closeInfoWindow();
        //markers.pop(); //убираем последнимй доабвленный
        curObject.map.removeOverlay(marker);  		  
      });
      $(objFormDom).find("#newPointSubmit").click (function () { //сохранение
        curObject.submitSavePoint(curObject.curMarkerCounter);		  
      });
    }
    else if (this.editMode == 0) { //Режим просмотра
      this.createMarkerClickEvent_VIEW(marker, this.curMarkerCounter);
      var objFormDom= $(this.getWhiteBoxPointView(marker)).get(0);
      //this.boun
    } else if (this.editMode == 2/* || this.editMode == 3*/) { //Режим "Выбор-изменение одной точки"
      this.createMarkerClickEvent_PLAIN(marker);
      var objFormDom= $(this.getWhiteBoxPointPlain(marker)).get(0);
	  
	  	str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		  yamapka = eval( str );
			if (this.editMode == 2/* || this.editMode == 3*/) { 
			
			if (yamapka)
			{
			

				var s = new YMaps.Style();
				s.iconStyle = new YMaps.IconStyle();
				s.iconStyle.href = "/content/images/icons/map/i_regular.png";
				s.iconStyle.size = new YMaps.Point(38,34);
				s.iconStyle.offset = new YMaps.Point(-10, -32);

				s.iconStyle.shadow = new YMaps.IconShadowStyle();

				ypoint = new YMaps.GeoPoint(lon,lat);
				var placemark = new YMaps.Placemark(ypoint,{style:s});
					placemark.name = "";
					placemark.width = '200px'; 
				placemark.description =  '<div style="width:240px">'+$(objFormDom).html()+'</div>';
				yamapka.addOverlay(placemark);
				

			}
		}

    } else if (this.editMode == 4) { //Режим "Выбор-изменение одной фотографии"
      this.createMarkerClickEvent_PLAIN(marker);
      var objFormDom= $(this.getWhiteBoxPointPlain(marker)).get(0);
    } else if (this.editMode == 5) { //Режим "фото на карте"
      this.createMarkerPhotoClickEvent(marker, this.curMarkerCounter);
      var objFormDom= $(this.createMarkerPhotoClickEvent(marker, this.curMarkerCounter)).get(0);
      if (!empty(this.supplies[5]) && (this.supplies[5]['idPhoto'] == this.pointsInfo[this.curMarkerCounter]['ID_point']) && 
                                                                         this.supplies[5]['lat'] && this.supplies[5]['long']) {
        GEvent.trigger(marker, "click"); 
        this.supplies[5] = {};
      }
    } else if (this.editMode == 6) { //Режим "i-map"
      this.createMarkerIMapClickEvent(marker, this.curMarkerCounter);
      var objFormDom= $(this.getWhiteBoxPointIMap(marker, this.curMarkerCounter)).get(0);
	  
	  
	   str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
	  yamapka = eval( str );
		if (this.editMode == 6/* || this.editMode == 3*/) { //Режим "Выбор-изменение одной точки"
		
			if (yamapka)
			{
				var s = new YMaps.Style();
				s.iconStyle = new YMaps.IconStyle();
				s.iconStyle.href = "/content/images/icons/map/i_"+this.pointsInfo[this.curMarkerCounter]['ID_abs_root']+".png";
				s.iconStyle.size = new YMaps.Point(38,34);
				s.iconStyle.offset = new YMaps.Point(-10, -32);

				s.iconStyle.shadow = new YMaps.IconShadowStyle();

				ypoint = new YMaps.GeoPoint(lon,lat);
				var placemark = new YMaps.Placemark(ypoint,{style:s});
					placemark.name = "";
					placemark.width = '240px';
				
					
				placemark.description =  '<div style="width:240px">'+$(objFormDom).html()+'</div>';
						
				yamapka.addOverlay(placemark);
			}
		}
		
    } else if (this.editMode == 7 || this.editMode == 8) { //Режим фильтра
      this.createMarkerFilterMapClickEvent(marker, this.curMarkerCounter);
      var objFormDom= $(this.getWhiteBoxPointFilterMap(marker, this.curMarkerCounter)).get(0);
      
	 
	  
	  
    }
    this.map.addOverlay(marker);
    return {marker: marker, objFormDom: objFormDom};
  }
  
  //Инцициализация карт по коллекции объектов (массив arrJSON_areas)
  prototype.parsePointsArray = function (strArrJSON_points) {
    if (!is_array(strArrJSON_points)) {
      if (navigator.userAgent.indexOf ("Opera") != -1) var arrPoints = eval('(' + strArrJSON_points + ')');
      else var arrPoints = JSON.parse(strArrJSON_points); //трансформируем JSON-объект с площадками в ассоциативный массив
    }
    else arrPoints = strArrJSON_points;
    for (var i = 0; i < arrPoints.length; i++) {
      this.curMarkerCounter++;
      if (empty(arrPoints[i]['lat']) || empty(arrPoints[i]['long'])) continue;
      if (this.editMode == 5) {
        this.pointsInfo[this.curMarkerCounter] = {
            ID_point: arrPoints[i]['ID_photo'], 
            ID_album: arrPoints[i]['ID_album'], 
            big: arrPoints[i]['big'], 
            point_description: arrPoints[i]['alt'], 
            name: arrPoints[i]['description'], 
            pic_file: arrPoints[i]['pic_file'], 
            pic_folder: arrPoints[i]['pic_folder'], 
            is_gallery: arrPoints[i]['is_gallery'], 
            clustered: isset(arrPoints[i]['clustered']) ? arrPoints[i]['clustered'] : {}};
      } else if (this.editMode == 6) {
        this.pointsInfo[this.curMarkerCounter] = {
            ID_point: arrPoints[i]['ID_typical_page'], 
            ID_abs_root: arrPoints[i]['ID_abs_root'], 
            clustered: isset(arrPoints[i]['clustered']) ? arrPoints[i]['clustered'] : {}};
      }  else if (this.editMode == 7 || this.editMode == 8) {
        this.pointsInfo[this.curMarkerCounter] = {
            ID_point: arrPoints[i]['ID_typical_page'], 
            ID_abs_root: arrPoints[i]['ID_abs_root'], 
            point_description: arrPoints[i]['description'], 
            pic_file: arrPoints[i]['pic_file'], 
            pic_folder: arrPoints[i]['pic_folder'], 
            title: arrPoints[i]['page_name'],
            all_description: arrPoints[i]['all_description'],
            //address: arrPoints[i]['adress'], 
            //phone: arrPoints[i]['phone'], 
            url: arrPoints[i]['url'], 
            marks_plus: arrPoints[i]['marks_plus'], 
            marks_minus: arrPoints[i]['marks_minus'], 
            is_favorite: arrPoints[i]['isFavorite'],
            //prices: arrPoints[i]['str_prices'],
            services: arrPoints[i]['str_guide_services'],
            types: arrPoints[i]['str_guide_types'],
            crumbs: arrPoints[i]['crumbs']};
      } else /*if ()*/{
        this.pointsInfo[this.curMarkerCounter] = {ID_point: arrPoints[i]['ID_point'], 
                                                  point_name: arrPoints[i]['point_name'], 
                                                  lat: arrPoints[i]['lat'], 
                                                  lng: arrPoints[i]['long'], 
                                                  point_description: arrPoints[i]['description']};
      } /*else if() {}*/
      this.parseOnePoint(new GLatLng(arrPoints[i]['lat'], arrPoints[i]['long']));
      
      $("#" + this.pointsInfo[this.curMarkerCounter]['dom_id']).addClass("mapPhotoIcon");
    }
    this.recalculateBounds();
  }
  
  //Пересчитывает граница и масштаб для точек
  prototype.recalculateBounds = function () {
  
  if (this.editMode == 7)
  {
	var curObject = this; 
		str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		yamapka = eval( str );
		if (yamapka)
		{
			yamapka.setCenter(new YMaps.GeoPoint(30.3158,59.939), 11);
		}
		this.map.setCenter(new GLatLng(59.939,30.3158), 11);	
  }
  else
  {
    var allowed = [/*0, 1, 2, 3,*/4, 8];
    if (!this.active) {
      this.active = true;
      allowed.push(6);
      allowed.push(7);
    }
	var curObject = this; 
      if (!empty(this.pointsInfo)) {
        if (in_array(this.editMode, allowed)) {
		str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		yamapka = eval( str );
				if (this.map.getBoundsZoomLevel(this.bounds) > 3)
				{
					this.map.setZoom(this.map.getBoundsZoomLevel(this.bounds)/* - 1*/);
					this.map.setCenter(this.bounds.getCenter());
					
					curPoint = this.map.getCenter();
					curZoom = this.map.getZoom();

						if (yamapka)
						{
							yamapka.setCenter(new YMaps.GeoPoint(curPoint.lng(),curPoint.lat()), curZoom);
						}
		
				}
				else
				{			
				
					a = this.bounds;
					sw = a.getSouthWest();
					ne = a.getNorthEast();
					
					p1 = new YMaps.GeoPoint(sw.lng(), sw.lat());
					p2 = new YMaps.GeoPoint(ne.lng(), ne.lat());

					yabou = new YMaps.GeoBounds(p1, p2);
				
					yamapka.setCenter(new YMaps.GeoPoint(this.bounds.getCenter().lng(),this.bounds.getCenter().lat()), yabou.getMapZoom(yamapka));

					this.map.setCenter(new GLatLng(this.bounds.getCenter().lat(),this.bounds.getCenter().lng()), yamapka.getZoom());	
					//yamapka.setCenter(new YMaps.GeoPoint(this.bounds.getCenter().lng(),this.bounds.getCenter().lat()),this.map.getBoundsZoomLevel(this.bounds));
				}
		  
        }
      }/* else if (!this.active) {
        this.map.setCenter(new GLatLng(59.939, 30.3158), 12);
        this.active = true;
      } else {
        
      }*/
      /*else if (!this.map.isLoaded())
        this.map.setZoom(11);//стандартный зум масштаба города*/			
  }
  }
  //Выключает режим ожидания клика по карте для добавления иконки туда
  prototype.stopClickListening = function () {
    var curObject = this; //передаём с помощью данной объекта this в inline-функции
    GEvent.addListener(this.map, "mouseover", function(){
      curObject.map.getDragObject().setDraggableCursor("url(http://maps.google.com/intl/en_us/mapfiles/openhand.cur),default"); 
      curObject.map.getDragObject().setDraggingCursor("url(http://maps.google.com/intl/en_us/mapfiles/closedhand.cur), move'");
    }); 
    GEvent.removeListener(this.clickHandler);
    this.clickHandler = null;
  }
  
  
  //Выводим окошко для конкретного маркера (РЕДАКТИРОВАНИЕ, ФОРМА)
  prototype.getWhiteBoxPointForm = function(marker, numId/*, PointarrOne*/) {
    var latlng = marker.getLatLng();
    var lat = latlng.lat();
  	var lon = latlng.lng();
    var pName = numId ? this.pointsInfo[numId]['point_name'] : '';
    var pdescription = numId ? this.pointsInfo[numId]['point_description'] : '';
  	var strInfo = '';
  	strInfo += '<table class="infoWindowForm">'; //При базовом прохождении - при инициализации этот параметр берём из curMarkerCounter, он постепенно инкрементируется. Затем при клике по точке - передаётся параметр numId и тогда уже выводим его (т.к. предыдущий вариант - уже остановился на последнем элементе - и всегда однео и то же число
    	strInfo += '<tr>';
    	 strInfo += '<th>';
    	   strInfo += '<strong>Название</strong>';
    	 strInfo += '</th>';
    	 strInfo += '<td>';
    	   strInfo += '<input type="text" id="newPointName" value="' + pName + '" />';
    	 strInfo += '</td>';
    	strInfo += '</tr>';
    	strInfo += '<tr>';
    	 strInfo += '<td colspan="2">';
    	   strInfo += '<strong>Описание</strong><br />';
    	   strInfo += '<textarea id="newPointDescription">' + pdescription + '</textarea>';
    	 strInfo += '</td>';
    	strInfo += '</tr>';
    	strInfo += '<tr>';
    	 strInfo += '<td>';
    	   if (numId) //если уже добавлена (в БД)
    	     strInfo += '<strong><a href="#" id="addedPointCancel" onclick="return false;">Удалить метку</a></strong>';
    	   else
    	     strInfo += '<strong><a href="#" id="newPointCancel" onclick="return false;">Удалить метку</a></strong>';
    	 strInfo += '</td>';
    	 strInfo += '<td style="text-align: right;">';
    	   strInfo += '<input type="button" value="Сохранить" id="newPointSubmit" onclick="return false;" />';
    	   if (numId) { //если уже добавлена (в БД) 
    	     strInfo += '<input type="hidden" value="' + this.pointsInfo[numId]['ID_point'] + '" id="newPointID_point" />';
    	   } 
    	   strInfo += '<input type="hidden" value="' + lat + '" id="newPointLat" />';
    	   
    	   strInfo += '<input type="hidden" value="' + lon + '" id="newPointLong" />';
    	 strInfo += '</td>';
    	strInfo += '</tr>';
  	strInfo += '</table>';
  	return strInfo;
  }
  
  //Выводим окошко для конкретного маркера отдельной точки (ПРОСМОТР)
  prototype.getWhiteBoxPointView = function(marker, numId/*, PointarrOne*/) {
    var pName = numId ? this.pointsInfo[numId]['point_name'] : '';
    var pDescription = numId ? this.pointsInfo[numId]['point_description'] : '';
  	var strInfo = '';
    strInfo += '<div style="width:251px;padding-left:4px;margin-bottom:10px;max-height:100px;"><h3>' + pName + '</h3>';
    //strInfo += '<strong>Описание</strong>';
    strInfo += '<div style="width:251px;padding:7px 7px 5px 0px;">' + pDescription + '</div></div>';
  	return strInfo;
  }
  
  //Выводим окошко для простого маркера отдельной точки (ИСП-СЯ В РЕЖИМЕ "ПО ОДНОЙ ТОЧКЕ, РЕД. (2)")
  prototype.getWhiteBoxPointPlain = function(marker/*, PointarrOne*/) {
  	var strInfo = '';
    strInfo += '<div style="width:210px; padding:2px 3px 5px 3px; overflow-x: hidden;min-height: 40px">';
    if ((this.editMode == 2) || (this.editMode == 3)) {
      if (!empty(this.pointsInfo[0]['extraData']['pic']))
        strInfo += '<img src="' + W_IMAGES + this.pointsInfo[0]['extraData']['pic'] +  '" title="Изображение объекта" style="float: left;margin: 0 5px 5px 0;position:relative;top: 4px;">';
      strInfo += '<strong style="font-size: 13px;">' + this.pointsInfo[0]['extraData']['page_name'] + '</strong><br />';
      //strInfo += '<p style="margin-top: 3px;"><strong>Адрес:</strong> ' + this.pointsInfo[0]['extraData']['address'] + '</p>';
    }
    strInfo += '<p><em>' + this.pointsInfo[0]['point_description'] + '</em></p>';
    strInfo += '</div>';
  	return strInfo;
  }  
  
  //Выводим окошко для простого маркера отдельной точки (ИСП-СЯ В РЕЖИМЕ "ВСЕ ФОТО (5)")
  prototype.getWhiteBoxPointPhoto = function(marker, num/*, PointarrOne*/) {
    var clusterSize = this.pointsInfo[num]['clustered'].length;
  	var strInfo = '';
    strInfo += '<div style="width:210px; padding:2px 7px 0px 3px; overflow-x: hidden; ' + (clusterSize > 1 ? 'overflow-y: scroll; max-height:140px' : 'min-height:auto;') + ';">';
    var strAlbumLinkTo = this.pointsInfo[num]['is_gallery'] ?
                           'article/#0&' + this.pointsInfo[num]['ID_point']:
                           this.pointsInfo[num]['ID_album'] + '#' + this.pointsInfo[num]['ID_album'] + '&' + this.pointsInfo[num]['ID_point'];
    strInfo += '<div style="overflow: hidden;min-height:87px;">' +
               '<a href="' + W_ABSPATH + 'gallery/' + strAlbumLinkTo + '" title="Переход к фотографии (откроется на новой странице/вкладке)" target="_blank"><img src="' + W_IMAGES + this.pointsInfo[num]['pic_folder'] + 'm_' + this.pointsInfo[num]['pic_file'] + '" title="" style="float: left;margin: 0 10px 5px 0;position:relative;top: 4px;"></a>';
      strInfo += (!empty(this.pointsInfo[num]['name']) ? '<p style="padding-bottom:3px;"><strong>' + this.pointsInfo[num]['name'] + '</strong></p>' : '');
      strInfo += '' + (!empty(this.pointsInfo[num]['point_description']) ? '<p>' + this.pointsInfo[num]['point_description'] + '</p>' : '');
    strInfo += '</div>';
    for (var i = 0; i < clusterSize; i++) {
      var strAlbumLinkTo = this.pointsInfo[num]['clustered'][i]['is_gallery'] ?
                           'article/#0&' + this.pointsInfo[num]['clustered'][i]['ID_photo']:
                           this.pointsInfo[num]['clustered'][i]['ID_album'] + '#' + this.pointsInfo[num]['clustered'][i]['ID_album'] + '&' + this.pointsInfo[num]['clustered'][i]['ID_photo'];
      strInfo += '<div style="overflow: hidden;min-height:87px;">' +
                  '<div style="border-top: 1px solid #c0c0c0; margin: 3px 0 4px 0; height: 0px;"></div>';
        strInfo += '<a href="' + W_ABSPATH + 'gallery/' + strAlbumLinkTo + '" title="Переход к фотографии (откроется на новой странице/вкладке)" target="_blank"><img src="' + W_IMAGES + this.pointsInfo[num]['clustered'][i]['pic_folder'] + 'm_' + this.pointsInfo[num]['clustered'][i]['pic_file'] + '" title="" style="float: left;margin: 0 5px 5px 0;position:relative;top: 4px;"></a>';
        strInfo += '<p><em>' + (!empty(this.pointsInfo[num]['clustered'][i]['description']) ? this.pointsInfo[num]['clustered'][i]['description'] : 'Нет описания') + '</em></p>';
      strInfo += '</div>';
    }
    strInfo += '</div>';
    strInfo += '<div class="clear"></div>'; 
    strInfo += '<div style="height:1px;font-size:1px;color:#ffffff">.</div>';
    strInfo += '<div style="height:1px;font-size:1px;color:#ffffff;float:left;">.</div>';
    strInfo += '<div class="clear"></div>'; 
    strInfo += '<div style="height:1px;font-size:1px;color:#ffffff">.</div>';
  	return strInfo;
  }  
  
  //Выводим окошко для простого маркера отдельной точки (ИСП-СЯ В РЕЖИМЕ I-Map)
  prototype.getWhiteBoxPointIMap = function(marker, num/*, PointarrOne*/) {
    var idPoint = this.pointsInfo[num]['ID_point'];
    var strInfo = '';
  	var clusterSize = this.pointsInfo[num]['clustered'].length;
  	//alert(this.pointsInfo[num]['ID_root']);
    strInfo += '<div style="width:250px; padding:2px 7px 0px 3px; overflow-x: hidden; ' + (clusterSize > 1 ? 'overflow-y: scroll; ' : '') + 
'max-height:140px;">';
    var picPath = !empty(this.pointsFullInfo[idPoint]['pic_file']) ?
                    this.pointsFullInfo[idPoint]['pic_folder'] + 's_' + this.pointsFullInfo[idPoint]['pic_file'] :
                    'default/s_typical_page.gif';
    strInfo += '<div style="overflow: hidden">' +
    
                 '<a href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idPoint]['url'] + '" title="Переход к объекту" target="_blank" style="display:block;float: left;margin: 0 10px 5px 0;position:relative;top: 4px;">' +
                   '<img src="' + W_IMAGES + picPath + '" title="" >' +
                 '</a>';
       strInfo += '<div style="margin-left: 61px;">' +
                  '<div class="onmap-breadCrumbs">' + this.pointsFullInfo[idPoint]['crumbs'] + '</div>' +
                  '<a class="filterMapToObjLink" href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idPoint]['url'] + '" title="Переход к объекту" target="_blank">' + this.pointsFullInfo[idPoint]['page_name'] + '</a>' +
                  '&nbsp;&nbsp;&nbsp;<span class="green-text" style="font-weight:bold;">+' + this.pointsFullInfo[idPoint]['marks_plus'] + '</span><span class="gray-text">/</span><span class="red-text" style="font-weight:bold;">-' + this.pointsFullInfo[idPoint]['marks_minus'] + '</span><br /></div>';
    strInfo += '</div>';
//    if (!empty(this.pointsFullInfo[idPoint]['address']))
//      strInfo += '<p class="description_text"><span class="gray-text-light">Адрес: </span> ' + this.pointsFullInfo[idPoint]['address'] + '</p>';
//    if (!empty(this.pointsFullInfo[idPoint]['phone'])) {
//      strInfo += '<p class="description_text"><span class="gray-text-light">Телефон: </span> ';
//    	strInfo += this.pointsFullInfo[idPoint]['phone'];
//    	strInfo += '</p>';
//    }
//    if (!empty(this.pointsFullInfo[idPoint]['prices'])) {
//      strInfo += '<p class="description_text"><span class="gray-text-light">Цены: </span> ' 
/*objectFilter.getPricesById(this.pointsFullInfo[idPoint]['prices'])*/ ;
//    	strInfo += this.pointsFullInfo[idPoint]['prices'];
//    	strInfo += '</p>';
//    }

//    if (!empty(this.pointsFullInfo[idPoint]['str_guide_services'])) {
//      strInfo += '<p class="description_text"><span class="gray-text-light">Услуги: </span> ';
//      strInfo += this.pointsFullInfo[idPoint]['str_guide_services'];
//      strInfo += '</p>';
//    }
    
    strInfo += '<p class="description_text">' + this.pointsFullInfo[idPoint]['all_description'] + '</p>';
    ////if (!empty(this.pointsFullInfo[idPoint]['str_guide_types'])) {
      ////strInfo += '<p class="description_text"><span class="gray-text-light">Тип: </span> ';
      ////strInfo += '' + this.pointsFullInfo[idPoint]['str_guide_types'] + '';
      ////strInfo += '</p>';
    ////}
    var strFavLink = this.pointsFullInfo[idPoint]['isFavorite'] ? 'Удалить из моего маршрута' : 'Добавить в мой маршрут';
    strInfo += '<div style="" class="additionalLinks inCloud"><a href="#" title="Добавить/удалить" onclick="typicalPage.toggleToOwnList(this, ' + 
this.pointsFullInfo[idPoint]['ID_typical_page'] + ',1,{num: ' + num + '}); objMaps.get(0).updateArrayMarkerFavStatus(' + num + ', ' + 
(this.pointsFullInfo[idPoint]['isFavorite'] ? 0 : 1) + '); return false;" class="ico"><img src="' + W_IMAGES + 'icons/favorite_add.gif" class="favoriteAddIn" alt="" /></a><a href="#" class="filterMapToFavLink" title="Добавить/удалить" onclick="typicalPage.toggleToOwnList(this, ' + 
this.pointsFullInfo[idPoint]['ID_typical_page'] + ',1,{num: ' + num + '}); objMaps.get(0).updateArrayMarkerFavStatus(' + num + ', ' + 
(this.pointsFullInfo[idPoint]['isFavorite'] ? 0 : 1) + '); return false;">' + strFavLink + '</a></div>';
		strInfo += '<br />';
      for (var i = 0; i < clusterSize; i++) {
        var idClusteredPoint = this.pointsInfo[num]['clustered'][i]['ID_typical_page'];
        var picPath = !empty(this.pointsFullInfo[idPoint]['pic_file']) ?
                    this.pointsFullInfo[idClusteredPoint]['pic_folder'] + 's_' + this.pointsFullInfo[idClusteredPoint]['pic_file'] :
                    'default/s_typical_page.gif';
        strInfo += '<div style="overflow: hidden; border-top: 1px solid #c0c0cf;padding-top:5px;margin-top:3px;">' +
        
                     '<a href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idClusteredPoint]['url'] + '" title="Переход к объекту" target="_blank" style="display:block;float: left;margin: 0 10px 5px 0;position:relative;top: 4px;">' +
                       '<img src="' + W_IMAGES + picPath + '" title="">' +
                     '</a>';
           strInfo += '<div style="margin-left: 61px;">' +
                      '<div class="onmap-breadCrumbs">' + this.pointsFullInfo[idClusteredPoint]['crumbs'] + '</div>' +
                      '<a class="filterMapToObjLink" href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idClusteredPoint]['url'] + '" title="Переход к объекту" target="_blank">' + this.pointsFullInfo[idClusteredPoint]['page_name'] + '</a>' +
                      '&nbsp;&nbsp;&nbsp;<span class="green-text" style="font-weight:bold;">+' + this.pointsFullInfo[idClusteredPoint]['marks_plus'] + 
'</span><span class="gray-text">/</span><span class="red-text" style="font-weight:bold;">-' + this.pointsFullInfo[idClusteredPoint]['marks_minus'] + '</span><br /></div>';
        strInfo += '</div>';
        /*if (!empty(this.pointsFullInfo[idClusteredPoint]['adress']))
          strInfo += '<p class="description_text"><span class="gray-text-light">Адрес: </span> ' + this.pointsFullInfo[idClusteredPoint]['adress'] + '</p>';*/
//        if (!empty(this.pointsFullInfo[idClusteredPoint]['phone'])) {
//          strInfo += '<p class="description_text"><span class="gray-text-light">Телефон: </span> ';
//        	strInfo += this.pointsFullInfo[idClusteredPoint]['phone'];
//        	strInfo += '</p>';
//        }
//        //else strInfo += 'не указан';
//        if (!empty(this.pointsFullInfo[idClusteredPoint]['str_prices'])) {
//          strInfo += '<p class="description_text"><span class="gray-text-light">Цены: </span> ' 
/*objectFilter.getPricesById(this.pointsFullInfo[idPoint]['prices'])*/ ;
//        	strInfo += this.pointsFullInfo[idClusteredPoint]['str_prices'];
//        	strInfo += '</p>';
//        }
//        //else strInfo += 'не указаны';
        strInfo += '<p class="description_text">' + this.pointsFullInfo[idClusteredPoint]['all_description'] + '</p>';
        ////if (!empty(this.pointsFullInfo[idClusteredPoint]['str_guide_types'])) {
          ////strInfo += '<p class="description_text"><span class="gray-text-light">Тип: </span> ';
          ////strInfo += '' + this.pointsFullInfo[idClusteredPoint]['str_guide_types'] + '';
          ////strInfo += '</p>';
        ////}
//        //alert(print_r(this.pointsFullInfo[idClusteredPoint]));
//        if (!empty(this.pointsFullInfo[idClusteredPoint]['str_guide_services'])) {
//          strInfo += '<p class="description_text"><span class="gray-text-light">Услуги: </span> ';
//          strInfo += this.pointsFullInfo[idClusteredPoint]['str_guide_services'];
//          strInfo += '</p>';
//        }
        
        var strFavLink = this.pointsFullInfo[idClusteredPoint]['isFavorite'] ? 'Удалить из моего маршрута' : 'Добавить в мой маршрут';
        strInfo += '<div style="" class="additionalLinks inCloud"><a href="#" title="Добавить/удалить" onclick="typicalPage.toggleToOwnList(this, ' + 
this.pointsFullInfo[idClusteredPoint]['ID_typical_page'] + ',1,{num: ' + num + ', i: ' + i + '}); objMaps.get(0).updateArrayMarkerFavStatus(' + num + ', ' + 
(this.pointsFullInfo[idClusteredPoint]['isFavorite'] ? 0 : 1) + '); return false;" class="ico"><img src="' + W_IMAGES + 'icons/favorite_add.gif" class="favoriteAddIn" alt="" /></a><a href="#" class="filterMapToFavLink" title="Добавить/удалить" onclick="typicalPage.toggleToOwnList(this, ' + 
this.pointsFullInfo[idClusteredPoint]['ID_typical_page'] + ',1,{num: ' + num + ', i: ' + i + '}); objMaps.get(0).updateArrayMarkerFavStatus(' + num + ', ' + 
(this.pointsFullInfo[idClusteredPoint]['isFavorite'] ? 0 : 1) + ', ' + i + '); return false;">' + strFavLink + '</a></div>';        
        
//        strInfo += '<div style="border-top: 1px solid #c0c0c0; margin: 3px 0 4px 0; height: 0px;"></div>';
//        var picPath = !empty(this.pointsFullInfo[idClusteredPoint]['pic_file']) ?
//                        this.pointsFullInfo[idClusteredPoint]['pic_folder'] + 's_' + this.pointsFullInfo[idClusteredPoint]['pic_file'] :
//                        'default/s_typical_page.gif';
//        strInfo += '<div style="overflow: hidden">' +
//                     '<a href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idClusteredPoint]['url'] + '" title="Переход к объекту" target="_blank">' +
//                       '<img src="' + W_IMAGES + picPath + '" title="" style="float: left;margin: 0 10px 5px 0;position:relative;top: 4px;">' +
//                     '</a>';
//           strInfo += '<p>' +
//                      '<a href="' + W_ABSPATH + 'guide/' + this.pointsFullInfo[idClusteredPoint]['url'] + '" title="Переход к объекту" target="_blank">' + 
this.pointsFullInfo[idClusteredPoint]['page_name'] + '</a><br /></p>';
//        strInfo += '</div>';
//        //strInfo += '<p class="description_text">' + this.pointsFullInfo[idClusteredPoint]['address'] + '</p>';
//        strInfo += '<p class="description_text">' + this.pointsFullInfo[idClusteredPoint]['description'] + '</p>';
      }
    strInfo += '</div>';
  	return strInfo;
  	
  }
  
  //Выводим окошко для простого маркера в режиме фильтра
  prototype.getWhiteBoxPointFilterMap = function(marker, num/*, PointarrOne*/) {
    //alert(print_r(this.pointsInfo[num]));
  	var strInfo = '';
    strInfo += '<div style="width:250px; padding:2px 3px 0px 3px; overflow-x: hidden; min-height: 125px">';
    var picPath = !empty(this.pointsInfo[num]['pic_file']) ?
                    this.pointsInfo[num]['pic_folder'] + 's_' + this.pointsInfo[num]['pic_file'] :
                    'default/s_typical_page.gif';
    strInfo += '<div style="overflow: hidden">' +
                 '<a href="' + W_ABSPATH + 'guide/' + this.pointsInfo[num]['url'] + '" title="Переход к объекту" target="_blank" style="display:block;float: left;margin: 0 10px 5px 0;position:relative;top: 4px;" >' +
                   '<img src="' + W_IMAGES + picPath + '" title="">' +
                 '</a>';
       strInfo += '<div style="margin-left: 61px;">' +
                  '<div class="onmap-breadCrumbs">' + this.pointsInfo[num]['crumbs'] + '</div>' +
                  '<a class="filterMapToObjLink" href="' + W_ABSPATH + 'guide/' + this.pointsInfo[num]['url'] + '" title="Переход к объекту" target="_blank">' + this.pointsInfo[num]['title'] + '</a>' +
                  '&nbsp;&nbsp;&nbsp;<span class="green-text" style="font-weight:bold;">+' + this.pointsInfo[num]['marks_plus'] + '</span><span class="gray-text">/</span><span class="red-text" style="font-weight:bold;">-' + this.pointsInfo[num]['marks_minus'] + '</span><br /></div>';
    strInfo += '</div>';
    /*if (!empty(this.pointsInfo[num]['address']))
      strInfo += '<p class="description_text"><span class="gray-text-light">Адрес: </span> ' + this.pointsInfo[num]['address'] + '</p>';
    if (!empty(this.pointsInfo[num]['phone'])) {
      strInfo += '<p class="description_text"><span class="gray-text-light">Телефон: </span> ';
    	strInfo += this.pointsInfo[num]['phone'];
    	strInfo += '</p>';
    }
    //else strInfo += 'не указан';
    if (!empty(this.pointsInfo[num]['prices'])) {
    	strInfo += '<p class="description_text"><span class="gray-text-light">Цены: </span> ' ;
    	strInfo += this.pointsInfo[num]['prices'];
    	strInfo += '</p>';
    }*/
    strInfo += '<p class="description_text">' + this.pointsInfo[num]['all_description'] + '</p>';
    //else strInfo += 'не указаны';
    
    ////if (!empty(this.pointsInfo[num]['types'])) {
      ////strInfo += '<p class="description_text"><span class="gray-text-light">Тип: </span> ';
      ////strInfo += '' + this.pointsInfo[num]['types'] + '';
      ////strInfo += '</p>';
    ////}
//    alert(print_r(this.pointsInfo[num]));
//      for (var i = 0; i < this.pointsInfo[num]['types'].length; i++){
//        if (i) strInfo += '<strong>' + this.pointsInfo[num]['types'][i] + '</strong>';
//        strInfo += '';
//      }
    ////if (!empty(this.pointsInfo[num]['services'])) {
      ////strInfo += '<p class="description_text"><span class="gray-text-light">Услуги: </span> ';
      ////strInfo += this.pointsInfo[num]['services'];
      ////strInfo += '</p>';
    ////}
    

    
    strInfo += '<p class="description_text">' + this.pointsInfo[num]['point_description'] + '</p>';

    var strFavLink = this.pointsInfo[num]['is_favorite'] ? 'Удалить из моего маршрута' : 'Добавить в мой маршрут';
    strInfo += '<center style="margin-bottom:0px;margin-top:5px" class="additionalLinks"><a href="#" title="Добавить/удалить" class="filterMapToFavLink" onclick="typicalPage.toggleToOwnList(this, ' + this.pointsInfo[num]['ID_point'] + ',1); objMaps.get(0).updateArrayMarkerFavStatus(' + num + ', ' + (this.pointsInfo[num]['is_favorite'] ? 0 : 1) + ');return false;">' + strFavLink + '</a></center>';
    strInfo += '<br />';
    strInfo += '</div>';
  	return strInfo;
  }
  
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (ПРОСМОТР)
  prototype.createMarkerClickEvent_PLAIN = function(markerPoint/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      var objFormDom= $(curObject.getWhiteBoxPointPlain(markerPoint)).get(0);
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }  
  
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (ПРОСМОТР)
  prototype.createMarkerPhotoClickEvent = function(markerPoint, num/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      var objFormDom= $(curObject.getWhiteBoxPointPhoto(markerPoint, num)).get(0);
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }
    
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (ПРОСМОТР)
  prototype.createMarkerIMapClickEvent = function(markerPoint, num/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      var objFormDom= $(curObject.getWhiteBoxPointIMap(markerPoint, num)).get(0);
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }
  
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (ПРОСМОТР)
  prototype.createMarkerFilterMapClickEvent = function(markerPoint, num/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      var objFormDom= $(curObject.getWhiteBoxPointFilterMap(markerPoint, num)).get(0);
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }
  
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (ПРОСМОТР)
  prototype.createMarkerClickEvent_VIEW = function(markerPoint, numId/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      var objFormDom= $(curObject.getWhiteBoxPointView(markerPoint, numId)).get(0);
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }
  
  // Создание обработчика клика для данного маркера с заданной числовой меткой numId (РЕДАКТИРОВАНИЕ)
  prototype.createMarkerClickEvent_Edit = function(markerPoint, numId/*, arrOne*/) {
    var curObject = this;
    GEvent.addListener(markerPoint, "click", function() {
      if (isset(curObject.pointsInfo[numId])) {
        var objFormDom = $(curObject.getWhiteBoxPointForm(markerPoint, numId)).get(0);
    		$(objFormDom).find("#addedPointCancel").click (function () { //отмена
    		  curObject.deleteExistPoint(numId);
    		  markerPoint.closeInfoWindow();
          curObject.map.removeOverlay(markerPoint);
        });
      }
      else {
        var objFormDom = $(curObject.getWhiteBoxPointForm(markerPoint, 0)).get(0);
    		$(objFormDom).find("#newPointCancel").click (function () { //отмена
    		  markerPoint.closeInfoWindow();
          curObject.map.removeOverlay(markerPoint);  		  
    		});
      }
      $(objFormDom).find("#newPointSubmit").click (function () { //сохранение
        curObject.submitSavePoint(numId);		  
      });
      markerPoint.openInfoWindowHtml(objFormDom);
    });
    return markerPoint;
  }
  
  //Очищаем все наложения, включая маркеры
  prototype.resetOverlays = function () {
    this.pointsInfo = []; //Удаляем все маркеры из спец. массива
    this.map.clearOverlays(); //удаляем все наложения с карты
    this.curMarkerCounter = 0; //удаляем
	
	    var curObject = this;
	str = "if (typeof(yamap_"+curObject.canvasId+") != \"undefined\") {yamapka = yamap_"+curObject.canvasId+" ;}else {yamapka = false;}";
		  yamapka = eval( str );
			if (this.editMode == 6/* || this.editMode == 3*/) { 
			
			if (yamapka)
			{
				yamapka.removeAllOverlays();
			}
		}
  }
  
  prototype.reloadMarkers = function () {
//    var allMarkers = this.pointsInfo;
//    this.resetOverlays();
//    this.pointsInfo = allMarkers;
//    for (var i = 1; i < this.pointsInfo.length; i++) {
//      this.curMarkerCounter++;
//      this.parseOnePoint(new GLatLng(this.pointsInfo[i]['lat'], this.pointsInfo[i]['lng']));
//    }
    //this.recalculateBounds();
  }
  
  //Удаление точки из БД
  prototype.deleteExistPoint = function(numId) {
    var objLink = $("#addedPointCancel");
    if ($(objLink).attr("pressed") == "pressed")
      return false;
    $(objLink).attr("pressed", "pressed"); //Добавляем защиту от повторных нажатий
    	$.ajax({
      	type: "GET",
        url: W_AJAX + 'map/removePoint/' + this.pointsInfo[numId]['ID_point'] + '/',
        success: function(responseText){
        	if (navigator.userAgent.indexOf ("Opera") != -1) var arrInfo = eval('(' + responseText + ')');
    	    else var arrInfo = JSON.parse(responseText);
    	    if (arrInfo['result'] == 'OK') {
    	      alert('Точка удалена!');
    	    }
    	    else {
        		$(objLink).attr('pressed', 'no');
        		alert(arrInfo['err_text']);
        	}
        }
      });
    $(objLink).removeAttr("pressed");
  }
  
  //Добавление/редактирование точки (в БД)
  prototype.submitSavePoint = function(numId) {
    //alert(this.curMarkerCounter + 'до: ' + print_r(this.pointsInfo));
    var curObject = this; //передаём с помощью данной объекта this в inline-функции    
    var objLink = $("#newPointSubmit");
    if ($(objLink).attr("pressed") == "pressed")
      return false;
    $(objLink).attr("pressed", "pressed"); //Добавляем защиту от повторных нажатий
      var pLat = $("#newPointLat").val();
      var pLong = $("#newPointLong").val();
      var pName = $("#newPointName").val();
      var pIdPoint = $("#newPointID_point").length ? $("#newPointID_point").val() : 0;
      var pdescription = $("#newPointDescription").val();
	  pdescription = pdescription.replace('+', '%2B');
      var ajaxMapAction = pIdPoint ? 'updatePoint' : 'newPoint';
    	$.ajax({
      	type: "POST",
        url: W_AJAX + 'map/' + ajaxMapAction + '/' + this.mapId + '/',
        data: 'point_name=' + pName + '&description=' + pdescription + '&lat=' + pLat + '&long=' + pLong + (pIdPoint ? '&pointId=' + pIdPoint : ''),
        success: function(responseText){
        	if (navigator.userAgent.indexOf ("Opera") != -1) var arrInfo = eval('(' + responseText + ')');
    	    else var arrInfo = JSON.parse(responseText);
    	    if (arrInfo['result'] == 'OK') {
    	      alert(pIdPoint ? 'Точка успешно отредактирована!' : 'Точка успешно добавлена!');
    	      curObject.pointsInfo[numId/*pIdPoint ? numId : curObject.curMarkerCounter*/] = {ID_point: arrInfo['ID_point'], point_name: pName, point_description: pdescription};
    	      //alert(curObject.curMarkerCounter + 'после: ' + print_r(curObject.pointsInfo));
    	      var curInfoWindow = curObject.map.getInfoWindow();
    	      curInfoWindow.hide();
    	    }
    	    else {
        		$(objLink).attr('pressed', 'no');
        		alert(arrInfo['err_text']);
        	}
        }
      });
    $(objLink).removeAttr("pressed");
  }
  
  //Обновление состояния (избранное) для маркеров-объектов на карте
  prototype.updateArrayMarkerFavStatus = function(numId, status, i) { 
    if (isset(i)) this.pointsInfo[numId]['clustered'][i].isFavorite = status; 
    else this.pointsInfo[numId].is_favorite = status; 
  }
  
  prototype.showAjaxLoader = function () {

    var strEl = "<div class='ajax2loader'><img src='" + W_IMAGES + "icons/ajax2.gif' width='32' height='32' alt='Загружаем...'></div>";
   var objCanvas = $("#" + this.canvasId);
    var w = $(objCanvas).width();
    var h = $(objCanvas).height();
    $(strEl).appendTo($(objCanvas).parent()).css({width: w + "px", height: h + "px",top: "2px", left: "2px", "z-index": 10});
    $('.ajax2loader img').center();
  }
  prototype.hideAjaxLoader = function () {
    var objCanvas = $("#" + this.canvasId);
    if ($(objCanvas).parent().find('.ajax2loader').length > 0)
    $(objCanvas).parent().find('.ajax2loader').remove();
  }
  
  
}

