(function(jQuery) {
	jQuery.fn.form = function(settings) {
		var settings = jQuery.extend({
			ajax : false,
			// Ajax options
			ajaxData : {
				
			},
			// Form buttons
			buttons : {
				submitBtn : 'contact-submit',
				resetBtn : 'clear-form'
			},
			// ID names
			idNames : {
				dialogue : 'contact-dialog'
			},
			// Class names
			classNames : {
				loading : 'loading',
				required : 'required',
				email : 'email',
				c_email : 'c_email', // Confirmation e-mail
				error : 'error'
			},
			// Dialogue Strings
			sendingText : 'Sending...',
			successText : 'Message Sent!',
			requiredText : 'Please fill out all required fields.',
			requiredCheckboxText : 'Please fill out all required checkboxes.',
			emailText : 'Please verify your e-mail address',
			errorColor : '#ff00ff',
			// Booleans
			animateDialogue : true
		}, settings);
		
		var form 			= this; // This, in this context, refer to jQuery object
		var formID			= this.attr("id");
		var formName 		= this.attr("name");
		var formAction 		= this.attr("action");
		var formMethod 		= this.attr("method");
		
		function _init(){
			jQuery('#'+settings.buttons.submitBtn, form).click(function(e){
				_validate();
				return false;
			});
			jQuery('#'+settings.buttons.resetBtn, form).click(function(e){
				_resetForm(true);
				return false;
			});
		}
		
		function _showDialogue(msg) {
			jQuery('#'+settings.idNames.dialogue, form).show().addClass(settings.classNames.loading).html(msg);
		}
		
		function _hideDialogue() {
			if(settings.animateDialogue){
				jQuery('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).fadeOut("slow");
			} else {
				jQuery('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).hide();
			}
		}
		
		function _dialogue(msg,add) {
			if(add){
				msg = jQuery('#'+settings.idNames.dialogue, form).html() + ' ' + msg;
			}
			jQuery('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).html(msg);
		}
		
		function _validate() {
			
			_showDialogue(settings.sendingText);
			var pass = true;
			// REQUIRED TEXT INPUTS
			jQuery('.'+settings.classNames.required+':text', form).each(function(e){
				if(jQuery(this).val() == ''){
					jQuery(this).addClass(settings.classNames.error);
					pass = false;
				} else {
					jQuery(this).removeClass(settings.classNames.error);
				}
			});
			// REQUIRED CHECKBOXES
			jQuery('.'+settings.classNames.required+':checkbox', form).each(function(e){
				var checkboxes = jQuery(this).attr('name');
				var checked = jQuery('input:checkbox[name='+checkboxes+']:checked').length;
				if(checked==0){
					jQuery(this).addClass(settings.classNames.error);
					pass = false;
				} else {
					jQuery(this).removeClass(settings.classNames.error);
				}
			});
			if(!pass){
				_dialogue(settings.requiredText,true);
			}
			
			// PROPERLY FORMATTED EMAIL
			var _email = '';
			jQuery('.'+settings.classNames.email+':text', form).each(function(e){
				if( ! email_regex.test( jQuery(this).val() ) ){
					jQuery(this).addClass(settings.classNames.error);
					pass = false;
				} else {
					jQuery(this).removeClass(settings.classNames.error);
					_email = jQuery(this).val();
				}
			});
			
			// CHECK EMAIL CONFIRMATION
			jQuery('.'+settings.classNames.c_email+':text', form).each(function(e){
				if( jQuery(this).val() != _email ){
					jQuery(this).addClass(settings.classNames.error);
					pass = false;
				} else {
					jQuery(this).removeClass(settings.classNames.error);
				}
			});
			
			if(!pass){
				_dialogue(settings.emailText,true);
				return false;
			} else {
				_submitForm();	
			}
		}
		
		function _resetForm(hide) {
			document.forms[formName].reset();
			jQuery('.'+settings.classNames.required, form).each(function(e){
				jQuery(this).removeClass(settings.classNames.error);																
			});
			if(hide){
				_hideDialogue();
			}
		}
		
		function _submitForm() {
			if(!settings.ajax){
				jQuery(form).submit();
			} else {
				settings.ajaxData = jQuery(form).serialize();
				jQuery.ajax({
					type: formMethod,
					url: formAction,
					data: settings.ajaxData,
					dataType: 'text',
					success: function(msg){
						_dialogue(msg,false);
						_resetForm(false);
					},
					error: function(){
						_dialogue("There was an error. Please try again.",false);
					}
				 });
			}
		}
		
		_init();		
		
		var email_regex = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);

	};
})(jQuery);