jQuery.fn.liveValidation=function(conf,addedFields){var config=jQuery.extend({validIco:'',invalidIco:'',valid:'Valid',invalid:'Invalid',validClass:'valid',invalidClass:'invalid',required:[],optional:[],fields:{}},conf);var fields=jQuery.extend({name:/^\S.*$/,content:/^\S.*$/m,dimensions:/^\d+x\d+$/,price:/^\d+$/,url:/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/,email:/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/},config.fields);fields.website=fields.url;fields.title=fields.author=fields.name;fields.message=fields.comment=fields.description=fields.content;var formControls=jQuery.merge(config.required,config.optional);if(!formControls.length){return this}for(var i in formControls){formControls[i]=':input[name='+formControls[i]+']:not([disabled])'}formControls=formControls.join(',');return this.each(function(){jQuery(formControls,this).each(function(){var t=jQuery(this);var isOptional=false;var fieldName=t.attr('name');for(var i in config.optional){if(fieldName==config.optional[i]){isOptional=true;break}}if(t.is('.jquery-live-validation-on')){return}else{t.addClass('jquery-live-validation-on')}var imageType=isOptional?'valid':'invalid';var validator=jQuery('<img src="'+config[imageType+'Ico']+'" alt="'+config[imageType]+'" />').insertAfter(t.addClass(config[imageType+'Class']));var validate=function(){var key=t.attr('name');var val=t.val();var tit=t.attr('title');val=tit==val?'':val;if((isOptional&&val=='')||val.match(fields[key])){if(validator.attr('alt')!=config.valid){validator.attr('src',config.validIco);validator.attr('alt',config.valid);t.removeClass(config.invalidClass).addClass(config.validClass)}}else{if(validator.attr('alt')!=config.invalid){validator.attr('src',config.invalidIco);validator.attr('alt',config.invalid);t.removeClass(config.validClass).addClass(config.invalidClass)}}};validate();t.keyup(validate)});jQuery('form',this).submit(function(){return!jQuery(this).find('img[alt="'+config.invalid+'"]').length})})};
