
function c_validate(data,rules)
{
	reply = {};
	
	reply.errors = {};
	
	if(!data || !rules)
	 return reply;
	 
	 $.each(rules,function(model,model_data){
	 	
	 	reply.errors[model] = {};
		
		$.each(model_data,function(model_key,rule_data){
			
			reply.errors[model][model_key] = {};
			
			//console.info(model_key,"Model Key");
			//console.info(rule_data,"Model Rule Data");
			
			//console.info(data[model][model_key],"Data at Model Key");
			
				text = data[model][model_key];
				//console.info("Caught to validate.. "+text);
				
				$.each(rule_data,function(rule_key,rule_details){
				
					//console.info(rule_key," Rule");
					rule_invalid = 1;
				
					if(rule_key=='required')
					{ 
						//console.info(rule_key,"True Mode");
						if(text==='')
						{	
							//console.info(text," text at required");
							reply.errors[model][model_key][rule_key] = rule_details;
						}	
						
						rule_invalid = 0;
						
					}
					
					if(rule_key=='length_between')
					{
						length_between_error_flag = 0;
						length_between_rule_error_flag = 1;
						
						text_length = text.length;
						
						//console.info(text.length);
						//console.info(rule_details);
						
						if(isset(rule_details.min) )
						{	
						   //console.info("At Min in length between");
						   if(text_length<parseInt(rule_details.min))	
							length_between_error_flag = 1;
							
							length_between_rule_error_flag = 0;
						}
						
						if(isset(rule_details.max) )
						{	
						   //console.info("At Max in length between");
						   if(text_length>parseInt(rule_details.max))	
						   {
						   		length_between_error_flag = 1;
						   		//console.info('Error caught at max in len_between');
						   }	
							
							length_between_rule_error_flag = 0;
						}
								
						//console.info(length_between_error_flag," Final Flag len_between");
						if(length_between_error_flag)
							reply.errors[model][model_key][rule_key] = rule_details.message;
						
							
						if(!length_between_rule_error_flag)
							rule_invalid = 0;	
													
					}
					
					if(rule_key=='value_between')
					{
						value_between_error_flag = 0;
						value_between_rule_error_flag = 1;
						
						if(isNaN(text)) text=0;
						//console.info(rule_details);
						
						if(isset(rule_details.min) )
						{	
						   //console.info("At Min in value between");
						   if(parseFloat(text)<parseFloat(rule_details.min))	
							value_between_error_flag = 1;
							
							value_between_rule_error_flag = 0;
						}
						
						if(isset(rule_details.max) )
						{	
						   //console.info("At Max in value between");
						   if(parseFloat(text)>parseFloat(rule_details.max))	
						   {
						   		value_between_error_flag = 1;
						   		//console.info('Error caught at max in value_between');
						   }	
							
							value_between_rule_error_flag = 0;
						}
								
						//console.info(length_between_error_flag," Final Flag value_between");
						if(value_between_error_flag)
							reply.errors[model][model_key][rule_key] = rule_details.message;
						
							
						if(!value_between_rule_error_flag)
							rule_invalid = 0;	
													
					}
					
					if(isset(rule_details.rule))
					{
						//console.info(rule_key,"True Mode");
						//console.info(rule_details.rule);
											
						if(!text.match(eval(rule_details.rule)))
						{
							reply.errors[model][model_key][rule_key] = rule_details.message;
						}
						
						rule_invalid = 0;						
						
					}
					
					if(rule_invalid)
					{
						reply.errors[model][model_key][rule_key] = "Invalid Rule Defination";
					}
					
								
					
				});
				
				if(empty(reply.errors[model][model_key]))
				{
					delete reply.errors[model][model_key];
				}
			
			
			
		});
		
		if(empty(reply.errors[model]))
		{
			delete reply.errors[model];
		}
	
	});
	return reply;		
		
}

function getFormDataByRules(form,rules)
{
	raw_data = form.serializeArray();
	formData = {};
	
	$.each(rules,function(rule_model,model_data){
		formData[rule_model] = {};
		$.each(model_data,function(model_key,rule_data){
			
			formData[rule_model][model_key] = "";
			
			$.each(raw_data,function(form_key,form_item){
				if(form_item.name=="data["+rule_model+"]["+model_key+"]")
					formData[rule_model][model_key] = form_item.value;				
			});
			
		});
	});
	
	return formData;
}


function renderFormErros(v_results,each_callback)
{
	//console.info(v_results);
	$.each(v_results.errors,function(model,model_data){
		$.each(model_data,function(model_key,rule_error){
			$.each(rule_error,function(rule_key,rule_msg){
				dom_id = '#'+ucfirst(model);
				model_key_words = explode('_',model_key);
				model_key_words_length = model_key_words.length;
				for(i=0;i<model_key_words_length;i++)
					dom_id += ucfirst(model_key_words[i]);
				//console.info(model_key_words.length);
				//console.info(dom_id);
				dom = $(dom_id).get(0);
				each_callback(dom,rule_msg);
			});
		});	
	});
}


