function predefinedValues(){
  // this function creates the predefined variables
  // declareing without var makes these global
  // built by Shaney
  NMW_RATE                                = 5.80;
  EMPLOYER_NI_RATE                        = 0.1280; // 12.80%
  WEEKLY_ALLOWANCES_FOR_NI_CALCULATIONS   = 110;
  MONTHLY_ALLOWANCES_FOR_NI_CALCULATIONS  = 476;

  WEEKLY_ALLOWANCES_FOR_TAX_CALCULATIONS  = 125;
  MONTHLY_ALLOWANCES_FOR_TAX_CALCULATIONS = 540;
  
  UMBRELLA_CHARGE_WEEKLY                  = 27.75;
  UMBRELLA_CHARGE_MONTHLY                 = 85.00;
  
  PAYE_TAX_RATE                           = 0.20; // 20%
  EMPLOYEE_NI                             = 0.11; // 11%
  
  MINIMUM_RATE_TO_QULIFY_FOR_UMBRELLA     = 7.60;
  
  BEFORE_TAX_ADJUSTMENT                   = 1.128;
  HOLIDAY_PAY_ROLEUP                      = 0.121; // 12.1%
  //UPLIFT_RATE_PERCENT                     = 1.1;

}

function cleanNumber(number) {
  if (number.substring(0,1) == "£") {number = number.substring(1);}
  return number;
}

function v_number(number){
	if (number.length==0) {return false;}
  var decimal_flag = false;
	var digits="0123456789";
	
  if (digits.indexOf(number.substring(0,1))==-1) {
    return false;
  }
	
	for (var i=0;i<number.length;i++){
	  if (number.substring(i,i+1) == "." && !decimal_flag) {
	    decimal_flag = true;
	    continue;
	  }
	  if (digits.indexOf(number.substring(i,i+1))==-1) {
      return false;
    }
  }
  
	if (number<0) {
    return false;
	}
	
	return true;
}

function formatCurrency(number){

	var decimalPos;
	var leftPart = number.toString();
	var orgLeftPart = "";
	var digitCount = 0;
	var digitChar = "";
	var decimalPart = "";
	
	decimalPos = leftPart.indexOf(".");
	if (decimalPos >= 0){
    decimalPart = leftPart.substring(decimalPos + 1);
    leftPart = leftPart.substring(0,decimalPos);
  }
	
	decimalPart = decimalPart.concat('00');
	decimalPart = '.' + decimalPart.substring(0,2);
	
	orgLeftPart = leftPart;
	leftPart="";
	for (var x=orgLeftPart.length-1;x!=-1;x--) {
	
		digitCount = digitCount + 1;
		digitChar = orgLeftPart.substring(x,x+1);
		if (digitCount==3) {
			digitCount=0;
			digitChar = "," + digitChar;
		}
		leftPart = digitChar + leftPart;
	
	}
	if (leftPart.substring(0,1)==",") {leftPart=leftPart.substring(1);}
	
	return(leftPart + decimalPart);

}

function calculateResults() {
  // get values from input fields
  var form = document.umbrellacalc;
  var rateElement = form.rate;
  var rate = cleanNumber(rateElement.value);
  var rateUmbrellaElement = form.rateUmbrella;
  var rateUmbrella = cleanNumber(rateUmbrellaElement.value);
  var hoursElement = form.hours;
  var hours = cleanNumber(hoursElement.value);
  var expensesElement = form.expenses;
  var expenses = cleanNumber(expensesElement.value);
  var timePeriod = "w";
  for (var i = 0; i < form.timePeriod.length; i++) {
    if (form.timePeriod[i].checked) {
      timePeriod = form.timePeriod[i].value;
    }
  }
    
  // validate
  var errorMessage = "";
  if (!v_number(rate)) {
    errorMessage += "Hourly Rate (AGENCY)\n";
    rateElement.className = 'error';
  }
  if (!v_number(rate)) {
    errorMessage += "Hourly Rate (UMBRELLA)\n";
    rateElement.className = 'error';
  }
  if (!v_number(hours)) {
    errorMessage += "Average hours worked per week\n";
    hoursElement.className = 'error';
  }
  if (!v_number(expenses)) {
    errorMessage += "Average expenses incurred\n";
    expensesElement.className = 'error';
  }
	if (errorMessage.length!=0) {
	  alert("The following entries are incorrect:\n\n" + errorMessage + "\nPlease correct these entries and\ntry again.");
	  return false;
	}
  
  // calculate values
  predefinedValues();
  
  if (timePeriod == 'w') {
    var payeTax_PAYE = ((rate * hours) - WEEKLY_ALLOWANCES_FOR_TAX_CALCULATIONS) * PAYE_TAX_RATE;
    var employeeNI_PAYE = ((rate * hours) - WEEKLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYEE_NI;
  }
  else {
    var payeTax_PAYE = ((rate * hours) - MONTHLY_ALLOWANCES_FOR_TAX_CALCULATIONS) * PAYE_TAX_RATE;
    var employeeNI_PAYE = ((rate * hours) - MONTHLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYEE_NI;
  }
  
  
  var gross = rateUmbrella * hours;
  if (timePeriod == 'w') {
    var lessUmbrellaFee = gross - UMBRELLA_CHARGE_WEEKLY;
  }
  else {
    var lessUmbrellaFee = gross - UMBRELLA_CHARGE_MONTHLY;
  }
  var salaryMinWage = hours * NMW_RATE;
  var holidayPay = salaryMinWage * HOLIDAY_PAY_ROLEUP;
  var total = salaryMinWage + holidayPay;
  if (timePeriod == 'w') {
    var employerNI = (total - WEEKLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYER_NI_RATE;
  }
  else {
    var employerNI = (total - MONTHLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYER_NI_RATE;
  }
  var totalCostToUmbrella = total + employerNI;
  
  var availableForExpensesOrCommissions = lessUmbrellaFee - totalCostToUmbrella;
  
  if (expenses > availableForExpensesOrCommissions) {
    var expensesClaimed = availableForExpensesOrCommissions;
  }
  else {
    // needed to turn this into a number
    var expensesClaimed = expenses * 1;
  }
  
  var balanceForCommissions = availableForExpensesOrCommissions - expensesClaimed;
  var commissionsBeforeTax = balanceForCommissions / BEFORE_TAX_ADJUSTMENT;
  var employerNIOnCommission = balanceForCommissions - commissionsBeforeTax;
  
  var totalEmployerNiCost = employerNI + employerNIOnCommission;
  var grossForTaxPurposes = total + commissionsBeforeTax;
  if (timePeriod == 'w') {
    var payeTax = (grossForTaxPurposes - WEEKLY_ALLOWANCES_FOR_TAX_CALCULATIONS) * PAYE_TAX_RATE;
    var employeeNI = (grossForTaxPurposes - WEEKLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYEE_NI;
  }
  else {
    var payeTax = (grossForTaxPurposes - MONTHLY_ALLOWANCES_FOR_TAX_CALCULATIONS) * PAYE_TAX_RATE;
    var employeeNI = (grossForTaxPurposes - MONTHLY_ALLOWANCES_FOR_NI_CALCULATIONS) * EMPLOYEE_NI;
  }
  
  var takeHomeWithUmbrella = grossForTaxPurposes - payeTax - employeeNI + expensesClaimed;
  var takeHomeOnNormalPaye = (rate * hours) - payeTax_PAYE - employeeNI_PAYE;
  var benefit = takeHomeWithUmbrella - takeHomeOnNormalPaye;

  
  
  //loop through variables and put them into the form (where appropriate)
  var variables = new Array("payeTax_PAYE", "employeeNI_PAYE", "rateUmbrella", "gross", "lessUmbrellaFee", "salaryMinWage", "holidayPay", "total", "employerNI", "totalCostToUmbrella", "availableForExpensesOrCommissions", "expensesClaimed", "balanceForCommissions", "commissionsBeforeTax", "employerNIOnCommission", "totalEmployerNiCost", "grossForTaxPurposes", "payeTax", "employeeNI", "takeHomeWithUmbrella", "takeHomeOnNormalPaye", "benefit");
  
  for (x in variables) {
    var varName = variables[x];
    if (varName in form){
      form[varName].value = formatCurrency(eval(varName));
    }
  }
  
  toggleBenefit(benefit);
  
  // don't reload the form
  return false;
}

function toggleBenefit(benefit){
  //var form = document.umbrellacalc;
  var benContainer = document.getElementById('benefit-container');
  if (benContainer != "null") {
    if (benefit < 0) {
      benContainer.style.display = "none";
    }
    else {
      benContainer.style.display = "";
    }
  }
}

// no longer needed
/**
function calculateUplift(){
  predefinedValues();
  var form = document.umbrellacalc;
  var rateElement = form.rate;
  var rate = cleanNumber(rateElement.value);
  var element = document.getElementById('uplifted-value');
  if (typeof element != "undefined") {
    if (v_number(rate)) {
      var uplifted = rate * UPLIFT_RATE_PERCENT;
      element.innerHTML = "£" + formatCurrency(uplifted);
    }
    else {
      // clear
      element.innerHTML = "";
    }
  }
  return false;
}
**/

function subTimePeriod(timePeriod, str) {
  if (timePeriod == 'w') {
    str = str.replace(/monthly/g, "weekly")
    str = str.replace(/Monthly/g, "Weekly")
    str = str.replace(/month/g, "week")
    str = str.replace(/Month/g, "Week")
  }
  else {
    str = str.replace(/weekly/g, "monthly")
    str = str.replace(/Weekly/g, "Monthly")
    str = str.replace(/week/g, "month")
    str = str.replace(/Week/g, "Month")
  }
  return str;
}

function changeTimePeriod() {
  var form = document.umbrellacalc;
  var timePeriod = "w";
  var element = '';
  var str1 = form.hours.title;
  var str2 = document.getElementById('hours-label-text').innerHTML;
  var str3 = document.getElementById('benefit-label-text').innerHTML;
  var str4 = form.benefit.title;
  
  for (var i = 0; i < form.timePeriod.length; i++) {
    if (form.timePeriod[i].checked) {
      element = form.timePeriod[i];
      timePeriod = form.timePeriod[i].value;
    }
  }
  
  if (typeof str1 == 'string') {
    str1 = subTimePeriod(timePeriod, str1);
    form.hours.title = str1;
  }
  if (typeof str2 == 'string') {
    str2 = subTimePeriod(timePeriod, str2);
    document.getElementById('hours-label-text').innerHTML = str2;
  }
  if (typeof str3 == 'string') {
    str3 = subTimePeriod(timePeriod, str3);
    document.getElementById('benefit-label-text').innerHTML = str3;
  }
  if (typeof str4 == 'string') {
    str4 = subTimePeriod(timePeriod, str4);
    form.benefit.title = str4;
  }
  
  return true;
}

