

var monthly_plans = [];
var paygo_plans = [];

function buildPlanList() {
    if(monthly_plans.length) return;

    var iter_plan;
    var dom_month_plans = document.getElementById('monthly-plans-pricing').getElementsByTagName('tr');
    for(var i=0; iter_plan=dom_month_plans[i]; i++) {
        var cells = iter_plan.getElementsByTagName('td');
        if(!cells.length) continue;
        var price = parseFloat(cells[0].innerHTML.replace(/[\$,]/g, ''));
        var matches = cells[cells.length-1].innerHTML.match(/([\d,]+)\s*\-\s*([\d,]+)/)
        var sub_min = parseInt(matches[1].replace(/,/g, ''));
        var sub_max = parseInt(matches[2].replace(/,/g, ''));
        monthly_plans.push({type: 'monthly', price: price, min: sub_min, max: sub_max, row: iter_plan, size_range: formatNumber(sub_min) + '-' + formatNumber(sub_max)});
    }

    var dom_paygo_plans = document.getElementById('payasyougo-plans-pricing').getElementsByTagName('tr');
    for(var i=0; iter_plan=dom_paygo_plans[i]; i++) {
        var cells = iter_plan.getElementsByTagName('td');
        if(!cells.length) continue;
        var price = parseFloat(cells[0].innerHTML.replace(/[\$,]/g, ''));
        var matches = cells[2].innerHTML.match(/([\d,]+)/);
        var credits = parseInt(matches[1].replace(/,/g, ''));
        paygo_plans.push({type: 'paygo', price: price, credits: credits, row: iter_plan});
    }
}

function pickRightPlan() {
    buildPlanList();
    var list_size = document.getElementById('list-size').value;
    var sending_freq = parseInt(document.getElementById('sending-frequency-number').value);
    var sending_time = document.getElementById('sending-frequency-time').value;

    var iter_row;
    var rows = document.getElementsByTagName('tr');
    for(var i=0; iter_row=rows[i]; ++i) {
        if(iter_row.className == 'plan-for-me') iter_row.className = '';
    }

    if(validateListSize(list_size)) {
        list_size = parseInt(list_size);
        var plan = getBestPlan(list_size, sending_freq, sending_time);
        
        var response_tpl = document.getElementById('plan-results-' + plan.type + '-tpl');
        var response = response_tpl.cloneNode(true);
        response.style.display = '';
        for(tplvar in plan) {
            if(tplvar == 'monthly' || tplvar == 'price') {
                response.innerHTML = response.innerHTML.replace('$' + tplvar, formatCurrency(plan[tplvar]));
            } else {
                response.innerHTML = response.innerHTML.replace('$' + tplvar, (typeof(plan[tplvar]) == 'number') ? formatNumber(plan[tplvar]) : plan[tplvar]);
            }
        }
        
        document.getElementById('plan-results').appendChild(response);
        if(plan.row) plan.row.className = 'plan-for-me';

        switch(plan.type) {
            case 'monthly':
                var disclosure_content = document.getElementById('monthly-plans-pricing').parentNode;
                break;
            case 'paygo':
                var disclosure_content = document.getElementById('payasyougo-plans-pricing').parentNode;
                break;
        }
        
        if(disclosure_content && disclosure_content.style.display == 'none') {
            var disclosure_title = disclosure_content.previousSibling;
            while(disclosure_title.nodeType != 1) disclosure_title = disclosure_title.previousSibling;
            var toggle_anchor = disclosure_title.getElementsByTagName('a')[0];
            $(toggle_anchor).click();
        }
    }
}

function validateListSize(size_str) {
    document.getElementById('plan-results').style.display = 'block';
    document.getElementById('plan-results').innerHTML = '';
    if(parseInt(size_str) > 0) {
        return true;
    }

    document.getElementById('plan-results').innerHTML = '<div class="plan-response-error">Please enter a positive number for your list size</div>';
    return false;
}

function getBestPlan(size, frequency, interval) {
    var monthly_send;
    switch(interval) {
        case 'day':
            monthly_send = frequency * size * 30;
            break;
        case 'month':
            monthly_send = frequency * size;
            break;
        case 'quarter':
            monthly_send = frequency * size * .25;
            break;
        case 'year':
            monthly_send = (frequency * size) / 12;
            break;
    }

    if(monthly_send > 300000) return {type: 'highvolume'};

    var best_monthly = getBestMonthlyPlan(size);
    var best_paygo = getBestPayGoPlan(monthly_send);
    if(best_monthly && best_paygo) {
        if(best_monthly.monthly < best_paygo.monthly) return best_monthly;
        return best_paygo;
    } else if(best_monthly) {
        return best_monthly;
    } else if(best_paygo) {
        return best_paygo;
    } else {
        return {type: 'highvolume'};
    }
}

function getBestMonthlyPlan(size) {
    var iter_plan;
    for(var i=0; iter_plan=monthly_plans[i]; i++) {
        if(size >= iter_plan.min && size <= iter_plan.max) {
            iter_plan.monthly = iter_plan.price;
            return iter_plan;
        }
    }
}

function getBestPayGoPlan(volume) {
    var iter_plan;
    var best_plan;
    for(var i=0; iter_plan=paygo_plans[i]; i++) {
        if(iter_plan.credits > volume && ((volume < 500 && iter_plan.credits <= 1000) || iter_plan.credits <= volume * 2)) {
            best_plan = iter_plan;
            best_plan.monthly = (volume / best_plan.credits) * best_plan.price;
        }
    }

    return best_plan;
}

function formatNumber(nbr) {
    if(nbr < .01) return nbr;
    if(nbr % 1 != 0) {
        nbr = nbr.toFixed(2);
    }

    nbr += '';
    nbrparts = nbr.split('.');
    whole = nbrparts[0];
    dec = nbrparts.length > 1 ? '.' + nbrparts[1] : '';
    var reg = /(\d+)(\d{3})/;
    while(reg.test(whole)) {
        whole = whole.replace(reg, '$1,$2');
    }
    return whole + dec;
}

function formatCurrency(nbr) {
    return '$' + formatNumber(nbr);
}
