var GUI = Class.create({
	initialize: function(){
		try {
			this.pageTracker = _gat._getTracker("UA-10983415-1");
			this.pageTracker._trackPageview();
		} catch(err){}
		$$('form').invoke('observe', 'submit', this.submitForm.bindAsEventListener(this));
		if($('state')){
			$('state').observe('change', this.updateRestaurantList);
			$$('#contact-yes', '#contact-no').invoke('observe', 'click', this.toggleContact.bindAsEventListener(this));
			$$('#contact-via-email', '#contact-via-phone').invoke('observe', 'click', this.togglePhoneRequirement.bindAsEventListener(this));
		}
		if($('upload-button')){
			$$('#preference-no', '#preference-yes').invoke('observe', 'click', this.toggleFileUpload.bindAsEventListener(this));
		}
	},

	updateRestaurantList: function(){
		var selectedState = $F('state');
		new Ajax.Updater('restaurant-selection', '/php/filter_locations.php', { method:'post', parameters: { state: selectedState } });
	},

	toggleContact: function(someEvent){
		var someTarget = someEvent.findElement('input');
		if(someTarget.checked){
			switch(someTarget.id){
			case 'contact-yes':
				$('contact-me-via').show();
				break;
			case 'contact-no':
				$('contact-me-via').hide();
				break;
			}
		}
	},	
	
	togglePhoneRequirement: function(someEvent){
		var someTarget = someEvent.findElement('input');
		if(someTarget.checked){
			switch(someTarget.id){
			case 'contact-via-phone':
				$('phone-number-label').down('span').update("*");
				$('phone-contact').show();
				break;
			case 'contact-via-email':
				$('phone-number-label').down('span').update("");
				$('phone-contact').hide();
				break;
			}
		}
	},
	
	toggleFileUpload: function(someEvent){
		var someTarget = someEvent.findElement('input');
		if(someTarget.checked){
			switch(someTarget.id){
			case 'preference-yes':
				$('text_form').down('label').down('span').update("");
				$('text_form').hide();
				$('upload-button').down('label').down('span').update("*");
				$('upload-button').show();
				break;
			case 'preference-no':
				$('upload-button').down('label').down('span').update("");
				$('upload-button').hide();
				$('text_form').down('label').down('span').update("*");
				$('text_form').show();
				break;
			}
		}
	},
	
	submitForm: function(someEvent){
		someEvent.stop();
		var someForm = someEvent.findElement('form');
		if(this.validateForm(someForm)){
			if($('confirmemail')){
				if($F('email') != $F('confirmemail')){
					alert("Please make sure the email address and confirmation address match");
					$('email').focus();
					return false;
				}
			}
			someForm.insert({ top: new Element('input', { type: 'hidden', name: 'validated', value: 1 }) });
			someForm.submit();
		}
	},

	validateForm: function(someForm){
		var someElements = someForm.elements;
		var re_empty = /\w+/;
		var re_email = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
		var re_label = /([Ee])-?(mail|Mail|MAIL)/;
		var re_date_label = /[Dd]ate/;
		var re_date = /^\d{2}\/\d{2}\/\d{2}$/;
		var radioList = new Array();// DO I NEED THIS?
		var passwordList = new Array();// DO I NEED THIS?
		for(i=0; i < someElements.length; i++){
			switch(someElements[i].type){
			case "hidden":
				break;
			case "file":
			case "text":
				if(!someElements[i].disabled){
					var alertName = this.getLabel(someElements[i].id);
					if(alertName !== false){
						if(alertName.indexOf("*") > -1){
							if(re_label.test(alertName)){
								if(!re_email.test(someElements[i].value)){
									someElements[i].focus();
									alert("\"" + someElements[i].value + "\" is not a valid E-mail Address.");
									return false;
								}
							}else if(re_date_label.test(alertName)){
								if(!re_date.test(someElements[i].value)){
									someElements[i].focus();
									alert("Please enter a valid date in the format \"MM/DD/YY\".");
									return false;
								}
							}else{
								if(!re_empty.test(someElements[i].value)){
									someElements[i].focus();
									alert(alertName + " is a required field.");
									return false;
								}
							}
						}
					}
				}
				break;
			case "select-one":
				var alertName = this.getLabel(someElements[i].id);
				if(alertName){
					if(alertName.indexOf("*") > -1){
						if(someElements[i].selectedIndex == 0){
							someElements[i].focus();
							alert(alertName + " is a required field.");
							return false;
						}
					}
				}
				break;
			case "radio":
				var stringList = radioList.toString();
				if(stringList.indexOf(someElements[i].name) == -1){
					radioList.push(someElements[i].name);
				}
				break;
			case "textarea":
				var alertName = this.getLabel(someElements[i].id);
				if(alertName){
					if(alertName.indexOf("*") > -1){
						if(someElements[i].value == ""){
							someElements[i].focus();
							alert(alertName + " is a required field.");
							return false;
						}
					}
				}
				break;
			case "password":
				var alertName = this.getLabel(someElements[i].id);
				if(alertName.indexOf("*") > -1){
					if(!re_empty.test(someElements[i].value)){
						someElements[i].focus();
						alert(alertName + " is a required field.");
						return false;
					}
				}
				var stringList = passwordList.toString();
				if(stringList.indexOf(someElements[i].name) == -1){
					passwordList.push(someElements[i]);
				}
				break;
			case "checkbox":
				var alertName = this.getLabel(someElements[i].id);
				if(alertName.indexOf("*") > -1){
					if(!someElements[i].checked){
						someElements[i].focus();
						alert(alertName + " is a required field.");
						return false;
					}
				}
				break;
			}
		}
		if(passwordList.length == 2){
			if(passwordList[0].value != passwordList[1].value){
				alert("The passwords entered do not match.");
				passwordList[0].focus();
				return false;
			}
		}
		return true;
	},
	
	getLabel: function(someValue){
		var someSelector = 'label[for="' + someValue + '"]';
		var labelList = $$(someSelector);
		try{
			var someLabel = labelList.first();
			if(someLabel){
				return String(someLabel.innerHTML).stripTags().replace('&amp;', '&').replace('&nbsp;', '').strip();
			}else{
				return false;
			}
		}catch(e){
			return false;
		}
	}
});

var initGUI = function(){ myGUI = new GUI(); }
document.observe("dom:loaded", initGUI);
