MediaWiki:Common.js: Difference between revisions

From Ekatra Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(76 intermediate revisions by 3 users not shown)
Line 1: Line 1:
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(){
$( function(){
var sidebarCategory = $("#p-Categories > .vector-menu-content");
if (window.matchMedia("(max-width: 768px)").matches) {
sidebarCategory.empty();
if( mw.config.get("skin") !== "minerva" ){
var sel = $('<select>').appendTo( sidebarCategory );
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') ){
if( mw.config.get('wgIsMainPage') ){
$('#firstHeading').remove();
$('#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  ){
if( mw.config.get('wgUserName') === null  ){
Line 15: Line 71:
$("#content").removeAttr("onmousedown");
$("#content").removeAttr("onmousedown");
$("#content").removeAttr("onselectstart");
$("#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 );
    }
);
}
}


mw.loader.load( '/index.php?title=MediaWiki:Numerakri.js&action=raw&ctype=text/javascript' );
});
});


$( function(){
$( function(){
var poemElement = $(".Poem2-Ekatra");
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);
}
if( poemElement.length ){
Poem2lenghtArray.forEach(function(j) {
var poemText = poemElement.html();
var poemArray = poemText.split("\n");
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');
});
}
poemElement.text("");
});
}
 
});
 
$( 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;
poemArray.forEach( function(i) {
// toggleImgs[0] to switch to custom, toggleImgs[1] to revert to default
poemElement.append( '<p style="text-indent: 3em;">' + i + '</p>' );
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');
        }
    });
});
});

Latest revision as of 06:56, 24 August 2024

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');
        }
    });
});