';var goodNum=Math.round(tm/3)
console.log('my.ansNum',my.ansNum,goodNum)
if(my.ansNum';s+='Try to answer at least '+goodNum+' questions in '+fmtTime(tm);s+='';}
var stats=getTableStats([1,1,10,10]);if(stats.length>0&&stats[1]>0){s+=' ';s+='
';s+='
';s+='Overall (1 to 10) Table Results:';s+='
';s+='
';var pct=parseInt((stats[0]/stats[1])*100+0.49);if(pct>99){s+='You have mastered ALL the facts!';s+=' Bravo and Well Done!';}else{s+='You have mastered '+stats[0]+' of '+stats[1]+' facts';s+=' ';s+='Average score for the whole table is '+parseInt(stats[2]*100+0.49)+'%';}
s+='
';s+='
';}}
s+='';return(s);}
function newGame(id){my.pop.yes();for(var i=0;i0){my.currEqun=my.queue.shift();}else{my.currEqun.makeQ(my.game.ops,my.game.limits,"R");}
document.getElementById('currQ').innerHTML=my.currEqun.getQ();document.getElementById('currA').innerHTML=" ";my.ans="";if(my.prevRightQ){my.ctimer.restart(getCutoff());}else{my.ctimer.stop();}
document.getElementById('table').innerHTML=getTableHTML();}
function getTableStats(limits){var op=my.game.ops;var eqs=my.equns.eqs;var tot=0;var good=0;var ratSum=0;if(op in eqs){for(var a=limits[0];a<=limits[2];a++){for(var b=limits[1];b<=limits[3];b++){if(op=='-'&&a-b<0)continue;tot++;var ab=a+"_"+b;if(ab in eqs[op]){var rat=eqs[op][ab].getRatio();ratSum+=rat;if(rat>0.99){good++;}}else{}}}}
var ratAvg=0;if(tot>0)ratAvg=ratSum/tot;return[good,tot,ratAvg];}
function getTableHTML(){var s='';var tileWidth=33;var tileHeight=20;var limits=my.game.limits;var cols=limits[3]-limits[1]+1;var rows=limits[2]-limits[0]+1;var tableX=25;var tableY=20;s+='
';var j;for(var i=0;i=0){s+='
';s+=eq.getPct()+'%';s+='
';}}}
for(i=0;i<(limits[2]-limits[0]+1);i++){s+='
';s+=limits[0]+i;s+='
';}
for(j=0;j<(limits[3]-limits[1]+1);j++){s+='
';s+=limits[1]+j;s+='
';}
s+='
';return s;}
function showTablePopup(cell){var pop=document.getElementById("tablepop");pop.style.transitionDuration="0s";pop.style.opacity=1;pop.style.zIndex=100;var left=cell.style.left;left=left.replace(/px/g,"")>>0;left-=60;left=Math.min(Math.max(0,left),w-180);pop.style.left=left+"px";var top=cell.style.top;top=top.replace(/px/g,"")>>0;top+=480;pop.style.top=top+"px";var celldata=cell.id.split('_');var i=celldata[1];var j=celldata[2];var eq=my.table[i][j];pop.innerHTML=eq.qStr+eq.answer;my.popupStt=new Date();setTimeout(hideTablePopup,2000);}
function hideTablePopup(){var now=new Date();var elapsed=now-my.popupStt;if(elapsed>1900){var pop=document.getElementById("tablepop");pop.style.transitionDuration="1s";pop.style.opacity=0;pop.style.zIndex=0;}}
function getAutoQuestion(){var probSum=0;var r,j,eq;for(var i=0;irandProb){foundQ=true;return eq;}
if(foundQ)
break;}}
return null;}
function fillQueue(){var preva=my.currEqun.a;var prevb=my.currEqun.b;if(my.queue.length>0){var eqn=my.queue[my.queue.length-1];preva=eqn.a;prevb=eqn.b;}else{preva=my.currEqun.a;prevb=my.currEqun.b;}
var attempt=0;while(my.queue.length<2&&attempt<100){var limits=my.game.limits;var row=getRandomInt(limits[0],limits[2])-limits[0];var col=getRandomInt(limits[1],limits[3])-limits[1];var eq=my.table[row][col];eq=getAutoQuestion();if(eq.a==preva&&eq.b==prevb){}else{my.queue.push(eq);preva=eq.a;prevb=eq.b;}
attempt++;}
document.getElementById('queue').innerHTML=fmtQueue();}
function fmtQueue(){var s='';for(var i=0;i';}
return s;}
function checkKeyPressed(ev){var keyCode=ev.keyCode;if(keyCode>=96&&keyCode<=105){doKey((keyCode-96).toString());ev.preventDefault();}
if(keyCode>=48&&keyCode<=57){doKey((keyCode-48).toString());ev.preventDefault();}
if(keyCode==8||keyCode==46){if(my.ans.length>0){my.ans=my.ans.substr(0,my.ans.length-1);document.getElementById('currA').innerHTML=my.ans;}
ev.preventDefault();}
if(keyCode==9||keyCode==13||keyCode==32||keyCode==110){ev.preventDefault();}
if(my.isGameOver){my.ans='';}}
function doKey(c){if(c.charCodeAt(0)==8592){my.ans=my.ans.substring(0,my.ans.length-1);document.getElementById('currA').innerHTML=my.ans;}else{my.ans+=c;document.getElementById('currA').innerHTML=my.ans;my.ctimer.more(0.5);check();}}
function check(){if(my.isGameOver)
return;if(my.isGamePaused)
return;var correctAns=my.currEqun.getAnswer();if(my.ans.lengthcorrectAns.length)
return;setTimeout(check2,50);fillQueue();}
function check2(){var correctAns=my.currEqun.getAnswer();var rightQ=false;if(my.ans==correctAns){rightQ=true;}
if(my.timeoutQ){rightQ=false;}
var hist="";my.ansNum++;if(rightQ){if(my.soundQ)document.getElementById('sndyes').play();my.rightNum++;hist+='';hist+=my.currEqun.getQ()+' '+my.currEqun.getAnswer();hist+='';hist+='';hist+=" ✔";hist+='';my.currEqun.addHist(1);}else{if(my.soundQ)document.getElementById('sndno').play();hist+='';hist+=my.currEqun.getQ()+' ';hist+='';hist+='';hist+=' '+my.currEqun.getAnswer();hist+='';if(my.ans.length>0){hist+=' ';hist+='';hist+=my.ans;hist+='';}
my.queue.unshift(my.currEqun);my.currEqun.addHist(0);}
my.hists.push(hist);my.prevRightQ=rightQ;my.equns.setEqun(my.currEqun);var s='';for(var i=my.hists.length-4;i';if(i>=0){s+=my.hists[i];}
s+='';}
document.getElementById('ansNum').innerHTML=my.ansNum.toString();document.getElementById('rightNum').innerHTML=my.rightNum.toString();document.getElementById('rightPct').innerHTML=Math.round(100*my.rightNum/my.ansNum)+"%";document.getElementById('hist').innerHTML=s;if(rightQ){newQ();}else{newQ();}}
function doTab1(id){var idNo=Number(id.substr(1));for(var i=0;i'+game.name+'';}}
return s;}
function getTrainerHTML(){var s='';s+='
';s+='
';s+='';my.soundQ=true
s+=soundBtnHTML()
s+='
';s+='
';s+='
';s+='
';s+='
';s+='
';s+='
';s+='';s+='
';s+='
';s+='
';s+='
';s+='
';s+='';s+='
';s+='
';s+='
';s+='
';s+='
';s+=getKeyBdHTML();s+='
';s+='
abc
';s+='
';s+='
';return s;}
function getDropdownHTML(opts,funcName,id){var s='';s+='';return s;}
function getKeyBdHTML(){var keyss=[["7","8","9"],["4","5","6"],["1","2","3"],["←","0"]];var s='';for(var i=0;i';for(var j=0;j'+key+'';}
s+='';}
return s;}
function keybdClick(c){doKey(c);}
function loadGames(){my.games=[];addGame("add-1-1-4-4",[["1+1 to 4+4","1+1 a 4+4"],"+",[1,1,4,4],"Add"]);addGame("add-1-1-6-6",[["1+1 to 6+6","1+1 a 6+6"],"+",[1,1,6,6],"Add"]);addGame("add-2-2-10-10",[["2+2 to 10+10","2+2 a 10+10"],"+",[2,2,10,10],"Add"]);addGame("add-2-2-12-12",[["2+2 to 12+12","2+2 a 12+12"],"+",[2,2,12,12],"Add"]);addGame("add-9-9-20-20",[["9+9 to 20+20","9+9 a 20+20"],"+",[9,9,20,20],"Add"]);addGame("sub-2-1-6-4",[["2-1 to 6-4","2-1 a 6-4"],"-",[2,1,6,4],"Subtract"]);addGame("sub-2-1-10-6",[["2-1 to 10-6","2-1 a 10-6"],"-",[2,1,10,6],"Subtract"]);addGame("sub-4-2-15-10",[["4-2 to 15-10","4-2 a 15-10"],"-",[4,2,15,10],"Subtract"]);addGame("sub-9-2-20-12",[["9-2 to 20-12","9-2 a 20-12"],"-",[9,2,20,12],"Subtract"]);addGame("mult-10",[["10 Times Table","Table del 10"],"*",[2,2,10,10],"Multiply"]);addGame("mult-1-1-5-5",[["1x1 to 5x5","1x1 a 5x5"],"*",[1,1,5,5],"Multiply"]);addGame("mult-2-6-5-9",[["2x6 to 5x9","2x6 a 5x9"],"*",[2,6,5,9],"Multiply"]);addGame("mult-6-2-9-5",[["6x2 to 9x5","6x2 a 9x5"],"*",[6,2,9,5],"Multiply"]);addGame("mult-6-6-9-9",[["6x6 to 9x9","6x6 a 9x9"],"*",[6,6,9,9],"Multiply"]);addGame("mult-2-2-9-9",[["2x2 to 9x9","2x2 a 9x9"],"*",[2,2,9,9],"Multiply"]);addGame("mult-row-2",[["2x row",""],"*",[2,2,2,10],"Multiply"]);addGame("mult-row-3",[["3x row",""],"*",[3,2,3,10],"Multiply"]);addGame("mult-row-4",[["4x row",""],"*",[4,2,4,10],"Multiply"]);addGame("mult-row-5",[["5x row",""],"*",[5,2,5,10],"Multiply"]);addGame("mult-row-6",[["6x row",""],"*",[6,2,6,10],"Multiply"]);addGame("mult-row-7",[["7x row",""],"*",[7,2,7,10],"Multiply"]);addGame("mult-row-8",[["8x row",""],"*",[8,2,8,10],"Multiply"]);addGame("mult-row-9",[["9x row",""],"*",[9,2,9,10],"Multiply"]);addGame("mult-row-10",[["10x row",""],"*",[10,2,10,10],"Multiply"]);addGame("mult-col-2",[["2x column",""],"*",[2,2,10,2],"Multiply"]);addGame("mult-col-3",[["3x column",""],"*",[2,3,10,3],"Multiply"]);addGame("mult-col-4",[["4x column",""],"*",[2,4,10,4],"Multiply"]);addGame("mult-col-5",[["5x column",""],"*",[2,5,10,5],"Multiply"]);addGame("mult-col-6",[["6x column",""],"*",[2,6,10,6],"Multiply"]);addGame("mult-col-7",[["7x column",""],"*",[2,7,10,7],"Multiply"]);addGame("mult-col-8",[["8x column",""],"*",[2,8,10,8],"Multiply"]);addGame("mult-col-9",[["9x column",""],"*",[2,9,10,9],"Multiply"]);addGame("mult-col-10",[["10x column",""],"*",[2,10,10,10],"Multiply"]);addGame("mult-12",[["12 Times Table","Table del 12"],"*",[2,2,12,12],"By 12"]);addGame("mult-row-12-2",[["2x12 row",""],"*",[2,2,2,12],"By 12"]);addGame("mult-row-12-3",[["3x12 row",""],"*",[3,2,3,12],"By 12"]);addGame("mult-row-12-4",[["4x12 row",""],"*",[4,2,4,12],"By 12"]);addGame("mult-row-12-5",[["5x12 row",""],"*",[5,2,5,12],"By 12"]);addGame("mult-row-12-6",[["6x12 row",""],"*",[6,2,6,12],"By 12"]);addGame("mult-row-12-7",[["7x12 row",""],"*",[7,2,7,12],"By 12"]);addGame("mult-row-12-8",[["8x12 row",""],"*",[8,2,8,12],"By 12"]);addGame("mult-row-12-9",[["9x12 row",""],"*",[9,2,9,12],"By 12"]);addGame("mult-row-12-10",[["10x12 row",""],"*",[10,2,10,12],"By 12"]);addGame("mult-row-12-11",[["11x12 row",""],"*",[11,2,11,12],"By 12"]);addGame("mult-row-12-12",[["12x12 row",""],"*",[12,2,12,12],"By 12"]);addGame("mult-col-12-2",[["2x12 column",""],"*",[2,2,12,2],"By 12"]);addGame("mult-col-12-3",[["3x12 column",""],"*",[2,3,12,3],"By 12"]);addGame("mult-col-12-4",[["4x12 column",""],"*",[2,4,12,4],"By 12"]);addGame("mult-col-12-5",[["5x12 column",""],"*",[2,5,12,5],"By 12"]);addGame("mult-col-12-6",[["6x12 column",""],"*",[2,6,12,6],"By 12"]);addGame("mult-col-12-7",[["7x12 column",""],"*",[2,7,12,7],"By 12"]);addGame("mult-col-12-8",[["8x12 column",""],"*",[2,8,12,8],"By 12"]);addGame("mult-col-12-9",[["9x12 column",""],"*",[2,9,12,9],"By 12"]);addGame("mult-col-12-10",[["10x12 column",""],"*",[2,10,12,10],"By 12"]);addGame("mult-col-12-11",[["11x12 column",""],"*",[2,11,12,11],"By 12"]);addGame("mult-col-12-12",[["12x12 column",""],"*",[2,12,12,12],"By 12"]);addGame("mult-15",[["15 Times Table",""],"*",[2,2,15,15],"By 15"]);addGame("mult-15-col",[["11-15 Times Col",""],"*",[2,11,15,15],"By 15"]);addGame("mult-15-row",[["11-15 Times Row",""],"*",[11,2,15,15],"By 15"]);addGame("mult-col-15-13",[["13x15 column",""],"*",[2,13,15,13],"By 15"]);addGame("mult-col-15-14",[["14x15 column",""],"*",[2,14,15,14],"By 15"]);addGame("mult-col-15-15",[["15x15 column",""],"*",[2,15,15,15],"By 15"]);addGame("mult-row-13-15",[["13x15 row",""],"*",[13,2,13,15],"By 15"]);addGame("mult-row-14-15",[["14x15 row",""],"*",[14,2,14,15],"By 15"]);addGame("mult-row-15-15",[["15x15 row",""],"*",[15,2,15,15],"By 15"]);addGame("div-2",[["Divide by 2",""],"../index.html",[2,2,10,2],"Divide"]);addGame("div-3",[["Divide by 3",""],"../index.html",[2,3,10,3],"Divide"]);addGame("div-4",[["Divide by 4",""],"../index.html",[2,4,10,4],"Divide"]);addGame("div-5",[["Divide by 5",""],"../index.html",[2,5,10,5],"Divide"]);addGame("div-6",[["Divide by 6",""],"../index.html",[2,6,10,6],"Divide"]);addGame("div-7",[["Divide by 7",""],"../index.html",[2,7,10,7],"Divide"]);addGame("div-8",[["Divide by 8",""],"../index.html",[2,8,10,8],"Divide"]);addGame("div-9",[["Divide by 9",""],"../index.html",[2,9,10,9],"Divide"]);addGame("div-2-9",[["Divide by 2 to 10",""],"../index.html",[2,2,10,10],"Divide"]);}
function addGame(gameID,opts){my.games.push({id:gameID,name:opts[0][0],ops:opts[1],limits:opts[2],tab:opts[3]});}
function Equn(){this.op="*";this.a=4;this.b=5;this.qStr="?";this.answer=0;this.negativeNumbers=false;this.hist=[];this.rights=["0","1","00","01","10","11","000","001","010","011","100","101","110","111","0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111","00000","00001","00010","00011","00100","00101","00110","00111","01000","01001","01010","01011","01100","01101","01110","01111","10000","10001","10010","10011","10100","10101","10110","10111","11000","11001","11010","11011","11100","11101","11110","11111"];}
Equn.prototype.getCode=function(){var s="";s+=num2Base64(this.a);s+=num2Base64(this.b);s+=num2Base64(this.getHistCode());return(s);};Equn.prototype.getElapsed=function(){return 0;};Equn.prototype.getHistCode=function(){return this.rights.indexOf(this.getHistString());};Equn.prototype.setFromHistCode=function(n){var hs=this.rights[n];for(var i=0;i0){var lastFew=Math.min(5,this.hist.length);for(var i=this.hist.length-lastFew;i0){var lastFew=Math.min(5,this.hist.length);var rightNum=0;for(var i=this.hist.length-lastFew;i-1){return-32768;}else{if(this.negativeNumbers){return a/b;}else{if(temp<0){return-32768;}else{return a/b;}}}
break;case "c":return a+b;}
return 0;};Equn.prototype.finishQ=function(op,a,b,posn){var RHS=this.calculate(op,a,b,"finishQ");var qStr="";var answer=0;switch(posn){case "F":qStr="MM"+" "+op+" "+b+" = "+RHS;answer=a;break;case "S":qStr=a+" "+op+" "+"MM"+" = "+RHS;answer=b;break;case "R":qStr=a+" "+op+" "+b+" = "+"MM";answer=RHS;break;}
qStr=qStr.replace("*","×");qStr=qStr.replace("c","+");qStr=qStr.replace("MM","");this.qStr=qStr;this.answer=answer;};function Timer(g,rad,secs,clr,funcEnd){this.g=g;this.rad=rad;this.secs=secs;this.clr=clr;this.funcEnd=funcEnd;this.x=rad;this.y=rad;this.stt=performance.now();this.stopQ=false;}
Timer.prototype.update=function(){};Timer.prototype.restart=function(secs){this.secs=secs;this.stt=performance.now();this.stopQ=false;requestAnimationFrame(this.draw.bind(this));};Timer.prototype.more=function(secs){this.stt+=secs*1000;};Timer.prototype.stop=function(){this.stopQ=true;};Timer.prototype.draw=function(){if(this.stopQ)return;var now=performance.now();var elapsed=now-this.stt;var ratio=Math.min(1,elapsed/this.secs/1000);var g=this.g;g.beginPath();g.fillStyle="#ffffff";g.arc(this.x,this.y,this.rad,0,2*Math.PI);g.fill();g.beginPath();g.moveTo(this.x,this.y);g.fillStyle=this.clr;g.arc(this.x,this.y,this.rad,-Math.PI/2,ratio*2*Math.PI-Math.PI/2);g.fill();if(ratio<1){requestAnimationFrame(this.draw.bind(this));}else{this.funcEnd();}};function Equns(){this.eqs={};}
Equns.prototype.setHist=function(toEq){var op=toEq.op;var a=toEq.a;var b=toEq.b;if(op in this.eqs){var ab=a+"_"+b;if(ab in this.eqs[op]){toEq.hist=this.eqs[op][ab].hist;}}};Equns.prototype.setEqun=function(fromEq){var op=fromEq.op;var a=fromEq.a;var b=fromEq.b;if(!(op in this.eqs)){this.eqs[op]={};}
var ab=a+"_"+b;this.eqs[op][ab]=fromEq;};Equns.prototype.getDBString=function(){var s="02";for(var op in this.eqs){s+="__"+op;for(var ab in this.eqs[op]){s+=this.eqs[op][ab].getCode();}}
return s;};Equns.prototype.useDBString=function(s){var ver=s.substr(0,2);if(ver!="02")return "";s=s.substr(2);var chunks=[];for(var i=0,sLength=s.length;i';s+=inStr;s+='
';s+='';s+='
';s+='';return s;};function getRandomInt(min,max){return Math.floor(Math.random()*(max-min+1))+min;}
function getKeyStr(){return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_:";}
function num2Base64(n){if(n>64)
n=64;return(getKeyStr().charAt(n));}
function base642num(s){var n=getKeyStr().indexOf(s);if(n<0)
n=0;return(n);}
function fmtTime(t){var s='';if(t<60){s=t+' sec';if(t>1)s+='s';}else{var ss=t%60;var mm=(t/60)<<0;if(ss==0){s=mm+' min';if(mm>1)s+='s';}else{s=mm+'m '+ss+'s';}}
return s;}
var createCookie=function(name,value,days){localStorage.setItem(name,value)
if(true){var expires;if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";}
document.cookie=name+"="+value+expires+"; path=/";}};function getCookie(c_name){if(false){return localStorage.getItem(c_name)}else{if(document.cookie.length>0){var c_start=document.cookie.indexOf(c_name+"=");if(c_start!=-1){c_start=c_start+c_name.length+1;var c_end=document.cookie.indexOf(";",c_start);if(c_end==-1){c_end=document.cookie.length;}
return decodeURIComponent(document.cookie.substring(c_start,c_end));}}
return "";}}
function soundBtnHTML(){s=''
s+=''
s+='
'
return s}
function soundToggle(){var btn='sound'
if(my.soundQ){my.soundQ=false
document.getElementById(btn).classList.add("mute")}else{my.soundQ=true
document.getElementById(btn).classList.remove("mute")}}