var entries = []; // list of news items var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; // event complete: stop propagation of the event function stopPropagation(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; } } // scroll back to the previous article function prevArticle(event) { for (var i=entries.length; --i>=0;) { if (!entries[i].anchor) continue; if (entries[i].anchor.offsetTop < document.documentElement.scrollTop) { window.location.hash=entries[i].anchor.id; stopPropagation(event); break; } } } // advance to the next article function nextArticle(event) { for (var i=1; i document.documentElement.scrollTop) { window.location.hash=entries[i].anchor.id; stopPropagation(event); break; } } } // process keypresses function navkey(event) { var checkbox = document.getElementById('navkeys'); if (!checkbox || !checkbox.checked) return; if (!event) event=window.event; if (event.originalTarget && event.originalTarget.nodeName.toLowerCase() == 'input' && event.originalTarget.id != 'navkeys') return; if (!document.documentElement) return; if (!entries[0].anchor || !entries[0].anchor.offsetTop) return; key=event.keyCode; if (key == 'J'.charCodeAt(0)) nextArticle(event); if (key == 'K'.charCodeAt(0)) prevArticle(event); } // create (or reset) a cookie function createCookie(name,value,days) { if (days) { var date = new Date(); date.setTime(date.getTime()+(days*24*60*60*1000)); var expires = "; expires="+date.toGMTString(); } else expires = ""; document.cookie = name+"="+value+expires+"; path=/"; } // read a cookie function readCookie(name) { var nameEQ = name + "="; if (!document.cookie) return; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null; } // each time the value of the option changes, update the cookie function selectOption() { var checkbox = document.getElementById('navkeys'); if (!checkbox) return; createCookie("navkeys", checkbox.checked?'true':'false', 365); } // add navkeys option to sidebar function addOption(event) { var sidebar = document.getElementById('sidebar'); if (!sidebar) return; var h2 = null; for (var i=entries.length; --i>=0;) { if (document.getElementById("news-" + i)) break; if (entries[i].parent.offsetTop > 0) { var a = entries[i].anchor = document.createElement('a'); a.id = "news-" + i; entries[i].parent.insertBefore(a, entries[i].parent.firstChild); if (h2 == null) h2 = document.createElement('h2'); } } if (h2 != null && !document.getElementById("navkeys")) { h2.appendChild(document.createTextNode('Options')); sidebar.appendChild(h2); var form = document.createElement('form'); var p = document.createElement('p'); var input = document.createElement('input'); input.type = "checkbox"; input.id = "navkeys"; p.appendChild(input); var a = document.createElement('a'); a.title = "Navigate entries"; a.appendChild(document.createTextNode('Enable ')); var code = document.createElement('code'); code.appendChild(document.createTextNode('J')); a.appendChild(code); a.appendChild(document.createTextNode(' and ')); code = document.createElement('code'); code.appendChild(document.createTextNode('K')); a.appendChild(code); a.appendChild(document.createTextNode(' keys')); p.appendChild(a); form.appendChild(p); sidebar.appendChild(form); var cookie = readCookie("navkeys"); if (cookie && cookie == 'true') input.checked = true; input.onclick = selectOption; document.onkeydown = navkey; } } // Parse an HTML5-liberalized version of RFC 3339 datetime values Date.parseRFC3339 = function (string) { var date=new Date(); date.setTime(0); var match = string.match(/(\d{4})-(\d\d)-(\d\d)\s*(?:[\sT]\s*(\d\d):(\d\d)(?::(\d\d))?(\.\d*)?\s*(Z|([-+])(\d\d):(\d\d))?)?/); if (!match) return; if (match[2]) match[2]--; if (match[7]) match[7] = (match[7]+'000').substring(1,4); var field = [null,'FullYear','Month','Date','Hours','Minutes','Seconds','Milliseconds']; for (var i=1; i<=7; i++) if (match[i]) date['setUTC'+field[i]](match[i]); if (match[9]) date.setTime(date.getTime()+ (match[9]=='-'?1:-1)*(match[10]*3600000+match[11]*60000) ); return date.getTime(); } // convert datetime to local date var localere = /^(\w+) (\d+) (\w+) \d+ 0?(\d\d?:\d\d):\d\d ([AP]M) (EST|EDT|CST|CDT|MST|MDT|PST|PDT)/; function localizeDate(element) { var date = new Date(); date.setTime(Date.parseRFC3339(element.getAttribute('datetime'))); if (!date.getTime()) return; var local = date.toLocaleString(); var match = local.match(localere); if (match) { element.innerHTML = match[4] + ' ' + match[5].toLowerCase(); element.title = match[6] + " \u2014 " + match[1] + ', ' + match[3] + ' ' + match[2]; return days[date.getDay()] + ', ' + months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear(); } else { element.title = element.innerHTML + ' GMT'; element.innerHTML = local; return days[date.getDay()] + ', ' + date.getDate() + ' ' + months[date.getMonth()] + ' ' + date.getFullYear(); } } // find entries (and localizeDates) function findEntries() { var times = document.getElementsByTagName('time'); for (var i=0; i