
function getradio(radio) {
  var r = 0;
  for (i=radio.length-1; i > -1; i--) {
    if (radio[i].checked) {
      r = i;
      i = -1;
    }
  }
  if (r > -1) 
    return radio[r].value;
  else 
    return 0;
}



function updateGraph()
{
  var sit = getradio(document.gform.situation);
  var dep = getradio(document.gform.dependents);
  document.taxgraph.src = graphs[sit][dep];
  updateTaxComparison();
  updateLevelsTable();
}



function boxUpdate (box){
  var b=document.getElementById('output'+box);

  var val = b.value.replace(/[^0123456789]/g,'');
  
//  var val = b.value;

  var slider = document.getElementById('slider0'+box);

  //val = Math.pow(b.value, 1/sliderexp);

  val = Math.log(Math.log(b.value));

  if(val < slider.min){
    val = slider.min;
    setBoxValue(slider.min, box);
  }else if(val > slider.max){
    val = slider.max;
    setBoxValue(slider.max, box);
  }
  

  slider.val = val;
  drawSliderByVal(slider);
  updateTaxComparison();

  //b.value = dollar(val);
}



function getCategory(sit, deps){
  return categories[sit][deps];
}



function getTax(sit, deps, income, table){
  
  var c = getCategory(sit, deps);  

  /** Special handling for top and bottom **/
  if(income < 10000){
    return (table[0][c] / 10000) * income;
  }
  if(income > 2000000){
    return (table[13][c] / 2000000) * income;
  }

  var top = 0;
  var bottom = 0;
  while(brackets[top] < income){
    top++;
  }

  

  if(top > 0){
    bottom = top - 1;
    var topPer = (income - brackets[bottom]) / (brackets[top] - brackets[bottom]);
    var botPer = 1 - topPer;
    return table[bottom][c] * botPer + table[top][c] * topPer;
  }else{
    return table[bottom][c];// least possible value;
  }

}

function dollarPlaceStr(val, above, comma){
  var res = val > 0 || above > 0 ? val : '';
  res = (val > 0 || above > 0) && comma > 0 ? val + ',' : '';
  if(val - val % 100 == 0 && above > 0)
    res = '0' + res;
  if(val - val % 10 == 0 && above > 0)
    res = '0' + res;
  return res;
}

function dollar(val){
  var onesPlace = Math.floor(val % 1000);
  var thouPlace = Math.floor((val % 1000000) / 1000);
  var milPlace = Math.floor((val % 1000000000) / 1000000);
  var bilPlace = Math.floor((val % 1000000000000) / 1000000000);
  var trilPlace = Math.floor((val) / 1000000000000);

  var trilStr = trilPlace > 0 ? trilPlace + ',' : '';
  var bilStr = dollarPlaceStr(bilPlace, trilPlace, 1);
  var milStr = dollarPlaceStr(milPlace, trilPlace+bilPlace, 1);
  var thouStr = dollarPlaceStr(thouPlace, trilPlace+bilPlace+milPlace, 1);

  var onesStr = '' + onesPlace;
  if(onesPlace - onesPlace % 100 == 0 && (trilPlace+bilPlace+milPlace+thouPlace > 0))
    onesStr = '0' + onesStr;
  if(onesPlace - onesPlace % 10 == 0 && (trilPlace+bilPlace+milPlace+thouPlace > 0))
    onesStr = '0' + onesStr;

  return '$' + trilStr + bilStr + milStr + thouStr + onesStr;
}



function updateTaxComparison(){
  var sit = getradio(document.gform.situation);
  var dep = getradio(document.gform.dependents);
  var income = document.gform.output1.value.replace(/[^0123456789]/g,'');

  var oTax = getTax(sit, dep, income, obamaplan);
  var mTax = getTax(sit, dep, income, mccainplan);

  if((oTax - mTax < 0 ? mTax - oTax : oTax - mTax) < 10){
    document.getElementById('returnstatement').innerHTML = "Small difference (within 0.5% of income)";
    document.getElementById('returnstatement').style.backgroundColor = "#999";
  }else{
    if((oTax - mTax < 0 ? mTax - oTax : oTax - mTax) / income < 0.005){
      document.getElementById('returnstatement').innerHTML = oTax < mTax ? "Small difference (within 0.5% of income) Obama's plan by " + dollar(Math.round(-(oTax - mTax))) : "Small difference (within 0.5% of income) McCain's plan by " + dollar(Math.round(-(mTax - oTax)));
      document.getElementById('returnstatement').style.backgroundColor = "#999";
    }else{
      document.getElementById('returnstatement').innerHTML = oTax < mTax ? "Obama's plan provides a better return by " + dollar(Math.round(-(oTax - mTax))) : "McCain's plan provides a better return by " + dollar(Math.round(-(mTax - oTax)));
      if(oTax - mTax < 0){
        document.getElementById('returnstatement').style.backgroundColor = "#69f";
      } else {
        document.getElementById('returnstatement').style.backgroundColor = "#f88";
      }
    }
  }

  if(oTax < 0){
    document.getElementById('obamastatement').innerHTML = "Tax Cut";
  }else if(oTax > 0){
    document.getElementById('obamastatement').innerHTML = "Tax Increase";
  }else{
        document.getElementById('obamastatement').innerHTML = "No Change";
  }

  if(mTax < 0){
    document.getElementById('mccainstatement').innerHTML = "Tax Cut";
  }else if(mTax > 0){
    document.getElementById('mccainstatement').innerHTML = "Tax Increase";
  }else{
        document.getElementById('mccainstatement').innerHTML = "No Change";
  }

  document.getElementById('obamaval').innerHTML = dollar(Math.round(oTax < 0 ? -oTax : oTax));
  document.getElementById('mccainval').innerHTML = dollar(Math.round(mTax < 0 ? -mTax : mTax));

  var oPer = Math.round((oTax < 0 ? -oTax : oTax) / income * 1000) / 10;
  var mPer = Math.round((mTax < 0 ? -mTax : mTax) / income * 1000) / 10;

  document.getElementById('obamaper').innerHTML = oPer + "%";
  document.getElementById('mccainper').innerHTML = mPer + "%";
}



function calcAll(sit, deps, income){
  //income = income > 2000000 ? 2000000 : income < 10000 ? 10000 : income;

  var result = new Object();
  result.obama = Math.round(getTax(sit, deps, income, obamaplan));
  result.mccain = Math.round(getTax(sit, deps, income, mccainplan));
  result.winner = result.obama - result.mccain < 0 ? 1 : 2;

  result.winnerName = result.winner == 1 ? 'Obama' : 'McCain';
  

  result.obamaPercentage = Math.round((result.obama) / income * 1000) / 10;
  result.mcCainPercentage = Math.round((result.mccain) / income * 1000) / 10;
  result.difference = Math.round(result.obama - result.mccain);
  result.absDifference = result.difference < 0 ? -result.difference : result.difference;
  result.percentageDifference = Math.round((result.obamaPercentage - result.mcCainPercentage) * 10)/10;
  result.absPercentageDifference = result.percentageDifference < 0 ? -result.percentageDifference : result.percentageDifference;
  if(result.absPercentageDifference < 0.005){
    result.winner = 0;
    result.winnerName = 'Close ' + result.winnerName;
  }

  result.winnerColor = result.winner == 0 ? '#999' : result.winner == 1 ? '#69f' : '#f88';
  return result;
}



var levelsTableVals = new Array(18981, 37595, 49991, 111645, 160772, 603402, 2871682);



function updateLevelsTable(){
  var sit = getradio(document.gform.situation);
  var dep = getradio(document.gform.dependents);

  document.getElementById('levelsTableHeader').innerHTML = 'What Income Levels Gain Under Which Candidate for a ' + categoriesStr[getCategory(sit, dep)];

  for(var i = 0; i < 7; i++){
    var vals = calcAll(sit, dep, levelsTableVals[i]);
    document.getElementById('annual'+i).innerHTML = dollar(levelsTableVals[i]);
    document.getElementById('better'+i).innerHTML = vals.winnerName;
    document.getElementById('better'+i).style.backgroundColor = vals.winnerColor;
    document.getElementById('diff'+i).innerHTML = dollar(vals.absDifference);
    document.getElementById('perdiff'+i).innerHTML = vals.absPercentageDifference+'%';
  }
}


