/* TODO: multiple checkboxes check from tele2 */

/*
	To add new validation function:
	- add if statement in selectValidation function (replace example####)
				// example####
				if (validateResult == true && $(wrapperEl).hasClass('validate-example####')) {
					validateResult = this.validateExample####(wrapperEl, fieldValue);
				}
	- add validation function in section (/** VALIDATION FUNCTIONS ) (replace example#### and #### regular expression ####)
				validateExample####: function(wrapperEl, fieldValue) {
					var regExpress = /#### regular expression ####/;
					
					if (regExpress.test(fieldValue) == false) {
						formValidation.setError(wrapperEl, fieldValue, 'error-example####');
						return false;
					} else {
						return true;
					}
					
					
				}
	
	To activate form validation on submit:
	- add this in initfunction...
				if($('form#id').length > 0) {
					formValidation.validateFormInit($('form#id')); 
				} 

	In HTML: add classes validate, validate-(validationname) to fItem wrapper
			 just required: add classes validate, required
			 required and false: add class false-required)

			 add errormessages in fItem wrapper as:
			 <span class="error error-example####">error message here</span>
			 example#### = same as validate-example#### class on wrapper.

	
	**********

	!! NOTE: kruidvat mobiel uses class 'error' in stead of 'false'
				and class 'error-message' for error message spans.
	**********

*/


var formValidation = {
	submitVal: false,

	init: function(){
		if($('input').length > 0) { 
			$('input').focus(function() {
				formValidation.removeDefaultValue($(this));
			});
			$('input').blur(function() {
				formValidation.addDefaultValue($(this));
			});
		}
		if($('.validate').length > 0) { 
			$('.validate input').focus(function() {
				$(this).parent().addClass('busy');
			});
			$('.validate input').blur(function() {
				formValidation.blurValidation($(this));
			});

			$('.validate textarea').focus(function() {
				$(this).parent().addClass('busy');
			});
			$('.validate textarea').blur(function() {
				formValidation.blurValidation($(this));
			});
			$('.validate select').focus(function() {
				$(this).parent().addClass('busy');
			});
			$('.validate select').blur(function() {
				formValidation.blurValidation($(this));
			});
		}

	},

	validateFormInit: function(form) { 
		// activate form validation on submit
		$(form).submit(function(){ 
			return formValidation.submitValidation($(this)); // Prevent the normal submission action
		});
		
	},

	blurValidation: function(formEl) {
		var wrapperEl = $(formEl).parentFindRecursive('.fItem');
		var fieldValue =  $(formEl).val();

		if ($(formEl).attr('type') == 'checkbox' || $(formEl).attr('type') == 'radio') {
			wrapperEl = $(formEl).parentFindRecursive('.fItem');
		}

		if ($(formEl).attr('type') == 'checkbox') { /* TODO: multiple checkboxes check from tele2 */
			if ($(this).attr('checked') == 1) {
                fieldValue = '1';
            } else { fieldValue = ''; }

		} else if ($(formEl).attr('type') == 'radio') {

			if ( $(wrapperEl).find('input[name='+$(formEl).attr('name')+'][checked]').val() == undefined) {
				fieldValue = '';
			} else { fieldValue = '1'; }
            
        }

		// check if there is a default label value, check if this value is the value of the input field. If so, don't check the validation
		var defaultLabelExists = $(wrapperEl).find('.defaultLabel').length;
		var defaultLabelValue  = $(wrapperEl).find('.defaultLabel').val();

		var validateResult = true;

		// if validation untill now is OK
		// required field with no default label, the fieldvalue is empty
		// perform required validation
		if (validateResult == true && (defaultLabelExists == 0 && fieldValue == '' && $(wrapperEl).hasClass('required'))) {
			validateResult = formValidation.validateRequired(wrapperEl, fieldValue);
		}
		
		// if validation untill now is OK
		// required field with default label, the fieldvalue id the default value (so the field is empty) or the fieldvalue is empty
		// perform required validation
		if (validateResult == true && (( defaultLabelExists > 0 && (defaultLabelValue == fieldValue || fieldValue == '') ) 
					&& $(wrapperEl).hasClass('required'))) {
			
			validateResult = formValidation.validateRequired(wrapperEl, fieldValue);
		} 

		// if validation untill now is OK
		// field with no default label OR field with default label but value != default label value
		// perform validation (all validationtypes exept required)
		if (validateResult == true && ( (defaultLabelExists == 0 && fieldValue != '') || (defaultLabelExists > 0 && (defaultLabelValue != fieldValue || fieldValue != '') ))) {
			validateResult = formValidation.selectValidation(wrapperEl, fieldValue);
		}


		
		// if validation untill now is OK, remove errormessages and apply class OK
		if (validateResult == true) {
			formValidation.removeError(wrapperEl);
			if (formValidation.submitVal == true) {
				return true;
			}
		} else if (validateResult != true && formValidation.submitVal == true) {
			return false;
		}

		// field has default value in it and is empty so can't be OK
		if (defaultLabelExists > 0 && defaultLabelValue == fieldValue && $(wrapperEl).hasClass('ok')) {
			$(wrapperEl).removeClass('ok');
		}

		$(wrapperEl).removeClass('busy');

		
	},

	submitValidation: function(form) {
		formValidation.submitVal = true;
		
		var submitValidationResult = new Array();

		$(form).find('.validate input').each(function() {
			if ($(this).attr('type') != 'hidden' && $(this).attr('type') != 'submit') {  
				submitValidationResult.push(formValidation.blurValidation($(this)));
			}
		});
		$(form).find('.validate select').each(function() {
			submitValidationResult.push(formValidation.blurValidation($(this)));
		});
		$(form).find('.validate textarea').each(function() {
			submitValidationResult.push(formValidation.blurValidation($(this)));
		});

		formValidation.submitVal = false;

		if ( $.inArray(false, submitValidationResult) > -1) {
			if($('form#fUsabRegister').length > 0 && $('form#fUsabRegister .validateError').length < 1) {
				$('form#fUsabRegister .iSubmit').before('<p class="validateError">Niet alle velden zijn correct ingevuld. <br />Controleer de invoervelden.</p>');
			}

			return false;
		} else {
			return true;
		}

	},

	selectValidation: function(wrapperEl, fieldValue) {
		var validateResult = true;
		
		// email
		if (validateResult == true && $(wrapperEl).hasClass('validate-email')) {
			validateResult = this.validateEmail(wrapperEl, fieldValue);
		}
		
		// name
		if (validateResult == true && $(wrapperEl).hasClass('validate-name')) {
			validateResult = this.validateName(wrapperEl, fieldValue);
		}

		// comment
		if (validateResult == true && $(wrapperEl).hasClass('validate-comment')) {
			validateResult = this.validateComment(wrapperEl, fieldValue);
		}

		// number
		if (validateResult == true && $(wrapperEl).hasClass('validate-number')) {
			validateResult = this.validateNumber(wrapperEl, fieldValue);
		}

		// number-kvk
		if (validateResult == true && $(wrapperEl).hasClass('validate-number-kvk')) {
			validateResult = this.validateNumberKvk(wrapperEl, fieldValue);
		}

		// password
		if (validateResult == true && $(wrapperEl).hasClass('validate-password')) {
			validateResult = this.validatePassword(wrapperEl, fieldValue);
		}

		// phonenumber
		if (validateResult == true && $(wrapperEl).hasClass('validate-phonenumber')) {
			validateResult = this.validatePhonenumber(wrapperEl, fieldValue);
		}

		// phonenumber-nl
		if (validateResult == true && $(wrapperEl).hasClass('validate-phonenumber-nl')) {
			validateResult = this.validatePhonenumberNl(wrapperEl, fieldValue);
		}

		// url
		if (validateResult == true && $(wrapperEl).hasClass('validate-url')) {
			validateResult = this.validateUrl(wrapperEl, fieldValue);
		}

		// zipcode-nl
		if (validateResult == true && $(wrapperEl).hasClass('validate-zipcode-nl')) {
			validateResult = this.validateZipcodeNl(wrapperEl, fieldValue);
		}

		return validateResult;
		
	},


	/** DEFAULT LABEL VALUES */
		removeDefaultValue: function(inputEl) {
			if($(inputEl).parent().find('.defaultLabel').length > 0) {
				var defaultVal = $(inputEl).parent().find('.defaultLabel').val();
				if($(inputEl).val() == defaultVal) {
					$(inputEl).val('');
				}
			}
		},

		addDefaultValue: function(inputEl) {
			if($(inputEl).parent().find('.defaultLabel').length > 0) {
				var defaultVal = $(inputEl).parent().find('.defaultLabel').val();
				if($(inputEl).val() == '') {
					$(inputEl).val(defaultVal);
				}
			}
		},


	/** ERROR HANDELING */
		//remove errormessages that are shown, show error and add class false
		setError: function(wrapperEl, fieldValue, showError) {
			$(wrapperEl).find('.show-error').removeClass('show-error');
			$(wrapperEl).removeClass('ok').addClass('error').find('.'+showError).addClass('show-error');
			
			// add class false-required to display red required icon without chaining in css...
			if ($(wrapperEl).hasClass('required')) {
				$(wrapperEl).addClass('false-required');
			}
			
		},

		//remove errormessages and remove class false, add class OK
		removeError: function(wrapperEl) {
			$(wrapperEl).removeClass('error').removeClass('busy').removeClass('false-required').addClass('ok').find('.error-message').removeClass('show-error');
		},


	/** VALIDATION FUNCTIONS */
		validateRequired: function(wrapperEl, fieldValue) {

			var defaultLabelExists = $(wrapperEl).find('.defaultLabel').length;
			var defaultLabelValue  = $(wrapperEl).find('.defaultLabel').val();

			if (fieldValue == '' || ( defaultLabelExists > 0 && defaultLabelValue == fieldValue )) {
				formValidation.setError(wrapperEl, fieldValue, 'error-required');
				return false;
			} else {
				return true;
			}
			
		},

		validateName: function(wrapperEl, fieldValue) {
			var regExpress = /^([a-zA-Z'`/\- \u00c0-\u0233]){2,746}$/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-name');
				return false;
			} else {
				return true;
			}
		},

		validateEmail: function(wrapperEl, fieldValue) {
			var regExpress = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-email');
				return false;
			} else {
				return true;
			}
			
		},

		validateComment: function(wrapperEl, fieldValue) {
			/*var regExpress = //;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-comment');
				return false;
			} else {
				return true;
			}
			*/
			
		},

		validateNumber: function(wrapperEl, fieldValue) {
			var regExpress = /^[0-9]+$/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-number');
				return false;
			} else {
				return true;
			}
			
			
		},

		validateNumberKvk: function(wrapperEl, fieldValue) {
			var regExpress = /^[0-9]{8}$/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-number-kvk');
				return false;
			} else {
				return true;
			}
			
			
		},

		validatePassword: function(wrapperEl, fieldValue) {
			/*var regExpress = //;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-password');
				return false;
			} else {
				return true;
			}
			*/
			
		},

		validatePhonenumber: function(wrapperEl, fieldValue) {
			/*var regExpress = //;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-phonenumber');
				return false;
			} else {
				return true;
			}
			*/
			
		},
		
		validatePhonenumberNl: function(wrapperEl, fieldValue) {
			var regExpress = /^((\s|[\.\-\+\(\)\[\]])*[0-9]){9,20}$/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-phonenumber-nl');
				return false;
			} else {
				return true;
			}
			/**/
			
		},

		validateUrl: function(wrapperEl, fieldValue) {
			var regExpress = /((http|https):\/\/)?[a-zA-Z0-9\-\.]*[a-zA-Z][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]\.[a-zA-Z]{2,6}(\/.*)?/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-url');
				return false;
			} else {
				return true;
			}
			
			
		},

		validateZipcodeNl: function(wrapperEl, fieldValue) {
			var regExpress = /^[1-9][0-9]{3}[ -]?[a-zA-Z]{2}$/;
			
			if (regExpress.test(fieldValue) == false) {
				formValidation.setError(wrapperEl, fieldValue, 'error-zipcode-nl');
				return false;
			} else {
				return true;
			}
			
			
		}

		
	
}
