var w,h,i,s,g,my={};function mathtrainerMain(imode){var version='0.941b';my.mode=typeof imode!=='undefined'?imode:'Multiply';my.optQ=true;if(imode=='express'){my.mode='Multiply';my.optQ=false;} console.log("mathtrainerMain",imode,my);w=window.innerWidth-30;if(w<380)w=380;if(w>600)w=600;h=800;my.tabs=["Add","Subtract","Multiply","By 12","By 15","Divide"];var tabNo=my.tabs.indexOf(my.mode);loadGames();my.game=my.games[9];my.cutoffs=[["2 Secs",2],["4 Secs",4],["8 Secs",8],["1 Day",86400]];my.times=[["10 Sec",10],["1 Min",60],["2 Mins",120],["3 Mins",180],["5 Mins",300],["10 Mins",600],["1 Day",86400]];var s='';s+='';s+='';s+='
';var sPop='';sPop+='
';var tab;for(i=0;i';} sPop+='
';sPop+='
';sPop+='
';sPop+='
';sPop+='';sPop+='
';my.pop=new Pop("my.pop",w-40);s+=my.pop.getPopHTML(sPop);s+='
';s+=getTrainerHTML();s+='
';s+='
fact
';s+='
© 2016 MathsIsFun.com v'+version+'
';s+='
';document.write(s);if(my.optQ){document.getElementById('time').value="5 Mins";document.getElementById('cutoff').value="4 Secs";} var timers=[['cutoffcanvas',40],['timercanvas',60]];var gs=[];for(i=0;i';s+=getTabHTML(tab);s+='
';return s;} function getTime(){if(!my.optQ){return 300;} var el=document.getElementById('time');if(el.selectedIndex==-1) return null;var t=el.options[el.selectedIndex].text;for(var i=0;i';s+='Workout'+': '+fmtTime(tm)+'
';var ct=getCutoff();s+='Cutoff'+': '+fmtTime(ct)+'
';s+='

';if(my.ansNum>0){s+='

';s+='You answered'+' '+my.ansNum+' '+'questions and got'+' '+my.rightNum+' '+' correct';var pctRight=100*my.rightNum/my.ansNum;s+='
(this session: '+parseInt(pctRight+0.49)+'% '+'correct'+')';s+='

';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+='';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")}}