var _check_err_name = new Array();
var _check_err_field =  new Array();
var _check_err_type =  new Array();
var _check_err_count = 0;

function form_check(form_name, cfg_line, lang, err_count)
{
        if(!form_name) return false;
        if(!cfg_line) return false;
        if(!lang) lang = 'en';
        lang = lang.toLowerCase();
        if(!err_count) err_count = 9999999;

        function validateChars(str, chars)
        {        var n;
                for(n = 0; n < str.length; n++) {
                        if(chars.indexOf(str.charAt(n)) < 0) return false;
                }
                return true;
        }

        function AddErrorEmpty(lang, fld)
        {
                var newi = _check_err_count;
                _check_err_field[newi] = fld;
                _check_err_type[newi] = 'empty';
                switch(lang) {
                        case 'ru':
                                _check_err_name[newi] = 'Ïîëå "' + fld + '" íå ìîæåò áûòü ïóñòûì';
                                break;
                        default:
                                _check_err_name[newi] = fld + ' cannot be empty';
                }
                _check_err_count++;
        }

        function AddErrorType(lang, fld)
        {
                var newi = _check_err_count;
                _check_err_field[newi] = fld;
                _check_err_type[newi] = 'type';
                switch(lang) {
                        case 'ru':
                                _check_err_name[newi] = 'Ïîëå "' + fld + '" çàïîëíåíî íåêîððåêòíî';
                                break;
                        default:
                                _check_err_name[newi] = fld + ' is invalid';
                }
                _check_err_count++;
        }

        function trim(s)
        {
                var n, spac = ' \t\n';
                s = s.toString();
                for(n = 0; n < s.length; n++)
                        if(spac.indexOf(s.charAt(n)) < 0) break;
                s = s.substring(n, s.length);
                for(n = s.length - 1; n >= 0; n--)
                        if(spac.indexOf(s.charAt(n)) < 0) break;
                s = s.substring(0, n + 1);
                return s;
        }



        var req, fld_name, fld_name_alt, attrs, value;
        var suberr;

        var char_en = 'abcdefghijklmnopqrstuvwxyz';
        var char_en_cpt = char_en.toUpperCase();
        var char_ru = 'àáâãäå¸æçèéêëìíîïðñòóôõö÷øùúûüýþÿ';
        var char_ru_cpt = char_ru.toUpperCase();
        var char_digits = '1234567890';

        var char_number = char_digits + '+- .,eE';
        var char_integer = char_digits + '+- ';
        var char_email = char_en + char_en_cpt + char_digits + '@._-';
        var char_phone = char_digits + '()[] +-';
        var char_string = char_number + char_en + char_en_cpt + char_ru + char_ru_cpt + '_/;';


        _check_err_name = new Array();
        _check_err_field =  new Array();
        _check_err_type =  new Array();
        _check_err_count = 0;

        var cfg = cfg_line.split(';;');

        var m, oo, collection;
        for(m = 0;m < cfg.length; m++) {

                var cfg_detail = cfg[m].split("::");

                fld_name = cfg_detail[0];
                fld_name_alt = cfg_detail[1];
                attrs = cfg_detail[2];
                req = false;
                if(cfg_detail[3] == 'req') req = true;
                eval('value = document.' + form_name + '.' + fld_name + '.value;');
                if(value == null) {
                        value = '';
                        collection = eval('document.' + form_name + '.' + fld_name);
                        for (oo = 0; oo < collection.length; oo++) {
                                if(collection[oo].checked) value += collection[oo].value + ', ';
                        }
                }
                value = trim(value);

                suberr = true;

                if(!req && value == '') {
                        suberr = false;
                }
                else if(req && value == '') {
                        suberr = true;
                        AddErrorEmpty(lang, fld_name_alt);
                }
                else {
                        switch(attrs.toLowerCase()) {
                                case 'email': {
                                        if(validateChars(value, char_email) && value.length >= 5) {
                                                var indAt, indPt, len;
                                                indAt = value.indexOf('@');
                                                indPt = value.lastIndexOf('.');
                                                len = value.length;
                                                if(indAt > 0 && indPt > indAt + 1 && indPt < len - 1) suberr = false;
                                        }
                                } break;
                                case 'phone': case 'fax': {
                                                if(validateChars(value, char_phone)) suberr = false;
                                        } break;
                                case 'number':
                                                if(validateChars(value, char_number)) {
                                                        suberr = false;
                                                }
                                        break;
                                case 'integer':
                                                if(validateChars(value, char_integer)) suberr = false;
                                        break;
                                case 'string':
                                                if(validateChars(value, char_string)) suberr = false;
                                        break;
                                case 'date': {
                                                var dfmt = 'mm/dd/yy [hh:mm]';
                                                if(lang == 'ru') dfmt = 'dd.mm.yy [hh:mm]';
                                                if(check_date(value, dfmt) == 0) suberr = false;
                                        } break;
                                case 'datetime': {
                                                var dfmt = 'mm/dd/yy hh:mm';
                                                if(lang == 'ru') dfmt = 'dd.mm.yy hh:mm';
                                                if(check_date(value, dfmt) == 0) suberr = false;
                                        } break;
                                default:
                                        suberr = false;
                                        break;
                        }
                        if(suberr) AddErrorType(lang, fld_name_alt);
                        if(suberr) err = true;
                }                // !req ...
                if(suberr) if(_check_err_count >= err_count) break;
        }                // for(... in ...)
        return _check_err_count == 0;
}



function form_check_msg(msg_delimeter)
{
        var n, ret = '';
        if(!msg_delimeter) msg_delimeter = '\n';

        for(n = 0; n < _check_err_count; n++)
                ret += _check_err_name[n] + (n < _check_err_count - 1 ? msg_delimeter : '');

        return ret;
}

