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(),
            'description': $('.description', 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 YMaps.GeoPoint(longitude, latitude);

    var map = new YMaps.Map(mapNode);

    map.setCenter(latlng, zoom);
    
    YMaps.Events.observe(map, map.Events.Click, cbMapClick);
    YMaps.Events.observe(map, map.Events.SmoothZoomEnd, getZoomLevel);
    YMaps.Events.observe(map, map.Events.DOMMouseScroll, setZoomLevel);
    
    setAddressPopup(map, latlng, data, false);
    
    $(mapNode).data('map', map);
}

function cbMapClick(map, mEvent) {
    if (isEditor) {
        setAddressPopup(map, mEvent.getGeoPoint(), null, true);
    }
}

function setZoomLevel(map, mEvent) {
    var delta = 0;

    var origEvent = mEvent._event;
    
    // Old IE
    if (!origEvent) {
        origEvent = window.event;
    }

    // IE and Opera
    if (origEvent.wheelDelta) {
        delta = origEvent.wheelDelta / 120;
    }

    // firefox
    if (origEvent.detail) {
        delta = origEvent.detail / 3;
    }
    
    if (origEvent.preventDefault) {
        origEvent.preventDefault();
    }

    origEvent.returnValue = false;

    var zoom = map.getZoom();
    var newzoom = zoom + delta;
    
    map.setZoom(newzoom, {
        smooth: true,
        position: null,
        centering: true,
        callback: function(state) { }
    });
    
}

function setAddressPopup(map, latlng, data, setFields) {
    if (latlng != null) {
        var prevMarker = map.prevMarker;
        if (prevMarker != null) {
            map.removeOverlay(prevMarker);
        }

        var pointxml = generateGeopointXml(latlng);

        if (isEditor && setFields) {
            window.external.ClickPoint(pointxml);
        }

        var marker = new YMaps.Placemark(latlng);
        
        
        map.addOverlay(marker);
        map.prevMarker = marker;
        if (data && data['address']) {
            marker.name = data['address'];
            if(data['description'])
            {
                marker.description = data['description'];
            }
            marker.openBalloon();
        }
    }
}

function generateGeopointHtml(data) {
    return data['address'];
}

function getZoomLevel(map, mEvent) {
    if (isEditor) {
        window.external.SetZoomLevel(map.getZoom());
    }
}

function setAddress(lat, lng, zoom) {
    var map = $('.mapCanvas').data('map');
    var prevMarker = map.prevMarker;

    if (prevMarker != null) {
        map.removeOverlay(prevMarker);
    }

    var latlng = new YMaps.GeoPoint(lng, lat);
    map.setCenter(latlng, zoom);

    setAddressPopup(map, latlng);
}


function generateGeopointXml(point) {
    var pointxml = '<geopoint>' +
    '<longitude>' + point.getLng() + '</longitude>' +
    '<latitude>' + point.getLat() + '</latitude>' +
    '<countrycode />' +
    '</geopoint>';

    return pointxml;
}


