/* Многозадачный конструктор верификации форм
     версия 1.0, Автор Коротеев Павел
     - - - - - - - - - - - - - - - - - - - - - - - - -
     Пример использования: (см. form2.html)
     ----------------------------------------------
*/

//USER_GUIDE по использованию
/*
  для fields()...
  были созданы собственные имена обработки полей
  имена уникальны и если нужно добавить новый тип его также нужно будет описать в constr()
  если не нужно использовать данный тип поля для обработки,
  его можно удалить в html-странице так:  delete(имя_объекта.saved.имя_свойства)
  --------------------------------------------------------------------------------------------------
  Значения для обрабатываемых полей
   - !text_ - для полей текстовый (проверка на просто запролнение полей)
   - !num_ - для полей текстовый (допустимы только числа)
   - !sel_ - для списков (если первый элемент списка не = "0" или " ")
   ------------------------------------------------------------------------------
   чтобы объект правильно начал обрабатывать форму
   к имени поля вначале дописывается одно из выше перечисленных занчений
   .: было fname --- .:стало !text_fname

   если приставки у имени нет, то объект не затрагивает эту форму,
   то же самое может произойти если удалить объект, (скажем text)
   то все поля со значением приставки "!text_" - обрабатываться не будут
    --------------------------------------------------------------------------------------
*/











//формируем свойства для полей форм
function fields() { this.text="!text_";
 this.num="!num_";
 this.numif="!numif_";
 this.sel="!sel_";
 this.email="!email_";
 this.area="!area_";
}

//функция конструктор объекта
function obj_form(form,send,sort) {
   this.form=form; //свойство для записи формы
   this.submit=submit; //метод для отправки формы
   this.reset=reset; //метод для отправки формы
   this.send=send; //совйтсво для опредления каким образом отправить форму
   this.saved=new fields(); //получаем все значения свояств объекта fields
   /*
     если send:
     - "submit" (в коде должна присуствовать кнопка с типом "submit" по умолачнию)
     - "button" (в коде должна присуствовать кнопка с типом "button" и именем "submit_butt")
     - "link" (в коде должна присуствовать ссылка в пределах <form>)
   */
   this.sort=sort; //сортировка обрабатываемых полей


   //достаточно важная функция выводит ошибки
   function gen_error(id_err,err_fields,help_text,obj) {     //текст сообщения
     var err_msg=new Array();
     err_msg['text']='следующие поля не заполнены:';
     err_msg['area']='текстовые поля не заполнены:';
     err_msg['num']='следующие поля должны содержать числа:';
     err_msg['numif']='следующие поля должны содержать числа:';
     err_msg['sel']  = 'необходимо выбрать значение элементов(а):';
     err_msg['email']  = 'cледующие поле(я) заполнены не корректно:';

      if (id_err) {
      var get_ID = err_fields[id_err].split("\n");
      for (x=0; x<get_ID.length; x++) if (get_ID[x]) {help_text+=document.getElementById(get_ID[x]).innerHTML.replace(/<[^>]*>.*?<\/[^>]*>|(\:)*/gi,'')+"\n";}
      alert("Внимание!" + "\n" + err_msg[id_err] + "\n"+err_msg[id_err].replace(/./gi,'--').substring(0,err_msg[id_err].length+17)+"\n" + help_text);
      for (x=0; x <get_ID.length; x++)  if (get_ID[x]) {obj['form'].elements[obj[id_err]+get_ID[x]].focus(); break}
      return false;
      }
      //преобразую к нормальным именам (избавляюсь в имени от !..._)
      for (i=0; i <obj['form'].length; i++) {        var check_el = obj['form'].elements[i];
        if (check_el.name.match(/^\!/gi)!=null) check_el.name=check_el.name.replace(/\!\w+\_/gi,'');
      }
      obj['form'].submit(); //отправляю форму
   } /*------------------------------------------------------------------------------------------*/


    //общая функция для сбора инфы
   function constr(value) {      var obj = value; //записанный объект
      var err_fields=new Array();
      var id_err="";
      var help_text="";
      var all_types="";

      for (i=0; i<obj['form'].length; i++) {         var main_el = obj['form'].elements[i];
         if (main_el.type != 'submit') {
             //находим типы "text"
             if (main_el.type=="text") {                //-------!_text-----------------------------             	 if (main_el.name.indexOf(obj['text']) !=-1) {             	    if  (!main_el.value) {
             	     id_err="text";    var tname="class_name";
             	     err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	     err_fields[id_err]=err_fields[main_el.type].replace(undefined,'');
             	     get_type=main_el.type;
             	     all_types+="text ";
              	    }
             	 }
             	//-----------!_num--------------------------------------------
                if (main_el.name.indexOf(obj['num']) !=-1) {
             	    if  (!main_el.value || isNaN(main_el.value)) {
             	       id_err="num";
             	       err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	       err_fields[id_err]=err_fields[id_err].replace(undefined,'');
             	       get_type=main_el.type;
             	       all_types+="num ";
             	    }
             	 }
              	//-----------!_numif--------------------------------------------
                if (main_el.name.indexOf(obj['numif']) !=-1) {
             	    if  (!main_el.value || main_el.value.match(/[a-z]/gi)!=null) {
             	       id_err="numif";
             	       err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	       err_fields[id_err]=err_fields[id_err].replace(undefined,'');
             	       get_type=main_el.type;
             	       all_types+="numif ";
             	    }
             	 }
             	//----------!_email---------------------------------------------
                if (main_el.name.indexOf(obj['email']) !=-1) {
             	    if  (!main_el.value || main_el.value.match(/^\D+[\w.]{4,}@\w+\.\w+$/gi)==null) {
             	       id_err="email";
             	       err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	       err_fields[id_err]=err_fields[id_err].replace(undefined,'');
             	       get_type=main_el.type;
             	       all_types+="email ";
             	    }
             	 }
             }
             //находим textarea
             if (main_el.type=="textarea") {               if (main_el.name.indexOf(obj['area']) !=-1) {                     if  (!main_el.value || main_el.value.length < 5) {
             	       id_err="area";
             	       err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	       err_fields[id_err]=err_fields[id_err].replace(undefined,'');
             	       get_type=main_el.type;
             	       all_types+="area ";
             	    }
               }
             }
             //находим select-one
             if (main_el.type=="select-one") {
                if (main_el.name.indexOf(obj['sel'])!=-1){                   if (main_el.options[main_el.selectedIndex].value==0) {                       get_type=main_el.type;
                       id_err="sel";
                       err_fields[id_err]+=main_el.name.replace(obj[id_err],'')+"\n";
             	       err_fields[id_err]=err_fields[id_err].replace(undefined,'');
              	       all_types+="sel ";
                   }
                }
             }//-------------------------------------------------------


         }
      }
     all_types=all_types.split(/\s+/gi);
     if (obj['sort']==0) all_types.sort(); //сортирует поля по их следваонию на странице
     if (obj['sort']==1) all_types.sort().reverse() //сортирует поля по их типу (text,select..)
     //функция вывода ошибок
      return gen_error(all_types[0],err_fields,help_text,obj);
   }

   /*---отправка формы------------------------------------------------------------------*/
   function submit() {     var obj_array=new Array();
     obj_array['form']=this.form;
     obj_array['sort']=this.sort;
     for (name in this.saved) obj_array[name]=this.saved[name];
     if (this.send=="submit") this.form.onsubmit=function() {return constr(obj_array)}
     else if (this.send=="button") this.form.submit_butt.onclick=function() {return constr(obj_array)}
     else {//проверяем на ссылку      	var last_obj =document.getElementsByName(this.form.name);
        var a = last_obj[0].getElementsByTagName('a');
        a[0].onclick=function() {return constr(obj_array)}
     }
   }

   /*---Сброс формы------------------------------------------------------------------*/
   function this_reset(value) {
     var obj=value; var str_name="";
     for (i=0; i < obj.length; i++) {
        var name_el = obj.elements[i];
         if (name_el.type !="button" && name_el.type !="submit") {
           name_el.value="";
           if (name_el.type=="select-one") name_el.options[0].selected=true;
           if (name_el.type=="checkbox") name_el.checked=false;
           if (name_el.type=="radio")  {name_el.checked=false; str_name+=name_el.name+" ";}         }
     }

     if (str_name != "") {
      //правильный сбор радиокнопок
      var get_split = str_name.split(/\s+/gi);
      for (i=0; i < get_split.length; i++) {       var get_obj_radio=eval('obj.'+get_split[i]);
       get_obj_radio[0].checked=true;}
     }
   }

  function reset() {     if (this.form.butt_reset)  this.form.butt_reset.onclick=function() {if (confirm('Вы уверены что хотите это сделать ?')) this_reset(this.form)}
     else {     	var get_form = this.form;
     	var last_obj =document.getElementsByName(this.form.name);
        var a = last_obj[0].getElementsByTagName('a');
        a[1].onclick=function() {if (confirm('Вы уверены что хотите это сделать ?')) this_reset(get_form)}     }   }

}