MediaWiki:Common.js

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

/** Test if an element has a certain class * Description: Uses regular expressions and caching for better performance. * Maintainers: User:Mike Dillon, User:R. Koot, User:SG */ var hasClass = (function {   var reCache = {};    return function(element, className) {        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);   }; });

/** * Collapsible tables * * @version 2.0.2 (2014-03-14) * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js * @author User:R. Koot * @author User:Krinkle * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which * is supported in MediaWiki core. */ /*global $, mw */ var autoCollapse = 2; var collapseCaption = 'hide'; var expandCaption = 'show';

(function {   function collapseTable(tableIndex) {        var Button = document.getElementById('collapseButton' + tableIndex);        var Table = document.getElementById('collapsibleTable' + tableIndex);

if (!Table || !Button) { return false; }

var Rows = Table.rows; var i;

if (Button.firstChild.data === collapseCaption) { for (i = 1; i < Rows.length; i++) { Rows[i].style.display = 'none'; }           Button.firstChild.data = expandCaption; } else { for (i = 1; i < Rows.length; i++) { Rows[i].style.display = Rows[0].style.display; }           Button.firstChild.data = collapseCaption; }   }

function createClickHandler(tableIndex) { return function(e) { e.preventDefault; collapseTable(tableIndex); };   }

function createCollapseButtons { var tableIndex = 0; var NavigationBoxes = {}; var Tables = document.getElementsByTagName('table'); var i;

for (i = 0; i < Tables.length; i++) { if ($(Tables[i]).hasClass('collapsible')) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName('tr')[0]; if (!HeaderRow) { continue; }               var Header = HeaderRow.getElementsByTagName('th')[0]; if (!Header) { continue; }

NavigationBoxes[tableIndex] = Tables[i]; Tables[i].setAttribute('id', 'collapsibleTable' + tableIndex);

var Button = document.createElement('span'); var ButtonLink = document.createElement('a'); var ButtonText = document.createTextNode(collapseCaption); // TODO: Declare styles in MediaWiki:Gadget-collapsibleTables.css // Button.className = 'collapseButton'; Button.style.styleFloat = 'right'; Button.style.cssFloat = 'right'; Button.style.fontWeight = 'normal'; Button.style.textAlign = 'right'; Button.style.width = '6em';

ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute('id', 'collapseButton' + tableIndex); ButtonLink.setAttribute('href', '#'); $(ButtonLink).on('click', createClickHandler(tableIndex)); ButtonLink.appendChild(ButtonText);

Button.appendChild(document.createTextNode('[')); Button.appendChild(ButtonLink); Button.appendChild(document.createTextNode(']'));

Header.insertBefore(Button, Header.firstChild); tableIndex++; }       }

for (i = 0; i < tableIndex; i++) { if ($(NavigationBoxes[i]).hasClass('collapsed') ||               (tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass('autocollapse'))            ) { collapseTable(i); }       }    }

mw.hook('wikipage.content').add(createCollapseButtons); });

/** * Dynamic Navigation Bars. See NavFrame * Based on script from en.wikipedia.org, 2008-09-15. * @source www.mediawiki.org/wiki/MediaWiki:Gadget-NavFrame.js * @maintainer Helder.wiki, 2012–2013 * @maintainer Krinkle, 2013 */ (function {   // set up the words in your language    var navigationBarHide = '[' + collapseCaption + ']';    var navigationBarShow = '[' + expandCaption + ']';

/**    * Shows and hides content and picture (if available) of navigation bars. * @param {number} indexNavigationBar The index of navigation bar to be toggled * @param {jQuery.Event} e Event object */   function toggleNavigationBar(indexNavigationBar, e) { var navChild, navToggle = document.getElementById('NavToggle' + indexNavigationBar), navFrame = document.getElementById('NavFrame' + indexNavigationBar);

// Prevent browser from jumping to href "#" e.preventDefault;

if (!navFrame || !navToggle) { return false; }

// If shown now if (navToggle.firstChild.data == navigationBarHide) { for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) { if (hasClass(navChild, 'NavPic')) { navChild.style.display = 'none'; }               if (hasClass(navChild, 'NavContent')) { navChild.style.display = 'none'; }           }            navToggle.firstChild.data = navigationBarShow;

// If hidden now } else if (navToggle.firstChild.data == navigationBarShow) { for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) { if ($(navChild).hasClass('NavPic') || $(navChild).hasClass('NavContent')) { navChild.style.display = 'block'; }           }            navToggle.firstChild.data = navigationBarHide; }   }

/**    * Adds show/hide-button to navigation bars. * @param {jQuery} $content */   function createNavigationBarToggleButton($content) { var i, j, navFrame, navToggle, navToggleText, navChild, indexNavigationBar = 0, navFrames = $content.find('div.NavFrame').toArray;

// Iterate over all (new) nav frames for (i = 0; i < navFrames.length; i++) { navFrame = navFrames[i]; // If found a navigation bar indexNavigationBar++; navToggle = document.createElement('a'); navToggle.className = 'NavToggle'; navToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); navToggle.setAttribute('href', '#'); $(navToggle).on('click', $.proxy(toggleNavigationBar, null, indexNavigationBar));

navToggleText = document.createTextNode(navigationBarHide); for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) { if ($(navChild).hasClass('NavPic') || $(navChild).hasClass('NavContent')) { if (navChild.style.display == 'none') { navToggleText = document.createTextNode(navigationBarShow); break; }               }            }

navToggle.appendChild(navToggleText); // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) for (j = 0; j < navFrame.childNodes.length; j++) { if ($(navFrame.childNodes[j]).hasClass('NavHead')) { navFrame.childNodes[j].appendChild(navToggle); }           }            navFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); }   }

mw.hook('wikipage.content').add(createNavigationBarToggleButton); });

//Adding Header/Footer to these pages (function {   var css = document.createElement('link');    css.rel = 'stylesheet';    css.href = '//familysearch.org/hf/hf.css';    var head = document.querySelector('head');    head.insertBefore(css, head.childNodes[0]); });

(function {   var body = document.querySelector('body');    body.innerHTML = ' ' + body.innerHTML + ' ';    body.insertBefore(document.createElement('header'), body.childNodes[0]);    body.appendChild(document.createElement('footer')); });

(function {   var meta = document.createElement('meta');    meta.name = 'hf_base_url';    meta.content = 'https://familysearch.org';    var head = document.querySelector('head');    head.insertBefore(meta, head.childNodes[0]); });

(function {   var fs = document.createElement('script');    fs.type = 'text/javascript';    fs.async = true;    var base_url = "https://familysearch.org";    fs.src = 'https://familysearch.org/hf/hf.js' + (base_url === "" ? "" : "?base_url=" + base_url);   var s = document.getElementsByTagName('script')[0];    s.parentNode.insertBefore(fs, s); });

function getCookie(name) { var re = new RegExp(name + "=([^;]+)"); var value = re.exec(document.cookie); return (value !== null) ? unescape(value[1]) : null; } setTimeout(function {   var templeCookie = getCookie('fs-highconf') || getCookie('fs-templeinfo');    if (templeCookie && templeCookie.indexOf('true') > -1) {        var body = document.querySelector('body');        body.classList.add('templeMember');    } }, 2000);

/* Fix for double title */ (function{   var mainTitle = document.querySelector('#firstHeading');    var secondTitle = document.querySelector('#mw-content-text > h1');    if(mainTitle && secondTitle){        mainTitle.hidden = true;    } });