<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dunedb.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AResourcePage.js</id>
	<title>MediaWiki:ResourcePage.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dunedb.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AResourcePage.js"/>
	<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:ResourcePage.js&amp;action=history"/>
	<updated>2026-05-22T16:16:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://dunedb.com/index.php?title=MediaWiki:ResourcePage.js&amp;diff=695&amp;oldid=prev</id>
		<title>Operator: Created page with &quot;/**  * ResourcePage.js - ResourceLoader Module  * This file should be created as MediaWiki:ResourcePage.js  *   * Dependencies: jquery, mediawiki.api, mediawiki.util  */  ( function ( $, mw ) {     &#039;use strict&#039;;      /**      * Resource Page Enhancement Module      * Provides interactive features for resource pages including      * search functionality and popup displays for recipes      */     var ResourcePage = {                  /**          * Configuration          *...&quot;</title>
		<link rel="alternate" type="text/html" href="https://dunedb.com/index.php?title=MediaWiki:ResourcePage.js&amp;diff=695&amp;oldid=prev"/>
		<updated>2025-05-26T17:31:20Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;*  * ResourcePage.js - ResourceLoader Module  * This file should be created as MediaWiki:ResourcePage.js  *   * Dependencies: jquery, mediawiki.api, mediawiki.util: &lt;/span&gt;  ( function ( $, mw ) {     &amp;#039;use strict&amp;#039;;      &lt;span class=&quot;autocomment&quot;&gt;*      * Resource Page Enhancement Module      * Provides interactive features for resource pages including      * search functionality and popup displays for recipes: &lt;/span&gt;     var ResourcePage = {                  /**          * Configuration          *...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * ResourcePage.js - ResourceLoader Module&lt;br /&gt;
 * This file should be created as MediaWiki:ResourcePage.js&lt;br /&gt;
 * &lt;br /&gt;
 * Dependencies: jquery, mediawiki.api, mediawiki.util&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
( function ( $, mw ) {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Resource Page Enhancement Module&lt;br /&gt;
     * Provides interactive features for resource pages including&lt;br /&gt;
     * search functionality and popup displays for recipes&lt;br /&gt;
     */&lt;br /&gt;
    var ResourcePage = {&lt;br /&gt;
        &lt;br /&gt;
        /**&lt;br /&gt;
         * Configuration&lt;br /&gt;
         */&lt;br /&gt;
        config: {&lt;br /&gt;
            selectors: {&lt;br /&gt;
                craftedWithSearch: &amp;#039;#craftedWithSearch&amp;#039;,&lt;br /&gt;
                craftedFromSearch: &amp;#039;#craftedFromSearch&amp;#039;,&lt;br /&gt;
                craftedWithTable: &amp;#039;#craftedWithTable&amp;#039;,&lt;br /&gt;
                craftedFromTable: &amp;#039;#craftedFromTable&amp;#039;,&lt;br /&gt;
                viewAllCraftedWith: &amp;#039;.view-all-crafted-with&amp;#039;,&lt;br /&gt;
                viewAllCraftedFrom: &amp;#039;.view-all-crafted-from&amp;#039;,&lt;br /&gt;
                popupOverlay: &amp;#039;.recipe-popup-overlay&amp;#039;,&lt;br /&gt;
                popupClose: &amp;#039;.popup-close&amp;#039;,&lt;br /&gt;
                popupSearchInput: &amp;#039;.popup-search-input&amp;#039;,&lt;br /&gt;
                popupTable: &amp;#039;.recipe-popup-table&amp;#039;&lt;br /&gt;
            },&lt;br /&gt;
            api: new mw.Api(),&lt;br /&gt;
            animationDuration: 300&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Initialize the module&lt;br /&gt;
         */&lt;br /&gt;
        init: function () {&lt;br /&gt;
            // Only initialize if we&amp;#039;re on a resource page&lt;br /&gt;
            if ( !this.isResourcePage() ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            mw.log( &amp;#039;ResourcePage: Initializing&amp;#039; );&lt;br /&gt;
            &lt;br /&gt;
            this.bindEvents();&lt;br /&gt;
            this.initializeSearch();&lt;br /&gt;
            &lt;br /&gt;
            // Fire a custom event to signal initialization&lt;br /&gt;
            mw.hook( &amp;#039;resourcePage.initialized&amp;#039; ).fire();&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Check if current page is a resource page&lt;br /&gt;
         * @return {boolean}&lt;br /&gt;
         */&lt;br /&gt;
        isResourcePage: function () {&lt;br /&gt;
            return $( &amp;#039;.crafting-section&amp;#039; ).length &amp;gt; 0 || &lt;br /&gt;
                   $( &amp;#039;[class*=&amp;quot;crafted-with&amp;quot;], [class*=&amp;quot;crafted-from&amp;quot;]&amp;#039; ).length &amp;gt; 0;&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Bind event handlers&lt;br /&gt;
         */&lt;br /&gt;
        bindEvents: function () {&lt;br /&gt;
            var self = this;&lt;br /&gt;
&lt;br /&gt;
            // View All buttons&lt;br /&gt;
            $( document )&lt;br /&gt;
                .on( &amp;#039;click&amp;#039;, this.config.selectors.viewAllCraftedWith, function ( e ) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    var resourceName = $( this ).data( &amp;#039;resource&amp;#039; );&lt;br /&gt;
                    self.showCraftedWithPopup( resourceName );&lt;br /&gt;
                } )&lt;br /&gt;
                .on( &amp;#039;click&amp;#039;, this.config.selectors.viewAllCraftedFrom, function ( e ) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    var resourceName = $( this ).data( &amp;#039;resource&amp;#039; );&lt;br /&gt;
                    self.showCraftedFromPopup( resourceName );&lt;br /&gt;
                } );&lt;br /&gt;
&lt;br /&gt;
            // Popup interactions&lt;br /&gt;
            $( document )&lt;br /&gt;
                .on( &amp;#039;click&amp;#039;, this.config.selectors.popupClose + &amp;#039;, &amp;#039; + this.config.selectors.popupOverlay, function ( e ) {&lt;br /&gt;
                    if ( e.target === this || $( e.target ).hasClass( &amp;#039;popup-close&amp;#039; ) ) {&lt;br /&gt;
                        self.closePopup();&lt;br /&gt;
                    }&lt;br /&gt;
                } )&lt;br /&gt;
                .on( &amp;#039;input&amp;#039;, this.config.selectors.popupSearchInput, function () {&lt;br /&gt;
                    var searchTerm = $( this ).val().toLowerCase();&lt;br /&gt;
                    self.filterPopupTable( searchTerm );&lt;br /&gt;
                } );&lt;br /&gt;
&lt;br /&gt;
            // Keyboard shortcuts&lt;br /&gt;
            $( document ).on( &amp;#039;keydown&amp;#039;, function ( e ) {&lt;br /&gt;
                if ( e.key === &amp;#039;Escape&amp;#039; ) {&lt;br /&gt;
                    self.closePopup();&lt;br /&gt;
                }&lt;br /&gt;
            } );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Initialize search functionality for preview tables&lt;br /&gt;
         */&lt;br /&gt;
        initializeSearch: function () {&lt;br /&gt;
            var self = this;&lt;br /&gt;
&lt;br /&gt;
            // Crafted With search&lt;br /&gt;
            $( this.config.selectors.craftedWithSearch ).on( &amp;#039;input&amp;#039;, function () {&lt;br /&gt;
                var searchTerm = $( this ).val().toLowerCase();&lt;br /&gt;
                self.filterTable( self.config.selectors.craftedWithTable, searchTerm );&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            // Crafted From search&lt;br /&gt;
            $( this.config.selectors.craftedFromSearch ).on( &amp;#039;input&amp;#039;, function () {&lt;br /&gt;
                var searchTerm = $( this ).val().toLowerCase();&lt;br /&gt;
                self.filterTable( self.config.selectors.craftedFromTable, searchTerm );&lt;br /&gt;
            } );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Filter table rows based on search term&lt;br /&gt;
         * @param {string} tableSelector - Table selector&lt;br /&gt;
         * @param {string} searchTerm - Search term&lt;br /&gt;
         */&lt;br /&gt;
        filterTable: function ( tableSelector, searchTerm ) {&lt;br /&gt;
            var $table = $( tableSelector ),&lt;br /&gt;
                $rows = $table.find( &amp;#039;tbody tr&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
            if ( !searchTerm ) {&lt;br /&gt;
                $rows.removeClass( &amp;#039;hidden&amp;#039; ).show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            $rows.each( function () {&lt;br /&gt;
                var $row = $( this ),&lt;br /&gt;
                    text = $row.text().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
                if ( text.indexOf( searchTerm ) &amp;gt; -1 ) {&lt;br /&gt;
                    $row.removeClass( &amp;#039;hidden&amp;#039; ).show();&lt;br /&gt;
                } else {&lt;br /&gt;
                    $row.addClass( &amp;#039;hidden&amp;#039; ).hide();&lt;br /&gt;
                }&lt;br /&gt;
            } );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Show popup with recipes that use this resource&lt;br /&gt;
         * @param {string} resourceName - Name of the resource&lt;br /&gt;
         */&lt;br /&gt;
        showCraftedWithPopup: function ( resourceName ) {&lt;br /&gt;
            var self = this;&lt;br /&gt;
&lt;br /&gt;
            this.showLoadingPopup( &amp;#039;Loading recipes that use &amp;#039; + resourceName + &amp;#039;...&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
            this.config.api.parse(&lt;br /&gt;
                &amp;#039;{{ResourceCraftedWith|resource=&amp;#039; + resourceName + &amp;#039;|full=yes}}&amp;#039;,&lt;br /&gt;
                {&lt;br /&gt;
                    contentmodel: &amp;#039;wikitext&amp;#039;,&lt;br /&gt;
                    disablelimitreport: true,&lt;br /&gt;
                    wrapoutputclass: &amp;#039;&amp;#039;&lt;br /&gt;
                }&lt;br /&gt;
            ).done( function ( html ) {&lt;br /&gt;
                self.displayRecipePopup(&lt;br /&gt;
                    &amp;#039;Recipes Using &amp;#039; + resourceName,&lt;br /&gt;
                    html&lt;br /&gt;
                );&lt;br /&gt;
            } ).fail( function () {&lt;br /&gt;
                self.showErrorPopup( &amp;#039;Failed to load recipe data&amp;#039; );&lt;br /&gt;
            } );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Show popup with recipes that produce this resource&lt;br /&gt;
         * @param {string} resourceName - Name of the resource&lt;br /&gt;
         */&lt;br /&gt;
        showCraftedFromPopup: function ( resourceName ) {&lt;br /&gt;
            var self = this;&lt;br /&gt;
&lt;br /&gt;
            this.showLoadingPopup( &amp;#039;Loading recipes that produce &amp;#039; + resourceName + &amp;#039;...&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
            this.config.api.parse(&lt;br /&gt;
                &amp;#039;{{ResourceCraftedFrom|resource=&amp;#039; + resourceName + &amp;#039;|full=yes}}&amp;#039;,&lt;br /&gt;
                {&lt;br /&gt;
                    contentmodel: &amp;#039;wikitext&amp;#039;,&lt;br /&gt;
                    disablelimitreport: true,&lt;br /&gt;
                    wrapoutputclass: &amp;#039;&amp;#039;&lt;br /&gt;
                }&lt;br /&gt;
            ).done( function ( html ) {&lt;br /&gt;
                self.displayRecipePopup(&lt;br /&gt;
                    &amp;#039;Recipes Producing &amp;#039; + resourceName,&lt;br /&gt;
                    html&lt;br /&gt;
                );&lt;br /&gt;
            } ).fail( function () {&lt;br /&gt;
                self.showErrorPopup( &amp;#039;Failed to load recipe data&amp;#039; );&lt;br /&gt;
            } );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Show loading popup&lt;br /&gt;
         * @param {string} message - Loading message&lt;br /&gt;
         */&lt;br /&gt;
        showLoadingPopup: function ( message ) {&lt;br /&gt;
            var $popup = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup-overlay active&amp;#039; ).append(&lt;br /&gt;
                $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup loading&amp;#039; ).append(&lt;br /&gt;
                    $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-content&amp;#039; ).css( {&lt;br /&gt;
                        &amp;#039;text-align&amp;#039;: &amp;#039;center&amp;#039;,&lt;br /&gt;
                        &amp;#039;padding&amp;#039;: &amp;#039;50px&amp;#039;&lt;br /&gt;
                    } ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;tech-loader&amp;#039; ),&lt;br /&gt;
                        $( &amp;#039;&amp;lt;p&amp;gt;&amp;#039; ).css( {&lt;br /&gt;
                            &amp;#039;margin-top&amp;#039;: &amp;#039;20px&amp;#039;,&lt;br /&gt;
                            &amp;#039;color&amp;#039;: &amp;#039;#fce7c8&amp;#039;&lt;br /&gt;
                        } ).text( message )&lt;br /&gt;
                    )&lt;br /&gt;
                )&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            $( &amp;#039;body&amp;#039; ).append( $popup );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Show error popup&lt;br /&gt;
         * @param {string} message - Error message&lt;br /&gt;
         */&lt;br /&gt;
        showErrorPopup: function ( message ) {&lt;br /&gt;
            $( this.config.selectors.popupOverlay ).remove();&lt;br /&gt;
&lt;br /&gt;
            var $popup = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup-overlay active&amp;#039; ).append(&lt;br /&gt;
                $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup error&amp;#039; ).append(&lt;br /&gt;
                    $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-header&amp;#039; ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;h3&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-title&amp;#039; ).text( &amp;#039;Error&amp;#039; ),&lt;br /&gt;
                        $( &amp;#039;&amp;lt;button&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-close&amp;#039; ).html( &amp;#039;&amp;amp;times;&amp;#039; )&lt;br /&gt;
                    ),&lt;br /&gt;
                    $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-content&amp;#039; ).css( {&lt;br /&gt;
                        &amp;#039;text-align&amp;#039;: &amp;#039;center&amp;#039;,&lt;br /&gt;
                        &amp;#039;padding&amp;#039;: &amp;#039;50px&amp;#039;&lt;br /&gt;
                    } ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;p&amp;gt;&amp;#039; ).css( &amp;#039;color&amp;#039;, &amp;#039;#ff6b6b&amp;#039; ).text( message )&lt;br /&gt;
                    )&lt;br /&gt;
                )&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            $( &amp;#039;body&amp;#039; ).append( $popup );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Display recipe popup with content&lt;br /&gt;
         * @param {string} title - Popup title&lt;br /&gt;
         * @param {string} content - HTML content&lt;br /&gt;
         */&lt;br /&gt;
        displayRecipePopup: function ( title, content ) {&lt;br /&gt;
            var self = this;&lt;br /&gt;
&lt;br /&gt;
            // Remove any existing popups&lt;br /&gt;
            $( this.config.selectors.popupOverlay ).remove();&lt;br /&gt;
&lt;br /&gt;
            // Create popup structure&lt;br /&gt;
            var $popup = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup-overlay&amp;#039; ).append(&lt;br /&gt;
                $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;recipe-popup&amp;#039; ).append(&lt;br /&gt;
                    $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-header&amp;#039; ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;h3&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-title&amp;#039; ).text( title ),&lt;br /&gt;
                        $( &amp;#039;&amp;lt;button&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-close&amp;#039; ).html( &amp;#039;&amp;amp;times;&amp;#039; )&lt;br /&gt;
                    ),&lt;br /&gt;
                    $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-content&amp;#039; ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-search-container&amp;#039; ).append(&lt;br /&gt;
                            $( &amp;#039;&amp;lt;input&amp;gt;&amp;#039; )&lt;br /&gt;
                                .attr( &amp;#039;type&amp;#039;, &amp;#039;text&amp;#039; )&lt;br /&gt;
                                .addClass( &amp;#039;popup-search-input&amp;#039; )&lt;br /&gt;
                                .attr( &amp;#039;placeholder&amp;#039;, &amp;#039;Search recipes...&amp;#039; )&lt;br /&gt;
                        ),&lt;br /&gt;
                        $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;popup-table-wrapper&amp;#039; ).html( content )&lt;br /&gt;
                    )&lt;br /&gt;
                )&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
            $( &amp;#039;body&amp;#039; ).append( $popup );&lt;br /&gt;
&lt;br /&gt;
            // Activate popup with animation&lt;br /&gt;
            setTimeout( function () {&lt;br /&gt;
                $popup.addClass( &amp;#039;active&amp;#039; );&lt;br /&gt;
                // Focus search input&lt;br /&gt;
                $popup.find( &amp;#039;.popup-search-input&amp;#039; ).focus();&lt;br /&gt;
            }, 10 );&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Filter popup table based on search&lt;br /&gt;
         * @param {string} searchTerm - Search term&lt;br /&gt;
         */&lt;br /&gt;
        filterPopupTable: function ( searchTerm ) {&lt;br /&gt;
            var $table = $( this.config.selectors.popupTable ),&lt;br /&gt;
                $rows = $table.find( &amp;#039;tbody tr&amp;#039; ),&lt;br /&gt;
                $noResults = $table.find( &amp;#039;.no-results&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
            // Remove any existing no-results message&lt;br /&gt;
            $noResults.remove();&lt;br /&gt;
&lt;br /&gt;
            if ( !searchTerm ) {&lt;br /&gt;
                $rows.show();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var visibleCount = 0;&lt;br /&gt;
            $rows.each( function () {&lt;br /&gt;
                var $row = $( this ),&lt;br /&gt;
                    text = $row.text().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
                if ( text.indexOf( searchTerm ) &amp;gt; -1 ) {&lt;br /&gt;
                    $row.show();&lt;br /&gt;
                    visibleCount++;&lt;br /&gt;
                } else {&lt;br /&gt;
                    $row.hide();&lt;br /&gt;
                }&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            // Show no results message&lt;br /&gt;
            if ( visibleCount === 0 ) {&lt;br /&gt;
                $table.find( &amp;#039;tbody&amp;#039; ).append(&lt;br /&gt;
                    $( &amp;#039;&amp;lt;tr&amp;gt;&amp;#039; ).addClass( &amp;#039;no-results&amp;#039; ).append(&lt;br /&gt;
                        $( &amp;#039;&amp;lt;td&amp;gt;&amp;#039; )&lt;br /&gt;
                            .attr( &amp;#039;colspan&amp;#039;, &amp;#039;6&amp;#039; )&lt;br /&gt;
                            .css( {&lt;br /&gt;
                                &amp;#039;text-align&amp;#039;: &amp;#039;center&amp;#039;,&lt;br /&gt;
                                &amp;#039;color&amp;#039;: &amp;#039;#666&amp;#039;,&lt;br /&gt;
                                &amp;#039;padding&amp;#039;: &amp;#039;20px&amp;#039;&lt;br /&gt;
                            } )&lt;br /&gt;
                            .text( &amp;#039;No recipes found matching &amp;quot;&amp;#039; + searchTerm + &amp;#039;&amp;quot;&amp;#039; )&lt;br /&gt;
                    )&lt;br /&gt;
                );&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Close popup&lt;br /&gt;
         */&lt;br /&gt;
        closePopup: function () {&lt;br /&gt;
            var self = this,&lt;br /&gt;
                $popup = $( this.config.selectors.popupOverlay );&lt;br /&gt;
&lt;br /&gt;
            $popup.removeClass( &amp;#039;active&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
            setTimeout( function () {&lt;br /&gt;
                $popup.remove();&lt;br /&gt;
            }, self.config.animationDuration );&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Initialize when DOM is ready&lt;br /&gt;
    $( function () {&lt;br /&gt;
        // Use mw.hook to allow other scripts to know when we&amp;#039;re ready&lt;br /&gt;
        mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( function () {&lt;br /&gt;
            ResourcePage.init();&lt;br /&gt;
        } );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    // Export for debugging&lt;br /&gt;
    mw.duneResourcePage = ResourcePage;&lt;br /&gt;
&lt;br /&gt;
}( jQuery, mediaWiki ) );&lt;/div&gt;</summary>
		<author><name>Operator</name></author>
	</entry>
</feed>