(function() {
	window.SB = {
		Validator:{
			/**
			 *  The validation function for validating an Email address
			 *  Param: value - The value to be validated
			 */
			isValidEmail:function(value) {
				return value.match(/^([\w-\.]+)@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|\d{1,3})(\]?)$/);
			},
			/**
			 *  The validation function for validating a Phone number
			 *  Param: value - The value to be validated
			 */
			isValidPhoneNumber:function(value) {
				if(!new RegExp('^[0-9]{10}$', '').test(value)) {
					return false;
				}

				if (value.length != 10) {
					return false;
				}

				return true;
			},
			isValidPostalCode:function(value) {
				if(!new RegExp('^[0-9]{5}$', '').test(value) && !new RegExp('^[0-9]{9}$', '').test(value)) {
					return false;
				}

				return true;
			},
			isValidPostalCode5:function(value) {
				if(!new RegExp('^[0-9]{5}$', '').test(value)) {
					return false;
				}

				return true;
			},
			isValidBirthdate:function(value) {
				if(!new RegExp('^[0-9]{8}$', '').test(value)) {
					return false;
				}

				return true;
			},
			getNumbersFromString:function(value) {
				var newValue = '';

				for (var i = 0 ; i < value.length ; i++) {
					var c = value.charAt(i);

					if (!isNaN(c) && c != ' ') {
						newValue += c;
					}
				}

				return newValue;
			},
			showError:function(obj) {
				obj.addClass('error');
				var data = obj.data('info');
				if (data) {
					$('.' + data.id + '_status').html('<img src="/images/icons/cancel.png" />');
				}
			},
			hideError:function(obj) {
				obj.removeClass('error');
				var data = obj.data('info');
				if (data) {
					$('.' + data.id + '_status').html('<img src="/images/icons/accept.png" />');
				}
			},
			setupValidateOnBlur:function(config, form) {
				if (config[form]) {
					for (var i = 0 ; i < config[form].length ; i++) {
						var temp = $('#' + config[form][i].id);
						temp.data('info', config[form][i]);
						temp.blur(function() {
							var input = $(this), value = '', data = input.data('info');
							if (data.required) {
								if (input.val() == '') {
									SB.Validator.showError(input);
									return;
								}
							}

							if (input.val() == '') {
								SB.Validator.hideError(input);
								return;
							}

							switch (data.type.toLowerCase()) {
								case 'email':
									if (!SB.Validator.isValidEmail(input.val())) {
										SB.Validator.showError(input);
										return;
									}
									break;
								case "phone":
									value = SB.Validator.getNumbersFromString(input.val());

									if (SB.Validator.isValidPhoneNumber(value)) {
										value = '(' + value.toString().slice(0, 3) + ') ' + value.toString().slice(3, 6) + '-' + value.toString().slice(6, 10);
									} else {
										SB.Validator.showError(input);
										return;
									}

									input.val(value);
									break;
								case "postalcode":
									value = SB.Validator.getNumbersFromString(input.val());

									if (SB.Validator.isValidPostalCode(value)) {
										if (value.length == 9) {
											value = value.toString().slice(0, 5) + '-' + value.toString().slice(5, 9);
										}
									} else {
										SB.Validator.showError(input);
										return;
									}

									input.val(value);
									break;
								case "postalcode5":
									value = SB.Validator.getNumbersFromString(input.val());

									if (SB.Validator.isValidPostalCode5(value)) {
										if (value.length == 9) {
											value = value.toString().slice(0, 5);
										}
									} else {
										SB.Validator.showError(input);
										return;
									}

									input.val(value);
									break;
								case "birthdate":
									value = SB.Validator.getNumbersFromString(input.val());

									if (SB.Validator.isValidBirthdate(value)) {
										value = value.toString().slice(0, 4) + '-' + value.toString().slice(4, 6) + '-' + value.toString().slice(6, 8);
									} else {
										SB.Validator.showError(input);
										return;
									}

									input.val(value);
									break;
								case "number":
									value = SB.Validator.getNumbersFromString(input.val());

									if (isNaN(parseFloat(value))) {
										SB.Validator.showError(input);
										return;
									} else {
										value = parseInt(value);
										SB.Validator.hideError(input);
									}

									input.val(value);
									break;
								default:
									break;
							}

							for (var v in data.vars) {
								switch(v) {
									case 'minLength':
										if (!(input.val().length >= data.vars[v])) {
											SB.Validator.showError(input);
											return;
										}
										break;
								case 'minValue':
									if (!(input.val() >= data.vars[v])) {
										SB.Validator.showError(input);
										return;
									}
									break;
								case 'maxValue':
									if (!(input.val() <= data.vars[v])) {
										SB.Validator.showError(input);
										return;
									}
									break;
									default:
										break;
								}
							}

							SB.Validator.hideError(input);
						});
					}
				}

				return true;
			},
			validate:function(config, form) {
				if (config[form]) {
					var inputs = config[form], valid = true, value = '';
					for (var i = 0 ; i < inputs.length ; i++) {
						var input = $('#' + inputs[i].id);
						if (inputs[i].required) {
							if (input.val() == '') {
								SB.Validator.showError(input);
								valid = false;
								continue;
							} else {
								SB.Validator.hideError(input);
							}
						}

						if (input.val() == '') {
							SB.Validator.hideError(input);
							continue;
						}

						switch (inputs[i].type.toLowerCase()) {
							case 'email':
								if (!SB.Validator.isValidEmail(input.val())) {
									SB.Validator.showError(input);
									valid = false;
									continue;
								} else {
									SB.Validator.hideError(input);
								}
								break;
							case "phone":
								value = SB.Validator.getNumbersFromString(input.val());

								if (SB.Validator.isValidPhoneNumber(value)) {
									value = '(' + value.toString().slice(0, 3) + ') ' + value.toString().slice(3, 6) + '-' + value.toString().slice(6, 10);
									SB.Validator.hideError(input);
								} else {
									SB.Validator.showError(input);
									valid = false;
									continue;
								}

								input.val(value);
								break;
							case "postalcode":
								value = SB.Validator.getNumbersFromString(input.val());

								if (SB.Validator.isValidPostalCode(value)) {
									if (value.length == 9) {
										value = value.toString().slice(0, 5) + '-' + value.toString().slice(5, 9);
									}
									SB.Validator.hideError(input);
								} else {
									SB.Validator.showError(input);
									valid = false;
									continue;
								}

								input.val(value);
								break;
							case "number":
								value = SB.Validator.getNumbersFromString(input.val());

								if (isNaN(parseFloat(value))) {
									SB.Validator.showError(input);
									valid = false;
									continue;
								} else {
									value = parseInt(value);
									SB.Validator.hideError(input);
								}

								input.val(value);
								break;
							default:
								SB.Validator.hideError(input);
								break;
						}

						for (var v in inputs[i].vars) {
							if (!valid) {
								break;
							}

							switch(v) {
								case 'minLength':
									if (!(input.val().length >= inputs[i].vars[v])) {
										SB.Validator.showError(input);
										valid = false;
										continue;
									}
									break;
								case 'minValue':
									if (!(input.val() >= inputs[i].vars[v])) {
										SB.Validator.showError(input);
										valid = false;
										continue;
									}
									break;
								case 'maxValue':
									if (!(input.val() <= inputs[i].vars[v])) {
										SB.Validator.showError(input);
										valid = false;
										continue;
									}
									break;
								default:
									break;
							}
						}

						if (valid) {
							SB.Validator.hideError(input);
						}
					}

					return valid;
				}

				return true;
			}
		}
	};
})();