var err_msg = "";
var default_err_msg = "";
var err_obj = null;

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function commitError(obj, msg) {
 err_obj = err_obj == null ? obj : err_obj;
 err_msg += '\n '+msg;
}

function validateForm(f, err_text) {
  err_msg=err_text;
 if (err_msg==null) err_msg = default_err_msg;
 err_obj = null;
 for (var i=0; i<f.length; i++) {
   var rule=f[i].id;
   if(rule.substr(0, 1)=='@')
   { 
     rule = rule.substr(1, rule.length-1);
//     alert('элемент зовут:'+ f[i].name +' руль для проверки:'+ rule);
     var obj = f[i];
     var p = rule.split(':');
     rule = p[0];
     var minlength = (isNaN(parseInt(p[1]))) ? 0 : parseInt(p[1]);

     var p = rule.split('*');
     var add_ch=1;
     if(p.length>1)
     {
       rule = p[0];
       var ch_el = p[1];
       if(f.elements[ch_el])
       {
         if(!f.elements[ch_el].checked)
         {
//            alert('не чекало и не проверяем '+ch_el+' вот так');
            add_ch=0;
         }
       }
//       else
//          alert('чекало проверяем '+ch_el+' вот так');
     }

     if(add_ch==1)
     {

       if (rule.substr(0, 1) == '=') 
       {
       	 var other_hand = rule = rule.substr(1, rule.length-1);
           if (obj.value != ''){
            var obj2 = f.elements[other_hand];
            if (obj.value == '') commitError(obj, obj.title);
            else 
	    if ((obj2) && (obj.value != obj2.value)) 
		commitError(obj2, obj2.title);
           }
  
       }
       else   
	 switch (rule) {
	 case 'text':
	 case 'select':
  		var value = obj.value.trim();
		if ((value == '') || (value.length < minlength)) commitError(obj, obj.title);
	 break;
  	 case 'checkbox':
  		var item_ok = 0;
  		for (var j=0; j<obj.length; j++) {
  	  	  if (obj[j].checked) item_ok++;
  		}
  		if ((item_ok < minlength) || (item_ok == 0)) 
            	 	commitError(obj[0], obj[0].title);
  	break;
  	case 'radio':
  		var selected_item = -1;
  		for (var j=0; j<obj.length; j++) {
  			if (obj[j].checked) selected_item = j;
  		}
  		if (selected_item == -1) commitError(obj[0], obj[0].title);
  	break;
  	case 'int':
  		var value = parseInt(obj.value);
  		if (isNaN(value) || (value != obj.value.trim()) || (value == 0) || (obj.value.trim().length < minlength)) commitError(obj, obj.title);
          break;
  	case 'float':
	 	var value = parseFloat(obj.value);
  		if (isNaN(value) || (value != obj.value.trim()) || (value == 0)) commitError(obj, obj.title);
  	break;
  	case 'email':
	 	var value = obj.value.trim();
  		if (!/^([a-zA-Z0-9_.+-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,6})+$/.test(value)) commitError(obj, obj.title);
  	break;
  	case 'phone':
  		var value = obj.value.trim();
  		if (!/^(\+?\d{1,3}?)?(\s)*(\(?\d{3}\)?)?(\s)*(\d{3}-?\d{2}-?\d{2})$/.test(value)) commitError(obj, obj.title);
  	break;
  	case 'alph':
  		var value = obj.value.trim();
  		if (!/^([a-zA-Z0-9.-])+$/.test(value)) commitError(obj, obj.title);
  	break;
  	}
       }	
     }
 } 
 if (err_obj != null) {
 alert(err_msg);
 err_obj.focus();
 return false;
 } else {
   return true;
 }
}

