function err (e, m) { alert (m); e.focus(); return false; }     

function chType(val, type, p) {
        if (type=="int") {
                re=new RegExp("^[0-9]*$");
                if (!(re.test(val))) return 'Поле  "'+p+'" должно содержать целое число';
        }
        if (type=="num") 
                if (isNaN(val) || val=='') return 'Поле  "'+p+'" должно содержать число';
        if (type=="mail") {
                re=new RegExp("^.+@.+\\..+$");
                if (!(re.test(val))) return 'Поле  "'+p+'" должно содержать адрес e-mail в правильном формате';
        }
        return "";
}

function validateForm (f) {
        elems = f.elements;
        for (i=0; i<elems.length; i++) {
                if (!(r=elems[i].required)) continue;
                t=elems[i].type; n=elems[i].name; p=elems[i].prompt;
                if (t=="radio" || t=="checkbox") {
                        ch=0;
                        while(elems[i].name == n) if (elems[i++].checked) ch++;
                        if (ch<r) return err(elems[i-1],'Поле "'+p+'" обязательное для заполнения.');
                        i--;
                }
                if (t=="select-one" || t=="select-multiple") {
                        ch=0;
                        for (k=0; k<elems[i].length; k++) 
                                if(elems[i][k].selected && elems[i][k].value != '--') ch++;
                        if (ch<r) return err(elems[i],'Поле "'+p+'" обязательное для заполнения.');
                }
                if (t=="text" || t=="textarea" || t=="password") {
                        o=r.split(":"); val=elems[i].value;
                        if(ch=chType(val, o[0], p)) return err(elems[i], ch);
                        if (o[1]) if (val.length < o[1]) return err(elems[i],'Значение поля "'+p+'" слишком короткое. Минимальная длина - '+o[1]); 
                        if (o[2]) if (val.length > o[2]) return err(elems[i],'Значение поля "'+p+'" слишком длинное. Максимальная длина - '+o[2]); 
                }
        }
        return true;
}
