function addEvent(a,b,c){ //Attach event to a DOM node. //Ex. addEvent(node,'click',function); return (a.addEventListener)?a.addEventListener(b,c,false):(a.attachEvent)?a.attachEvent('on'+b,c):false; } function removeEvent(a,b,c){ //Detach event from a DOM node. //Ex. removeEvent(node,'click',function); return (a.removeEventListener)?a.removeEventListener(b,c,false):(a.detachEvent)?a.detachEvent('on'+b,c):false; } function cancelEvent(e){ //Cancel current event. //Ex. cancelEvent(event); if(!e)var e=window.event;(e.preventDefault)?e.preventDefault():e.returnValue=false; } function getEventTarget(e){ //Return target DOM node on which the event is triggered. //Ex. getEventTarget(event); if(!e)var e=window.event;return (e.target&&e.target.nodeType==3)?e.target.parentNode:(e.target)?e.target:e.srcElement; } function getStyle(a,b){ //Return the value of the computed style on a DOM node. //Ex. getStyle(node,'padding-bottom'); if(window.getComputedStyle)return document.defaultView.getComputedStyle(a,null).getPropertyValue(b); var n=b.indexOf('-'); if(n!==-1)b=b.substr(0,n)+b.substr(n+1,1).toUpperCase()+b.substr(n+2); return a.currentStyle[b]; } function getWidth(a){ //Return the integer value of the computed width of a DOM node. //Ex. getWidth(node); var w=getStyle(a,'width'); if(w.indexOf('px')!==-1)return parseInt(w.replace('px','')); var p=[getStyle(a,'padding-top'),getStyle(a,'padding-right'),getStyle(a,'padding-bottom'),getStyle(a,'padding-left')]; for(var i=0;i<4;i++){ if(p[i].indexOf('px')!==-1)p[i]=parseInt(p[i]); else p[i]=0; } return Math.max(0,a.offsetWidth-p[1]-p[3]); } function getHeight(a){ //Return the integer value of the computed height of a DOM node. //Ex. getHeight(node); var h=getStyle(a,'height'); if(h.indexOf('px')!==-1)return parseInt(h.replace('px','')); var p=[getStyle(a,'padding-top'),getStyle(a,'padding-right'),getStyle(a,'padding-bottom'),getStyle(a,'padding-left')]; for(var i=0;i<4;i++){ if(p[i].indexOf('px')!==-1)p[i]=parseInt(p[i]); else p[i]=0; } return Math.max(0,a.offsetHeight-p[0]-p[2]); } function getLeft(a){ //Return the integer value of the computed distance between given node and the browser window. //Ex. getLeft(node); var b=a.offsetLeft; while(a.offsetParent){a=a.offsetParent;b+=a.offsetLeft;} return b; } function getTop(a){ //Return the integer value of the computed distance between given node and the browser window. //Ex. getTop(node); var b=a.offsetTop; while(a.offsetParent){a=a.offsetParent;b+=a.offsetTop;} return b; } function getPageYOffset(){ //Return the integer value for the vertical position of the scroll bar. return (window.pageYOffset)?window.pageYOffset:document.documentElement.scrollTop; } function getPageXOffset(){ //Return the integer value for the horizontal position of the scroll bar. return (window.pageXOffset)?window.pageXOffset:document.documentElement.scrollLeft; } function getWindowY(){ //Return the integer value for the browser window height. return (window.innerHeight)?window.innerHeight:document.documentElement.clientHeight; } function getWindowX(){ //Return the integer value for the browser window width. return (window.innerWidth)?window.innerWidth:document.documentElement.clientWidth; } function supportsSVG(){ //Return true if the browser supports SVG. //Ex. if(!supportsSVG()){..apply png fallback..} //Old FF 3.5 and Safari 3 versions have svg support, but a very poor one //http://www.w3.org/TR/SVG11/feature#Image Defeat FF 3.5 only //http://www.w3.org/TR/SVG11/feature#Animation Defeat Saf 3 but also returns false in IE9 //http://www.w3.org/TR/SVG11/feature#BasicGraphicsAttribute Defeat Saf 3 but also returns false in Chrome and safari4 //http://www.w3.org/TR/SVG11/feature#Text Defeat Saf 3 but also returns false in FF and safari4 if(!document.createElementNS||!document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect)return false; if(!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1"))return false; if(!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicGraphicsAttribute","1.1")&&!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Animation","1.1")&&!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Text","1.1"))return false; return true; } function fallbackSVG(){ //Replace all images extensions from .svg to .png if browser doesn't support SVG files. if(supportsSVG())return; for(var i=0,nd=document.getElementsByTagName('*'),n=nd.length;ilast[1])last=[nodes[i],top]; if(topcloser[1])closer=[nodes[i],top]; } //Set closer title to first or last title if at the top or bottom of the page if(pageoffset=getHeight(document.body))closer=[last[0],last[1]]; } //Update toc position and set active toc entry var updatetoc=function(){ //Set bottom and top to fit within window and not overflow its parent node var div=toc.getElementsByTagName('DIV')[0]; if(pageoffset>getTop(toc)){ div.className='scroll'; div.style.top='20px'; div.style.bottom=Math.max((pageoffset+windowy)-(getHeight(toc.parentNode)+getTop(toc.parentNode)),20)+'px'; } else div.className=''; //Remove .active class from toc and find new active toc entry var a=false; for(var i=0,t=toc.getElementsByTagName('*'),n=t.length;inew Date().getTime()-1000)return; window.history.replaceState(null,null,'#'+closer[0].id); } //Update the toc when the page stops scrolling var evtimeout=function(){ toc=document.getElementById('toc'); clearTimeout(toc.getAttribute('data-timeout')); toc.setAttribute('data-timeout',setTimeout(init,1)); } //Reset timestamp on page load and each time the user clicks a url var evtimestamp=function(){ toc=document.getElementById('toc'); document.getElementById('toc').setAttribute('data-timestamp',new Date().getTime()); } addEvent(window,'scroll',evtimeout); addEvent(window,'popstate',evtimestamp); addEvent(window,'load',evtimestamp); init(); } function issueReport(e){ //Open an issue on GitHub pre-filled with current page location cancelEvent(e); window.location.href='https://github.com/bitcoin/bitcoin.org/issues/new?body='+encodeURIComponent('Location: '+window.location.href.toString()+"\n\n") } function makeEditable(e){ //An easter egg that makes the page editable when user click on the page and hold their mouse button for one second. //This trick allows translators and writers to preview their work. if(!e)var e=window.event; switch(e.type){ case 'mousedown': if((e.which&&e.which==3)||(e.button&&e.button==2))return; var t=getEventTarget(e); while(t.parentNode){ if(getStyle(t,'overflow')=='auto'||getStyle(t,'overflow-y')=='auto'||getStyle(t,'overflow-x')=='auto')return; t=t.parentNode; } addEvent(document.body,'mouseup',makeEditable); addEvent(document.body,'mousemove',makeEditable); document.body.setAttribute('timeoutEdit',setTimeout(function(){ removeEvent(document.body,'mouseup',makeEditable); removeEvent(document.body,'mousemove',makeEditable); var c=document.getElementById('content'); c.contentEditable=true; c.style.borderColor='#bfbfbf'; setTimeout(function(){c.style.borderColor='';},200); },1000)); break; case 'mouseup': case 'mousemove': removeEvent(document.body,'mouseup',makeEditable); removeEvent(document.body,'mousemove',makeEditable); clearTimeout(document.body.getAttribute('timeoutEdit')); break; } } //Add makeEditable event listener var xint=setInterval(function(){ if(!document.body)return; addEvent(document.body,'mousedown',makeEditable); clearInterval(xint); },200);