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 isMobile(){ //Return true if the mobile CSS stylesheet is used. if(getStyle(document.getElementById('detectmobile'),'display')!='none')return true; return false; } function addClass(node,data){ //Add class to node. var cl=node.className.split(' '); for(var i=0,n=cl.length;i=delay){ window.scrollTo(x,fy); clearInterval(document.body.getAttribute('data-scrollstatus')); document.body.removeAttribute('data-scrollstatus'); return; } var p=nti/delay; p=p*(1+(0.5*(1-p))); window.scrollTo(x,(py+(dy*p)).toFixed(0)); },10)); } function supportCSS(id){ //Return true if the browser supports given CSS feature. var x=domPrefixes='Webkit Moz ms O'.split(' '); var nd=document.createElement('DIV'); id=id.toLowerCase(); if(nd.style[id]!==undefined)return true; idc=id.charAt(0).toUpperCase()+id.substr(1); for(var i=0,n=domPrefixes.length;i0){ var ul=t.getElementsByTagName('UL')[0]; addClass(ul,'hover'); } setTimeout(function(){ for(var i=0,nd=p.getElementsByTagName('UL'),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)){ addClass(div,'scroll'); div.style.top='20px'; div.style.bottom=Math.max((pageoffset+windowy)-(getHeight(toc.parentNode)+getTop(toc.parentNode)),20)+'px'; } else removeClass(div,'scroll'); //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 addAnchorLinks(){ //Apply anchor links icon on each title displayed on CSS hover var nodes=[]; var tags=['H2','H3','H4','H5','H6']; for(var i=0,n=tags.length;i0)return; addClass(nodes[i],'anchorAf'); var anc=document.createElement('A'); anc.href='#'+nodes[i].id; nodes[i].insertBefore(anc,nodes[i].firstChild); } } function updateIssue(e){ //Update GitHub issue link with pre-filled with current page location var t=getEventTarget(e); t.href='https://github.com/bitcoin/bitcoin.org/issues/new?body='+encodeURIComponent('Location: '+window.location.href.toString()+"\n\n"); } function disclaimerClose(e){ //Auto close temporary disclaimer in devel-docs if(e)cancelEvent(e); var t=document.getElementById('develdocdisclaimer') t.parentNode.removeChild(t); if(typeof(Storage)==='undefined')return; sessionStorage.setItem('develdocdisclaimerclose','1'); } function disclaimerAutoClose(){ //Auto close temporary disclaimer in devel-docs if session says so if(typeof(Storage)==='undefined')return; if(sessionStorage.getItem('develdocdisclaimerclose')==='1')disclaimerClose(); } function walletListener(e){ //Listen events on the wallets categories menu and hide / show / select wallets accordingly. var t=getEventTarget(e); switch(e.type){ case 'click': if(t.nodeName=='A')walletSelectPlatform(t); break; case 'mouseover': if(t.nodeName=='A')walletShowPlatform(t.getAttribute('data-walletcompat')); if(t.nodeName=='A')clearTimeout(document.getElementById('walletmenu').getAttribute('data-wallettimeout')); break; case 'mouseout': clearTimeout(document.getElementById('walletmenu').getAttribute('data-wallettimeout')); document.getElementById('walletmenu').setAttribute('data-wallettimeout',setTimeout(walletFallbackPlatform,100)); break; } } function walletSelectPlatform(t){ //Select wallets platform when the mouse clicks on the menu. var p=t; while(p.nodeName!='DIV')p=p.parentNode; for(var i=0,nds=p.getElementsByTagName('A'),n=nds.length;i