Wikisłownikarz:Sp5uhe/skrypt05.js

Z Wikisłownika – wolnego słownika wielojęzycznego

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
//from http://www.json.org/json.js and [[en:User:Zocky/AutoComplete.js]]

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()
		{
			try{
				if (ac$x.readyState==4)
					return ac$x.status==200 
						? cb(JSON.parse(ac$x.responseText)) 
						: cb(false);
		} catch (e) { }
	};
	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) { node.parentNode.insertBefore(newnode,node.nextSibling); }
 
function ac$inputKeyDown(e)
{
	var k = 0;
	try {
		k = e.which ? e.which : 0;
	} catch(e) {
		k = e.keyCode ? e.keyCode : 0;
	}
	if ((k==40) && ac$b.style.visibility=="visible")
	{
		ac$b.focus();
	}
	else
	{
		try {clearTimeout(ac$t)} catch (e) {};
		ac$t=setTimeout("ac$timeOut()",500)
	}
}
 
function ac$boxKeyPress(e)
{
	var k = 0;
	try {
		k = e.which ? e.which : 0;
	} catch(e) {
		k = e.keyCode ? e.keyCode : 0;
	}
	if (k==13)
	{
		ac$s.value=ac$b.options[ac$b.selectedIndex].value;
		ac$b.style.visibility="hidden";
		ac$b.selectedIndex=-1;
		ac$s.focus();
	}
	else if (k==27)
	{
		ac$b.style.visibility="hidden";
		ac$b.selectedIndex=-1;
		ac$s.focus();
	}
	else if (k)
	{ 
		ac$s.value+=String.fromCharCode(k);
		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)
	}
	e.preventDefault();
}
 
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)
{
	try {
		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;
		}
	} catch (e) { }
}
 
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$b.innerHTML+='<option style="font-weight:bold">'
									+ ns
									+ ':</option>';
						}
					} 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$b.innerHTML+= (obj.pages[i].redirect!="" 
									? '<option>'
									: '<option style="color:silver">')
										+ obj.pages[i].title
										+ '</option>';
				}
				if  (!ac$b.options.length)
					ac$b.innerHTML='<option value="'+ac$s.value+'" style="color:silver">(nie znaleziono)</option>';
				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",apfrom.replace(/ /g,'_'),"aplimit","50","apnamespace",apns);
	}
	else
	{
		ac$b.style.visibility="hidden";
	}
}
 
// initialization
 
var ac$s;
var ac$b;
var ac$t;
var ac$n=[];
var ac$x = window.XMLHttpRequest ? new XMLHttpRequest()
         : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP")
         : false;
 
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');
		if (document.addEventListener)
		{
			ac$s.addEventListener('keydown',ac$inputKeyDown,false);
			ac$b.addEventListener('keypress',ac$boxKeyPress,false);
			ac$b.addEventListener('click',ac$boxClick,false);
			document.addEventListener('focus',ac$blur,false);
		}
		else if (document.attachEvent)
		{
			ac$s.attachEvent('onkeydown',ac$inputKeyDown);
			ac$b.attachEvent('onkeypress',ac$boxKeyPress);
			ac$b.attachEvent('onclick',ac$boxClick);
			document.attachEvent('onfocus',ac$blur);
/*		}
		else 
		{
// Dla IE, ale w IE nie udało mi się poprawić wyświetlania okienka z listą
			ac$s.onkeydown = ac$inputKeyDown;
			ac$b.onkeypress = ac$boxKeyPress;
			ac$b.onclick = ac$boxClick;
			document.onfocus = ac$blur;*/
		}
	}
}
 
$(ac$init);