var ValidationHelper = Class.create({
	initialize: function() {
		this.error_messages = "<ul>";
		this.valid = true;
	},
	
	validate_textbox: function(id, message) {
		var text_box = $(id);
		if(text_box.value.blank()) {
			this.setToFalse(text_box.id, message);
		}
	},
	
	validate_date: function(id, message) {
		var text_box = $(id);
		if(text_box.value != "" && !this.isValidDate(text_box.value)) {
			this.setToFalse(text_box.id, message);
		}
	},
	
	validate_number: function(id, message) {
		var text_box = $(id);
		if(isNaN(text_box.value)) {
			this.setToFalse(text_box.id, message);
		}
	},
	
	validate_phone: function(id, message) {
		var text_box = $(id);
		if(text_box.value == "") { return; }
		
		var stripped = text_box.value.replace(/[\(\)\.\-\ ]/g, '');
		if (isNaN(parseInt(stripped)) || !(stripped.length == 10)) {
		   this.setToFalse(text_box.id, message);
		}
	},
	
	validate_email: function(id, message) {
		var text_box = $(id);
		if(text_box.value == "") { return; }
		
		var emailFilter=/^.+@.+\..+$/;
		var illegalChars= /[\(\)\<\>\,\;\:\\\/\"\[\]]/;
		if (!(emailFilter.test(text_box.value)) || text_box.value.match(illegalChars)) { 
		  this.setToFalse(text_box.id, message);
		}
	},
	
	validate_currency: function(id, message) {
		var text_box = $(id);
		if(text_box.value == "") { return; }
		
		var currencyRegex=/^\$?\d*(\.\d\d)?$/;
		if (!(currencyRegex.test(text_box.value))) { 
		  this.setToFalse(text_box.id, message);
		}
	},
	
	validate_dropdown: function(id, fail_value, message) {
		var dropdown = $(id);
		if(dropdown.value == fail_value) {
			this.setToFalse(dropdown.id, message);
		}
	},
	
	validate_checkbox: function(id, message) {
		var checkbox = $(id);
		if(checkbox.checked == false) {
			this.setToFalse(checkbox.id, message);
		}
	},
	
	set_conditional_questions: function(trigger_id, target_value, hidden_div) {
		Event.observe(window, 'load', function(){
			Event.observe($(trigger_id), 'change', function() {
				if($(trigger_id).value.toLowerCase() == target_value.toLowerCase() || 
				   $(trigger_id)[$(trigger_id).selectedIndex].text.toLowerCase() == target_value.toLowerCase()) {
					$(hidden_div).show();
				} else {
					$(hidden_div).hide();
				}
			});
	  });
	},
	
	show_errors: function(id) {
		error_html = this.error_messages + "</ul>";
		error_box = $(id);
		error_box.update(error_html);
		error_box.appear();
	},
	
	is_valid: function() {
		return this.valid;
	},
	
	/* 
	* Private helper functions
	*/
	setToFalse: function(id, message) {
		this.valid = false;
		if(message == null || message.blank()) {
			this.error_messages = this.error_messages + id + " is an invalid date";
		} else {
			this.error_messages = this.error_messages + "<li>" + message + "</li>";
		}
	},
	
	isValidDate: function(dateStr, format) {
     if(format == null) { 
		   format = "MDY"; 
		 }
	
	   format = format.toUpperCase();

	   if(format.length != 3) { 
		   format = "MDY"; 
		 }
	   if((format.indexOf("M") == -1) || (format.indexOf("D") == -1) || 
	      (format.indexOf("Y") == -1) ) { 
		   format = "MDY"; 
		 }
	
	   if(format.substring(0, 1) == "Y") { 
		   // If the year is first
	     var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	     var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	   } else if(format.substring(1, 2) == "Y") { 
		   // If the year is second
	     var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
	     var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
	   } else { 
		   // The year must be third
	     var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
	     var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	   }

	   // If it doesn't conform to the right format (with either a 2 digit year or 
		 // 4 digit year), fail
	   if((reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { 
		   return false; 
		 }
	
		 // Split into 3 parts based on what the divider was
	   var parts = dateStr.split(RegExp.$1); 

	   // Check to see if the 3 parts end up making a valid date
	   if(format.substring(0, 1) == "M") { 
		   var mm = parts[0]; 
		 } 
	   else if(format.substring(1, 2) == "M") { 
		   var mm = parts[1]; 
		 } 
	   else { 
		   var mm = parts[2]; 
		 }

	   if(format.substring(0, 1) == "D") { 
		   var dd = parts[0]; 
		 } 
	   else if(format.substring(1, 2) == "D") { 
		   var dd = parts[1]; 
		 } 
	   else { 
		   var dd = parts[2]; 
		 }

	   if(format.substring(0, 1) == "Y") { 
		   var yy = parts[0]; 
		 } 
	   else if(format.substring(1, 2) == "Y") { 
		   var yy = parts[1]; 
		 } 
	   else { 
		   var yy = parts[2]; 
		 }

	   if(parseFloat(yy) <= 50) { 
		   yy = (parseFloat(yy) + 2000).toString(); 
		 }
   
	   if(parseFloat(yy) <= 99) { 
		   yy = (parseFloat(yy) + 1900).toString(); 
		 }
	
	   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
	   if(parseFloat(dd) != dt.getDate()) { 
		   return false; 
		 }
	
	   if(parseFloat(mm)-1 != dt.getMonth()) { 
		   return false; 
		 }
	
	   return true;
	}
});
