//calculator object
function Calculator(maximumArg, minimumArg, baseArg){
	var cArray = new Array();
	var maximum = maximumArg;
	var minimum = minimumArg;
	var base = baseArg;
	
	//add calculation rules to this calculator
	this.addRule = function(greaterThan, maximum, normal, interval, fee){
		cArray.push({'greaterThan': greaterThan, 'max' : maximum, 'normal' : normal, 'interval' :  interval, 'fee' : fee});
	};
	
	//calculate fee from policy amount
	this.calculate = function(policyAmount){
		
		//if too big, return null (caller should handle the null if the policyAmount exceeds maximum)
		if(policyAmount > maximum){
			return null;
		}
		
		//base for (closing) fee
		var cf = base;
		
		//use minimum amount
		if (policyAmount < minimum){
			policyAmount = minimum;
		}
		
		//calculate fee
		for(var i = 0; i < cArray.length; i++){
			if(policyAmount > cArray[i]['greaterThan']){
				var tpa = Calculator.roundUp(policyAmount, cArray[i]['interval']);
				var tpa = Math.min(tpa, cArray[i]['max']);
				cf += Math.floor((tpa - cArray[i]['normal']) / cArray[i]['interval']) * cArray[i]['fee'];
			}
		}
		return cf;
	};
}
//Static Functions
//Static Functions
Calculator.roundUp = function(num,to){
	return Math.ceil(num / to) * to;	
};

Calculator.roundToHundredths = function(num){//wierd float precision forces the +0.000001
	return Math.round(parseFloat(num) * 100 + 0.000001) / 100;
};

Calculator.formatNumber = function(num){
	var roundedNum = Calculator.roundToHundredths(num);
	var cents = Math.round(Math.abs(roundedNum) * 100) % 100;
	var dollars = Math.floor(roundedNum);
	if (cents < 10){
		cents = '0' + cents;
	}
	
	//add commas
	dollars = dollars.toString();
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(dollars)) {
		dollars = dollars.replace(rgx, "$1,$2");
	}
	return dollars + '.' + cents;
};

Calculator.cleanNumber = function(num){
	var val = (num && num.replace) ? num.replace(/[^\d\.\-]/g, '') : num;
	if(val == ''){
		return 0;
	}
	if(isFinite(val)){
		return parseFloat(val);
	}
	return 0;
};

Calculator.cleanAndRound = function(num){
	//alert(Calculator.cleanNumber(num));
	return Calculator.roundToHundredths(Calculator.cleanNumber(num));
}
function clearDefault(field) {
  //function to clear field when you click in it
  if (field.defaultValue == field.value)
  field.value = "";
}