window.setupForm = function()
    {
        var nextBtn = dojo.byId('roiCalc-step1-btn');
        dojo.connect(nextBtn, 'onclick', nextBtn,
                     function(event) {
                         // hideTooltips();
                         window.roiNext(event);
                         dojo.stopEvent(event);
                     });
        var submitBtn = dojo.byId('roiCalc-step2-btn');
        dojo.connect(submitBtn, 'onclick', submitBtn,
                     function(event) {
                         // hideTooltips();
                         window.roiCalc(event);
                         dojo.stopEvent(event);
                     });
        // var resetBtn = dojo.byId('resetBtn');
        // dojo.connect(resetBtn, 'onclick', resetBtn, window.roiReset);
        // var restartBtn = dojo.byId('restartBtn');
        // dojo.connect(restartBtn, 'onclick', restartBtn, window.roiReset);
        var signupBtn = dojo.byId('roiCalc-step3-btn');
        dojo.connect(signupBtn, 'onclick', signupBtn,
                     function(event) {
                         // hideTooltips();
                         window.signUp(event);
                         dojo.stopEvent(event);
                     });
    };

window.isNumber = function(str)
    {
        return ((str != null) && str.trim && str.trim().length
                && (! isNaN(str.trim())));
    };

window.getRadioSelection = function(radioGroup)
    {
        var value = null;
        for (var i = 0, n = radioGroup.length; i < n; i++)
        {
            var radio = radioGroup[i];
            if (radio.checked)
            {
                value = radio.value;
                break;
            }
        }
        return value;
    };

window.roiNext = function(event)
    {
        var warnings = [], errors = [];

        // Get form values.
        var form = document.forms['roiCalc'];
        var age = form.ddlAge.value;
        var gender = window.getRadioSelection(form.rblGender);
        var height = form.ddlHeight.value;
        var weight = form.txtWeightLbs.value;
        var bmi = 0;
        var bmiRounded = "";

        // Check form values.
        if (! window.isNumber(age))
        {
            warnings.push('Please enter your age.');
        }
        else if (age < 21)
        {
            errors.push('You must be at least 21 years old to participate in our program.');
        }
        if ((gender != 'f') && (gender != 'm'))
        {
            warnings.push('Please select your gender.');
        }
        if (! window.isNumber(height))
        {
            warnings.push('Please tell us your height.');
        }
        if (! window.isNumber(weight))
        {
            warnings.push('Please enter your weight.');
        }
        if (! warnings.length)
        {
            bmi = (703.0 * weight) / (height * height);
            bmiRounded = Math.round(10.0 * bmi) / 10;
            if (bmiRounded < 30)
            {
                errors.push('Your BMI is ' + window.formatBmi(bmiRounded) + ', which does not qualify for our program.');
            }
        }

        // What to do?
        if (errors.length)
        {
            // alert("REDIRECT to page with message:\n\n" + errors.join("\n"));
            window.location = "investinliving_ProgramSignUp_ThanksCandidate.aspx?BMI=" + encodeURIComponent(bmiRounded);
        }
        else if (warnings.length)
        {
            alert(warnings.join("\n"));
        }
        else
        {
            TABS.showPanel('step2');

            var bmi = window.calcBmi(height, weight);
            var bmiField = dojo.byId('roiCalcBmi');
            window.clearNode(bmiField);
            bmiField.appendChild(document.createTextNode(window.formatBmi(bmi)));

            // Min target.
            var minTarget = Math.ceil(window.calcWeight(height, 25.0));
            var minAdjusted = minTarget;
            while (minAdjusted % 5)
                minAdjusted++;

            // Max target.
            var maxTarget = Math.ceil(window.calcWeight(height, bmi - 10));
            var maxAdjusted = maxTarget;
            while (maxAdjusted % 5)
                maxAdjusted++;

            // alert('bmi = ' + bmi + ', minAdjusted = ' + minAdjusted + ', maxAdjusted = ' + maxAdjusted);

            // var msg = 'Your current BMI is ' + window.formatBmi(bmi) + ".\n\n";
            // if (bmi < 35)
            if (maxAdjusted <= minAdjusted)
            {
                // msg += 'Your target weight is ' + minTarget + ' pounds.';

                window.populateTarget(minAdjusted, minAdjusted);

                var target = dojo.byId('roiCalcTargetWeight');
                window.clearNode(target);
                target.appendChild(document.createTextNode(minAdjusted));

                dojo.byId('roiCalcTargetInfo').style.display = 'block';
                dojo.byId('roiCalcTargetChoice').style.display = 'none';
            }
            else
            {
                // msg += 'Your target weight is from ' + minTarget
                //            + ' to ' + maxTarget + ' pounds.';

                window.populateTarget(minAdjusted, maxAdjusted);

                // window.clearNode(dojo.byId('roiCalcTargetWeight'));
                var target = dojo.byId('roiCalcIdealTarget');
                window.clearNode(target);
                target.appendChild(document.createTextNode(minAdjusted));

                dojo.byId('roiCalcTargetInfo').style.display = 'none';
                dojo.byId('roiCalcTargetChoice').style.display = 'block';
            }
            // alert(msg);
        }
    };

window.populateTarget = function(min, max)
    {
        min = Math.round(min);
        max = Math.round(max);
        if (min > max)
        {
            tmp = min;
            min = max;
            max = tmp;
        }

        while (min % 5)
            min++;
        while (max % 5)
            max++;

        var target = document.forms['roiCalc'].roiCalcTarget;
        window.clearNode(target);
        var weight = min;
        do
        {
            var option = document.createElement('option');
            option.setAttribute('value', weight);
            option.appendChild(document.createTextNode(weight));
            target.appendChild(option);
            weight += 5;
        } while (weight <= max);
    };

window.roiCalc = function(event)
    {
        var warnings = [];

        // Get form values.
        var form = document.forms['roiCalc'];
        var target = form.roiCalcTarget.value;
        var invest = form.roiCalcInvest.value;
        var years  = form.roiCalcYears.value;

        // Check form values.
        if (! window.isNumber(target))
        {
            warnings.push('Please enter your target weight.');
        }
        else
        {
            var height = 1 * form.ddlHeight.value;
            var weight = 1 * form.txtWeightLbs.value;
            var minTarget = Math.ceil((25.0 * height * height) / 703.0);
            if (target >= weight)
            {
                warnings.push('Your target weight must be less than your current weight of ' + weight + '.');
            }
            else if (target < minTarget)
            {
                warnings.push('Your target weight cannot be less than ' + minTarget + '.');
            }
        }
        if (! window.isNumber(invest))
        {
            warnings.push('Please tell us how much you would like to invest.');
        }
        else if (invest < 100)
        {
            warnings.push('You must invest at least $100.');
        }
        else if (invest > 10000)
        {
            warnings.push('You cannot invest more than $10,000.');
        }

        // What to do?
        if (warnings.length)
        {
            alert(warnings.join("\n"));
        }
        else
        {
            window.showLoading('roiCalc');
            window.setTimeout(window.calculateRoi, 500);
            // calculateRoi();
        }
    };

window.calculateRoi = function()
    {
        // var roiInput = dojo.formToObject(dojo.byId('roiCalc'));
        var form = document.forms['roiCalc'];
        var roiInput = {};
        roiInput['age'] = form.ddlAge.value;
        roiInput['height'] = form.ddlHeight.value;
        roiInput['weight'] = form.txtWeightLbs.value;
        roiInput['gender'] = window.getRadioSelection(form.rblGender);
        roiInput['target'] = form.roiCalcTarget.value;
        roiInput['invest'] = form.roiCalcInvest.value;
        roiInput['years'] = form.roiCalcYears.value;

        roiInput['clientId'] = Math.round(new Date().getTime() / 1000);
        // roiInput['height'] = (12 * roiInput['heightFt'])
        //                      + (1 * roiInput['heightIn']);
        var query = dojo.objectToQuery(roiInput);
        // alert(query);
        var url = 'RoiCalc.ashx?' + query;
        // prompt(url, url);

        var xhrArgs = { 'url':      url,
                        'handleAs': 'text',
                        'timeout':  5000,
                        'load':     window.processRoi,
                        'error':    window.roiError };
        dojo.xhrGet(xhrArgs);
    };

window.roiError = function(response, ioArgs)
    {
        alert("Sorry, we could not fetch your investment quote right now.\nPlease try again.");
        window.hideLoading();
    };

window.processRoi = function(response, ioArgs)
    {
        var lines = response.split("\n");
        var roiResult = {};
        var current = null;
        var key = null;
        for (var i = 0, n = lines.length; i < n; i++)
        {
            var line = lines[i];
            if (line.startsWith('!'))
            {
                var index = line.indexOf('=');
                if (index > 0)
                {
                    var name = line.substring(1, index);
                    var value = line.substr(index + 1);
                    roiResult[name] = value;
                }
            }
            else if (line.startsWith('#'))
            {
                if (key && current)
                {
                    roiResult[key] = current;
                }
                key = line.substr(1);
                current = {};
            }
            else if (line && line.length)
            {
                var index = line.indexOf('=');
                if (index > 0)
                {
                    var name = line.substr(0, index);
                    var value = line.substr(index + 1);
                    current[name] = value;
                }
            }
        }
        if (key && current)
        {
            roiResult[key] = current;
        }

        if ((roiResult.code != null) && (roiResult.code == 0)
            && roiResult.result)
        {
            window.showRoi(roiResult.result);
        }
        else if (roiResult.error)
        {
            alert('Error: ' + roiResult.error);
        }
        else
        {
            alert("Unknown response:\n\n" + response);
        }

        window.hideLoading();
    };

window.showRoi = function(result)
    {
        // var form = dojo.byId('roiCalc');
        // form.probSuccess.value      = window.formatPct(result.probSuccess);
        // form.targetPay.value        = '$' + window.formatInt(result.targetPay, ',');
        // form.targetReturn.value     = window.formatPct(result.targetReturn);
        // form.probGuaranteed.value   = window.formatPct(result.probGuaranteed);
        // form.guaranteedPay.value    = '$' + window.formatInt(result.guaranteedPay, ',');
        // form.guaranteedReturn.value = window.formatPct(result.guaranteedReturn);

        var targetPay = result.targetPay;
        var targetPayRounded = window.roundTo(targetPay, (targetPay < 10000 ? 2 : 3));
        var targetPayDisplay = '$' + window.formatInt(targetPayRounded, ',');
        var guaranteedPay = result.guaranteedPay;
        var guaranteedPayRounded = window.roundTo(guaranteedPay, (guaranteedPay < 10000 ? 2 : 3));
        var guaranteedPayDisplay = '$' + window.formatInt(guaranteedPayRounded, ',');
        var payoutCap = result.cap;
        var capDisplay = (result.cap > 0) ? ('$' + window.formatInt(payoutCap, ',')) : '0';

        // var targetPayNode = dojo.byId('roiCalcPayout');
        // window.clearNode(targetPayNode);
        // targetPayNode.appendChild(document.createTextNode(targetPayDisplay));

        // var guaranteedPayNode = dojo.byId('guaranteedPay');
        // window.clearNode(guaranteedPayNode);
        // guaranteedPayNode.appendChild(document.createTextNode(guaranteedPayDisplay));

        var payoutNode = dojo.byId('roiCalcPayout');
        window.clearNode(payoutNode);
        var payout = null, payoutDisplay = null;
        if (window.SHOW_CONS)
        {
            payout = guaranteedPayRounded;
            payoutDisplay = guaranteedPayDisplay;
        }
        else
        {
            payout = targetPayRounded;
            payoutDisplay = targetPayDisplay;
        }
        if ((payoutCap > 0) && (payout > payoutCap))
            payoutDisplay = capDisplay;
        payoutNode.appendChild(document.createTextNode(payoutDisplay));

        dojo.byId('roiCalc').hidPayout.value = targetPayDisplay;
        dojo.byId('roiCalc').hidGuaranteed.value = guaranteedPayDisplay;
        dojo.byId('roiCalc').hidCap.value = capDisplay;

        TABS.showPanel('step3');
        window.hideLoading();
    };

window.roiReset = function(event)
    {
        document.forms['roiCalc'].reset();
        window.clearNode(dojo.byId('targetPay'));
        TABS.showPanel('step1');
    };

window.signUp = function(event)
    {
        var warnings = [];

        // Check required fields.
        var form = document.forms['roiCalc'];
        var fname = form.txtFirstName.value;
        var lname = form.txtLastName.value;
        var email = form.txtEmail.value;
        if ((! fname) || (! fname.trim().length))
            warnings.push('Please enter your first name.');
        if ((! lname) || (! lname.trim().length))
            warnings.push('Please enter your last name.');
        if ((! email) || (! email.trim().length))
            warnings.push('Please enter your email address.');

        // Warning or submit?
        if (warnings.length)
            alert(warnings.join("\n"));
        else
            window.enroll();
    };

window.enroll = function()
    {
        var form = document.forms['roiCalc'];
        form.hidTargetWeight.value = form.roiCalcTarget.value;
        form.hidInvest.value = form.roiCalcInvest.value;
        form.hidYears.value = form.roiCalcYears.value;
        form.submit();
    };

window.formatBmi = function(bmi)
    {
        var str = '' + Math.round(10.0 * bmi);
        var len = str.length;
        return str.substr(0, len - 1) + '.' + str.substr(len - 1);
    };

window.formatPct = function(pct)
    {
        var tmp = Math.round(1000.0 * pct);
        var str = '' + tmp;
        var len = str.length;
        return str.substr(0, len - 1) + '.' + str.substr(len - 1) + '%';
        // return '' + int(tmp / 10) + '.' + (tmp % 10) + '%';
    };

window.formatInt = function(num, sep)
    {
        var tmp = '' + Math.round(num);
        var str = '';
        while (tmp.length > 0)
        {
            if (sep && (str.length > 0))
                str = sep + str;

            var part;
            if (tmp.length > 3)
            {
                part = tmp.substr(tmp.length - 3);
                tmp = tmp.substr(0, tmp.length - 3);
            }
            else
            {
                part = tmp;
                tmp = '';
            }
            str = part + str;
        }
        return str;
    };

window.calcBmi = function(height, weight)
    {
        return (703.0 * weight) / (height * height);
    };

window.calcWeight = function(height, bmi)
    {
        return (1.0 * bmi * height * height) / 703.0;
    };

window.clearNode = function(node)
    {
        while (node.hasChildNodes())
            node.removeChild(node.firstChild);
    };

window.roundTo = function(num, prec)
    {
        var factor = Math.pow(10, prec);
        return Math.round(num / factor) * factor;
    };

window.showLoading = function(element)
    {
        var loading = dojo.byId('loading-panel');
        var box = dojo.coords(element, true);
        loading.style.left = '' + box.x + 'px';
        loading.style.top = '' + box.y + 'px';
        loading.style.width = '' + box.w + 'px';
        loading.style.height = '' + box.h + 'px';
        loading.style.display = 'block';
    };

window.hideLoading = function()
    {
        var loading = dojo.byId('loading-panel');
        loading.style.display = 'none';
    };

