|
|
(159 intermediate revisions by 8 users not shown) |
Line 1: |
Line 1: |
| /* Any JavaScript here will be loaded for all users on every page load. */ | | /* Add Adobe Analytics Tracking Details 2022-11-17 */ |
| | // First listen to an event that is fired when the FS object is available |
| | window.addEventListener('ExReady', function(){ |
| | |
| | // Call setTimeout to avoid a flaw in FS that triggers infinite recursion |
| | setTimeout(function(){ |
|
| |
|
| (function() {
| | // Now configure the page data and manually trigger the page view |
| var css = document.createElement('link'); | | FS.Analytics.updatePageViewData({ |
| css.rel = 'stylesheet';
| | page_channel: 'Wiki', |
| css.href = '//familysearch.org/hf/hf.css';
| | page_detail: 'Wiki Test' |
| var head = document.querySelector('head'); | | }); |
| head.insertBefore(css, head.childNodes[0]);
| | FS.Analytics.trackPageView(); |
| var body = document.querySelector('body');
| | }); |
| body.insertBefore(document.createElement('header'), body.childNodes[0]); | | }); |
| body.appendChild(document.createElement('footer'));
| | /* End Adobe Analytics Tracking Details */ |
| })(); | |
|
| |
|
| (function() { | | /* Fix for <imagemap>s to prevent them from resizing */ |
| var meta = document.createElement('meta'); | | $( document ).ready(function() { |
| meta.name = 'hf_base_url';
| | $('[usemap]').each(function() { |
| meta.content = 'https://familysearch.org';
| | $(this).css('min-width', parseInt($(this).attr('width'))); |
| var head = document.querySelector('head');
| | }); |
| head.insertBefore(meta, head.childNodes[0]); | | }); |
| })(); | |
|
| |
|
| (function() {
| | /* Add obvious background color to Beta */ |
| var fs = document.createElement('script');
| | if (document.location.origin.indexOf("beta") > -1) { |
| fs.type = 'text/javascript';
| | document.getElementById("mw-head").style.backgroundColor = "#ffb3b3"; |
| 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;
| |
| }
| |
| })();
| |
| /**
| |
| * Test if an element has a certain class
| |
| * @deprecated: Use $(element).hasClass() instead.
| |
| */
| |
| mw.log.deprecate( window, 'hasClass', function ( element, className ) {
| |
| return $( element ).hasClass( className );
| |
| }, 'Use jQuery.hasClass() instead' );
| |
|
| |
| /**
| |
| * Collapsible tables
| |
| *
| |
| * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
| |
| *
| |
| * @version 2.0.3 (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.
| |
| */
| |
|
| |
| var autoCollapse = 2;
| |
| var collapseCaption = 'hide';
| |
| var expandCaption = 'show';
| |
| var tableIndex = 0;
| |
|
| |
| 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( $content ) {
| |
| var NavigationBoxes = {};
| |
| var $Tables = $content.find( 'table' );
| |
| var i;
| |
|
| |
| $Tables.each( function( i, table ) {
| |
| if ( $(table).hasClass( 'collapsible' ) ) {
| |
|
| |
| /* only add button and increment count if there is a header row to work with */
| |
| var HeaderRow = table.getElementsByTagName( 'tr' )[0];
| |
| if ( !HeaderRow ) {
| |
| return;
| |
| }
| |
| var Header = table.getElementsByTagName( 'th' )[0];
| |
| if ( !Header ) {
| |
| return;
| |
| }
| |
|
| |
| NavigationBoxes[ tableIndex ] = table;
| |
| table.setAttribute( 'id', 'collapsibleTable' + tableIndex );
| |
|
| |
| var Button = document.createElement( 'span' );
| |
| var ButtonLink = document.createElement( 'a' );
| |
| var ButtonText = document.createTextNode( collapseCaption );
| |
| // Styles are declared in [[MediaWiki:Common.css]]
| |
| Button.className = 'collapseButton';
| |
|
| |
| 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 );
| |
| }
| |
| else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) {
| |
| var element = NavigationBoxes[i];
| |
| while ((element = element.parentNode)) {
| |
| if ( $( element ).hasClass( 'outercollapse' ) ) {
| |
| collapseTable ( i );
| |
| break;
| |
| }
| |
| }
| |
| }
| |
| }
| |
| }
| |
|
| |
| mw.hook( 'wikipage.content' ).add( createCollapseButtons );
| |
|
| |
| /**
| |
| * Dynamic Navigation Bars (experimental)
| |
| *
| |
| * Description: See [[Wikipedia:NavFrame]].
| |
| * Maintainers: UNMAINTAINED
| |
| */
| |
|
| |
| /* set up the words in your language */
| |
| var NavigationBarHide = '[' + collapseCaption + ']';
| |
| var NavigationBarShow = '[' + expandCaption + ']';
| |
| var indexNavigationBar = 0;
| |
|
| |
| /**
| |
| * Shows and hides content and picture (if available) of navigation bars
| |
| * Parameters:
| |
| * indexNavigationBar: the index of navigation bar to be toggled
| |
| **/
| |
| window.toggleNavigationBar = function ( indexNavigationBar, event ) {
| |
| var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
| |
| var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
| |
| var NavChild;
| |
|
| |
| if ( !NavFrame || !NavToggle ) {
| |
| return false;
| |
| }
| |
|
| |
| /* if shown now */
| |
| if ( NavToggle.firstChild.data === NavigationBarHide ) {
| |
| for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
| |
| if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
| |
| 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( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
| |
| NavChild.style.display = 'block';
| |
| }
| |
| }
| |
| NavToggle.firstChild.data = NavigationBarHide;
| |
| }
| |
|
| |
| event.preventDefault();
| |
| };
| |
|
| |
| /* adds show/hide-button to navigation bars */
| |
| function createNavigationBarToggleButton( $content ) {
| |
| var NavChild;
| |
| /* iterate over all < div >-elements */
| |
| var $divs = $content.find( 'div' );
| |
| $divs.each( function ( i, NavFrame ) {
| |
| /* if found a navigation bar */
| |
| if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {
| |
|
| |
| indexNavigationBar++;
| |
| var NavToggle = document.createElement( 'a' );
| |
| NavToggle.className = 'NavToggle';
| |
| NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
| |
| NavToggle.setAttribute( 'href', '#' );
| |
| $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );
| |
|
| |
| var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );
| |
| /**
| |
| * Check if any children are already hidden. This loop is here for backwards compatibility:
| |
| * the old way of making NavFrames start out collapsed was to manually add style="display:none"
| |
| * to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make
| |
| * the content visible without JavaScript support), the new recommended way is to add the class
| |
| * "collapsed" to the NavFrame itself, just like with collapsible tables.
| |
| */
| |
| for ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) {
| |
| if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
| |
| if ( NavChild.style.display === 'none' ) {
| |
| isCollapsed = true;
| |
| }
| |
| }
| |
| }
| |
| if ( isCollapsed ) {
| |
| for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
| |
| if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
| |
| NavChild.style.display = 'none';
| |
| }
| |
| }
| |
| }
| |
| var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );
| |
| NavToggle.appendChild( NavToggleText );
| |
|
| |
| /* Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) */
| |
| for( var j = 0; j < NavFrame.childNodes.length; j++ ) {
| |
| if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
| |
| NavToggle.style.color = NavFrame.childNodes[j].style.color;
| |
| NavFrame.childNodes[j].appendChild( NavToggle );
| |
| }
| |
| }
| |
| NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
| |
| }
| |
| } );
| |
| }
| |
|
| |
| mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
| |