var payFrequencyValue = 'hourly';
var workTimeValue = 0;
var workTimeTypeValue = 'hour';
var workRateValue = 0;
var workRateTypeValue = 'hour';
var expensesValue = 0;
var taxCodeValue = '647L';

function isNumeric(sText) {
	var validChars = "0123456789.";
	var isNumber = true;
	var Char;
	for (i = 0; i < sText.length && isNumber; i++) {
		Char = sText.charAt(i); 
		if (validChars.indexOf(Char) == -1) {
			isNumber = false;
		}
	}
	return isNumber;
}

function justHide(divID) {
	document.getElementById(divID).style.display = "none";
}

function justShow(divID) {
	document.getElementById(divID).style.display = "";
}

function currencyDecimals(currFigure) {
	var temp = currFigure;
	temp = Math.round(temp * 100).toString();
	var Notes = temp.substring(0, temp.length - 2);
	var Coins = temp.substring(temp.length - 2, temp.length);
	if (Notes.length > 3) {
		var notesThou = "";
		var addComma = "";
		for (i=0; i<=Notes.length; i++) {
			if (i % 3 == 1 && i != 1  && Notes.charAt(Notes.length - i) != "-") {
				addComma = ",";
			} else {
				addComma = "";
			}
			notesThou = Notes.charAt(Notes.length - i) + addComma + notesThou;
		}
		Notes = notesThou;
	}
	temp = Notes + '.' + Coins;
	return temp;
}

function spCalculate() {
	var inPayFrequency = document.getElementById("payfrequency").value;

	var inWorkTime = document.getElementById("worktime").value;
	var inWorkTimeType = "hours";
	if (inPayFrequency == "daily") {
		inWorkTimeType = "days";
	}

	var timeWorkRequired = inPayFrequency == "daily" || inPayFrequency == "hourly";
	if (!(timeWorkRequired)) {
		inWorkTime = 1;
	}

	var inWorkRate = document.getElementById("workrate").value;
	var inWorkRateType = "hour";
	if (inPayFrequency == "daily") {
		inWorkRateType = "day";
	} else if (inPayFrequency == "weekly") {
		inWorkRateType = "week";
	} else if (inPayFrequency == "monthly") {
		inWorkRateType = "month";
	}


	var inExpenses = document.getElementById("expenses").value;
	var inTaxCode = document.getElementById("taxcode").value;

	var Basis = document.getElementById("basis");
	var weekReturn = document.getElementById("weekreturn");
	var monthReturn = document.getElementById("monthreturn");
	var yearReturn = document.getElementById("yearreturn");
	Basis.innerHTML = "";
	weekReturn.innerHTML = "";
	monthReturn.innerHTML = "";
	yearReturn.innerHTML = "";
	if (isNumeric(inWorkTime) && isNumeric(inWorkRate) && isNumeric(inExpenses)) {
		inWorkTime = parseFloat(inWorkTime)
		inWorkRate = parseFloat(inWorkRate)
		inExpenses = parseFloat(inExpenses)

		if (inWorkTime > 0 && inWorkRate > 0 && inExpenses >= 0) {

			if (timeWorkRequired) {
				Basis.innerHTML = "<b>Based on " + inPayFrequency + " pay, for " + inWorkTime + " " + inWorkTimeType + " @ &#163;" + inWorkRate + " per " + inWorkRateType + ", with &#163;" + inExpenses + " expenses, tax code " + inTaxCode + ":</b>";
			} else {
				Basis.innerHTML = "<b>Based on " + inPayFrequency + " pay @ &#163;" + inWorkRate + " per " + inWorkRateType + ", with &#163;" + inExpenses + " expenses, tax code " + inTaxCode + ":</b>";
			}

			// Constants
			var personalAllowanceLimit = 6475;
			var smartPayMargin = 27;
			var corpBand2EmpNI = 5715;
			var corpBand3EmpNIpercent = 0.128;
			var corpBand4EmpNIpercent = 0.128;
			var employeeNILowerLimit = 5715;
			var employeeNIUpperLimit = 43875;
			var employeeNIUpToLimit = 0.11;
			var employeeNIHigherLimit = 0.01;
			var personalLowerTaxRate = 0.1;
			var personalBasicTaxRate = 0.2;
			var personalHigherTaxRate = 0.4;
			var personalLowerTaxLimit = 0;
			var personalBasicTaxLimit = 37400;
			var personalHigherTaxLimit = 37400;

			// Calculations on input and constants

			var corpBand2EmpNIMonthly = corpBand2EmpNI/12;
			var corpBand2EmpNIWeekly = corpBand2EmpNI/52;
			var employeeNILowerLimitMonthly = employeeNILowerLimit/12;
			var employeeNILowerLimitWeekly = employeeNILowerLimit/52;
			var employeeNIUpperLimitMonthly = employeeNIUpperLimit/12;
			var employeeNIUpperLimitWeekly = employeeNIUpperLimit/52;
			var personalLowerTaxLimitMonthly = personalLowerTaxLimit/12;
			var personalLowerTaxLimitWeekly = personalLowerTaxLimit/52;
			var personalBasicTaxLimitMonthly = personalBasicTaxLimit/12;
			var personalBasicTaxLimitWeekly = personalBasicTaxLimit/52;
			var personalHigherTaxLimitMonthly = personalHigherTaxLimit/12;
			var personalHigherTaxLimitWeekly = personalHigherTaxLimit/52;

			var contractValue = 0;
			if (timeWorkRequired) {
				contractValue = inWorkTime * inWorkRate;
			} else {
				contractValue = inWorkRate;
			}

			var taxAllowance = 0;
			if (inTaxCode == "BR") {
				taxAllowance = 0;
			} else if (inPayFrequency == "monthly") {
				taxAllowance = personalAllowanceLimit/12;
			} else {
				taxAllowance = personalAllowanceLimit/52;
			}


			var annualAvailableFunds = contractValue - smartPayMargin - inExpenses;

			var grossSalary = 0;
			if (inPayFrequency == "monthly") {
				if (annualAvailableFunds < corpBand2EmpNIMonthly) {
					grossSalary = annualAvailableFunds;
				} else {
					grossSalary = (annualAvailableFunds + (corpBand2EmpNIMonthly *corpBand3EmpNIpercent))/(1+corpBand3EmpNIpercent);
				}
			} else if (annualAvailableFunds < corpBand2EmpNIWeekly) {
				grossSalary = annualAvailableFunds;
			} else {
				grossSalary = (annualAvailableFunds + (corpBand2EmpNIWeekly * corpBand3EmpNIpercent)) / (1 + corpBand3EmpNIpercent);
			}

			var employersNILiability = 0;
			if (inPayFrequency == "monthly") {
				if (grossSalary < corpBand2EmpNIMonthly) {
					employersNILiability = 0;
				} else if (grossSalary >= corpBand2EmpNIMonthly) {
					employersNILiability = (grossSalary - corpBand2EmpNIMonthly) * corpBand4EmpNIpercent;
				}
			} else if (grossSalary < corpBand2EmpNIWeekly) {
				employersNILiability = 0;
			} else if (grossSalary >= corpBand2EmpNIWeekly) {
				employersNILiability = (grossSalary - corpBand2EmpNIWeekly) * corpBand4EmpNIpercent;
			}

			var employeesNILiability = 0;
			if (inPayFrequency == "monthly") {
				if (grossSalary < employeeNILowerLimitMonthly) {
					employeesNILiability = 0;
				} else if (grossSalary < employeeNIUpperLimitMonthly) {
					employeesNILiability = (grossSalary - employeeNILowerLimitMonthly) * employeeNIUpToLimit;
				} else if (grossSalary >= employeeNIUpperLimitMonthly) {
					employeesNILiability = ((employeeNIUpperLimitMonthly - employeeNILowerLimitMonthly) * employeeNIUpToLimit) + ((grossSalary - employeeNIUpperLimitMonthly) * employeeNIHigherLimit);
				}
			} else if (grossSalary < employeeNILowerLimitWeekly) {
				employeesNILiability = 0;
			} else if (grossSalary < employeeNIUpperLimitWeekly) {
				employeesNILiability = (grossSalary - employeeNILowerLimitWeekly) * employeeNIUpToLimit;
			} else if (grossSalary >= employeeNIUpperLimitWeekly) {
				employeesNILiability = ((employeeNIUpperLimitWeekly - employeeNILowerLimitWeekly) * employeeNIUpToLimit)+((grossSalary-employeeNIUpperLimitWeekly) * employeeNIHigherLimit);
			}

			var payeCalcs = 0;
			if (inTaxCode == "BR") {
				payeCalcs = grossSalary * personalBasicTaxRate;
			} else if (inPayFrequency == "monthly") {
				if (grossSalary - taxAllowance > personalHigherTaxLimitMonthly) {
					payeCalcs = ((grossSalary - taxAllowance - personalHigherTaxLimitMonthly) * personalHigherTaxRate) + (personalBasicTaxLimitMonthly * personalBasicTaxRate) + (personalLowerTaxLimitMonthly * personalLowerTaxRate);
				} else if (grossSalary - taxAllowance > personalLowerTaxLimitMonthly) {
					payeCalcs = ((grossSalary - taxAllowance - personalLowerTaxLimitMonthly) * personalBasicTaxRate) + (personalLowerTaxLimitMonthly * personalLowerTaxRate);
				} else {
					payeCalcs = (grossSalary - taxAllowance) * personalLowerTaxRate;
				}
			} else if (grossSalary - taxAllowance > personalHigherTaxLimitWeekly) {
				payeCalcs = ((grossSalary- taxAllowance - personalHigherTaxLimitWeekly) * personalHigherTaxRate) + (personalBasicTaxLimitWeekly * personalBasicTaxRate) + (personalLowerTaxLimitWeekly * personalLowerTaxRate);
			} else if (grossSalary - taxAllowance > personalLowerTaxLimitWeekly) {
				payeCalcs = ((grossSalary - taxAllowance - personalLowerTaxLimitWeekly) * personalBasicTaxRate) + (personalLowerTaxLimitWeekly * personalLowerTaxRate);
			} else {
				payeCalcs = (grossSalary - taxAllowance) * personalLowerTaxRate;
			}

			var netPay = grossSalary - payeCalcs - employeesNILiability;

			var Salary = 0;
			if (annualAvailableFunds != 0) {
				Salary = netPay;
			}

			var totalNetFunds = Salary + inExpenses;

			var weekReturnValue = totalNetFunds;
			if (inPayFrequency == "monthly") {
				weekReturnValue *= 12/52;
			}

			var monthReturnValue = totalNetFunds;
			if (inPayFrequency != "monthly") {
				monthReturnValue *= 52/12;
			}

			var yearReturnValue = weekReturnValue * 52;

			weekReturn.innerHTML = currencyDecimals(weekReturnValue);
			monthReturn.innerHTML = currencyDecimals(monthReturnValue);
			yearReturn.innerHTML = currencyDecimals(yearReturnValue);

			var showInfo = false;
			if (showInfo) {
				var Info = "contractValue = " + contractValue + "\n";
				Info += "taxAllowance = " + taxAllowance + "\n";
				Info += "annualAvailableFunds = " + annualAvailableFunds + "\n";
				Info += "grossSalary = " + grossSalary + "\n";
				Info += "employersNILiability = " + employersNILiability + "\n";
				Info += "employeesNILiability = " + employeesNILiability + "\n";
				Info += "payeCalcs = " + payeCalcs + "\n";
				Info += "netPay = " + netPay + "\n";
				Info += "Salary = " + Salary + "\n";
				Info += "Expenses = " + inExpenses + "\n";
				Info += "totalNetFunds = " + totalNetFunds;
				alert(Info);
			}

		} else {
			Basis.innerHTML = "Awaiting input, above.";
			weekReturn.innerHTML = "0";
			monthReturn.innerHTML = "0";
			yearReturn.innerHTML = "0";
			if (timeWorkRequired) {
				alert("Please provide positive numbers for Amount of Time Worked and Rate of Pay, and zero or higher for Expenses.");
			} else {
				alert("Please provide a positive number for Rate of Pay, and zero or higher for Expenses.");
			}
		}
	} else {
		Basis.innerHTML = "Awaiting input, above.";
		weekReturn.innerHTML = "0";
		monthReturn.innerHTML = "0";
		yearReturn.innerHTML = "0";
		if (timeWorkRequired) {
			alert("Please provide positive numbers for Amount of Time Worked and Rate of Pay, and zero or higher for Expenses.");
		} else {
			alert("Please provide a positive number for Rate of Pay, and zero or higher for Expenses.");
		}
	}
}

