var DATES = new Array();
var PAYMENTS = new Array();

var URL = "/calc/calc.php";
var NAME = "calc";
var WIDTH = 675;
var HEIGHT = 350;
var SIDE = "left";

function calculator() {
	open_calc(URL, NAME, WIDTH, HEIGHT, SIDE);
}

function open_calc(url, name, width, height, side) {
	var xPos = 0;
	if (side == "right") {
		xPos = screen.width - width; 
	}
	var newWin = window.open(url, name, "left=" + xPos + ",top=0" + ",width=" + width + ",height=" + height);
	newWin.focus();
}

function check_calculator(form) {
	if (isBlank(form.judgment, "Please fill in a judgment amount.")) { 
		return false; 
	}else if (isNaN(form.judgment.value)) {
		alert("Please enter a valid judgment value (without \"$\" or commas).");
		form.judgment.focus();
		form.judgment.select();
		return false;		
	}
	
	if (isValue(form.month, "header", "Please select the judgment date month.")) { return false; }
	if (isValue(form.day, "header", "Please select the judgment date day of month.")) { return false; }
	if (isValue(form.year, "header", "Please select the judgment date year.")) { return false; }
	if (isValue(form.rate, "header", "Please select the interest rate.")) { return false; }
	
	if (!isBeforeToday(form.month.value - 1, form.day.value, form.year.value)) {
		alert("Judgment date cannot be today or after.");
		form.year.focus();
		return false;			
	}		
	
	DATES = new Array();
	PAYMENTS = new Array();	
	var dates = form.payment_date;
	var amounts = form.payment_amount;
	var doj = new Date(form.year.value, form.month.value - 1, form.day.value);		
	
	for (var i=0; i < amounts.length; i++) {
		if (!check_payment_entry(dates[i], amounts[i], doj, form.judgment.value)){
			return false;
		}
	}

	return true;
}

function check_payment_entry(date, payment, doj, judgment) {
	if (date.value == "" && payment.value == "") {
		return true;
	}else if (date.value == "" && payment.value != "") {
		showMessage(date, "Please enter a date for each corresponding payment.");
		return false;
	}else if (date.value != "" && payment.value == "") {
		showMessage(payment, "Please enter a payment amount for each corresponding date.");
		return false;
	}else if (!isValidDate(date.value)) {
		showMessageSelected(date, "Please enter a valid payment date (mm/dd/yyyy).");
		return false;	
	}else if (!valid_payment_date(doj, date.value)) {
		showMessageSelected(date, "Payment date must be after the judgment date and before today.");
		return false;	
	}else if (isNaN(payment.value)) {
		showMessageSelected(payment, "Please enter a valid payment amount (no \"$\").");
		return false;		
	}else if (payment.value < .01) {
		showMessageSelected(payment, "Please enter a valid payment amount greater than $0.01");
		return false;		
	}else if (parseFloat(payment.value) > parseFloat(judgment)) {	
		showMessageSelected(payment, "Payment amount cannot be greater than judgment amount.");
		return false;	
	}

	add_payment(parseDate(date.value), payment.value);
	
	return true;
}

function valid_payment_date(doj, date) {
	var test = parseDate(date);
	var today = getGMT(new Date().getTime());
	
	if (test >= today || test <= getGMT(doj.getTime())) {
		return false;
	}
	
	return true;
}

function add_payment(date, payment) {
	if (DATES.length == 0) {
		DATES.push(date);
		PAYMENTS.push(payment);
		return;
	}
	
	for (var i=0; i < DATES.length; i++) {
		if (i == DATES.length - 1) {
			if (date <= DATES[i]) {
				DATES = insert(date, DATES, i);
				PAYMENTS = insert(payment, PAYMENTS, i);
			}else {
				DATES = insert(date, DATES, i + 1);
				PAYMENTS = insert(payment, PAYMENTS, i + 1);
			}
		}else if (date <= DATES[i]) {
			DATES = insert(date, DATES, i);
			PAYMENTS = insert(payment, PAYMENTS, i);
			break;
		}else if (date <= DATES[i]) {
			DATES = insert(date, DATES, i + 1);
			PAYMENTS = insert(payment, PAYMENTS, i + 1);
			break;
		}
	}
}

function insert(value, array, index) {
	var aux = null;
	if (array == null || array.length == 0) {
		return new Array(value);
	}else if (index < 0 || index > array.length) {
		return array;
	}else if (index == 0) {
		aux = new Array(value).concat(array); 
		return aux;
	}else if (index == array.length) {
		array.push(value); 
		return array;
	}
	
	var aux = array;
	var a1 = array.slice(0, index - 1);
	var a2 = aux.slice(index);
	a1.push(value);
	aux = a1.concat(a2);
	
	return aux;
}

function isValidDate(test) {		
	var date = test.split("/"); 	
	if (date.length != 3) {
		return false;
	}

	var month = date[0];
	var day = date[1];	
	var year = date[2];
	var daysInMonth= new Array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	daysInMonth[1] = (year % 4 == 0 && year % 100 != 0) ? 29 : 28;
	
	if (month > 12 || month < 1) {
		return false;
	}else if (day < 1 ||day > daysInMonth[month - 1]) {
		return false;
	}else if (year < 1900 ||year > 2100) {	
		return false;
	}

	return true;
}

function isToday(date) {
	if (!isValidDate(date)) {
		return false;
	}
	var d2 = new Date();
	var test = parseDate(date);
	var today = getGMT(d2.getTime());
	if (test == today) {
		return true;
	}
	
	return false;
}

function getFullYear(obj) {
	if (document.layers) {	
 		return obj.getYear() + 1900;
 	}else if (document.all) {
 		return obj.getYear();
 	}else if (document.getElementById) {
 		return obj.getYear() + 1900;
 	}
}

function getGMT(date) {
	var d = new Date(date);
	var gmt = Date.UTC(getFullYear(d), d.getMonth(), d.getDate());
	return gmt;
}

function parseDate(date) {
	var pd = date.split("/"); 
	var parsed = new Date(pd[2], pd[0] - 1, pd[1]).getTime();
	return new Date(getGMT(parsed));
}

function isBlank(obj, message) {
	if (obj.value == "") {
		alert(message);
		obj.focus();
		return true;
	}
	
	return false;
}

function isValue(obj, value, message) {
	if (obj.value == value) {
		alert(message);
		obj.focus();
		return true;
	}
	
	return false;
}

function isBeforeToday(month, day, year) {
	var now = new Date();

	if (year == getFullYear(now) && month == now.getMonth() && day < now.getDate()) {
		return true;
	}else if (year == getFullYear(now) && month < now.getMonth()) {
		return true;
	}else if (year < getFullYear(now)) {
		return true;
	}
	return false;
}

function showMessage(field, message) {
	alert(message);
	field.focus();
}

function showMessageSelected(field, message) {
	alert(message);
	field.focus();
	field.select();
}

function decimalFormat(num) {
	if (num == 0) {
		return 0;
	}
	var i;
	var newNum = new String(Math.floor((num * 100) + .5) / 100);
	var index = newNum.lastIndexOf(".")
	
	if (index > (newNum.length - 3)) {
		for (i=0; i < index - (newNum.length - 3); i++) {
			newNum += "0";
		}
	}else if (index == -1) {
		newNum += ".00";
	}
	return newNum;
}

function getDaysOfMonth(month) {
	var today = new Date();
	var menu = document.forms['calculator'].day;
	var dim = new Array(31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	dim[1]=(((today.getFullYear()%100!=0)&&(today.getFullYear()%4==0))||(today.getFullYear()%400==0)) ? 29 : 28;
	
	//Remove current days from select menu
	for (var i=menu.options.length - 1; i >= 1; i--) {
		if (document.all) {
			menu.options.remove(i);
		}else {
			menu.options[i] = null;
		}
	}	
	
	//Add new days to select menu
	for (var i=1; i <= dim[month - 1]; i++) {
		if (document.all) {
			var v = document.createElement("OPTION");
			v.text = i;
			v.value = i;
			menu.options.add(v);
		}else {
			menu.options[i] = new Option(i, i, false, false);
		}
	}
}

function calcJudgment() {
	//for (var i=0; i<DATES.length; i++) {
	//	alert("Date: " + DATES[i].toLocaleString() + " Payment: " + PAYMENTS[i]);
	//}

	var form = null;
	if (document.layers) {	
 		form = document.forms['calculator'];
 	}else if (document.all) {
 		form = document.forms['calculator'];
 	}else if (document.getElementById) {
 		form = document.getElementById('calculator');
 	}
	
	var totalDays = 0;
	var total = 0;
	var interest_total = 0;
	var today = new Date();
	var start = new Date(form.year.value, form.month.value - 1, form.day.value);
	var amount = parseFloat(form.judgment.value);
	var rate = parseFloat(form.rate.value) / 100;

	if (DATES.length > 0) {
		var days = parseInt((getGMT(DATES[0]) - getGMT(start)) /1000/60/60/24);
		var daily_int = parseFloat(((amount * rate) / 365) * 100) / 100;
		interest_total += parseFloat(days * daily_int * 100) / 100;		
		totalDays += days;	
		
		for (var i=0; i < DATES.length; i++) {
			if (i == DATES.length - 1) {
				days = parseInt((getGMT(today) - getGMT(DATES[i])) /1000/60/60/24);
			}else {
				days = parseInt((getGMT(DATES[i+1]) - getGMT(DATES[i])) /1000/60/60/24);
			}
			amount = parseFloat(amount - PAYMENTS[i]);
			daily_int = parseFloat(((amount * rate) / 365) * 100) / 100;	
			interest_total += parseFloat(days * daily_int * 100) / 100;		
			totalDays += days;
		}
	}else {
		var daily_int = 0;
		totalDays = parseInt((getGMT(today) - getGMT(start)) /1000/60/60/24);
		daily_int = parseFloat(((amount * rate) / 365) * 100) / 100;
		interest_total += parseFloat(totalDays * daily_int * 100) / 100;		
	}
	var interest_daily = parseFloat((interest_total / totalDays) * 100) / 100;
	var total = amount + interest_total;
	
	form.day_count.value = totalDays;
	form.interest_accrued.value = "$" + decimalFormat(interest_total);
	form.interest_daily.value = "$" + decimalFormat(interest_daily);
	form.total_value.value = "$" + decimalFormat(total);
}
