/***************************************
** Title........: JQuery sendRichMail Plugin
** Author.......: Melvin Rivera
** URL..........: http://melvinrivera.org
** Version......: 1.1
** Last changed.: 09/30/09
** About........: Provides field validation and Ajax to a form in an unintrusive elegant way
** Usage........: jQuery("#formid").sendRichMail();
***************************************/
;(function(jQuery) {
	
	jQuery.fn.sendRichMail = function() {
		var ref = this;
		// add security token to the form and ajax it
		jQuery.get(jQuery(this).attr('action')+"?get_token=1",function(txt){
			jQuery(ref).append('<input type="hidden" id="ts" name="ts" value="'+txt+'" \/>');
		});
		
		jQuery(this).find(':input.autoclear').not(':submit').each(function(i){
			jQuery(this).attr('alt', jQuery(this).attr('value'))
			ref.autoClearField(this)
		})
		
		jQuery(this).submit(function(){
			if ( ref.validate() ) {
				jQuery(ref).find(':submit').after('<span class="msg-status loading-img">Sending...</span>');
				
				jQuery.ajax({ 
					type: "POST",
					url: jQuery(ref).attr('action'),
					data:  jQuery.str, 
					contentType: "application/x-www-form-urlencoded;charset=utf-8",
					success: function(responseText){
						jQuery('.msg-status', ref).removeClass('loading-img');
						if ( responseText == '1')
							jQuery('.msg-status', ref).addClass('success-img').html('Email Sent!');
						else
							jQuery('.msg-status', ref).addClass('error-img').html('Error '+responseText);
					 	// reset form
						jQuery(ref).animate({opacity: 1.0}, 1000, null, function(){ 
							jQuery(ref).find('input,textarea,:submit').each(function(){
								jQuery(this).removeClass('disabled')
								if ( responseText == 1 && jQuery(this).attr('alt') ) 
									jQuery(this).attr('value', jQuery(this).attr('alt')); 
								this.disabled = false; 
							})
							jQuery(ref).find('.msg-status').animate({opacity: 0.0}, 500, null, function(){ 
								jQuery(this).remove();  
								if (responseText==1){jQuery(ref).parent().fadeOut();}  
							})
						})
					}, 
					error: function(){ ref.showResponse('Network Error') }
			    })
			    
			}
			return false
		})
		return this
	};

	jQuery.fn.validate = function(){
		var ref = this;
		// custom serialize form checks removes multi-form prefix "f1-"
		var strArray = [];
		jQuery(':input', ref).each(function(){
			var split = jQuery(this).attr('id').split("-");
			var thisId = ( split[1] == undefined ) ? split[0] : split[1];
			strArray.push(thisId+'='+encodeURIComponent(jQuery.trim(jQuery(this).attr('value'))));
		})
		jQuery.str = strArray.join("&").replace(/%20/g, "+");;
		// disable fields
		jQuery(ref).find('input,textarea,:submit').each(function(){
			jQuery(this).addClass('disabled'); 
			this.disabled = true
		})
		
		var perfect = true;
		jQuery(ref).find('.required').each(function(i){
			if ( jQuery(this).attr('value') == '' ) 
				jQuery(this).attr('value', jQuery(this).attr('alt'))
			var valid = 0;
			valid = ref.requiredField(jQuery(this).attr('id'))
			if (!valid) perfect = false;
		})
		jQuery(ref).find('.validate-email').each(function(i){
			if ( jQuery(this).attr('value') == '' ) 
				jQuery(this).attr('value', jQuery(this).attr('alt'))
			var valid = 0;
			valid = ref.validEmail(jQuery(this).attr('id'))
			if (!valid) perfect = false;
		})
		if ( !perfect ) {
			jQuery(ref).animate({opacity: 1.0}, 2000, null, function(){ 
				jQuery(this).find(':input').each(function(){jQuery(this).removeClass('disabled'); this.disabled = false}) 
			});
			return false;
		}else{
			return true;
		}
	};
	
	/*	function verifies email formatting 
		if invalid, returns false and displays error in the field value
		error message can be set in the email field title tag
		receives id of email field
	*/
	jQuery.fn.validEmail = function(id) {
		var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
		var domEle = jQuery('#'+id, this);
		var defaultValue = domEle.attr('alt');
		var userValue = domEle.val();
		if ( userValue == '' || userValue == defaultValue || !emailReg.test(userValue) ) {
			domEle.addClass('input-error').animate({opacity: 1.0}, 1000, null, function(){ domEle.attr('value', userValue).removeClass('input-error'); })
			return false;
		}else{
			return true;
		}	
	};
	/*	function verifies there is content
	*/
	jQuery.fn.requiredField = function(id){
		var domEle = jQuery('#'+id, this);
		if ( domEle.hasClass('validate-email') )
			return true
		var userValue = domEle.val();
		var defaultValue = domEle.attr('alt');
		var fieldType = domEle.attr('type');
		if ( fieldType == 'checkbox') {
			if (  domEle.attr('checked') == undefined ){
				jQuery('label[for="'+id+'"]', this).addClass('input-error').animate({opacity: 1.0}, 1000, null, function(){ jQuery('label[for="'+id+'"]', this).removeClass('input-error') })
				return false;
			}else{
				return true
			}
		} else {
			if ( userValue == '' || userValue == defaultValue ){
				domEle.addClass('input-error').animate({opacity: 1.0}, 1000, null, function(){ domEle.attr('value', userValue).removeClass('input-error') })
				return false;
			}else{
				return true;
			}
		}
	};
	
	/*	function auto clears a form field when a use clicks it to enter data
		receives two paramemeters, id of form field and defaultValue of that field
		if nothing is entered defaultValue is restored on blur
	*/
	jQuery.fn.autoClearField = function (obj){
		var defaultValue = jQuery(obj).attr('alt');
		jQuery(obj).focus(function(){ 
			if ( jQuery(obj).val() == defaultValue ) jQuery(obj).attr('value', '') 
		});
		jQuery(obj).blur(function(){ 
			if ( jQuery(obj).val() == '' ) jQuery(obj).attr('value', defaultValue) 
		});
	};
	
	
})(jQuery);