/**
 * Получить массив элементов по имени класса
 *
 */
document.getElementsByClassName = function(cl)
{
	var retnode = [];
	var myclass = new RegExp('\\b'+cl+'\\b');
	var elem = this.getElementsByTagName('*');
	for (var i = 0; i < elem.length; i++)
	{	var classes = elem[i].className;
		if (myclass.test(classes))
			retnode.push(elem[i]);
	}
	return retnode;
};


//// Удаление пробельных символов из начала и конца строки
// str - строка для обработки
// Возвращает - обработанную строку
function trim(str)
{
	var spaceSearch = /(^\s{1,})|(\s{1,}$)/g;

	return str.replace(spaceSearch, '');
}

//// Удаление пробельных символов из начала и конца строки в поле ввода text, textarea.
// element - input тип text или textarea
function trim_field(element)
{
	element.value = trim(element.value);
}

//// Делает видимым или невидимым тег span содержащий признак необходимости поля id1 или id2 в зависимости взаимной заполненности полей
function need_one_of_two(id1, id2)
{
	var elem1 = document.getElementById(id1);
	var elem2 = document.getElementById(id2);
	var ncs_elem1 = document.getElementById('necessary_'+id1);
	var ncs_elem2 = document.getElementById('necessary_'+id2);

	if( !is_empty(elem1) && is_empty(elem2) )
	{	if(ncs_elem1) ncs_elem1.style.visibility = 'visible';
		if(ncs_elem2) ncs_elem2.style.visibility = 'hidden';
	}
	else if( is_empty(elem1) && !is_empty(elem2) )
	{	if(ncs_elem1) ncs_elem1.style.visibility = 'hidden';
		if(ncs_elem2) ncs_elem2.style.visibility = 'visible';
	}
	else if( !is_empty(elem1) && !is_empty(elem2) )
	{	if(ncs_elem1) ncs_elem1.style.visibility = 'visible';
		if(ncs_elem2) ncs_elem2.style.visibility = 'visible';
	}
	else
	{	if(ncs_elem1) ncs_elem1.style.visibility = 'visible';
		if(ncs_elem2) ncs_elem2.style.visibility = 'hidden';
	}
}

//// Проверка поля 'Другой город' в зависимости от поля 'Город', применяется также для полей 'Прописки'.
//// Если всё в порядке удаляется ранее показанное предупреждение, иначе выводится предупреждение
// city_other - поле 'Другой город'
// city - поле 'Город'
// Возвращает - true, если всё в порядке, иначе false
function check_city_other(city_other, city)
{
	if( city.options[city.selectedIndex].value != 1 )
	{	warning_after_element(city_other, 'remove');
		return true;
	}
	else
	{	if( is_empty(city_other) )
		{	warning_after_element(city_other, 'add', CITY_OTHER_WARNING);
			return false;
		}
		else
		{	warning_after_element(city_other, 'remove');
			return true;
		}
	}
}

//// Функция проверки количества введённых символов в text, с отображением количества оставшихся символов в remain_field.
//// Применяется с обработчиком события 'onKeyUp' поля text
// text - поле ввода текста
// remain_field - поле количества оставшихся символов
// max_length - максимальное количество символов
function textarea_remain_chars(text, remain_field, max_length)
{
	var	current_length = text.value.length;
	var	remain_length = max_length - current_length;

	if( remain_length <= 0 )
	{	text.value = text.value.slice(0, current_length+remain_length);
		remain_field.value = 0;
	}
	else
	{
		remain_field.value = remain_length;
	}
}

//// Показать/спрятать поле 'Другие языки' в зависимости от значения галочки 'Другие'
// id - ID элемента для отображения/скрытия
// check - ID галочки 'Другие'
function field_language_other_display(id, check)
{
	var element = document.getElementById(id);

	if( !check.checked )
	{	element.style.display = 'none';
		if( is_warning_after_element(element) )
			document.getElementById('warning_'+element.name).style.display = 'none';
	}
	else
	{	element.style.display = 'block';
		if( is_warning_after_element(element) )
			document.getElementById('warning_'+element.name).style.display = 'block';
		element.focus();
	}
}

//// Ввод номера телефона (цифры и символы разделители '_', '-', '=', ' ', '/', '|', ',', '.', '(', ')', '[', ']', '{', '}')
//// Применяется с обработчиком события 'onChange' поля phone
// element - поле ввода
function enter_phone(element)
{
	var str = element.value;

	for(var i=0; i<str.length; i++ )
	{	if( (str.charCodeAt(i) < '0'.charCodeAt(0) || str.charCodeAt(i) > '9'.charCodeAt(0)) && str[i] != '_' && str[i] != '-' && str[i] != '+' && str[i] != '=' && str[i] != ' ' && str[i] != '/' && str[i] != '|' && str[i] != ',' && str[i] != '.' && str[i] != '(' && str[i] != ')' && str[i] != '[' && str[i] != ']' && str[i] != '{' && str[i] != '}' )
		{	str = str.slice(0, i) + str.slice(i+1, str.length);
			i--;
		}
	}

	element.value = str;
}

//// Получение значения выделенного элемента radio
// radio - элемент input тип radio
// Возвращает - value выделенного элемента
function radio_checked_value(radio)
{
	for(var i = 0; i < radio.length; i++)
		if(radio[i].checked)
			return radio[i].value;
	return false;
}

//// Проверка, является ли поле пустым
// element - input тип text или textarea
// Возвращает - true, если поле пустое, иначе false
function is_empty(element)
{
	if( !element ) return false;
	if(element.value && element.value.length != 0)
		element.value = trim(element.value)
	return ((element.value.length == 0) ? true : false);
}

//// Проверка, удовлетворяет ли строка синтаксису e-mail
// email - строка для проверки
// Возвращает - true, если удовлетворяет, иначе false
function is_email(email)
{
	var emailRegExp = /^([0-9]|[a-z])+(_|-|\.|[0-9]|[a-z])*@((_|-|[0-9]|[a-z]){2,}\.)+[a-z]+$/i;
	return emailRegExp.test(email);
}

//// Проверка, удовлетворяет ли строка синтаксису phone
// phone - строка для проверки
// Возвращает - true, если удовлетворяет, иначе false
function is_phone(phone)
{
	var phoneRegExp = /^[\+\(\)\-0-9 ]+$/;
	return phoneRegExp.test(phone);
}

//// Добавление (удаление) элемента Paragraph в качестве предупреждения после элемента.
// element - элемент после которого необходимо предупреждение
// event - событие (add, remove)
// text - текст предупреждения

//function warning_after_element(element, event, text)
//{
//	if( event == 'add' && !is_warning_after_element(element) )
//	{	var textNode = document.createTextNode(text);
//		var pNode = document.createElement('p');
//		var idAttr = document.createAttribute('id');
//		idAttr.value = 'warning_'+element.name;
//		var classAttr = document.createAttribute('class');
//		classAttr.value = 'warning';
//
//		pNode.setAttributeNode(idAttr);
//		pNode.setAttributeNode(classAttr);
//		pNode.appendChild(textNode);
//		element.parentNode.appendChild(pNode);
//	}
//	else if( event == 'remove' && is_warning_after_element(element) )
//	{	element.parentNode.removeChild( document.getElementById('warning_'+element.name) );
//	}
//}


function warning_after_element(element, event, text)
{
	if( event == 'add' && !is_warning_after_element(element) )
	{
		var textNode = document.createTextNode(text);
		var pNode = document.createElement('p');
		var idAttr = document.createAttribute('id');
		idAttr.value = 'warning_'+element.name;
		var classAttr = document.createAttribute('class');
		classAttr.value = 'warning';

		pNode.setAttributeNode(idAttr);
		pNode.setAttributeNode(classAttr);
		pNode.appendChild(textNode);
		element.parentNode.appendChild(pNode);
	}
	else if( event == 'remove' && is_warning_after_element(element) )
	{	element.parentNode.removeChild( document.getElementById('warning_'+element.name) );
	}
}



//// Проверка наличия после элемента предупреждения
// element - элемент после которого предполагается предупреждение
// Возвращает - true, если предупреждение присутствует, иначе false
function is_warning_after_element(element)
{
	return ( document.getElementById('warning_'+element.name) ) ? true : false;
}

//// Ввод только чисел (беззнаковые целые числа, или десятичные дроби с разделителем '.')
//// Применяется с обработчиком события 'onChange' поля text
// element - поле ввода
// type - тип ('int', 'float')
function enter_number(element, type)
{
	var str = element.value;
	var temp = '';

	switch(type)
	{
		case 'int':
			for(var i=0; i<str.length; i++ )
			{	if( str.charCodeAt(i) < '0'.charCodeAt(0) || str.charCodeAt(i) > '9'.charCodeAt(0) )
				{	str = str.slice(0, i) + str.slice(i+1, str.length);
					i--;
				}
			}

			while( str[0] == '0' )
				str = str.slice(1, str.length);
			break;

		case 'float':
			for(var i=0; i<str.length; i++ )
			{	if( (str.charCodeAt(i) < '0'.charCodeAt(0) || str.charCodeAt(i) > '9'.charCodeAt(0)) && str[i] != '.' )
				{	str = str.slice(0, i) + str.slice(i+1, str.length);
					i--;
				}
			}

			while( str[0] == '0' && str[1] != '.' )
				str = str.slice(1, str.length);
			break;

		default:
			break;
	}

	element.value = str;

	return true;
}

//// Присвоить свойству display элемента значение block
// id - ID отображаемого элемента
function display_block(id)
{
	document.getElementById(id).style.display = 'block';
}

//// Присвоить свойству display элемента значение none
// id - ID скрываемого элемента
function display_none(id)
{
	document.getElementById(id).style.display = 'none';
}

function setUnderline(id)
{
	document.getElementById(id).style.textDecoration = 'underline';
}
function unsetUnderline(id)
{
	document.getElementById(id).style.textDecoration = 'none';
}
