//============================================================================//
//========                  GOOGLE MAPS                             ==========//
//============================================================================//

var map;
var user_city;
var marker_city_icon, marker_city_shadow;
var pos_placemark;
var objManager = null;
var geocoder;
var city_zoom_level, map_type;

var infowindow;

//============================================================================//

function mapFilterControl (controlDiv, map) {


  // Set CSS styles for the DIV containing the control
  // Setting padding to 5 px will offset the control
  // from the edge of the map
  controlDiv.style.padding = '5px';

  // Set CSS for the control border
  var controlUI = document.createElement('DIV');
  controlUI.innerHTML = $('#inmaps_map_filter').html();
  controlUI.style.backgroundColor = 'white';
  controlUI.style.borderStyle = 'solid';
  controlUI.style.borderWidth = '1px';
  controlUI.style.cursor = 'pointer';
  controlUI.style.textAlign = 'center';
  controlUI.style.padding = '10px';  
  controlDiv.appendChild(controlUI);
  $('#inmaps_map_filter').hide();

}

//============================================================================//

function setMarkerStyles(){

    marker_city_icon = new google.maps.MarkerImage('/components/maps/images/markers/city.png',
        new google.maps.Size(27, 32),
        new google.maps.Point(0, 0),
        new google.maps.Point(13, 32)
    );

    marker_city_shadow = new google.maps.MarkerImage('/components/maps/images/markers/marker-shadow-city.png',
        new google.maps.Size(35, 32),
        new google.maps.Point(0,0),
        new google.maps.Point(6, 32)
    );

}

//============================================================================//

function initGeoSystem(mode, cfg_city_zoom_level, cfg_map_type) {

    city_zoom_level = cfg_city_zoom_level;

    user_city   = $('input[name=user_city]').val();

    geocoder    = new google.maps.Geocoder();

    setMarkerStyles();

    geocoder.geocode({'address': user_city}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

            switch (mode){
                case 'city':    var zoom = 11;  break;
                case 'country': var zoom = 4;   break;
                default:        var zoom = 11;  break;
            }

            switch (cfg_map_type){
                case 'map':         map_type = google.maps.MapTypeId.ROADMAP;   break;
                case 'hybrid':      map_type = google.maps.MapTypeId.HYBRID;    break;
                case 'satellite':   map_type = google.maps.MapTypeId.SATELLITE; break;
                default: map_type = google.maps.MapTypeId.ROADMAP; break;
            }

            var mapOptions = {
              zoom: zoom,
              center: results[0].geometry.location,
              mapTypeControl: true, 
              mapTypeId: map_type
            };

            if (cfg_map_type != 'any') { mapOptions.mapTypeControl = false; }

            map = new google.maps.Map(document.getElementById("citymap"), mapOptions);

            infowindow = new google.maps.InfoWindow();

            if ($('#inmaps_map_filter:visible').length){

                var filterControlDiv    = document.createElement('DIV');
                var filterControl       = new mapFilterControl(filterControlDiv, map);
                filterControlDiv.index  = 1;
                
                map.controls[google.maps.ControlPosition.RIGHT_TOP].push(filterControlDiv);

                filterControlDiv.style.display = (zoom <= city_zoom_level ? 'none' : 'block');

                google.maps.event.addListener(map, 'zoom_changed', function() {
                    filterControlDiv.style.display = (map.getZoom() <= city_zoom_level ? 'none' : 'block');
                });

            }

            google.maps.event.addListener(map, 'zoom_changed', function() {
                infowindow.close();
            });

            objManager = new MarkerManager(map, { maxZoom: 18, trackMarkers: false });

            getMarkers();

      } else {

          alert('Ошибка инициализации карты. Проверьте что указан город по-умолчанию.');

      }
    });
    
}

function unloadGeoSystem(){
    map.destructor();
}

function redrawMap(){
    google.maps.event.trigger(map, 'resize');
}

//============================================================================//

function initPlaceMap(address){

    geocoder    = new google.maps.Geocoder();

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

            var mapOptions = {
              zoom: 15,
              center: results[0].geometry.location,
              mapTypeId: google.maps.MapTypeId.ROADMAP,
              panControl: false,
              zoomControl: true,
              scaleControl: false,
              mapTypeControl: false,
              streetViewControl: false
            };

            map = new google.maps.Map(document.getElementById("placemap"), mapOptions);

            var marker = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location,
            });

      }
    });

}

function initPlaceMapXY(lng, lat, name){

    var point = new google.maps.LatLng(lat, lng);

    var mapOptions = {
        zoom: 15,
        center: point,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        panControl: false,
        zoomControl: true,
        scaleControl: false,
        mapTypeControl: false,
        streetViewControl: false
    };

    map = new google.maps.Map(document.getElementById("placemap"), mapOptions);

    var marker = new google.maps.Marker({
        map: map,
        position: point,
        title: name
    });

    
}

//============================================================================//

function initMarkerMapXY(lng, lat){

    geocoder  = new google.maps.Geocoder();

    var point = new google.maps.LatLng(lat, lng);

    var mapOptions = {
      zoom: 13,
      center: point,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      panControl: false,
      streetViewControl: false
    };

    map = new google.maps.Map(document.getElementById("marker_map"), mapOptions);

    pos_placemark = new google.maps.Marker({
        map: map,
        position: point,
        draggable: true
    });
    
}

function centerMarkerMap(address){

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

          map.setCenter(results[0].geometry.location);
          pos_placemark.setPosition(results[0].geometry.location);

      }
    });

}

function getMarkerMapPos(){

    var point = pos_placemark.getPosition();

    return {x: point.lng(), y: point.lat()};

}

function destroyMarkerMap(){
    map = null;
    geocoder = null;
}

//============================================================================//

function clearMap(){
    objManager.clearMarkers();
    objManager.initialize(map, {});
}

//============================================================================//

function detectLatLng(){

    var geocoder    = new google.maps.Geocoder();

    var country = $('input[name=addr_country]').val();
    var city    = $('input[name=addr_city]').val();
    var prefix  = $('select[name=addr_prefix]').val();
    var street  = $('input[name=addr_street]').val();
    var house   = $('input[name=addr_house]').val();

    var address = country + ', ' + city + ', ' + prefix + ' ' + street + ' ' + house;

    $('#detect_btn').attr('disabled', 'disabled').val('Подождите...');

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
            $('input[name=addr_lat]').val(results[0].geometry.location.lat()).fadeOut('fast').fadeIn('fast');
            $('input[name=addr_lng]').val(results[0].geometry.location.lng()).fadeOut('fast').fadeIn('fast');
      } else {
          alert('Не удалось определить координаты\nGoogle ответил: '+status);
      }
      $('#detect_btn').attr('disabled', '').val('Найти координаты');
    });

}

function detectLatLngList(){

    if ($('tr.item_row').length==0) {
        $('.start_detect').hide();
        $('.save_detect').show();
        return;
    }

    var tr = $('tr.item_row').eq(0);

    var address = $(tr).find('td.addr').html();
    var item_id = $(tr).attr('rel');

    var geocoder    = new google.maps.Geocoder();

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
            $('#'+item_id+'_lat').val(results[0].geometry.location.lat()).attr('disabled', '');
            $('#'+item_id+'_lng').val(results[0].geometry.location.lng()).attr('disabled', '');
      }
    });

    $(tr).removeClass('item_row');

    if ($('tr.item_row').length==0) {
        $('.start_detect').hide();
        $('.save_detect').show();
        return;
    }

    setTimeout('detectLatLngList()', 1000);

}

//============================================================================//

function centerAddress(address, zoom){

    if (!zoom){ zoom = 11; }

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location, zoom);
            map.setZoom(zoom);
      }
    });

}

//============================================================================//

function addMarkers(list){

    for(place_id in list) if (list.hasOwnProperty(place_id)) {

        if (typeof(list[place_id].lng) != 'undefined'){
            addMarkerXY(place_id, list[place_id].lng, list[place_id].lat, list[place_id].icon, list[place_id].zoom);
        } else {
            addCityMarker(list[place_id].city, list[place_id].country);
        }

    }

    objManager.refresh();

}

function addCityMarker(city, country) {

    var geocoder    = new google.maps.Geocoder();

    geocoder.geocode({'address': country+', '+city}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

            var marker = new google.maps.Marker({
                position: results[0].geometry.location,
                icon: marker_city_icon,
                shadow: marker_city_shadow
            });

            google.maps.event.addListener(marker, 'click', function() {
                clickCityMarker(city, country, marker);
            });

            var zoom = (city == user_city ? city_zoom_level : 18);

            objManager.addMarker(marker, 1, zoom);

      }
    });

}

function addMarker(place_id, address, icon, min_zoom) {

    if (!icon) { icon = 'default.png'; }

    if (min_zoom==0) { min_zoom = city_zoom_level + 1; }

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

            var marker = new google.maps.Marker({                        
                position: results[0].geometry.location,
                icon: new google.maps.MarkerImage('/components/maps/images/markers/'+icon,
                    new google.maps.Size(27, 26),
                    new google.maps.Point(0,0),
                    new google.maps.Point(6, 26)
                )
            });

            google.maps.event.addListener(marker, 'click', function() {
                clickMarker(place_id, marker);
            });

            objManager.addMarker(marker, min_zoom, 18);

      }
    });

}

function addMarkerXY(place_id, lng, lat, icon, min_zoom) {

    if (!icon) { icon = 'default.png'; }

    if (min_zoom==0) { min_zoom = city_zoom_level + 1; }

    var marker = new google.maps.Marker({       
        position: new google.maps.LatLng(lat, lng),
        icon: new google.maps.MarkerImage('/components/maps/images/markers/'+icon,
            new google.maps.Size(27, 26),
            new google.maps.Point(0,0),
            new google.maps.Point(6, 26)
        )
    });

    google.maps.event.addListener(marker, 'click', function() {
        clickMarker(place_id, marker);
    });

    objManager.addMarker(marker, min_zoom, 18);

}

function clickMarker(place_id, marker){

    $.ajax({
        type: 'POST',
        url: '/maps/ajax/get-info/'+place_id,
        success: function(msg){
            infowindow.setContent(msg);
            infowindow.open(map,marker);
        }
    });
    
}

function clickCityMarker(city, country, marker){

    city    = encodeURIComponent(city);
    country = encodeURIComponent(country);

    $.ajax({
        type: 'POST',
        url: '/maps/ajax/get-city-info/'+country+'/'+city,
        success: function(msg){
            infowindow.setContent(msg);
            infowindow.open(map,marker);
        }
    });

}

function zoomToCity(city){

    $('input[name=user_city]').val(city);

    user_city = city;

    infowindow.close();

    getMarkers();

    centerAddress(city, 11);

}

//============================================================================//

