|
|
(72 intermediate revisions by 5 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(){ |
|
| |
|
| // Only load the A/B testing code for pages with 'Main_Page' in the title in Production | | // Now configure the page data and manually trigger the page view |
| if ( (/Main_Page/.test(document.location.href)) && (document.location.origin == 'https://www.familysearch.org') ) {
| | FS.Analytics.updatePageViewData({ |
| mw.loader.load( '/wiki/en/index.php?title=MediaWiki:ABTest.js&action=raw&ctype=text/javascript' );
| | page_channel: 'Wiki', |
| }
| | page_detail: 'Wiki Test' |
| | | }); |
| /* Adobe Analytics added 2019-05-16 */
| | FS.Analytics.trackPageView(); |
| window.utag_data={
| | }); |
| 'site_id': 'FamilySearch',
| | }); |
| 'page_channel': 'Wiki',
| | /* End Adobe Analytics Tracking Details */ |
| 'page_detail': document.location.pathname, //'Home' for the homepage or a unique page title for other pages
| |
| };
| |
| | |
| (function(a,b,c,d){
| |
| a='//tags.tiqcdn.com/utag/lds/familysearch/prod/utag.js';
| |
| b=document;c='script';d=b.createElement(c);d.src=a;d.type='text/java'+c;d.async=true; | |
| a=b.getElementsByTagName(c)[0];a.parentNode.insertBefore(d,a);
| |
| })(); | |
| | |
| 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); | |
| | |
| /** | |
| * 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' );
| |
|
| |
|
| /** | | /* Fix for <imagemap>s to prevent them from resizing */ |
| * Collapsible tables
| | $( document ).ready(function() { |
| *
| | $('[usemap]').each(function() { |
| * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
| | $(this).css('min-width', parseInt($(this).attr('width'))); |
| *
| |
| * @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 );
| |
| | |
| /* Added for Accordion button */
| |
| (function() {
| |
| var acc = document.getElementsByClassName("accordion");
| |
| var i;
| |
| | |
| for (i = 0; i < acc.length; i++) {
| |
| acc[i].onclick = function(){
| |
| /* Toggle between adding and removing the "active" class,
| |
| to highlight the button that controls the panel */
| |
| this.classList.toggle("active");
| |
| | |
| /* Toggle between hiding and showing the active panel */
| |
| var panel = this.nextElementSibling;
| |
| if (panel.style.display === "block") {
| |
| panel.style.display = "none";
| |
| } else {
| |
| panel.style.display = "block";
| |
| }
| |
| }
| |
| }
| |
| })();
| |
| | |
| /* end Accordion button */
| |
| | |
| /* This is where the code for inserting the Location Map starts. */
| |
| (function() {
| |
| if (document.querySelector('h1#firstHeading').innerHTML === "Guided Research for Online Records") {
| |
| | |
| var polyfill = document.createElement('script');
| |
| polyfill.type = 'text/javascript';
| |
| polyfill.async = true;
| |
| polyfill.src = 'https://edge.fscdn.org/assets/components/mapFiles/webcomponentsjs/webcomponents-lite-60405515c49744988a6a24e03dedf15a.js';
| |
| var s = document.getElementsByTagName('script')[0];
| |
| s.parentNode.insertBefore(polyfill, s);
| |
| | |
| var locationMap = document.createElement('link');
| |
| locationMap.rel = 'import';
| |
| /* CHANGE NEEDED: update URL below every time the location-map.html is changed */
| |
| locationMap.href = 'https://gist.githubusercontent.com/ahancey/a86414a07c7c1466cc36ffb790a0817d/raw/748a662f88adf92729d925ebf5fb1ce26ec0bb38/location-map.html';
| |
| var s = document.getElementsByTagName('script')[0];
| |
| s.parentNode.insertBefore(locationMap, s);
| |
| | |
| document.querySelector('#mw-content-text p').innerHTML = "<div style='width: 1000px;'><location-map></location-map></div>";
| |
| }
| |
| })();
| |
| | |
| /* code for new landing page */
| |
| if (/Main_Page/.test(document.location.href)) {
| |
| var el = document.querySelector('#firstHeading');
| |
| el.style.border = "0";
| |
| el.style.textAlign = "center";
| |
| | |
| | |
| // By wrapping the code block in $() we get the same behavior as using
| |
| // document).ready(function () { }
| |
| $(function () { | |
| // start off with hiding Countries and States
| |
| hideCountries();
| |
| hideStates();
| |
| | |
| // https://api.jquery.com/category/selectors/
| |
| // attach to elements ending with _list
| |
| $('[id$=_list]').click(function () {
| |
| hideCountries();
| |
| $("#countries_list").hide();
| |
| hideStates();
| |
| // show the corresponding country
| |
| var position = this.id.indexOf('_list');
| |
| var target = this.id.substring(0, position);
| |
| var myId = '#' + target + '_countries';
| |
| $(myId).show(200);
| |
| var thisExitMenu = "#exit_menu_" + target + '_countries';
| |
| //console.log("showing exit menu " + thisExitMenu);
| |
| $(thisExitMenu).show();
| |
| });
| |
| | |
| // attach to elements ending with _list2
| |
| $('[id$=_list2]').click(function (e) { | |
| // show the corresponding states
| |
| var position = this.id.indexOf('_list2');
| |
| var target = this.id.substring(0, position);
| |
| var myId = '#' + target + '_states';
| |
| //console.log("You clicked a list2; showing " + myId)
| |
| $(myId).show(200);
| |
| // stop the bubble which would hide all states
| |
| e.stopPropagation();
| |
| // since we stop the bubble, make sure countries_list is hidden
| |
| $("#countries_list").hide();
| |
| });
| |
| | |
| // clicking any class="exit_menu" hides all states
| |
| $('.exit_menu').click(function () {
| |
| hideStates();
| |
| // let stateList = this.parentNode.parentNode.id;
| |
| // console.log ('You clicked in ' + stateList);
| |
| $("#all_countries_countries").hide();
| |
| });
| |
|
| |
| // attach to any id with exit_menu at the start
| |
| $('[id^=exit_menu]').click(function () {
| |
| // hide the corresponding _countries
| |
| var target = this.id.substring(10);
| |
| var myId = '#' + target;
| |
| //console.log("You clicked an exit_menu for " + this.id);
| |
| //console.log("Hiding " + myId + " and showing the countries_list");
| |
| $(myId).hide();
| |
| // show the countries_list
| |
| $("#countries_list").show(200);
| |
| });
| |
| }); | | }); |
| | }); |
|
| |
|
| | /* Add obvious background color to Beta */ |
| | if (document.location.origin.indexOf("beta") > -1) { |
| | document.getElementById("mw-head").style.backgroundColor = "#ffb3b3"; |
| } | | } |
| function hideCountries() {
| |
| $('[id$=_countries]').hide();
| |
| }
| |
|
| |
| function hideStates() {
| |
| $('[id$=_states]').hide();
| |
| }
| |
| /* end code for landing page*/
| |