function makeCache(list,size){ let cache = []; var size = size ||10; function fillCache(){ while (cache.length < size && list.length>0){ let file = list.shift();//pop first console.log("caching file:"+file.name) let reader = new FileReader(); reader.readAsDataURL(file); reader.domelem = undefined; reader.name = file.name; /*reader.onload=function(e){//slow, jumpy, ram hungry console.log("created img tag for:"+reader.name) reader.domelem = document.createElement("img"); reader.domelem.setAttribute('src', reader.result); reader.domelem.setAttribute('id', "mainImage"); reader.domelem.setAttribute('style', "display:block"); }*/ cache.push(reader); } } function next(){ fillCache(); let reader = cache.shift() if (reader === undefined){ return undefined; } if(reader.readyState === FileReader.DONE){ return reader; } else{ console.log("warning: file not loaded"); cache.unshift(reader); return null; } } function test(){ console.log(list); console.log(size); console.log(cache); } fillCache()//initialize cache return {"next":next,"test":test}; }; function displayImage(cache,domelem,delay){ let reader = cache.next(); if(reader === undefined){ console.log("done"); domelem.style.display="none"; document.getElementById("config").style.display="block"; } else{ if(reader){//if cache ready //domelem.replaceWith(reader.domelem); //setTimeout(displayImage,delay,cache,reader.domelem,delay); domelem.src=reader.result; setTimeout(displayImage,delay,cache,domelem,delay); } else{ console.log("waiting") setTimeout(displayImage,delay,cache,domelem,delay); } } } Date.prototype.addHours= function(h){ this.setHours(this.getHours()+h); return this; } //set current date document.getElementById('datePicker').defaultValue = (new Date).addHours(3).toISOString().slice(0,-5); document.getElementById("filePicker").onchange=function(){ let files=Array.from(this.files); let names= files.map(file => file.name); document.getElementById("fileNames").innerText = "filenames:\n"+names.join("\n"); console.log(names); }; //demo mode: if (document.location.hash === "#demo"){ document.getElementById("mainImage").style.display="block"; document.getElementById("mainImage").src="testimages/IMG_20150912_10_59_42_NX2000.jpg" document.getElementById("config").style.display="none"; } document.getElementById("startButton").onclick=function(){ console.log("starting"); let dateInput = document.getElementById("datePicker"); console.log("date valid:"+dateInput.checkValidity()); console.log(dateInput.value); document.getElementById("mainImage").style.display="block"; document.getElementById("config").style.display="none"; let files = Array.from(document.getElementById("filePicker").files); let img = document.getElementById("mainImage"); let delay = document.getElementById("delayPicker").value; let cache = makeCache(files,50); let mode = document.querySelector('input[name="modeSelector"]:checked').value; setTimeout(displayImage,delay,cache,img,delay); console.log(cd2) if (mode==="countdown"){ cd2.Div = "clock2"; cd2.DisplayFormat = "%%D%% %%H%% : %%M%% : %%S%%" cd2.TargetDate = dateInput.value; cd2.Setup(); } if (mode==="clock"){ cd2 = new clock("cd2"); cd2.Div = "clock2"; cd2.DisplayFormat = "%%H%% : %%M%%" cd2.Setup(); } }; /*snippets reader = new FileReader(); reader.readAsDataURL(Array.from(document.getElementById("filePicker").files)[0]); files=Array.from(document.getElementById("filePicker").files); files.forEach((file)=>{console.log(file.name)}) c=makeCache(Array.from(document.getElementById("filePicker").files),10) c.next() tag= document.createElement("img"); tag.setAttribute('id', "mainImage"); tag.setAttribute('src', "testimages/1.jpg"); tag.setAttribute('style', "display:block"); document.getElementById("mainImage").replaceWith(tag) */ function clock(obj) { this.obj = obj; this.Div = "clock"; this.BackColor = "white"; this.ForeColor = "black"; this.TargetDate = "11/22/2013 5:00 AM"; this.DisplayFormat = "%%D%% Days, %%H%% Hours, %%M%% Minutes, %%S%% Seconds."; this.CountActive = true; this.DisplayStr; this.Update = cl_Update; this.Setup = cl_Setup; } function cl_Update() { let d = new Date() this.DisplayStr = this.DisplayFormat.replace(/%%D%%/g,""); this.DisplayStr = this.DisplayStr.replace(/%%H%%/g, d.getHours()); this.DisplayStr = this.DisplayStr.replace(/%%M%%/g, d.getMinutes()); this.DisplayStr = this.DisplayStr.replace(/%%S%%/g,""); document.getElementById(this.Div).innerHTML = this.DisplayStr; let obj = this; if (obj.CountActive) { setTimeout(function(){ obj.Update() },1000 ); } } function cl_Setup() { this.Update(); }