var googleZoomLevelCount = 19;
var zoomLevelCount = 16;
var sliderCursorOffset = -6;//offset par rapport au centre du cursor
var zoomBarScaleOffset = 7; //offset par rapport au top arrondi du zoombar
var zoomBarPixelPerZoomLevel = 11;//step between each zoom

function ZoombarControl(noStreetview, minify) {
    if(noStreetview){
        this.noStreetview = true;
    }else{
        this.noStreetview = false;
    }
    if(minify){
        this.minify = true;
    }else{
        this.minify = false;
    }
}

ZoombarControl.prototype = new GControl();

ZoombarControl.prototype.initialize = function(map) {
    var container = document.createElement("div");

    var minMapScale = 3;
    var maxMapScale = 19;
    // get array of map types
    var mapTypes = map.getMapTypes();
    // overwrite the getMinimumResolution() and getMaximumResolution() methods for each map type
    for (var i=0; i<mapTypes.length; i++) {
        mapTypes[i].getMinimumResolution = function() {return minMapScale;}
        mapTypes[i].getMaximumResolution = function() {return maxMapScale;}
    }

    var imgPreload = new Image();
    imgPreload.src = "images/zoomOut.png";
    imgPreload = new Image();
    if(this.noStreetview){
        imgPreload.src = "images/zoomIn_sans_StreetView.png";
    }else{
        imgPreload.src = "images/zoomIn.png";
    }


    var zoomIn = imgPreload;
    //zoomIn.src = "images/zoomIn.png";
    zoomIn.style.position = 'absolute';
    zoomIn.style.cursor = "pointer";
    zoomIn.style.top = "0px";
    zoomIn.style.left = "0px";
    zoomIn.title = bqc.locale.zoombar.zoomin;

    var zoomOut = document.createElement("img");
    zoomOut.src = "images/zoomOut.png";

    zoomOut.style.position = 'absolute';
    zoomOut.style.cursor = "pointer";
    if(this.minify){
        zoomOut.style.top = "28px";
    }else{
        zoomOut.style.top = "215px";
    }
    zoomOut.style.left = "0px";
    zoomOut.title = bqc.locale.zoombar.zoomout;

    if(!this.minify){
        var zoomBar = document.createElement("div");
        zoomBar.style.backgroundImage = "url('images/zoom_bar.png')";

        zoomBar.style.position = 'absolute';
        zoomBar.style.cursor = "pointer";
        zoomBar.style.top = "25px";
        zoomBar.style.left = "0px";
        zoomBar.style.width = "33px";
        zoomBar.style.height = "190px";

        var cursor = document.createElement("div");
        cursor.style.backgroundImage = "url('images/zoom_cursor.png')";

        cursor.style.position = 'absolute';
        cursor.style.cursor = "pointer";
        cursor.style.zIndex = 10;
        cursor.style.width = "33px";
        cursor.style.height = "12px";

        container.appendChild(zoomBar);
        zoomBar.appendChild(cursor);
    }
    container.appendChild(zoomIn);
    container.appendChild(zoomOut);

    if(!this.minify){
        GEvent.addDomListener(map, "zoomend", function(oldzoom, newzoom) {
            var zoomLevel = newzoom;
            var numberOfZoomLevel = (googleZoomLevelCount - zoomLevel);
            cursor.style.top = Math.round((numberOfZoomLevel * zoomBarPixelPerZoomLevel + zoomBarScaleOffset + sliderCursorOffset)) + "px";
        });
    }

    GEvent.addDomListener(zoomIn, "click", function() {
        map.zoomIn();
    });

    GEvent.addDomListener(zoomOut, "click", function() {
        map.zoomOut();
    });

    if(!this.minify){
        var zoomBarDragging = false;
        GEvent.addDomListener(zoomBar, "mousedown", function(e) {
            zoomBarDragging = true;
            var position = Element.cumulativeOffset(zoomBar);
            var minZoomLevelPixel = sliderCursorOffset + zoomBarScaleOffset;
            var maxZoomLevelPixel = sliderCursorOffset + zoomBarScaleOffset + (zoomLevelCount * zoomBarPixelPerZoomLevel);

            var top = Event.pointerY(e) - position.top + sliderCursorOffset;
            if (top < minZoomLevelPixel) {
                top = minZoomLevelPixel;
            }
            if (top > maxZoomLevelPixel) {
                top = maxZoomLevelPixel;
            }
            cursor.style.top = (top) + "px";
        });
    

        GEvent.addDomListener(cursor, "mousedown", function(e) {
            zoomBarDragging = true;
            var listener = GEvent.addDomListener(document, "mouseup", function(e) {
                GEvent.removeListener(listener);
                mouseUp(e);
            });
        });

        function mouseUp(e) {
            zoomBarDragging = false;
            var position = Element.positionedOffset(cursor);

            var zoomLevel = (position.top - sliderCursorOffset - zoomBarScaleOffset) / zoomBarPixelPerZoomLevel;
            zoomLevel = Math.round(zoomLevel);

            cursor.style.top = (zoomLevel * zoomBarPixelPerZoomLevel + sliderCursorOffset + zoomBarScaleOffset) + "px";
            map.setZoom(googleZoomLevelCount - zoomLevel);
        }

        GEvent.addDomListener(zoomBar, "mouseup", function(e) {
            mouseUp(e);
        });

        GEvent.addDomListener(zoomBar, "mousemove", function(e) {
            if (zoomBarDragging) {
                var position = Element.cumulativeOffset(zoomBar);
                var minZoomLevelPixel = sliderCursorOffset + zoomBarScaleOffset;
                var maxZoomLevelPixel = sliderCursorOffset + zoomBarScaleOffset + (zoomLevelCount * zoomBarPixelPerZoomLevel);

                var top = Event.pointerY(e) - position.top + sliderCursorOffset;
                if (top < minZoomLevelPixel) {
                    top = minZoomLevelPixel;
                }
                if (top > maxZoomLevelPixel) {
                    top = maxZoomLevelPixel;
                }
                cursor.style.top = (top) + "px";
            }
        });
    }

    map.getContainer().appendChild(container);
    return container;
}

// By default, the control will appear in the top left corner of the
// map with 27x70 pixels of padding.
ZoombarControl.prototype.getDefaultPosition = function() {
    if (this.noStreetview) {
        if (this.minify) {
            return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(15, 66));
        } else {
            return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(25, 76));
        }
    }else{
        return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(25, 106));
    }
}

