/**
 * @desc Entfernt die htmlTags aus einem string, analog strip_tags in php ...
 *       ... kopiert von http://phpjs.org/functions/strip_tags:535
 * 
 * @param input
 * @param allowed
 * @return
 */
function strip_tags(input, allowed) {
	allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || [])
			.join(''); // making sure the allowed arg is a string containing
						// only tags in lowercase (<a><b><c>)
	var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
	return input.replace(commentsAndPhpTags, '').replace(
			tags,
			function($0, $1) {
				return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0
						: '';
			});
}

function validateAndSave(validators) {
	var errors = new Array();

	while (validators.length > 0) {
		var validator = validators.shift();

		if (!validator.valid) {
			errors.push('- ' + validator.error);
		}
	}

	if (errors.length > 0) {
		errors.unshift('Bitte korrigieren Sie Ihre Eingabe(n):\n');
		alert(errors.join('\n'));

		return false;
	}
	/*
	 * if (saveStep) { window.document.form.step.value = saveStep; }
	 */
	return true;
}

/**
 * Vorlage fuer einen neuen Validator
 * 
 * @param name
 * @param description
 * @return
 */
function skeletonValidator(name, description) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	/*
	 * Hier wird geprueft. Im Fehlerfall wird this.error gesetzt und
	 * anschliessend returniert !
	 */

	this.valid = true;
}

function requiredValidator(name, description) {
	this.valid = false;
	this.error = '';

	var isRadioOrCheckbox = false;
	var checked = false;

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	for ( var pos = 0; pos < elements.length; pos++) {
		this.element = elements[pos];

		if (this.element.type == 'radio' || this.element.type == 'checkbox') {
			isRadioOrCheckbox = true;
			if (this.element.checked) {
				checked = true;
			}
		} else if (strip_tags(this.element.value) == '') {
			this.error = '"' + description + '" ist ein Pflichtfeld!';
			return;
		}
	}

	if (isRadioOrCheckbox && !checked) {
		this.error = '"' + description + '" ist ein Pflichtfeld!';
		return;
	}

	this.valid = true;
}

function intValidator(name, description, min, max) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	var int = parseInt(this.element.value);
	if (isNaN(int) || this.element.value.match(/^[0-9]*$/) == null) {
		this.error = 'Der Wert im Feld "' + description + '" muss eine Zahl '
				+ 'sein!';
		return;
	}

	if (min != null && int < min || max != null && int > max) {
		this.error = 'Der Wert im Feld "' + description + '" muss zwischen '
				+ min + ' und ' + max + ' liegen!';
		return;
	}

	this.valid = true;
}

function lengthValidator(name, description, min, max) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	var len = this.element.value.length;
	if (min != null && max != null) {
		if (len < min || len > max) {
			if (min == max) {
				this.error = 'Der Wert im Feld "' + description + '" muss '
						+ min + ' Stellen haben!';
			} else {
				this.error = 'Der Wert im Feld "' + description
						+ '" muss zwischen ' + min + ' und ' + max
						+ ' Stellen haben!';
			}

			return;
		}
	}

	this.valid = true;
}

function regexValidator(name, description, regexstr, modifier) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	var myRegex = new RegExp(regexstr, modifier);
	if (!myRegex.test(this.element.value)) {
		this.error = 'Der Wert im Feld "' + description + '" ist ungueltig!';
		return;
	}

	this.valid = true;
}

function defaultValueValidator(name, description, defaultValue) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	if (this.element.value == defaultValue) {
		this.error = 'Der Vorgabewert im Feld "' + description + '" muss '
				+ 'geändert werden!';
		return;
	}

	this.valid = true;
}

function ipValidator(name, description) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	var ip = this.element.value.split('.');
	if (ip.length != 4) {
		this.error = 'Der Wert im Feld "' + description + '" muss '
				+ 'eine IP-Adresse sein!';
		return;
	}

	for ( var i = 0; i < 4; i++) {
		var tmp = ip[i];

		if (tmp < 0 || tmp > 255) {
			this.error = 'Der Wert im Feld "' + description + '" muss '
					+ 'eine IP-Adresse sein!';
			return;
		}

		ip[i] = parseInt(tmp);
	}

	this.element.value = ip.join('.');

	this.valid = true;
}

function futureDateValidator(name, description) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	var tmp = this.element.value.split('.');
	if (tmp.length != 3) {
		this.error = 'Der Wert im Feld "' + description + '" muss '
				+ 'ein Datum nach dem Format TT.MM.JJJJ sein!';
		return;
	}

	var date = new Date(tmp[2], parseInt(tmp[1]) - 1, tmp[0]);
	var now = new Date();

	if (date.getTime() < now.getTime()) {
		this.error = 'Das Datum im Feld "' + description + '" muss '
				+ 'in der Zukunft liegen!';
		return;
	}

	this.valid = true;
}

function chefValidator(name, description) {
	this.valid = false;
	this.error = '';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.elements = elements[0];

	if (this.element.checked) {
		this.error = 'Netter Versuch. Die Rolle Abteilungsleitung darf nur '
				+ 'vom Chef gesetzt werden!';
		return;
	}

	this.valid = true;
}

function emailValidator(name, description) {
	this.valid = false;
	this.error = '';

	var regex = /^[a-z0-9\.]+@fiducia.de$/i;

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	if (!this.element.value.match(regex)) {
		this.error = 'Der Wert im Feld "' + description + '" muss eine '
				+ 'eMail-Adresse sein!';
		return;
	}

	this.valid = true;
}

function noGermanValidator(name, description) {
	this.valid = false;
	this.error = '';
	var regex = '[äÄöÖüÜ\\s,;.:*+!\(%$§"&)=`´#\'><ß?_\-]';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	if (this.element.value.match(regex)) {
		this.error = 'Der Wert im Feld "'
				+ description
				+ '" darf keine Umlaute, Sonderzeichen oder Leerzeichen enhalten!';
		return;
	}

	this.valid = true;
}

function fileNameValidator(name, description) {
	this.valid = false;
	this.error = '';
	var regex = '[äÄöÖüÜ\\s,;:*+!\(%$§"&)=`´#\'><ß\?]';

	elements = document.getElementsByName(name);
	if (!elements) {
		this.error = 'Das Feld "' + description + '" kann nicht geprueft '
				+ 'werden, bitte wenden Sie sich an den Seitenadministrator!';
		return;
	}

	this.element = elements[0];

	if (this.element.value.match(regex)) {
		this.error = 'Der Wert im Feld "'
				+ description
				+ '" darf keine Umlaute, Sonderzeichen oder Leerzeichen enhalten!';
		return;
	}

	this.valid = true;
}

function checkEmailValidator(name, description) {
	this.valid = false;
	this.error = '';
	element = document.getElementsByName(name)[0];
	email = element.value;

	AtPos = email.indexOf("@")
	StopPos = email.lastIndexOf(".")

	if (email == "") {
		this.error = 'Das Feld "' + description + '" darf nicht leer sein!';
		return;
	}

	if (AtPos == -1 || StopPos == -1) {
		this.error = 'Der Wert des Feldes "' + description + '" ist ungültig!';
		return;
	}

	if (StopPos < AtPos) {
		this.error = 'Der Wert des Feldes "' + description + '" ist ungültig!';
		return;
	}

	if (StopPos - AtPos == 1) {
		this.error = 'Der Wert des Feldes "' + description + '" ist ungültig!';
		return;
	}

	this.valid = true;
}

function checkSelectElement(name, description) {
	this.valid = false;
	this.error = '';

	element = document.getElementsByName(name)[0];
	string = element.value;
	if (string == 0) {
		this.error = '"' + description + '" - keine Auswahl getroffen!';
		return;
	}
	this.valid = true;
}
