Участник:Ignatus/search invertkb.js

/************************************************************
* Добавляет исправление раскладки в каждый результат поиска *
************************************************************/
(function(){
if( /^(?:Служебная|Special):(?:Search|Поиск)$/.test(mw.config.get('wgPageName')) ){
jQuery(function($){
var keytr={};
{
var enkeys="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~";
var en_keys=Array();
for(var i=0;i<enkeys.length;i++){en_keys[i]=enkeys.charAt(i)}//в MSIE enkeys[i] не пашет
var rukeys="фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁ";
var ru_keys=Array();
for(var i=0;i<rukeys.length;i++){ru_keys[i]=rukeys.charAt(i)}//в MSIE rukeys[i] не пашет
for(i in ru_keys){keytr[ru_keys[i]]=en_keys[i]}
for(i in en_keys){keytr[en_keys[i]]=ru_keys[i]}
}
var tr = function (s){
    var k='';
    for(var i=0;i<s.length;i++){k+=keytr[s.charAt(i)]||s.charAt(i)}
    return k;
};
var form = document.getElementById('search');//Форма поиска
if(!form) return;
var str = form.elements.search;//Поле поиска (на странице поиска, vector)
var tsf = document.getElementById('searchInput');//Поле поиска (обычное)
//Если есть, то будет <p class=mw-search-exists><b>Есть..., иначе <p calss=mw-search-createlink><b>Создать...
//Ещё перед этим иногда вылезает <div class=search-didyoumean>Возможно, вы имели в виду...
if($(".mw-search-exists").length===0){//Не найдено такой страницы
    var trsb=document.createElement('p');
    trsb.className = "mw-search-createlink";
    var v=tr(str.value);
    mw.loader.using('mediawiki.util').done(function () {
	$.ajax({
        type: "GET", // request type ( GET or POST )
        url: mw.util.wikiScript('api'), // the URL to which the request is sent           
        data: { 'action':'query', 'format':'json', 'titles':v.replace(/\|.*$/,'') },
        dataType: 'json', // the type of data that you're expecting back from the server
        success: function( npage ){ //function to be called if the request succeeds
    for(var i in npage.query.pages||npage.query.interwiki){
        if(i>=0){//Есть такая страница, даём ссылку
         var a=(npage.query.pages||npage.query.interwiki)[i].title;
         if(npage.query.interwiki){
         trsb.innerHTML = "<b>Может быть страница в другом разделе: <a href='"+mw.config.get('wgServer')+'/wiki/'+encodeURIComponent(a)+"'></a></b>";
         }else{
         trsb.innerHTML = "<b>Есть страница <a href='"+mw.config.get('wgServer')+'/wiki/'+encodeURIComponent(a)+"'></a></b>";
         }
         with(trsb.lastChild/*b*/.lastChild/*a*/){
           title=a;appendChild(document.createTextNode(v));
         }
        }else{//Нет такой страницы, даём кнопку
        trsb.innerHTML='<button type="button"></button>';
        var b = trsb.firstChild;
        b.onclick=function(){
                str.value=v;
                form.submit();
        };
        b.appendChild(document.createTextNode('Искать: '+v));
        }
    }
    var create1 = $('.mw-search-createlink')[0]||form.lastChild;
    create1.parentNode.insertBefore(trsb,create1);
    var arw = document.createElement('a');
    arw.onclick=function(){if(str.value==v){
      str.value=arw;tsf.value=arw;
     }else{
      arw=str.value;str.value=v;tsf.value=v;
    }};
    with(arw){innerHTML = " ↑";/*style.color='blue';style.cursor='pointer';*/style.marginLeft='0.3em';title='Подставить в поле поиска'}
    trsb.appendChild(arw);
        }//json fn
    });//ajax
} );}//if
} );
}
}());