// (c) 2007 VIZUS.CZ s.r.o.
// Updated: 30.7.2008 21:04:15

function Validators()
{
	// validni a invalidni barva
	this.validInputColor = '#0000ff';
	this.invalidInputColor = '#ff0000';

	// nastavuje barvu inputu podle splneni podminek
	this.setInputColor = function(input, isValid)
	{
		input.style.color = isValid ? this.validInputColor : this.invalidInputColor;
	}

	// KONTROLA TEXTU
	// =========================================================================
	this.text = {parent: this};

	// validni text
	this.text.validRegExp = /^(\S+|\S.+\S)$/;

	// obarvuje validitu
	// onkeyup="Validators.text.validate(this)"
	this.text.validate = function(input, minLength, regexp)
	{
		this.parent.setInputColor(input, this.isValid(input, minLength, regexp));
	}

	// formatuje text
	// onblur="Validators.text.finish(this)"
	this.text.finish = function(input, minLength, regexp)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input, minLength, regexp);
	}

	// kontroluje validity textu
	// if (!Validators.text.isValid(elm))
	this.text.isValid = function(input, minLength, regexp)
	{
		if (typeof(regexp) != 'object' || regexp.constructor != RegExp)
			regexp = this.validRegExp;

		var value = input.value.toString();

		return value.match(regexp) != null && (isNaN(minLength) || value.length >= minLength);
	}

	// KONTROLA TELEFONU
	// =========================================================================
	this.phone = {parent: this};

	// validni telefon, 1234 az 123456789, 123 456 789, +420 12345..., +420 123 456...
	this.phone.validRegExp = /^\d{4,9}$|^\d{3} \d{3} \d{3}$|^\+[1-9]\d{0,2} \d+$|^\+[1-9]\d{0,2}( \d{3})+$/;

	// obarvuje validitu
	// onkeyup="Validators.phone.validate(this)"
	this.phone.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje telefon na +420 123 456 789
	// onblur="Validators.phone.finish(this)"
	this.phone.finish = function(input)
	{
		input.value = input.value.toString().replace(/^(\+\d+)/, '$1_').replace(/\s+/g, '').replace(/(\d{3})/g, '$1_').replace(/_+/g, ' ').replace(/ +$/g, '').replace(/^(\d+)/, '+420 $1');
		this.validate(input);
	}

	// kontroluje validity telefonu
	// if (!Validators.phone.isValid(elm))
	this.phone.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA PSC
	// =========================================================================
	this.psc = {parent: this};

	// validni PSC
	this.psc.validRegExp = /^\d{5}$|^\d{3} \d{2}$/;

	// obarvuje validitu
	// onkeyup="Validators.psc.validate(this)"
	this.psc.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje PSC na 123 45
	// onblur="Validators.psc.finish(this)"
	this.psc.finish = function(input)
	{
		input.value = input.value.toString().replace(/\s+/g, '').replace(/^(\d{3})(\d{2})$/, '$1 $2');
		this.validate(input);
	}

	// kontroluje validity PSC
	// if (!Validators.psc.isValid(elm))
	this.psc.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA IP
	// =========================================================================
	this.ip = {parent: this};

	// validni IP
	this.ip.validRegExp = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;

	// obarvuje validitu
	// onkeyup="Validators.ip.validate(this)"
	this.ip.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje IP
	// onblur="Validators.ip.finish(this)"
	this.ip.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// kontroluje validity IP
	// if (!Validators.ip.isValid(elm))
	this.ip.isValid = function(input)
	{
		if (input.value.toString().match(this.validRegExp) == null)
			return false;

		var a = parseInt(RegExp.$1);
		var b = parseInt(RegExp.$2);
		var c = parseInt(RegExp.$3);
		var d = parseInt(RegExp.$4);

		return a < 256 && b < 256 && c < 256 && d < 256;
	}

	// KONTROLA DOMENY
	// =========================================================================
	this.domain = {parent: this};

	// validni domena
	this.domain.validRegExp = /^([a-z0-9-]+\.)+[a-z]{2,}$/;
	this.domain.invalidRegExp = /^-|--|\.-|-\./;

	// obarvuje validitu
	// onkeyup="Validators.domain.validate(this)"
	this.domain.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje domenu
	// onblur="Validators.domain.finish(this)"
	this.domain.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// kontroluje validity domeny
	// if (!Validators.domain.isValid(elm))
	this.domain.isValid = function(input)
	{
		var value = input.value.toString();
		return value.match(this.validRegExp) != null && value.match(this.invalidRegExp) == null;
	}

	// KONTROLA CISLA
	// =========================================================================
	this.number = {parent: this};

	// onkeyup="Validators.number.validate(this, 0, true)"
	this.number.validate = function(input, decimals, negative, rangeFrom, rangeTo, multiplier)
	{
		this.parent.setInputColor(input, this.isValid(input, decimals, negative, rangeFrom, rangeTo, multiplier));
	}

	// formatuje cislo
	// onblur="Validators.number.finish(this)"
	this.number.finish = function(input, decimals, negative, rangeFrom, rangeTo, multiplier)
	{
		if (!this.isValid(input, decimals, negative, rangeFrom, rangeTo, multiplier))
			return;

		var number = parseFloat(input.value.toString().replace(/[^\d,\.-]/g, '').replace(/,/g, '.'));

		if (isNaN(number))
			return;

		input.value = numFormat(number, decimals, ',', ' ');
	}

	// vytvari cislo
	// onfocus="Validators.number.prepare(this)"
	this.number.prepare = function(input)
	{
		var number = input.value.toString().replace(/[^\d,\.-]/g, '').replace(/\./g, ',');
		if (number != input.value.toString())
		{
			input.value = number;
			input.select();
		}
	}

	// kontroluje validitu cisla
	// if (!Validators.number.isValid(elm, 1, true, -100, 100))
	this.number.isValid = function(input, decimals, negative, rangeFrom, rangeTo, multiplier)
	{
		var string = input.value.toString().replace(/,/g, '.').replace(/ /g, '');

		var regexp = '\\d+';
		if (!isNaN(decimals))
			regexp += '(\\.\\d{'+decimals+',}|)';
		if (negative)
			regexp = '-?'+regexp;

		regexp = new RegExp('^'+regexp+'$');

		if (string.match(regexp) == null)
			return false;

		var number = parseFloat(string);

		if (isNaN(number))
			return false;
		if (!isNaN(rangeFrom) && number < rangeFrom)
			return false;
		if (!isNaN(rangeTo) && number > rangeTo)
			return false;
		if (!isNaN(multiplier) && number % multiplier > 0)
			return false;

		return true;
	}

	// KONTROLA EMAILU
	// =========================================================================
	this.email = {parent: this};

	// validni mail
	this.email.validRegExp = /^[a-zA-Z0-9_\.-]{1,50}@([a-z0-9-]{1,63}\.){1,}[a-z]{2,}$/;

	// obarvuje validitu
	// onkeyup="Validators.email.validate(this)"
	this.email.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje email
	// onblur="Validators.email.finish(this)"
	this.email.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// kontroluje validity emailu
	// if (!Validators.email.isValid(elm))
	this.email.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA URL
	// =========================================================================
	this.url = {parent: this};

	// validni url
	this.url.validRegExp = /^([a-z0-9]+):\/\/(([a-z0-9-]+\.)+[a-z]{2,})(\/|\/.+|)$/;
	this.url.validSimpleRegExp = /^([a-z0-9-]+\.)+[a-z]{2,}(\/|\/.+|)$/;

	// obarvuje validitu
	// onkeyup="Validators.url.validate(this)"
	this.url.validate = function(input, protocol)
	{
		this.parent.setInputColor(input, this.isValid(input, protocol));
	}

	// formatuje url
	// onblur="Validators.url.finish(this)"
	this.url.finish = function(input, protocol)
	{
		if (protocol == undefined)
			protocol = 'http';

		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');

		if (input.value.toString().match(this.validSimpleRegExp) != null)
			input.value = protocol+'://'+input.value+(RegExp.$2.length == 0 ? '/' : '');

		this.validate(input, protocol);
	}

	// kontroluje validity url
	// if (!Validators.url.isValid(elm))
	this.url.isValid = function(input, protocol)
	{
		if (protocol == undefined)
			protocol = 'http';

		return (input.value.toString().match(this.validRegExp) != null && RegExp.$1 == protocol) || input.value.toString().match(this.validSimpleRegExp) != null;
	}

	// KONTROLA IDENTIFIKATORU
	// =========================================================================
	this.ident = {parent: this};

	// validni ident
	this.ident.validRegExp = /^[a-z][a-z0-9-]*[a-z0-9]$/;

	// obarvuje validitu
	// onkeyup="Validators.ident.validate(this)"
	this.ident.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje ident
	// onblur="Validators.ident.finish(this)"
	this.ident.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// vytvari ident
	// onfocus="Validators.ident.prepare(this, source)"
	this.ident.prepare = function(input, source, suffix)
	{
		if (input.value == '' && typeof(source) == 'object' && source.value != undefined && source.value != '')
		{
			input.value = toAscii(source.value.toString()).replace(/[^a-zA-Z0-9]+/g, '-').replace(/^-|-$/, '').toLowerCase()+(suffix != undefined ? suffix : '');
			input.select();
		}

		this.validate(input);
	}

	// kontroluje validity identu
	// if (!Validators.ident.isValid(elm))
	this.ident.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA INICIAL
	// =========================================================================
	this.initials = {parent: this};

	// validni inicialy
	this.initials.validRegExp = /^[A-Z]+$/;

	// obarvuje validitu
	// onkeyup="Validators.initials.validate(this)"
	this.initials.validate = function(input, number)
	{
		this.parent.setInputColor(input, this.isValid(input, number));
	}

	// formatuje inicialy
	// onblur="Validators.initials.finish(this)"
	this.initials.finish = function(input, number)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input, number);
	}

	// vytvari inicialy
	// onfocus="Validators.initials.prepare(this, source, 2)"
	this.initials.prepare = function(input, source, number)
	{
		if (isNaN(number))
			number = 2;

		if (input.value == '' && typeof(source) == 'object' && source.value != undefined)
		{
			var result = toAscii(source.value.toString().toUpperCase()).match(/\b[A-Z]/g);
			if (result != null)
			{
				var initials = new Array();
				for (var i = 0; i < number; i++)
				{
					if (result[i] != undefined)
						initials.push(result[i]);
				}
				input.value = initials.join('');
				input.select();
			}
		}

		this.validate(input, number);
	}

	// kontroluje validity inicial
	// if (!Validators.initials.isValid(elm))
	this.initials.isValid = function(input, number)
	{
		if (isNaN(number))
			number = 2;

		return input.value.toString().match(this.validRegExp) != null && input.value.length == number;
	}

	// KONTROLA IC
	// =========================================================================
	this.ic = {parent: this};

	// validni IC
	this.ic.validRegExp = /^\d{4,}$/;

	// obarvuje validitu
	// onkeyup="Validators.ic.validate(this)"
	this.ic.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje IC
	// onblur="Validators.ic.finish(this)"
	this.ic.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// kontroluje validity IC
	// if (!Validators.ic.isValid(elm))
	this.ic.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA DIC
	// =========================================================================
	this.dic = {parent: this};

	// validni DIC
	this.dic.validRegExp = /^[A-Z]{2}\d{4,}$/;

	// obarvuje validitu
	// onkeyup="Validators.dic.validate(this)"
	this.dic.validate = function(input)
	{
		this.parent.setInputColor(input, this.isValid(input));
	}

	// formatuje DIC
	// onblur="Validators.dic.finish(this)"
	this.dic.finish = function(input)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input);
	}

	// vytvari DIC
	// onfocus="Validators.prepare(this, source)"
	this.dic.prepare = function(input, source)
	{
		if (input.value == '' && typeof(source) == 'object' && source.value != undefined && source.value != '')
		{
			input.value = 'CZ'+source.value;
			input.select();
		}

		this.validate(input);
	}

	// kontroluje validity DIC
	// if (!Validators.dic.isValid(elm))
	this.dic.isValid = function(input)
	{
		return input.value.toString().match(this.validRegExp) != null;
	}

	// KONTROLA LOGINU
	// =========================================================================
	this.login = {parent: this};

	// validni login
	this.login.validRegExp = /^[a-zA-Z0-9\._@-]{3,}$/;

	// obarvuje validitu
	// onkeyup="Validators.login.validate(this)"
	this.login.validate = function(input, regexp)
	{
		this.parent.setInputColor(input, this.isValid(input, regexp));
	}

	// formatuje login
	// onblur="Validators.login.finish(this)"
	this.login.finish = function(input, regexp)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input, regexp);
	}

	// kontroluje validity loginu
	// if (!Validators.login.isValid(elm))
	this.login.isValid = function(input, regexp)
	{
		if (typeof(regexp) != 'object' || regexp.constructor != RegExp)
			regexp = this.validRegExp;

		return input.value.toString().match(regexp) != null;
	}

	// KONTROLA HESLA
	// =========================================================================
	this.password = {parent: this};

	// validni heslo
	this.password.validRegExp = /^[a-zA-Z0-9!@#\$%\^&\*\(\)\.+\-]{3,}$/;

	// obarvuje validitu
	// onkeyup="Validators.password.validate(this)"
	this.password.validate = function(input, regexp)
	{
		this.parent.setInputColor(input, this.isValid(input, regexp));
	}

	// formatuje heslo
	// onblur="Validators.password.finish(this)"
	this.password.finish = function(input, regexp)
	{
		input.value = input.value.toString().replace(/^\s+|\s+$/g, '');
		this.validate(input, regexp);
	}

	// vytvari heslo
	// onfocus="Validators.password.generate(this)"
	this.password.generate = function(input, easy)
	{
		input.value = generatePassword(easy);
		input.select();

		this.validate(input);
	}

	// kontroluje validity hesla
	// if (!Validators.password.isValid(elm))
	this.password.isValid = function(input, regexp)
	{
		if (typeof(regexp) != 'object' || regexp.constructor != RegExp)
			var regexp = this.validRegExp;

		return input.value.toString().match(regexp) != null;
	}
}

var Validators = new Validators();

