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;
			}
		}
	}
});
// Get the selected value for a radio input
function $Radio(name) {
	var radios = $$('input[type=radio][name=' + name + ']');
	if(radios.length > 0) {
		for(var i=0; i<radios.length; i++) {
			if($(radios[i]).checked) {
				return $(radios[i]).value;
			}
		}
	}
	return null;
}
var oldZipcode;
document.observe('dom:loaded', function(e){
	$('fname').activate();
	// Watch for zipcode changes
	$('zipcode').observe('blur', function(e){
		$(e.target).fire('form:getcourses', {zipCodeChange: true});
	});
	// Watch for someone changing the choice from online to ground
	$$('input[type=radio][name=program_type]').each(function(el){
		el.observe('change', function(e){
			$(e.target).fire('form:getcourses');
		});
	});
	// Watch for course changing
	$('course').observe('change', function(e){
		$(e.target).fire('form:getcampuses');
	});
	// Start a search when the page loads
	if($F('zipcode') != '') {
		document.fire('form:getcourses', {firstLoad: true});
	}
	// Watch for phone number errors
	$$('.phone').each(function(el){
		el.observe('keyup', function(e){
			$(e.target).fire('form:phonechange');
		});
		el.observe('blur', function(e){
			$(e.target).fire('form:phonechange');
		});
	});
	$('form_submit').observe('click', function(e){
		e.stop();
		$(e.target).fire('form:checkerrors');
	});
	var errorFields = ['fname','lname','email','zipcode','address','city'];
	for(var i=0; i<errorFields.length; i++) {
		$(errorFields[i]).observe('keyup', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: $(e.target).id});
		});
		$(errorFields[i]).observe('blur', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: $(e.target).id});
		});
	}
	var errorDrops = ['course','campus','state','country'];
	for(var i=0; i<errorDrops.length; i++) {
		$(errorDrops[i]).observe('change', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: $(e.target).id});
		});
		$(errorDrops[i]).observe('blur', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: $(e.target).id});
		});
	}
	if($('form-adkey')) {
		$('form-adkey').observe('change', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: 'form-adkey'});
		});
		$('form-adkey').observe('blur', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: 'form-adkey'});
		});
		$('form-graddate').observe('keyup', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: 'form-adkey'});
		});
		$('form-graddate').observe('blur', function(e){
			$(e.target).fire('form:checkerrors', {singleRule: 'form-adkey'});
		});
	}
	/*$$('input[type=radio][name=phone1_type]').each(function(el){
		el.observe('change', function(e){
			if($('cell').checked) {
				//$('privacy').slideDown({duration: 0.3});
			} else {
				if($('privacy').visible())
					//$('privacy').slideUp({duration: 0.3});
			}
		});
		if($('cell').checked) {
			if(!$('privacy').visible())
				$('privacy').slideDown({duration: 0.3});
		} else {
			if($('privacy').visible())
				$('privacy').slideUp({duration: 0.3});
		}
	});*/

	$('campus-question').observe('click', function(e){
		e.stop();
		$(e.target).fire('form:tooltip', {id: 'campus-tooltip'});
	});
	$('online-question').observe('click', function(e){
		e.stop();
		$(e.target).fire('form:tooltip', {id: 'online-tooltip'});
	});
	$('campus-tooltip').observe('click', function(e){e.stop()});
	$('online-tooltip').observe('click', function(e){e.stop()});
	$('campus-tooltip-close').observe('click', function(e){
		$(e.target).up().up().hide();
	});
	$('online-tooltip-close').observe('click', function(e){
		$(e.target).up().up().hide();
	});
	document.observe('click', function(e){
		$(e.target).fire('form:closetooltips');
	});
});
document.observe('form:tooltip', function(e){
	$(e.target).fire('form:closetooltips');
	var position = $(e.target).positionedOffset();
	var options = {
		top: (position[1] + (-1 * ($(e.memo.id).getHeight() - $(e.target).getHeight() / 2))) + 'px',
		left: (position[0] + ($(e.target).getWidth() / 2)) + 'px'
	};
	//$(e.memo.id).clonePosition($(e.target), options);
	$(e.memo.id).setStyle(options);
	$(e.memo.id).show();
});
document.observe('form:closetooltips', function(e){
	$$('.tooltip').invoke('hide');
});
document.observe('form:getcourses', function(e){
	// Only really change it on change. But still check on blur instead
	if(!e.memo.firstLoad && e.memo.zipCodeChange && $F('zipcode') == oldZipcode) {
		return;
	}
	oldZipcode = $F('zipcode');
	if(e.memo.firstLoad != true) {
		$('course-loading').show();
	}
	new Ajax.Request('/contact/online_search?' + $Radio('program_type') + '=1&zipcode=' + $F('zipcode'), {
		onComplete: function(req, json) {
			// Set the location details
			if(json.location) {
				if(json.location.city) {
					$('city').value = json.location.city;
					$('city').fire('form:checkerrors', {singleRule: 'city'});
				}
				if(json.location.state) {
					$('state').selectIndex(json.location.state);
					$('state').fire('form:checkerrors', {singleRule: 'state'});
				}
				if(json.location.country) {
					$('country').selectIndex(json.location.country);
					$('country').fire('form:checkerrors', {singleRule: 'country'});
				}
			}
			// If we have ground campuses available, allow users to select them
			if(json.coursecount > 0) {
				$('program_type-ground').enable();
				$('online-message').hide();
			}
			// No ground campuses available. Restrict to just online courses
			if(json.coursecount == 0) {
				$('program_type-ground').disable();
				$('online-message').show();
				if($Radio('program_type') == 'ground') {
					$('program_type-online').checked = true;
					$('program_type-online').fire('form:getcourses', {firstLoad: e.memo.firstLoad});
					return;
				}
			}
			// Populate the courses
			$('course').options.length = 0;
			if(json.courses.length > 0) {
				for(var i=0; i<json.courses.length; i++) {
					$('course').addOption(json.courses[i].code, json.courses[i].course);
				}
				// If this is the first load, auto select their previous selection
				if(e.memo.firstLoad) {
					$('course').selectIndex($F('course-load'));
					// If we have a selection do a campus search for that course
					if($F('course-load') != '') {
						$('course').fire('form:getcampuses', {firstLoad: true});
					}
				}
			}

			// Populate the campuses
			$('campus').options.length = 0;
			if(json.campuses.length > 0) {
				for(var i=0; i<json.campuses.length; i++) {
					$('campus').addOption(json.campuses[i].code, json.campuses[i].campus);
				}
			}
			$('course-loading').hide();
		}
	});
});
document.observe('form:getcampuses', function(e){
	if(!e.memo.firstLoad) {
		$('campus-loading').show();
	}
	new Ajax.Request('/contact/online_search?' + $Radio('program_type') + '=1&zipcode=' + $F('zipcode') + '&course=' + $F('course'), {
		onComplete: function(req, json) {
			// Populate the campuses for that program
			$('campus').options.length = 0;
			if(json.campuses.length > 0) {
				for(var i=0; i<json.campuses.length; i++) {
					$('campus').addOption(json.campuses[i].code, json.campuses[i].campus);
				}
				// If we have only one campus, auto-select it
				if(json.campuses.length == 2) {
					$('campus').selectIndex(json.campuses[1].code);
				} else if(e.memo.firstLoad) { // otherwise try and select their previous selection
					$('campus').selectIndex($F('campus-load'));
				}
			}
			$('campus-loading').hide();
			$('campus').fire('form:checkerrors', {singleRule: 'campus'});
		}
	});
});

document.observe('form:phonechange', function(e){
	el = $(e.target);
	el.value = $F(el).replace(/[^\d]/, '');
	if($F(el).length == el.maxLength) {
		$(el).removeClassName('error');
		switch(el.id) {
			case 'phone1_area':
				$('phone1_prefix').activate();
			break;
			case 'phone1_prefix':
				$('phone1_suffix').activate();
			break;
			case 'phone1_suffix':
				$('email').activate();
			break;
		}
		if(!$('phone1_area').hasClassName('error') && !$('phone1_prefix').hasClassName('error') && !$('phone1_suffix').hasClassName('error')) {
			$('phone-error').removeClassName('error');
		}
	}
});

document.observe('form:checkerrors', function(e){
	var errors = {
		'fname':	/^.{2,150}$/,
		'lname':	/^.{2,150}$/,
		'city':		/^.{2,150}$/,
		'email':	/^[a-zA-Z0-9._%\+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/,
		'zipcode':	/^(\d{5}(\-\d{4})?|[a-zA-Z]\d[a-zA-Z](\s\d[a-zA-Z]\d)?)$/,
		'address':	/^.{2,300}$/,
		'course':	/^[^$]/,
		'campus':	/^[^$]/,
		'state':	/^[^0$]/,
		'country':	/^[^$]/
	};
	for(var field in errors) {
		if(e.memo.singleRule && e.memo.singleRule != field) {
			continue;
		}
		if($F(field).match(errors[field])) {
			$(field).removeClassName('error');
			$(field + '-error').removeClassName('error');
		} else if(!e.memo.singleRule) {
			$(field).addClassName('error');
			$(field + '-error').addClassName('error');
		}
	}
	if($('form-adkey')) {
		if((e.memo.singleRule && e.memo.singleRule == 'form-adkey') || !e.memo.singleRule) {
			if($F('form-adkey') == 'HSINTRNT') {
				$('graddate-field').show();

				if($F('form-graddate').match(/^(19|20)\d{2}$/)) {
					$('form-graddate').removeClassName('error');
					$('adkey-error').removeClassName('error');
					$('graddate-field').removeClassName('error');
				} else if(!e.memo.singleRule) {
					$('form-graddate').addClassName('error');
					$('adkey-error').addClassName('error');
					$('graddate-field').addClassName('error');
				}
			} else {
				$('form-graddate').removeClassName('error');
				$('adkey-error').removeClassName('error');
				$('graddate-field').removeClassName('error');
				$('graddate-field').hide();
			}
		}
	}
	if(e.memo.singleRule) {
		return;
	}
	var phones = {
		'phone1_area':		/^\d{3}$/,
		'phone1_prefix':	/^\d{3}$/,
		'phone1_suffix':	/^\d{4}$/
	}
	for(var field in phones) {
		if(!$F(field).match(phones[field])) {
			$(field).addClassName('error');
			$('phone-error').addClassName('error');
		}
	}
	var foundErrors = $$('input.error,select.error');
	if(foundErrors.length > 0) {
		s.pageName = document.title + ' - Form Error';
		s.prop6 = foundErrors.pluck('name').join('|');
		s.eVar6 = 'Form Error';
		s.tl();
		foundErrors[0].activate();
	} else {
		$('form_submit').disable();
		$('contact-form').submit();
	}
});