<?php http_response_code(404); die(1); // It is a template file, not a code to execute directly. This line is used to avoid to execute or read it. ?> 
HTMLPREFIX 
<script> 
const obj_PREFIX_={ 
    interValId:[], 
    divWorker:[], 
    divWorkerError:[], 
    divWorkerEnd:{}, 
    numWorkers:NUMWORKERS, 
    onError:'ONERROR', 
    maxTry:MAXTRY, 
    coordinateMatrix:{workerInUse:[],bodyBase:BODYINIT,workerActive:0,numTry:[]}, 
    afterFetchWorker:AFTERFETCHWORKER, 
    afterFetchWorkerError:AFTERFETCHERROR, 
    start:function () { 
        for(let nw=0;nw<this.numWorkers;nw++){ 
            this.coordinateMatrix.workerInUse.push('waiting'); 
            this.coordinateMatrix.numTry.push(0); 
        } 
        this.coordinateMatrix.workerActive=this.numWorkers; 
        for(let nw=0;nw<this.numWorkers;nw++){ 
            this.divWorkerEnd = document.getElementById("PREFIX_worker_end"); 
            this.divWorker[nw] = document.getElementById("PREFIX_worker_"+nw); 
            this.divWorkerError[nw] = document.getElementById("PREFIX_worker_error_"+nw); 
            this.interValId[nw] = window.setInterval(()=>{ 
                if(this.coordinateMatrix.workerInUse[nw]==='waiting'){ 
                    this.coordinateMatrix.workerInUse[nw]='running'; 
                    HTMLLOADING 
                    this.fetchWorker(nw); 
                } 
            }, TIMEPREFIX) 
        } 
    }, 
    fetchWorker: function(nw) { 
        let bodyJson=JSON.stringify(this.coordinateMatrix.bodyBase[nw]); 
        fetch("CURRENTWEB?type=PREFIX_load&worker="+nw,{'method':'post', body: bodyJson,headers:{SES:"SESSIONID"}}) 
            .then((response) => { 
            if(response.ok) { 
                return response.json(); 
            } 
            return Promise.reject(response); 
        }) 
            .then((json) => { 
            this.coordinateMatrix.bodyBase[nw]=json.result; 
            if(json.error) { 
                this.divWorkerError[nw].innerHTML=json.error; 
                this.divWorkerError[nw].style.visibility='visible'; 
                this.whenError(nw); 
            } else { 
                this.divWorkerError[nw].style.visibility='hidden'; 
                this.divWorkerError[nw].innerHTML=''; 
            } 
            json=this.afterFetchWorker(nw,json); 
            this.divWorker[nw].innerHTML =json.ui; 
 
            if(json.type==='end'){ // end worker. 
                this.endWorker(nw); 
            } 
            this.coordinateMatrix.numTry[nw]=0; 
            this.coordinateMatrix.workerInUse[nw]='waiting'; 
        }) 
            .catch((response) => { 
            response=this.afterFetchWorkerError(nw,response); 
            this.divWorkerError[nw].style.visibility='visible'; 
            this.divWorkerError[nw].innerHTML ="Error: "+response.statusText+" ("+response.status+")"; 
            this.whenError(nw); 
        }); 
 
    }, 
    whenError: function(nw) { 
        switch(this.onError) { 
            case 'try': 
                this.coordinateMatrix.numTry[nw]++; 
                if(this.coordinateMatrix.numTry[nw]>this.maxTry) { 
                    this.endWorker(nw); 
                } else { 
                    this.coordinateMatrix.workerInUse[nw]='waiting'; 
                } 
                break; 
            case 'end': 
                this.endAllWorkers(nw); 
                break; 
            case 'stop': 
                this.endWorker(nw); 
                break; 
        } 
    }, 
    endWorker:function(nw) { 
        window.clearInterval(this.interValId[nw]); 
        this.coordinateMatrix.workerActive--; 
        if(this.coordinateMatrix.workerActive<=0) { // end all workers 
            this.endAllWorkers(); 
        } 
    }, 
    endAllWorkers:function() { 
        for(let nw=0;nw<this.numWorkers;nw++){ 
            window.clearInterval(this.interValId[nw]); 
 
        } 
        let bodyJson=JSON.stringify(this.coordinateMatrix.bodyBase); 
           fetch("CURRENTWEB?type=PREFIX_end",{'method':'post', body: bodyJson,headers:{SES:"SESSIONID"}}) 
           .then((response) => { 
            if(response.ok) { 
                return response.text(); 
            } 
            return Promise.reject(response); 
        }) 
           .then((text) => { 
            this.divWorkerEnd.innerHTML=text; 
        }) 
           .catch((response) => { 
            this.divWorkerEnd.innerHTML ="Error: "+response.statusText+" ("+response.status+")"; 
 
        }); 
    } 
 
} 
obj_PREFIX_.start(); 
 
 
</script> 
 
 |