//============================================================================//
//========                  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, city_zoom, map_type;

var infowindow;

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

function mapFilterControl (controlDiv, map) {

  controlDiv.style.padding = '5px';
  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(options) {

    city_zoom_level = options.city_zoom_level;
    city_zoom       = options.zoom_city;

    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) {

            var zoom;

            switch (options.mode){
                case 'city':    zoom = options.zoom_city;  break;
                case 'country': zoom = options.zoom_country;   break;
                default:        zoom = options.zoom_city;  break;
            }

            switch (options.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: Number(zoom),
              maxZoom: options.zoom_max, 
              minZoom: options.zoom_min,
              center: results[0].geometry.location,
              mapTypeControl: true, 
              mapTypeId: map_type
            };

            if (options.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: 16, trackMarkers: false });

            setTimeout('getMarkers()', 2000);

            if (options.center_lng && options.center_lat){
                options.center_lng = options.center_lng.replace(",", ".");
                options.center_lat = options.center_lat.replace(",", ".");
                map.setCenter(new google.maps.LatLng(options.center_lat, options.center_lng));
            }

      } else {

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

      }
    });
    
}

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

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

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

function initPlaceMapXY(lng, lat, name, options){

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

    if (typeof(options)=="undefined"){
        options = { zoom_max:15, zoom_min:5, zoom:15, map_type:'map' };
    } else {
        if (typeof(options.zoom_max)=="undefined"){ options.zoom_max = 15; }
        if (typeof(options.zoom_min)=="undefined"){ options.zoom_min = 5; }
        if (typeof(options.zoom)=="undefined"){ options.zoom = 15; }
        if (typeof(options.map_type)=="undefined"){ options.map_type = 'map'; }
    }

    switch (options.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: Number(options.zoom),
        maxZoom: options.zoom_max,
        minZoom: options.zoom_min,
        center: point,
        mapTypeId: map_type,
        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(addr){

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

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

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

    geocoder.geocode({'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
            $('.addr_coord[rel='+addr.id+'] .addr_lat').val(results[0].geometry.location.lat()).fadeOut('fast').fadeIn('fast');
            $('.addr_coord[rel='+addr.id+'] .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(var p in list) {
        
        var place = list[p];

        if (!place.is_city){
            addMarkerXY(place.id, place.lng, place.lat, place.icon, place.zoom);
        } else {
            addCityMarker(place.city, place.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(marker_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(marker_id, marker);
            });

            objManager.addMarker(marker, min_zoom, 18);

      }
    });

}

function addMarkerXY(marker_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(marker_id, marker);
    });

    objManager.addMarker(marker, min_zoom, 18);

}

function clickMarker(marker_id, marker){

    $.ajax({
        type: 'POST',
        url: '/maps/ajax/get-info/'+marker_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, city_zoom);

}

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

