| 
<html>
 <head>
 
 <style>
 body{
 height: 100%;
 width: 100%;
 background: lightcyan repeat;
 margin: 0;
 padding: 0;
 }
 #container{
 position: relative;
 width: 100%;
 height: 70%;
 }
 #content{
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 }
 #status{
 position: fixed;
 overflow: auto;
 height: 30%;
 bottom: 0;
 width: 100%;
 border: 1px solid black;
 padding: 0;
 margin: 0;
 }
 .loader{
 display: none;
 }
 table#file-list td{
 padding: 3px 12px 3px 12px;
 }
 table#file-list,
 table#file-list td {
 border: 1px solid black;
 }
 td.percent{
 background-image: url("/img/progress.gif");
 background-repeat: no-repeat;
 background-size: 100% 100%;
 background-position-x: -100px;
 width: 79px;
 text-align: right;
 }
 </style>
 <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
 </head>
 
 <body>
 
 <div id="container">
 <div id="content">
 <table id="file-list">
 <thead>
 <tr>
 <td>(i)</td>
 <td>File</td>
 <td>Size</td>
 </tr>
 </thead>
 <tbody></tbody>
 </table>
 <input id="start-task" type="button" value="Start copy" task="1">
 </div>
 </div>
 
 <div id="status">
 
 </div>
 
 </body>
 
 <script>
 
 var fileList = [];   // contains the list of files that user has in our server
 
 function logMessage(message){
 if ($("#status").html().length > 1000) {
 $("#status").html(message+"<br/>");
 }else{
 $("#status").append(message+"<br/>");
 }
 
 }
 
 function updateFileList(){
 // fetch the list from the server, here simulating some random data
 <?php for($i=0;$i<10;$i++) echo "\t".'fileList.push({ name:"'.uniqid('file-').'.ext", size: '.(10*rand(100,200)).'});'."\n"; ?>
 
 var content = "";
 for(var i=0;i<fileList.length; i++){
 var file = fileList[i];
 content += '<tr id="file-'+i+'">'+
 '<td><img src="img/loader.gif" class="loader"/></td>'+
 '<td>'+file.name+'</td>'+
 '<td class="percent">'+file.size+'</td>'+
 '</tr>';
 }
 $("#file-list tbody").html(content);
 }
 
 function requestStatusOfFile(id) {
 $.ajax({
 url: '/status-copy.php',
 data: {
 id: id,
 _task: "copy"
 },
 cache: false,
 scope: this,
 type: "POST",
 success: function(data) {
 if (data.result){
 if (data.status == "done") {
 $("#file-" + id + " .loader").attr("src", "/img/checkmark.png");
 $("#file-" + id +" td.percent").css("background-position-x", "-100px");
 if (id<fileList.length-1) {
 setTimeout(function() { requestCopyOfFile(id+1); }, 600);
 }
 }else{
 var percent = parseInt(data.percent);
 $("#file-" + id +" td.percent").css("background-position-x", "-"+(100-percent)+"px");
 setTimeout(function() { requestStatusOfFile(id); }, 1500);
 }
 }else{
 $("#file-" + id + " .loader").attr("src", "/img/alert.png");
 $("#file-" + id +" td.percent").css("background-position-x", "-100px");
 logMessages(data.reason);
 }
 }
 })
 }
 
 function requestCopyOfFile(id){
 logMessage("requesting copy of file "+fileList[id].name);
 $.ajax({
 url: '/copy.php',
 data: {
 id: id,
 file: fileList[id],
 _task: "copy"
 },
 cache: false,
 scope: this,
 type: "POST",
 success: function(data) {
 if (data.result) {
 $("#file-" + id + " .loader").show();
 setTimeout(function() { requestStatusOfFile(id); }, 1500);
 }else {
 logMessage(data.reason);
 }
 },
 error: function(){
 logMessage(data.reason);
 }
 });
 }
 
 var interval = 0;
 var id = 0;
 
 $(function(){
 logMessage("Welcome to asynchronous server side task demo");
 
 updateFileList();
 
 $("#start-task").click(function(e){
 e.preventDefault();
 
 $(this).hide();
 
 console.log("starting copy...");
 requestCopyOfFile(0);
 
 return false;
 })
 })
 </script>
 
 </html>
 
 |