var OCValidator = Class.create({
	initialize: function(form, formButton, validateClass, requiredClass, optionalClass) {
		this.form = $(form);
		this.formButton = $(formButton);
		
		this.val = validateClass
		this.req = requiredClass;
		this.opt = optionalClass;
		
		this.requiredFields = this.form.select('.'+this.val);
		this.optionalFields = this.form.select('.'+this.opt);
		
		if ($('error-messages')) {
		    $('error-messages').hide();
		}
		
		this.formButton.observe('click', function(e){
			
			if ($('error-messages')) {
			    $('error-messages').innerHTML = '';
			}				
			
			$$('.has-error').each(function(x){
				x.removeClassName('has-error');							   
			});
			
			this.requiredFields.each(function(x) {
				if (!this.validate(x)){
					Event.stop(e);
					this.writeError(x);
					if (!$('error-messages').visible()) {
					    new Effect.Appear('error-messages');
					}				
				}						  
			}.bind(this));
			
			this.optionalFields.each(function(x){
				if ($F(x) != '') {
					console.log($F(x))
					if (!this.validate(x)){
						Event.stop(e);
						this.writeError(x);
						if (!$('error-messages').visible()) {
						    new Effect.Appear('error-messages');
						}
					}
				}
			}.bind(this));
			
			this.form.select('.at-least-one').each(function(x){
				
				if (x.hasClassName('radio-buttons')) {
					
					radioGroup = x.select('input[type="radio"]');
					checked = false;
					
					for (var i = 0; i < radioGroup.length; ++i) {
						rb = radioGroup[i];
						
						if (rb.checked)
							checked = true;
						
					}
					if (!checked) {
						
						Event.stop(e);
						
						$('error-messages').innerHTML += '<li><span>Error: </span>  You must select whether you '+x.title+'</li>';
						
						if (!$('error-messages').visible())
							new Effect.Appear('error-messages');
						$('error-messages').scrollTo();
						x.addClassName('has-error');
					}
					
				}
				
				if (x.hasClassName('checkbox-group')) {
					
					checkboxGroup = x.select('input[type="checkbox"]');
					
					checked = false;
					numChecked = 0;
					
					for (var i = 0; i < checkboxGroup.length; ++i) {
						cb = checkboxGroup[i];
						
						if (cb.checked) {
							checked = true;
							numChecked++;
						}
					}

					if (numChecked > 3) {						
						Event.stop(e);
						
						$('error-messages').innerHTML += '<li><span>Error: </span>  You may only select up to 3 organizations</li>';
						
						if (!$('error-messages').visible()) {
						    new Effect.Appear('error-messages');
						}
						
						$('error-messages').scrollTo();
					}
					
					if (!checked) {
						Event.stop(e);

						$('error-messages').innerHTML += '<li><span>Error: </span>  You must select which organizations you belong to, or "None"</li>';
						
						if (!$('error-messages').visible()) {
						    new Effect.Appear('error-messages');
						}
						$('error-messages').scrollTo();
					}
					
					if (otherCB = x.select('input#chkOther')[0]) {
						if (otherCB.checked && $F(otherCB.next('#txtOther'))==''   ) {
							
							
							Event.stop(e);
							$('error-messages').innerHTML += '<li><span>Error: </span>  You must specify an organization if you select "Other".</li>';
							
							if (!$('error-messages').visible()) {
							    new Effect.Appear('error-messages');
							}
							$('error-messages').scrollTo();
							otherCB.next('#txtOther').addClassName('has-error');							
						}
					}	
				}
				
				if (x.hasClassName('tell-a-friend')) {
					
					var noneSelected = true;
					x.select('input.email').each(function(x) {
						if ($F(x)!='') {
						    noneSelected = false;   
						}
						
					});
					if(noneSelected) {
					
						Event.stop(e);
						
						$('error-messages').innerHTML += '<li><span>Error: </span>  You must enter at least one friend\'s email address.</li>';
						
						if (!$('error-messages').visible())
							new Effect.Appear('error-messages');
						$('error-messages').scrollTo();
						x.addClassName('has-error');
					
					}
				}
				
			});
			
		}.bind(this));
		
		

	},
	
	validate: function(x) {

		
		if (x.nodeName == 'SPAN') {
			
			wrappedFields = x.select('input', 'select', 'textarea');
			
			for (var i = 0; i < wrappedFields.length; ++i) {
				field = wrappedFields[i];
				
				if (!this.validate(field))
					return false
				
			}

			return true;
			
		}
		else {
			
			if ($F(x) == '' && x.hasClassName(this.req)) {
				return false;
			}
									
			if (x.hasClassName('state') && !this.checkState(x)) {
					return false;
			}
			
			if (x.hasClassName('zip-code') && !this.checkZip(x)) {
					return false;
			}
			if (x.hasClassName('email') && !this.checkEmail(x)) {
				return false;
			}
			if (x.hasClassName('mm') && !this.checkMonth(x)) {
				return false;
			}
			if (x.hasClassName('dd') && !this.checkDay(x)) {
				return false;
			}
			if (x.hasClassName('yyyy') && !this.checkYear(x)) {
				return false;
			}
			if (x.hasClassName('phone') && !this.checkPhone(x)) {
				return false;
			}
			if (x.hasClassName('password-verify') && !this.checkPasswords(x)) {
				return false;
			}
			if (x.hasClassName('other-provider') && !this.checkOtherProvider(x)) {
				return false;	
			}

			
		}
	
		return true;
	},
	
	checkEmail: function(x) {

		var str = $F(x);

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){
		   return false;
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   return false;
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    return false;
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    return false;
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		    return false;
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    return false;
		 }
		
		 if (str.indexOf(" ")!=-1){
		    return false;
		 }

 		 return true;	

	},
	
	checkState: function(x) {
		if ($F(x) == 'Select Your State')
			return false;
		
		return true;		
	},
	
	checkZip: function(x) {
		if ($F(x).search(/\d{5}/)==-1)
			return false;
		
		return true;		
	},
	
	checkMonth: function(x) {
		
		if (   $F(x).search(/\d{2}|\d{1}/)==-1 ||  $F(x) < 1 || $F(x) > 12        )
			return false;
		
		return true;
	},
	
	checkDay: function(x) {
		if (  $F(x).search(/\d{2}|\d{1}/)==-1 || $F(x) < 1 || $F(x) > 31        )
			return false;
		
		return true;
	},
	checkYear: function(x) {
		if (  $F(x).search(/\d{4}/)==-1 ||   $F(x) < 1900 || $F(x) > new Date().getFullYear()        )
			return false;
		
		return true;
	},
	checkPhone: function(x) {
		if (  $F(x).search(/^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/)==-1   )
			return false;
		
		return true;
	},
	checkPasswords: function(x) {
		
			
		
		if (   x.value != this.form.select('input.password').reduce().value     )
			return false;
		
		return true;
	},
	
	checkOtherProvider: function(x) {
		
		if ( $F('ddlProvider') == 'Other' && $F(x) == '' ) {
			return false
		}
		return true;
	},
	
	writeError: function(x) {
		
		if (x.hasClassName('state')) {
			errorMessage = '<li><span>Error:</span>  Please select your state.</li>';
		}
		
		else {
		
			errorMessage = '<li><span>Error:</span>  Please enter a ';
			if (x.title)
				errorMessage += x.title;
			else	
				errorMessage += x.previous('label').innerHTML;
			errorMessage += '.</li>'
		}
		
		if ($('error-messages'))
			$('error-messages').innerHTML += errorMessage;
		
		x.addClassName('has-error');
		
		
		$('error-messages').scrollTo();
		
		
	}
	
});


