$.fn.validate_form = function( settings ){
	settings = $.extend({
		'validatecount' : 0,
		'imgs' : '.validate img',
		'callback' : false,
		'callback_function' : function(){

		},
		'data_containers' : '.element',
		'ajax' : false,
		'url' : '',
		'process_numbers' : false
	}, settings );

	var len = settings.imgs;

	return this.click(function(){
		$( settings.data_containers ).children( 'input, textarea, select' ).each(function( l ){
			var imgEle = $( settings.imgs ).get(l);
			if( validateFields( $( this ).attr( 'alt' ), $( imgEle ), $( this ).val(), settings.process_numbers ) ){
				$( imgEle ).attr( 'src', 'images/small_green_check.png' );
			}
		});
		var ctr = 0;
		$( settings.imgs ).each(function(){
			if( $( this ).attr( 'src' ).indexOf( 'images/small_green_check.png' ) > -1 ){
				ctr++;
			}
		});
		var data = {};
		if(
			ctr == $( settings.data_containers ).children( 'input, textarea, select' ).length
			&& settings.callback
		){
			$( settings.data_containers ).children( 'input, textarea, select' ).each(function( l ){
				data[$( this ).attr( 'name' )] = $( this ).val();
			});
			$( this ).trigger( { 'type' : 'change', 'elements' : data, 'ajax' : settings.ajax, 'url' : settings.url } );
		} else if(
			ctr != $( settings.data_containers ).children( 'input, textarea, select' ).length
		){
			// alert( 'Please verify your inputs.' + ' ' + ctr + ' ' + $( settings.data_containers ).children( 'input, textarea, select' ).length );
			alert( 'Please verify your inputs.' );
		}
	}).bind( 'change', settings.callback_function );
};

$.fn.validate = function( settings ){
	settings = $.extend({
		'process_numbers' : false,
		'usepattern' : false,
		'patterntype' : '',
		'images' : '.validate img'
	}, settings );

	patterns = {
		'email' : /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/
	};

	var se = $( settings.images );
	
	return this.each(function( i ){
		var $this = $( this );
		var validated = false;
		var __val = $( $( se ).get( i ) );
		$this.keyup(function(){
			if(
				__val !== false
				&& $this.val().length > 0
			){
				if( __val.attr( 'src' ) != 'images/ajax-loader.gif' ){
					__val.attr( { 'src' : 'images/ajax-loader.gif', 'width' : 16, 'height' : 16 } );
				}
			} else{
				__val.attr( 'src', 'images/small_red_cross.png' );
			}
		});

		$this.blur(function(){
			var alt = $this.attr( 'alt' );
			var val = $this.val();
			validated = validateFields( alt, __val, val, settings.process_numbers );

			if( validated ){
				__val.attr( 'src', 'images/small_green_check.png' );
			} else{
				__val.attr( 'src', 'images/small_red_cross.png' );
			}
		});
	});
};

function validateFields( alt, __val, val, process_numbers ){
	var validated = false;
	switch( alt.toLowerCase() ){
		case 'email':
			var regex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
			if(
				regex.test( val ) == true
				&& __val !== false
			){ validated = true; } else{ validated = false }
		break;
		case 'length':
			if(
				val.length > 0
				&& __val !== false
			){ validated = true; } else{ validated = false }
		break;
		case 'isnum':
			val = ( process_numbers ) ? val.replace( /[^0-9\.]/g, '' ) : val;
			if(
				val.length > 0
				&& !isNaN( val )
				&& __val !== false
			){ validated = true; } else{ validated = false }
		break;
		default:
			validated = true;
		break;
	}
	return validated;
}
