
function ScaleBarSlicer(wsnav){
    this.wsnav = wsnav;
    wsnav.addEventListener(this);
    this.maxZoom = 0;
    this.minZoom = 0;
    this.slicerHeight = 122;
    this.sliderHeight = 10;
    this.drawing = false;
    this.nn6=document.getElementById&&!document.all;
    this.globalImgX;
    this.globalImgY;

    if (window.addEventListener) {
        window.addEventListener('DOMMouseScroll', wheel, false);
    }
    window.onmousewheel = document.onmousewheel = wheel;
}

ScaleBarSlicer.prototype.computeZoom=function(){
    current = findPosY(document.getElementById("slicer_slider"))-this.divTop-this.sliderTop;
    relative = current;

    D1 = this.sliderHeight;
    D2 = 0;
    Q1 = Math.log(this.maxZoom+10)/Math.log(10);
    Q2 = Math.log(this.minZoom+10)/Math.log(10);
    Qn = Math.log(Number(this.wsnav.zoom)+10)/Math.log(10);

    Qn = (relative+(((D1-D2)/(Q1-Q2))*(Q2))-D2)/((D1 - D2)/(Q1-Q2));

    zoom = Math.exp(Qn*Math.log(10))-10;
    return zoom;
}

ScaleBarSlicer.prototype.changeZoomLevel=function(){

    var currentWidth = Number(this.wsnav.getImg().width);
    var currentHeight = Number(this.wsnav.getImg().height);

    var currentLeft = Number(this.wsnav.getImg().style.left.replace("px", "").replace("pt", ""));
    var currentTop = Number(this.wsnav.getImg().style.top.replace("px", "").replace("pt", ""));

    var widthRatio = (currentLeft + ((currentWidth - this.wsnav.mapWidth) / 2)) / currentWidth;
    var heightRatio = (currentTop + ((currentHeight - this.wsnav.mapHeight) / 2)) / currentHeight;

    var centerX = this.wsnav.xmin + (this.wsnav.xmax - this.wsnav.xmin) / 2;
    var centerY = this.wsnav.ymin + (this.wsnav.ymax - this.wsnav.ymin) / 2;


    adjustementX = (this.wsnav.xmax - this.wsnav.xmin) * widthRatio;
    adjustementY = (this.wsnav.ymax - this.wsnav.ymin) * heightRatio;   

    if(currentWidth==0)
        this.wsnav.setZoom(this.computeZoom());
    else
        this.wsnav.setZoomAndCenter(this.computeZoom(), centerX - adjustementX, centerY + adjustementY);	

    this.wsnav.refreshMap();

}

ScaleBarSlicer.prototype.updateZoomInterface=function(){
    document.getElementById("slicerdiv").style.visibility = "visible";
    document.getElementById("slicer_slider").style.visibility = "visible";


    D1 = this.sliderHeight;
    D2 = 0;
    Q1 = Math.log(this.maxZoom+10)/Math.log(10);
    Q2 = Math.log(this.minZoom+10)/Math.log(10);
    Qn = Math.log(Number(this.wsnav.zoom)+10)/Math.log(10);
    Dn = (D1 - D2)/(Q1-Q2)*Qn + D2 - (D1-D2)/(Q1-Q2)*(Q2);



    //yy = this.sliderTop+(this.sliderHeight-Dn);
    yy = Dn+this.sliderTop;
    if(yy<this.sliderTop)
        yy = this.sliderTop;
    if(yy>this.sliderBottom)
        yy = this.sliderBottom;

    document.getElementById("slicer_slider").style.left = this.sliderLeft;
    document.getElementById("slicer_slider").style.top = yy;
}

ScaleBarSlicer.prototype.mapevent=function(name){
    if(name=="map_loaded"){
        this.updateZoomInterface();
        this.globalImgX = this.wsnav.getGlobalImgX();
        this.globalImgY = this.wsnav.getGlobalImgY();
      }
    if(name=="map_init_end"){
        this.init();
    }
}
ScaleBarSlicer.prototype.move=function(y, event){
    this.wsnav.dispatch("map_drawing");

    top_slider = y-2-this.divTop;
    if(top_slider<this.sliderTop)
        top_slider=this.sliderTop;
    if(top_slider>this.sliderBottom)
        top_slider=this.sliderBottom;
    document.getElementById("slicer_slider").style.top = top_slider;

    var r = this.computeZoom()/this.wsnav.zoom;
    var pw = this.wsnav.mapWidth/r;
    var ph = this.wsnav.mapHeight/r;

    if((1/r)<500) {//si stretch trop le browser explose
        var xRatio = 0.5;
        var yRatio = 0.5;
        if (event != null) {
            var relativeX = lastClientX - this.globalImgX;
            xRatio = relativeX / this.wsnav.mapWidth;

            var relativeY = lastClientY - this.globalImgY;
            yRatio = relativeY / this.wsnav.mapHeight;
        }
        var oldLeft = Number(this.wsnav.getImg().style.left.replace("px", "").replace("pt", ""));
        var oldTop = Number(this.wsnav.getImg().style.top.replace("px", "").replace("pt", ""));

        var newLeft = Math.round((this.wsnav.getImg().width-pw) * xRatio + oldLeft);
        var newTop = Math.round((this.wsnav.getImg().height-ph) * yRatio + oldTop);
        this.wsnav.modifyImage(newLeft, newTop, pw, ph );
    }
}
ScaleBarSlicer.prototype.init=function(){
    document.getElementById("slicerdiv").className = "scalebarslicer_box";

    document.getElementById("slicerdiv").style.top = 195;
    document.getElementById("slicerdiv").style.left = 329;

    this.divTop = findPosY(document.getElementById("slicerdiv"));
    this.divLeft = findPosX(document.getElementById("slicerdiv"));

    this.sliderLeft = findPosX(document.getElementById("slicer_pic"))-this.divLeft;
    this.sliderTop = findPosY(document.getElementById("slicer_pic"))-this.divTop;
    this.sliderBottom = this.sliderTop+this.slicerHeight-(this.sliderHeight/2);
    this.sliderHeight = this.sliderBottom-this.sliderTop;
    
    var temp = this;
    document.getElementById("slicer").onmousedown = function(e){ 
        if(!temp.wsnav.isLoading){
            temp.drawing = true;
            if (!e) var e = window.event;
            temp.move(e.clientY);
            return false;
        }
    } 
    document.getElementById("slicer").onmouseup = function(e){ 
        temp.drawing = false;
        temp.changeZoomLevel();
    }
    document.getElementById("slicer").onmousemove = function(e){
        if (temp.drawing){
            if (!e) var e = window.event;
            temp.move(e.clientY);
            return false;
        }
    }
    document.getElementById("slicer").onmouseout = function(e){ 

    }
}

var wheelID = -1;

function wheelDone(){
    wheelID = -1;
    scalebarslicer.changeZoomLevel();
}

function handle(delta, event) {
    if(!wsnav.isLoading){
        currentY = Number((document.getElementById("slicer_slider").style.top+"").replace("px",""));
        if (delta < 0){
            scalebarslicer.move(currentY+scalebarslicer.divTop+3, event);
        }else{
            scalebarslicer.move(currentY+scalebarslicer.divTop-1, event);       // facteur 3 qui ce raproche du log naturel de 2.7
        }
        if(wheelID!=-1){
            clearTimeout(wheelID);
        }
        wheelID = setTimeout(wheelDone, 750);
    }
}

function wheel(event){
        var delta = 0;
        if (!event) /* For IE. */
                event = window.event;
        if (event.wheelDelta) { /* IE/Opera. */
                delta = event.wheelDelta/120;
                /** In Opera 9, delta differs in sign as compared to IE.
                 */
                if (window.opera)
                        delta = -delta;
        } else if (event.detail) { /** Mozilla case. */
                /** In Mozilla, sign of delta is different than in IE.
                 * Also, delta is multiple of 3.
                 */
                delta = -event.detail/3;
        }

       if (lastClientX >= scalebarslicer.globalImgX && lastClientX <= scalebarslicer.globalImgX + Number(wsnav.mapWidth)
        && lastClientY >= scalebarslicer.globalImgY && lastClientY <= scalebarslicer.globalImgY + Number(wsnav.mapHeight)) {

        /** If delta is nonzero, handle it.
         * Basically, delta is now positive if wheel was scrolled up,
         * and negative, if wheel was scrolled down.
         */
            if (delta) {
                handle(delta, event);
            }
            /** Prevent default actions caused by mouse wheel.
             * That might be ugly, but we handle scrolls somehow
             * anyway, so don't bother here..
             */
            if (event.preventDefault) {
                    event.preventDefault();
            }
            event.returnValue = false;
        } else {
            return true;
        }   
}




