var update_date = '20110112' // Maps upadate date, change to avoid cache
var z = 9; // исходный масштаб
var minzoom = 7; // масштаб, после которого показываем покрытие, до него -- точки.
var debug   = false;
var placemarks = new Array();
var ind = 0; // default city index
var map = new YMaps.Map(YMaps.jQuery("#mapCanvas")[0]);
map.setMaxZoom(16);



map.addControl(new YMaps.TypeControl());
map.addControl(new YMaps.Zoom());

//map.addControl(new YMaps.ToolBar());

map.addControl(new YMaps.ScaleLine());
map.enableScrollZoom('smooth');

//Конвертер типов карт
var typeConverter = new TypeConverter();

var counters = new YMaps.Style();
counters.iconStyle = new YMaps.IconStyle("yota#countersPointIcon");
counters.iconStyle.offset = new YMaps.Point(-11, -28);
counters.iconStyle.href = "/images/map/marker-yellow.png";
counters.iconStyle.size = new YMaps.Point(22, 28);
counters.iconStyle.shadow = new YMaps.IconShadowStyle();
counters.iconStyle.shadow.offset = new YMaps.Point(-15, -35);
counters.iconStyle.shadow.href = "/images/map/point-shadow.png";
counters.iconStyle.shadow.size = new YMaps.Point(36, 34);
YMaps.Styles.add("yota#countersPoint", counters);


var citypoints = new YMaps.Style();
citypoints.iconStyle = new YMaps.IconStyle("yota#countersPointIcon");
citypoints.iconStyle.offset = new YMaps.Point(-11, -28);
citypoints.iconStyle.href = "/images/map/marker-blue.png";
citypoints.iconStyle.size = new YMaps.Point(22, 28);
citypoints.iconStyle.shadow = new YMaps.IconShadowStyle();
citypoints.iconStyle.shadow.offset = new YMaps.Point(-15, -35);
citypoints.iconStyle.shadow.href = "/images/map/point-shadow.png";
citypoints.iconStyle.shadow.size = new YMaps.Point(36, 34);
YMaps.Styles.add("yota#cityPoints", citypoints);




//Создание стиля для значка метки
var s = new YMaps.Style();
s.iconStyle = new YMaps.IconStyle();
s.iconStyle.href = "/images/map/marker-green.png";
s.iconStyle.size = new YMaps.Point(22, 28);
s.iconStyle.offset = new YMaps.Point(-9, -29);

s.iconStyle.shadow = new YMaps.IconShadowStyle();
s.iconStyle.shadow.href = "/images/map/point-shadow.png";
s.iconStyle.shadow.size = new YMaps.Point(36, 34);
s.iconStyle.shadow.offset = new YMaps.Point(-15, -34);


// coordinates
// regionBounds : new YMaps.GeoBounds(new YMaps.GeoPoint(west, north), new YMaps.GeoPoint(east, south))
// TODO Replace with center point
var zones = [
         {
           zoneName     : 'moscow',
           ruName       : 'Москва',
           enName       : 'Moscow',
           centerPoint  : new YMaps.GeoPoint(37.609218,55.753559),
           zoom         : 9
         },
         {
           zoneName     : 'spb',
           ruName       : 'Санкт-Петербург',
           enName       : 'Saint-Petersburg',
           centerPoint  : new YMaps.GeoPoint(30.313497,59.938531)
         },
         {
           zoneName     : 'ufa',
           ruName       : 'Уфа',
           enName       : 'Ufa',
           centerPoint  : new YMaps.GeoPoint(55.983161,54.738437)
         },
         {
           zoneName     : 'sochi',
           ruName       : 'Сочи',
           enName       : 'Sochi',
           centerPoint  : new YMaps.GeoPoint(39.722271,43.582795)
         },
         {
           zoneName     : 'krasnodar',
           ruName       : 'Краснодар',
           enName       : 'Krasnodar',
           centerPoint  : new YMaps.GeoPoint(38.976032,45.034942)
         },
         {
           zoneName     : 'vyborg',
           ruName       : 'Выборг',
           enName       : 'Vyborg',
           centerPoint  : new YMaps.GeoPoint(28.712133,60.71851),
           zoom         : 10
         },
         {
           zoneName     : 'luga',
           ruName       : 'Луга',
           enName       : 'Luga',
           centerPoint  : new YMaps.GeoPoint(29.845501,58.73693),
           zoom         : 11
         },
         {
           zoneName     : 'serpukhov',
           ruName       : 'Сурпухов',
           enName       : 'Serpukhov',
           centerPoint  : new YMaps.GeoPoint(37.414993,54.913324)
         },

        {
           zoneName     : 'lenoblast',
           ruName       : 'Ленинградская область',
           enName       : 'Leningradskaya oblast',
           centerPoint  : new YMaps.GeoPoint(29.695042,60.192402),
           zoom         : 7,
           notshowpoint : true
         },

         {
           zoneName     : 'mosoblast',
           ruName       : 'Московская область',
           enName       : 'Moskovskaya oblast',
           centerPoint  : new YMaps.GeoPoint(37.609218,55.753559),
           zoom         : 8,
           notshowpoint : true
         },
         {
           zoneName     : 'nsk',
           ruName       : 'Новосибирск',
           enName       : 'Novosibirsk',
           centerPoint  : new YMaps.GeoPoint(82.958437,55.010251),
           zoom         : 10,
           notshowpoint : true
         }
       ];

  var cities = new Array();
  var lang = getCookie('lang');
    for (var i=0;i<zones.length;i++)  {
    if (typeof(zones[i].notshowpoint) == 'undefined' || !zones[i].notshowpoint) {
      var _placemark = new YMaps.Placemark(zones[i].centerPoint);
      if(lang == 'ru') {
      _placemark.setBalloonContent(zones[i].ruName);
      } else {
      _placemark.setBalloonContent(zones[i].enName);
      }
      _placemark.setStyle("yota#cityPoints");
      cities.push(_placemark);
      }
    }


//Bounds via JSON

  function is_tile_in_bounds(bounds, zoom, tile) {
    $flag = false;
    for (i in bounds[zoom])  {
      if (tile.x >= bounds[zoom][i][0] && tile.y >= bounds[zoom][i][1] && tile.x <= bounds[zoom][i][2] && tile.y <= bounds[zoom][i][3]) {
      $flag = true;
      }
    }
    return $flag;
  }

  var encoded = $.toJSON($bounds_json);
  var $bound_zones = $.evalJSON(encoded);

  var myData = new YMaps.TileDataSource("/images/y.coverage/tiles", true, false);

  myData.getTileUrl = function (tile, zoom) {
    if ((zoom > minzoom) && is_tile_in_bounds($bound_zones, zoom, tile)) {
      return this.getTileUrlTemplate() + "/" + zoom + "/" + tile.x + "-" + tile.y + ".png?" + update_date;
    }
  }


  var myLayer = new YMaps.Layer(myData);
  map.addLayer(myLayer);


  // Select default city if defined
  var defCity = getCookie('YOTA_CITY_NAME');
  if (defCity) {
    switch (defCity.replace(/\+/g, ' ')) {
      case 'Saint Petersburg':
      case 'Sankt-Peterburg':
        ind = 1;
        break;
      case 'Ufa':
        ind = 2;
        break;
      case 'Sochi':
        ind = 3;
        break;
      case 'Krasnodar':
        ind = 4;
        break;

      case 'Moscow':
      default:
        ind = 0;
    }

  }


    YMaps.Events.observe(map, map.Events.Update, function () {
      z = map.getZoom();
      if (z <= minzoom) {
      map.addOverlay(cities);
      } else {
        map.removeOverlay(cities);
      }
      if (debug) {debugMap();}
    });

    $('#select_town').change(function () {
      scrollToCity($('#select_town').val());
    });



if ($("#address").val()) {
  showAddress ($("#address").val());
}


$("#coverage_search").submit(function (){
  showAddress ($("#select_town option:selected").text()  + ', ' + $("#address").val());
  return false;
});


function scrollToCity(index) {
  if (jQuery.fn.jScrollPaneRemove) {
    $("#addresses").empty().jScrollPaneRemove();
  } else {
    $("#addresses").empty();
  }
  $('#cover_points h4').hide();
  $('#no_coverage').hide();
  $("#no_coverage .form-success").remove();
  map.setCenter(zones[index].centerPoint);
  if(typeof(zones[index].zoom) != 'undefined') {
    map.setZoom(zones[index].zoom);
  } else {
    map.setZoom(z);
  }
   $('#select_town').attr('selectedIndex', index);
}

function debugMap() {
  geores = typeof(geoResult)!="undefined" ? geoResult.text + '.  <br/>Координаты: <span id="debug-coords">' + geoResult.getGeoPoint().toString() : '</span>';
  $("#result").html(geores +
      '<br/>LeftBottom: ' + map.getBounds().getLeftBottom().toString() +
      ' RightTop: ' + map.getBounds().getRightTop().toString() +
      ' Center: '  + map.getBounds().getCenter().toString() +
      ' Zoom:' + map.getZoom()
        );
}

function showAddress (value) {
  if (typeof(geoResult) != 'undefined') {
  map.removeOverlay(geoResult);
  map.removeOverlay(placemarks);
  placemarks = Array();
  $("#addresses").empty();
  }

  var geocoder = new YMaps.Geocoder(value, {results: 25, boundedBy: map.getBounds()});
  YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
      if (this.length()) {
        var html = '';
        data = this;
        for (var i = 0; i<data.length(); i++) {
           geoResult = data.get(i);
           geoResult.setBalloonContent(geoResult.text);
           geoResult.setStyle("yota#countersPoint");
           geoResult.setOptions({"draggable":true});

           placemarkControls(geoResult);

           placemarks.push(geoResult);
           html += '<dl pointID="' + i + '"><dt><span><a href="#point' + i + '" onclick="showAddressInfo(' + i +',true);return false;" style="background-image: url()">' + (i+1)*1 + '</a></span>' +
           '<a href="#point' + i + '" onclick="showAddressInfo(' + i +',true); return false;">' + geoResult.text + '</a></dt>' +
           '<dd>' + '</dd></dl>';
        }

          map.addOverlay(placemarks);
          map.panTo(placemarks[0].getGeoPoint());
          map.setZoom(14);
          showAddressInfo(0, false);
          $('#cover_points h4').show();
          $("#addresses").html(html);
          $('#addresses').jScrollPane({
            scrollbarWidth: 14,
            showArrows: true,
            arrowSize: 17
          });
          $('#no_coverage').show();

      }
      else {
          alert("Ничего не найдено!");
          }
      });
  };


  function showAddressInfo(i, openBalloon) {
    var marker = placemarks[i];
    setAddressValue(marker.getBalloonContent(), marker.getGeoPoint().getLat(), marker.getGeoPoint().getLng());
    map.setCenter(marker.getGeoPoint());
   if (openBalloon) {
     marker.openBalloon();
   }
  }


  function setAddressValue(address, latitude, longitude) {
    $("#no_coverage .form-success").remove();
    $('#userAddress').attr('readonly','readonly').val(address);
    $('#latitude').val(latitude);
    $('#longitude').val(longitude);
  }

  function getCookie(name) {
    var cName   = name + '=',
      cookies = document.cookie.split(';');
    for (var i=0; i < cookies.length; i++) {
      var c = cookies[i];
      while (c.charAt(0)==' ')
        c = c.substring(1,c.length);
      if (c.indexOf(cName) == 0)
        return c.substring(cName.length, c.length);
    }
    return null;
  }


//Получаем параметры из URL'а
  var params = {
      ll : getParam("ll"),    // Центр карты
      spn : getParam("spn"),  // Линейный размер области
      t : getParam("t"),       // Тип карты
      getcity: getParam("city") // ID города
  };


  if(params.getcity && zones[params.getcity]) {
    $('#select_town').val(params.getcity);
  }

// Если в урле заданы необходимые параметры
  if (params.ll && params.spn && params.t) {
      // Центрируем карту в нужном месте
      var bounds = YMaps.GeoBounds.fromCenterAndSpan(YMaps.GeoPoint.fromString(params.ll), YMaps.Size.fromString(params.spn));
      map.setBounds(bounds);
      // Устанавливаем требуемый тип карты
      map.setType(typeConverter.nameToType(params.t));
  } else if (params.getcity) {
    scrollToCity(params.getcity);
  }  else {
      // Переходим к городу из куки
    scrollToCity(ind);
  }

  // Динамически формируем URL
   YMaps.Events.observe(map, [map.Events.BoundsChange, map.Events.TypeChange],  function () {
  //  YMaps.Events.observe(map, map.Events.Update, function () {
      YMaps.jQuery("#bigmaplink")
          .attr("href", "y.bigmap.php?t=" + typeConverter.typeToName(map.getType()) +
                        "&ll=" + map.getCenter().toString() +
                        "&spn=" + map.getBounds().getSpan().toString(6) +
                        "&" + "city=" + $('#select_town').val() +
                        "&" + "search=" + $('#address').val()
          );

      YMaps.jQuery("#link-fullscreenmap")
      .attr("href", "/ru/coverage/russia/map-fullscreen.php?t=" + typeConverter.typeToName(map.getType()) +
                    "&ll=" + map.getCenter().toString() +
                    "&spn=" + map.getBounds().getSpan().toString(6) +
                    "&" + "city=" + $('#select_town').val() +
                    "&" + "search=" + $('#address').val()
      );
  });

  // Получение параметра из URL'а
  function getParam (name, location) {
      location = location || window.location.search;
      var res = location.match(new RegExp('[?&]' + name + '=([^&]*)', 'i'));
      return (res && res[1] ? res[1] : '');
  }

 //Конвертер типов карт
  // Если тип карты не был определен, то по умолчанию возвращается тип карты YMaps.MapType.MAP (или имя "map")
  function TypeConverter () {
      // Доступные типы карты
      var types = [YMaps.MapType.MAP, YMaps.MapType.SATELLITE, YMaps.MapType.HYBRID],

          // Имена карт
          names = ["map", "sat", "hyb"];

      // Возвращает имя карты по ее типу
      this.typeToName = function (type) {
          return names[valid(YMaps.jQuery.inArray(type, types))];
      };

      // Возвращает тип карты по имени
      this.nameToType = function (name) {
          return types[valid(YMaps.jQuery.inArray(name, names))];
      };

      // Проверяет правильность полученного индекса
      function valid (index) {
          return (index == -1) ? 0 : index;
      }
  };



  $("#bigmaplink").click(function(){
    window.open(this.href,'bigmap','width=1000,height=830,scrollbars=yes,menubar=no,status=no');
    return false;
  });



/**************************************** DRAG *********************************************************/


var placemark = null;

function addDraggablePlacemark() {
  if(placemark==null) {
    placemark=new YMaps.Placemark(map.getCenter(), {draggable : true, style: s});
    map.addOverlay(placemark);
    placemarkControls(placemark)
  } else {
    placemark.setGeoPoint(map.getCenter());
  }
  placemark.setBalloonContent($("#select_town option:selected").text() + ", " + $("#address").val());
}


//Прикрепляет обработчики событий метки

function placemarkControls(placemark) {

  YMaps.Events.observe(placemark, placemark.Events.Drag, function (obj) {
      var current = obj.getGeoPoint().copy();
      var lat = current.getLat();
      var lng = current.getLng();
  });

  YMaps.Events.observe(placemark, placemark.Events.DragEnd, function (obj) {
      // Устанавливает содержимое балуна
   var current = obj.getGeoPoint().copy();

   var lat = current.getLat();
   var lng = current.getLng();

   if (placemark.getBalloonContent() == null) {
      placemark.setBalloonContent( $("#address").val() );
      }
      setAddressValue(placemark.getBalloonContent(), lng, lat);
  });
}

