<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://bmcwiki.mit.edu/index.php?action=history&amp;feed=atom&amp;title=User%3AAsoberan%2Fcommon.js</id>
	<title>User:Asoberan/common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://bmcwiki.mit.edu/index.php?action=history&amp;feed=atom&amp;title=User%3AAsoberan%2Fcommon.js"/>
	<link rel="alternate" type="text/html" href="http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;action=history"/>
	<updated>2026-06-17T21:40:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;diff=131553&amp;oldid=prev</id>
		<title>Asoberan: Blanked the page</title>
		<link rel="alternate" type="text/html" href="http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;diff=131553&amp;oldid=prev"/>
		<updated>2026-06-01T16:00:44Z</updated>

		<summary type="html">&lt;p&gt;Blanked the page&lt;/p&gt;
&lt;a href=&quot;http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;amp;diff=131553&amp;amp;oldid=131551&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Asoberan</name></author>
	</entry>
	<entry>
		<id>http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;diff=131551&amp;oldid=prev</id>
		<title>Asoberan: Created page with &quot;/**  * BioMicro Center Wiki — Full DOM Replacement  * Paste into: User:USERNAME/common.js  *  * Strategy:  * 1. Extract wiki article content from MediaWiki&#039;s DOM  * 2. Inject the complete shell structure  * 3. Place article content inside the shell  * MediaWiki still runs underneath for editing, search, login, etc.  */  ( function () {   &#039;use strict&#039;;    /* ── Extract nav from MediaWiki&#039;s sidebar DOM ─────────────── */   function extra...&quot;</title>
		<link rel="alternate" type="text/html" href="http://bmcwiki.mit.edu/index.php?title=User:Asoberan/common.js&amp;diff=131551&amp;oldid=prev"/>
		<updated>2026-06-01T15:54:24Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;*  * BioMicro Center Wiki — Full DOM Replacement  * Paste into: User:USERNAME/common.js  *  * Strategy:  * 1. Extract wiki article content from MediaWiki&amp;#039;s DOM  * 2. Inject the complete shell structure  * 3. Place article content inside the shell  * MediaWiki still runs underneath for editing, search, login, etc.: &lt;/span&gt;  ( function () {   &amp;#039;use strict&amp;#039;;    &lt;span class=&quot;autocomment&quot;&gt;── Extract nav from MediaWiki&amp;#039;s sidebar DOM ───────────────: &lt;/span&gt;   function extra...&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;
 * BioMicro Center Wiki — Full DOM Replacement&lt;br /&gt;
 * Paste into: User:USERNAME/common.js&lt;br /&gt;
 *&lt;br /&gt;
 * Strategy:&lt;br /&gt;
 * 1. Extract wiki article content from MediaWiki&amp;#039;s DOM&lt;br /&gt;
 * 2. Inject the complete shell structure&lt;br /&gt;
 * 3. Place article content inside the shell&lt;br /&gt;
 * MediaWiki still runs underneath for editing, search, login, etc.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
( function () {&lt;br /&gt;
  &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  /* ── Extract nav from MediaWiki&amp;#039;s sidebar DOM ─────────────── */&lt;br /&gt;
  function extractNavFromDom() {&lt;br /&gt;
    var SKIP_IDS = {&lt;br /&gt;
      &amp;#039;p-tb&amp;#039;: 1, &amp;#039;p-personal&amp;#039;: 1, &amp;#039;p-search&amp;#039;: 1,&lt;br /&gt;
      &amp;#039;p-logo&amp;#039;: 1, &amp;#039;p-cactions&amp;#039;: 1, &amp;#039;p-views&amp;#039;: 1,&lt;br /&gt;
      &amp;#039;p-lang&amp;#039;: 1, &amp;#039;p-namespaces&amp;#039;: 1&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    var portlets = Array.prototype.slice.call(&lt;br /&gt;
      document.querySelectorAll( &amp;#039;[id^=&amp;quot;p-&amp;quot;]&amp;#039; )&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    var nav = [];&lt;br /&gt;
    var currentUrl = window.location.href.split( &amp;#039;?&amp;#039; )[0];&lt;br /&gt;
&lt;br /&gt;
    portlets.forEach( function ( portlet ) {&lt;br /&gt;
      if ( SKIP_IDS[ portlet.id ] ) return;&lt;br /&gt;
&lt;br /&gt;
      var links = Array.prototype.slice.call(&lt;br /&gt;
        portlet.querySelectorAll( &amp;#039;li a&amp;#039; )&lt;br /&gt;
      ).map( function ( a ) {&lt;br /&gt;
        return { label: a.textContent.trim(), href: a.href };&lt;br /&gt;
      } ).filter( function ( item ) { return item.label &amp;amp;&amp;amp; item.href; } );&lt;br /&gt;
&lt;br /&gt;
      if ( !links.length ) return;&lt;br /&gt;
&lt;br /&gt;
      var headingEl = portlet.querySelector( &amp;#039;[id$=&amp;quot;-label&amp;quot;], h3, h2&amp;#039; );&lt;br /&gt;
      var sectionLabel = headingEl ? headingEl.textContent.trim() : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      var isActive = links.some( function ( link ) {&lt;br /&gt;
        return link.href.split( &amp;#039;?&amp;#039; )[0] === currentUrl;&lt;br /&gt;
      } );&lt;br /&gt;
&lt;br /&gt;
      if ( links.length === 1 ) {&lt;br /&gt;
        nav.push( {&lt;br /&gt;
          label:    links[0].label,&lt;br /&gt;
          href:     links[0].href,&lt;br /&gt;
          isActive: links[0].href.split( &amp;#039;?&amp;#039; )[0] === currentUrl&lt;br /&gt;
        } );&lt;br /&gt;
      } else {&lt;br /&gt;
        nav.push( {&lt;br /&gt;
          label:    sectionLabel || links[0].label,&lt;br /&gt;
          href:     links[0].href,&lt;br /&gt;
          items:    links,&lt;br /&gt;
          isActive: isActive&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    return nav;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build topbar HTML ─────────────────────────────────────── */&lt;br /&gt;
  function buildTopbar() {&lt;br /&gt;
    var d = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    d.className = &amp;#039;bmc-topbar&amp;#039;;&lt;br /&gt;
    d.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;div class=&amp;quot;inner&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;a href=&amp;quot;mailto:biomicro@mit.edu&amp;quot;&amp;gt;biomicro@mit.edu&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;span&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;617-715-4533&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;span&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;Building 68-322&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    return d;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build nav dropdown item ───────────────────────────────── */&lt;br /&gt;
  function buildDropdownMenu( items ) {&lt;br /&gt;
    var menu = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    menu.className = &amp;#039;bmc-dropdown-menu&amp;#039;;&lt;br /&gt;
    items.forEach( function ( item ) {&lt;br /&gt;
      if ( item.divider ) {&lt;br /&gt;
        var div = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
        div.className = &amp;#039;bmc-divider&amp;#039;;&lt;br /&gt;
        menu.appendChild( div );&lt;br /&gt;
      } else if ( item.groupLabel ) {&lt;br /&gt;
        var gl = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
        gl.className = &amp;#039;bmc-group-label&amp;#039;;&lt;br /&gt;
        gl.textContent = item.groupLabel;&lt;br /&gt;
        menu.appendChild( gl );&lt;br /&gt;
      } else {&lt;br /&gt;
        var a = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
        a.href = item.page ? mw.util.getUrl( item.page ) : item.href;&lt;br /&gt;
        a.textContent = item.label;&lt;br /&gt;
        if ( item.ext ) a.target = &amp;#039;_blank&amp;#039;;&lt;br /&gt;
        menu.appendChild( a );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
    return menu;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build full header ─────────────────────────────────────── */&lt;br /&gt;
  function buildHeader( currentPage, nav ) {&lt;br /&gt;
    /* Logo */&lt;br /&gt;
    var logo = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
    logo.href = mw.util.getUrl( &amp;#039;BioMicroCenter&amp;#039; );&lt;br /&gt;
    logo.className = &amp;#039;bmc-logo&amp;#039;;&lt;br /&gt;
    logo.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;img class=&amp;quot;bmc-logo-img&amp;quot; src=&amp;quot;https://bmcwiki.mit.edu/images/c/c9/Logo.png&amp;quot; alt=&amp;quot;MIT BioMicro Center&amp;quot; /&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    /* Nav */&lt;br /&gt;
    var ul = document.createElement( &amp;#039;ul&amp;#039; );&lt;br /&gt;
    nav.forEach( function ( item ) {&lt;br /&gt;
      var li = document.createElement( &amp;#039;li&amp;#039; );&lt;br /&gt;
      if ( item.isActive ) li.classList.add( &amp;#039;bmc-active&amp;#039; );&lt;br /&gt;
      if ( item.items ) li.classList.add( &amp;#039;bmc-dropdown&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
      var a = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
      a.href = item.page ? mw.util.getUrl( item.page ) : ( item.href || &amp;#039;#&amp;#039; );&lt;br /&gt;
      a.textContent = item.label;&lt;br /&gt;
      li.appendChild( a );&lt;br /&gt;
&lt;br /&gt;
      if ( item.items ) {&lt;br /&gt;
        li.appendChild( buildDropdownMenu( item.items ) );&lt;br /&gt;
      }&lt;br /&gt;
      ul.appendChild( li );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    var navEl = document.createElement( &amp;#039;nav&amp;#039; );&lt;br /&gt;
    navEl.className = &amp;#039;bmc-nav&amp;#039;;&lt;br /&gt;
    navEl.appendChild( ul );&lt;br /&gt;
&lt;br /&gt;
    /* Search */&lt;br /&gt;
    var searchForm = document.createElement( &amp;#039;form&amp;#039; );&lt;br /&gt;
    searchForm.className = &amp;#039;bmc-search-form&amp;#039;;&lt;br /&gt;
    searchForm.method = &amp;#039;get&amp;#039;;&lt;br /&gt;
    searchForm.action = &amp;#039;/index.php&amp;#039;;&lt;br /&gt;
    searchForm.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;title&amp;quot; value=&amp;quot;Special:Search&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;input type=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; placeholder=&amp;quot;Search wiki…&amp;quot; aria-label=&amp;quot;Search&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;button type=&amp;quot;submit&amp;quot; aria-label=&amp;quot;Search&amp;quot;&amp;gt;&amp;lt;svg xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;14&amp;quot; height=&amp;quot;14&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot; stroke=&amp;quot;currentColor&amp;quot; stroke-width=&amp;quot;2.5&amp;quot; stroke-linecap=&amp;quot;round&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot;&amp;gt;&amp;lt;circle cx=&amp;quot;11&amp;quot; cy=&amp;quot;11&amp;quot; r=&amp;quot;8&amp;quot;/&amp;gt;&amp;lt;line x1=&amp;quot;21&amp;quot; y1=&amp;quot;21&amp;quot; x2=&amp;quot;16.65&amp;quot; y2=&amp;quot;16.65&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var right = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    right.className = &amp;#039;bmc-header-right&amp;#039;;&lt;br /&gt;
    right.appendChild( navEl );&lt;br /&gt;
    right.appendChild( searchForm );&lt;br /&gt;
&lt;br /&gt;
    /* Inner wrapper */&lt;br /&gt;
    var inner = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    inner.className = &amp;#039;bmc-header-inner&amp;#039;;&lt;br /&gt;
    inner.appendChild( logo );&lt;br /&gt;
    inner.appendChild( right );&lt;br /&gt;
&lt;br /&gt;
    var header = document.createElement( &amp;#039;header&amp;#039; );&lt;br /&gt;
    header.className = &amp;#039;bmc-header&amp;#039;;&lt;br /&gt;
    header.appendChild( inner );&lt;br /&gt;
    return header;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build page hero ───────────────────────────────────────── */&lt;br /&gt;
  function buildHero( titleText ) {&lt;br /&gt;
    var crumb = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    crumb.className = &amp;#039;bmc-breadcrumb&amp;#039;;&lt;br /&gt;
    crumb.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + mw.util.getUrl( &amp;#039;BioMicroCenter&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Home&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;span class=&amp;quot;sep&amp;quot;&amp;gt;›&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
      document.createTextNode( titleText ).textContent; // plain text, no XSS&lt;br /&gt;
&lt;br /&gt;
    var h1 = document.createElement( &amp;#039;h1&amp;#039; );&lt;br /&gt;
    h1.textContent = titleText;&lt;br /&gt;
&lt;br /&gt;
    var inner = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    inner.className = &amp;#039;inner&amp;#039;;&lt;br /&gt;
    inner.appendChild( crumb );&lt;br /&gt;
    inner.appendChild( h1 );&lt;br /&gt;
&lt;br /&gt;
    var hero = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    hero.className = &amp;#039;bmc-page-hero&amp;#039;;&lt;br /&gt;
    hero.appendChild( inner );&lt;br /&gt;
    return hero;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build sidebar TOC from MediaWiki #toc or heading scan ─── */&lt;br /&gt;
  function buildSidebarToc( mwToc, contentEl ) {&lt;br /&gt;
    var toc = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    toc.className = &amp;#039;bmc-toc&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var h3 = document.createElement( &amp;#039;h3&amp;#039; );&lt;br /&gt;
    h3.textContent = &amp;#039;On this page&amp;#039;;&lt;br /&gt;
    toc.appendChild( h3 );&lt;br /&gt;
&lt;br /&gt;
    var list;&lt;br /&gt;
&lt;br /&gt;
    if ( mwToc ) {&lt;br /&gt;
      /* Clone only the list from the MediaWiki TOC */&lt;br /&gt;
      var mwList = mwToc.querySelector( &amp;#039;ul&amp;#039; );&lt;br /&gt;
      if ( mwList ) {&lt;br /&gt;
        list = mwList.cloneNode( true );&lt;br /&gt;
        /* Mark sub-items */&lt;br /&gt;
        list.querySelectorAll( &amp;#039;li li&amp;#039; ).forEach( function ( li ) {&lt;br /&gt;
          li.classList.add( &amp;#039;bmc-sub&amp;#039; );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    } else if ( contentEl ) {&lt;br /&gt;
      /* Fall back to scanning h2/h3 headings directly */&lt;br /&gt;
      var headings = Array.prototype.slice.call(&lt;br /&gt;
        contentEl.querySelectorAll( &amp;#039;h2, h3&amp;#039; )&lt;br /&gt;
      );&lt;br /&gt;
      if ( headings.length &amp;gt; 0 ) {&lt;br /&gt;
        list = document.createElement( &amp;#039;ul&amp;#039; );&lt;br /&gt;
        headings.forEach( function ( heading ) {&lt;br /&gt;
          var anchor = heading.querySelector( &amp;#039;.mw-headline&amp;#039; );&lt;br /&gt;
          if ( !anchor || !anchor.id ) return;&lt;br /&gt;
          var li = document.createElement( &amp;#039;li&amp;#039; );&lt;br /&gt;
          if ( heading.tagName === &amp;#039;H3&amp;#039; ) li.classList.add( &amp;#039;bmc-sub&amp;#039; );&lt;br /&gt;
          var a = document.createElement( &amp;#039;a&amp;#039; );&lt;br /&gt;
          a.href = &amp;#039;#&amp;#039; + anchor.id;&lt;br /&gt;
          a.textContent = anchor.textContent.trim();&lt;br /&gt;
          li.appendChild( a );&lt;br /&gt;
          list.appendChild( li );&lt;br /&gt;
        } );&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ( !list || list.childNodes.length === 0 ) return null;&lt;br /&gt;
&lt;br /&gt;
    toc.appendChild( list );&lt;br /&gt;
&lt;br /&gt;
    var aside = document.createElement( &amp;#039;aside&amp;#039; );&lt;br /&gt;
    aside.className = &amp;#039;bmc-sidebar&amp;#039;;&lt;br /&gt;
    aside.appendChild( toc );&lt;br /&gt;
    return aside;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Build footer ──────────────────────────────────────────── */&lt;br /&gt;
  function buildFooter() {&lt;br /&gt;
    var u = mw.util.getUrl;&lt;br /&gt;
    var inner = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    inner.className = &amp;#039;bmc-footer-inner&amp;#039;;&lt;br /&gt;
    inner.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;div&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;h4&amp;gt;MIT BioMicro Center&amp;lt;/h4&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;ul&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;Building 68-322&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;Cambridge, MA 02139&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;mailto:biomicro@mit.edu&amp;quot;&amp;gt;biomicro@mit.edu&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;617-715-4533&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;div&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;h4&amp;gt;Services&amp;lt;/h4&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;ul&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:Sequencing&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Bulk Sequencing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:SingleCell&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Single Cell&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:SpTx&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Spatial Genomics&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;https://igb.mit.edu/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Informatics&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;div&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;h4&amp;gt;Resources&amp;lt;/h4&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;ul&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:FAQ&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;FAQs&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:Consulting&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Consulting&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:Pricing&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Grant Support &amp;amp;amp; Pricing&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
          &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;BioMicroCenter:Acknowledgement&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Acknowledgements&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var bottom = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    bottom.className = &amp;#039;bmc-footer-bottom&amp;#039;;&lt;br /&gt;
    bottom.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;span&amp;gt;&amp;amp;copy; &amp;#039; + new Date().getFullYear() + &amp;#039; MIT BioMicro Center&amp;lt;/span&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;span&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + u( &amp;#039;Special:UserLogin&amp;#039; ) + &amp;#039;&amp;quot;&amp;gt;Log in&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
        &amp;#039; &amp;amp;nbsp;|&amp;amp;nbsp; &amp;#039; +&lt;br /&gt;
        &amp;#039;&amp;lt;a href=&amp;quot;https://accessibility.mit.edu&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Accessibility&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var footer = document.createElement( &amp;#039;footer&amp;#039; );&lt;br /&gt;
    footer.className = &amp;#039;bmc-footer&amp;#039;;&lt;br /&gt;
    footer.appendChild( inner );&lt;br /&gt;
    footer.appendChild( bottom );&lt;br /&gt;
    return footer;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Smooth scroll for anchor links ───────────────────────── */&lt;br /&gt;
  function initSmoothScroll( container ) {&lt;br /&gt;
    container.addEventListener( &amp;#039;click&amp;#039;, function ( e ) {&lt;br /&gt;
      var a = e.target.closest( &amp;#039;a[href^=&amp;quot;#&amp;quot;]&amp;#039; );&lt;br /&gt;
      if ( !a ) return;&lt;br /&gt;
      var id = decodeURIComponent( a.getAttribute( &amp;#039;href&amp;#039; ).slice( 1 ) );&lt;br /&gt;
      var target = document.getElementById( id );&lt;br /&gt;
      if ( target ) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        target.scrollIntoView( { behavior: &amp;#039;smooth&amp;#039;, block: &amp;#039;start&amp;#039; } );&lt;br /&gt;
        history.pushState( null, &amp;#039;&amp;#039;, &amp;#039;#&amp;#039; + id );&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Fix row separators on tables with rowspan cells ──────── */&lt;br /&gt;
  function fixRowspanSeparators( container ) {&lt;br /&gt;
    container.querySelectorAll( &amp;#039;.wikitable&amp;#039; ).forEach( function ( table ) {&lt;br /&gt;
      var tbody = table.querySelector( &amp;#039;tbody&amp;#039; ) || table;&lt;br /&gt;
      var rows = Array.from( tbody.querySelectorAll( &amp;#039;tr&amp;#039; ) );&lt;br /&gt;
      if ( !rows.length ) return;&lt;br /&gt;
&lt;br /&gt;
      rows.forEach( function ( row, rowIdx ) {&lt;br /&gt;
        row.querySelectorAll( &amp;#039;td[rowspan], th[rowspan]&amp;#039; ).forEach( function ( cell ) {&lt;br /&gt;
          var span = parseInt( cell.getAttribute( &amp;#039;rowspan&amp;#039; ), 10 );&lt;br /&gt;
          if ( !span || span &amp;lt;= 1 ) return;&lt;br /&gt;
&lt;br /&gt;
          cell.style.position = &amp;#039;relative&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
          for ( var i = 1; i &amp;lt; span; i++ ) {&lt;br /&gt;
            var targetRow = rows[ rowIdx + i ];&lt;br /&gt;
            if ( !targetRow ) break;&lt;br /&gt;
&lt;br /&gt;
            var cellRect  = cell.getBoundingClientRect();&lt;br /&gt;
            var rowRect   = targetRow.getBoundingClientRect();&lt;br /&gt;
            var offsetTop = rowRect.top - cellRect.top;&lt;br /&gt;
&lt;br /&gt;
            var sep = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
            sep.style.cssText =&lt;br /&gt;
              &amp;#039;position:absolute;left:0;right:0;&amp;#039; +&lt;br /&gt;
              &amp;#039;top:&amp;#039; + offsetTop + &amp;#039;px;&amp;#039; +&lt;br /&gt;
              &amp;#039;height:1px;background:#e0e0e0;&amp;#039; +&lt;br /&gt;
              &amp;#039;pointer-events:none;z-index:1;&amp;#039;;&lt;br /&gt;
            cell.appendChild( sep );&lt;br /&gt;
          }&lt;br /&gt;
        } );&lt;br /&gt;
      } );&lt;br /&gt;
    } );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Edit bar for logged-in users ─────────────────────────── */&lt;br /&gt;
  function buildEditBar( currentPage ) {&lt;br /&gt;
    if ( !mw.config.get( &amp;#039;wgUserId&amp;#039; ) ) return null;&lt;br /&gt;
    var bar = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    bar.className = &amp;#039;bmc-edit-bar&amp;#039;;&lt;br /&gt;
    var editHref = mw.util.getUrl( currentPage, { action: &amp;#039;edit&amp;#039; } );&lt;br /&gt;
    var histHref = mw.util.getUrl( currentPage, { action: &amp;#039;history&amp;#039; } );&lt;br /&gt;
    var talkHref = mw.util.getUrl( &amp;#039;Talk:&amp;#039; + currentPage );&lt;br /&gt;
    bar.innerHTML =&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + editHref + &amp;#039;&amp;quot;&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + histHref + &amp;#039;&amp;quot;&amp;gt;History&amp;lt;/a&amp;gt;&amp;#039; +&lt;br /&gt;
      &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; + talkHref + &amp;#039;&amp;quot;&amp;gt;Talk&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
    return bar;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Main: build and inject the shell ─────────────────────── */&lt;br /&gt;
  function buildShell( nav ) {&lt;br /&gt;
    var currentPage = mw.config.get( &amp;#039;wgPageName&amp;#039; ) || &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    /* 1. Extract wiki content BEFORE any DOM manipulation */&lt;br /&gt;
    var mwContentText = document.getElementById( &amp;#039;mw-content-text&amp;#039; );&lt;br /&gt;
    if ( !mwContentText ) return; /* not a content page, bail */&lt;br /&gt;
&lt;br /&gt;
    var contentClone = mwContentText.cloneNode( true );&lt;br /&gt;
&lt;br /&gt;
    /* 2. Extract page title */&lt;br /&gt;
    var titleEl = document.getElementById( &amp;#039;firstHeading&amp;#039; ) ||&lt;br /&gt;
      document.querySelector( &amp;#039;.mw-first-heading&amp;#039; );&lt;br /&gt;
    var titleText = titleEl&lt;br /&gt;
      ? titleEl.textContent.trim()&lt;br /&gt;
      : ( mw.config.get( &amp;#039;wgTitle&amp;#039; ) || &amp;#039;BioMicro Center&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    /* 3. Extract MediaWiki TOC from the cloned content */&lt;br /&gt;
    var mwToc = contentClone.querySelector( &amp;#039;#toc, .toc&amp;#039; );&lt;br /&gt;
    if ( mwToc ) mwToc.parentNode.removeChild( mwToc ); /* remove from content body */&lt;br /&gt;
&lt;br /&gt;
    /* 3b. Hide the BMC logo/header sticker by exact image filename.&lt;br /&gt;
           The sticker is BMC_Header_2020_3.png (from the {{BioMicroCenter}} template)&lt;br /&gt;
           and bmc_logo_square.png. Target the nearest meaningful container so the&lt;br /&gt;
           surrounding content (nav links, table structure) is preserved. */&lt;br /&gt;
    contentClone.querySelectorAll( &amp;#039;img&amp;#039; ).forEach( function ( img ) {&lt;br /&gt;
      var src = img.getAttribute( &amp;#039;src&amp;#039; ) || &amp;#039;&amp;#039;;&lt;br /&gt;
      if ( /BMC_Header|bmc_logo_square|Bmc_logo|\/Logo\.png/i.test( src ) ) {&lt;br /&gt;
        var container = img.closest( &amp;#039;.thumb&amp;#039; ) || img.closest( &amp;#039;figure&amp;#039; ) || img.closest( &amp;#039;td&amp;#039; );&lt;br /&gt;
        if ( container ) {&lt;br /&gt;
          container.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
        } else {&lt;br /&gt;
          img.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* 4. Build shell elements */&lt;br /&gt;
    var topbar = buildTopbar();&lt;br /&gt;
    var header = buildHeader( currentPage, nav );&lt;br /&gt;
    var hero   = buildHero( titleText );&lt;br /&gt;
&lt;br /&gt;
    /* Page layout grid */&lt;br /&gt;
    var layout = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    layout.className = &amp;#039;bmc-page-layout&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    /* Sidebar — skip on the home page */&lt;br /&gt;
    var isHome = ( currentPage === &amp;#039;BioMicroCenter&amp;#039; ||&lt;br /&gt;
                   currentPage === &amp;#039;Main_Page&amp;#039; );&lt;br /&gt;
    var sidebar = isHome ? null : buildSidebarToc( mwToc, contentClone );&lt;br /&gt;
    if ( sidebar ) {&lt;br /&gt;
      layout.appendChild( sidebar );&lt;br /&gt;
    } else {&lt;br /&gt;
      /* No TOC — collapse to single-column via inline style */&lt;br /&gt;
      layout.style.gridTemplateColumns = &amp;#039;1fr&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Main content area */&lt;br /&gt;
    var main = document.createElement( &amp;#039;main&amp;#039; );&lt;br /&gt;
    main.className = &amp;#039;bmc-content&amp;#039;;&lt;br /&gt;
    var editBar = buildEditBar( currentPage );&lt;br /&gt;
    if ( editBar ) { main.appendChild( editBar ); }&lt;br /&gt;
    main.appendChild( contentClone );&lt;br /&gt;
    layout.appendChild( main );&lt;br /&gt;
&lt;br /&gt;
    var footer = buildFooter();&lt;br /&gt;
&lt;br /&gt;
    /* 5. Build wrapper */&lt;br /&gt;
    var wrapper = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
    wrapper.id = &amp;#039;bmc-wrapper&amp;#039;;&lt;br /&gt;
    wrapper.appendChild( topbar );&lt;br /&gt;
    wrapper.appendChild( header );&lt;br /&gt;
    wrapper.appendChild( hero );&lt;br /&gt;
    wrapper.appendChild( layout );&lt;br /&gt;
    wrapper.appendChild( footer );&lt;br /&gt;
&lt;br /&gt;
    /* 6. Inject into body (prepend so it appears first) */&lt;br /&gt;
    document.body.insertBefore( wrapper, document.body.firstChild );&lt;br /&gt;
&lt;br /&gt;
    /* 7. Add class immediately so the CSS rule kicks in and hides&lt;br /&gt;
          all original MW elements (works for any skin version) */&lt;br /&gt;
    document.body.classList.add( &amp;#039;bmc-active&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
    /* 8. Smooth scroll */&lt;br /&gt;
    initSmoothScroll( main );&lt;br /&gt;
    initSmoothScroll( sidebar || main );&lt;br /&gt;
&lt;br /&gt;
    /* 9. Auto-style plain tables in content */&lt;br /&gt;
    main.querySelectorAll(&lt;br /&gt;
      &amp;#039;.mw-parser-output table:not(.wikitable):not(.infobox):not(.navbox)&amp;#039;&lt;br /&gt;
    ).forEach( function ( t ) {&lt;br /&gt;
      t.classList.add( &amp;#039;wikitable&amp;#039; );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
    /* 10. Fix row separators on rowspan tables */&lt;br /&gt;
    requestAnimationFrame( function () {&lt;br /&gt;
      fixRowspanSeparators( main );&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /* ── Entry point ───────────────────────────────────────────── */&lt;br /&gt;
  mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( function () {&lt;br /&gt;
    /* Skip special pages (edit forms, history, etc.) to not break them */&lt;br /&gt;
    var ns     = mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; );&lt;br /&gt;
    var action = mw.config.get( &amp;#039;wgAction&amp;#039; );&lt;br /&gt;
    if ( action !== &amp;#039;view&amp;#039; ) return;&lt;br /&gt;
    if ( ns &amp;lt; 0 ) return; /* Special: pages */&lt;br /&gt;
&lt;br /&gt;
    var nav = extractNavFromDom();&lt;br /&gt;
    buildShell( nav );&lt;br /&gt;
  } );&lt;br /&gt;
&lt;br /&gt;
} )();&lt;/div&gt;</summary>
		<author><name>Asoberan</name></author>
	</entry>
</feed>