  var formErrors = new Array();
    
    function initForm( frm ){
        
        var f = document.getElementById(frm).elements;
        var rule= /(NOTNULL)+/;
        //mValue = mValue.replace(rule, "");

        formErrors[frm] = new Array();
        formErrors[frm]['reqfields']=new Array();


        j=0;
        for( i=0; i<=(f.length); i++){
            if( typeof(f[i]) != "undefined" ) {
                if( f[i].getAttribute('filter') != null ) {
                    if( rule.test(f[i].getAttribute('filter')) ) {
                        //j++;
///                        consoleMsg('aaaaaaa');
                        //formErrors[frm]['reqfields']=new Array();
                        formErrors[frm]['reqfields'][f[i].getAttribute('id')]=0;

                    }
///                    consoleMsg(f[i].name);            
///                    consoleMsg(f[i].getAttribute('filter'));
                    setFilters(f[i]);
                }

            }
        }

        

        checkSubmit( document.getElementById(frm) );
        
    }


    // ***************************************************************************************
    // 
    // ***************************************************************************************
    function checkField( f ){
        var hField      = f;
        var hForm       = hField.form;
        var sFieldName  = hField.getAttribute('id');   

        var r = procFilters( hField );         
        if( r != false  ) {
            //error occured            
            var hErrorField = document.getElementById( sFieldName + "Error" );
            hErrorField.innerHTML = "Hui!";

        } else {
            //no errors, do nothing
            
        }
        //alert(f.getAttribute('filter'));
    }

    // ***************************************************************************************
    // 
    // ***************************************************************************************
    function setFilters( f ){
        var sFilters    = f.getAttribute('filter');
        var mValue      = f.value;
        var r           = false;

        var a = sFilters.split('|');
        var aFilters = new Array();
        for(key in a){
            var b= a[key].split('=');
            aFilters[key] = new Array();
            aFilters[key]['name'] = b[0];
            aFilters[key]['value'] = b[1];
        }

        for(key in aFilters){
            switch (aFilters[key]['name']) {
            
            case 'DOUBLE':
            case 'INTEGER':
            case 'LETTERS_ONLY':   
            case 'LATIN_ONLY':
            case 'CYRILLYC_ONLY':
            case 'NOSPECCHARS':
                f.onkeydown=function(){
                    procFilters(f);    
                }
                break;


            case 'MAKELOWER':
            case 'MAKEUPPER':
                       
                f.onkeyup=function(){
                    procFilters(f);    
                }
                break;

            case 'MINLEN':            
                f.onblur=function(){
                    procFilters(f);    
                }
                break;

            case 'MAXLEN':
                f.setAttribute('maxlength', aFilters[key]['value'] );
            case 'LEN':
                f.setAttribute('maxlength', aFilters[key]['value'] );
                break;       

            case 'NOTNULL':
//            case 'MAXVALUE':
//            case 'MINVALUE':
//            case 'VALUE':

                f.onkeyup=function(){
                    procFilters(f);    
                }

                f.onblur=function(){
                    procFilters(f);    
                }
                break;

            }
        }

    }

    
    // ***************************************************************************************
    // 
    // ***************************************************************************************
    function checkSubmit( frm ){

        //var f = document.getElementById(frm).elements;
        var f=frm.elements;
        var frmName=frm.getAttribute('name');

      
        if( typeof(f['go']) != "undefined" ) {
///            consoleMsg(formErrors[frmName]['reqfields']);
            
            var d=formErrors[frmName]['reqfields'];
            var er=1;
            for(key in d){
                er = er * d[key];
            }

            if( er != 0 ) {
                f['go'].disabled = "";
            }else{
                f['go'].disabled = "true";              
            }
        }
 
    }
    
    // ***************************************************************************************
    // it will be called by onkeyup event
    // ***************************************************************************************
    function procFilters( f ){
        var sFilters    = f.getAttribute('filter');
        var mValue      = f.value;
        var r           = false;

        var a = sFilters.split('|');
        var aFilters = new Array();
        for(key in a){
            var b= a[key].split('=');
            aFilters[key] = new Array();
            aFilters[key]['name'] = b[0];
            aFilters[key]['value'] = b[1];
        }

        for(key in aFilters){
               
            switch (aFilters[key]['name']) {

case 'MAKELOWER':
                mValue = mValue.toLowerCase();
                break;
            case 'MAKEUPPER':
                mValue = mValue.toUpperCase();
                break;

               
            case 'NOTNULL':
                if( mValue == "" ) {
                    //r = "это поле не может оставаться пустым";
                    formErrors[f.form.getAttribute('name')]['reqfields'][f.getAttribute('id')]=0;
                }else{
                    formErrors[f.form.getAttribute('name')]['reqfields'][f.getAttribute('id')]=1;
                }
                break;

            case 'MAXVALUE':
                if( mValue > aFilters[key]['value'] ) {
//                    r = "значение не должно превышать "+aFilters[key]['value'];
                }
                break;

            case 'MINVALUE':
                if( mValue < aFilters[key]['value'] ) {
//                    r = "значение не должно быть меньше "+aFilters[key]['value'];
                }
                break;

            case 'VALUE':
                if( mValue != aFilters[key]['value'] ) {
  //                  r = "значение должно быть равно "+aFilters[key]['value'];
                }
                break;

case 'MINLEN':
                break;

            case 'MAXVALUE':
                if( mValue > aFilters[key]['value'] ) {
                    r = "значение не должно превышать "+aFilters[key]['value'];
                }
                break;

            case 'MINVALUE':
                if( mValue < aFilters[key]['value'] ) {
                    r = "значение не должно быть меньше "+aFilters[key]['value'];
                }
                break;

            case 'VALUE':
                if( mValue != aFilters[key]['value'] ) {
                    r = "значение должно быть равно "+aFilters[key]['value'];
                }
                break;

    case 'DOUBLE':
                //fixme only one comma|dot separator required
                var rule= /([A-Za-zА-Яа-я]|(\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\\|\/|\||\?|<|>|Ё|№))+/;
                mValue = mValue.replace(rule, "");
                break;
            
            case 'INTEGER':
                //replaca all non digits
                var rule= /([A-Za-zА-Яа-я]|(\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\.|\\|\/|\,|\||\?|<|>|Ё|№))+/;
                mValue = mValue.replace(rule, "");
                break;
           
            case 'NOSPECCHARS':
                var rule= /((\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\.|\\|\/|\,|\||\?|<|>|№))+/;
                mValue = mValue.replace(rule, "");
                break;
           
            case 'LETTERS_ONLY':
                var rule= /([0-9]|(\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\.|\\|\/|\,|\||\?|<|>|№))+/;
                mValue = mValue.replace(rule, "");
                break;
            case 'LATIN_ONLY':
                var rule= /([А-Яа-я]|(\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\.|\\|\/|\,|\||\?|<|>|Ё|№))+/;
                mValue = mValue.replace(rule, "");            
                break;
            case 'CYRILLYC_ONLY':
                var rule= /([A-Za-z]|(\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\~|\+|\=|;|:|\"|\'|\`|\.|\\|\/|\,|\||\?|<|>|№))+/;
                mValue = mValue.replace(rule, "");            
                break;             

            }
        }

         // set value
        f.value = mValue;     
        
        // set errors
        if( r != false  ) {
            //error occured            
            var hErrorField = document.getElementById( f.name + "Error" );
            hErrorField.innerHTML = r;

        } else {
            //no errors, do nothing
             var hErrorField = document.getElementById( f.name + "Error" );
            hErrorField.innerHTML = '';

            
        }

        checkSubmit(f.form);
        return r;


    }

