MediaWiki:Common.js

Материал из ПокеВики
Перейти к: навигация, поиск
/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */

function preserveSearch()
{
 alert(1);
 if ( ($search.value== '') /* &&(!$search.hasFocus()) */ ) return;
 alert(2);
 var $body=document.getElementById('searchBody');
 alert(3);
 if ($body) $body.style.display='block !important';
}
function unpreserveSearch()
{
  var $force=false;
  if (typeof(arguments[0])!='undefined') $force=arguments[0];
  if ( ( ($search.value!='') /* ||($search.hasFocus()) */ ) && (!$force) ) return;

  var $body=document.getElementById('searchBody');
  if (!$body) return;
  if ($force) $body.style.display='none';
  $body.style.display='';
}
var $search=document.getElementById('searchInput');
if ($search)
{
  $search.addEventListener('keypress', preserveSearch);
  $search.addEventListener('focus', preserveSearch);
  $search.addEventListener('blur', unpreserveSearch);
  var $cross=document.createElement('a');
  $cross.innerHTML='x';
  $cross.style.cssFloat='right';
  $cross.href='javascript:unpreserveSearch(true)';
  var $target=document.getElementById('searchform');
  if ($target) $target.appendChild($cross);
}

//кнопка викификатора
if (wgAction == 'edit' || wgAction == 'submit') {
importScriptURI('//ru.wikipedia.org/w/index.php?title=MediaWiki:Wikificator.js&action=raw&ctype=text/javascript')
mwCustomEditButtons['wikif']  = [function(){Wikify()}, '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png', 'Викификатор — автоматический обработчик текста']
if ( typeof $j != 'undefined' && typeof $j.fn.wikiEditor != 'undefined' ) {
  $j( function() {$j( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {'section': 'main','group': 'format','tools': { 'wikif': {
     label: 'Викификатор', type: 'button', icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
     action: { type: 'callback', execute: function(){Wikify()} }}}});});
}
}

//Кнопки быстрого описания правки
 
//список кнопок
function SummaryButtons(){
 var wpSummary = document.getElementById('wpSummary')
 if (!wpSummary || (wpSummary.form.wpSection && wpSummary.form.wpSection.value == 'new')) return
 wpSummaryBtn = document.createElement('span') //global var
 wpSummaryBtn.id = 'userSummaryButtonsA'

// +Рекомендация
 var wpSummaryBtnRec = document.createElement('i')
 wpSummaryBtnRec.appendChild(document.createTextNode('Пожалуйста, если вы не торопитесь, опишите вашу правку подробно: например, не «дополнение», а «+персонажи».'))
 wpSummaryBtnRec.appendChild(document.createElement('br'))
 wpSummaryBtn.appendChild(wpSummaryBtnRec)

 wpSummary.parentNode.insertBefore(wpSummaryBtn, wpSummary.nextSibling)
 wpSummary.parentNode.insertBefore(document.createElement('br'), wpSummary.nextSibling)
 addSumButton('викиф.', 'викификация', 'Произведена викификация')
 addSumButton('оформл.', 'оформление', 'Оформление')
 addSumButton('стиль', 'стилевые правки', 'Стилевые правки')
 addSumButton('орфогр.', 'орфография', 'Поправлена орфография')
 addSumButton('пункт.', 'пунктуация', 'Изменена пунктуация')
// addSumButton('интервики', 'интервики', 'Изменены межъязыковые ссылки (интервики)')
 addSumButton('кат.', 'правка категорий', 'Изменены категории')
 addSumButton('шаб.', 'шаблон', 'Добавлен / изменён шаблон')
 addSumButton('к удал.', 'к удалению', 'Страница предложена к удалению')
 addSumButton('доп.', 'дополнение', 'Добавлены новые сведения')
 addSumButton('иллюстрация', 'иллюстрация', 'Размещена иллюстрация')
 addSumButton('обнов.', 'обновление данных', 'Обновлены устаревшие данные')
 addSumButton('разметка', 'правка разметки', 'Изменение разметки')
}
 
//код вставки кнопок быстрого описания
function addSumButton(name, text, title) {
 var btn = document.createElement('a')
 btn.appendChild(document.createTextNode(name))
 btn.title = title
 btn.onclick = function(){insertSummary(text)}
 wpSummaryBtn.appendChild(btn)
}
 
//код вставки описания
function insertSummary(text) {
 var wpSummary = document.getElementById('wpSummary')
 if (wpSummary.value.indexOf(text) != -1) return 
 if (wpSummary.value.match(/[^,; \/]$/)) wpSummary.value += ','
 if (wpSummary.value.match(/[^ ]$/)) wpSummary.value += ' '
 wpSummary.value += text
}

//вызов функции вставки кнопок быстрого описания правки при загрузке страницы
addOnloadHook(SummaryButtons)

//перемещение ссылок "править" влево, к заголовку секции, для борьбы с багом движка
addOnloadHook(function() {
    if (typeof oldEditsectionLinks != 'undefined' && oldEditsectionLinks)   return;
    var spans = document.getElementsByTagName("span");
    for (var i=0; i<spans.length; i++) {
        var span = spans[i];
        if (span.className != "editsection")    continue;
        span.style.fontSize = "x-small";
        span.style.fontWeight = "normal";
        span.style.styleFloat = "none"; // IE-Fix für die folgende Zeile
        span.style.cssFloat = "none";
        span.style.marginLeft = "0px";
        span.parentNode.appendChild(document.createTextNode(" "));
        span.parentNode.appendChild(span);
    }
});

//Скрываемый текст
 
var NavigationBarHide = '[скрыть]'
var NavigationBarShow = '[показать]'
 
var hasClass = (function (){
 var reCache = {}
 return function (element, className){
   return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className)
  }
})()
 
/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
 *  Maintainers: [[**MAINTAINERS**]]
 */
var autoCollapse = 2;
var collapseCaption = 'скрыть';
var expandCaption = 'показать';
 
function collapseTable( tableIndex ) {
	var Button = document.getElementById( 'collapseButton' + tableIndex );
	var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
	if ( !Table || !Button ) {
		return false;
	}
 
	var Rows = Table.rows;
 
	if ( Button.firstChild.data == collapseCaption ) {
		for ( var i = 1; i < Rows.length; i++ ) {
			Rows[i].style.display = 'none';
		}
		Button.firstChild.data = expandCaption;
	} else {
		for ( var i = 1; i < Rows.length; i++ ) {
			Rows[i].style.display = Rows[0].style.display;
		}
		Button.firstChild.data = collapseCaption;
	}
}
 
function createCollapseButtons() {
	var tableIndex = 0;
	var NavigationBoxes = new Object();
	var Tables = document.getElementsByTagName( 'table' );
 
	for ( var i = 0; i < Tables.length; i++ ) {
		if ( hasClass( Tables[i], 'collapsible' ) ) {
			/* only add button and increment count if there is a header row to work with */
			var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
			if( !HeaderRow ) continue;
			var Header = HeaderRow.getElementsByTagName( 'th' )[0];
			if( !Header ) continue;
 
			NavigationBoxes[tableIndex] = Tables[i];
			Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
 
			var Button     = document.createElement( 'span' );
			var ButtonLink = document.createElement( 'a' );
			var ButtonText = document.createTextNode( collapseCaption );
 
			Button.className = 'collapseButton'; // Styles are declared in MediaWiki:Common.css
 
			ButtonLink.style.color = Header.style.color;
			ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
			ButtonLink.setAttribute( 'href', "javascript:collapseTable(" + tableIndex + ");" );
			ButtonLink.appendChild( ButtonText );
 
			Button.appendChild( document.createTextNode( '[' ) );
			Button.appendChild( ButtonLink );
			Button.appendChild( document.createTextNode( ']' ) );
 
			Header.insertBefore( Button, Header.childNodes[0] );
			tableIndex++;
		}
	}
 
	for ( var i = 0;  i < tableIndex; i++ ) {
		if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
			collapseTable( i );
		}
	}
}
 
addOnloadHook( createCollapseButtons );
 
/** Test if an element has a certain class **************************************
 *
 * Description: Uses regular expressions and caching for better performance.
 * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
 */
 
var hasClass = (function() {
	var reCache = {};
	return function( element, className ) {
		return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
	};
})();

// Collapsible Divs

function collapsibleDivs(){
 var navIdx = 0, colNavs = [], i, NavFrame
 var divs = document.getElementById('content').getElementsByTagName('div')
 for (i=0; NavFrame = divs[i]; i++) {
   if (!hasClass(NavFrame, 'NavFrame')) continue
   NavFrame.id = 'NavFrame' + navIdx
   var a = document.createElement('a')
   a.className = 'NavToggle'
   a.id = 'NavToggle' + navIdx
   a.href = 'javascript:collapseDiv(' + navIdx + ');'
   a.appendChild(document.createTextNode(NavigationBarShow))
   for (var j=0; j < NavFrame.childNodes.length; j++)
     if (hasClass(NavFrame.childNodes[j], 'NavHead'))
       NavFrame.childNodes[j].appendChild(a)
   colNavs[navIdx++] = NavFrame
 }

 for (i=0; i < navIdx; i++)
  if (hasClass(colNavs[i], 'expanded'))
     collapseDiv(i)
}
 
function collapseDiv(idx) {
 var div = document.getElementById('NavFrame' + idx)
 var btn = document.getElementById('NavToggle' + idx)
 if (!div || !btn) return false
 var isShown = (btn.firstChild.data == NavigationBarHide)
 btn.firstChild.data = isShown ? NavigationBarShow : NavigationBarHide 
 var disp = isShown ? 'none' : 'block'
 for (var child = div.firstChild;  child != null;  child = child.nextSibling)
   if (hasClass(child, 'NavPic') || hasClass(child, 'NavContent')) 
      child.style.display = disp
}

//вызов функций для скрываемого текста
addOnloadHook(collapsibleDivs)

/* Переключаемые версии имён и названий. */

if (wgNamespaceNumber===0)
{
 addOnloadHook(setVersionsButtons);
}

function getInnerTags($source, $class)
{
 var $list=$source.childNodes, $result=new Array(), $rec=new Array();
 var $limit=0, $tag='SPAN';
 if (typeof(arguments[2])=='string') $tag=arguments[2].toUpperCase();
 if (typeof(arguments[3])=='number') $limit=arguments[3];
 for (var $i=0; $i<$list.length; $i++)
 {
  if (($list[$i].tagName==$tag)&&(hasClass($list[$i], $class))) $result[$result.length]=$list[$i];
  if (($limit>0)&&($result.length>=$limit)) break;
  $rec=getInnerTags($list[$i], $class, $tag, $limit-$result.length);
  if ($rec) $result=$result.concat($rec);
  if (($limit>0)&&($result.length>=$limit)) break;
 }
 if ($limit==1) return $result[0];
 else return $result;
}

var $vers_glossary=new Array(), $vers_current=new Array();
const $vers_var=['translit', 'transcript', 'kiriji'];
const $vers_cases=['im', 'rod', 'dat', 'vin', 'tvor', 'pred', 'impl', 'rodpl', 'datpl', 'vinpl', 'tvorpl', 'predpl'];

/* Установка кнопок */
function setVersionsButtons()
{
 var $holder=getInnerTags(document.body, 'versionswitcher', 'div');
 if (!$holder) return true;
 if ($holder.length==0) return true;
 var $buttons, $words, $var, $whole=false;
 if (hasClass($holder[0], 'wholedoc')) $whole=true;
 for (var $h=0; $h<$holder.length; $h++)
 {
  if (!$whole) $vers_current[$h]=0;
  $buttons=getInnerTags($holder[$h], 'versionbutton', 'span');
  for (var $b=0; $b<$buttons.length; $b++)
  {
   for ($i=0; $i<$vers_var.length; $i++)
   {
    if (hasClass($buttons[$b], $vers_var[$i])) { $var=$i; break; }
   }
   $buttons[$b].id='var'+(($whole)?('W'):($h))+'-'+$i;
   if ($buttons[$b].addEventListener) $buttons[$b].addEventListener('click', pickVariant, false);
   else if ($buttons[$b].attachEvent)$buttons[$b].attachEvent('onclick', pickVariant);  
  }
  if ($whole) break;
 }
 
 if ($whole) $vers_current=0;
 if ($whole) $holder=getInnerTags(document.body, 'versiondata', 'span');
 for (var $h=0; $h<$holder.length; $h++)
 {
  $vers_glossary[$h]=new Array();
  $buttons=getInnerTags($holder[$h], 'wordvariant', 'span');
  for (var $b=0; $b<$buttons.length; $b++)
  {
   $words=$buttons[$b].innerHTML;
   $words=$words.split(',');
   if ($words.length==1) $words=multArray($words, 12);
   else if ($words.length==6) $words=multArray($words, 2);
   for ($i=0; $i<$vers_var.length; $i++)
   {
    if (hasClass($buttons[$b], $vers_var[$i])) $vers_glossary[$h][$i]=$words;
   }
  }
 }
}

function multArray($arr, $mult)
{
 if ($mult==1) return $arr;
 var $result=new Array();
 for (var $x=0; $x<$mult; $x++)
  for (var $i=0; $i<$arr.length; $i++)
   $result[$x*$arr.length+$i]=$arr[$i];
 return $result;
}

function pickVariant(e)
{
 if (!e) var e = window.event;
 var $button;
 if (e.target) $button = e.target;
 else if (e.srcElement) $button = e.srcElement;
 if ($button.tagName=='U') $button=$button.parentNode;
 var $id=$button.id.substr(3);
 $id=$id.split('-');
 var $group=$id[0], $pick=$id[1];
 if (($group!='W')&&($vers_current[$group]==$pick)) return true;
 if (($group=='W')&&($vers_current==$pick)) return true;
 var $varianted=getInnerTags(document.body, 'varianted', 'span');
 for ($v=0; $v<$varianted.length; $v++)
 {
  for ($c=0; $c<12; $c++)
  {
   if (hasClass($varianted[$v], 'case'+$vers_cases[$c]))
   {
    if ($group=='W')
    {
     for (var $g=0; $g<$vers_glossary.length; $g++)
     {
      if ($varianted[$v].innerHTML==$vers_glossary[$g][$vers_current][$c]) { $varianted[$v].innerHTML=$vers_glossary[$g][$pick][$c]; break; }
      else if ($varianted[$v].innerHTML==ucfirst($vers_glossary[$g][$vers_current][$c])) { $varianted[$v].innerHTML=ucfirst($vers_glossary[$g][$pick][$c]); break; }
     }
    }
    else
    {
     if ($varianted[$v].innerHTML==$vers_glossary[$group][$vers_current[$group]][$c]) $varianted[$v].innerHTML=$vers_glossary[$group][$pick][$c];
     else $varianted[$v].innerHTML=ucfirst($vers_glossary[$group][$pick][$c]);
    }
   }
  }
 }
 if ($group=='W') $vers_current=$pick;
 else $vers_current[$group]=$pick;
}

function ucfirst (str) {
    // Makes a string's first character uppercase  
    // 
    // version: 1008.1718
    // discuss at: http://phpjs.org/functions/ucfirst    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: ucfirst('kevin van zonneveld');
    // *     returns 1: 'Kevin van zonneveld'    str += '';
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1);
}