MediaWiki:Gadget-autocomplete.js

A szabad hírforrás, melyet bárki szerkeszthet!

Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.

  • Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
  • Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
  • Internet Explorer / Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
  • Opera: Nyomj Ctrl–F5-öt
//from http://www.json.org/json.js and [[en:User:Zocky/AutoComplete.js]]
 
var i18n_empty = 'nincs találat';

String.prototype.parseJSON = function () {
    try {
        return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(
                this.replace(/"(\\.|[^"\\])*"/g, ''))) &&                  //"
            eval('(' + this + ')');
    } catch (e) {
        return false;
    }
};
 
function ac$query(cb,what) 
{
  if (ac$query.arguments.length>1 && ac$x) {
    var i = 2;
    var url = "/w/query.php?format=json&what=" + what;
    while (i < ac$query.arguments.length) {
      url = url+"&"+ac$query.arguments[i] + "=" + ac$query.arguments[i+1];
      i += 2;
    }
 
    ac$x.onreadystatechange=function() {
      if (ac$x.readyState==4)
        return ac$x.status==200 
        ? cb(ac$x.responseText.parseJSON()) 
        : cb(false);
    };
    ac$x.open("GET",url,true);
    ac$x.setRequestHeader('Accept','text/*');
    ac$x.send(null);
  }
  else return false;
}
 
// helper functions
function ac$$e(id)   { return document.getElementById(id); }
function ac$$c(name,id) { var el=document.createElement(name); el.id=id; return el };
function ac$$ia(node,newnode) { return node.nextSibling 
                                ? node.parentNode.insertBefore(newnode, node.nextSibling) 
                                : node.parentNode.appendChild(newnode); }
function ac$$uc(s) { return s.substring(0,1).toUpperCase()+s.substring(1) };
function ac$$kc(e) { if(!e) e = window.event; return e.keyCode ? e.keyCode : e.which; }
function ac$$opt(t, v, ns, r) { var o = document.createElement("option"); o.innerHTML = t; o.value = v; 
                                if(ns) { o.style.fontWeight='bold'; } if(r) { o.style.color='silver'; } ac$b.appendChild(o); }
function ac$$stop(e) {if(!e) e = window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false; }

function ac$inputKeyDown(e) {
  var kc = ac$$kc(e);
  if (kc==40 && ac$b.style.visibility=="visible") {            // down arrow
    ac$b.focus();
//    ac$b.selectedIndex=0;
//    ac$s.value=ac$b.options[0].value;
    ac$$stop(e);
  } else if (kc==27 && ac$b.style.visibility=="visible") {     // Esc
    ac$b.style.visibility="hidden";
    ac$b.selectedIndex=-1;
  } else {
    try {clearTimeout(ac$t)} catch (e) {};
    ac$t=setTimeout("ac$timeOut()",500);
  }
}
 
function ac$boxKeyPress(e)
{
  var kc = ac$$kc(e);
  if (kc == 13 && ac$b.selectedIndex >= 0) {              // Enter
    ac$s.value=ac$b.options[ac$b.selectedIndex].value;
    ac$b.style.visibility="hidden";
    ac$b.selectedIndex=-1;
    ac$s.focus();
  } else if (kc == 27) {                                  // Esc
    ac$b.style.visibility="hidden";
    ac$b.selectedIndex=-1;
    ac$s.focus();
  } else if (kc > 32 && kc <= 40) {          // pageup, pagedown, end, home, arrow keys
    return;
  } else if (kc) { 
    ac$s.value+=String.fromCharCode(kc);
    ac$s.focus();
    ac$b.selectedIndex=-1;
    ac$s.selectionStart=ac$s.selectionEnd=ac$s.value.length;
    try {clearTimeout(ac$t)} catch (e) {};
    ac$t=setTimeout("ac$timeOut()",500)
  }
  ac$$stop(e);
}
 
function ac$boxClick(e)
{
  ac$s.value=ac$b.options[ac$b.selectedIndex].value;
  ac$b.style.visibility="hidden";
  ac$b.selectedIndex=-1;
  ac$s.focus();
}
 
function ac$blur(e)
{
  if(!e) e = window.event;
  if (e.target == ac$b) {
    if (ac$b.style.visibility == "hidden") ac$b.blur();
  } else if (e.target!=ac$s && e.target!=document && e.target!=window) {
    ac$b.style.visibility = "hidden";
    ac$b.selectedIndex = -1;
  }
}
 
function ac$timeOut()
{
  if (ac$s.value.length>0) {
    try {ac$x.abort()} catch(e){};
    cb=function(obj) {
       ac$b.innerHTML = "";
       for (var i in obj.meta.namespaces) {
         try {
           var ns=obj.meta.namespaces[i]['*'];
           ac$n[ns]=i;
           if ( ac$s.value.toUpperCase() == ns.substring(0,ac$s.value.length).toUpperCase() ) {
             ac$$opt(ns, ns, true, false);
           }
         } catch(e) {}
       }
 
       for (var i in obj.pages) {
         if ( ac$s.value.toUpperCase() == obj.pages[i].title.substring(0,ac$s.value.length).toUpperCase() ) {
           ac$$opt(obj.pages[i].title, obj.pages[i].title, false, obj.pages[i].redirect=="");
         }
       }
       if(ac$b.options.length == 0) {
         ac$$opt( i18n_empty, ac$s.value, false, true );
       }
       ac$b.style.visibility="visible";
    };
 
    var ns=ac$s.value.match(/^.*?(?=:)/);
    if (ns in ac$n) {
       var apns = ac$n[ns];
       var apfrom = ac$s.value.replace(/^.*?:/,'');
    }
    else {
       var apns=0;
       var apfrom=ac$s.value;
    }
 
    ac$query(cb,"allpages|namespaces","apfrom",ac$$uc(apfrom.replace(/ /g,'_')),"aplimit","50","apnamespace",apns);

  } else {                                  // ac$s.value.length== 0
    ac$b.style.visibility="hidden";
  }
}
 
// initialization
 
var ac$s;
var ac$b;
var ac$t;
var ac$n=[];
var ac$x = sajax_init_object();
 
function ac$init()
{
  ac$s=ac$$e("searchInput");
  if(ac$s)
  {
    ac$b=ac$$c('select','autocompletebox');
    ac$b.size=8;
    ac$b.style.visibility="hidden";
    ac$$ia(ac$s,ac$b);
 
    ac$s.setAttribute('autocomplete','off');
    addHandler(ac$s, 'keydown', ac$inputKeyDown);
    addHandler(ac$b, 'keypress', ac$boxKeyPress);
    addHandler(ac$b, 'click', ac$boxClick);
    addHandler(document, 'focus', ac$blur);
  }
}

$(ac$init);