Jump to content

MediaWiki:RefToolbar.js and User:Novem Linguae/sandbox: Difference between pages

From Wikipedia, the free encyclopedia
(Difference between pages)
Content deleted Content added
This will correctly format dates with extra stuff after the iso bit (i.e. timestamps)
 
copy from https://phabricator.wikimedia.org/P49563
 
Line 76: Line 76:
dialogobj['cite-dialog-'+sform] = {
dialogobj['cite-dialog-'+sform] = {
resizeme: false,
resizeme: false,
titleMsg: 'cite-dialog-'+sform,
title: mw.message( 'cite-dialog-'+sform ).parse(),
id: 'citetoolbar-'+sform,
id: 'citetoolbar-'+sform,
init: function() {},
init: function() {},
Line 140: Line 140:
'cites': {
'cites': {
type: 'toolbar',
type: 'toolbar',
labelMsg: 'cite-section-label',
label: mw.msg( 'cite-section-label' ),
groups: {
groups: {
'template': {
'template': {
Line 146: Line 146:
'template': {
'template': {
type: 'select',
type: 'select',
labelMsg: 'cite-template-list',
label: mw.msg( 'cite-template-list' ),
list: temlist
list: temlist
}
}
Line 152: Line 152:
},
},
'namedrefs': {
'namedrefs': {
labelMsg: 'cite-named-refs-label',
label: mw.msg( 'cite-named-refs-label' ),
tools: {
tools: {
'nrefs': {
'nrefs': {
Line 163: Line 163:
section: 'cites',
section: 'cites',
group: 'namedrefs',
group: 'namedrefs',
labelMsg: 'cite-named-refs-button'
label: mw.msg( 'cite-named-refs-button' )
}
}
}
}
},
},
'errorcheck': {
'errorcheck': {
labelMsg: 'cite-errorcheck-label',
label: mw.msg( 'cite-errorcheck-label' ),
tools: {
tools: {
'echeck': {
'echeck': {
Line 179: Line 179:
section: 'cites',
section: 'cites',
group: 'errorcheck',
group: 'errorcheck',
labelMsg: 'cite-errorcheck-button'
label: mw.msg( 'cite-errorcheck-button' )
}
}
}
}
Line 190: Line 190:
var defaultdialogs = {
var defaultdialogs = {
'cite-toolbar-errorcheck': {
'cite-toolbar-errorcheck': {
titleMsg: 'cite-errorcheck-label',
title: mw.message( 'cite-errorcheck-label' ).parse(),
id: 'citetoolbar-errorcheck',
id: 'citetoolbar-errorcheck',
resizeme: false,
resizeme: false,
Line 219: Line 219:
},
},
'cite-toolbar-namedrefs': {
'cite-toolbar-namedrefs': {
titleMsg: 'cite-named-refs-title',
title: mw.message( 'cite-named-refs-title' ).parse(),
resizeme: false,
resizeme: false,
id: 'citetoolbar-namedrefs',
id: 'citetoolbar-namedrefs',

Revision as of 09:37, 14 July 2023

/*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
 };

}

// 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: '

'+
       '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />'+
' '+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: '

'+
       '<img src="//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />'+
' '+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: // English
     mw.loader.load('/w/index.php?title=MediaWiki:RefToolbarMessages-en.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 '[1]';  

};

// 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);
   // "en-US" isn't a valid value for the language parameter
   if (data.language && data.language !== 'en-US' && data.language !== 'en-GB') {
   	$('.'+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>', 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>', 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 = $('

');
 $('#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($('<option value="" />').text(mw.usability.getMsg('cite-named-refs-dropdown')));
   for(i=0; i<names.length; i++) {
     select.append($('<option />').text(names[i].refname));
   }
   stuff.after(select);
   select.before('
');
var prevlabel = $('