// Name: CommunityValidation.js Output: Min

var Validation={
	rules:[],
	summaries:[],
	autoRuleId:1,
	regex:{email:/^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$/,
	html:/<[a-z!]|&#/i},
	registerRuleset:function(ruleset){
		$.each(ruleset,function(){
			Validation.registerRule(this);
		});
	},
	registerRule:function(rule){
		var defaults={
			requiredInnerElement:false,
			display:'block',
			required:true,
			regex:false,
			trimWhiteSpace:true,
			onBlur:true,
			onClick:false
		};
		rule.options=$.extend({},defaults,rule.options);
		rule.id=Validation.autoRuleId;Validation.autoRuleId++;
		Validation.rules.push(rule);
		if(rule.options.onBlur){
			$(rule.field).blur(function(){
				Validation.executeRules(Validation.rules,rule.field);
			});
		}
		if(rule.options.onBlur){
			$(rule.field).click(function(){
				Validation.executeRules(Validation.rules,rule.field);
			});
		}
	},
	registerSummary:function(id,group){
		Validation.summaries.push({id:id,group:group});
	},
	validate:function(group){
		var result=true;
		var fieldsWithErrors=new Array();
		$.each(Validation.rules,function(){
			if(!group||this.group==group){
				if(!Validation.executeRule(this,fieldsWithErrors)){
					result=false;
				}
			}
		});
		return result;
	},
	executeRules:function(rules,field){
		var fieldsWithErrors=new Array();
		for(var i=0;i<rules.length;i++){
			if(rules[i].field==field){
				Validation.executeRule(rules[i],fieldsWithErrors);
			}
		}
	},
	executeRule:function(rule,fieldsWithErrors){
		var f=$(rule.field);
		var v=f.val();
		var valid=true;
		if(rule.options.trimWhiteSpace){
			v=$.trim(v);
		}
		if(rule.options.requiredInnerElement){
			if(!Validation.passRequiredInnerElement(f,rule.options.requiredInnerElement)){
				valid=false;
			}
		}
		if(rule.options.required){
			if(!Validation.passRequired(f,v)){
				valid=false;
			}
		}
		if(rule.options.regex){
			if(!Validation.passRegex(rule.options.regex,v)){
				valid=false;
			}
		}
		if(rule.options.profanity){
			if(!Validation.passProfanity(v)){
				valid=false;
			}
		}
		if(valid){
			Validation.hideError(rule);
		}else{
			var showError=true;
			for(var i=0;i<fieldsWithErrors.length;i++){
				if(fieldsWithErrors[i]==rule.field){
					showError=false;
					break;
				}
			}
			if(showError){
				fieldsWithErrors[fieldsWithErrors.length]=rule.field;
				Validation.showError(rule);
			}else{
				Validation.hideError(rule);
			}
		}
		return valid;
	},
	reset:function(group){
		$.each(Validation.rules,function(){
			if(!group||this.group==group){
				Validation.hideError(this);
			}
		});
	},
	passRequired:function(field,value){
		switch(field[0].nodeName.toLowerCase()){
			case'select':
				var options=$("option:selected",field);
				return options.length>0&&(element.type=="select-multiple"||options[0].value.length>0);
			case'input':
				switch(field[0].type.toLowerCase()){
					case'checkbox':
					case'radio':return field[0].checked;
				}
			default:return value.length>0;
		}
	},
	passRequiredInnerElement:function(field,element){
		var parentElement=$(field);
		var childElement=element;
		if(childElement===true){
			if(parentElement.children().length===0){
				return false
			}else{
				return true
			}
		}else{
			if(parentElement.find(childElement).length===0){
				return false
			}else{
				return true
			}
		}
	},
	passRegex:function(regex,value){
		return regex===Validation.regex.html?!regex.test(value):regex.test(value);
	},
	passProfanity:function(value){
		var returnedCheck=Common.checkForProfanity({key:value});
		return returnedCheck[0].isValid;
	},
	showError:function(rule){
		$(rule.errorLabel).css('display',rule.options.display);
		Validation.updateRuleInSummary(rule,false);
	},
	hideError:function(rule){
		$(rule.errorLabel).css('display','none');
		Validation.updateRuleInSummary(rule,true);
	},
	findSummary:function(group){
		var summary=false;
		$.each(Validation.summaries,function(i){
			if(this.group==group||(!group&&!this.group)){
				summary=this;return false;
			}
		});
		return summary;
	},
	updateRuleInSummary:function(rule,isValid){
		var summary=Validation.findSummary(rule.group);
		if(rule.summaryMessage&&summary){
			var msg=rule.summaryMessage;
			if(typeof msg=='function'){
				msg=msg(rule);
			}
			var s=$(summary.id);
			var li=s.find('li[@ruleId="'+rule.id+'"]');
			if(isValid){
				if(li.length){
					li.remove();
				}
			}else{
				if(li.length){
					li.html(msg);
				}else{
					var sUl=s.find('ul');
					if(sUl.length>0){
						sUl.append('<li ruleId="'+rule.id+'">'+msg+'</li>');
					}else{
						s.append('<ul><li ruleId="'+rule.id+'">'+msg+'</li></ul>');
					}
				}
			}
			if(!s.find('ul > li').length){
				s.hide();
			}else{
				s.show();
			}
		}
	},
	removeRule:function(id){
		var rule=null;
		$.each(Validation.rules,function(i){
			if(this.id==id){
				Validation.hideError(this);
				Validation.rules.splice(i,1);return false;
			}
		});
	},
	removeRuleByField:function(fieldId){
		var rule=null;
		$.each(Validation.rules,function(i){
			if(this.field==fieldId){
				Validation.hideError(this);
				Validation.rules.splice(i,1);
			}
		});
	},
	init:function(){
		$('div.validationSummary').each(function(){
			if(!$(this).find('ul > li').length){
				$(this).hide();
			}
		});
	}
};


