Element.addMethods(['select'], {
	addOption: function(element, value, name) {
		var option = document.createElement('option');
		option.text = name;
		if(value != "undfined")
			option.value = value;

		try{
			$(element).add(option, null);
		}
		catch(ex) {
			$(element).add(option);
		}
	},
	addOptions: function(element, options) {
		var count = 0;
		for(var i in options) {
			count++;
			$(element).addOption(i, options[i]);
		}
		return count;
	},
	selectIndex: function(element, value) {
		if(value == null || value == "")
			return;

		for(var i=0; i<$(element).length; i++)
		{
			if($(element).options[i].value == value) {
				$(element).selectedIndex = i;
				return;
			}
		}
	}
});

document.observe('dom:loaded', function(e){
	['fname', 'lname', 'address', 'zipcode', 'ph1', 'ph2', 'ph3', 'email'].each(function(el){
		$(el).observe('blur', function(e){
			e.target.addClassName('blurred');
		});
	});
	['ph1', 'ph2', 'ph3'].each(function(el){
		$(el).observe('blur', function(e){
			e.target.addClassName('blurred');
			if(!e.target.hasClassName('valid')) {
				addError(e.target);
			}
		});
	});

	['fname', 'lname', 'address'].each(function(el){
		$(el).observe('keyup', function(e){
			e.target.fire('form:simple', {element: e.target});
		});
		$(el).observe('blur', function(e){
			e.target.fire('form:simple', {element: e.target});
		});
	});

	$('ph1').observe('keyup', function(e){
		e.target.fire('form:phone', {nextElement: 'ph2', keyCode: e.keyCode});
	});
	$('ph2').observe('keyup', function(e){
		e.target.fire('form:phone', {nextElement: 'ph3', keyCode: e.keyCode});
	});
	$('ph3').observe('keyup', function(e){
		e.target.fire('form:phone', {nextElement: 'email', keyCode: e.keyCode});
	});

	$('email').observe('keyup', function(e){
		e.target.fire('form:email');
	});
	$('email').observe('blur', function(e){
		e.target.fire('form:email');
	});
	$('zipcode').observe('keyup', function(e){
		e.target.fire('form:zipcode');
	});
	$('zipcode').observe('blur', function(e){
		e.target.fire('form:zipcode');
		e.target.fire('form:programlookup');
	});

	$('course').observe('change', function(e){
		if($F(e.target) != '') {
			addValid('course');
		} else {
			e.target.removeClassName('valid');
		}
	});

	$('contact_form').observe('submit', function(e){
		e.stop();
		$$('#fname, #lname, #address, #zipcode, #ph1, #ph2, #ph3, #email').invoke('addClassName', 'blurred');
		$('ph1').fire('form:phone');
		$('ph2').fire('form:phone');
		$('ph3').fire('form:phone');
		['fname', 'lname', 'address'].each(function(el){
			$(el).fire('form:simple', {element: el});
		});
		$('email').fire('form:email');
		$('zipcode').fire('form:zipcode');
		if($('zipcode').hasClassName('valid') && !$('zipcode').hasClassName('lookupsuccess')) {
			$('zipcode').fire('form:programlookup');
		}
		if($F('course') == '') {
			addError('course');
		}
		if($('contact_form').select('.error').length > 0) {
			var el = $('contact_form').select('input.error');
			if(el.length > 0) {
				el[0].activate();
				return;
			}
			var el = $('contact_form').select('select.error');
			if(el.length > 0) {
				el[0].activate();
				return;
			}
		}
		e.target.submit();
	});
});
document.observe('form:simple', function(e){
	$(e.memo.element).value = ucwords($F(e.memo.element));
	valid = $F(e.memo.element).length > 0;
	if($(e.memo.element).hasClassName('blurred')) {
		if(valid) {
			addValid(e.memo.element);
		} else {
			addError(e.memo.element);
		}
	}
});
document.observe('form:phone', function(e){
	e.target.value = $F(e.target).replace(/[^\d]/, '');
	var valid = $F(e.target).length == e.target.readAttribute('maxlength');
	if($(e.target).hasClassName('blurred')) {
		if(!valid) {
			addError(e.target);
		}
	}
	if(valid) {
		if(e.memo.nextElement) {
			if(e.memo.keyCode && (e.memo.keyCode == Event.KEY_TAB || e.memo.keyCode == 16)) {
	            return;
	        }
			$(e.memo.nextElement).activate();
		}
		addValid(e.target)
	}
});
document.observe('form:email', function(e){
	var valid = $F('email').match(/^[a-z0-9]([a-z0-9_\.\+-]+)?\@([a-z0-9-]+)\.([a-z0-9\.-]+)$/i);
	if($('email').hasClassName('blurred')) {
		if(valid) {
			addValid('email');
		} else {
			addError('email');
		}
	}
});
document.observe('form:zipcode', function(e){
	$('zipcode').value = $F('zipcode').toUpperCase();
	var valid = $F('zipcode').match(/^(\d{3,5}(\-\d{4})?|[A-Z]\d[A-Z](\s*\d[A-Z]\d)?)$/i);
	if($('zipcode').hasClassName('blurred')) {
		if(valid) {
			addValid('zipcode');
		} else {
			addError('zipcode');
		}
	}
});
document.observe('form:programlookup', function(e){
	if(e.target.hasClassName('error')) {
		return;
	}
	$('zipcode').addClassName('loading');
	new Ajax.Request('/contact/ziplookup?zipcode=' + $F(e.target), {onComplete: function(req, json){
		$('zipcode').addClassName('lookupsuccess');
		if(json.location.city != '') {
			$('city').value = json.location.city;
			addValid('city');
		}
		if(json.location.state != '') {
			$('state').selectIndex(json.location.state);
			addValid('state');
		}
		if(json.location.country != '') {
			$('country').value = json.location.country;
		}
		$('location').show();
		$('course').length = 0;
		// Need to check to see if the returned results are empty...

		if(json.programs['__NA']) {
			$('course').addOption('', 'No Programs Available');
			$('zipcode').removeClassName('loading');
			alert('Sorry, There are no programs offered in your area at this time.');
			return;
		}
		$('course').addOption('', '-- Choose a Program --');
		for(var i in json.programs) {
			$('course').addOption(i, json.programs[i]);
		}
		if(e.memo.selectedProgram) {
			$('course').selectIndex(e.memo.selectedProgram);
		}
		$('zipcode').removeClassName('loading');
	}});
});
function addError(el) {
	$(el).addClassName('error');
	$(el).removeClassName('valid');
}
function addValid(el) {
	$(el).addClassName('valid');
	$(el).removeClassName('error');
}
function clearErrorValid(el) {
	$(el).removeClassName('valid');
	$(el).removeClassName('error');
}
function ucwords(str) {
	var words = str.split(' ');
	for(var i=0; i<words.length; i++) {
		words[i] = words[i].substr(0,1).toUpperCase() + words[i].substr(1);
	}
	return words.join(' ');
}
