(function ($) {
	$.fn.extend({
		purchaseCalculator: function (settings) {
			settings = $.extend({
				action: $(this).attr('action').replace(/\?(.+)/, ''),
				extraParams: '&type=0',
				updateInterval: 500,
				defaultValues: {
					payment: 0,
					rate: 8.5,
					term: 60,
					trade: 0
				}
			}, settings);
			
			var self = this,
				maxPrice = 0,
				actionParams = '?type=0';
			
			var calculateMaxPrice = function (params) {
					params = $.extend(settings.defaultValues, params);
					
					var parseNumber = function (num) {
						num = num.toString().replace(/\$/, '').replace(/\%/, '').replace(/,/, '');
						return isNaN(parseFloat(num)) ? 0 : parseFloat(num);
					};
					
					// convert arguments to acceptable numerical values
					var payment = parseNumber(params.payment),
						rate = parseNumber(params.rate) / 1200,
						term = parseNumber(params.term),
						trade = parseNumber(params.trade),
						maxPrice = (rate === 0) ? ((payment * term) + trade) : (payment * ((1 - (1 / Math.pow(1 + rate, term))) / rate) + trade);
					
					return maxPrice;
				},
				updateInterface = function (price) {
					var price = calculateMaxPrice({
						payment: $('[name=payment]', self).val(),
						rate: $('[name=rate]', self).val(),
						term: $('[name=term]', self).val(),
						trade: $('[name=trade]', self).val()
					});
					var newParams = '?price=1-' + Math.round(price) + settings.extraParams;
					
					if ((newParams !== actionParams) && (price > 1000)) {
						actionParams = newParams;
					}
					
					// we no longer actually update the interface, just the maxprice value
				};
			
			setInterval(updateInterface, settings.updateInterval);
			
			return $(this).each(function () {
				$(this).submit(function () {
					window.location = settings.action + actionParams
					return false;
				});
			});
		}
	});
})(jQuery);