Contact_Form = function () {
	var config = {};

	config = {errorMsgs: {required: '(Bitte Feld ausfüllen!)',email: '(Ihre Email ist nicht korrekt!)',phone: 'Example: 111-222-3333.',lengthInput: '50 or fewer characters for this field.',lengthText: '5000 or fewer characters for this field.',ruHuman: 'Incorrect single digit number'		},
		ruHuman: {	answer: '4'	},
		fades: {validation: 200},
		valClasses: { requiredField: 'REQUIRED',emailField: 'EMAIL',phoneField: 'PHONE',charLengthInput: 'LENGTH_INPUT',charLengthText: 'LENGTH_TEXT',optionalField: 'OPTIONAL',ruHumanField:'RU_HUMAN'},
		formClasses: { validateOnly: 'VALIDATE',disable: 'DISABLE',choose: 'CHOOSE'},
		cssSelectors: {validationPass: 'PASS',validationFail: 'FAIL' },
		regExps: { email: /^\w+([\.\-]?\w+)*@\w+([\.\-]?\w+)*(\.\w{2,3})+$/,phone: /^\(?(\d{3})\)?[\.\-\/ ]?(\d{3})[\.\-\/ ]?(\d{4})$/},
		charLimit: {input: 90,	textArea: 5000}
	};
	function appendSpan(allFields) {$.each(allFields, function (i, field) {	/*$('<span></span>').insertAfter(this);*/	$('<span></span>').insertAfter($('label[for="'+this.id+'"]') );		});}
	function hasClassArray_maker(currentField, formLevel) {
		var hasClassArray = [],
			Classes = config.valClasses,
			j = 0;
		if (formLevel) {
			Classes = config.formClasses;
		}
		$.each(Classes, function (k, currentClass) {
			if ($(currentField).hasClass(currentClass)) {
				hasClassArray[j] = currentClass;
				j = j + 1;
			}
		});
		return hasClassArray;
	}
	function fieldProperty_maker(currentField) {
		var valTypes = config.valClasses,
			fieldProperties = {};
		$.each(valTypes, function (l, currentType) {
			fieldProperties[l] = false;
		});
		return fieldProperties;
	}
	function calcFieldProperties(fieldProperties, hasClassArray) {
		$.each(hasClassArray, function (m, currentClass) {
			switch (currentClass) {
			case config.valClasses.emailField:
				fieldProperties.emailField = true;
				break;
			case config.valClasses.requiredField:
				fieldProperties.requiredField = true;
				break;
			case config.valClasses.phoneField:
				fieldProperties.phoneField = true;
				break;
			case config.valClasses.charLengthInput:
				fieldProperties.charLengthInput = true;
				break;
			case config.valClasses.charLengthText:
				fieldProperties.charLengthText = true;
				break;
			case config.valClasses.ruHumanField:
				fieldProperties.ruHumanField = true;
			default:
				break;
		    }
	    });
	    return fieldProperties;
	}
	function boolObjDecoder(boolObj, retFalseIf) {
		var x = 0;
		$.each(boolObj, function (p, currentBool) {
			var booleanKeepGoing;
			if (currentBool === retFalseIf) {
				x = 1;
				booleanKeepGoing = false;
			}
		});
		if (x === 1) {
			return false;
		}
		return true;
	}


	function requiredValidator(currentField, input) {
		var thisError = config.errorMsgs.required,
			hasReqErr = false;
		if (input === '') {

			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			//$(currentField).next().removeClass(config.cssSelectors.validationPass);
			//$(currentField).next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasReqErr = true;
		}
		return hasReqErr;
	}
	function emailValidator(currentField, input) {
		var thisError = config.errorMsgs.email,
			hasEmailErr = false,
			reEmail = config.regExps.email;
		if (!reEmail.test(input)) {
			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasEmailErr = true;
		}
		return hasEmailErr;
	}
	function phoneValidator(currentField, input) {
		var thisError = config.errorMsgs.phone,
			hasPhoneErr = false,
			rePhone = config.regExps.phone;
		if (!rePhone.test(input)) {
			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasPhoneErr = true;
		}
		return hasPhoneErr;
	}
	function inputLengthValidator(currentField, input) {
		var thisError = config.errorMsgs.lengthInput,
			hasInputLengthErr = false;
		if (input.length > config.charLimit.input) {
			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasInputLengthErr = true;
		}
		return hasInputLengthErr;
	}
	function textLengthValidator(currentField, input) {
		var thisError = config.errorMsgs.lengthText,
			hasTextLengthErr = false;
		if (input.length > config.charLimit.textArea) {
			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasTextLengthErr = true;
		}
		return hasTextLengthErr;
	}
	function ruHumanValidator (currentField, input){
		var thisError = config.errorMsgs.ruHuman,
			hasRuHumanErr = false;
		if(input !== config.ruHuman.answer){
			$('label[for="'+currentField.id+'"]').next().removeClass(config.cssSelectors.validationPass);
			$('label[for="'+currentField.id+'"]').next().hide().addClass(config.cssSelectors.validationFail).text(thisError).fadeIn(config.fades.validation);
			hasRuHumanErr = true;
		}
		return hasRuHumanErr;
	}
	function fieldValidator(fieldProperties, input, currentField) {
		var errorObject = {};
		errorObject = {
			requiredError: false,
			emailError: false,
			phoneError: false,
			inputLengthError: false,
			textLengthError: false,
			ruHumanError: false
		};
		if (fieldProperties.requiredField) {errorObject.requiredError = requiredValidator(currentField, input);if (errorObject.requiredError) {return errorObject;}	}
		if (fieldProperties.emailField) {
			errorObject.emailError = emailValidator(currentField, input);
			if (errorObject.emailError) {
				return errorObject;
			}
		}
		if (fieldProperties.phoneField) {
			errorObject.phoneError = phoneValidator(currentField, input);
			if (errorObject.phoneError) {
				return errorObject;
			}
		}
		if (fieldProperties.charLengthInput) {
			errorObject.inputLengthError = inputLengthValidator(currentField, input);
			if (errorObject.inputLengthError) {
				return errorObject;
			}
		}
		if (fieldProperties.charLengthText) {
			errorObject.textLengthError = textLengthValidator(currentField, input);
			if (errorObject.textLengthError) {
				return errorObject;
			}
		}
		if (fieldProperties.ruHumanField) {
			errorObject.ruHumanError = ruHumanValidator(currentField, input);
			if (errorObject.ruHumanError) {
				return errorObject;
			}
		}
		return errorObject;
	}
	function greenChecker(currentField) {
		$('label[for="'+currentField.id+'"]').next().removeClass('FAIL');
		if ($('label[for="'+currentField.id+'"]').next().hasClass("PASS")) {
			return;
		}
		$('label[for="'+currentField.id+'"]').next().hide().addClass("PASS").text('').fadeIn(config.fades.validation);
	}


	function validate_onBlur(formID, allInputs) {
		$(allInputs).blur(function () {
			var allValClasses = {},
				currentField = this,
  				input = $(currentField).val(),
  				blankOptInput = false,
				hasClassArray = [],
				fieldProperties = {},
				validationTracker = {},
				validationResults = true;
			allValClasses = config.valClasses;
			hasClassArray = hasClassArray_maker(currentField);
			fieldProperties = fieldProperty_maker(currentField);
			if (input === '' && $(currentField).hasClass(config.valClasses.optionalField)) {
				blankOptInput = true;
			}
			if (hasClassArray.length !== 0) {
				fieldProperties = calcFieldProperties(fieldProperties, hasClassArray);
				if (!blankOptInput) {
					validationTracker = fieldValidator(fieldProperties, input, currentField);
				}
				validationResults = boolObjDecoder(validationTracker, true);
			}
			if (validationResults) {
				greenChecker(currentField);
			}
		});
	}
	function validate_onSubmit(formID, allFields) {
		$("" + formID + "").submit(function () {
			var allValClasses = {},
		   		allGood = [],
				formValid = false;
			allValClasses = config.valClasses;
			$.each(allFields, function (r, currentField) {
				var	input = $(currentField).val(),
  					blankOptInput = false,
					hasClassArray = [],
					fieldProperties = {},
					validationTracker = {},
					validationResults = true;
				allGood[r] = false;
				hasClassArray = hasClassArray_maker(currentField);
				fieldProperties = fieldProperty_maker(currentField);
				if (input === '' && $(currentField).hasClass(config.valClasses.optionalField)) {
					blankOptInput = true;
				}
				if (hasClassArray.length !== 0) {
					fieldProperties = calcFieldProperties(fieldProperties, hasClassArray);
					if (!blankOptInput) {
						validationTracker = fieldValidator(fieldProperties, input, currentField);
					}
					validationResults = boolObjDecoder(validationTracker, true);
				}
				if (validationResults) {
					allGood[r] = true;
					greenChecker(currentField);
				}
			});
			formValid = boolObjDecoder(allGood, false);
			if (formValid) {
								return true;

			}
			return false;
		});

	}


	function chooseID(formID) {
		var allFields;
		if (formID) {
			formID = '#' + formID;
		} else {
			formID = "form";
		}
		allFields = $('' + formID + ' :input:not(:submit):not(:button):not(:image)');
		if ($(formID).hasClass(config.formClasses.validateOnly)) {
			validate_onBlur(formID, allFields);
			validate_onSubmit(formID, allFields);
			return;
		}
	}
	function init() {
		var formID = "#contactform2",
			allFields = $('' + formID + ' :input:not(:submit):not(:button):not(:image)');
		appendSpan(allFields);
		if ($(formID).hasClass(config.formClasses.disable)) {
			return;
		} else if ($(formID).hasClass(config.formClasses.choose)) {
			return;
		} else if ($(formID).hasClass(config.formClasses.validateOnly)) {
			validate_onBlur(formID, allFields);
			validate_onSubmit(formID, allFields);
			return;
		}
	}
	return {
		CustomMessages: config.errorMsgs,
		CustomFades: config.fades,
		CustomCharLimits: config.charLimit,
		Go: init,
		ByID: chooseID
	};

}();

$(function () {
	Contact_Form.Go();
});

