User:Alex Smotrov/searchlist.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
function searchList(){

if (!window.searchListInNewWin) searchListInNewWin = false
var newWinOption

var msgThisWin, msgNewWin = 'NEW window'
var msgSelectTitle = '' //'Choose namespace to search in'
if (!window.searchListNS)
  searchListNS = [
['','Find in…'],
[-5,'this window', 'Select whether to open search in a new window'], //value -5 is special
['','External'],
['http://www.google.com/custom?domains=en.wikipedia.org&sitesearch=en.wikipedia.org&q=', 'Google en.wp', 'Google: search English Wikipedia'],
['http://www.google.com/custom?domains=wikipedia.org&sitesearch=wikipedia.org&q=', 'Google wp', 'Google: search Wikipedia'],
['','MediaWiki'],
[-1,'Default search', 'Search in namespace(s) defined in your preferences'], //value -1 is special
[0,'Article'],
[1,'Talk'],
[2,'User'],
[3,'User talk'],
[4,'Wikipedia'],
[5,'Wikipedia talk'],
[6,'Image'],
[7,'Image talk'],
[8,'Mediawiki'],
[9,'Mediawiki talk'],
[10,'Template'],
[11,'Template talk'],
[12,'Help']
]

if (!window.searchListShortNS)
  searchListShortNS = {
'u':'User',
'i':'Image',
't':'Template', 
'c':'Category',
'me':'MediaWiki'
}

var searchForm = document.getElementById('searchform')
if (!searchForm) return
//create namespace selector  hidden input
var searchHidden = document.createElement('input')
searchHidden.type = 'hidden'
searchHidden.value = '1'
searchForm.fulltext.parentNode.appendChild(searchHidden)
//create select
var select = document.createElement('select'), 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.fulltext.parentNode.insertBefore(select, searchHidden)
//hide standard Search button if not IE   //if (is_opera || is_gecko){
if (navigator.userAgent.indexOf('MSIE') == -1){
  searchForm.fulltext.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)
return


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()
 }else if (searchForm.search.value == ''){
       searchForm.search.value = '?'
 }else { //MediaWiki search
     searchHidden.name = (val == -1) ? '' : 'ns' + val
     detectShift(e) //doesn't work in FF/Safari anyway
     searchForm.fulltext.click()
  } 
}

function setTarget(){
 searchForm.target = searchListInNewWin ? '_blank' : ''
 select.style.backgroundColor = searchListInNewWin ? '#F5F5FF' : ''
 newWinOption.text =  ' (' + (searchListInNewWin ? 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 func

if (doneOnloadHook)searchList()
else addOnloadHook(searchList)