(function(scope, name) {
	var $ = window[scope], c = function(wrapper, options) {
		if(this.__construct) {
			this.__construct(wrapper, options || []);
		}
	};

	c.prototype = (function() {
		var _this, p = c.prototype;

		/*
		* Object constructor sets up accessors for the
		* object passed in and the options passed in.
		*/
		p.__construct = function(wrapper, options) {
			this.wrapper = wrapper;
			this.options = options;
			_this = this;
		};
		
		/*
		* Public function validate is an automatic call that
		* assumes you're only calling the array of passed 
		* validators. This requires .validate(); in the object chain.
		*/
		p.validate = function() {
			/*
			* This is the return array of either error messages 
			* or empty which means the value passed inspection
			*/
			var returnMsgs = {};
			var cardType = {};
			if (this.options) {
				/* 
				* Loop through the set options and call the 
				* desired validators.
				*/
				for (var i = 0; i < this.options.length; i++) {
					switch(this.options[i]) {
				    	case 'empty':
				    		if (this.isValueEmpty(this.wrapper.val()) == true) { returnMsgs['empty'] = false};
							break;
						case 'email':
							if (this.isValidEmail(this.wrapper.val()) == false) { returnMsgs['email'] = false};
							break;
						case 'phone':
							if (this.isValidPhone(this.wrapper.val()) == false) { returnMsgs['number'] = false};
							break;
						case 'name':
							if (this.isValidName(this.wrapper.val()) == false) { returnMsgs['badName'] = false}
							break;
						case 'zip':
							if (this.isValidZip(this.wrapper.val()) == false) { returnMsgs['zip'] = false};
							break;
						case 'card':
							cardType['cctype'] = this.wrapper.val();
							break;
						case 'visa':
							var returnval = this.isValidCC(this.wrapper.val(), this.options[i]);
							switch (returnval) {
								case 'empty':
									returnMsgs['ccEmpty'] = false;
									break;
								case 'error1':
									returnMsgs['ccError1'] = false;
									break;
								case 'error2':
									returnMsgs['ccError2'] = false;
									break;
							}
							break;
						case 'mc':
							var returnval = this.isValidCC(this.wrapper.val(), this.options[i]);
							if (returnval == 'error1') {
								returnMsgs['ccError1'] = false;
							} else if (returnval == 'error2') {
								returnMsgs['ccError2'] = false;
							}
							break;
						case 'amex':
							var returnval = this.isValidCC(this.wrapper.val(), this.options[i]);
							if (returnval == 'error1') {
								returnMsgs['ccError1'] = false;
							} else if (returnval == 'error2') {
								returnMsgs['ccError2'] = false;
							}
							break;
						case 'discover':
							var returnval = this.isValidCC(this.wrapper.val(), this.options[i]);
							if (returnval == 'error1') {
								returnMsgs['ccError1'] = false;
							} else if (returnval == 'error2') {
								returnMsgs['ccError2'] = false;
							}
							break;
						case 'cvv3':
							var result = this.isValidCVV3(this.wrapper.val());
							switch (result) {
								case 'e1':
									returnMsgs['cvv3e1'] = false;
									break;
								case 'e2':
									returnMsgs['cvv3e2'] = false;
									break;
								default:
							}
							break;
						case 'cvv4':
							var result = this.isValidCVV4(this.wrapper.val());
							switch (result) {
								case 'e1':
									returnMsgs['cvv4e1'] = false;
									break;
								case 'e2':
									returnMsgs['cvv4e2'] = false;
									break;
								default:
							}
							break;
				    }
				}
				/*
				* If the hash has been built return it if not, return passed
				* On error, add error class to value wrapper and label
				*/
				var i, length = 0;
				var ccset = 0;
				for (i in returnMsgs) { length++; }
				for (i in cardType) { ccset++; }

				var passOrFail = (length == 0) ? 'passed' : returnMsgs;
				var ccType = (ccset == 0) ? 'noCCset' : cardType;
				
				if (passOrFail == 'passed' && ccType == 'noCCset' || passOrFail != 'passed' && ccType == 'noCCset') {
					return passOrFail;
				} else {
					return ccType;
				} 
			}
		};
		
		/*
		* Any other public method can be called if you
		* choose not to pass an array of tests into the
		* main call to validateReserveForm()
		*/
		p.isValueEmpty = function(param) { return !param; }
		
		p.isValidEmail = function(param) {
			var validEmail = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
			if (param.search(validEmail) == -1) { return false; } else { return true; }
		}
		
		p.isValidName = function(param) {
			if (isNaN(param) == true) {
				var regex = /\d/g;
				if (regex.test(param) == false) {
					return true;
				} else {
					return false;
				}
			} else {
				return false;
			}
		}
		
		p.isValidPhone = function(param) {
			var re10digit= /^\d{3}-\d{3}-\d{4}$/;	
			if (param.search(re10digit) == -1) { return false; } else { return true; }
		}
		
		p.isValidZip = function(param) {
			var validZip = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
			if (param.search(validZip) == -1) { return false; } else { return true; }
		}
		
		p.isValidCC = function(cardNum, card) {
			if (cardNum.length == 0) { return 'empty'; }
			if (isNaN(cardNum)) { return 'error1'; }
			switch (card) {
				case 'visa':
					var regex = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
					if (cardNum.search(regex) == -1) { return 'error2'; } else { return true; }
					break;
				case 'amex':
					var regex = /^3[4,7]\d{13}$/;
					if (cardNum.search(regex) == -1) { return 'error2'; } else { return true; }
					break;
				case 'mc':
					var regex = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
					if (cardNum.search(regex) == -1) { return 'error2'; } else { return true; }
					break;
				case 'discover':
					var regex = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
					if (cardNum.search(regex) == -1) { return 'error2'; } else { return true; }
					break;
				default:
					return true;
					break;
			}
		}
		
		p.isValidCVV3 = function(param) {
			if (!isNaN(param)) {
				if (param.length == 3) { return true; } else { return 'e1'; };
			} else {
				return 'e2';
			}
		};
		p.isValidCVV4 = function(param) {
			if (!isNaN(param)) {
				if (param.length == 4) { return true; } else { return 'e1'; }
			} else {
				return 'e2';
			}
		};
		
		return p;
	})();

	$.fn.extend(new function() {
		this[name] = function(options) {
			var instance = new c(this, options || []);
			return instance.validate();
		}
	})

})('jQuery', 'validateReserveForm');

$(document).ready(function() {
		/*
		* Main javascript for error checking the newsletter form
		*/

		$('#newsletter div.submit a.btn').click(function() {
			var form = '#newsletter ';
			var errorArray = [];
			var flag = 'notready';
			
			errorArray.push($(form+'div div.iefix #email').validateReserveForm(['empty']));
			
			if(errorArray[0] != 'passed') {
				$('div.iefix #email_label', form).addClass('error');
				$('div.iefix span', form).css('color', 'red').html(' <br />Whoops! You forgot your email address.');
				$('div.iefix #email', form).addClass('error');
				Cufon.replace('div #email_label', form);
			} else {
				$('div.iefix #email_label', form).removeClass('error');
				$('div.iefix #email', form).removeClass('error');
				$('div.iefix span', form).removeClass('error').html('');
				flag = 'ready';
			}
			
			if (flag == 'ready') {
				$('#newsletter').submit();
			}

			return false;
		});
		
		/*
		* Main javascript for error checking the contact form
		*/

		$('#contact_form div.submit a.btn').click(function() {
			var flag = 'notready';
			var errorArray = new Array();
			var form = '#contact_form ';
			
			/* First column  - First and last names, email, and phone */
			if ($(form+'div input#f_name').validateReserveForm(['empty', 'name']) != 'passed') {
				errorArray[0] = $(form+'div input#f_name').validateReserveForm(['empty', 'name']);
				$(form+'div#firstname label').addClass('error');
				$(form+'div#firstname input').addClass('error');
				Cufon.replace('div#firstname label');
			} else {
				errorArray[0] = 'passed';
				$(form+'div#firstname label').removeClass('error');
				$(form+'div input#f_name').removeClass('error');
				Cufon.replace('div#firstname label');
			}
			
			if ($(form+'div input#l_name').validateReserveForm(['empty', 'name']) != 'passed') {
				errorArray[1] = $(form+'div input#l_name').validateReserveForm(['empty', 'name']);
				$(form+'div#lastname label').addClass('error');
				$(form+'div input#l_name').addClass('error');
				Cufon.replace('div#lastname label');
			} else {
				errorArray[1] = 'passed'
				$(form+'div#lastname label').removeClass('error');
				$(form+'div input#l_name').removeClass('error');
				Cufon.replace('div#lastname label');
			}
			
			if ($(form+'div input#emailaddr').validateReserveForm(['empty', 'email']) != 'passed') {
				errorArray[2] = $(form+'div input#emailaddr').validateReserveForm(['empty', 'email']);
				$(form+'div#emailaddy label').addClass('error');
				$(form+'div input#emailaddr').addClass('error');
				Cufon.replace('div#emailaddy label');
			} else {
				errorArray[2] = 'passed';
				$(form+'div#emailaddy label').removeClass('error');
				$(form+'div input#emailaddr').removeClass('error');
				Cufon.replace('div#emailaddy label');
			}
			
			if ($(form+'div input#phone').validateReserveForm(['empty', 'phone']) != 'passed') {	
				errorArray[3] = $(form+'div input#phone').validateReserveForm(['empty', 'phone']);
				$(form+'div#phonenum label').addClass('error');
				$(form+'div input#phone').addClass('error');
				Cufon.replace('div#phonenum label');
			} else {
				errorArray[3] = 'passed';
				$(form+'div#phonenum label').removeClass('error');
				$(form+'div input#phone').removeClass('error');
				Cufon.replace('div#phonenum label');
			}
			
			//First column  - First and last names, email, and phone
			if ($('#contact_address input', form).validateReserveForm(['empty']) != 'passed') {
				errorArray[4] = $('#contact_address input', form).validateReserveForm(['empty']);
				$('#contact_address label', form).addClass('error');
				$('#contact_address input', form).addClass('error');
				Cufon.replace('#contact_address label');
			} else {
				errorArray[4] = 'passed';
				$('#contact_address label', form).removeClass('error');
				$('#contact_address input', form).removeClass('error');
				Cufon.replace('#contact_address label');
			}
			
			if ($('#contact_city input', form).validateReserveForm(['empty']) != 'passed') {
				errorArray[5] = $('#contact_city input', form).validateReserveForm(['empty']);
				$('#contact_city label', form).addClass('error');
				$('#contact_city input', form).addClass('error');
				Cufon.replace('#contact_city label');
			} else {
				errorArray[5] = 'passed';
				$('#contact_city label', form).removeClass('error');
				$('#contact_city input', form).removeClass('error');
				Cufon.replace('#contact_city label');
			}
			
			if ($(form+'div input#zip').validateReserveForm(['empty', 'zip']) != 'passed') {
				errorArray[6] = $(form+'div input#zip').validateReserveForm(['empty', 'zip']);
				$(form+'div#zipcode label').addClass('error');
				$(form+'div input#zip').addClass('error');
				Cufon.replace('div#zipcode label');
			} else {
				errorArray[6] = 'passed';
				$(form+'div#zipcode label').removeClass('error');
				$(form+'div input#zip').removeClass('error');
				Cufon.replace('div#zipcode label');
			}
			
			/*errorArray[3] = errorArray[4] = errorArray[5] = errorArray[6] = */
			errorArray[7] = errorArray[8] = errorArray[9] = 'passed';
			
			if ($('#contact_message textarea', form).validateReserveForm(['empty']) != 'passed') {
				errorArray[10] = $('#contact_message textarea', form).validateReserveForm(['empty']);
				$('#contact_message label', form).addClass('error');
				$('#contact_message textarea', form).addClass('error');
				Cufon.replace('#contact_message label');
			} else {
				errorArray[10] = 'passed';
				$('#contact_message label', form).removeClass('error');
				$('#contact_message textarea', form).removeClass('error');
				Cufon.replace('#contact_message label');
			}
			
			/* Build errors hash table, if necessary */
			var errors = buildErrorMessages(errorArray);
			var confirm = displayErrors(errors);
			if (typeof(confirm) == 'object') {
				$('form div#form_fields').css('padding-top', '5px');
				$('form div#textual_errors').css('display', 'block');
			} else {
				$('form div#form_fields').css('padding-top', '25px');
				$('form div#textual_errors').css('display', 'none');
				flag = 'ready';
			}
			
			if (flag == 'ready') {
				$('#contact_form').submit();
			}

			return false;
		});

		
		/*
		* Main javascript for error checking the submission of the
		* simple reservation form.
		*/
		
		$('#step_three form div#terms_box a.btn').click(function() {
			var flag = 'notready';
			var errorArray = new Array();
			var form = '#step_three form ';
			
			/* First column  - First and last names, email, and phone */
			if ($(form+'div input#IGS_FIRSTNAME').validateReserveForm(['empty']) != 'passed') {
				errorArray[0] = $(form+'div input#IGS_FIRSTNAME').validateReserveForm(['empty']);
				$(form+'div#IGS_FIRSTNAME-row label').addClass('error');
				$(form+'div input#IGS_FIRSTNAME').addClass('error');
				Cufon.replace('div#IGS_FIRSTNAME-row label');
			} else {
				errorArray[0] = 'passed';
				$(form+'div#IGS_FIRSTNAME-row label').removeClass('error');
				$(form+'div input#IGS_FIRSTNAME').removeClass('error');
				Cufon.replace('div#IGS_FIRSTNAME-row label');
			}
			
			if ($(form+'div input#IGS_LASTNAME').validateReserveForm(['empty']) != 'passed') {
				errorArray[1] = $(form+'div input#IGS_LASTNAME').validateReserveForm(['empty']);
				$(form+'div#IGS_LASTNAME-row label').addClass('error');
				$(form+'div input#IGS_LASTNAME').addClass('error');
				Cufon.replace('div#IGS_LASTNAME-row label');
			} else {
				errorArray[1] = 'passed'
				$(form+'div#IGS_LASTNAME-row label').removeClass('error');
				$(form+'div input#IGS_LASTNAME').removeClass('error');
				Cufon.replace('div#IGS_LASTNAME-row label');
			}
			
			if ($(form+'div input#IGS_EMAIL').validateReserveForm(['empty', 'email']) != 'passed') {
				errorArray[2] = $(form+'div input#IGS_EMAIL').validateReserveForm(['empty', 'email']);
				$(form+'div#IGS_EMAIL-row label').addClass('error');
				$(form+'div input#IGS_EMAIL').addClass('error');
				Cufon.replace('div#IGS_EMAIL-row label');
			} else {
				errorArray[2] = 'passed';
				$(form+'div#IGS_EMAIL-row label').removeClass('error');
				$(form+'div input#IGS_EMAIL').removeClass('error');
				Cufon.replace('div#IGS_EMAIL-row label');
			}
			
			if ($(form+'div input#IGS_PHONE').validateReserveForm(['empty', 'phone']) != 'passed') {	
				errorArray[3] = $(form+'div input#IGS_PHONE').validateReserveForm(['empty', 'phone']);
				$(form+'div#IGS_PHONE-row label').addClass('error');
				$(form+'div input#IGS_PHONE').addClass('error');
				Cufon.replace('div#IGS_PHONE-row label');
			} else {
				errorArray[3] = 'passed';
				$(form+'div#IGS_PHONE-row label').removeClass('error');
				$(form+'div input#IGS_PHONE').removeClass('error');
				Cufon.replace('div#IGS_PHONE-row label');
			}
			
			
			/* Column Two - Address, City, and Zip */
			if ($(form+'div input#IGS_ADDRESS').validateReserveForm(['empty']) != 'passed') {
				errorArray[4] = $(form+'div input#IGS_ADDRESS').validateReserveForm(['empty']);
				$(form+'div#IGS_ADDRESS-row label').addClass('error');
				$(form+'div input#IGS_ADDRESS').addClass('error');
				Cufon.replace('div#IGS_ADDRESS-row label');
			} else {
				errorArray[4] = 'passed';
				$(form+'div#IGS_ADDRESS-row label').removeClass('error');
				$(form+'div input#IGS_ADDRESS').removeClass('error');
				Cufon.replace('div#IGS_ADDRESS-row label');
			}
			
			if ($(form+'div input#IGS_CITY').validateReserveForm(['empty']) != 'passed') {
				errorArray[5] = $(form+'div input#IGS_CITY').validateReserveForm(['empty']);
				$(form+'div#IGS_CITY-row label').addClass('error');
				$(form+'div input#IGS_CITY').addClass('error');
				Cufon.replace('div#IGS_CITY-row label');
			} else {
				errorArray[5] = 'passed';
				$(form+'div#IGS_CITY-row label').removeClass('error');
				$(form+'div input#IGS_CITY').removeClass('error');
				Cufon.replace('div#IGS_CITY-row label');
			}
			
			if ($(form+'div input#IGS_ZIP').validateReserveForm(['empty', 'zip']) != 'passed') {
				errorArray[6] = $(form+'div input#IGS_ZIP').validateReserveForm(['empty', 'zip']);
				$(form+'div#IGS_ZIP-row label').addClass('error');
				$(form+'div input#IGS_ZIP').addClass('error');
				Cufon.replace('div#IGS_ZIP-row label');
			} else {
				errorArray[6] = 'passed';
				$(form+'div#IGS_ZIP-row label').removeClass('error');
				$(form+'div input#IGS_ZIP').removeClass('error');
				Cufon.replace('div#IGS_ZIP-row label');
			}
			
			/* Build errors hash table, if necessary */
			var errors = buildErrorMessages(errorArray);
			var confirm = displayErrors(errors);
			if (typeof(confirm) == 'object') {
				$('form div#form_fields').css('padding-top', '5px');
				$('form div#textual_errors').css('display', 'block');
			} else {
				$('form div#form_fields').css('padding-top', '25px');
				$('form div#textual_errors').css('display', 'none');
				flag = 'ready';
			}
			
			if (flag == 'ready') {
				$('#step_three form').submit();
			}

			return false;
		});
		
		
		
		/*
		* This is the main javascript for controlling the submission of the 
		* extensive reservation form. The a link is hijacked to run the submit
		* and to test the preceeding validation methods
		*/
		
		$('#step_three form div#submit_btn a').click(function() {
			var flag = 'notready';
			var errorArray = new Array();
			var form = '#step_three form ';
			
			
			if ($(form+'div input#IGS_FIRSTNAME').validateReserveForm(['empty']) != 'passed') {
				errorArray[0] = $(form+'div input#IGS_FIRSTNAME').validateReserveForm(['empty']);
				$(form+'div#IGS_FIRSTNAME-row label').addClass('error');
				$(form+'div input#IGS_FIRSTNAME').addClass('error');
				Cufon.replace('div#IGS_FIRSTNAME-row label');
			} else {
				errorArray[0] = 'passed';
				$(form+'div#IGS_FIRSTNAME-row label').removeClass('error');
				$(form+'div input#IGS_FIRSTNAME').removeClass('error');
				Cufon.replace('div#IGS_FIRSTNAME-row label');
			}
			
			if ($(form+'div input#IGS_LASTNAME').validateReserveForm(['empty']) != 'passed') {
				errorArray[1] = $(form+'div input#IGS_LASTNAME').validateReserveForm(['empty']);
				$(form+'div#IGS_LASTNAME-row label').addClass('error');
				$(form+'div input#IGS_LASTNAME').addClass('error');
				Cufon.replace('div#IGS_LASTNAME-row label');
			} else {
				errorArray[1] = 'passed'
				$(form+'div#IGS_LASTNAME-row label').removeClass('error');
				$(form+'div input#IGS_LASTNAME').removeClass('error');
				Cufon.replace('div#IGS_LASTNAME-row label');
			}
			
			if ($(form+'div input#IGS_EMAIL').validateReserveForm(['empty', 'email']) != 'passed') {
				errorArray[2] = $(form+'div input#IGS_EMAIL').validateReserveForm(['empty', 'email']);
				$(form+'div#IGS_EMAIL-row label').addClass('error');
				$(form+'div input#IGS_EMAIL').addClass('error');
				Cufon.replace('div#IGS_EMAIL-row label');
			} else {
				errorArray[2] = 'passed';
				$(form+'div#IGS_EMAIL-row label').removeClass('error');
				$(form+'div input#IGS_EMAIL').removeClass('error');
				Cufon.replace('div#IGS_EMAIL-row label');
			}
			
			if ($(form+'div input#IGS_PHONE').validateReserveForm(['empty', 'phone']) != 'passed') {	
				errorArray[3] = $(form+'div input#IGS_PHONE').validateReserveForm(['empty', 'phone']);
				$(form+'div#IGS_PHONE-row label').addClass('error');
				$(form+'div input#IGS_PHONE').addClass('error');
				Cufon.replace('div#IGS_PHONE-row label');
			} else {
				errorArray[3] = 'passed';
				$(form+'div#IGS_PHONE-row label').removeClass('error');
				$(form+'div input#IGS_PHONE').removeClass('error');
				Cufon.replace('div#IGS_PHONE-row label');
			}
			
			if ($('form#IGS_FORM').attr('class') == 'cc') {
				if ($(form+'div input#IGS_ADDRESS').validateReserveForm(['empty']) != 'passed') {
					errorArray[4] = $(form+'div input#IGS_ADDRESS').validateReserveForm(['empty']);
					$(form+'div#IGS_ADDRESS-row label').addClass('error');
					$(form+'div input#IGS_ADDRESS').addClass('error');
					Cufon.replace('div#IGS_ADDRESS-row label');
				} else {
					errorArray[4] = 'passed';
					$(form+'div#IGS_ADDRESS-row label').removeClass('error');
					$(form+'div input#IGS_ADDRESS').removeClass('error');
					Cufon.replace('div#IGS_ADDRESS-row label');
				}
				
				if ($(form+'div input#IGS_CITY').validateReserveForm(['empty']) != 'passed') {
					errorArray[5] = $(form+'div input#IGS_CITY').validateReserveForm(['empty']);
					$(form+'div#IGS_CITY-row label').addClass('error');
					$(form+'div input#IGS_CITY').addClass('error');
					Cufon.replace('div#IGS_CITY-row label');
				} else {
					errorArray[5] = 'passed';
					$(form+'div#IGS_CITY-row label').removeClass('error');
					$(form+'div input#IGS_CITY').removeClass('error');
					Cufon.replace('div#IGS_CITY-row label');
				}
				
				if ($(form+'div input#IGS_ZIP').validateReserveForm(['empty', 'zip']) != 'passed') {
					errorArray[6] = $(form+'div input#IGS_ZIP').validateReserveForm(['empty', 'zip']);
					$(form+'div#IGS_ZIP-row label').addClass('error');
					$(form+'div input#IGS_ZIP').addClass('error');
					Cufon.replace('div#IGS_ZIP-row label');
				} else {
					errorArray[6] = 'passed';
					$(form+'div#IGS_ZIP-row label').removeClass('error');
					$(form+'div input#IGS_ZIP').removeClass('error');
					Cufon.replace('div#IGS_ZIP-row label');
				}
				
				//Begin credit card validation
				var cctype = '';
				
				if (typeof($(form+'div select#IGS_TYPE').validateReserveForm(['card'])) == 'object') {
					cctype = $(form+'div select#IGS_TYPE').validateReserveForm(['card'])['cctype'];
					if ($(form+'div input#IGS_CC').validateReserveForm([cctype]) == 'passed') {
						errorArray[7] = 'passed';
						$(form+'div#IGS_CC-row label').removeClass('error');
						$(form+'div input#IGS_CC').removeClass('error');
						Cufon.replace('div#IGS_CC-row label');
					} else {
						errorArray[7] = $(form+'div input#IGS_CC').validateReserveForm([cctype]);
						$(form+'div#IGS_CC-row label').addClass('error');
						$(form+'div input#IGS_CC').addClass('error');
						Cufon.replace('div#IGS_CC-row label');
					}
				};
				
				var expmonth = $(form+'div select#IGS_EXPIRE-month option:selected').val();
				var expyear = $(form+'div select#IGS_EXPIRE-year option:selected').val();
				var ccexpiry = new Date();
				ccexpiry.setMonth(expmonth - 1);
				ccexpiry.setFullYear(expyear);
				
				var today = new Date();
				if (today > ccexpiry) {
					errorArray[8] = 'expired';
					$(form+'div select#IGS_EXPIRE-month, '+form+'div select#IGS_EXPIRE-year').addClass('error');
					$(form+'div#IGS_EXPIRE-row label').addClass('error');
					Cufon.replace('div#IGS_EXPIRE-row label');
				} else {
					errorArray[8] = 'passed';
					$(form+'div select#IGS_EXPIRE-month, '+form+'div select#IGS_EXPIRE-year').removeClass('error');
					$(form+'div#IGS_EXPIRE-row label').removeClass('error');
					Cufon.replace('div#IGS_EXPIRE-row label');
				}
				
				var cvvflag = '';
				
				if (cctype == 'visa' || cctype == 'mc' || cctype == 'discover') {
					if ($(form+'div input#IGS_CVV').validateReserveForm(['cvv3']) != 'passed') {
						cvvflag = 'failed';
						errorArray[9] = $(form+'div input#IGS_CVV').validateReserveForm(['cvv3']);
					} else { 
						cvvflag = 'passed'; 
						errorArray[9] = 'passed';
					}
				} else {
					if ($(form+'div input#IGS_CVV').validateReserveForm(['cvv4']) != 'passed') {
						cvvflag = 'failed';
						errorArray[9] = $(form+'div input#IGS_CVV').validateReserveForm(['cvv4']);
					} else { 
						cvvflag = 'passed'; 
						errorArray[9] = 'passed';
					}
				}
				
				if (cvvflag == 'failed') {
					$(form+'div#IGS_CVV-row input').addClass('error');
					$(form+'div#IGS_CVV-row label').addClass('error');
					Cufon.replace('div#IGS_CVV-row label');
				} else {
					$(form+'div#IGS_CVV-row input').removeClass('error');
					$(form+'div#IGS_CVV-row label').removeClass('error');
					Cufon.replace('div#IGS_CVV-row label');
				}
				$('input#form_flag').val('cc');
			} else if ($('form#IGS_FORM').attr('class') == 'wt') {
				$('input#form_flag').val('wt');
			}

			
			var errors = buildErrorMessages(errorArray);
			var confirm = displayErrors(errors);
			if (typeof(confirm) == 'object') {
				$('form div#form_fields').css('padding-top', '5px');
				$('form div#textual_errors').css('display', 'block');
			} else {
				$('form div#form_fields').css('padding-top', '25px');
				$('form div#textual_errors').css('display', 'none');
				flag = 'ready';
			}
			
			if (flag == 'ready') {
				if ($('div#step_three form div#terms_box div label input:checked').val() == 1) {
					$('#step_three form').submit();
				} else {
					$('div#step_three form div#terms_box label').addClass('error');
					$('div#step_three form div#terms_box h3 span.error').css('display', 'inline');
					Cufon.replace('div#step_three form div#terms_box label');
				}
			}

			return false;
		});
		
		/*
		* Simple listener to swap html and to reload cufon on gallery btn
		*/
		$('a.btn_gallery_download').hover(function() {
			$(this).text('1080');
		}, function() {
			$(this).text('Download');
		})
}); /* End of document.ready */


/*
* This function is built to parse the entire
* Errors hash that is built below and assign
* Errors to the correct divs on the page.
*/
function displayErrors(e) {
	var emptyFlag = '';
	$('form div#textual_errors div ul').find('li').remove();
	for (var k in e) {
		for (var v in e[k]) {
			emptyFlag = e[k];
			switch (k) {
				case 'leftcol':
					$('form div#textual_errors #leftcol ul').append('<li>'+e[k][v]+'</li>');
					break;
				case 'middlecol':
					$('form div#textual_errors #middlecol ul').append('<li>'+e[k][v]+'</li>');
					break;
				case 'rightcol':
					$('form div#textual_errors #rightcol ul').append('<li>'+e[k][v]+'</li>');
					break;
				default:
					return true;
			}
		}
	}
	return emptyFlag;
}

/*
* This function reads through all of the hash tables and compiles
* them into one giant associative hash table of errors. This is
* where each returned error from the validation class is defined
* for front-end display. Utilize these strings for custom messages.
*/
function buildErrorMessages(ea) {
	var errorHashTable = {};
	errorHashTable['leftcol'] = {};
	errorHashTable['middlecol'] = {};
	errorHashTable['rightcol'] = {};
	
	for (var i = 0; i < ea.length; i++) {
		if (ea[i] == 'passed') {
			continue;
		} else {
			switch (i) {
				case 0: //Build fname error
					errorHashTable['leftcol']['firstname'] = {};
					if (ea[i]['empty'] == false) {
						errorHashTable['leftcol']['firstname'] = "Let's be on a first name basis";
					} else if (ea[i]['badName'] == false) {
						errorHashTable['leftcol']['firstname'] = "Let's be on a first name basis";
					}
					break;
				case 1: //Build lname error
					errorHashTable['leftcol']['lastname'] = {};
					if (ea[i]['empty'] == false) {
						errorHashTable['leftcol']['lastname'] = 'Mind giving us your last name too? ';
					} else if (ea[i]['badName'] == false) {
						errorHashTable['leftcol']['lastname'] = 'Mind giving us your last name too? ';
					}
					break;
				case 2: //Build email errors
					errorHashTable['leftcol']['email'] = {}
					if (ea[i]['empty'] == false) {
						errorHashTable['leftcol']['email'] = "Whoops! You forgot your email";
					} else if (ea[i]['email'] == false) {
						errorHashTable['leftcol']['email'] = "Whoops! Your email address didn't work";
					}
					break;
				case 3: //Phone number
					errorHashTable['leftcol']['phone'] = {};
					if (ea[i]['empty'] == false) {
						errorHashTable['leftcol']['phone'] = "We need your digits";
					} else if (ea[i]['number'] == false) {
						errorHashTable['leftcol']['phone'] = 'Please format your phone number as XXX-XXX-XXXX';
					}
					break;
				case 4: //Address
					errorHashTable['middlecol']['address'] = {};
					errorHashTable['middlecol']['address'] = 'Address, pretty please';
					break;
				case 5: //City
					errorHashTable['middlecol']['city'] = {};
					errorHashTable['middlecol']['city'] = 'What city do you live in?';
					break;
				case 6: //Zip code
					errorHashTable['middlecol']['zip'] = {};
					if (ea[i]['empty'] == false) {
						errorHashTable['middlecol']['zip'] = 'Zip code, please';
					} else if (ea[i]['zip'] == false) {
						errorHashTable['middlecol']['zip'] = 'Oops! That zip code is invalid';
					}
				case 7: //CC number
					errorHashTable['rightcol']['ccnum'] = {};
					if (ea[i]['ccEmpty'] == false) {
						errorHashTable['rightcol']['ccnum'] = "Credit card number, please";
					} else if (ea[i]['ccError1'] == false) {
						errorHashTable['rightcol']['ccnum'] = "Oops, #'s not right. Mind trying again?";
					} else if(ea[i]['ccError2'] == false) {
						errorHashTable['rightcol']['ccnum'] = "Hmmm.... that #'s invalid. Mind trying again?";
					}
					break;
				case 8: //Check expiry date
					errorHashTable['rightcol']['ccexpire'] = {};
					if (ea[i] == 'expired') {
						errorHashTable['rightcol']['ccexpire'] = "Only future expiration dates, please";
					}
					break;
				case 9: //CVV
					errorHashTable['rightcol']['cvvnum'] = {};
					if (ea[i]['cvv3e1'] == false) {
					    errorHashTable['rightcol']['cvvnum'] = 'The CVV code should be 3 digits long';
					} else if (ea[i]['cvv3e2'] == false) {
					    errorHashTable['rightcol']['cvvnum'] = 'The CVV code should be a 3 digit number';
					} else if (ea[i]['cvv4e1'] == false) {
					    errorHashTable['rightcol']['cvvnum'] = 'The CVV code should be 4 digits long';
					} else if (ea[i]['cvv4e2'] == false) {
					    errorHashTable['rightcol']['cvvnum'] = 'The CVV code should be a 4 digit number';
					}
					break;
				case 10: //Address
					errorHashTable['middlecol']['message'] = {};
					errorHashTable['middlecol']['message'] = "Tell us what's on your mind";
					break;
				
			}
		}
	}
	return errorHashTable;
}
