
function s_attr(obj, attr, val) {
    obj[attr] = val;
}

function clone(obj) {
    var ret = {};
    for(k in obj)
        s_attr(ret, k, obj[k]);
    return ret;
}

function panto_centre(gp_data, map, fl) {
    if(map != undefined) {
        var min_lat=1000000;
        var max_lat=0;
        var min_lng=1000000;
        var max_lng=0;

        var f = false;

        for(k in gp_data) {
            gp = gp_data[k];
            if(fl == false || gp.marker != undefined) {
                f = true;
                if(gp.lat > max_lat)
                    max_lat = gp.lat;
                if(gp.lat < min_lat)
                    min_lat = gp.lat;

                if(gp.lng > max_lng)
                    max_lng = gp.lng;
                if(gp.lng < min_lng)
                    min_lng = gp.lng;
            }
        }

        if(f) {
            var b = new GLatLngBounds(new GLatLng(min_lat, min_lng), new GLatLng(max_lat, max_lng));
            map.setZoom(map.getBoundsZoomLevel(b));
            map.panTo(b.getCenter());
        }
    }
}

GeoPointArray = newClass(null, {
    constructor : function(args) {
        this.map = args.map;
        this.grid_data = [];
    },

    set : function(new_arr) {
        this.drop_all_markers();
        this.grid_data = new_arr;
    },

    mk_marker : function(index) {
        var gp = this.grid_data[index];
        if(gp.marker == undefined) {
            var c = new GLatLng(gp.lat, gp.lng)
            var marker = new GMarker(c, {title:gp.name});
            var label = new ELabel(c, '', /*gp.name,*/ "labelstyle", new GSize(2,20),60);


            var html = "<h4>" + gp.name + "</h4>";
            html += "<div id='preview' style='height:285px;width:426px;'></div>";
            html += "<a href='/show-clip/" + gp.id + "'><small>на страницу клипа</small></a>";
            marker.bindInfoWindowHtml(html);


            GEvent.addListener(marker, "infowindowopen", function() {
                showClip3(gp.id);
            });

            this.map.addOverlay(marker);
            this.map.addOverlay(label);

            gp.marker = marker;
            gp.label = label;
        }
    },

    draw_marker : function(index) {
        if(this.grid_data[index] != undefined && this.map != undefined) {
            this.mk_marker(index);
            var a = [];
            a.push(this.grid_data[index]);
            panto_centre(a, this.map, true);
        }
    },

    draw_markers : function() {
        for(key in this.grid_data) {
            this.mk_marker(key);
        }
        panto_centre(this.grid_data, this.map, true);
    },

    hide_marker : function(index) {
        if(this.map != undefined && this.grid_data[index] != undefined && 
           this.grid_data[index].marker != undefined) {
            this.drop_pointer(index);
            panto_centre(this.grid_data, this.map, true);
        }
    },

    drop_all_markers : function() {
        for(var key in this.grid_data)
            this.drop_pointer(key);
    },

    drop_pointer : function(index) {
        if(this.map != undefined) {
            if(this.grid_data[index].marker != undefined) {
                this.map.removeOverlay(this.grid_data[index].marker);
                this.grid_data[index].marker = undefined;
            }

            if(this.grid_data[index].label != undefined) {
                this.map.removeOverlay(this.grid_data[index].label);
                this.grid_data[index].label = undefined;
            }
        }
    },

    get_xml_str : function(index)
    {
        if(this.grid_data[index] == undefined)
            return '<?xml version="1.0" encoding="utf-8"?>\n<data/>';
        var gp = this.grid_data[index];
        var ret = '<?xml version="1.0"?>\n';
        ret += '<data>\n';
        ret += '<geo-point>\n';
        ret += '<lng>' + gp.lng + '</lng>\n';
        ret += '<lat>' + gp.lat + '</lat>\n';
        ret += '<name>'   + gp.name   + '</name>\n';
        ret += '<id>'     + gp.id     + '</id>\n';
        ret += '</geo-point>\n';
        ret += '</data>';
        return ret;
    }

});


