//Класс form_check
function form_check(form_name, form_check_rules)
{
  //Делаем переменные локальными
  var form_check_rules=form_check_rules;
  var form_name=form_name;
 
  var error='';
  var messages=new Object();

  //Внутренняя функция проверки одного элемента
  this._check_field=function(el, name, rule)
  {//1
    //Если поле должно быть чему-то идентичным ;)
    if(rule['identity'])
    {
      //Если элемент имеет тип PASSWORD или TEXT и удалось найти второе поле
      if((el.type=='password' || el.type=='text') && (el2=document.forms[form_name].elements[rule['identity']]))
      {
        //Если таки они не равны - ошибка!
        if(el.value!=el2.value)
          return rule['message'];
      }
      else
        error='Ошибка проверки #11';
    }
    //Если элемент CHECKBOX и его имя имеет вид: имя[цифра] - значит это группа чекбоксов
    else if(el.type=='checkbox' && el.name.search(/\[\d+\]/)>0)
    {
      i=0;

      //Если нужно чтобы хоть один был чекнутым
      if(rule['boolean'])
      {
        //Пока можно найти следующий из чекбоксов этой группы
        while(new_el=document.forms[form_name].elements[name+'['+(i++)+']'])
          if(new_el.checked)
            return;
 
        return rule['message'];
      }
 
      //Если нужно чтобы НИ один не был чекнутым
      if(!rule['boolean'])
        //Пока можно найти следующий из чекбоксов этой группы
        while(new_el=document.forms[form_name].elements[name+'['+(i++)+']'])
          if(new_el.checked)
            return rule['message'];
    }
    //Если элемент не имеет типа, но 0-й элемент radio - значит это радио-группа
    else if(!el.type && el[0].type=='radio')
    {
      for(var i=0; i<el.length; i++)
        if(el[i].checked)
          return;
 
      return rule['message'];
    }
    //Проверка прочих простых полей
    else if(((el.type=='text' || el.type=='password' || el.type=='file' || el.type=='textarea') && el.value.search(rule['pattern'])==-1) || ((el.type=='checkbox' || el.type=='radio') && (el.checked!=rule['boolean'])) || (el.type=='select-one' && rule['boolean'] && el.selectedIndex==0) || (el.type=='select-multiple' && rule['boolean'] && el.selectedIndex==-1))
      return rule['message'];
 
 
    //error='Не найдено правил проверки для "'+name+'" #12';
  }
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  //Метод возвращает системную ошибку
  this.get_error=function()
  {
    return error;
  }

  //Метод возвращает хэш (объект) всех ошибок общей проверки
  this.get_messages=function()
  {
    return messages;
  }

  //Метод возвращает первое (при групповой проверке) или единственное сообщение
  this.get_first_message=function()
  {
    //Не знаю другого способа вытащить из объекта первый ключ ;)
    for(var key in messages)
      return messages[key];
  }
 
  //Метод проверяет форму, используя все заданные правила
  this.check_all=function()
  {//2
    //Так как щас мы будем проверять - обнуляем хэш старых сообщений
    messages={};
 
    //Если существует заданная форма и заданы правила
    if(document.forms[form_name] && form_check_rules)
    {
      //Перебираем все правила
      for(var name in form_check_rules)
      {
        //Если не найдено элемента по имени - пытаемся найти ткой же с индексом [0], полагая что это CHECKBOX
        if(!(el=document.forms[form_name].elements[name]))
          el=document.forms[form_name].elements[name+'[0]'];
 
        //Если удалось найти элемент
        if(el)
        {
          //Перебираем множество правил для этого элемента
          for(var i in form_check_rules[name])
          {
            //Если получили сообщение об ошибке
            if(message=this._check_field(el, name, form_check_rules[name][i]))
            {
              //Скидываем его в хэш
              messages[name]=message;
 
              //Прерываем цикл - больше по этому элементу ошибок искать не нужно
              break;
            }
          }
        }
        else
        {
          error='Не найден элемент "'+name+'" #22';
          break;
        }
      }
    }
    else
      error='Ошибка проверки #21';
  }
 
  //Метод проверяет одно поле - переданный элемент (this)
  this.check_field=function(element)
  {//3
    //Так как щас мы будем проверять - обнуляем хэш старых сообщений
    messages={};
 
    //Если передан реальный элемент, имющий имя
    if(element && element.name)
    {
      //Если элемент имеет имя вида: имя[цифра] - имя правила будет другим
      if(element.name.search(/\[\d+\]$/)>0)
        name=element.name.replace(/\[\d+\]$/, '');
      else
        name=element.name;

      //Если удалось найти такой элемент в этой форме
      if(el=document.forms[form_name].elements[element.name])
      {
        //Если найдены правила для поля
        if(form_check_rules && form_check_rules[name])
        {
          //Перебираем правила, так как для одного элемента их может быть несколько
          for(var i in form_check_rules[name])
          {
            //Если уже есть ошибка или получено сообщение об ошибке - возвращаем false
            if(error || (messages[name]=this._check_field(el, name, form_check_rules[name][i])))
              return;
          }
 
          return true;
        }
        else
          error='Не найдены правила #33';
      }
      else
        error='Не найден элемент "'+element.name+'" #32';
    }
    else
      error='Ошибка проверки #31';
  }
}



