// v1.2

// на число в пределах от min до max minv ~ не '-'
function isNotValidNumber(text, allow_empty, minv, maxv) {
  var msg = "Поле \"%d\". Значение выходит за пределы ["+minv+"; "+maxv+"]";
	var result = isNotSmth(text, 'INT', allow_empty);  if (result) { return result; }
  if ((!allow_empty) && (text > maxv || text < minv)) { return msg; }
  return false;
}

// на пустоту (! '' или '   ')
function isEmpty(text) {
  var msg = "Поле \"%d\". Должно быть заполнено";
  text = "" + text;
  for (var i=0; i < text.length; i++) {
    if (text.substring(i, i+1) != " ") {return false} 
  }
  return msg;
}

// Проверка на E-mail (@ в строке и . после @ и более 2 символов после .)
function isNotEmail(text) {
	var msg = "Поле \"%d\". Должно иметь формат адреса эл. почты (user@domain.ru)";
  if(isEmpty(text)) return isEmpty(text);
  var pos_amp= text.indexOf("@");
  var pos_point= text.lastIndexOf(".");
  if (pos_amp == -1) return msg; 
  if (pos_point < pos_amp) return msg;
  if (2 > (text.length - pos_point)) return msg; 
  return false;
}

// Проверка на наличие каких-либо символов ('-' в REAL оставлять только в крайнем случае)
function isNotSmth(text, type, allow_empty, mincount, maxcount) {
  var posymb, msg;
  if (type == 'LATIN') {posymb = "_0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; msg = "Поле \"%d\". Должно содержать только латинские символы и цифры";}
  if (type == 'PHONE') {posymb = "+-()0123456789 "; msg = "Поле \"%d\". Может содержать только цифры и символы +-()";}
  if (type == 'INT')   {posymb = "0123456789"; msg = "Поле \"%d\". Должно содержать только цифры";}
  if (type == 'DBDATE')   {posymb = "0123456789."; msg = "Поле \"%d\". Должно быть в формате даты ДД.ММ.ГГГГ";}
  if (type == 'REAL')  {posymb = ".0123456789"; msg = "Поле \"%d\". Должно содержать только цифры и сивол \".\"";}
	if (type == 'ALMOST_ALL') {posymb = " ~,.+-=@#$^&*()_0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNMёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"; msg = "Поле \"%d\". Не должно содержать специализированных символов";}
  text = "" + text;
  if(!allow_empty && isEmpty(text)) return isEmpty(text);
	if ((mincount || maxcount) && isNotCount(text, mincount, maxcount)) return isNotCount(text, mincount, maxcount);
  for (var i=0; i< text.length; i++){
     TempChar=text.substring(i, i+1);
     if (posymb.indexOf (TempChar, 0) == -1) return msg;
  }
  return false;
}

function isNotCount(text, mincount, maxcount) {
  var msg = (mincount == maxcount ? "Поле \"%d\". Количество знаков должно быть равным " + mincount : "Поле \"%d\". Количество знаков должно быть не менее " + mincount + " и не более " + maxcount);
	if (text.length < mincount || text.length > maxcount) {return msg}
	return false;
}

// Поля не равны
function isNotEq(text, text_check, latin) {
  var msg = "Поля \"%d\". Должны совпадать";
  if (latin) {if (isNotSmth(text, 'LATIN', 0)) return (isNotSmth(text, 'LATIN', 0)); if (isNotSmth(text_check, 'LATIN', 0)) return (isNotSmth(text_check, 'LATIN', 0)); }
  if (text != text_check) {return msg}
  return false;
}

// SELECT если выбранный элемент = '' или если = '#' и не заполнено _other
function isNotSelect(fobj, nameid) { // form object & name select
  var msg_choiced = "Поле \"%d\". Не выбрано значение из списка выбора";
  var msg_other = "Поле \"%d\". При указании опции \"Другой\", следует указывать это значение в поле ввода ниже";
  var msg_dir = "Поле \"%d\". Данный раздел не предназначен для выбора";
  var selobj = fobj.elements[nameid];
  var otherobj = (fobj.elements[selobj.name+"_other"] ? fobj.elements[selobj.name+"_other"] : null);
  for (var j=0; j<selobj.length; j++) { // идём по опция selecta
    if (selobj.options[j].selected) {	// опция select выбрана
	  if (selobj.options[j].value == "") {return msg_choiced}
		if (selobj.options[j].value == "" && otherobj && isEmpty(otherobj.value)) {return msg_choiced}
	  else if (selobj.options[j].value == '#' && otherobj && isEmpty(otherobj.value)) {return msg_other} // # и существует элемент _other и = ""
	  else if (selobj.options[j].value.indexOf("!") > -1) {return msg_dir} } }
  return false;
}

// RADIO CB если выбранный элемент = '' или если = '#' и не заполнено _other. v1.01
function isNotCR (fobj, nameid, fromel) {
  var msg_choiced = "Поле \"%d\". Не выбрано значение из переключателя";
  var msg_other = "Поле \"%d\". При указании опции \"Другой\", следует указывать это значение в поле ввода ниже";
  var cr_have_checked = false;
  for(var i=fromel; i<fobj.length; i++) { // идём по объектам формы (1 radio = 1 объект)
		if ((fobj.elements[i].type == "radio" || fobj.elements[i].type == "checkbox") && fobj.elements[i].name.indexOf(nameid) == 0 && fobj.elements[i].checked) { // встречаем radio, name, checked
	  cr_have_checked = true;
	  if (fobj.elements[i].value == '#' && fobj.elements[fobj.elements[i].name+"_other"] && fobj.elements[fobj.elements[i].name+"_other"].value == "") {return msg_other} } }// #, _other, .value=пусто
  if (!cr_have_checked) {return msg_choiced}
  return false;
}

