var Validator = new FormValidator();

function FormValidator() {
	
	this.validatorMessages = 
	{
		success: 'Thank you, your message has been sent.',
		error: 'Please fill in all fields correctly.',
		errorSend: 'Message was not send',
		errorField: 'Please fill in this field'
	},
	
	this.cacheValues = {}
	
    this.validateUserInfoInputs = function(formId) {
        var result = true,
            __this = this;

		jQuery('#' + formId + ' select').each(function(index, object) {
            var required = false;

			if (__this.isDefined(jQuery(object).attr('required'))) {
				required = jQuery(object).attr('required');
			} else return;
			
			if ((jQuery(object).val() > 0) || (jQuery(object).val().length > 1)) {
				__this.hideError(object); //jQuery(object).parent().find('label').css({'color' : null});
			}

			else {
				__this.showError(object);
				
				//jQuery(object).parent().find('label').css({'color' : '#DA0000'});
				//jQuery(object).bind('click', function() {jQuery('[name=' + object.name + ']').parent().find('label').css({'color' : null});});

				result = false;
			}
		});

        jQuery('#' + formId + ' input, textarea').each(function(index, object) {
			if (object.type == 'checkbox') {
				var required = false;
				
				if (__this.isDefined(jQuery(object).attr('required'))) {
					required = jQuery(object).attr('required');
				} else return;
				//console.log(required,__this.isDefined(jQuery(object).attr('required')))
				//console.log(typeof jQuery(object).attr('required'),jQuery(object).attr('required'));
				if (jQuery(object).attr('checked') == false && required) {
					jQuery(object).parent().find('label').css({'color' : '#DA0000'});
					jQuery(object).bind('click keydown', function() {jQuery(this).parent().find('label').css({'color' : ''});});

					result = false;
				}
			}

			else if (object.type == 'radio') {
				var required = false;

				if (__this.isDefined(jQuery(object).attr('required'))) {
					required = jQuery(object).attr('required');
				} else return;
				
				if (jQuery('[name=' + object.name + ']:checked').size() > 0) {
					__this.hideError(object);
					return;
				} else {
					__this.showError(object);
					result = false;
				}
            }

            else {
				var minLength = 0,
					maxLength = 2048,
					group = '',
					customRegex = '';
				var required = true;
				if (__this.isDefined(jQuery(object).attr('minlength'))) {
					minLength = jQuery(object).attr('minlength');
				} else return;
				
				if (__this.isDefined(jQuery(object).attr('maxlength'))) {
					maxLength = jQuery(object).attr('maxlength');
				} else return;

                if (__this.isDefined(jQuery(object).attr('group'))) {
                    group = jQuery(object).attr('group');
                }
                
                if (__this.isDefined(jQuery(object).attr('rule'))) {
                	var rule = jQuery(object).attr('rule');	
                	switch(rule) {
                		case 'email':
                			customRegex = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/;
                		break;
                	}
                }
                if (__this.isDefined(jQuery(object).attr('notrequired'))) {
                	required = !jQuery(object).attr('notrequired');
                }
                                
                if (required && (minLength > jQuery(object).val().length) || (maxLength < jQuery(object).val().length)) {                	
                	if (group.length > 0) {
                        if (!jQuery('[name=' + group + ']').is(':checked')) {
                            jQuery(this).css({'border-color' : '#4B95C4', 'background' : '#F2F7FB none repeat scroll 0 0'});
                            return;
                        }
                    }
                    
                    __this.showError(object);
                	result = false;
                    return;
                }
                
                if (typeof customRegex == 'object') {               	
            		if(!customRegex.test(jQuery(object).val())) {
                		__this.showError(object);
            			result = false;
            			return;
                	}
                }
            }
        });
        return result;
    }
	
	this.cleanUp = function(form) {
		if (!form.length)
			return;
		
		form.find('input[type="text"], textarea').val('');
		form.children('label').removeClass('fv-error');
		form.children('.item-wrapper').removeClass('fv-error-ico');
		form.find('input, textarea').removeClass('fv-error-field');
		form.find('.extra-friend').remove();
		
		var select = form.find('select');
		var options = select.find('option');
			options.removeAttr('selected');
			select.val(0);
			
		form.find('input[type="hidden"]').val(0);
		form.find('input[class="select"]').val($(options[0]).html() || '');
	}
	
	this.hideError = function(object) {
		var __this = this;
		
		switch(object.type) {
			case 'radio':
				jQuery('[name=' + object.name + ']').parent().find('label').removeClass('fv-error');
			break;
			
			default:
				
				var parentSideLeft = jQuery('#' + object.id).parents('div[class*=coll]');
				
				if (parentSideLeft.length) {
					var parent = jQuery('#' + object.id).parents('.item-wrapper').removeClass('fv-error-ico')
				} else {
					jQuery('label[for=' + object.id + ']').removeClass('fv-error');
				}
				
				if (object.type === 'text' || object.type === 'textarea') 
					jQuery('#' + object.id).removeClass('fv-error-field').val((__this.cacheValues[object.name]) ? __this.cacheValues[object.name] : '');
								
			break;
		}
	}
	
	this.showError = function(object) {
		var __this = this;
		
		switch(object.type) {
			case 'radio':
				jQuery('label[for=' + object.id + ']').addClass('fv-error');
				
				jQuery('[name=' + object.name + '], #' + object.id).one('click', function() {
					__this.hideError(this);
				});
			break;
						
			default:
				
				var parentSideLeft = jQuery('#' + object.id).parents('div[class*=coll]'); 
		
				if (parentSideLeft.length) {
					var parent = jQuery('#' + object.id).parents('.item-wrapper').addClass('fv-error-ico')
				} else {
					jQuery('label[for=' + object.id + ']').addClass('fv-error');
				}
				
				jQuery('[name=' + object.name + '],  #' + object.id).one('click keydown', function() {
					__this.hideError(this);
				});	
				
				if (object.type === 'text' || object.type === 'textarea') {
					var currentVal = jQuery('#' + object.id).val();
					
					if (currentVal != __this.validatorMessages.errorField)
						__this.cacheValues[object.name] = currentVal;
					console.log(jQuery('#' + object.id))
					jQuery('#' + object.id).addClass('fv-error-field').val(__this.validatorMessages.errorField);
				}
				
			break;
		}
	}

    this.validateApplication = function(formId) {
        if (!this.validateUserInfoInputs(formId)) {
        	return false;
        }

		return true;
    }

    this.isDefined = function(variable) {
        if (variable == 'undefined') {
            return false;
        }

        switch (typeof(variable)) {
        	case 'undefined':
        		return false;
        	break;
        	
        	case 'number':
        		if (variable < 0) return false
        	break;
        }
        
        return true;        
    }
        
    this.runApplication = function(formId) {
		var __this = this;
		var form = jQuery('#' + formId);
		var messageCnt = jQuery('#messageCnt_'+formId); 
		
		if (!form.length)
			return false;
		
		jQuery('#contact-form-message').remove();
		
		var message = jQuery('<p>');
			message.attr({'id': 'contact-form-message', 'class': 'fv-error'});
						
		if (__this.validateApplication(formId)) {
			var data = form.serialize().replace(/%5B%5D/gi, '[]');
			
			jQuery.post(form.attr('action'), 
	    	{
	        	'action': form.attr('id').replace(/-/g, '_'),
	            'data': data
	        }, 
	        function(data) { 
	        	if (data.result) {
	        		message.html(__this.validatorMessages.success);
	        	} else {
	        		message.html(__this.validatorMessages.errorSend);
	        	}
	        	__this.cleanUp(form);
	        }, 
	        'json');
			
			
		} else {
			message.html( __this.validatorMessages.error);
		}
		
		
		if(messageCnt.size() > 0){
			messageCnt.append(message);	
		}else{
			form.before(message);
		}
		
		
		return false;
    }
}
