function Gmap() {

this.map = null;
this.markers = [];
this.load();

};

Gmap.prototype.load = function (){

var that = this;
function initialize() {
    var mapOptions = {
        zoom: 13,
        center: new google.maps.LatLng(46.946506, 7.444150) // default is Bundeshaus :-)
    };
    that.map = new google.maps.Map(document.getElementById('map-canvas'),
        mapOptions);
}
google.maps.event.addDomListener(window, 'load', initialize);

};

Gmap.prototype.clear_map = function () {

var that = this;
$.each(this.markers, function(i, marker){
    marker.setMap(null);
});
this.markers = [];

}

Gmap.prototype.set_center = function (point) {

var lat_lng = new google.maps.LatLng(point[0],point[1]);
this.map.setCenter(lat_lng);

};

Gmap.prototype.set_zoom = function (zoom) {

this.map.setZoom(parseInt(zoom));

};

Gmap.prototype.add_markers = function (points) {

var that = this;
$.each(points, function (i, point) {
    var marker = new google.maps.Marker({
        position: point,
        map: that.map
    });
    that.markers.push(marker);
})

};

Gmap.prototype.add_path = function (points) {

var path = new google.maps.Polyline({
    path: points,
    geodesic: true,
    strokeColor: '#FF0000',
    strokeOpacity: 1.0,
    strokeWeight: 2,
    map: this.map
});
this.markers.push(path);

};

Gmap.prototype.helper_center_of_gravity = function (points) {

var acc = [0, 0];
$.each(points, function (i, ele) {
    var n_lat = acc[0] + ele[0];
    var n_lng = acc[1] + ele[1];
    acc = [ n_lat, n_lng];
});
var len = points.length * 1.0;
return [ acc[0] / len, acc[1] / len]

};

Gmap.prototype.plot = function (points, options) {

if(points == null || points.length == 0)
    return;

var that = this;
var center = this.helper_center_of_gravity(points);
this.set_center(center);
this.clear_map();

var new_points = $.map(points, function (ele, i) {
    var lat = ele[0];
    var lng = ele[1];
    return new google.maps.LatLng(lat, lng);
});

if(options['type'] == 'markers'){
    gmap.add_markers(new_points);
}else if(options['type'] == 'path'){
    gmap.add_path(new_points);
}

};

Gmap.prototype.set_map_type = function (type) {

this.map.setMapTypeId(type);

};

var gmap = new Gmap();

// hooks

$(‘#set-satellite’).click(function () {

gmap.set_map_type(google.maps.MapTypeId.SATELLITE);

});

$(‘#set-roadmap’).click(function () {

gmap.set_map_type(google.maps.MapTypeId.ROADMAP);

});

$(‘#set-hybrid’).click(function () {

gmap.set_map_type(google.maps.MapTypeId.HYBRID);

});

$(‘#set-terrain’).click(function () {

gmap.set_map_type(google.maps.MapTypeId.TERRAIN);

});

$.each([‘markers’, ‘path’],function(i, ele){

$('#plot-' + ele).click(function () {
    $('#plot-' + ele + '-modal').modal('show');
});

$('.plot-' + ele + '-button').click(function () {
    var data = $('#plot-data-' + ele).val();
    var points = $.parseJSON( data );
    gmap.plot(points, { type: ele });
});

});

$(‘#plot-file’).click(function () {

$('#plot-file-modal').modal('show');

});

$(‘.plot-file-button’).click(function () {

var data = $('#plot-data-file').val();

$('#file-upload').submit(function (e) {
    var file = document.getElementById('plot-data-file').files[0];
    var data = new FormData();
    var type = $('input[name=plot-type]:checked').val();
    data.append('file',file);
    data.append('plot-type', type)

    $.ajax({
        type: 'POST',
        url: '/upload',
        data: data,
        processData: false,
        contentType: false,
        success: function(data){
            var hash = data;
            var points = hash['points'];
            var type = hash['plot-type'];
            gmap.plot(points, { type: type });
            return false;
        }
    });
    e.preventDefault();
    return false;
});

$('#file-upload').trigger('submit');

});

$(‘.ui.radio.checkbox’).checkbox();