Misplaced Pages

MediaWiki:Gadget-refToolbarBase.js: Difference between revisions

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
Browse history interactively← Previous editContent deleted Content added
Revision as of 02:28, 18 February 2011 view sourceKaldari (talk | contribs)Autopatrolled, Extended confirmed users, File movers, Pending changes reviewers, Rollbackers68,434 editsm moved MediaWiki:RefToolbarBase.js to MediaWiki:RefToolbar/base.js← Previous edit Latest revision as of 04:06, 1 November 2015 view source Mr.Z-man (talk | contribs)Extended confirmed users28,435 edits fix for issue reported on talk page 
(11 intermediate revisions by 5 users not shown)
Line 1: Line 1:
/* jshint asi: true */
// Global object
/* global mw, $, CiteTB, citeTemplate, citeErrorCheck */
if (typeof CiteTB == 'undefined') {

var CiteTB = {
if ( window.CiteTB === undefined ) {
window.CiteTB = {
"Templates" : {}, // All templates "Templates" : {}, // All templates
"Options" : {}, // Global options "Options" : {}, // Global options
Line 17: Line 19:


// Object for cite templates // Object for cite templates
function citeTemplate(templatename, shortform, basicfields, expandedfields) { window.citeTemplate = function (templatename, shortform, basicfields, expandedfields) {
// Properties // Properties
this.templatename = templatename; // The template name - "cite web", "cite book", etc. this.templatename = templatename; // The template name - "cite web", "cite book", etc.
Line 24: Line 26:
// Less common - quote, archiveurl - should be everything the template supports minus the basic ones // Less common - quote, archiveurl - should be everything the template supports minus the basic ones
this.extra = expandedfields; this.extra = expandedfields;

this.incrementables = {};


// Add it to the list // Add it to the list
CiteTB.Templates = this; CiteTB.Templates = this;
// Methods // Methods
this.makeFormInner = function(fields) { this.makeFormInner = function(fields, incrsetup) {
var i=0; var i=0;
var trs = new Array(); var trs = ;
var autofills =
for (i=0; i<fields.length; i++) { for (i=0; i<fields.length; i++) {
var fieldobj = fields; var fieldobj = fields;
var field = fieldobj.field; var field = labelfield = fieldobj.field;
var ad = false; var ad = false;
if (incrsetup && fieldobj.increment_group) {
if ($j.inArray(field, CiteTB.getOption('autodate fields')) != -1 ) {
field = fieldobj.field.replace('<N>', '1');
im = $j('<img />').attr('src', 'http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Nuvola_apps_date.svg/20px-Nuvola_apps_date.svg.png');
labelfield = fieldobj.field.replace('<N>', '');
if (this.incrementables && !this.incrementables.setup) {
// The object has been created, but not fully initialized
this.incrementables.push(fieldobj)
} else if (!this.incrementables) {
// Object not yet created
this.incrementables = {
'fields': ,
'val':1,
'setup': false
};
} else if (this.incrementables && this.incrementables.setup) {
// Fully initialized from a previous invocation of this function, just resetting the number
this.incrementables.val = 1
}
} else if (fieldobj.increment_group) {
// Adding a new row
incrval = this.incrementables.val;
field = fieldobj.field.replace('<N>', incrval.toString());
labelfield = fieldobj.field.replace('<N>', '');
}
if ($.inArray(field, CiteTB.getOption('autodate fields')) != -1 ) {
im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Nuvola_apps_date.svg/20px-Nuvola_apps_date.svg.png');
im.attr('alt', mw.usability.getMsg('cite-insert-date')).attr('title', mw.usability.getMsg('cite-insert-date')); im.attr('alt', mw.usability.getMsg('cite-insert-date')).attr('title', mw.usability.getMsg('cite-insert-date'));
var ad = $j('<a />').attr('href', '#'); var ad = $('<a />').attr('href', '#');
ad.append(im); ad.append(im);
ad.attr('id', 'cite-date-'+CiteTB.escStr(this.shortform)+'-'+field); ad.attr('id', 'cite-date-'+CiteTB.escStr(this.shortform)+'-'+field);
$j('#cite-date-'+CiteTB.escStr(this.shortform)+'-'+field).live('click', CiteTB.fillAccessdate); $( document ).on( 'click', '#cite-date-'+CiteTB.escStr(this.shortform)+'-'+field, CiteTB.fillAccessdate );
} }
if (fieldobj.autofillid) { if (fieldobj.autofillid) {
var autotype = fieldobj.autofillid; var autotype = fieldobj.autofillid;
im = $j('<img />').attr('src', 'http://upload.wikimedia.org/wikipedia/commons/thumb/1/17/System-search.svg/20px-System-search.svg.png'); im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/1/17/System-search.svg/20px-System-search.svg.png');
im.attr('alt', mw.usability.getMsg('cite-autofill-alt')).attr('title', mw.usability.getMsg('cite-autofill-alt')); im.attr('alt', mw.usability.getMsg('cite-autofill-alt')).attr('title', mw.usability.getMsg('cite-autofill-alt'));
var ad = $j('<a />').attr('href', '#'); var ad = $('<a />').attr('href', '#');
ad.append(im); ad.append(im);
ad.attr('id', 'cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype); ad.attr('id', 'cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype);
$j('#cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype).live('click', CiteTB.initAutofill); autofills.push('#cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype);
}
if (fieldobj.increment_button) {
var incrtype = fieldobj.increment_group;
im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Nuvola_action_edit_add.svg/20px-Nuvola_action_edit_add.svg.png');
im.attr('alt', mw.usability.getMsg('cite-increment-alt')).attr('title', mw.usability.getMsg('cite-increment-alt'));
var ad = $('<a />').attr('href', '#');
ad.append(im);
ad.attr('id', 'cite-incr-'+CiteTB.escStr(this.shortform)+'-'+incrtype);
} }
var display = mw.usability.getMsg('cite-'+field+'-label'); var display = mw.usability.getMsg('cite-'+labelfield+'-label');
if (typeof display !== 'string') {
var tooltip = fieldobj.tooltip ? $j('<abbr />').attr('title', mw.usability.getMsg(fieldobj.tooltip)).text('*') : false;
if (fieldobj.label) {
display = CiteTB.fixStr(fieldobj.label);
} else {
display = CiteTB.fixStr(labelfield)
}
}
var tooltip = fieldobj.tooltip ? $('<abbr />').attr('title', mw.usability.getMsg(fieldobj.tooltip)).html('<sup>?</sup>') : false;
var input = ''; var input = '';
if (ad) { if (ad) {
input = $j('<input tabindex="1" style="width:85%" type="text" />'); input = $('<input tabindex="1" style="width:85%" type="text" />');
} else { } else {
input = $j('<input tabindex="1" style="width:100%" type="text" />'); input = $('<input tabindex="1" style="width:100%" type="text" />');
} }
input.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field); input.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field);
if (fieldobj.autofillprop) { if (fieldobj.autofillprop) {
input.addClass('cite-'+CiteTB.escStr(this.shortform)+'-'+fieldobj.autofillprop); classname = 'cite-'+CiteTB.escStr(this.shortform)+'-'+fieldobj.autofillprop
if (fieldobj.increment_group) {
input.addClass('cite-'+CiteTB.escStr(this.shortform)+'-incr-'+fieldobj.increment_group);
classname+='-'+this.incrementables.val.toString();
}
input.addClass(classname);
} }
var label = $j('<label />'); var label = $('<label />');
label.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field).text(display); label.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field).text(display);
if (tooltip) { if (tooltip) {
Line 76: Line 125:
style += ' padding-left:1em;'; style += ' padding-left:1em;';
} else { } else {
var tr = $j('<tr />'); var tr = $('<tr />');
} }
var td1 = $j('<td class="cite-form-td" />').attr('style', style); var td1 = $('<td class="cite-form-td" />').attr('style', style);
td1.append(label); td1.append(label);
tr.append(td1); tr.append(td1);
var td2 = $j('<td class="cite-form-td" style="width:30%" />'); var td2 = $('<td class="cite-form-td" style="width:30%" />');
td2.append(input); td2.append(input);
if (ad) { if (ad) {
Line 90: Line 139:
trs.push(tr); trs.push(tr);
} }
}
var needsetup = false;
for (g in this.incrementables) {
if (!this.incrementables.setup) {
needsetup = true;
$( document ).on( 'click', '#cite-incr-'+CiteTB.escStr(this.shortform)+'-'+g, CiteTB.incrementFields );
this.incrementables.setup = true;
}
}
if (needsetup || $.isEmptyObject(this.incrementables)) {
for(i=0; i<autofills.length; i++) {
$( document ).on( 'click', autofills, CiteTB.initAutofill );
}
} }
return trs; return trs;
Line 97: Line 159:
// gives a little bit of HTML so the open form can be identified // gives a little bit of HTML so the open form can be identified
this.getInitial = function() { this.getInitial = function() {
var hidden = $j('<input type="hidden" class="cite-template" />'); var hidden = '<input type="hidden" class="cite-template" value="' + this.templatename + '"/>';
hidden.val(this.templatename);
return hidden; return hidden;
} }
Line 104: Line 165:
// makes the form used in the dialog boxes // makes the form used in the dialog boxes
this.getForm = function() { this.getForm = function() {
var main = $j("<div class='cite-form-container' />"); var main = $("<div class='cite-form-container' />");
var form1 = $j('<table style="width:100%; background-color:transparent;" class="cite-basic-fields" />'); var form1 = $('<table style="width:100%; background-color:transparent;" class="cite-basic-fields" />');
var i=0; var i=0;
var trs = this.makeFormInner(this.basic); var trs = this.makeFormInner(this.basic, true);
for (var i=0; i<trs.length; i++) { for (var i=0; i<trs.length; i++) {
form1.append(trs); form1.append(trs);
} }
var form2 = $j('<table style="width:100%; background-color:transparent; display:none" class="cite-extra-fields">'); var form2 = $('<table style="width:100%; background-color:transparent; display:none" class="cite-extra-fields">');
trs = this.makeFormInner(this.extra); trs = this.makeFormInner(this.extra, true);
for (var i=0; i<trs.length; i++) { for (var i=0; i<trs.length; i++) {
form2.append(trs); form2.append(trs);
Line 119: Line 180:
main.append(form1).append(form2); main.append(form1).append(form2);
var form3 = $j('<table style="width:100%; background-color:transparent;padding-top:1em" class="cite-other-fields">'); var form3 = $('<table style="width:100%; background-color:transparent;padding-top:1em" class="cite-other-fields">');
var tr = $j('<tr />'); var tr = $('<tr />');
var td1 = $j('<td class="cite-form-td" style="text-align:right; width:20%" />'); var td1 = $('<td class="cite-form-td" style="text-align:right; width:20%" />');
var label1 = $j('<label />'); var label1 = $('<label />');
label1.attr('for', "cite-"+CiteTB.escStr(this.shortform)+'-name').text(mw.usability.getMsg('cite-name-label')); label1.attr('for', "cite-"+CiteTB.escStr(this.shortform)+'-name').text(mw.usability.getMsg('cite-name-label'));
td1.append(label1); td1.append(label1);
var td2 = $j('<td class="cite-form-td" style="width:30%" />'); var td2 = $('<td class="cite-form-td" style="width:30%" />');
var input1 = $j('<input tabindex="1" style="width:100%" type="text" />'); var input1 = $('<input tabindex="1" style="width:100%" type="text" />');
input1.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-name'); input1.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-name');
td2.append(input1); td2.append(input1);
var td3 = $j('<td class="cite-form-td" style="text-align:right; padding-left:1em; width:20%">'); var td3 = $('<td class="cite-form-td" style="text-align:right; padding-left:1em; width:20%">');
var label2 = $j('<label />'); var label2 = $('<label />');
label2.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-group').text(mw.usability.getMsg('cite-group-label')); label2.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-group').text(mw.usability.getMsg('cite-group-label'));
td3.append(label2); td3.append(label2);
var td4 = $j('<td class="cite-form-td" style="width:30%" />'); var td4 = $('<td class="cite-form-td" style="width:30%" />');
var input2 = $j('<input tabindex="1" style="width:100%" type="text" />'); var input2 = $('<input tabindex="1" style="width:100%" type="text" />');
input2.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-group'); input2.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-group');
td4.append(input2); td4.append(input2);
Line 140: Line 201:
form3.append(tr); form3.append(tr);
main.append(form3); main.append(form3);
var extras = $j('<div />'); var extras = $('<div />');
extras.append('<input type="hidden" class="cite-form-status" value="closed" />'); extras.append('<input type="hidden" class="cite-form-status" value="closed" />');
var hidden = $j('<input type="hidden" class="cite-template" />'); var hidden = $('<input type="hidden" class="cite-template" />');
hidden.val(this.templatename); hidden.val(this.templatename);
extras.append(hidden); extras.append(hidden);
var span1 = $j('<span class="cite-preview-label" style="display:none;" />'); var span1 = $('<span class="cite-preview-label" style="display:none;" />');
span1.text(mw.usability.getMsg('cite-raw-preview')); span1.text(mw.usability.getMsg('cite-raw-preview'));
extras.append(span1).append('<div class="cite-ref-preview" style="padding:0.5em; font-size:110%" />'); extras.append(span1).append('<div class="cite-ref-preview" style="padding:0.5em; font-size:110%" />');
var span2 = $j('<span class="cite-prev-parsed-label" style="display:none;" />'); var span2 = $('<span class="cite-prev-parsed-label" style="display:none;" />');
span2.text(mw.usability.getMsg('cite-parsed-label')); span2.text(mw.usability.getMsg('cite-parsed-label'));
extras.append(span2).append('<div class="cite-preview-parsed" style="padding-bottom:0.5em; font-size:110%" />'); extras.append(span2).append('<div class="cite-preview-parsed" style="padding-bottom:0.5em; font-size:110%" />');
var link = $j('<a href="#" class="cite-prev-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />'); var link = $('<a href="#" class="cite-prev-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />');
link.text(mw.usability.getMsg('cite-form-parse')); link.text(mw.usability.getMsg('cite-form-parse'));
extras.append(link); extras.append(link);
Line 176: Line 237:
*/ */


function citeErrorCheck(obj) { window.citeErrorCheck = function (obj) {
this.obj = obj this.obj = obj
CiteTB.ErrorChecks = this; CiteTB.ErrorChecks = this;
Line 207: Line 268:
this.getRow = function() { this.getRow = function() {
var row = $j("<li />"); var row = $("<li />");
var check = $j("<input type='checkbox' name='cite-err-test' />"); var check = $("<input type='checkbox' name='cite-err-test' />");
check.attr('value', this.obj.testname); check.attr('value', this.obj.testname);
var label = $j("<label />").html(mw.usability.getMsg(this.obj.desc)); var label = $("<label />").html(mw.usability.getMsg(this.obj.desc));
label.attr('for', this.obj.testname); label.attr('for', this.obj.testname);
row.append(check).append(' &ndash; ').append(label); row.append(check).append(' &ndash; ').append(label);
Line 216: Line 277:
} }
} }
$j('head').trigger('reftoolbarbase'); $('head').trigger('reftoolbarbase');

Latest revision as of 04:06, 1 November 2015

/* jshint asi: true */
/* global mw, $, CiteTB, citeTemplate, citeErrorCheck */

if ( window.CiteTB === undefined ) {
  window.CiteTB = {
    "Templates" : {}, // All templates
    "Options" : {}, // Global options
    "UserOptions" : {}, // User options
    "DefaultOptions" : {}, // Script defaults
    "ErrorChecks" : {} // Error check functions
  };
}

if (typeof mw.usability == 'undefined') {
  mw.usability = {};
  mw.usability.getMsg = function(m) { return mw.messages.get(m); }
  mw.usability.addMessages = function(msgs) { mw.messages.set(msgs); };
}

// Object for cite templates
window.citeTemplate = function (templatename, shortform, basicfields, expandedfields) {
  // Properties
  this.templatename = templatename; // The template name - "cite web", "cite book", etc.
  this.shortform = shortform; // A short form, used for the dropdown box
  this.basic = basicfields; // Basic fields - author, title, publisher...
  // Less common - quote, archiveurl - should be everything the template supports minus the basic ones
  this.extra = expandedfields;

  this.incrementables = {};

  // Add it to the list
  CiteTB.Templates = this;
  // Methods
  this.makeFormInner = function(fields, incrsetup) {
    var i=0;
    var trs = ;
    var autofills = 
    for (i=0; i<fields.length; i++) {
      var fieldobj = fields;
      var field = labelfield = fieldobj.field;
      var ad = false;
      if (incrsetup && fieldobj.increment_group) {
      		field = fieldobj.field.replace('<N>', '1');
      		labelfield = fieldobj.field.replace('<N>', '');
      		if (this.incrementables && !this.incrementables.setup) {
      			// The object has been created, but not fully initialized
      			this.incrementables.push(fieldobj)
      		} else if (!this.incrementables) {
      			// Object not yet created
      			this.incrementables = {
      				'fields': ,
      				'val':1,
      				'setup': false
      			};
      		} else if (this.incrementables && this.incrementables.setup) {
      			// Fully initialized from a previous invocation of this function, just resetting the number
      			this.incrementables.val = 1
      		}
      } else if (fieldobj.increment_group) {
      	// Adding a new row
      	incrval = this.incrementables.val;
      	field = fieldobj.field.replace('<N>', incrval.toString());
      	labelfield = fieldobj.field.replace('<N>', '');
      }
      if ($.inArray(field, CiteTB.getOption('autodate fields')) != -1 ) {
        im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Nuvola_apps_date.svg/20px-Nuvola_apps_date.svg.png');
        im.attr('alt', mw.usability.getMsg('cite-insert-date')).attr('title', mw.usability.getMsg('cite-insert-date'));
        var ad = $('<a />').attr('href', '#');
        ad.append(im);
        ad.attr('id', 'cite-date-'+CiteTB.escStr(this.shortform)+'-'+field);
        $( document ).on( 'click', '#cite-date-'+CiteTB.escStr(this.shortform)+'-'+field, CiteTB.fillAccessdate );
      }
	  
      if (fieldobj.autofillid) {
        var autotype = fieldobj.autofillid;
        im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/1/17/System-search.svg/20px-System-search.svg.png');
        im.attr('alt', mw.usability.getMsg('cite-autofill-alt')).attr('title', mw.usability.getMsg('cite-autofill-alt'));
        var ad = $('<a />').attr('href', '#');
        ad.append(im);
        ad.attr('id', 'cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype);
        autofills.push('#cite-auto-'+CiteTB.escStr(this.shortform)+'-'+field+'-'+autotype);
      }
      
      if (fieldobj.increment_button) {
        var incrtype = fieldobj.increment_group;
        im = $('<img />').attr('src', '//upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Nuvola_action_edit_add.svg/20px-Nuvola_action_edit_add.svg.png');
        im.attr('alt', mw.usability.getMsg('cite-increment-alt')).attr('title', mw.usability.getMsg('cite-increment-alt'));
        var ad = $('<a />').attr('href', '#');
        ad.append(im);
        ad.attr('id', 'cite-incr-'+CiteTB.escStr(this.shortform)+'-'+incrtype);
      }
	  
      var display = mw.usability.getMsg('cite-'+labelfield+'-label');
      if (typeof display !== 'string') {
      	if (fieldobj.label) {
      		display = CiteTB.fixStr(fieldobj.label);
      	} else {
      		display = CiteTB.fixStr(labelfield)
      	}
      }
      var tooltip = fieldobj.tooltip ? $('<abbr />').attr('title', mw.usability.getMsg(fieldobj.tooltip)).html('<sup>?</sup>') : false;
      
      var input = '';
      if (ad) {
        input = $('<input tabindex="1" style="width:85%" type="text" />');
      } else {
        input = $('<input tabindex="1" style="width:100%" type="text" />');
      }
      input.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field);
	  if (fieldobj.autofillprop) {
	  	classname = 'cite-'+CiteTB.escStr(this.shortform)+'-'+fieldobj.autofillprop
	    if (fieldobj.increment_group) {
	    	input.addClass('cite-'+CiteTB.escStr(this.shortform)+'-incr-'+fieldobj.increment_group);
	    	classname+='-'+this.incrementables.val.toString();
	    }
	    input.addClass(classname);
	  }
      var label = $('<label />');
      label.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-'+field).text(display);
      if (tooltip) {
        label.append(tooltip);
      }
      var style = 'text-align:right; width:20%;';
      if (i%2 == 1) {
        style += ' padding-left:1em;';
      } else {
        var tr = $('<tr />');
      }
      var td1 = $('<td class="cite-form-td" />').attr('style', style);
      td1.append(label);
      tr.append(td1);
      var td2 = $('<td class="cite-form-td" style="width:30%" />');
      td2.append(input);
      if (ad) {
        td2.append(ad);
      }
      tr.append(td2);
      if (i%2 == 0) {
        trs.push(tr);
      }
    }
    var needsetup = false;
    for (g in this.incrementables) {
    	if (!this.incrementables.setup) {
    		needsetup = true;
    		$( document ).on( 'click', '#cite-incr-'+CiteTB.escStr(this.shortform)+'-'+g, CiteTB.incrementFields );
        	this.incrementables.setup = true;
    	}
    }
    if (needsetup || $.isEmptyObject(this.incrementables)) {
    	for(i=0; i<autofills.length; i++) {
    		$( document ).on( 'click', autofills, CiteTB.initAutofill );
    	}	
    }
    return trs;
  
  }
  
  // gives a little bit of HTML so the open form can be identified
  this.getInitial = function() {
    var hidden = '<input type="hidden" class="cite-template" value="' + this.templatename + '"/>';
    return hidden;
  }
  
  // makes the form used in the dialog boxes
  this.getForm = function() {
    var main = $("<div class='cite-form-container' />");
    var form1 = $('<table style="width:100%; background-color:transparent;" class="cite-basic-fields" />');
    var i=0;
    var trs = this.makeFormInner(this.basic, true);
    for (var i=0; i<trs.length; i++) {
      form1.append(trs);
    }
    
    var form2 = $('<table style="width:100%; background-color:transparent; display:none" class="cite-extra-fields">');
    trs = this.makeFormInner(this.extra, true);
    for (var i=0; i<trs.length; i++) {
      form2.append(trs);
    }    
    main.append(form1).append(form2);
    
    var form3 = $('<table style="width:100%; background-color:transparent;padding-top:1em" class="cite-other-fields">');
    var tr = $('<tr />');
    var td1 = $('<td class="cite-form-td" style="text-align:right; width:20%" />');
    var label1 = $('<label />');
    label1.attr('for', "cite-"+CiteTB.escStr(this.shortform)+'-name').text(mw.usability.getMsg('cite-name-label'));
    td1.append(label1);
    var td2 = $('<td class="cite-form-td" style="width:30%" />');
    var input1 = $('<input tabindex="1" style="width:100%" type="text" />');
    input1.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-name');
    td2.append(input1);
    var td3 = $('<td class="cite-form-td" style="text-align:right; padding-left:1em; width:20%">');
    var label2 = $('<label />');
    label2.attr('for', 'cite-'+CiteTB.escStr(this.shortform)+'-group').text(mw.usability.getMsg('cite-group-label'));
    td3.append(label2);
    var td4 = $('<td class="cite-form-td" style="width:30%" />');
    var input2 = $('<input tabindex="1" style="width:100%" type="text" />');
    input2.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-group');
    td4.append(input2);
    tr.append(td1).append(td2).append(td3).append(td4);
    form3.append(tr);
    main.append(form3);
    var extras = $('<div />');
    extras.append('<input type="hidden" class="cite-form-status" value="closed" />');
    var hidden = $('<input type="hidden" class="cite-template" />');
    hidden.val(this.templatename);
    extras.append(hidden);
    var span1 = $('<span class="cite-preview-label" style="display:none;" />');
    span1.text(mw.usability.getMsg('cite-raw-preview'));
    extras.append(span1).append('<div class="cite-ref-preview" style="padding:0.5em; font-size:110%" />');
    var span2 = $('<span class="cite-prev-parsed-label" style="display:none;" />');
    span2.text(mw.usability.getMsg('cite-parsed-label'));
    extras.append(span2).append('<div class="cite-preview-parsed" style="padding-bottom:0.5em; font-size:110%" />');
    var link = $('<a href="#" class="cite-prev-parse" style="margin:0 1em 0 1em; display:none; color:darkblue" />');
    link.text(mw.usability.getMsg('cite-form-parse'));
    extras.append(link);    
    main.append(extras);
    
    return main;
  }
}

/* Class for error checks
    FIXME: DOCS OUT OF DATE
   type - type of error check - current options:
    * 'refcheck' - apply a function on each ref individually
      * function should accept a ref object, return a string
    * 'reflist' - apply a function on the entire ref list
      * function should accept an array of ref objects, return an array of strings
    * 'search' - apply a function ro the page text
      * function should accept the page text as a string, return an array of strings
   The strings returned by the function should be valid HTML
   
   func - The function described above
   testname - Name of the error check, must not contain spaces
   desc - A short description of the test
*/

window.citeErrorCheck = function (obj) {
  this.obj = obj
  CiteTB.ErrorChecks = this;
  
  this.run = function() {
    var errors = ;
    switch(this.obj) {
      case "refcheck":
        CiteTB.loadRefs();
        for(var i=0; i<CiteTB.mainRefList.length; i++) {
          var e = this.obj.func(CiteTB.mainRefList);
          if (e) {
            errors.push(e);
          }
        }
        break;
      case "reflist":
        CiteTB.loadRefs();
        errors = this.obj.func(CiteTB.mainRefList);
        break;
      case "search":
        var func = this.obj.func
        CiteTB.getPageText(function(text) {
          errors = func(text);
        });
        break;
    }
    return errors;
  }
  
  this.getRow = function() {
    var row = $("<li />");
    var check = $("<input type='checkbox' name='cite-err-test' />");
    check.attr('value', this.obj.testname);
    var label = $("<label />").html(mw.usability.getMsg(this.obj.desc));
    label.attr('for', this.obj.testname); 
    row.append(check).append(' &ndash; ').append(label);
    return row;
  }
}
$('head').trigger('reftoolbarbase');