User:Lupin/sectionkeys.js
//window.popupShortcutKeys=false;
function getAnchors() {
var s=[''], anchs=document.getElementsByTagName('A');
for (var i=0; i s.push(anchs[i].name); return s; } window.handleKeys=function(evt){ if (window.handleKeys.disabled) { return true; } var k = window.event ? window.event.keyCode : ( evt.keyCode ? evt.keyCode : evt.which); if (!k) return; var letter=String.fromCharCode(k); switch (letter) { case 'j': changeAnchor(1); return false; case 'J': changeAnchor('last'); return false; case 'k': changeAnchor(-1); return false; case 'K': changeAnchor('first'); return false; default: return true; } } window.handleKeys.disabled=false; window.handleKeys.disableFlags=[]; function setupFocusHandlers(elType, startAt) { var inputs=document.getElementsByTagName(elType); var j=startAt || 0; for (var i=0; i if (elType=='input' && inputs[i].type.toLowerCase()!='text') { continue; } window.handleKeys.disableFlags[j]=false; inputs[i].onfocus=function(){ window.handleKeys.disableFlags[j]=true; updateDisabledFlag(); } inputs[i].onblur=function(){ window.handleKeys.disableFlags[j]=false; updateDisabledFlag(); } ++j; } //alert(j + ' handlers installed'); return j; } function updateDisabledFlag() { for (var i=0; i if (window.handleKeys.disableFlags[i]===true) { window.handleKeys.disabled=true; return true; } } window.handleKeys.disabled=false; return false; } var anchs, pos; window.changeAnchor=function(step, loop) { if(!anchs && !(anchs=getAnchors()) ) return; var loc=document.location.toString().split('#'); switch (step) { case 'first': pos=0; break; case 'last': pos=anchs.length-1; break; default: if (loc.length > 0) { var target=loc.slice(1).join('#'); for (var i=0; i } if(typeof pos==='number') { pos += step; if (loop) { while(pos < 0) pos += anchs.length; pos %= anchs.length; } else { if (pos<0) pos=0; if(pos>=anchs.length) pos=anchs.length-1; } } else pos = 0; } /* switch */ var newloc=loc[0] + '#' + anchs[pos]; if(document.location!=newloc) document.location=newloc; } var sectionKeysPage=( ! /^(Editing|Search -|Confirm|Move page|Logs|E-mail user|All pages|Block user)/.test(document.title) && ! /([?&]=|wiki\/)[Ss]pecial:/.test(document.location) ); if ( 1 || sectionKeysPage ) { addOnloadHook(function(){ var j=setupFocusHandlers('input'); setupFocusHandlers('textarea', j); document.onkeypress=window.handleKeys; }); }