var formHandler = (function(){
	var init = false;
	var disableBillFields = false;
	var joinFields = new Array();
	var billFields = new Array();
	var errorMessages = {};
	var _pub = {
		initialize:function(config) {
			if(init) return;
			init = true;
			_pub.configure(config); // load configuration
			jQuery('#subscriptionForm').validate(/*{errorLabelContainer: "#errorBlock"}*/); // enable validation on subscriptionForm
			_pub.setValidationCriteria(); // set validation rules for validate method
			_pub.bindInputCookies(); // bind input fields to corresponding cookies and fill with data, if existing
			jQuery('#joinEqualsBilling').change(_pub.toggleBilling); // add a click listener to this so we can toggle the fields on 'change'
		},
		bindInputCookies:function() {
			var required = jQuery.extend(joinFields,billFields);
			var cookieVal,curField;
			for(var field in required) {
				curField = '#'+field;
				jQuery(curField).cookieBind();
				if(!jQuery.cookies.get(curField)) {
					jQuery.cookies.setOptions({hoursToLive:2184});
					jQuery(curField).cookify();
				}
			}
		},
		configure:function(conf) {
			joinFields = conf.joinFields ? conf.joinFields : null;
			billFields = conf.billFields ? conf.billFields : null;
			errorMessages = conf.errorMessages ? conf.errorMessages : null;
		},
		toggleBilling:function(){
			var chk = this.id != 'joinEqualsBilling' ? document.getElementById('joinEqualsBilling') : this;
			switch(chk.checked) {
				case true:
					disableBillFields = true;
					_pub.toggleFields(billFields,'disabled',true);
				break;
				case false:
					disableBillFields = false;
					_pub.toggleFields(billFields,'disabled',false);
				break;
			}
		},
		toggleFields:function(fields,attr,val) {
			for(var i in fields) {
				jQuery('#'+i).attr(attr,val);
			}
		},
		setValidationCriteria:function() {
			var required = new Array();
			if(!disableBillFields) {
				required = jQuery.extend(joinFields,billFields);
				for(var field in required) {
					if(required[field]) {
						jQuery('#'+field).rules('add', {
							required:true,
							messages: {
								required : errorMessages[field]
							}
						});
					}
				}
			}
		}
	};
	return _pub;
})();
jQuery(document).ready(function() {
	var config = {
		// fieldId : required(true|false)
		joinFields : {subscriberFname:true,subscriberLname:true,subscriberAddress1:true,subscriberAddress2:false,subscriberCity:true,subscriberState:true,subscriberZip:true,subscriberPhone:true,subscriberEmail:true,subscriberDate:true},
		billFields : {billFname:true,billLname:true,billAddress1:true,billAddress2:false,billCity:true,billState:true,billZip:true,billPhone:true},
		errorMessages: {
				subscriberFname : 'Please enter your first name.',
				subscriberLname: 'Please enter your last name',
				subscriberAddress1: 'Please enter your address.',
				subscriberCity: 'Please enter your city.',
				subscriberState: 'Please select your state.',
				subscriberZip: 'Please enter your zip code.',
				subscriberPhone: 'Please enter your phone number.',
				subscriberEmail: 'Please enter your e-mail address.',
				subscriberDate: 'Please enter subscription start date.',
				billFname : 'Please enter your first name.',
				billLname: 'Please enter your last name',
				billAddress1: 'Please enter your address.',
				billCity: 'Please enter your city.',
				billState: 'Please select your state.',
				billZip: 'Please enter your zip code.',
				billPhone: 'Please enter your phone number.'
			}
	};
	jQuery("#subscriberPhone,#billPhone").mask("(999) 999-9999",{placeholder:""});
	formHandler.initialize(config);
	jQuery("#subscriberDate").datepicker();
});