မဳဒဳယာဝဳကဳ:Common.js

နူ ဝိက်ရှေန်နရဳ

တင်စၟတ်: ကြဴနူ မသီဂိုင်တုဲ တၞဟ်နမဂွံညာတ် အပြံင်အလှာဲ မၞးသ္ဒးကၟာတ်ထောအ် မုက်လိက်ဗြောဝ်သာဂှ်ရောင်။

  • Firefox / Safari:မ္ဂး ဍဵုလဝ် Shift အဃောမဍဵု Reload၊ ဟွံသေင်မ္ဂး ဍဵု either Ctrl-F5 ဟွံသေင်မ္ဂး Ctrl-R (⌘-R သွက် Mac)
  • Google Chrome:မ္ဂး ဍဵု Ctrl-Shift-R (⌘-Shift-R သွက် Mac)
  • Internet Explorer / Edge:မ္ဂး ဍဵုလဝ် Ctrl အဃော မဍဵု Refresh, ဟွံသေင်မ္ဂး ဍဵု Ctrl-F5
  • Opera: မ္ဂး ဍဵု Ctrl-F5
/* Any JavaScript here will be loaded for all users on every page load. */


/* ==Visibility toggling== */
var VisibilityToggles = window.VisibilityToggles = {
	// toggles[category] = [[show, hide],...]; statuses[category] = [true, false,...]; buttons = <li>
	toggles: {},
	statuses: {},
	buttons: null,
	
	// Add a new toggle, adds a Show/Hide category button in the toolbar,
	// and will call show_function and hide_function once on register, and every alternate click.
	register: function (category, show_function, hide_function) {
		var id = 0;
		if (!this.toggles[category]) {
			this.toggles[category] = [];
			this.statuses[category] = [];
		} else {
			id = this.toggles[category].length;
		}
		this.toggles[category].push([show_function, hide_function]);
		this.statuses[category].push(this.currentStatus(category));
		this.addGlobalToggle(category);
		
		(this.statuses[category][id] ? show_function : hide_function)();
		
		return function () {
			var statuses = VisibilityToggles.statuses[category];
			statuses[id] = !statuses[id];
			VisibilityToggles.checkGlobalToggle(category);
			return (statuses[id] ? show_function : hide_function)();
		};
	},
	
	// Add a new global toggle to the side bar
	addGlobalToggle: function (category) {
		if (document.getElementById('p-visibility-' + category))
			return;
		if (this.buttons === null) {
			this.buttons = $('<ul>');
			var collapsed = mw.cookie.get("vector-nav-p-visibility") === "false",
				toolbox = $('<div>', {
						'class': "portal portlet " + (collapsed ? "collapsed" : "expanded"),
						'id': 'p-visibility'
					})
					.append($('<h3>ဗီုမညာတ်ကေတ်မာန်</h3>'))
					.append($('<div>').addClass("pBody body").css("display", "block")
							.append(this.buttons));
			var sidebar = document.getElementById('mw-panel') || document.getElementById('column-one');
			var insert = document.getElementById('p-lang') || document.getElementById('p-feedback');
			if (insert)
				$(insert).before(toolbox);
			else
				$(sidebar).appendChild(toolbox);
		}
		var status = this.currentStatus(category);
		var newToggle = $('<li>').append($('<a>', {
				id: 'p-visibility-' + category,
				style: 'cursor: pointer',
		href: '#visibility-' + category}).on("click", function (e) {
					VisibilityToggles.toggleGlobal(category);
					if (e && e.preventDefault)
						e.preventDefault();
					else
						window.event.returnValue = false;
					return false;
				}).text((status ? 'ပၞုက် ' : 'ထ္ၜး ') + category));
		
		this.buttons.children().filter(function(i, elem) {
			return elem.id < newToggle.id;
		}).first().before(newToggle);

		this.buttons.append(newToggle);
	},
	
	// Update the toggle-all buttons when all things are toggled one way
	checkGlobalToggle: function (category) {
		var statuses = this.statuses[category];
		var status = statuses[0];
		for (var i = 1; i < statuses.length; i++) {
			if (status != statuses[i])
				return;
		}
		document.getElementById('p-visibility-' + category).innerHTML = (status ? 'Hide ' : 'Show ') + category;
	},
	
	// Toggle all un-toggled elements when the global button is clicked
	toggleGlobal: function (category) {
		var status = document.getElementById('p-visibility-' + category).innerHTML.indexOf('Show ') === 0;
		for (var i = 0; i < this.toggles[category].length; i++) {
			if (this.statuses[category][i] != status) {
				this.toggles[category][i][status ? 0 : 1]();
				this.statuses[category][i] = status;
			}
		}
		document.getElementById('p-visibility-' + category).innerHTML = (status ? 'Hide ' : 'Show ') + category;
		var current = mw.cookie.get('ဗီုမညာတ်ကေတ်မာန်');
		if (!current)
			current = ";";
		current = current.replace(';' + category + ';', ';');
		if (status)
			current = current + category + ";";
		mw.cookie.set('ဗီုမညာတ်ကေတ်မာန်', current);
	},
	
	currentStatus: function (category) {
		if (location.hash.toLowerCase().split('_')[0] == '#' + category.toLowerCase())
			return true;
		if (location.href.search(/[?](.*&)?hidecats=/) > 0) {
			var hidecats = location.href;
			hidecats = hidecats.replace(/^[^?]+[?]((?!hidecats=)[^&]*&)*hidecats=/, '');
			hidecats = hidecats.replace(/&.*/, '');
			hidecats = hidecats.split(',');
			for (var i = 0; i < hidecats.length; ++i)
				if (hidecats[i] == category || hidecats[i] == 'all')
					return false;
				else if (hidecats[i] == '!' + category || hidecats[i] == 'none')
					return true;
		}
		if (mw.cookie.get('WiktionaryPreferencesShowNav') == 'true')
			return true;
		if ((mw.cookie.get('ဗီုမညာတ်ကေတ်မာန်') || "").indexOf(';' + category + ';') >= 0)
			return true;
		// TODO check category-specific cookies
		return false;
	}
};

// JavaScript font detect code begins
/**
 * JavaScript code to detect available availability of a 
 * particular font in a browser using JavaScript and CSS. 
 * 
 * Author : Lalit Patel
 * Website: http://www.lalit.org/lab/jsoncookies
 * License: Creative Commons Attribution-ShareAlike 2.5
 *          http://creativecommons.org/licenses/by-sa/2.5/
 * Version: 0.1
 * Updated: Aug 11, 2007 10:09am
 * 
 */
 
/**
 * Actual function that does all the work. Returns an array with all the info.
 * My Assumption is that most of the browsers will have arial set as their default sans-serif font.
 */
var Detector = function(){
	var h = document.getElementsByTagName("BODY")[0];
	var d = document.createElement("DIV");
	var s = document.createElement("SPAN");
	d.appendChild(s);
	d.style.fontFamily = "Arial";		//font for the parent element DIV.
	s.style.fontFamily = "Arial";		//arial font used as a comparator.
	s.style.fontSize   = "72px";			//we test using 72px font size, we may use any size. I guess larger the better.
	s.innerHTML        = "ကကကကကကကကကကင";		//we use  က for maximum width. And we use a င so that the same matching fonts can get separated
	h.appendChild(d);
	var defaultWidth   = s.offsetWidth;		//now we have the defaultWidth
	var defaultHeight  = s.offsetHeight;	//and the defaultHeight, we compare other fonts with these.
	h.removeChild(d);
	/* test
	 * params:
	 * font - name of the font you wish to detect
	 * return: 
	 * f[0] - Input font name.
	 * f[1] - Computed width.
	 * f[2] - Computed height.
	 * f[3] - Detected? (true/false).
	 */
	function test(font) {
                h.appendChild(d);		
		var f = [];
		f[0] = s.style.fontFamily = font;	// Name of the font        
                s.style.innerHTML = "ကကကကကကကကကကင"
                s.style.fontSize = "72px";         
                h.appendChild(d);
		f[1] = s.offsetWidth;				// Width
		f[2] = s.offsetHeight;				// Height        
		h.removeChild(d);
		font = font.toLowerCase();
		if (font == "arial" || font == "sans-serif") {
			f[3] = true;	// to set arial and sans-serif true
		} else {
			f[3] = (f[1] != defaultWidth && f[2] != defaultHeight);	// Detected?
		}        
		return f;
	}
	this.test = test;
}
// Create new instance of Detector and pass each U51 font. 
// Update table with result[3]
function detectFont(){
    d = new Detector;
    result = d.test("Padauk");
	var p = document.getElementById("Masterpiece Uni Sans");
	if(p) p.innerHTML = result[3]
	result = d.test("Padauk");
	var p = document.getElementById("Padauk");
	if(p) p.innerHTML = result[3]
	result = d.test("Myanmar3");
	var p = document.getElementById("Myanmar3");
	if(p) p.innerHTML = result[3]
	result = d.test("Parabaik");
	var p = document.getElementById("Parabaik");
	if(p) p.innerHTML = result[3]
	result = d.test("MyMyanmar Unicode");
	var p = document.getElementById("MyMyanmar");
	if(p) p.innerHTML = result[3]
	result = d.test("Myanmar2");
	var p = document.getElementById("Myanmar2");
	if(p) p.innerHTML = result[3]
	result = d.test("Yunghkio");
	var p = document.getElementById("Yunghkio");
	if(p) p.innerHTML = result[3]
}                                               
 
$(detectFont);
// JavaScript font detect code ends

/* Including extra .js pages */ 
 
// switches for scripts
// var load_extratabs = true;
var load_edittools = true;

/* Conflicts with ULS - [[User:Nikerabbit]]
// extra drop down menu on editing for adding special characters
importScript( 'MediaWiki:Edittools.js' );
importScript( 'MediaWiki:keyboard.js' );
*/

/* == NavBars == */
var NavigationBarHide = 'ပၞုက် ▲';
var NavigationBarShow = 'ထ္ၜး ▼';

function NavToggleCategory(navFrame) {
	if ($(navFrame).find('table').first().is("တြာဲဂမၠိုင်"))
		return "တြာဲဂမၠိုင်";
	
	var heading = navFrame.previousSibling;
	while (heading) {
		if (/[hH][4-6]/.test(heading.nodeName)) {
			if (heading.getElementsByTagName('span')[1])
				heading = heading.getElementsByTagName('span')[0];
			return jQuery(heading).text().toLowerCase()
			// jQuery's .text() is inconsistent about whitespace:
				.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ' ')
				// remove numbers added by the "Auto-number headings" pref:
				.replace(/^[1-9][0-9.]+ ?/, '');
		} else if (/[hH][1-3]/.test(heading.nodeName))
			break;
		heading = heading.previousSibling;
	}
	return "other boxes";
}

function createNavToggle(navFrame) {
	var navHead, navContent;
	for (var j = 0; j < navFrame.childNodes.length; j++) {
		var div = navFrame.childNodes[j];
		if (/(^|[^a-zA-Z0-9_\-])NavHead(?![a-zA-Z0-9_\-])/.test(div.className))
			navHead = div;
		if (/(^|[^a-zA-Z0-9_\-])NavContent(?![a-zA-Z0-9_\-])/.test(div.className))
			navContent = div;
	}
	if (!navHead || !navContent)
		return;
	// Step 1, don't react when a subitem is clicked.
	$(navHead).find("a").on("click", function (e) {
		if (e && e.stopPropagation)
			e.stopPropagation();
		else
			window.event.cancelBubble = true;
	});
			
	// Step 2, toggle visibility when bar is clicked.
	// NOTE This function was chosen due to some funny behaviour in Safari.
	var $navToggle = $('<a>');
	
	$('<span>').addClass('NavToggle')
		.append($navToggle)
		.prependTo(navHead);
	
	navHead.style.cursor = "pointer";
	navHead.onclick = VisibilityToggles.register(NavToggleCategory(navFrame),
		function show() {
			$navToggle.html(NavigationBarHide);
			if (navContent)
				navContent.style.display = "block";
		},
		function hide() {
			$navToggle.html(NavigationBarShow);
			if (navContent)
				navContent.style.display = "none";
		});
}


/* ==Hidden Quotes== */
function setupHiddenQuotes(li) {
	var HQToggle, liComp, dl;
	var HQShow = 'ဝါကျဂမၠိုင် ▼';
	var HQHide = 'ဝါကျဂမၠိုင် ▲';
	function show() {
		HQToggle.html(HQHide);
		$(li).children("ul").show();
	}
	function hide() {
		HQToggle.html(HQShow);
		$(li).children("ul").hide();
	}
	
	for (var k = 0; k < li.childNodes.length; k++) {
		// Look at each component of the definition.
		liComp = li.childNodes[k];
		if (liComp.nodeName.toLowerCase() === "dl" && !dl) {
			dl = liComp;
		}
		// If we find a ul or dl, we have quotes or example sentences, and thus need a button.
		if (/^(ul|UL)$/.test(liComp.nodeName)) {
			HQToggle = $('<a>');
			$(dl || liComp).before($('<span>').addClass('HQToggle').append(HQToggle));
			HQToggle.on("click", VisibilityToggles.register('ဝါကျဂမၠိုင်', show, hide));
			break;
		}
	}
}

/* == View Switching == */
function viewSwitching($rootElement) {
	var showButtonText = 'ဆက်ထ္ၜး ▼';
	var hideButtonText = 'ဖအောန် ▲';
	
	var toSkip = $rootElement.find(".vsSwitcher").find("*");
	var elemsToHide = $rootElement.find(".vsHide").not(toSkip);
	var elemsToShow = $rootElement.find(".vsShow").not(toSkip);
	
	// Find the element to place the toggle button in.
	var toggleElement = $rootElement.find(".vsToggleElement").not(toSkip).first();
	
	// The toggleElement becomes clickable in its entirety, but
	// we need to prevent this if a contained link is clicked instead.
	toggleElement.children("a").on("click", function (e) {
		if (e && e.stopPropagation)
			e.stopPropagation();
		else
			window.event.cancelBubble = true;
	});
	
	// Add the toggle button.
	var toggleButton = $('<a>');
	
	$('<span>').addClass('NavToggle').append(toggleButton).prependTo(toggleElement);
	
	// Determine the visibility toggle category (for the links in the bar on the left).
	var toggleCategory = "others";
	var classNames = $rootElement.attr("class").split(/\s+/);
	
	for (var i = 0; i < classNames.length; ++i) {
		var className = classNames[i].split('-');
		
		if (className[0] == 'vsToggleCategory') {
			toggleCategory = className[1];
		}
	}
	
	// Register the visibility toggle.
	toggleElement.css("cursor", "pointer");
	toggleElement.on("click", VisibilityToggles.register(toggleCategory,
		function show() {
			toggleButton.html(hideButtonText);
			
			elemsToShow.hide();
			
			for (var i = 0; i < elemsToHide.length; ++i) {
				if (elemsToHide[i].nodeName == "TABLE")
					elemsToHide[i].style.display = 'table';
				else if (elemsToHide[i].nodeName == "TR")
					elemsToHide[i].style.display = 'table-row';
				else if (elemsToHide[i].nodeName == "TD" || elemsToHide[i].nodeName == "TH")
					elemsToHide[i].style.display = 'table-cell';
				else
					elemsToHide[i].style.display = 'block';
			}
		},
		function hide() {
			toggleButton.html(showButtonText);
			
			for (var i = 0; i < elemsToShow.length; ++i) {
				if (elemsToShow[i].nodeName == "TABLE")
					elemsToShow[i].style.display = 'table';
				else if (elemsToShow[i].nodeName == "TR")
					elemsToShow[i].style.display = 'table-row';
				else if (elemsToShow[i].nodeName == "TD" || elemsToShow[i].nodeName == "TH")
					elemsToShow[i].style.display = 'table-cell';
				else
					elemsToShow[i].style.display = 'block';
			}
			
			elemsToHide.hide();
		}));
}

// == apply three functions defined above ==
$.when($.ready, mw.loader.using('mediawiki.cookie')).done(function(){
	//NavToggles
	var divs = jQuery(".NavFrame");
	for (var i = 0; i < divs.length; i++) {
		// XXX: some templates use a class of NavFrame for the style, but for legacy reasons, are not NavFrames
		// if (divs[i].className == "NavFrame") {
		createNavToggle(divs[i]);
		// }
	}
	
	//quotes
	if (mw.config.get('wgNamespaceNumber') === 0) {
		// First, find all the ordered lists, i.e. all the series of definitions.
		$('ol > li').each(function(){
			setupHiddenQuotes(this);
		});
	}
	
	//view switching
	$('.vsSwitcher').each(function(){
		viewSwitching($(this));
	});
});

jQuery(mw).on('LivePreviewDone', function (ev, sels) {
	var ols = jQuery(sels.join(',')).find('ol');
	for (var i = 0; i < ols.length; i++) {
		for (var j = 0; j < ols[i].childNodes.length; j++) {
			var li = ols[i].childNodes[j];
			if (li.nodeName.toUpperCase() == 'LI') {
				setupHiddenQuotes(li);
			}
		}
	}
});

// == "Did you mean" auto redirect in 3 seconds ==
/**
 * doRedirect will redirect if a did you mean box is found, and create a
 * "redirected from X" if a rdfrom is passed in the get parameters
**/

$.when(mw.loader.using("mediawiki.util"), $.ready).done(function(){
var rdFromValue = mw.util.getParamValue("rdfrom");
if (rdFromValue)
{
	rdFromValue = decodeURIComponent(rdFromValue);
	$('#siteSub').after(
		$('<div>').attr("id", 'contentSub')
			.append(document.createTextNode("(Auto-redirected from "))
			.append($('<a>', {
				href: mw.util.getUrl(rdFromValue, {redirect:"no"}),
				addClass: 'new'
			}).text(rdFromValue))
			.append(document.createTextNode(")")));
}
else 
{
	window.setTimeout(function () {	
		var target = $('#did-you-mean a').html();
		var	pagetitle = mw.config.get("wgTitle"); //$('h1').first().text().trim();
		var canRedirect = mw.util.getParamValue("redirect") != "no";
		
		if (target && target !== pagetitle && canRedirect &&
			(jQuery.cookie('WiktionaryDisableAutoRedirect') != 'true') &&
			mw.config.get("wgAction") == "view" &&
			mw.config.get('wgArticleId') === 0 &&
			mw.config.get('wgNamespaceNumber') === 0 &&
			!/Redirected from/.test(jQuery('#contentSub').html())
		) {
			window.location = mw.util.getUrl(target, { rdfrom: pagetitle });
		}
	}, 3000);
}
});