# மீடியாவிக்கி:Gadget-refToolbarBase.js

/* 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.templatename] = this;  
// Methods  
this.makeFormInner = function(fields, incrsetup) {  
var i=0;  
var trs = [];  
var autofills = []  
for (i=0; i<fields.length; i++) {  
var fieldobj = fields[i];  
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[fieldobj.increment_group] && !this.incrementables[fieldobj.increment_group].setup) {  
// The object has been created, but not fully initialized  
this.incrementables[fieldobj.increment_group]['fields'].push(fieldobj)  
} else if (!this.incrementables[fieldobj.increment_group]) {  
// Object not yet created  
this.incrementables[fieldobj.increment_group] = {  
'fields': [fieldobj],  
'val':1,  
'setup': false  
};  
} else if (this.incrementables[fieldobj.increment_group] && this.incrementables[fieldobj.increment_group].setup) {  
// Fully initialized from a previous invocation of this function, just resetting the number  
this.incrementables[fieldobj.increment_group].val = 1  
}  
} else if (fieldobj.increment_group) {  
// Adding a new row  
incrval = this.incrementables[fieldobj.increment_group].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//7/7b/Nuvola_apps_date.svg/-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//1/17/System-search.svg/-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//b/b9/Nuvola_action_edit_add.svg/-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" type="text" />');  
} else {  
input = $('<input tabindex="1" 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[fieldobj.increment_group].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;  
if (i%2 == 1) {  
style += ' padding-:1em;';  
} else {  
var tr = $('<tr />');  
}  
var td1 = $('<td />').attr('style', style);  
td1.append(label);  
tr.append(td1);  
var td2 = $('<td />');  
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[g].setup) {  
needsetup = true;  
$( document ).on( 'click', '#cite-incr-'+CiteTB.escStr(this.shortform)+'-'+g, CiteTB.incrementFields );  
this.incrementables[g].setup = true;  
}  
}  
if (needsetup || $.isEmptyObject(this.incrementables)) {  
for(i=0; i<autofills.length; i++) {  
$( document ).on( 'click', autofills[i], 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" value="' + this.templatename + '"/>';  
return hidden;  
}  

// makes the form used in the dialog boxes  
this.getForm = function {  
var main = $("<div />");  
var form1 = $('<table />');  
var i=0;  
var trs = this.makeFormInner(this.basic, true);  
for (var i=0; i<trs.length; i++) {  
form1.append(trs[i]);  
}  

var form2 = $('<table>');  
trs = this.makeFormInner(this.extra, true);  
for (var i=0; i<trs.length; i++) {  
form2.append(trs[i]);  
}  
main.append(form1).append(form2);  

var form3 = $('<table>');  
var tr = $('<tr />');  
var td1 = $('<td />');  
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 />');  
var input1 = $('<input tabindex="1" type="text" />');  
input1.attr('id', 'cite-'+CiteTB.escStr(this.shortform)+'-name');  
td2.append(input1);  
var td3 = $('<td>');  
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 />');  
var input2 = $('<input tabindex="1" 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" value="closed" />');  
var hidden = $('<input type="hidden" />');  
hidden.val(this.templatename);  
extras.append(hidden);  
var span1 = $('<span />');  
span1.text(mw.usability.getMsg('cite-raw-preview'));  
extras.append(span1).append('<div />');  
var span2 = $('<span />');  
span2.text(mw.usability.getMsg('cite-parsed-label'));  
extras.append(span2).append('<div />');  
var link = $('<a href="#" />');  
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.obj.testname] = this;  

this.run = function {  
var errors = [];  
switch(this.obj['type']) {  
case "refcheck":  
CiteTB.loadRefs;  
for(var i=0; i<CiteTB.mainRefList.length; i++) {  
var e = this.obj.func(CiteTB.mainRefList[i]);  
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');