<script type='text/javascript'> // cross-browser event handling for IE5+, NS6+ and Mozilla/Gecko // by Scott Andrew function addEvent( elm, evType, fn, useCapture ) { if ( elm.addEventListener ) { elm.addEventListener( evType, fn, useCapture ); return true; } else if ( elm.attachEvent ) { var r = elm.attachEvent( 'on'+evType, fn ); return r; } else { elm[ 'on'+evType ] = fn; } } function addDate() { var t = new Date(); var date = t.getMonth()+1 + "/" + t.getDate() + "/" + t.getFullYear(); document.getElementById("date").innerText = date; } var sections = new Array( 's1', 'sb1', 's2', 's3', 'sb2', 's4', 'sb3', 's5'); function attachTimers() { document.getElementById('systime').innerHTML = getTime(getNow(),false,true); window.setInterval( update, 200 ); addEvent( document.getElementById('startButton'), 'click', start, false ); //addEvent( document.getElementById('sectionComboBox'), 'change', updateSection, false ); for ( var i=0; i<sections.length; i++ ) { var tr = document.getElementById( sections[i] ); var tds = tr.getElementsByTagName('td'); for ( var j=SECTION; j<tds.length; j++ ) { tds[j].style.fontStyle = 'italic'; tds[j].style.color = '#999999'; } } addEvent(document, 'keydown', handleKeypress, false); } function getTime(now,secs,ampm) { var hh = now.getHours(); var meridian = 'AM'; if ( hh >= 12 ) { hh -= 12; meridian = 'PM'; } if ( hh == 0 ) { hh = 12; } var mm = now.getMinutes(); var ss = now.getSeconds(); var time = '' + hh + ':' + zeroPad(mm); if ( secs ) time += ':' + zeroPad(ss); else if ( ss % 2 == 0 ) time = '' + hh + '<span>:</span>' + zeroPad(mm); if ( ampm ) time += '<small>' + meridian + '</small>'; return time; } function zeroPad(n) { if ( n < 10 ) return '0' + n; return n; } var sectionIndex = 0; var min2 = 2 * 60 * 1000; var min5 = 5 * 60 * 1000; var min10 = 10 * 60 * 1000; var min20 = 20 * 60 * 1000 var min25 = 25 * 60 * 1000; var min30 = 30 * 60 * 1000; var min35 = 35 * 60 * 1000; var min40 = 40 * 60 * 1000; var min45 = 45 * 60 * 1000; var min50 = 50 * 60 * 1000; var min55 = 55 * 60 * 1000; var min60 = 60 * 60 * 1000; var min65 = 65 * 60 * 1000; var min1 = 1 * 60 * 1000; var sec30 = 30 * 1000; var sec25 = 25 * 1000; var sec5 = 5 * 1000; var endingtime = null; var onbreak = false; var fastforward = false; var times = new Array( min65, min10, min35, min25, min5, min55, min2, min20 ); // var times = new Array( sec25, sec25, sec5, sec25, sec25, sec5, sec25, sec25, sec5, sec25, sec20, sec20, sec10 ); var gaps = new Array( min1, min1, min1, min1, min1, min1, min1, min1, min1, min1, min1, min1, min1 ); // enums var SECTION = 0; var DURATION = 1; var START = 2; var END = 3; var STATUS = 4; function updateSection() { sectionIndex = document.getElementById('sectionComboBox').value; } var firstnow = 0; function getNow() { var t = new Date(); if ( firstnow == 0 ) { firstnow = t; return t; } if ( ! fastforward ) return t; var diff = t.getTime() - firstnow.getTime(); t.setTime( t.getTime() + diff*120 ) return t; } function start() { var now = getNow(); var then = getNow(); now.setTime( now.getTime() + 1000 ); then.setTime( now.getTime() + times[sectionIndex] ); var tds = document.getElementById( sections[sectionIndex] ).getElementsByTagName('td'); for ( var j=0; j<tds.length; j++ ) { tds[j].style.fontStyle = 'normal'; tds[j].style.color = 'black'; } tds[START].innerHTML = getTime(now,true,false); tds[END].innerHTML = getTime(then,true,false); tds[STATUS].innerHTML = 'in progress'; endingtime = then; propogateNewTimes(then); // if we just started section 3, set stopping break time to 1 minute ago if ( sectionIndex == 3 ) { then = new Date( endingtime ); then.setTime( now.getTime() - min1 ); document.getElementById( 'sb' ).getElementsByTagName('td')[END].innerHTML = getTime(then,true,false); } } function propogateNewTimes(prevEnd) { // walk through all rows after this one, fixing the times var t = getNow(); for ( var i=sectionIndex+1; i<sections.length; i++ ) { var tr = document.getElementById( sections[i] ); var tds = tr.getElementsByTagName('td'); t.setTime( prevEnd.getTime() + gaps[i] ); tds[START].innerHTML = getTime(t,true,false); t.setTime( t.getTime() + times[i] ); tds[END].innerHTML = getTime(t,true,false); prevEnd = t; } } function update() { var now = getNow(); document.getElementById('systime').innerHTML = getTime(now,false,true); fastforward = ( document.getElementById('fastforward').checked ); if ( endingtime ) { document.getElementById('sectiontime').innerHTML = getTimeDiff(now.getTime(),endingtime.getTime()); } } function getTimeDiff(now,then) { var ms = then - now; if ( ms <= 1000 ) { endingtime = null; finishCurrentSection(); advanceSection(); return '0:00'; } if ( ms <= 61000 ) document.getElementById('sectiontime').className = 'soon'; var ss = Math.floor(ms / 1000); var mm = Math.floor(ss / 60); ss = ss % 60; return ( '' + mm + ':' + zeroPad(ss) ); } function finishCurrentSection() { // clear red from timer document.getElementById('sectiontime').className = ''; // change status from 'in progress' to 'done' document.getElementById( sections[sectionIndex] ).getElementsByTagName('td')[STATUS].innerHTML = 'done'; } var theButtonText = 'not yet begun <input type=submit id=startButton value="Start Timer">'; function advanceSection() { sectionIndex++; if ( sectionIndex == sections.length ) return; var s = sections[sectionIndex]; // break starts automatically if ( s == 'sb' ) { onbreak = true; start(); } else { document.getElementById( s ).getElementsByTagName('td')[STATUS].innerHTML = theButtonText; addEvent( document.getElementById('startButton'), 'click', start, false ); } } function preventDefault(e) { var evt = e ? e : window.event; if ( evt.preventDefault ) evt.preventDefault(); else evt.returnValue = false; return false; } var KEY_ENTER = 13; var KEY_SPACE = 32; var KEY_PG_DN = 34; var KEY_B = 66; var KEY_F5 = 116; function handleKeypress(e) { var evt = e ? e : window.event; var ch = evt.keyCode; if ( ch === KEY_PG_DN || ch == KEY_B ) { var startB = document.getElementById('startButton'); if ( startB ) { startB.click(); return preventDefault(evt); } } // This next bit is just because my stupid Kensingtom laser point sends "F5" when you press the laser. // Sorry for the inconvenience. if ( ch === KEY_F5 ) { evt.keyCode = 0; // <-- this is your fault, IE-8 return preventDefault(evt); } } addEvent( window, 'load', attachTimers, false ); addEvent( window, 'load', addDate, false); </script> <head> <title>Saturday SAT No Essay</title> <script type="text/javascript" src="SAT_Timer.js"></script> <style type="text/css"> table { font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 200%; border-collapse: collapse; margin-left: 1em; } th { border-top: 1px solid #FB7A31; border-bottom: 1px solid #FB7A31; border-right: 1px solid #FB7A31; background: #FFC; } td { border-bottom: 1px solid #CCC; border-right: 1px solid #CCC; padding: 0 0.5em; text-align: right; } td+td { border-left: 1px solid #CCC; } td#systime, td#sectiontime { font-size: 200%; } #systime span { color: #ffffff; } small { font-size: 70%; } .soon { color: #ff0000; } .tight { line-height: 140%; text-align: left; } .r { text-align: right; } </style> </head> <body> <h1>Saturday SAT No Essay</h1> <table> <tr> <td><strong>Current Time</strong></td> <td><strong>Test date:</strong></td> <td><strong>Remaining Time</strong></td> <tr> <td id=systime>--:--</td> <td> <a id="date">03/02/2016</a></td> <td id=sectiontime>--:--</td> </tr> </table> <pre> </pre> <table> <tr> <th>Section</th> <th>Duration</th> <th>Start Time</th> <th>End Time</th> <th>Status</th> </tr> <tr id=s1> <td>Section 1 ~ Reading</td> <td>65 min</td> <td> ASAP </td> <td> </td> <td>not yet begun <input type=submit id=startButton value="Start Timer"></tr> <tr id=sb1> <td>Break</td> <td>~10 min</td> <td> </td> <td> </td> <td> </td> </tr> <tr id=s2> <td>Section 2 ~ Writing & Language</td> <td>35 min</td> <td> </td> <td> </td> <td> </td> </tr> <tr id=s3> <td>Section 3 ~ Math - No Calculator</td> <td>25 min </td> <td> </td> <td> </td> <td> </td> </tr> <tr id=sb2> <td height="38">Break </td> <td>~5 min </td> <td> </td> <td> </td> <td> </td> </tr> <tr id=s4> <td>Section 4 ~ Math - Calculator</td> <td>55 min </td> <td> </td> <td> </td> <td> </td> </tr> <tr id=sb3> <td>2 Minute Stretch Break </td> <td>~2 min </td> <td> </td> <td> </td> <td> </td> </tr> <tr id=s5> <td>Section 5 ~</td> <td>20 min </td> <td> </td> <td> </td> <td> </td> </tr> </table> <hr> <p>This option is primarily for debugging; you probably don't need it.<br /> <input type=checkbox id=fastforward> Fast Forward (run at 120x normal speed)</p> </body> </html></div>