/**
* Функции верификации данных
*/

/**
* Проверка строки (является ли числом с плавающей точкой)
* @param str string строка для проверки
* @param bSigned bool является ли знаковым
* @return bool результат проверки
*/
function isFloat(str, bSigned) {
	var sFloatDelimiter="\\.";
	var reg_exp = new RegExp("^("+((bSigned)?"[\\-\\+]?":"")+"(\\d*"+sFloatDelimiter+"?\\d+)|(\\d+"+sFloatDelimiter+"?\\d*))$");
	return reg_exp.test(str);
}

/**
* Проверка поля: номер из len цифр
*/
function isNumber( x, len )
{
	var etalon = "0123456789";	
	for( i = 0; i < x.value.length; i++ )
		if( etalon.indexOf(x.value.charAt(i)) == -1 ) {
			alert( "Неверный формат данных в поле");
			x.focus();
			return false;
		}
	if( x.value.length != len ) {
		alert( "Неверное количество цифр в поле");
		x.focus();
		return false;
	}
	return true;
}

/**
* Проверка ip адреса
*/
function isValidIPAddress(ipaddr) {
   var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
   if (re.test(ipaddr)) {
      var parts = ipaddr.split(".");
      if (parseInt(parseFloat(parts[0])) == 0) { return false; }
      for (var i=0; i<parts.length; i++) {
         if (parseInt(parseFloat(parts[i])) > 255) { return false; }
      }
      return true;
   } else {
      return false;
   }
}


/**
* Проверка массива CheckBox'ов: выбран ли кто-нибудь
* @param cb_array массив CheckBox'ов
 * @return bool результат проверки
*/
function isCheckBoxChecked(cb_array) {
	var isOneChecked = false;
	if(!cb_array.length) return cb_array.checked;
	for(i=0; i<cb_array.length; i++)
		if(cb_array[i].checked) {
			isOneChecked = true;
			break;			
		}
	return isOneChecked;
}

/**
 * Проверка группы опций (CheckBox'ов или Radio): выбран ли кто-нибудь
 * @param cb_array массив CheckBox'ов
 * @return bool результат проверки
*/
function isOptionChecked(cb_array)
{
	if(!cb_array.length) return cb_array.checked;
	for(i=0; i<cb_array.length; i++)
		if(cb_array[i].checked)
		{
			return true;
		}
	return false;
}

/**
 * Проверка на незаполненные поля формы
 * @param form форма
 * @return bool результат проверки (фокус на первое пустое поле)
 */
function checkEmptyElements(form) {
	var element = null;
	for(i=0; i<form.elements.length; i++) 
	{
		element = form.elements[i];		
		if(element.id.indexOf("_require")!=-1 && !element.disabled && element.value=="") {		
			alert("Не заполнено одно из обязательных полей!");
			element.focus();			
			return false;
		}
	}
	return true;
}

/**
* Проверка строки (является email)
* @param str строка для проверки
* @return bool результат проверки
*/
function isEmail(str)
{
	var reg_exp = /^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})/i
	return reg_exp.test(str);
}

/**
 * Проверка формы
 * @param form форма
 * @return bool результат проверки
 */
function validateForm(form)
{
	var element = null;
	
	for(i=0; i<form.elements.length; i++) 
	{
		element	= form.elements[i];
		title	= (element.title=="" ? "Ошибка заполнения формы" : element.title) + ":\n";
		
		if(element.type!="text" || typeof(element.check)=='undefined') continue;

		// 1. Проверка обязателных полей (непустых)		
		if(element.check.indexOf("[require]")!=-1 && !element.disabled && element.value=="")
		{		
			alert(title + "Данное поле обязательно для заполнения!");
			element.focus();			
			return false;
		}
		
		// 2. Проверка числовых (int) полей		
		if(element.check.indexOf("[int]")!=-1 && !element.disabled && element.value!="")
		{		
			value = parseInt(element.value, 10);
			if (isNaN(value))
			{
				alert( title + "У данного поля - числовой тип (целые)!");
				element.focus();			
				return false;
			}
			element.value = value;
		}
		
		// 3. Проверка числовых (float) полей
		if(element.check.indexOf("[float]")!=-1 && !element.disabled && element.value!="" && !isFloat(element.value))
		{		
			alert(title + "У данного поля - вещественный тип!");
			element.focus();			
			return false;
		}
		
		// 4. Проверка ip
		if(element.check.indexOf("[ip]")!=-1 && !element.disabled && element.value!="" && !isValidIPAddress(element.value))
		{		
			alert(title + "Значение задано неверно!");
			element.focus();			
			return false;
		}		
		
		// 5. Проверка email
		if(element.check.indexOf("[email]")!=-1 && !element.disabled && element.value!="" && !isEmail(element.value))
		{		
			alert(title + "Адрес указан некорректно!");
			element.focus();			
			return false;
		}	
	}

	return true;	
}