
/*

    Javascript for mouse stuff
    
    handle all mouse events 

*/

// -------------------------- FUNCTIONS


//get the position of a mouse event
function IMS2_GetMouseX(e){
    if(e){
        var offx = (window.pageXOffset)?(window.pageXOffset):((document.body.scrollLeft)?(document.body.scrollLeft):((document.documentElement.scrollLeft)?(document.documentElement.scrollLeft):(0))) ;
        if(e.pageX){
            return(e.pageX + offx);
        }else if(e.clientX){
            return(e.clientX + offx);
        }
    }
    return(-1);
}

function IMS2_GetMouseY(e){
    if(e){
        var offy = (window.pageYOffset)?(window.pageYOffset):((document.body.scrollTop)?(document.body.scrollTop):((document.documentElement.scrollTop)?(document.documentElement.scrollTop):(0))) ;
        if(e.pageY){
            return(e.pageY + offy);
        }else if(e.clientY){
            return(e.clientY + offy);
        }
    }
    return(-1);
}

// -------------------------- CLASSES

function IMS2_MouseButtonState(){
    var self = this;
    
    this.down = false;
    this.lastx = -1;
    this.lasty = -1;
    this.downx = -1;
    this.downy = -1;
    
    function Reset(){
        self.down = false;
        self.lastx = -1;
        self.lasty = -1;
        self.downx = -1;
        self.downy = -1;
    }
    this.Reset = Reset;
    
    function Down(x,y){
        var ret = false;
        if(!self.IsDown()){
            self.downx = x;
            self.downy = y;
            self.down = true;
            ret = true;
        }
        self.lastx = x;
        self.lasty = y;
        return(ret);
    }
    this.Down = Down;
    
    function Up(x,y){
        var ret = (true == self.down);
        self.down = false;
        self.lastx = x;
        self.lasty = y;
        var click = ((self.lastx == self.downx) && (self.lasty == self.downy));
        return([ret,click]);
    }
    this.Up = Up;
    
    function Move(x,y){
        self.lastx = x;
        self.lasty = y;
    }
    this.Move = Move;
    
    function IsDown(){
        return(self.down);
    }
    this.IsDown = IsDown;
    
}

function IMS2_InputManager(){
    var self = this;
    
    this.button = new Array();
    this.button[0] = new IMS2_MouseButtonState(); // left
    this.button[1] = new IMS2_MouseButtonState(); // right
    this.button[2] = new IMS2_MouseButtonState(); // middle
    
    this.onMouseMove = null;
    this.onMouseUp = null;
    this.onMouseDown = null;
    this.onMouseWheel = null;
    
    function ResetMouse(){
        for(var i = 0;i < 3;i++){
            if(self.button[i]){
                self.button[i].Reset(); 
            }
        }
    }
    this.ResetMouse = ResetMouse;
    
    //figure out which button is clicked - browser-dependent
    function IsButton0(bval){
        if(IMS2_isMSIE() && (1 == bval || 3 == bval || 5 == bval || 7 == bval)){
            return(true);
        }else if(!IMS2_isMSIE() && (0 == bval)){
            return(true);
        }
        return(false);
    }
    this.IsButton0 = IsButton0;
    
    function IsButton1(bval){
        if(IMS2_isMSIE() && (2 == bval || 3 == bval || 6 == bval || 7 == bval)){
            return(true);
        }else if(!IMS2_isMSIE() && (2 == bval)){
            return(true);
        }
        return(false);
    }
    this.IsButton1 = IsButton1;
    
    function IsButton2(bval){
        if(IMS2_isMSIE() && (4 == bval || 5 == bval || 6 == bval || 7 == bval)){
            return(true);
        }else if(!IMS2_isMSIE() && (1 == bval)){
            return(true);
        }
        return(false);
    }
    this.IsButton2 = IsButton2;
    
    function MouseButtonDown(bnum,x,y){
        var r = self.button[bnum].Down(x,y);
        if(r){
            if(self.onMouseDown){
                self.onMouseDown(bnum,x,y);
            }
        }
    }
    this.MouseButtonDown = MouseButtonDown;
    
    function MouseButtonUp(bnum,x,y){
        var r = self.button[bnum].Up(x,y);
        if(r[0]){
            if(self.onMouseUp){
                self.onMouseUp(bnum,x,y,r[1]);
            }
        }
    }
    this.MouseButtonUp = MouseButtonUp;
    
    function MouseMove(x,y){
        self.button[0].Move(x,y);
        self.button[1].Move(x,y);
        self.button[2].Move(x,y);
        if(self.onMouseMove){
            self.onMouseMove(x,y);
        }
    }
    this.MouseMove = MouseMove;
    
    //set up to catch scroll event
    function MouseWheel(val){
        if(self.onMouseWheel){
            self.onMouseWheel(val);
        }
    }
    this.MouseWheel = MouseWheel;
    
    function HandleClick(e){
        self.HandleMouseDown(e);
        self.HandleMouseUp(e);
    }
    this.HandleClick = HandleClick;
    
    
    //for each event, call the appropriate function
    
    function HandleMouseDown(e){
        var x = IMS2_GetMouseX(e);
        var y = IMS2_GetMouseY(e);
        if(self.IsButton0(e.button)){
            self.MouseButtonDown(0,x,y);
        }
        if(self.IsButton1(e.button)){
            self.MouseButtonDown(1,x,y);
        }
        if(self.IsButton2(e.button)){
            self.MouseButtonDown(2,x,y);
        }
    }
    this.HandleMouseDown = HandleMouseDown;
    
    function HandleMouseUp(e){
        var x = IMS2_GetMouseX(e);
        var y = IMS2_GetMouseY(e);
        if(self.IsButton0(e.button)){
            self.MouseButtonUp(0,x,y);
        }
        if(self.IsButton1(e.button)){
            self.MouseButtonUp(1,x,y);
        }
        if(self.IsButton2(e.button)){
            self.MouseButtonUp(2,x,y);
        }
    }
    this.HandleMouseUp = HandleMouseUp;
    
    function HandleMouseMove(e){
        var x = IMS2_GetMouseX(e);
        var y = IMS2_GetMouseY(e);
        self.MouseMove(x,y);
    }
    this.HandleMouseMove = HandleMouseMove;
    
    function HandleMouseWheel(e){
        var val = 0;
        if(e.wheelDelta){
            val = e.wheelDelta / 120;
        }else if(e.detail){
            val = e.detail/(-3);
        }
        self.MouseWheel(val);
        e.returnValue = false;
        if(e.preventDefault){
            e.preventDefault();
        }
    }
    this.HandleMouseWheel = HandleMouseWheel;
    
    function HandleMouseOut(e){
        ;
    }
    this.HandleMouseOut = HandleMouseOut;
    
}