/* ***************************************************************************************
 * BASIS Elements 
 * bsForm3, form processor
 * ! DO NOT EDIT THIS FILE !
 ************************************************************************************** */

function bsForm3(){
    this.info       = "BASIS Form 3 class";
    this.formId     = "";
    this.aFields    = new Array();
    this.aControls  = new Array();
    this.aFData     = new Array();


    /* prototypes */
    this.getInfo            = getInfo;
    this.init               = init;
    this.enableSubmit       = enableSubmit;
    this.disableSubmit      = disableSubmit;
    this.getValues          = getValues;
    this.setValues          = setValues;
    this.resetValues        = resetValues;    
    this._procMain          = _procMain;
    this._enableControls    = _enableControls;
    this._disableControls   = _disableControls


    /* ***************************************************************************************
     * тестовая функция
     ************************************************************************************** */
    function getInfo(){
        alert(this.info);
    }
    
    /* ***************************************************************************************
     * init
     ************************************************************************************** */
    function init( formName ){
        this.aFData['formname'] = formName;

        /* selecting work fields */        
        var f = $("form[name='"+this.aFData['formname']+"'] *[use='f']"+
            ",form[name='"+this.aFData['formname']+"'] *[use='x']");
        var n='';
        var elements = new Array();
        f.each(function(n,element){
            n=$(element).attr('name');            
            elements[n]=element;
        });
        this.aFData['fields']=elements;

        /* selecting work form controls */
        var f = $("form[name='"+this.aFData['formname']+"'] input[use='c']");
        var n='';
        var elements = new Array();
        f.each(function(n,element){
            n=$(element).attr('name');
            elements[n]=element;
        });
        this.aFData['controls']=elements;


        /* bindig filter controllers for events */
        this.aFData['filters']=new Array();
        for( key in this.aFData['fields'] ) {  
             var element=$(this.aFData['fields'][key]);
             this.aFData['filters'][key]=new Array();
               
             if( element.attr('filter') ) {
                 
                var a = element.attr('filter').split('|');
                var k="";
            
                //alert("FIELD= "+$(f[key]).attr('name')+" FILTER="+a);

                for(akey in a){
                    var b= a[akey].split('=');
                    if( b[0] ) {                
                        if( b[1] ) {
                            var c=b[1];
                        }else{
                            var c=true;
                        }

                        k=b[0];
                        k=k.toLowerCase();
                        /* k -- filter name c -- filter value */
                        
                        this.aFData['filters'][key][k]=c;

                        $(element).bind("change keyup click", {fdata:this.aFData}, function(e){
                            _procMain(e.data.fdata, e.type);
                        });
                        
                    }
                }
            }


        }

        _procMain(this.aFData, '');


    }

    /* ***************************************************************************************
     * 
     ************************************************************************************** */
    function getValues(){
        var f = this.aFData['fields'];
        
        var aValues=new Array();

        for( key in f ) {  
            var element=$(f[key]);
            var name=$(f[key]).attr('name');
             
            switch( element.attr('type') ){

                case 'checkbox':
                    if( element.attr('checked') ) {
                        aValues[name] = 1;
                    }else{
                        aValues[name] = 0;
                    }                        
                    break;

                case 'textarea':                        
                    if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService' ) {
                        var mce = tinyMCE.get( name ); 
                        aValues[name] = mce.getContent();
                    }else{
                        aValues[name] = element.attr('value');
                    }                     
                    break;

                default:                    
                    aValues[name]=element.attr('value');
                    break;
            } 

        }
        return aValues;

    }

    /* ***************************************************************************************
     * 
     ************************************************************************************** */
    function setValues( aValues ){
        
        for(key in aValues){         

            var element=$("form[name='"+this.aFData['formname']+"'] *[name='"+key+"']");
            
            if( element!=undefined ) {
                var name=element.attr('name');
                
                if( element.attr('use')!='x' ) {
                
                    switch( element.attr('type') ){
                    case 'checkbox':
                        if( aValues[key] == 1 ) {
                            element.attr('checked', true); 
                        } else {
                            element.attr('checked', false);
                        }                       
                        break;

                    case 'textarea': 
                        /*alert(aValues[key]);*/
                        if( aValues[key]=='' || aValues[key]==null ) {
                            aValues[key]=' ';
                        }

                        if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService' ) {
                            var mce = tinyMCE.get( name ); 
                            mce.setContent(aValues[key]);                            
                        }else{
                            element.attr('value', aValues[key]);
                        }                     
                        break;

                    default:                    
                        element.attr('value', aValues[key]);
                        break;
                    } 
                
                }
            }
        }
        _procMain(this.aFData, '');
    }

    /* ***************************************************************************************
     * 
     ************************************************************************************** */
    function resetValues(){
        var f = this.aFData['fields'];
        
        var aValues=new Array();

        for( key in f ) {  
            var element=$(f[key]);
            var name=$(f[key]).attr('name');
            
            if( element.attr('use')!='x' ) {
                
                switch( element.attr('type') ){

                    case 'checkbox':
                        element.attr('checked',false);                      
                        break;

                    case 'textarea':                        
                        if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService' ) {
                           var mce = tinyMCE.get( name ); 
                            mce.setContent('');   
                        }else{
                            element.attr('value','');
                        }                     
                        break;

                        
                    case 'select-one':
                        var v=element.attr('value');
                        $("form[name='"+this.aFData['formname']+"'] select[name='"+key+"'] option[value='"+v+"']").attr('selected','');
                        break;


                    default:                    
                        element.attr('value','');
                        break;
                } 
            
            }

        }
        
        _procMain(this.aFData, '');

        return aValues;

    }


    /* ***************************************************************************************
     * enables all control objects (marked as use="c")
     * in current form
     ************************************************************************************** */
    function enableSubmit(){
        _enableControls(this.aFData);
    }

    /* ***************************************************************************************
     * disables all control objects (marked as use="c")
     * in current form
    ************************************************************************************** */
    function disableSubmit(){
        _disableControls(this.aFData);
    }

    /* ***************************************************************************************
     * enables/disables all active controls for form
     * formd -- (str) form name
     ************************************************************************************** */
    function _enableControls(fdata){
        var f = fdata['controls'];
        for( key in f ) {  
             $(f[key]).attr('disabled', false);
        }
    }

    /* ***************************************************************************************
     * enables/disables all active controls for form
     * formd -- (str) form name 
     ************************************************************************************** */
    function _disableControls(fdata){
        var f = fdata['controls'];
        for( key in f ) {  
             $(f[key]).attr('disabled', true);
        }
    }

    /* ***************************************************************************************
     * required controller
     ************************************************************************************** */
    function _procMain(fdata, type){
        var f = fdata['fields'];

        var b=true;
        
                
        for( key in f ) {  
             var element=$(f[key]);             
             var filters=fdata['filters'][key];
             
             for( key2 in filters ) {
                var value2=filters[key2];
                switch( key2 ){
                    
                    /* ************************************************** */
                    case 'maxlen':
                        var v=element.attr('value');  
                        if( v.length > value2 ) {
                            v =v.substr(0, value2);
                            element.attr('value',v);
                        }
                              
                        break;

                    /* ************************************************** */
                    case 'minlen':
                        var v=element.attr('value');  
                        if( v.length > 0 && v.length < value2 ) {
                            b=b*false;
                        }                              
                        break;



                    
                    /* ************************************************** */
                    case 'maxval':
                        var v=element.attr('value');                          
                        if( v.length > 0 && (parseInt(v) > parseInt(value2)) ) {
                            b=b*false;                            
                        }
                        break;

                    /* ************************************************** */
                    case 'minval':
                        var v=element.attr('value');  
                        if( v.length > 0 && ( parseInt(v) < parseInt(value2)) ) {
                            b=b*false;
                        }                              
                        break;



                    /* ************************************************** */
                    case 'digits_only':
                        var v=element.attr('value');
                        var r=/[^0-9, ]/;                                                 
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                                                        
                        }
                        break;
                     /* ************************************************** */
                    case 'interval':
                        var v=element.attr('value');
                        var r=/[^0-9,|\* ]/;                                                 
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                                                        
                        }
                        break;


                    /* ************************************************** */
                    case 'letters_only':
                        var v=element.attr('value');
                        var r=/\d+/;                                                  
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                            
                        }
                        break;
                    
                    /* ************************************************** */
                    case 'norussian':
                        var v=element.attr('value');
                        var r=/[А-Яа-я]+/;                                                  
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v); 
                        }
                        break;

                    /* ************************************************** */
                    case 'nolatin':
                        var v=element.attr('value');
                        var r=/[A-Za-z]+/;                                                 
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                            
                        }
                        break;     

                    /* ************************************************** */
                    case 'nospec':
                        var v=element.attr('value');
                        var r=/(\\|\/|\.|\,|\:|\;|\-|\+|\=|\(|\)|\&|\^|\@|\*|\$|\#|\`)+/;                                                  
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                            
                        }
                        break;

                    /* ************************************************** */
                    case 'login':
                        var v=element.attr('value');
                        var r=/(\\|\/|\.|\,|\:|\;|\-|\+|\=|\(|\)|\&|\^|\@|\*|\$|\#|\`|[А-Яа-я])+/;                                
                        if( v.length > 0 && r.test(v) ) {
                            v=v.replace(r, '');
                            element.attr('value',v);                            
                        }
                        break;
                        
                    /* ************************************************** */
                    case 'email':
                        var v=element.attr('value');
                        var r=/[0-9a-z_]+@[0-9a-z_^.]+\.[a-z]{2,4}/i;                                
                        b=b*true;
                        if( v.length > 0  ) {
                            if( r.test(v)){
                            }else{
                                b=b*false;
                            }
                        }
                        break;



                    /* ************************************************** */
                    case 'required':
                        if( element.attr('value').length > 0 ) {
                            b=b*true;
                        }else{
                            b=b*false;
                        }
                        break;
                }
             }
             
        }

        /* proc M6 */
        if( b ) {
            _enableControls(fdata);
        }else{
            _disableControls(fdata);            
        } 

    }


    /* ***************************************************************************************
     * required controller
     ************************************************************************************** */
    function _procRequired(formd){
        /* acheck all fields with this filter
         * if all NOT NULL, enable submit */
         
        var b=true; 
        var v="";
        var a= $("form[name='"+formd+"'] input[filter~='required'], textarea[filter~='required']");
        a.each(function(n,element){
            v=$(element).attr('value')
            if( v.length > 0 ) {
                b=b*true;
            }else{
                b=b*false;
            }
        });               

        if( b ) {
            _enableControls(formd);
        }else{
            _disableControls(formd);            
        }  
    }

    /* ***************************************************************************************
     * required controller
     * formd -- (str) form name
     * field -- (str) field name
     * flag  -- [1|0] 1 -- max 0 -- min
     * val   -- (int) value of length
     ************************************************************************************** */
    function _procLen(formd, field, flag, val ){
        var f= $("form[name='"+formd+"'] *[name='"+field+"']");        
        var v=f.attr('value');
        
        if( flag == 1 ) {
            if( v.length > val ) {
                v =v.substr(0, val);
                f.attr('value',v);
            }
        }else{

            var b=true;
            var v="";
            var a= $("form[name='"+formd+"'] *[filter~='minlen']");
            a.each(function(n,element){
                v=$(element).attr('value');                
                if( v.length > val ) {
                    b=b*true;
                }else{
                    b=b*false;
                }                
            });               

            if( b ) {
                _enableControls(formd);
            }else{
                _disableControls(formd);            
            }  
        }
    }

    /* ***************************************************************************************
     * required controller
     * formd -- (str) form name
     * field -- (str) field name
     * flag  -- [1|0] 1 -- max 0 -- min
     * val   -- (int) value of length
     ************************************************************************************** */
    function _procLim(formd, field, flag, val ){
        var f= $("form[name='"+formd+"'] *[name='"+field+"']");        
        var v=f.attr('value');
        
        var filt=/required/;

        if( !filt.test(f.attr('filter')) && v.length > 0 ) {
            alert('aa');
        
            if( flag == 1 ) {
                if( v > val ) {
                    _disableControls(formd);
                }else{
                    _enableControls(formd);
                }
            }else{
                if( v < val ) {
                    _disableControls(formd);
                }else{
                    _enableControls(formd);
                }                  
            }

        }else{
            if( v.length > 0 ) {

            }else{
                
            }
        }
    }

};

