// Скрипт управления картой Google Map
// Revision 4


var mainMarkerComp = {
  marker  : null,
  isShown : false,
  minZoom : 0
}

var objNameField = "objName";

// marker component
// name
// long
// lat
// marker
// isShown
// minZoom


var map = null;
var mgr = null;
var geocoder = null;


function gMapLoad() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("gMap"));
    map.setCenter(new GLatLng(59.93988,30.314669), 10);
    
    geocoder = new GClientGeocoder();
    
    // Добавить управление масштабом и положением (слева вверху)
    map.addControl(new GLargeMapControl());
    
    // Управлять типом картинок
    // map.addControl(new GMapTypeControl());
    
    // Add Marker manager
    mgr = new MarkerManager(map);

    // Add our location
    var point = new GLatLng( 59.936887,30.225524 );
    var marker = new GMarker(point);
    mgr.addMarker( marker, mainMarkerComp["minZoom"] );
    GEvent.addListener(marker, "click", function()
    {
      marker.openInfoWindowHtml( "Офис агентства недвижимости <a href='http://www.spb-estate.com' target='_blank'>Невский простор</a>");
    }
    );
    mainMarkerComp[ "marker" ] = marker;
    mainMarkerComp[ "isShown" ] = true;

    // loadMapItems(mgr);
    
    mgr.refresh();
    
  }
}


/// Загружает в карту объект
function loadItem( mgr, item ) {
    var itemMarker = new GMarker( new GLatLng(item["lat"], item["lng"]) );
    mgr.addMarker( itemMarker, item["minZoom"] );
    GEvent.addListener( itemMarker, "click",
      function() { itemMarker.openInfoWindowHtml( item["text"] ); }
    ) ;
}


/// Загружает объекты в карту
function loadMapItems(mgr){
    for ( itemIndex in gMapItems ) {
        loadItem( mgr, gMapItems[itemIndex] );
    }
}


function trigMainMarker() {
  if ( mainMarkerComp["isShown"] ) {
    mgr.removeMarker( mainMarkerComp["marker"] );
    mainMarkerComp["isShown"] = false;
  } else {
    mgr.addMarker( mainMarkerComp["marker"], mainMarkerComp["minZoom"] );
    mainMarkerComp["isShown"] = true;
  }
}


// Выбирает из коллекции первый объект, удовлетворяющий условию.
function selectItem( collection, fieldName, condition ) {
    for ( var item in collection ) {
        if ( collection[item][fieldName] == condition ) {
            return collection[item];
        }
    }
    return null;
}


// Находит адрес из имеющихся в нашей базе
function localAdrQuery( objectName ) {
    return selectItem( gMapItems, objNameField, objectName );
}


function showItem( id ) {

    var item = getMapItem( id );

    if ( !item ) {
        alert("Объект под номером " + id + " не найден." );
        return;
    }
    
    var targetPoint = new GLatLng( item["lat"] ,item["lng"] );
    map.setCenter( targetPoint, 17);

}


function getMapItem( id ) {
    return selectItem( gMapItems, "id", id );
}


function toggleMapVisibility( visible ) {
    if ( !visible ) {
        var gMapElem = document.getElementById('gMap');
        if ( gMapElem != null ) {
            gMapElem.style.display = 'none';
        }
    }
}
    

function googleAddressQueryWithText(address, textToShow) {
  geocoder.getLatLng( address, function(point) {
      if (!point) {
        // alert(address + " не найдено.");
        toggleMapVisibility( false );
      } else {
        map.setCenter(point, 16);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml(textToShow);
        toggleMapVisibility( true );
      }
    }
  );
}


function googleAddressQuery(address) {
    googleAddressQueryWithText( address, address );
}


function gMapsShowAddress( ) {
    var visible = false;
    var addrElem = document.getElementById('gMapAddr');
    if ( addrElem != null ) {
        var addr = addrElem.value;
        if ( addr.length > 0 ) {
            var shortDescElem = addrElem; // document.getElementById('ItemShortDescription');
            if ( shortDescElem != null ) {
                var description = shortDescElem.innerHTML;
                if ( description.length === 0) {
                    description = addr;
                }
                googleAddressQueryWithText( addr, description );
                visible = true;
            }
        }
    }
    
    toggleMapVisibility( visible );
}

function gMapsShowAddressWithDescription( ) {
    var visible = false;
    var addrElem = document.getElementById('gMapAddr');
    if ( addrElem != null ) {
        var addr = addrElem.value;
        if ( addr.length > 0 ) {
            var shortDescElem = document.getElementById('ItemShortDescription');
            if ( shortDescElem != null ) {
                var description = shortDescElem.innerHTML;
                if ( description.length === 0) {
                    description = addr;
                }
                googleAddressQueryWithText( addr, description );
                visible = true;
            }
        }
    }
    
    toggleMapVisibility( visible );
}



