﻿var DoubleSlider = new function() {

    var me = this;

    this.Slider;
    this.SliderControl;
    this.SliderControlWidth;

    this.MouseStartLeft;
    this.MouseMoveEvent;
    this.MouseUpEvent;

    this.MinBound;
    this.MaxBound;

    this.BackgroundHolder;
    this.IsSlider = false;


    //setup		
    this.Setup = function() {
        var aSliders = f.GetElementsByClassName('div', 'slidercontrol');

        for (var i = 0; i < aSliders.length; i++) {

            oSlider = me.GetSlider(aSliders[i]);

            f.AttachEvent(aSliders[i], 'mousedown',
						function(event) {
						    me.MouseDown(event);
						    return false;
						});

            if (f.GetClass(aSliders[i]).indexOf('start') > 0) {
                e.SetTopLeft(aSliders[i], 0, (-e.GetPosition(aSliders[i]).Width + 1) / 2 + 1);
            } else {
                e.SetTopLeft(aSliders[i], 0, oSlider.Width - e.GetPosition(aSliders[i]).Width / 2 - 2);
            }

        }

        me.MouseMoveEvent = f.AttachEvent(document, 'mousemove',
					function(event) {
					    if (me.IsSliding) {
					        me.MouseMove(event);
					        return false;
					    }
					});

        me.MouseUpEvent = f.AttachEvent(document, 'mouseup',
					function(event) {
					    if (me.IsSliding) {
					        me.MouseUp(event);
					        return false;
					    }
					});
    }



    //mousedown
    this.MouseDown = function(oEvent) {

        //get slider and holder details
        me.SliderControl = f.GetObjectFromEvent(oEvent);
        me.SliderControlWidth = e.GetPosition(me.SliderControl).Width;
        f.SetClass(me.SliderControl, 'sliding');

        //work out positions
        me.StartLeft = e.GetPosition(me.SliderControl).Left;
        me.Width = e.GetPosition(me.SliderControl).Width;

        me.Slider = me.GetSlider(me.SliderControl);

        //calculate bounds
        me.MouseStartLeft = me.GetMouseCoords(oEvent).x;

        if (me.SliderControl.id.indexOf('Start') > 0) {
            me.MinBound = (-me.SliderControlWidth + 1) / 2 + 1;
            me.MaxBound = me.Slider.EndLeft - me.Slider.Left - me.SliderControlWidth;
        } else {
            me.MinBound = me.Slider.StartLeft - me.Slider.Left + me.SliderControlWidth;
            me.MaxBound = oSlider.Width - me.SliderControlWidth / 2 - 2;
        }

        document.body.focus();
        me.SliderControl.ondragstart = function() { return false; };
        me.SliderControl.onselectstart = function() { return false; };
        me.IsSliding = true;
        return false;
    }



    //mousemove
    this.MouseMove = function(oEvent) {

        var iPos = me.StartLeft + me.GetMouseCoords(oEvent).x - me.MouseStartLeft - me.Slider.Left;
        var iCalculatedPosition;
        if (iPos >= me.MinBound && iPos <= me.MaxBound) {
            iCalculatedPosition = me.StartLeft + me.GetMouseCoords(oEvent).x - me.MouseStartLeft - me.Slider.Left;
        } else if (iPos < me.MinBound) {
            iCalculatedPosition = me.MinBound;
        } else {
            iCalculatedPosition = me.MaxBound;
        }
        me.SliderControl.style.left = iCalculatedPosition + 'px';

        var iPercent = Math.round((iCalculatedPosition + (me.SliderControlWidth - 1) / 2) / me.Slider.Width * 100);
        iPercent = iPercent == 99 ? 100 : iPercent;
        var iValue = Math.round((this.Slider.MaxValue - this.Slider.MinValue) * iPercent / 100 + this.Slider.MinValue);

        if (me.Slider.ShowControl) {
            f.Show(me.Slider.ShowControl);
            f.SetHTML(me.Slider.ShowControl, Math.round(iValue * me.Slider.ExchangeRate));
            me.Slider.ShowControl.style.left = iCalculatedPosition - (e.GetPosition(me.Slider.ShowControl).Width - me.SliderControlWidth) / 2 + 'px';
        }

        if (me.SliderControl.id.indexOf('_Start') > 0) {
            f.SetValue(me.Slider.ID + '_MinValue', iValue);
        } else {
            f.SetValue(me.Slider.ID + '_MaxValue', iValue);
        }
        return false;
    }


    //mouseup
    this.MouseUp = function(oEvent) {
        f.SetClass(me.SliderControl, '');
        me.IsSliding = false;
        if (me.Slider.ShowControl) {
            f.Hide(me.Slider.ShowControl);
        }
        document.body.focus();

        if (f.GetObject(me.Slider.ID + '_OnChange')) {
            var sOnChange = f.GetValue(me.Slider.ID + '_OnChange');
            eval(sOnChange);
        }
        return false;

    }


    //get min/max
    this.GetMinMax = function(sID) {
        return {
            MinValue: n.SafeInt(f.GetValue(sID + '_MinValue')),
            MaxValue: n.SafeInt(f.GetValue(sID + '_MaxValue'))

        }

    }



    /* slider */
    this.GetSlider = function(oSliderControl) {

        var oSlider = oSliderControl.parentNode;
        var oResult = {
            Control: oSlider,
            ID: oSlider.id,
            Width: e.GetPosition(oSlider).Width,
            Left: e.GetPosition(oSlider).Left,
            StartLeft: e.GetPosition(oSlider.id + '_Start').Left,
            EndLeft: e.GetPosition(oSlider.id + '_End').Left,
            MinValue: n.SafeInt(f.GetValue(oSlider.id + '_AbsMinValue')),
            MaxValue: n.SafeInt(f.GetValue(oSlider.id + '_AbsMaxValue')),
            ExchangeRate: n.SafeNumeric(f.GetValue(oSlider.id + '_ExchangeRate')),
            ShowControl: f.GetObject(oSlider.id + '_Show')
        };

        if (oResult.ExchangeRate == 0) oResult.ExchangeRate = 1;

        return oResult;

    }



    /* support */
    this.GetMouseCoords = function(oEvent) {
        if (oEvent.pageX || oEvent.pageY) {
            return { x: oEvent.pageX, y: oEvent.pageY };
        } else {
            return {
                x: oEvent.clientX + document.body.scrollLeft - document.body.clientLeft,
                y: oEvent.clientY + document.body.scrollTop - document.body.clientTop
            };
        }
    }

}

