User:Zocky/SearchBox.js

// Search box for Mediawiki

// (c) 2006 User:Zocky, released under GPL

mw.loader.load('//en.wikipedia.org/w/index.php?title=User:Zocky/SearchBox.css&action=raw&ctype=text/css', 'text/css');

var sr$t;

var sr$f;

var sr$s;

var sr$r;

var sr$w;

var sr$i;

var sr$re;

var sr$mc;

function $e(id) {return document.getElementById(id)}

function srBack()

{

if (sr$s.value=='') {sr$t.focus(); return }

if (sr$re.checked) {

var searchString = sr$s.value;

} else {

searchString=sr$s.value.replace(/([\[\]\{\}\|\.\*\?\(\)\$\^\\])/g,'\\$1');

}

searchString="("+searchString+")(?![\\s\\S]*"+searchString+")";

if (sr$mc.checked)

var re=new RegExp(searchString);

else

var re=new RegExp(searchString,"i");

var res = re.exec (sr$t.value.substring(0,sr$t.selectionStart));

if (!res) {

var res = re.exec (sr$t.value)

}

if (res)

{

sr$t.selectionStart=res.index;

sr$t.selectionEnd=res.index+res[1].length;

}

else sr$t.selectionStart=sr$t.selectionEnd;

srSync();

}

function srNext()

{

if (sr$s.value=='') {sr$t.focus(); return }

if (sr$re.checked) {

var searchString = sr$s.value;

} else {

searchString=sr$s.value.replace(/([\[\]\{\}\|\.\*\?\(\)\$\^\\])/g,'\\$1');

}

if (sr$mc.checked)

var re=new RegExp(searchString,"g");

else

var re=new RegExp(searchString,"gi");

re.lastIndex=sr$t.selectionEnd;

var res = re.exec (sr$t.value)

if (!res) {

re.lastIndex=0;

var res = re.exec (sr$t.value)

}

if (res)

{

sr$t.selectionStart=res.index;

sr$t.selectionEnd=res.index+res[0].length;

}

else sr$t.selectionStart=sr$t.selectionEnd;

srSync();

}

function srReplace()

{

var sels=sr$t.selectionStart;

var sele=sr$t.selectionEnd;

var selr=sr$t.value.length-sele;

if (sr$s.value=='' || sels==sele) {sr$t.focus(); return }

if (sr$re.checked) {

var searchString = sr$s.value;

var replaceString = sr$r.value;

} else {

searchString=sr$s.value.replace(/([\[\]\{\}\|\.\*\?\(\)\$\^\\])/g,'\\$1');

replaceString=sr$r.value.replace(/([\$\\])/g,'\\$1');

}

if (sr$mc.checked)

var re=new RegExp(searchString,"g");

else

var re=new RegExp(searchString,"gi");

re.lastIndex=sels;

var res = re.exec (sr$t.value);

var $$=0;

if (res && res.index==sels && res[0].length==sele-sels)

{

if (sr$re.checked) {

replaceString=replaceString.replace(/\\\\/g,'&backslash;');

var replaceBits=(" "+replaceString).split(/(?=\$\d)/);

replaceString=replaceBits[0].substring(1);

for (var i=1; i

{

$$=replaceBits[i][1]-'0';

if ($$

replaceString += res[$$] + replaceBits[i].substring(2)

else

replaceString += replaceBits[i];

}

replaceString=replaceString.replace (/\\n/,"\n").replace (/&backslash;/g,"\\").replace

(/$/g,"\$")

}

sr$t.value= sr$t.value.substring(0,sels) + replaceString + sr$t.value.substring(sele);

}

sr$t.selectionStart=sels;

sr$t.selectionEnd=sr$t.value.length-selr;

srSync();

}

function srReplaceall()

{

if (!sr$s.value) {sr$t.focus(); return }

var sels=sr$t.selectionStart;

var sele=sr$t.selectionEnd;

var selr=sr$t.value.length-sele;

var reps;

if (sr$re.checked) {

var searchString = sr$s.value;

var replaceString = sr$r.value.replace(/\\\\/,'&backslash;').replace(/\\n/,'\n').replace(/&backslash;/,"\\");

} else {

searchString=sr$s.value.replace(/([\[\]\{\}\|\.\*\?\(\)\$\^\\])/g,'\\$1');

replaceString=sr$r.value.replace(/([\$\\])/g,'\\$1');

}

if (sele>sels)

reps=sr$t.value.substring(sels,sele);

else

reps=sr$t.value;

if (sr$mc.checked)

var re=new RegExp(searchString,"g");

else

var re=new RegExp(searchString,"gi");

var replaceCounter=0;

var replaceFunc=function(){replaceCounter++;return replaceString};

reps=reps.replace(re,replaceString);

if (sele>sels)

sr$t.value = sr$t.value.substring(0,sels) + reps + sr$t.value.substring(sele);

else

sr$t.value = reps;

sr$t.selectionStart=sels;

sr$t.selectionEnd=sele>sels ? sr$t.value.length-selr : sels;

window.status = replaceCounter+" ocurrences of " + searchString + " replaced.";

srSync();

}

function srToggleCase()

{

var sels=sr$t.selectionStart;

var sele=sr$t.selectionEnd;

var selr=sr$t.value.length-sele;

var selt=sr$t.value.substring(sels,sele);

if (sele>sels)

{

if (selt==selt.toUpperCase())

selt=selt.toLowerCase()

else if (selt==selt.toLowerCase() && sele-sels>1)

selt=selt.substring(0,1).toUpperCase()+selt.substring(1).toLowerCase()

else

selt=selt.toUpperCase();

sr$t.value = sr$t.value.substring(0,sels) + selt + sr$t.value.substring(sele);

sr$t.selectionStart=sels;

sr$t.selectionEnd=sele>sels ? sr$t.value.length-selr : sels;

}

srSync();

}

function srSync()

{

var i;

var allLines=0;

var lineNo=0;

var w=sr$t.cols-5;

var dummy=sr$t.value.split("\n");

for (i=0;i

var dummy=sr$t.value.substring(0,sr$t.selectionStart).split("\n");

for (i=0;i

// alert (w+" "+lineNo+"/"+allLines);

sr$t.scrollTop=sr$t.scrollHeight*(lineNo-10)/allLines;

sr$t.focus();

}

function srInit()

{

if($e('wpTextbox1')) {

var srBoxCode ='

'

+'

'

+'

'

+'

'

+'

'

+'

'

+'

'

+'

'

+'

'

+'

'

+'match case '

+'use regexp  '

+'< '

+'find  > '

+'< '

+'replace '

+'> '

+'replace all '

+'

search for:
replace with:
'

var ep=$e('searchInput');

if (ep) ep.accessKey='none';

sr$t=document.editform.wpTextbox1;

sr$w=sr$t.style.width;

var sr=document.createElement('div');

sr.innerHTML=srBoxCode;

var im=document.createElement('span');

im.innerHTML='Search/ReplaceToggle case';

var ep=$e('toolbar');

if (ep)

{

ep.appendChild(im)

}

else

{

var ep=$e('editform');

ep.parentNode.insertBefore(im,ep);

}

sr$i=$e('SearchIcon');

sr$i.accessKey="F";

sr.firstChild.style.display='none';

var ep=$e('editform');

ep.parentNode.insertBefore(sr,ep);

sr$f=$e('srForm');

sr$s=$e('srSearch');

sr$r=$e('srReplace');

sr$re=$e('srRegexp');

sr$mc=$e('srCase');

}

}

function srShowHide()

{

if (sr$f.style.display=='none')

{

sr$f.style.display='block';

sr$i.accessKey="none";

sr$t.style.width='auto';

sr$s.focus();

}

else

{

sr$f.style.display='none';

sr$t.style.width=sr$w;

sr$i.accessKey="F";

}

}

$(srInit);