MediaWiki:Gadget-searchlist.js

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск

Замечание: Чтобы после сохранения вступили в силу изменения стилей, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=common&*, если используете скин Common.

Чтобы вступили в силу изменения скриптов, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=common&*, если используете скин Common.

Гаджеты и импортируемые скрипты загружаются отдельными файлами.

//Утилита заменяет кнопку "Найти" на выпадающий список пространств, в которых вы часто ищете
// ВНИМАНИЕ! Не рекомендуется изменять эту утилиту, т.к. она входит в число настроек!
//var searchInNewWindow = true;

var msgThisWin, msgNewWin = 'в НОВОМ окне';
var newWinOption;
var msgSelectTitle = 'выберите пространство для поиска';
var select;
var is_gecko, is_safari;
var searchForm;

function searchList(){

if (!window.searchListInNewWin) searchListInNewWin = false;

if (!window.searchListNS)
  searchListNS = [
['','найти в…'],
[-5,'в этом окне', 'переключатель, показывать ли результат в новом окне'],
['','Внешний поиск'],
['http://google.com/?q=site:traditio.ru+', 'Google tr', 'Google.ru по «Традиции»'],
['http://google.com/?q=site:www.traditio.ru+', 'Google www.tr', 'Google.ru по «Традиции»'],
['http://www.yandex.ru/yandsearch?site=http://www.traditio.ru&site_manually=true&ras=1&text=','Yandex tr', 'Yandex.ru по «Традиции»'],
['','MediaWiki'],
[-1,'По умолчанию'],
[0,'Статьи'],
[1,'Статьи (обс)'],
[2,'Участник'],
[3,'Участник (обс)'],
[4,'Традиция'],
[5,'Традиция (обс)'],
[6,'Изображение'],
[7,'Изобр. (обс)'],
[8,'Mediawiki'],
[9,'Mediawiki (обс)'],
[10,'Шаблон'],
[11,'Шаблон (обс)']
];
if (!window.searchListShortNS)
  searchListShortNS = {
'u':'User',
'i':'Image',
'ш':'Шаблон', 
'c':'Category',
'me':'MediaWiki',
'тр':'Традиция',
't':'Традиция',
'у':'Участник',
'и':'Изображение',
'к':'Категория',
'пл':'Портал',
'по':'Портал'
}

searchForm = document.getElementById('searchform');
if (!searchForm) return;

/*
if (typeof (wgVectorPreferences) === 'undefined') return;
if (wgVectorPreferences['simplesearch']['enable'] === 1) return;
*/

if (searchForm.fulltext !== undefined && searchForm.fulltext !== null) {
    searchButton = searchForm.fulltext;
} else {
    searchButton = searchForm.searchButton;
}

//create namespace selector  hidden input
var searchHidden = document.createElement('input');
searchHidden.type = 'hidden';
searchHidden.value = '1';
searchForm.searchInput.parentNode.appendChild(searchHidden);
//create select
select = document.createElement('select');
var item, opt, text;
for (var i=0; i<searchListNS.length; i++){
 item = searchListNS[i];
 opt = new Option(item[1], item[0]);
 opt.title = item[2] || '';
 if (i == 0)
   opt.style.color = '#222222';
 else if (opt.value == -5){
   newWinOption = opt;
   msgThisWin = opt.text;
 }else if (opt.value == ''){
   opt.disabled = true;
   opt.style.color = 'gray';
   opt.style.paddingLeft = '10px';
 }else
   opt.txt = '&nbsp;' + opt.txt;
 select.options[select.options.length] = opt;
}
//select.selectedIndex = 0;
with (select.style){ margin = '0'; marginTop = '2px'; fontSize = '90%'}
setTarget (searchForm, searchListInNewWin, select);
searchForm.searchInput.parentNode.insertBefore(select, searchHidden);
//hide standard Search button if not IE   //if (is_opera || is_gecko){
if (navigator.userAgent.indexOf('MSIE') == -1){
  searchButton.style.display = 'none';
  searchForm.go.title = searchForm.go.value;
  searchForm.go.value = ' → ';
  searchForm.go.style.width = '30px';
  select.style.width = '90px';
}
select.title = msgSelectTitle;
searchForm.go.title += ' (' + (is_gecko||is_safari?'Ctrl':'Shift') + ': ' + msgNewWin + ')';
//events
addHandler(searchForm.search, 'keydown', detectShift); //if Enter pressed
addHandler(searchForm.go, 'mouseup', detectShift); //Go clicked
select.onchange = onSelect;
//addHandler(select, 'click', detectShift) 
addHandler(searchForm, 'submit', shortNS);
}

function detectShift(e){ //open in new win if shift is pressed
 e = e || window.event;
 searchForm.target = (searchListInNewWin || e.shiftKey 
  || (is_gecko||is_safari) && e.ctrlKey) ? '_blank' : '';
}

function onSelect(e){
 if (this.selectedIndex == 0 || this.options[this.selectedIndex].disabled){
   this.selectedIndex = 0;
   return;
 }
 var val = this.options[this.selectedIndex].value;
 this.selectedIndex = 0;
 if (! /^-?\d+$/.test(val)){ //not a number => external search engine
   var url = val + encodeURIComponent(searchForm.search.value);
   if (searchListInNewWin) window.open(url);
   else window.location = url;
 }else if (val == -5){ //new window switch
   searchListInNewWin = !searchListInNewWin;
   setTarget (searchForm, searchListInNewWin, select);
 }else if (searchForm.search.value == ''){
       searchForm.search.value = '?';
 }else { //MediaWiki search
     searchHidden.name = (val == -1) ? '' : 'val' + val;
     detectShift(e); //doesn't work in FF/Safari anyway
     searchButton.click();
  } 
}

function setTarget (form, in_new, select) {
 form.target = in_new ? '_blank' : '';
 select.style.backgroundColor = in_new ? '#F5F5FF' : '';
 newWinOption.text =  ' (' + (in_new ? msgNewWin : msgThisWin) + ')';
}

function shortNS(){ //expands 'u:test' into 'User:test'
 var txt = searchForm.search.value, k;
 if ((k=txt.indexOf(':'))==-1 || txt.substring(0,1) == ' ') return;
 var pref = txt.substring(0,k).toLowerCase();
 if (searchListShortNS[pref])
   searchForm.search.value = searchListShortNS[pref] + txt.substring(k);
 return true;
}

$(searchList);