1<!DOCTYPE html> 2<html lang="en"> 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: Greenfield Public Library 11--> 12<!-- ================================================================================================================= --> 13<!-- Title and App Tags --> 14<!-- 20260911135402 --> 15<title>Spaces - Greenfield Public Library</title> 16<meta property="og:title" content="Spaces - Greenfield Public Library"> 17<meta property="twitter:title" content="Spaces - Greenfield Public Library"> 18<meta itemprop="name" content="Spaces - Greenfield Public Library"> 19<!-- safari --> 20<meta name="apple-mobile-web-app-title" content="Spaces - Greenfield Public Library"> 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="Spaces - Greenfield Public Library"> 27<meta name="msapplication-tooltip" content="Spaces - Greenfield Public Library"> 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<!-- new google fonts --> 37<link rel="preconnect" href="https://fonts.googleapis.com"> 38<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 39<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ek+Mukta"> 40<meta name="theme-color" content="white" /> 41<meta name="Language" content="en" /> 42<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 43<meta name="verify-v1" content=" " /> 44<meta name="source" content="exists" /> 45<meta name="geo.placename" content="Greenfield" /> 46<meta name="google-site-verification" content=" " /> 47<meta name="p:domain_verify" content=" " /> 48<meta name="geo.position" content="" /> 49<meta name="msapplication-TileColor" content="white" /> 50<meta name="last-modified" content="2026-09-25" /> 51<meta name="geo.region" content="US-MA" /> 52<meta name="msvalidate.01" content=" " /> 53<!-- no Facebook Pixel ID --> 54<meta name="author" content="Greenfield Public Library" /> 55<meta name="owner" content="Greenfield Public Library" /> 56<meta name="copyright" content="Copyright 2026 Greenfield Public Library" /> 57<meta name="expires" content="Sep 26, 2026"> 58<meta name="generator" content="RocketFusion CMS" /> 59<meta name="Robots" content="noodp,noydir" /> 60<meta name="slurp" content="noydir" /> 61<meta name="googlebot" content="noodp" /> 62<meta name="msnbot" content="noodp" /> 63<meta name="MSSmartTagsPreventParsing" content="TRUE" /><!-- stops MS browsers from adding parsed keyword advertising on websites --> 64<meta name="viewport" content="width=device-width, initial-scale=1"><!-- , maximum-scale=1 --> 65<meta property="og:site_name" content="Greenfield Public Library"> 66<meta property="og:type" content="website" /> 67<!-- ================================================================================================================= --> 68<!-- FAVICONS start --> 69<link rel="shortcut icon" href="/icons/favicon.png"> 70<link rel="icon" href="/icons/favicon.png" type="image/x-icon"> 71<link rel="apple-touch-icon" href="/icons/favicon.png"> 72<meta name="msapplication-TileImage" content="/icons/favicon.png"> 73<link rel="apple-touch-startup-image" href="/icons/favicon.png"> 74<link rel="apple-touch-icon" sizes="16x16" href="/icons/favicon-16x16.png"> 75<link rel="icon" sizes="16x16" href="/icons/favicon-16x16.png"> 76<meta name="msapplication-square16x16logo" content="/icons/favicon-16x16.png"/> 77<link rel="apple-touch-icon" sizes="24x24" href="/icons/favicon-24x24.png"> 78<link rel="icon" sizes="24x24" href="/icons/favicon-24x24.png"> 79<meta name="msapplication-square24x24logo" content="/icons/favicon-24x24.png"/> 80<link rel="apple-touch-icon" sizes="32x32" href="/icons/favicon-32x32.png"> 81<link rel="icon" sizes="32x32" href="/icons/favicon-32x32.png"> 82<meta name="msapplication-square32x32logo" content="/icons/favicon-32x32.png"/> 83<link rel="apple-touch-icon" sizes="48x48" href="/icons/favicon-48x48.png"> 84<link rel="icon" sizes="48x48" href="/icons/favicon-48x48.png"> 85<meta name="msapplication-square48x48logo" content="/icons/favicon-48x48.png"/> 86<link rel="apple-touch-icon" sizes="57x57" href="/icons/favicon-57x57.png"> 87<link rel="icon" sizes="57x57" href="/icons/favicon-57x57.png"> 88<meta name="msapplication-square57x57logo" content="/icons/favicon-57x57.png"/> 89<link rel="apple-touch-icon" sizes="60x60" href="/icons/favicon-60x60.png"> 90<link rel="icon" sizes="60x60" href="/icons/favicon-60x60.png"> 91<meta name="msapplication-square60x60logo" content="/icons/favicon-60x60.png"/> 92<link rel="apple-touch-icon" sizes="64x64" href="/icons/favicon-64x64.png"> 93<link rel="icon" sizes="64x64" href="/icons/favicon-64x64.png"> 94<meta name="msapplication-square64x64logo" content="/icons/favicon-64x64.png"/> 95<link rel="apple-touch-icon" sizes="70x70" href="/icons/favicon-70x70.png"> 96<link rel="icon" sizes="70x70" href="/icons/favicon-70x70.png"> 97<meta name="msapplication-square70x70logo" content="/icons/favicon-70x70.png"/> 98<link rel="apple-touch-icon" sizes="72x72" href="/icons/favicon-72x72.png"> 99<link rel="icon" sizes="72x72" href="/icons/favicon-72x72.png"> 100<meta name="msapplication-square72x72logo" content="/icons/favicon-72x72.png"/> 101<link rel="apple-touch-icon" sizes="76x76" href="/icons/favicon-76x76.png"> 102<link rel="icon" sizes="76x76" href="/icons/favicon-76x76.png"> 103<meta name="msapplication-square76x76logo" content="/icons/favicon-76x76.png"/> 104<link rel="apple-touch-icon" sizes="96x96" href="/icons/favicon-96x96.png"> 105<link rel="icon" sizes="96x96" href="/icons/favicon-96x96.png"> 106<meta name="msapplication-square96x96logo" content="/icons/favicon-96x96.png"/> 107<link rel="apple-touch-icon" sizes="114x114" href="/icons/favicon-114x114.png"> 108<link rel="icon" sizes="114x114" href="/icons/favicon-114x114.png"> 109<meta name="msapplication-square114x114logo" content="/icons/favicon-114x114.png"/> 110<link rel="apple-touch-icon" sizes="120x120" href="/icons/favicon-120x120.png"> 111<link rel="icon" sizes="120x120" href="/icons/favicon-120x120.png"> 112<meta name="msapplication-square120x120logo" content="/icons/favicon-120x120.png"/> 113<link rel="apple-touch-icon" sizes="128x128" href="/icons/favicon-128x128.png"> 114<link rel="icon" sizes="128x128" href="/icons/favicon-128x128.png"> 115<meta name="msapplication-square128x128logo" content="/icons/favicon-128x128.png"/> 116<link rel="apple-touch-icon" sizes="144x144" href="/icons/favicon-144x144.png"> 117<link rel="icon" sizes="144x144" href="/icons/favicon-144x144.png"> 118<meta name="msapplication-square144x144logo" content="/icons/favicon-144x144.png"/> 119<link rel="apple-touch-icon" sizes="150x150" href="/icons/favicon-150x150.png"> 120<link rel="icon" sizes="150x150" href="/icons/favicon-150x150.png"> 121<meta name="msapplication-square150x150logo" content="/icons/favicon-150x150.png"/> 122<link rel="apple-touch-icon" sizes="152x152" href="/icons/favicon-152x152.png"> 123<link rel="icon" sizes="152x152" href="/icons/favicon-152x152.png"> 124<meta name="msapplication-square152x152logo" content="/icons/favicon-152x152.png"/> 125<link rel="apple-touch-icon" sizes="196x196" href="/icons/favicon-196x196.png"> 126<link rel="icon" sizes="196x196" href="/icons/favicon-196x196.png"> 127<meta name="msapplication-square196x196logo" content="/icons/favicon-196x196.png"/> 128<link rel="apple-touch-icon" sizes="310x310" href="/icons/favicon-310x310.png"> 129<link rel="icon" sizes="310x310" href="/icons/favicon-310x310.png"> 130<meta name="msapplication-square310x310logo" content="/icons/favicon-310x310.png"/> 131<link rel="manifest" href="/icons/manifest.json"> 132<meta name="apple-mobile-web-app-status-bar-style" content="black"> 133<meta name="msapplication-TileColor" content="white"> 134<meta name="theme-color" content="white"> 135<!-- MS Application Tasks (off for now) --> 136<!-- FAVICONS end --> 137<!-- this is a standard page --> 138<meta property="og:url" content="/p/2108/Spaces"> 139<link rel="canonical" href="/p/2108/Spaces"> 140<meta itemprop="image" content="/library/logo.png"> 141<meta property="og:image" content="/library/logo.png"> 142<meta property="twitter:image" content="/library/logo.png"> 143<link rel="image_src" href="/library/logo.png">
144<meta property="og:image:alt" content="Spaces"> 145<meta name="description" content=" "> 146<meta itemprop="description" content=" "> 147<meta property="og:description" content=" "> 148<meta property="twitter:description" content=" "> 149<!-- ================================================================================================================= -->
150<script src="https://kit.fontawesome.com/d3bffd01a6.js" crossorigin="anonymous"></script>
150 151<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> 152<link rel="stylesheet" href="/RFassets/css/datatables-bs4.min.css"> 153<link rel="stylesheet" href="/RFAssets/css/RFtables.css?ver=20260911135402"> 154<link rel="stylesheet" href="/RFAssets/css/joey.css?ver=20260911135402"> 155<link rel="stylesheet" href="/site_style.css?ver=20260911135402"> 156<link rel="stylesheet" href="/header_style.css?ver=20260911135402"> 157<link rel="stylesheet" href="/RFAssets/css/_admin.css?ver=20260911135402"> 158<!-- custom stylesheet --> 159<link rel="stylesheet" href="/tmpl_TownSite.css?ver=20260911135402">
160<script src="/RFAssets/js/boxover.js" type="text/javascript"></script>
vendor: 1 bytes, line 160
160
161<script type="text/javascript"> 162function toggleLayer(whichLayer,what) { 163if (document.getElementById) 164{ 165var style2 = document.getElementById(whichLayer).style; 166style2.display = what; 167} 168else if (document.all) 169{ 170var style2 = document.all[whichLayer].style; 171style2.display = what; 172} 173else if (document.layers) 174{ 175var style2 = document.layers[whichLayer].style; 176style2.display = what; 177} 178} 179function toggleCheckbox(source) { 180checkboxes = document.getElementsByName('file_delete'); 181for(var i=0, n=checkboxes.length;i<n;i++) { 182checkboxes[i].checked = source.checked; 183} 184} 185</script>
vendor: 1 bytes, line 185
185
186<script> 187/** 188* Function that tracks a click on an outbound link in Analytics. 189* This function takes a valid URL string as an argument, and uses that URL string 190* as the event label. Setting the transport method to 'beacon' lets the hit be sent 191* using 'navigator.sendBeacon' in browser that support it. 192*/ 193var trackOutboundLink = function(url) { 194ga('send', 'event', 'outbound', 'click', url, { 195'transport': 'beacon', 196'hitCallback': function(){document.location = url;} 197}); 198} 199</script>
199 200<!-- Global site tag (gtag.js) - Google Analytics -->
vendor: 64 bytes, lines 200-201
200 201<script async src="https://www.googletagmanager.com/gtag/js?id=
201G-9N0Y2MBXG8
vendor: 12 bytes, line 201
201"></script>
202<script>
vendor: 127 bytes, lines 203-206
203window.dataLayer = window.dataLayer || []; 204function gtag(){dataLayer.push(arguments);} 205gtag('js', new Date()); 206gtag('config', '
206G-9N0Y2MBXG8
vendor: 4 bytes, line 206
206');
207</script>
207 208<!-- No text_Google_Tag_Manager_ID defined --> 209<!-- end of metatags --> 210</head> 211<body class="notMobile" 212> 213<!-- THESE ARE HERE (ADMIN) BECAUSE THEY NEED TO BE AT THE TOP OF THE BODY, NOT IN THE META TAGS --> 214<!-- No text_Google_Tag_Manager_ID defined --> 215<!-- ************************** start of head_header ***********************--> 216<style> 217nav .navbar-brand img { 218height: 100px; /*!important*/ 219transition: all .25s ease-in-out; 220-webkit-transition: all .25s ease-in-out; 221} 222nav.shrink .navbar-brand img { 223height: 80px; /*!important*/ 224transition: all .25s ease-in-out; 225-webkit-transition: all .25s ease-in-out; 226} 227</style> 228<header class="header_default sticky "> 229<div class=" inside-header-container"> 230<div class=" inside-header-row"> 231<div class=" inside-header-col"> 232<div class="NavInfoBar"> 233<!-- woot navbar --> 234<div class="nav-info-bar pl-0 pr-0 pt-3 pb-3 mt-0 mb-0 noprint"> 235<div class="brand-not-info-bar-1"> 236<div class="brand-not-info-bar-2"> 237<div class="container pl-0 pr-0"> 238<div class="row m-0 pl-0 pr-0 align-items-center"> 239<div class="col-sm-6 iconset-list text-left pl-0"> 240<span class="iconset text1"> 241<a id="infobar_1" href="/" class="IBTextColorClass"> 242<i class="fa fa-home" aria-hidden="true" aria-label="home icon"></i> 243<span class="IBTextColorClass">Greenfield Public Library</span> 244</a> 245</span> 246</div> 247<div class="col-sm-6 pr-0 text-right"> 248<span class="iconset text5"> 249<a id="infobar_5" target="_blank" href="https://maps.app.goo.gl/gHngZoj41ekekUWs7" class=""> 250<span class="">412 Main Street</span> 251</a> 252</span> 253<span class="iconset text6"> 254<span class="">(413) 772-1544</span> 255</span> 256<span class="social fa-size" style=""> 257<span class="text-info iconset"><a href="https://www.facebook.com/GPLibraryMA" target="_blank" alt="facebook"><i aria-label="facebook icon" class="fab fa-facebook"></i><span class="sr-only">facebook</span></a></span> 258<span class="text-info iconset"><a href="https://www.instagram.com/gplibraryma" target="_blank" alt="instagram"><i aria-label="instagram icon" class="fab fa-instagram"></i><span class="sr-only">instagram</span></a></span> 259<span class="text-info iconset"><a href="https://gplibraryma.wordpress.com/" target="_blank" alt="wordpress"><i aria-label="wordpress icon" class="fab fa-wordpress"></i><span class="sr-only">wordpress</span></a></span> 260</span> 261</div> 262</div> 263</div> 264</div> 265</div> 266</div> 267</div> 268<!-- start pagenav tag --> 269<nav id="navmainpageNavID2" class="navbar pagenav-dropdown navbar-expand-md 270pl-0 pr-0 pt-2 pb-2 mt-0 mb-0 ml-0 mr-0"> 271<div class="container pl-0 pr-0"> 272<a class="navbar-brand-img navbar-brand pt-0 pb-0 pl-2 pr-2 d-flex align-items-center" href="/"> 273<span class="brand-image"><img src="/header/greenfield-public-library-logo.png" alt="Greenfield Public Library" class="img-responsive mb-0 navbar-image mr-2" id="headerLogo"></span> 274</a> 275<button class="navbar-toggler navbar-dark" data-toggle="collapse" aria-label="Open Menu" data-target="#navbar-6"> 276<span class="navbar-toggler-icon navbar-dark"></span> 277</button> 278<div id="navbar-6" class="navbar-collapse collapse"> 279<!-- REALESTATE ERROR 161 Invalid object name 'custom_MLSPIN.dbo.mls_listing_all'.: --> 280<ul class='nav navbar-nav m-auto'><li class='nav-item'> 281<!-- IMAGES!! --> 282<!-- no images drop-down --> 283<a id="menu_p15" 284class="nav-link" 285href="/About"><span>About Us</span></a><!-- yo1 --> 286<!-- yo4 --> 287</li><li class='dropdown nav-item'> 288<a id="menu_p2108" 289class="nav-link dropdown-toggle" 290href="/p/2108/Spaces"><span>Spaces</span></a><!-- yo1 --> 291<!-- yo2 --> 292<!-- hello from pagenav! --> 293<!-- sub-nav start --> 294<!-- qsImagesCat.recordCount = 4 --> 295<div class='subnav_p2108 dropdown-menu dropdown-menu-left'><ul><li class='dropdown-item'> 296<!-- hoohah 167 --> 297<!-- PAGES! --> 298<!-- hoohah 202 --> 299<!-- thecount = 1 --> 300<a id="menu_p2110" 301href="/p/2110/Welcome-to-the-GPL-Childrens-Room"> 302<span>Children's Room</span> 303</a> 304<!-- thecount = 2 --> 305</li><li class='dropdown-item'> 306<a id="menu_p2111" 307href="/p/2111/Welcome-to-the-Teen-Room"> 308<span>Teen Room</span> 309</a> 310<!-- thecount = 3 --> 311</li><li class='dropdown-item'> 312<a id="menu_p2113" 313href="/p/2113/Meeting-Rooms"> 314<span>Meeting Rooms</span> 315</a> 316<!-- thecount = 4 --> 317</li><li class='dropdown-item'> 318<a id="menu_p2112" 319href="/p/2112/Study-Rooms"> 320<span>Study Rooms</span> 321</a> 322</li></ul></div> 323<!-- yo3 --> 324<!-- yo4 --> 325</li><li class='nav-item'> 326<a id="menu_p2109" 327class="nav-link" 328target="_blank" 329href="https://greenfield.cwmars.org/cwmars_card"><span>Get a Library Card</span></a><!-- yo1 --> 330<!-- yo4 --> 331</li><li class='nav-item'> 332<a id="menu_p19" 333class="nav-link" 334href="/Policies"><span>Policies</span></a><!-- yo1 --> 335<!-- yo4 --> 336</li><li class='nav-item'> 337<a id="menu_p2107" 338class="nav-link" 339href="/p/2107/Frequently-Asked-Questions"><span>FAQ</span></a><!-- yo1 --> 340<!-- yo4 --> 341</li><li class='dropdown nav-item'> 342<a id="menu_b" 343class="nav-link dropdown-toggle" 344href="/businesses"><span>Online Resources</span></a> 345<div class='subnav_p[id] dropdown-menu dropdown-menu-left'><ul><li class='dropdown-item'> 346<a id="menu_b1022" href="/b/0/1022/Addiction-Resources"><span>Addiction Resources (3)</span></a> 347</li><li class='dropdown-item'> 348<a id="menu_b1021" href="/b/0/1021/Adult-Education"><span>Adult Education (2)</span></a> 349</li><li class='dropdown-item'> 350<a id="menu_b1015" href="/b/0/1015/Computer-Tutorials"><span>Computer Tutorials (1)</span></a> 351</li><li class='dropdown-item'> 352<a id="menu_b15" href="/b/0/15/Crafts"><span>Crafts (1)</span></a> 353</li><li class='dropdown-item'> 354<a id="menu_b13" href="/b/0/13/Culture-and-Events"><span>Culture and Events (2)</span></a> 355</li><li class='dropdown-item'> 356<a id="menu_b1014" href="/b/0/1014/Educational-Databases"><span>Educational Databases (13)</span></a> 357</li><li class='dropdown-item'> 358<a id="menu_b7" href="/b/0/7/Electronic-Resources"><span>Electronic Resources (63)</span></a> 359</li><li class='dropdown-item'> 360<a id="menu_b5" href="/b/0/5/For-Kids"><span>For Kids (17)</span></a> 361</li><li class='dropdown-item'>
362<a id="menu_b2" href="/b/0/2/Genealogy--Local-Resources"><span>Genealogy & Local Resources (10)</span></a> 363</li><li class='dropdown-item'> 364<a id="menu_b1019" href="/b/0/1019/High-School"><span>High School (10)</span></a> 365</li><li class='dropdown-item'> 366<a id="menu_b10" href="/b/0/10/History"><span>History (3)</span></a> 367</li><li class='dropdown-item'> 368<a id="menu_b1024" href="/b/0/1024/Language-Learning"><span>Language Learning (3)</span></a> 369</li></ul><ul><li class='dropdown-item'> 370<a id="menu_b1016" href="/b/0/1016/Legal"><span>Legal (3)</span></a> 371</li><li class='dropdown-item'> 372<a id="menu_b1025" href="/b/0/1025/Lunt-Environmental-Remediation-Documentation"><span>Lunt Environmental Remediation Documentation (1)</span></a> 373</li><li class='dropdown-item'> 374<a id="menu_b9" href="/b/0/9/Math"><span>Math (3)</span></a> 375</li><li class='dropdown-item'> 376<a id="menu_b1018" href="/b/0/1018/Middle-School"><span>Middle School (8)</span></a> 377</li><li class='dropdown-item'> 378<a id="menu_b14" href="/b/0/14/Movies-and-Television"><span>Movies and Television (1)</span></a> 379</li><li class='dropdown-item'> 380<a id="menu_b1" href="/b/0/1/Newspapers"><span>Newspapers (4)</span></a> 381</li><li class='dropdown-item'> 382<a id="menu_b11" href="/b/0/11/Recommended-Reads"><span>Recommended Reads (15)</span></a> 383</li><li class='dropdown-item'> 384<a id="menu_b6" href="/b/0/6/ScienceMedical"><span>Science/Medical (6)</span></a> 385</li><li class='dropdown-item'> 386<a id="menu_b8" href="/b/0/8/Social-Science"><span>Social Science (5)</span></a> 387</li></ul></div> 388</li><li class='nav-item'> 389<a id="menu_c" 390class="nav-link" 391href="/contact"><span>Contact Us</span></a> 392</li></ul> 393</div><!-- /.nav-collapse --> 394</div> 395</nav> 396<!-- end pagenav tag --> 397</div> 398</div> 399</div> 400</header> 401<!-- ************************** end of header head ***********************--> 402<div class="container"> 403<div class="row"> 404<div class="col-12 col-md-9"> 405<main> 406<!-- START PAGE DIV --> 407<div class="page p p2108 " style=""> 408<div class="container-fluid maincontent"> 409<div class=""> 410<div class=""> 411<!-- HOOHAH we are in content_pages --> 412<!-- set variables.canview = 1 just in case --> 413<h1 class="page"><span>Spaces</span></h1> 414<!-- HOOHAH (content pages 152) if 0 or 0 or (4 and 1 and (Default eq "BelowImage" or OnPage eq "BelowImage") --> 415<ul class="on-page-subnav"> 416<li><p><a href="/p/2110/Welcome-to-the-GPL-Childrens-Room" >Welcome to the GPL Children's Room!</a></p></li> 417<li><p><a href="/p/2111/Welcome-to-the-Teen-Room" >Welcome to the Teen Room!</a></p></li> 418<li><p><a href="/p/2113/Meeting-Rooms" >Meeting Rooms</a></p></li> 419<li><p><a href="/p/2112/Study-Rooms" >Study Rooms</a></p></li> 420</ul> 421</div> 422</div> 423</div> 424</div> 425<!-- END PAGE DIV --> 426<div class="lowercontent"> 427<!-- START PAGE SECTIONS --> 428<!-- inside page sections --> 429<!-- this is a p (12) --> 430<!-- no pw (59) --> 431<!-- canview = 1 (83) --> 432<!-- END PAGE SECTIONS --> 433</div> 434</main> 435</div> 436<div class="col-12 col-md-3"> 437<div class="static side"> 438<!-- from var application.static.side --> 439<p><u><strong>Library Hours</strong></u></p> 440<p><strong>Mon-Wed 9:30am-8pm<br /> 441Thu-Fri 9:30am-5pm<br /> 442Sat 9:30am-2pm</strong></p> 443<p>For security purposes, the upstairs floor closes 15 minutes before closing time. Main doors are locked 5 minutes before closing.</p> 444<div> 445<hr /></div> 446<p><strong>PHONE NUMBERS</strong></p> 447<ul> 448<li>Circulation Desk: 413-772-1544, option 4</li> 449<li>Children’s Room: 413-772-1544, option 5</li> 450<li>Information Services: 413-772-1544, option 6</li> 451</ul> 452<p><strong>MAILING ADDRESS</strong></p> 453<ul> 454<li>Greenfield Public Library<br /> 455412 Main Street<br /> 456Greenfield, MA 01301</li> 457</ul> 458<p><strong>LIBRARY DIRECTOR, Anna Bognolo</strong></p> 459<ul> 460<li>413-772-1544 x 5109</li> 461<li><a href="mailto:[email protected]?subject=from%20Website">[email protected]</a></li> 462</ul> 463<p><strong>LIBRARY TRUSTEES</strong></p> 464<ul> 465<li><a href="mailto:[email protected]?subject=From%20Website">[email protected]</a> (attn: trustees)</li> 466</ul> 467</div> 468</div> 469</div> 470</div> 471<footer> 472<div class="footer_default noprint"> 473<div id="footer" class="container"> 474<div class="footerO row pt-2"> 475<!-- starting from 1 --> 476<!-- this is c: 1 --> 477<div class="col-sm-12 col-md-4 text-center" id="footerRow1"> 478<!-- listfind(attributes.staticPageCol,'col1') --> 479<!-- yes --> 480<div class="static footer-defaultcol1"> 481<!-- from var application.static.footer_defaultcol1 --> 482<p class="mb-1"><strong>412 Main St. Greenfield, MA 01301</strong></p> 483<p class="mb-1 text-center"><strong>(413) 772-1544</strong></p> 484</div> 485<!-- attributes.footerSocialCol eq 'col1' --> 486<!-- attributes.footerNavCol eq 'col1' --> 487<!-- attributes.footerShowSearchCol eq 'col1' --> 488<!-- attributes.loginCol eq 'col1' --> 489</div> 490<!-- this is c: 2 --> 491<div class="col-sm-12 col-md-4 text-center" id="footerRow2"> 492<!-- listfind(attributes.staticPageCol,'col2') --> 493<!-- yes --> 494<div class="static footer-defaultcol2"> 495<!-- from var application.static.footer_defaultcol2 --> 496<p><a href="/"><img alt="Greenfield Public Library logo" class="img-responsive" src="/l
496ibrary/logo.jpg" /></a></p> 497</div> 498<!-- attributes.footerSocialCol eq 'col2' --> 499<!-- yes --> 500<span class="social fa-size" style=""> 501<span class="text-info iconset"><a href="https://www.facebook.com/GPLibraryMA" target="_blank" alt="facebook"><i aria-label="facebook icon" class="fab fa-facebook"></i><span class="sr-only">facebook</span></a></span> 502<span class="text-info iconset"><a href="https://www.instagram.com/gplibraryma" target="_blank" alt="instagram"><i aria-label="instagram icon" class="fab fa-instagram"></i><span class="sr-only">instagram</span></a></span> 503<span class="text-info iconset"><a href="https://gplibraryma.wordpress.com/" target="_blank" alt="wordpress"><i aria-label="wordpress icon" class="fab fa-wordpress"></i><span class="sr-only">wordpress</span></a></span> 504</span> 505<!-- attributes.footerNavCol eq 'col2' --> 506<!-- attributes.footerShowSearchCol eq 'col2' --> 507<!-- attributes.loginCol eq 'col2' --> 508</div> 509<!-- this is c: 3 --> 510<div class="col-sm-12 col-md-4 text-center" id="footerRow3"> 511<!-- listfind(attributes.staticPageCol,'col3') --> 512<!-- yes --> 513<div class="static footer-defaultcol3"> 514<!-- from var application.static.footer_defaultcol3 --> 515<p><strong>Mon-Wed 9:30am-8pm</strong></p> 516<p><strong>Thu-Fri 9:30am-5pm</strong></p> 517<p><strong>Sat 9:30am-2pm</strong></p> 518</div> 519<!-- attributes.footerSocialCol eq 'col3' --> 520<!-- attributes.footerNavCol eq 'col3' --> 521<!-- attributes.footerShowSearchCol eq 'col3' --> 522<!-- attributes.loginCol eq 'col3' --> 523</div> 524</div> 525</div> 526</div> 527<div id="lowerFooter" class="text-center"> 528<div id="footer"> 529<span class="footerO"> 530<span class="footerL"> 531© 2026 Greenfield Public Library 532| 533Software by <a href=http://MontagueWebWorks.com target=_blank>Montague WebWorks</a> 534</span> 535<span class="footerM"> 536| 537</span> 538<span class="footerR"> 539<a href="https://RocketFusion.com" target="_blank">Powered by RocketFusion 123</a> 540</span> 541</span> 542</div> 543<span class="login-link"> 544<a class="login noprint p-3" 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> 545<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> 546</span> 547</div> 548</footer> 549<!-- BS4 Init --> 550<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>
551<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
vendor: 1 bytes, line 551
551
552<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 552
552
553<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 553
553
554<script> 555// Assuming we have a div with id="editor_container" 556const filerobotImageEditor = new window.FilerobotImageEditor( 557document.querySelector("#rf-image-editor-edit") 558); 559const image_file_upload = document.getElementById("rf-image-upload"); 560// const btn_image_upload_edit = document.getElementById("btn-image-upload-edit"); 561var source_image = ''; // the HTMLImageElement 562var save_image_name = ''; // name to save image with 563var global_fr_folder = ''; // where to upload 564var global_fr_table = ''; // db table to update 565var global_fr_prefix = ''; // image file prefix, ie; blocks_ 566var global_fr_pid = 0; // image ID, ie; blocks_2323 567var dropzone_website_dir = 'GreenfieldPublicLibrary.org\\httpdocs'; 568const file_robot_defaults = { 569save_image_quality : 1, // 0.1 - 1 (default 0.92) - applies to jpeg, jpg and webp images only 570}; 571function renderFileRobotEditor(source,fr_folder=global_fr_folder,fr_table=global_fr_table,fr_prefix=global_fr_prefix,fr_pid=global_fr_pid) { 572console.group("renderFileRobotEditor() called"); 573console.log('source:', source); 574console.log('fr_folder:', fr_folder); 575console.log('fr_table:', fr_table); 576console.log('fr_prefix:', fr_prefix); 577console.log('fr_pid:', fr_pid); 578console.groupEnd(); 579source_image = source; 580filerobotImageEditor.render({ 581source: source_image, 582useBackendTranslations: false, 583defaultSavedImageName: save_image_name, 584defaultSavedImageQuality: file_robot_defaults.save_image_quality, 585tabsIds: [ 586window.FilerobotImageEditor.TABS.ADJUST, 587window.FilerobotImageEditor.TABS.FINETUNE, 588window.FilerobotImageEditor.TABS.FILTERS, 589window.FilerobotImageEditor.TABS.ANNOTATE, 590window.FilerobotImageEditor.TABS.WATERMARK], // or ['Adjust', 'Annotate', 'Watermark'] 591defaultTabId: window.FilerobotImageEditor.TABS.ADJUST, 592Crop: { 593minWidth: 14, 594minHeight: 14, 595maxWidth: null, 596maxHeight: null, 597ratio: 'custom', 598ratioTitleKey: 'custom', 599noPresets: false, 600autoResize: false, 601presetsItems: [], 602presetsFolders: [], 603lockCropAreaAt: null, // 'top-left' 604}, 605// disable save modal 606onBeforeSave: () => { 607return false; 608}, 609onSave: async (imageInfo, designState) => { 610// console.log('onSave() imageInfo', imageInfo); 611// console.log('onSave() designState', designState); 612// create formData object to populate and send with fetch request 613const formData = new FormData(); 614formData.append('image64', imageInfo.imageBase64); 615formData.append('image_extension', imageInfo.extension); 616formData.append('image_height', imageInfo.height); 617formData.append('image_name', imageInfo.name); 618formData.append('image_name_with_extension', imageInfo.fullName); 619formData.append('image_quality', imageInfo.quality); 620formData.append('image_width', imageInfo.width); 621formData.append('dropzone_website_dir', dropzone_website_dir); // e.g. MikMuller.com\httpdocs 622formData.append('rf_dropzone_dir', fr_folder); 623console.log('onSave() formData [2]', formData); 624// add dropzone options for compatibility with current upload script 625const drop_zone_options = { 626tbl: fr_table, 627imgbase: `${fr_prefix}${fr_pid}`, 628imgname: imageInfo.fullName, 629id: fr_pid 630} 631formData.append("dropzone_options", JSON.stringify(drop_zone_options)); 632console.log('onSave() drop_zone_options', drop_zone_options); 633try { 634// _dropzone-file-upload-ajax.cfm 635// _upload-base64.cfm (for testing) 636console.log('renderFileRobotEditor.onSave() imageInfo', imageInfo); 637const upload_request = await fetch('/inc/_dropzone-file-upload-ajax.cfm', { 638method: 'POST', 639body: formData 640}); 641const upload_result = await upload_request.json(); 642// console.log('DEBUG: [onSave] upload_result', upload_result); 643// close modal 644$('#rfImageModalEdit').modal('hide'); 645// page reload 646window.location.reload(); 647} catch (error) { 648console.log('onSave() error', error); 649const upload_result = { 650code: 1, 651message: error.message, 652success: false 653} 654} 655}, 656onClose: (closingReason) => { 657console.log("Closing reason", closingReason); 658filerobotImageEditor.terminate(); 659// reset the input field 660document.getElementById('rf-image-upload').value = ''; 661}, 662}); 663} 664/** 665* Function to handle image selection from the file input field 666* async as we use a promise to await image load 667*/ 668async function onImageSelected(event, file_obj, fr_folder, fr_table, fr_prefix, fr_pid) { 669let file; 670if (file_obj) { 671console.log('onImageSelected file_obj', file_obj, fr_folder, fr_table, fr_prefix, fr_pid); 672file = file_obj; 673} else { 674file = event.target.files[0]; 675} 676save_image_name = file.name; 677console.log('onImageSelected file', file); 678// const reader = new FileReader(); 679const image = new Image(); 680const img_max_width = 1600; 681image.src = URL.createObjectURL(file); 682// Promise to await image load 683await new Promise((resolve) => { 684image.onload = () => { 685const img_width = image.width; 686const img_height = image.height; 687// console.log('onImageSelected img load', img_width, img_height); 688if (img_width > img_max_width) { 689const img_scale = img_max_width / img_width;
690image.width = img_width * img_scale; 691image.height = img_height * img_scale; 692} 693// resolve the promise 694resolve(); 695}; 696}); 697// open the modal 698$('#rfImageModalEdit').modal('show'); 699// Render file robot 700renderFileRobotEditor(image, fr_folder, fr_table, fr_prefix, fr_pid); 701} 702/** Function to handle image editing */ 703function 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) { 704console.log('[DEBUG] editExistingImage() called.'); 705console.log('image_url:', image_url); 706console.log('image_name:', image_name); 707console.log('fr_folder:', fr_folder); 708console.log('fr_table:', fr_table); 709console.log('fr_prefix:', fr_prefix); 710console.log('fr_pid:', fr_pid); 711save_image_name = image_name; 712renderFileRobotEditor(image_url, fr_folder, fr_table, fr_prefix, fr_pid); 713} 714/** Function to open the hidden input file field */ 715function openFileInput(fr_folder='', fr_table='', fr_prefix='', fr_pid=0) { 716console.log('[DEBUG] openFileInput() called.', fr_folder, fr_table, fr_prefix, fr_pid); 717global_fr_folder = fr_folder; // where to upload 718global_fr_table = fr_table; // db table to update 719global_fr_prefix = fr_prefix; // image file prefix, ie; blocks_ 720global_fr_pid = fr_pid; 721image_file_upload.click(); 722} 723/** Function to open RF File Manager in a modal 724* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 725* Need the image full url to make a copy of for ai images 726*/ 727function openRFFileManager(current_image_url, fr_folder=global_fr_folder, fr_table=global_fr_table, fr_prefix=global_fr_prefix, fr_pid=global_fr_pid) { 728// $($(this).data( "target" ) + ' .modal-body').load( data_remote ); 729console.group("bs4_init openRFFileManager() called"); 730console.log("current_image_url:", current_image_url); 731console.log("fr_folder:", fr_folder); 732console.log("fr_table:", fr_table); 733console.log("fr_prefix:", fr_prefix); 734console.log("fr_pid:", fr_pid); 735console.groupEnd(); 736const rfFileManagerModalIframe = document.getElementById('rfFileManagerModalIframe'); 737rfFileManagerModalIframe.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}`; ; 738$('#rfFileManagerModal').modal('show'); 739} 740/** Function to close the RF File Manager modal 741* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 742* Need to upload the image and then close the modal 743*/ 744function closeRFFileManagerModal(image_path, img_name='', fr_folder='', fr_table='', fr_prefix='', fr_pid=0) { 745console.group("bs4_init closeRFFileManagerModal() called"); 746console.log("image_path:",image_path); 747console.log("img_name:",img_name); 748console.log("fr_folder:",fr_folder); 749console.log("fr_table:",fr_table); 750console.log("fr_prefix:",fr_prefix); 751console.log("fr_pid:",fr_pid); 752console.groupEnd(); 753$('#rfFileManagerModal').modal('hide'); 754$('#rfImageModalEdit').modal('show'); 755save_image_name = img_name; 756// renderFileRobotEditor(image_path); 757renderFileRobotEditor(image_path, fr_folder, fr_table, fr_prefix, fr_pid); 758} 759/** Function to close the RF File Manager modal without opening File Robot 760* Will be used by ckeditor/plugins/rffilemanager/browse.cfm 761*/ 762function closeRFFileManagerModalOnly(reload=false) { 763$('#rfFileManagerModal').modal('hide');
764if (reload) { 765setTimeout(() => { 766window.location.reload(); 767}, 500); 768} 769} 770// Handle closing of modal without saving (must cleanup file robot editor) 771$('#rfImageModalEdit').on('hidden.bs.modal', function (event) { 772// console.log('modal closed'); 773filerobotImageEditor.terminate(); 774image_file_upload.value = ''; 775}); 776/** Rocketfusion - enable drag/drop zone on an image with the .rf-image-dropzone class */ 777// Create dropzone object for all images with the .rf-image-dropzone class 778const rf_image_drop_zone = document.querySelectorAll('.rf-image-dropzone'); 779// Attach event listeners to all instances of rf_image_drop_zone 780rf_image_drop_zone.forEach(function (i) { 781// Handle drag over event 782i.addEventListener('dragover', function(e) { 783event.target.classList.add('image-dragover'); 784dragOverHandler(e); 785}); 786// Handle drag leave event 787i.addEventListener('dragleave', function(e) { 788// console.log('Image dropzone dragleave'); 789event.target.classList.remove('image-dragover'); 790}); 791// Handle drop event 792i.addEventListener('drop', function(e) { 793event.target.classList.remove('image-dragover'); 794dropHandler(e); 795}); 796}); 797/** 798* Handles the drop event of files in the drop zone. 799* Prevents the default behavior of opening the file and logs the names of the dropped files. 800* 801* @param {Event} ev - The drop event. 802* @returns {undefined} 803*/ 804function dropHandler(ev) { 805// console.log('File(s) dropped'); 806// Prevent default behavior (Prevent file from being opened) 807ev.preventDefault(); 808if (ev.dataTransfer.items) { 809// Use DataTransferItemList interface to access the file(s) 810[...ev.dataTransfer.items].forEach((item, i) => { 811// If dropped items aren't files, reject them 812if (item.kind === 'file') { 813const file = item.getAsFile(); 814console.log(`file[${i}].name = ${file.name}`); 815onImageSelected(i, file); 816} 817}); 818} else { 819// Use DataTransfer interface to access the file(s) 820[...ev.dataTransfer.files].forEach((file, i) => { 821console.log(`file[${i}].name = ${file.name}`); 822onImageSelected(i, file); 823}); 824} 825} 826/** 827* Handles the drag over event of files in the drop zone. 828* Prevents the default behavior of opening the file. 829* 830* @param {Event} ev - The drag over event. 831* @returns {undefined} 832*/ 833function dragOverHandler(ev) { 834// Prevent default behavior (Prevent file from being opened) 835ev.preventDefault(); 836} 837</script>
837 838<style> 839.modal-fullscreen { 840width: 100vw; 841max-width: none; 842height: 100%; 843margin: 0; 844} 845.modal-content { 846height: 100%; 847border: 0; 848@include border-radius(0); 849} 850.modal-body { 851overflow-y: auto; 852} 853.image-dragover { 854opacity: 0.5; 855} 856</style>
857<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 857
857
858<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 858
858
859<script>$(window).scroll(function() { if ($(document).scrollTop() > 50) { $('nav').addClass('shrink'); } else { $('nav').removeClass('shrink'); } }); </script>
859 860<!-- contact and forms -->
861<script src="//cdnjs.cloudflare.com/ajax/libs/jquery.mask/1.14.15/jquery.mask.min.js"></script>
vendor: 1 bytes, line 861
861
862<script src="//cdnjs.cloudflare.com/ajax/libs/parsley.js/2.8.1/parsley.js"></script>
vendor: 1 bytes, line 862
862
863<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/js/bootstrap-datepicker.min.js"></script>
vendor: 1 bytes, line 863
863
864<script> 865function limitText(limitField, limitNum) { 866if (limitField.value.length > limitNum) { 867limitField.value = limitField.value.substring(0, limitNum); 868} 869} 870$(document).ready(function(){ 871// this code is in bs4_init 872// Real time formatting, added by Andrew Kelly, 2/14/19 873// (US phone formatter) - on document load, attach handler to the phone-us class and mask the input 874$('.phone-us').mask('000-000-0000'); 875// Max length of a number input 876$('.numbers-only').keyup(function() { 877var maxLen = $(this).data('max-length'); 878var input = $('.numbers-only').val() 879var inputLen = input.length; 880console.log('[DEBUG] inputLen:' + inputLen); 881console.log('[DEBUG] maxLen:' + maxLen); 882if ( inputLen >= 9 ) { 883console.log('[DEBUG] Trim to 9 chars'); 884$('.numbers-only').val( input.substring(0, 9) ); 885} 886}); 887}); 888// Validation performed on form SUBMIT 889$("#fRocketfusion").parsley({ 890errorClass: 'is-invalid text-danger', 891//successClass: 'is-valid', // Comment this option if you don't want the field to become green when valid. Recommended in Google material design to prevent too many hints for user experience. Only report when a field is wrong. 892errorsWrapper: '<span class="form-text text-danger"></span>', 893errorTemplate: '<span></span>', 894trigger: 'change' 895}); 896</script>
vendor: 1 bytes, line 896
896
897<script type="text/javascript" src="/RFAssets/js/joey.js?ver=20260911135402" charset="UTF-8"></script>
vendor: 1 bytes, line 897
897
898<script type="text/javascript"> 899$( 'body' ).on( 'click', '[data-toggle="modal"]', function(){ 900let data_remote = $(this).data( "remote" ); 901if ( data_remote && data_remote.length >= 2 ) { 902$($(this).data( "target" ) + ' .modal-content').load( data_remote ); 903} 904}); 905</script>
vendor: 1 bytes, line 905
905
906<script> 907$(document).ready(function() { 908//$('nav').animate({opacity:'1'}, 50);<!-- set to 0.25 to make see thru --> 909//$(img).animate({opacity:'1'}); 910$initNavHgt = $('nav').outerHeight(); 911$initHeadLogoHgt = $('#headerLogo').outerHeight(); 912}); 913</script>
913 914<!-- no userway account --> 915</body> 916</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.