1<!DOCTYPE html> 2<html> 3<head> 4<!-- ================================================================================================================= --> 5<!-- 6o Well, hello there! :-) 7o The Content Management System for this website is RocketFusion.com 8o RocketFusion and the RocketFusion logo are copyright Montague WebWorks, Inc. 9o Please direct code comments/feedback to https://MontagueWebWorks.com/contact 10o All content updated by the client: Museum of Our Industrial Heritage 11--> 12<!-- ================================================================================================================= --> 13<!-- Title and App Tags --> 14<!-- 20260930205421 --> 15<title>Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage</title> 16<meta property="og:title" content="Practical Machinist Museum Tour Video"> 17<meta property="twitter:title" content="Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage"> 18<meta itemprop="name" content="Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage"> 19<!-- safari --> 20<meta name="apple-mobile-web-app-title" content="Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage"> 21<meta name="apple-mobile-web-app-capable" content="yes"> 22<meta name="apple-touch-fullscreen" content="yes"> 23<!-- chrome --> 24<meta name="mobile-web-app-capable" content="yes"> 25<!-- ie 10 --> 26<meta name="application-name" content="Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage"> 27<meta name="msapplication-tooltip" content="Practical Machinist Museum Tour Video - Museum of Our Industrial Heritage"> 28<meta name="msapplication-starturl" content="/"> 29<!-- ================================================================================================================= --> 30<!-- Standard on all pages --> 31<meta charset="UTF-8" /> 32<meta http-equiv="content-type" content="text/html;charset=UTF-8"> 33<meta http-equiv="cache-control" content="public, max-age=86400"> 34<meta http-equiv="imagetoolbar" content="no"> 35<meta name="format-detection" content="telephone=yes"/><!-- was yes but Edge breaks it --> 36<!-- no google fonts --> 37<meta name="theme-color" content="white" /> 38<meta name="Language" content="en" /> 39<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 40<meta name="verify-v1" content=" " /> 41<meta name="source" content="exists" /> 42<meta name="geo.placename" content="Greenfield" /> 43<meta name="google-site-verification" content=" " /> 44<meta name="p:domain_verify" content=" " /> 45<meta name="geo.position" content="" /> 46<meta name="msapplication-TileColor" content="white" /> 47<meta name="last-modified" content="2026-08-31" /> 48<meta name="geo.region" content="US-MA" /> 49<meta name="msvalidate.01" content=" " /> 50<!-- no Facebook Pixel ID --> 51<meta name="author" content="Museum of Our Industrial Heritage" /> 52<meta name="owner" content="Museum of Our Industrial Heritage" /> 53<meta name="copyright" content="Copyright 2026 Museum of Our Industrial Heritage" /> 54<meta name="expires" content="Oct 1, 2026"> 55<meta name="generator" content="RocketFusion CMS" /> 56<meta name="Robots" content="noodp,noydir" /> 57<meta name="slurp" content="noydir" /> 58<meta name="googlebot" content="noodp" /> 59<meta name="msnbot" content="noodp" /> 60<meta name="MSSmartTagsPreventParsing" content="TRUE" /><!-- stops MS browsers from adding parsed keyword advertising on websites --> 61<meta name="viewport" content="width=device-width, initial-scale=1"><!-- , maximum-scale=1 --> 62<meta property="og:site_name" content="Museum of Our Industrial Heritage"> 63<meta property="og:type" content="website" /> 64<!-- ================================================================================================================= --> 65<!-- FAVICONS start --> 66<link rel="shortcut icon" href="/icons/favicon.png"> 67<link rel="icon" href="/icons/favicon.png" type="image/x-icon"> 68<link rel="apple-touch-icon" href="/icons/favicon.png"> 69<meta name="msapplication-TileImage" content="/icons/favicon.png"> 70<link rel="apple-touch-startup-image" href="/icons/favicon.png"> 71<link rel="apple-touch-icon" sizes="16x16" href="/icons/favicon-16x16.png"> 72<link rel="icon" sizes="16x16" href="/icons/favicon-16x16.png"> 73<meta name="msapplication-square16x16logo" content="/icons/favicon-16x16.png"/> 74<link rel="apple-touch-icon" sizes="24x24" href="/icons/favicon-24x24.png"> 75<link rel="icon" sizes="24x24" href="/icons/favicon-24x24.png"> 76<meta name="msapplication-square24x24logo" content="/icons/favicon-24x24.png"/> 77<link rel="apple-touch-icon" sizes="32x32" href="/icons/favicon-32x32.png"> 78<link rel="icon" sizes="32x32" href="/icons/favicon-32x32.png"> 79<meta name="msapplication-square32x32logo" content="/icons/favicon-32x32.png"/> 80<link rel="apple-touch-icon" sizes="48x48" href="/icons/favicon-48x48.png"> 81<link rel="icon" sizes="48x48" href="/icons/favicon-48x48.png"> 82<meta name="msapplication-square48x48logo" content="/icons/favicon-48x48.png"/> 83<link rel="apple-touch-icon" sizes="57x57" href="/icons/favicon-57x57.png"> 84<link rel="icon" sizes="57x57" href="/icons/favicon-57x57.png"> 85<meta name="msapplication-square57x57logo" content="/icons/favicon-57x57.png"/> 86<link rel="apple-touch-icon" sizes="60x60" href="/icons/favicon-60x60.png"> 87<link rel="icon" sizes="60x60" href="/icons/favicon-60x60.png"> 88<meta name="msapplication-square60x60logo" content="/icons/favicon-60x60.png"/> 89<link rel="apple-touch-icon" sizes="64x64" href="/icons/favicon-64x64.png"> 90<link rel="icon" sizes="64x64" href="/icons/favicon-64x64.png"> 91<meta name="msapplication-square64x64logo" content="/icons/favicon-64x64.png"/> 92<link rel="apple-touch-icon" sizes="70x70" href="/icons/favicon-70x70.png"> 93<link rel="icon" sizes="70x70" href="/icons/favicon-70x70.png"> 94<meta name="msapplication-square70x70logo" content="/icons/favicon-70x70.png"/> 95<link rel="apple-touch-icon" sizes="72x72" href="/icons/favicon-72x72.png"> 96<link rel="icon" sizes="72x72" href="/icons/favicon-72x72.png"> 97<meta name="msapplication-square72x72logo" content="/icons/favicon-72x72.png"/> 98<link rel="apple-touch-icon" sizes="76x76" href="/icons/favicon-76x76.png"> 99<link rel="icon" sizes="76x76" href="/icons/favicon-76x76.png"> 100<meta name="msapplication-square76x76logo" content="/icons/favicon-76x76.png"/> 101<link rel="apple-touch-icon" sizes="96x96" href="/icons/favicon-96x96.png"> 102<link rel="icon" sizes="96x96" href="/icons/favicon-96x96.png"> 103<meta name="msapplication-square96x96logo" content="/icons/favicon-96x96.png"/> 104<link rel="apple-touch-icon" sizes="114x114" href="/icons/favicon-114x114.png"> 105<link rel="icon" sizes="114x114" href="/icons/favicon-114x114.png"> 106<meta name="msapplication-square114x114logo" content="/icons/favicon-114x114.png"/> 107<link rel="apple-touch-icon" sizes="120x120" href="/icons/favicon-120x120.png"> 108<link rel="icon" sizes="120x120" href="/icons/favicon-120x120.png"> 109<meta name="msapplication-square120x120logo" content="/icons/favicon-120x120.png"/> 110<link rel="apple-touch-icon" sizes="128x128" href="/icons/favicon-128x128.png"> 111<link rel="icon" sizes="128x128" href="/icons/favicon-128x128.png"> 112<meta name="msapplication-square128x128logo" content="/icons/favicon-128x128.png"/> 113<link rel="apple-touch-icon" sizes="144x144" href="/icons/favicon-144x144.png"> 114<link rel="icon" sizes="144x144" href="/icons/favicon-144x144.png"> 115<meta name="msapplication-square144x144logo" content="/icons/favicon-144x144.png"/> 116<link rel="apple-touch-icon" sizes="150x150" href="/icons/favicon-150x150.png"> 117<link rel="icon" sizes="150x150" href="/icons/favicon-150x150.png"> 118<meta name="msapplication-square150x150logo" content="/icons/favicon-150x150.png"/> 119<link rel="apple-touch-icon" sizes="152x152" href="/icons/favicon-152x152.png"> 120<link rel="icon" sizes="152x152" href="/icons/favicon-152x152.png"> 121<meta name="msapplication-square152x152logo" content="/icons/favicon-152x152.png"/> 122<link rel="apple-touch-icon" sizes="196x196" href="/icons/favicon-196x196.png"> 123<link rel="icon" sizes="196x196" href="/icons/favicon-196x196.png"> 124<meta name="msapplication-square196x196logo" content="/icons/favicon-196x196.png"/> 125<link rel="apple-touch-icon" sizes="310x310" href="/icons/favicon-310x310.png"> 126<link rel="icon" sizes="310x310" href="/icons/favicon-310x310.png"> 127<meta name="msapplication-square310x310logo" content="/icons/favicon-310x310.png"/> 128<link rel="manifest" href="/icons/manifest.json"> 129<meta name="apple-mobile-web-app-status-bar-style" content="black"> 130<meta name="msapplication-TileColor" content="white"> 131<meta name="theme-color" content="white"> 132<!-- MS Application Tasks (off for now) --> 133<!-- FAVICONS end --> 134<!-- this is a BLOCK page --> 135<meta property="og:url" content="/k/2041/Practical-Machinist-Museum-Tour-Video"> 136<link rel="canonical" href="/k/2041/Practical-Machinist-Museum-Tour-Video"> 137<meta itemprop="image" content="/blocks/blocks_2041_large.jpg"> 138<meta property="og:image" content="/blocks/blocks_2041_large.jpg"> 139<meta property="twitter:image" content="/blocks/blocks_2041_large.jpg"> 140<link rel="image_src" href="/blocks/blocks_2041_large.jpg"> 141<meta property="og:image:alt" content="Practical Machinist Museum Tour Video"> 142<meta name="description" content=""> 143<meta itemprop="description" content=""> 144<meta property="og:description" content=""> 145<meta property="twitter:description" content=""> 146<!-- ================================================================================================================= -->
147<script src="https://kit.fontawesome.com/d3bffd01a6.js" crossorigin="anonymous"></script>
147 148<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> 149<link rel="stylesheet" href="/RFassets/css/datatables-bs4.min.css"> 150<link rel="stylesheet" href="/RFAssets/css/RFtables.css?ver=20260930205421"> 151<link rel="stylesheet" href="/RFAssets/css/joey.css?ver=20260930205421"> 152<link rel="stylesheet" href="/site_style.css?ver=20260930205421"> 153<link rel="stylesheet" href="/header_style.css?ver=20260930205421"> 154<link rel="stylesheet" href="/RFAssets/css/_admin.css?ver=20260930205421"> 155<!-- custom stylesheet --> 156<link rel="stylesheet" href="/tmpl_TMPL01.css?ver=20260930205421">
157<script src="/RFAssets/js/boxover.js" type="text/javascript"></script>
vendor: 1 bytes, line 157
157
158<script type="text/javascript"> 159function toggleLayer(whichLayer,what) { 160if (document.getElementById) 161{ 162var style2 = document.getElementById(whichLayer).style; 163style2.display = what; 164} 165else if (document.all) 166{ 167var style2 = document.all[whichLayer].style; 168style2.display = what; 169} 170else if (document.layers) 171{ 172var style2 = document.layers[whichLayer].style; 173style2.display = what; 174} 175} 176function toggleCheckbox(source) { 177checkboxes = document.getElementsByName('file_delete'); 178for(var i=0, n=checkboxes.length;i<n;i++) { 179checkboxes[i].checked = source.checked; 180} 181} 182</script>
182 183<!-- No text_Google_Analytics_account defined --> 184<!-- No text_Google_Tag_Manager_ID defined --> 185<!-- end of metatags --> 186</head> 187<body class="notMobile" 188id="default"> 189<!-- THESE ARE HERE (ADMIN) BECAUSE THEY NEED TO BE AT THE TOP OF THE BODY, NOT IN THE META TAGS --> 190<!-- No text_Google_Tag_Manager_ID defined --> 191<header id="header" class="head"> 192<div class="container"> 193<div class="row align-items-center"> 194<div class="col-1 d-none d-sm-none d-md-none d-lg-block"> 195<img class="logo" src="/site/logo_sm.png" /> 196</div> 197<div class="col-md-12 col-lg-11"> 198<!-- Top Header INFO BAR --> 199<div class="row text-light pt-3 top-info"> 200<div class="col-sm-4"> 201<strong>Museum of Our Industrial Heritage</strong> 202</div> 203<div class="col-sm-8"> 204<ul class="list-inline head-list"> 205<li class="list-inline-item"> 206<i class="far fa-clock"></i> 207Open By Appointment 208</li> 209<li class="list-inline-item"> 210<i class="fas fa-map-marker-alt"></i> 2112 Mead Street | Greenfield, Ma 212</li> 213</ul> 214</div> 215</div> 216<!-- Navbar --> 217<section id="navbar" class="top-nav"> 218<div class="container"> 219<div id="inner-n" class="row b-nav pos-rel"> 220<div class="col-12 col-sm-12 col-md-9"> 221<!-- start pagenav tag --> 222<style> 223#navmainmain *, #navmainmain1 *, #navBarContainer { 224color: !important; 225background-color :!important; 226} 227</style> 228<nav style="position:sticky;top:0;z-index:2000;" id="navmainmain" class="navbar pagenav-dropdown navbar-expand-md pl-0 pr-0 pt-0 pb-0 mt-0 mb-0"> 229<div class="container"> 230<!-- no title bar --> 231<button class="navbar-toggler" data-toggle="collapse" aria-label="Open Menu" data-target="#navbar-1"> 232<span class="navbar-toggler-icon"></span> 233</button> 234<div id="navbar-1" class="navbar-collapse collapse"> 235<!-- REALESTATE ERROR 161 Invalid object name 'custom_MLSPIN.dbo.mls_listing_all'.: --> 236<ul class='nav navbar-nav ml-auto'><li class='nav-item'> 237<a id="menu_h" class="nav-link" href="/"><span>Home</span></a> 238</li><li class='dropdown nav-item'> 239<a id="menu_p20" 240class="nav-link dropdown-toggle" 241href="/p/20/About"><span>About</span></a> 242<!-- hello from pagenav! --> 243<!-- SHOW PARENT = 0 --> 244<!-- qsImagesCat.recordCount = 34 --> 245<div class='dropdown-menu dropdown-menu-left'><ul><li class='dropdown-item'><span class='hi'></span> 246<!-- hoohah 167 --> 247<!-- PAGES! --> 248<!-- hoohah 202 --> 249<!-- thecount = 1 --> 250<a id="menu_p21" 251href="/p/21/History-of-the-Museum"> 252<span>History of the Museum</span> 253</a> 254<!-- thecount = 2 --> 255</li><li class='dropdown-item'> 256<a id="menu_p22" 257href="/p/22/History-of-the-Mill-Site"> 258<span>History of the Mill Site</span> 259</a> 260<!-- thecount = 3 --> 261</li><li class='dropdown-item'> 262<a id="menu_p23" 263href="/p/23/Research-Opportunities"> 264<span>Research Opportunities</span> 265</a> 266<!-- thecount = 4 --> 267</li><li class='dropdown-item'> 268<a id="menu_p33" 269href="/p/33/Educational-Programs"> 270<span>Educational Programs</span> 271</a> 272<!-- thecount = 5 --> 273</li><li class='dropdown-item'> 274<a id="menu_p24" 275href="/p/24/Board-Members"> 276<span>Board Members</span> 277</a> 278</li></ul></div> 279</li><li class='nav-item'> 280<a id="menu_p14" 281class="nav-link" 282href="/p/14/Visit"><span>Visit</span></a> 283</li><li class='dropdown nav-item'> 284<a id="menu_p16" 285class="nav-link dropdown-toggle" 286href="/p/16/Exhibits"><span>Exhibits</span></a> 287<!-- hello from pagenav! --> 288<!-- SHOW PARENT = 0 --> 289<!-- qsImagesCat.recordCount = 34 --> 290<div class='dropdown-menu dropdown-menu-left'><ul><li class='dropdown-item'><span class='hi'></span> 291<!-- hoohah 167 --> 292<!-- PAGES! --> 293<!-- hoohah 202 --> 294<!-- thecount = 1 --> 295<a id="menu_p25" 296href="/p/25/Main-Gallery"> 297<span>Main Gallery</span> 298</a> 299<!-- thecount = 2 --> 300</li><li class='dropdown-item'> 301<a id="menu_p27" 302href="/p/27/Technology-Transportation--Trade-Early-Water-Power-History-in-the-Small-Hill-Towns"> 303<span>Technology-Transportation & Trade</span> 304</a> 305<!-- thecount = 3 --> 306</li><li class='dropdown-item'> 307<a id="menu_p28" 308href="/p/28/Museum-Live-Demonstrations"> 309<span>Museum Live Demonstrations</span> 310</a> 311<!-- thecount = 4 --> 312</li><li class='dropdown-item'> 313<a id="menu_p29" 314href="/p/29/Gage-Room"> 315<span>Gage Room</span> 316</a> 317<!-- thecount = 5 --> 318</li><li class='dropdown-item'> 319<a id="menu_p30" 320href="/p/30/New-and-Temporary-Displays"> 321<span>New and Temporary Displays</span> 322</a> 323</li></ul></div> 324</li><li class='dropdown nav-item'> 325<a id="menu_p17" 326class="nav-link dropdown-toggle" 327href="/p/17/Online-Resources"><span>Online Resources</span></a> 328<!-- hello from pagenav! --> 329<!-- SHOW PARENT = 0 --> 330<!-- qsImagesCat.recordCount = 34 --> 331<div class='dropdown-menu dropdown-menu-left'><ul><li class='dropdown-item'><span class='hi'></span> 332<!-- hoohah 167 --> 333<!-- PAGES! --> 334<!-- hoohah 202 --> 335<!-- thecount = 1 --> 336<a id="menu_p1107" 337href="/p/1107/Ask-Our-Historian"> 338<span>Ask Our Historian</span> 339</a> 340<!-- thecount = 2 --> 341</li><li class='dropdown-item'> 342<a id="menu_p31" 343href="/p/31/Our-Film-Library"> 344<span>Videos</span> 345</a> 346<!-- thecount = 3 --> 347</li><li class='dropdown-item'> 348<a id="menu_p34" 349href="/p/34/Industries-Represented"> 350<span>Industries Represented</span> 351</a> 352<!-- thecount = 4 --> 353</li><li class='dropdown-item'> 354<a id="menu_p36" 355href="/p/36/Social-History"> 356<span>Social History</span> 357</a> 358<!-- thecount = 5 --> 359</li><li class='dropdown-item'> 360<a id="menu_p37" 361href="/p/37/Heritage-Technology-Library"> 362<span>Tech Library</span> 363</a> 364</li></ul></div> 365</li><li class='nav-item'> 366<a id="menu_p18" 367class="nav-link" 368href="/p/18/Support-Our-Work"><span>Support</span></a> 369</li><li class='nav-item'> 370<a id="menu_p19" 371class="nav-link" 372target="_blank" 373href="https://silverscreendesign.chipply.com/MOIH/"><span>Store</span></a> 374</li><li class='nav-item'> 375<a id="menu_c" 376class="nav-link" 377href="/contact"><span>Contact</span></a> 378</li></ul> 379</div><!-- /.nav-collapse --> 380</div> 381</nav> 382<!-- end pagenav tag --> 383</div> 384<div class="col-6 col-sm-6 col-md-3 social-head-container"> 385<div class="social-head"> 386<div class="social fa-size" style="margin:0 auto!important;width:auto!important;"> 387</div> 388</div> 389</div> 390</div> 391</div> 392</section> 393</div> 394</div> 395</div> 396</header> 397<!-- Jumbotron --> 398<section id="jumbo" class="jumbotron"> 399<div class="container"> 400</div> 401</section> 402<!-- Content/Footer -->
403<main id="main-content" class="m-content"> 404<section id="content" class="content pb-5"> 405<main> 406<!-- START PAGE DIV --> 407<div class="page k k2041 " style=""> 408<div class="container maincontent"> 409<div class="row"> 410<div class="col-sm-12"> 411<div class=""> 412<h1 class="page"><span>Practical Machinist Museum Tour Video</span></h1> 413<!-- HELLO FROM INSIDE FIGURE --> 414<figure 415class="pos-rel figure col-xs-12 col-sm-6 col-md-5" 416style="float:right; margin:0 0 10px 10px;padding:0px;text-align:center;"> 417<!-- call image --> 418<!-- hello from inside figure_image --> 419<div class="blocks_image "> 420<!-- hoohah 4 --> 421<!-- yes --> 422<img id="topImg" 423class="blocks img-responsive img-fluid figure-img rf-image-dropzone" 424style="margin:0 auto; border:0; box-shadow:0px 0px 0px #FFFFFF; border-radius:0px;" 425src="/blocks/blocks_2041_small.jpg?20230807094916" 426alt="Practical Machinist Museum Tour Video"> 427<!-- hoohah 34 --> 428</div> 429<!-- goodbye from inside figure_image --> 430</figure> 431<div id="myModal" class="modal-img" style="display:none;"> 432<div class="modal-img-container"> 433<span class="close"><i class="fas fa-times-circle"></i></span> 434<img class="modal-content" id="img01" alt="Practical Machinist Museum Tour Video"> 435</div> 436</div> 437<style> 438img.page:hover { cursor: pointer; } 439</style> 440<!-- ======== File robot modals / scripts ======== -->
441<script> 442// Get the modal 443var modal = document.getElementById('myModal'); 444// Set Parameters for image and generate image src 445var imgParam = { name: 'blocks_', imgID: '2041', size: 'large', fileType: 'jpg' }; 446console.log('imgParam', imgParam); 447var imageChange = '/blocks/' + imgParam.name + imgParam.imgID + '_' + imgParam.size + '.' + imgParam.fileType; 448// Get the image and insert it inside the modal - use its "alt" text as a caption 449var img = document.getElementById('topImg'); 450var modalImg = document.getElementById("img01"); 451// onClick display modal 452if (img) { 453img.onclick = function () { 454console.log('[DEBUG] Image clicked. - ' + imageChange); 455modal.classList.add('modalFadeImg'); 456modalImg.src = this.innerHTML = imageChange; 457// modalImg.onerror = function(event) { 458// console.log(event); 459// modalImg.src = this.innerHTML = '/blocks/' + imgParam.name + '_' + imgParam.imgID + '_' + 'large' + '.' + imgParam.fileType; 460// } 461} 462}; 463// Get the <span> element that closes the modal 464var span = document.getElementsByClassName("close")[0]; 465//close the modal 466if(span) { 467span.onclick = function () { 468modal.classList.remove('modalFadeImg'); 469} 470}; 471if(modal) { 472modal.onclick = function() { 473modal.classList.remove('modalFadeImg'); 474} 475}; 476</script>
476 477<!-- GOODBYE FROM INSIDE FIGURE --> 478<h5>In May 2023, the Museum hosted a team from Practical Machinist for a tour of the Museum.</h5> 479<h5>A video of the tour is available on the <a href="https://www.youtube.com/user/PracticalMachinist">Practical Machinist YouTube Channel</a> and can be viewed <a href="https://youtu.be/M_MXNKiFnG8">HERE</a></h5> 480</div> 481</div> 482</div> 483</div> 484</div> 485<!-- END PAGE DIV --> 486<div class="lowercontent"> 487<!-- START PAGE SECTIONS --> 488<!-- inside page sections --> 489<!-- this is NOT a p (62) --> 490<!-- canview = 1 (83) --> 491<!-- END PAGE SECTIONS --> 492</div> 493</main> 494</section> 495<footer id="footer" class="foot bg-dark text-light pt-5"> 496<div class="container pb-3"> 497<div class="row"> 498<div class="col-sm-6 col-md-6 col-lg-3"> 499<div class="static footer-1"> 500<!-- from var application.static.footer_1 --> 501</div> 502</div> 503<div class="col-sm-6 col-md-6 col-lg-3 links"> 504<div class="static footer-2"> 505<!-- from var application.static.footer_2 --> 506</div> 507</div> 508<div class="col-sm-6 col-md-6 col-lg-3"> 509<div class="static footer-3"> 510<!-- from var application.static.footer_3 --> 511</div> 512</div> 513<div class="col-sm-6 col-md-6 col-lg-3"> 514<div class="static footer-4"> 515<!-- from var application.static.footer_4 --> 516</div> 517<p>2 Mead Street, Greenfield, MA 01301</p> 518<p>(We do not have a phone number. Please use our Email form to contact us.)</p> 519<p>Our direct email address is [email protected]</p> 520<div class="social fa-size" style="margin:0 auto!important;width:auto!important;"> 521</div> 522</div> 523</div> 524</div> 525<div class="bg-black pb-5 pt-5 text-center"> 526<div id="footer"> 527<span class="footerO"> 528<span class="footerL"> 529© 2026 Museum of Our Industrial Heritage 530| 531Software by <a href=http://MontagueWebWorks.com target=_blank>Montague WebWorks</a> 532</span> 533<span class="footerM"> 534| 535</span> 536<span class="footerR"> 537<a href="https://RocketFusion.com" target="_blank">Powered by RocketFusion 123</a> 538</span> 539</span> 540</div> 541<span class="login-link"> 542<a class="login noprint" href="" style="cursor:pointer;" rel="nofollow" aria-label="log in" data-toggle="modal" data-target="#Login" data-remote="/inc/divLogin.cfm?edit=Login">Admin Login</a> 543<div class="modal fade" id="Login" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-body"></div></div></div></div> 544</span> 545</div> 546</footer> 547</main> 548<!-- BS4 Init --> 549<div class="modal fade" id="reserve" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-body"></div></div></div><div id="load-res" class="loading-reserve d-none"></div></div>
550<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
vendor: 1 bytes, line 550
550
551<script type="text/javascript" src="https://scaleflex.cloudimg.io/v7/plugins/filerobot-image-editor/latest/filerobot-image-editor.min.js?func=proxy"></script>
vendor: 1 bytes, line 551
551
552<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>
vendor: 1 bytes, line 552
552
553<script> 554// Assuming we have a div with id="editor_container" 555const filerobotImageEditor = new window.FilerobotImageEditor( 556document.querySelector("#rf-image-editor-edit") 557); 558const image_file_upload = document.getElementById("rf-image-upload"); 559// const btn_image_upload_edit = document.getElementById("btn-image-upload-edit"); 560var source_image = ''; // the HTMLImageElement 561var save_image_name = ''; // name to save image with 562var global_fr_folder = ''; // where to upload 563var global_fr_table = ''; // db table to update 564var global_fr_prefix = ''; // image file prefix, ie; blocks_ 565var global_fr_pid = 0; // image ID, ie; blocks_2323 566var dropzone_website_dir = 'IndustrialHistory.org\\httpdocs'; 567const file_robot_defaults = { 568save_image_quality : 1, // 0.1 - 1 (default 0.92) - applies to jpeg, jpg and webp images only 569}; 570function renderFileRobotEditor(source,fr_folder=global_fr_folder,fr_table=global_fr_table,fr_prefix=global_fr_prefix,fr_pid=global_fr_pid) { 571console.group("renderFileRobotEditor() called"); 572console.log('source:', source); 573console.log('fr_folder:', fr_folder); 574console.log('fr_table:', fr_table); 575console.log('fr_prefix:', fr_prefix); 576console.log('fr_pid:', fr_pid); 577console.groupEnd(); 578source_image = source; 579filerobotImageEditor.render({ 580source: source_image, 581useBackendTranslations: false, 582defaultSavedImageName: save_image_name, 583defaultSavedImageQuality: file_robot_defaults.save_image_quality, 584tabsIds: [ 585window.FilerobotImageEditor.TABS.ADJUST, 586window.FilerobotImageEditor.TABS.FINETUNE, 587window.FilerobotImageEditor.TABS.FILTERS, 588window.FilerobotImageEditor.TABS.ANNOTATE, 589window.FilerobotImageEditor.TABS.WATERMARK], // or ['Adjust', 'Annotate', 'Watermark'] 590defaultTabId: window.FilerobotImageEditor.TABS.ADJUST, 591Crop: { 592minWidth: 14, 593minHeight: 14, 594maxWidth: null, 595maxHeight: null, 596ratio: 'custom', 597ratioTitleKey: 'custom', 598noPresets: false, 599autoResize: false, 600presetsItems: [], 601presetsFolders: [], 602lockCropAreaAt: null, // 'top-left' 603}, 604// disable save modal 605onBeforeSave: () => { 606return false; 607}, 608onSave: async (imageInfo, designState) => { 609// console.log('onSave() imageInfo', imageInfo); 610// console.log('onSave() designState', designState); 611// create formData object to populate and send with fetch request 612const formData = new FormData(); 613formData.append('image64', imageInfo.imageBase64); 614formData.append('image_extension', imageInfo.extension); 615formData.append('image_height', imageInfo.height); 616formData.append('image_name', imageInfo.name); 617formData.append('image_name_with_extension', imageInfo.fullName); 618formData.append('image_quality', imageInfo.quality); 619formData.append('image_width', imageInfo.width); 620formData.append('dropzone_website_dir', dropzone_website_dir); // e.g. MikMuller.com\httpdocs 621formData.append('rf_dropzone_dir', fr_folder); 622console.log('onSave() formData [2]', formData); 623// add dropzone options for compatibility with current upload script 624const drop_zone_options = { 625tbl: fr_table, 626imgbase: `${fr_prefix}${fr_pid}`, 627imgname: imageInfo.fullName, 628id: fr_pid 629} 630formData.append("dropzone_options", JSON.stringify(drop_zone_options)); 631console.log('onSave() drop_zone_options', drop_zone_options); 632try { 633// _dropzone-file-upload-ajax.cfm 634// _upload-base64.cfm (for testing) 635console.log('renderFileRobotEditor.onSave() imageInfo', imageInfo); 636const upload_request = await fetch('/inc/_dropzone-file-upload-ajax.cfm', { 637method: 'POST', 638body: formData 639}); 640const upload_result = await upload_request.json(); 641// console.log('DEBUG: [onSave] upload_result', upload_result); 642// close modal 643$('#rfImageModalEdit').modal('hide'); 644// page reload 645window.location.reload(); 646} catch (error) { 647console.log('onSave() error', error); 648const upload_result = { 649code: 1, 650message: error.message, 651success: false 652} 653} 654}, 655onClose: (closingReason) => { 656console.log("Closing reason", closingReason); 657filerobotImageEditor.terminate(); 658// reset the input field 659document.getElementById('rf-image-upload').value = ''; 660}, 661}); 662} 663/** 664* Function to handle image selection from the file input field 665* async as we use a promise to await image load 666*/ 667async function onImageSelected(event, file_obj, fr_folder, fr_table, fr_prefix, fr_pid) { 668let file; 669if (file_obj) { 670console.log('onImageSelected file_obj', file_obj, fr_folder, fr_table, fr_prefix, fr_pid); 671file = file_obj; 672} else { 673file = event.target.files[0]; 674} 675save_image_name = file.name; 676console.log('onImageSelected file', file); 677// const reader = new FileReader(); 678const image = new Image(); 679const img_max_width = 1600; 680image.src = URL.createObjectURL(file); 681// Promise to await image load 682await new Promise((resolve) => { 683image.onload = () => { 684const img_width = image.width; 685const img_height = image.height; 686// console.log('onImageSelected img load', img_width, img_height); 687if (img_width > img_max_width) { 688const img_scale = img_max_width / img_width;
689image.width = img_width * img_scale; 690image.height = img_height * img_scale; 691} 692// resolve the promise 693resolve(); 694}; 695}); 696// open the modal 697$('#rfImageModalEdit').modal('show'); 698// Render file robot 699renderFileRobotEditor(image, fr_folder, fr_table, fr_prefix, fr_pid); 700} 701/** Function to handle image editing */ 702function editExistingImage(image_url, image_name, fr_folder=global_fr_folder, fr_table=global_fr_table, fr_prefix=global_fr_prefix, fr_pid=global_fr_pid) { 703console.log('[DEBUG] editExistingImage() called.'); 704console.log('image_url:', image_url); 705console.log('image_name:', image_name); 706console.log('fr_folder:', fr_folder); 707console.log('fr_table:', fr_table); 708console.log('fr_prefix:', fr_prefix); 709console.log('fr_pid:', fr_pid); 710save_image_name = image_name; 711renderFileRobotEditor(image_url, fr_folder, fr_table, fr_prefix, fr_pid); 712} 713/** Function to open the hidden input file field */ 714function openFileInput(fr_folder='', fr_table='', fr_prefix='', fr_pid=0) { 715console.log('[DEBUG] openFileInput() called.', fr_folder, fr_table, fr_prefix, fr_pid); 716global_fr_folder = fr_folder; // where to upload 717global_fr_table = fr_table; // db table to update 718global_fr_prefix = fr_prefix; // image file prefix, ie; blocks_ 719global_fr_pid = fr_pid; 720image_file_upload.click(); 721} 722/** Function to open RF File Manager in a modal 723* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 724* Need the image full url to make a copy of for ai images 725*/ 726function openRFFileManager(current_image_url, fr_folder=global_fr_folder, fr_table=global_fr_table, fr_prefix=global_fr_prefix, fr_pid=global_fr_pid) { 727// $($(this).data( "target" ) + ' .modal-body').load( data_remote ); 728console.group("bs4_init openRFFileManager() called"); 729console.log("current_image_url:", current_image_url); 730console.log("fr_folder:", fr_folder); 731console.log("fr_table:", fr_table); 732console.log("fr_prefix:", fr_prefix); 733console.log("fr_pid:", fr_pid); 734console.groupEnd(); 735const rfFileManagerModalIframe = document.getElementById('rfFileManagerModalIframe'); 736rfFileManagerModalIframe.src = `/ckeditor/plugins/rffilemanager/browse.cfm?CKEditor=editor1&CKEditorFuncNum=1&langCode=en&direct=true&rf_website_dir=${fr_folder}&pid=` + fr_pid + `&image_url=` + encodeURIComponent(current_image_url) + `&page_parent_directory=${fr_folder}&image_prefix=${fr_prefix}&image_table=${fr_table}`; ; 737$('#rfFileManagerModal').modal('show'); 738} 739/** Function to close the RF File Manager modal 740* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 741* Need to upload the image and then close the modal 742*/ 743function closeRFFileManagerModal(image_path, img_name='', fr_folder='', fr_table='', fr_prefix='', fr_pid=0) { 744console.group("bs4_init closeRFFileManagerModal() called"); 745console.log("image_path:",image_path); 746console.log("img_name:",img_name); 747console.log("fr_folder:",fr_folder); 748console.log("fr_table:",fr_table); 749console.log("fr_prefix:",fr_prefix); 750console.log("fr_pid:",fr_pid); 751console.groupEnd(); 752$('#rfFileManagerModal').modal('hide'); 753$('#rfImageModalEdit').modal('show'); 754save_image_name = img_name; 755// renderFileRobotEditor(image_path); 756renderFileRobotEditor(image_path, fr_folder, fr_table, fr_prefix, fr_pid); 757} 758/** Function to close the RF File Manager modal without opening File Robot 759* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 760*/ 761function closeRFFileManagerModalOnly(reload=false) { 762$('#rfFileManagerModal').modal('hide');
763if (reload) { 764setTimeout(() => { 765window.location.reload(); 766}, 500); 767} 768} 769// Handle closing of modal without saving (must cleanup file robot editor) 770$('#rfImageModalEdit').on('hidden.bs.modal', function (event) { 771// console.log('modal closed'); 772filerobotImageEditor.terminate(); 773image_file_upload.value = ''; 774}); 775/** Rocketfusion - enable drag/drop zone on an image with the .rf-image-dropzone class */ 776// Create dropzone object for all images with the .rf-image-dropzone class 777const rf_image_drop_zone = document.querySelectorAll('.rf-image-dropzone'); 778// Attach event listeners to all instances of rf_image_drop_zone 779rf_image_drop_zone.forEach(function (i) { 780// Handle drag over event 781i.addEventListener('dragover', function(e) { 782event.target.classList.add('image-dragover'); 783dragOverHandler(e); 784}); 785// Handle drag leave event 786i.addEventListener('dragleave', function(e) { 787// console.log('Image dropzone dragleave'); 788event.target.classList.remove('image-dragover'); 789}); 790// Handle drop event 791i.addEventListener('drop', function(e) { 792event.target.classList.remove('image-dragover'); 793dropHandler(e); 794}); 795}); 796/** 797* Handles the drop event of files in the drop zone. 798* Prevents the default behavior of opening the file and logs the names of the dropped files. 799* 800* @param {Event} ev - The drop event. 801* @returns {undefined} 802*/ 803function dropHandler(ev) { 804// console.log('File(s) dropped'); 805// Prevent default behavior (Prevent file from being opened) 806ev.preventDefault(); 807if (ev.dataTransfer.items) { 808// Use DataTransferItemList interface to access the file(s) 809[...ev.dataTransfer.items].forEach((item, i) => { 810// If dropped items aren't files, reject them 811if (item.kind === 'file') { 812const file = item.getAsFile(); 813console.log(`file[${i}].name = ${file.name}`); 814onImageSelected(i, file); 815} 816}); 817} else { 818// Use DataTransfer interface to access the file(s) 819[...ev.dataTransfer.files].forEach((file, i) => { 820console.log(`file[${i}].name = ${file.name}`); 821onImageSelected(i, file); 822}); 823} 824} 825/** 826* Handles the drag over event of files in the drop zone. 827* Prevents the default behavior of opening the file. 828* 829* @param {Event} ev - The drag over event. 830* @returns {undefined} 831*/ 832function dragOverHandler(ev) { 833// Prevent default behavior (Prevent file from being opened) 834ev.preventDefault(); 835} 836</script>
836 837<style> 838.modal-fullscreen { 839width: 100vw; 840max-width: none; 841height: 100%; 842margin: 0; 843} 844.modal-content { 845height: 100%; 846border: 0; 847@include border-radius(0); 848} 849.modal-body { 850overflow-y: auto; 851} 852.image-dragover { 853opacity: 0.5; 854} 855</style>
856<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
vendor: 1 bytes, line 856
856
857<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
vendor: 1 bytes, line 857
857
858<script type="text/javascript" src="/RFAssets/js/joey.js?ver=20260930205421" charset="UTF-8"></script>
vendor: 1 bytes, line 858
858
859<script type="text/javascript"> 860$( 'body' ).on( 'click', '[data-toggle="modal"]', function(){ 861let data_remote = $(this).data( "remote" ); 862if ( data_remote && data_remote.length >= 2 ) { 863$($(this).data( "target" ) + ' .modal-content').load( data_remote ); 864} 865}); 866</script>
vendor: 1 bytes, line 866
866
867<script> 868$(document).ready(function() { 869//$('nav').animate({opacity:'1'}, 50);<!-- set to 0.25 to make see thru --> 870//$(img).animate({opacity:'1'}); 871$initNavHgt = $('nav').outerHeight(); 872$initHeadLogoHgt = $('#headerLogo').outerHeight(); 873}); 874</script>
874 875<!-- no userway account -->
876<script> 877var nav = document.getElementById('header'); 878var sticky = navbar.offsetTop; 879var border = document.getElementById('inner-n'); 880window.onscroll = function() { 881scrollNav() 882}; 883function scrollNav() { 884if (window.pageYOffset >= sticky) { 885nav.classList.add("fixed-nav"); 886} else { 887nav.classList.remove("fixed-nav"); 888} 889} 890</script>
890 891</body> 892</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.