プロジェクト:ウィキ技術部/スクリプト開発/trunk/LiveRC.js

///if(typeof (liveRCInit) == "undefined") {

**LiveWP**
Documentation : :fr:User:EDUCA33E/LiveRC/Documentation
*Author : :fr:User:EDUCA33E
*Dev & enhancements : :fr:User:TiChou, :pl:User:Leafnode, :it:User:Jalo & :fr:User:Nakor & :fr:User:Arkanosis
*Version: 0.3.9 (beta)
*/
// 各ウィキごとの個別設定 Wiki specific translation;
// /////////////////////
var lang_category = 'Category:';
var lang_category_short = '（カテゴリ？）';
var lang_category_short_tip = 'カテゴリのない記事';
var lang_main_namespace = '記事';
var lang_special_contrib = '特別:投稿記録';    //Special:Contributions
var lang_special_Log     = '特別:ログ';        //Special:Log
var lang_special_block   = '特別:投稿ブロック';  //Special:Block
var lang_special_move    = '特別:移動';       //Special:Move
var lang_special_wlhere  = '特別:リンク元';       //Special:WhatLinksHere
var lang_special_Centralauth　= '特別:アカウント統一管理';//Special:Centralauth

/=== Variables globales**

*/
//Script works only at page Wikipedia:LiveRC or User:UserName/LiveRC or User:EDUCA33E/LiveRC
if (wgPageName == "Wikipedia:LiveRC" 
wgPageName == wgFormattedNamespaces2 +":"+ wgUserName +"/LiveRC" 
wgPageName == wgFormattedNamespaces2 +":EDUCA33E/LiveRC") {
importStylesheetURI('http://ja.wikipedia.org/w/index.php?title=User:Was_a_bee/LiveRC.css' +'&action=raw&ctype=text/css&dontcountme=s');
// 基本的な動作設定

var refresh = 3;//更新頻度。秒で指定。
var lrcRCAPILimit = 10;//APIで一回に読み込むログの最大値。更新頻度とプロジェクトごとの編集速度との兼ね合いで決める。
var lrcRCLimit       = 50;      // 表示されるリストの最大個数。これ以上のログは消える
var lrcPreviewHeight = '300px'; // LiveRC default preview window height;
var lrcAutoCloseDiff = 0;       // LiveRC default Diff behaviour;
var lrcTZ            = '+09:00';// デフォルトのタイムゾーン指定 (+02:00, 02:00, -0200, -05:45, ...)
var RCfontsize       = '85%';   // フォントサイズの指定 (85%, 10pt, ...); 

// デフォルトのチェックボックスの指定
var lrcShowBotChecked   = ;   // change to 'checked' to hide Bot by default
var lrcShowIPChecked   = ;   // change to 'checked' to show only IPs by default
//var lrcShowIPNEWChecked   = ;   // change to 'checked' to show only IPs and non-patrolled by default (sysops only)
var lrcShowRCChecked   = 'checked';   // change to 'checked' to hide recent changes by default
var lrcShowLogChecked   = 'checked';   // change to 'checked' to show logs by default
var lrcShowFilterChecked   = 'checked';   // change to 'checked' to show filters by default

// 会話ページに送信するテンプレートのデフォルト設定
// ////////////////////////////
var lstAvert = 
{ template: "Test0"               , string: "Test0"     , hasPage: false , sign: '--~~~~'  },
{ template: "Test1"               , string: "Test1"     , hasPage: false , sign: '--~~~~'  },
{ template: "Test2"               , string: "Test2"     , hasPage: false , sign: '--~~~~'  },
{ template: "Test3"               , string: "Test3"     , hasPage: false , sign: '--~~~~'  },
{ template: "Test4"               , string: "Test4"     , hasPage: false , sign: '--~~~~'  },
{ template: "Spam"                , string: "Spam"      , hasPage: false , sign: '--~~~~'  },
{ template: "Sign"                , string: "Sign"      , hasPage: false , sign: '--~~~~'  },
{ template: "Preview"             , string: "Preview"   , hasPage: false , sign: '--~~~~'  },
{ template: "Welcome"             , string: "Welcome"   , hasPage: false , sign:         }
;

// 記事に貼り付けるテンプレートのデフォルト設定
// ////////////////////////////
var lstTagging = 
{ template: "即時削除2/全般1"                , string: "CSD#全般1 意味不明な内容のページ"           , descr: "WP:CSD#全般1 意味不明な内容のページ"            , needPara: },
{ template: "即時削除2/全般2"                , string: "CSD#全般2 テスト投稿"                    , descr: "WP:CSD#全般2 テスト投稿"                     , needPara: },
{ template: "即時削除2/全般3"                , string: "CSD#全般3 荒らしもしくはいたずら"             , descr: "WP:CSD#全般3 荒らしもしくはいたずら"               , needPara: },
{ template: "即時削除2/全般4"                , string: "CSD#全般4 宣伝・広告"                   , descr: "WP:CSD#全般4 宣伝・広告"                     , needPara: '宣伝・広告的な理由'},
{ template: "即時削除2/全般5"                , string: "CSD#全般5 改善なき再作成"                , descr: "WP:CSD#全般5 削除されたページの改善なき再作成"      , needPara: '過去の削除依頼へのリンク'},
{ template: "即時削除2/全般6"                , string: "CSD#全般6 ウィキペディア内のコピペ"            , descr: "WP:CSD#全般6 ウィキペディア内のコピペによる作成"        , needPara: 'コピペ元ページ'},
{ template: "即時削除2/全般8"                , string: "CSD#全般8 投稿者希望/初版立項者による白紙化" , descr: "WP:CSD#全般8 投稿者希望または初版立項者による白紙化"  , needPara: },
{ template: "即時削除2/記事1"                , string: "CSD#記事1 定義なし"                     , descr: "WP:CSD#記事1 定義なし"                       , needPara: '定義なしと言える理由'},
{ template: "即時削除2/記事2"                , string: "CSD#記事2 言語間リンク・カテゴリ・外部リンクのみ"    , descr: "WP:CSD#記事2 言語間リンク・カテゴリ・外部リンクのみ"      , needPara: },
{ template: "即時削除2/リダイレクト1-1"          , string: "CSD#リダイレクト1-1 関係のないページへのリダイレクト"　　, descr: "WP:CSD#リダイレクト1-1 直接関係のないページへのリダイレクト", needPara: },
{ template: "即時削除2/リダイレクト1-2"          , string: "CSD#リダイレクト1-2 単純な書き誤り"       　　　　 , descr: "WP:CSD#リダイレクト1-2 単純な書き誤り" 　　　          , needPara: '書き誤り部分'},
{ template: "即時削除2/リダイレクト2-1"          , string: "CSD#リダイレクト2-1 半角と全角の使い分け違反" 　　　 , descr: "WP:CSD#リダイレクト2-1 半角と全角の使い分け違反"      , needPara: '違反部分'},
{ template: "即時削除2/リダイレクト2-2"          , string: "CSD#リダイレクト2-2 作品名を鍵括弧等でくくったもの"  , descr: "WP:CSD#リダイレクト2-2 作品名を鍵括弧等でくくったもの"    , needPara: },
{ template: "即時削除2/リダイレクト2-3"          , string: "CSD#リダイレクト2-3 読み等の併記"        　　　　 , descr: "WP:CSD#リダイレクト2-3 読み等の併記" 　　　           , needPara: },
{ template: "即時削除2/リダイレクト2-4"          , string: "CSD#リダイレクト2-4 範囲外の文字"       　　　　  , descr: "WP:CSD#リダイレクト2-4 UnicodeのBMP範囲外文字の使用", needPara: '違反部分'},
{ template: "即時削除2/リダイレクト2-5"          , string: "CSD#リダイレクト2-5 曖昧さ回避括弧の使い方違反"   , descr: "WP:CSD#リダイレクト2-5 曖昧さ回避括弧の使い方違反"    , needPara: '違反部分'},
{ template: "即時削除2/リダイレクト2-6"          , string: "CSD#リダイレクト2-6 漢字表記人名の姓名間の空白"  , descr: "WP:CSD#リダイレクト2-6 漢字表記人名の姓名間の空白"   , needPara: },
{ template: "即時削除2/リダイレクト3-1"          , string: "CSD#リダイレクト3-1 改名提案後の移動の残骸"     , descr: "WP:CSD#リダイレクト3-1 改名提案後の移動の残骸"      , needPara: '改名提案へのリンク'},
{ template: "即時削除2/リダイレクト3-2"          , string: "CSD#リダイレクト3-2 移動依頼後の移動の残骸"     , descr: "WP:CSD#リダイレクト3-2 移動依頼後の移動の残骸"      , needPara: '移動依頼へのリンク'},
{ template: "即時削除2/リダイレクト4"            , string: "CSD#リダイレクト4 移動の残骸(投稿者自分のみ)"   , descr: "WP:CSD#リダイレクト4 唯一の投稿者による移動の残骸で本人依頼", needPara: },
{ template: "即時削除2/リダイレクト5"            , string: "CSD#リダイレクト5 改名提案後のノートの残骸"      , descr: "WP:CSD#リダイレクト5 改名提案を経た移動に伴うノートの残骸" , needPara: '改名提案へのリンク'},
{ template: "即時削除2/ファイル1-2"            , string: "CSD#ファイル1-2 コモンズと重複（コピー）"          , descr: "WP:CSD#ファイル1-2 コモンズと重複（コピー）"          , needPara: 'コモンズのファイル名'},
{ template: "即時削除2/ファイル1-3"            , string: "CSD#ファイル1-3 コモンズと重複（他プロジェクト由来）"  , descr: "WP:CSD#ファイル1-3 コモンズと重複（他プロジェクト由来）"  , needPara: 'コモンズのファイル名'},
{ template: "即時削除2/ファイル1-4"            , string: "CSD#ファイル1-4 コモンズと重複（同一投稿者）"      , descr: "WP:CSD#ファイル1-4 コモンズと重複（同一投稿者）"     , needPara: 'コモンズのファイル名'},
{ template: "即時削除2/ファイル1-5"            , string: "CSD#ファイル1-5 コモンズへ移動"               , descr: "WP:CSD#ファイル1-5 コモンズへ移動"               , needPara: 'コモンズのファイル名'},
{ template: "即時削除2/ファイル3"              , string: "CSD#ファイル3 重複ファイル"                  , descr: "WP:CSD#ファイル3 重複ファイル"                    , needPara: '重複先のファイル名'},
{ template: "即時削除2/ファイル5"              , string: "CSD#ファイル5 出典やライセンス不明のまま1週間経過" , descr: "WP:CSD#ファイル5 出典やライセンス不明のまま1週間経過"    , needPara: '利用者‐会話:〇〇'},
{ template: "即時削除2/ファイル6"              , string: "CSD#ファイル6 自由な利用ができない"           , descr: "WP:CSD#ファイル6 自由な利用ができない"               , needPara: '利用が出来ない根拠'},
{ template: "即時削除2/ファイル7"              , string: "CSD#ファイル7 コモンズのファイルページ"           , descr: "WP:CSD#ファイル7 コモンズのファイルページ"               , needPara: },
{ template: "即時削除2/ファイル8"              , string: "CSD#ファイル8 存在しないファイルのページ"         , descr: "WP:CSD#ファイル8 存在しないファイルのページ"              , needPara: },
{ template: "即時削除2/カテゴリ1"              , string: "CSD#カテゴリ1 初版からリダイレクト"             , descr: "WP:CSD#カテゴリ1 初版からリダイレクト"                 , needPara: },
{ template: "即時削除2/カテゴリ2"              , string: "CSD#カテゴリ2 明らかな誤字脱字"              , descr: "WP:CSD#カテゴリ2 明らかな誤字脱字"                 , needPara: '誤字脱字部分'},
{ template: "即時削除2/カテゴリ3"              , string: "CSD#カテゴリ3 私的カテゴリ"                 , descr: "WP:CSD#カテゴリ3 私的カテゴリ"                      , needPara: },
{ template: "即時削除2/カテゴリ4"              , string: "CSD#カテゴリ4 リダイレクト2と同等のページ名の誤り"    , descr: "WP:CSD#カテゴリ4 リダイレクト2と同等のページ名の誤り"     , needPara: },
{ template: "即時削除2/カテゴリ5"              , string: "CSD#カテゴリ5 改名提案により使用されなくなったカテゴリ" , descr: "WP:CSD#カテゴリ5 改名提案により使用されなくなったカテゴリ" , needPara: '改名提案へのリンク'},
{ template: "即時削除2/利用者ページ1"          , string: "CSD#利用者ページ1 本人希望"                , descr: "WP:CSD#利用者ページ1 本人希望"                  , needPara: },
{ template: "即時削除2/利用者ページ2"          , string: "CSD#利用者ページ2 登録されていない利用者のページ"  , descr: "WP:CSD#利用者ページ2 登録されていない利用者のページ"   , needPara: },
{ template: "即時削除2/利用者ページ3"          , string: "CSD#利用者ページ3 非ログイン利用者のページ"     , descr: "WP:CSD#利用者ページ3 非ログイン利用者のページ"         , needPara: },
{ template: "保護"                         , string: "保護テンプレート"                       　 , descr: "保護テンプレート" 　　　                              , needPara: },
{ template: "半保護"                        , string: "半保護テンプレート"       　　           　　 , descr: "半保護テンプレート" 　　　                             , needPara: },
{ template: "移動保護"                      , string: "移動保護テンプレート"       　          　　　 , descr: "移動保護テンプレート"         　　　                     , needPara: },
{ template: "subst:nld"                   , string: "ライセンス不明の画像"       　          　　　 , descr: "ライセンス不明の画像"         　　　                     , needPara: },
{ template: "ISP"                         , string: ""       　                　　　 , descr: "ISP"         　　　                                , needPara: 'ISP名|host=ホスト名'},
{ template: "subst:Sakujo"                , string: ""       　         　 , descr: "削除依頼タグ"         　　　                          , needPara: },
{ template: "subst:Sakujo}}

/ 

**Utilities**

*/
var wpajax = {
http: function(bundle) {
// mandatory: bundle.url
// optional:  bundle.async
// optional:  bundle.method
// optional:  bundle.headers
// optional:  bundle.data
// optional:  bundle.onSuccess (xmlhttprequest, bundle)
// optional:  bundle.onFailure (xmlhttprequest, bundle)
// optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
var xmlhttp;
try {
xmlhttp = new XMLHttpRequest(); 
} catch(e) { 
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) { 
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
xmlhttp = false
}
}
}

if (xmlhttp) {
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4)
wpajax.httpComplete(xmlhttp,bundle);
};
xmlhttp.open(bundle.method ? bundle.method : "GET",bundle.url,bundle.async == false ? false : true);
if (bundle.headers) {
for (var field in bundle.headers)
xmlhttp.setRequestHeader(field,bundle.headersfield);
}
xmlhttp.send(bundle.data ? bundle.data : null); 
}
return xmlhttp;
},

httpComplete: function(xmlhttp,bundle) {
if (xmlhttp.status == 200 
xmlhttp.status == 302) {
if (bundle.onSuccess)
bundle.onSuccess(xmlhttp,bundle);
} else if (bundle.onFailure) {
bundle.onFailure(xmlhttp,bundle);
} else {
// A activer en debug mode ?
// alert(xmlhttp.statusText);
}
}
};

///////////////////////////////////////////////////////////////////////////////
// * Recherche d'un élement dont on connait l'Id mais non unique, donc sans utiliser document.getElementById()
// Thanks to Dr Brains

function getElementWithId( elementId , elementTagName , elementParentNode ){
if(!elementParentNode) elementParentNode = document; 
if (elementParentNode.getElementById) return elementParentNode.getElementById(elementId);

var TheElement = false;
var Elements = elementParentNode.getElementsByTagName(elementTagName);
var elementcount = 0;
while(elementcount' +
+ lang_menu0.IPNEW  + ' ';
*/

var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );
lvPreviewFoot.innerHTML = 'X | ' +
'X ' +
'X ' +
'X ' +
'X' +
+
+ lang_menu0.PAUSE   +  +
	//' • ' +
// +
// + lang_menu0.PREVIEW +  +
// +
//+ lang_menu0.LOWDIFF +  +
	' • ' +
+
+ lang_menu0.LISTS   +  +
	' • ' +
+
+ lang_menu0.NOBOTS  +  + 
+
+ lang_menu0.IPONLY  + ' ' +
//showIPNEWbox +
	' • ' +
+
+ lang_menu0.RCLABEL  + ' ' +
+
+ lang_menu0.LOGSHOW  + ' ' +
+
+ lang_menu0.ABSHOW  + ' • ' +
;

if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;

liveSysop();
}

// Parser
if (window.DOMParser) var gml_xmlparser = new DOMParser();

function gml_XMLParse(string) {
if (window.DOMParser) {
return gml_xmlparser.parseFromString(string, "text/xml");
} else if (window.ActiveXObject) {
var gml_xmldoc = new ActiveXObject("Microsoft.XMLDOM");
gml_xmldoc.async = "false";
ret = gml_xmldoc.loadXML(string);      
if (!ret)
return null;
return gml_xmldoc.documentElement;
}
return null;
}

// HTMLize
String.prototype.htmlize = function() {
var chars = new Array('&',,'"');
var entities = new Array('amp','lt','gt','quot');
var string = this;
for (var i=0; i to  
//This code is come from MediaWiki:Gadget-exlinks.js
/*function set_livePreview_link(LP) {
	var alinks = LP.getElementsByTagName('a');
	var title;
var tablink;
	
for (var i = 0, leng = alinks.length; i 


**LivePage**

*/
//渡されたアドレスまたはウィキテキストを解析する関数。
//渡される値は、"en:Tokyo tower", "メインページ", "http://....."など多彩。基本的にURLかウィキリンクの二重四角括弧の内側〇〇
function linkAddressParser(page) {
var pagename = page;
var targetUrl = wgServer + wgArticlePath.replace("$1","") + page;
var extlink = false;//外部リンクかどうかを入れる変数

if (page.match(/^:?(a-zA-Z*?):(.*)/)) {//言語間リンクかどうか、を判定。
	//先頭がプロトコルであるか、または言語間リンクでなければ中断
	if (!(RegExp.$1.toLowerCase() == 'http') && (typeof(ArrayIWsRegExp.$1.toLowerCase()) != 'undefined')){
		targetUrl = ArrayIWsRegExp.$1.toLowerCase() + RegExp.$2;//URLを作成
		if (!(RegExp.$1.toLowerCase().match(wgServer))){//別プロジェクトであれば 外部リンクフラグをオン
			extlink = true;
		}
	}
}

if (page.match(/^http:/) && extlink == false){//先頭がプロトコルで
	targetUrl = page;
	if (!(page.match(wgServer))){//ドメインが閲覧中のプロジェクトでなければ 外部リンクフラグをオン
		extlink = true;
	}
}

if (page.match(/&action=(a-z*)/)){//action指定のあるURLで
	targetUrl = page;	
	if (RegExp.$1　== 'delete' 
RegExp.$1　== 'protect' 
RegExp.$1　== 'edit' ){//削除、保護、編集、の場合は 外部リンクフラグをオン
		extlink = true;
	}
}

//http://ja.wikipedia.org/wiki/ABC の形のURLを処理してページ名を取得
if (targetUrl.match( wgServer + wgArticlePath.replace("$1","") + '(^?&*)')){
	pagename = RegExp.$1;
}

//http://ja.wikipedia.org/w/*****title=ABC**** の形のURLを処理してページ名を取得
if (targetUrl.match( wgServer + wgScriptPath + '/.*title=(^?&*).*')){
	pagename = RegExp.$1;
}


//以下、URLを元に名前空間を同定して、プレフィックス以降の部分を抽出する処理を行う（例:「利用者:ウィキ助」→「ウィキ助」）
var match_result, match_sp_result, ns, nsFinal, liveTitle, liveCore, liveType;
var isPage, isArticle, isUser, isIP, isSpecial;

match_result = pagename.match(/^(^:+):(.*)/); //ページ名を:(コロン)で区切って、どこの名前空間かを判別する。
//もしコロンで区切られていて、接頭辞一覧に当てはまったなら
if (match_result && typeof(wgNamespaceIdsmatch_result1.toLowerCase()) != 'undefined'){
	ns = wgNamespaceIdsmatch_result1.toLowerCase();//空間の番号を入れる
} else {
	ns = 0;//それ以外なら標準名前空間
}
if (match_result && ns != 0 && ns != 1 && ns != -1 ) {//標準名前空間とそのノート、および特別以外の場合
		liveTitle = pagename;//wgFormattedNamespaces mainNSsns  + ':' +match_result2;
		liveCore = match_result2;		
		isPage = true;
		nsFinal = ns;
		if (nsFinal == 2 
nsFinal == 3) isUser = true;
	} else if (ns == -1){//特別ページの場合。現状対応してるのはログ、投稿記録、リンク元のどれか。
		isSpecial = true;
		if (match_sp_result = pagename.match(wgFormattedNamespaces-1+':'+lang_menu0.LOG)) {//「特別:ログ」の場合
		
		} else if (match_sp_result = pagename.match(lang_special_contrib+'/(.*)')) {//「特別:投稿記録/利用者名」の場合
			liveTitle = wgFormattedNamespaces2+':'+match_sp_result1;
			liveCore = match_sp_result1;
			nsFinal = 2;
			isUser = true;
			liveType = 'contrib';　
		} else if (match_sp_result = pagename.match(lang_special_Centralauth+'/(.*)')) {//「特別:アカウント統一管理/利用者名」の場合
			liveTitle = wgFormattedNamespaces2+':'+match_sp_result1;
			liveCore = match_sp_result1;
			nsFinal = 2;
			isUser = true;
		} else if (match_sp_result = pagename.match(wgFormattedNamespaces-1+':'+lang_menu0.WLHERE+'/(^:+)(:(.*))?')) {//「特別:リンク元/ページ名」の場合
			if (match_sp_result3 && typeof(wgNamespaceIdsmatch_sp_result1.toLowerCase()) != 'undefined'){
				liveTitle = match_sp_result1+match_sp_result2;
				liveCore = match_sp_result3;
				nsFinal = wgNamespaceIdsmatch_sp_result1.toLowerCase();
			} else {
				liveTitle = match_sp_result1;
				liveCore = match_sp_result1;
				nsFinal = 0;		
			}
		}
	} else if (match_result && ns == 1){//標準名前空間のノートの場合
		liveTitle = match_result2;
		liveCore = match_result2;
		isPage = true;
		nsFinal = 1;
	} else  {//それ以外、つまり標準名前空間の場合
		liveTitle = pagename;
		liveCore = pagename;
		isPage = true;
		isArticle = true;
		nsFinal = 0;
	}
	
	if ( targetUrl.match(/&diff=(\&*)/))//URLが差分の場合 next, cur, prev
		liveType = 'diff';//変数にdiffを格納
		
	if ( isUser ){//もし対象ページが利用者系ページなら（例：利用者-会話、投稿記録、など）
		if ( liveCore.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) ){//IPアドレスかどうかを判定。一致すればIP。しなければアカウント。
			isIP = true;
		} else {
			isIP = false;
		}
	}
	
	var Link = new Array();
	Link'pagename'  = pagename;
	Link'targetUrl' = targetUrl;
	Link'extlink'   = extlink;
	Link'ns'        = ns;
	Link'nsFinal'   = nsFinal;
	Link'liveTitle' = liveTitle;
	Link'liveCore'  = liveCore;
	Link'liveType'  = liveType;
	Link'isPage'    = isPage;
	Link'isArticle' = isArticle;
	Link'isUser'    = isUser;
	Link'isIP'      = isIP;
	Link'isSpecial' = isSpecial;
	
	return Link;
}

function liveTitleButtonUpdater(Link){//タイトルやボタンの表示をアップデートする為の関数
	if ( Link.liveType == 'diff' && !Link.extlink){//URLが差分の場合 next, cur, prev
		wpajax.http({url:Link.targetUrl, onSuccess: getlivePage, Link: Link});//差分を読み込み、旧版と投稿者を解析して、差し戻しボタンを作成
	} else if (!Link.extlink){//それ以外の場合で、外部リンクでない場合は、ページ名を元にボタンを作成して表示
		var optAvert = "";
		var userMessageSelecter = "";
		if ( (Link.nsFinal ==2 
Link.nsFinal ==3) && Link.liveType != 'history'){//利用者ページ、利用者会話ページ、投稿記録、などの場合、メッセージ送信ボタンを作成
			var optl = lstAvert.length;
			for (j=0; j'+lstAvertj.string+;
			}
			userMessageSelecter = //メッセージ送信ボタン用のhtml
			+lang_menu0.AVERTS+' : ' +
			 + optAvert + ;
		}
		
		var optTagging = "";
		var taggingTagSelecter = "";
		if ( Link.ns != -1 && Link.liveType != 'contrib' && Link.liveType != 'history' && Link.liveType != 'diff'){//タグ貼りつけボタンを作成
			var optl = lstTagging.length;
			for (j=0; j'+lstTaggingj.string+;
			}
			taggingTagSelecter = //タグ貼りつけボタン用のhtml
			+lang_menu0.TAGGING+' : ' +
			 + optTagging +  + 
			' : ';
		}
		
		var elt = document.getElementById( 'sublivePreviewTitle' );
		/		var relatedLinks = ;
		if (Link.ns != -1 ){ //特別ページでなく、履歴でもなく、履歴、リンク元、ログ、といったリンクを作成
		relatedLinks = 	' ('
				 　		+ +lang_menu0.HIST+
						+ ' • '+lang_menu0.LOG+
						+ ' • '+lang_menu0.WLHERE+
						+ ')';
		}
		*/
		elt.innerHTML=　　 +
						' '+lang_menu0.GO+;
						//+Link.pagename+ + relatedLinks;
		
		//利用者情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		var userInfol = lstUserInfo.length;
		var j, userlink;
		for (j=0; j' + elt.innerHTML +  +
		 + taggingTagSelecter + ' ' +userMessageSelecter  + ;
		tagSelecterChanged();//オプション欄の有効無効を判定して、内容を変化させる
	}　else if (Link.extlink){
		//外部のサイト（別の言語版、別プロジェクト、外部サイト）の場合。 Javascriptの same origin policy のためページの操作、情報の取得ができない
		var elt = document.getElementById( 'sublivePreviewTitle' );
		elt.innerHTML=　　 +
						' '+lang_menu0.GO+;
						//+lang_menu0.EXT_SITE+;
		//利用者情報関連の外部サイトリンクのボタンを全て無効化し、色を変える
		var userInfol = lstUserInfo.length;
		var j, userlink;
		for (j=0; j';
	
	//もし表示領域が非表示なら、表示する
	if (dLP.style.display == "none") {
		var elcb = document.getElementById( 'shidPrev' );
		elcb.checked="true";
		dLP.style.display = "inline";
	}
	//ボタンやタイトル表示をアップデートする
	liveTitleButtonUpdater(Link); //onloadと合わせて二回実行されてしまう。対策考え中

}
var currentInfo = { type: "", id : ""};
//情報リンクがクリックされたときに、フレームにURLを読み込んで表示するための関数
function loadliveExtPage(type, arg, number){
	var frmHTML = "";
	var dfrmLP = document.getElementById( 'pagedivLivePreview' );　
	
	if (type == "user") {
		var userlink = document.getElementById('UserInfoChk'+number);
		if (userlink.style.fontWeight == "bold"){
			dfrmLP.innerHTML = ;
			userlink.style.fontWeight = "normal";
			currentInfo.type = "";
			currentInfo.id = "";
		} else {
			frmHTML = ;
			dfrmLP.innerHTML = frmHTML;
			userlink.style.fontWeight = "bold";
			if (currentInfo.type != ""){
				//alert(currentInfo.type + " " + currentInfo.id + " " +currentInfo.type+'InfoChk'+currentInfo.id);
				document.getElementById(currentInfo.type+'InfoChk'+currentInfo.id).style.fontWeight = "normal";
			}
			currentInfo.type = "User";
			currentInfo.id = number;
		}
	} else if (type == "page") {
		var pagelink = document.getElementById('PageInfoChk'+number);
		if (pagelink.style.fontWeight == "bold"){
			dfrmLP.innerHTML = ;
			pagelink.style.fontWeight = "normal";
			currentInfo.type = "";
			currentInfo.id = "";
		} else {
			frmHTML = ;
			dfrmLP.innerHTML = frmHTML;
			pagelink.style.fontWeight = "bold";
			if (currentInfo.type != ""){
				//alert(currentInfo.type + " " + currentInfo.id + " " +currentInfo.type+'InfoChk'+currentInfo.id);
				document.getElementById(currentInfo.type+'InfoChk'+currentInfo.id).style.fontWeight = "normal";
			}
			currentInfo.type = "Page";
			currentInfo.id = number;
		}
	}
	
	if (dfrmLP.style.display == "none") {
		dfrmLP.style.display = "inline";
		//document.getElementById( 'pageInfoCheck' ).checked = true;　
	}
	
}
	
function loadedlivePage(){
	var Link = new Array();
	var href;
	try{	//フレーム内のページが外部サイトの場合、ここでエラーが発生するので、下のcatch部分に移動
		href = document.getElementById('previewfrm').contentWindow.document.location.href;// フレームで表示されてるページのURLを取得
	}catch( e ){
		//外部サイトの場合 same origin policy によりURLを取得できないので、ここに来る。
		Link'extlink'   = true;  // 外部リンクフラグを立てて、
		liveTitleButtonUpdater(Link);//タイトルとボタンのアップデートを行う。
		return;//これで終了
	}
	
	Link = linkAddressParser(decodeURIComponent(href));//URLを解析してページ、名前空間等々を取得
	liveTitleButtonUpdater(Link);//タイトルとボタンのアップデートを行う。
}
function getlivePage(xmlreq, data) {//表示ページが差分だった場合のみ呼び出される。xmlreqの中に差分ページのhtmlコードが入っている。これを元に投稿者と差し戻すべき版のIDを取得する。
doc = gml_XMLParse(xmlreq.responseText);  
/  
bC  = getElementWithId('bodyContent', 'div', doc);
if (bC ==  null) bC  = getElementWithId('article', 'div', doc);
var LP = document.getElementById( 'livePreview' );
var dLP = document.getElementById( 'divLivePreview' );
LP.innerHTML = bC.innerHTML;
if (LP.innerHTML == "undefined") LP.innerHTML = bC.xml;

*/
//set_livePreview_link(LP);
/*if (dLP.style.display == "none") {
var elcb = document.getElementById( 'shidPrev' );
elcb.checked="true";
dLP.style.display = "inline";
} */ 
/  var mainNSs={//各名前空間の主となる名前空間を取得
"-2": 6,//"メディア", 
"-1": -1,//"特別", 
"0": 0, 
"1": 0,//"ノート", 
"2": 2,//"利用者", 
"3": 2,//"利用者‐会話", 
"4": 4,//"Wikipedia", 
"5": 4,//"Wikipedia‐ノート", 
"6": 6,//"ファイル", 
"7": 6,//"ファイル‐ノート", 
"8": 8,//"MediaWiki", 
"9": 8,//"MediaWiki‐ノート", 
"10": 10,//"Template", 
"11": 10,//"Template‐ノート", 
"12": 12,//"Help", 
"13": 12,//"Help‐ノート", 
"14": 14,//"Category", 
"15": 14,//"Category‐ノート", 
"100": 100,//"Portal", 
"101": 100,//"Portal‐ノート", 
"102": 102,//"プロジェクト", 
"103": 102,//"プロジェクト‐ノート"
}
var talkNSs={//各名前空間のノート空間を取得
"-2": 7,//"メディア", 
"-1": -1,//"特別", 
"0": 1, 
"1": 1,//"ノート", 
"2": 3,//"利用者", 
"3": 3,//"利用者‐会話", 
"4": 5,//"Wikipedia", 
"5": 5,//"Wikipedia‐ノート", 
"6": 7,//"ファイル", 
"7": 7,//"ファイル‐ノート", 
"8": 9,//"MediaWiki", 
"9": 9,//"MediaWiki‐ノート", 
"10": 11,//"Template", 
"11": 11,//"Template‐ノート", 
"12": 13,//"Help", 
"13": 13,//"Help‐ノート", 
"14": 15,//"Category", 
"15": 15,//"Category‐ノート", 
"100": 101,//"Portal", 
"101": 101,//"Portal‐ノート", 
"102": 103,//"プロジェクト", 
"103": 103,//"プロジェクト‐ノート"
}
*/
var Link = data.Link
var pagename = Link.pagename;
var url = data.url;  
var match_result, match_sp_result, ns, nsFinal,liveTitle, liveCore, liveType;
/  match_result = pagename.match(/^(^:+):(.*)/); //ページ名を:(コロン)で区切って、どこの名前空間かを判別する。
//もしコロンで区切られていて、接頭辞一覧に当てはまったなら
if (match_result && typeof(wgNamespaceIdsmatch_result1.toLowerCase()) != 'undefined'){
	ns = wgNamespaceIdsmatch_result1.toLowerCase();//空間の番号を入れる
} else {
	ns = 0;//それ以外なら標準名前空間
}
	
if (match_result && ns != 0 && ns != 1 && ns != -1 ) {//標準名前空間とそのノート、および特別以外の場合
		liveTitle = wgFormattedNamespaces mainNSsns  + ':' +match_result2;
		liveCore = match_result2;
		nsFinal = ns;
	} else if (ns == -1){//特別ページの場合。現状対応してるのはログ、投稿記録、リンク元のどれか。
		if (match_sp_result = pagename.match(wgFormattedNamespaces-1+':'+lang_menu0.LOG)) {//「特別:ログ」の場合
		
		} else if (match_sp_result = pagename.match(lang_special_contrib+'/(.*)')) {//「特別:投稿記録/利用者名」の場合
			liveTitle = wgFormattedNamespaces2+':'+match_sp_result1;
			liveCore = match_sp_result1;
			nsFinal = 2;
			liveType = 'contrib';
		} else if (match_sp_result = pagename.match(wgFormattedNamespaces-1+':'+lang_menu0.WLHERE+'/(^:+)(:(.*))?')) {//「特別:リンク元/ページ名」の場合
			if (match_sp_result3 && typeof(wgNamespaceIdsmatch_sp_result1.toLowerCase()) != 'undefined'){
				liveTitle = match_sp_result1+match_sp_result2;
				liveCore = match_sp_result3;
				nsFinal = wgNamespaceIdsmatch_sp_result1.toLowerCase();
			} else {
				liveTitle = match_sp_result1;
				liveCore = match_sp_result1;
				nsFinal = 0;		
			}
		}
	} else if (match_result && ns == 1){//標準名前空間のノートの場合
		liveTitle = match_result2;
		liveCore = match_result2;
		nsFinal = 1;
	} else  {//それ以外、つまり標準名前空間の場合
		liveTitle = pagename;
		liveCore = pagename;
		nsFinal = 0;
	}
	
	if ( url.match(/&action=(a-z*)/)){//action指定のあるURLで
		if (RegExp.$1　== 'history' ){//履歴の場合
			liveType = 'history';
		}
	}
*/
	var revertReasonSelecter = "";
	if ( url.match(/&diff=(\&*)/)){//URLが差分の場合 next, cur, prev
		//liveType = 'diff';
		
		var diff_oldid = getElementWithId('mw-diff-otitle1', 'div', doc);
		if (diff_oldid != null) {//左側の版 oldid を取得
			var difftmp=diff_oldid.innerHTML;
			if (!difftmp) difftmp=diff_oldid.firstChild.xml;
			diff_oldid = difftmp.replace(new RegExp(/.*.*.*/g), "$1");
			diff_oldid = diff_oldid.replace(new RegExp(/(.*)&oldid=(\d*)(.*)?>/g), "$2");
			
		}
		    // Get username of submitter
		var user1 = getElementWithId('mw-diff-otitle2', 'div', doc);
		if (user1 != null) {
			var usertmp=user1.innerHTML;
			if (!usertmp) usertmp=user1.firstChild.xml;
			user1 = usertmp.replace(new RegExp(/(.*)(.*)\((.*)\)/g), "$2");
			user1 = user1.replace(new RegExp(/(.*)/g), "$1");
		}
		
		var user2 = getElementWithId('mw-diff-ntitle2', 'div', doc);
		if (user2 != null) {
			var usertmp=user2.innerHTML;
			if (!usertmp) usertmp=user2.firstChild.xml;
			user2 = usertmp.replace(new RegExp(/(.*)(.*)\(" + lang_messages.SAME_EDITOR + " ";
		}
		var optAvert = "";
		var optl = lstAvert.length;
		for (j=0; j'+lstAvertj.string+;
		}
		revertReasonSelecter = identique +		
		 + lang_menu0.UNDORC+' • ' +
		lang_menu0.REASON+' :  ••• ' +
		+lang_menu0.AVERTS+' : ' +
		 + optAvert + ;
	}

var elt = document.getElementById( 'sublivePreviewTitle' );
elt.innerHTML =  +
' '+lang_menu0.GO+;
//+ +Link.pagename+;
/  + ' ('
+ +lang_menu0.HIST+
+ ' • '+lang_menu0.LOG+
+ ' • '+lang_menu0.WLHERE+
+ ')';
*/
	
elt.innerHTML =  + elt.innerHTML +  +
+ revertReasonSelecter + ;

		//利用者情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		var userInfol = lstUserInfo.length;
		var j, userlink;	
		
		if ( user2.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) ){//投稿者がIPアドレスかどうかを判定。一致すればIP。しなければアカウント。
			Link.isIP = true;
		} else {
			Link.isIP = false;
		}
	
		for (j=0; j

function getLiveTagging(page) {
var link = document.getElementById('LiveTaggingLink');
link.href = "javascript:;";
link.style.color = "silver";
link.style.cursor = "default";
link.style.textDecoration = "none";
document.getElementById('tagging').disabled = true;
var message = document.getElementById('tagging').value;
wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(page) + '&action=edit',
onSuccess: postLiveTagging,
page: page, message: message });
}

function postLiveTagging(xmlreq, data) {
var parser = new DOMParser();
var doc = parser.parseFromString(xmlreq.responseText, 'application/xhtml+xml');

var page = data.page;
var message = data.message.replace(new RegExp(/\\'/g),"'");

var inputs = doc.getElementById('editform').getElementsByTagName('input');
var editform = new Array();
for (i=0; i
/=== LiveSysop**

*/

function liveSysop() {
wpajax.http({url:wgServer + wgScriptPath + '/api.php?action=query&list=allusers&augroup=sysop&aulimit=' +lrcAPIlimit +'&format=xml', 
onSuccess: getSysop, message: "Traitement en cours...\n\n" });
}

function getSysop(xmlreq, data) {
var api = xmlreq.responseXML.getElementsByTagName('api')0;

if (api.firstChild.nodeName == "error") return;

var rcs = api.getElementsByTagName('query')0.getElementsByTagName('allusers')0.getElementsByTagName('u');

leni=rcs.length;
for (i=leni-1; i>=0; i--) {

lstSysop.push(rcsi.getAttribute('name'));

}
liveNS();
}

function liveWatch() {
wpajax.http({url:wgServer + wgScriptPath + '/api.php?action=query&list=watchlistraw&wrlimit=' +lrcAPIlimit +'&format=xml', 
onSuccess: getWatch, message: "Traitement en cours..." });
}

function getWatch(xmlreq, data) {
var api = xmlreq.responseXML.getElementsByTagName('api')0;

if (api.firstChild.nodeName == "error") return;

var rcs = api.getElementsByTagName('watchlistraw')0.getElementsByTagName('wr');

leni=rcs.length;
for (i=0; i' + ns + ;
lstNs.push(id);
} 
options = '*' + options;
document.getElementById('selectNS').innerHTML = +lang_menu0.NAMESP+' ' + options + ;

liveInterWiki();
}
function liveInterWiki() {
wpajax.http({url: wgServer + wgScriptPath + '/api.php?action=query&meta=siteinfo&siprop=interwikimap&format=xml', 
onSuccess: getInterWiki, message: "Pobieranie nazw przestrzeni" });
}
var ArrayIWs;
function getInterWiki(xmlreq, data) {
var api = xmlreq.responseXML;

if (api.firstChild.nodeName == "error") return;

var iws = api.getElementsByTagName('query')0.getElementsByTagName('interwikimap')0.getElementsByTagName('iw');
var len = iws.length;
var i;
var iw,url;
var tempArrayIWs = new Array();

for (i=0; i


**LiveRC**

*/

function supprLigne(quelLigne) {
var i,len;
var tab = document.getElementById('tabRC');
// IE automatically inserts a TBODY that we have to take care of
if (tab.firstChild && (tab.firstChild.nodeName == "TBODY")) tab=tab.firstChild;
var els = new Array();
if (quelLigne == '*')
els = tab.getElementsByTagName('tr');
else if (quelLigne == 'd') {
var _els = tab.getElementsByTagName('tr');
len = _els.length;
for (i=len-1; i>=0; i--)
if (_elsi.firstChild.style.backgroundColor == 'rgb(255, 250, 205)')
els.push(_elsi);
} else if (quelLigne == 'r') {
var _els = tab.getElementsByTagName('tr');
len = _els.length;
for (i=len-1; i>=0; i--)
if (_elsi.firstChild.style.backgroundColor == 'rgb(255, 228, 225)')
els.push(_elsi);
} else if (quelLigne == 'n') {
var _els = tab.getElementsByTagName('tr');
len = _els.length;
for (i=len-1; i>=0; i--)
if (_elsi.firstChild.style.backgroundColor == 'rgb(226, 242, 210)')
els.push(_elsi);
} else if (quelLigne == 'c') {
var _els = tab.getElementsByTagName('tr');
len = _els.length;
for (i=len-1; i>=0; i--)
if (_elsi.firstChild.style.backgroundColor == 'white')
els.push(_elsi);
} else
els.push(document.getElementById(quelLigne));
len = els.length;
for (i=len-1; i>=0; i--)
if (elsi != null)
tab.removeChild(elsi);
}

function changeLigne(quelLigne) {
var el = document.getElementById(quelLigne);
var els1 = el.getElementsByTagName('th');
var els2 = el.getElementsByTagName('td');
var len = els1.length;
for (var i=len-1; i>=0; i--)
if (els1i != null)
els1i.style.backgroundColor = "#FFFACD";
var len = els2.length;
for (var i=len-1; i>=0; i--)
if (els2i != null)
els2i.style.backgroundColor = "#FFFFE0"; 
}

function getElementsByClass(searchClass,node,tag) {
var classElements = new Array();
if ( node == null )
node = document;
if ( tag == null )
tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
for (i = 0, j = 0; i -';
var udiscut  = +lang_tooltips.TALK_SHORT+;
var ucontrib = +lang_tooltips.CONTRIB_SHORT+;
var uadmin   = ;
if (lrcAdmin == true) {
uadmin = ' • '+lang_tooltips.BLOCK_SHORT+;
}
var ueditor  = +user+;
var ligne =  + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • ' + ueditor + ;
tempAr.push(ligne);
}
tempAr.sort();
var lvHidden = document.getElementById('liveHidden');
lvHidden.innerHTML = "";
var len = tempAr.length;
for (var n=len-1; n>=0; n--)
lvHidden.innerHTML += tempArn;
}

function updateFollowContact() {
var tempAr = new Array();
for (var user in lstContact2) {
var timestamp = lstContact2user.ts;
if (timestamp == 0) continue;
var utilde = user.replace(new RegExp(/\'/g), "\\'");
var udiscut  = +lang_tooltips.TALK_SHORT+;
var ucontrib = +lang_tooltips.CONTRIB_SHORT+;
var uadmin   = ;
if (lrcAdmin == true) {
uadmin = ' • '+lang_tooltips.BLOCK_SHORT+;
}
var ueditor  = +user+;
var ligne =  + tsToHhMm(timestamp) + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • ' + ueditor + ;
tempAr.push(ligne);
}
tempAr.sort();
var lvContact = document.getElementById('liveContact');
lvContact.innerHTML = "";
var len = tempAr.length;
for (var n=len-1; n>=0; n--)
lvContact.innerHTML += tempArn;
}

function updateFollowRevoc() {
var tempAr = new Array();
for (var user in lstRevoc) {
var timestamp = lstRevocuser.ts;
var utilde = user.replace(new RegExp(/\'/g), "\\'");
var uremove = '-';
var udiscut  = +lang_tooltips.TALK_SHORT+;
var ucontrib = +lang_tooltips.CONTRIB_SHORT+;
var uadmin   = ; 
if (lrcAdmin == true) {
uadmin = ' • '+lang_tooltips.BLOCK_SHORT+;
}
var ueditor  = +user+;
var ligne =  + tsToHhMm(timestamp) + ' • ' + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • ' + ueditor + ' (' + lstRevocuser.nb + ' '+lang_menu0.XTIMES+')';
tempAr.push(ligne);
}
tempAr.sort();
var lvRevoc = document.getElementById('liveRevoc');
lvRevoc.innerHTML = "";
var len = tempAr.length;
for (var n=len-1; n>=0; n--)
lvRevoc.innerHTML += tempArn;
}

function removeRevoc(name) {
delete lstRevocname;
updateFollowRevoc();
}


//function getRevision(xmlreq, data) {
function getRevision(rc) {
if (document.getElementById('stopLive').checked) return;

//  var api = xmlreq.responseXML.getElementsByTagName('api')0;
//
//  if (api.firstChild.nodeName == "error") return;

var match;

//  var rc = data.rc
var title = rc.title;
var pageid = rc.pageid;
var revid = rc.revid;
var oldid = rc.old_revid;
var user = rc.user;
var comment = (rc.comment ? rc.comment : "");
var timestamp = rc.timestamp;
var ns = rc.ns;
var state = rc.state;
var state2 = rc.state2;

var regex = new RegExp(/\'/g);
var escTitle = title.replace(regex, "\\'");
var escUser = user.replace(regex, "\\'");

//if type of rc is log, then return. This is for escaping bug that each logs shown twice.
if (revid == 0 && oldid == 0) return; 

//  var revisions = api.getElementsByTagName('query')0.getElementsByTagName('pages')0.getElementsByTagName('page')0.getElementsByTagName('revisions')0.getElementsByTagName('rev');
//
//  var oldsize = (state & NEW ? 0 : revisions1.textContent.length);
//  var newsize = revisions0.textContent.length
var oldsize = rc.oldlen
var newsize = rc.newlen
var sizediff = newsize - oldsize;


// INITIALISATION LIGNE RC //

var tr1 = document.createElement('tr');

var th0 = document.createElement('th');
var td1 = document.createElement('td');
var td2 = document.createElement('td');
var td3 = document.createElement('td');
var td4 = document.createElement('td');


// SUPPR. LIGNE //

th0.innerHTML = 'X';



// ARTICLE //

var arti = "", artiStyle = "";
var preArti = "", postArti = "";

	
var diff = "";
var diffClose = "";
if (lrcAutoCloseDiff == 1)
diffClose='supprLigne(\+pageid+'_'+revid+'\');';
if (state & NEW) 
diff = +lang_tooltips.NEW_PAGE+;
else if (state & UPLOAD)  
diff = +lang_tooltips.UPLOAD_LOG+;
else if (state & NEWUSER)  
diff = +lang_tooltips.NEW_ACCOUNT+;
else if (state & BLOCK)  
diff = +lang_tooltips.BLOCK_LOG+;
else if (state & DELETE)  
diff = +lang_tooltips.DELETE_LOG+;
else if (state & MOVE)  
diff = +lang_tooltips.MOVE_LOG+;
else if (state & PROTECT)  
diff = +lang_tooltips.PROTECT_LOG+;
else if (state & ABFILTER)
diff = +lang_tooltips.FILTER_LOG+; // + '&details=' + revid +
else  { // simple edit	 
diff = +lang_tooltips.DIFF_SHORT+
diff += '+';
}
	

var hist = ;
var edit = ;
var admin = ;
// Don't show link for log rows
if (!(state & UPLOAD) &&

(state & NEWUSER) &&

(state & BLOCK) &&

(state & DELETE) &&

(state & PROTECT) &&

(state & PATROL) &&

(state & MOVE) &&

(state & ABFILTER))
{
hist = +lang_tooltips.HIST_SHORT+;
edit = +lang_tooltips.EDIT_SHORT+;
if (lrcAdmin == true) {
admin = ' • '+lang_tooltips.DEL_SHORT+; 

admin += ' • '+lang_tooltips.PROTECT_SHORT+;
}
}

// Disambig / Homonymie ? ;
///////////////////////////
if ((ns == 0) && (state & HOMONYMIE)) {
artiStyle = 'color: darkorange; font-weight: bold; font-style: italic;';
preArti += ' '
}

// Page protégée ? ;
////////////////////
if (state & FULLLOCK)
preArti += ;
if (state & LOCK)
preArti += ;
/  if (state & MVFULLLOCK)
preArti += ;
if (state & MVLOCK)
preArti += ;
*/

// Copyright ? ;
//////////
if (state & COPYRIGHT)
preArti += ' ';
	
// AbuseFilter Log? ;
//////////
if (state & ABFILTER)
preArti += ' '; 
	
// PaS ? ;
//////////////////
if (state & PAS)
preArti += ' ';

// Intervention wikipompiers ? ;
////////////////////////////////
if (state & FIRE)
preArti += ' ';

//Article state

for (i=0; i'+lang_category_short+;

// Redirect, Log, or simple edit ? ;
//////////////////
if (state & MOVE) {
//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';
postArti += ' ';
postArti += ' '+rc.new_title+;
arti = +title+;
}
else if (state & REDIRECT) {
artiStyle = 'color: green; font-weight: bold; font-style: italic;';
postArti += ' ';
postArti += ' '+rc.redirect+;
arti = +title+;
} 
else if (state & UPLOAD) {
preArti = ' ' + preArti;
postArti += ' ('+rc.duration+')';
arti = +title+;
}
else if (state & NEWUSER) {
preArti += ' ';
arti = +title+;
}
else if (state & BLOCK) {
//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';
preArti = ' ' + preArti;
	// translate duration representaion, from english to your language
	for (i=0; i'+title+;
}
else if (state & DELETE) {
preArti = ' ' + preArti;
postArti += ' ('+rc.duration+')';
arti = +title+;
}
else if (state & PROTECT) {
preArti = ' ' + preArti;
	// translate duration representaion, from english to your language
	for (i=0; i'+title+;
}
else {
arti = +title+;
}

td1.innerHTML =   + tsToHhMm(timestamp) + ' • ' + diff + ' • ' + hist + ' • ' + edit + admin + ' • '
+ preArti + arti + postArti + ;
td1.className="creator-title";
td1.style.textAlign="left";
td1.style.border="1px";
td1.style.width="40%";

// EDITOR //
//////////// liveArticle
//var discut  = +lang_tooltips.TALK_SHORT+;
var discut  = +lang_tooltips.TALK_SHORT+;
var contrib = +lang_tooltips.CONTRIB_SHORT+;
var editor = "", preEditor = "";
// Reverted ? ;
/////////////////
if (state & REVERT)
preEditor += ' ';
	
// Using Tools? ;
/////////////////////////////////////////
if ((state & TOOLS) && !(state & BOT) )
preEditor += ' ';

// Bot ? ;
//////////
if (state & BOT)
preEditor += ' ';

// Sysop ? ;
////////////
if (state & SYSOP)
preEditor += ' ';

// TOR potentiel / AOL
var isTOR = new RegExp(/172\.\d+\.\d+\.\d+/);
if (isTOR.test(user))
preEditor += ' ';

if (state & IP){
editor = +user+;
} else {
editor = +user+;  
}

var uadmin   = ;
if (lrcAdmin == true) {
uadmin = ' • '+lang_tooltips.BLOCK_SHORT+;
}

var uhide = +lang_tooltips.USER_HIDE_SHORT+;

td2.innerHTML =   + discut + ' • ' + contrib + ' • ' + uhide + uadmin + ' • '
+ preEditor + editor + ;
td2.className="creator-name";
td2.style.border = "1px";
td2.style.width = "20%";

if (lstRevocuser) {
td2.style.border = "2px solid red";
td2.innerHTML += '(' + lang_menu0.PRE_NO + lstRevocuser.nb + lang_menu0.POST_NO + + lang_menu0.RESET_NO +')'
}

// COMMENT //
// Remplace lien xxx par  ;
var wcomment = comment.htmlize();
var regex1 = new RegExp(/\\((^\\|*)(.*?))\\/g);
wcomment = wcomment.replace(regex1, '$1');  

var regex2 = new RegExp(/\>^\\|$1'+lang_menu0.TAG_NAME+' : ';
wcomment += rc.tags0.firstChild.nodeValue;
for (var tagId = 1; tagId ';
td3.style.border = "2px solid red";
} else {
td3.style.border = "1px";
td3.style.width = "40%";
}

//td3.innerHTML = "" + wcomment + "";
td3.innerHTML =  + wcomment + ;


if (state & PATROLLED) {
td2.style.backgroundColor = "#e3e3f1";
td3.style.backgroundColor = "#e3e3f1";
td4.style.backgroundColor = "#e3e3f1";
}  

if (state & ABFILTER) {
th0.style.backgroundColor = "#FFBE60";
td1.style.backgroundColor = "#FFBE60";
td2.style.backgroundColor = "#FFBE60";
td3.style.backgroundColor = "#FFBE60";
td4.style.backgroundColor = "#FFBE60";
}  

if (state & UPLOAD) {
th0.style.backgroundColor = "#D1CAFA";
td1.style.backgroundColor = "#D1CAFA";
td2.style.backgroundColor = "#D1CAFA";
td3.style.backgroundColor = "#D1CAFA";
td4.style.backgroundColor = "#D1CAFA";
tr1.style.border = "1px solid  darkslateblue";
}

if (state & NEWUSER) {
th0.style.backgroundColor = "#C6FF6D";
td1.style.backgroundColor = "#C6FF6D";
td2.style.backgroundColor = "#C6FF6D";
td3.style.backgroundColor = "#C6FF6D";
td4.style.backgroundColor = "#C6FF6D";
tr1.style.border = "1px solid  lime";
}

if (state & BLOCK) {
th0.style.backgroundColor = "#EECC84";
td1.style.backgroundColor = "#EECC84";
td2.style.backgroundColor = "#EECC84";
td3.style.backgroundColor = "#EECC84";
td4.style.backgroundColor = "#EECC84";
tr1.style.border = "1px solid  darkgoldenrod";
}

if (state & DELETE) {
th0.style.backgroundColor = "#E7CAA7";
td1.style.backgroundColor = "#E7CAA7";
td2.style.backgroundColor = "#E7CAA7";
td3.style.backgroundColor = "#E7CAA7";
td4.style.backgroundColor = "#E7CAA7";
tr1.style.border = "1px solid saddlebrown";
}

if (state & MOVE) {
th0.style.backgroundColor = "#FDC5FF";
td1.style.backgroundColor = "#FDC5FF";
td2.style.backgroundColor = "#FDC5FF";
td3.style.backgroundColor = "#FDC5FF";
td4.style.backgroundColor = "#FDC5FF";
tr1.style.border = "1px solid magenta";
}

if (state & PROTECT) {
th0.style.backgroundColor = "#B2BCC6";
td1.style.backgroundColor = "#B2BCC6";
td2.style.backgroundColor = "#B2BCC6";
td3.style.backgroundColor = "#B2BCC6";
td4.style.backgroundColor = "#B2BCC6";
tr1.style.border = "1px solid  darkslategray";
}

if (state & REVERT) {
th0.style.backgroundColor = "#FFE4E1";
td1.style.backgroundColor = "#FFE4E1";
td2.style.backgroundColor = "#FFE4E1";
td3.style.backgroundColor = "#FFE4E1";
td4.style.backgroundColor = "#FFE4E1";
tr1.style.border = "1px solid crimson";
}

if (state & BLANKING 
newsize == 0) {
th0.style.backgroundColor = "white";
td1.style.backgroundColor = "white";
td2.style.backgroundColor = "white";
td3.style.backgroundColor = "white";
td4.style.backgroundColor = "white";
	td4.innerHTML = ' ';
tr1.style.border = "2px double crimson";
}
if (state & NEW) {
th0.style.backgroundColor = "#e2f2d2";
td1.style.backgroundColor = "#e2f2d2";
td2.style.backgroundColor = "#e2f2d2";
td3.style.backgroundColor = "#e2f2d2";
td4.style.backgroundColor = "#e2f2d2";
tr1.style.border = "1px solid green";
}

if (state & IP) {
td2.style.backgroundColor = "white";
td3.style.backgroundColor = "white";
td4.style.backgroundColor = "white";
}

if (isTOR.test(user))
td2.style.backgroundColor = "pink";

if (state & REPLACED) {
th0.style.backgroundColor = "pink";
td1.style.backgroundColor = "pink";
td2.style.backgroundColor = "pink";
td3.style.backgroundColor = "pink";
td4.style.backgroundColor = "pink";
td4.innerHTML = ' ';
tr1.style.border = "2px solid crimson";
}

// CONTACT LIST //
//////////////////
if (lstContact2user) {
td2.style.border = "2px solid gold";
td2.style.backgroundColor = "yellow";
}

if (user == wgUserName) {
td2.style.border = "2px solid #A0B0E0";
td2.style.backgroundColor = "#F0F8FF";
}

// DELTA SIZE //

// delta de modif ;
///////////////////
if (!(state & NEWUSER) &&

(state & UPLOAD) &&

(state & PROTECT) &&

(state & BLOCK) &&

(state & MOVE) &&

(state & DELETE) &&

(state & ABFILTER)) {
var txtdiff = "";

if (sizediff '+sizediff+;
else if (sizediff '+sizediff+;
txtdiff = +sizediff+;
else if (sizediff == 0)
//txtdiff = '±'+sizediff+;
	txtdiff = '±'+sizediff+;
else if (sizediff +'+sizediff+;
	txtdiff = '+'+sizediff+;
else
	txtdiff = '+'+sizediff+;
	
td4.innerHTML += txtdiff;
td4.style.border = "1px";
td4.style.textAlign = "right";
}


// ASSEMBLAGE LIGNE //

tr1.appendChild(th0);
tr1.appendChild(td1);
tr1.appendChild(td2);
tr1.appendChild(td3);
tr1.appendChild(td4);
tr1.id = pageid+"_"+revid;

var tab = document.getElementById( 'tabRC' );
// IE automatically inserts a TBODY that we have to take care of
if (tab.firstChild && (tab.firstChild.nodeName == "TBODY")) tab=tab.firstChild;
var elold = document.getElementById(pageid+"_"+oldid);

if (tab.firstChild != null)
tab.insertBefore(tr1, tab.firstChild);
else
tab.appendChild(tr1);
if (elold == null) {
if (tab.childNodes.length > lrcRCLimit) {
var idt = tab.lastChild.id;
supprLigne(idt);
}
} else {
supprLigne(pageid+"_"+oldid);
}

// Don't show RC if checkbox is not checked
if ((!document.getElementById('showRC').checked) &&
(!(state & UPLOAD) &&

(state & NEWUSER) &&

(state & BLOCK) &&

(state & DELETE) &&

(state & PROTECT) &&

(state & MOVE) &&

(state & ABFILTER)))
supprLigne(pageid+"_"+revid);

if (state & PATROL)
supprLigne(pageid+"_"+revid);

// Don't show Log if checkbox is not checked
if ((!document.getElementById('showLog').checked) &&
((state & UPLOAD) 
(state & NEWUSER) 
(state & BLOCK) 
(state & DELETE) 
(state & PROTECT) 
(state & MOVE)))
supprLigne(pageid+"_"+revid);

// Don't show Filter if checkbox is not checked
if ((!document.getElementById('showFilter').checked) &&
(state & ABFILTER))
supprLigne(pageid+"_"+revid);

// MISE A JOUR LISTES //

var spos = lstSuivi.indexOf(title);
if(spos != -1) {
th0.style.border = "2px solid gold";
th0.style.backgroundColor = "yellow";
td1.style.border = "2px solid gold";
td1.style.backgroundColor = "yellow";
lstSuiviHHspos = tsToHhMm(timestamp);
var tempsAr = new Array();
var len = lstSuivi.length;
for (var n = 0; n '+lang_tooltips.DIFF_SHORT+;
var shist = +lang_tooltips.HIST_SHORT+;
var sarti = +lstSuivin+;
var ligne= + lstSuiviHHn + ' • ' + sdiff + ' • ' + shist + ' • ' + sarti +;
tempsAr.push(ligne);
}
tempsAr.sort();
len = tempsAr.length;
var lvSuivi = document.getElementById( 'liveSuivi' );
lvSuivi.innerHTML = "";
for (var n=len-1; n >= 0; n--)
lvSuivi.innerHTML = lvSuivi.innerHTML + tempsArn;
}


if (lstContact2user) {
lstContact2user.ts = timestamp;
updateFollowContact();
}

if (state & REVERT) {
var regex = new RegExp(/\\Special:Contributions\/(^\\|+)/);
match = regex.exec(comment);

if (!match) {
		var regex2 = new RegExp('/\\'+lang_special_contrib+'\/(^\\|+)/');
		match = regex2.exec(comment);
}

if (match) {
var userR = match1;
if (userR != user && userR != wgUserName) {
if (!lstRevocuserR) lstRevocuserR = { ts: 0, nb: 0 };
lstRevocuserR.ts = timestamp;
lstRevocuserR.nb += 1;
updateFollowRevoc();
}
}
}
}

function getRedirCat(xmlreq, data) {
if (document.getElementById('stopLive').checked) return;

var yurik = xmlreq.responseXML.getElementsByTagName('api')0;

if (yurik.firstChild.nodeName == "error") return;

var rc = data.rc;
var pageid = rc.pageid;
var revid = rc.revid;
var state = rc.state;
var state2 = rc.state2;

var redir = yurik.getElementsByTagName('redirects')0;
var page = yurik.getElementsByTagName('pages')0.getElementsByTagName('page')0;
if (typeof(redir) != 'undefined'){
state = state | REDIRECT;
if (redir.getElementsByTagName('r').item(0).getAttributeNode("to").nodeValue.length)
rc.redirect = redir.getElementsByTagName('r').item(0).getAttributeNode("to").nodeValue;
}

var lenp = page.getElementsByTagName('protection')0.getElementsByTagName('pr').length;
//Protected?;
if (lenp){

for (i=0; i=0; i--) {
// Using rcid as revid can be 0 (e.g. when moving a page)
if (rcsi.getAttribute('rcid') =0; i--) {
if (logsi.getAttribute('logid') =0; i--) {
if (filtersi.getAttribute('id') ' +
+ lang_menu0.IPNEW  + ' ';
	*/
var lvSubPreviewTitle = document.getElementById( 'sublivePreviewTitle' );
		lvSubPreviewTitle.innerHTML =  +
										' '+lang_menu0.GO+;
										//lvSubPreviewTitle.innerHTML + '  ';
									  
var lvUserPreviewTitle = document.getElementById( 'userlivePreviewTitle' );								
		var userInfol = lstUserInfo.length;
		var userInfoHtml = ;
		for (j=0; j' + 
							lstUserInfoj.siteName+;
			}
		lvUserPreviewTitle.innerHTML = // + 
										lvUserPreviewTitle.innerHTML + '  ' +  + userInfoHtml + ;

var lvPagePreviewTitle = document.getElementById( 'pagelivePreviewTitle' );								
		var pageInfol = lstPageInfo.length;
		var pageInfoHtml = ;
		for (j=0; j'+lstPageInfoj.siteName+;
			}
		lvPagePreviewTitle.innerHTML = // + 
										lvPagePreviewTitle.innerHTML + '  ' +  + pageInfoHtml + ;
	
var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );
lvPreviewFoot.innerHTML = 'X' +
'X' +
'X' +
'X' +
+
+ lang_menu0.PAUSE   +  +
// +
// + lang_menu0.PREVIEW +  +
+
+ lang_menu0.LISTS   +  +
// +
//+ lang_menu0.LOWDIFF +  +
+
+ lang_menu0.NOBOTS  +  + 
+
+ lang_menu0.IPONLY  + ' ' +
//showIPNEWbox +
+
+ lang_menu0.RCLABEL  + ' ' +
+
+ lang_menu0.LOGSHOW  + ' ' +
+
+ lang_menu0.ABSHOW  + ' • ' +
;

//       +
//         + lang_menu0.RCLABEL +  +

if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;

var _len = lstContact.length;
lstContact2 = new Array();
for (var _i=0; _i */