﻿//===============================================================================
// ID		  : $Id: Codex.js 131 2008-03-31 13:56:30Z stefan.schult $
// Author     : $Author: stefan.schult $
// Description: JSClass for Scrollbars
//===============================================================================

Scrollbars = function(mainCanvas){
    this.toString = function(){
        return "Controls.Scrollbars";
    };
    this.mainCanvas = mainCanvas || null;
    this.plugIn = null;
    this.elements = {};
    this.handleCookie = {};
    this.mouseLeftButtonDownAtSlider = false;
    this.scrollStep = 20;
    this.MouseWheelDelta = 0;
}
Scrollbars.prototype = {
    add: function(Canvas, availableScrollbars, ScrollbarNames){
        var ScrollbarNames = ScrollbarNames ||
        {
            V: Canvas.Name + "ScrollbarV",
            H: Canvas.Name + "ScrollbarH"
        };
        this.elements[Canvas.Name] = {};
        this.elements[Canvas.Name].Canvas = Canvas;
        this.elements[Canvas.Name].availableScrollbars = ((availableScrollbars == null || availableScrollbars == undefined) ? {
            'V': true,
            'H': true
        } : ((availableScrollbars === 'H') ? {
            'V': false,
            'H': true
        } : {
            'V': true,
            'H': false
        }));
        
        this.elements[Canvas.Name].Scrollbars = {};
        if (this.elements[Canvas.Name].availableScrollbars.V) {
            this.elements[Canvas.Name].Scrollbars.V = {
                root	: Canvas.findName(ScrollbarNames.V),
                top		: Canvas.findName(ScrollbarNames.V).Children.getItem(0),
                slider	: Canvas.findName(ScrollbarNames.V).Children.getItem(1),
                bottom	: Canvas.findName(ScrollbarNames.V).Children.getItem(2)
            };
            this.elements[Canvas.Name].Scrollbars.V.root.Tag	= "V";
            this.elements[Canvas.Name].Scrollbars.V.top.Tag		= "Top";
            this.elements[Canvas.Name].Scrollbars.V.bottom.Tag	= "Bottom";
            this.elements[Canvas.Name].Scrollbars.V.slider.Tag	= "V";
	        this.handleCookie[ScrollbarNames.V+"SliderMLBD"] = this.elements[Canvas.Name].Scrollbars.V.slider.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.handleSliderMouseLeftButtonDown));
	        this.handleCookie[ScrollbarNames.V+"SliderMLBU"] = this.elements[Canvas.Name].Scrollbars.V.slider.addEventListener("MouseLeftButtonUp", Silverlight.createDelegate(this, this.handleSliderMouseLeftButtonUp));
	        this.handleCookie[ScrollbarNames.V+"SliderMLBM"] = this.elements[Canvas.Name].Scrollbars.V.slider.addEventListener("MouseMove", Silverlight.createDelegate(this, this.handleSliderMouseMove));
	        this.handleCookie[ScrollbarNames.V+"TopMLBD"] = this.elements[Canvas.Name].Scrollbars.V.top.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.handleTopMouseLeftButtonDown));
	        this.handleCookie[ScrollbarNames.V+"BottomMLBD"] = this.elements[Canvas.Name].Scrollbars.V.bottom.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.handleBottomMouseLeftButtonDown));
        }
        if (this.elements[Canvas.Name].availableScrollbars.H) {
            this.elements[Canvas.Name].Scrollbars.H = {
                root: Canvas.findName(ScrollbarNames.H),
                left: Canvas.findName(ScrollbarNames.H).Children.getItem(0),
                slider: Canvas.findName(ScrollbarNames.H).Children.getItem(1),
                right: Canvas.findName(ScrollbarNames.H).Children.getItem(2)
            };
            this.elements[Canvas.Name].Scrollbars.H.root.Tag = "H";
            this.elements[Canvas.Name].Scrollbars.H.left.Tag = "Left";
            this.elements[Canvas.Name].Scrollbars.H.right.Tag = "Right";
            this.elements[Canvas.Name].Scrollbars.H.slider.Tag = "H";
	        this.handleCookie[ScrollbarNames.H+"SliderMLBD"] = this.elements[Canvas.Name].Scrollbars.H.slider.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.handleSliderMouseLeftButtonDown));
	        this.handleCookie[ScrollbarNames.H+"SliderMLBU"] = this.elements[Canvas.Name].Scrollbars.H.slider.addEventListener("MouseLeftButtonUp", Silverlight.createDelegate(this, this.handleSliderMouseLeftButtonUp));
	        this.handleCookie[ScrollbarNames.H+"SliderMLBM"] = this.elements[Canvas.Name].Scrollbars.H.slider.addEventListener("MouseMove", Silverlight.createDelegate(this, this.handleSliderMouseMove));
        }
        
        this._updateElement(this.elements[Canvas.Name]);
    },
    addUpdateListener: function(elementName, Canvas, updateFunction){
		var Element = this.getElement(elementName);
		if(Element){
			if(!this.elements[elementName].updateFunctions){
				this.elements[elementName].updateFunctions = [];
			}
			this.elements[elementName].updateFunctions.push([Canvas, updateFunction]);
		}
		this._updateElement(Element);
    },
    handleMouseWheel: function(sender, mouseEventArgs){
//		if(this.MouseWheelDelta>0){
//			sender.findName("Debug").Text = this.MouseWheelDelta + "";
//		}
    },
    handleSliderMouseLeftButtonDown: function(sender, mouseEventArgs){
        this.mouseLeftButtonDownAtSlider = true;
        this.mouseDown = {
			X:mouseEventArgs.getPosition(null).x - this.getOffsetX(sender),
			Y:mouseEventArgs.getPosition(null).y - this.getOffsetY(sender)
        }
        sender.captureMouse();
        var parent = sender.GetParent();
    },
    handleSliderMouseMove: function(sender, mouseEventArgs){
        if(this.mouseLeftButtonDownAtSlider){
			var GrandParent = sender.GetParent().GetParent();
			var Element = this.elements[GrandParent.Name];
//			sender.findName("Debug").Text = GrandParent.Name;
			var delta = 0;
			switch(sender.Tag){
				case 'V':
					delta = mouseEventArgs.getPosition(null).y - this.mouseDown.Y - Element.Scrollbars.V.OffsetY;
					if(delta >= Element.Scrollbars.V.sliderStart && delta <= Element.Scrollbars.V.sliderEnd){
						sender["Canvas.Top"] = delta;
						GrandParent.Children.getItem(0).Children.getItem(0)["Canvas.Top"] = -(delta-Element.Scrollbars.V.top.Height)/(Element.Scrollbars.V.sliderEnd-Element.Scrollbars.V.top.Height)*(Element.Canvas.Children.getItem(0).Children.getItem(0).Height-Element.Canvas.Height);
					}
					break;
				case 'H':
					delta = mouseEventArgs.getPosition(null).x - this.mouseDown.X - Element.Scrollbars.H.OffsetX;
					if(delta >= Element.Scrollbars.H.sliderStart && delta <= Element.Scrollbars.H.sliderEnd){
						sender["Canvas.Left"] = delta;
						GrandParent.Children.getItem(0).Children.getItem(0)["Canvas.Left"] = -(delta-Element.Scrollbars.H.left.Width)/(Element.Scrollbars.H.sliderEnd-Element.Scrollbars.H.left.Width)*(Element.Canvas.Children.getItem(0).Children.getItem(0).Width-Element.Canvas.Width);
					}
					break;
			}
//			sender.findName("Debug").Text+= sender.Tag + "\ndelta : "+ delta + "\n" + sender["Canvas.Left"] + " : " + sender["Canvas.Top"] + "\n" + GrandParent.Children.getItem(0)["Canvas.Left"] + " : " + GrandParent.Children.getItem(0)["Canvas.Top"];
        }
    },
    handleSliderMouseLeftButtonUp: function(sender, mouseEventArgs){
        this.mouseLeftButtonDownAtSlider = false;
        sender.releaseMouseCapture();
    },
    handleTopMouseLeftButtonDown: function(sender, mouseEventArgs){
		var GrandParent = sender.GetParent().GetParent();
		var Element = this.elements[GrandParent.Name];
		this._moveSliderV(-this.scrollStep, Element);
    },
    handleBottomMouseLeftButtonDown: function(sender, mouseEventArgs){
		var GrandParent = sender.GetParent().GetParent();
		var Element = this.elements[GrandParent.Name];
		this._moveSliderV(this.scrollStep, Element);
    },
    _moveSliderV: function(step, Element){
		var delta = Element.Scrollbars.V.slider["Canvas.Top"] - step;
		if(delta >= Element.Scrollbars.V.sliderStart && delta <= Element.Scrollbars.V.sliderEnd){

//			Element.Canvas.Children.getItem(0).Children.getItem(0)["Canvas.Left"] = -(delta-Element.Scrollbars.H.left.Width)/(Element.Scrollbars.H.sliderEnd-Element.Scrollbars.H.left.Width)*(Element.Canvas.Children.getItem(0).Children.getItem(0).Width-Element.Canvas.Width);
		}
    },
    updateLayout: function(){
        for (var Element in this.elements) {
			this._updateElement(this.elements[Element]);
        }
    },
    updateCanvas: function(canvasName){
		if(this.elements[canvasName]){
			this._updateElement(this.elements[canvasName]);
			return true;
		} else {
			return false;
		}
    },
    _updateElement: function(Element){
		var Scrollbars = Element.Scrollbars;    
        if (Element.availableScrollbars.V) {
            var sliderHeight = (Scrollbars.V.root.Height - Scrollbars.V.top.Height - Scrollbars.V.bottom.Height) * (Element.Canvas.Height / Element.Canvas.Children.getItem(0).Children.getItem(0).Height);
            var maxSliderHeight = Scrollbars.V.bottom["Canvas.Top"] - Scrollbars.V.top.Height;
            Scrollbars.V.slider.Height = (sliderHeight >= maxSliderHeight) ? maxSliderHeight : sliderHeight;
            this.elements[Element.Canvas.Name].Scrollbars.V.OffsetX = this.getOffsetX(Scrollbars.V.root);
            this.elements[Element.Canvas.Name].Scrollbars.V.OffsetY = this.getOffsetY(Scrollbars.V.root);
            this.elements[Element.Canvas.Name].Scrollbars.V.sliderStart = this.elements[Element.Canvas.Name].Scrollbars.V.top.Height;
            this.elements[Element.Canvas.Name].Scrollbars.V.sliderEnd = this.elements[Element.Canvas.Name].Scrollbars.V.bottom["Canvas.Top"] - Scrollbars.V.slider.Height;
			this.elements[Element.Canvas.Name].Scrollbars.V.slider["Canvas.Top"] = Scrollbars.V.top.Height;
			Element.Canvas.Children.getItem(0).Children.getItem(0)["Canvas.Top"] = 0;
            Scrollbars.V.slider.Visibility = (sliderHeight >= maxSliderHeight) ? "Collapsed" : "Visible";
            if(Element.updateFunctions && Element.updateFunctions.length >0){
				for(var i=0; i<Element.updateFunctions.length; i++){
					Element.updateFunctions[i][1](Element.updateFunctions[i][0]);
				}
            }
        }
        if (Element.availableScrollbars.H) {
            Scrollbars.H.slider.Width = (Scrollbars.H.root.Width - Scrollbars.H.left.Width - Scrollbars.H.right.Width) * (Element.Canvas.Width / Element.Canvas.Children.getItem(0).Children.getItem(0).Width);
            this.elements[Element.Canvas.Name].Scrollbars.H.OffsetX = this.getOffsetX(Scrollbars.H.root);
            this.elements[Element.Canvas.Name].Scrollbars.H.OffsetY = this.getOffsetY(Scrollbars.H.root);
            this.elements[Element.Canvas.Name].Scrollbars.H.sliderStart = this.elements[Element.Canvas.Name].Scrollbars.H.left.Width;
            this.elements[Element.Canvas.Name].Scrollbars.H.sliderEnd = this.elements[Element.Canvas.Name].Scrollbars.H.right["Canvas.Left"] - Scrollbars.H.slider.Width;
            Scrollbars.H.root.Visibility = "Visible";
        }
        var Canvas = Element.Canvas;
        Canvas.Children.getItem(0).Clip = "M0,0 L"+Canvas.Width+",0 L"+Canvas.Width+","+Canvas.Height+" L0,"+Canvas.Height+" z";
    },
    getOffsetX: function(current){
		var offset = 0;
		while(current != null){
			offset+=current["Canvas.Left"];
			current = current.getParent();
		}
		return offset;
    },
    getOffsetY: function(current){
		var offset = 0;
		while(current != null){
			offset+=current["Canvas.Top"];
			current = current.getParent();
		}
		return offset;
    },
    getElement: function(canvasName){
		if(this.elements[canvasName]){
			return this.elements[canvasName];
		} else {
			return false;
		}
    }
}