MediaWiki:Gadget-easyPeerReview.js

Nota: Después de guardar, debes recargar la caché de tu navegador para ver los cambios:

  • Mozilla: Pulsa Recargar (o Ctrl-R)
  • Internet Explorer / Opera: Ctrl-F5
  • Safari: Cmd-R
  • Konqueror Ctrl-R.
/*Gadget importado desde [[en:MediaWiki:Gadget-easyPeerReview.js]] y desarrollado por el usuario Bawolff de Wikinoticias en Inglés */
/*Adaptado y Mantenido por AlvaroMolina */
/*jslint browser: true, devel: true, undef: true, eqeqeq: true, newcap: true, immed: true, maxerr: 80 */
/*global jsMsg, Bawolff, _hasAttribute, 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, bien, 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_bien, review_header_fail
*/
//So that this doesn't interfere with var names of anything else 
if (typeof Bawolff === "undefined") Bawolff = {};

// Quick hack - IF THIS BREAKS REVERT
jsMsg2 = 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 );
}

Bawolff.sight_status = 3; // Ugly error checking code, but I don't really know whats going on.

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: 'Revisar',
  review_tab_tooltip: 'Revisar esta página',
  bien: 'Aprobado',
  fail: 'Reprobado',
  not_reviewed: 'No revisado',
  form_comment: 'Comentarios: ',
  form_comment_overall: 'Comentarios del revisor: ',
  form_rev_numb: 'Revisando la versión ',
  form_submit: 'Enviar revisión',
  form_copyright: 'Derechos de autor',
  form_copyright_page: 'Wikinoticias:Derechos_de_autor',
  form_news_page: 'Wikinoticias:Guía_de_contenido',
  form_news: 'Interés periodístico',
  form_sources_page: 'Wikinoticias:Cita_tus_fuentes',
  form_sources: 'Verificabilidad',
  form_sg: 'Estilo',
  form_sg_page: 'Wikinoticias:Guía de estilo',
  form_npov_page: 'Wikinoticias:Punto de vista neutral',
  form_npov: 'PVN',
  form_read_talk: 'Confirmo haber leído todos los comentarios de la página de discusión  (<a href="' + mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace('$1', 'Talk:' + encodeURIComponent(mw.config.get('wgTitle').replace(/\s/g, '_'))) + '" target="_blank">abrir página de discusión en una nueva pestaña</a>)',
  read_talk: 'No puedes revisar el artículo hasta haber marcado la casilla de confirmación',
  tasksError: 'No se pudieron agregar las plantillas de mantenimiento al artículo debido al error: "$1".',
  unknownError: 'Easy Peer Reeview tuvo una excepción no detectada: ',
  softEditError: "Ha ocurrido algo malo (error de edición recuperable, como un captcha o algo similar). Sin embargo, no se pudo averiguar cómo recuperarlo.",
  errorNoPub: "No se pudo agregar \{\{Publicado\}\} al artículo. Debido a un error: '$1'. Continuando con el resto del proceso de revisión.",
  errorFetchFailureSuccess: "No se pudo recuperar el origen de la página desde el servidor al intentar reemplazar la revisión por publicar en una revisión exitosa.",
  errorFetchFailFail: "No se pudo recuperar el origen de la página desde el servidor al intentar reemplazar la revisión con las tareas en la revisión no realizada.",
  ErrorEditConflictCancel: "Revisión cancelada prematuramente debido a un conflicto de edición",
  warningNoArticleID: 'Advertencia: No se pudo obtener el ID de revisión de la nueva versión publicada del artículo. Volviendo a usar el ID de revisión de la penúltima revisión. Puede tener que vista la versión más reciente de este artículo manualmente.',
  pub_edit_summary: "Publicación del artículo (usando [[Ayuda:Easy Peer Review|Easy Peer Review]])",
  review_comment:  "Enviado (usando Easy Peer Review - MediaWiki:Gadget-easyPeerReview.js)", //Comentario en la Discusión arriba de la RPP
  review_header_bien: "Revisión de la versión $1 [Aprobada]",
  review_header_fail: "Revisión de la versión $1 [Reprobada]",
  review_revid: 'revid', //Parámetro de ID de revisión en la Plantilla de RPP 
  review_copyright: 'derechos de autor',
  review_newsworthy: 'periodístico',
  review_verifiable: 'verificable',
  review_npov: 'pvn',
  review_style: 'estilo',
  review_reviewer: 'revisor',
  review_comments_field: 'comentarios',
  review_time: 'fecha',
  review_peer_reviewed: 'Revisión_por_pares', //Nombre de la Plantilla de RPP
  tasks: 'Tareas', //Nombre de la Plantilla Contenedora de las Plantillas de Mantenimiento
  tasks_copyvio: 'copyvio',
  tasks_news: 'noticias',
  tasks_src: 'fuentes',
  tasks_npov: 'pvn',
  tasks_mos: 'estilo',
  tasks_rereview: 'revisar',
  publish: 'Publicado', //Nombre de la Plantilla de Publicación
  editSummary_sight: "Publicación del artículo (usando [[Ayuda:Easy Peer Review|Easy Peer Review]]): ",
  editSummary_failReview: "Adición de plantillas de mantenimiento (usando [[Ayuda:Easy Peer Review|Easy Peer Review]])",
  editConflict: "*********[Conflicto de edición]********** \nAlguien ha editado esta página desde que la revisaste. ¿Desea revisar esta página (incluyendo las ediciones más recientes) de todos modos?",
  done: 'Hecho',
  commentPageExists: 'La página de comentarios al parecer ya había sido creada. Presiona OK para sobreescribir cualquier comentario existente o Cancelar para abortar esta operación.',
  success: '"$1" ha sido revisado y publicado exitosamente $2', //$1 = Nombre del Artículo, $2= Botón para Colocar Artículo en la Portada (deshabilitado al no contar con esta opción en este proyecto)
  success_ml: 'Colocar este artículo en la portada', //$1 = Nombre del Artículo
  success_ml_url: mw.config.get('wgArticlePath').replace('$1', 'Wikinoticias:Titulares en Portada'),
  fail_review: '<b>Hecho</b> "$1" ha sido revisado exitosamente (El artículo <b>falló</b> el proceso de revisión)', //$1 = Nombre del Artículo
  trigger_id: 'revisar', // Nombre de la Plantilla de Revisar
  regex_sources: /\*\{\{(?:[sS]ource(-pr|-science)?|[aA]pasource|[pP]apersource|[oO]rsource|[sS]ourceReg)\|[^}]*\}\}/gm,
  trigger_func: function () {}, // No modificar este parámetro
  prePubTransform: function (page) {
        //Plantillas a reemplazar cuando una revisión es exitosa y se publica el artículo
        page = page.replace(/\{\{(?:[rR]evisar|)(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //RM {{Tl|Revisar}}
        page = page.replace(/\{\{[eE]n progreso(?:ing)?(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //RM {{Tl|En progreso}}
        return page;
  },
  stripReviewForFail: function (page, tasks_template) {
        //Si la revisión falla, se debe remover la plantilla de revisión y colocar la de tareas
        page = page.replace(/\{\{(?:[rR]evisar|)(?:\|[^}]*)?\}\}/, tasks_template); //Reemplazo de {{Tl|Revisar}} por {{Tl|Tareas}}
        page = page.replace(/\{\{(?:[rR]evisar|)(?:\|[^}]*)?\}\}(?:\n)?/g, ""); //En caso de haber varias plantillas de revisión
        return page;
  }

 } 
}

Bawolff.review = function() {
/* Verificación de si el usuario pertenece al grupo "editor/revisor", adicional a la condicional predeterminada de [[MediaWiki:Gadgets-definition]] */
    if (document.getElementById(Bawolff.review_i18n.trigger_id) || Bawolff.review_i18n.trigger_func()) {
        mw.util.addPortletLink("p-cactions", "javascript:Bawolff.review.start();void%200;", Bawolff.review_i18n.review_tab, "ca-peerReview", Bawolff.review_i18n.review_tab_tooltip);
    }
}

/* Botón de "Revisar" para utilizar [[MediaWiki:Gadget-easyPeerReview.js]] */
$(function () {
   var hist; var url;
   var actionPortlet = "p-cactions";
   var purgeText = (mw.config.get('skin') === "vector" ? "Revisar" : "Revisar");
   if (!(hist = document.getElementById('ca-history') )) return;
   if (!(url = hist.getElementsByTagName('a')[0] )) return;
   if (!(url = url.href )) return;
   mw.util.addPortletLink(actionPortlet, 'javascript:Bawolff.review.start()',
                  purgeText, 'ca-purge', 'Revisar esta página', 'Revisar');
});

Bawolff.review.doWeirdGoogleHack = false; // FIXME: this is crap.

if (mw.config.get('wgDBname') === 'enwikinews') {
 Bawolff.review.doWWC = true;
}
Bawolff.review.start = function () {
    if (mw.config.get('wgDBname') === 'enwikinews') {
        mw.loader.load( '/w/index.php?title=' + 'User:Bawolff/mwapilib.js' + '&action=raw&ctype=text/javascript' ); //needed when pressing submit
        if (Bawolff.review.doWWC) mw.loader.load( '/w/index.php?title=' + 'User:Bawolff/mwapilib2.js' + '&action=raw&ctype=text/javascript' );
    } else {
        mw.loader.load('//en.wikinews.org/w/index.php?title=User%3ABawolff%2Fmwapilib.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:Antu_checkbox-qt.svg" class="image" title="Pictogram_voting_question-blue.svg"><img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Antu_checkbox-qt.svg/60px-Antu_checkbox-qt.svg.png" width="60" height="62" border="0" /></a></td><td>' + Bawolff.review_i18n.form_rev_numb + mw.config.get('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/13px-Red_x.svg.png" id="EasyReview-copyright-image" width="13" height="13" border="0" /><select name="EasyReview-copyright" onchange="Bawolff.review.selectChange()"><option value="bien">' + Bawolff.review_i18n.bien + '</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/13px-Red_x.svg.png" id="EasyReview-news-image" width="13" height="13" border="0" /><select name="EasyReview-news" onchange="Bawolff.review.selectChange()"><option value="bien">' + Bawolff.review_i18n.bien + '</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/13px-Red_x.svg.png" id="EasyReview-sources-image" width="13" height="13" border="0" /><select name="EasyReview-sources" onchange="Bawolff.review.selectChange()"><option value="bien">' + Bawolff.review_i18n.bien + '</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/13px-Red_x.svg.png" id="EasyReview-npov-image" width="13" height="13" border="0" /><select name="EasyReview-npov" onchange="Bawolff.review.selectChange()"><option value="bien">' + Bawolff.review_i18n.bien + '</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/13px-Red_x.svg.png" id="EasyReview-sg-image" width="13" height="13" border="0" /><select name="EasyReview-sg" onchange="Bawolff.review.selectChange()"><option value="bien">' + Bawolff.review_i18n.bien + '</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="Cancelar" onclick="jsMsg2(\'\');return false"/></td></tr></table></form>';

/*<img alt="" src="//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/13px-Red_x.svg.png" id="EasyReview-sg-image" width="13" height="13" border="0" /><select name="EasyReview-sg" onchange="Bawolff.review.selectChange()"><option value="bien">bien</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/f/fb/Yes_check.svg/13px-Yes_check.svg.png
//upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Red_x.svg/13px-Red_x.svg.png
*/
jsMsg2(container);
Bawolff.review.selectChange();

}
Bawolff.review.selectChange = function () {
/* Parámetros para rellenar como "aprobados" los ítems de la Plantilla RPP */
    Bawolff.review.redraw("sg", document.getElementsByName("EasyReview-sg")[0].value === "bien", document.getElementsByName("EasyReview-sg")[0].value !== "fail");
    Bawolff.review.redraw("npov", document.getElementsByName("EasyReview-npov")[0].value === "bien", document.getElementsByName("EasyReview-npov")[0].value !== "fail");
    Bawolff.review.redraw("sources", document.getElementsByName("EasyReview-sources")[0].value === "bien", document.getElementsByName("EasyReview-sources")[0].value !== "fail");
    Bawolff.review.redraw("news", document.getElementsByName("EasyReview-news")[0].value === "bien", document.getElementsByName("EasyReview-news")[0].value !== "fail");
    Bawolff.review.redraw("copyright", document.getElementsByName("EasyReview-copyright")[0].value === "bien", 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/7/7e/Antu_running.svg/14px-Antu_running.svg.png";
    } else {
        document.getElementById(base + "-image").src = "//upload.wikimedia.org/wikipedia/commons/thumb/0/0c/Antu_waiting.svg/14px-Antu_waiting.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 ) {
 //Valor de "No revisado"
 if (value === 'bien' || 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;
}
/* Valores de la opción "Reprobado" */
try {
    var text;
    var review = {
        "EasyReview_revid": mw.config.get('wgCurRevisionId'),
        "EasyReview_sg" :  Bawolff.review.isFail(document.getElementsByName("EasyReview-sg")[0].value),
        "EasyReview_sg_comment" : document.getElementsByName("EasyReview-sg")[0].value !== 'fail' ? 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' ? 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' ? 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' ? 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' ? document.getElementsByName("EasyReview-copyright")[0].value : document.getElementById("EasyReview-copyright-comment").value,

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

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

    /* Valor de un ítem aprobado */
    var aprobado = review.EasyReview_sg_comment === 'bien' && review.EasyReview_npov_comment === 'bien' && review.EasyReview_sources_comment === 'bien' && review.EasyReview_news_comment === 'bien' && review.EasyReview_copyright_comment === 'bien';

    /* Para publicar el artículo en caso de una revisión exitosa */
    if (aprobado) {
    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?'); //Para Debugging
     *if (!cont) {throw new Error("User bailed [failed rev]");}*/

    //Colocar {{Tl|Tareas|copyvio|noticias|fuentes|pvn|estilo|revisar}} en la página, después de la revisión en la página de discusión del artículo.

    //Primero colocar la plantilla de revisión por pares en la discusión

    //Generación de contenido para agregar a la página de discusión
    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); 

    //Llamada a AJAX para insertar la plantilla en la página de discusión del artíclo
    var talk_rev_cb = function (success) {
        if (success) {
            if (!Bawolff.review.isError()) {
                jsMsg2('<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.html.escape(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);
    /***FIN Adición de Plantilla de Revisión por Pares****/

    /***INICIO Reemplazo de {{Tl|Revisar}} por {{Tl|Tareas}}****/

    //Generación de Plantilla de Tareas ({{Tl|Tareas|copyvio|noticias|fuentes|pvn|estilo|revisar}})
    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 + "}}";

    //Obtener la página
    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|tasks}} 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/' + mw.config.get('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 (Please leave user:Bawolff a note): 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/" + mw.config.get('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 aprobado. continue posting review?'); //for debuging
    if (!cont) {throw new Error("User bailed [aprobado 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;
        var endOfSrc = page.length;
        while (src.exec(page) !== null) {endOfSrc = src.lastIndex;}
        page = page.substring(0, endOfSrc) + "\n\n{\{" + Bawolff.review_i18n.publish + "}}" + page.substring(endOfSrc, page.length);
        
        //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') === 'enwikinews') {
         try {
            api().setDefaultSummary('Creación de página de comentarios (usando [[Ayuda:Easy Peer Review|Easy Peer Review]])').checkPageExists(mw.config.get('wgFormattedNamespaces')[100] + ':' + mw.config.get('wgPageName')).lift(function (exists) { return !exists ? true : confirm( Bawolff.review_i18n.commentPageExists ); }).abortIfFalse().getPage('Plantilla:Comentarios_preload').savePage(mw.config.get('wgFormattedNamespaces')[100] + ':' + mw.config.get('wgPageName')).exec();
         } catch (e) {
           alert('Easy Peer Review no ha podido crear la página de comentarios debido a un fallo en el software.\n--------\nDetalles técnicos: ' + 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.sight_status = 4;
         Bawolff.mwapi.sight({revid: new Bawolff.LazyVar('Bawolff.review.newid'), level: '2', comment: Bawolff.review_i18n.editSummary_sight + r.EasyReview_comment },
             (function (res) { Bawolff.sight_status = 0; if (!res) {alert("Error al marcar el artículo como revisado"); Bawolff.sight_status = 5}}),
             undefined, apiOps);
     } catch (e) {
         alert('Ocurrió un error al marcar como revisado este artículo. Ponte en contacto con AlvaroMolina si persisten los problemas.\n\n----------------\nDetalles: ID de Revisión: ' + 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_bien.replace(/\$1/, r.EasyReview_revid); 

    var talk_rev_cb = function (success) {
        if (success) {
            var ua = navigator.userAgent.toLowerCase();
            var sMesg = function () {
                jsMsg2('<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';
            }

            if ( Bawolff.sight_status !== 0 ) {
                if ( Bawolff.sight_status === 4 ) {
                     // maybe people navigate away before its done?
                     jsMsg2('<img src="//upload.wikimedia.org/wikipedia/commons/2/21/Throbber_allbackgrounds_stroopwafel.gif"> Tu revisión esta siendo procesada. Espera un momento...');
                     window.setTimeout( (function () {
                             if ( Bawolff.sight_status === 4 ) {
                                 window.setTimeout( arguments.callee, 250 );
                             } else {
                                 sMesg();
                             }
                         }), 250 );
                } else {
                    alert("Ocurrió un error al marcar como revisado este artículo. Ponte en contacto con AlvaroMolina si persisten los problemas.\n\n---------------\nCódigo de error de revisión: " + Bawolff.sight_status + ".");
                }
            }
            else if (!Bawolff.review.isError()) {
                sMesg();
            }
        }
        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) || (mw.config.get('wgUserGroups').toString().indexOf("review") > -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]ategoría\:([^\]]*)\]\]/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);

}
}