var geoCoder;
var isEditor = false;

function initializeMaps() {

    $('.mapCanvas').each(function(el) {
        var mapNode = this;

        var latitude = parseFloat($('.latitude', this).html());
        var longitude = parseFloat($('.longitude', this).html());
        var zoom = parseInt($('.zoom', this).html(), 10);

        var data = {
            'address': $('.address', this).html()
        };

    initializeMap(mapNode, latitude, longitude, zoom, data);
});
}

function initializeMapFromUrl() {

    var latitude = getURLParam('latitude');
    var longitude = getURLParam('longitude');
    var zoom = parseInt(getURLParam('zoom'));
    var mapNode = $('.mapCanvas').get(0);
    
    initializeMap(mapNode, latitude, longitude, zoom);
}

function initializeMap(mapNode, latitude, longitude, zoom, data) {
    var latlng = new GLatLng(latitude, longitude);

    var map = new GMap2(mapNode);
    
    var address = data && data['address'] ? data['address'] : '';
    
    map.setCenter(latlng, zoom);
    map.setUIToDefault();
    map.originalLatLng = latlng;
    map.customAddress = address;
    
    GEvent.addListener(map, 'click', cbMapClick);
    GEvent.addListener(map, 'zoomend', getZoomLevel);

    geoCoder = new GClientGeocoder();

    if (isEditor) {
        setAddressPopupWithGeoCode(map, latlng, address);
    } else {
        setAddressPopup(map, latlng, address);
    }

    $(mapNode).data('map', map);
}

function cbMapClick(overlay, latlng) {
    // here this is map not window
    var map = this;
    if (isEditor) {
        setAddressPopupWithGeoCode(map, latlng);
    } else {
        setAddressPopup(map, map.originalLatLng);
    }
}


function setAddressPopupWithGeoCode(map, latlng, address) {
    if (latlng != null) {

        geoCoder.getLocations(latlng, function(response) {
            cbGetLocations(map, response);
        });
    }
}

function setAddressPopup(map, latlng, address) {
    
    marker = new GMarker(latlng);
    map.addOverlay(marker);
    var data = {
        'address': map.customAddress || address
    };
    marker.openInfoWindowHtml(generateGeopointHtml(data));
}


function cbGetLocations(map, response) {

    if (!response || response.Status.code != 200) {
        alert('Connection error! Status code: ' + response.Status.code);
        return;
    }

    map.clearOverlays();
    var place = response.Placemark[0];
    var latlng = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

    var pointxml = generateGeopointXml(place);

    if (isEditor) {
        window.external.ClickPoint(pointxml);
    }

    setAddressPopup(map, latlng, place.address);
}

function generateGeopointHtml(data) {
    return data['address'];
}

function getZoomLevel(oldLevel, newLevel) {
    if (isEditor) {
    window.external.SetZoomLevel(newLevel);
    }
}

function setAddress(lat, lng, zoom) {
    var map = $('.mapCanvas').data('map');

    map.clearOverlays();

    var latlng = new GLatLng(lat, lng);
    map.setCenter(latlng, zoom);

    setAddressPopupWithGeoCode(map, latlng);
}


function generateGeopointXml(place) {
    var pointxml = '<geopoint>' +
    '<longitude>' + place.Point.coordinates[0] + '</longitude>' +
    '<latitude>' + place.Point.coordinates[1] + '</latitude>' +
    '<address>' + place.address + '</address>' +
    '<countrycode>' + place.AddressDetails.Country.CountryNameCode + '</countrycode>' +
    '</geopoint>';
    
    return pointxml;
}


