﻿// Scrollbar ------------------------------------------------------------------

// Define object
function Scroller(slRootObject) {
    // Allow scope access to children objects
    var that = this;
    
    // Define defaults
    this.bDragging = false;
    
    // Set elements
    this.defineElements = function(sParent, sHandle, sBack) {
        
        // Reference elements by name
        
        this.eParent = slRootObject.rootElement.findName(sParent);
        this.eHandle = slRootObject.rootElement.findName(sHandle);
        this.eBack = slRootObject.rootElement.findName(sBack);
    }
    
    // Initialisation code
    this.init = function() {
    
        // Attach events to objects
        this.attachEvents();
        
        // Reset position
        this.eParent["Canvas.Top"] = 0;
        this.eHandle["Canvas.Top"] = 0;
    }
    
    // Attach events to referenced elements
    this.attachEvents = function() {
        
        // Define Handle drag listener
        this.eHandle.AddEventListener("MouseLeftButtonDown",Silverlight.createDelegate(this, function(sender, eventArgs) {

                    // Code executed on "MouseLeftButtonDown" event
                    this.bDragging = true;
                }
            )
        );
        
        // Define Handle drag listener
        this.eHandle.AddEventListener("MouseLeftButtonUp",Silverlight.createDelegate(this, function(sender, eventArgs) {

                    // Code executed on "MouseLeftButtonUp" event
                    this.bDragging = false;
                }
            )
        );
        
        var fMouseMove = Silverlight.createDelegate(this, function(sender, eventArgs) {

                // Code executed on "MouseLeftButtonUp" event
                if (this.bDragging) {
                    var nMouseY = eventArgs.GetPosition(this.eBack).Y;
                    this.moveHandle(nMouseY);
                }
            }
        );
        
        var fStopDragging = Silverlight.createDelegate(this, function(sender, eventArgs){ 
                this.bDragging = false;
            }
        );
        
        this.eHandle.AddEventListener("MouseMove", fMouseMove);
        this.eBack.AddEventListener("MouseMove", fMouseMove);
        this.eParent.AddEventListener("MouseMove", fMouseMove);
        slRootObject.rootElement.AddEventListener("MouseMove", fMouseMove);
        
        // Define Handle drag listener
        slRootObject.rootElement.AddEventListener("MouseLeftButtonUp", fStopDragging);
        slRootObject.rootElement.AddEventListener("MouseLeave", fStopDragging);

    }
    
    // Set the maximum scroll length
    this.updateMaxScroll = function(nMaxScroll) {
        this.nMaxScroll = nMaxScroll;
    }
    
    this.moveHandle = function(nValue) {
        var nHandleHeight = this.eHandle.Height;
        var nHandleHalf = .5*nHandleHeight;
        
        var nBackHeight = this.eBack.Height;
    
        if (nValue < 0) {
            nValue = 0;
        } else if (nValue > nBackHeight) {
            nValue = nBackHeight;
        }
        
        
        this.eHandle["Canvas.Top"] = nValue;
        
        this.eParent["Canvas.Top"] = (nValue/(nBackHeight+nHandleHeight)) *-(this.nMaxScroll-nBackHeight+4);
    }
}