User:Alex Smotrov/searchlist.js

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 = ' ' + 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)