if(typeof API == 'undefined') API = {};
API.validate = new function(){
	var flags = {};
	var locks = {};
	
	var instance = this;
	
	this.run = function(selector,onValid){
		var form = $(selector);		
		var inputs = form.find('input,textarea');
		form.submit(function() {
			if(API.validate.isValid(this)) {

				if(onValid && typeof onValid == 'function'){
					return onValid(this);					
				}				
				return true;
			}
			inputs.unbind('blur');
			inputs.blur(function(){
				API.validate.isSingleValid(this);
			});	
			console.log('defaultContent');
			if(typeof API.defaultContent != 'undefined'){
				API.defaultContent.set();				
			}				
			return false;						
		});				
	}
	
	var equals = function(elm,form,regexp,message,cssClass){
		elm  = $(elm);
		form = elm.parents('form');
		elm2 = form.find('.password');		
		if(jQuery.trim(elm.val()) != jQuery.trim(elm2.val()))
		{
			var error = $('<p class="error">').html(message);
			elm.parent().append(error);
			elm.addClass('error');
			return true;
		}
		return false;		
	}
	var equals_email = function(elm,form,regexp,message,cssClass){
		elm  = $(elm);
		if(form == null) {
			form = elm.parents('form');
		}
		elm2 = form.find('.email');	
		
				
		if(jQuery.trim(elm.val()) != jQuery.trim(elm2.val()))
		{
			var error = $('<p class="error">').html(message);
			elm.parent().append(error);
			elm.addClass('error');
			return true;
		}
		return false;		
	}
	this.validator = {
		required : {regexp: /^.+$/, message: 'Field required!'},		
		number : {regexp: /^\d*$/, message: 'Wartość pola "%fname" nie jest liczbą!'},
		phone : {regexp: /^\d{9,12}$/, message: 'Nieprawidłowy numer telefonu!'},
		email: {regexp: /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/, message: 'This is not email!' },
		confirm_email: {regexp: '', message: 'Emails should be the same!', rule: equals_email}
	}
	this.isValid = function(form){
		form = $(form);
		form.find('p.error').remove();
		form.find('.error').removeClass('error');
		var validator = this.validator;
		var errorFlag = false;
		for ( var i in validator )
		{
		    var regexp = validator[i]['regexp'];
		    var cssClass = '.'+i;
		    var message = validator[i]['message'];
		    var rule = validator[i]['rule'];
		    var ruleFlag = true;
		    form.find(cssClass+':not(label)').each(function() {	

		    	var elm = $(this);
		    	var isDefault = (typeof API.defaultContent == 'undefined')? 'false' : API.defaultContent.isDefault(elm);
		    	var val = (!isDefault)? jQuery.trim(elm.val()) : '';
		    	
		    	if(regexp){		    		
		    		if((!elm.hasClass('required') || elm.attr('disabled')) && val == '' ){
		    			ruleFlag = false;
		    		}else if(!regexp.test(val)) {	
		    			var fieldName = form.find('label[for="'+elm.attr('id')+'"]');				    	
						var error = $('<p class="error">').html(message.replace("%fname", fieldName.html()));
						elm.parent().append(error);
						elm.addClass('error');
						errorFlag = true;
						ruleFlag = false; 
					}
		    	}
		    	if(typeof rule == 'function' && ruleFlag){
		    		if(rule(this,form,regexp,message,cssClass)){
		    			errorFlag = true;		    			
		    		}
		    	}		    	
			});
		}
		return !errorFlag;		
	}
	this.isSingleValid = function(field){
		
		field = $(field);		
		var fieldset = field.parent();		
		fieldset.find('p.error').remove();
		field.removeClass('error');
		var errorFlag = false;
		var validator = this.validator;	
		
		for ( var i in validator )
		{
		    var regexp = validator[i]['regexp'];
		    var cssClass = '.'+i;
		    var message = validator[i]['message'];
		    var rule = validator[i]['rule'];
		    var ruleFlag = true;
		    if(field.hasClass(i)){
		    	
		    	var elm = field;
		    	var isDefault = (typeof API.defaultContent == 'undefined')? 'false' : API.defaultContent.isDefault(elm);
		    	var val = (!isDefault)? jQuery.trim(elm.val()) : '';		    	
		    	
		    	if(regexp){
		    		
		    		if((!elm.hasClass('required') || elm.attr('disabled')) && val == '' ){
		    			ruleFlag = false;
		    		}else if(!regexp.test(val)) {		    			
		    			var fieldName = fieldset.find('label[for="'+elm.attr('id')+'"]');				    	
						var error = $('<p class="error">').html(message.replace("%fname", fieldName.html()));
						fieldset.append(error);
						elm.addClass('error');
						errorFlag = true;
						ruleFlag = false; 
					}
		    	}
		    	if(typeof rule == 'function' && ruleFlag){
		    		if(rule(elm,null,regexp,message,cssClass)){
		    			errorFlag = true;		    			
		    		}
		    	}
			}		    
		}
		return !errorFlag;		
	}
	this.showError = function(form,i,valid){
		elm = form.find('[name='+i+']');			
		elm.addClass('error');
		var validator = instance.validator[i];
		//tu do poprawy koncepcja
		if(validator){
			var message = validator['message'];
			var error = $('<p class="error">').html(message);
			elm.parent().append(error);
		}else{
			for ( var i in valid ){
				var error = $('<p class="error">').html(valid[i]);
				elm.parent().append(error);
			}
		}
		return false;
	}
}




