Thành viên:Trần Nguyễn Minh Huy/Specialadmin/monobook.js

Cache: Sau khi lưu biểu mẫu này, phải xóa bộ nhớ đệm (cache) của trình duyệt để những thay đổi hiện ra:

Firefox, Chrome, Safari, Opera — Shift­Reload / Tải lại       Internet Explorer — Ctrl­Refresh / Làm tươi       Konqueror — Reload / Tải lại

Nếu bạn viết mã JavaScript, chú ý đọc hướng dẫn để tránh mâu thuẫn với mã mặc định của mạng.

//[[Category:Wikipedia administrators who use VoA script|{{PAGENAME}}]]

if (document.implementation.createDocument)
 {var gml_xmlparser = new DOMParser();}

function standard_XMLParse(string) 
{
  if (document.implementation.createDocument)
 {
    return gml_xmlparser.parseFromString(string, "text/xml");
  } 
  else if (window.ActiveXObject) 
  {
    string = string.replace(/<body .*\"ns-(.*)\">/, '<body class="ns-$1">');
    rer = string.match(/<h1 .*<\/h1>/)[0].replace(/&/g, '&');
    if (rer) {string = string.replace(/<h1 .*<\/h1>/, rer);}
    var gml_xmldoc = new ActiveXObject("Microsoft.XMLDOM");
    gml_xmldoc.async = false;
    ret = gml_xmldoc.loadXML(string);
    myErr = gml_xmldoc.parseError;
		if (myErr.errorCode || !ret)
                {
			showError("Lỗi: " + ERROR_XML + myErr.reason);
			return null;
		}
		return gml_xmldoc.documentElement
  }
  return null;
}

function HTTPClient()
{
  var xml_http = false;
  if(window.XMLHttpRequest)
    xml_http = new XMLHttpRequest();
  else if (IE){
    try{
      xml_http = new ActiveXObject("Msxml2.XMLHTTP")
    } catch (e){
      try{
        xml_http = new ActiveXObject("Microsoft.XMLHTTP")
      } catch (e){}
    }
  }
	if (!xml_http) showError(ERROR_XML);
  return xml_http
};

var cvrollbacklink='<span style="color:red;">Đang lùi sửa đổi...</span>';
var dvrollbacklink='<span style="color:red;">Đang xóa...</span>';
var autopurgelink='<span style="color:darkblue;">Đang tẩy bộ nhớ...</span>';

importScript("User:Trần Nguyễn Minh Huy/Dates.js");
importScript("User:Trần Nguyễn Minh Huy/Addtabs/monobook.js");
//

///////LOAD-BALANCING///////
MAX_THREADS = 3;
THREADS = 0;
TASK_INDEX = 0;
//the index of the <li> element to start with when continuing
NEXT_INDEX = 0;
// an array of window references
OPERATIONS = new Array();

//tells how many windows can be opened
function CheckRunningThreads()
{
THREADS=0;
var start = OPERATIONS.length - MAX_THREADS;
if ( start < 0 ) start = 0;
  for (i=start; i < OPERATIONS.length; i++)
     {
     if (OPERATIONS[i].closed==false) THREADS+=1;
     }
  OPEN_THREADS = MAX_THREADS - THREADS;
  return OPEN_THREADS;
}

function isLoadReady(callback)
{
OPEN_THREADS = CheckRunningThreads();
	if (OPEN_THREADS > 0) {
	// call the function if ready
		callback();
	} else {
	// try again
		setTimeout("window.isLoadReady(" + callback + ")",1000);
	}
}

// keep checking if new THREAD slots open up
function loadWhenReady(callback)
{
  setTimeout("window.isLoadReady(" + callback + ")",1000);
}
///////

function checkall()
{
  if (document.getElementById('bodyContent'))
    {form = document.getElementById('bodyContent');}
  else if (document.getElementById('quickbar'))
    {form = document.getElementById('content');}
  l = form.getElementsByTagName('input');
  for (i = 0 ; i < l.length; i++)
    {
    if (l[i].type == 'checkbox')
      {l[i].value = '1'; l[i].checked=true;}
    }
}
//END

//
function setConfirmTypes() {
  if (typeof Mvaluejs_class == 'undefined')
      Mvaluejs_class = 'yes';
  if (typeof Rvaluejs_class == 'undefined')
      Rvaluejs_class = 'yes';
  if (typeof Uvaluejs_class== 'undefined')
      Uvaluejs_class = 'yes';
}
//

// Purge for WLH
function autoPurgeTab(){
if( wgPageName == "Đặc_biệt:WhatLinksHere" )
  {
    addTab("javascript:doMasterPurge()", "tẩybộđệm", "ca-masspurge", "Làm sạch toàn bộ đệm", "");
  }
}

//MASTER rollback
function addmasterroll()
{
  if( wgPageName=="Đặc_biệt:Đóng_góp" && location.href.search(/\d{1,3}(@|%40)\d{1,2}/) == -1 && document.getElementById("contentSub")) 
      { 
    masterlogview(100,'creation',"trangmới","ca-npages","Xem các trang do thành viên tạo");
    masterlogview(100,'move',"dichuyển","ca-viewpm","Xem các di chuyển do thành viên làm");
    masterlogview(50,'upload',"đãtải", "ca-viewup", "Xem các tập tin do thành viên tải");
    addTab("javascript:masterroll()", "lùi mọi sửa đổi", "ca-massroll", "Lùi mọi sửa đổi trên cùng", "");
    document.getElementById('ca-massroll').firstChild.innerHTML = '<strong><span style="color:darkred;">lùi mọi sửa đổi</span></strong>';
    addTab("javascript:number_count()", "#", "ca-numb", "Số sửa đổi", "");
      }
  else if( wgPageName=="Đặc_biệt:Đóng_góp" && location.href.search(/\d{1,3}(@|%40)\d{1,2}/) != -1 && document.getElementById("contentSub")) 
      { 
    addTab("javascript:masterroll()", "lùi mọi sửa đổi", "ca-massroll", "Lùi mọi sửa đổi trên cùng", "");
    document.getElementById('ca-massroll').firstChild.innerHTML = '<strong><span style="color:darkred;">lùi mọi sửa đổi</span></strong>';
	  }
  else if (location.href.search(/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Nh%E1%BA%ADt_tr%C3%ACnh.*[&\?]type=move[^&]/) != -1 && location.href.search('&user=[^&]') !=-1) 
      { 
    addTab("javascript:movemasterroll()", "lùi mọi di chuyển", "ca-rvmoves", "Lùi mọi di chuyển trang", "");
    document.getElementById('ca-rvmoves').firstChild.innerHTML = '<strong><span style="color:darkred;">lùi mọi di chuyển</span></strong>';
      }
  else if (location.href.search(/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Nh%E1%BA%ADt_tr%C3%ACnh.*[&\?]type=upload/) != -1 && location.href.search('&user=[^&]') !=-1) 
      { 
    addTab("javascript:masterdelete()", "lùi mọi tải lên", "ca-rvuploads", "Lùi mọi tải lên", "");
    document.getElementById('ca-rvuploads').firstChild.innerHTML = '<strong><span style="color:darkred;">lùi mọi tải lên</span></strong>';
      }
  else if (location.href.search(/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Trang_m%E1%BB%9Bi.*[&\?]username=[^&]/) !=-1 || location.href.search(/Special:NewPages.*[&\?]username=[^&]/) !=-1)
      {
    addTab("javascript:masternuke()", "xóa mọi trang", "ca-delpages", "Xóa tất cả các trang", "");
    document.getElementById('ca-delpages').firstChild.innerHTML = '<strong><span style="color:darkred;">xóa mọi trang</span></strong>';
      }
  else if (document.title.indexOf('Xem và phục hồi lại trang đã bị xóa') != -1 && location.href.search(/&timestamp=|&action=submit/) ==-1)
      {
    addTab("javascript:checkall()", "Chọn tất cả", "ca-checkall", "Chọn tất cả các phiên bản đã xóa", "");
      }
  if (location.href.search(/&action=history|title=%C4%90%E1%BA%B7c_bi%E1%BB%87t:Nh%E1%BA%ADt_tr%C3%ACnh|title=%C4%90%E1%BA%B7c_bi%E1%BB%87t%3ANh%E1%BA%ADt_tr%C3%ACnh/) != -1)
    {addTab("javascript:number_count()", "#", "ca-numb", "Số sửa đổi", "");}
}

function number_count()
{
  if (!document.getElementsByTagName('ul')[0]) return;
  var l = document.getElementsByTagName('ul')[0].getElementsByTagName('li');
  if (l[0].innerHTML.indexOf('<strong>#1</strong> ') != -1) return;
  addTab("javascript:time_frame()", "@", "ca-frame", "Khung thời gian", "");
  for (var i=0; i < l.length; i++)
    {
    var c = i+1;
    l[i].innerHTML = '<strong>#' + c + '</strong> ' + l[i].innerHTML;
    }
}

function time_frame()
{
var range = prompt('Chọn hai con số làm khoảng sửa đổi.' + '\n' + 'Hãy dùng định dạng: X-Y.' + '\n' + '(ngày phải có dạng "09:12, ngày 11 tháng 3, 2008"  trong tùy chọn cá nhân)')
if (!range || range == '' || range.split('-').length != 2){return;}
var r1 = 1*range.split('-')[0];
var r2 = 1*range.split('-')[1];
var limit = r2 - r1 + 1;
var offset = r1 - 1;
// Logs can use offsets (and only offsets)
if (location.href.search(/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Nh%E1%BA%ADt_tr%C3%ACnh|%C4%90%E1%BA%B7c_bi%E1%BB%87t%3ANh%E1%BA%ADt_tr%C3%ACnh/) !=-1)
  {
  var URL = location.href.replace(/&offset=\d+/g,'').replace(/&limit=\d+/g,'') + '&offset=' + offset + '&limit=' + limit;
  location.href = URL;
  return;
  }
// Contribs use timestamps
 else if( wgPageName=="Đặc_biệt:Đóng_góp" && document.getElementById("contentSub")) 
 {
    var yearloc = getTimeOfContribsLI( r1-1 );
 }
// Histories uses linked timestamps
 else
 { 
    var yearloc = getTimeOfHistLI( r1-1 );
	alert(yearloc);
 }
// Parse
  LYear = retrieveYear(yearloc);
  LMval = retrieveMonth(yearloc);
  LMval = LMval.length==1 ? '0' + LMval : LMval;
  LDay = retrieveDay(yearloc);
  LTime = retrieveTime(yearloc).split(':')[0];
  var timestamp = LYear + '' + LMval + '' + LDay + '' + LTime + '59';
//target contribs
if( wgPageName=="Đặc_biệt:Đóng_góp" && location.href.indexOf('/w/index.php') !=-1 && document.getElementById("contentSub"))
  {var URL = location.href.replace(/&offset=\d+/g,'').replace(/&limit=\d+/g,'') + '&offset=' + timestamp + '&limit=' + limit;}
//implicit taget
else if( wgPageName=="Đặc_biệt:Đóng_góp" && location.href.indexOf('/w/index.php?') ==-1 && document.getElementById("contentSub"))
  {
  var user = location.href.split(wgServer)[1].split('/')[3];
  var URL = wgServer + '/w/index.php?title=Đặc_biệt:Đóng_góp&target=' + user + '&offset=' + timestamp + '&limit=' + limit;
  }
// history page
else if (location.href.indexOf('&action=history') !=-1)
  {
  var URL = wgServer + '/w/index.php?title=' + wgTitle + '&action=history&offset=' + timestamp + '&limit=' + limit;
  }
location.href = URL;
}

function masterlogview(number,type,name,ID,title)
{
    if (document.getElementById('contentSub'))
      {
    var c = document.getElementById('contentSub');
    var a = c.getElementsByTagName('a');
      }
    else
      {
    var c = document.getElementsByTagName('p')[0];
    var a = c.getElementsByTagName('a');
      }
    vandal = a[0].href;
    if (vandal.indexOf("Th%C3%A0nh_vi%C3%AAn:") !=-1)
       {vandal = vandal.split("Th%C3%A0nh_vi%C3%AAn:")[1];}
    else if (vandal.indexOf("Thảo luận Thành viên:") !=-1)
       {vandal = vandal.split("Thảo luận Thành viên:")[1];}
    else if (vandal.indexOf("Th%E1%BA%A3o_lu%E1%BA%ADn_Th%C3%A0nh_vi%C3%AAn:") !=-1)
       {vandal = vandal.split("Th%E1%BA%A3o_lu%E1%BA%ADn_Th%C3%A0nh_vi%C3%AAn:")[1];}
    if (vandal.indexOf("&action=") !=-1)
       {vandal = vandal.split("&action=")[0];}
    if (vandal.search(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) !==-1){return;}
//create URL
          if (type != 'creation')
          {
          URL = '/w/index.php?title=Đặc_biệt:Nhật_trình&type=' + type + '&user=' + vandal + '&page=&limit=' + number;
          }
          else if (type == 'creation')
          {
          URL = '/wiki/Đặc_biệt:Trang_mới?username=' + vandal + '&limit=' + number + '&namespace=all';
          }
   addTab(URL, name, ID, title, "");
}
//END

//////////////Auto-actions//////////////
function winclosed()
{
var body = document.getElementById('bodyContent');
//for master rollback for moves
 if (location.href.indexOf('&fakaction=masterfill') != -1 && document.title.indexOf('Di chuyển trang') != -1)
    {
    document.getElementById('wpReason').value = 'Lùi tự động di chuyển hàng loạt.';
    document.getElementById('movepage').submit();
    }
//for master rollback for image uploads
 else if (document.title.indexOf('Tập tin:')==0 && location.href.indexOf('&jsaction=ImagevandalRV&target=') !=-1)
  {
  var bad_user = unescape(location.href.split('&target=')[1].split('&')[0]);
  var reason = location.href.split('&reason=')[1].split('&')[0];
  var history_num = 1;
  var tables = body.getElementsByTagName('table');
  for (h=0; h<tables.length; h++)
  {
     if (tables[h].className == "filehistory" )
        {history_num = h; break;}
  }
  var history = body.getElementsByTagName('table')[history_num].getElementsByTagName('tr');
//check if user is the last contributor
// index 0 is the legend line
  if (history[1].innerHTML.indexOf('">' + bad_user + '</') == -1)
      {window.close(); return;}
//check if he is the only contributor
  var Delete = 1;
  for (var i=1; i<history.length; i++)
  	{
     if (history[i].innerHTML.indexOf('">' + bad_user + '</a> (') == -1)
         {
        var RV_linkURL = history[i].getElementsByTagName('a')[1].href;
        Delete = 0;
        if (RV_linkURL.indexOf('&wpEditToken=') ==-1) 
           {alert('Lỗi khi trích xuất!'); return;}
        RV_linkURL += '&jsaction=imagenuke&reason=' + reason;
        document.getElementById('contentSub').innerHTML = '<strong><span style="color:blue;">Đang lùi:</span> ' + RV_linkURL + '</strong>.';
        location.href = RV_linkURL;
        break;
         }
    }
//if user is the only contibutor
   if (Delete == 1)
    {
    var Delete_AllURL = history[1].getElementsByTagName('a')[0].href;
    if (Delete_AllURL.indexOf('&action=delete') ==-1)
        {alert('Lỗi khi trích xuất!'); return;}
    Delete_AllURL += '&jsaction=imagenuke&reason=' + reason;
    document.getElementById('contentSub').innerHTML = '<strong><span style="color:red;">Đang xóa:</span> ' + Delete_AllURL + '</strong>.';
    location.href = Delete_AllURL;
    }
  }
//for master rollback for images, last step
 else if (location.href.indexOf('&action=delete')!=-1 && location.href.indexOf('&jsaction=imagenuke&reason=') !=-1)
  {
  var reason = unescape(location.href.split('&reason=')[1].split('&')[0]);
  document.getElementById('wpReason').value = reason;
  var form = document.getElementsByTagName('form')[0].submit();
  form.submit();
  }
//for master rollback for images, last step
 else if (location.href.indexOf('&action=revert')!=-1 && location.href.indexOf('&jsaction=imagenuke&reason=') !=-1)
  {
  var reason = unescape(location.href.split('&reason=')[1].split('&')[0]);
  document.getElementById('wpComment').value = reason;
  var form = document.getElementsByTagName('form')[0].submit();
  form.submit();
  }
//for master delete for page creations
 else if (document.title.indexOf('Xóa “')==0 && location.href.indexOf('&action=delete&jsaction=nuke') !=-1)
    {
  var reason = unescape(location.href.split('&reason=')[1].split('&')[0]);
  document.getElementById('wpReason').value = reason;
  var form = document.getElementById('deleteconfirm');
  form.submit();
    }
 else if (document.title.indexOf('Xóa “')==0 && location.href.indexOf('&jsaction=RollbackDelete') !=-1)
  {
  if (document.getElementById('wpReason').value.length < 1)
  {document.getElementById('wpReason').value = 'Xóa trang thử nghiệm chỉ có 1 đóng góp.';}
  var form = document.getElementById('deleteconfirm');
  var message = 'Bạn có muốn xóa trang này vì nó chỉ có một tác giả?';
  var return_value = confirm(message);
  if (return_value == true) form.submit();
  }
// if vandal is only author, redirect to delete
  else if (document.title.indexOf('Không thể lùi lại') == 0 && document.innerHTML.indexOf(' người viết cuối cùng là tác giả duy nhất của trang này') != -1)
  {
  var article = location.href.split('?title=')[1].split('&action')[0];
  location.href = wgServer + '/w/index.php?title=' + article + '&action=delete&jsaction=RollbackDelete';
  }
// delinking images
  else if (location.href.indexOf('&jsaction=delinkimg&jstarget=') !=-1)
  {
  var image = unescape(location.href.split('&jstarget=')[1].split('&')[0]);
  var txtbox = document.editform.wpTextbox1;
  txtbox.value = txtbox.value.replace( new RegExp( toRegExp(image), 'gi' ), '' );
  document.editform.wpSummary.value = 'Bỏ liên kết đến tập tin [[:' + image + '|' + image + ']] đã bị xóa.';
  document.editform.submit();
  }
}
//////////////

function jswin_close()
{
//close JS action inputs
 if (document.title.search(/Đã thực hiện xong|Lỗi nội bộ/) ==0)
  {
  setTimeout('window.close()',1000);
  }
//close JS action inputs
 else if (document.title.indexOf('Di chuyển trang')==0)
  {
  if (document.getElementById('contentSub').innerHTML == 'Di chuyển thành công')
    {setTimeout('window.close()',1000);}
  }
}

function doMasterPurge()
{
var l = document.getElementById('bodyContent').getElementsByTagName('li');
for (var i=NEXT_INDEX; i < l.length; i++)
    {
    if (i == l.length-1) {setTimeout("window.location.reload()",20000);}
    var article = l[i].getElementsByTagName('a')[0].innerHTML;
    var URL = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + article + '&action=purge';
    l[i].innerHTML += ' (' + autopurgelink + ')';
	OPERATIONS[TASK_INDEX] = window.open(URL,'Masterpurge:' + article,'height=300,width=800,resizeable=yes,scrollbars=yes');
        setTimeout( "OPERATIONS[" + TASK_INDEX + "].close()", 1500);
        TASK_INDEX+=1; NEXT_INDEX=i+1;
        THREADS+=1;
        if (THREADS >= MAX_THREADS) {loadWhenReady(doMasterPurge); return;}
    }
}

GL_MRV_REASON='';
///////REVERT ALL EDITS///////
//UI entry point
function masterroll()
{
window.setConfirmTypes();
if (!document.getElementsByTagName('ul')[0]) {alert('Không tìm thấy sửa đổi.'); return;}
  z=0;
  var oldloc = location.href;
  var message = "Bạn có chắc chắn bạn muốn lùi tất cả các sửa đổi trên cùng do thành viên này thực hiện như tại trang này? Hãy chỉ dùng nó để lùi phá hoại hàng loạt bởi 1 thành viên hoặc địa chỉ IP." + "\n" + "Để quản lý số sửa đổi sẽ được lùi, xin hãy ghi số bài viết vào danh sách trước khi thực hiện tác vụ. Có thể bạn cũng muốn thay đổi độ lệch." + "\n" + "Hãy đóng tất cả các chương trình nếu số sửa đổi cần lùi là lớn, nếu không có thể xảy ra lỗi bộ nhớ. Nhấn OK để tiếp tục.";
  var return_value = confirm(message);  
  if (return_value == true)
   {
   var js_con_class = prompt("Xác nhận lần hai:" + "\n" + "Tất cả sửa đổi trên cùng của thành viên này sẽ bị lùi lại!" + "\n" + "Gõ mã xác nhận:");
     if (js_con_class == Rvaluejs_class)
      {
      document.getElementById('contentSub').innerHTML = "<strong>Tất cả các sửa đổi trên cùng của thành viên này đang được lùi lại. Trang này sẽ được tự động làm tươi sau 20 giây</strong>.";
      doMasterRollback();
      }
      else
      {
      alert("Hủy tác vụ."); return;
      }
   }
   else
   {
   alert("Hủy tác vụ."); return;
   }
}

function doMasterRollback()
{
var l = document.getElementById('bodyContent').getElementsByTagName('li');
for (var i=NEXT_INDEX; i < l.length; i++)
	{
    if (i == l.length-1){setTimeout("window.location.reload()",20000);}
    var t = l[i].innerHTML;
    // look only at top edits
    if (t.indexOf('<span class=\"mw-uctop\"> (') != -1)
    	{
    	var article = l[i].getElementsByTagName('a')[0].href.split('&')[0].split('title=')[1].replace(/[^\/]*\/\/[^\/]*/, '');
        var li_a = l[i].getElementsByTagName('a');
        for (k=3; k < li_a.length; k++)  
        	{
        	// look for rollback link
        	if (l[i].getElementsByTagName('a')[k].href.indexOf('&action=rollback') !=-1)
           		{
				var URL = l[i].getElementsByTagName('a')[k].href + '&bot=1';
				l[i].innerHTML += ' (' + cvrollbacklink + ')';
				OPERATIONS[TASK_INDEX] = window.open(URL,'Lùi hàng loạt:' + article,'height=300,width=800,resizeable=yes,scrollbars=yes');
setTimeout( "OPERATIONS[" + TASK_INDEX + "].close()", 1500);
        		TASK_INDEX+=1; NEXT_INDEX=i+1;
        		THREADS+=1;
        		if (THREADS >= MAX_THREADS) {loadWhenReady(doMasterRollback); return;}
				break;
          		}
         	}
        }
    }
}
///////

///////REVERT ALL MOVES///////
// UI entry point
function movemasterroll()
{
window.setConfirmTypes();
if (!document.getElementsByTagName('ul')[0]) {alert('Không tìm thấy di chuyển trang nào.'); return;}
  var oldloc = location.href;
  var message = "Bạn có chắc là bạn muốn lùi tất cả di chuyển trang của thành viên này không? Hãy chỉ dùng nó để lùi phá hoại hàng loạt do một thành viên hoặc IP gây ra." + "\n" + "Để quản lý số sửa đổi sẽ được lùi, xin hãy ghi số bài viết vào danh sách trước khi thực hiện tác vụ. Có thể bạn cũng muốn thay đổi độ lệch." + "\n" + "Hãy đóng tất cả các chương trình nếu số sửa đổi cần lùi là lớn, nếu không có thể xảy ra lỗi bộ nhớ. Nhấn OK để tiếp tục.";
  var return_value = confirm(message);
  if (return_value == true)
	{
    var Val_type = prompt("Xác nhận lần hai:" + "\n" + "Tất cả các di chuyển trên cùng của thành viên sẽ được lùi lại!" + "\n" + "Gõ mã xác nhận:");
    if (Val_type == Mvaluejs_class)
		{
		document.getElementById('contentSub').innerHTML = "<strong>Tất cả các di chuyển trên cùng đang được lùi lại. Trang này sẽ được tự động làm tươi sau 20 giây</strong>.";
    	doMoveMasterRollback();
		}
        else
        {
        alert("Hủy tác vụ.");
        return;
        }
 	}
    else
    {
    alert("Hủy tác vụ."); return;
    }
}

function doMoveMasterRollback()
{
var l = document.getElementById('bodyContent').getElementsByTagName('li');
//go in reverse over
//for (var i = l.length -1; i >= 0; i--)
for (var i=NEXT_INDEX; i < l.length; i++)
	{
    	if (i == l.length-1) {setTimeout("window.location.reload()",20000);}
    	var t = l[i].innerHTML;
    	if (t.indexOf('đổi thành') != -1)
    	{
    		var li_a = l[i].getElementsByTagName('a');
        	for (k = 1; k <li_a.length; k++) 
        	{
        	if (li_a[k].href.indexOf('&redirect=no') !=-1) {var article = li_a[k].href;}
            if (li_a[k].href.indexOf('title=%C4%90%E1%BA%B7c_bi%E1%BB%87t:Movepage&wpOldTitle=') != -1)
              	{
              	var URL = li_a[k].href + '&fakaction=masterfill';
              	l[i].innerHTML += ' (' + cvrollbacklink + ')';
              	OPERATIONS[TASK_INDEX] = window.open(URL,'MasterMoveRV:' + article,'height=300,width=800,resizeable=yes,scrollbars=yes');
        		TASK_INDEX+=1; NEXT_INDEX=i+1;
        		THREADS+=1;
        		if (THREADS >= MAX_THREADS) {loadWhenReady(doMoveMasterRollback); return;}
              	break;
              	}    
			}
    	}
	}
}
///////

///////DELETE ALL RECENT PAGE CREATIONS///////
//This can be used for general <li> list deletion in bodycontent
function masternuke()
{
window.setConfirmTypes();
if (document.getElementById('bodyContent').getElementsByTagName('li')[0] == undefined) {alert('Không tìm thấy trang nào được tạo ra.'); return;}
var oldloc = location.href;
var message = "Bạn có chắc là bạn muốn xóa tất cả các trang do thành viên này tạo ra không? Hãy chỉ dùng nó để lùi phá hoại hàng loạt do một thành viên hoặc IP gây ra." + "\n" + "Để quản lý số sửa đổi sẽ được lùi, xin hãy ghi số bài viết vào danh sách trước khi thực hiện tác vụ. Có thể bạn cũng muốn thay đổi độ lệch." + "\n" + "Hãy đóng tất cả các chương trình nếu số sửa đổi cần lùi là lớn, nếu không có thể xảy ra lỗi bộ nhớ. Nhấn OK để tiếp tục.";
var return_value = confirm(message);
if (return_value == true)
	{
	var Val_type = prompt("Xác nhận lần hai:" + "\n" + "Tất cả các trang được thành viên này tạo gần đây sẽ bị xóa!" + "\n" + "Gõ mã xác nhận:");
    if (Val_type == Rvaluejs_class)
    	{
		var reason = prompt("Gõ vào một lý do:");
		if (!reason || reason.length < 6){alert('Quá ngắn!'); return;}
    	document.getElementById('contentSub').innerHTML = "<strong>Tất cả các trang do thành viên tạo gần đây đang được xóa. Trang này sẽ được tự động làm tươi sau 20 giây</strong>.";
    	GL_MRV_REASON = reason;
		doMasterNuke();
   		}
    	else
    	{
    	alert("Hủy tác vụ."); return;
    	}
 	}
    else
    {
    alert("Hủy tác vụ."); return;
    }
}

function doMasterNuke()
{
var l = document.getElementById('bodyContent').getElementsByTagName('li');
for (var i=NEXT_INDEX; i < l.length; i++)
	{
    if (i == l.length-1){setTimeout("window.location.reload()",20000);}
    var article = l[i].getElementsByTagName('a')[0].innerHTML;
    var article_url = l[i].getElementsByTagName('a')[0].href;
    // don't delete already deleted pages
    if ( article_url.indexOf('&action=edit') ==-1) 
    	{
		var URL = wgServer + '/w/index.php?title=' + article + '&action=delete&jsaction=nuke&reason=' + escape(GL_MRV_REASON);
		l[i].innerHTML += ' (' + dvrollbacklink + ')';
		OPERATIONS[TASK_INDEX] = window.open(URL,'MasterNUKE:' + article,'height=700,width=700,resizeable=yes,scrollbars=yes');
		TASK_INDEX+=1; NEXT_INDEX=i+1;
        THREADS+=1;
        if (THREADS >= MAX_THREADS) {loadWhenReady(doMasterNuke); return;}
    	}
    }
}
///////

///////REVERT OR DELETE ALL IMAGE UPLOADS///////
//UI entry point
var unique_img_list = '|';
function masterdelete()
{
window.setConfirmTypes();
//are there any?
if (document.getElementsByTagName('ul')[0] == undefined) {alert('Không tìm thấy tập tin nào được tải lên.'); return;}
var oldloc = location.href;
var message = "Bạn có chắc bạn muốn lùi tất cả lần tải tập tin như tại trang này? Hãy chỉ dùng nó để lùi phá hoại hàng loạt do một thành viên hoặc IP gây ra." + "\n" + "Để quản lý số sửa đổi sẽ được lùi, xin hãy ghi số bài viết vào danh sách trước khi thực hiện tác vụ. Có thể bạn cũng muốn thay đổi độ lệch." + "\n" + "Hãy đóng tất cả các chương trình nếu số sửa đổi cần lùi là lớn, nếu không có thể xảy ra lỗi bộ nhớ. Nhấn OK để tiếp tục.";
var return_value = confirm(message);
if (return_value == true)
	{
	var Val_type = prompt("Xác nhận lần hai:" + "\n" + "Tất cả các lần tải tập tin của thành viên này sẽ được lùi lại!" + "\n" + "Gõ mã xác nhận:");
    if (Val_type == Uvaluejs_class)
    	{
    	var reason = prompt('Gõ vào lời giải thích:');
    	if (!reason || reason.length < 6) {alert('Quá ngắn!'); return;}
    	GL_MRV_REASON = reason;
    	document.getElementById('contentSub').innerHTML = "<strong>Tất cả các lần tải tập tin của thành viên đang được lùi lại. Trang này sẽ được tự động làm tươi sau 20 giây</strong>.";
      	doMasterImageDelete();
  		}
        else
        {
        alert("Hủy tác vụ."); return;
        }
	}
    else
    {
    alert("Hủy tác vụ."); return;
    }
}

function doMasterImageDelete()
{
var l = document.getElementById('bodyContent').getElementsByTagName('li');
var vandal = l[0].getElementsByTagName('a')[0].innerHTML;
for (var i=NEXT_INDEX; i < l.length; i++) 
    {
    if (i == l.length-1){setTimeout("window.location.reload()",30000);}
	//check for non-deleted images
    var li_a = l[i].getElementsByTagName('a');
    for (k=2; k <li_a.length; k++)  
    	{
        if (l[i].getElementsByTagName('a')[k].innerHTML.indexOf('Tập tin:') != -1 && 
		l[i].getElementsByTagName('a')[k].href.indexOf('&action=edit') == -1)
        	{
           	var name = l[i].getElementsByTagName('a')[k].innerHTML;
            if (unique_img_list.indexOf('|' + name + '|') ==-1)
				{
				unique_img_list += name + '|';
               	var URL = wgServer + '/w/index.php?title=' + name;
               	URL += '&jsaction=ImagevandalRV&target=' + escape(vandal) + '&reason=' + escape(GL_MRV_REASON);
               	l[i].innerHTML += ' (' + cvrollbacklink + ')';
               	OPERATIONS[TASK_INDEX] = window.open(URL,'MasterrollImages:' + name,'height=700,width=700,directories,resizeable,scrollbars');
				TASK_INDEX+=1; NEXT_INDEX=i+1;
        		THREADS+=1;
        		if (THREADS >= MAX_THREADS) {loadWhenReady(doMasterImageDelete); return;}
               	break;
               	}
            else {l[i].innerHTML += ' (<strong>cũ</strong>)';}
           }    
        }
     }
}
///////

////////////Backlog bar////////////
function adminbacklog()
{
  if (wgServer != "http://vi.wikipedia.org"){return;}
  if (window.ActiveXObject){return;}
  if (document.title.search(/(Thành viên:|Thảo luận Thành viên:|Thảo luận:|Sửa đổi )/) == 0){return;}
  gml_xmlhttp = HTTPClient();
  if (!gml_xmlhttp)
    return;
  var pageurl = '/w/index.php?title=%C4%90%E1%BA%B7c_bi%E1%BB%87t:WhatLinksHere&target=Ti%C3%AAu_b%E1%BA%A3n%3ABQV_ch%C3%BA_%C3%BD';
  gml_xmlhttp.open("GET", pageurl, true);
  gml_xmlhttp.onreadystatechange = adminbacklogbar;
  gml_xmlhttp.send(null);
}
//

//
function adminbacklogbar()
{
  if (gml_xmlhttp.readyState != 4)
    return;
  xml = gml_xmlhttp.responseText.split('Lấy từ “<a href=')[0].split('Lấy từ “<A href=')[0].split('<p>Các trang sau liên kết đến <b>')[1];
  var links = xml.split('" title="');
  var backlog = '';
for (i=0; i<links.length; i++)
  {
  var name = links[i].split('">')[0];
  if (links[i].split('</li>')[0].indexOf('(được nhúng vào)') != -1 && (name.indexOf('Wikipedia:') ==0 || name.indexOf('Thể loại:') ==0))
  {backlog += ', <a href="/wiki/' + name + '" title="' + name + '">' + name.replace('Wikipedia:','').replace('Thể loại:','') + '</a>';}
  }
backlog = backlog.replace(', ','');
if (backlog != '')
  {
  var message = '<div style="align: center; padding: .4em; font-size:9pt;">' + '<span style="color: darkred"><strong><a href="http://vi.wikipedia.org/wiki/Thể_loại:Việc_cần_Bảo_quản_viên_giải_quyết">Việc cần BQV</a>:</span></strong> ' + backlog + '</div>';
  var csub=document.getElementById("top");
  var msg=document.createElement("alog");
  msg.innerHTML = message;
  msg.className="backlog";
  csub.insertBefore(msg, csub.firstChild)
  }
}
////////////

////////////Wikipedia:WikiProject User scripts/Scripts/RBL check////////////
// This script adds an "[[DNSBL|RBL]] check" link to the toolbox on IP user/talk/contribs pages.  <pre><nowiki>

$(function () {
    var href = document.getElementById('t-contributions');
    if (href) href = href.getElementsByTagName('a');
    if (href) href = href[0];
    if (href) href = href.href;
    else href = window.location.href;

    var addr = /(\/wiki\/|[?&]title=)%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p(\/([^\/?&#]*)|[?&#]|$)/.exec(href);
    if (!addr) return;
    addr = addr[3];
    if (!addr) {
        addr = /^[^?#]*\?([^&#]*&)*target=([^&#]*)/.exec(href);
        if (!addr) return;
        addr = addr[2];
    }
    if (!/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/.test(addr)) return;

    addLink('p-tb', 'http://www.robtex.com/rbls/'+addr+'.html', 'Tra IP này', 't-rblcheck', 'Tra IP từ nhiều nguồn khu vực', null, 't-contributions');
});
////////////

/////////////////////////////////IP range contribs check/////////////////////////////////
//globals
var starting_IP_trunk = '';
var starting_IP_end = 0;
var IP_num_JS_count = 0;
var IP_num_JS_static = 0;
//

function IPRange_contribs_tab()
{
if (wgPageName=="Đặc_biệt:Đóng_góp" && location.href.search(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) != -1 && location.href.search(/\d{1,3}(@|%40)\d{1,2}/) == -1)
  {
  addTab("javascript:IPRange_contribs_query()", "Dải IP /24", "ca-range", "Kiểm tra dải IP vừa hoặc ngắn", "");
  }
}

//for /24 ranges
function IPRange_contribs_query()
{
if ( location.href.indexOf('/wiki/') !=-1 )
{var IP = location.href.split('/wiki/')[1].split('/')[1].split('/')[0];}
else
{var IP = location.href.split('&target=')[1].split('&')[0];}
var number = prompt('Liệt kê dải IP liên tục?' + '\n' + 'Dùng định dạng: X-Y' + '\n' + '(Dành cho cấm IP theo dải)');
if (!number || number=='' || number.split('-').length !=2){return;}
var start = 1*number.split('-')[0];
var end = 1*number.split('-')[1];
var count = end - start;
if (end > 255){end = 255;}
var IP = IP.split('.')[0] + '.' + IP.split('.')[1] + '.' + IP.split('.')[2] + '.' + start;
location.href = wgServer + '/w/index.php?&limit=1&target=' + IP + '@' + count + '&title=%C4%90%E1%BA%B7c_bi%E1%BB%87t%3A%C4%90%C3%B3ng_g%C3%B3p&namespace=';
}

function IPRange_contribs()
{
var body = document.getElementById('bodyContent');
//for /24 queries
if (location.href.search(/&target=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}%40\d{1,2}/) != -1 && location.href.indexOf('&title=%C4%90%E1%BA%B7c+bi%E1%BB%87t%3A%C4%90%C3%B3ng_g%C3%B3p') != -1)
  {
  var target = location.href.split('&target=')[1].split('&')[0];
  starting_IP_trunk = target.split('.')[0] + '.' + target.split('.')[1] + '.' + target.split('.')[2] + '.';
  var ending_num = target.split('%40')[1];
  starting_IP_end = target.split('.')[3].split('%40')[0];
//
  var IP_end_last_show = 1*starting_IP_end + 1*ending_num;
  var IP_start_show = starting_IP_trunk + starting_IP_end;
  var IP_last_show = starting_IP_trunk + IP_end_last_show;
  body.innerHTML = body.innerHTML.replace('Không tìm thấy thay đổi nào khớp với yêu cầu.','');
  document.getElementById('siteSub').innerHTML += "<br><strong>Đang kiểm tra đóng góp của dải IP từ <span style='color: darkblue'>" + IP_start_show + "</span> đến <span style='color: darkblue'>" + IP_last_show + "</span></strong>:";
  IPRange_contribs_XML();
  }
//for /24 UI
else if (location.href.search(/&target=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}@\d{1,2}/) != -1 && location.href.indexOf('&title=%C4%90%E1%BA%B7c_bi%E1%BB%87t%3A%C4%90%C3%B3ng_g%C3%B3p') != -1)
  {
  document.getElementById('siteSub').innerHTML += '<br><strong>Chọn một không gian tên và nhấn "Tìm" để kiểm tra các đóng góp của dải IP này. Tuy nhiên chỉ kiểm tra tới 20 sửa đổi mà thôi.</strong>';
  }
}

//
var offset_RC_index = 0;
var timestamp_RC_index = 0;
function RC_XML_contribs_range(upper_limit)
{
upper_limit_RC_range = upper_limit;
var body = document.getElementById('bodyContent');
body.innerHTML += '<ul></ul>';
RC_page_XML_range(0);
}

function RC_page_XML_range(offset_RC_index)
{
  document.getElementById('contentSub').innerHTML = "<strong>Checking last 5000 IP <i>recent changes</i> from timestamp '" + timestamp_RC_index + "' (" + offset_RC_index + "/" + upper_limit_RC_range + ")</strong>:";
  var namespace = '&namespace=';
  if (location.href.search(/&namespace=\d/) != -1)
    {namespace = '&namespace=' + location.href.split('&namespace=')[1].split('&')[0];}
//
  var URL = '/w/index.php?title=Đặc_biệt:Thay_đổi_gần_đây&hideliu=1&limit=5000' + namespace + '&from=' + timestamp_RC_index + '&useskin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = RC_page_XML_range_parse;
  xml_http.send(null);
}

function RC_page_XML_range_parse()
{
var body = document.getElementById('bodyContent');
   if (xml_http.readyState != 4)
  {return;}
  xml_rc_contribs_xml = xml_http.responseText;
  document.getElementById('contentSub').innerHTML = "<strong>Parsing <i>recent changes</i> XML...(" + offset_RC_index + "/" + upper_limit_RC_range + ")</strong>";
//timestamp
  if (xml_rc_contribs_xml.indexOf('/>Show new changes starting from <') !=-1)
    {timestamp_RC_index = xml_rc_contribs_xml.split('/>Show new changes starting from <')[1].split('from=')[1].split('"')[0].split('&')[0];}
  else
    {timestamp_RC_index = xml_rc_contribs_xml.split('name="from" value="')[1].split('"')[0];}
  timestamp_RC_index = timestamp_RC_index.substr(0,12) + '59';
//
  if (xml_rc_contribs_xml.indexOf('<ul class="special">') != -1)
    {xml_rc_contribs_xml = xml_rc_contribs_xml.split('<ul class="special">')[1].split('</ul>')[0];}
  var li_sections = xml_rc_contribs_xml.split('<li>');
  var last_index = li_sections.length-1;
  var rewrite = false;
  for (var i=1; i<li_sections.length; i++)
    {
    var html_li = li_sections[i].split('</li>')[0];
    if (html_li.search(ip_reg_RC_range) != -1)
    body.getElementsByTagName('ul')[0].innerHTML = '<li>' + html_li + '</li>' + body.getElementsByTagName('ul')[0].innerHTML;
    rewrite = true;
    }
  offset_RC_index = offset_RC_index + 1;
  if (offset_RC_index > upper_limit_RC_range)
    {
    document.getElementById('contentSub').innerHTML = "<strong>Done:<span style='color: blue'> edits retrieved.</span></strong>";
    if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
    return;
    }
  setTimeout("RC_page_XML_range()",600000);
  document.getElementById('contentSub').innerHTML = "<strong>Waiting 10 minutes for next XML request...(" + offset_RC_index + "/" + upper_limit_RC_range + ")</strong>";
//rewrite popups
  if (rewrite==true)
    {
    if( typeof(setupTooltips) !='undefined' ) 
       {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
       }
    }
  //RC_page_XML_range(offset_RC_index);
}

function IPRange_contribs_XML()
{
var body = document.getElementById('bodyContent');
  var namespace = '&namespace=';
  if (location.href.search(/&namespace=\d/) != -1)
  {namespace = '&namespace=' + location.href.split('&namespace=')[1].split('&')[0];}
  var target = location.href.split('&target=')[1].split('&')[0];
  if (target.indexOf('@') != -1)
  {var ending_num = target.split('@')[1];}
  else if (target.indexOf('%40') != -1)
  {var ending_num = target.split('%40')[1];}
  var current_num = 1*starting_IP_end + 1*IP_num_JS_count;
  if (IP_num_JS_count > ending_num)
  {
  document.getElementById('contentSub').innerHTML = "<strong>Đã xong:<span style='color: blue'> truy xuất sửa đổi.</span></strong>";
  edits_page_compared_js = 1;
  addTab("javascript:compare_contribs_range()", "Sosánh", "ca-comp", "So sánh", "");
  addTab("javascript:contribs_reset()", "tẩy", "ca-reset", "Quay lại đóng góp của dải IP", "");
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
  return;
  }
  if (current_num > 255)
  {
  document.getElementById('contentSub').innerHTML = "<strong><span style='color: darkred'>Số dải IP vượt quá 255, dừng truy vấn!</span></strong>";
  edits_page_compared_js = 1;
  addTab("javascript:compare_contribs_range()", "Sosánh", "ca-comp", "So sánh", "");
  addTab("javascript:contribs_reset()", "reset", "ca-reset", "Quay lại đóng góp của dải IP", "");
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
  return;
  }
  if (location.href.indexOf('%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p&target=') != -1)
  {
  var URL = location.href.split('%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p&target=')[0] + '%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p&target=' + starting_IP_trunk + current_num + namespace + '&limit=20';
  }
  else
  {
  var URL = '/w/index.php?title=%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p&target=' + starting_IP_trunk + current_num + namespace + '&limit=20';
  }
  document.getElementById('contentSub').innerHTML = "<strong>Đang kiểm tra: " + starting_IP_trunk + current_num + "</strong>";
  current_IP_name = starting_IP_trunk + current_num;
  IPRange_contribs_edits();
}

function IPRange_contribs_edits()
{
  var namespace = '&namespace=';
  if (location.href.search(/&namespace=\d/) != -1)
  {namespace = '&namespace=' + location.href.split('&namespace=')[1].split('&')[0];}
//
  document.getElementById('contentSub').innerHTML = "<strong>Đang tìm thông tin đóng góp của " + current_IP_name + " </strong>:";
  var URL = '/w/index.php?title=%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p&target=' + current_IP_name + namespace + '&limit=20&useksin=standard';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_contribs_ready;
  xml_http.send(null);
}

function parse_contribs_ready()
{
  if (xml_http.readyState != 4) return;
  xml_edits_user = xml_http.responseText;
  parse_contribs_xml();
}

function parse_contribs_xml()
{
var body = document.getElementById('bodyContent');
//parse edits
  if (xml_edits_user.indexOf('Không tìm thấy thay đổi nào khớp với yêu cầu.') ==-1 && xml_edits_user.indexOf('<ul>') !=-1)
  {
  var contribs = xml_edits_user.split('<ul>')[1].split('</ul>')[0];
  var current_num = 1*starting_IP_end + 1*IP_num_JS_count;
  body.innerHTML += '<p><strong><a href="/wiki/Đặc_biệt:Đóng_góp/' + current_IP_name + '">' + current_IP_name + '</a></strong></p>' + '<ul>' + contribs + '</ul>';
  }
  else
  {
  body.innerHTML += '<p><strong>' + current_IP_name + '</strong> <i>(không có đóng góp)</i></p>';
  }
  IP_num_JS_count += 1;
  IPRange_contribs_XML();
}
/////////////////////////////////

////////////////////Compare contribs////////////////////
function Compare_tab_add()
{
if (document.title.indexOf('Đóng góp của thành viên') == 0 && location.href.search(/\d{1,3}(@|%40)\d{1,2}/) == -1)
{addTab("javascript:compare_contribs()", "Sosánh", "ca-comp", "So sánh", "");}
}

//globals
username_contribs_comp = '';
username_contribs_comp2 = '';
//
function compare_contribs()
{
username_contribs_comp2 = prompt('So sánh với ai?' + '\n' + '*đối với 2000 sửa đổi cuối' + '\n' + '*không gian tên đã chọn' + '\n' + '*đối với 15 lần (bỏ) cấm cuối');
if (!username_contribs_comp2){return;}
username_contribs_comp = document.getElementById('contentSub').getElementsByTagName('a')[0].innerHTML;
if (username_contribs_comp == 'Thảo luận' && location.href.indexOf('&target=') != -1)
{username_contribs_comp = location.href.split('&target=')[1].split('&')[0];}
else if (username_contribs_comp == 'Thảo luận' && location.href.indexOf('/%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p/') != -1)
{username_contribs_comp = location.href.split('/%C4%90%E1%BA%B7c_bi%E1%BB%87t:%C4%90%C3%B3ng_g%C3%B3p/')[1];}
if (username_contribs_comp == username_contribs_comp2){alert('Không thể so sánh với cùng một người!'); return;}
  document.getElementById('contentSub').innerHTML += "<br><strong>Đang truy xuất nhật trình cấm và đóng góp dạng XML của thành viên...</strong>";
  var namespace = '';
//get namespace
  if (document.getElementById('namespace'))
    {
    var inputs = document.getElementById('namespace').getElementsByTagName('option');
    for (i=0; i<inputs.length; i++)
       {
       if (inputs[i].selected==true)
          {var namespace = '&namespace=' + inputs[i].value; break;}
       }
    } 
//
  var URL = '/w/index.php?title=Đặc_biệt:Đóng_góp&target=' + username_contribs_comp + namespace + '&limit=2000&useksin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_xml_contribs2;
  xml_http.send(null);
}

function parse_xml_contribs2()
{
  if (xml_http.readyState != 4)
  {return;}
  doc1_xml_contribs_xml = xml_http.responseText;
  var namespace = '';
//get namespace
  if (document.getElementById('namespace'))
    {
    var inputs = document.getElementById('namespace').getElementsByTagName('option');
    for (i=0; i<inputs.length; i++)
       {
       if (inputs[i].selected==true)
          {var namespace = '&namespace=' + inputs[i].value; break;}
       }
    } 
//
  var URL = '/w/index.php?title=Đặc_biệt:Đóng_góp&target=' + username_contribs_comp2 + namespace + '&limit=2000&useksin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_xml_comparecontribs_log;
  xml_http.send(null);
}

function compare_contribs_range()
{
username_contribs_comp2 = prompt('So sánh với ai?' + '\n' + '*đối với 2000 sửa đổi cuối' + '\n' + '*không gian tên hiện tại');
if (!username_contribs_comp2){return;}
username_contribs_comp = 'Dải IP đã chọn';
  document.getElementById('contentSub').innerHTML += "<br><strong>Đang truy xuất đóng góp dạng XML của thành viên khác...</strong>";
  var namespace = '';
  if (location.href.search(/&namespace=\d/) != -1)
     {var namespace = location.href.match(/&namespace=\d/)[0];}
  var URL = '/w/index.php?title=Đặc_biệt:Đóng_góp&target=' + username_contribs_comp2 + namespace + '&limit=2000&useksin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_xml_contribs_range;
  xml_http.send(null);
}

//cache
doc_js_ipcontribs_range_cache = '';
//
function parse_xml_contribs_range()
{
  if (xml_http.readyState != 4)
  {return;}
var body = document.getElementById('bodyContent');
  document.getElementById('contentSub').innerHTML += "<br><strong>Đang trích xuất đóng góp dạng XML của thành viên khác...</strong>";
  xml = xml_http.responseText;
  var doc2 = standard_XMLParse(xml);
  if (doc_js_ipcontribs_range_cache == '')
  {
  doc_js_ipcontribs_range_cache = body.innerHTML;
  }
  else
  {body.innerHTML = doc_js_ipcontribs_range_cache;}
  var doc1 = body;
//check for any contribs
  if (doc1.getElementsByTagName('li')[0] == undefined)
     {document.getElementById('contentSub').innerHTML += "<br><strong><span style='color: red'>Chú ý: Một trong những thành viên này không có đóng góp trong không gian tên này!</span></strong>"; return;}
  else if (doc2.getElementById('bodyContent').getElementsByTagName('li')[0] == undefined)
     {document.getElementById('contentSub').innerHTML += "<br><strong><span style='color: red'>Chú ý: Một trong những thành viên này không có đóng góp trong không gian tên này!</span></strong>"; return;}
//
  var l = doc1.getElementsByTagName('li');
  var name_list = '||';
  var list_common = '||';
  for (i=0; i<l.length; i++)
  {
    if (l[i].getElementsByTagName('a')[2] != undefined)
    {
    var name = l[i].getElementsByTagName('a')[2].innerHTML;
    name_list += name + '||';
    }
  }
  if (doc2.getElementsByTagName('ul')[0] != undefined)
  {
  var h = doc2.getElementById('bodyContent').getElementsByTagName('ul')[0].getElementsByTagName('li');
     for (i=0; i<h.length; i++)
     {
     var name = h[i].getElementsByTagName('a')[2].innerHTML;
     if (name_list.indexOf('||' + name + '||') != -1 && list_common.indexOf('||' + name + '||') == -1)
     {list_common += name + '||';}
     }
  }
//
  if (list_common == '||' || doc2.getElementsByTagName('ul')[0] == undefined)
  {
  document.getElementById('contentSub').innerHTML += "<br><strong>Đã xong:<span style='color: blue'> so sánh các sửa đổi của </span>" + username_contribs_comp + " <span style='color: blue'>và</span> " + username_contribs_comp2 + " <span style='color: blue'>đã xong.</span> (không trùng nhau)</strong>";
  var uls = body.getElementsByTagName('ul');
  for (i=0; i<uls.length; i++)
     {
     uls[i].innerHTML = '';
     }
  var ps = body.getElementsByTagName('p');
  for (i=1; i<ps.length; i++)
     {
     ps[i].innerHTML = '';
     }
  return;
  }
//
  var txt_add = '';
  var common_names = list_common.split('||');
  for (i=1; i< common_names.length-1; i++)
  {
  var pgname = common_names[i];
  var pglink = '<a href="/wiki/' + pgname + '" title="' + pgname + '">' + pgname + '</a>'; 
  txt_add += "<p><strong>Trang: " + pglink + "</strong></p><span style='color: purple'><p><strong>" + username_contribs_comp2 + "</strong></p></span><ul>";
     for (k=0; k<h.length; k++)
      {
      var name = h[k].getElementsByTagName('a')[2].innerHTML;
       if (name == pgname)
       {txt_add += '<li>' + h[k].innerHTML + '</li>';}
      }
   txt_add += "</ul><p><span style='color: darkred'><strong>" + username_contribs_comp + "</strong></span></p><ul>";
     for (k=0; k<l.length; k++)
      {
      if (l[k].getElementsByTagName('a')[2] != undefined)
        {
         var name = l[k].getElementsByTagName('a')[2].innerHTML;
         if (name == pgname)
         {txt_add += '<li>' + l[k].innerHTML + '</li>';}
        }
      }
      txt_add += '</ul>'
   }
//
  document.getElementById('contentSub').innerHTML += "<br><strong>Đã xong:<span style='color: blue'> so sánh các sửa đổi của </span>" + username_contribs_comp + " <span style='color: blue'>và</span> " + username_contribs_comp2 + " <span style='color: blue'>đã xong.</span></strong>";
  body.getElementsByTagName('ul')[0].innerHTML = '';
  var uls = body.getElementsByTagName('ul');
  for (i=0; i<uls.length; i++)
     {uls[i].innerHTML = '';}
  var ps = body.getElementsByTagName('p');
  for (i=1; i<ps.length; i++)
     {ps[i].innerHTML = '';}
  body.innerHTML += txt_add;
  edits_page_compared_js = 1;
  addTab("javascript:date_highlight()", "ngày", "ca-datem", "Tô sáng một ngày", "");
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
}

function contribs_reset()
{
var body = document.getElementById('bodyContent');
  if (doc_js_ipcontribs_range_cache == '')
  {
  doc_js_ipcontribs_range_cache = body.innerHTML;
  }
  else
  {body.innerHTML = doc_js_ipcontribs_range_cache;}
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
}

function parse_xml_comparecontribs_log()
{
  if (xml_http.readyState != 4)
  {return;}
  doc2_xml_contribs_xml = xml_http.responseText;
  var namespace = '';
  if (location.href.indexOf('&namespace=') !=-1)
    {namespace = location.href.split('&namespace=')[1].split('&')[0];}
  URL = '/w/index.php?title=Đặc_biệt:Nhật_trình&type=block&limit=15&page=Thành_viên%3A' + username_contribs_comp + '&useskin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_xml_comparecontribs_log2;
  xml_http.send(null);
}

function parse_xml_comparecontribs_log2()
{
  if (xml_http.readyState != 4)
  {return;}
  doc1_xml_log_xml = xml_http.responseText;
  URL = '/w/index.php?title=Đặc_biệt:Nhật_trình&type=block&limit=15&page=Thành_viên%3A' + username_contribs_comp2 + '&useskin=none';
  xml_http = HTTPClient();
  xml_http.open("GET", URL, true);
  xml_http.onreadystatechange = parse_xml_comparecontribs;
  xml_http.send(null);
}

function parse_xml_comparecontribs()
{
  if (xml_http.readyState != 4)
  {return;}
var body = document.getElementById('bodyContent');
  document.getElementById('contentSub').innerHTML += "<br><strong>Đang trích xuất nhật trình cấm và đóng góp dạng XML của các thành viên...</strong>";
  doc2_xml_log_xml = xml_http.responseText;
  var user1block_count = 0;
  var user2block_count = 0;
  var user1edit_count = 0;
  var user2edit_count = 0;
//
  var txt_add = '';
  if (doc1_xml_log_xml.indexOf('<ul>') != -1 || doc2_xml_log_xml.indexOf('<ul>') != -1)
  {
  txt_add += '<div style="background-color: #f9f9f9; border: 2px solid red; padding: 10px;">';
  txt_add += "<p><span style='color: red'><strong>Nhật trình cấm (20 lần cuối):</span></strong></p>";
  }
//
  if (doc2_xml_log_xml.indexOf('<ul>') != -1)
  {
  user2block_ul = '<ul>' + doc2_xml_log_xml.split('<ul>')[1].split('</ul>')[0] + '</ul>';
  user2block_count = user2block_ul.split('</a>) đã cấm "<a').length - 1;
  txt_add += "<p><span style='color: purple'><strong>" + username_contribs_comp2 + "</strong></span></p>";
  txt_add += user2block_ul;
  }
  if (doc1_xml_log_xml.indexOf('<ul>') != -1)
  {
  user1block_ul = '<ul>' + doc1_xml_log_xml.split('<ul>')[1].split('</ul>')[0] + '</ul>';
  user1block_count = user1block_ul.split('</a>) đã cấm "<a').length - 1;
  txt_add += "<p><span style='color: darkred'><strong>" + username_contribs_comp + "</strong></span></p><ul>";
  txt_add += user1block_ul;
  }
  if (doc1_xml_log_xml.indexOf('<ul>') != -1 || doc2_xml_log_xml.indexOf('<ul>') != -1)
  {
  txt_add += '</div><br style="clear:both;">';
  }
//
  txt_add += '<div style="background-color: #f9f9f9; border: 2px solid #8888aa; padding: 10px;">';
  txt_add += "<p><span style='color: darkblue'><strong>Các trang được sửa chung bởi</span> " + username_contribs_comp + " <span style='color: darkblue'>and</span> " + username_contribs_comp2 + "<span style='color: darkblue'>:</span></strong></p>";
//
  if (doc1_xml_contribs_xml.indexOf('<ul>') != -1)
  {user1edit_count = doc1_xml_contribs_xml.split('<ul>')[1].split('</ul>')[0].split('<li>').length - 1;}
  if (doc2_xml_contribs_xml.indexOf('<ul>') != -1)
  {user2edit_count = doc2_xml_contribs_xml.split('<ul>')[1].split('</ul>')[0].split('<li>').length - 1;}
//
  var blocklink = '<a href = "/w/index.php?title=Đặc_biệt:Nhật_trình&type=block&limit=20&page=Thành_viên%3A' + username_contribs_comp + '">lần cấm</a>';
  var blocklink2 = '<a href = "/w/index.php?title=Đặc_biệt:Nhật_trình&type=block&limit=20&page=Thành_viên%3A' + username_contribs_comp2 + '">lần cấm</a>';
//parse
  var doc1 = standard_XMLParse(doc1_xml_contribs_xml);
  var doc2 = standard_XMLParse(doc2_xml_contribs_xml);
//check for any contribs
  if (doc1.getElementById('bodyContent').getElementsByTagName('li')[0] == undefined)
     {document.getElementById('contentSub').innerHTML += "<br><strong><span style='color: red'>Chú ý: Một trong những thành viên này không có đóng góp trong không gian tên này!</span></strong>"; return;}
  else if (doc2.getElementById('bodyContent').getElementsByTagName('li')[0] == undefined)
     {document.getElementById('contentSub').innerHTML += "<br><strong><span style='color: red'>Chú ý: Một trong những thành viên này không có đóng góp trong không gian tên này!</span></strong>"; return;}
//compile a list of pages edited
  var User_talk1 = 'Thảo luận Thành viên:' + username_contribs_comp;
  var User_talk2 = 'Thảo luận Thành viên:' + username_contribs_comp2;
  var l = doc1.getElementById('bodyContent').getElementsByTagName('ul')[0].getElementsByTagName('li');
  var name_list = '||';
  var list_common = '||';
  var list_talkbyuser1 = '';
  var list_talkbyuser2 = '';
  var list_afdbyuser1 = '';
  var list_afdbyuser2 = '';
  for (i=0; i<l.length; i++)
  {
  var name = l[i].getElementsByTagName('a')[2].innerHTML;
  name_list += name + '||';
  if (name == User_talk2)
    {list_talkbyuser1 += '<li>' + l[i].innerHTML + '</li>';}
  else if (name.search(/.+ xoá bài|.+ phục hồi bài|.+ xóa tập tin/) ==0)
    {list_afdbyuser1 += '<li>' + l[i].innerHTML + '</li>';}
  }
//compile a list of pages edited in common (along with second talk page run)
  if (doc2.getElementsByTagName('ul')[0] != undefined)
  {
  var h = doc2.getElementById('bodyContent').getElementsByTagName('ul')[0].getElementsByTagName('li');
     for (i=0; i<h.length; i++)
     {
     var name = h[i].getElementsByTagName('a')[2].innerHTML;
     if (name_list.indexOf('||' + name + '||') != -1 && list_common.indexOf('||' + name + '||') == -1)
       {list_common += name + '||';}
     if (name == User_talk1)
       {list_talkbyuser2 += '<li>' + h[i].innerHTML + '</li>';}
     else if (name.search(/.+ xoá bài|.+ phục hồi bài|.+ xóa tập tin/) ==0)
       {list_afdbyuser2 += '<li>' + h[i].innerHTML + '</li>';}
     }
  }
//
  if (list_common == '||' || doc2.getElementsByTagName('ul')[0] == undefined)
  {
  document.getElementById('contentSub').innerHTML += "<br><strong>Đã xong:<span style='color: blue'> so sánh sửa đổi giữa</span> " + username_contribs_comp + " (<span style='color: blue'>dò qua " + user1edit_count + "</span>) (<span style='color: red'>" + user1block_count + "</span> " + blocklink + ") <span style='color: blue'>và</span> " + username_contribs_comp2 + " (<span style='color: blue'>dò qua " + user2edit_count + "</span>) (<span style='color: red'>" + user2block_count + "</span> " + blocklink2 + ") <span style='color: blue'>đã xong.</span> (không trùng)</strong>";
  body.getElementsByTagName('ul')[0].innerHTML = '';
  document.getElementsByTagName('p')[1].innerHTML = '';
  return;
  }
//return list of edits to pages in common
  var common_names = list_common.split('||');
  for (i=1; i< common_names.length-1; i++)
  {
  var pgname = common_names[i];
  var pglink = '<a href="/wiki/' + pgname + '" title="' + pgname + '">' + pgname + '</a>'; 
  txt_add += "<p><strong>Trang: " + pglink + "</p></strong><span style='color: purple'><strong><p>" + username_contribs_comp2 + "</strong></span></p><ul>";
     for (k=0; k<h.length; k++)
      {
      var name = h[k].getElementsByTagName('a')[2].innerHTML;
       if (name == pgname)
       {txt_add += '<li>' + h[k].innerHTML + '</li>';}
      }
   txt_add += "</ul><p><span style='color: darkred'><strong>" + username_contribs_comp + "</strong></span></p><ul>";
     for (k=0; k<l.length; k++)
      {
      var name = l[k].getElementsByTagName('a')[2].innerHTML;
       if (name == pgname)
       {txt_add += '<li>' + l[k].innerHTML + '</li>';}
      }
      txt_add += '</ul>'
   }
  txt_add += '</div><br style="clear:both;">';
//talk edit parsing
  if (list_talkbyuser1 != '' || list_talkbyuser2 != '')
     {
     txt_add += '<div style="background-color: #f9f9f9; border: 2px solid darkgreen; padding: 10px;">';
     txt_add += "<p><strong><span style='color: darkgreen'>Giao tiếp thảo luận thành viên</span></strong></p>";
     }
  if (list_talkbyuser2 != '')
     {
     txt_add += "<p><strong><span style='color: purple'>Sửa đổi của</span> " + username_contribs_comp2 + "<span style='color: purple'> vào trang thảo luận của</span> " + username_contribs_comp + "</strong></span></p><ul>" + list_talkbyuser2 + "</ul>";
     }
  if (list_talkbyuser1 != '')
     {
     txt_add += "<p><strong><span style='color: darkred'>Sửa đổi của</span> " + username_contribs_comp + "<span style='color: darkred'> vào trang thảo luận của</span> " + username_contribs_comp2 + "</strong></span></p><ul>" + list_talkbyuser1 + "</ul>";
     }
  txt_add += '</div><br style="clear:both;">';
//AFD parsing
  if (list_afdbyuser1 != '' && list_afdbyuser2 != '')
     {
     txt_add += '<div style="background-color: #f9f9f9; border: 2px solid #FF6600; padding: 10px;">';
     txt_add += "<p><strong><span style='color: #FF6600'>Sửa đổi vào trang xóa</span></strong></p>";
     txt_add += "<p><strong><span style='color: purple'>" + username_contribs_comp2 + "</span></strong></p><ul>" + list_afdbyuser2 + "</ul>";
     txt_add += "<p><strong><span style='color: darkred'>" + username_contribs_comp + "</span></strong></p><ul>" + list_afdbyuser1 + "</ul>";
     }
  txt_add += '</div><br style="clear:both;">';
//Finish
  document.getElementById('contentSub').innerHTML += "<br><strong>Đã xong:<span style='color: blue'> so sánh sửa đổi giữa</span> " + username_contribs_comp + " (<span style='color: blue'>dò qua " + user1edit_count + "</span>) (<span style='color: red'>" + user1block_count + "</span> " + blocklink + ") <span style='color: blue'>và</span> " + username_contribs_comp2 + " (<span style='color: blue'>dò qua " + user2edit_count + "</span>) (<span style='color: red'>" + user2block_count + "</span> " + blocklink2 + ") <span style='color: blue'>đã xong.</span></strong>";
  body.getElementsByTagName('ul')[0].innerHTML = '';
  document.getElementsByTagName('p')[1].innerHTML = '';
  body.innerHTML += txt_add;
  edits_page_compared_js = 1;
  addTab("javascript:date_highlight()", "ngày", "ca-datem", "Tô sáng một ngày", "f");
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
}
////////////////////
function date_highlight()
{
var body = document.getElementById('bodyContent');
if (!body.getElementsByTagName('li')[0]){return;}
var date = prompt('Cái này sẽ tô sáng một ngày cụ thể.' + '\n' + 'Nhập vào ngày:' + '\n' + '(ví dụ: "August 7, 2006")');
if (!date){return;}
var l = body.getElementsByTagName('li');
  for (var i=0; i<l.length; i++)
  {
  l[i].innerHTML = l[i].innerHTML.replace(/<span style="background-color:.+"><i>(.+)<\/i><\/span>/i,'$1');
  if (l[i].innerHTML.split('(<a href="')[0].indexOf(date) !=-1)
    {l[i].innerHTML = '<span style="background-color: #FFFFCC"><i>' + l[i].innerHTML + '</i></span>';}
  }
  if( typeof(setupTooltips) !='undefined' ) 
  {
       body.ranSetupTooltipsAlready=false;
       setupTooltips(body);
  }
}

function blockhist()
{
  if (location.href.search(/%C4%90%E1%BA%B7c_bi%E1%BB%87t:(Nh%E1%BA%ADt_tr%C3%ACnh\/block|C%E1%BA%A5m_IP)|&type=block/) !=-1)
  {
  var ul = document.getElementById('bodyContent').getElementsByTagName('ul')[0];
  if (!ul || !ul.getElementsByTagName('li')[0]){return;}
  var l = ul.getElementsByTagName('li');
//admin or sysop viewing this?
  if (l[0].innerHTML.indexOf('">cấm</a>)') ==-1){return;}
//unblock links
  if (location.href.search(/&page=[^&]/) ==-1)
     {
     for (var i=0; i<l.length; i++)
       {
         if (l[i].getElementsByTagName('a')[4])
         {
     var name = l[i].getElementsByTagName('a')[4].innerHTML;
     l[i].innerHTML = '(<a href="/w/index.php?title=Đặc_biệt%3ANhật_trình&type=block&page=Thành_viên:' + name + '">lịch sử</a>) (<a href="/w/index.php?title=Đặc_biệt%3AIPBlockList&action=search&limit=&ip=' + name + '">tình trạng</a>) ' + l[i].innerHTML;
         }
       }
     }
  else
     {
     var name = l[0].getElementsByTagName('a')[4].innerHTML;
     l[0].innerHTML = '(<a href="/w/index.php?title=Đặc_biệt%3AIPBlockList&action=search&limit=&ip=' + name + '">tình trạng</a>) ' + l[0].innerHTML;
     }
  }
}

//options
$(SA_main_functions)
function SA_main_functions()
{
jswin_close();
blockhist();
winclosed();
addmasterroll();
Compare_tab_add();
IPRange_contribs_tab();
IPRange_contribs();
autoPurgeTab();
if (wgPageName == "Đặc_biệt:Thể_loại_cần_thiết" || wgPageName == "Đặc_biệt:Thay_đổi_gần_đây")
{adminbacklog();}
}
//

window.getTimeOfHistLI = function(li)
{
	var the_time = '';
	var l = document.getElementById('bodyContent').getElementsByTagName('li')[li];
	var la = l.getElementsByTagName('a');
	
	for (k = 0; k < la.length; k++)
	{
		if( la[k].href.indexOf('oldid=') !=-1 && la[k].href.indexOf('diff=') ==-1 ) {
			the_time = la[k].innerHTML;
			break;
		}
	}
	return the_time;
}

window.getTimeOfContribsLI = function(li)
{
var the_time = document.getElementsByTagName('li')[li].innerHTML.split(' (<a href="')[0].split('(<A href="')[0].split('> ')[1];
return the_time;
}

//END</nowiki>