مدیاویکی:Gadget-easyPeerReview.js

از ویکی‌خبر، مرجع خبری آزاد

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
/*jslint browser: true, devel: true, undef: true, eqeqeq: true, newcap: true, immed: true, maxerr: 80 */
/*global skin, importScript, wgDBname, wgTitle, wgPageName, jsMsg, wgAction, wgNamespaceNumber, wgUserGroups, Bawolff, wgCurRevisionId, wgUserName, wgCanonicalNamespace, wgArticleId, _hasAttribute, wgFormattedNamespaces, window */
/*members AsyncQueue, EasyReview_comment, EasyReview_copyright, 
    EasyReview_copyright_comment, EasyReview_news, EasyReview_news_comment, 
    EasyReview_npov, EasyReview_npov_comment, EasyReview_revid, 
    EasyReview_sg, EasyReview_sg_comment, EasyReview_sources, 
    EasyReview_sources_comment, Request, action, add, comment, confirm, 
    content, createElement, delaySend, edit, exec, failReview, getAttribute, 
    getElementById, getElementsByName, getElementsByTagName, getPage, 
    indexOf, innerHTML, lastIndex, length, level, mwapi, next, page, 
    postReview, previousSibling, prop, redraw, replace, revid, review, 
    rvprop, section, selectChange, sight, src, start, style, submit, 
    substring, summary, titles, toString, value, visibility review_i18n,
    review_tab, review_tab_tooltip, isFail, name, message, doWeirdGoogleHack,
    newid, LazyVar, pass, fail, not_reviewed, form_comment, form_comment_overall,
    form_rev_numb, form_submit, form_copyright, form_copyright_page, form_news_page,
    form_news, form_sources_page, form_sources, form_npov, form_npov_page,
    form_sg, form_sg_page, unknownError, softEditError, pub_edit_summary,
    review_comment, review_header_pass, review_header_fail
*/
//So that this doesn't interfere with var names of anything else 
if (typeof Bawolff === "undefined") Bawolff = {};

Bawolff.jsMsg = function(arg) {
 if ( $( '#mw-js-notice2' ).length == 0 ) {
  $( '#siteNotice' ).after( $( '<div id="mw-js-notice2" ></div>' ) );
 }
 $( '#mw-js-notice2' ).empty();
 $( '#mw-js-notice2' ).html( arg );
}

if (!Bawolff.review_i18n) {
 //this has issue of not allowing partial translation.
 //These are treated as raw HTML. don't give yourself an XSS! (basically avoid >, <, and " unless its part of html)
 //Anything that ends in _page should be in url form (Aka [[project:ét b]] would be 'project:%C3%A9t_b' not 'project:ét b' )
 Bawolff.review_i18n = {
  review_tab: 'بازبینی',
  review_tab_tooltip: 'ابزار خودکار بازبینی جهت ویرایشگران',
  pass: 'موفق بود',
  pass_v: 'بله',
  fail: 'ناموفق بود',
  not_reviewed: 'بررسی نشد',
  not_reviewed_v: 'خیر',
  form_comment: 'توضیحات: ',
  form_comment_overall: 'توضیحات بازبین: ',
  form_rev_numb: 'بازبینی نسخه',
  form_submit: 'ثبت بازبینی',
  form_copyright: 'حق تکثیر',
  form_copyright_page: 'ویکی\u200cخبر:حق تکثیر',
  form_news_page: 'ویکی\u200cخبر:راهنمای محتوا',
  form_news: 'قابل انتشار',
  form_sources_page: 'ویکی\u200cخبر:شیوه ارجاع به منابع',
  form_sources: 'قابل اثبات',
  form_sg: 'سبک',
  form_sg_page: 'ویکی\u200cخبر:راهنمای سبک',
  form_npov_page: 'ویکی\u200cخبر:دیدگاه بی\u200cطرف',
  form_npov: 'بی\u200cطرفی',
  form_read_talk: 'من همه اطلاعات مهم در صفحه بحث را بررسی کردم! (<a href="' + mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace('$1', 'بحث:' + encodeURIComponent(mw.config.get('wgTitle').replace(/\s/g, '_'))) + '" target="_blank">باز کردن صفحه بحث در یک پنجره دیگر</a>)',
  read_talk: 'شما نمی\u200cتوانید این صفحه را بازبینی کنید مگر اینکه صفحهٔ بحث را خوانده و سپس در کادر اختصاصی تاییدش کنید.',
  tasksError: 'شما نمی\u200cتوانید الگوی مورد نظر را به این صفحه اضافه کنید طی خطای: "$1". هرچند الگوی بررسی\u200cشد به صفحهٔ بحث افزوده شد ولی شما کنترل کنید.',
  unknownError: 'ابزار بازبینی آسان مورد استثنائی را دریافت نکرد [به مدیران بگویید]: ',
  softEditError: "اتفاق ناگواری رخ داده (خطای قابل بازیافت، اما ما نمی\u200cتوانیم سر در بیاوریم که چگونه آن را بازیابی کنیم.)",
  errorNoPub: " نمی\u200cتوان الگوی \{\{انتشار\}\} به خبر افزود. طی خطا: '$1'. به باقی پروسه بازبینی ادامه داده می\u200cشود.",
  errorFetchFailureSuccess: "در پی پروسه بازبینی موفق، جهت جایگزینی الگوی مرور با الگوی انتشار، نمی\u200cتواند هیچ اطلاعاتی از سرور دریافت کرد.",
  errorFetchFailFail: "در پی پروسه بازبینی ناموفق، جهت جایگزینی الگوی مرور با الگوی وظایف، نمی\u200cتواند هیچ اطلاعاتی از سرور دریافت کرد.",
  ErrorEditConflictCancel: "عمل طی درگیری ویرایش لغو شد.",
  warningNoArticleID: 'خطا: نمی\u200cتوان نسخهٔ جدید منتشرشده از این خبر را دریافت کرد، شما باید عملیات بازبینی را به صورت دستی انجام دهید.',
  pub_edit_summary: "انتشار. (استفاده از [[ویکی\u200cخبر:ابزار بازبینی آسان|ابزار بازبینی آسان]])",
  review_comment:  "بوسیله ابزار بازبینی آسان ثبت شد", //comment in src.
  review_header_pass: "بازبینی نسخه $1 [موفق بود]",
  review_header_fail: "بازبینی نسخه $1 [ناموفق بود]",
  review_revid: 'نسخه', //argument name for revid in peer reviewed template 
  review_copyright: 'حق تکثیر',
  review_newsworthy: 'قابل انتشار',
  review_verifiable: 'قابل اثبات',
  review_npov: 'بی\u200cطرفی',
  review_style: 'سبک',
  review_reviewer: 'بازبین',
  review_comments_field: 'توضیحات',
  review_time: 'زمان',
  review_peer_reviewed: 'بازبینی\u200cشد', //peer review template name.
  tasks: 'وظایف', //ترجمه\u200cای برای صدا کردن {{tl|وظایف}}
  tasks_copyvio: 'حق تکثیر',
  tasks_news: 'خبرها',
  tasks_src: 'منابع',
  tasks_npov: 'بی\u200cطرفی',
  tasks_mos: 'سبک',
  tasks_rereview: 'مرور دوباره',
  publish: 'انتشار', //الگو انتشار.
  editSummary_sight: "انتشار خبر پس از بازبین موفق (با استفاده از [[ویکی\u200cخبر:ابزار بازبینی آسان|ابزار بازبینی آسان]]): ",
  editSummary_failReview: "بازبینی ناموفق. افزودن الگوی وظایف (با استفاده از [[ویکی\u200cخبر:ابزار بازبینی آسان|ابزار بازبینی آسان]]",
  editConflict: "*********[تعارض ویرایشی]********** \nدر حین بازبینی شما فردی خبر را ویرایش کرده است. آیا می\u200cخواهید این صفحه را مرور کنید (شامل آخرین تغییرات)؟",
  done: 'انجام شد.',
  success: '"$1" با موفقیت بازبینی شد. $2', //$1 = article name, $2= make lead box
  success_ml: 'این خبر را در صفحهٔ اصلی قرار دهید', //$1 = article name
  success_ml_url: mw.config.get('wgArticlePath').replace('$1', 'ویکی\u200cخبر:ایجاد خبر اصلی'),
  fail_review: '<b>انجام شد</b> «$1» بررسی شد (با پروسه بازبینی <b>ناموفق</b>)', //$1=article name.
  trigger_id: 'review', //look for this id in pages to mean that the article is ready for review.
  trigger_func: function () {}, //leave alone unless you know what you're doing. return true to signify this page is eligable to be reviewed.
  regex_sources: /(==(?:.*|)(?:منابع|منبع)(?:.*|)==)/m,
  prePubTransform: function (page) {
        //called before adding publish to article
        //page = page.replace(/\{\{[dD]ate\|[^}]*\}\}/, "\{\{تاریخ|\{\{subst:formatnum:\{\{subst:#time:Y}}|R}} \{\{subst:formatnum:\{\{subst:#time:j}}|R}} \{\{MONTHNAMEINENGLISH|\{\{subst:CURRENTMONTHNAME}}}}}}");
        page = page.replace(/\{\{(?:مرور فوری|مرورفوری)(?:\|[^}]*)?\}\}/g, "\{\{خبرفوری}}"); //rm {{tl|breaking review}} add breaking
        page = page.replace(/\{\{(?:مرور)(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //rm {{tl|مرور}}
        //page = page.replace(/\{\{[dD]evelop(?:ing)?(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //rm {{tl|develop}}
        return page;
  },
  stripReviewForFail: function (page, tasks_template) {
        //if review fails, remove review tag. add tasks
        page = page.replace(/\{\{(?:مرور)(?:\|[^}]*)?\}\}/, tasks_template); //replace {{tl|مرور}} with tasks
        page = page.replace(/\{\{(?:مرور)(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //if multiple review templates
        return page;
  }
 
 } 
}
 
Bawolff.review = function() {
//this is initilization function. called onload
//pre-req: already checked in main namespace, user is in group editor, and action is view
//check if {{tl|مرور}} is on page
    if (document.getElementById(Bawolff.review_i18n.trigger_id) || Bawolff.review_i18n.trigger_func()) {
		var ca_comments = $('#ca-comments');
		if(ca_comments.length == 0)
		{
			ca_comments = $('#ca-talk');
		}
		var ca_peerReview = $('<a/>');
		ca_peerReview.text(Bawolff.review_i18n.review_tab);
		ca_peerReview.attr('href','#');
		ca_peerReview.on('click',Bawolff.review.start);
		var ca_peerReview_span = $('<span/>');
		ca_peerReview_span.append(ca_peerReview);
		var ca_peerReview_li = $('<li/>');
		ca_peerReview_li.attr('title',Bawolff.review_i18n.review_tab_tooltip);
		ca_peerReview_li.attr('id','ca-peerReview');
		ca_peerReview_li.append(ca_peerReview_span);
		ca_peerReview_li.insertBefore(ca_comments);
    }
}
Bawolff.review.doWeirdGoogleHack = false; // FIXME: this is crap.


Bawolff.review.convert = function ( str ) {
if (str == 'pass') return Bawolff.review_i18n.pass_v;
if (str == 'n/a') return Bawolff.review_i18n.not_reviewed_v;
return str;
}
Bawolff.review.start = function () {
    if (mw.config.get('wgDBname') === 'fawikinews') {
        importScript('Mediawiki:mwapilib.js'); //needed when pressing submit
        importScript('Mediawiki:mwapilib2.js');
    } else {
        mw.loader.load('//fa.wikinews.org/w/index.php?title=Mediawiki:mwapilib.js&action=raw&ctype=text/javascript&scrver=2');
    }

    var talk = document.getElementById('ca-talk');
    var readTalk = '';
    if (talk && talk.className.indexOf('new') === -1) {
        readTalk = '<br/><input type="checkbox" id="read-talk-box"/> <label for="read-talk-box">' + Bawolff.review_i18n.form_read_talk + '</label>';
    }

    //This draws the dialog. called on click
    var container = document.createElement("div");
    container.innerHTML ='<form id="easyReviewForm" action="javascript:void 0" onsubmit="Bawolff.review.submit(); return false;"><table class="metadata plainlinks ambox ambox-notice EasyReview" id="EasyReview-mainAmbox" style="line-height: 1.2"><tr><td class="ambox-image"><a href="/wiki/File:Pictogram_voting_question-blue.svg" class="image" title="Pictogram_voting_question-blue.svg"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/9/90/Pictogram_voting_question-blue.svg/60px-Pictogram_voting_question-blue.svg.png" width="60" height="62" border="0" /></a></td><td>' + Bawolff.review_i18n.form_rev_numb + wgCurRevisionId + '<ul style="line-height:1.6;"><li><b><a href="/wiki/' + Bawolff.review_i18n.form_copyright_page + '" title="' + decodeURIComponent(Bawolff.review_i18n.form_copyright_page).replace(/_/g, ' ') + '">' + Bawolff.review_i18n.form_copyright + '</a>:</b> <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-copyright-image" width="10" height="10" border="0" /><select name="EasyReview-copyright" onchange="Bawolff.review.selectChange()"><option value="pass">' + Bawolff.review_i18n.pass + '</option><option value="fail" >' + Bawolff.review_i18n.fail + '</option><option value="n/a" selected="selected">' + Bawolff.review_i18n.not_reviewed + '</option></select> <label for="EasyReview-copyright-comment" style="visibility:hidden">' + Bawolff.review_i18n.form_comment + '</label><input id="EasyReview-copyright-comment" name="EasyReview-copyright-comment" type="text" length="30" style="visibility: hidden"/></li><li><b><a href="/wiki/' + Bawolff.review_i18n.form_news_page + '" title="' + decodeURIComponent(Bawolff.review_i18n.form_news_page).replace(/_/g, ' ') + '">' + Bawolff.review_i18n.form_news + '</a>:</b> <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-news-image" width="10" height="10" border="0" /><select name="EasyReview-news" onchange="Bawolff.review.selectChange()"><option value="pass">' + Bawolff.review_i18n.pass + '</option><option value="fail" >' + Bawolff.review_i18n.fail + '</option><option value="n/a" selected="selected">' + Bawolff.review_i18n.not_reviewed + '</option></select> <label for="EasyReview-news-comment" style="visibility:hidden">' + Bawolff.review_i18n.form_comment + '</label><input id="EasyReview-news-comment" name="EasyReview-news-comment" type="text" length="30" style="visibility: hidden"/></li><li><b><a href="/wiki/' + Bawolff.review_i18n.form_sources_page + '" title="' + decodeURIComponent(Bawolff.review_i18n.form_sources_page).replace(/_/g, ' ') + '">' + Bawolff.review_i18n.form_sources + '</a>:</b> <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-sources-image" width="10" height="10" border="0" /><select name="EasyReview-sources" onchange="Bawolff.review.selectChange()"><option value="pass">' + Bawolff.review_i18n.pass + '</option><option value="fail" >' + Bawolff.review_i18n.fail + '</option><option value="n/a" selected="selected">' + Bawolff.review_i18n.not_reviewed + '</option></select> <label for="EasyReview-sources-comment" style="visibility:hidden">' + Bawolff.review_i18n.form_comment + '</label><input id="EasyReview-sources-comment" name="EasyReview-sources-comment" type="text" length="30" style="visibility: hidden"/></li><li><b><a href="/wiki/' + Bawolff.review_i18n.form_npov_page + '" title="' + decodeURIComponent(Bawolff.review_i18n.form_npov_page).replace(/_/g, ' ') + '">' + Bawolff.review_i18n.form_npov + '</a>:</b> <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-npov-image" width="10" height="10" border="0" /><select name="EasyReview-npov" onchange="Bawolff.review.selectChange()"><option value="pass">' + Bawolff.review_i18n.pass + '</option><option value="fail" >' + Bawolff.review_i18n.fail + '</option><option value="n/a" selected="selected">' + Bawolff.review_i18n.not_reviewed + '</option></select> <label for="EasyReview-npov-comment" style="visibility:hidden">' + Bawolff.review_i18n.form_comment + '</label><input id="EasyReview-npov-comment" name="EasyReview-npov-comment" type="text" length="30" style="visibility: hidden"/></li><li><b><a href="/wiki/' + Bawolff.review_i18n.form_sg_page + '" title="' + decodeURIComponent(Bawolff.review_i18n.form_sg_page).replace(/_/g, ' ') + '">' + Bawolff.review_i18n.form_sg + '</a>:</b> <img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-sg-image" width="10" height="10" border="0" /><select name="EasyReview-sg" onchange="Bawolff.review.selectChange()"><option value="pass">' + Bawolff.review_i18n.pass + '</option><option value="fail" >' + Bawolff.review_i18n.fail + '</option><option value="n/a" selected="selected">' + Bawolff.review_i18n.not_reviewed + '</option></select> <label for="EasyReview-sg-comment" style="visibility:hidden">' + Bawolff.review_i18n.form_comment + '</label><input id="EasyReview-sg-comment" name="EasyReview-sg-comment" type="text" length="30" style="visibility: hidden"/></li></ul><p><b><label for="EasyReview-commentBox">' + Bawolff.review_i18n.form_comment + '</label></b> <textarea row="3" id="EasyReview-commentBox" name="EasyReview-commentBox"></textarea>' + readTalk + '</p><input type="submit" value="'+ Bawolff.review_i18n.form_submit + '"/> <input type="submit" value="انصراف" onclick="Bawolff.jsMsg(\'\');return false"/></td></tr></table></form>';

/*<img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png" id="EasyReview-sg-image" width="10" height="10" border="0" /><select name="EasyReview-sg" onchange="Bawolff.review.selectChange()"><option value="pass">Pass</option><option value="fail" selected="selected">Fail</option></select> <label for="EasyReview-sg-comment" style="visibility:hidden">Comment: </label><input id="EasyReview-sg-comment" name="EasyReview-sg-comment" type="text" length="30" style="visibility: hidden"/>
*/
/*//upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Art%C3%ADculo_bueno.svg/10px-Art%C3%ADculo_bueno.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png
*/
Bawolff.jsMsg(container);
Bawolff.review.selectChange();

}
Bawolff.review.selectChange = function () {
//basically a redraw operation. something change, so redraw box
    Bawolff.review.redraw("sg", document.getElementsByName("EasyReview-sg")[0].value === "pass", document.getElementsByName("EasyReview-sg")[0].value !== "fail");
    Bawolff.review.redraw("npov", document.getElementsByName("EasyReview-npov")[0].value === "pass", document.getElementsByName("EasyReview-npov")[0].value !== "fail");
    Bawolff.review.redraw("sources", document.getElementsByName("EasyReview-sources")[0].value === "pass", document.getElementsByName("EasyReview-sources")[0].value !== "fail");
    Bawolff.review.redraw("news", document.getElementsByName("EasyReview-news")[0].value === "pass", document.getElementsByName("EasyReview-news")[0].value !== "fail");
    Bawolff.review.redraw("copyright", document.getElementsByName("EasyReview-copyright")[0].value === "pass", document.getElementsByName("EasyReview-copyright")[0].value !== "fail");
}
Bawolff.review.redraw = function (prefix, state, hidden) {
    var base = "EasyReview-" + prefix;
    if (state) {
        document.getElementById(base + "-image").src = "//upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Art%C3%ADculo_bueno.svg/10px-Art%C3%ADculo_bueno.svg.png";
    } else {
        document.getElementById(base + "-image").src = "//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/10px-Red_x.svg.png";
    }
    if (hidden) {
        document.getElementById(base + "-comment").previousSibling.style.visibility = "hidden";
        document.getElementById(base + "-comment").style.visibility = "hidden";
    } else {
        document.getElementById(base + "-comment").previousSibling.style.visibility = "visible";
        document.getElementById(base + "-comment").style.visibility = "visible";
    }
}

Bawolff.review.isFail = function ( value ) {
 //should this area be flagged in {{tl|وظایف}}.
 // Don't translate this part.
 if (value === 'pass' || value === 'n/a') {
  return true;
 }
 return false;
}
Bawolff.review.submit = function () {
var readTalk = document.getElementById('read-talk-box');
if (readTalk && !readTalk.checked ) {
    alert( Bawolff.review_i18n.read_talk );
    return false;
}
try {
//form submit handler
    var text;
    var review = {
        "EasyReview_revid": wgCurRevisionId,
        "EasyReview_sg" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-sg")[0].value),
        "EasyReview_sg_comment" : document.getElementsByName("EasyReview-sg")[0].value !== 'fail' ? 
Bawolff.review.convert(document.getElementsByName("EasyReview-sg")[0].value) : document.getElementById("EasyReview-sg-comment").value,

        "EasyReview_npov" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-npov")[0].value),
        "EasyReview_npov_comment" : document.getElementsByName("EasyReview-npov")[0].value !== 'fail' ? 
Bawolff.review.convert(document.getElementsByName("EasyReview-npov")[0].value) : document.getElementById("EasyReview-npov-comment").value,

        "EasyReview_sources" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-sources")[0].value),
        "EasyReview_sources_comment" : document.getElementsByName("EasyReview-sources")[0].value !== 'fail' ? 
Bawolff.review.convert(document.getElementsByName("EasyReview-sources")[0].value) : document.getElementById("EasyReview-sources-comment").value,

        "EasyReview_news" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-news")[0].value),
        "EasyReview_news_comment" : document.getElementsByName("EasyReview-news")[0].value !== 'fail' ? 
Bawolff.review.convert(document.getElementsByName("EasyReview-news")[0].value) : document.getElementById("EasyReview-news-comment").value,

        "EasyReview_copyright" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-copyright")[0].value),
        "EasyReview_copyright_comment" : document.getElementsByName("EasyReview-copyright")[0].value  !== 'fail' ? 
Bawolff.review.convert(document.getElementsByName("EasyReview-copyright")[0].value) : document.getElementById("EasyReview-copyright-comment").value,

        "EasyReview_comment" : document.getElementById("EasyReview-commentBox").value
    }

    // True -> pass
    /* No longer needed (I think)
    review.EasyReview_sg_comment = (review.EasyReview_sg ? 'pass' : review.EasyReview_sg_comment );
    review.EasyReview_npov_comment = (review.EasyReview_npov ? 'pass' : review.EasyReview_npov_comment );
    review.EasyReview_sources_comment = (review.EasyReview_sources ? 'pass' : review.EasyReview_sources_comment );
    review.EasyReview_news_comment = (review.EasyReview_news ? 'pass' : review.EasyReview_news_comment );
    review.EasyReview_copyright_comment = (review.EasyReview_copyright ? 'pass' : review.EasyReview_copyright_comment );
    */

    //pass review if all subsections are passed
    var passed = review.EasyReview_sg_comment === Bawolff.review_i18n.pass_v && review.EasyReview_npov_comment === Bawolff.review_i18n.pass_v && review.EasyReview_sources_comment === Bawolff.review_i18n.pass_v && review.EasyReview_news_comment === Bawolff.review_i18n.pass_v && review.EasyReview_copyright_comment === Bawolff.review_i18n.pass_v;

    //func for publishing article
    if (passed) {
    Bawolff.review.postReview(review);
    } else {
    Bawolff.review.failReview(review);
    }
 
} catch(err) {
 alert(Bawolff.review_i18n.unknownError + err.name + ': ' + err.message);
}
    return false;

}

Bawolff.review.failReview = function(r) {



    /*var cont = confirm('review failed. continue posting review?'); //for debuging
     *if (!cont) {throw new Error("User bailed [failed rev]");}*/

    //post {{tl|وظایف|حق تکثیر|خبرها|منابع|بی\u200cطرفی|سبک|مرور دوباره}} on page, peer review on talk.

    //First post peer review template on talk

    //generate content to add to talk page
    var reviewText = "<!-- " + Bawolff.review_i18n.review_comment + " --> \{\{" + Bawolff.review_i18n.review_peer_reviewed + "|" + Bawolff.review_i18n.review_revid + "=" + r.EasyReview_revid + "|" + Bawolff.review_i18n.review_copyright + "=" + r.EasyReview_copyright_comment + "|" + Bawolff.review_i18n.review_newsworthy + "=" + r.EasyReview_news_comment + "|" + Bawolff.review_i18n.review_verifiable + "=" + r.EasyReview_sources_comment + "|" + Bawolff.review_i18n.review_npov + "=" + r.EasyReview_npov_comment + "|" + Bawolff.review_i18n.review_style + "=" + r.EasyReview_sg_comment + "|" + Bawolff.review_i18n.review_reviewer + "=" + mw.config.get('wgUserName') + "|" + Bawolff.review_i18n.review_comments_field + "=" + r.EasyReview_comment + "|" + Bawolff.review_i18n.review_time + "=~~" + "~~" + "~}}";
    var reviewHeader = Bawolff.review_i18n.review_header_fail.replace(/\$1/, r.EasyReview_revid); 

    //callback to ajax that inserts review template on talk
    var talk_rev_cb = function (success) {
        if (success) {
            if (!Bawolff.review.isError()) {
                Bawolff.jsMsg('<p><a class="image" href="/wiki/File:X_mark.svg"><img height="17" width="15" src="//upload.wikimedia.org/wikipedia/commons/thumb/a/a2/X_mark.svg/15px-X_mark.svg.png" alt="X mark.svg"/></a>' + Bawolff.review_i18n.fail_review.replace(/\$1/g, mw.config.get('wgTitle'))  + '</p>');
            location = '#mw-js-message';
            }
        }
        else {
            throw new Error(Bawolff.review_i18n.softEditError);
        }

    }

    Bawolff.mwapi.edit({content: reviewText, page: mw.config.get('wgFormattedNamespaces')[1] + ":" + mw.config.get('wgTitle'), summary: reviewHeader, section: "new"}, talk_rev_cb);
    /***END posting peer review template to talk page ****/

    /***Start replace {{tl|مرور}} with {{tl|وظایف}}****/

    //generate tasks tag. ({{tl|وظایف|حق تکثیر|خبرها|منابع|بی\u200cطرفی|سبک|مرور دوباره}})
    var tasks_template = "\{\{" + Bawolff.review_i18n.tasks;
    //for each one, if failed (if false) add the tag
    tasks_template += (r.EasyReview_copyright ? "" : "|" + Bawolff.review_i18n.tasks_copyvio);
    tasks_template += (r.EasyReview_news ? "" : "|" + Bawolff.review_i18n.tasks_news);
    tasks_template += (r.EasyReview_sources ? "" : "|" + Bawolff.review_i18n.tasks_src);
    tasks_template += (r.EasyReview_npov ? "" : "|" + Bawolff.review_i18n.tasks_npov);
    tasks_template += (r.EasyReview_sg ? "" : "|" + Bawolff.review_i18n.tasks_mos);
    tasks_template += "|" + Bawolff.review_i18n.tasks_rereview + "}}";

    //Get the page
    var final_article_text = ""; //string that contains page that will be posted to server (Pay attention to variable scope)
    var apiOps = new Bawolff.mwapi.AsyncQueue; //Container to chain api requests

    var getPage_cb = function (res) {
        //callback to do work on the current page (aka put article flag)
        var page = res[mw.config.get('wgTitle')]; //wgPageName is url escaped
        if (page === undefined) { //if not in main ns
            page = res[mw.config.get('wgCanonicalNamespace') + ":" + mw.config.get('wgTitle')];
        }
        if (page === undefined) { //badness happened
            throw new Error(Bawolff.review_i18n.errorFetchFailFail);
        }
        page = Bawolff.review_i18n.stripReviewForFail(page, tasks_template);

        if (page.indexOf(tasks_template) === -1) {
            page = tasks_template + page; // if the above regexs fail for some reason, add tasks to top.
        }
        final_article_text = page;
    }

    //add Obtain and modify page to queue of api operations
    Bawolff.mwapi.getPage(mw.config.get('wgPageName'), getPage_cb,  apiOps);

    /****end obtain and modify page***/
    /***start save page to server****/

    //this is really ugly.
    //wrap in function so it uses the variable in the outer function's scope (final_article_text) at time of execution

    var postChanges = function () {

        var edit_cb = function(success, resp) {
            if (!success) {
                var APIerror = resp.getElementsByTagName("error");
                var err = "Unknown Error (not API)"; //default
                if (APIerror.length !== 0) {
                    err = APIerror[0].getAttribute("info");
                }
                alert(Bawolff.review_i18n.taskError.replace(/\$1/, err));
            }

            apiOps.next(); //go to next action

        }

        Bawolff.mwapi.edit({content: final_article_text, page: mw.config.get('wgPageName'), summary: Bawolff.review_i18n.editSummary_failReview}, edit_cb);
    }

    apiOps.add(postChanges); //add to ops queue

    /******End incredibly ugly add {{tl|وظیفه}} to page, code*******/

    try {
        apiOps.start(); //start editing
    } catch (e) {
        alert(Bawolff.review_i18n.unknownError + e.message)
    }


}

Bawolff.review.postReview = function(r) {
    //argument: review object
    //called from form handler if review was SUCCESSFUL


   /***** DO WEIRD GOOGLE NEWS HACK ********/
   //FIXME: this is stupid
   //create a redirect with a numb in it.

if (Bawolff.review.doWeirdGoogleHack) {
    var googleOps = new Bawolff.mwapi.AsyncQueue;


    var google_cb = function(success, resp) {
        //alert("We reached the callback");
        //this is a callback for after done editing.
        if (!success) {
            var APIerror = resp.getElementsByTagName("error");
            if (APIerror.length !== 0) {
                var err = APIerror[0].getAttribute("info");
            }
        
            alert("Could not make a redirect for google news. Contact Bawolff. Error: "+ err + ". Continuing with rest of review process");
        }
        var editTags = resp.getElementsByTagName('edit');
        if (editTags && editTags[0] && (+editTags[0].getAttribute('newrevid')) > 2) {
            //so we sight the page.
            var GoogleRedirId = editTags[0].getAttribute('newrevid');
    Bawolff.mwapi.sight({revid: GoogleRedirId, level: '1', comment: "Making redirect for google with a really long number, as those google people like long numbers.(Using [[MediaWiki:Gadget-easyPeerReview.js]]) "});
        } else if (editTags && editTags[0] && _hasAttribute(editTags[0], 'nochange')) {
            alert('It appears this article already has a redirect for google. Please double check that [[Article/' + wgArticleId + "/" + mw.config.get('wgPageName') +']] is sighted properly');
        }
        else {
            var error = (editTags ? (editTags[0] ? "newrevid=" + editTags[0].getAttribute('newrevid') : "0th edit tag is false") : "Error getting edit elms");
            alert('Warning : Could not figure out revision id of google news redirect to article. Falling back to dying in a hole. you may have to sight the google redirect manually.\n--------------\nTechnical info: ' + error);
        }
    }

    Bawolff.mwapi.edit({content: "#Redirect[[" + mw.config.get('wgPageName') + "]]\n\n{\{Google News}}", page: "Article/" + wgArticleId + "/" + mw.config.get('wgPageName'), summary: "Add a redirect for google (Using [[MediaWiki:Gadget-easyPeerReview.js]])", minor: "true"}, google_cb);



}
/**********END GOOGLE NEWS HACK *******/

    /*var cont = confirm('review passed. continue posting review?'); //for debuging
    if (!cont) {throw new Error("User bailed [passed rev]");}*/

   // alert(reviewText); //make it do stuff later.
/**************
*Post changes to server.
*prereq: assume user has ability to edit page and to sight it
*first edit current page
**<nowiki>{{review}} -> {{publish}}</nowiki> (in correct position)
**sight that revision
**get rev number of published version, and update review template
**Post a new section named "Review" with the peer review template.
**************/



    var apiOps = new Bawolff.mwapi.AsyncQueue; //list of apiops we have to do.

    //Check if rev we are looking at is most current.
    var actual_rev;

    //Make a callback function that
    //checks if theres been an edit
    //and if so prompts the user as to wether to proceed.
 
    var checkEditConfilict_cb = function (res) {

        //Get the revid from the api query
        actual_rev = res.getElementsByTagName('rev')[0].getAttribute('revid');

        //if its different from what we're looking at, prompt if we want to continue.
        if (actual_rev != r.EasyReview_revid) {
            var keep_going = window.confirm(Bawolff.review_i18n.editConflict);

            if (!keep_going) {throw new Error(Bawolff.review_i18n.ErrorEditConflictCancel);}
            //fixme: should be some soft error thats less ugly
            //perhaps subclass of error thats recognized by mwapilib

        }
    }

    var checkEditConflict = new Bawolff.mwapi.Request({action:"query", prop: "revisions", titles: mw.config.get('wgPageName'), rvprop: "ids"});
    checkEditConflict.delaySend(apiOps, checkEditConfilict_cb);

    /***End checking for edit conflict ****/
    /***Start editng of article (add pub tag, rm review)*****/

    //Get the page
    var final_article_text = ""; //string that contains page that will be posted to server
    var getPage_cb = function (res) {
        //callback to do work on the current page (aka publish it)
        var page = res[mw.config.get('wgTitle')]; //wgPageName is url escaped
        if (page === undefined) { //if not in main ns
            page = res[mw.config.get('wgCanonicalNamespace') + ":" + mw.config.get('wgTitle')];
        }
        if (page === undefined) { //badness happened
            throw new Error(Bawolff.review_i18n.errorFetchFailureSuccess);
        }

        page = Bawolff.review_i18n.prePubTransform(page); //remove developing. fix date, etc

        //Add {{tl|publish}} (code slightly inelegant)

        var src = Bawolff.review_i18n.regex_sources;
        page = page.replace(src,"\n\n{\{" + Bawolff.review_i18n.publish + "\}\}\n\$1");
        
        //end insertion of publish template.
        final_article_text = page; //push to outside scope.
        if (final_article_text.length < 10) {
            //if result less than length of pub tag, wine.
            throw new Error(Bawolff.review_i18n.errorNoPub.replace(/\$1/, 'Regex Error'));
        }
        /***WWC code ***/
        
        if (Bawolff.review.doWWC) {
         Bawolff.review.countThoseChars(page);
        }
        if (mw.config.get('wgDBname') === 'fawikinews') {
         try {
            api().setDefaultSummary('ایجاد صفحهٔ نظرها با استفاده از [[ویکی\u200cخبر:ابزار بازبینی آسان|ابزار بازبینی آسان]]').checkPageExists(mw.config.get('wgFormattedNamespaces')[102] + ':' + mw.config.get('wgPageName')).not().abortIfFalse().getPage('ویکی\u200cخبر:صفحه\u200cهای تفسیر در مورد رویدادهای خبری/بدنه اصلی').replace(/[<>]\/?includeonly[<>]/g, '').savePage(mw.config.get('wgFormattedNamespaces')[102] + ':' + mw.config.get('wgPageName')).exec();
         } catch (e) {
           alert('Easy Peer Review experienced some issue when creating opinion page. Please tell [[user:Bawolff]] (include browser and technical details).\n--------\nTechnical details: ' + e.message); //just in case, should not happen
         }
        }




    }

    //add Obtain and modify page to queue of api operations
    Bawolff.mwapi.getPage(mw.config.get('wgPageName'), getPage_cb,  apiOps);

    /****end obtain and modify page***/
    /***start save page to server****/

    //this is really ugly.
    //wrap in function so it uses the global variable at time of execution

    var postChanges = function () {
       

        var edit_cb = function(success, resp) {
            if (!success) {
                var APIerror = resp.getElementsByTagName("error");
                if (APIerror.length !== 0) {
                    var err = APIerror[0].getAttribute("info");
                }
            
                alert(Bawolff.review_i18n.errorNoPub.replace(/\$1/, err));
            }
            var editTags = resp.getElementsByTagName('edit');
            if (editTags && editTags[0] && editTags[0].getAttribute('newrevid') > 2) {
                //so we sight the published revision
                Bawolff.review.newid = editTags[0].getAttribute('newrevid');
            } else {
                alert(Bawolff.review_i18n.warningNoArticleID);
            }
            apiOps.next(); //go to next action

        }

        Bawolff.mwapi.edit({content: final_article_text, page: mw.config.get('wgPageName'), summary: Bawolff.review_i18n.pub_edit_summary}, edit_cb);
    }

    apiOps.add(postChanges); //add to ops queue

    /******End incredibly ugly publish page code*******/
    //Sight the apropriate revision.

     try {
         Bawolff.mwapi.sight({revid: new Bawolff.LazyVar('Bawolff.review.newid'), level: '1', comment: Bawolff.review_i18n.editSummary_sight + r.EasyReview_comment }, undefined, undefined, apiOps);
     } catch (e) {
         alert('Something bad happened when trying to sight the article. Please tell [[user:Bawolff]]. You may have to sight this revision manually\n\n----------------\nDetails: revid: ' + Bawolff.review.newid + '; Error: ' + e.name + ': ' + e.message);
     }

    /******Start put review template on talk page*****/

    //generate template

    var reviewText = "<!-- " + Bawolff.review_i18n.review_comment + " --> \{\{" + Bawolff.review_i18n.review_peer_reviewed + "|" + Bawolff.review_i18n.review_revid + "=" + r.EasyReview_revid + "|" + Bawolff.review_i18n.review_copyright + "=" + r.EasyReview_copyright_comment + "|" + Bawolff.review_i18n.review_newsworthy + "=" + r.EasyReview_news_comment + "|" + Bawolff.review_i18n.review_verifiable + "=" + r.EasyReview_sources_comment + "|" + Bawolff.review_i18n.review_npov + "=" + r.EasyReview_npov_comment + "|" + Bawolff.review_i18n.review_style + "=" + r.EasyReview_sg_comment + "|" + Bawolff.review_i18n.review_reviewer + "=" + mw.config.get('wgUserName') + "|" + Bawolff.review_i18n.review_comments_field + "=" + r.EasyReview_comment + "|" + Bawolff.review_i18n.review_time + "=~~" + "~~" + "~}}";
    var reviewHeader = Bawolff.review_i18n.review_header_pass.replace(/\$1/, r.EasyReview_revid); 

    var ua = navigator.userAgent.toLowerCase();
    var talk_rev_cb = function (success) {
        if (success) { 
            if (!Bawolff.review.isError()) {
                Bawolff.jsMsg('<p><a href="/wiki/File:Yes_check.svg" class="image" title="Yes check.svg"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/16px-Yes_check.svg.png" width="16" height="16" /></a> <b>' + Bawolff.review_i18n.done + '</b> ' + Bawolff.review_i18n.success.replace(/\$2/, ' <form action="' + Bawolff.review_i18n.success_ml_url + '" method="GET"><button type="submit" value="' + mw.html.escape(mw.config.get('wgTitle')) + '" name="use-page">' + (ua.indexOf('msie') === -1 ? Bawolff.review_i18n.success_ml : mw.html.escape(mw.config.get('wgTitle')) ) + '</button></form></p>').replace(/\$1/, '<i>' + mw.html.escape(mw.config.get('wgTitle')) + '</i>'));
                location = '#mw-js-message';
            }
        }
        else {
            throw new Error(Bawolff.review_i18n.softEditError);
        }

    }

    Bawolff.mwapi.edit({content: reviewText, page: mw.config.get('wgFormattedNamespaces')[1] + ":" + mw.config.get('wgTitle'), summary: reviewHeader, section: "new"}, talk_rev_cb, undefined, apiOps);

   /****End talk page editing ***/
   /****Start making edits!*****/
    try {
        apiOps.start(); //start editing
    } catch (e) {
        alert(Bawolff.review_i18n.unknownError + e.message)
    }

}

if (mw.config.get('wgAction') === "view" && mw.config.get('wgNamespaceNumber') === 0 && mw.config.get('wgUserGroups').toString().indexOf("editor") > -1 ) {
    $(Bawolff.review);
}


Bawolff.review.isError = function () {
 //mw-js-message-mwapi-error
 var msg = document.getElementById('mw-js-message');
 return msg && (msg.className.indexOf('mw-js-message-mwapi-error') !== -1)
}

/**** WWC code ***/

Bawolff.review.countThoseChars = function (page) {
try {
//precond page =page contents.
api(page).push().lift(function (p) { return p.length;}).swap().
replace(/\<[^>]*\>/g, '').
replace(/^\s{0,4}(={1,6})([\s\S]*)\1\s*$/mg, "$2").
replace(/\'{2,5}/g, '').
replace(/\{\{[dD]ate\|[^\}]*\}\}/g, '').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/(\{\{[^\|}]*)\|(\|[^\}=]*\|)?[^\|\}=]*=([^\|}]*)((?:\|[^\}]*)?\}\})/g, '$1$2$4 $3 ').
replace(/\{\{[^\|}]*\}\}/g, '').
replace(/\{\{[^\|}]*\|([^\}]*)\}\}/g, ' $1 ').
replace(/\[http(?:s)?:\/\/\S*\s([^\]]*)]/g, ' $1 ').
replace(/http(?:s)?:\/\/\S*/g, '').
replace(/\[\[[iIfF][mMiI][aAlL][gGeE][eE]?\:[^\]]*\|([^\]]*)\]\]/g, ' $1 ').
replace(/\[\[[cC]ategory\:([^\]]*)\]\]/g, ' $1 ').
replace(/\[\[[^\|\]]*\|([^\]]*)\]\]/g, '$1').
replace(/\[\[([^\]]*)\]\]/g, '$1').
replace(/\s{2,}/g, ' ').
lift2(Bawolff.review.convertToPoints).exec();
} catch (e) {
//jsMsg(document.createTextNode('WWC error [step 1] [tell bawolff]:' + e.message));

alert('WWC error [step 1] [tell bawolff]:' + e.message);
}
}

Bawolff.review.convertToPoints = function (count, raw) {
try {
 count = count.length;
 var log = '\n# '
 var cats = document.getElementById('catlinks').getElementsByTagName('a');
 var OR, user, points, catName, userCat, inContest;
 for (var i = 0; i < cats.length; i++) {
 catName = cats[i].title
  if (catName.substring(catName.length - 12, catName.length) === "(Wikinewsie)") {
   user = catName.substring(9, catName.length - 13);
   userCat = catName;
  }
  if (catName === "Category:Original reporting") {
   OR = true;
  }
  if (catName === "Category:Writing Contests/May 2010") {
   inContest = true;
  }
 }
 var detailed;
 if (!userCat || !inContest) return; //not a contest entry
 log += '[[:' + userCat + '|' + user + ']] submitted: [[' + mw.config.get('wgTitle') + "]] for '''"; 
 if (count < 1200) {
  detailed = '1 pt [as short] ';
  points = 1;
 } else {
  detailed = '3 pts [as synth] ';
  points = 3;
 }
 if ((count - 1200)/700 > 0) {
  detailed += '+' + 2*Math.floor((count - 1200)/700) + 'pts [per extra length] ';
  points += 2*Math.floor((count - 1200)/700);
 }
 if (OR) {
  detailed += '+6 pts [as OR] ';
  points += 6;
 }
 if (document.getElementById('broadcast-report')) {
  detailed += '+4 pts [as Broadcast] ';
  points += 4;
 }

 log += points + "''' points. <small>(Normalized/Raw chars:" + count + '/' + raw + '; ' + detailed + ')</small>';

 api('Wikinews:May 2010 writing contest/log').setDefaultSummary('Appending to contest log [via EzPR]; ' + points + ' points for ' + user).getPage().lift(function (p) { return p + log}).savePage().exec();
} catch (e) {

alert('WWC error [step 2] [tell bawolff]:' + e.message);

}
}