(function($){
	
	//Page validation
	$.fn.swfFormValidator=function(config){
		var frm=$(this)[0];
		
		var elmset=$('input[type=text],input[type=password],input[type=file],input[type=hidden],textarea,select', this);
		elmset.each(function(){
			var id=this.id;
			
			if(id.length<1) return;
			if(!eval('config.'+id)) return;
			
			if(this.id.length<1) $(this).attr('id', id);
			
			config[id]=$.extend({}, $.fn.swfFormValidator.config, config[id]);
			
			if(config[id].required){
				var lbl=$(this).siblings('label[for='+id+']').addClass('required-input');
				if(lbl.length<1) return;
				
				var txt=lbl.html();
				
				if(lbl.css('text-align')=='left' || lbl.css('text-align')=='start'){
					lbl.html('<span>'+txt+'</span>');
					var w=parseInt($('>span', lbl).width());
					w=(isNaN(w)?0:w)+3;
					if(lbl.width()<w) lbl.width(w);
					lbl.css('background-position', (w-3)+'px center').html(txt);
				}
			}
			
		});
		
		$(this).submit(function(){
			var result=true;
			
			for(id in config){
				var one_valid=false, empty=true, invalid=false, custom=$.extend({}, $.fn.swfFormValidator.customResult);
				
				var elm=$('#'+id, this);
				if(elm.attr('id')!=id) continue;
				
				var rel=elm.attr('rel');
				if(rel && rel.length>0) elm=$('[rel='+rel+']', this);
				
				elm.each(function(){
					var val=$(this).val();
					var r=null;
				
					if($(this).filter(':radio').length>0 || $(this).filter(':checkbox').length>0){
						val=$(this).filter(':checked').val();
					}
					if(val==undefined) val='';
					
					//run custom validation
					if(config[id].customValidation){
						custom=$.extend(custom, config[id].customValidation($(this)));
						if(custom.msg) config[id].msg=custom.msg;
						if(custom.required!=null) config[id].required=custom.required;
						if(custom.pattern) config[id].pattern=custom.pattern;
					}
					
					//Check if required field is empty
					r=(val.length<1 && config[id].required);
					if(config[id].related=='any'){
						if(empty) empty=r;
					}
					else empty&=r;
					
					//Check if required field is empty
					if(val && val.length>0 && config[id].pattern){
						invalid|=!config[id].pattern.test(val);
					}
					
					if(!empty && config[id].related=='any') one_valid=true;
				})
				if(one_valid) empty=false;
				
				if(!empty && !invalid && !custom.error) continue;
				
				if(custom.showMessage) alert(config[id].msg);
				$('#'+id, this).focus();
				result=false;
				break;
			}
			
			return result;
		});
		
		return this;
	}
	$.fn.swfFormValidator.config={
		required			:false,
		msg					:'',
		pattern				:null,
		customValidation	:null,
		related				:'any'
	}
	$.fn.swfFormValidator.customResult={
		required	:null,
		pattern		:null,
		error		:false,
		showMessage	:true,
		msg			:null
	}
	
})(jQuery);

