jQuery.fn.dynamicMap = function (options)
{
    if (!options) {
        options = { };
    }
    settings = {
        center: [49.646291, 15.501709],
        zoom: 6,
        url: null
    };
    jQuery.extend(settings, options);
    
    this.each(function () {
        if (!this.dynmap) {
            var latlng = new google.maps.LatLng(settings.center[0], settings.center[1]);
            var startOptions = { zoom: settings.zoom, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP };
            this.dynmap = new google.maps.Map(this, startOptions);
            this.dynmap.settings = settings;
            this.dynmap.dynmarkers = [];
            jQuery.extend(this.dynmap, jQuery.fn.dynamicMap.utils);
            this.dynmap.dynInit(); 
        }
    });
}

jQuery.fn.dynamicMap.utils = {
    dynInit: function ()
    {
        if (this.settings.url!='') {
            if (this.settings.fullyDynamic) {
                google.maps.event.addListener(this, 'center_changed', this.update);
            }
            this.update();
        }
    },

    update: function ()
    {
        $.ajax({
            url: this.settings.url,
            context: this,
            dataType: 'json',
            data: {
                lat: this.center.lat(),
                lng: this.center.lng(),
                zoom: this.zoom
            },
            success: this.updated
        });
    },
    
    updated: function (data, textStatus)
    {
        var dynmap = this;
        var markers = data.markers;
      
        this.deleteAllMarkers();
        
        for (var i = 0; i < markers.length; i++) {
            if (this.checkMarkerId(markers[i].id)) {
                var vpos = new google.maps.LatLng(markers[i].lat, markers[i].lng);
                var vmark = new google.maps.Marker({
                    position: vpos, 
                    map: dynmap, 
                    title: markers[i].title,
                    icon: markers[i].icon,
                    clickable: true
                });
                if (markers[i].url) {
                    vmark.url = markers[i].url;
                    vmark.click = function () { window.location = this.url; };
                    google.maps.event.addListener(vmark, 'click', vmark.click);
                }
                vmark.uniqid = markers[i].id;
                this.dynmarkers[this.dynmarkers.length] = vmark;
            }
        }
    },
    
    deleteAllMarkers: function ()
    {
        var lat = this.center.lat();
        var lng = this.center.lng();
        for (var i = 0; i < this.dynmarkers.length; i++) {
            this.dynmarkers[i].setMap(null);
        }
        this.dynmarkers = [];
    },
    
    checkMarkerId: function (id)
    {
        for (var i = 0; i < this.dynmarkers.length; i++) {
            if (this.dynmarkers[i].uniqid==id) {
                return false;
            }
        }
        return true;
    }
}
