(function() {
    var Event = YAHOO.util.Event,
        Dom   = YAHOO.util.Dom,
        lang  = YAHOO.lang,
        p_slider, b_slider,
        p_bg="p-slide", p_thumb="p-thumb", b_bg="b-slide", b_thumb="b-thumb",
        premium_display="premium", benefit_display="benefit",
        benefit_input_field="benefit_manual_input_field", premium_input_field="premium_manual_input_field",
        benefit_input_wrapper="benefit_input_wrapper", premium_input_wrapper="premium_input_wrapper";

    // constraints - how far the slider can move
    var topConstraint = 0;
    var bottomConstraint = 280;
    // benefit scale factors
    var benScaleOffset = 100000;
    var benScaleFactor = 17500;
    // default benefit
    var benDefault = 350000;

    var pSliderNode1 = 65;
    var pSliderScale1 = 1.3;

    var resp;
    var premScaleOffset;
    var premScaleFactor;
    var premLowerBound, premUpperBound;
    var currentPlan;
    var currentSlider;
    var benefit_amount_manual_focus;
    var tempButtonLabel = [];
    var premSliderMap = [];
    var benSliderMap = [];
    var ben_benpx = [];
    var prem_benpx = [];

    // factors that will be returned from rate lookup
    var benefit_amount, temp_benefit_amount;
    var premium_amount, temp_premium_amount;
    var issue_rate;
    var apf;
    
    // The amount the slider moves when the value is changed with the arrow
    // keys
    var keyIncrement = 1;
    var ticksize = 1;

    Event.onDOMReady(function() {

        // Premium Slider
        p_slider = YAHOO.widget.Slider.getHorizSlider(p_bg, 
            p_thumb, topConstraint, bottomConstraint);

        // map pixel value of premium slider to skewed value
        p_slider.getRealValue = function() {
            i = this.getValue();
            b = i / pSliderScale1;
            if(i < pSliderNode1) {
                j = premScaleOffset + (b * premScaleFactor)
            } else {
                percent = (i - pSliderNode1) / bottomConstraint;
                j = premScaleOffset + (((percent * bottomConstraint) + (pSliderNode1 / pSliderScale1)) * premScaleFactor);
            }
            v = Math.round(j);
            return v;
        }

        p_slider.getBenAmt = function() {
            // calculate face amount given current apf
            return ((1000 / issue_rate) * (premium_amount/0.09 - apf));
        }

        p_slider.subscribe("change", function() {
            if(currentSlider == 'p') {
                this.handleSliderChange();
            }
        });
        p_slider.subscribe("slideStart", function() {

        });

        p_slider.subscribe("slideEnd", function() {
            if(currentSlider == 'p') {
                this.handleSliderChange();
            }
        });
        p_slider.handleSliderChange = function(){

            premium_amount = this.getRealValue();
            benefit_amount = this.getBenAmt();

            if(benefit_amount > 99999.99 && benefit_amount < 5000000.01) {
                // convert the real value into a pixel offset
                i = 0;
                while(ben_benpx[i] < benefit_amount) i++;
                b_slider.setValue(i, true, true, true);
                premium_amount = b_slider.getMonthly();
            }

            updateDisplayedValues();
            
        }

        // set keyIncrement
        p_slider.keyIncrement = keyIncrement;

        // set an initial value
        //b_slider.setValue( (benDefault - benScaleOffset) / benScaleFactor );

        // Benefit Slider
        b_slider = YAHOO.widget.Slider.getHorizSlider(b_bg, 
            b_thumb, topConstraint, bottomConstraint);

        b_slider.getRealValue = function() {
            // @todo: new mapping
            //return Math.round(benScaleOffset + (this.getValue() * benScaleFactor));
            px = this.getValue();
            return ben_benpx[px];
        }

        b_slider.getMonthly = function() {
            updateApf(benefit_amount);
            return ((benefit_amount * issue_rate / 1000 + apf) * 0.09);
        }

        b_slider.subscribe("change", function() {
            //if(currentSlider == 'b') {
                this.handleSliderChange();
            //}
        });
        b_slider.subscribe("slideStart", function() {

        });
        b_slider.subscribe("slideEnd", function() {
            if(currentSlider == 'b') {
                this.handleSliderChange();
            }
        });
        b_slider.handleSliderChange = function() {

            benefit_amount = b_slider.getRealValue();
            px = b_slider.getValue();
            premium_amount = prem_benpx[ px ]; // was b_slider.getMonthly()

            if(!isNaN(benefit_amount) && !isNaN(premium_amount)) {
    
                updateDisplayedValues();
                p_slider.updatePosition();

                // set title of background for accessibility
                Dom.get(b_bg).title = "current benefit = " + benefit_amount;
            }
        }
        p_slider.updatePosition = function(){
            // move premium slider
            scalePercent = ((premium_amount - premLowerBound)/(premUpperBound - premLowerBound));
            newPremThumbPosition = scalePercent * bottomConstraint;
            p_slider.setValue(newPremThumbPosition, true, true, true);
        }

        // set keyIncrement
        b_slider.keyIncrement = keyIncrement;

        // allow benefit amount to be directly entered
        Event.on(benefit_display, "focus", function(e){
            benefit_amount_manual_focus = true;
        });
        Event.on(benefit_display, "blur", function(e){
            benefit_amount_manual_focus = false;
        });
        Event.on("benefit_manual_input_submit", "click", function(e){
            if(!isNaN(Dom.get('benefit_manual_input_field').value)){
                benefit_amount = Dom.get('benefit_manual_input_field').value;
                if(benefit_amount > 99999.99 && benefit_amount < 5000000.01) {
                    // convert the real value into a pixel offset
                    i = 0;
                    while(ben_benpx[i] < benefit_amount) i++;
                    b_slider.setValue(i, true, true, true);
                    //premium_amount = prem_benpx[i];
                    premium_amount = b_slider.getMonthly();
                    p_slider.updatePosition();
                    updateDisplayedValues();
                }
            }
            Dom.get(premium_display).style.display='block';
            Dom.get(premium_input_wrapper).style.display='none';
            Dom.get(benefit_display).style.display='block';
            Dom.get(benefit_input_wrapper).style.display='none';
        });

        Event.on('external_ben_amt', 'change', function(){
            if(!isNaN(Dom.get('external_ben_amt').value)){
                benefit_amount = Dom.get('external_ben_amt').value;
                Dom.get('benefit_manual_input_field').value = benefit_amount;
                if(benefit_amount > 99999.99 && benefit_amount < 5000000.01) {
                    // convert the real value into a pixel offset
                    i = 0;
                    while(ben_benpx[i] < benefit_amount) i++;
                    b_slider.setValue(i, true, true, true);
                    //premium_amount = prem_benpx[i];
                    premium_amount = b_slider.getMonthly();
                    p_slider.updatePosition();
                    updateDisplayedValues();
                }
            }
        });

        // clicks on display values reveals inputs
        Event.addListener(benefit_display, "click", function(e) {
            Dom.get(premium_display).style.display='none';
            Dom.get(premium_input_wrapper).style.display='none';
            Dom.get(benefit_display).style.display='none';
            Dom.get(benefit_input_wrapper).style.display='block';
        });

        Event.on("getval", "click", function(e) {
            YAHOO.log("Current value: "   + b_slider.getValue() + "\n" + 
                "Converted value: " + b_slider.getRealValue(), "info", "example"); 
        });

        Event.addListener('p-slide', 'focus', function(){
            currentSlider = 'p';
        });
        Event.addListener('b-slide', 'focus', function(){
            currentSlider = 'b';
        });

        
        // set up form handlers
        
        // listen for changes on setup form
        Event.addListener("initial_questions_form", "change", function(){
            calculatorActive = false;
        });

        Event.addListener("initial_questions_continue", "click", function(){
            er = '';
            // name
            if(Dom.get('first_name_field').value == '') er += ' First name\n';
            //if(Dom.get('middle_name_field').value == '') er += ' Middle name\n';
            if(Dom.get('last_name_field').value == '') er += ' Last name\n';
            // phone
            phrgx = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
            if(Dom.get('phone_field').value.match(phrgx) == null) {
                er += ' Phone (please include area code)';
            }
            // email
            emrgx = /^[^\s]+\@[a-zA-Z0-9_\-\.]+\.\w{2,4}$/;
            if(Dom.get('email_field').value == '' || Dom.get('email_field').value.match(emrgx) == null) er += ' Email address\n';
            // date of birth
            yyyy = Dom.get('dob_yyyy_field');
            mm = Dom.get('dob_mm_field');
            dd = Dom.get('dob_dd_field');
            if(yyyy.options[yyyy.selectedIndex].value == '' || mm.options[mm.selectedIndex].value == '' || dd.options[dd.selectedIndex].value == '') {
                er += ' Date of Birth\n';
            }
            // sex
            if(Dom.get('sex_field_M').checked == false && Dom.get('sex_field_F').checked == false) er += ' Sex\n';

            // term length
            // @todo .. when t100 comes back..
            //if(Dom.get('term_length_field_10').checked == false && Dom.get('term_length_field_20').checked == false && Dom.get('term_length_field_mpp').checked == false) er += ' Term Length\n';

            if(er != '') {
                alert('Please check the following field(s):\n\n' + er);
            } else {
                // submit
                Dom.get('initial_questions_continue').disabled = true;
                tempButtonLabel['initial_questions_continue'] = Dom.get('initial_questions_continue').value;
                Dom.get('initial_questions_continue').value = ' one moment please .. ';
                
                var param = YAHOO.util.Connect.setForm ('initial_questions_form');
                var request = YAHOO.util.Connect.asyncRequest('POST', 'inc/rate_lookup.ajax.php', SetupCallback, param);
            }
        });

        Event.addListener("calculator_continue", "click", function(){
            //document.location.href = 'qualification.php';
            Dom.get('calculator_form').submit();
        });

        Event.addListener("needs_assessment_button", "click", function(){
            assessmentWin = window.open('needs_assessment.php','na_win','width=680,height=510,scrollbars=1,resizable=1');
            assessmentWin.focus();
        });
        Event.addListener("smartquote_button", "click", function(){

            dob_mm = Dom.get('dob_mm_field').value;
            dob_dd = Dom.get('dob_dd_field').value;
            dob_yyyy = Dom.get('dob_yyyy_field').value;
            sex = Dom.get('sex_field_M').checked ? 'M' : 'F';
            smoker = Dom.get('smoker_field').value;
            assessmentWin = window.open('en/winquote_single.php?mm=' + dob_mm + '&dd=' + dob_dd + '&yyyy=' + dob_yyyy + '&sex=' + sex + '&smoker=' + smoker,'na_win','width=680,height=510,scrollbars=1,resizable=1');
            assessmentWin.focus();
        });

        Event.addListener(['term_length_field_mpp', 'term_length_field_20', 'term_length_field_30'], 'click', function(){
            temp_benefit_amount = benefit_amount;
            temp_premium_amount = premium_amount;
            Dom.get('relookup_quote_request_id_field').value = Dom.get('quote_request_id_field').value;
            var param = YAHOO.util.Connect.setForm ('relookup_form');
            var request = YAHOO.util.Connect.asyncRequest('POST', 'inc/rate_lookup.ajax.php', RelookupCallback, param);
        });

    });// end of onDOMReady event listener

    var SetupHandler = {
        success: function(o){
            Dom.get('initial_questions_continue').value = tempButtonLabel['initial_questions_continue'];
            tempButtonLabel['initial_questions_continue'] = '';
            Dom.get('initial_questions_continue').disabled = false;
            if(o.responseText !== undefined){
                try {
                    resp = YAHOO.lang.JSON.parse(o.responseText);
                }
                catch (x) {
                    alert("error - please use the Live Help or Contact links for further assistance");
                    return;
                }
                Dom.get('quote_request_id_field').value = resp.quote_request_id;

//console.log('setup quote_request_id: ' + resp.quote_request_id);
//console.log('setup term_length: ' + resp.term_length);
//console.log('setup wPlan: ' + resp.wPlan);
//console.log('setup query: ' + resp.query);

                // activate and display calculator
                calculatorActive = true;
                activateTab(3);

                // set the correct Term Length button
                if(resp.term_length == '10') {
                    Dom.get('term_length_field_10').checked = true;
                } else if(resp.term_length == '20') {
                    Dom.get('term_length_field_20').checked = true;
                } else if(resp.term_length == '30') {
                    Dom.get('term_length_field_30').checked = true;
                } else if(resp.term_length == 'mpp') {
                    Dom.get('term_length_field_mpp').checked = true;
                }

                // set bounds of premium slider
                for(i=0; i <= bottomConstraint; i++){
                    // set ben_benpx (benefit amount lookup by benefit pixel offset)
                    if(i < 180) {
                        // take us to $1M
                        ben_benpx[i] = 100000 + (i * 5000);
                    } else {
                        ben_benpx[i] = 950000 + ((i-180) * 40000);
                    }
                    // set prem_benpx (premium amount lookup by benefit pixel offset)
                    benefit_amount = ben_benpx[i];
                    prem_benpx[i] = b_slider.getMonthly();
                }

                benefit_amount = 100000;
                premLowerBound = b_slider.getMonthly();
                benefit_amount = 5000000;
                premUpperBound = b_slider.getMonthly();
                // set premium slider scaling
                premScaleOffset = premLowerBound;
                premScaleFactor = (premUpperBound - premLowerBound) / bottomConstraint;

                // initial benefit_amount
                benefit_amount = benDefault;
                
                // convert the real value into a pixel offset
                // @todo :: this is duplicated from Event.on("benefit_manual_input_submit
                i = 0;
                while(ben_benpx[i] < benefit_amount) i++;
                b_slider.setValue(i, true, true, true);
                //premium_amount = prem_benpx[i];
                premium_amount = b_slider.getMonthly();
                p_slider.updatePosition();
                updateDisplayedValues();

            }
        },
        failure: function(o){
            Dom.get('initial_questions_continue').value = tempButtonLabel['initial_questions_continue'];
            tempButtonLabel['initial_questions_continue'] = '';
            Dom.get('initial_questions_continue').disabled = false;
            alert("error - please use the Live Help or Contact links for further assistance");
        }
    };
    var SetupCallback = {
        success:SetupHandler.success,
        failure:SetupHandler.failure,
        argument:['foo','bar']
    };

    
    var RelookupHandler = {
        success: function(o){
            if(o.responseText !== undefined){
                try {
                    resp = YAHOO.lang.JSON.parse(o.responseText);
                }
                catch (x) {
                    alert("error - please use the Live Help or Contact links for further assistance");
                    return;
                }
                Dom.get('quote_request_id_field').value = resp.quote_request_id;

//console.log('relookup quote_request_id: ' + resp.quote_request_id);
//console.log('relookup term_length: ' + resp.term_length);
//console.log('relookup wPlan: ' + resp.wPlan);
//console.log('relookup query: ' + resp.query);

                // activate and display calculator
                calculatorActive = true;

                // set bounds of premium slider
                for(i=0; i <= bottomConstraint; i++){
                    // set ben_benpx (benefit amount lookup by benefit pixel offset)
                    if(i < 180) {
                        // take us to $1M
                        ben_benpx[i] = 100000 + (i * 5000);
                    } else {
                        ben_benpx[i] = 950000 + ((i-180) * 40000);
                    }
                    // set prem_benpx (premium amount lookup by benefit pixel offset)
                    benefit_amount = ben_benpx[i];
                    prem_benpx[i] = b_slider.getMonthly();
                }

                benefit_amount = 100000;
                premLowerBound = b_slider.getMonthly();
                benefit_amount = 5000000;
                premUpperBound = b_slider.getMonthly();
                // set premium slider scaling
                premScaleOffset = premLowerBound;
                premScaleFactor = (premUpperBound - premLowerBound) / bottomConstraint;

                // initial benefit_amount
                benefit_amount = temp_benefit_amount;

                // convert the real value into a pixel offset
                // @todo :: this is duplicated from Event.on("benefit_manual_input_submit
                i = 0;
                while(ben_benpx[i] < benefit_amount) i++;
                b_slider.setValue(i, true, true, true);
                //premium_amount = prem_benpx[i];
                premium_amount = b_slider.getMonthly();
                p_slider.updatePosition();
                updateDisplayedValues();

            }
        },
        failure: function(o){
            Dom.get('initial_questions_continue').value = tempButtonLabel['initial_questions_continue'];
            tempButtonLabel['initial_questions_continue'] = '';
            Dom.get('initial_questions_continue').disabled = false;
            alert("error - please use the Live Help or Contact links for further assistance");
        }
    };
    var RelookupCallback = {
        success:RelookupHandler.success,
        failure:RelookupHandler.failure,
        argument:['foo','bar']
    };

    var updateApf = function(benAmt) {
        var plann, planNow;
        
        if(!resp.all) {
            if(benAmt < 250000) {
                planNow = '-250';
            } else if(benAmt >= 250000 && benAmt < 500000) {
                planNow = '250-499';
            } else if(benAmt >= 500000 && benAmt < 1000000) {
                planNow = '500-999';
            } else if(benAmt >= 1000000) {
                planNow = '1000+';
            }
        } else {
            planNow = 'all';
            //currentPlan = '';
        }
        if(planNow != currentPlan) {
            currentPlan = planNow;
            //console.log('currentPlan: ' + currentPlan + ' ... planNow: ' + planNow);
            plann = resp[currentPlan];
            issue_rate = plann['rate_issue'];
            apf = plann['apf'];
            //console.log('issue_rate: ' + issue_rate + ' ... apf: ' + apf);
            return true;
        }
        return false;
    }
    var updateDisplayedValues = function(){
        
        var benFld = Dom.get(benefit_display);
        var premFld = Dom.get(premium_display);
        var benInput = Dom.get(benefit_input_field);
        var premInput = Dom.get(premium_input_field);

        // update new values
        premDisplay = YAHOO.util.Number.format(Number(premium_amount), {
            prefix: '$',
            decimalPlaces: 2,
            thousandsSeparator: ',',
            suffix: '/Month'
        });
        benDisplay = YAHOO.util.Number.format(Number(benefit_amount), {
            prefix: '$',
            decimalPlaces: 0,
            thousandsSeparator: ','
        });
        premFld.innerHTML = premDisplay;
        benFld.innerHTML = benDisplay;
        
        premInput.value = YAHOO.util.Number.format(Number(premium_amount), {
            decimalPlaces: 2
        });
        benInput.value = YAHOO.util.Number.format(Number(benefit_amount), {
            decimalPlaces: 0
        });

        // set title of backgrounds for accessibility
        Dom.get(p_bg).title = "current premium = " + premDisplay;
        Dom.get(b_bg).title = "current benefit = " + benDisplay;
    }

})();
