var Calc, Validate;
window.addEvent('domready', function()
{
	Calc = {
		laborbillrate: 49.95,
		laborcost: 15.00,
		minimum: 69.95,
		setup: function(){
			$('quoterequestform').addEvent('submit', function(e){
				Validate.check(this);
			});
			var serviceparams = $$('table#services tbody tr td select');
			serviceparams.each(function(param, i){
				param.addEvent('change', function(){
					Calc.parse();
				});
			});
			$('stories').addEvent('change', function(){
				Calc.parse();
			});
			$('squarefootage').addEvent('blur', function(){
				var val = this.getProperty('value').trim();
				if (val == 0 || val == '') this.setProperty('value', 0);
				Calc.parse();
			});
		},
		parse: function(){
			var stories = $('stories').get('value');
			var sf = parseFloat($('squarefootage').get('value'));
			var selected = $$('table#services tbody tr.selected');
			var runningtotal = 0;
			selected.each(function(el, i){
				var id = el.getProperty('id');
				var units = (el.getElements('select.units').get('value')) ? el.getElements('select.units').get('value') : 1;
				var freq = (el.getElements('select.freq').get('value')) ? el.getElements('select.freq').get('value') : 1;

				var total = Calc.calculate(id, units, freq, sf, stories);
				runningtotal += total;
			});
			Calc.update(runningtotal);
		},
		calculate: function(id, units, freq, sf, stories){
			switch (id) {
				case 'cleanroof':
				case 'cleangutters':
					var billrate = .015;
					return  sf * billrate * freq * stories;
				break;
				case 'frenchdrain':
				case 'exteriorbulbs':
				case 'exteriorlight':
				case 'interiorbulbs':
				case 'waspnests':
					var billrate = .015;
					return  sf * billrate * freq;
				break;
				case 'patiofurn':
					var billrate = 7.50;
					return  units * billrate * freq;
				break;
				case 'powerwash':
					var billrate = .06;
					return  sf * billrate * freq;
				break;
				case 'exteriorpipes':
//				case 'waspnests':
				case 'airfilters':
				case 'smokedetectors':
					var billrate = .005;
					return  sf * billrate * freq;
				break;
				case 'cleanwindows':
					var billrate = 7.50;
					return  units * billrate * freq;
				break;
			}
		},
		update: function(amnt){
			var markup = Calc.laborbillrate/Calc.laborcost;
			var yearly = amnt + (amnt/markup);
			var monthly = yearly/12;
			monthly = (monthly <= Calc.minimum) ? Calc.minimum : monthly;
			$('monthly').innerHTML = '$' + monthly.toFixed(2) + '<span>/MONTH</span>';
			$('totalestimatedcost').set('value', monthly.toFixed(2));
			if (amnt > 0) {
				$('totals').highlight('#f5f5a0');
			}
		}
	};
	Calc.setup();

	Validate = {
		check: function(form){
			var errors = 0;

			var selected = $$('table#services tbody tr.selected');
			if (selected.length == 0) {
				$('allservices').addClass('error');
				errors++;
			}
			else $('allservices').removeClass('error');

			var lis = $$('ul.form li');
			lis.each(function(li) {
				var inputs = li.getElements('input, select');
				inputs.each(function(input) {
					var flagged = false;
					var parent = input.getParent('li');
					// Is field empty?
					if (input.getProperty('value').trim() == '' || input.getProperty('value').trim() == 0) {
						parent.addClass('error');
						flagged = true;
						errors++;
					}
					else if (!flagged) parent.removeClass('error');

					// Email validation
					if (input.hasClass('emailaddress') && !flagged) {
						var email = input.getProperty('value');
						if (!/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(email)) {
							parent.addClass('error');
							flagged = true;
							errors++;
						}
						else if (!flagged) parent.removeClass('error');
					}
				});
			});
			// Are there any errors?
			if (errors > 0) {
				var e = new Event(e).stop();
				return false;
			} else {
				return true;
			}
		}
	}

	var checks = $$('table#services tbody tr td.checkbox');
	checks.each(function(check, i){
		check.addEvent('click', function(){
			var tr = check.getParent();
			var input = check.getFirst();
			tr.toggleClass('selected');
			if (tr.hasClass('selected'))
				input.setProperty('checked', 'true');
			else input.removeProperty('checked');
			var inputs = tr.getElements('select');
			if (tr.hasClass('selected')) {
				inputs.each(function(input){
					input.removeProperty('disabled');
				});
			}
			else {
				inputs.each(function(input){
					input.setProperty('disabled', 'disabled');
				});
			}
			Calc.parse();
		});
	});
});
