MediaWiki:Common.js

From Ekatra Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
mw.loader.load('//wiki.ekatrafoundation.org/index.php?title=User:Gurwinder/Edittool.js&action=raw&ctype=text/javascript');

// Turn <span class="mw-charinsert">foo</span> into a button that inserts "foo"
// into the edit box:
$( function () {
    $( 'span.mw-charinsert' ).wrap( function () {
        var text = this.title || this.textContent;
        var parts = text.split( '+' );
        if ( text === '+' ) parts = [ text ];
        var front = decodeURIComponent( parts[0] || '' );
        var back  = decodeURIComponent( parts[1] || '' );
        return $( '<button>' ).click( function () {
            insertTags( front, back, '' );
            return false;
        } );
    } );
} );
$( function(){
	
	if (window.matchMedia("(max-width: 768px)").matches) {
		if( mw.config.get("skin") !== "minerva" ){
			const currWikiUrl = new URL(window.location.href);
			currWikiUrl.searchParams.set('mobileaction', 'toggle_view_mobile');
			
			window.location.replace(currWikiUrl);
		}
	} else {
		if(  mw.config.get("skin") !== "vector" ){
			const currWikiUrl = new URL(window.location.href);
			currWikiUrl.searchParams.set('mobileaction', 'toggle_view_desktop');

			window.location.replace(currWikiUrl);
		}
	}

	if( mw.config.get('wgIsMainPage') ){
		$('#firstHeading').remove();
		
		var mainpageLeft = $(".mainpage-left");
		var mainpageRight = $(".mainpage-right");
		
		mainpageLeft.css("position", "relative");
		mainpageRight.css("position", "relative");
	
		function animateLeft(){
			mainpageRight.animate({'left': '15px'}, 1000, function(){
				mainpageRight.animate( {"left": "0px" }, 1000, animateLeft() );
			});
		}
		animateLeft();
		
		function animateRight(){
			mainpageLeft.animate({'left': '-15px'}, 1000, function(){
				mainpageLeft.animate( {"left": "0px" }, 1000, animateRight() );
			});
		}
		animateRight();
		
	}
	
	if( mw.config.get('wgPageName').split( '/' ).length > 1 ){
		var tempPageName = mw.config.get('wgPageName').split( '/' )[0];
		var tempLink ='&#60;  <a href="https://wiki.ekatrafoundation.org/wiki/' +  tempPageName + '">' + tempPageName.replaceAll("_", " ") + '</a>';
		$("#top").after(  $( '<p>').css( 'font-size', '17px').html( tempLink ) );
	}
	if( mw.config.get('wgUserName') === null  ){
		$('body').bind('cut copy', function(e) {
			e.preventDefault();
		});
	} else {
		$("#content").removeAttr("onmousedown");
		$("#content").removeAttr("onselectstart");
		
		mw.loader.load( '/index.php?title=MediaWiki:OCR.js&action=raw&ctype=text/javascript');
		mw.loader.load( '/index.php?title=MediaWiki:PoemButtons.js&action=raw&ctype=text/javascript');
	}
	
	if( $(".wikiaudioplayer").length ){
		mw.loader.load( '/index.php?title=MediaWiki:Green-audio-player.min.css&action=raw&ctype=text/css', 'text/css');
		$.when(
		    mw.loader.getScript( 'https://wiki.ekatrafoundation.org/index.php?title=MediaWiki:Green-audio-player.min.js&action=raw&ctype=text/javascript' )
		)
		.then(
		    function () {
				GreenAudioPlayer.init({
				    selector: '.wikiaudioplayer',
				    stopOthersOnPlay: true
				});
				$( ".wikiaudioplayer > audio").css("display", "none");
		    },
		    function ( e ) {
		        mw.log.error( e.message );
		    }
		);
	}

});

$( function(){
	var sidebarCategory = $("#p-Categories > .vector-menu-content");
	var sidebarAuthor = $("#p-Authors > .vector-menu-content");
	sidebarCategory.empty();
	sidebarAuthor.empty();

	mw.loader.using( [ 'mediawiki.api' ], function(){
		var sel1 = $('<select>').css( 'width', '100%').appendTo( sidebarCategory );
		var sel2 = $('<select>').css( 'width', '100%').appendTo( sidebarAuthor );
		sel1.append( $("<option>").attr('disabled', true).attr('selected', true).text( "-- Select an option --" ) );
		sel2.append( $("<option>").attr('disabled', true).attr('selected', true).text( "-- Select an option --" ) );

		// For category Categories
		catMemberParam1 = {
			"action": "query",
			"format": "json",
			"list": "categorymembers",
			"cmtitle": "Category:Categories on EkatraWiki",
			"cmprop": "title",
			"cmtype": "subcat",
			"cmlimit": "500"
		};
		(new mw.Api()).get( catMemberParam1, { async: false }  ).done(function ( resData ){
			var catOptions = [];
			var members = resData.query.categorymembers;
	
			// Creating MenuItems array from Category Members
			members.forEach( function(it){
				var ct = it.title.replace("Category:", "");
				sel1.append( $("<option>").attr('value', ct).text(ct) );
			});
			
			sel1.on('change', function (e) {
			    var valueSelected = this.value;
			    window.location = "https://wiki.ekatrafoundation.org/wiki/Category:" + valueSelected;
			});
		});
		
		// For category Author
		catMemberParam2 = {
			"action": "query",
			"format": "json",
			"list": "categorymembers",
			"cmtitle": "Category:Authors on EkatraWiki",
			"cmprop": "title",
			"cmtype": "subcat",
			"cmlimit": "500"
		};
		(new mw.Api()).get( catMemberParam2, { async: false }  ).done(function ( resData ){
			var catOptions = [];
			var members = resData.query.categorymembers;
	
			// Creating MenuItems array from Category Members
			members.forEach( function(it){
				var ct = it.title.replace("Category:", "");
				sel2.append( $("<option>").attr('value', ct).text(ct) );
			});
			
			sel2.on('change', function (e) {
			    var valueSelected = this.value;
			    window.location = "https://wiki.ekatrafoundation.org/wiki/Category:" + valueSelected;
			});
		});
	} );
	
	
});

// Long list into col
$( document ).ready( function(){

	var longList = $("#longList").addClass("grid_row"),
		dlElements = longList.children().filter("dl"),
		dlElementsLength = dlElements.length;
	
	var list1 = [],
		list2 = [];
	
	var count = 0;
	dlElements.each( function(index, ele){
		if( count < dlElementsLength/2 ){
			list1.push(ele);
			list1.push( $(ele).next() );
		} else {
			list2.push(ele);
			list2.push( $(ele).next() );
		}
		count = count + 1;
	});
	
	longList.empty();
	
	var leftDiv = $("<div/>").addClass("grid_col");
	list1.forEach( function(value, index){
		leftDiv.append(value);
	});
	
	
	var rightDiv = $("<div/>").addClass("grid_col");
	list2.forEach( function(value, index){
		rightDiv.append(value);
	});
	
	longList.append(leftDiv, rightDiv );
	
});


$( function(){
	
	var countPoem2 = $(".Poem2-Ekatra");
	
	if( countPoem2.length > 0 ){
	
	var Poem2lenghtArray = [];
	for (var k = 0; k <= countPoem2.length; k++) {
	   Poem2lenghtArray.push(k);
	}
	
		Poem2lenghtArray.forEach(function(j) {
			
			var poemElement = $(".Poem2-Ekatra").eq(j);
						
			if( poemElement.length ){
				var poemText = poemElement.html();

				var poemArray = poemText.split("\n");
				
				poemElement.text("");
			
				// First measure
				poemArray.forEach( function(i) {
					poemElement.append( '<p style="text-indent: 2em;">' + i + '</p>' );
				});
				
				// Second measure
				poemElement.children('p').each(function () {
					$(this).css('text-indent', '2em');
				});
			}
		
		});
	}

});

$( function() {
	var divide2cols = $("#divide2cols");
	if( divide2cols.length ){
		var leftDiv = $("<div/>").addClass("grid_col");
		var rightDiv = $("<div/>").addClass("grid_col");
		var parentHieght = divide2cols.height()/2;
		divide2cols.children().filter("dl").each(function() {
			console.log( $(this).offset().top , parentHieght );
			if ( $(this).offset().top > parentHieght ) {
				rightDiv.append( $(this), $(this).next() );
			} else {
				leftDiv.append( $(this), $(this).next() );
			}
		});
		divide2cols.before( $("<div/>").addClass("grid_row").append(leftDiv, rightDiv) );
		divide2cols.remove();
	}
});


$( function(){
	// toggled by toggle button. also determines which toggle button image to use
	var useCustom = false;
	
	// toggleImgs[0] to switch to custom, toggleImgs[1] to revert to default
	var toggleImgs = [
		'//storage.googleapis.com/material-icons/external-assets/v4/icons/svg/ic_search_black_24px.svg',
		'//storage.googleapis.com/material-icons/external-assets/v4/icons/svg/ic_youtube_searched_for_black_24px.svg'
	];
	var zoomInImg = '//storage.googleapis.com/material-icons/external-assets/v4/icons/svg/ic_zoom_in_black_24px.svg';
	var zoomOutImg = '//storage.googleapis.com/material-icons/external-assets/v4/icons/svg/ic_zoom_out_black_24px.svg';
	
	// create DOM elements
	$('#content').prepend('<div id="zoomButtons" style="z-index: 9999;">\
	<img id="zoomInIcon" src="' + zoomInImg + '" alt="zoom in"">\
	<img id="zoomOutIcon" src="' + zoomOutImg + '" alt="zoom out"">\
	<img id="toggleButton" src="' + toggleImgs[+ useCustom] + '" alt="toggle zoom">&nbsp</div>');
	$('#zoomButtons').css({'float': 'right'});
	
	// find DOM elements used later
	var $bodyContent = $('.mw-body-content');
	var $toggleButton = $('#toggleButton');
	
	// sizes[0] is default, sizes[1] is custom
	var sizes = [parseFloat($('.mw-body-content').css('font-size'))];
	// default custom zoom of 2
	sizes[1] = sizes[0] + 2;
	
	// the + converts bool to 0 or 1 to use as array index
	function updateSize() {
		$bodyContent.css({'font-size':(sizes[+ useCustom] + 'pt')});
	}
	function toggle() {
		useCustom = !useCustom;
		$toggleButton.attr('src',toggleImgs[+ useCustom]);
		updateSize();
	}
	function zoom(dif) {
		sizes[1] += dif;
		if (useCustom) {
			updateSize();
		} else {
			toggle();
		}
	}
	
	$( '#zoomInIcon' ).on( 'click', function(){
		console.log("Zoom +");
		zoom(1);
	});
	
	$( '#zoomOutIcon' ).on( 'click', function(){
		console.log("Zoom -");
		zoom(-1);
	});
	
	$( '#toggleButton' ).on( 'click', toggle );
});


/**
 * Convert numbers between numeral systems.
 *
 * Dependencies: jquery.cookie, mediawiki.util, mediawiki.user
 * Source: https://www.mediawiki.org/wiki/MediaWiki:Gadget-Numerakri.js
 * Revision: 2019-01-11
 *
 * @copyright 2012 Daniel Friesen
 * @copyright 2012 Siddhartha Ghai
 * @copyright 2014 Bhawani Gautam
 * @copyright 2012-2018 Timo Tijhof
 * @license <https://opensource.org/licenses/MIT>
 */
/*jshint browser:true, unused:true, forin:false */
/*global $, mw */
(function () {
	'use strict';

	var msgs = {
			'option-default': {
				en: 'Default',
				bho: 'डिफ़ॉल्ट',
				gu: 'ડિફોલ્ટ',
				hi: 'डिफ़ॉल्ट',
				ne: 'डिफल्ट',
				pa: 'ਅਸਲ ਦਿੱਖ',
				sa: 'उत्सर्गः'
			},
			'option-arabic': {
				en: '1 2 3'
			},
			'option-devanagari': {
				en: 'Devanagari',
				bho: '१२३',
				hi: '१२३',
				ne: '१२३',
				sa: '१२३'
			},
			'option-gujarati': {
				en: '૧ ૨ ૩',
				gu: '૧ ૨ ૩'
			},
			'option-gurmukhi': {
				en: 'Gurmukhi',
				pa: '੧੨੩'
			},
			'label-url': {
				en: '//www.mediawiki.org/wiki/MediaWiki_talk:Gadget-Numerakri.js',
				gu: '//gu.wikipedia.org/wiki/વિકિસૂક્તિઃઅંક_પરિવર્તક',
				hi: '//hi.wikipedia.org/wiki/विकिपीडिया:अंक_परिवर्तक',
				ne: '//ne.wikipedia.org/wiki/विकिपीडिया:अंक_परिवर्तक',
				pa: '//pa.wikipedia.org/wiki/ਵਿਕੀਪੀਡੀਆ:ਅੰਕ ਬਦਲੋ',
				sa: '//sa.wikipedia.org/wiki/विकिपीडिया:अङ्कपरिवर्तकम्'
			},
			'label-text': {
				en: 'Convert numerals',
				bho: 'अंक बदलाव',
				gu: 'અંક પરિવર્તક',
				hi: 'अंक परिवर्तन',
				ne: 'अंक परिवर्तन',
				pa: 'ਅੰਕ ਬਦਲੋ',
				sa: 'अङ्कपरिवर्तकम्'
			},
			'label-tooltip': {
				en: 'Convert between Arabic and Devanagari numerals',
				bho: 'नागरी आ अरबी अंकों में अदला-बदली करीं',
				gu: 'ગુજરાતી અને અંગ્રેજી અંકોમાં પરિવર્તન કરો',
				hi: 'नागरी और अरबी अंकों में परिवर्तन करें',
				ne: 'देवनागरी र अरबी अंकहरूमा परिवर्तन गर्नुहोस्',
				pa: 'ਅੰਕਾਂ ਨੂ ਗੁਰਮੁਖੀ ਤੇ ਅਰਬੀ ਵਿਚ ਬਦਲੇਂ',
				sa: 'देवनागरी-अरबी-अङ्कयोः चयनं करोतु'
			}
		},
		maps = {
			arabic: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
			devanagari: ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९'],
			gujarati: ['૦', '૧', '૨', '૩', '૪', '૫', '૬', '૭', '૮', '૯'],
			gurmukhi: ['੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮', '੯']
		},
		availableMaps,
		currentType = 'default',
		matchers = {},
		walker,
		styleTag;

	function isValidType(type) {
		return type === 'default' || availableMaps.indexOf(type) !== -1;
	}

	/** @return {Object.<RegExp>} */
	function getMatchers(targetType) {
		var rChars;
		if (!matchers[targetType]) {
			rChars = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [] };
			$.each(maps, function (type, map) {
				if (type !== targetType) {
					for (var i = 0; i <= 9; i++) {
						rChars[i].push(map[i]);
					}
				}
			});
			$.each(rChars, function (num, chars) {
				rChars[num] = new RegExp('(' + chars.map(mw.RegExp.escape).join('|') + ')', 'g');
			});
			matchers[targetType] = rChars;
		}
		return matchers[targetType];
	}

	function msg(key) {
		return msgs[key][mw.config.get('wgUserLanguage')] || msgs[key].en;
	}

	/**
	 * @param {HTMLElement|TextNode} node
	 * @return {number} NodeFilter.FILTER_* constant
	 */
	function filterNode(node) {
		if (node.nodeType === Node.TEXT_NODE) {
			return NodeFilter.FILTER_ACCEPT;
		}
		var n = node.nodeName && node.nodeName.toLowerCase();
		if (n === 'input' || n === 'textarea' || $(node).hasClass('mw-numerakri-skip')) {
			// Skip this element and skip its children
			return NodeFilter.FILTER_REJECT;
		}
		// Skip this element, but check its children
		return NodeFilter.FILTER_SKIP;
	}

	/**
	 * @param {TextNode} node
	 */
	function handleTextNode(node) {
		var original = node.nodeValue,
			changed = original,
			matchers = getMatchers(currentType),
			i = 0;
		for (; i <= 9; i++) {
			changed = changed.replace(matchers[i], maps[currentType][i]);
		}
		if (original !== changed) {
			node.nodeValue = changed;
		}
	}

	// https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw-method-requestIdleCallback
	function idleWalker(deadline) {
		var el;
		if (!walker) {
			return;
		}
		while (deadline.timeRemaining() > 0) {
			el = walker.nextNode();
			if (!el) {
				// Reached the end
				walker = null;
				return;
			}
			handleTextNode(el);
		}

		// The user may interact with the page. We pause so the browser can process
		// interaction. The text handler will continue after that.
		if (walker) {
			mw.requestIdleCallback(idleWalker);
		}
	}

	/**
	 * Save a browser cookie for 30 days, or remove it.
	 * @param {string|null} value
	 */
	function saveType(value) {
		mw.requestIdleCallback(function () {
			$.cookie('mw-numerakri-type', value, { expires: 30, path: '/' });
		});
	}

	/**
	 * @return {string}
	 */
	function getStoredType() {
		var value = $.cookie('mw-numerakri-type');
		if (value !== null && !isValidType(value)) {
			// Remove bad cookie
			saveType(null);
			value = null;
		}

		return value || 'default';
	}

	function startPageConversion() {
		if (styleTag) {
			// Undo style for a previously selected type
			$(styleTag).remove();
			styleTag = null;
		}

		if (currentType === 'default') {
			// Don't change the page
			return;
		}

		if (currentType === 'arabic') {
			styleTag = mw.loader.addStyleTag('.mw-parser-output ol, ol.references, li.references { list-style-type: decimal; }');
		} else if (currentType === 'devanagari') {
			styleTag = mw.loader.addStyleTag('.mw-parser-output ol, ol.references, li.references { list-style-type: devanagari; }');
		}

		// If a walker is already active, replace it.
		// If no walker is active yet, start it.
		if (!walker) {
			mw.requestIdleCallback(idleWalker);
		}
		walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, filterNode, false);
	}

	/** @return {HTMLElement} */
	function createSelector() {
		var $select = $('<select>').addClass('mw-numerakri-skip').append(
			$('<option>').val('default').text(msg('option-default'))
		);
		availableMaps.forEach(function (type) {
			$select.append($('<option>').val(type).text(msg('option-' + type)));
		});
		$select.val(currentType);
		$select.on('change', function () {
			currentType = this.value;
			startPageConversion();
			saveType(currentType);
		});
		return $select[0];
	}

	function init() {
		var potlet, menu;

		// Decide which types to show
		availableMaps = ['gujarati', 'arabic'];

		// Decide selected type
		currentType = getStoredType();
		startPageConversion();

		potlet = mw.util.addPortletLink(
			'p-personal',
			msg('label-url'),
			msg('label-text'),
			'pt-numconvert',
			msg('label-tooltip'),
			null,
			mw.user.isAnon() ? '#pt-createaccount' : '#pt-userpage'
		);
		menu = $('<div>').addClass('mw-numerakri-menu').append(createSelector())[0];
		if(potlet) {
			potlet.appendChild(menu);
		}
	}

	$(function () {
		mw.requestIdleCallback(init);
	});
}());

/* Any JavaScript here will be loaded for all users on every page load. */

self.ws_messages = { 
	'iwtrans':'Its text comes from', 
	'iwtrans2':'Its text comes from other sub-domains.',
	'optlist':'Display options',
	'hide_page_numbers':'Hide page links',
	'show_page_numbers':'Show page links',
	'layout':'Layout',
	'author':'Author',
	'translator':'Translator', 
	'editor':'Editor', 
	'publisher':'Publisher', 
	'place':'Place', 
	'volume':'Volume', 
	'school':'School', 
	'book':'Book', 
	'collection':'Collection', 
	'journal':'Journal or magazine', 
	'phdthesis':'Thesis, report', 
	'dictionary':'Dictionary', 
	'progress':'Progress', 
	'progress_T':'Done', 
	'progress_V':'To be validated', 
	'progress_C':'To be proofread', 
	'progress_MS':'Ready for Match & Split', 
	'progress_OCR':'Needs an OCR text layer', 
	'progress_L':'Source file is incorrect (missing pages, unordered pages, etc)',
 
	'page_namespace_name':      'Page',
	'page_trascluded_in':       'Page trascluded in:',
	'text_number':              'Text',

	'compare_with':  'Comparison with:',
	'compare_texts': 'Compare texts'
};

$.getScript( '//wiki.ekatrafoundation.org/index.php?title=MediaWiki:Base.js&action=raw&ctype=text/javascript' )
.done( function() {
	importScript('MediaWiki:InterWikiTransclusion.js');
	importScript('MediaWiki:TranscludedIn.js');
	importScript('MediaWiki:Compare.js');
} );
/* Footnotes as tooltip - from it.wikipedia.org - request by Candalua */

$( function ()
{
 sups = document.getElementsByTagName("sup");
 for (i=0; i<sups.length; i++)
 {
   note_id = sups[i].childNodes[0].href;
   if (note_id && (note_id.indexOf("#") != -1))
   {
     note_id = document.getElementById(note_id.substr(note_id.indexOf("#")+1));
     if (note_id)
       if (document.all) 
       { 
           sups[i].title = note_id.innerText; 
           sups[i].childNodes[0].title = note_id.innerText; 
       } 
       else 
       { 
           sups[i].title = note_id.textContent; 
      }
   }
 }
});

// Add links to Wikidata in the toolbar where [[Module:Interwiki]] is used
$("#t-wikibase").insertBefore($("#p-tb li").last()).removeAttr("style");

// Code to switch sizes for {{Tscore resizable}}
$( function ()
{
	el = document.getElementsByClassName("prp-page-content");
	if (el.length) {
		maxwidth = el[0].clientWidth;
	} else {
		maxwidth = document.getElementById("mw-content-text").clientWidth;
	}
	screslistslist = document.getElementsByClassName("score-resizable-container");
	scressizelist = [];
	for (i = 0; i < screslistslist.length; i++) {
		//maxwidth = screslistslist[i].parentNode.clientWidth;
		screslist = screslistslist[i].getElementsByClassName("score-resizable");
		fitwidth = 0;
		fitelement = -1;
		for (j = 0; j < screslist.length; j++) {
			s = screslist[j].className.match(/score-resizable-size-\d+/);
			scressizelist[j] = parseInt(s[0].match(/\d+/), 10);
			//find largest score that has width < parent width
			if (scressizelist[j] > fitwidth && scressizelist[j] <= maxwidth) {
				fitwidth = scressizelist[j];
				fitelement = j;
			}
		}
		if (fitelement < 0) {
			fitelement = 0;
		}
		for (j = 0; j < screslist.length; j++) {
			if (j != fitelement) {
				screslist[j].style.display = "none";
			}
		}
		screslist[fitelement].style.display = "block";
	}
});

if (mw.user.isAnon() === true) { // Check if the user is anonymous
    $(function () {
        $('.ext-wikisource-download-button').hide(); // Hide the button for anonymous users
    });
}


$(document).ready(function() {
    // Get the page title
    var pageTitle = mw.config.get('wgTitle');

    // Encode the title and replace spaces with '%20'
    var encodedTitle = encodeURIComponent(pageTitle).replace(/%20/g, '%20'); // Correctly handle spaces

    // Create the download button
    var downloadButton = $('<a>')
        .attr('href', 'https://wiki.ekatrafoundation.org/images/epub/' + encodedTitle + '.epub')
        .attr('download', '') // Suggests to download the file rather than opening it
        .text('Download EPUB')
        .css({
            'display': 'inline-block',
            'padding': '8px 16px',
            'background-color': '#4CAF50',
            'color': '#ffffff',
            'text-align': 'center',
            'border-radius': '4px',
            'text-decoration': 'none',
            'margin-top': '10px'
        });

    // Add the button to the page content
    $('#bodyContent').append(downloadButton);
});


$(document).ready(function() {
    // Get the page title from the MediaWiki configuration
    var pageTitle = mw.config.get('wgTitle');
    
    // Check if the page title contains a forward slash
    if (pageTitle.indexOf('/') === -1) {
        // Show the download button if it's a top-level page
        $('a[href*="/find_epub.php"]').show();
    } else {
        // Hide the download button if it's a subpage
        $('a[href*="/find_epub.php"]').hide();
    }
});



$(document).ready(function() {
    var $element = $('#editpage-specialchars');
    var isDragging = false;
    var startX, startY, initialX, initialY;

    $element.on('mousedown', function(e) {
        isDragging = true;
        startX = e.clientX;
        startY = e.clientY;
        initialX = $element.offset().left;
        initialY = $element.offset().top;
        $element.addClass('dragging');
    });

    $(document).on('mousemove', function(e) {
        if (isDragging) {
            var dx = e.clientX - startX;
            var dy = e.clientY - startY;
            $element.css({
                top: initialY + dy + 'px',
                left: initialX + dx + 'px'
            });
        }
    });

    $(document).on('mouseup', function() {
        if (isDragging) {
            isDragging = false;
            $element.removeClass('dragging');
        }
    });
});