
function DocAssocArray(){
    this.code=new Array();
    this.msg=new Array();

    this.find=function(code){
        var ix=this.code.length;
        for(var i=0;i<ix;i++){
            var cd=this.code[i];
            if(cd==code){
                ix=i;
                break;
            }
        } return ix;
    }

    this.set=function(code, message){
        var ix=this.find(code);
        this.code[ix]=code; this.msg[ix]=message;
    }
    
    this.get=function(code){
        var ix=this.find(code);
        if(this.msg[ix]+''=='undefined')
            return '';
        return this.msg[ix];
    }
}

var docError = new DocAssocArray();

function DocLibrary(prefix, conf, me, target){
    
    this.prefix=prefix;
    this.conf=conf;
    this.me=me;
    this.target=target;

    this.sch=null;
    this.rootUrl='http://www.rustocks.com/tools/docRequest/'
    this.baseUrl=this.rootUrl+'index.php/';
    
    this.clientHost=document.location.host;

//    window.status=this.clientHost;

    this.commonUrl=this.baseUrl+this.clientHost+'/'+this.conf;

    this.requestId=null;

    this.currentStep=0;

    this.normColor='';
    this.errColor='#EECCCC';

    this.errorJoin='; ';
//utils    
    //error message show
    this.error=function(code){
            var errorbox = document.getElementById(this.prefix+'.errorbox');
            var messages = new Array();
            
            if(!code.join) code=new Array(code);

            for(var i=0;i<code.length;i++){
                messages[i]=docError.get(code[i]);
            }
            
            errorbox.innerHTML=messages.join(this.errorJoin);
//            alert(docError.msg);
    }
    //append script
    this.client=null;
    this.jsLoad=function(url){
        if(this.sch!=null){
            document.body.removeChild(this.sch);
        }
        if(this.client!=null){
            var arurl=url.split('?');
            var params=arurl.length>1?arurl[1].split('&'):(new Array());
            params[params.length]='client='+this.client;
            arurl[1]=params.join('&');
            url=arurl.join('?');
        }
        this.sch=document.createElement('script');
        this.sch.setAttribute('language','javascript');
        this.sch.setAttribute('src',url);

        document.body.appendChild(this.sch);
    }
    //js output
    
    this.jsDisp=function(content){
        var container=document.getElementById(this.target);
        
        if(container+''!='undefined' && container!=null)
            container.innerHTML=content;
            
    }

    this.jsPrint=function(content){
        this.jsDisp(content);
        this.chainParamsNext();
    }
    //synchronized chain of requests
    this.chainParams=null;
    this.chainStep=-1;
    this.jsSendParams=function(params /*docAssocArray*/){
        params.set('theEnd', 'yeah');
        this.chainParams=params;
        this.chainStep=0;
        this.chainParamsNext();
    }
    
    //form 3 skipper
    this.skip3=false;
    this.wait4="...";
    //ready handler
    this.chainParamsNext=function(){
        //???????? ???? ?? ?
        if(this.chainStep<0 || this.chainParams==null || this.chainStep>=this.chainParams.code.length){
            this.chainParams=null;
            this.chainStep=-1;
            return;
        }
        //???? ????, ?? ????????? ???
        this.jsDisp(this.wait4);
        var code=this.chainParams.code[this.chainStep];
        var val=this.chainParams.get(code);

        this.chainStep++;

        var params=new Array();
        params[params.length]=code+'='+val;
        
        params[params.length]='requestId='+this.getRequestId();
        
        params='?'+params.join('&');
        var frm='form'+(this.currentStep+1);
        
        var url=this.baseUrl+this.clientHost+'/'+this.conf+'/'+frm+'/'+me+params;

        this.jsLoad(url);
        if(code=='theEnd' && this.currentStep+1==3 && this.skip3){
            this.jsDisp(this.wait4);
            window.setTimeout(me+".submitForm3()",1000);
        }
    }
    //cookies setting 
    this.setCookie=function(name, value){
        var expires=new Date();
        expires.setFullYear(expires.getFullYear()+1);

        document.cookie=name+'='+escape(value)+'; expires='+expires.toGMTString()+';';
//        alert (escape(value));
    }
    //cookies reading
    this.getCookie=function(name){
        var cooks=(document.cookie+"").split(';');
        for(var i=0;i<cooks.length;i++){
            var pair=(cooks[i]+"").split('=');

            //alert("'"+pair.length+"'"+pair[0]+"'"+pair[1]+"'");

            if(pair.length==2 && ((pair[0]+"")==name || (pair[0]+"")==(" "+name))){ 

                //alert(pair[1]);

                return unescape(pair[1]);
            }
        }
        return null;
    }
    //cookies removing

    //////////////////
    this.getRequestId=function(){

        if(this.requestId==null){
            var inputs=document.getElementsByTagName('INPUT');
            
            for(var i=0;i<inputs.length;i++){
                
                var name=inputs[i].getAttribute('name');
                var value=inputs[i].value;

                if(name==this.prefix+'.requestId'){
                    this.requestId=value;
                    this.setCookie('requestId', this.requestId);
                }

            }
            
        }
        
        if(this.requestId==null){
            this.requestId=this.getCookie('requestId');
        }
        return this.requestId;
    }

    this.adddn=null;
    this.addhc=null;

    this.addDN=function(pr_id){
        this.adddn=pr_id;
        this.createForm1();
    }
    this.addHC=function(pr_id){
        this.addhc=pr_id;    
        this.createForm1();
    }
    ////////////////
    this.remdn=null;
    this.remhc=null;
    
    this.remDN=function(e,pr_id){
        if(e.target) target=e.target; else target=e.srcElement;
        if(!target.checked) {
            this.remdn=pr_id;
            this.createForm1();
        } else this.addDN(pr_id);
    }
    this.remHC=function(e,pr_id){
        if(e.target) target=e.target; else target=e.srcElement;
//alert(target);
        if(!target.checked) {
            this.remhc=pr_id;
            this.createForm1();
        }    else this.addHC(pr_id);
    }
//create form1
    this.form1Comp=null;
    this.setForm1Comp=function(comp){
        if(comp=='') comp=null;
        this.form1Comp=comp;
    }
    this.createForm1=function(){
        
        var params=new Array();
        
        if(this.remhc!=null) params[params.length]='remhc='+this.remhc;
        this.remhc=null;

        if(this.remdn!=null) params[params.length]='remdn='+this.remdn;
        this.remdn=null;
        
        if(this.addhc!=null) params[params.length]='addhc='+this.addhc;
        this.addhc=null;

        if(this.adddn!=null) params[params.length]='adddn='+this.adddn;
        this.adddn=null;

        if(this.form1Comp!=null) params[params.length]='compcode='+this.form1Comp;


        params[params.length]='requestId='+this.getRequestId();
        
        if(params.length>0) params='?'+params.join('&');
        else params="";

        var url=this.baseUrl+this.clientHost+'/'+this.conf+'/form1/'+me+params;
//alert(url);
        this.jsLoad(url);
    }
//read and submit form1
    this.hc=new Array();
    this.dn=new Array();

    this.submitForm1=function(){
        this.hc=new Array();
        this.dn=new Array();

        var inputs = document.getElementsByTagName('input');
        for(var i=0;i<inputs.length;i++){
            
            var name=inputs[i].getAttribute('name');
            var value=inputs[i].value;

            if(name==this.prefix+'.requestId'){
                this.requestId=value;
                this.setCookie('requestId', this.requestId);
            }

            if(name==this.prefix+'.hc' && inputs[i].checked){
                this.hc[this.hc.length]=value;
            }
            if(name==this.prefix+'.dn' && inputs[i].checked){
                this.dn[this.dn.length]=value;
            }
        }
        //????????? ??????
        if(this.hc.length==0 && this.dn.length==0) {
            this.error('nodoc');
            return;
        }
        //??????? ?? ????????? ???
        this.currentStep=1;
        this.createForm2();
    }
//create form2
    this.createForm2=function(){
        var params=new Array();
        
        params[params.length]='hc='+this.hc.join(',');
        params[params.length]='dn='+this.dn.join(',');
        
        params[params.length]='requestId='+this.getRequestId();
        
        params=params.length>0?'?'+params.join('&'):'';

        var url=this.baseUrl+this.clientHost+'/'+this.conf+'/form2/'+me+params;

        this.jsLoad(url);
//        alert(url);
    }
//read form2
    this.f2Params=new DocAssocArray();

    this.readForm2=function(){
        var result=true;

        this.f2Params=new DocAssocArray();
        var inputs=document.getElementsByTagName('input');

        var prefix=this.prefix+'.f2.';
        var errors=new Array();

        for(var i=0; i<inputs.length;i++){
            var name  = inputs[i].name;
            var value = inputs[i].value;

            if(name.indexOf(prefix)==0 && (name=name.split(prefix)).length>1 && (name=name[1].split('.')).length>1 ){

                this.f2Params.set(name[1],escape(value));
                
                inputs[i].style.backgroundColor=this.normColor;

                if( name[0]=='req' && value.split(' ').join('')==''){
                    errors[0]='emptyField';
                    inputs[i].style.backgroundColor=this.errColor;
                    result=false;
                }
                if( name[0]=='eml' ){

                    if( (value=value.split(' ').join(''))=='' ){
                        errors[0]='emptyField';
                        inputs[i].style.backgroundColor=this.errColor;
                        result=false;
                    }
                    var email;
                    if( !(
                               (email=value.split('@')).length==2
                            && (email[1]=email[1].split('.')).length > 1
                            && email[1][email[1].length-1].length > 1
                            && email[1][email[1].length-2].length > 0
                            && email[0].length > 0
                         )
                      ){
                        errors[errors.length]='incorrectEmail';
                        inputs[i].style.backgroundColor=this.errColor;
                        result=false;
                    }
                }
            }
        }
        inputs=document.getElementsByTagName('select');
        prefix=this.prefix+'.optional.';
        var opQ=new Array();
        for(var i=0; i<inputs.length;i++){
            var name  = inputs[i].name;
            var value = inputs[i].value;
            if(name.indexOf(prefix)==0 && (name.split(prefix)).length>1){
                if(value=='') continue;
                opQ[opQ.length]=value;
            }
        }
        if(opQ.length>0){
            opQ=opQ.join(',');
            this.f2Params.set('optional', escape(opQ));
        }
        //
        if(!result) this.error(errors);
        else this.error('');
        return result;
    }
//submit form2
    this.submitForm2=function(){
        if(!this.readForm2()) return;
        this.currentStep=2;
        this.createForm3();
    }
//skip3
    this.submitForm2skip3=function(){

        if(!this.readForm2()) return;
        this.currentStep=2;
        this.jsSendParams(this.f2Params);
        
    }
//create form3
    this.createForm3=function(){
        this.jsSendParams(this.f2Params);    
    }
//submit form3
    this.submitForm3=function(){
        this.currentStep=3;
        this.createForm4();
    }
//create form 4
    this.createForm4=function(){
    
        var params=new Array();
        params[params.length]='requestId='+this.getRequestId();
        
        params[params.length]='order=ok';
        params='?'+params.join('&');

        var url=this.baseUrl+this.clientHost+'/'+this.conf+'/form4/'+me+params;

        this.jsLoad(url);
    }
////additional Panes
    this.loadFinders=function(){
        this.loadFilter();
        this.loadList();
    }
//////////////////filterPane
    this.filterScr=null;
    this.filterTarget=null;
    this.setFilterPane=function(target){
        this.filterTarget=target;
    }

    this.yearFilter='';
    this.setYearFilter=function(filter){
        this.yearFilter=filter;
        this.compFilter='';
    }
    
    this.industryFilter='';
    this.setIndustryFilter=function(filter){
        this.industryFilter=filter;
        this.compFilter='';
    }

    this.alphaFilter='';
    this.setAlphaFilter=function(filter){
        this.alphaFilter=filter;
        this.compFilter='';
    }
    
    this.compFilter='';
    this.setCompFilter=function(filter){
        this.compFilter=filter;

    }
    
    this.loadFilter=function(){
        if(this.filterTarget==null) return;
        //create url
        var params=new Array();
        
        params[0]="date="+this.yearFilter;
        params[1]="sector="+this.industryFilter;
        params[2]="alpha="+this.alphaFilter;
        params[3]="company="+this.compFilter;

        
        var url=this.rootUrl+"list.php/"+this.clientHost+'/'+this.conf+"/filter/"+me+"?"+params.join('&');

        if(this.filterScr!=null){
            document.body.removeChild(this.filterScr);
        }
        this.filterScr=document.createElement('script');
        this.filterScr.setAttribute('language','javascript');
        this.filterScr.setAttribute('src',url);

        document.body.appendChild(this.filterScr);
        
    }
    //callback
    this.showFilter=function(content){
        var container=document.getElementById(this.filterTarget);
        if(container+''!='undefined')
            container.innerHTML=content;
    }
/////////////list Pane
    this.listScr=null;
    this.listTarget=null;
    this.setListPane=function(trgt){
        this.listTarget=trgt;
    }

    this.loadList=function(){
        if(this.listTarget==null) return;
        //create url
        var params=new Array();
        
        params[0]="date="+this.yearFilter;
        params[1]="sector="+this.industryFilter;
        params[2]="alpha="+this.alphaFilter;
        params[3]="company="+this.compFilter;

        
        var url=this.rootUrl+"list.php/"+this.clientHost+'/'+this.conf+"/list/"+me+"?"+params.join('&');

        if(this.listScr!=null){
            document.body.removeChild(this.listScr);
        }
        this.listScr=document.createElement('script');
        this.listScr.setAttribute('language','javascript');
        this.listScr.setAttribute('src',url);

        document.body.appendChild(this.listScr);
        
    }

    //callback
    this.showList=function(content){
        var container=document.getElementById(this.listTarget);
        if(container+''!='undefined')
            container.innerHTML=content;
    }
    
//initialization routine
    this.init=function(){
        this.getRequestId();
    if(this.currentStep==0) this.createForm1();
    
    }
    //
    //this.init();
}
