PageSourceSearch

https://greenfieldpubliclibrary.org/p/2108/Spaces

html greenfieldpubliclibrary.org collected 2026-09-26 07:41:40 UTC 39,270 bytes, 916 lines download raw bytes

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&rsquo;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&copy; 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.