MediaWiki:Common.js

维基语录,自由的名人名言录

注意:在保存以后,您必须清除浏览器的缓存才能看到所作出的改变:Mozilla: 点击刷新(或ctrl-r), IE / Opera: ctrl-f5, Safari: cmd-r, Konqueror ctrl-r

/*
所有用戶在加載任何頁面時,這裡的JavaScript都會加載
*/
mw.log.deprecate( window, 'JSConfig', {} );

//mw.loader.using(['mediawiki.util', 'ext.gadget.site-lib'], function () {
//  (function ($, mw) {

    /* 當需要時載入對應的 scripts */
    if (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit" || mw.config.get('wgCanonicalSpecialPageName') == 'Search') { // scripts specific to editing pages
      importScript('MediaWiki:Common.js/edit.js');
    }
//  });
//})
    /*
==定期強制用戶更新cache==

*/
mw.loader.using(['mediawiki.cookie'], function () {
  (function ($, mw) {
     if( (""+mw.config.get('wgUserGroups')).indexOf("user")!=-1 && (mw.config.get('wgAction')=="view") ) {
     var today=new Date();
        if(!mw.cookie.get("lastload") || isNaN(mw.cookie.get("lastload")) ){
           mw.cookie.set("lastload", today.getTime());
        } else {
          if( today.getTime()-mw.cookie.get("lastload") >= 7*24*60*60*1000 ){
                 mw.cookie.set("lastload", today.getTime());
                if( mw.cookie.get("lastload")==today.getTime() ) window.location.reload(true);

          } else if ( today.getTime()-mw.cookie.get("lastload") < 0 ) {
              mw.cookie.set("lastload", today.getTime());
          }
       }
    }
 });
})
/*
== 中文處理 ==

*/

//返回繁簡字串
function wgULS(hans,hant,cn,tw,hk,sg,zh){
	ret = {
		'zh-hans':hans||cn||sg,
		'zh-hant':hant||tw||hk,
		'zh-cn':cn||hans||sg,
		'zh-sg':sg||hans||cn,
		'zh-tw':tw||hant||hk,
		'zh-hk':hk||hant||tw
	}
	if (ret[mw.config.get('wgUserLanguage')])
		return ret[mw.config.get('wgUserLanguage')];
	else
		return zh||hant||hans||cn||tw||hk||sg;//保證每一語言有值
}

/*
== 辅助处理 ==
*/
//功能設定
if(!window.JSConfig){var JSConfig={};}
JSConfig.collapseText=wgULS('隐藏▲','隱藏▲');//指示折叠收缩的默认文字
JSConfig.expandText=wgULS('显示▼','顯示▼');//指示折叠展开的默认文字
JSConfig.autoCollapse=2;  //文章少于 autoCollapse 个折叠块时,不自动折叠
JSConfig.SpecialSearchEnhancedDisabled=false; //是否禁止增加其它搜索引擎

//遍历
function applyEach(callback,array){
	var i=0,j=array.length;
	while(i<j){callback(array[i++]);}
}

// 移動元素
function elementMoveto(node, refNode, pos){//默认位置为refNode前
	if(node && refNode){
		var parent=refNode.parentNode;
		if (pos && pos=='after') {refNode=refNode.nextSibling;}
		try {
			if(refNode){
				parent.insertBefore(node, refNode);
			}else{
				parent.appendChild(node);
			}
		} catch (DOMException) {};
	}
}
//创建元素
function createElement(tag,children,props){
	var element = document.createElement(tag);
	if(!(children instanceof Array)){children=[children];}
	applyEach(function(child){
		if(typeof child=='string'){child=document.createTextNode(child);}
		if(child){element.appendChild(child);}
	},children);
	if(typeof props=='object'){
		for(var k in props){
			switch(k){
			case 'styles':
				var styles=props.styles;
				for(var s in styles){element.style[s]=styles[s];}
				break;
			case 'events':
				var events=props.events;
				for(var e in events){ addHandler(element,e,events[e]); }
				break;
			case 'class':
				element.className=props[k];break;
			default:
				element.setAttribute(k,props[k]);
			}
		}
	}
	return element;
}

//wiki URL
var wgProjectURL={
	en:'//en.wikiquote.org',de:'//de.wikiquote.org',fr:'//fr.wikiquote.org',
	pl:'//pl.wikiquote.org',es:'//es.wikiquote.org',it:'//it.wikiquote.org',
	ru:'//ru.wikiquote.org',pt:'//pt.wikiquote.org',sk:'//sk.wikiquote.org',
	tr:'//tr.wikiquote.org',//僅列前十名其它語言語錄
	m:'//meta.wikimedia.org',b:'//zh.wikipedia.org',q:'//zh.wikibooks.org',
	n:'//zh.wikinews.org',wikt:'//zh.wiktionary.org',mw:'//www.mediawiki.org',
	commons:'//commons.wikimedia.org'
}
/**
* 将页面名称转换为URL
*
* @param page 页面名称
* @param paras 附加后缀对象,用空对象{}做参数可以取得源码
*/
function getWikiPath(page,paras){
	var reg=/^[a-z]+:/;
	var pre=page.match(reg);
	pre = pre && wgProjectURL[pre[0].replace(/:$/,'').toLowerCase()];
	if (pre) {page=page.replace(reg,'');} else {pre=mw.config.get('wgServer');} //保障没有相对路径,以照顾在线代理。
	var url = pre + mw.config.get('wgScript') + '?title=' + encodeURI( page.replace( ' ', '_' ) );
	if(typeof paras=='object'){
		paras.ctype=paras.ctype||'text';
		paras.dontcountme=paras.dontcountme||'s';
		paras.action=paras.action||'raw';
		for(var k in paras){url += '&' + k + '=' + paras[k]; }
	}
	return url;
}

//引入[[Special:Gadgets]]要求的腳本和樣式
if(window.requireScripts instanceof Array){
	applyEach(importScript,requireScripts);
}
if(window.requireStylesheets instanceof Array){
	applyEach(importStylesheet,requireStylesheets);
}

/*

== IE兼容性修正 ==
*/
function fixIE(){
}

/*

== 增加摺疊功能 ==
*/
/** 摺疊 div table *****************************
 *  Description: 实现div.NavFrame和table.collapsible的可折叠性。
 *  JSConfig的collapseText、expandText、autoCollapse属性定义默认文字和默认最少自动折叠块
 *  Maintainers: User:fdcn
 */
function cancelBubble(e){
	e=e||window.event;
	if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
}
function createToggleButton(head){
	var parent=head;
	if( head.tagName.toLowerCase()=='tr' ){//对表格特别处理
		if(head.getElementsByTagName("th").length){
			parent=head.cells[parent.cells.length-1];
		} else {return;}
	}
	var textS,textH,button=$(head).find("span.NavToggle")[0];
	if(button){parent=button.parentNode;} else{
		textS=createElement("span",[JSConfig.expandText],{'class':'toggleShow'});
		textH=createElement("span",[JSConfig.collapseText],{'class':'toggleHide'});
		button=createElement("span",[textS,textH],{'class':'NavToggle',styles:{'width':"3.8em"}});
	}
	button.style.display="inline";
	head.className+=" uncollapse toggleHotspot";
	parent.insertBefore( button, parent.childNodes[0] );
}
function wgCollapse(head,container,defaultCollapse){
	if(head){ createToggleButton(head); }
	var self=this;
	this.state=0;
	this.container=container;
	applyEach( function(h){
		if ( h.nodeType==1    
			&& !$(h).hasClass("uncollapse")
			&& !$(h).hasClass("toggleShow")
			&& !$(h).hasClass("toggleHide")
		) { h.className+=" toggleHide"; }
	}, defaultCollapse );//预设的隐藏元素
	function getArray(clsname){
		var r=[],i=0,e,ea=container.getElementsByClassName(clsname);
		while(e=ea[i++]){
			var parent=e.parentNode;
			while(!$(parent).hasClass('NavFrame')&&!$(parent).hasClass('collapsible')){parent=parent.parentNode;}
			if(parent==container){r.push(e);}
		}
		return r;
	}
	var toggleA=getArray("toggleShow");
	var toggleB=getArray("toggleHide");
	var hotspots=getArray("toggleHotspot");
	function _toggle(list,state){
		var i=0,e;
		while(e=list[i++]){e.style.display=state?e.showStyle||'':'none';}
	}
	this.toggle=function(state){
		self.state=(typeof state=='undefined')?1-self.state:state;
		_toggle(toggleA,self.state);
		_toggle(toggleB,1-self.state);
	}
	var i=0,h;
	while(h=hotspots[i++]){
		applyEach(function(link){
			// Add click handler? (cancelBubble)
		},h.getElementsByTagName("A"));
		h.style.cursor = "pointer";
		// Add click handler? (self.toggle)
	}
}
$(function(){
	//init
	var items=[];
	applyEach( function(NavFrame){
		var i=0,
		    child=NavFrame.childNodes,
		    head;
		while (head=child[i++]) {
			if( head.className&&$(head).hasClass("NavHead") ){break;}
		}
		items.push(new wgCollapse(head,NavFrame,NavFrame.childNodes));
	},$("div.NavFrame").toArray() );
	applyEach ( function(table){
		var rows = table.rows;
		items.push(new wgCollapse(rows[0],table,rows));
	},$("table.collapsible").toArray() );
	var item,i=0,count=items.length;
	while ( item=items[i++] ) {
		item.toggle (
			$(item.container).hasClass("collapsed") 
			|| ( count>=JSConfig.autoCollapse&&$(item.container).hasClass("autocollapse") )
		);
	}
});
//修正摺疊後定位變化
jQuery(document).ready( function(){
    if(location.hash){
       location.href=location.hash;
    }
});

/*

== 首頁輸出修正 ==
*/
/** 首页输出修正 *******************************************************
  描述:
  维护者: [[User:Fdcn]]
*/

/*
== 取消討論頁的[+]按鈕 ==
*/

$(document).ready(function () {
	if(document.getElementById('no-newsection') && document.getElementById('ca-addsection')) {
		document.getElementById('ca-addsection').style.display="none";
	}
});

/*

==WikiMiniAtlas世界地圖==
*/
/**
 * WikiMiniAtlas is a popup click and drag world map.
 * See [[meta:WikiMiniAtlas]] for more information.
 * 創建者: [[:en:User:Dschwen]]
 */
mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );

/*
==反frame==
*/
try {
	if (top.location != self.location) {
		top.location.replace(self.location);
	}

}catch(ex){
	top.location.replace(self.location);
}

/*
==保護選項校正==
*/

if(mw.config.get('wgAction')=="protect") {

 $(document).ready( function(){
  var pform=document.getElementById("mw-Protect-Form");
  var timeoptions;

  timeoptions=pform["wpProtectExpirySelection-edit"].options;
  if(timeoptions[0].value!="existing"){
   timeoptions[timeoptions.length-1].selected=true;
   ProtectionForm.updateExpiryList(pform["wpProtectExpirySelection-edit"]);
  }

  timeoptions=pform["wpProtectExpirySelection-move"].options;
  if(timeoptions[0].value!="existing"){
   timeoptions[timeoptions.length-1].selected=true;
   ProtectionForm.updateExpiryList(pform["wpProtectExpirySelection-move"]);
  }
 
 });

}


/*
==擷取選單文字按鈕==
*/

function addGetMenuTextButton(id, srcMenu, targetText, tiptext, afterSelIdx) {
 var btnAdd=createElement("a", ((!tiptext)?"(+)":tiptext), {
  'id': id ,
  'href' : '#'
 });
 btnAdd.srcMenu=srcMenu;
 btnAdd.targetText=targetText;
 btnAdd.afterSelIdx=(!afterSelIdx || isNaN(afterSelIdx))?0:afterSelIdx;
 btnAdd.onclick=function(){
  this.targetText.value+=this.srcMenu.options[srcMenu.selectedIndex].value;
  srcMenu.selectedIndex=this.afterSelIdx;
  return false;
 }


 srcMenu.parentNode.appendChild(btnAdd);
}

jQuery(document).ready(function(){
 var useForm;

 if(mw.config.get('wgAction')=="protect" || mw.config.get('wgAction')=="unprotect"){     //保護理由
  useForm=document.getElementById("mw-Protect-Form");
  addGetMenuTextButton("wpProtectReasonSelectionAdd", useForm.wpProtectReasonSelection, useForm["mwProtect-reason"], "", 0);

 }else if(mw.config.get('wgPageName').toLowerCase()=="special:blockip"){     //封禁理由
  useForm=document.getElementById("blockip");
  addGetMenuTextButton("wpBlockReasonListAdd", useForm.wpBlockReasonList, useForm.wpBlockReason, "", 0);

 }

});

/*
==避免在主條目中出現捲軸框==

*/

if(!mw.config.get('wgCanonicalNamespace')) $(document).ready( function(){

 var divs=document.getElementsByTagName("div");

 for(var i=0; i<divs.length; i++){
  if(divs[i].id=="CContentList"){
   if(divs[i].parentNode.parentNode.id=="TagConversionHeader") continue;
  }

  if(divs[i].style.overflow.toLowerCase()=="auto" && divs[i].getElementsByTagName("img").length==0){
   divs[i].style.overflow="";
   divs[i].style.overflowY="visible";
   divs[i].style.padding="";
   divs[i].style.border="";
   divs[i].style.height="";
  }
 }

});

/* 
== metaBox ==

HERE STARTS THE WORKING-CODE OF "METABOXES"*/
 
 /* Funcionament de la Plantilla:Metacaixa
 Implementat per: Usuari:Peleguer.
 Actualitzat per Joanjoc seguint les indicacions d'en Martorell
 */
 
 function MetaCaixaInit(){
  //S'executa al carregar-se la pàgina, si hi ha metacaixes,
  // s'assignen els esdeveniments als botons
  //alert("MetaCaixaInit");
 
  var i=0       //Inicialitzem comptador de caixes
  for (i=0;i<=9;i++){
     var vMc = document.getElementById("mc"+i);
     if (!vMc) break;
     //alert("MetaCaixaInit, trobada Metacaixa mc"+i);
 
     var j=1    //Inicialitzem comptador de botons dins de la caixa
     var vPsIni = 0  //Pestanya visible inicial
     for (j=1;j<=9;j++){
        var vBt = document.getElementById("mc"+i+"bt"+j);
        if (!vBt) break;
        //alert("MetaCaixaInit, trobat botó mc"+i+"bt"+j);
        vBt.onclick = MetaCaixaMostraPestanya;          //A cada botó assignem l'esdeveniment onclick
        //alert (vBt.className);
        if (vBt.className=="mcBotoSel") vPsIni=j;  //Si tenim un botó seleccionat, en guardem l'index
     }
     //alert ("mc="+i+", ps="+j+", psini="+vPsIni );
     if (vPsIni == 0) { //Si no tenim cap botó seleccionat, n'agafem un aleatòriament
         vPsIni = 1+Math.floor((j-1)*Math.random()) ;
         //alert ("Activant Pestanya a l'atzar; _mc"+i+"bt"+vPsIni +"_");
         document.getElementById("mc"+i+"ps"+vPsIni).style.display = "block";
         document.getElementById("mc"+i+"ps"+vPsIni).style.visibility = "visible";
         document.getElementById("mc"+i+"bt"+vPsIni).className="mcBotoSel";
     } 
  }
 }
 
 function MetaCaixaMostraPestanya(){
  //S'executa al clicar una pestanya,
  //aquella es fa visible i les altres s'oculten
  var vMcNom = this.id.substr(0,3); //A partir del nom del botó, deduïm el nom de la caixa
  var vIndex = this.id.substr(5,1); //I l'index
 
  var i=1
  for (i=1;i<=9;i++){        //busquem totes les pestanyes d'aquella caixa
      //alert(vMcNom+"ps"+i);
        var vPsElem = document.getElementById(vMcNom+"ps"+i);
        if (!vPsElem) break;
        if (vIndex==i){ //Si és la pestanya bona la mostrem i canviem la classe de botó
                vPsElem.style.display = "block";
                vPsElem.style.visibility = "visible";
                document.getElementById(vMcNom+"bt"+i).className="mcBotoSel";
        } else {             //Sinó, l'ocultem i canviem la classe de botó
                vPsElem.style.display = "none";
                vPsElem.style.visibility = "hidden";
                document.getElementById(vMcNom+"bt"+i).className="mcBoto";
        }
  }
  return false; //evitem la recàrrega de la pàgina
 }
 
 $(document).ready(MetaCaixaInit);
 
 /*HERE FINISHES THE WORKING-CODE OF "METABOXES"*/