// (C) 2009, lastadm, mailto:lastadm@mail.ru

var sliders = new Array();
var guessed = new Object();

var sliderlimits =
        {
        'unmanaged':
            {
                income:
                {       sliderValue:1000,range:$R(1000,100000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                        },
                loan:
                {       sliderValue:1000,range:$R(1000,1000000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                        },
                period:
                {       sliderValue:3,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                        },
                rate:
                {       sliderValue:10,range:$R(10,20),values:[10,10.5,11,11.5,12,12.5,13,13.5,14,14.5,15,15.5,16,16.5,17,17.5,18,18.5,19,19.5,20],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                        }
            },
        'w/o warrants':
            {
                income:
                {       sliderValue:5000,range:$R(3000,100000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,300000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:3,range:$R(1,12),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:18,range:$R(18,20),values:[18,18.5,19,19.5,20],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'partner':
            {
                income:
                {       sliderValue:5000,range:$R(3000,100000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,50000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:3,range:$R(1,12),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:18,range:$R(18,20),values:[18,18.5,19,19.5,20],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'civ warrants':
            {
                income:
                {       sliderValue:5000,range:$R(3000,100000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:5000,range:$R(1000,300000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:3,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:18,values:[18],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'jur warrants':
            {
                income:
                {       sliderValue:5000,range:$R(3000,300000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,4000000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:3,range:$R(1,60),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,48,50,51,52,53,54,55,56,57,58,59,60],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:18,values:[18],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'goods&services':
            {
                income:
                {       sliderValue:5000,range:$R(3000,300000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,2000000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:3,range:$R(1,12),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:18,values:[18],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'pension':
            {
                income:
                {       sliderValue:5000,range:$R(1000,20000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,50000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:12,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:15,values:[16],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'magnitka':
            {
                income:
                {       sliderValue:5000,range:$R(1000,200000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,50000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:12,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:15,values:[17],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'newcar':
            {
                income:
                {       sliderValue:5000,range:$R(3000,300000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,2000000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:12,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:15,values:[15],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            },
        'newcar warrants':
            {
                income:
                {       sliderValue:5000,range:$R(3000,300000),
                        onSlide:function(x){ _onSlide('income', x); }, onChange:function(x){ _onChange('income', x); }
                },
                loan:
                {       sliderValue:10000,range:$R(1000,2000000),
                        onSlide:function(x){ _onSlide('loan', x); }, onChange:function(x){ _onChange('loan', x); }
                },
                period:
                {       sliderValue:12,range:$R(1,36),
                        values:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],
                        onSlide:function(x){ _onSlide('period', x); }, onChange:function(x){ _onChange('period', x); }
                },
                rate:
                {       sliderValue:15,range:$R(15,18),values:[15,18],
                        onSlide:function(x){ _onSlide('rate', x); }, onChange:function(x){ _onChange('rate', x); }
                }
            }
        };


function initsliders()
{
var locks;
var textfield;
var pagemark;

        if($('pagemark') && sliderlimits[$('pagemark').name])
                pagemark=$('pagemark').name;
        else
                pagemark="unmanaged";

        if(!sliders["income"])
        {
                Object.keys(sliderlimits[pagemark]).each(function(key){
                        sliders[key]=new Control.Slider(key+'handler',key+'slider', sliderlimits[pagemark][key]);
                });
        }else{
                Object.keys(sliderlimits[pagemark]).each(function(key){
                        sliders[key].initialize(key+'handler',key+'slider', sliderlimits[pagemark][key]);
                });
        }


        locks=$$('img.sliderlock');
        locks.each(function(lo){
                lo.onclick = function(){

                        control=this.id.replace(/lock/,"");

                        if(sliders[control].disabled)
                                enable_slider(control);
                        else
                                disable_slider(control);

                        return false;
                }
        });

        textfield=$$('input.calcinput');
        textfield.each(function(tf){
                var acceptkey=false;
                control=tf.id.replace(/input/,"");
                //tf.value='';
                enable_slider(control);

                tf.onkeydown = function(x){
                        var unicode;

                        if(typeof event != 'undefined')
                                unicode=event.keyCode;
                        else
                                unicode=x.keyCode;

                        acceptkey=false;
                        if([8,46,48,49,50,51,52,53,54,55,56,57,
                            96,97,98,99,100,101,102,103,104,105,110,190].include(unicode))
                                return acceptkey=true;
                        if([9,37,39,116].include(unicode))
                                return true;
                        // window.alert(unicode);
                        return false;
                }

                tf.onkeyup = function(x){
                        if(acceptkey)
                        {
                                control=this.id.replace(/input/,"");
                                disable_slider(control);
                                _onSlide(control, this.value)
                        }
                }
        });
}

function disable_slider(control)
{
        slider=sliders[control];
        if(slider)
        {
                slider.setDisabled();
                slider.activeHandle.className="dhandler";
                slider.track.className="dslider";
                lock=$(control+"lock");
                lock.src=lock.src.replace(/dlock.png/,"rlock.png");
        }
}

function enable_slider(control)
{
        slider=sliders[control];
        if(slider)
        {
                slider.setEnabled();
                lock=$(control+"lock");
                lock.src=lock.src.replace(/rlock.png/,"dlock.png");

                if(!$(control+"input").value)
                {
                        slider.setValue(slider.minimum);
                        $(control+"input").value=slider.minimum;
                }else{
                        slider.setValue($(control+"input").value);
                }
                x=$N($(control+"input").value);
                check_slider(control, x);
        }
}

function check_slider(control, x)
{
        slider=sliders[control];

        //if(sliders[key].minimum == sliders[key].maximum)
        //        disable_slider(key);

        if(slider.range && slider.range.include(x))
        {
                $(control+"comment").className="";
                if(!slider.disabled){
                        slider.track.className="gslider";
                        slider.activeHandle.className="ghandler";
                }
        }else{
                $(control+"comment").className="warn_color";
                if(!slider.disabled){
                        slider.track.className="rslider";
                        slider.activeHandle.className="rhandler";
                }
        }
}

function move_sliders(slidernames)
{
        $w(slidernames).detect(function(control)
        {
                if(!sliders[control].disabled)
                {
                        sliders[control].setValue(guessed[control]);
                        check_slider(control, guessed[control]);
                        return true;
                }
                return false;
        });
}


function _onChange(control, x)
{
        // $('debug1').innerHTML='changed! '+x;
        x=$N(x);

        if((x-x.round()) && control == 'rate')
                $(control+'input').value=x.toFixed(2);
        else
                $(control+'input').value=x.round();
}

function _onSlide(control, x)
{

        // $('debug3').innerHTML='changed! '+x;

        if(!$(control+'input'))
                return false;

        x=$N(x);

        if((x-x.round()) && control == 'rate')
                $(control+'input').value=x.toFixed(2);
        else
                $(control+'input').value=x.round();
        $(control+'input').focus();

        guess_values();
        check_slider(control, x);

        switch(control)
        {
                case 'income':
                        move_sliders('loan period rate');
                        break;
                case 'loan':
                        move_sliders('income period rate');
                        break;
                case 'period':
                        move_sliders('income loan rate');
                        break;
                case 'rate':
                        move_sliders('loan income period');
                        break;
        }
        return true;
}


// Check is value 'NaN'
function $N(x)
{
var n;
        n =new Number(isNaN(x)? 0:x);
        return n;
}

function guess_values()
{
var mux;

        // Get an actual values
        income=$N($('incomeinput').value);
        loan=$N($('loaninput').value);
        period=$N($('periodinput').value);
        rate=$N($('rateinput').value);

        // Guessed values
        mux=0.4;
        guessed.loan=(income*mux*36500*period)/(period*31*rate+36500);
        guessed.income=(loan/period + loan*31*rate/36500)/mux;
        guessed.period=loan/(income*mux-loan*31*rate/36500);
        guessed.rate=(income*mux-loan/period)*36500/(loan*31);

}
