$(document).ready(function() {
	$('.output').attr('val', '0.00');
	$('.output').attr('next_val', '0.00');
	$('.output').text('$0.00');
	$('input, select').keyup(function() {
		calculate_cost();
	});
	$('input, select').change(function() {
		calculate_cost();
	});
	$('#pay_for_pack').val("0.00");
	$('#cigs_per_day').val("20");
	$('#smoking_years').val("1");
	var i;
	var days = {};
	for(i = 1; i <= 31; i++) {
		days[String(i)] = String(i);
	}
	
	var months = {
		"1": "Jan",
		"2": "Feb",
		"3": "Mar",
		"4": "Apr",
		"5": "May",
		"6": "Jun",
		"7": "Jul",
		"8": "Aug",
		"9": "Sep",
		"10": "Oct",
		"11": "Nov",
		"12": "Dec"
	};
	
	var today = new Date();
	var years = {};
	for(var i = today.getUTCFullYear() - 80; i <= today.getUTCFullYear(); i++) {
		years[String(i)] = String(i);
	}
	
	$("#start_day").addOption(days, false);
	$("#start_month").addOption(months, false);
	$("#start_year").addOption(years, false);
	
	$("#start_day").selectOptions(String(today.getDay()));
	$("#start_month").selectOptions(String(today.getMonth()+1));
	$("#start_year").selectOptions(String(today.getUTCFullYear()));
	
	calculate_cost();
});

function calculate_cost() {
	var cost_per_day = 0;
	var cost_per_week = 0;
	var cost_per_month = 0;
	var cost_per_year = 0;
	var cost_for_years = 0;
	var cost_to_date = 0;
	
	var per_pack = parseFloat($('#pay_for_pack').val());
	var cigs_per_day = parseFloat($('#cigs_per_day').val());
	var smoking_years = parseFloat($('#smoking_years').val());
	var start_date = new Date($('#start_month').val() + "/" + $('#start_day').val() + "/" + $('#start_year').val());
	
	var valid = true;
	
	if(isNaN(per_pack)) {
		valid = false;
		show_invalid('#pay_for_pack');
	} else {
		show_valid('#pay_for_pack');
	}
	
	if(isNaN(cigs_per_day)) {
		valid = false;
		show_invalid('#cigs_per_day');
	} else {
		show_valid('#cigs_per_day');
	}
	if(isNaN(smoking_years)) {
		valid = false;
		show_invalid('#smoking_years');
	} else {
		show_valid('#smoking_years');
	}//(1250135732696 - 1249272000000)-86132696 777600000
	
	if(valid) {
		var today = new Date();
		var days_passed = (today.getTime() - start_date.getTime());
		var ms_per_day=1000 * 60 * 60 * 24;
		days_passed = (days_passed + (ms_per_day - (days_passed%ms_per_day)))/ms_per_day;
		if(days_passed < 0)
			days_passed = 0;
		var cost_per_cig = per_pack / 20;
		cost_per_day = cost_per_cig * cigs_per_day;
		cost_per_week = cost_per_day * 7;
		cost_per_month = cost_per_day * 31;
		cost_per_year = cost_per_day * 365;
		cost_to_date = days_passed * cost_per_day;
		var additional_cost = (cost_per_year * smoking_years);
		var future_cost = cost_to_date + additional_cost;
		var amount_saved = additional_cost;
	
		change_value('#cost_per_day',cost_per_day);
		change_value('#cost_per_week',cost_per_week);
		change_value('#cost_per_month',cost_per_month);
		change_value('#cost_per_year',cost_per_year);
		change_value('#cost_to_date',cost_to_date);
		change_value('#additional_cost',additional_cost);
		change_value('#future_cost',future_cost);
		change_value('#amount_saved',amount_saved);
	}
}

function format_dollar(amt) {
	var dollars = parseInt(amt).toString();
	var dollaramt = "";
	var i;
	for(i = dollars.length; i > 0; i -= 3) {
		if(dollaramt.length > 0)
			dollaramt = "," + dollaramt;
		if(i < 3)
			dollaramt = dollars.substr(0,i) + dollaramt;
		else
			dollaramt = dollars.substr(i-3,3) + dollaramt;
	}
	
	var cents = Math.abs(parseInt((amt % 1) * 100));
	if(cents < 10) {
		return dollaramt + ".0" + cents;
	} else {
		return dollaramt + "." + cents;0
	}
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function change_value(id,val) {
	val=trim(String(val));
	if(format_dollar($(id).attr('next_val')) != format_dollar(val)) {
		$(id).attr('next_val', val);
		$(id).slideUp("fast", function() {
			var val = $(this).attr('next_val');
			$(this).text("$" + format_dollar(val));
			$(this).slideDown("fast");
		});
	}
}

function show_invalid(id) {
	if($(id).attr('is_invalid') != '1') {
		$(id).attr('is_invalid','1');
		$(id).animate({opacity: 0.5},{queue: false, duration: 200});
	}
}

function show_valid(id) {
	if($(id).attr('is_invalid') == '1') {
		$(id).attr('is_invalid','');
		$(id).animate({opacity: 1},{queue: false, duration: 200});
	}
}

$.fn.addOption = function()
{
	var add = function(el, v, t, sO)
	{
		var option = document.createElement("option");
		option.value = v, option.text = t;
		// get options
		var o = el.options;
		// get number of options
		var oL = o.length;
		if(!el.cache)
		{
			el.cache = {};
			// loop through existing options, adding to cache
			for(var i = 0; i < oL; i++)
			{
				el.cache[o[i].value] = i;
			}
		}
		// add to cache if it isn't already
		if(typeof el.cache[v] == "undefined") el.cache[v] = oL;
		el.options[el.cache[v]] = option;
		if(sO)
		{
			option.selected = true;
		}
	};
	
	var a = arguments;
	if(a.length == 0) return this;
	// select option when added? default is true
	var sO = true;
	// multiple items
	var m = false;
	// other variables
	var items, v, t;
	if(typeof(a[0]) == "object")
	{
		m = true;
		items = a[0];
	}
	if(a.length >= 2)
	{
		if(typeof(a[1]) == "boolean") sO = a[1];
		else if(typeof(a[2]) == "boolean") sO = a[2];
		if(!m)
		{
			v = a[0];
			t = a[1];
		}
	}
	this.each(
		function()
		{
			if(this.nodeName.toLowerCase() != "select") return;
			if(m)
			{
				for(var item in items)
				{
					add(this, item, items[item], sO);
				}
			}
			else
			{
				add(this, v, t, sO);
			}
		}
	);
	return this;
};

$.fn.selectedValues = function()
{
	var v = [];
	this.selectedOptions().each(
		function()
		{
			v[v.length] = this.value;
		}
	);
	return v;
};
$.fn.selectedOptions = function()
{
	return this.find("option:selected");
};

$.fn.selectOptions = function(value, clear)
{
	
	var v = value;
	var vT = typeof(value);
	// handle arrays
	if(vT == "object" && v.constructor == Array)
	{
		var $this = this;
		$.each(v, function()
			{
      				$this.selectOptions(this, clear);
    			}
		);
	};
	var c = clear || false;
	// has to be a string or regular expression (object in IE, function in Firefox)
	if(vT != "string" && vT != "function" && vT != "object") return this;
	
	this.each(
		function()
		{
			if(this.nodeName.toLowerCase() != "select") return this;
			// get options
			var o = this.options;
			// get number of options
			var oL = o.length;
			for(var i = 0; i<oL; i++)
			{
				if(v.constructor == RegExp)
				{
					if(o[i].value.match(v))
					{
						o[i].selected = true;
					}
					else if(c)
					{
						o[i].selected = false;
					}
				}
				else
				{
					if(o[i].value == v)
					{
						o[i].selected = true;
					}
					else if(c)
					{
						o[i].selected = false;
					}
				}
			}
		}
	);
	return this;
};


