プロジェクト:ウィキ技術部/スクリプト開発/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 ===
 
<source lang="javascript"> */
//Script works only at page [[Wikipedia:LiveRC]] or [[User:UserName/LiveRC]] or [[User:EDUCA33E/LiveRC]]
if (wgPageName == "Wikipedia:LiveRC" || wgPageName == wgFormattedNamespaces[2] +":"+ wgUserName +"/LiveRC" || wgPageName == wgFormattedNamespaces[2] +":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: "{{ISP}}"                            , descr: "ISP"                                            , needPara: 'ISP名|host=ホスト名'},
    { template: "subst:Sakujo"                , string: "{{subst:Sakujo}}"                   , descr: "削除依頼タグ"                                      , needPara: ''},
    { template: "subst:Sakujo}}{{Copyrights"  , string: "{{subst:Sakujo}}{{Copyrights}}"     , descr: "削除依頼タグ+著作権"                                , needPara: ''}
  ];
  
  // 利用者情報用のURL設定 
  // ////////////////////////////
  var lstUserInfo  = [
    { siteName: "アカウント" ,  whenIP: false ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title=" + lang_special_Centralauth + "&target=$USER$" },
    { siteName: "利用者ページ" ,     whenIP: false ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + "/wiki/"+wgFormattedNamespaces[2]+":$USER$" },
    { siteName: "会話ページ" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + "/wiki/"+wgFormattedNamespaces[3]+":$USER$" },
    { siteName: "話題追加" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title="+wgFormattedNamespaces[3]+":$USER$"+"&action=edit&section=new" },
    { siteName: "投稿記録" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + "/wiki/"+lang_special_contrib+"/$USER$" },
    { siteName: "/16" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title="+lang_special_contrib+"&contribs=user&target=$USER$%2F16&withJS=MediaWiki%3AGadget-contribsrange.js" },
    { siteName: "/24" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title="+lang_special_contrib+"&contribs=user&target=$USER$%2F24&withJS=MediaWiki%3AGadget-contribsrange.js" },
    { siteName: "/28" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title="+lang_special_contrib+"&contribs=user&target=$USER$%2F28&withJS=MediaWiki%3AGadget-contribsrange.js" },
	{ siteName: "intersect" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~pietrodn/intersectContribs.php?wikiDb=jawiki_p&firstUser=$USER$&secondUser=" },
	 { siteName: "CU" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: "http://ja.wikipedia.org/w/index.php?title=Special:CheckUser&user=$USER$" },
    { siteName: "公開記録" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title=" +lang_special_Log+"&page="+wgFormattedNamespaces[2]+":$USER$" },
    { siteName: "ブロック記録" ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + wgScriptPath + "/index.php?title=" +lang_special_Log+"&type=block&page="+wgFormattedNamespaces[2]+":$USER$" },
    { siteName: "投稿ブロック"   ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: wgServer + "/wiki/"+lang_special_block+"/$USER$" },
    { siteName: "作成記事"   ,     whenIP: true ,     whenAccount: true ,        height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~soxred93/pages/index.php?name=$USER$&lang=ja&wiki=wikipedia&namespace=0&redirects=noredirects&getall=1" },
    { siteName: "whois(JPNIC)" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: "http://whois.nic.ad.jp/cgi-bin/whois_gw?key=$USER$" },
	{ siteName: "whois(linky)" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: " http://linky.wikipedia.jp/whois?key=$USER$" },
    { siteName: "ホスト名" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: "http://antispam.stakasaki.net/tools/nslookup.cgi?domain=$USER$" },
    { siteName: "DNSBL" ,     whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: "http://hikarin.jp/c/check?ip=$USER$&query=all" },
    { siteName: "これくしー" ,    whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: "http://sv2ch.baila6.jp/collexy.cgi?address=$USER$&port=&wait=10" },	 
    { siteName: "ip-adress.com" ,    whenIP: true ,     whenAccount: false ,        height: "250px" ,  shown: false,
	 url: "http://www.ip-adress.com/ip_tracer/$USER$" },
    { siteName: "WikiChecker" , whenIP: true ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://ja.wikichecker.com/user/?t=$USER$" },
    { siteName: "編集カウンタ(soxred)" ,  whenIP: true ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~soxred93/pcount/index.php?lang=ja&wiki=wikipedia&name=$USER$" },
    { siteName: "WikiDashboard" ,  whenIP: true ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://wikidashboard.appspot.com/jawiki/wiki/"+wgFormattedNamespaces[2]+":$USER$" },
    { siteName: "統一ログイン状態(vvv)" ,  whenIP: false ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~vvv/sulutil.php?user=$USER$" },
    { siteName: "別プロジェクト(purodha)" ,  whenIP: false ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~purodha/sample/dbswithuser.php?go=Go!&uselang=en&usr=$USER$" },
    { siteName: "別プロジェクト(luxo)" ,  whenIP: true ,     whenAccount: true ,         height: "250px" ,  shown: false,
	 url: "http://toolserver.org/~luxo/contributions/contributions.php?blocks=true&lang=ja&user=$USER$" },
    { siteName: "Google" ,            height: "250px" ,  shown: false,
	 url: 'http://www.google.co.jp/search?q=$USER$' },	 
  ];
  
  // ページ情報用のURL設定
  // ////////////////////////////
  var lstPageInfo = [
    { siteName: "履歴" ,              height: "250px" ,  onlyArticle: false ,
	 url: wgServer + wgScriptPath + '/index.php?title=$PAGENAME$' + '&action=history' },
    { siteName: "ログ" ,               height: "250px" ,  onlyArticle: false ,
	 url: wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&page=$PAGENAME$' },
    { siteName: "リンク元" ,             height: "250px" ,  onlyArticle: false ,
	 url: wgServer + "/wiki/"+ lang_special_wlhere + "/$PAGENAME$" },
    { siteName: "削除" ,               height: "250px" ,  onlyArticle: false ,
	 url: wgServer + wgScriptPath + '/index.php?title=$PAGENAME$&action=delete' },
    { siteName: "保護" ,              height: "250px" ,  onlyArticle: false ,
	 url: wgServer + wgScriptPath + '/index.php?title=$PAGENAME$&action=protect' },
    { siteName: "アクセス数" ,           height: "250px" ,  onlyArticle: false ,
	 url: 'http://stats.grok.se/ja/201012/$PAGENAME$' },
    { siteName: "WikiDashboard" ,       height: "250px" ,  onlyArticle: false ,
	 url: 'http://wikidashboard.appspot.com/jawiki/wiki/$PAGENAME$' },
    { siteName: "ページ統計" ,         height: "250px" ,  onlyArticle: false ,
	 url: 'http://toolserver.org/~soxred93/articleinfo/index.php?article=$PAGENAME$&lang=ja&wiki=wikipedia&begin=&end=' },
    { siteName: "Checklinks" ,        height: "250px" ,  onlyArticle: false ,
	 url: 'http://toolserver.org/~dispenser/cgi-bin/webchecklinks.py?page=ja%3A$PAGENAME$' },
    { siteName: "AltVeiwer" ,        height: "250px" ,  onlyArticle: false ,
	 url: 'http://toolserver.org/~dispenser/cgi-bin/altviewer.py?page=ja%3A$PAGENAME$' },
    { siteName: "Reflinks" ,        height: "250px" ,  onlyArticle: false ,
	 url: 'http://toolserver.org/~dispenser/cgi-bin/webreflinks.py?page=ja%3A$PAGENAME$&citeweb=on&overwrite=simple&limit=20' },
    { siteName: "WikiChecker" ,         height: "250px" ,  onlyArticle: false ,
	 url: 'http://ja.wikichecker.com/article/?a=$PAGENAME$' },
    { siteName: "WikiBlame" ,          height: "250px" ,  onlyArticle: false ,
	 url: 'http://wikipedia.ramselehof.de/wikiblame.php?user_lang=ja&lang=ja&project=wikipedia&article=$PAGENAME$' },
    { siteName: "Google" ,            height: "250px" ,  onlyArticle: false ,
	 url: 'http://www.google.co.jp/search?q=$PAGENAME$' },
    { siteName: "Twitter" ,           height: "250px" ,  onlyArticle: false ,
	 url: 'http://www.google.co.jp/search?tbs=mbl:1&q=$PAGENAME$' },
    { siteName: "座標" ,              height: "250px" ,  onlyArticle: true ,
	 url: 'http://www.ac.auone-net.jp/~geo/geo/?search=$PAGENAME$' },
  ];
						
  //検知してアイコンを表示するカテゴリのデフォルト設定
   var customcategory = [
    { regex: '秀逸な記事',
	  icon: ' <img title="秀逸な記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/Fairytale_bookmark_gold.png/14px-Fairytale_bookmark_gold.png" width="14px"/>' },
    { regex: '良質な記事',
	  icon: ' <img title="良質な記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Blue_star_boxed.svg/14px-Blue_star_boxed.svg.png" width="14px"/>' },
    { regex: '出典を必要とする記事',
	  icon: '<sup title="出典を必要とする記事" style="color:blue"> [要出典]</sup>' },
	{ regex: 'Wikifyが必要な項目',
	  icon: '<sup title="Wikifyが必要な記事" style="color:black"> [[wiki]]</sup>' },
	{ regex: '外部リンクがリンク切れになっている記事',
	  icon: '<sup title="外部リンクがリンク切れになっている記事" style="color:blue"> [リンク切れ]</sup>' },
	{ regex: '(テンプレート呼び出しエラーのあるページ|貼り付け日が正しくないテンプレートのある記事|Refタグがあるのにreferencesタグがないページ)',
	  icon: '<sup title="テンプレート呼び出しエラーのあるページ" style="color:red"> [エラー]</sup>' },
	{ regex: '特筆性を欠いているおそれのある記事',
	  icon: ' <img title="特筆性を欠いているおそれのある記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Crystal_Clear_app_kedit.svg/18px-Crystal_Clear_app_kedit.svg.png" width="18px"/>' },
	{ regex: '独自研究の除去が必要な記事',
	  icon: ' <img title="独自研究が含まれているおそれのある記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f9/Edit-find-replace.svg/18px-Edit-find-replace.svg.png" width="18px"/>' },
	{ regex: '中立的観点に議論ある項目',
	  icon: ' <img title="中立的観点に議論のある記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Unbalanced_scales.svg/18px-Unbalanced_scales.svg.png" width="18px"/>' },
	{ regex: '検証が求められている記事',
	  icon: ' <img title="検証が求められている記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Postscript-viewer.svg/18px-Postscript-viewer.svg.png" width="18px"/>' },
	{ regex: '宣伝活動の記述のある項目',
	  icon: ' <img title="広告・宣伝的な内容を含む記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Farm-Fresh_coins.png/20px-Farm-Fresh_coins.png" width="20px"/>' },
	{ regex: '日本中心の項目',
	  icon: ' <img title="日本中心の記述となっている記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Flag-jp.svg/20px-Flag-jp.svg.png" width="20px"/>' },
	{ regex: '雑多な内容を箇条書きした節のある記事',
	  icon: ' <img title="雑多な内容を箇条書きした節のある記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Edit-clear.svg/20px-Edit-clear.svg.png" width="20px"/>' },
	{ regex: '言葉を濁した記述のある記事',
	  icon: ' <img title="言葉を濁した記述のある記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Cloudimage1.png/20px-Cloudimage1.png" width="20px"/>' },
	{ regex: '画像提供依頼',
	  icon: ' <img title="画像募集中の記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Crystal_Clear_app_lphoto.png/20px-Crystal_Clear_app_lphoto.png" width="20px"/>' },
	{ regex: '(現在進行|予定|亡くなったばかりの人物)',
	  icon: ' <img title="予定・進行中の事象を扱っている記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Current_event_clock.svg/16px-Current_event_clock.svg.png" width="16px"/>' },
	{ regex: '(提案がある|告知事項がある|質問がある|確認・注意事項がある|議論が行われている)ページ',
	  icon: ' <img title="提案・告知・質問・注意・議論などがあるページ" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Nuvola_apps_edu_languages.svg/16px-Nuvola_apps_edu_languages.svg.png" width="16px"/>' },
	{ regex: '改名提案',
	  icon: ' <img title="改名提案中の記事" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Crystal_Clear_action_spellcheck.png/20px-Crystal_Clear_action_spellcheck.png" width="20px"/>' },
	{ regex: '著作権放棄によるパブリックドメイン画像',
	  icon: ' <img title="著作権放棄によるパブリックドメイン画像" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/62/PD-icon.svg/16px-PD-icon.svg.png" width="16px"/>' },
	{ regex: 'GFDL画像',
	  icon: ' <img title="GFDLライセンスの画像" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/Heckert_GNU_white.svg/20px-Heckert_GNU_white.svg.png" width="20px"/>' },
	{ regex: 'クリエイティブ・コモンズ.*の画像',
	  icon: ' <img title="クリエイティブ・コモンズ・ライセンスの画像" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Cc-white.svg/16px-Cc-white.svg.png" width="16px"/>' },
	{ regex: '出典不明の画像',
	  icon: ' <img title="出典不明の画像" src="http://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Question_copyright.png/16px-Question_copyright.png" width="16px"/>' },
  	{ regex: 'コモンズと重複しているメディア',
	  icon: ' <img title="コモンズと重複しているメディア" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/16px-Commons-logo.svg.png" width="16px"/>' }
  ];

 
  var IP          = 1; // 2^0 = 1
  var BOT         = 2 << 0; // 2^1 = 2
  var SYSOP       = 2 << 1; // 2^2 = 4
  var NEW         = 2 << 2; // 2^3 = 8
  var MINOR       = 2 << 3; // 2^4 = 16
  var NEWNS       = 2 << 4; // 2^5 = 32
  var RENAMED     = 2 << 5; // 2^6 = 64
  var PATROLLED   = 2 << 6; // 2^7 = 128
  var REVERT      = 2 << 7; // 2^8 = 256
  var BLANKING    = 2 << 8; // 2^9 = 512
  var REPLACED    = 2 << 9; // 2^10 = 1024
  var REDIRECT    = 2 << 10; // 2^11 = 2048
  var CATEGORIZED = 2 << 11; // 2^12 = 4096
  var LOCK        = 2 << 12; // 2^13 = 8192
  var FULLLOCK    = 2 << 13; // 2^14 = 16384
  var MVLOCK      = 2 << 14; // 2^15 = 32768
  var MVFULLLOCK  = 2 << 15; // 2^16 = 65536
  var HOMONYMIE   = 2 << 16; // 2^17 = 131072
  var TOOLS       = 2 << 17; // 2^18 = 262144
  var COPYRIGHT   = 2 << 18; // 2^19 = 524288
  var PAS         = 2 << 19; // 2^20 = 1048576
  var FIRE        = 2 << 20; // 2^21 = 2097152
 
  var UPLOAD      = 2 << 21; // 2^22 = 4194304
  var NEWUSER     = 2 << 22; // 2^23 = 8388608
  var BLOCK       = 2 << 23; // 2^24 = 16777216
  var DELETE      = 2 << 24; // 2^25 = 33554432
  var MOVE        = 2 << 25; // 2^26 = 67108864
  var PROTECT     = 2 << 26; // 2^27 = 134217728
  var PATROL      = 2 << 27; // 2^28 = 268435456
  var ABFILTER    = 2 << 28; // 2^29 = 536870912
  var TAG         = 2 << 29; // 2^30 = 1073741824
  var REVIEW      = 2 << 30; // 2^31 = 2147483648
  
    // Variables for rc.state2 and customcategory;;
   var FlagsforCustomCategory = [
   1, // 2^0 = 1
   2 << 0, // 2^1 = 2
   2 << 1, // 2^2 = 4
   2 << 2, // 2^3 = 8
   2 << 3, // 2^4 = 16
   2 << 4, // 2^5 = 32
   2 << 5, // 2^6 = 64
   2 << 6, // 2^7 = 128
   2 << 7, // 2^8 = 256
   2 << 8, // 2^9 = 512
   2 << 9, // 2^10 = 1024
   2 << 10, // 2^11 = 2048
   2 << 11, // 2^12 = 4096
   2 << 12, // 2^13 = 8192
   2 << 13, // 2^14 = 16384
   2 << 14, // 2^15 = 32768
   2 << 15, // 2^16 = 65536
   2 << 16, // 2^17 = 131072
   2 << 17, // 2^18 = 262144
   2 << 18, // 2^19 = 524288
   2 << 19, // 2^20 = 1048576
   2 << 20, // 2^21 = 2097152
   2 << 21, // 2^22 = 4194304
   2 << 22, // 2^23 = 8388608
   2 << 23, // 2^24 = 16777216
   2 << 24, // 2^25 = 33554432
   2 << 25, // 2^26 = 67108864
   2 << 26, // 2^27 = 134217728
   2 << 27, // 2^28 = 268435456
   2 << 28, // 2^29 = 536870912
   2 << 29, // 2^30 = 1073741824
   2 << 30, // 2^31 = 2147483648
   ];
     
  /*
 
  // //////////////////// //
  == Internationalization ==
  // //////////////////// //
 
  */
 
 
  // Menu translation;
  // /////////////////
  var lang_menu = [ {
	DEFAULTPAGE: "Wikipedia:LiveRC/解説",
	GO:       "Go",
    PAUSE:    "停止",
    PREVIEW:  "プレビュー",
    LISTS:    "リスト",
    LOWDIFF:  "簡素な差分",
    RCLABEL:  "編集",
	CONTRIB:  "投稿記録",
    HIST:     "履歴",
    NOBOTS:   "ボットを隠す",
    IPONLY:   "IPのみ",
    IPNEW:    "IPビギナー",
    NAMESP:   "名前空間",
    XTIMES:   "回",
	TAGGING:  "タグ貼り付け",
    UNDORC:   "差し戻し実行",
    REVERT:   "リバート",
    REASON:   "理由",
    AVERTS:   "メッセージ送信",
    RVMES1:   "[[Wikipedia:LiveRC/解説|LiveRC]] : ",
    RVMES2:   " による版を ",
    RVMES3:   " による版へ[[H:RV|差し戻し]]",
    PRE_NO:   "差し戻しを受けた回数 ",
    POST_NO:  "回 ",
    RESET_NO: "回数を初期化?",
    EMPTY:    "空",
    LOG:      "ログ",
    LOGSHOW:  "ログ",
    WLHERE:   "リンク元",//what links here
    ABSHOW:   "フィルター",
    FILT_NO:  "番号",
    TAG_NAME: "タグ",
	ACTION:   "対処操作",
    TIMESTMP:"最終更新",
    DETAIL:   "詳細",
	EXT_SITE: "外部サイト"//external site
  } ];
 
  var lang_tooltips = {
    // main menu
    HIDE_ALL:       "全ての行をクリアする",
    HIDE_REVIEWED:  "差分を見た行をクリアする",
    HIDE_REVERTS:   "差し戻し編集の行をクリアする",
    HIDE_NEW:       "ページの新規作成の行をクリアする",
    HIDE_BLANKING:  "ページの白紙化の行をクリアする",
    HIDE_THIS:      "この行をクリアする",
    // links in rows
    SHOW_IN_PREVIEW:" (プレビュー窓で表示)",
    SHOW_IN_TAB:    " (別ウィンドウ・タブで開く)",
    DIFF_TIP:       "差分 (プレビュー窓で表示)",
    DIFF_TIP2:      "差分 (別ウィンドウ・タブで開く)",
    DIFF_SHORT:     "差分",
    HIST_TIP:       "履歴 (プレビュー窓で表示)",
    HIST_SHORT:     "歴",
    EDIT_TIP:       "編集 (別ウィンドウ・タブで開く)",
    EDIT_SHORT:     "編",
    DEL:            "削除",
    DEL_TIP:        "削除 (別ウィンドウ・タブで開く)",
    DEL_SHORT:      "削",
    PROTECT:        "保護",
    PROTECT_TIP:    "保護 (別ウィンドウ・タブで開く)",
    PROTECT_SHORT:  "保",
    TALK_TIP:       "ノートページ (別ウィンドウ・タブで開く)",
    TALK_SHORT:     "話",
    CONTRIB_TIP:    "投稿履歴 (プレビュー窓で表示)",
    CONTRIB_SHORT:  "歴",
    BLOCK:          "ブロック",
    BLOCK_TIP:      "ブロック (別ウィンドウ・タブで開く)",
    BLOCK_SHORT:    "ブ",
    USER_HIDE_TIP:  "以降この利用者の編集を表示しない",
    USER_HIDE_SHORT:"隠",
	
    NEW_PAGE:        "新規",
    NEW_PAGE_TIP:    "新規作成ページ (プレビュー窓で表示)",	
    UPLOAD_LOG:      "アップロード記録",
    UPLOAD_LOG_TIP:  "アップロード記録 (プレビュー窓で表示)",
    NEW_ACCOUNT:     "アカウント作成記録",
    NEW_ACCOUNT_TIP: "アカウント作成記録 (プレビュー窓で表示)",
    BLOCK_LOG:       "投稿ブロック記録",
    BLOCK_LOG_TIP:   "投稿ブロック記録 (プレビュー窓で表示)",
    DELETE_LOG:      "削除記録",
    DELETE_LOG_TIP:  "削除記録 (プレビュー窓で表示)",
    MOVE:            "移動",
    MOVE_LOG:        "移動記録",
    MOVE_LOG_TIP:    "移動記録 (プレビュー窓で表示)",
    PROTECT_LOG:     "保護記録",
    PROTECT_LOG_TIP: "保護記録 (プレビュー窓で表示)",
    FILTER_LOG:      "編集フィルター記録",
    FILTER_LOG_TIP:  "編集フィルター記録 (プレビュー窓で表示)",
    BLANKING_REPLACE:"ページの白紙化、ページの置換",
    BOT_TIP:         "フラグ付きボット",
    SYSOP_TIP:       "管理者",
    TOOLS_TIP:       "ツールを用いた編集",
    REVERT_TIP:      "差し戻し編集",
    REDIRECT_TIP:    "リダイレクト",
	
    HOMONYMIE_TIP:   "曖昧さ回避ページ",
    FULLLOCK_TIP:    "編集全保護中のページ",
    LOCK_TIP:        "編集半保護中のページ",
    MVFULLLOCK_TIP:  "移動全保護中のページ",
    MVLOCK_TIP:      "移動半保護中のページ",
    COPYRIGHT_TIP:   "削除依頼中のページ",
	PAS_TIP:         "即時削除タグの貼られているページ",
    FIRE_TIP:        "保護依頼中のページ",
	
	TAGGING:         "ページ $1 にテンプレートを貼り付けます",//tagging template at page $1
	MESSAGING:       "$1の会話ページにメッセージを送信します",//post message to user talk of $1
	REVERTING:       "左側の版に差し戻します"//reverting to left revision
	
  }
 
  var lang_log = {
    UPLOAD:  'アップロード記録を取得中',
    NEWUSER: 'アカウント作成記録を取得中',
    BLOCK:   '投稿ブロック記録を取得中',
    DELETE:  '削除記録を取得中',
    MOVE:    '移動記録を取得中',
    PROTECT: '保護記録を取得中'
  };
  
  var lang_filterlog_replace = [
  { before: '',         after: 'なし'        },
  { before: 'warn',     after: '通知'       },
  { before: 'tag',      after: 'タグ付け'     },
  { before: 'disallow', after: '防止'       }
  ];
  
  var lang_newaccountlog_replace = [
  { before: 'create',        after: '新規アカウント登録'      },
  { before: 'create2',       after: '別アカウント作成'     },
  { before: 'autocreate',    after: 'SUL作成'     }
  ];  
  
  var lang_blocklog_replace = [
  { before: 'block',         after: 'ブロック'        },
  { before: 'reblock',       after: 'ブロック設定変更'  },
  { before: 'unblock',       after: 'ブロック解除'     }
  ];
  
  var lang_uploadlog_replace = [
  { before: 'upload',        after: '新規アップロード'    },
  { before: 'overwrite',     after: '新しい版'      }
  ];
  
  var lang_blockflag_replace = [
  { regex: /anononly/         ,  replace: 'IPでの投稿不可'          },
  { regex: /nocreate/         ,  replace: 'アカウント作成不可'         },
  { regex: /nousertalk/       ,  replace: '会話ページ編集不可'        },
  { regex: /noemail/          ,  replace: 'メール送信不可'           },
  { regex: /noautoblock/      ,  replace: '自動ブロック無効'          }
  ];
  
  var lang_deletelog_replace = [
  { before: 'delete',        after: '削除'             },
  { before: 'restore',       after: '復帰'             },
  { before: 'revision',      after: '版指定削除'        }
  ];
  
  var lang_protectlog_replace = [
  { before: 'protect',          after: '保護'          },
  { before: 'move_prot',        after: '保護設定の移動'   },
  { before: 'modify',           after: '保護設定の変更'   },
  { before: 'unprotect',        after: '保護解除'       }
  ];

  var lang_duration_replace = [
  { regex: /(infinite|indefinite)/ ,  replace: '無期限'       },
  { regex: /(\d)* year[s]?/        ,  replace: '$1年'        },
  { regex: /(\d)* month[s]?/       ,  replace: '$1ヶ月'       },
  { regex: /(\d)* week[s]?/        ,  replace: '$1週間'       },
  { regex: /(\d)* day[s]?/         ,  replace: '$1日'        },
  { regex: /(\d)* hour[s]?/        ,  replace: '$1時間'       },
  { regex: /(\d)*minute[s]?/       ,  replace: '$1分'        },
  { regex: /(\d)*second[s]?/       ,  replace: '$1秒'        }
  ];
 
  var lang_messages = {
    SAME_EDITOR: '旧版の編集も同一人物によるもの',
    WARNING: 'メッセージ',
	TAGGING: 'タグ貼り付け',
    ON_ARTICLE: 'sur'
  };
 
  // Comments test table (regexp format);
  // ////////////////////////////////////
  var commenttests = [
    { state: BLANKING  , regex: /^\[\[WP:AES\|←\]\]ページの白紙化/ },
    { state: REPLACED  , regex: /^\[\[WP:AES\|←\]\]ページの置換/ },
    { state: REVERT    , regex: /(差し戻し|巻き戻し|取り消し)|^(Undid|Revert(ed)? to)|^rv(v|ert(ing|ed)?)?|rvv|をrv\b/ },
 //   { state: LTA       , regex: /LTA:/ },
    { state: TOOLS     , regex: /\[\[WP:POP\|ポップアップ\]\]使用|\[\[WP:HotCat\|HotCat\]\]使用|\[\[WP:HG\|HG\]\]使用|ロボット(で|による)|\[\[Project:AWB\|AWB\]\]|LiveRC(\]\])?\s:\s|^\[\[:en:WP:CLEANER\|WikiCleaner\]\]/ }
  ];
  
  // Categories test table (regexp format);
  var categoriestests = [
    { state: HOMONYMIE , regex: 'すべての曖昧さ回避記事' },
    { state: COPYRIGHT , regex: '削除依頼中の記事' },
    { state: PAS       , regex: '即時削除対象のページ' },
    { state: FIRE      , regex: '保護依頼中の記事' }
  ];

  // Getting user params
  // FIXME: works fine in Mozilla and Opera, does not work in Chrome and Safari
 
  importScript(wgPageName+'/LiveRCparam.js'); 
  importScript('User:'+wgUserName+'/LiveRCparam.js');
 
  var cssNode = document.createElement('link');
  cssNode.type = 'text/css';
  cssNode.rel = 'stylesheet';
  cssNode.href = 'http://ja.wikipedia.org/skins-1.5/common/diff.css?90';
  cssNode.media = 'screen';
  cssNode.title = 'dynamicLoadedSheet';
  document.getElementsByTagName("head")[0].appendChild(cssNode);
 
  document.write('<script type="text/javascript" src="http://ja.wikipedia.org/skins-1.5/common/diff.js?90"></script>');
 
  var lastrcid=0,lastfilterid=0,lastlogid=0,lastrctimestamp=1,lastletimestamp=1,lastafltimestamp=1; // Timestamp d'initialisation;
 
  // Découpage de l'URL et de ses parametres;
 
  var _GET = new Array();
  var _uri = location.href;
  var _temp_get_arr = _uri.substring(_uri.indexOf('?')+1, _uri.length).split("&");
  var _temp_get_arr_1 = new Array();
  for(_get_arr_i=0; _get_arr_i<_temp_get_arr.length; _get_arr_i++){
    _temp_get_arr_1 = _temp_get_arr[_get_arr_i].split("=");
    _GET[decodeURIComponent(_temp_get_arr_1[0])] = decodeURIComponent(_temp_get_arr_1[1]);
  }
  delete _uri; delete _temp_get_arr; delete _temp_get_arr_1;
 
 
 
  var lstSysop = new Array();   // Sysop list;
  var lstContact = new Array(); // Contact list;
  var lstContact2 = new Array(); // Contact list;
  var lstRevoc = new Array();   // Reverted list;
  var lstHidden = new Array();  // Hidden users list;
 
  // Has user patrol rights?
  var lrcPatrol = true;// default value must be false. this value is just for debugging;
  var lrcAPIlimit = 500;
  if(wgUserGroups.indexOf("autopatrolled") != -1)
    lrcPatrol = true;
 
  // Is user Sysop;
  //var lrcAdmin = false; // default value;
  var lrcAdmin = true; // default value must be false. this value is just for debugging;
  if(wgUserGroups.indexOf("sysop") != -1)
  {
    lrcAdmin = true;
    lrcPatrol = true;
  }
 
  // Watchlist;
  var lstSuivi = new Array();
  var lstSuiviHH = new Array();
}
 
/* </source>
 
===Utilities===
 
<source lang="javascript"> */
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.headers[field]);
      }
      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<Elements.length){
            var Id = Elements[elementcount].getAttribute('id');
            if(Id){
                  if(Id==elementId){
                        TheElement = Elements[elementcount];
                        break;
                  }
            }
            elementcount++
      }
      if (! TheElement) return null;
      return TheElement;
}
///////////////////////////////////////////////////////////////////////////////
 
 
function getRights(xmlreq, data) {
  var api = xmlreq.responseXML;
 
  if (api.firstChild.nodeName == "error") return;
 
  var rights = api.getElementsByTagName('query')[0].getElementsByTagName('userinfo')[0].getElementsByTagName('rights')[0].getElementsByTagName('r');
  var len = rights.length;
  var i;
  var id,right;
 
  for (i=0; i<len; i++) {
    right = rights[i].textContent;
    // Handle IE
    if (!right)right = rights[i].text;
 
    if (right == "apihighlimits") lrcAPIlimit=5000;
    if (right == "autopatrol") lrcPatrol=true;
  }
 
  buildControlBar();
}
 
function buildControlBar()
{
  var top        = document.getElementById( 'top' );
  if (top != null) {
      top.innerHTML = "";
      top.style.display = "none";
  }
  var siteSub    = document.getElementById( 'siteSub' );
  var contentSub = document.getElementById( 'contentSub' );
  var rtb        = document.getElementById( 'RealTitleBanner' );
  var rt         = document.getElementById( 'RealTitle' );
  var pca        = document.getElementById( 'p-cactions' );
 
 
  if (siteSub != null) siteSub.style.display = "none";
  if (contentSub != null) contentSub.style.display = "none";
  if (rtb != null) rtb.style.display = "none";
  if (rt != null) rt.style.display = "none";
  if (pca != null) pca.style.display = "none";
 
  /*var showIPNEWbox = '';
  if (lrcPatrol)
    showIPNEWbox = '<input id="showIPNEW"    type="checkbox" ' + lrcShowIPNEWChecked + '/>' +
      '<label for="showIPNEW">'   + lang_menu[0].IPNEW  + ' </label>';
  */
  
  var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );
  lvPreviewFoot.innerHTML = '<a href="javascript:;" onClick="supprLigne(\'*\');" style="color: red; font-weight: bold;" title="'+lang_tooltips.HIDE_ALL+'">X</a> | ' +
    '<a href="javascript:;" onClick="supprLigne(\'d\');" style="color: rgb(255, 235, 71); font-weight: bold;" title="'+lang_tooltips.HIDE_REVIEWED+'">X</a> ' +
    '<a href="javascript:;" onClick="supprLigne(\'r\');" style="color: rgb(255, 99, 83); font-weight: bold;" title="'+lang_tooltips.HIDE_REVERTS+'">X</a> ' +
    '<a href="javascript:;" onClick="supprLigne(\'n\');" style="color: rgb(178, 243, 113); font-weight: bold;" title="'+lang_tooltips.HIDE_NEW+'">X</a> ' +
    '<a href="javascript:;" onClick="supprLigne(\'c\');" style="color: white; font-weight: bold;" title="'+lang_tooltips.HIDE_BLANKING+'">X</a>' +
    '<input id="stopLive"  type="checkbox" value="true" />' +
    '<label for="stopLive">' + lang_menu[0].PAUSE   + '</label>' +
	//' &bull; ' +
    //'<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'subdivLivePreview\');" />' +
    //'<label for="shidPrev">' + lang_menu[0].PREVIEW + '</label>' +
    //'<input id="showDiffR" type="checkbox" />' +
    //'<label for="showDiffR">'+ lang_menu[0].LOWDIFF + '</label>' +
	' &bull; ' +
    '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />' +
    '<label for="shidList">' + lang_menu[0].LISTS   + '</label>' +
	' &bull; ' +
    '<input id="showBot"   type="checkbox" ' + lrcShowBotChecked + ' />' +
    '<label for="showBot">'  + lang_menu[0].NOBOTS  + '</label>' + 
    '<input id="showIP"    type="checkbox" ' + lrcShowIPChecked + '/>' +
    '<label for="showIP">'   + lang_menu[0].IPONLY  + ' </label>' +
    //showIPNEWbox +
	' &bull; ' +
    '<input id="showRC"    type="checkbox" ' + lrcShowRCChecked + ' />' +
    '<label for="showRC">'   + lang_menu[0].RCLABEL  + ' </label>' +
    '<input id="showLog"    type="checkbox" ' + lrcShowLogChecked + '/>' +
    '<label for="showLog">'   + lang_menu[0].LOGSHOW  + ' </label>' +
    '<input id="showFilter"    type="checkbox" ' + lrcShowFilterChecked + '/>' +
    '<label for="showFilter">'   + lang_menu[0].ABSHOW  + ' • </label>' +
    '<span id="selectNS" />';
 
  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<chars.length; i++) {
    var regex = new RegExp(chars[i], "g");
    string = string.replace(regex, '&' + entities[i] + ';');
  }
  return string;
}
 
//set <a href="..."> to <a target="_blank" href="..."> 
//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 < leng; i++) {
        tablink = alinks[i];
        title = tablink.href.replace(new RegExp(wgServer+"/wiki/([^#]*).*"), "$1");
		tablink.setAttribute("onDblClick","window.open('"+wgServer+"/wiki/"+title+"');"); 
		title = decodeURIComponent(title);
		tablink.setAttribute("onClick","livePage(\'" + title + "\');"); 
		tablink.href = "javascript:;";
    }
}*/

/* </source>
 
=== LivePage ===
 
<source lang="javascript"> */
//渡されたアドレスまたはウィキテキストを解析する関数。
//渡される値は、"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(ArrayIWs[RegExp.$1.toLowerCase()]) != 'undefined')){
		targetUrl = ArrayIWs[RegExp.$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(wgNamespaceIds[match_result[1].toLowerCase()]) != 'undefined'){
	ns = wgNamespaceIds[match_result[1].toLowerCase()];//空間の番号を入れる
  } else {
	ns = 0;//それ以外なら標準名前空間
  }

  if (match_result && ns != 0 && ns != 1 && ns != -1 ) {//標準名前空間とそのノート、および特別以外の場合
		liveTitle = pagename;//wgFormattedNamespaces[ mainNSs[ns] ] + ':' +match_result[2];
		liveCore = match_result[2];		
		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_menu[0].LOG)) {//「特別:ログ」の場合
		
		} else if (match_sp_result = pagename.match(lang_special_contrib+'/(.*)')) {//「特別:投稿記録/利用者名」の場合
			liveTitle = wgFormattedNamespaces[2]+':'+match_sp_result[1];
			liveCore = match_sp_result[1];
			nsFinal = 2;
			isUser = true;
			liveType = 'contrib'; 
		} else if (match_sp_result = pagename.match(lang_special_Centralauth+'/(.*)')) {//「特別:アカウント統一管理/利用者名」の場合
			liveTitle = wgFormattedNamespaces[2]+':'+match_sp_result[1];
			liveCore = match_sp_result[1];
			nsFinal = 2;
			isUser = true;
		} else if (match_sp_result = pagename.match(wgFormattedNamespaces[-1]+':'+lang_menu[0].WLHERE+'/([^:]+)(:(.*))?')) {//「特別:リンク元/ページ名」の場合
			if (match_sp_result[3] && typeof(wgNamespaceIds[match_sp_result[1].toLowerCase()]) != 'undefined'){
				liveTitle = match_sp_result[1]+match_sp_result[2];
				liveCore = match_sp_result[3];
				nsFinal = wgNamespaceIds[match_sp_result[1].toLowerCase()];
			} else {
				liveTitle = match_sp_result[1];
				liveCore = match_sp_result[1];
				nsFinal = 0;		
			}
		}
	} else if (match_result && ns == 1){//標準名前空間のノートの場合
		liveTitle = match_result[2];
		liveCore = match_result[2];
		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<optl; j++) {
				optAvert += '<option value="'+lstAvert[j].template;
				if(lstAvert[j].hasPage) optAvert += '|'+upage;
				optAvert += '">'+lstAvert[j].string+'</option>';
			}
			userMessageSelecter = //メッセージ送信ボタン用のhtml
			'[<a title="'+lang_tooltips.MESSAGING.replace('$1', Link.liveCore)+'" id="LiveAvertoLink" href="javascript:getLiveAverto(\''+Link.liveCore+'\');" style="color:darkorange">'+lang_menu[0].AVERTS+'</a>] : ' +
			'<select id="averto">' + optAvert + '</select>';
		}
		
		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<optl; j++) {
				optTagging += '<option value="'+lstTagging[j].template;
				optTagging += '">'+lstTagging[j].string+'</option>';
			}
			taggingTagSelecter = //タグ貼りつけボタン用のhtml
			'[<a title="'+lang_tooltips.TAGGING.replace('$1', Link.pagename)+'" id="LiveTaggingLink" href="javascript:getLiveTagging(\''+Link.pagename+'\');" style="color:darkorange">'+lang_menu[0].TAGGING+'</a>] : ' +
			'<select onchange="tagSelecterChanged()" id="tagging" style="width:200px;">' + optTagging + '</select>' + 
			' : <input id="LiveTaggingOption" style="width:200px;" />';
		}
		
		var elt = document.getElementById( 'sublivePreviewTitle' );
		/*
		var relatedLinks = '';
		if (Link.ns != -1 ){ //特別ページでなく、履歴でもなく、履歴、リンク元、ログ、といったリンクを作成
		relatedLinks = 	'<small> ('
				  		+ '<a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + Link.pagename + '&action=history\');" style="color:darkorange">'+lang_menu[0].HIST+'</a>'
						+ ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + wgFormattedNamespaces[-1] + ':' + lang_menu[0].LOG + '&page=' + Link.pagename + '\');" style="color:darkorange">'+lang_menu[0].LOG+'</a>'
						+ ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + '/wiki/' + wgFormattedNamespaces[-1] + ':' + lang_menu[0].WLHERE + '/' + Link.pagename + '\');" style="color:darkorange">'+lang_menu[0].WLHERE+'</a>'
						+ ')</small>';
		}
		*/
		elt.innerHTML=  '<input id="shidPrev" type="checkbox" checked onclick="showHideObj(this, \'subdivLivePreview\');" />' +
						'<input style="width: 250px;" id="LivePreviewTitle" value="'+Link.pagename+'"/> <a href="javascript:livePage(document.getElementById(\'LivePreviewTitle\').value);">'+lang_menu[0].GO+'</a>';
						//'<b><a href="javascript:;" onClick="livePage(\'' + Link.pagename + '\');">'+Link.pagename+'</a></b>' + relatedLinks;
		
		//利用者情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		var userInfol = lstUserInfo.length;
		var j, userlink;
		for (j=0; j<userInfol; j++) {
			userlink = document.getElementById('UserInfoChk'+j);
			if ( Link.isUser && Link.liveType != 'diff' //対象が利用者関連のページで
				&& !(Link.isIP && lstUserInfo[j].whenIP == false)//対象がIPでかつIP非対応のサイト場合、下のelseに(例:統一アカウント情報など)
				&& !(!Link.isIP && lstUserInfo[j].whenAccount == false)//対象がアカウントで、かつアカウント非対応のサイト場合、下のelseに(例:whois等)
				){
				userlink.setAttribute("href", "javascript:loadliveExtPage(\'user\', \'"+Link.liveCore+"\', \'"+j+"\');");
				userlink.removeAttribute("style");
			} else {//それ以外の場合
				userlink.href = "";
				userlink.style.color = "silver";
				userlink.style.cursor = "default";
				userlink.style.textDecoration = "none";
			}
		}
		
		//ページ情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		var pageInfol = lstPageInfo.length;
		var j, pagelink;
		for (j=0; j<pageInfol; j++) {
			pagelink = document.getElementById('PageInfoChk'+j);
			if (Link.isPage
				&& !(!Link.isArticle && lstPageInfo[j].onlyArticle) ){//対象ページが記事以外で、サイトが対応していない場合は下のelseへ
				pagelink.setAttribute("href", "javascript:loadliveExtPage(\'page\', \'"+Link.pagename+"\', \'"+j+"\');");
				pagelink.removeAttribute("style");
			} else {
				pagelink.href = "";
				pagelink.style.color = "silver";
				pagelink.style.cursor = "default";
				pagelink.style.textDecoration = "none";
			}
		}
		
		elt.innerHTML = '<table width="100%" class="creator"><tr><td>' + elt.innerHTML + '</td>' +
		'<td align="right"><small>' + taggingTagSelecter + ' ' +userMessageSelecter  + '</small></td></tr></table>';
		tagSelecterChanged();//オプション欄の有効無効を判定して、内容を変化させる
	} else if (Link.extlink){
		//外部のサイト(別の言語版、別プロジェクト、外部サイト)の場合。 Javascriptの same origin policy のためページの操作、情報の取得ができない
		var elt = document.getElementById( 'sublivePreviewTitle' );
		elt.innerHTML=  '<input id="shidPrev" type="checkbox" checked onclick="showHideObj(this, \'subdivLivePreview\');" />' +
						'<input style="width: 250px;" id="LivePreviewTitle" value="'+lang_menu[0].EXT_SITE+'"/> <a href="javascript:livePage(document.getElementById(\'LivePreviewTitle\').value);">'+lang_menu[0].GO+'</a>';
						//'<b>'+lang_menu[0].EXT_SITE+'</b>';
		//利用者情報関連の外部サイトリンクのボタンを全て無効化し、色を変える
		var userInfol = lstUserInfo.length;
		var j, userlink;
		for (j=0; j<userInfol; j++) {
				userlink = document.getElementById('UserInfoChk'+j);
				userlink.href = "";
				userlink.style.color = "silver";
				userlink.style.cursor = "default";
				userlink.style.textDecoration = "none";
			
		}
		//ページ情報関連の外部サイトリンクのボタンを全て無効化し、色を変える
		var pageInfol = lstPageInfo.length;
		var j, pagelink;
		for (j=0; j<pageInfol; j++) {
				pagelink = document.getElementById('PageInfoChk'+j);
				pagelink.href = "";
				pagelink.style.color = "silver";
				pagelink.style.cursor = "default";
				pagelink.style.textDecoration = "none";
			}
		}
	}


function tagSelecterChanged(){//タグの選択肢が変更されたときに、オプション欄の有効無効と内容を切り替える関数
	var selecter = document.getElementById( 'tagging' ); 
	var option   = document.getElementById( 'LiveTaggingOption' ); 
	if (lstTagging[selecter.selectedIndex].needPara == ''){//もしパラメータが不要なら
		option.disabled = true; //インプットを無効化
	} else { //それ以外、つまりオプションが必要なら
		option.disabled = false; //インプットを有効化
		option.value    = lstTagging[selecter.selectedIndex].needPara //パラメータの内容で書き換え
		option.focus();//フォーカスを当てる
	}
}
 
function livePage(page) {
	var Link;
	Link = linkAddressParser(page);//URLかウィキリンクか、外部サイトか、名前空間はどこかなどを、URLまたはウィキリンクから解析して、変数に代入する。
	
	//フレームへのページの読み込み
	var dLP = document.getElementById( 'subdivLivePreview' ); 
	dLP.innerHTML='<iframe src="'+Link.targetUrl+'" id="previewfrm" width="100%" height="'+lrcPreviewHeight+'" onload="loadedlivePage();"></iframe>';
	
	//もし表示領域が非表示なら、表示する
	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 = '<iframe src="'+lstUserInfo[number].url.replace('$USER$', arg)+'" name="ifrInfo" width="100%" height="'+lstUserInfo[number].height+'"></iframe>';
			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 = '<iframe src="'+lstPageInfo[number].url.replace('$PAGENAME$', arg)+'" name="ifrInfo" width="100%" height="'+lstPageInfo[number].height+'"></iframe>';
			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(wgNamespaceIds[match_result[1].toLowerCase()]) != 'undefined'){
	ns = wgNamespaceIds[match_result[1].toLowerCase()];//空間の番号を入れる
  } else {
	ns = 0;//それ以外なら標準名前空間
  }
	
  if (match_result && ns != 0 && ns != 1 && ns != -1 ) {//標準名前空間とそのノート、および特別以外の場合
		liveTitle = wgFormattedNamespaces[ mainNSs[ns] ] + ':' +match_result[2];
		liveCore = match_result[2];
		nsFinal = ns;
	} else if (ns == -1){//特別ページの場合。現状対応してるのはログ、投稿記録、リンク元のどれか。
		if (match_sp_result = pagename.match(wgFormattedNamespaces[-1]+':'+lang_menu[0].LOG)) {//「特別:ログ」の場合
		
		} else if (match_sp_result = pagename.match(lang_special_contrib+'/(.*)')) {//「特別:投稿記録/利用者名」の場合
			liveTitle = wgFormattedNamespaces[2]+':'+match_sp_result[1];
			liveCore = match_sp_result[1];
			nsFinal = 2;
			liveType = 'contrib';
		} else if (match_sp_result = pagename.match(wgFormattedNamespaces[-1]+':'+lang_menu[0].WLHERE+'/([^:]+)(:(.*))?')) {//「特別:リンク元/ページ名」の場合
			if (match_sp_result[3] && typeof(wgNamespaceIds[match_sp_result[1].toLowerCase()]) != 'undefined'){
				liveTitle = match_sp_result[1]+match_sp_result[2];
				liveCore = match_sp_result[3];
				nsFinal = wgNamespaceIds[match_sp_result[1].toLowerCase()];
			} else {
				liveTitle = match_sp_result[1];
				liveCore = match_sp_result[1];
				nsFinal = 0;		
			}
		}
	} else if (match_result && ns == 1){//標準名前空間のノートの場合
		liveTitle = match_result[2];
		liveCore = match_result[2];
		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(/.*<a href='(.*)'>.*<a href='(.*)'>.*/g), "$1");
			diff_oldid = diff_oldid.replace(new RegExp(/(.*)&amp;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(/<a (.*)>(.*)<\/a>(.*)\((.*)\)/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(/<a (.*)>(.*)<\/a>(.*)\(<a(.*)/g), "$2");
		}
		
		user1=user1.replace(new RegExp(/\'/g), "\\'");
		user2=user2.replace(new RegExp(/\'/g), "\\'");
		var identique="";
		if(user1 == user2) {
			identique =  "<b style='color:red'>[" + lang_messages.SAME_EDITOR + "]</b> ";
		}
		var optAvert = "";
		var optl = lstAvert.length;
		for (j=0; j<optl; j++) {
			optAvert += '<option value="'+lstAvert[j].template;
			if(lstAvert[j].hasPage) optAvert += '|'+upage;
			optAvert += '">'+lstAvert[j].string+'</option>';
		}
		revertReasonSelecter = identique +		
		'[<a title="'+lang_tooltips.REVERTING+'" id="LiveRevertLink" href="javascript:getLiveMessage(\'liverevert\',\''+user1+'\',\''+user2+'\',\''+Link.pagename+'\',\''+diff_oldid+'\');" style="color:darkorange">' + lang_menu[0].UNDORC+'</a>] • ' +
		lang_menu[0].REASON+' : <input id="LiveRevertMessage" /> ••• ' +
		'[<a title="'+lang_tooltips.MESSAGING.replace('$1', user2)+'" id="LiveAvertoLink" href="javascript:getLiveAverto(\''+user2+'\');" style="color:darkorange">'+lang_menu[0].AVERTS+'</a>] : ' +
		'<select id="averto">' + optAvert + '</select>';
	}
  
  var elt = document.getElementById( 'sublivePreviewTitle' );
  elt.innerHTML = '<input id="shidPrev" type="checkbox" checked onclick="showHideObj(this, \'subdivLivePreview\');" />' +
  '<input style="width: 250px;" id="LivePreviewTitle" value="'+Link.pagename+'"/> <a href="javascript:livePage(document.getElementById(\'LivePreviewTitle\').value);">'+lang_menu[0].GO+'</a>';
  //+ '<b><a href="javascript:;" onClick="livePage(\'' + Link.pagename + '\');">'+Link.pagename+'</a></b>';
  /*
  + '<small> ('
  + '<a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + Link.pagename + '&action=history\');" style="color:darkorange">'+lang_menu[0].HIST+'</a>'
  + ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + wgFormattedNamespaces[-1] + ':' + lang_menu[0].LOG + '&page=' + Link.pagename + '\');" style="color:darkorange">'+lang_menu[0].LOG+'</a>'
  + ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + '/wiki/' + wgFormattedNamespaces[-1] + ':' + lang_menu[0].WLHERE + '/' + Link.pagename + '\');" style="color:darkorange">'+lang_menu[0].WLHERE+'</a>'
  + ')</small>';
  */
	
  elt.innerHTML = '<table width="100%" class="creator"><tr><td>' + elt.innerHTML + '</td>' +
  '<td align="right"><small>' + revertReasonSelecter + '</small></td></tr></table>';
  
  		//利用者情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		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<userInfol; j++) {
			userlink = document.getElementById('UserInfoChk'+j);
			if ( !(Link.isIP && lstUserInfo[j].whenIP == false)//対象がIPでかつIP非対応のサイト(例:統一アカウント情報など)の場合、下のelseに
				&& !(!Link.isIP && lstUserInfo[j].whenAccount == false) ){//対象がアカウントで、かつアカウント非対応のサイト場合、下のelseに(例:whois等)
				userlink.setAttribute("href", "javascript:loadliveExtPage(\'user\', \'"+user2+"\', \'"+j+"\');");
				userlink.removeAttribute("style");
			} else {//それ以外の場合
				userlink.href = "";
				userlink.style.color = "silver";
				userlink.style.cursor = "default";
				userlink.style.textDecoration = "none";
			}
		}
		
		//ページ情報関連の外部サイトリンクのボタンの、色とリンクアドレスを更新
		var pageInfol = lstPageInfo.length;
		var j, pagelink;
		for (j=0; j<pageInfol; j++) {
			pagelink = document.getElementById('PageInfoChk'+j);
			if (!(!Link.isArtcle && lstPageInfo[j].onlyArticle) ){//対象ページが記事以外で、サイトが対応していない場合は下のelseへ
				pagelink.setAttribute("href", "javascript:loadliveExtPage(\'page\', \'"+Link.pagename+"\', \'"+j+"\');");
				pagelink.removeAttribute("style");
			} else {//それ以外の場合
				pagelink.href = "";
				pagelink.style.color = "silver";
				pagelink.style.cursor = "default";
				pagelink.style.textDecoration = "none";
			}
		}
}

// </source>
 
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<inputs.length; i++) {
    editform[inputs[i].name] = inputs[i].value;
  }
  var wpStarttime = encodeURIComponent(editform['wpStarttime']);
  var wpEdittime = encodeURIComponent(editform['wpEdittime']);
  var wpEditToken = encodeURIComponent(editform['wpEditToken']);
  
	
  //要約欄用の説明文を得て、変数に格納
  var description;
  var tagOption = '';//テンプレートのオプションを入れるための変数。オプションのないテンプレなら、このまま空のまま
  for (var _i=0; _i<lstTagging.length; _i++){//表示分を手がかりに、どのテンプレートの貼り付け指令かを検索する。
		if (message == lstTagging[_i].template){ //発見したら
			if ( lstTagging[_i].needPara != ''){//パラメータの必要なテンプレートかどうかをチェック
				tagOption = '|' + document.getElementById( 'LiveTaggingOption' ).value;//必要ならインプットボックスの値を読み込み、|の後に入れる。
			}
			description = lstTagging[_i].descr;//要約欄用の文章を取得
		}
  }
  //現在の本文 wpTextbox1 の前に改行 \n を挟んでテンプレを挿入
  var wpTextbox1 = encodeURIComponent('{{subst:' + message + tagOption + '}} \n' + doc.getElementById('wpTextbox1').value);
  var wpSummary = encodeURIComponent(lang_menu[0].RVMES1 + lang_messages.TAGGING + ' {{' + message + tagOption + '}}' + ' - ' + description);
  
  var headers = new Array();
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
  wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=' + encodeURI(page) + '&action=submit',
                method: "POST", headers: headers,
                data: 'wpSave=1&wpTextbox1=' + wpTextbox1 + '&wpStarttime=' + wpStarttime + '&wpEdittime=' + wpEdittime
                    + '&wpEditToken=' + wpEditToken + '&wpSummary=' + wpSummary});
}
  
 
function getLiveAverto(user) {
  var link = document.getElementById('LiveAvertoLink');
  link.href = "javascript:;";
  link.style.color = "silver";
  link.style.cursor = "default";
  link.style.textDecoration = "none";
  document.getElementById('averto').disabled = true;
  var message = document.getElementById('averto').value;
  wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=User_Talk:' + encodeURIComponent(user) + '&action=edit',
                onSuccess: postLiveAverto,
                user: user, message: message });
}
 
function postLiveAverto(xmlreq, data) {
  var parser = new DOMParser();
  var doc = parser.parseFromString(xmlreq.responseText, 'application/xhtml+xml');
 
  var user = data.user;
  var message = data.message.replace(new RegExp(/\\'/g),"'");
  
  var signature;
	
  //使用する署名を得て、変数に格納
  for (var _i=0; _i<lstAvert.length; _i++){
		if (message == lstAvert[_i].template)
		signature = lstAvert[_i].sign;
  }
 
  var wpTextbox1 = encodeURIComponent(doc.getElementById('wpTextbox1').value + '\n\n{{subst:' + message + '}} ' + signature + '\n');
 
  var inputs = doc.getElementById('editform').getElementsByTagName('input');
  var editform = new Array();
  for (i=0; i<inputs.length; i++) {
    editform[inputs[i].name] = inputs[i].value;
  }
  var wpStarttime = encodeURIComponent(editform['wpStarttime']);
  var wpEdittime = encodeURIComponent(editform['wpEdittime']);
  var wpEditToken = encodeURIComponent(editform['wpEditToken']);
 
  var wpSummary = encodeURIComponent('LiveRC : ' + lang_messages.WARNING + ' ' + message.replace(new RegExp(/\|(.*)/),
    ' ' + lang_messages.ON_ARTICLE + ' [[$1]]') + ' !');
 
  var headers = new Array();
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
  wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=User_Talk:' + encodeURI(user) + '&action=submit',
                method: "POST", headers: headers,
                data: 'wpSave=1&wpTextbox1=' + wpTextbox1 + '&wpStarttime=' + wpStarttime + '&wpEdittime=' + wpEdittime
                    + '&wpEditToken=' + wpEditToken + '&wpSummary=' + wpSummary});
}
 
function getLiveMessage(where, user1, user2, page, oldid) {
  var links = [ document.getElementById('LiveRevertLink') ];
  var i,len=links.length;
  for (i=0; i<len; i++) {
    links[i].href = "javascript:;";
    links[i].style.color = "silver";
    links[i].style.cursor = "default";
    links[i].style.textDecoration = "none";
  }
  document.getElementById('LiveRevertMessage').disabled = true;
  var message = document.getElementById('LiveRevertMessage').value;
  wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=' + encodeURI(page) + '&action=edit&oldid=' + oldid,
                onSuccess: postLiveRevert,
                where: where, page: page, user1: user1, user2: user2, message: message });
}
 
function postLiveRevert(xmlreq, data) {
  var parser = new DOMParser();
  var doc = parser.parseFromString(xmlreq.responseText, 'application/xhtml+xml');
 
  var where = data.where;
  var page = data.page;
  var user1 = data.user1;
  var user2 = data.user2;
  var message = data.message;
 
  var wpTextbox1 = encodeURIComponent(doc.getElementById('wpTextbox1').value);
 
  var inputs = doc.getElementById('editform').getElementsByTagName('input');
  var editform = new Array();
  for (i=0; i<inputs.length; i++) {
    editform[inputs[i].name] = inputs[i].value;
  }
  var wpStarttime = encodeURIComponent(editform['wpStarttime']);
  var wpEdittime = encodeURIComponent(editform['wpEdittime']);
  var wpEditToken = encodeURIComponent(editform['wpEditToken']);
 
  switch(where) {
    case 'liverevert':
      var wpSummary = lang_menu[0].RVMES1 + '[['+lang_special_contrib+'/' + user2 + '|' + user2
        + ']]'+lang_menu[0].RVMES2+'[['+lang_special_contrib+'/' + user1 + '|' + user1 + ']]'+lang_menu[0].RVMES3;
      break;
/*    case 'livevandalism':
      var wpSummary = 'LiveRC : Révocation de vandalisme par [[Special:Contributions/' + user2 + '|' + user2
        + ']]; retour a la version de [[User:' + user1 + '|' + user1 + ']]';
      break; */
  }
  if (message)
    wpSummary = wpSummary + ' - ' + message;
  wpSummary = encodeURIComponent(wpSummary);
 
  var headers = new Array();
  headers['Content-Type'] = 'application/x-www-form-urlencoded';
  wpajax.http({ url: wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(page) + '&action=submit',
                method: "POST", headers: headers,
                data: 'wpSave=1&wpTextbox1=' + wpTextbox1 + '&wpStarttime=' + wpStarttime + '&wpEdittime=' + wpEdittime
                    + '&wpEditToken=' + wpEditToken + '&wpSummary=' + wpSummary});
}
 
/* </source>

/*
=== LiveSysop ===
 
<source lang="javascript"> */
 
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(rcs[i].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<leni; i++) {
 
    lstSuivi.push(rcs[i].getAttribute('title'));
    lstSuiviHH.push("--:--");
 
  }
 
  var wc1=api.getElementsByTagName('query-continue')[0];
  //ウォッチリストの読み込みが重いので一時無効化
  /*if (wc1)
  {
    var wrcontinue=wc1.getElementsByTagName('watchlistraw')[0].getAttribute('wrcontinue');
    wpajax.http({url:wgServer + wgScriptPath + '/api.php?action=query&list=watchlistraw&wrlimit=' +lrcAPIlimit +'&format=xml&wrcontinue=' + wrcontinue, 
      onSuccess: getWatch, message: "Traitement en cours..." });
  }
  else*/
    liveRC();
}
 
function liveNS() {
  wpajax.http({url: wgServer + wgScriptPath + '/api.php?action=query&meta=siteinfo&siprop=namespaces&format=xml', 
                   onSuccess: getNS, message: "Pobieranie nazw przestrzeni" });
}
 
function getNS(xmlreq, data) {
  var api = xmlreq.responseXML;
 
  if (api.firstChild.nodeName == "error") return;
 
  var nss = api.getElementsByTagName('query')[0].getElementsByTagName('namespaces')[0].getElementsByTagName('ns');
  var len = nss.length;
  var i;
  var id,ns;
  var options = "";
  var lstNs = new Array();
 
  for (i=0; i<len; i++) {
    id = nss[i].getAttribute('id');
    ns = nss[i].textContent;
    // Handle IE
    if (!ns)  ns = nss[i].text;
 
    if (id < 0) continue;
    if (id == 0) ns = lang_main_namespace;
 
    options += '<option value="' + id + '">' + ns + '</option>';
    lstNs.push(id);
  } 
  options = '<option value="' + lstNs.join('|') + '">*</option>' + options;
  document.getElementById('selectNS').innerHTML = '<label for="showNS0">'+lang_menu[0].NAMESP+' </label><select id="showNS0">' + options + '</select>';
 
  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<len; i++) {
    iw = iws[i].getAttribute('prefix');
    url = iws[i].getAttribute('url').replace("$1","");
	tempArrayIWs[iw] = url; 
  } 
  
  ArrayIWs = tempArrayIWs;
  
  liveWatch();
}
/* </source>
 
=== LiveRC ===
 
<source lang="javascript"> */
 
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 (_els[i].firstChild.style.backgroundColor == 'rgb(255, 250, 205)')
        els.push(_els[i]);
  } else if (quelLigne == 'r') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'rgb(255, 228, 225)')
        els.push(_els[i]);
  } else if (quelLigne == 'n') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'rgb(226, 242, 210)')
        els.push(_els[i]);
  } else if (quelLigne == 'c') {
    var _els = tab.getElementsByTagName('tr');
    len = _els.length;
    for (i=len-1; i>=0; i--)
      if (_els[i].firstChild.style.backgroundColor == 'white')
        els.push(_els[i]);
  } else
    els.push(document.getElementById(quelLigne));
  len = els.length;
  for (i=len-1; i>=0; i--)
    if (els[i] != null)
      tab.removeChild(els[i]);
}
 
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 (els1[i] != null)
      els1[i].style.backgroundColor = "#FFFACD";
  var len = els2.length;
  for (var i=len-1; i>=0; i--)
    if (els2[i] != null)
      els2[i].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 < elsLen; i++) {
    if (pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}
 
function tsToHhMm(timestamp) {
  var tz;
  var match;
  if (lrcTZ) {
    var regex = new RegExp(/^([-+])?(\d?\d):?(\d\d)$/);
    match = regex.exec(lrcTZ);
    if (!match) {
      //livercError(lang_error.TZ);
      return 'xx:xx';
    }
    tz = match[2]*60 + match[3]*1;
    tz = match[1] == '-' ? -tz : tz;
  } else {
    var now = new Date();
    tz = -now.getTimezoneOffset();
  }
  var regex = new RegExp(/^\d\d\d\d-\d\d-\d\dT(\d\d):(\d\d):\d\dZ$/);
  match = regex.exec(timestamp);
  if (!match) {
    //livercError(lang_error.timestamp);
    return 'xx:xx';
  }
  var tt = (match[1]*60 + match[2]*1 + tz + 1440) % 1440;
  var mm = tt % 60;
  var hh = (tt - mm) / 60 % 24;
  return hh + ':' + (mm < 10 ? '0' : '') + mm;
}
 
function updateHidden() {
  var tempAr = new Array();
  for (var user in lstHidden) {
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var uremove = '<a href="javascript:;" onClick="unhideUser(\''+utilde+'\');" style="color:grey">-</a>';
    var udiscut  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[3]+':'+encodeURIComponent(user)+'" style="color:seagreen" target="_new" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';
    var ucontrib = '<a href="javascript:;" onClick="livePage(\''+wgServer + '/wiki/'+lang_special_contrib+'/'+encodeURIComponent(utilde)+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';
    var uadmin   = '';
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[2]+':'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="hidden-' + user + '"><small>' + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + '</span><br />';
    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 += tempAr[n];
}
 
function updateFollowContact() {
  var tempAr = new Array();
  for (var user in lstContact2) {
    var timestamp = lstContact2[user].ts;
    if (timestamp == 0) continue;
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var udiscut  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[3]+':'+encodeURIComponent(user)+'" style="color:seagreen" target="_new" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';
    var ucontrib = '<a href="javascript:;" onClick="livePage(\''+wgServer + '/wiki/'+lang_special_contrib+'/'+encodeURIComponent(user)+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';
    var uadmin   = '';
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[2]+':'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="contact-' + timestamp + '"><small>' + tsToHhMm(timestamp) + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + '</span><br />';
    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 += tempAr[n];
}
 
function updateFollowRevoc() {
  var tempAr = new Array();
  for (var user in lstRevoc) {
    var timestamp = lstRevoc[user].ts;
    var utilde = user.replace(new RegExp(/\'/g), "\\'");
    var uremove = '<a href="javascript:;" onClick="removeRevoc(\''+utilde+'\');" style="color:grey">-</a>';
    var udiscut  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[3]+':'+encodeURIComponent(user)+'" style="color:seagreen" target="_new" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';
    var ucontrib = '<a href="javascript:;" onClick="livePage(\''+wgServer + '/wiki/'+lang_special_contrib+'/'+encodeURIComponent(utilde)+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';
    var uadmin   = ''; 
    if (lrcAdmin == true) {
       uadmin = ' • <a href="'+wgServer+'/wiki/Special:Blockip/'+encodeURI(user)+'" target="_new" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';
    }
    var ueditor  = '<a href="'+wgServer+'/wiki/'+wgFormattedNamespaces[2]+':'+encodeURIComponent(user)+'" target="_new">'+user+'</a>';
    var ligne = '<span id="revoc-' + timestamp + '"><small>' + tsToHhMm(timestamp) + ' • ' + uremove + ' • ' + udiscut + ' • ' + ucontrib + uadmin + ' • </small>' + ueditor + ' (' + lstRevoc[user].nb + ' '+lang_menu[0].XTIMES+')</span><br />';
    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 += tempAr[n];
}
 
function removeRevoc(name) {
   delete lstRevoc[name];
   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 : revisions[1].textContent.length);
//  var newsize = revisions[0].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 = '<a href="javascript:;" onClick="supprLigne(\''+pageid+'_'+revid+'\');" style="color:red" title="'+lang_tooltips.HIDE_THIS+'">X</a>';
 
 
  
  // ARTICLE //
 
  var arti = "", artiStyle = "";
  var preArti = "", postArti = "";
  
	
  var diff = "";
  var diffClose = "";
  if (lrcAutoCloseDiff == 1)
    diffClose='supprLigne(\''+pageid+'_'+revid+'\');';
  if (state & NEW) 
    diff = '<a title="'+lang_tooltips.NEW_PAGE_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\''+escTitle+'\');'+diffClose+'" style="color:green">'+lang_tooltips.NEW_PAGE+'</a>';
  else if (state & UPLOAD)  
    diff = '<a title="'+lang_tooltips.UPLOAD_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=upload&user=&page=' + escTitle + '\');'+diffClose+'" style="color:darkslateblue">'+lang_tooltips.UPLOAD_LOG+'</a>';
  else if (state & NEWUSER)  
    diff = '<a title="'+lang_tooltips.NEW_ACCOUNT_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=newusers&user=&page=' + escTitle + '\');'+diffClose+'" style="color:lime">'+lang_tooltips.NEW_ACCOUNT+'</a>';
  else if (state & BLOCK)  
    diff = '<a title="'+lang_tooltips.BLOCK_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=block&user=&page=' + escTitle + '\');'+diffClose+'" style="color:darkgoldenrod">'+lang_tooltips.BLOCK_LOG+'</a>';
  else if (state & DELETE)  
    diff = '<a title="'+lang_tooltips.DELETE_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=delete&user=&page=' + escTitle + '\');'+diffClose+'" style="color: saddlebrown">'+lang_tooltips.DELETE_LOG+'</a>';
  else if (state & MOVE)  
    diff = '<a title="'+lang_tooltips.MOVE_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=move&user=&page=' + escTitle + '\');'+diffClose+'" style="color:black">'+lang_tooltips.MOVE_LOG+'</a>';
  else if (state & PROTECT)  
    diff = '<a title="'+lang_tooltips.PROTECT_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + lang_special_Log + '&type=protect&user=&page=' + escTitle + '\');'+diffClose+'" style="color: darkslategray">'+lang_tooltips.PROTECT_LOG+'</a>';
  else if (state & ABFILTER)
    diff = '<a title="'+lang_tooltips.FILTER_LOG_TIP+'" href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\''+wgServer + wgScriptPath + '/index.php?title=Special:AbuseLog\');'+diffClose+'" style="color: darkslategray">'+lang_tooltips.FILTER_LOG+'</a>'; // + '&details=' + revid +
  else  { // simple edit	 
    diff = '<a href="javascript:;" onClick="changeLigne(\''+pageid+'_'+revid+'\');livePage(\''+wgServer + wgScriptPath + '/index.php?title='+escTitle+'&diff='+revid+'&oldid='+oldid+'\');'+diffClose+'" style="color:orange" title="'+lang_tooltips.DIFF_TIP+'">'+lang_tooltips.DIFF_SHORT+'</a>'
    diff += '<sup><a href="' + wgServer + wgScriptPath + '/index.php?title='+encodeURI(escTitle)+'&diff='+revid+'&oldid='+oldid+'" target="_new" title="'+lang_tooltips.DIFF_TIP2+'">+</a></sup>';
    }
	
 
  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 = '<a href="javascript:;" onClick="livePage(\''+wgServer+wgScriptPath+'/index.php?title='+title+'&action=history\');" style="color:darkorange" title="'+lang_tooltips.HIST_TIP+'">'+lang_tooltips.HIST_SHORT+'</a>';
    edit = '<a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=edit\');" style="color:tomato" title="'+lang_tooltips.EDIT_TIP+'">'+lang_tooltips.EDIT_SHORT+'</a>';
    if (lrcAdmin == true) {
      admin = ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=delete\');" style="color:orangered" title="'+lang_tooltips.DEL_TIP+'">'+lang_tooltips.DEL_SHORT+'</a>'; 
 
      admin += ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + wgScriptPath + '/index.php?title=' + encodeURIComponent(title) + '&action=protect\');" style="color: coral" title="'+lang_tooltips.PROTECT_TIP+'">'+lang_tooltips.PROTECT_SHORT+'</a>';
    }
  }
 
  // Disambig / Homonymie ? ;
  ///////////////////////////
  if ((ns == 0) && (state & HOMONYMIE)) {
    artiStyle = 'color: darkorange; font-weight: bold; font-style: italic;';
    preArti += '<img title="'+lang_tooltips.HOMONYMIE_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Disambig.svg/16px-Disambig.svg.png" width="16px"/> '
  }
 
  // Page protégée ? ;
  ////////////////////
  if (state & FULLLOCK)
    preArti += '<img title="'+lang_tooltips.FULLLOCK_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/59/Padlock.svg/20px-Padlock.svg.png" width="20px"/>';
  if (state & LOCK)
    preArti += '<img title="'+lang_tooltips.LOCK_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Padlock-silver-medium.svg/20px-Padlock-silver-medium.svg.png" width="20px"/>';
/*
  if (state & MVFULLLOCK)
    preArti += '<img title="'+lang_tooltips.MVFULLLOCK_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Padlock-olive.svg/20px-Padlock-olive.svg.png" width="20px"/>';
  if (state & MVLOCK)
    preArti += '<img title="'+lang_tooltips.MVLOCK_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Padlock-olive.svg/20px-Padlock-olive.svg.png" width="20px"/>';
*/
 
  // Copyright ? ;
  //////////
  if (state & COPYRIGHT)
    preArti += '<img title="'+lang_tooltips.COPYRIGHT_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Icono_aviso_borrar.png/18px-Icono_aviso_borrar.png" width="18px"/> ';
	
  // AbuseFilter Log? ;
  //////////
  if (state & ABFILTER)
    preArti += '<img title="'+lang_tooltips.FILTER_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/94/Farm-Fresh_filter_add.png/16px-Farm-Fresh_filter_add.png" width="16px"/> '; 
	
  // PaS ? ;
  //////////////////
  if (state & PAS)
    preArti += '<img title="'+lang_tooltips.PAS_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Symbol_speedy_vote.svg/22px-Symbol_speedy_vote.svg.png" width="22px"/> ';
 
  // Intervention wikipompiers ? ;
  ////////////////////////////////
  if (state & FIRE)
    preArti += '<img title="'+lang_tooltips.FIRE_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/99/FireIcon.svg/16px-FireIcon.svg.png" height="22px"/> ';
 
   //Article state
   
  for (i=0; i<customcategory.length; i++){
	if (state2 & FlagsforCustomCategory[i])
		postArti += customcategory[i].icon;
	}
	
  // Article catégorisé ? ;
  /////////////////////////
  var isCategorized = "";
  if (!(state & REDIRECT)
    && !(state & HOMONYMIE)
	&& !(state & DELETE)
	&& !(state & ABFILTER)
    && ns == 0 
    && !(state & CATEGORIZED))
    postArti += '<sup title="'+lang_category_short_tip+'" style="color:crimson">'+lang_category_short+'</sup>';
 
  // Redirect, Log, or simple edit ? ;
  //////////////////
  if (state & MOVE) {
//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';
    postArti += ' <img title="'+lang_tooltips.MOVE_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/0e/Forward.png/16px-Forward.png" width="16px"/>';
    postArti += ' <a title="'+rc.new_title+lang_tooltips.SHOW_IN_PREVIEW+'" href="javascript:;" onClick="livePage(\''+rc.new_title+'\');">'+rc.new_title+'</a>';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');">'+title+'</a>';
  }
  else if (state & REDIRECT) {
    artiStyle = 'color: green; font-weight: bold; font-style: italic;';
    postArti += ' <img title="'+lang_tooltips.REDIRECT_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Redirectltr.png/24px-Redirectltr.png" width="24px"/>';
    postArti += ' <a title="'+rc.redirect+lang_tooltips.SHOW_IN_PREVIEW+'" href="javascript:;" onClick="livePage(\''+rc.redirect+'\');">'+rc.redirect+'</a>';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');">'+title+'</a>';
  } 
  else if (state & UPLOAD) {
    preArti = '<img title="'+lang_tooltips.UPLOAD_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Gartoon-Gnome-dev-floppy.png/16px-Gartoon-Gnome-dev-floppy.png" width="16px"/> ' + preArti;
    postArti += ' ('+rc.duration+')';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
  else if (state & NEWUSER) {
    preArti += '<img title="'+lang_tooltips.NEW_ACCOUNT+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Crystal_personal.png/16px-Crystal_personal.png" width="16px"/> ';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+lang_special_Centralauth+'/'+escTitle.replace(wgFormattedNamespaces[2]+':', "")+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
  else if (state & BLOCK) {
//    artiStyle = 'color: magenta; font-weight: bold; font-style: italic;';
    preArti = '<img title="'+lang_tooltips.BLOCK_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/64/Crystal_Clear_action_lock3.png/16px-Crystal_Clear_action_lock3.png" width="16px"/> ' + preArti;
	// translate duration representaion, from english to your language
	for (i=0; i<lang_duration_replace.length; i++){
		if (RegExp(lang_duration_replace[i].regex).exec(rc.duration))
			rc.duration = rc.duration.replace(new RegExp(lang_duration_replace[i].regex), lang_duration_replace[i].replace);
	}
    postArti += ' ('+rc.duration+')';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+lang_special_contrib+'/'+escTitle.replace(wgFormattedNamespaces[2]+':', "")+'\');">'+title+'</a>';
  }
  else if (state & DELETE) {
    preArti = '<img title="'+lang_tooltips.DELETE_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ef/Editcut.png/16px-Editcut.png" width="16px"/> ' + preArti;
    postArti += ' ('+rc.duration+')';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
  else if (state & PROTECT) {
    preArti = '<img title="'+lang_tooltips.PROTECT_LOG+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/72/Crystal_Clear_app_agent.png/16px-Crystal_Clear_app_agent.png" width="16px"/> ' + preArti;
	// translate duration representaion, from english to your language
	for (i=0; i<lang_duration_replace.length; i++){
		if (RegExp(lang_duration_replace[i].regex).exec(rc.duration))
			rc.duration = rc.duration.replace(new RegExp(lang_duration_replace[i].regex), lang_duration_replace[i].replace);
	}
    postArti += ' ('+rc.duration+')';
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
  else {
    arti = '<a title="'+title+lang_tooltips.SHOW_IN_PREVIEW+'" style="'+artiStyle+'" href="javascript:;" onClick="livePage(\''+escTitle+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+encodeURI(title)+'\');">'+title+'</a>';
  }
 
  td1.innerHTML = '<span style="font-size:' + RCfontsize + '">'  + tsToHhMm(timestamp) + ' • ' + diff + ' • ' + hist + ' • ' + edit + admin + ' • '
                + preArti + arti + postArti + '</span>';
  td1.className="creator-title";
  td1.style.textAlign="left";
  td1.style.border="1px";
  td1.style.width="40%";
 
  // EDITOR //
  //////////// liveArticle
  //var discut  = '<a href="'+wgServer+'/wiki/User talk:'+encodeURIComponent(user)+'" style="color:seagreen" target="_new" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';
  var discut  = '<a href="javascript:;" onClick="livePage(\''+wgFormattedNamespaces[3]+':'+user+'\');" style="color:seagreen" title="'+lang_tooltips.TALK_TIP+'">'+lang_tooltips.TALK_SHORT+'</a>';
  var contrib = '<a href="javascript:;" onClick="livePage(\''+lang_special_contrib+'/'+user+'\');" style="color:#43CD80" title="'+lang_tooltips.CONTRIB_TIP+'">'+lang_tooltips.CONTRIB_SHORT+'</a>';
  var editor = "", preEditor = "";

  // Reverted ? ;
  /////////////////
  if (state & REVERT)
    preEditor += '<img title="'+lang_tooltips.REVERT_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Nuvola_actions_undo.png/16px-Nuvola_actions_undo.png" width="16px" />&nbsp;';
	
  // Using Tools? ;
  /////////////////////////////////////////
  if ((state & TOOLS) && !(state & BOT) )
    preEditor += '<img title="'+lang_tooltips.TOOLS_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Farm-Fresh_wrench_orange.png/16px-Farm-Fresh_wrench_orange.png" width="16px"/>&nbsp;';
 
  // Bot ? ;
  //////////
  if (state & BOT)
    preEditor += '<img title="'+lang_tooltips.BOT_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Nuvola_apps_kservices.png/16px-Nuvola_apps_kservices.png" width="16px" />&nbsp;';
 
  // Sysop ? ;
  ////////////
  if (state & SYSOP)
    preEditor += '<img title="'+lang_tooltips.SYSOP_TIP+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Broom_icon.svg/16px-Broom_icon.svg.png" width="16px" />&nbsp;';
 

  // TOR potentiel / AOL
  var isTOR = new RegExp(/172\.\d+\.\d+\.\d+/);
  if (isTOR.test(user))
    preEditor += '<img title="TOR" src="http://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Dialog-warning.svg/16px-Dialog-warning.svg.png" width="16px" />&nbsp;';
 
  if (state & IP){
  editor = '<a title="'+lang_tooltips.SHOW_IN_PREVIEW+'" href="javascript:;" onClick="livePage(\''+lang_special_contrib+
 '/'+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+lang_special_contrib+'/'+user+'\');");">'+user+'</a>';
  } else {
  editor = '<a title="'+lang_tooltips.SHOW_IN_PREVIEW+'" href="javascript:;" onClick="livePage(\''+wgFormattedNamespaces[2]+':'+user+'\');" onDblClick="window.open(\''+wgServer+'/wiki/'+wgFormattedNamespaces[2]+':'+user+'\');");">'+user+'</a>';  
  }
  
  var uadmin   = '';
  if (lrcAdmin == true) {
    uadmin = ' • <a href="javascript:;" onClick="livePage(\'' + wgServer + '/wiki/' + lang_special_block + '/' + encodeURIComponent(title) +'\');" style="color:seagreen" title="'+lang_tooltips.BLOCK_TIP+'">'+lang_tooltips.BLOCK_SHORT+'</a>';
  }
 
  var uhide = '<a href="javascript:;" onClick="supprLigne(\''+pageid+'_'+revid+'\'); hideUser(\''+ user +'\');" style="color:grey" title="'+lang_tooltips.USER_HIDE_TIP+'">'+lang_tooltips.USER_HIDE_SHORT+'</a>';
 
  td2.innerHTML = '<span style="font-size:' + RCfontsize + '">'  + discut + ' • ' + contrib + ' • ' + uhide + uadmin + ' • '
                + preEditor + editor + '</span>';
  td2.className="creator-name";
  td2.style.border = "1px";
  td2.style.width = "20%";
 
  if (lstRevoc[user]) {
    td2.style.border = "2px solid red";
    td2.innerHTML += '<sup style="color:red">(' + lang_menu[0].PRE_NO + lstRevoc[user].nb + lang_menu[0].POST_NO + '<a href="javascript:removeRevoc(\'' + user + '\')">'+ lang_menu[0].RESET_NO +'</a>)</sup>'
  }
 
  // COMMENT //
  // Remplace lien [[xxx]] par <a> ;
  var wcomment = comment.htmlize();
  var regex1 = new RegExp(/\[\[(([^\]\|]*)(.*?))\]\]/g);
  wcomment = wcomment.replace(regex1, '<a title="$2'+lang_tooltips.SHOW_IN_PREVIEW+'" href="javascript:;" onClick="livePage(\'$2\');" onDblClick="window.open(\''+wgServer+'/wiki/$2\');");">$1</a>');  
  
  var regex2 = new RegExp(/\>[^\]\|<]*\|([^\]\|<]*)</g);
  wcomment = wcomment.replace(regex2, ">$1<");
 
  // Abusefilter tag ? ;
  /////////////////
  if (state & TAG) {
    wcomment += '<br /><span style="color: red; font-weight: bold;">'+lang_menu[0].TAG_NAME+' : ';
    wcomment += rc.tags[0].firstChild.nodeValue;
    for (var tagId = 1; tagId < rc.tags.length; ++tagId)
      wcomment += ' | ' + rc.tags[tagId].firstChild.nodeValue;
    wcomment += '</span>';
    td3.style.border = "2px solid red";
  } else {
  td3.style.border = "1px";
  td3.style.width = "40%";
  }
 
  //td3.innerHTML = "<small>" + wcomment + "</small>";
  td3.innerHTML = '<span style="font-size:' + RCfontsize + '">' + wcomment + '</span>';
 
 
  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 = '<img title="'+lang_tooltips.BLANKING_REPLACE+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Categorie_III.svg/16px-Categorie_III.svg.png" width="16px"/>&nbsp;';
    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 = '<img title="'+lang_tooltips.BLANKING_REPLACE+'" src="http://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Categorie_III.svg/16px-Categorie_III.svg.png" width="16px"/>&nbsp;';
    tr1.style.border = "2px solid crimson";
  }
 
  // CONTACT LIST //
  //////////////////
  if (lstContact2[user]) {
    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 < -3000)
    txtdiff = '<span style="color:red; font-weight:bold; font-size:' + RCfontsize + '">'+sizediff+'</span>';
  else if (sizediff < 0)
    //txtdiff = '<sub style="color:red">'+sizediff+'</sub>';
    txtdiff = '<span style="color:red; font-size:' + RCfontsize + '">'+sizediff+'</span>';
  else if (sizediff == 0)
    //txtdiff = '<small style="color:purple">±'+sizediff+'</small>';
	txtdiff = '<span style="color:purple; font-size:' + RCfontsize + '">±'+sizediff+'</span>';
  else if (sizediff < 3000)
    //txtdiff = '<sup style="color:blue">+'+sizediff+'</sup>';
	txtdiff = '<span style="color:blue; font-size:' + RCfontsize + '">+'+sizediff+'</span>';
  else
	txtdiff = '<span style="color:blue; font-weight:bold; font-size:' + RCfontsize + '">+'+sizediff+'</span>';
	
  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";
    lstSuiviHH[spos] = tsToHhMm(timestamp);
    var tempsAr = new Array();
    var len = lstSuivi.length;
    for (var n = 0; n < len; n++) {
      if(lstSuiviHH[n] == "--:--") continue;
      var cstilde = lstSuivi[n].replace(new RegExp(/\'/g), "\\'");
	  
      var sdiff = '<a href="javascript:;" onClick="livePage(\''+wgServer + wgScriptPath + '/index.php?title='+cstilde+'&diff='+revid+'&oldid='+oldid+'\');" style="color:orange">'+lang_tooltips.DIFF_SHORT+'</a>';
      var shist = '<a href="javascript:;" onClick="livePage(\''+wgServer + wgScriptPath + '/index.php?title=' + cstilde + '&action=history'+'\');" style="color:darkorange">'+lang_tooltips.HIST_SHORT+'</a>';
      var sarti = '<a href="javascript:;" onClick="livePage(\''+cstilde+'\');">'+lstSuivi[n]+'</a>';
      var ligne='<span style="font-size:' + RCfontsize + '">' + lstSuiviHH[n] + ' • ' + sdiff + ' • ' + shist + ' • </span>' + sarti +'<br />';
      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 + tempsAr[n];
  }
 
 
  if (lstContact2[user]) {
    lstContact2[user].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 = match[1];
      if (userR != user && userR != wgUserName) {
        if (!lstRevoc[userR]) lstRevoc[userR] = { ts: 0, nb: 0 };
        lstRevoc[userR].ts = timestamp;
        lstRevoc[userR].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<lenp; i++){
		if (page.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("type").nodeValue == 'edit'){
		//edit protected? full or semi?
			if (page.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("level").nodeValue == 'sysop'){
			state = state | FULLLOCK;
			} else {
			state = state | LOCK;
			}
		} else {		
		//move protected? full or semi?
			if (page.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("level").nodeValue == 'sysop'){
			state = state | MVFULLLOCK;
			} else {
			state = state | MVLOCK;
			}
		}
	}
  }


  if (page.getElementsByTagName('categories').length) {
    state += CATEGORIZED;
 
    var categories = page.getElementsByTagName('categories')[0].getElementsByTagName('cl');
	
    var i,j;
    var leni = categories.length;
    var lenj = categoriestests.length;
    var lenk = customcategory.length;
 
    for (i=0; i<leni; i++){
	
      for (j=0; j<lenj; j++){
        if (new RegExp(lang_category+categoriestests[j].regex, "i").test(categories.item(i).getAttributeNode("title").nodeValue))
          state = state | categoriestests[j].state;
	  }
	  
	  for (k=0; k<lenk; k++){
        if (new RegExp(lang_category+customcategory[k].regex, "i").test(categories.item(i).getAttributeNode("title").nodeValue))
          state2 = state2 | FlagsforCustomCategory[k];
	  }
	}
  }
 
  rc.state = state;
  rc.state2 = state2;
 
  getRevision(rc);
}
 
function getRedirCat2(xmlreq, data) {
  if (document.getElementById('stopLive').checked) return;
 
  var api = xmlreq.responseXML.getElementsByTagName('api')[0];
 
  if (api.firstChild.nodeName == "error") return;
 
  var log = data.log;
  var pageid = log.pageid;
  var revid = log.revid;
  var state = log.state;
  var state2 = log.state2;
 
  var redir = api.getElementsByTagName('redirects')[0];
  var query = api.getElementsByTagName('query')[0];
 
 //Redirect? ;
  if (typeof(redir) != 'undefined'){
    state = state | REDIRECT;
    if (redir.getElementsByTagName('r').item(0).getAttributeNode("to").nodeValue.length)
      log.redirect = redir.getElementsByTagName('r').item(0).getAttributeNode("to").nodeValue;
  }
  
 //Protected? ;
 
  var lenp = query.getElementsByTagName('protection')[0].getElementsByTagName('pr').length;
  
  if (lenp){
  
  for (i=0; i<lenp; i++){
		if (query.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("type").nodeValue == 'edit'){
		//Edit protection? full or semi?
			if (query.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("level").nodeValue == 'sysop'){
			state = state | FULLLOCK;
			} else {
			state = state | LOCK;
			}
		} else {
		//Move protection? full or semi?
			if (query.getElementsByTagName('protection')[0].getElementsByTagName('pr').item(i).getAttributeNode("level").nodeValue == 'sysop'){
			state = state | MVFULLLOCK;
			} else {
			state = state | MVLOCK;
			}
		}
	}
  }
  
  if (query.getElementsByTagName('categories').length) {
    state += CATEGORIZED;
 
    var categories = query.getElementsByTagName('categories')[0].getElementsByTagName('cl');
    var i,j;
    var leni = categories.length;
    var lenj = categoriestests.length;
    var lenk = customcategory.length;
 
    for (i=0; i<leni; i++){
	
      for (j=0; j<lenj; j++){
        if (new RegExp(lang_category+categoriestests[j].regex, "i").test(categories.item(i).getAttributeNode("title").nodeValue))
          state += categoriestests[j].state;
	  }
	
	  for (k=0; k<lenk; k++){
        if (new RegExp(lang_category+customcategory[k].regex, "i").test(categories.item(i).getAttributeNode("title").nodeValue))
          state2 = state2 | FlagsforCustomCategory[k];		  
	  }
    }
  
  }
  
  log.state = state;
  log.state2 = state2;
 
  getRevision(log);
}
 
// Get RC and Log
function getRC(xmlreq, data) {
  if (document.getElementById('stopLive').checked) return;
 
  var api = xmlreq.responseXML.getElementsByTagName('api')[0];
 
  if (api.firstChild.nodeName == "error") return;
 
  var rcs = api.getElementsByTagName('query')[0].getElementsByTagName('recentchanges')[0].getElementsByTagName('rc');
  var i,j,leni,lenj,rc;
 
  leni=rcs.length;
  for (i=leni-1; i>=0; i--) {
    // Using rcid as revid can be 0 (e.g. when moving a page)
    if (rcs[i].getAttribute('rcid') <= lastrcid) continue;
 
    rc = new Object();
    rc.state = 0;
    rc.state2 = 0;
 
    lenj = rcs[i].attributes.length;
    for (j=0; j<lenj; j++) {
      switch(rcs[i].attributes[j].name) {
        case 'anon':
          rc.state += IP;
          break;
        case 'bot':
          rc.state += BOT;
          break;
        case 'new':
          rc.state += NEW;
          break;
        case 'minor':
          rc.state += MINOR;
          break;
        case 'new_ns':
          rc.state += NEWNS;
          break;
        case 'new_title':
          rc.state += RENAMED;
          break;
        case 'patrolled':
          rc.state += PATROLLED;
          break;
        case 'type':
          break;
        default:
          rc[rcs[i].attributes[j].name] = rcs[i].attributes[j].value;
          break;
      }
    }
 
    var tags = rcs[i].getElementsByTagName('tags')[0].getElementsByTagName('tag');
    if (tags.length) {
      rc.state += TAG;
      rc.tags = tags;
    }
 
    if (typeof(rc.comment) != "undefined") {
      lenj = commenttests.length;
      for (j=0; j<lenj; j++)
        if (new RegExp(commenttests[j].regex).test(rc.comment))
          rc.state += commenttests[j].state;
    }
 
    if (rc.newlen == 0) rc.state += BLANKING;
 
    if (lstSysop.indexOf(rc.user) != -1)
      rc.state += SYSOP;
 
    var mitigating = (rc.state & REVERT)
      || (rc.state & BLANKING)
      || (rc.state & REPLACED)
      || (rc.state & TAG)
      || (lstContact2[rc.user])
      || (lstRevoc[rc.user])
      || (rc.user == wgUserName);
 
    if (document.getElementById('showIP').checked
      && !(rc.state & IP)
      && !mitigating ) continue;
 
    /*if ((rc.state & PATROLLED)
      && document.getElementById('showIPNEW').checked
      && !mitigating ) continue;*/
 
    if ((typeof(rc.logtype) != "undefined")
      && rc.logtype == "newuser") continue;
 
 
    if (lstHidden[rc.user] && !mitigating) continue;
	
    wpajax.http({url: wgServer + wgScriptPath + '/api.php?titles=' + encodeURIComponent(rc.title) + '&action=query&prop=categories|info&redirects&inprop=protection&cllimit=20&format=xml',
                 onSuccess: getRedirCat, rc: rc });
    
  } 
 
  // Log
  var logs = api.getElementsByTagName('query')[0].getElementsByTagName('logevents')[0].getElementsByTagName('item');
  var i,j,leni,lenj,log;
 
  leni=logs.length;
  for (i=leni-1; i>=0; i--) {
    if (logs[i].getAttribute('logid') <= lastlogid) continue;
    log = new Object();
    log.state = 0;
    log.state2 = 0;
 
    lenj = logs[i].attributes.length;
    for (j=0; j<lenj; j++) {
        if (logs[i].attributes[j].name == 'type')
        {
          switch(logs[i].attributes[j].value) {
            case 'patrol':
// I "Segna come verificata" non li cago
            log.state += PATROL; 
              break;
            case 'newusers':
              log.state += NEWUSER;
			  log.detail = logs[i].getAttribute("action");
			  	for (var _i=0; _i<lang_newaccountlog_replace.length; _i++){
					if (log.detail == lang_newaccountlog_replace[_i].before)
					log.detail = lang_newaccountlog_replace[_i].after;
				}
              break;
            case 'upload':
              log.state += UPLOAD;
			  log.duration = logs[i].getAttribute("action");
			  	for (var _i=0; _i<lang_uploadlog_replace.length; _i++){
					if (log.duration == lang_uploadlog_replace[_i].before)
					log.duration = lang_uploadlog_replace[_i].after;
				}
              break;
            case 'block':
              log.state += BLOCK;
			  log.duration = logs[i].getAttribute("action");
			  	for (var _i=0; _i<lang_blocklog_replace.length; _i++){
					if (log.duration == lang_blocklog_replace[_i].before)
					log.duration = lang_blocklog_replace[_i].after;
				}
              if (logs[i].firstChild){
                log.duration += ": " + logs[i].firstChild.getAttribute('duration');
                log.detail = logs[i].firstChild.getAttribute('flags');				
				/*for (i=0; i<lang_blockflag_replace.length; i++){
					if (RegExp(lang_blockflag_replace[i].regex).exec(log.detail))
						log.detail = log.detail.replace(new RegExp(lang_blockflag_replace[i].regex), 
						lang_blockflag_replace[i].replace);
					}*/
				}
              break;
            case 'delete':
              log.state += DELETE;
			  log.duration = logs[i].getAttribute("action");
			  	for (var _i=0; _i<lang_deletelog_replace.length; _i++){
					if (log.duration == lang_deletelog_replace[_i].before)
					log.duration = lang_deletelog_replace[_i].after;
				}
              break;
            case 'move':
              log.state += MOVE;
              if (logs[i].firstChild)
                log.new_title = logs[i].firstChild.attributes[1].value;
              break;
            case 'protect':
              log.state += PROTECT;
			  log.duration = logs[i].getAttribute("action");
			  	for (var _i=0; _i<lang_protectlog_replace.length; _i++){
					if (log.duration == lang_protectlog_replace[_i].before)
					log.duration = lang_protectlog_replace[_i].after;
				}
              break;
            case 'review':
              log.state += REVIEW;
              break;
            default:
              break;
          }
        }
        else
          log[logs[i].attributes[j].name] = logs[i].attributes[j].value;
 
        //Set a dummy revid to prevent deletion
        log.revid=log.logid;
    }
	if (typeof(log.detail) != "undefined")
		log.comment += ": (" + log.detail + ")";
	
    if (typeof(log.comment) != "undefined") {
      lenj = commenttests.length;
      for (j=0; j<lenj; j++)
        if (new RegExp(commenttests[j].regex).test(log.comment))
          log.state += commenttests[j].state;
    }
 
    if (lstSysop.indexOf(log.user) != -1)
      log.state += SYSOP;
 
    if (!(log.state & REVIEW))
    wpajax.http({url: wgServer + wgScriptPath + '/api.php?titles=' + encodeURIComponent(log.title) + '&action=query&prop=categories|info&redirects&inprop=protection&cllimit=20&format=xml',
               onSuccess: getRedirCat2, log: log });
  } 
 
 // Filters
  var filters = api.getElementsByTagName('query')[0].getElementsByTagName('abuselog')[0].getElementsByTagName('item');
  var i,j,leni,lenj,filter;
 
  leni=filters.length;
  for (i=leni-1; i>=0; i--) {
    if (filters[i].getAttribute('id') <= lastfilterid) continue;
    filter = new Object();
    filter.state = ABFILTER;
 
    lenj = filters[i].attributes.length;
    for (j=0; j<lenj; j++) {
        filter[filters[i].attributes[j].name] = filters[i].attributes[j].value;
    }
 
    //Set a dummy revid to prevent deletion
    filter.revid = filter.id
 
    // Get filter description
 
 
    //Set a dummy revid to prevent deletion
    filter.revid = filter.id
 
    wpajax.http({url: wgServer + wgScriptPath + '/api.php?action=query&list=abusefilters&abflimit=1&format=xml&abfstartid=' + filter.filter_id,
               onSuccess: getFilterTitle, filter: filter });
  } 
 
 
  lastrcid = rcs[0].getAttribute('rcid');
  lastlogid = logs[0].getAttribute('logid');
  lastfilterid = filters[0].getAttribute('id');
  lastrctimestamp = rcs[0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");
  lastletimestamp = logs[0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");
  lastafltimestamp = filters[0].getAttribute('timestamp').replace(new RegExp(/\D/g), "");
  document.getElementById('tsInit').innerHTML = lang_menu[0].TIMESTMP + " : " + lastrctimestamp ;
}
 
function getFilterTitle(xmlreq, data) {
  var filter = data.filter;
 
  var xmlinfo = xmlreq.responseXML.getElementsByTagName('api')[0];
 
  if (xmlinfo.firstChild.nodeName == "error") return;
  

	for (var _i=0; _i<lang_filterlog_replace.length; _i++){
		if (filter.result == lang_filterlog_replace[_i].before)
			filter.result = lang_filterlog_replace[_i].after;
	}
  
  filter.comment = '[[Special:AbuseFilter/'+xmlinfo.getElementsByTagName('abusefilters')[0].getElementsByTagName('filter')[0].getAttribute('id')+'|'+lang_menu[0].FILT_NO+' ';
  filter.comment += xmlinfo.getElementsByTagName('abusefilters')[0].getElementsByTagName('filter')[0].getAttribute('id'); 
  filter.comment += ']]: ';
  filter.comment += xmlinfo.getElementsByTagName('abusefilters')[0].getElementsByTagName('filter')[0].getAttribute('description');
  filter.comment += ' ('+lang_menu[0].ACTION+': '+ filter.result + ')';
 
  getRevision(filter);
}
 
function liveRC() {
  timer= setTimeout("liveRC()",refresh*1000);
 
  if (document.getElementById('stopLive').checked) return;
 
  var rcns = document.getElementById('showNS0').value;
  if (rcns == null) return;
 
  wpajax.http({url:wgServer + wgScriptPath
    + '/api.php?action=query&list=recentchanges|logevents|abuselog&rcnamespace=' + rcns
    + '&rcprop=user|comment|flags|timestamp|title|ids|sizes|tags' + (lrcPatrol ? '|patrolled' : '')
    + (document.getElementById('showBot').checked ? '&rcshow=!bot' : '')
    + '&rcend=' + lastrctimestamp + '&rclimit=' + lrcRCAPILimit
    + '&leend=' + lastletimestamp + '&lelimit=' + lrcRCAPILimit
    + '&aflend=' + lastafltimestamp + '&afllimit=' + lrcRCAPILimit
    + '&format=xml',
    onSuccess: getRC, message: "Traitement en cours...\n\n" });
}   
 
function hideUser(name) {
   lstHidden[name] = true;
   updateHidden();
}
 
function unhideUser(name) {
   delete lstHidden[name];
   updateHidden();
}
 
function showHideObj(parent, fils) {
  var ofils = document.getElementById( fils );
  if (parent.checked)
    ofils.style.display="inline";
  else
    ofils.style.display="none";
}
 
function liveRCInit()
{
  wpajax.http({ url: wgServer + wgScriptPath + '/api.php?action=query&meta=userinfo&uiprop=rights&format=xml', 
                onSuccess: getRights});
}

addOnloadHook(function () {
if ((wgPageName == "Wikipedia:LiveRC") || (wgPageName == wgFormattedNamespaces[2] +":"+ wgUserName +"/LiveRC") || (wgPageName == wgFormattedNamespaces[2] +":EDUCA33E/LiveRC")) {
    var top        = document.getElementById( 'top' );
    if (top != null) {
        top.innerHTML = "";
        top.style.display = "none";
    }
    var siteSub    = document.getElementById( 'siteSub' );
    var contentSub = document.getElementById( 'contentSub' );
    var rtb        = document.getElementById( 'RealTitleBanner' );
    var rt         = document.getElementById( 'RealTitle' );
    var pca        = document.getElementById( 'p-cactions' );
 
 
    if (siteSub != null) siteSub.style.display = "none";
    if (contentSub != null) contentSub.style.display = "none";
    if (rtb != null) rtb.style.display = "none";
    if (rt != null) rt.style.display = "none";
    if (pca != null) pca.style.display = "none";
 
    /*var showIPNEWbox = '';
    if (lrcPatrol)
      showIPNEWbox = '<input id="showIPNEW"    type="checkbox" ' + lrcShowIPNEWChecked + '/>' +
        '<label for="showIPNEW">'   + lang_menu[0].IPNEW  + ' </label>';
	*/
    var lvSubPreviewTitle = document.getElementById( 'sublivePreviewTitle' );
		lvSubPreviewTitle.innerHTML = '<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'subdivLivePreview\');" />' +
										'<input style="width: 250px;" id="LivePreviewTitle" value="'+lang_menu[0].DEFAULTPAGE+'"/> <a href="javascript:livePage(document.getElementById(\'LivePreviewTitle\').value);">'+lang_menu[0].GO+'</a>';
										//lvSubPreviewTitle.innerHTML + '  ';
									  
    var lvUserPreviewTitle = document.getElementById( 'userlivePreviewTitle' );								
		var userInfol = lstUserInfo.length;
		var userInfoHtml = '';
		for (j=0; j<userInfol; j++) {
			userInfoHtml += ' • <a id="UserInfoChk'+j+'" style="color:silver; cusor:default; textDecoration:none;"><NOBR>' + 
							lstUserInfo[j].siteName+'</NOBR></a>';
			}
		lvUserPreviewTitle.innerHTML = //'<input id="userInfoCheck"  type="checkbox" onclick="showHideObj(this, \'userdivLivePreview\');" />' + 
										lvUserPreviewTitle.innerHTML + '  ' + '<small>' + userInfoHtml + '</small>';
  
    var lvPagePreviewTitle = document.getElementById( 'pagelivePreviewTitle' );								
		var pageInfol = lstPageInfo.length;
		var pageInfoHtml = '';
		for (j=0; j<pageInfol; j++) {
			pageInfoHtml += ' • <a id ="PageInfoChk'+j+'" style="color:silver; cusor:default; textDecoration:none;"><NOBR>'+lstPageInfo[j].siteName+'</NOBR></a>';
			}
		lvPagePreviewTitle.innerHTML = //'<input id="pageInfoCheck"  type="checkbox" onclick="showHideObj(this, \'pagedivLivePreview\');" />' + 
										lvPagePreviewTitle.innerHTML + '  ' + '<small>' + pageInfoHtml + '</small>';
	
    var lvPreviewFoot = document.getElementById( 'livePreviewFoot' );
    lvPreviewFoot.innerHTML = '<a href="javascript:;" onClick="supprLigne(\'*\');" style="color: red; font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'d\');" style="color: rgb(255, 235, 71); font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'r\');" style="color: rgb(255, 99, 83); font-weight: bold;">X</a>' +
      '<a href="javascript:;" onClick="supprLigne(\'n\');" style="color: rgb(178, 243, 113); font-weight: bold;">X</a>' +
      '<input id="stopLive"  type="checkbox" value="true" />' +
      '<label for="stopLive">' + lang_menu[0].PAUSE   + '</label>' +
      //'<input id="shidPrev"  type="checkbox" onclick="showHideObj(this, \'subdivLivePreview\');" />' +
      //'<label for="shidPrev">' + lang_menu[0].PREVIEW + '</label>' +
      '<input id="shidList"  type="checkbox" onclick="showHideObj(this, \'liveFollow\');" />' +
      '<label for="shidList">' + lang_menu[0].LISTS   + '</label>' +
      //'<input id="showDiffR" type="checkbox" />' +
      //'<label for="showDiffR">'+ lang_menu[0].LOWDIFF + '</label>' +
      '<input id="showBot"   type="checkbox" ' + lrcShowBotChecked + ' />' +
      '<label for="showBot">'  + lang_menu[0].NOBOTS  + '</label>' + 
      '<input id="showIP"    type="checkbox" ' + lrcShowIPChecked + '/>' +
      '<label for="showIP">'   + lang_menu[0].IPONLY  + ' </label>' +
      //showIPNEWbox +
      '<input id="showRC"    type="checkbox" ' + lrcShowRCChecked + ' />' +
      '<label for="showRC">'   + lang_menu[0].RCLABEL  + ' </label>' +
      '<input id="showLog"    type="checkbox" ' + lrcShowLogChecked + '/>' +
      '<label for="showLog">'   + lang_menu[0].LOGSHOW  + ' </label>' +
      '<input id="showFilter"    type="checkbox" ' + lrcShowFilterChecked + '/>' +
      '<label for="showFilter">'   + lang_menu[0].ABSHOW  + ' • </label>' +
      '<span id="selectNS" />';
 
//      '<input id="shidRC"    type="checkbox" checked onclick="showHideObj(this, \'divTabRC\');" />' +
//      '<label for="shidRC">'   + lang_menu[0].RCLABEL + '</label>' +
 
    if (lrcPreviewHeight) document.getElementById('livePreview').style.height = lrcPreviewHeight;
 
    var _len = lstContact.length;
    lstContact2 = new Array();
    for (var _i=0; _i<_len; _i++)
      lstContact2[lstContact[_i]] = { ts: 0 };
 
    // Main
    liveRCInit();
  }
});

//};
/* </source> */