

function Gmap(params) {
    /**
     * markers : liste des markers sur la map
     * bound :
     * infoWindow :
     *
     * oc :
     * oz :
     */
    var map, markers, bounds, infoWindow, directionsRenderer, oc, oz;
    function construct(params){
        var p = jQuery.extend( {id: "map_canvas", mapTypeId: google.maps.MapTypeId.ROADMAP, lat: 48.32, lng: 2.39, zoom: 10}, params);
        var cross = new google.maps.LatLng(p.lat, p.lng);
        var myOptions = {
            zoom: p.zoom,
            center: cross,
            mapTypeId: p.mapTypeId
        };
        map = new google.maps.Map(document.getElementById(p.id), myOptions);
        markers = new Array();
        bounds = new google.maps.LatLngBounds();
        infoWindow = new google.maps.InfoWindow();
        directionsRenderer = new google.maps.DirectionsRenderer();
        oc = map.getCenter();
        oz = map.getZoom();
    }
    construct(params);

    this.getMap = function() {
        return map;
    };

    this.addMarker = function (lat, lng, html, pathIcon) {
        var cross = new google.maps.LatLng(lat, lng);
        bounds.extend(cross);
        map.fitBounds(bounds);
        var image = null;
        if(pathIcon!= undefined) {
            image = new google.maps.MarkerImage(pathIcon);
        }
        var marker = new google.maps.Marker({
                        position: cross,
                        map: map,
                        html: html,
                        icon: image
                    });
        if ( html != undefined && html != "") {
            google.maps.event.addListener(marker, 'click', function () {
                infoWindow.setContent(this.html);
                infoWindow.open(map, this);
            });
        }
        markers.push(marker);
    };

    this.addMarkers = function (params) {
        for ( i in params ) {
            var p = params[i];
            addMarker(map, p.lat, p.lng, p.html, p.pathIcon);
        }
    };

    this.changeLocation = function (lat, lng, zoom){
        var cross = new google.maps.LatLng(lat, lng);
        if(zoom!=undefined){
            map.setZoom(zoom);
        }
        map.panTo(cross);
        //goTo = cross;
    };

    this.searchDirection = function (id) {
        directionsRenderer.setMap(null);
        jQuery(id).empty();
        var service = new google.maps.DirectionsService();
        directionsRenderer.setMap(map);
        directionsRenderer.setPanel(document.getElementById(id));
        goFrom = jQuery(id).val();
        var request = {
            destination: goTo,
            origin: goFrom,
            travelMode: google.maps.DirectionsTravelMode.DRIVING
        };
        service.route(request, function(results, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                 directionsRenderer.setDirections(results);
            }
        });
    };

    this.directionTo = function (id){
        for (i in markers) {
            if(id == i) {
                goTo = markers[i].getPosition();
                break;
            }
        }
        jQuery("#wtb-results").fadeOut(function(){
            jQuery("#wtb-direction").fadeIn();
            jQuery("#wtb-back-results").fadeIn();
        });
        jQuery("#wtb-to-address").html("<strong>"+tab.shop[i].nom+"</strong><br/>"+tab.shop[i].adresse);
        clearOverlays();
        markers[i].setMap(map);
        changeLocation(i);

    };

    this.clearOverlays = function () {
        for (i in markers) {
            markers[i].setMap(null);
        }
        oc = map.getCenter();
        oz = map.getZoom();
    };

    this.showOverlays = function () {
        if (markers) {
            for (i in markers) {
                markers[i].setMap(map);
            }
            map.setCenter(oc);
            map.setZoom(oz);
        }
    };

}

