| 
<html>
 <head>
 
 <style>
 body{
 height: 100%;
 width: 100%;
 background: lightcyan repeat;
 margin: 0;
 padding: 0;
 }
 #container{
 position: relative;
 width: 100%;
 height: 40%;
 }
 #content{
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 }
 #status{
 position: fixed;
 overflow: auto;
 height: 50%;
 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;
 }
 div.center {
 width: 100%;
 text-align: center;
 }
 </style>
 <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
 </head>
 
 <body>
 
 <div class="center">
 <h2>Copying multiple files demo</h2>
 <h3><a href="http://www.phpclasses.org/blog/package/9383/">Take a look on the blog of this class</a></h3>
 </div>
 
 <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<3;$i++) echo "\t".'fileList.push({ name:"'.uniqid('file-').'.ext", pending: true, size: '.(100*rand(200,300)).'});'."\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 requestStatusOfFiles() {
 var ids = "";
 for(var i=0;i<fileList.length; i++){
 if (fileList[i].pending) {
 ids += i + ",";
 }
 }
 $.ajax({
 url: '/status-copy-multi.php',
 data: {
 ids: ids,
 _task: "copy-multi"
 },
 cache: false,
 scope: this,
 type: "POST",
 success: function(data) {
 if (data.result){
 var pending = 0;
 for (var i=0; i<data.info.length; i++){
 var info = data.info[i];
 info.id = parseInt(info.id);
 switch (info.status) {
 case "done":
 updateRowId(info.id, "checkmark", null);
 fileList[info.id].pending = false;
 break;
 case "error":
 updateRowId(info.id, "alert", null);
 break;
 default:
 pending++;
 updateRowId(info.id, null, parseInt(info.percent));
 break;
 }
 }
 console.log("pending = "+pending);
 if (pending > 0) {
 setTimeout(function () { requestStatusOfFiles(); }, 800);
 }
 }else{
 logMessage(data.reason);
 }
 }
 })
 }
 
 function updateRowId(id, img, percent) {
 if (img != null) $("#file-" + id + " .loader").attr("src", "/img/"+img+".png");
 if (percent == null) percent = 100; else percent = 100-percent;
 $("#file-" + id +" td.percent").css("background-position-x", "-"+percent+"px");
 }
 
 function requestCopyOfFile(id){
 logMessage("requesting copy of file "+fileList[id].name);
 $.ajax({
 url: '/copy-multi.php',
 data: {
 id: id,
 file: fileList[id],
 _task: "copy-multi"
 },
 cache: false,
 scope: this,
 type: "POST",
 success: function(data) {
 if (data.result) {
 $("#file-" + id + " .loader").show();
 if (id == 0) {
 setTimeout(function () { requestStatusOfFiles(); }, 500);
 }
 }else {
 logMessage(data.reason);
 }
 },
 error: function(){
 logMessage("some error happened trying to start task");
 }
 });
 }
 
 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...");
 
 for(var i=0; i<fileList.length; i++) {
 requestCopyOfFile(i);
 }
 
 return false;
 })
 })
 </script>
 
 </html>
 
 |