(function(jQuery) {
	jQuery.fn.form = function(settings) {
		
		var settings = jQuery.extend({
			// 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 read legal statement before sending.',
			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(){
			$('#'+settings.buttons.submitBtn, form).click(function(e){
				_validate();
				return false;
			});
			$('#'+settings.buttons.resetBtn, form).click(function(e){
				_resetForm();
				return false;
			});
		}
		
		function _showDialogue(msg) {
			$('#'+settings.idNames.dialogue, form).show().addClass(settings.classNames.loading).html(msg);
		}
		
		function _hideDialogue(msg) {
			if(settings.animateDialogue){
				$('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).html(msg).fadeTo(3000, 1).fadeOut("slow");
			} else {
				$('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).html(msg);
			}
		}
		
		function _dialogue(msg) {
			$('#'+settings.idNames.dialogue, form).removeClass(settings.classNames.loading).html(msg);
		}
		
		function _validate() {
			_showDialogue(settings.sendingText);
			var pass = true;
			// REQUIRED TEXT INPUTS
			$('.'+settings.classNames.required+':text', form).each(function(e){
				if($(this).val() == ''){
					$(this).addClass(settings.classNames.error);
					pass = false;
				}
			});
			if(!pass){
				_dialogue(settings.requiredText);
				return false;
			}
			// REQUIRED CHECKBOXES
			$('.'+settings.classNames.required+':checkbox', form).each(function(e){
				if( ! $(this).attr('checked') ){
					$(this).addClass(settings.classNames.error);
					pass = false;
				}
			});
			if(!pass){
				_dialogue(settings.requiredCheckboxText);
				return false;
			}
			
			// PROPERLY FORMATTED EMAIL
			var _email = '';
			$('.'+settings.classNames.email+':text', form).each(function(e){
				if( ! email_regex.test( $(this).val() ) ){
					$(this).addClass(settings.classNames.error);
					pass = false;
				} else {
					_email = $(this).val();
				}
			});
			
			// CHECK EMAIL CONFIRMATION
			$('.'+settings.classNames.c_email+':text', form).each(function(e){
				if( $(this).val() != _email ){
					$(this).addClass(settings.classNames.error);
					pass = false;
				}
			});
			
			if(!pass){
				_dialogue(settings.emailText);
				return false;
			} else {
				_submitForm();	
			}
		}
		
		function _showConfirmation(){
			$('#confirmation-message').slideDown("fast");	
		}
		
		function _resetForm() {
			document.forms[formName].reset();
			$('.'+settings.classNames.required+':text', form).each(function(e){
				$(this).removeClass(settings.classNames.error);																
			});
		}
		
		function _submitForm() {
			var serialized = $(form).serialize();
			$.ajax({
				type: formMethod,
				url: formAction,
				data: serialized,
				success: function(msg){
					if(msg=="success"){
						_resetForm();
						_hideDialogue(settings.successText);
						_showConfirmation();
					} else {
						_dialogue(msg);
					}
				}
			});
		}
		
		_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);
