/*jshint smarttabs:true, loopfunc:true,forin:false*/ /*global mw, $ */ // TODO: make autodate an option in the CiteTemplate object, not a preference  // Global object // TODO: // * Remove this once the page is moved to a module 'ext.gadget.refToolbarDialogs' depending on 'ext.gadget.refToolbarBase' if (typeof CiteTB === 'undefined') {   var CiteTB = {     "Templates" : {}, // All templates     "Options" : {}, // Global options     "UserOptions" : {}, // User options     "DefaultOptions" : {}, // Script defaults     "ErrorChecks" : {} // Error check functions   }; }  //ইংরেজি সংখ্যাকে বাংলা করবে function convert(str) {     var mystr = str.toString();     var outj; // javascript escaped hex     var outj1;     var be = new Array();     be['1'] = "\u09E7";     be['2'] = "\u09E8";     be['3'] = "\u09E9";     be['4'] = "\u09EA";     be['5'] = "\u09EB";     be['6'] = "\u09EC";     be['7'] = "\u09ED";     be['8'] = "\u09EE";     be['9'] = "\u09EF";     be['0'] = "\u09E6";     be[' '] = ;     be['-'] = '-';     outj1 = "";     for (var i = 0; i < mystr.length; i++) {         var ch = mystr.substr(i, 1);         outj = be[ch];         outj1 += outj;     }     return outj1;  }  // Only execute when editing/previewing wikitext pages // TODO: Remove tests already done by MediaWiki:Gadget-refToolbar.js if ( 	['edit', 'submit'].indexOf( mw.config.get('wgAction') ) !== -1 && 	mw.config.get('wgPageContentModel') === 'wikitext' ) {  // TODO: Move this to MediaWiki:Gadget-refToolbarDialogs.css and add it to the definition of module 'ext.gadget.refToolbarDialogs' mw.util.addCSS(".cite-form-td {"+ "height: 0 !important;"+ "padding: 0.1em !important;"+ "}");    // Default options, these mainly exist so the script won't break if a new option is added CiteTB.DefaultOptions = {   "date format" : "<year>-<zmonth>-<zdate>",   "autodate fields" : [],   "months" : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],   "modal" : true,   "autoparse" : false,   "expandtemplates": false };  // Get an option - user settings override global which override defaults CiteTB.getOption = function(opt) {   if (CiteTB.UserOptions[opt] !== undefined) {     return CiteTB.UserOptions[opt];   } else if (CiteTB.Options[opt] !== undefined) {     return CiteTB.Options[opt];   }   return CiteTB.DefaultOptions[opt]; };  CiteTB.init = function() {   /* Main stuff, build the actual toolbar structure    * 1. get the template list, make the dropdown list and set up the template dialog boxes    * 2. actually build the toolbar:    *    * A section for cites    *    ** dropdown for the templates (previously defined)    *    ** button for named refs with a dialog box    *    ** button for errorcheck    * 3. add the whole thing to the main toolbar   */    if (typeof $('div[rel=cites]')[0] !== 'undefined') { // Mystery IE bug workaround     return;   }   $('head').trigger('reftoolbarbase');   var $target = $('#wpTextbox1');   var temlist = {};   for (var t in CiteTB.Templates) {     var tem = CiteTB.Templates[t];     var sform = CiteTB.escStr(tem.shortform);     var actionobj = {        type: 'dialog',       module: 'cite-dialog-'+sform     };     var dialogobj = {};     dialogobj['cite-dialog-'+sform] = {       resizeme: false,       title: mw.message( 'cite-dialog-'+sform ).parse(),        id: 'citetoolbar-'+sform,       init: function() {},        html: tem.getInitial(),        dialog: {         width:680,         open: function() {            $(this).html(CiteTB.getOpenTemplate().getForm());           /** @param {jQuery.Event} e */           $('.cite-prev-parse').on( 'click', function ( e ) {             e.preventDefault();             CiteTB.prevParseClick();           });         },         buttons: {           'cite-form-submit': function() {             var ref = CiteTB.getRef(false, true);             $(this).dialog( 'close' );             $.wikiEditor.modules.toolbar.fn.doAction( $(this).data( 'context' ), {               type: 'encapsulate',               options: {                 post: ref               }             }, $(this) );           },           'cite-form-showhide': CiteTB.showHideExtra,           'cite-refpreview': function() {                var ref = CiteTB.getRef(false, false);             var template = CiteTB.getOpenTemplate();             var div = $("#citetoolbar-"+CiteTB.escStr(template.shortform));             div.find('.cite-preview-label').show();             div.find('.cite-ref-preview').text(ref).show();             if (CiteTB.getOption('autoparse')) {               CiteTB.prevParseClick();             } else {               div.find('.cite-prev-parse').show();               div.find('.cite-prev-parsed-label').hide();               div.find('.cite-preview-parsed').html();             }                    },           'wikieditor-toolbar-tool-link-cancel': function() {             $(this).dialog( 'close' );           },           'cite-form-reset': function() {             CiteTB.resetForm();           }         }       }      };     try {         $target.wikiEditor('addDialog', dialogobj);     } catch (e) {         // TypeError: range is null     }     //if (!CiteTB.getOption('modal')) {       //$('#citetoolbar-'+sform).dialog('option', 'modal', false);     //}     temlist[sform] = {label: tem.templatename, action: actionobj };     }    var refsection =  {     'sections': {       'cites': {          type: 'toolbar',          label: mw.msg( 'cite-section-label' ),         groups: {            'template': {             tools: {               'template': {                 type: 'select',                 label: mw.msg( 'cite-template-list' ),                 list: temlist               }              }           },           'namedrefs': {             label: mw.msg( 'cite-named-refs-label' ),             tools: {               'nrefs': {                 type: 'button',                 action: {                   type: 'dialog',                   module: 'cite-toolbar-namedrefs'                 },                 icon: '//upload.wikimedia.org/wikipedia/commons/thumb/b/be/Nuvola_clipboard_lined.svg/22px-Nuvola_clipboard_lined.svg.png',                 section: 'cites',                 group: 'namedrefs',                 label: mw.msg( 'cite-named-refs-button' )               }             }           },           'errorcheck': {             label: mw.msg( 'cite-errorcheck-label' ),             tools: {               'echeck': {                 type: 'button',                 action: {                   type: 'dialog',                   module: 'cite-toolbar-errorcheck'                            },                 icon: '//upload.wikimedia.org/wikipedia/commons/thumb/a/a3/Nuvola_apps_korganizer-NO.png/22px-Nuvola_apps_korganizer-NO.png',                 section: 'cites',                 group: 'errorcheck',                 label: mw.msg( 'cite-errorcheck-button' )               }             }           }         }        }      }    };      var defaultdialogs = {      'cite-toolbar-errorcheck': {       title: mw.message( 'cite-errorcheck-label' ).parse(),       id: 'citetoolbar-errorcheck',       resizeme: false,       init: function() {},       html: ''+         ''+         ' '+mw.usability.getMsg('cite-loading')+'',       dialog: {         width:550,         open: function() {            CiteTB.loadRefs();         },         buttons: {           'cite-errorcheck-submit': function() {             var errorchecks = $("input[name='cite-err-test']:checked");             var errors = [];             for (var i=0; i<errorchecks.length; i++) {               errors = errors.concat(CiteTB.ErrorChecks[$(errorchecks[i]).val()].run());             }             CiteTB.displayErrors(errors);             $(this).dialog( 'close' );                                 },           'wikieditor-toolbar-tool-link-cancel': function() {             $(this).dialog( 'close' );           }         }       }     },     'cite-toolbar-namedrefs': {       title: mw.message( 'cite-named-refs-title' ).parse(),       resizeme: false,       id: 'citetoolbar-namedrefs',       html: ''+         ''+         ' '+mw.usability.getMsg('cite-loading')+'',       init: function() {},       dialog: {         width: 550,         open: function() {            CiteTB.loadRefs();         },         buttons: {           'cite-form-submit': function() {             var refname = $("#cite-namedref-select").val();             if (refname === ) {               return;             }             $(this).dialog( 'close' );             $.wikiEditor.modules.toolbar.fn.doAction( $(this).data( 'context' ), {               type: 'encapsulate',               options: {                 post: CiteTB.getNamedRef(refname, true)               }             }, $(this) );           },           'wikieditor-toolbar-tool-link-cancel': function() {             $(this).dialog( 'close' );           }                            }       }           }   };      try {     $target.wikiEditor('addDialog', defaultdialogs);   } catch (e) {     // error occurred setting up wikieditor.   }   $('#citetoolbar-namedrefs').off('dialogopen');   if (!CiteTB.getOption('modal')) {     //$('#citetoolbar-namedrefs').dialog('option', 'modal', false);     //$('#citetoolbar-errorcheck').dialog('option', 'modal', false);     mw.util.addCSS(".ui-widget-overlay {"+     "display:none !important;"+     "}");     }   try {     $target.wikiEditor('addToToolbar', refsection);   } catch (e) {     // error occurred setting up wikieditor.   } };  // Load local data - messages, cite templates, etc. $(document).ready( function() {   switch( mw.config.get('wgUserLanguage') ) {     case 'de': // German       mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-de.js&action=raw&ctype=text/javascript');       break;     default: // বাংলা       mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-bn.js&action=raw&ctype=text/javascript');   } });  // Setup the main object CiteTB.mainRefList = []; CiteTB.refsLoaded = false;  // REF FUNCTIONS // Actually assemble a ref from user input CiteTB.getRef = function(inneronly, forinsert) {   var i, j, g, group;   var template = CiteTB.getOpenTemplate();   var templatename = template.templatename;   var res = ;   var refobj = {'shorttag':false};   if (!inneronly) {     group = $('#cite-'+CiteTB.escStr(template.shortform)+'-group').val();     var refname = $('#cite-'+CiteTB.escStr(template.shortform)+'-name').val();     res += '<ref';     if (refname) {       refname = $.trim(refname);       res+=' name='+CiteTB.getQuotedString(refname);       refobj.refname = refname;     }     if (group) {       group = $.trim(group);       res+=' group='+CiteTB.getQuotedString(group);       refobj.refgroup = group;     }     res+='>';   }   var content ='{{'+templatename;   for( g in template.incrementables ) {   	group = template.incrementables[g];   	for (i=1; i<=group.val; i++) { 		for (j=0; j<group.fields.length; j++) {   			var fieldname = group.fields[j].field;   			var fieldid = fieldname.replace('<N>', i.toString());   			var field = $('#cite-'+CiteTB.escStr(template.shortform)+'-'+fieldid).val();   			if (field) {   				content+=' |'+fieldid+'=';   				content+= $.trim(field);   			}   		}   	}   }   for( i=0; i<template.basic.length; i++ ) {   	if (template.basic[i].increment_group) {   		continue;   	}     var fieldname = template.basic[i].field;     var field = $('#cite-'+CiteTB.escStr(template.shortform)+'-'+fieldname).val();     if (field) {       content+=' |'+fieldname+'=';       content+= $.trim(field);     }   }   if ($('#cite-form-status').val() !== 'closed') {     for( i=0; i<template.extra.length; i++ ) {       if (template.extra[i].increment_group) {         continue;       }       var fieldname = template.extra[i].field;       var field = $('#cite-'+CiteTB.escStr(template.shortform)+'-'+fieldname).val();       if (field) {         content+=' |'+fieldname+'=';         content+= $.trim(field);       }     }   }   content+= '}}';   res+=content;   refobj.content = content;   if (!inneronly) {     res+= '</ref>';   }   if (forinsert) {     CiteTB.mainRefList.push(refobj);   }   return res; };  // Make a reference to a named ref CiteTB.getNamedRef = function(refname, forinsert) {   if (forinsert) {     CiteTB.mainRefList.push( {'shorttag':true, 'refname':refname} );   }   return '';   };  // Function to load the ref list CiteTB.loadRefs = function() {   if (CiteTB.refsLoaded) {     return;   }   CiteTB.getPageText(CiteTB.loadRefsInternal); };  // Function that actually loads the list from the page text CiteTB.loadRefsInternal = function(text) {    // What this does:             extract first name/group                                     extract second name/group                                          shorttag   inner content   var refsregex = /< *ref(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?: +(name|group) *= *(?:"([^"]*?)"|'([^']*?)'|([^ '"\/\>]*?)) *)? *(?:\/ *>|>((?:.|\n)*?)< *\/ *ref *>)/gim;   // This should work regardless of the quoting used for names/groups and for linebreaks in the inner content     while (true) {     var ref = refsregex.exec(text);     if (ref === null) {       break;     }     var refobj = {};     if (ref[9]) { // Content + short tag check       //alert('"'+ref[9]+'"');       refobj.content = ref[9];        refobj.shorttag = false;     } else {       refobj.shorttag = true;     }     if (ref[1] !== ) { // First name/group       if (ref[2]) {         refobj['ref'+ref[1]] = ref[2];       } else if (ref[3]) {         refobj['ref'+ref[1]] = ref[3];       } else {         refobj['ref'+ref[1]] = ref[4];       }     }     if (ref[5] !== ) { // Second name/group       if (ref[6]) {         refobj['ref'+ref[5]] = ref[6];       } else if (ref[7]) {         refobj['ref'+ref[5]] = ref[7];       } else {         refobj['ref'+ref[5]] = ref[8];       }     }     CiteTB.mainRefList.push(refobj);   }   CiteTB.refsLoaded = true;   CiteTB.setupErrorCheck();   CiteTB.setupNamedRefs(); };  // AJAX FUNCTIONS // Parse some wikitext and hand it off to a callback function CiteTB.parse = function(text, callback) {   $.post( mw.util.wikiScript( 'api' ),     {action:'parse', title:mw.config.get('wgPageName'), text:text, prop:'text', format:'json'},     function(data) {       var html = data.parse.text['*'];       callback(html);     },     'json'   );   };  // Use the API to expand templates on some text CiteTB.expandtemplates = function(text, callback) {   $.post( mw.util.wikiScript( 'api' ),     {action:'expandtemplates', title:mw.config.get('wgPageName'), text:text, format:'json'},     function(data) {       var restext = data.expandtemplates['*'];       callback(restext);     },     'json'   ); };  // Function to get the page text CiteTB.getPageText = function(callback) {   var section = $("input[name='wpSection']").val();   if ( section !==  ) {     var postdata = {action:'query', prop:'revisions', rvprop:'content', pageids:mw.config.get('wgArticleId'), format:'json'};     if (CiteTB.getOption('expandtemplates')) {       postdata.rvexpandtemplates = '1';     }     $.get( mw.util.wikiScript( 'api' ),       postdata,       function(data) {         var pagetext = data.query.pages[mw.config.get('wgArticleId').toString()].revisions[0]['*'];         callback(pagetext);       },       'json'     );   } else {     if (CiteTB.getOption('expandtemplates')) {       CiteTB.expandtemplates($('#wpTextbox1').wikiEditor('getContents').text(), callback);     } else {       callback($('#wpTextbox1').wikiEditor('getContents').text());     }   } };  // Safe version of decodeURIComponent() that doesn't throw exceptions. // If the native decodeURIComponent() threw an exception, the original string will be returned. CiteTB.safeDecodeURIComponent = function(s) { 	try { 		s = decodeURIComponent(s); 	} catch (e) {} 	return s; };  // Autofill a template from an ID (ISBN, DOI, PMID, URL) CiteTB.initAutofill = function() {   var elemid = $(this).attr('id');   var res = /^cite\-auto\-(.*?)\-(.*)\-(.*)$/.exec(elemid);   var tem = res[1];   var field = res[2];   var autotype = res[3];   var id = $('#cite-'+tem+'-'+field).val();   if (!id) {     return false;   }   var url = '//reftoolbar.toolforge.org/lookup.php?';   // Citoid expects minimally encoded input, so do some speculative decoding here to avoid   // 404 fetches. https://phabricator.wikimedia.org/T146539   id = CiteTB.safeDecodeURIComponent(id);   url+=autotype+'='+encodeURIComponent(id);   url+='&template='+encodeURIComponent(tem);   var s = document.createElement('script');   s.setAttribute('src', url);   s.setAttribute('type', 'text/javascript');   document.getElementsByTagName('head')[0].appendChild(s);   return false; };  // Callback for autofill //TODO: Autofill the URL, at least for DOI CiteTB.autoFill = function(data, template, type) {   var cl = 'cite-'+template+'-';   var i,j, coauthors;   $('.'+cl+'title').val(data.title);   // Fill in authors   if (data.authors && data.authors.length > 0) { 	  if ($('.'+cl+'last-incr-1').length != 0) { 		var classes = $('.'+cl+'last-incr-1').eq(0).attr('class').split(/\s+/); 		var group = false; 		var patt = /cite-[^-]*?-incr-(.*)/ 		for (var c=0; c<classes.length; c++) { 			if (patt.exec(classes[c])) { 				group = patt.exec(classes[c])[1]; 				break; 			} 		} 		$('.'+cl+'last-incr-1').val(data.authors[0][0]) 		$('.'+cl+'first-incr-1').val(data.authors[0][1]) 		elemid = '#cite-incr-'+template+'-'+group; 		for (var i=2; i<data.authors.length+1; i++) { 			$(elemid).click(); 			$('.'+cl+'last-incr-'+i.toString()).val(data.authors[i-1][0]) 			$('.'+cl+'first-incr-'+i.toString()).val(data.authors[i-1][1]) 		} 	  } else if ($('.'+cl+'author-incr-1').length != 0) { 		var classes = $('.'+cl+'author-incr-1').eq(0).attr('class').split(/\s+/); 		var group = false; 		var patt = /cite-[^-]*?-incr-(.*)/ 		for (var c=0; c<classes.length; c++) { 			if (patt.exec(classes[c])) { 				group = patt.exec(classes[c])[1]; 				break; 			} 		} 		$('.'+cl+'author-incr-1').val(data.authors[0].join(', ')) 		elemid = '#cite-incr-'+template+'-'+group; 		for (var i=2; i<data.authors.length+1; i++) { 			$(elemid).click(); 			$('.'+cl+'author-incr-'+i.toString()).val(data.authors[i-1].join(', ')) 		} 	  } else if ($('.'+cl+'last1').length != 0) { 		for(i=0; data.authors && i<data.authors.length; i++) { 		  if ($('.'+cl+'last'+(i+1)).length) { 			 $('.'+cl+'last'+(i+1)).val(data.authors[i][0]); 			 $('.'+cl+'first'+(i+1)).val(data.authors[i][1]); 		  } else { 			coauthors = []; 			for(j=i; j<data.authors.length; j++) { 			  coauthors.push(data.authors[j].join(', ')); 			} 			$('.'+cl+'coauthors').val(coauthors.join('; ')); 			break; 		  } 		} 	  } else if($('.'+cl+'author1').length !== 0) { 		for(i=0; data.authors && i<data.authors.length; i++) { 		  if ($('.'+cl+'author'+(i+1)).length) { 			 $('.'+cl+'author'+(i+1)).val(data.authors[i].join(', ')); 		  } else { 			coauthors = []; 			for(j=i; j<data.authors.length; j++) { 			  coauthors.push(data.authors[j].join(', ')); 			} 			$('.'+cl+'coauthors').val(coauthors.join('; ')); 			break; 		  } 		} 	  } else { 		var authors = []; 		for(i=0; data.authors && i<data.authors.length; i++) { 		  authors.push(data.authors[i].join(', ')); 		} 		$('.'+cl+'authors').val(authors.join('; ')); 	  }   }    // Format partial dates of the format YYYY-MM, YYYY-MM-XX, or YYYY-MM-DD correctly   if ( data.date ) {     try {       var DT = new Date(data.date);       if ( /^\d{4}-\d{2}(-XX)?$/i.test(data.date) ) {         data.date = data.date.replace('-XX',);         $('.'+cl+'date').val(CiteTB.formatDate(DT, false, true));       } else if ( /^\d{4}-\d{2}-\d{2}?/i.test(data.date) ) {         $('.'+cl+'date').val(CiteTB.formatDate(DT, true, true));       } else {         $('.'+cl+'date').val(data.date);       }     } catch (e) {}   } else {     $('.'+cl+'date').val(data.date);   }    if (type === 'pmid' || type === 'doi') {     $('.'+cl+'journal').val(data.journal);     $('.'+cl+'volume').val(data.volume);     $('.'+cl+'issue').val(data.issue);     $('.'+cl+'pages').val(data.pages);     if (type === 'pmid' && data.doi) {       $('.'+cl+'doi').val(data.doi);     }   } else if (type === 'isbn') {     $('.'+cl+'publisher').val(data.publisher);     $('.'+cl+'location').val(data.location);     $('.'+cl+'edition').val(data.edition);   } else if (type === 'url') {     $('.'+cl+'journal').val(data.journal);     $('.'+cl+'volume').val(data.volume);     $('.'+cl+'issue').val(data.issue);     $('.'+cl+'pages').val(data.pages);     $('.'+cl+'publisher').val(data.publisher);     $('.'+cl+'edition').val(data.edition);     $('.'+cl+'isbn').val(data.isbn);     $('.'+cl+'issn').val(data.issn);     $('.'+cl+'doi').val(data.doi);     // "bn-BD" isn't a valid value for the language parameter     if (data.language && data.language !== 'bn-BD' && data.language !== 'bn-IN') {     	$('.'+cl+'language').val(data.language);     }     $('.'+cl+'chapter').val(data.chapter);   } };  // FORM DIALOG FUNCTIONS // Add new incrementable fields CiteTB.incrementFields = function() { 	template = CiteTB.getOpenTemplate(); 	var currentrow = $(this).parents('tr')[0]; 	$(this).prev().css('width', '100%') 	$(this).detach(); 	var elemid = $(this).attr('id'); 	var res = /^cite\-incr\-(.*?)\-(.*)$/.exec(elemid); 	group = res[2]; 	increments = template.incrementables[group]; 	fields = increments.fields; 	incrval = increments.val+1; 	template.incrementables[group].val += 1; 	trs = template.makeFormInner(fields, false); 	trs.reverse(); 	for (var i=0; i<trs.length; i++) { 		$(currentrow).after(trs[i]); 	} };  // fill the accessdate param with the current date CiteTB.fillAccessdate = function() {   var elemid = $(this).attr('id');   var res = /^cite\-date\-(.*?)\-(.*)$/.exec(elemid);   var id = res[1];   var field = res[2];   var DT = new Date();   var datestr = CiteTB.formatDate(DT);   $('#cite-'+id+'-'+field).val(datestr);   return false; };  CiteTB.formatDate = function(DT, useday, usemonth) {   if (typeof useday == "undefined") {     useday = true;	   }   if (typeof usemonth == "undefined") {     usemonth = true;	   }   var datestr = CiteTB.getOption('date format');   var zmonth = ;   var month = DT.getUTCMonth()+1;   if (month < 10) {     zmonth = "0"+month.toString();   } else {     zmonth = month.toString();   }   month = month.toString();   var zdate = ;   var date = DT.getUTCDate();   if (date < 10) {     zdate = "0"+date.toString();   } else {     zdate = date.toString();   }   date = date.toString();   if (useday) {     datestr = datestr.replace('<date>', convert(date));     datestr = datestr.replace('<zdate>', zdate);   } else {     datestr = datestr.replace('<date>', );     datestr = datestr.replace('<zdate>', );   }   if (usemonth) {     datestr = datestr.replace('<month>', month);     datestr = datestr.replace('<zmonth>', zmonth);     datestr = datestr.replace('<monthname>', CiteTB.getOption('months')[DT.getUTCMonth()]);   } else {     datestr = datestr.replace('<month>', );     datestr = datestr.replace('<zmonth>', );     datestr = datestr.replace('<monthname>', );   }     datestr = datestr.replace('<year>', convert(DT.getUTCFullYear().toString()));   return datestr.replace(/^[ \/\-\,\.]*(.*?)[ \/\-\,\.]*$/g, "$1"); // Cleanup any dangling spaces or connectors that might result from omitting date/month };  // Function called after the ref list is loaded, to actually set the contents of the named ref dialog // Until the list is loaded, its just a "Loading" placeholder CiteTB.setupNamedRefs = function() {   var names = [], i;   for( i=0; i<CiteTB.mainRefList.length; i++) {     if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname) {       names.push(CiteTB.mainRefList[i]);     }   }   var stuff = $('<div>');   $('#citetoolbar-namedrefs').html( stuff );   if (names.length === 0) {     stuff.html(mw.usability.getMsg('cite-no-namedrefs'));   } else {     stuff.html(mw.usability.getMsg('cite-namedrefs-intro'));     var select = $('<select id="cite-namedref-select">');     select.append($('').text(mw.usability.getMsg('cite-named-refs-dropdown')));     for(i=0; i<names.length; i++) {       select.append($('').text(names[i].refname));     }     stuff.after(select);     select.before('');           var prevlabel = $('').html(mw.usability.getMsg('cite-raw-preview'));     select.after(prevlabel);     prevlabel.before("");     prevlabel.after('');     var parselabel = $('').html(mw.usability.getMsg('cite-parsed-label'));     $('#cite-namedref-preview').after(parselabel);     parselabel.after('');     var link = $('');     link.html(mw.usability.getMsg('cite-form-parse'));     $('#cite-namedref-parsed').after(link);          $("#cite-namedref-select").on( 'change', CiteTB.namedRefSelectClick);     $('#cite-nref-parse').on( 'click', CiteTB.nrefParseClick);   }       };  // Function to get the errorcheck form HTML CiteTB.setupErrorCheck = function() {   var form = $('').html(mw.usability.getMsg('cite-errorcheck-heading'));   var ul = $("");   var test;   for (var t in CiteTB.ErrorChecks) {     test = CiteTB.ErrorChecks[t];     ul.append(test.getRow());   }   form.append(ul);   $('#citetoolbar-errorcheck').html(form); };  // Callback function for parsed preview CiteTB.fillNrefPreview = function(parsed) {   $('#cite-parsed-label').show();   $('#cite-namedref-parsed').html(parsed); };  // Click handler for the named-ref parsed preview CiteTB.nrefParseClick = function() {   var choice = $("#cite-namedref-select").val();   if (choice === ) {     $('#cite-parsed-label').hide();     $('#cite-namedref-parsed').text();     return false;   }   $('#cite-nref-parse').hide();   for( var i=0; i<CiteTB.mainRefList.length; i++) {     if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) {       CiteTB.parse(CiteTB.mainRefList[i].content, CiteTB.fillNrefPreview);       return false;     }   }   };  // Click handler for the named-ref dropdown CiteTB.lastnamedrefchoice = ; CiteTB.namedRefSelectClick = function() {   var choice = $("#cite-namedref-select").val();   if (CiteTB.lastnamedrefchoice == choice) {     return;   }   CiteTB.lastnamedrefchoice = choice;   $('#cite-parsed-label').hide();   $('#cite-namedref-parsed').text();   if (choice === ) {     $('#cite-nref-preview-label').hide();     $('#cite-namedref-preview').text();     $('#cite-nref-parse').hide();     return;   }   for( var i=0; i<CiteTB.mainRefList.length; i++) {     if (!CiteTB.mainRefList[i].shorttag && CiteTB.mainRefList[i].refname == choice) {       $('#cite-nref-preview-label').show();       $('#cite-namedref-preview').text(CiteTB.mainRefList[i].content);       if (CiteTB.getOption('autoparse')) {         CiteTB.nrefParseClick();       } else {         $('#cite-nref-parse').show();       }     }   } };  // callback function for parsed preview CiteTB.fillTemplatePreview = function(text) {   var template = CiteTB.getOpenTemplate();   var div = $("#citetoolbar-"+CiteTB.escStr(template.shortform));   div.find('.cite-prev-parsed-label').show();   div.find('.cite-preview-parsed').html(text); };  // Click handler for template parsed preview CiteTB.prevParseClick = function() {   var ref = CiteTB.getRef(true, false);   var template = CiteTB.getOpenTemplate();   var div = $("#citetoolbar-"+CiteTB.escStr(template.shortform));   div.find('.cite-prev-parse').hide();   CiteTB.parse(ref, CiteTB.fillTemplatePreview); };  // Show/hide the extra fields in the dialog box CiteTB.showHideExtra = function() {   var template = CiteTB.getOpenTemplate();   var div = $("#citetoolbar-"+CiteTB.escStr(template.shortform));   var setting = div.find(".cite-form-status").val();   if ( setting === 'closed' ) {     div.find(".cite-form-status").val('open');     div.find('.cite-extra-fields').show(1, function() {       // jQuery adds "display:block", which screws things up       div.find('.cite-extra-fields').attr('style', 'width:100%; background-color:transparent;');      });   } else {     div.find(".cite-form-status").val('closed');     div.find('.cite-extra-fields').hide();   }  };  // Resets form fields and previews // Resets form fields and previews CiteTB.resetForm = function() {   var template = CiteTB.getOpenTemplate();   var div = $("#citetoolbar-"+CiteTB.escStr(template.shortform));   div.html(template.getForm()); };  // STRING UTILITY FUNCTIONS // Returns a string quoted as necessary for name/group attributes CiteTB.getQuotedString = function(s) {   var sq = /\'/.test(s); // single quotes   var dq = /\"/.test(s); // double quotes   if (!sq && !dq) { // Always quotes for non-latin alphabet     return '"'+s+'"';   } else if (!dq) { // Can use double quotes     return '"'+s+'"';   } else if (!sq) { // Can use single quotes     return "'"+s+"'";   } else { // Has double and single quotes     s = s.replace(/\"/g, '\);     return '"'+s+'"';   } };  // Fix up strings for output - capitalize first char, replace underscores with spaces CiteTB.fixStr = function(s) {   s = s.slice(0,1).toUpperCase() + s.slice(1);   s = s.replace('_',' ');   return s; };  // Escape spaces and quotes for use in HTML classes/ids CiteTB.escStr = function(s) {   return s.replace(' ', '-').replace("'", "\'").replace('"', '\"'); };  // MISC FUNCTIONS // Determine which template form is open, and get the template object for it CiteTB.getOpenTemplate = function() {   var dialogs = $(".ui-dialog-content.ui-widget-content:visible");   var templatename = $(dialogs[0]).find(".cite-template").val();   return CiteTB.Templates[templatename]; };  // Display the report for the error checks CiteTB.displayErrors = function(errors) {   $('#cite-err-report').remove();   var table = $('');   $('#editpage-copywarn').before(table);   var tr;   var tr1 = $('');   var th1 = $('').html(mw.usability.getMsg('cite-err-report-heading'));   var th2 = $('');   var im = $('').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/5/55/Gtk-stop.svg/20px-Gtk-stop.svg.png');   im.attr('alt', mw.usability.getMsg('cite-err-report-close')).attr('title', mw.usability.getMsg('cite-err-report-close'));   var ad = $('').attr('href', '#');   ad.append(im);   th2.append(ad);   tr1.append(th1).append(th2);   table.append(tr1);   $('#cite-err-check-close').on('click', function() {  $('#cite-err-report').remove(); });   if (errors.length === 0) {     tr = $('');     var td = $('').html(mw.usability.getMsg('cite-err-report-empty'));     tr.append(td);     table.append(tr);          return;   }   for(var e in errors) {     var err = errors[e];     tr = $('');     var td1 = $('').html(err.err);     var td2 = $('').html(mw.usability.getMsg(err.msg));     tr.append(td1).append(td2);     table.append(tr);   } };     } // End of code loaded only on edit