var validatorMessages = {
	invalidInt: "Значение этого поля должно быть целочисленным!",
	invalidFloat: "Значение этого поля должно быть дробным!",
	invalidDate: "Неправильная дата!",
	invalidEmail: "Неправильный email!",
	weakPassword: "Слабый пароль!",
	notStrongPassword: "Средний пароль!",
	strongPassword: "Хорошо защищенный пароль!",
	notEqualPasswords: "Пароли не совпадают!",
	equalPasswords: "Пароли совпадают!"
};

var validatorStyles = {
	main: {
		fontSize: '10',
		fontFamily: 'Tahoma'
	},
	invalidInt: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},	
	invalidFloat: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},
	invalidDate: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},
	invalidEmail: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},
	notEqualPasswords: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},
	equalPasswords: {
		backgroundColor: '#0df31e',
		border: '1px solid #047e0d',
		padding: '5px 5px',
		color: '#27692b'
	},
	weakPassword: {
		backgroundColor: '#fffaef',
		border: '1px solid #fff1d4',
		padding: '5px 5px',
		color: 'red'
	},
	notStrongPassword: {
		backgroundColor: '#f3cf96',
		border: '1px solid #893004',
		padding: '5px 5px',
		color: '#e96d30'
	},
	strongPassword: {
		backgroundColor: '#0df31e',
		border: '1px solid #047e0d',
		padding: '5px 5px',
		color: '#27692b'
	}
};

var validatorSettings = {
	hideMessageTimeOut: 1000,
	fieldsHeight: 16,
	spaceAfterField: 1	
};

/**
 * Function to validate equal of passwords
 */
function validatorValidateEqualOfPasswords(password1, password2)
{	
	if (password1.value != password2.value) {
		validatorAddMessage(
			password2, 
			validatorMessages.notEqualPasswords, 
			validatorStyles.notEqualPasswords
		);	
	} else {
		validatorAddMessage(
			password2, 
			validatorMessages.equalPasswords, 
			validatorStyles.equalPasswords
		);	
	}
}

/**
 * Function to validate password strond
 */
function validatorValidateStrongPassword(object)
{
	if (object.value.length == 0) {
		return true;
	}
	
	if (object.value.length <= 3) {
		validatorAddMessage(
			object, 
			validatorMessages.weakPassword,
			validatorStyles.weakPassword
		);
	}
	
	if (object.value.length > 3 && object.value.length <= 6) {
		validatorAddMessage(
			object, 
			validatorMessages.notStrongPassword,
			validatorStyles.notStrongPassword
		);
	}
	
	if (object.value.length > 6) {
		validatorAddMessage(
			object, 
			validatorMessages.strongPassword,
			validatorStyles.strongPassword
		);
	}
}

/**
 * Function to validate email
 */
function validatorValidateEmail(object)
{
	if (object.value.length == 0) {
		return true;
	}	
	
	var pattern = /[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+/i;
	if (!pattern.test(object.value)) {
		validatorAddMessage(object, validatorMessages.invalidEmail);	
	}
}

/**
 * Function to validate date
 * Example of pattern: /\d{4}-\d{2}-\d{2}/i
 */
function validatorValidateDate(object, pattern)
{
	if (object.value.length == 0) {
		return true;
	}
	
	if (!pattern.test(object.value)) {
		validatorAddMessage(object, validatorMessages.invalidDate);	
	}
}

/**
 * Function to validate float
 */
function validatorValidateFloat(object)
{
	if (object.value.length == 0) {
		return true;
	}
	
	var pattern = /[^0-9\.]+/i;
	if (pattern.test(object.value)) {
		validatorAddMessage(object, validatorMessages.invalidFloat);	
	}
}

/**
 * Function to validate int
 */
function validatorValidateInt(object)
{
	if (object.value.length == 0) {
		return true;
	}
	
	var pattern = /[^0-9]+/i;
	if (pattern.test(object.value)) {
		validatorAddMessage(
			object, 
			validatorMessages.invalidInt, 
			validatorStyles.invalidInt
		);	
	}
}

/**
 * Function to display message box
 */
function validatorAddMessage(object, text, style)
{
	box = $('validatorMessageBox');
	object.style.height = validatorSettings.fieldsHeight;
	params = validatorAbsPosition(object); 
	box.style.left = params.x;
	box.style.top = params.y + validatorSettings.fieldsHeight + validatorSettings.spaceAfterField;
	box.innerHTML = text;
		
	box.style.backgroundColor = style.backgroundColor;
	box.style.border = style.border;
	box.style.padding = style.padding;
	box.style.color = style.color;
	box.style.fontSize = validatorStyles.main.fontSize;
	box.style.fontFamily = validatorStyles.main.fontFamily;
	box.style.display = 'block';
}

/**
 * Function hide message box
 */
function validatorRemoveMessage()
{
	box = $('validatorMessageBox');	
	setTimeout("box.style.display = 'none'", validatorSettings.hideMessageTimeOut);
}

/**
 * Function return absolute coords of HTML element
*/
function validatorAbsPosition(obj) {
      var x = y = 0;
      while(obj) {
            x += obj.offsetLeft;
            y += obj.offsetTop;            
            obj = obj.offsetParent;
      }
      return {x:x, y:y};
}
