User:Magnus Manske/insertref.js

if ( mw.config.get('wgAction') != "submit" && mw.config.get('wgAction') != "edit" && mw.config.get('wgNamespaceNumber') == 0 ) { addOnloadHook ( init_insertref ) ; }

function init_insertref { var d = document.getElementById('p-tb'); var ul = d.getElementsByTagName('ul')[0] ; var li = document.createElement('li'); var a = document.createElement('a'); a.id = 'insertref_link' ; a.href='#'; a.onclick = insertref_onclick ;

a.appendChild ( document.createTextNode('Insert reference') ) ; li.appendChild ( a ) ; ul.appendChild ( li ) ; }

function getSelText {   var txt = ''; if (window.getSelection) {       txt = window.getSelection; }   else if (document.getSelection) {       txt = document.getSelection; }   else if (document.selection) {       txt = document.selection.createRange.text; }   return txt ; }

function add_references_section ( s ) { var n = s.split ( " 1 ) return s ; // Already has s = s.split ( "\n=" ) ; var last = s.pop ; n = last.split ( "\n" ) ; last = "" ; var added = false ; while ( n.length > 0 ) { if ( n[0].substr(0,2) != '{{' && n[0].substr(0,11) != '[[Category:' && n[0].substr(0,11) != '[[category:' ) {     last += n.shift + "\n" ;      continue ;    }    last += "\n\n== References ==\n \n\n" + n.shift + "\n" ;    last += n.join ( "\n" ) ;    added = true ;    break ;  }  if ( !added ) last += "\n\n== References ==\n \n" ;

s.push ( last ) ; s = s.join ( "\n=" ) ; return s ; }

function insertref_onclick { var txt = getSelText ; if ( txt == '' ) { alert ( 'Please select some text first' ) ; return ; }

var url = mw.config.get('wgServer') + mw.config.get('wgScript') + "?action=raw&title=" + mw.config.get('wgTitle') ; var request = new XMLHttpRequest; request.open("GET", url, false); request.send(null); var wiki = request.responseText.split(txt) ;

if ( wiki.length == 1 ) { alert ( "Selected text was not found in wiki source text. Please select a different (smaller) part of the text, with no formatting" ) ; return ; }

if ( wiki.length > 2 ) { alert ( "Selected text was ambiguous. Please select more (unique) text." ) ; return ; }

var reference = prompt ( "Enter reference:", " " ) ;

var c = confirm ( "Insert left (OK) or right (CANCEL) of the selection?" ) ; if ( c ) { while ( wiki[0] != '' && wiki[0].substr(wiki[0].length-1,1) == '[' ) { txt = '[' + txt ; wiki[0] = wiki[0].substr(0, wiki[0].length-1) ; }   wiki = wiki[0] + reference + txt + wiki[1] ; } else { while ( wiki[1] != '' && wiki[1].substr(0,1) == ']' ) { txt += ']' ; wiki[1] = wiki[1].substr(1) ; }   wiki = wiki[0] + txt + reference +  wiki[1] ; }

wiki = add_references_section ( wiki ) ;

var a = document.getElementById('insertref_link');

var f = document.createElement('form') ; f.action = mw.config.get('wgServer') + mw.config.get('wgScript') + "?action=edit&title=" + mw.config.get('wgTitle') ; f.method='post' ; f.style.display = 'none' ;

var f_text = document.createElement('input') ; f_text.type='hidden' ; f_text.name='wpTextbox1' ; f_text.value=wiki ;

var f_diff = document.createElement('input') ; f_diff.name = 'wpDiff' ; f_diff.type='submit' ; f_diff.value='Show changes' ;

f.appendChild ( f_text ) ; f.appendChild ( f_diff) ; a.parentNode.appendChild ( f ) ;

f_diff.click ;

return false ; }