//Constants
var COST_OF_LOYALTY_PROGRAM = 197;
var COST_PER_SWIPE = 0.10;
var NUM_MONTHS = 13;
var NUM_FREE_MONTHS = 2;

var initial_enrollment = 60;
var increase_in_visits_percent = 0.53;
var increase_in_spend_percent = 0.19;
var average_spend = 15;
var food_cost_percent = .3;
var customer_visits_per_year = 12;

var current_graph_num = 0;
var num_graphs = 6;

var number_of_swipes_per_month_rate = 1 + increase_in_visits_percent;

function updateChart() {
  updateVars();

  chart1XML = createChartXML(current_graph_num);
  var chart = new FusionCharts("../resources/fusion-chart/FCF_MSLine.swf", "ChartId", "750", "350");
  chart.addParam('wmode','transparent');
  chart.setDataXML(chart1XML);
  chart.render("main_chart");

  document.getElementById('options_box').style.display='none';
}
function initializeForm() {
  document.getElementById('initial_enrollment').value = initial_enrollment;
  document.getElementById('customer_visits_per_year').value = customer_visits_per_year;

  document.getElementById('average_spend').value = average_spend;
  document.getElementById('food_cost_percent').value = food_cost_percent*100;
}
function updateVars() {
  initial_enrollment = parseFloat(document.getElementById('initial_enrollment').value);
  customer_visits_per_year = parseFloat(document.getElementById('customer_visits_per_year').value);

  //increase_in_visits_percent'] = document.getElementById('increase_in_visits_percent'];
  average_spend = parseFloat(document.getElementById('average_spend').value);
  food_cost_percent = parseFloat(document.getElementById('food_cost_percent').value/100);

  number_of_swipes_per_month_rate = 1 + increase_in_visits_percent;
}
function showChart() {
  chart1XML = createChartXML(0);
  var chart = new FusionCharts("../resources/fusion-chart/FCF_MSLine.swf", "ChartId", "750", "350");
  chart.addParam('wmode','transparent');
  chart.setDataXML(chart1XML);
  chart.render("main_chart");
}

function createChartXML(chart_number) {
  if (chart_number == 0) {
    //Skip first graph per K's instructions on 1/27
    chart_number++;
    current_graph_num++;
  }
  if (chart_number == 0) {
    NUM_MONTHS = 13;
    current_num_members = 1;

    return_value = "<graph caption='Increased Loyalty Customer Spending' xAxisName='Months' yAxisName='$' hovercapbg='FFECAA' hovercapborder='F47E00' formatNumberScale='0' decimalPrecision='0' showvalues='0' animation='1' numdivlines='5' numVdivlines='0' yaxisminvalue='0' yaxismaxvalue='100' lineThickness='3' rotateNames='1' showAnchors='1' anchorSides='4' anchorRadius='3'>"+"\n";
    return_value += "<categories>"+"\n";
    running_sum = initial_enrollment;
    for (t=0;t<NUM_MONTHS;t++) {
      return_value += "<category name='"+t+"' />"+"\n";
    }
    return_value += "</categories>"+"\n";
    return_value += "<dataset seriesname='Without Loyalty Program' color='0099FF' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      program_cost = rawCustomerSales(t);
      return_value += "<set value='"+program_cost.toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";
    return_value += "<dataset seriesname='With Loyalty Program' color='009900' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      program_cost = rawCustomerSalesWithLoyalty(t);
      return_value += "<set value='"+program_cost.toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";

    return_value += "</graph>"+"\n";
    show_value = (rawCustomerSalesWithLoyalty(NUM_MONTHS-1) - rawCustomerSales(NUM_MONTHS-1));
    document.getElementById('chart_subtitle').innerHTML = 'Increased Loyalty Customer Spending First Year <b>$'+addCommas(show_value.toFixed(2))+'</b>';

    //document.getElementById('ta').value = return_value;
    return return_value;
  } else if (chart_number == 1) {
    NUM_MONTHS = 13;
    current_num_members = 1;

    return_value = "<graph caption='Increased Loyalty Customer Net Profits' xAxisName='Months' yAxisName='$' hovercapbg='FFECAA' hovercapborder='F47E00' formatNumberScale='0' decimalPrecision='0' showvalues='0' animation='1' numdivlines='5' numVdivlines='0' yaxisminvalue='0' yaxismaxvalue='100' lineThickness='3' rotateNames='1' showAnchors='1' anchorSides='4' anchorRadius='3'>"+"\n";
    return_value += "<categories>"+"\n";
    running_sum = initial_enrollment;
    for (t=0;t<NUM_MONTHS;t++) {
      return_value += "<category name='"+t+"' />"+"\n";
    }
    return_value += "</categories>"+"\n";
    return_value += "<dataset seriesname='Without Loyalty Program' color='0099FF' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      program_cost = rawCustomerSpend(t);
      return_value += "<set value='"+program_cost.toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";
    return_value += "<dataset seriesname='With Loyalty Program' color='009900' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      program_cost = rawCustomerSpendWithLoyalty(t);
      return_value += "<set value='"+program_cost.toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";

    return_value += "</graph>"+"\n";
    show_value = (rawCustomerSpendWithLoyalty(NUM_MONTHS-1) - rawCustomerSpend(NUM_MONTHS-1));
    document.getElementById('chart_subtitle').innerHTML = 'Increased Loyalty Customer Net Profits First Year <b>$'+addCommas(show_value.toFixed(2))+'</b>';

    //document.getElementById('ta').value = return_value;
    return return_value;
  } else if (chart_number == 2) {
    return_value = "<graph caption='Typical Membership Trend' xAxisName='Months' yAxisName='Members' hovercapbg='FFECAA' hovercapborder='F47E00' formatNumberScale='0' decimalPrecision='0' showvalues='0' animation='1' numdivlines='5' numVdivlines='0' yaxisminvalue='0' yaxismaxvalue='100' lineThickness='3' rotateNames='1' showAnchors='1' anchorSides='4' anchorRadius='3' showLegend='0'>";
    return_value += "  <categories>";
    NUM_MONTHS = 61;

    running_sum = initial_enrollment;
    for (t=0;t<NUM_MONTHS;t++) {
      return_value += "<category name='" + t + "' />";
    }
    return_value += " </categories>";
    return_value += " <dataset seriesname='Program Enrollment' color='0099FF' showValue='1' alpha='100'  lineThickness='2'>";
    running_sum = initial_enrollment;

    first_year = 0;
    second_year = 0;
    fifth_year = 0;

    return_value += "<set value='0' />";
    for (t=1;t<NUM_MONTHS;t++) {
      running_sum += growthRate(t, initial_enrollment);
      if (t==12) {
       first_year = running_sum;
      } else if (t==24) {
       second_year = running_sum;
      } else if (t==60) {
       fifth_year = running_sum;
      }
      return_value += "<set value='" + running_sum + "' />";
    }
    return_value += " </dataset>";
    return_value += "</graph>";

    document.getElementById('chart_subtitle').innerHTML = 'Loyalty Members Enrollment First Year <b>'+addCommas(first_year.toFixed(0))+'</b><br />';
    document.getElementById('chart_subtitle').innerHTML += 'Loyalty Members Enrollment Second Year <b>'+addCommas(second_year.toFixed(0))+'</b><br />';
    document.getElementById('chart_subtitle').innerHTML += 'Loyalty Members Enrollment Fifth Year <b>'+addCommas(fifth_year.toFixed(0))+'</b>';

    //document.getElementById('ta').value = return_value;
    return return_value;
  } else if (chart_number > 2 && chart_number < 6) {
    NUM_MONTHS = 13;
    if (chart_number == 4) {
      NUM_MONTHS = 25;
    } else if (chart_number == 5) {
      NUM_MONTHS = 61;
    }

    return_value = "<graph caption='Expected Loyalty Program Profits' xAxisName='Months' yAxisName='$' hovercapbg='FFECAA' hovercapborder='F47E00' formatNumberScale='0' decimalPrecision='0' showvalues='0' animation='1' numdivlines='5' numVdivlines='0' yaxisminvalue='0' yaxismaxvalue='100' lineThickness='3' rotateNames='1' showAnchors='1' anchorSides='4' anchorRadius='3'>"+"\n";
    return_value += "<categories>"+"\n";
    running_sum = initial_enrollment;
    for (t=0;t<NUM_MONTHS;t++) {
      return_value += "<category name='"+t+"' />"+"\n";
    }
    return_value += "</categories>"+"\n";
    return_value += "<dataset seriesname='Program Cost To-Date' color='0099FF' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    profit_array = new Array();
    current_num_members = initial_enrollment;
    program_cost = 0;
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      current_num_members += growthRate(t, initial_enrollment);

      program_cost += costOfProgram(t, current_num_members);
      profit_array[t] = program_cost;
      return_value += "<set value='"+program_cost.toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";
    
    //return_value += "<dataset seriesname='Program Sales To-Date (-Food Cost)' color='009900' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    current_num_members = initial_enrollment;
    program_profit = 0;
    //return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      previous_num_members = current_num_members;
      current_num_members += growthRate(t, initial_enrollment);

      program_profit += programProfit(previous_num_members);
      profit_array[t] = program_profit - profit_array[t];
      //return_value += "<set value='"+program_profit.toFixed(2)+"' />"+"\n";
    }
    //return_value += "</dataset>"+"\n";
    
    return_value += "<dataset seriesname='Program Profit To-Date' color='990000' showValue='1' alpha='100'  lineThickness='2'>"+"\n";
    current_num_members = initial_enrollment;
    program_profit = 0;
    return_value += "<set value='0' />"+"\n";
    for (t=1;t<NUM_MONTHS;t++) {
      return_value += "<set value='"+profit_array[t].toFixed(2)+"' />"+"\n";
    }
    return_value += "</dataset>"+"\n";
    return_value += "</graph>"+"\n";

    running_sum = initial_enrollment;

    first_year = 0;
    second_year = 0;
    fifth_year = 0;

    for (t=1;t<NUM_MONTHS;t++) {
      running_sum += growthRate(t, initial_enrollment);
      if (t==12) {
       first_year = running_sum.toFixed(0);
      } else if (t==24) {
       second_year = running_sum.toFixed(0);
      } else if (t==60) {
       fifth_year = running_sum.toFixed(0);
      }
    }
    if (chart_number == 3) {
      document.getElementById('chart_subtitle').innerHTML = 'Loyalty Members Enrolled First Year <b>'+addCommas(first_year)+'</b> Expected Loyalty Profits First Year <b>$'+addCommas(profit_array[NUM_MONTHS-1].toFixed(2))+'</b>';
    } else if (chart_number == 4) {
      document.getElementById('chart_subtitle').innerHTML = 'Loyalty Members Enrolled (2 Years) <b>'+addCommas(second_year)+'</b> Expected Loyalty Profits Two Years <b>$'+addCommas(profit_array[NUM_MONTHS-1].toFixed(2))+'</b>';
     } else {
      document.getElementById('chart_subtitle').innerHTML = 'Loyalty Members Enrolled (5 Years) <b>'+addCommas(fifth_year)+'</b> Expected Loyalty Profits Five Years <b>$'+addCommas(profit_array[NUM_MONTHS-1].toFixed(2))+'</b>';
    }

    //document.getElementById('ta').value = return_value;
    return return_value;
  }
  return '';
}
function growthRate(time, initial_population) {
  time = time || 0;
  initial_population = initial_population || 100;
  if (time == 1) {
    return 0;
  } else if (time < 4) {
    return initial_population*(Math.pow(1.33,time-1));
  } else if (time == 4) {
    return initial_population*1.6;
  } else if (time == 5) {
    return initial_population*1.55;
  } else {
    return .3*(initial_population - initial_population/(7.31*(Math.log(time + 1) + 1)));
  }
}

function costOfProgram(time, number_of_members) {
  time = time || 0;
  number_of_members = number_of_members || 100;

  return COST_OF_LOYALTY_PROGRAM*((time<(NUM_FREE_MONTHS+1))?0:1) + (COST_PER_SWIPE * number_of_swipes_per_month_rate * number_of_members * increase_in_visits_percent * (customer_visits_per_year/12));
}
function programProfit(number_of_members) {
  number_of_members = number_of_members || 100;

  return average_spend * (1+increase_in_spend_percent) * (1-food_cost_percent) * number_of_members * increase_in_visits_percent * (customer_visits_per_year/12);
}
function rawCustomerSpend(time) {
  return average_spend * (1-food_cost_percent) * time * (customer_visits_per_year/12);
}
function rawCustomerSpendWithLoyalty(time) {
  return average_spend * (1+increase_in_spend_percent) * (1-food_cost_percent) * (1+increase_in_visits_percent) * time * (customer_visits_per_year/12);
}
function rawCustomerSales(time) {
  return average_spend *  time * (customer_visits_per_year/12);
}
function rawCustomerSalesWithLoyalty(time) {
  return average_spend * (1+increase_in_spend_percent) * (1+increase_in_visits_percent) * time * (customer_visits_per_year/12);
}
/* From http://www.mredkj.com/javascript/numberFormat.html#addcommas */
/*
function addCommas(nStr) {
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}
*/
