User:Alex Smotrov/iwiki.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.

var iwiki = new function (){
 
// View interwiki
 
var pLang, ul, lis, count, ww, displayMode = window.iwDisplayMode || 0
 
this.onLoad = function(){
 pLang = document.getElementById('p-lang')
 if (!pLang) return
 var h5 = pLang.getElementsByTagName('h5')[0]
 addHandler(h5, 'click', iwiki.display)
 h5.style.cursor = 'pointer'
 h5.title = 'Change how interwiki displayed'
 if (displayMode) iwiki.display() 
 
 if (wgAction=='edit' || wgAction=='submit')
   iwiki.loadSync()
}
 
 
this.display = function(){
 displayMode++
 if (displayMode > 3) displayMode = 1
 var aa, page
 if (!ww) getDisplayedList()
 switch (displayMode){
 case 1: //no change
   ww.sort(function(a,b){return a.i > b.i ? 1 : -1})
   for(i=0; i < count; i++){
     aa = ww[i].li.firstChild
     aa.title = ''
     aa.innerHTML = ww[i].local
   }
   break
 case 2: //English names
   ww.sort(function(a,b){return a.name > b.name ? 1 : -1})
   for(i=0; i < count; i++){
     aa = ww[i].li.firstChild
     aa.title = ww[i].local
     aa.innerHTML = ww[i].name 
   }
   break
 case 3: //actual interwiki links
   ww.sort(function(a,b){return a.lang > b.lang ? 1 : -1})
   for(i=0; i < count; i++){
     aa = ww[i].li.firstChild
     page = aa.href.match(/org\/wiki\/(.*)$/)[1]
     page = decodeURIComponent(page)
     aa.title = ww[i].name + ': ' + page
     aa.innerHTML = ww[i].lang + ':' + page
   }
   break
 }
 for(i=1; i < count; i++)
   ul.appendChild(ww[i].li)
}
 
function getDisplayedList(){
 ul = pLang.getElementsByTagName('ul')[0] 
 lis = ul.getElementsByTagName('li')
 count = lis.length
 ww = new Array(count)
 var aa, lang
 for (var i=0; i < count; i++){
   aa = lis[i].firstChild
   lang = aa.href.substring(7, aa.href.indexOf('.'))
   ww[i] = { 
     lang: lang,
     local: aa.innerHTML,
     name: iwNames[lang] || '- ' + aa.innerHTML,	
     li: lis[i],
     i: i 
   }
 }
}
 
 
 
// Sync interwiki
 
var wpTextbox1, iw, iwdiv, iwtable, queriedLink, siteLang, wasRedirect
 
this.loadSync = function(){
 addPortletLink('p-lang', 'javascript:iwiki.sync()', '(sync)')
}
 
this.sync = function(){
 iw = []
 queriedLink = ''
 wasRedirect = false
 siteLang = wgServer.substring(7, wgServer.indexOf('.'))
 wpTextbox1 = document.getElementById('wpTextbox1')
 var i, m, ma, re, txt = wpTextbox1.value
 //find local interwikis
 for (i in iwNames){
   re = new RegExp('\\[\\['+i+':'+'[^\\]]+\\]\\]', 'gi');   
   if (ma = txt.match(re)){
     if (ma.length==0) continue  
     for (var m=0; m < ma.length; m++)
       addIW(ma[m].substring(2,ma[m].length-2), false)  //drop brackets
   }
 }
 //add self
 addIW(siteLang + ':' + wgPageName.replace(/_/g, ' ')) 
 //show
 showDiv()
}
 
function showDiv(){
 if (iwdiv) iwdiv.style.display = 'block'
 else createDiv()
 //scroll to it
 var yy = iwdiv.offsetTop, obj = iwdiv
 while (obj = obj.offsetParent) yy += obj.offsetTop
 scrollTo(0, yy)
 drawTable()
}
 
 
function createDiv(){
 var div = document.createElement('div')
 div.innerHTML =  '<div id=iwdiv style="padding:10px; margin:5px; border:1px solid gray; min-height:150px">\
<div style="float:left; margin-right:20px">\
<br><input type=button value=Query id=iwNext onclick=iwiki.queryNext()\
 style="background-color:#EEEEEE">\
<br><br><input type=button value="Add All" id=appendAll onclick=iwiki.appendAll()\
 style="background-color:#EEEEEE">\
<br><br><br><input type=button value=Apply id=iwApply onclick=iwiki.apply()\
 style="background-color:#E5EFE5">\
<br><br><input type=button value=Cancel id=iwCancel onclick=iwiki.cancel()\
 style="background-color:#F5E5E5">\
</div></div>'
 wpTextbox1.parentNode.insertBefore(div, wpTextbox1.nextSibling)
 iwdiv = div.firstChild
 //document.getElementById('iwNext').onclick = iwiki.queryNext
 //document.getElementById('iwApply').onclick = iwiki.apply
 //document.getElementById('iwCancel').onclick = iwiki.cancel
}
 
function drawTable(){
 iw.sort(function(a,b){ return (a.lnk>b.lnk)?1:-1})
 var tb = document.createElement('tbody')
 //draw
 var tr, td, nocell, needAddAllButton = false, lang, prev = ''
 for (var i=0; i<iw.length; i++){
   tr = document.createElement('tr') 
   lang = getLang(iw[i].lnk)
   isself = (siteLang == lang)
   //«x» link to delete cell
   if (iw[i].local && !isself)
     putCell('<a title=remove href="javascript:iwiki.remove(\'' + i + '\')">x</a>',' ') 
   else
     putCell('', ' ') 
   td.style.paddingRight = '5px'
   //local  cell
   if (iw[i].local) {
     if (isself) {
       putCell (iw[i].lnk)
       td.style.color = 'gray'
       td.style.fontSize = 'smaller'
     }else{
       putCell(getFullLink(iw[i].lnk))
       if (iw[i].isnew) td.style.backgroundColor = '#DFFFEF'
       if (queriedLink == iw[i].lnk) { //was just queried
          td.style.backgroundColor = '#EFEFEF'
          td.style.fontWeight = 'bold'
       }
     }
     if (lang == prev) td.style.border = '2px solid red'
     prev = lang
   }else //local missing
     putCell('', '#FFEADF') 
   //status cell
   if (isself){  
     putCell('', ' ')
   }else if (!iw[i].local && iw[i].remote) {
     putCell('<a title=append href="javascript:iwiki.append(\'' + i + '\')">←</a>', ' ')
     needAddAllButton = true
   }else{
     htm = '<a title=query href="javascript:iwiki.query(\'' + i + '\')"'
     htm += (iw[i].queried) ? '>v' : '>?'
     putCell(htm+'</a>', ' ')
   }
   td.style.textAlign = 'center'
   td.style.width = '50px'
   //remote cell
   if (iw[i].remote){
     if (iw[i].local) putCell('', '#F5F5F5');
     else putCell (getFullLink(iw[i].lnk))
   }else if (!queriedLink || queriedLink == iw[i].lnk){ //remote not needed
     if (wasRedirect) putCell('(redirect)', ' ')
     else putCell('', ' ')
   }else{ //remote is absent
     putCell('', '#FFEADF')
   }
   //add row
   tb.appendChild(tr)
 }//for
 if (iwtable) 
   iwtable.replaceChild(tb, iwtable.firstChild)
 else{
   iwtable = document.createElement('table')
   iwtable.id = 'iwtable' 
   iwtable.appendChild(tb)
   iwdiv.appendChild(iwtable)
 } 
 document.getElementById('appendAll').style.visibility = needAddAllButton ? 'visible' : 'hidden'
 //iwdiv.focus()
 
 function putCell(htm, style){
  td = document.createElement('td')
  td.style.padding = '0 10px 0 10px '
  td.innerHTML = htm
  if (!style) 
    td.style.border = '1px dotted gray'
  else if (style != ' ') 
    td.style.backgroundColor = style
  tr.appendChild(td)
  return
 } 
}
 
function addIW(iwlink, isRemote){
 if (!isRemote){ //local
   var iwnew = {}
   iwnew.lnk = iwlink
   iwnew.local = true
   //iwnew.remote = false
   //iwnew.queried = false
   iw[iw.length] = iwnew
 }else{ //remote
   //if (siteLang == getLang(iwlink)) return
   var isFound = false
   for (var i=0; i<iw.length; i++)
     if (iw[i].lnk == iwlink) { isFound = true;  break }
   if (isFound){
     iw[i].remote = true
   }else{
     var iwnew = {}
     iwnew.lnk = iwlink
     iwnew.local = false
     iwnew.remote = true
     iw[iw.length] = iwnew
   }   
 }
}
 
function getLang(iwlink){ //en:Page -> en
 return iwlink.substring(0, iwlink.indexOf(':'))
}
 
function getPage(iwlink){ // //en:Page -> Page
 return iwlink.substring(iwlink.indexOf(':')+1)
}
 
function getFullLink(iwlink){ ////en:Page -> <a href=…
 return '<a href="' + 'http://' + getLang(iwlink) 
   + wgServer.substring(wgServer.indexOf('.')) + '/wiki/' 
   + encodeURIComponent(getPage(iwlink))  + '">' + iwlink + '</a>'
}
 
 
 
 
this.append = function(i){
 iw[i].local = true
 iw[i].isnew = true
 drawTable()
}
 
this.appendAll = function(){
 for (var i=0; i<iw.length; i++)
   if (!iw[i].local && iw[i].remote){
      iw[i].local = true
      iw[i].isnew = true
   }
 drawTable()
}
 
this.remove = function(i){
 iw[i].local = false
 //iw.splice(i,1)
 drawTable()
}
 
this.apply = function(){
 var i, re, txt = wpTextbox1.value
 //remove old
 for (i in iwNames){
   re = new RegExp('\\[\\['+i+':'+'[^\\]]+\\]\\]\n?', 'gi')
   txt = txt.replace(re, '\x01') 
 }
 //create new
 var iwtxt = ''
 for (i=0; i<iw.length; i++)
   if (iw[i].local && getLang(iw[i].lnk) != siteLang) 
     iwtxt += '[' + '[' + iw[i].lnk + ']]\n'
 //append new
 txt = txt.replace('\x01', iwtxt).replace(/\x01/g,'')
 wpTextbox1.value = txt
 iwdiv.style.display = 'none'
}
 
this.cancel = function(){
 iwdiv.style.display = 'none'
}
 
this.queryNext = function(){
 for (var i=0; i<iw.length; i++)
   if (iw[i].local && !iw[i].queried && getLang(iw[i].lnk) != siteLang) { 
      iwiki.query(i)
      break 
   }
} 
 
this.query = function(idx){
 document.getElementById('iwNext').style.textDecoration = 'blink'
 queriedLink = iw[idx].lnk //remember
 queryGo('langlinks&titles='+encodeURIComponent(getPage(queriedLink)) 
  + '&proxylang='+getLang(queriedLink),  iwiki.process )
}
 
 
 
this.process = function(q){
 document.getElementById('iwNext').style.textDecoration = 'none'
 //mark queried link
 for (var i=0; i<iw.length; i++) 
   if (queriedLink == iw[i].lnk){ iw[i].queried = true;  break  }
 //clear last results
 for (var i=0; i<iw.length; i++) { 
   iw[i].remote = false
   if (!iw[i].local) { iw.splice(i,1); i-- } //remove item
 }
 //add new iwikis
 links = anyChild(q.pages).langlinks
 if (links){
   for (var n=0; n<links.length; n++){
     iwlink = links[n].lang + ':' + links[n]['*']
     addIW(iwlink, true)
   }
   wasRedirect = false
 }else if (typeof anyChild(q.pages).redirect == 'string') 
   wasRedirect = true 
 drawTable()
}
 
 
 
function queryGo(params, func){
 var aj = sajax_init_object()
 aj.onreadystatechange = function() {
   if (aj.readyState != 4) return
   //if (aj.status == 200) {
     eval('q='+aj.responseText) 
     func(q)
   //} else jsMsg('Empty query result') //else func(null)
 }
 var url='/w/query.php?format=json&noprofile&what=' + params
 aj.open("GET",url,true)
 //aj.setRequestHeader('Accept','text/*')
 aj.send(null)
}
 
 
//interwiki codes and names, extracted from http://meta.wikimedia.org/wiki/List_of_Wikipedias
var iwNames = {
'en':'English',
'de':'German',
'fr':'French',
'pl':'Polish',
'ja':'Japanese',
'nl':'Dutch',
'it':'Italian',
'pt':'Portuguese',
'es':'Spanish',
'sv':'Swedish',
'ru':'Russian',
'zh':'Chinese',
'fi':'Finnish',
'no':'Norwegian (Bokmål)',
'vo':'Volapük',
'ro':'Romanian',
'tr':'Turkish',
'eo':'Esperanto',
'ca':'Catalan',
'sk':'Slovak',
'cs':'Czech',
'uk':'Ukrainian',
'hu':'Hungarian',
'da':'Danish',
'id':'Indonesian',
'he':'Hebrew',
'lt':'Lithuanian',
'sr':'Serbian',
'sl':'Slovenian',
'lmo':'Lombard',
'bg':'Bulgarian',
'ko':'Korean',
'ar':'Arabic',
'et':'Estonian',
'te':'Telugu',
'hr':'Croatian',
'new':'Newar / Nepal Bhasa',
'ceb':'Cebuano',
'gl':'Galician',
'th':'Thai',
'el':'Greek',
'nn':'Norwegian (Nynorsk)',
'fa':'Persian',
'vi':'Vietnamese',
'ms':'Malay',
'bpy':'Bishnupriya Manipuri',
'eu':'Basque',
'bs':'Bosnian',
'simple':'Simple English',
'lb':'Luxembourgish',
'is':'Icelandic',
'sq':'Albanian',
'ka':'Georgian',
'az':'Azeri',
'br':'Breton',
'bn':'Bengali',
'la':'Latin',
'io':'Ido',
'hi':'Hindi',
'sh':'Serbo-Croatian',
'mr':'Marathi',
'su':'Sundanese',
'mk':'Macedonian',
'nap':'Neapolitan',
'cy':'Welsh',
'ta':'Tamil',
'lv':'Latvian',
'scn':'Sicilian',
'nds':'Low Saxon',
'oc':'Occitan',
'pms':'Piedmontese',
'jv':'Javanese',
'tl':'Tagalog',
'ku':'Kurdish',
'ast':'Asturian',
'wa':'Walloon',
'af':'Afrikaans',
'tg':'Tajik',
'be-x-old':'Belarusian (Tarashkevitsa)',
'roa-tara':'Tarantino',
'an':'Aragonese',
'be':'Belarusian',
'ru-sib':'Siberian/North Russian',
'ksh':'Ripuarian',
'ht':'Haitian',
'cv':'Chuvash',
'ur':'Urdu',
'mi':'Maori',
'sw':'Swahili',
'vec':'Venetian',
'uz':'Uzbek',
'fy':'West Frisian',
'zh-yue':'Cantonese',
'ga':'Irish',
'co':'Corsican',
'qu':'Quechua',
'kn':'Kannada',
'gd':'Scottish Gaelic',
'ml':'Malayalam',
'yi':'Yiddish',
'yo':'Yoruba',
'nah':'Nahuatl',
'bat-smg':'Samogitian',
'pam':'Kapampangan',
'tt':'Tatar',
'ia':'Interlingua',
'sa':'Sanskrit',
'hsb':'Upper Sorbian',
'hy':'Armenian',
'li':'Limburgian',
'als':'Alemannic',
'map-bms':'Banyumasan',
'am':'Amharic',
'pag':'Pangasinan',
'zh-min-nan':'Min Nan',
'nrm':'Norman',
'fo':'Faroese',
'se':'Northern Sami',
'nds-nl':'Dutch Low Saxon',
'fur':'Friulian',
'bh':'Bihari',
'nov':'Novial',
'war':'Waray-Waray',
'pi':'Pali',
'vls':'West Flemish',
'ilo':'Ilokano',
'sco':'Scots',
'frp':'Franco-Provençal/Arpitan',
'lij':'Ligurian',
'ne':'Nepali',
'dv':'Divehi',
'os':'Ossetian',
'zh-classical':'Classical Chinese',
'diq':'Zazaki',
'mt':'Maltese',
'kk':'Kazakh',
'csb':'Kashubian',
'pdc':'Pennsylvania German',
'lad':'Ladino',
'fiu-vro':'Võro',
'kw':'Cornish',
'to':'Tongan',
'bar':'Bavarian',
'ps':'Pashto',
'rm':'Romansh',
'tk':'Turkmen',
'ang':'Anglo-Saxon',
'ln':'Lingala',
'mn':'Mongolian',
'jbo':'Lojban',
'tpi':'Tok Pisin',
'or':'Oriya',
'wo':'Wolof',
'ty':'Tahitian',
'eml':'Emilian-Romagnol',
'ky':'Kirghiz',
'arc':'Assyrian Neo-Aramaic',
'ig':'Igbo',
'roa-rup':'Aromanian',
'mo':'Moldovan',
'gu':'Gujarati',
'km':'Khmer',
'ie':'Interlingue',
'kab':'Kabyle',
'ks':'Kashmiri',
'wuu':'Wu',
'glk':'Gilaki',
'zea':'Zealandic',
'mg':'Malagasy',
'tet':'Tetum',
'cu':'Old Church Slavonic',
'sc':'Sardinian',
'so':'Somali',
'gv':'Manx',
'kg':'Kongo',
'udm':'Udmurt',
'si':'Sinhalese',
'iu':'Inuktitut',
'pa':'Punjabi',
'rmy':'Romani',
'cbk-zam':'Zamboanga Chavacano',
'na':'Nauruan',
'haw':'Hawaiian',
'lo':'Lao',
'bo':'Tibetan',
'sd':'Sindhi',
'chr':'Cherokee',
'ba':'Bashkir',
'got':'Gothic',
'om':'Oromo',
'ee':'Ewe',
'ti':'Tigrinya',
'as':'Assamese',
'sm':'Samoan',
'ay':'Aymara',
'ug':'Uyghur',
'hak':'Hakka',
'av':'Avar',
'cdo':'Min Dong',
'mzn':'Mazandarani',
'ce':'Chechen',
'bm':'Bambara',
'nv':'Navajo',
'pap':'Papiamentu',
'cr':'Cree',
'zu':'Zulu',
'rw':'Kinyarwanda',
'my':'Burmese',
'tlh':'Klingon',
'xh':'Xhosa',
've':'Venda',
'ik':'Inupiak',
'dz':'Dzongkha',
'pih':'Norfolk',
'gn':'Guarani',
'ss':'Swati',
'ab':'Abkhazian',
'kl':'Greenlandic',
'kv':'Komi',
'bug':'Buginese',
'ak':'Akan',
'bi':'Bislama',
'st':'Sesotho',
'bxr':'Buryat (Russia)',
'tn':'Tswana',
'xal':'Kalmyk',
'tw':'Twi',
'ny':'Chichewa',
'fj':'Fijian',
'ff':'Fula',
'ha':'Hausa',
'tum':'Tumbuka',
'sn':'Shona',
'za':'Zhuang',
'ki':'Kikuyu',
'sg':'Sango',
'ii':'Sichuan Yi',
'lg':'Luganda',
'cho':'Choctaw',
'lbe':'Lak',
'rn':'Kirundi',
'chy':'Cheyenne',
'ts':'Tsonga',
'mh':'Marshallese',
'ch':'Chamorro',
'ng':'Ndonga',
'aa':'Afar',
'kj':'Kuanyama',
'ho':'Hiri Motu',
'mus':'Muscogee',
'kr':'Kanuri',
'hz':'Herero',
'tokipona':'Tokipona'
}
 
} //obj
 
 
function anyChild(obj) {  for(var key in obj)  return obj[key]; return null }
 
 
addOnloadHook(iwiki.onLoad)