window.onload = function () {

}

/**
 * 
 */
function calculate() {

  var total = 0.00;

  // HANDLE ASSETS
  var assetNumbers = getAssetNumbers();

  for (var i=0; i < assetNumbers.length; i++) {
    var number = assetNumbers[i];

    if (!isValueForAsset(number)) {
      continue;
    }

    var amount = getAssetAmount(number);
    var rate = getAssetRate(number);
    var compound = getAssetCompound(number);

    switch (compound) {
      case 'daily':
        total += calculateInterestDaily(amount,rate);
        break;
      case 'monthly':
        total += calculateInterestMonthly(amount,rate);
        break;
      case 'annually':
        total += calculateInterestYealrly(amount,rate);
        break;
      case 'continuously':
        total += calculateInterestContinuously(amount,rate);
        break;
    }
  }
 
  // HANDLE: LIABILITIES
  var liabilityNumbers = getLiabilityNumbers();

  for (var i=0; i < liabilityNumbers.length; i++) {
    var number = liabilityNumbers[i];

    if (!isValueForLiability(number)) {
      continue;
    } 

    var amount = getLiabilityAmount(number);
    var rate = getLiabilityRate(number);
    var compound = getLiabilityCompound(number);

    switch (compound) {
      case 'daily':
        total -= calculateInterestDaily(amount,rate);
        break;
      case 'monthly':
        total -= calculateInterestMonthly(amount,rate);
        break;
      case 'annually':
        total -= calculateInterestYealrly(amount,rate);
        break;
      case 'continuously':
        total -= calculateInterestContinuously(amount,rate);
        break;
    }
  }

  var calcTerm = document.getElementById('calcTerm');
  switch (calcTerm.value) {
     // Day
     case 'day':
       total/=365;
       break;

     // Month
     case 'month':
       total/=12;
       break;

     // Year
     case 'year':
       total/=1;
       break;
  }

  // DISPLAY THE VALUE
  displayNumber(total);
}

/**
 *
 */
function isValueForAsset(number) {

  // Check the amount
  var amountElement = document.getElementById('asset_amount_'+number);
  if (amountElement.value == '' || isNaN(amountElement.value)) {
    return false;
  }

  // Check the rate
  var amountRate = document.getElementById('asset_rate_'+number);
  if (amountRate.value == '' || isNaN(amountRate.value)) {
    return false;
  }

  return true;
}

/**
 *
 */
function isValueForLiability(number) {

  // Check the amount
  var amountElement = document.getElementById('liability_amount_'+number);
  if (amountElement.value == '' || isNaN(amountElement.value)) {
    return false;
  }

  // Check the rate
  var amountRate = document.getElementById('liability_rate_'+number);
  if (amountRate.value == '' || isNaN(amountRate.value)) {
    return false;
  }

  return true;
}

/**
 *
 */
function displayNumber(num) {

  if (num == 0) {
    num = "0.00";
  }

  // Poor man's round
  num *= 100;

  num = Math.round(num)

  num /= 100;

  // Makes sure has two decimal places
  num = num+'';

  var display = document.getElementById('display');
  
  // This will change
  if (num.indexOf('.') == -1) {
    display.innerHTML = '$'+num+'.00';
  } else if (num.indexOf('.') == num.length-1) {
    display.innerHTML = '$'+num+'00';
  } else if (num.indexOf('.') == num.length-2) {
    display.innerHTML = '$'+num+'0';
  } else {
    display.innerHTML = '$'+num;
  }
}

/**
 *
 */
function getAssetNumbers() {
  var assets = document.getElementById("assets");
  var assetNumbers = new Array();
  for (var i=0; i < assets.elements.length; i++) {
   
   var element = assets.elements[i];
   var number = extractNumberFromIdentifier(element.id);

   var contains = false;
   for (var j=0; j < assetNumbers.length; j++) {
     if (assetNumbers[j] == number) {
       contains = true;
       break;
     }
   }

   if (!contains) {
     assetNumbers.push(number);
   }
  }

  return assetNumbers;
}

/**
 *
 */
function getLiabilityNumbers() {
  var liabilities = document.getElementById("liabilities");
  var liabilitiesNumbers = new Array();
  for (var i=0; i < liabilities.elements.length; i++) {
   
   var element = liabilities.elements[i];
   var number = extractNumberFromIdentifier(element.id);

   var contains = false;
   for (var j=0; j < liabilitiesNumbers.length; j++) {
     if (liabilitiesNumbers[j] == number) {
       contains = true;
       break;
     }
   }

   if (!contains) {
     liabilitiesNumbers.push(number);
   }
  }

  return liabilitiesNumbers;
}

/**
 *
 */
function getAssetAmount(number) {
  var e = document.getElementById('asset_amount_'+number);
  return parseFloat(e.value);
}

/**
 *
 */
function getAssetRate(number) {
  var e = document.getElementById('asset_rate_'+number);
  var f = parseFloat(e.value);

  return f/100;
}

/**
 *
 */
function getAssetCompound(number) {
  var e = document.getElementById('asset_compound_'+number);
  return e.value;
}

/**
 *
 */
function getLiabilityAmount(number) {
  var e = document.getElementById('liability_amount_'+number);
  return parseFloat(e.value);
}

/**
 *
 */
function getLiabilityRate(number) {
  var e = document.getElementById('liability_rate_'+number);
  var f = parseFloat(e.value);

  return f/100;
}

/**
 *
 */
function getLiabilityCompound(number) {
  var e = document.getElementById('liability_compound_'+number);
  return e.value;
}

/**
 *
 */
function extractNumberFromIdentifier(identifier) {
  var tokens = new Array();
  tokens = identifier.split('_');
  var num = tokens[tokens.length-1];
  return parseInt(num);
}

/**
 *
 */
function calculateInterestDaily(principal,rate) {
  var total = principal * power((1 + rate/365),365);
  return total - principal;
}

/**
 *
 */
function calculateInterestMonthly(principal,rate) {
  var total = principal * power((1 + rate/12),12);
  return total - principal;
}

/**
 *
 */
function calculateInterestYealrly(principal,rate) {
  var total = principal * power((1 + rate),1);
  return total - principal;
}

/**
 *
 */
function calculateInterestContinuously(principal,rate) {
  var total = principal * power(2.71828, rate);
  return total - principal;
}

/**
 *
 */
function power(x,y) {
  return Math.pow(x,y);
}

/**
 *
 */
function addAsset() {
  var assetNumbers = getAssetNumbers();
  var max = 0;
  for (var i=0; i<assetNumbers.length; i++) {
    var val = assetNumbers[i];
    if (val > max) {
      max = val;
    }
  }
 
  // This is the number for the next asset
  var number = max + 1;

  var assets = document.getElementById("assets");

  // Create the holding div
  var assetDiv = document.createElement('div');
  assetDiv.id = 'asset_'+number;

  var divClass = document.createAttribute('class');
  divClass.nodeValue = 'asset';
  assetDiv.setAttributeNode(divClass);

  // --- Amount label --- 
  var amountLabel = document.createElement('label');

  var amountLabelFor = document.createAttribute('for');
  amountLabelFor.nodeValue = 'asset_amount_'+number;
  amountLabel.setAttributeNode(amountLabelFor);

  var amountLabelText = document.createTextNode('Amount:');
  amountLabel.appendChild(amountLabelText);

  assetDiv.appendChild(amountLabel);

  // --- Space and $ ---
  var spaceAndDollarSignText = document.createTextNode(' $');
  
  assetDiv.appendChild(spaceAndDollarSignText);

  // --- Amount input --- 
  var amountInput = document.createElement('input');

  var amountInputType = document.createAttribute('type');
  amountInputType.nodeValue = 'text';
  amountInput.setAttributeNode(amountInputType);

  var amountInputClass = document.createAttribute('class');
  amountInputClass.nodeValue = 'amount';
  amountInput.setAttributeNode(amountInputClass);

  var amountInputName = document.createAttribute('name');
  amountInputName.nodeValue = 'asset_amount_'+number;
  amountInput.setAttributeNode(amountInputName);

  var amountInputId = document.createAttribute('id');
  amountInputId.nodeValue = 'asset_amount_'+number;
  amountInput.setAttributeNode(amountInputId);

  var amountInputVal = document.createAttribute('value');
  amountInputVal.nodeValue = '0.00';
  amountInput.setAttributeNode(amountInputVal);

  assetDiv.appendChild(amountInput);

  // --- Add first spaces ---
  var firstSpacesText = document.createTextNode(' \u00a0 \u00a0 ');
  
  assetDiv.appendChild(firstSpacesText);

  // --- Interest label --- 
  var interestLabel = document.createElement('label');

  var interestLabelFor = document.createAttribute('for');
  interestLabelFor.nodeValue = 'asset_rate_'+number;
  interestLabel.setAttributeNode(interestLabelFor);

  var interestLabelText = document.createTextNode('Interest Rate:');
  interestLabel.appendChild(interestLabelText);

  assetDiv.appendChild(interestLabel);

  // --- Space ---
  var interestSpacerText = document.createTextNode(' ');
  
  assetDiv.appendChild(interestSpacerText);

  // --- Interest input --- 
  var interestInput = document.createElement('input');

  var interestInputType = document.createAttribute('type');
  interestInputType.nodeValue = 'text';
  interestInput.setAttributeNode(interestInputType);

  var interestInputClass = document.createAttribute('class');
  interestInputClass.nodeValue = 'rate';
  interestInput.setAttributeNode(interestInputClass);

  var interestInputName = document.createAttribute('name');
  interestInputName.nodeValue = 'asset_rate_'+number;
  interestInput.setAttributeNode(interestInputName);

  var interestInputId = document.createAttribute('id');
  interestInputId.nodeValue = 'asset_rate_'+number;
  interestInput.setAttributeNode(interestInputId);

  var interestInputVal = document.createAttribute('value');
  interestInputVal.nodeValue = '0.00';
  interestInput.setAttributeNode(interestInputVal);

  assetDiv.appendChild(interestInput);

  // --- Add second spaces ---
  var secondSpacesText = document.createTextNode('% \u00a0 \u00a0 ');
  
  assetDiv.appendChild(secondSpacesText);

  // --- Compound label --- 
  var compoundLabel = document.createElement('label');

  var compoundLabelFor = document.createAttribute('for');
  compoundLabelFor.nodeValue = 'asset_compound_'+number;
  compoundLabel.setAttributeNode(compoundLabelFor);

  var compoundLabelText = document.createTextNode('Compound:');
  compoundLabel.appendChild(compoundLabelText);

  assetDiv.appendChild(compoundLabel);

   // --- Space ---
  var compoundSpacerText = document.createTextNode(' ');
  
  assetDiv.appendChild(compoundSpacerText);

  // --- Compound drop down --- 
  var compoundSelect = document.createElement('select');
  
  var compoundSelectName = document.createAttribute('name');
  compoundSelectName.nodeValue = 'asset_compound_'+number;
  compoundSelect.setAttributeNode(compoundSelectName);

  var compoundSelectId = document.createAttribute('id');
  compoundSelectId.nodeValue = 'asset_compound_'+number;
  compoundSelect.setAttributeNode(compoundSelectId);

    // Option 1: Daily - daily
    var dailyOption = document.createElement('option');
    
    var dailyOptionValue = document.createAttribute('value');
    dailyOptionValue.nodeValue = 'daily';
    dailyOption.setAttributeNode(dailyOptionValue);

    var dailyTextNode = document.createTextNode('Daily');
    dailyOption.appendChild(dailyTextNode);

    compoundSelect.appendChild(dailyOption);

    // Option 2: Monthly - monthly
    var monthlyOption = document.createElement('option');
    
    var monthlyOptionValue = document.createAttribute('value');
    monthlyOptionValue.nodeValue = 'monthly';
    monthlyOption.setAttributeNode(monthlyOptionValue);

    var monthlyTextNode = document.createTextNode('Monthly');
    monthlyOption.appendChild(monthlyTextNode);

    compoundSelect.appendChild(monthlyOption);

    // Option 3: Annually - annually
    var annuallyOption = document.createElement('option');
    
    var annuallyOptionValue = document.createAttribute('value');
    annuallyOptionValue.nodeValue = 'annually';
    annuallyOption.setAttributeNode(annuallyOptionValue);

    var annuallyTextNode = document.createTextNode('Annually');
    annuallyOption.appendChild(annuallyTextNode);

    compoundSelect.appendChild(annuallyOption);

    // Option 4: Continuously - continuously
    var continuouslyOption = document.createElement('option');
    
    var continuouslyOptionValue = document.createAttribute('value');
    continuouslyOptionValue.nodeValue = 'continuously';
    continuouslyOption.setAttributeNode(continuouslyOptionValue);

    var continuouslyTextNode = document.createTextNode('Continuously');
    continuouslyOption.appendChild(continuouslyTextNode);

    compoundSelect.appendChild(continuouslyOption);

  assetDiv.appendChild(compoundSelect);

  // --- Third spaces ---
  var thirdSpacesText = document.createTextNode(' \u00a0 \u00a0 ');
  
  assetDiv.appendChild(thirdSpacesText);

  // 'Remove' link
  var removeLink = document.createElement('a');

  var removeLinkHref = document.createAttribute('href');
  removeLinkHref.nodeValue = 'index.html';
  removeLink.setAttributeNode(removeLinkHref);

  var removeLinkOnClick = document.createAttribute('onclick');
  removeLinkOnClick.nodeValue = 'removeAsset('+number+'); return false;';
  removeLink.setAttributeNode(removeLinkOnClick);

  var removeLinkText = document.createTextNode('remove');
  removeLink.appendChild(removeLinkText);

  assetDiv.appendChild(removeLink);

  // Add the div
  assets.appendChild(assetDiv);
}

/**
 *
 */
function addLiability() {
  var liabilityNumbers = getLiabilityNumbers();
  var max = 0;
  for (var i=0; i<liabilityNumbers.length; i++) {
    var val = liabilityNumbers[i];
    if (val > max) {
      max = val;
    }
  }
 
  // This is the number for the next liability
  var number = max + 1;

  var liabilities = document.getElementById("liabilities");

  // Create the holding div
  var liabilityDiv = document.createElement('div');
  liabilityDiv.id = 'liability_'+number;

  var divClass = document.createAttribute('class');
  divClass.nodeValue = 'liability';
  liabilityDiv.setAttributeNode(divClass);

  // --- Amount label --- 
  var amountLabel = document.createElement('label');

  var amountLabelFor = document.createAttribute('for');
  amountLabelFor.nodeValue = 'liability_amount_'+number;
  amountLabel.setAttributeNode(amountLabelFor);


  var amountLabelText = document.createTextNode('Amount:');
  amountLabel.appendChild(amountLabelText);

  liabilityDiv.appendChild(amountLabel);

  // --- Space and $ ---
  var spaceAndDollarSignText = document.createTextNode(' $');
  
  liabilityDiv.appendChild(spaceAndDollarSignText);

  // --- Amount input --- 
  var amountInput = document.createElement('input');

  var amountInputType = document.createAttribute('type');
  amountInputType.nodeValue = 'text';
  amountInput.setAttributeNode(amountInputType);

  var amountInputClass = document.createAttribute('class');
  amountInputClass.nodeValue = 'amount';
  amountInput.setAttributeNode(amountInputClass);

  var amountInputName = document.createAttribute('name');
  amountInputName.nodeValue = 'liability_amount_'+number;
  amountInput.setAttributeNode(amountInputName);

  var amountInputId = document.createAttribute('id');
  amountInputId.nodeValue = 'liability_amount_'+number;
  amountInput.setAttributeNode(amountInputId);

  var amountInputVal = document.createAttribute('value');
  amountInputVal.nodeValue = '0.00';
  amountInput.setAttributeNode(amountInputVal);

  liabilityDiv.appendChild(amountInput);

  // --- Add first spaces ---
  var firstSpacesText = document.createTextNode(' \u00a0 \u00a0 ');
  
  liabilityDiv.appendChild(firstSpacesText);

  // --- Interest label --- 
  var interestLabel = document.createElement('label');

  var interestLabelFor = document.createAttribute('for');
  interestLabelFor.nodeValue = 'liability_rate_'+number;
  interestLabel.setAttributeNode(interestLabelFor);

  var interestLabelText = document.createTextNode('Interest Rate:');
  interestLabel.appendChild(interestLabelText);

  liabilityDiv.appendChild(interestLabel);

  // --- Space ---
  var interestSpacerText = document.createTextNode(' ');
  
  liabilityDiv.appendChild(interestSpacerText);

  // --- Interest input --- 
  var interestInput = document.createElement('input');

  var interestInputType = document.createAttribute('type');
  interestInputType.nodeValue = 'text';
  interestInput.setAttributeNode(interestInputType);

  var interestInputClass = document.createAttribute('class');
  interestInputClass.nodeValue = 'rate';
  interestInput.setAttributeNode(interestInputClass);

  var interestInputName = document.createAttribute('name');
  interestInputName.nodeValue = 'liability_rate_'+number;
  interestInput.setAttributeNode(interestInputName);

  var interestInputId = document.createAttribute('id');
  interestInputId.nodeValue = 'liability_rate_'+number;
  interestInput.setAttributeNode(interestInputId);

  var interestInputVal = document.createAttribute('value');
  interestInputVal.nodeValue = '0.00';
  interestInput.setAttributeNode(interestInputVal);

  liabilityDiv.appendChild(interestInput);

  // --- Add second spaces ---
  var secondSpacesText = document.createTextNode('% \u00a0 \u00a0 ');
  
  liabilityDiv.appendChild(secondSpacesText);

  // --- Compound label --- 
  var compoundLabel = document.createElement('label');

  var compoundLabelFor = document.createAttribute('for');
  compoundLabelFor.nodeValue = 'liability_compound_'+number;
  compoundLabel.setAttributeNode(compoundLabelFor);

  var compoundLabelText = document.createTextNode('Compound:');
  compoundLabel.appendChild(compoundLabelText);

  liabilityDiv.appendChild(compoundLabel);

   // --- Space ---
  var compoundSpacerText = document.createTextNode(' ');
  
  liabilityDiv.appendChild(compoundSpacerText);

  // --- Compound drop down --- 
  var compoundSelect = document.createElement('select');
  
  var compoundSelectName = document.createAttribute('name');
  compoundSelectName.nodeValue = 'liability_compound_'+number;
  compoundSelect.setAttributeNode(compoundSelectName);

  var compoundSelectId = document.createAttribute('id');
  compoundSelectId.nodeValue = 'liability_compound_'+number;
  compoundSelect.setAttributeNode(compoundSelectId);

    // Option 1: Daily - daily
    var dailyOption = document.createElement('option');
    
    var dailyOptionValue = document.createAttribute('value');
    dailyOptionValue.nodeValue = 'daily';
    dailyOption.setAttributeNode(dailyOptionValue);

    var dailyTextNode = document.createTextNode('Daily');
    dailyOption.appendChild(dailyTextNode);

    compoundSelect.appendChild(dailyOption);

    // Option 2: Monthly - monthly
    var monthlyOption = document.createElement('option');
    
    var monthlyOptionValue = document.createAttribute('value');
    monthlyOptionValue.nodeValue = 'monthly';
    monthlyOption.setAttributeNode(monthlyOptionValue);

    var monthlyTextNode = document.createTextNode('Monthly');
    monthlyOption.appendChild(monthlyTextNode);

    compoundSelect.appendChild(monthlyOption);

    // Option 3: Annually - annually
    var annuallyOption = document.createElement('option');
    
    var annuallyOptionValue = document.createAttribute('value');
    annuallyOptionValue.nodeValue = 'annually';
    annuallyOption.setAttributeNode(annuallyOptionValue);

    var annuallyTextNode = document.createTextNode('Annually');
    annuallyOption.appendChild(annuallyTextNode);

    compoundSelect.appendChild(annuallyOption);

    // Option 4: Continuously - continuously
    var continuouslyOption = document.createElement('option');
    
    var continuouslyOptionValue = document.createAttribute('value');
    continuouslyOptionValue.nodeValue = 'continuously';
    continuouslyOption.setAttributeNode(continuouslyOptionValue);

    var continuouslyTextNode = document.createTextNode('Continuously');
    continuouslyOption.appendChild(continuouslyTextNode);

    compoundSelect.appendChild(continuouslyOption);

  liabilityDiv.appendChild(compoundSelect);

  // --- Third spaces ---
  var thirdSpacesText = document.createTextNode(' \u00a0 \u00a0 ');
  
  liabilityDiv.appendChild(thirdSpacesText);

  // 'Remove' link
  var removeLink = document.createElement('a');

  var removeLinkHref = document.createAttribute('href');
  removeLinkHref.nodeValue = 'index.html';
  removeLink.setAttributeNode(removeLinkHref);

  var removeLinkOnClick = document.createAttribute('onclick');
  removeLinkOnClick.nodeValue = 'removeLiability('+number+'); return false;';
  removeLink.setAttributeNode(removeLinkOnClick);

  var removeLinkText = document.createTextNode('remove');
  removeLink.appendChild(removeLinkText);

  liabilityDiv.appendChild(removeLink);

  // Add the div
  liabilities.appendChild(liabilityDiv);
}

/**
 *
 */
function removeAsset(number) {
  var asset = document.getElementById('asset_'+number);
  var assets = document.getElementById('assets');
  assets.removeChild(asset);
}

/**
 *
 */
function removeLiability(number) {
  var liability = document.getElementById('liability_'+number);
  var liabilities = document.getElementById('liabilities');
  liabilities.removeChild(liability);
}