/* ***************************************************************************************
 * BASIS Elements 
 * bsForm3, form processor
 * ! DO NOT EDIT THIS FILE WITHOUT STRONG NEEDLE
 * ! не стоит без необходимости вносить сюда изменения
 ************************************************************************************** */

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


    /* ***************************************************************************************
     * тестовая функция
     ************************************************************************************** */
    this.getInfo            = getInfo;
    function getInfo(){
        alert(this.info+_msgs);
    }
    
    this.getFormName=getFormName;
    function getFormName(){
        return this.aFData['formname'];
    }
    	    
    	
    
    /* ***************************************************************************************
     * init
     ************************************************************************************** */
    this.init               = init;
     function init( formName,debug ){
        this.aFData['formname'] = formName;
        ts='';
        if(typeof(debug)=='undefined'){
            var debug=false;
        }
        

        /* 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(debug){
             ts=ts+"\n -name="+ element.attr('name')+" use="+element.attr('use')+" filters="+element.attr('filters');
             }
             
             if( element.attr('filters') ) {
                
                var a = element.attr('filters').split('|');
                var k="";
            

                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);
                        });
                        
                    }
                }
            }


        }
        
        
        if(debug){
            alert('init form=['+formName+'] '+ts);
        }

        _procMain(this.aFData, '');


    }

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

            var element=$("form[name='"+this.aFData['formname']+"'] *[name='"+key+"']");
            
            
            if( typeof(element)=='undefined' ) {
                var name=element.attr('name');
                aValues[name]='';            
            }else{
                var name=element.attr('name'); 
               
                    if( element.is('textarea')  ){
						if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService' || element.attr('class')=='mceX' ) {
							var ti=element.attr('id');
                            var mce = tinyMCE.get( ti ); 
                            if( mce ) {
                                aValues[name] = mce.getContent();
                            } 
                        }else{
                            if( typeof(element.attr('value')) == 'undefined' ){
                                aValues[name]='';
                            }else{                               
                                aValues[name] = element.attr('value');
                            }
                        } 

                    }else if( element.is('select') ){
                        aValues[name]=element.attr('value');
                    
                    }else if( element.is('input') ){

                        if( element.attr('type')=='checkbox'  ) {
                            if( element.attr('checked') ) {
                                aValues[name] = 1;
                            }else{
                                aValues[name] = 0;
                            }  
                        
                        }else if( element.attr('type')=='radio'  ){
                        	aValues[name]=$("form[name='"+this.aFData['formname']+"'] input:radio[name='"+name+"']:checked").val();
                        }else{
                            if( typeof(element.attr('value'))!='undefined' ){
                            
                                aValues[name]=element.attr('value');

                            }else{
                                aValues[name]='';
                            
                            }
                        }

                    }           
            }

        }
        return aValues;

    }

    /* ***************************************************************************************
     * 
     ************************************************************************************** */

     this.setValues = setValues;
     function setValues( aValues ){

        for(key in aValues){         

            var element=$("form[name='"+this.aFData['formname']+"'] *[name='"+key+"']");

            if( typeof(element)!='undefined' && typeof(element.attr('name'))!='undefined' ) {
                var name=element.attr('name');
                
                if( element.attr('use')!='x' && aValues[key]!=null ) {
                
                    if( element.is('textarea') ){
                        if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService' ) {
                            var mce = tinyMCE.get( name ); 
                            if( mce ) {
                                mce.setContent(aValues[key]);
                            } 
                        
                        }else{
                        	/* 
                        		HACK zibder 2011-10-19
                        		Otherwise it not works in FF3.5+
                        	    Do not change, please!
                        	*/
                        	var ti=element.attr('id');
                        	if(isset(ti) && ti!=''){
                        		var yy=$("#"+ti).html();
                        		/*alert('set '+"#"+ti+"=="+aValues[key]+"\n WAS:"+yy);*/
                        		$("#"+ti).html(aValues[key]);
                        		$("#"+ti).parent().replaceWith( '<span>'+$("#"+ti).parent().html()+'</span>');
                        	}
                        	//element.attr('value',aValues[key]);
                        }        

                    }else if( element.is('select') ){
                        element.attr('value',aValues[key]);
                    
                    }else if( element.is('input') ){                        
                        if( element.attr('type')=='checkbox' ) {
                            if( aValues[key] && aValues[key]!='' && aValues[key]!=0  ) {
                                element.attr('checked',true);
                            }else{
                                element.attr('checked',false);
                            }
                        }else{
                            element.attr('value',aValues[key]);
                        }
                    }

                }
            }
            
        }
        _procMain(this.aFData, '');
    }

    /* ***************************************************************************************
     * 
     ************************************************************************************** */
    this.resetValues        = resetValues;    
    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' ) {
                
                var name=element.attr('name');            
                
                if( element.is('textarea') ){
                    
                    if( element.attr('class')=='mceFull' || element.attr('class')=='mceSimple' || element.attr('class')=='mceService'  ) {
                        var mce = tinyMCE.get( name );
                        mce.setContent('');
                        /*
                        if( mce ) {
                            mce.setContent('');
                        } 
                        */
                    }else{
                        element.attr('value','');
                        
                                                
                        	/* 
                        		HACK zibder 2011-10-19
                        		Otherwise it not works in FF3.5+
                        	    Do not change, please!
                        	*/
                        	var ti=element.attr('id');
                        	if(isset(ti) && ti!=''){
                        		var yy=$("#"+ti).html();
                        		/*alert('set '+"#"+ti+"=="+aValues[key]+"\n WAS:"+yy);*/
                        		$("#"+ti).html('');
                        		$("#"+ti).parent().replaceWith( '<span>'+$("#"+ti).parent().html()+'</span>');
                        	}
                        	//element.attr('value',aValues[key]);
                        

                        
                    }        

                }else if( element.is('select') ){
                    element.attr('value','');
                
                }else if( element.is('input') ){

                    if( element.attr('type')=='checkbox' ) {
                        element.attr('checked',false); 
                    }else{
                        element.attr('value','');
                    }
                }
            }
        }
        
        _procMain(this.aFData, '');
        return aValues;
    }


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

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

    /* ***************************************************************************************
     * enables/disables all active controls for form
     * formd -- (str) form name
     ************************************************************************************** */
    this._enableControls    = _enableControls;
    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 
     ************************************************************************************** */
    this._disableControls   = _disableControls;
    function _disableControls(fdata){
        var f = fdata['controls'];
        for( key in f ) {  
             $(f[key]).attr('disabled', true);
        }
    }

   
    /* ***************************************************************************************
     * required controller
     ************************************************************************************** */
    this._procMain          = _procMain;
    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];

                if( element.attr('value') ) {

                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':
                    case 'digitsonly':
                        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':
                    case 'lettersonly':
                        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;

                    /* ************************************************** */
                    case 'notnull':                        
                        if( element.attr('value')!=0 && element.attr('value')!='' && element.attr('value')!='null' ) {
                            b=b*true;
                        }else{
                            b=b*false;
                        }
                        break;

                }
                }else{
                    if( key2=='required' ) {
                        b=b*false;
                    }                    
                }
             }
             
        }
  
        /*alert('proc');*/
  
        /* proc M6 */
        if( b ) {
            _enableControls(fdata);
        }else{
            _disableControls(fdata);            
        } 

    }
    
   



};

