bplist00_WebMainResource_WebSubresources ^WebResourceURL_WebResourceFrameName_WebResourceData_WebResourceMIMEType_WebResourceTextEncodingName_>http://www.brattleboromuseum.org/2009/11/19/artist-talk-le-xi/PO9l Brattleboro Museum & Art Center » » Artist Talk: Le Xi

Artist Talk: Le Xi

January 16, Saturday, 3 p.m.

New York-based artist Le Xi has worked as a cinematographer with China’s Public Television and Modern Theatre Company. He will discuss his multimedia installation ‘Life on Line,’ which is part of Drawing Itself: A Survey of Contemporary Practice, and other current work.

Free with regular museum admission

Ytext/htmlUUTF-8"'+/37;?CGKPTX_WebResourceResponse_Fhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/style.cssOE/* Theme Name: BMAC Theme URI: http://www.luminzstudio.com Description: The site template and style for The Brattleboro Museum & Art Center Author: John DiGeorge (design) and Daniel Damkoehler (coding) for Good Bear Productions Author URI: http://www.good-bear.com and http://www.8lionsmedia.com Version: 1.2 Beta . Layout and styles Creative Commons license. . */ /* Page Template Styles */ body { background: #555555; margin: 0 7px 10px 7px; color: #000; text-align: center; font-family: Verdana, Helvetica, Arial, sans-serif; } #container { position: relative; margin: 0px auto; padding: 0px; width: 760px; text-align: center; border: none; background: #fff; } #horizrule { background-image: url(images/999_pixie.gif); background-repeat:repeat-x; width: 740px; height: 1px; padding: 0px 0px 0px 0px; margin: 2px 10px 2px 10px; z-index: 100; } .horizrule /* fix DD */ { background-image: url(images/999_pixie.gif); background-repeat:repeat-x; width: 740px; height: 1px; padding: 0px 0px 0px 0px; margin: 2px 10px 2px 10px; z-index: 100; } #img { color:#000; font-size:8px; } /* Header Styles */ #header { position: relative; width: 760px; height: auto; background: #FFF; margin-top: 0px; margin-bottom: 0; /* 4 */ text-align: left;s } #logohead { position: relative; width: 560px; height: 69px; margin: 0px 0px 0px 0px; border: none; background: url('images/logobanner2.gif') no-repeat top left; } #headerbanner1 { width: 760px; height: 290px; margin: 0px 0px 0px 0px; } #headerbanner2 { width: 760px; height: 200px; margin: 0px 0px 0px 0px; } /* Head Menu Styles */ #headmenu { position: relative; width: 710px; height: 24px; margin-left: 30px; /* 79, changed to fix IE issue */ margin-right: 0px; /* changed to fix IE issue */ background: #FFFFFF; z-index: 1; } #headmenu a:link { color: #333333; text-decoration: none; z-index: 2; } #headmenu a:visited { color: #333333; text-decoration: none; z-index: 2; } #headmenu ul { list-style:none; padding: 0; margin: 0 0 0 -1px; font-size: 12px; text-transform: lowercase; font-weight: normal; text-align: left; z-index: 2; } #headmenu ul li a:link { color: #333333; text-decoration: none; z-index: 2; } #headmenu ul li a:visited { color: #333333; text-decoration: none; z-index: 2; } #headmenu ul li.page_item a:link { color: #333333; text-decoration: none; z-index: 2; } #headmenu ul li.page_item a:visited { color: #333333; text-decoration: none; z-index: 2; } #headmenu ul li.page_item a:hover { color: #960404; text-decoration: none; z-index: 2; } #headmenu ul li.page_item a:active { color: #960404; text-decoration: none; z-index: 2; } #headmenu ul li { float: left; color: #333333; padding: 3px 10px 3px 10px; margin: 0; font-weight: normal; text-transform: none; display: inline; z-index: 2; border-left: 1px solid #BBBBBB; /* 999999 */ } #headmenu ul li.visit_admissions-and-hours /* Keeps the line off the far left menu item */ { float: left; color: #333333; padding: 3px 10px 3px 10px; margin: 0; font-weight: normal; text-transform: none; display: inline; z-index: 2; border-left: none; } #headmenu ul li li.page_item { display: block; padding: 4px 0 4px 3px; margin: 0; width: 172px; border-bottom: 1px dotted #CCCCCC; z-index: 2; border-left: none; } #headmenu li li.page_item a:visited{ color: #333333; text-decoration: none; z-index: 2; } #headmenu li.page_item.current_page_item a { color: #960404; font-weight: normal; display: block; text-decoration: none; z-index: 2; } #headmenu li.page_item.current_page_item li.page_item a:link{ color: #960404; text-decoration: none; z-index: 2; } #headmenu li.page_item.current_page_item li.page_item a:visited{ color: #333333; text-decoration: none; z-index: 2; } #headmenu li a:hover { color: #960404; text-decoration: none; z-index: 2; } #headmenu li a:active { color: #960404; text-decoration: none; z-index: 2; } #headmenu li a:hover:visited { color: #960404; text-decoration: none; z-index: 2; } #headmenu li ul { width: 175px; position: absolute; font-weight: normal; left: -999em; background: #ffffff; } /* IE7, Firefox & Safari 2.x */ #headmenu li li.page_item:hover { color: #960404; text-decoration: none; background: #eeeeee; width: 172px; z-index: 2; } #headmenu li:hover ul{ left:auto; border-right: solid 1px #cccccc; display: block; z-index: 2; } /* IE 5.5 & IE 6 with BMAC javascript */ #headmenu ul li.page_item a ul { width: 175px; position: absolute; font-weight: normal; left: -999em; background: #ffffff; } #headmenu ul li.hmhover a ul { left:auto; border-right: solid 1px #cccccc; z-index: 2; top: 21px; margin-left: -50px; } #headmenu ul li.page_item.hmhover a ul { left:auto; border-right: solid 1px #cccccc; z-index: 2; top: 21px; margin-left: -50px; } #headmenu li li.page_item.hmhover { color: #960404; text-decoration: none; background: #eeeeee; width: 172px; z-index: 2; } #headmenu li.hmhover ul{ left:auto; border-right: solid 1px #cccccc; display: block; z-index: 2; top: 21px; margin-left: -50px; } /*Current Category*/ #headmenu ul li.page_item.current_page_parent a { color: #960404; text-decoration: none; } #headmenu ul li.page_item.current_page_parent li.page_item a { color: #333333; text-decoration: none; } #headmenu ul li.page_item.current_page_parent li.page_item a:hover { color: #960404; background: #eeeeee; } #headmenu li.page_item.current_page_parent a { color: #960404; text-decoration: none; } #headmenu li.page_item.current_page_parent li.page_item a { color: #333333; text-decoration: none; } #headmenu li.page_item.current_page_parent li.page_item a:hover { color: #960404; background: #eeeeee; } /* THESE ARE HERE IN CASE WE EVER WANT TO ADD A SECOND TIER TO THE MENU- #headmenu li.page_item.current_page_item li.page_item a:hover,a:active,a:hover:visited{ color: #960404; text-decoration: none; font-weight: normal; } #headmenu li.page_item.current_page_item ul li.page_item.current_page_item a:link{ font-weight: normal; color: #960404; } #headmenu li.page_item.current_page_item ul li.page_item.current_page_item a:visited{ font-weight: normal; color: #960404; } #headmenu li.page_item.current_page_item ul li.page_item.current_page_item a:hover,a:active,a:hover:visited{ color: #960404; text-decoration: none; font-weight: normal; } */ /* Sidebars & Content Areas */ #frontcontent { margin: 0px; background: #fff; width: 760px; height: 132px; font-size: 13px; /* 13 */ padding: 15px 0px 0px 0px; /* changed from 15px 8px 0px 8px */ text-align: center; } #page_content { margin: 0px 0px 2px 0px; /* IE fix - 10px 40px 2px 0px */ /* RIGHT MARGIN MUST BE 0 FOR IE - adjust right padding instead */ background: ; width: 570px; /* changed from 585 */ font-size: 13px; /* 14 */ line-height:1.2em; /* added */ padding-top: 10px; /* IE fix - 2px */ padding-bottom: 150px; padding-right: 15px; padding-left: 0; text-align: left; position: relative; float: right; z-index: 50; } #contentrap /* sets sidebar background so that it expands with page */ { width: 760px; margin: 0px; padding: 0px; background-image: url(images/contentrap_bck.gif); background-repeat:repeat-y; background-position:center; background-color:#fff; z-index:51; float:left; } #sidebar { background: #eee; margin: ; /* DD 10-18 */ padding-top: 0px; width: 175px; text-align: left; float:left; z-index: 49; height: 500px; /* not required - was 900px */ } /* Search Form Styles */ #event_search label { font-size: 13px; margin: 5px 0 5px 5px; font-weight: normal; text-transform: lowercase; } #search_field { margin: 5px 0 5px 3px; } #search_field input { border: 1px solid #d4d4d4; } #search_field label { font-size: 13px; margin: 5px 0 5px 0; font-weight: normal; text-transform: lowercase; } #search_submit { float: right; margin-right: 13px; text-transform: lowercase; } #search_submit input { background-color: #000000; border: 1px solid #000000; color: #ffffff; } /* Page & Front Page Styles */ #frontcontent p { padding: 0px; margin: 0px; } #page_content h1 { color: #AC0606; font-size: 1.6em; line-height:1.1em; padding: 0 0 0 0; letter-spacing: 0em; margin: 7px 25px 0px 15px; text-align: left; font-weight: bold; /* text-transform: capitalize; */ } #page_content h5 { color: #AC0606; font-size: 1.6em; line-height:1.1em; padding: 0 0 0 0; letter-spacing: 0em; margin: 7px 25px 10px 15px; text-align: left; font-weight: bold; text-transform: capitalize; } #page_content h6 { color: #111111; font-size: 1.3em; padding: 15px 5px 0 0; text-align: left; margin: 0 40px 5px 15px; } #page_content h2 { color: #111111; font-size: 1.2em; padding: 20px 5px 0 0; /* 15px 5px 0.1em 0; */ text-align: left; margin: 0 40px 5px 15px; /* border-bottom: 1px solid #000000; */ } #page_content h4 { color: #111111; font-size: 1.2em; text-align: left; margin: -15px 0px 5px 0px; } #page_content h3 { color: #333333; font-size: 1.3em; padding: 15px 0 5px 0; letter-spacing: 0em; margin: 0 25px 0 15px; text-align: left; text-transform: uppercase; font-weight: normal; } #page_content h3 a:link { color: #333333; text-decoration: none; font-weight: normal; } #page_content h3 a:visited { color: #333333; text-decoration: none; font-weight: normal; } #page_content h3 a:hover,active { color: #333333; text-decoration: underline; font-weight: normal; } #page_content p { text-align: left; color: #000; padding: 5px 0 5px 0; margin: 0 25px 0 15px; } #page_content ul { text-align: left; margin: 5px 0 5px 35px; /* left margin expanded for IE issue */ padding: auto; list-style-position:inside; } #page_content li { text-align: left; margin: 0 0 0 5px; list-style: disc; padding-bottom: 2px; } #page_content a:link { color: #960404; text-decoration: none; } #page_content a:visited { color: #960404; text-decoration: none; } #page_content a:hover,active { color: #960404; text-decoration: underline; } #page_content a img { border: none; } /* Event & Exhibit Styles */ .horizrule_event { border-top: solid 1px #999999; width: 565px; height: 1px; position: relative; padding: 0px 0px 0px 0px; margin: 0px 0px 0px 5px; /* ie fix - DD1018 0px 10px 0px 10px */ } .events_excerpt { width: 365px; /* from 385 */ height: 107px; } .events { width: 570px; /* ie fix - in order to fit into pagecontent */ } .event_thumb { float:right; position: relative; margin: 18px 0px 10px 0; /* 18px 2px 10px 0 */ padding: 0 2px 0 2px; /* 0 0 0 3px */ border: none; } .event_banner { float:left; clear:both; width:565px; margin: 10px 0px 10px 0px; /* Right and left should be set using Padding for IE */ padding: 0px 0px 0px 5px; border: none; text-align:center; } .event_bannerimg { margin: 18px 0px 10px 0; /* 18px 2px 10px 0 */ padding: 0 2px 0 2px; /* 0 0 0 3px */ border: none; } .more-link { margin: 0 20px 0px 15px; /* bottom 0-5 - */ padding: 0 0 50px 0; font-size: .9em; text-align: right; } .event_date { font-style: italic; font-size: 1em; font-weight: normal; padding: 2px 5px 0 0; text-align: left; margin: 0 20px 5px 15px; } .main_event_date { font-size: 1.1em; font-weight: normal; padding: 2px 5px 0 0; text-align: left; margin: 0 20px 5px 15px; font-weight: bold; } .event_title { font-size: 1.1em; font-weight: normal; padding: 2px 230px 0 0; text-align: left; margin: 0 20px 5px 15px; } /* Footer Styles */ #footer { position: relative; clear: both; margin: 0px; padding: 0px 0px 11px 0px; background: #FFFFFF; color: #666666; width: 760px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 11px; line-height: 8px; text-align: center; /* JD - left */ height: auto; } * html #footer { /* IE fix */ height: 1%; font-size: 11px; line-height: 8px; } #footer strong { color: #000000; font-weight:normal; } #footer p { line-height: auto; margin: 8px 0px 0em 10px; padding: 0px 0px 0px 0px; } #copyright { position: relative; color: #999; margin: 0px auto; padding: 0px; background: #555555; font-size: 9px; width: 760px; } #copyright p.left { text-align: left; margin: 3px 0 0 0; float: left; } #copyright p.right { float: right; text-align: right; margin: 3px 0px 0 0; } #copyright p.center { float: left; text-align: center; width: 760px; margin: 6px 0px 0 0; } #copyright a:link { color: #999; text-decoration: underline; } #copyright a:visited { color: #999; text-decoration: underline; } #copyright a:hover,a:active,a:hover:visited { color: #999; text-decoration: underline; } /* Sidebar Styles */ #sidebar h1 { font-weight: bold; font-size: 1em; /* 1.1 */ color: #333; text-transform: lowercase; margin: 60px 12px 4px 12px; /* 10px 12px 0px 12px */ padding: 0px; } #sidebar h3 { font-weight: bold; font-size: 1em; color: #333; /*text-transform: lowercase;*/ margin: 20px 12px 0px 6px; /* 10px 12px 0px 12px */ padding: 0px; } #sidebar ul { list-style:none; padding: 0; font-size: 13px; /* text-transform: capitalize; */ font-weight: normal; /* normal */ margin-top: 0px; /* 7 */ margin-left: 8px; margin-bottom: 0px; /* 20 */ } #sidebar li { list-style-type: none; color: #000; padding-top: 4px; padding-bottom: 4px; padding-left: 0; margin-bottom: 0px; /* 1 */ font-weight: normal; } #sidebar li.page_item.current_page_item a{ color: #960404; font-weight: normal; } #sidebar li ul { padding-top: 2px; margin-bottom: 0px; font-weight: normal; } #sidebar li li.page_item { padding-top: 4px; padding-bottom: 4px; margin: 0px; font-weight: normal; } #sidebar li.page_item { padding-top: 10px; padding-bottom: 4px; margin: 0px 0 0 7px; font-weight: normal; } #sidebar li.page_item.current_page_item li.page_item a:link{ color: #000; font-weight: normal; } #sidebar li.page_item.current_page_item li.page_item a:visited{ color: #000; font-weight: normal; } #sidebar li.page_item.current_page_item li.page_item a:hover,a:active,a:hover:visited{ color: #960404; text-decoration: none; font-weight: normal; } #sidebar li.page_item.current_page_item ul li.page_item.current_page_item a:link{ font-weight: normal; color: #054477; } #sidebar li.page_item.current_page_item ul li.page_item.current_page_item a:visited{ font-weight: normal; color: #960404; } #sidebar li.page_item.current_page_item ul li.page_item.current_page_item a:hover,a:active,a:hover:visited{ color: #960404; text-decoration: none; font-weight: normal; } #sidebar a:link { color: #000; text-decoration: none; font-weight: normal; } #sidebar a:visited { color: #000; text-decoration: none; font-weight: normal; } #sidebar a:hover,a:active,a:hover:visited { color: #960404; text-decoration: none; font-weight: normal; } #sidebar p { font-size:12px; color: #333; margin: 5px 12px 0px 15px; /* 10px 12px 0px 12px */ padding: 0px; } /* Sidebar Nav Header Styles Sidebar Nav Header Styles Sidebar Nav Header Styles */ #sidebar ul.pagemain { font-weight: bold; font-size: 1em; color: #333; padding: 0 0 0 0; margin: 20px 25px 0px 15px; text-align: left; } #sidebar ul.pagemain li { font-weight: bold; padding: 0px; color: #333333; /* border-bottom: 1px solid #333; */ } #sidebar ul.pagemain li a { font-weight: bold; color: #333333; } /* Press Release Section */ #archivebox { width:210px; height: 165px; position: relative; float:right; margin: 10px 0 10px 20px; background: #eee; padding: 0px; text-align: left; } #archiveselector { margin: 10px 10px 15px 15px; } #archivebox h2 { color: #111111; font-size: 1.2em; padding: 15px 5px 0.1em 0; text-align: left; margin: 0 10px 5px 10px; border-bottom: 1px solid #000000; } #press_navbox { width: 500px; height: 140px; position: relative; margin: 10px 20px 10px 20px; background: #eee; padding: 0px; text-align: left; } #press_navbox h2 { color: #111111; font-size: 1.2em; padding: 15px 5px 0.1em 0; text-align: left; margin: 0 10px 5px 10px; border-bottom: 1px solid #000000; } #press_excerpt { width: 575px; height: 107px; } #staff { float:left; width: 500px; position: relative; margin: 10px 0px 0px 16px; padding: 4px 4px 4px 4px; border: solid 1px #CCCCCC; } #staff img { float:left; position: relative; margin: 0px 8px 0px 0px; border: 1px #DDDDDD; } #headbanner1{ background:#000; }Xtext/cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Fhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/style.css./01X$classesZ$classname12UNSURLXNSObject#A6~ 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=150Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aXtext/css_Wed, 18 Aug 2010 15:34:28 GMTU17683_"598c024-4513-4b896033"_Sat, 27 Feb 2010 18:10:59 GMT./_``a2_NSMutableDictionary\NSDictionaryE./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  UZcnqw  %0>SY!;[`dzg_Qhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/images/999_pixie.gifO+GIF89a!,D;Yimage/gifObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Qhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/images/999_pixie.gif./01X$classesZ$classname12UNSURLXNSObject#A6q 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=148Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aYimage/gif_Wed, 18 Aug 2010 15:34:30 GMTR43_"598c016-2b-46bcdf07"_Fri, 10 Aug 2007 21:56:23 GMT./_``a2_NSMutableDictionary\NSDictionary+./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  `eny| +0;I^d'*Bbgkg_Shttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/images/logobanner2.gifOGIF89a0E-666CCCQQQ^^^lllɼyyyÿK@K?ˇˇxoߪ=@DBh&MoD%'TYb;pP>U r 2L A]Lxv8qG]K0'n6KW2mGdV/1|Sg_",\q)!VuQ75zVa"௠BLui[ >*l kBw ۂlyKӘKX[ES]mHp uSuXx;@tVȝg%Nӎ`AKJRf;RQօϰ^1<,XlP%k GVk4#sK%lkMUӜSж1!U1ɤʖ,ʍg9Zk5V Pmi)$.]ZmkQܢ2 LLe wf(J"+l9  E0SKfd*&zNUJap5Vu"6zIZܸTQZ ,A_tM],-҈p&=X2i/ Xv$\ݥF; m$ç:%2}/Kٽfjsh6rn'"- L eb#`tF4VeD t8خdAl.2-)@3[kTYm,N[][X;ZK[PG3aR3.'=~n7Cɾ{;}^VA™9"=k]q,>|\"$B-褙YfS(bDat=Hx{A_8ń^Y*NUb^ج'ws,ytX8QLI*Σis稗dûylKܞ<7V)*65*Ys|rm1EA$y>&'m54# fgtTwWA^v7ymRUeRKCoYL a9'KXބP~)w:|`͑cGk3}Hi$ wgnlXov L.&[Ksm0'3"} }xJ˦8=G.C#2bRtz?k~"GO&FPUiӢ.xfO?RN8$Ȃ  xSS!|"H?le@Uz3E #t( 07KF7\†'c@UX12)42BB>Ueh82@(P'jC[_tqavv@AQU+Dj䊶LhZkas;.r]@l * &`ϸkbqN؍!n@ p @/؎j't؈`b@gv `x $ v]'!8`Op$L %]hȅ'IPpcbgI_= `/Ei\By 7r=8I" ਐD$!W-JAdzFRmz਩8rE95 ,Ou Z(i qO`P)F ,fA,wAtQ @ݺ/Go<]ZZiJ$J@"/t /cC͂j7 Pq84&Ql~넮$*D$1Yz>DZ™x2AeY&S*zC,1b kj%8a֪X1: dߊ3kiq|Z\#B*qyه9{Ԧxo9"*_w!R[uEfQaYșp2Bol;ɜ oQD{$?/@ 2jK4C%}19Wi+榖Kiqaʀ d̒u~I)8)(#x%8"}~q$0hO yw$+ h ˚1)rQDYK39NWҞI9˺kq 8p_!G;llٵ X gq0AYwm,lN~ HP| \oD\LH Ľ`a!kWV|]T Dʼnb?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=148Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aYimage/gif_Wed, 18 Aug 2010 15:34:30 GMTT4545_"3949506-11c1-493142b0"_Sat, 29 Nov 2008 13:25:04 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  bgp{~ -2=K`f ).Hhmqg !_Vhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/images/contentrap_bck.gifOMGIF89a!,$Z޼H扦ʶ L;Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Vhttp://www.brattleboromuseum.org/wp-content/themes/bmac_v1_2/images/contentrap_bck.gif./01X$classesZ$classname12UNSURLXNSObject#A6$ 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=147Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aYimage/gif_Wed, 18 Aug 2010 15:34:30 GMTR77_"598c018-4d-46bcdf09"_Fri, 10 Aug 2007 21:56:25 GMT./_``a2_NSMutableDictionary\NSDictionaryM./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  ejs~!05@Nci ,/Gglpg#$%&_Yhttp://www.brattleboromuseum.org/wp-content/plugins/kml_flashembed_wp_131/js/swfobject.jsO/** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16.push(key+"="+_18[key]);}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);}if(Array.prototype.push==null){Array.prototype.push=function(_32){this[this.length]=_32;return this.length;};}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all["id"];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;_application/x-javascriptObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Yhttp://www.brattleboromuseum.org/wp-content/plugins/kml_flashembed_wp_131/js/swfobject.js./01X$classesZ$classname12UNSURLXNSObject#A69 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=149Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTT6853_"5964258-1ac5-46af1f65"_Tue, 31 Jul 2007 11:39:17 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  hmv $38CQfl @E_g()*_Nhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/style.cssO5div#shoppingcart{ float: right; /* height: 200px; */ width: 148px; margin: 0px; padding: 0px; margin-left: 5px; /* margin-right: -100px; */ } div#shoppingcart img{ position: absolute; top: 5px; left: 5px; } div#shoppingcart div{ font-size: 9pt; border: 1px solid #999999; background-color: #efefef; height: 100%; width: 100%; text-align: left; padding: 6px; padding-top: 4px; } div#shoppingcart div strong{ font-size: 11pt; } div#sideshoppingcart div{ height: 100%; width: 100%; text-align: left; padding: 6px; padding-top: 4px; } div#sideshoppingcart div h2{ margin-left: -1ex; display: inline; } table.shoppingcart{ margin-left: -2px; margin-bottom: 5px; } table.shoppingcart tr td{ font-size: 8pt !important; } div#widgetshoppingcart{ } div#widgetshoppingcart div{ height: 100%; width: 100%; text-align: left; padding: 6px; } div#widgetshoppingcarts div h2{ margin-left: -1ex; display: inline; } td{ font-size: 11pt; vertical-align: top; } table.productcart{ border: 1px solid #999999; width: 100%; margin-bottom: 10px; } table.productcart tr td{ padding-bottom: 5px; font-size: 8pt; } table.productcart tr.firstrow td{ font-weight:bold; background-color: #e5e5e5; } table.productcart tr.oddrow td{ background-color: #f0f0f0; } table.productcart tr td.firstcol{ width: 40%; } form.adjustform{ display: inline; } table.productdisplay{ /* margin-top: 10px; */ margin-bottom: 20px; border-collapse: collapse; width: 100%; text-align: left !important; } table.productdisplay tr td{ vertical-align: top; padding-bottom: 5px; text-align: left !important; } table.productdisplay tr td.imagecol{ padding-right: 5px; margin-right: 5px; border: 0px solid #ffffff; } table.productdisplay tr td.imagecol img{ /* width: 300px; */ border: 0px solid #ffffff; } table.productdisplay tr td.textcol{ padding: 0px; padding-bottom: 10px; margin: 0px; width: 100%; text-align: left !important; } div.producttext{ font-size: 10pt; width: 100%; text-align: left !important; } table.list_productdisplay{ /* margin-top: 10px; */ margin-bottom: 20px; border-collapse: collapse; width: 100%; } table.list_productdisplay tr td{ vertical-align: top; padding-bottom: 0px; font-size: 8pt; /* border: 1px solid black; */ } table.list_productdisplay tr td select{ margin-right: 3px; } table.list_productdisplay tr.list_view_description{ margin: 0px; padding: 0px; } table.list_productdisplay tr.list_view_description td{ margin: 0px; padding: 0px 3px 5px 3px; } table.list_productdisplay tr.list_view_description td div{ display: none; padding: 3px; } ul.tandclist li{ list-style-type:lower-alpha; } ul.tandclist li{ list-style-type: circle; } ul.linklist li{ font-weight:bold; } strong.special{ color: #DD0000; } a.termsandconds { text-decoration: underline; } span.miniarrow{ display: block; /* border: 1px solid black; */ vertical-align: top !important; } img.miniarrow{ /* position: relative; */ /* border: 1px solid black; */ margin-right: 4px; } img.catimage{ float:left; position: relative; top: -3px; margin-right: 2pt; } strong.cattitles{ display: block; position: relative; /* margin-bottom: -15px; */ } strong.prodtitles{ display: block; margin-bottom: -15px; } table.mainpagetable{ margin-left: 0px; } table.mainpagetable tr td{ padding-left: 0px; } strong.title{ font-size: 12.5pt; } a.categorylink{ font-size: 8pt; /*border: 1px solid red;*/ } span.pricedisplay{ white-space: nowrap; } td.totals{ vertical-align: bottom; } table.cattable{ padding: 0px; margin: 0px; border-collapse: collapse; /* border: 1px solid black; */ } table.cattable tr td{ padding: 0px; /* border: 1px solid black; */ } td.catfirstcol{ padding-right: 3px; } form#specials{ display: inline; } span.oldprice{ text-decoration: line-through; } span.additional_description{ display: none; } a.additional_description_link{ display: inline; } td.prodgroupmidline{ border-right: 1px solid black !important; padding-right: 3px; } #loadingindicator{ visibility: hidden; font-size: 7pt; font-weight: normal; } #loadingindicator img{ position: relative; top: 3px; margin-left: 6px; /* visibility: hidden; */ border: none !important; } #alt_loadingindicator{ visibility: hidden; font-size: 7pt; font-weight: normal; } #alt_loadingindicator img{ position: relative; top: 3px; margin-left: 6px; /* visibility: hidden; */ border: none !important; } /* e-commerce fix for K2 */ table.productdisplay tr td img { max-width: none; } div.product_footer{ position: relative; padding: 0px !important; width: 100%; border-top: 1px dashed #cccccc; height: 35px; margin-top: 1em; } div.product_footer strong{ display: block; font-size: 7pt; font-weight: normal; } div.product_average_vote{ position: absolute; top: 0px; left: 0px; width: 50%; float: left; margin: 0px !important; height: inherit; } div.product_user_vote{ position: absolute; top: 0px; right: 0px; width: 30%; margin: 0px !important; height: inherit; } span.vote_total{ position: relative; top: -3px; left: 2px; font-size: 7pt; } span.rating_saved{ color: #990000; display: none; } div.select_country{ margin-bottom: 5px; } div#homepage_products{ width:100%; } div.frontpage_product{ width:auto; float: left; height: 260px; text-align: center; } div.frontpage_product a p{ margin-top: 0px; } div.frontpage_product a{ color: #333333 !important; font-weight: normal !important; } div.frontpage_product a img{ border: none; } div.frontpage_product img{ text-align: center; } div.frontpage_product span.front_page_price{ display: block; } /* shopping cart styling */ table.productcart{ width: 100%; margin-top: 10px; margin-bottom: 10px; padding: 0px; border-collapse: collapse; padding-top: 3px; border: none; font-size: inherit; } table.productcart tr td{ padding-bottom: 5px; font-size: 11px; font-size: inherit; } table.productcart tr.product_row td{ padding-bottom: 5px; font-size: inherit; vertical-align: middle !important; } table.productcart tr.product_row td{ padding-bottom: 5px; font-size: inherit; vertical-align: middle !important; } /*table.productcart tr td a{ color: #000000; font-weight: normal; } table.productcart tr td a:hover{ color: #555555; }*/ table.productcart tr.firstrow td{ font-weight:bold; background-color: #e5e5e5; border-left: 2px solid white; } table.productcart tr.firstrow td.firstcol{ border-left: none; } table.productcart tr.product_shipping td{ vertical-align: middle; border-top: 1px solid #999999 !important; border-bottom: 1px solid #999999 !important; padding-top: 4px; } table.productcart tr.total_price td{ border-top: 1px solid #999999 !important; border-bottom: 1px solid #999999 !important; font-weight: bold; padding-top: 4px; } ul.checkout_links{ list-style-type: none; padding-left: 0px; } ul.checkout_links li{ list-style-type: none; margin-left: 0px; } ul.checkout_links li a{ color: #555555 !important; font-weight: normal !important; } ul.checkout_links li a:hover{ color: #000000 !important; } .PeSwitcher ul{ padding-left: 0px; } .PeSwitcher ul li{ margin-left: 0px; } .category_brand_header li{ list-style-type: none; margin-left: 0px; } #content .category_brand_header li a{ color: #333333; font-weight: bold; } .PeCatsBrands ul{ padding-left: 0px; } .PeCatsBrands ul li{ list-style-type: none; margin-left: 0px; } .PeCatsBrands ul.SubCategories li{ margin-left: 1em; } Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Nhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/style.css./01X$classesZ$classname12UNSURLXNSObject#A6 4 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=150Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aXtext/css_Wed, 18 Aug 2010 15:34:28 GMTT7733_"5964399-1e35-46b4abb5"_Sat, 04 Aug 2007 16:39:17 GMT./_``a2_NSMutableDictionary\NSDictionary5./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  ]bkvy(-8F[a#(Bbgkg,-._Vhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/product_rater.cssO x.votes{ font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 7pt; color: #333; } span.votetext{ display:block; overflow:visible; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt; color: #333; height: 0px; } td.votetext{ width: 90px; } td.votes{ text-align: center; } #starcontainer{ margin: 0px; padding: 0px; width: 90px; height: 17px; overflow: hidden; background: #c4c4b8; position: relative; } #starcontainer a{ margin: 0px !important; padding: 0px !important; border: 0px; } #starcontainer a img{ margin: 0px !important; padding: 0px !important; border: 0px; /* border: 1px solid red; */ width: 18px !important; height: 17px !important; } /*a.star2, a.star3, a.star4, a.star5{ display: none !important; }*/ #singleimg{ margin: 0px; padding: 0px; width: 240px; text-align:center; } #starcont2{ margin: 0px; padding: 0px; width: 90px; height: 17px; overflow: hidden; background: #888; } #starmove{ width: 190px; margin: 0px; height: 17px; padding-left: 10px; /* border: 1px solid green; */ } img.goldstar{ height: 17px; width: 18px; padding: 0px; margin: 0px; border: none; } #starmovenv{ width: 150px; margin: 0px; padding: 0px; height: 17px; } #startxtmove{ width: 110px; margin: 0px; padding: 0px; } #goldstarcont{ margin: 0px; padding: 0px; height: 17px; overflow: hidden; } .starimage{ /* background: url('images/star.gif'); */ /* filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/24bit-star.png',sizingMethod='scale'); */ } div#starcontainer a{/* border: 1px solid red; display: block; visibility: visible;*/ } div#starcontainer a:hover{ background: url('images/blue-star.gif') !important; /* border: 1px solid black;*/ } a.star1{ display:block; width: 18px; text-align: right; z-index: 5; position: absolute; top: 0px; left: 0px; } a.star2{ display:block; width: 36px; text-align: right; z-index: 4; position: absolute; top: 0px; left: 0px; } a.star3{ display:block; width: 54px; text-align: right; z-index: 3; position: absolute; top: 0px; left: 0px; } a.star4{ display:block; width: 72px; text-align: right; z-index: 2; position: absolute; top: 0px; left: 0px; } a.star5{ display:block; width: 90px; text-align: right; z-index: 1; position: absolute; top: 0px; left: 0px; }Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Vhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/product_rater.css./01X$classesZ$classname12UNSURLXNSObject#A6 %1 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=150Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aXtext/css_Wed, 18 Aug 2010 15:34:28 GMTT2424_"5964392-978-46b4abaf"_Sat, 04 Aug 2007 16:39:11 GMT./_``a2_NSMutableDictionary\NSDictionary x./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  ejs~!05@Nci +0Iinrg012_Qhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/lightbox.cssO#lightbox{ position: absolute; top: 40px; left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0; } #lightbox a img{ border: none; } #outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; } #imageContainer{ padding: 10px; } #loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; } #hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; } #imageContainer>#hoverNav{ left: 0;} #hoverNav a{ outline: none;} #prevLink, #nextLink{ width: 49%; height: 100%; background: transparent url(../images/blank.gif) no-repeat; /* Trick IE into showing hover */ display: block; } #prevLink { left: 0; float: left;} #nextLink { right: 0; float: right;} #prevLink:hover, #prevLink:visited:hover { background: url(../images/prevlabel.gif) left 15% no-repeat; } #nextLink:hover, #nextLink:visited:hover { background: url(../images/nextlabel.gif) right 15% no-repeat; } #imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; } #imageData{ padding:0 10px; } #imageData #imageDetails{ width: 70%; float: left; text-align: left; } #imageData #caption{ font-weight: bold; } #imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; } #imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; } #overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; filter:alpha(opacity=60); -moz-opacity: 0.6; opacity: 0.6; } .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } * html>body .clearfix { display: inline-block; width: 100%; } * html .clearfix { /* Hides from IE-mac \*/ height: 1%; /* End hide from IE-mac */ } Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Qhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/lightbox.css./01X$classesZ$classname12UNSURLXNSObject#A6< 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=149Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aXtext/css_Wed, 18 Aug 2010 15:34:28 GMTT2054_"5964386-806-46b4aba7"_Sat, 04 Aug 2007 16:39:03 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  `eny| +0;I^d&+Ddimg45%6_Lhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/ajax.jsO // Copyright (c) 2005 Timothy R. Morgan // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // mini/ajax.js - http://timmorgan.org/mini function $(e){if(typeof e=='string')e=document.getElementById(e);return e}; function collect(a,f){var n=[];for(var i=0;i?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=148Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTT2701_"596432e-a8d-46b4ab5d"_Sat, 04 Aug 2007 16:37:49 GMT./_``a2_NSMutableDictionary\NSDictionary ./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  [`itw}&+6DY_38Qqvzg89%:_Thttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/prototype.jsOc/* Prototype JavaScript framework, version 1.5.0_rc1 * (c) 2005 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://prototype.conio.net/ * /*--------------------------------------------------------------------------*/ var Prototype = { Version: '1.5.0_rc1', BrowserFeatures: { XPath: !!document.evaluate }, ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', emptyFunction: function() {}, K: function(x) { return x } } var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var Abstract = new Object(); Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } Object.extend(Object, { inspect: function(object) { try { if (object === undefined) return 'undefined'; if (object === null) return 'null'; return object.inspect ? object.inspect() : object.toString(); } catch (e) { if (e instanceof RangeError) return '...'; throw e; } }, keys: function(object) { var keys = []; for (var property in object) keys.push(property); return keys; }, values: function(object) { var values = []; for (var property in object) values.push(object[property]); return values; }, clone: function(object) { return Object.extend({}, object); } }); Function.prototype.bind = function() { var __method = this, args = $A(arguments), object = args.shift(); return function() { return __method.apply(object, args.concat($A(arguments))); } } Function.prototype.bindAsEventListener = function(object) { var __method = this, args = $A(arguments), object = args.shift(); return function(event) { return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments))); } } Object.extend(Number.prototype, { toColorPart: function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; }, succ: function() { return this + 1; }, times: function(iterator) { $R(0, this, true).each(iterator); return this; } }); var Try = { these: function() { var returnValue; for (var i = 0; i < arguments.length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) {} } return returnValue; } } /*--------------------------------------------------------------------------*/ var PeriodicalExecuter = Class.create(); PeriodicalExecuter.prototype = { initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, stop: function() { if (!this.timer) return; clearInterval(this.timer); this.timer = null; }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.callback(this); } finally { this.currentlyExecuting = false; } } } } Object.extend(String.prototype, { gsub: function(pattern, replacement) { var result = '', source = this, match; replacement = arguments.callee.prepareReplacement(replacement); while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += (replacement(match) || '').toString(); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; }, sub: function(pattern, replacement, count) { replacement = this.gsub.prepareReplacement(replacement); count = count === undefined ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); }, scan: function(pattern, iterator) { this.gsub(pattern, iterator); return this; }, truncate: function(length, truncation) { length = length || 30; truncation = truncation === undefined ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : this; }, strip: function() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); }, stripTags: function() { return this.replace(/<\/?[^>]+>/gi, ''); }, stripScripts: function() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); }, extractScripts: function() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); }, evalScripts: function() { return this.extractScripts().map(function(script) { return eval(script) }); }, escapeHTML: function() { var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML; }, unescapeHTML: function() { var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; }, toQueryParams: function() { var match = this.strip().match(/[^?]*$/)[0]; if (!match) return {}; var pairs = match.split('&'); return pairs.inject({}, function(params, pairString) { var pair = pairString.split('='); var value = pair[1] ? decodeURIComponent(pair[1]) : undefined; params[decodeURIComponent(pair[0])] = value; return params; }); }, toArray: function() { return this.split(''); }, camelize: function() { var oStringList = this.split('-'); if (oStringList.length == 1) return oStringList[0]; var camelizedString = this.indexOf('-') == 0 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0]; for (var i = 1, length = oStringList.length; i < length; i++) { var s = oStringList[i]; camelizedString += s.charAt(0).toUpperCase() + s.substring(1); } return camelizedString; }, inspect: function(useDoubleQuotes) { var escapedString = this.replace(/\\/g, '\\\\'); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; else return "'" + escapedString.replace(/'/g, '\\\'') + "'"; } }); String.prototype.gsub.prepareReplacement = function(replacement) { if (typeof replacement == 'function') return replacement; var template = new Template(replacement); return function(match) { return template.evaluate(match) }; } String.prototype.parseQuery = String.prototype.toQueryParams; var Template = Class.create(); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; Template.prototype = { initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { return this.template.gsub(this.pattern, function(match) { var before = match[1]; if (before == '\\') return match[2]; return before + (object[match[3]] || '').toString(); }); } } var $break = new Object(); var $continue = new Object(); var Enumerable = { each: function(iterator) { var index = 0; try { this._each(function(value) { try { iterator(value, index++); } catch (e) { if (e != $continue) throw e; } }); } catch (e) { if (e != $break) throw e; } return this; }, eachSlice: function(number, iterator) { var index = -number, slices = [], array = this.toArray(); while ((index += number) < array.length) slices.push(array.slice(index, index+number)); return slices.collect(iterator || Prototype.K); }, all: function(iterator) { var result = true; this.each(function(value, index) { result = result && !!(iterator || Prototype.K)(value, index); if (!result) throw $break; }); return result; }, any: function(iterator) { var result = false; this.each(function(value, index) { if (result = !!(iterator || Prototype.K)(value, index)) throw $break; }); return result; }, collect: function(iterator) { var results = []; this.each(function(value, index) { results.push(iterator(value, index)); }); return results; }, detect: function(iterator) { var result; this.each(function(value, index) { if (iterator(value, index)) { result = value; throw $break; } }); return result; }, findAll: function(iterator) { var results = []; this.each(function(value, index) { if (iterator(value, index)) results.push(value); }); return results; }, grep: function(pattern, iterator) { var results = []; this.each(function(value, index) { var stringValue = value.toString(); if (stringValue.match(pattern)) results.push((iterator || Prototype.K)(value, index)); }) return results; }, include: function(object) { var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; }, inGroupsOf: function(number, fillWith) { fillWith = fillWith || null; var results = this.eachSlice(number); if (results.length > 0) (number - results.last().length).times(function() { results.last().push(fillWith) }); return results; }, inject: function(memo, iterator) { this.each(function(value, index) { memo = iterator(memo, value, index); }); return memo; }, invoke: function(method) { var args = $A(arguments).slice(1); return this.collect(function(value) { return value[method].apply(value, args); }); }, max: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value >= result) result = value; }); return result; }, min: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value < result) result = value; }); return result; }, partition: function(iterator) { var trues = [], falses = []; this.each(function(value, index) { ((iterator || Prototype.K)(value, index) ? trues : falses).push(value); }); return [trues, falses]; }, pluck: function(property) { var results = []; this.each(function(value, index) { results.push(value[property]); }); return results; }, reject: function(iterator) { var results = []; this.each(function(value, index) { if (!iterator(value, index)) results.push(value); }); return results; }, sortBy: function(iterator) { return this.collect(function(value, index) { return {value: value, criteria: iterator(value, index)}; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); }, toArray: function() { return this.collect(Prototype.K); }, zip: function() { var iterator = Prototype.K, args = $A(arguments); if (typeof args.last() == 'function') iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); }, inspect: function() { return '#'; } } Object.extend(Enumerable, { map: Enumerable.collect, find: Enumerable.detect, select: Enumerable.findAll, member: Enumerable.include, entries: Enumerable.toArray }); var $A = Array.from = function(iterable) { if (!iterable) return []; if (iterable.toArray) { return iterable.toArray(); } else { var results = []; for (var i = 0, length = iterable.length; i < length; i++) results.push(iterable[i]); return results; } } Object.extend(Array.prototype, Enumerable); if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; Object.extend(Array.prototype, { _each: function(iterator) { for (var i = 0, length = this.length; i < length; i++) iterator(this[i]); }, clear: function() { this.length = 0; return this; }, first: function() { return this[0]; }, last: function() { return this[this.length - 1]; }, compact: function() { return this.select(function(value) { return value != undefined || value != null; }); }, flatten: function() { return this.inject([], function(array, value) { return array.concat(value && value.constructor == Array ? value.flatten() : [value]); }); }, without: function() { var values = $A(arguments); return this.select(function(value) { return !values.include(value); }); }, indexOf: function(object) { for (var i = 0, length = this.length; i < length; i++) if (this[i] == object) return i; return -1; }, reverse: function(inline) { return (inline !== false ? this : this.toArray())._reverse(); }, reduce: function() { return this.length > 1 ? this : this[0]; }, uniq: function() { return this.inject([], function(array, value) { return array.include(value) ? array : array.concat([value]); }); }, clone: function() { return [].concat(this); }, inspect: function() { return '[' + this.map(Object.inspect).join(', ') + ']'; } }); Array.prototype.toArray = Array.prototype.clone; var Hash = { _each: function(iterator) { for (var key in this) { var value = this[key]; if (typeof value == 'function') continue; var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }, keys: function() { return this.pluck('key'); }, values: function() { return this.pluck('value'); }, merge: function(hash) { return $H(hash).inject(this, function(mergedHash, pair) { mergedHash[pair.key] = pair.value; return mergedHash; }); }, toQueryString: function() { return this.map(function(pair) { if (!pair.value && pair.value !== 0) pair[1] = ''; if (!pair.key) return; return pair.map(encodeURIComponent).join('='); }).join('&'); }, inspect: function() { return '#'; } } function $H(object) { var hash = Object.extend({}, object || {}); Object.extend(hash, Enumerable); Object.extend(hash, Hash); return hash; } ObjectRange = Class.create(); Object.extend(ObjectRange.prototype, Enumerable); Object.extend(ObjectRange.prototype, { initialize: function(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; }, _each: function(iterator) { var value = this.start; while (this.include(value)) { iterator(value); value = value.succ(); } }, include: function(value) { if (value < this.start) return false; if (this.exclusive) return value < this.end; return value <= this.end; } }); var $R = function(start, end, exclusive) { return new ObjectRange(start, end, exclusive); } var Ajax = { getTransport: function() { return Try.these( function() {return new XMLHttpRequest()}, function() {return new ActiveXObject('Msxml2.XMLHTTP')}, function() {return new ActiveXObject('Microsoft.XMLHTTP')} ) || false; }, activeRequestCount: 0 } Ajax.Responders = { responders: [], _each: function(iterator) { this.responders._each(iterator); }, register: function(responder) { if (!this.include(responder)) this.responders.push(responder); }, unregister: function(responder) { this.responders = this.responders.without(responder); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (typeof responder[callback] == 'function') { try { responder[callback].apply(responder, [request, transport, json]); } catch (e) {} } }); } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++; }, onComplete: function() { Ajax.activeRequestCount--; } }); Ajax.Base = function() {}; Ajax.Base.prototype = { setOptions: function(options) { this.options = { method: 'post', asynchronous: true, contentType: 'application/x-www-form-urlencoded', encoding: 'UTF-8', parameters: '' } Object.extend(this.options, options || {}); this.options.method = this.options.method.toLowerCase(); this.options.parameters = $H(typeof this.options.parameters == 'string' ? this.options.parameters.toQueryParams() : this.options.parameters); } } Ajax.Request = Class.create(); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Request.prototype = Object.extend(new Ajax.Base(), { initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); this.request(url); }, request: function(url) { var params = this.options.parameters; if (params.any()) params['_'] = ''; if (!['get', 'post'].include(this.options.method)) { // simulate other verbs over post params['_method'] = this.options.method; this.options.method = 'post'; } this.url = url; // when GET, append parameters to URL if (this.options.method == 'get' && params.any()) this.url += (this.url.indexOf('?') >= 0 ? '&' : '?') + params.toQueryString(); try { Ajax.Responders.dispatch('onCreate', this, this.transport); this.transport.open(this.options.method.toUpperCase(), this.url, this.options.asynchronous, this.options.username, this.options.password); if (this.options.asynchronous) setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); var body = this.options.method == 'post' ? (this.options.postBody || params.toQueryString()) : null; this.transport.send(body); /* Force Firefox to handle ready state 4 for synchronous requests */ if (!this.options.asynchronous && this.transport.overrideMimeType) this.onStateChange(); } catch (e) { this.dispatchException(e); } }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState > 1) this.respondToReadyState(this.transport.readyState); }, setRequestHeaders: function() { var headers = { 'X-Requested-With': 'XMLHttpRequest', 'X-Prototype-Version': Prototype.Version, 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; if (this.options.method == 'post') { headers['Content-type'] = this.options.contentType + (this.options.encoding ? '; charset=' + this.options.encoding : ''); /* Force "Connection: close" for older Mozilla browsers to work * around a bug where XMLHttpRequest sends an incorrect * Content-length header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) headers['Connection'] = 'close'; } // user-defined headers if (typeof this.options.requestHeaders == 'object') { var extras = this.options.requestHeaders; if (typeof extras.push == 'function') for (var i = 0; i < extras.length; i += 2) headers[extras[i]] = extras[i+1]; else $H(extras).each(function(pair) { headers[pair.key] = pair.value }); } for (var name in headers) this.transport.setRequestHeader(name, headers[name]); }, success: function() { return !this.transport.status || (this.transport.status >= 200 && this.transport.status < 300); }, respondToReadyState: function(readyState) { var state = Ajax.Request.Events[readyState]; var transport = this.transport, json = this.evalJSON(); if (state == 'Complete') { try { (this.options['on' + this.transport.status] || this.options['on' + (this.success() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json); } catch (e) { this.dispatchException(e); } } try { (this.options['on' + state] || Prototype.emptyFunction)(transport, json); Ajax.Responders.dispatch('on' + state, this, transport, json); } catch (e) { this.dispatchException(e); } if (state == 'Complete') { if ((this.getHeader('Content-type') || '').strip(). match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) this.evalResponse(); // avoid memory leak in MSIE: clean up this.transport.onreadystatechange = Prototype.emptyFunction; } }, getHeader: function(name) { try { return this.transport.getResponseHeader(name); } catch (e) { return null } }, evalJSON: function() { try { var json = this.getHeader('X-JSON'); return json ? eval('(' + json + ')') : null; } catch (e) { return null } }, evalResponse: function() { try { return eval(this.transport.responseText); } catch (e) { this.dispatchException(e); } }, dispatchException: function(exception) { (this.options.onException || Prototype.emptyFunction)(this, exception); Ajax.Responders.dispatch('onException', this, exception); } }); Ajax.Updater = Class.create(); Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { initialize: function(container, url, options) { this.container = { success: (container.success || container), failure: (container.failure || (container.success ? null : container)) } this.transport = Ajax.getTransport(); this.setOptions(options); var onComplete = this.options.onComplete || Prototype.emptyFunction; this.options.onComplete = (function(transport, param) { this.updateContent(); onComplete(transport, param); }).bind(this); this.request(url); }, updateContent: function() { var receiver = this.container[this.success() ? 'success' : 'failure']; var response = this.transport.responseText; if (!this.options.evalScripts) response = response.stripScripts(); if (receiver = $(receiver)) { if (this.options.insertion) new this.options.insertion(receiver, response); else receiver.update(response); } if (this.success()) { if (this.onComplete) setTimeout(this.onComplete.bind(this), 10); } } }); Ajax.PeriodicalUpdater = Class.create(); Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { initialize: function(container, url, options) { this.setOptions(options); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = {}; this.container = container; this.url = url; this.start(); }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent(); }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments); }, updateComplete: function(request) { if (this.options.decay) { this.decay = (request.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = request.responseText; } this.timer = setTimeout(this.onTimerEvent.bind(this), this.decay * this.frequency * 1000); }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options); } }); function $(element) { if (arguments.length > 1) { for (var i = 0, elements = [], length = arguments.length; i < length; i++) elements.push($(arguments[i])); return elements; } if (typeof element == 'string') element = document.getElementById(element); return Element.extend(element); } if (Prototype.BrowserFeatures.XPath) { document._getElementsByXPath = function(expression, parentElement) { var results = []; var query = document.evaluate(expression, $(parentElement) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (var i = 0, len = query.snapshotLength; i < len; i++) results.push(query.snapshotItem(i)); return results; } } document.getElementsByClassName = function(className, parentElement) { if (Prototype.BrowserFeatures.XPath) { var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; return document._getElementsByXPath(q, parentElement); } else { var children = ($(parentElement) || document.body).getElementsByTagName('*'); var elements = [], child; for (var i = 0, length = children.length; i < length; i++) { child = children[i]; if (Element.hasClassName(child, className)) elements.push(Element.extend(child)); } return elements; } } /*--------------------------------------------------------------------------*/ if (!window.Element) var Element = new Object(); Element.extend = function(element) { if (!element) return; if (_nativeExtensions || element.nodeType == 3) return element; if (!element._extended && element.tagName && element != window) { var methods = Object.clone(Element.Methods), cache = Element.extend.cache; if (element.tagName == 'FORM') Object.extend(methods, Form.Methods); if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName)) Object.extend(methods, Form.Element.Methods); for (var property in methods) { var value = methods[property]; if (typeof value == 'function') element[property] = cache.findOrStore(value); } var methods = Object.clone(Element.Methods.Simulated), cache = Element.extend.cache; for (var property in methods) { var value = methods[property]; if ('function' == typeof value && !(property in element)) element[property] = cache.findOrStore(value); } } element._extended = true; return element; } Element.extend.cache = { findOrStore: function(value) { return this[value] = this[value] || function() { return value.apply(null, [this].concat($A(arguments))); } } } Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function(element) { element = $(element); Element[Element.visible(element) ? 'hide' : 'show'](element); return element; }, hide: function(element) { $(element).style.display = 'none'; return element; }, show: function(element) { $(element).style.display = ''; return element; }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); return element; }, update: function(element, html) { html = typeof html == 'undefined' ? '' : html.toString(); $(element).innerHTML = html.stripScripts(); setTimeout(function() {html.evalScripts()}, 10); return element; }, replace: function(element, html) { element = $(element); if (element.outerHTML) { element.outerHTML = html.stripScripts(); } else { var range = element.ownerDocument.createRange(); range.selectNodeContents(element); element.parentNode.replaceChild( range.createContextualFragment(html.stripScripts()), element); } setTimeout(function() {html.evalScripts()}, 10); return element; }, inspect: function(element) { element = $(element); var result = '<' + element.tagName.toLowerCase(); $H({'id': 'id', 'className': 'class'}).each(function(pair) { var property = pair.first(), attribute = pair.last(); var value = (element[property] || '').toString(); if (value) result += ' ' + attribute + '=' + value.inspect(true); }); return result + '>'; }, recursivelyCollect: function(element, property) { element = $(element); var elements = []; while (element = element[property]) if (element.nodeType == 1) elements.push(Element.extend(element)); return elements; }, ancestors: function(element) { return $(element).recursivelyCollect('parentNode'); }, descendants: function(element) { element = $(element); return $A(element.getElementsByTagName('*')); }, previousSiblings: function(element) { return $(element).recursivelyCollect('previousSibling'); }, nextSiblings: function(element) { return $(element).recursivelyCollect('nextSibling'); }, siblings: function(element) { element = $(element); return element.previousSiblings().reverse().concat(element.nextSiblings()); }, match: function(element, selector) { element = $(element); if (typeof selector == 'string') selector = new Selector(selector); return selector.match(element); }, up: function(element, expression, index) { return Selector.findElement($(element).ancestors(), expression, index); }, down: function(element, expression, index) { return Selector.findElement($(element).descendants(), expression, index); }, previous: function(element, expression, index) { return Selector.findElement($(element).previousSiblings(), expression, index); }, next: function(element, expression, index) { return Selector.findElement($(element).nextSiblings(), expression, index); }, getElementsBySelector: function() { var args = $A(arguments), element = $(args.shift()); return Selector.findChildElements(element, args); }, getElementsByClassName: function(element, className) { element = $(element); return document.getElementsByClassName(className, element); }, getHeight: function(element) { element = $(element); return element.offsetHeight; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; var elementClassName = element.className; if (elementClassName.length == 0) return false; if (elementClassName == className || elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) return true; return false; }, addClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).add(className); return element; }, removeClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element).remove(className); return element; }, observe: function() { Event.observe.apply(Event, arguments); return $A(arguments).first(); }, stopObserving: function() { Event.stopObserving.apply(Event, arguments); return $A(arguments).first(); }, // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); var node = element.firstChild; while (node) { var nextNode = node.nextSibling; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) element.removeChild(node); node = nextNode; } return element; }, empty: function(element) { return $(element).innerHTML.match(/^\s*$/); }, childOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var x = element.x ? element.x : element.offsetLeft, y = element.y ? element.y : element.offsetTop; window.scrollTo(x, y); return element; }, getStyle: function(element, style) { element = $(element); var value = element.style[style.camelize()]; if (!value) { if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css.getPropertyValue(style) : null; } else if (element.currentStyle) { value = element.currentStyle[style.camelize()]; } } if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) if (Element.getStyle(element, 'position') == 'static') value = 'auto'; return value == 'auto' ? null : value; }, setStyle: function(element, style) { element = $(element); for (var name in style) element.style[name.camelize()] = style[name]; return element; }, getDimensions: function(element) { element = $(element); if (Element.getStyle(element, 'display') != 'none') return {width: element.offsetWidth, height: element.offsetHeight}; // All *Width and *Height properties give 0 on elements with display none, // so enable the element temporarily var els = element.style; var originalVisibility = els.visibility; var originalPosition = els.position; els.visibility = 'hidden'; els.position = 'absolute'; els.display = ''; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = 'none'; els.position = originalPosition; els.visibility = originalVisibility; return {width: originalWidth, height: originalHeight}; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; // Opera returns the offset relative to the positioning context, when an // element is position relative but top and left have not been defined if (window.opera) { element.style.top = 0; element.style.left = 0; } } return element; }, undoPositioned: function(element) { element = $(element); if (element._madePositioned) { element._madePositioned = undefined; element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = ''; } return element; }, makeClipping: function(element) { element = $(element); if (element._overflow) return element; element._overflow = element.style.overflow || 'auto'; if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') element.style.overflow = 'hidden'; return element; }, undoClipping: function(element) { element = $(element); if (!element._overflow) return element; element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; element._overflow = null; return element; } } Element.Methods.Simulated = { hasAttribute: function(element, attribute) { return $(element).getAttributeNode(attribute).specified; } } // IE is missing .innerHTML support for TABLE-related elements if(document.all){ Element.Methods.update = function(element, html) { element = $(element); html = typeof html == 'undefined' ? '' : html.toString(); var tagName = element.tagName.toUpperCase(); if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) { var div = document.createElement('div'); switch (tagName) { case 'THEAD': case 'TBODY': div.innerHTML = '' + html.stripScripts() + '
'; depth = 2; break; case 'TR': div.innerHTML = '' + html.stripScripts() + '
'; depth = 3; break; case 'TD': div.innerHTML = '
' + html.stripScripts() + '
'; depth = 4; } $A(element.childNodes).each(function(node){ element.removeChild(node) }); depth.times(function(){ div = div.firstChild }); $A(div.childNodes).each( function(node){ element.appendChild(node) }); } else { element.innerHTML = html.stripScripts(); } setTimeout(function() {html.evalScripts()}, 10); return element; } } Object.extend(Element, Element.Methods); var _nativeExtensions = false; if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) { var className = 'HTML' + tag + 'Element'; if(window[className]) return; var klass = window[className] = {}; klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__; }); Element.addMethods = function(methods) { Object.extend(Element.Methods, methods || {}); function copy(methods, destination, onlyIfAbsent) { onlyIfAbsent = onlyIfAbsent || false; var cache = Element.extend.cache; for (var property in methods) { var value = methods[property]; if (!onlyIfAbsent || !(property in destination)) destination[property] = cache.findOrStore(value); } } if (typeof HTMLElement != 'undefined') { copy(Element.Methods, HTMLElement.prototype); copy(Element.Methods.Simulated, HTMLElement.prototype, true); copy(Form.Methods, HTMLFormElement.prototype); [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) { copy(Form.Element.Methods, klass.prototype); }); _nativeExtensions = true; } } var Toggle = new Object(); Toggle.display = Element.toggle; /*--------------------------------------------------------------------------*/ Abstract.Insertion = function(adjacency) { this.adjacency = adjacency; } Abstract.Insertion.prototype = { initialize: function(element, content) { this.element = $(element); this.content = content.stripScripts(); if (this.adjacency && this.element.insertAdjacentHTML) { try { this.element.insertAdjacentHTML(this.adjacency, this.content); } catch (e) { var tagName = this.element.tagName.toLowerCase(); if (tagName == 'tbody' || tagName == 'tr') { this.insertContent(this.contentFromAnonymousTable()); } else { throw e; } } } else { this.range = this.element.ownerDocument.createRange(); if (this.initializeRange) this.initializeRange(); this.insertContent([this.range.createContextualFragment(this.content)]); } setTimeout(function() {content.evalScripts()}, 10); }, contentFromAnonymousTable: function() { var div = document.createElement('div'); div.innerHTML = '' + this.content + '
'; return $A(div.childNodes[0].childNodes[0].childNodes); } } var Insertion = new Object(); Insertion.Before = Class.create(); Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { initializeRange: function() { this.range.setStartBefore(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element); }).bind(this)); } }); Insertion.Top = Class.create(); Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, insertContent: function(fragments) { fragments.reverse(false).each((function(fragment) { this.element.insertBefore(fragment, this.element.firstChild); }).bind(this)); } }); Insertion.Bottom = Class.create(); Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.appendChild(fragment); }).bind(this)); } }); Insertion.After = Class.create(); Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { initializeRange: function() { this.range.setStartAfter(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element.nextSibling); }).bind(this)); } }); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set($A(this).concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set($A(this).without(classNameToRemove).join(' ')); }, toString: function() { return $A(this).join(' '); } } Object.extend(Element.ClassNames.prototype, Enumerable); var Selector = Class.create(); Selector.prototype = { initialize: function(expression) { this.params = {classNames: []}; this.expression = expression.toString().strip(); this.parseExpression(); this.compileMatcher(); }, parseExpression: function() { function abort(message) { throw 'Parse error in selector: ' + message; } if (this.expression == '') abort('empty expression'); var params = this.params, expr = this.expression, match, modifier, clause, rest; while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { params.attributes = params.attributes || []; params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); expr = match[1]; } if (expr == '*') return this.params.wildcard = true; while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { modifier = match[1], clause = match[2], rest = match[3]; switch (modifier) { case '#': params.id = clause; break; case '.': params.classNames.push(clause); break; case '': case undefined: params.tagName = clause.toUpperCase(); break; default: abort(expr.inspect()); } expr = rest; } if (expr.length > 0) abort(expr.inspect()); }, buildMatchExpression: function() { var params = this.params, conditions = [], clause; if (params.wildcard) conditions.push('true'); if (clause = params.id) conditions.push('element.id == ' + clause.inspect()); if (clause = params.tagName) conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); if ((clause = params.classNames).length > 0) for (var i = 0; i < clause.length; i++) conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')'); if (clause = params.attributes) { clause.each(function(attribute) { var value = 'element.getAttribute(' + attribute.name.inspect() + ')'; var splitValueBy = function(delimiter) { return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; } switch (attribute.operator) { case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; case '|=': conditions.push( splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() ); break; case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; case '': case undefined: conditions.push(value + ' != null'); break; default: throw 'Unknown operator ' + attribute.operator + ' in selector'; } }); } return conditions.join(' && '); }, compileMatcher: function() { this.match = new Function('element', 'if (!element.tagName) return false; \ return ' + this.buildMatchExpression()); }, findElements: function(scope) { var element; if (element = $(this.params.id)) if (this.match(element)) if (!scope || Element.childOf(element, scope)) return [element]; scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); var results = []; for (var i = 0, length = scope.length; i < length; i++) if (this.match(element = scope[i])) results.push(Element.extend(element)); return results; }, toString: function() { return this.expression; } } Object.extend(Selector, { matchElements: function(elements, expression) { var selector = new Selector(expression); return elements.select(selector.match.bind(selector)).collect(Element.extend); }, findElement: function(elements, expression, index) { if (typeof expression == 'number') index = expression, expression = false; return Selector.matchElements(elements, expression || '*')[index || 0]; }, findChildElements: function(element, expressions) { return expressions.map(function(expression) { return expression.strip().split(/\s+/).inject([null], function(results, expr) { var selector = new Selector(expr); return results.inject([], function(elements, result) { return elements.concat(selector.findElements(result || element)); }); }); }).flatten(); } }); function $$() { return Selector.findChildElements(document, $A(arguments)); } var Form = { reset: function(form) { $(form).reset(); return form; }, serializeElements: function(elements) { return elements.inject([], function(queryComponents, element) { var queryComponent = Form.Element.serialize(element); if (queryComponent) queryComponents.push(queryComponent); return queryComponents; }).join('&'); } }; Form.Methods = { serialize: function(form) { return Form.serializeElements($(form).getElements()); }, getElements: function(form) { return $A($(form).getElementsByTagName('*')).inject([], function(elements, child) { if (Form.Element.Serializers[child.tagName.toLowerCase()]) elements.push(Element.extend(child)); return elements; } ); }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return inputs; var matchingInputs = new Array(); for (var i = 0, length = inputs.length; i < length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(Element.extend(input)); } return matchingInputs; }, disable: function(form) { form = $(form); form.getElements().each(function(element) { element.blur(); element.disabled = 'true'; }); return form; }, enable: function(form) { form = $(form); form.getElements().each(function(element) { element.disabled = ''; }); return form; }, findFirstElement: function(form) { return $(form).getElements().find(function(element) { return element.type != 'hidden' && !element.disabled && ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); }); }, focusFirstElement: function(form) { form = $(form); form.findFirstElement().activate(); return form; } } Object.extend(Form, Form.Methods); /*--------------------------------------------------------------------------*/ Form.Element = { focus: function(element) { $(element).focus(); return element; }, select: function(element) { $(element).select(); return element; } } Form.Element.Methods = { serialize: function(element) { element = $(element); if (element.disabled) return ''; var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) { var key = encodeURIComponent(parameter[0]); if (key.length == 0) return; if (parameter[1].constructor != Array) parameter[1] = [parameter[1]]; return parameter[1].map(function(value) { return key + '=' + encodeURIComponent(value); }).join('&'); } }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) return parameter[1]; }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); element.focus(); if (element.select) element.select(); return element; }, disable: function(element) { element = $(element); element.disabled = true; return element; }, enable: function(element) { element = $(element); element.blur(); element.disabled = false; return element; } } Object.extend(Form.Element, Form.Element.Methods); var Field = Form.Element; /*--------------------------------------------------------------------------*/ Form.Element.Serializers = { input: function(element) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element); default: return Form.Element.Serializers.textarea(element); } return false; }, inputSelector: function(element) { if (element.checked) return [element.name, element.value]; }, textarea: function(element) { return [element.name, element.value]; }, select: function(element) { return Form.Element.Serializers[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); }, selectOne: function(element) { var value = '', opt, index = element.selectedIndex; if (index >= 0) { opt = Element.extend(element.options[index]); // Uses the new potential extension if hasAttribute isn't native. value = opt.hasAttribute('value') ? opt.value : opt.text; } return [element.name, value]; }, selectMany: function(element) { var value = []; for (var i = 0; i < element.length; i++) { var opt = Element.extend(element.options[i]); if (opt.selected) // Uses the new potential extension if hasAttribute isn't native. value.push(opt.hasAttribute('value') ? opt.value : opt.text); } return [element.name, value]; } } /*--------------------------------------------------------------------------*/ var $F = Form.Element.getValue; /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = function() {} Abstract.TimedObserver.prototype = { initialize: function(element, frequency, callback) { this.frequency = frequency; this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); this.registerCallback(); }, registerCallback: function() { setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } } } Form.Element.Observer = Class.create(); Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(); Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = function() {} Abstract.EventObserver.prototype = { initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { Form.getElements(this.element).each(this.registerCallback.bind(this)); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; default: Event.observe(element, 'change', this.onElementEvent.bind(this)); break; } } } } Form.Element.EventObserver = Class.create(); Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.EventObserver = Class.create(); Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { getValue: function() { return Form.serialize(this.element); } }); if (!window.Event) { var Event = new Object(); } Object.extend(Event, { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, element: function(event) { return event.target || event.srcElement; }, isLeftClick: function(event) { return (((event.which) && (event.which == 1)) || ((event.button) && (event.button == 1))); }, pointerX: function(event) { return event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); }, pointerY: function(event) { return event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); }, stop: function(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } }, // find the first node with the given tagName, starting from the // node the event was triggered on; traverses the DOM upwards findElement: function(event, tagName) { var element = Event.element(event); while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != tagName.toUpperCase()))) element = element.parentNode; return element; }, observers: false, _observeAndCache: function(element, name, observer, useCapture) { if (!this.observers) this.observers = []; if (element.addEventListener) { this.observers.push([element, name, observer, useCapture]); element.addEventListener(name, observer, useCapture); } else if (element.attachEvent) { this.observers.push([element, name, observer, useCapture]); element.attachEvent('on' + name, observer); } }, unloadCache: function() { if (!Event.observers) return; for (var i = 0, length = Event.observers.length; i < length; i++) { Event.stopObserving.apply(this, Event.observers[i]); Event.observers[i][0] = null; } Event.observers = false; }, observe: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) name = 'keydown'; Event._observeAndCache(element, name, observer, useCapture); }, stopObserving: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent)) name = 'keydown'; if (element.removeEventListener) { element.removeEventListener(name, observer, useCapture); } else if (element.detachEvent) { try { element.detachEvent('on' + name, observer); } catch (e) {} } } }); /* prevent memory leaks in IE */ if (navigator.appVersion.match(/\bMSIE\b/)) Event.observe(window, 'unload', Event.unloadCache, false); var Position = { // set to true if needed, warning: firefox performance problems // NOT neeeded for page scrolling, only if draggable contained in // scrollable elements includeScrollOffsets: false, // must be called before calling withinIncludingScrolloffset, every time the // page is scrolled prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, realOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return [valueL, valueT]; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; }, positionedOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { if(element.tagName=='BODY') break; var p = Element.getStyle(element, 'position'); if (p == 'relative' || p == 'absolute') break; } } while (element); return [valueL, valueT]; }, offsetParent: function(element) { if (element.offsetParent) return element.offsetParent; if (element == document.body) return element; while ((element = element.parentNode) && element != document.body) if (Element.getStyle(element, 'position') != 'static') return element; return document.body; }, // caches x/y coordinate pair to use with overlap within: function(element, x, y) { if (this.includeScrollOffsets) return this.withinIncludingScrolloffsets(element, x, y); this.xcomp = x; this.ycomp = y; this.offset = this.cumulativeOffset(element); return (y >= this.offset[1] && y < this.offset[1] + element.offsetHeight && x >= this.offset[0] && x < this.offset[0] + element.offsetWidth); }, withinIncludingScrolloffsets: function(element, x, y) { var offsetcache = this.realOffset(element); this.xcomp = x + offsetcache[0] - this.deltaX; this.ycomp = y + offsetcache[1] - this.deltaY; this.offset = this.cumulativeOffset(element); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + element.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + element.offsetWidth); }, // within must be called directly before overlap: function(mode, element) { if (!mode) return 0; if (mode == 'vertical') return ((this.offset[1] + element.offsetHeight) - this.ycomp) / element.offsetHeight; if (mode == 'horizontal') return ((this.offset[0] + element.offsetWidth) - this.xcomp) / element.offsetWidth; }, page: function(forElement) { var valueT = 0, valueL = 0; var element = forElement; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; // Safari fix if (element.offsetParent==document.body) if (Element.getStyle(element,'position')=='absolute') break; } while (element = element.offsetParent); element = forElement; do { if (!window.opera || element.tagName=='BODY') { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } } while (element = element.parentNode); return [valueL, valueT]; }, clone: function(source, target) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || {}) // find page position of source source = $(source); var p = Position.page(source); // find coordinate system to use target = $(target); var delta = [0, 0]; var parent = null; // delta [0,0] will do fine with position: fixed elements, // position:absolute needs offsetParent deltas if (Element.getStyle(target,'position') == 'absolute') { parent = Position.offsetParent(target); delta = Position.page(parent); } // correct by body offsets (fixes Safari) if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } // set position if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if(options.setWidth) target.style.width = source.offsetWidth + 'px'; if(options.setHeight) target.style.height = source.offsetHeight + 'px'; }, absolutize: function(element) { element = $(element); if (element.style.position == 'absolute') return; Position.prepare(); var offsets = Position.positionedOffset(element); var top = offsets[1]; var left = offsets[0]; var width = element.clientWidth; var height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); element._originalWidth = element.style.width; element._originalHeight = element.style.height; element.style.position = 'absolute'; element.style.top = top + 'px';; element.style.left = left + 'px';; element.style.width = width + 'px';; element.style.height = height + 'px';; }, relativize: function(element) { element = $(element); if (element.style.position == 'relative') return; Position.prepare(); element.style.position = 'relative'; var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.height = element._originalHeight; element.style.width = element._originalWidth; } } // Safari returns margins on body which is incorrect if the child is absolutely // positioned. For performance reasons, redefine Position.cumulativeOffset for // KHTML/WebKit only. if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { Position.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return [valueL, valueT]; } } Element.addMethods();Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Thttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/prototype.js./01X$classesZ$classname12UNSURLXNSObject#A6U 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=149Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTU64867_"5964376-fd63-46b4ab92"_Sat, 04 Aug 2007 16:38:42 GMT./_``a2_NSMutableDictionary\NSDictionaryc./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  chq| .3>Lag;A[{g<=%>_Rhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/effects.jsO// script.aculo.us effects.js v1.6.5, Wed Nov 08 14:17:49 CET 2006 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) // Martin Bialasinki // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ // converts rgb() and #xxx to #xxxxxx format, // returns self (or first argument) if not convertable String.prototype.parseColor = function() { var color = '#'; if(this.slice(0,4) == 'rgb(') { var cols = this.slice(4,this.length-1).split(','); var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); } else { if(this.slice(0,1) == '#') { if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); if(this.length==7) color = this.toLowerCase(); } } return(color.length==7 ? color : (arguments[0] || this)); } /*--------------------------------------------------------------------------*/ Element.collectTextNodes = function(element) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); }).flatten().join(''); } Element.collectTextNodesIgnoreClass = function(element, className) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? Element.collectTextNodesIgnoreClass(node, className) : '')); }).flatten().join(''); } Element.setContentZoom = function(element, percent) { element = $(element); element.setStyle({fontSize: (percent/100) + 'em'}); if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); return element; } Element.getOpacity = function(element){ element = $(element); var opacity; if (opacity = element.getStyle('opacity')) return parseFloat(opacity); if (opacity = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) if(opacity[1]) return parseFloat(opacity[1]) / 100; return 1.0; } Element.setOpacity = function(element, value){ element= $(element); if (value == 1){ element.setStyle({ opacity: (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0 }); if(/MSIE/.test(navigator.userAgent) && !window.opera) element.setStyle({filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); } else { if(value < 0.00001) value = 0; element.setStyle({opacity: value}); if(/MSIE/.test(navigator.userAgent) && !window.opera) element.setStyle( { filter: element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') + 'alpha(opacity='+value*100+')' }); } return element; } Element.getInlineOpacity = function(element){ return $(element).style.opacity || ''; } Element.forceRerendering = function(element) { try { element = $(element); var n = document.createTextNode(' '); element.appendChild(n); element.removeChild(n); } catch(e) { } }; /*--------------------------------------------------------------------------*/ Array.prototype.call = function() { var args = arguments; this.each(function(f){ f.apply(this, args) }); } /*--------------------------------------------------------------------------*/ var Effect = { _elementDoesNotExistError: { name: 'ElementDoesNotExistError', message: 'The specified DOM element does not exist, but is required for this effect to operate' }, tagifyText: function(element) { if(typeof Builder == 'undefined') throw("Effect.tagifyText requires including script.aculo.us' builder.js library"); var tagifyStyle = 'position:relative'; if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1'; element = $(element); $A(element.childNodes).each( function(child) { if(child.nodeType==3) { child.nodeValue.toArray().each( function(character) { element.insertBefore( Builder.node('span',{style: tagifyStyle}, character == ' ' ? String.fromCharCode(160) : character), child); }); Element.remove(child); } }); }, multiple: function(element, effect) { var elements; if(((typeof element == 'object') || (typeof element == 'function')) && (element.length)) elements = element; else elements = $(element).childNodes; var options = Object.extend({ speed: 0.1, delay: 0.0 }, arguments[2] || {}); var masterDelay = options.delay; $A(elements).each( function(element, index) { new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); }); }, PAIRS: { 'slide': ['SlideDown','SlideUp'], 'blind': ['BlindDown','BlindUp'], 'appear': ['Appear','Fade'] }, toggle: function(element, effect) { element = $(element); effect = (effect || 'appear').toLowerCase(); var options = Object.extend({ queue: { position:'end', scope:(element.id || 'global'), limit: 1 } }, arguments[2] || {}); Effect[element.visible() ? Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); } }; var Effect2 = Effect; // deprecated /* ------------- transitions ------------- */ Effect.Transitions = { linear: Prototype.K, sinoidal: function(pos) { return (-Math.cos(pos*Math.PI)/2) + 0.5; }, reverse: function(pos) { return 1-pos; }, flicker: function(pos) { return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; }, wobble: function(pos) { return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; }, pulse: function(pos, pulses) { pulses = pulses || 5; return ( Math.round((pos % (1/pulses)) * pulses) == 0 ? ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) ); }, none: function(pos) { return 0; }, full: function(pos) { return 1; } }; /* ------------- core effects ------------- */ Effect.ScopedQueue = Class.create(); Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { initialize: function() { this.effects = []; this.interval = null; }, _each: function(iterator) { this.effects._each(iterator); }, add: function(effect) { var timestamp = new Date().getTime(); var position = (typeof effect.options.queue == 'string') ? effect.options.queue : effect.options.queue.position; switch(position) { case 'front': // move unstarted effects after this effect this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { e.startOn += effect.finishOn; e.finishOn += effect.finishOn; }); break; case 'with-last': timestamp = this.effects.pluck('startOn').max() || timestamp; break; case 'end': // start effect after last queued effect has finished timestamp = this.effects.pluck('finishOn').max() || timestamp; break; } effect.startOn += timestamp; effect.finishOn += timestamp; if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) this.effects.push(effect); if(!this.interval) this.interval = setInterval(this.loop.bind(this), 40); }, remove: function(effect) { this.effects = this.effects.reject(function(e) { return e==effect }); if(this.effects.length == 0) { clearInterval(this.interval); this.interval = null; } }, loop: function() { var timePos = new Date().getTime(); this.effects.invoke('loop', timePos); } }); Effect.Queues = { instances: $H(), get: function(queueName) { if(typeof queueName != 'string') return queueName; if(!this.instances[queueName]) this.instances[queueName] = new Effect.ScopedQueue(); return this.instances[queueName]; } } Effect.Queue = Effect.Queues.get('global'); Effect.DefaultOptions = { transition: Effect.Transitions.sinoidal, duration: 1.0, // seconds fps: 25.0, // max. 25fps due to Effect.Queue implementation sync: false, // true for combining from: 0.0, to: 1.0, delay: 0.0, queue: 'parallel' } Effect.Base = function() {}; Effect.Base.prototype = { position: null, start: function(options) { this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); this.currentFrame = 0; this.state = 'idle'; this.startOn = this.options.delay*1000; this.finishOn = this.startOn + (this.options.duration*1000); this.event('beforeStart'); if(!this.options.sync) Effect.Queues.get(typeof this.options.queue == 'string' ? 'global' : this.options.queue.scope).add(this); }, loop: function(timePos) { if(timePos >= this.startOn) { if(timePos >= this.finishOn) { this.render(1.0); this.cancel(); this.event('beforeFinish'); if(this.finish) this.finish(); this.event('afterFinish'); return; } var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); var frame = Math.round(pos * this.options.fps * this.options.duration); if(frame > this.currentFrame) { this.render(pos); this.currentFrame = frame; } } }, render: function(pos) { if(this.state == 'idle') { this.state = 'running'; this.event('beforeSetup'); if(this.setup) this.setup(); this.event('afterSetup'); } if(this.state == 'running') { if(this.options.transition) pos = this.options.transition(pos); pos *= (this.options.to-this.options.from); pos += this.options.from; this.position = pos; this.event('beforeUpdate'); if(this.update) this.update(pos); this.event('afterUpdate'); } }, cancel: function() { if(!this.options.sync) Effect.Queues.get(typeof this.options.queue == 'string' ? 'global' : this.options.queue.scope).remove(this); this.state = 'finished'; }, event: function(eventName) { if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); if(this.options[eventName]) this.options[eventName](this); }, inspect: function() { return '#'; } } Effect.Parallel = Class.create(); Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { initialize: function(effects) { this.effects = effects || []; this.start(arguments[1]); }, update: function(position) { this.effects.invoke('render', position); }, finish: function(position) { this.effects.each( function(effect) { effect.render(1.0); effect.cancel(); effect.event('beforeFinish'); if(effect.finish) effect.finish(position); effect.event('afterFinish'); }); } }); Effect.Event = Class.create(); Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), { initialize: function() { var options = Object.extend({ duration: 0 }, arguments[0] || {}); this.start(options); }, update: Prototype.emptyFunction }); Effect.Opacity = Class.create(); Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); // make this work on IE on elements without 'layout' if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout)) this.element.setStyle({zoom: 1}); var options = Object.extend({ from: this.element.getOpacity() || 0.0, to: 1.0 }, arguments[1] || {}); this.start(options); }, update: function(position) { this.element.setOpacity(position); } }); Effect.Move = Class.create(); Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ x: 0, y: 0, mode: 'relative' }, arguments[1] || {}); this.start(options); }, setup: function() { // Bug in Opera: Opera returns the "real" position of a static element or // relative element that does not have top/left explicitly set. // ==> Always set top and left for position relative elements in your stylesheets // (to 0 if you do not need them) this.element.makePositioned(); this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); this.originalTop = parseFloat(this.element.getStyle('top') || '0'); if(this.options.mode == 'absolute') { // absolute movement, so we need to calc deltaX and deltaY this.options.x = this.options.x - this.originalLeft; this.options.y = this.options.y - this.originalTop; } }, update: function(position) { this.element.setStyle({ left: Math.round(this.options.x * position + this.originalLeft) + 'px', top: Math.round(this.options.y * position + this.originalTop) + 'px' }); } }); // for backwards compatibility Effect.MoveBy = function(element, toTop, toLeft) { return new Effect.Move(element, Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); }; Effect.Scale = Class.create(); Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { initialize: function(element, percent) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ scaleX: true, scaleY: true, scaleContent: true, scaleFromCenter: false, scaleMode: 'box', // 'box' or 'contents' or {} with provided values scaleFrom: 100.0, scaleTo: percent }, arguments[2] || {}); this.start(options); }, setup: function() { this.restoreAfterFinish = this.options.restoreAfterFinish || false; this.elementPositioning = this.element.getStyle('position'); this.originalStyle = {}; ['top','left','width','height','fontSize'].each( function(k) { this.originalStyle[k] = this.element.style[k]; }.bind(this)); this.originalTop = this.element.offsetTop; this.originalLeft = this.element.offsetLeft; var fontSize = this.element.getStyle('font-size') || '100%'; ['em','px','%','pt'].each( function(fontSizeType) { if(fontSize.indexOf(fontSizeType)>0) { this.fontSize = parseFloat(fontSize); this.fontSizeType = fontSizeType; } }.bind(this)); this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; this.dims = null; if(this.options.scaleMode=='box') this.dims = [this.element.offsetHeight, this.element.offsetWidth]; if(/^content/.test(this.options.scaleMode)) this.dims = [this.element.scrollHeight, this.element.scrollWidth]; if(!this.dims) this.dims = [this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth]; }, update: function(position) { var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); if(this.options.scaleContent && this.fontSize) this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); }, finish: function(position) { if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle); }, setDimensions: function(height, width) { var d = {}; if(this.options.scaleX) d.width = Math.round(width) + 'px'; if(this.options.scaleY) d.height = Math.round(height) + 'px'; if(this.options.scaleFromCenter) { var topd = (height - this.dims[0])/2; var leftd = (width - this.dims[1])/2; if(this.elementPositioning == 'absolute') { if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; } else { if(this.options.scaleY) d.top = -topd + 'px'; if(this.options.scaleX) d.left = -leftd + 'px'; } } this.element.setStyle(d); } }); Effect.Highlight = Class.create(); Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); if(!this.element) throw(Effect._elementDoesNotExistError); var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); this.start(options); }, setup: function() { // Prevent executing on elements not in the layout flow if(this.element.getStyle('display')=='none') { this.cancel(); return; } // Disable background image during the effect this.oldStyle = { backgroundImage: this.element.getStyle('background-image') }; this.element.setStyle({backgroundImage: 'none'}); if(!this.options.endcolor) this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); if(!this.options.restorecolor) this.options.restorecolor = this.element.getStyle('background-color'); // init color calculations this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); }, update: function(position) { this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); }, finish: function() { this.element.setStyle(Object.extend(this.oldStyle, { backgroundColor: this.options.restorecolor })); } }); Effect.ScrollTo = Class.create(); Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { initialize: function(element) { this.element = $(element); this.start(arguments[1] || {}); }, setup: function() { Position.prepare(); var offsets = Position.cumulativeOffset(this.element); if(this.options.offset) offsets[1] += this.options.offset; var max = window.innerHeight ? window.height - window.innerHeight : document.body.scrollHeight - (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight); this.scrollStart = Position.deltaY; this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; }, update: function(position) { Position.prepare(); window.scrollTo(Position.deltaX, this.scrollStart + (position*this.delta)); } }); /* ------------- combination effects ------------- */ Effect.Fade = function(element) { element = $(element); var oldOpacity = element.getInlineOpacity(); var options = Object.extend({ from: element.getOpacity() || 1.0, to: 0.0, afterFinishInternal: function(effect) { if(effect.options.to!=0) return; effect.element.hide().setStyle({opacity: oldOpacity}); }}, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Appear = function(element) { element = $(element); var options = Object.extend({ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), to: 1.0, // force Safari to render floated elements properly afterFinishInternal: function(effect) { effect.element.forceRerendering(); }, beforeSetup: function(effect) { effect.element.setOpacity(effect.options.from).show(); }}, arguments[1] || {}); return new Effect.Opacity(element,options); } Effect.Puff = function(element) { element = $(element); var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position'), top: element.style.top, left: element.style.left, width: element.style.width, height: element.style.height }; return new Effect.Parallel( [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], Object.extend({ duration: 1.0, beforeSetupInternal: function(effect) { Position.absolutize(effect.effects[0].element) }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().setStyle(oldStyle); } }, arguments[1] || {}) ); } Effect.BlindUp = function(element) { element = $(element); element.makeClipping(); return new Effect.Scale(element, 0, Object.extend({ scaleContent: false, scaleX: false, restoreAfterFinish: true, afterFinishInternal: function(effect) { effect.element.hide().undoClipping(); } }, arguments[1] || {}) ); } Effect.BlindDown = function(element) { element = $(element); var elementDimensions = element.getDimensions(); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: 0, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { effect.element.makeClipping().setStyle({height: '0px'}).show(); }, afterFinishInternal: function(effect) { effect.element.undoClipping(); } }, arguments[1] || {})); } Effect.SwitchOff = function(element) { element = $(element); var oldOpacity = element.getInlineOpacity(); return new Effect.Appear(element, Object.extend({ duration: 0.4, from: 0, transition: Effect.Transitions.flicker, afterFinishInternal: function(effect) { new Effect.Scale(effect.element, 1, { duration: 0.3, scaleFromCenter: true, scaleX: false, scaleContent: false, restoreAfterFinish: true, beforeSetup: function(effect) { effect.element.makePositioned().makeClipping(); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); } }) } }, arguments[1] || {})); } Effect.DropOut = function(element) { element = $(element); var oldStyle = { top: element.getStyle('top'), left: element.getStyle('left'), opacity: element.getInlineOpacity() }; return new Effect.Parallel( [ new Effect.Move(element, {x: 0, y: 100, sync: true }), new Effect.Opacity(element, { sync: true, to: 0.0 }) ], Object.extend( { duration: 0.5, beforeSetup: function(effect) { effect.effects[0].element.makePositioned(); }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); } }, arguments[1] || {})); } Effect.Shake = function(element) { element = $(element); var oldStyle = { top: element.getStyle('top'), left: element.getStyle('left') }; return new Effect.Move(element, { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { new Effect.Move(effect.element, { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { effect.element.undoPositioned().setStyle(oldStyle); }}) }}) }}) }}) }}) }}); } Effect.SlideDown = function(element) { element = $(element).cleanWhitespace(); // SlideDown need to have the content of the element wrapped in a container element with fixed height! var oldInnerBottom = element.down().getStyle('bottom'); var elementDimensions = element.getDimensions(); return new Effect.Scale(element, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: window.opera ? 0 : 1, scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, restoreAfterFinish: true, afterSetup: function(effect) { effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera) effect.element.setStyle({top: ''}); effect.element.makeClipping().setStyle({height: '0px'}).show(); }, afterUpdateInternal: function(effect) { effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, afterFinishInternal: function(effect) { effect.element.undoClipping().undoPositioned(); effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } }, arguments[1] || {}) ); } Effect.SlideUp = function(element) { element = $(element).cleanWhitespace(); var oldInnerBottom = element.down().getStyle('bottom'); return new Effect.Scale(element, window.opera ? 0 : 1, Object.extend({ scaleContent: false, scaleX: false, scaleMode: 'box', scaleFrom: 100, restoreAfterFinish: true, beforeStartInternal: function(effect) { effect.element.makePositioned(); effect.element.down().makePositioned(); if(window.opera) effect.element.setStyle({top: ''}); effect.element.makeClipping().show(); }, afterUpdateInternal: function(effect) { effect.element.down().setStyle({bottom: (effect.dims[0] - effect.element.clientHeight) + 'px' }); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom}); effect.element.down().undoPositioned(); } }, arguments[1] || {}) ); } // Bug in opera makes the TD containing this element expand for a instance after finish Effect.Squish = function(element) { return new Effect.Scale(element, window.opera ? 1 : 0, { restoreAfterFinish: true, beforeSetup: function(effect) { effect.element.makeClipping(); }, afterFinishInternal: function(effect) { effect.element.hide().undoClipping(); } }); } Effect.Grow = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.full }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: element.getInlineOpacity() }; var dims = element.getDimensions(); var initialMoveX, initialMoveY; var moveX, moveY; switch (options.direction) { case 'top-left': initialMoveX = initialMoveY = moveX = moveY = 0; break; case 'top-right': initialMoveX = dims.width; initialMoveY = moveY = 0; moveX = -dims.width; break; case 'bottom-left': initialMoveX = moveX = 0; initialMoveY = dims.height; moveY = -dims.height; break; case 'bottom-right': initialMoveX = dims.width; initialMoveY = dims.height; moveX = -dims.width; moveY = -dims.height; break; case 'center': initialMoveX = dims.width / 2; initialMoveY = dims.height / 2; moveX = -dims.width / 2; moveY = -dims.height / 2; break; } return new Effect.Move(element, { x: initialMoveX, y: initialMoveY, duration: 0.01, beforeSetup: function(effect) { effect.element.hide().makeClipping().makePositioned(); }, afterFinishInternal: function(effect) { new Effect.Parallel( [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), new Effect.Scale(effect.element, 100, { scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) ], Object.extend({ beforeSetup: function(effect) { effect.effects[0].element.setStyle({height: '0px'}).show(); }, afterFinishInternal: function(effect) { effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); } }, options) ) } }); } Effect.Shrink = function(element) { element = $(element); var options = Object.extend({ direction: 'center', moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.none }, arguments[1] || {}); var oldStyle = { top: element.style.top, left: element.style.left, height: element.style.height, width: element.style.width, opacity: element.getInlineOpacity() }; var dims = element.getDimensions(); var moveX, moveY; switch (options.direction) { case 'top-left': moveX = moveY = 0; break; case 'top-right': moveX = dims.width; moveY = 0; break; case 'bottom-left': moveX = 0; moveY = dims.height; break; case 'bottom-right': moveX = dims.width; moveY = dims.height; break; case 'center': moveX = dims.width / 2; moveY = dims.height / 2; break; } return new Effect.Parallel( [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) ], Object.extend({ beforeStartInternal: function(effect) { effect.effects[0].element.makePositioned().makeClipping(); }, afterFinishInternal: function(effect) { effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } }, options) ); } Effect.Pulsate = function(element) { element = $(element); var options = arguments[1] || {}; var oldOpacity = element.getInlineOpacity(); var transition = options.transition || Effect.Transitions.sinoidal; var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; reverser.bind(transition); return new Effect.Opacity(element, Object.extend(Object.extend({ duration: 2.0, from: 0, afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } }, options), {transition: reverser})); } Effect.Fold = function(element) { element = $(element); var oldStyle = { top: element.style.top, left: element.style.left, width: element.style.width, height: element.style.height }; element.makeClipping(); return new Effect.Scale(element, 5, Object.extend({ scaleContent: false, scaleX: false, afterFinishInternal: function(effect) { new Effect.Scale(element, 1, { scaleContent: false, scaleY: false, afterFinishInternal: function(effect) { effect.element.hide().undoClipping().setStyle(oldStyle); } }); }}, arguments[1] || {})); }; ['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom', 'collectTextNodes','collectTextNodesIgnoreClass'].each( function(f) { Element.Methods[f] = Element[f]; } ); Element.Methods.visualEffect = function(element, effect, options) { s = effect.gsub(/_/, '-').camelize(); effect_class = s.charAt(0).toUpperCase() + s.substring(1); new Effect[effect_class](element, options); return $(element); }; Element.addMethods();Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Rhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/effects.js./01X$classesZ$classname12UNSURLXNSObject#A6Vv 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=148Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTU32703_"5964374-7fbf-46b4ab8f"_Sat, 04 Aug 2007 16:38:39 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  afoz} ,1<J_e9?Yy~g@A%B_Shttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/dragdrop.jsOw// script.aculo.us dragdrop.js v1.6.5, Wed Nov 08 14:17:49 CET 2006 // Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) // // script.aculo.us is freely distributable under the terms of an MIT-style license. // For details, see the script.aculo.us web site: http://script.aculo.us/ if(typeof Effect == 'undefined') throw("dragdrop.js requires including script.aculo.us' effects.js library"); var Droppables = { drops: [], remove: function(element) { this.drops = this.drops.reject(function(d) { return d.element==$(element) }); }, add: function(element) { element = $(element); var options = Object.extend({ greedy: true, hoverclass: null, tree: false }, arguments[1] || {}); // cache containers if(options.containment) { options._containers = []; var containment = options.containment; if((typeof containment == 'object') && (containment.constructor == Array)) { containment.each( function(c) { options._containers.push($(c)) }); } else { options._containers.push($(containment)); } } if(options.accept) options.accept = [options.accept].flatten(); Element.makePositioned(element); // fix IE options.element = element; this.drops.push(options); }, findDeepestChild: function(drops) { deepest = drops[0]; for (i = 1; i < drops.length; ++i) if (Element.isParent(drops[i].element, deepest.element)) deepest = drops[i]; return deepest; }, isContained: function(element, drop) { var containmentNode; if(drop.tree) { containmentNode = element.treeNode; } else { containmentNode = element.parentNode; } return drop._containers.detect(function(c) { return containmentNode == c }); }, isAffected: function(point, element, drop) { return ( (drop.element!=element) && ((!drop._containers) || this.isContained(element, drop)) && ((!drop.accept) || (Element.classNames(element).detect( function(v) { return drop.accept.include(v) } ) )) && Position.within(drop.element, point[0], point[1]) ); }, deactivate: function(drop) { if(drop.hoverclass) Element.removeClassName(drop.element, drop.hoverclass); this.last_active = null; }, activate: function(drop) { if(drop.hoverclass) Element.addClassName(drop.element, drop.hoverclass); this.last_active = drop; }, show: function(point, element) { if(!this.drops.length) return; var affected = []; if(this.last_active) this.deactivate(this.last_active); this.drops.each( function(drop) { if(Droppables.isAffected(point, element, drop)) affected.push(drop); }); if(affected.length>0) { drop = Droppables.findDeepestChild(affected); Position.within(drop.element, point[0], point[1]); if(drop.onHover) drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); Droppables.activate(drop); } }, fire: function(event, element) { if(!this.last_active) return; Position.prepare(); if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) if (this.last_active.onDrop) this.last_active.onDrop(element, this.last_active.element, event); }, reset: function() { if(this.last_active) this.deactivate(this.last_active); } } var Draggables = { drags: [], observers: [], register: function(draggable) { if(this.drags.length == 0) { this.eventMouseUp = this.endDrag.bindAsEventListener(this); this.eventMouseMove = this.updateDrag.bindAsEventListener(this); this.eventKeypress = this.keyPress.bindAsEventListener(this); Event.observe(document, "mouseup", this.eventMouseUp); Event.observe(document, "mousemove", this.eventMouseMove); Event.observe(document, "keypress", this.eventKeypress); } this.drags.push(draggable); }, unregister: function(draggable) { this.drags = this.drags.reject(function(d) { return d==draggable }); if(this.drags.length == 0) { Event.stopObserving(document, "mouseup", this.eventMouseUp); Event.stopObserving(document, "mousemove", this.eventMouseMove); Event.stopObserving(document, "keypress", this.eventKeypress); } }, activate: function(draggable) { if(draggable.options.delay) { this._timeout = setTimeout(function() { Draggables._timeout = null; window.focus(); Draggables.activeDraggable = draggable; }.bind(this), draggable.options.delay); } else { window.focus(); // allows keypress events if window isn't currently focused, fails for Safari this.activeDraggable = draggable; } }, deactivate: function() { this.activeDraggable = null; }, updateDrag: function(event) { if(!this.activeDraggable) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; // Mozilla-based browsers fire successive mousemove events with // the same coordinates, prevent needless redrawing (moz bug?) if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; this._lastPointer = pointer; this.activeDraggable.updateDrag(event, pointer); }, endDrag: function(event) { if(this._timeout) { clearTimeout(this._timeout); this._timeout = null; } if(!this.activeDraggable) return; this._lastPointer = null; this.activeDraggable.endDrag(event); this.activeDraggable = null; }, keyPress: function(event) { if(this.activeDraggable) this.activeDraggable.keyPress(event); }, addObserver: function(observer) { this.observers.push(observer); this._cacheObserverCallbacks(); }, removeObserver: function(element) { // element instead of observer fixes mem leaks this.observers = this.observers.reject( function(o) { return o.element==element }); this._cacheObserverCallbacks(); }, notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' if(this[eventName+'Count'] > 0) this.observers.each( function(o) { if(o[eventName]) o[eventName](eventName, draggable, event); }); if(draggable.options[eventName]) draggable.options[eventName](draggable, event); }, _cacheObserverCallbacks: function() { ['onStart','onEnd','onDrag'].each( function(eventName) { Draggables[eventName+'Count'] = Draggables.observers.select( function(o) { return o[eventName]; } ).length; }); } } /*--------------------------------------------------------------------------*/ var Draggable = Class.create(); Draggable._dragging = {}; Draggable.prototype = { initialize: function(element) { var defaults = { handle: false, reverteffect: function(element, top_offset, left_offset) { var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, queue: {scope:'_draggable', position:'end'} }); }, endeffect: function(element) { var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0; new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, queue: {scope:'_draggable', position:'end'}, afterFinish: function(){ Draggable._dragging[element] = false } }); }, zindex: 1000, revert: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } delay: 0 }; if(!arguments[1] || typeof arguments[1].endeffect == 'undefined') Object.extend(defaults, { starteffect: function(element) { element._opacity = Element.getOpacity(element); Draggable._dragging[element] = true; new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); } }); var options = Object.extend(defaults, arguments[1] || {}); this.element = $(element); if(options.handle && (typeof options.handle == 'string')) this.handle = this.element.down('.'+options.handle, 0); if(!this.handle) this.handle = $(options.handle); if(!this.handle) this.handle = this.element; if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { options.scroll = $(options.scroll); this._isScrollChild = Element.childOf(this.element, options.scroll); } Element.makePositioned(this.element); // fix IE this.delta = this.currentDelta(); this.options = options; this.dragging = false; this.eventMouseDown = this.initDrag.bindAsEventListener(this); Event.observe(this.handle, "mousedown", this.eventMouseDown); Draggables.register(this); }, destroy: function() { Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); Draggables.unregister(this); }, currentDelta: function() { return([ parseInt(Element.getStyle(this.element,'left') || '0'), parseInt(Element.getStyle(this.element,'top') || '0')]); }, initDrag: function(event) { if(typeof Draggable._dragging[this.element] != 'undefined' && Draggable._dragging[this.element]) return; if(Event.isLeftClick(event)) { // abort on form elements, fixes a Firefox issue var src = Event.element(event); if(src.tagName && ( src.tagName=='INPUT' || src.tagName=='SELECT' || src.tagName=='OPTION' || src.tagName=='BUTTON' || src.tagName=='TEXTAREA')) return; var pointer = [Event.pointerX(event), Event.pointerY(event)]; var pos = Position.cumulativeOffset(this.element); this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); Draggables.activate(this); Event.stop(event); } }, startDrag: function(event) { this.dragging = true; if(this.options.zindex) { this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); this.element.style.zIndex = this.options.zindex; } if(this.options.ghosting) { this._clone = this.element.cloneNode(true); Position.absolutize(this.element); this.element.parentNode.insertBefore(this._clone, this.element); } if(this.options.scroll) { if (this.options.scroll == window) { var where = this._getWindowScroll(this.options.scroll); this.originalScrollLeft = where.left; this.originalScrollTop = where.top; } else { this.originalScrollLeft = this.options.scroll.scrollLeft; this.originalScrollTop = this.options.scroll.scrollTop; } } Draggables.notify('onStart', this, event); if(this.options.starteffect) this.options.starteffect(this.element); }, updateDrag: function(event, pointer) { if(!this.dragging) this.startDrag(event); Position.prepare(); Droppables.show(pointer, this.element); Draggables.notify('onDrag', this, event); this.draw(pointer); if(this.options.change) this.options.change(this); if(this.options.scroll) { this.stopScrolling(); var p; if (this.options.scroll == window) { with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } } else { p = Position.page(this.options.scroll); p[0] += this.options.scroll.scrollLeft + Position.deltaX; p[1] += this.options.scroll.scrollTop + Position.deltaY; p.push(p[0]+this.options.scroll.offsetWidth); p.push(p[1]+this.options.scroll.offsetHeight); } var speed = [0,0]; if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); this.startScrolling(speed); } // fix AppleWebKit rendering if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); Event.stop(event); }, finishDrag: function(event, success) { this.dragging = false; if(this.options.ghosting) { Position.relativize(this.element); Element.remove(this._clone); this._clone = null; } if(success) Droppables.fire(event, this.element); Draggables.notify('onEnd', this, event); var revert = this.options.revert; if(revert && typeof revert == 'function') revert = revert(this.element); var d = this.currentDelta(); if(revert && this.options.reverteffect) { this.options.reverteffect(this.element, d[1]-this.delta[1], d[0]-this.delta[0]); } else { this.delta = d; } if(this.options.zindex) this.element.style.zIndex = this.originalZ; if(this.options.endeffect) this.options.endeffect(this.element); Draggables.deactivate(this); Droppables.reset(); }, keyPress: function(event) { if(event.keyCode!=Event.KEY_ESC) return; this.finishDrag(event, false); Event.stop(event); }, endDrag: function(event) { if(!this.dragging) return; this.stopScrolling(); this.finishDrag(event, true); Event.stop(event); }, draw: function(point) { var pos = Position.cumulativeOffset(this.element); if(this.options.ghosting) { var r = Position.realOffset(this.element); pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; } var d = this.currentDelta(); pos[0] -= d[0]; pos[1] -= d[1]; if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; } var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this)); if(this.options.snap) { if(typeof this.options.snap == 'function') { p = this.options.snap(p[0],p[1],this); } else { if(this.options.snap instanceof Array) { p = p.map( function(v, i) { return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) } else { p = p.map( function(v) { return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) } }} var style = this.element.style; if((!this.options.constraint) || (this.options.constraint=='horizontal')) style.left = p[0] + "px"; if((!this.options.constraint) || (this.options.constraint=='vertical')) style.top = p[1] + "px"; if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering }, stopScrolling: function() { if(this.scrollInterval) { clearInterval(this.scrollInterval); this.scrollInterval = null; Draggables._lastScrollPointer = null; } }, startScrolling: function(speed) { if(!(speed[0] || speed[1])) return; this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; this.lastScrolled = new Date(); this.scrollInterval = setInterval(this.scroll.bind(this), 10); }, scroll: function() { var current = new Date(); var delta = current - this.lastScrolled; this.lastScrolled = current; if(this.options.scroll == window) { with (this._getWindowScroll(this.options.scroll)) { if (this.scrollSpeed[0] || this.scrollSpeed[1]) { var d = delta / 1000; this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); } } } else { this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; } Position.prepare(); Droppables.show(Draggables._lastPointer, this.element); Draggables.notify('onDrag', this); if (this._isScrollChild) { Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; if (Draggables._lastScrollPointer[0] < 0) Draggables._lastScrollPointer[0] = 0; if (Draggables._lastScrollPointer[1] < 0) Draggables._lastScrollPointer[1] = 0; this.draw(Draggables._lastScrollPointer); } if(this.options.change) this.options.change(this); }, _getWindowScroll: function(w) { var T, L, W, H; with (w.document) { if (w.document.documentElement && documentElement.scrollTop) { T = documentElement.scrollTop; L = documentElement.scrollLeft; } else if (w.document.body) { T = body.scrollTop; L = body.scrollLeft; } if (w.innerWidth) { W = w.innerWidth; H = w.innerHeight; } else if (w.document.documentElement && documentElement.clientWidth) { W = documentElement.clientWidth; H = documentElement.clientHeight; } else { W = body.offsetWidth; H = body.offsetHeight } } return { top: T, left: L, width: W, height: H }; } } /*--------------------------------------------------------------------------*/ var SortableObserver = Class.create(); SortableObserver.prototype = { initialize: function(element, observer) { this.element = $(element); this.observer = observer; this.lastValue = Sortable.serialize(this.element); }, onStart: function() { this.lastValue = Sortable.serialize(this.element); }, onEnd: function() { Sortable.unmark(); if(this.lastValue != Sortable.serialize(this.element)) this.observer(this.element) } } var Sortable = { SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, sortables: {}, _findRootElement: function(element) { while (element.tagName != "BODY") { if(element.id && Sortable.sortables[element.id]) return element; element = element.parentNode; } }, options: function(element) { element = Sortable._findRootElement($(element)); if(!element) return; return Sortable.sortables[element.id]; }, destroy: function(element){ var s = Sortable.options(element); if(s) { Draggables.removeObserver(s.element); s.droppables.each(function(d){ Droppables.remove(d) }); s.draggables.invoke('destroy'); delete Sortable.sortables[s.element.id]; } }, create: function(element) { element = $(element); var options = Object.extend({ element: element, tag: 'li', // assumes li children, override with tag: 'tagname' dropOnEmpty: false, tree: false, treeTag: 'ul', overlap: 'vertical', // one of 'vertical', 'horizontal' constraint: 'vertical', // one of 'vertical', 'horizontal', false containment: element, // also takes array of elements (or id's); or false handle: false, // or a CSS class only: false, delay: 0, hoverclass: null, ghosting: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, format: this.SERIALIZE_RULE, onChange: Prototype.emptyFunction, onUpdate: Prototype.emptyFunction }, arguments[1] || {}); // clear any old sortable with same element this.destroy(element); // build options for the draggables var options_for_draggable = { revert: true, scroll: options.scroll, scrollSpeed: options.scrollSpeed, scrollSensitivity: options.scrollSensitivity, delay: options.delay, ghosting: options.ghosting, constraint: options.constraint, handle: options.handle }; if(options.starteffect) options_for_draggable.starteffect = options.starteffect; if(options.reverteffect) options_for_draggable.reverteffect = options.reverteffect; else if(options.ghosting) options_for_draggable.reverteffect = function(element) { element.style.top = 0; element.style.left = 0; }; if(options.endeffect) options_for_draggable.endeffect = options.endeffect; if(options.zindex) options_for_draggable.zindex = options.zindex; // build options for the droppables var options_for_droppable = { overlap: options.overlap, containment: options.containment, tree: options.tree, hoverclass: options.hoverclass, onHover: Sortable.onHover } var options_for_tree = { onHover: Sortable.onEmptyHover, overlap: options.overlap, containment: options.containment, hoverclass: options.hoverclass } // fix for gecko engine Element.cleanWhitespace(element); options.draggables = []; options.droppables = []; // drop on empty handling if(options.dropOnEmpty || options.tree) { Droppables.add(element, options_for_tree); options.droppables.push(element); } (this.findElements(element, options) || []).each( function(e) { // handles are per-draggable var handle = options.handle ? $(e).down('.'+options.handle,0) : e; options.draggables.push( new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); Droppables.add(e, options_for_droppable); if(options.tree) e.treeNode = element; options.droppables.push(e); }); if(options.tree) { (Sortable.findTreeElements(element, options) || []).each( function(e) { Droppables.add(e, options_for_tree); e.treeNode = element; options.droppables.push(e); }); } // keep reference this.sortables[element.id] = options; // for onupdate Draggables.addObserver(new SortableObserver(element, options.onUpdate)); }, // return all suitable-for-sortable elements in a guaranteed order findElements: function(element, options) { return Element.findChildren( element, options.only, options.tree ? true : false, options.tag); }, findTreeElements: function(element, options) { return Element.findChildren( element, options.only, options.tree ? true : false, options.treeTag); }, onHover: function(element, dropon, overlap) { if(Element.isParent(dropon, element)) return; if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { return; } else if(overlap>0.5) { Sortable.mark(dropon, 'before'); if(dropon.previousSibling != element) { var oldParentNode = element.parentNode; element.style.visibility = "hidden"; // fix gecko rendering dropon.parentNode.insertBefore(element, dropon); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } } else { Sortable.mark(dropon, 'after'); var nextElement = dropon.nextSibling || null; if(nextElement != element) { var oldParentNode = element.parentNode; element.style.visibility = "hidden"; // fix gecko rendering dropon.parentNode.insertBefore(element, nextElement); if(dropon.parentNode!=oldParentNode) Sortable.options(oldParentNode).onChange(element); Sortable.options(dropon.parentNode).onChange(element); } } }, onEmptyHover: function(element, dropon, overlap) { var oldParentNode = element.parentNode; var droponOptions = Sortable.options(dropon); if(!Element.isParent(dropon, element)) { var index; var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); var child = null; if(children) { var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); for (index = 0; index < children.length; index += 1) { if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { offset -= Element.offsetSize (children[index], droponOptions.overlap); } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { child = index + 1 < children.length ? children[index + 1] : null; break; } else { child = children[index]; break; } } } dropon.insertBefore(element, child); Sortable.options(oldParentNode).onChange(element); droponOptions.onChange(element); } }, unmark: function() { if(Sortable._marker) Sortable._marker.hide(); }, mark: function(dropon, position) { // mark on ghosting only var sortable = Sortable.options(dropon.parentNode); if(sortable && !sortable.ghosting) return; if(!Sortable._marker) { Sortable._marker = ($('dropmarker') || Element.extend(document.createElement('DIV'))). hide().addClassName('dropmarker').setStyle({position:'absolute'}); document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); } var offsets = Position.cumulativeOffset(dropon); Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); if(position=='after') if(sortable.overlap == 'horizontal') Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); else Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); Sortable._marker.show(); }, _tree: function(element, options, parent) { var children = Sortable.findElements(element, options) || []; for (var i = 0; i < children.length; ++i) { var match = children[i].id.match(options.format); if (!match) continue; var child = { id: encodeURIComponent(match ? match[1] : null), element: element, parent: parent, children: [], position: parent.children.length, container: $(children[i]).down(options.treeTag) } /* Get the element containing the children and recurse over it */ if (child.container) this._tree(child.container, options, child) parent.children.push (child); } return parent; }, tree: function(element) { element = $(element); var sortableOptions = this.options(element); var options = Object.extend({ tag: sortableOptions.tag, treeTag: sortableOptions.treeTag, only: sortableOptions.only, name: element.id, format: sortableOptions.format }, arguments[1] || {}); var root = { id: null, parent: null, children: [], container: element, position: 0 } return Sortable._tree(element, options, root); }, /* Construct a [i] index for a particular node */ _constructIndex: function(node) { var index = ''; do { if (node.id) index = '[' + node.position + ']' + index; } while ((node = node.parent) != null); return index; }, sequence: function(element) { element = $(element); var options = Object.extend(this.options(element), arguments[1] || {}); return $(this.findElements(element, options) || []).map( function(item) { return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; }); }, setSequence: function(element, new_sequence) { element = $(element); var options = Object.extend(this.options(element), arguments[2] || {}); var nodeMap = {}; this.findElements(element, options).each( function(n) { if (n.id.match(options.format)) nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; n.parentNode.removeChild(n); }); new_sequence.each(function(ident) { var n = nodeMap[ident]; if (n) { n[1].appendChild(n[0]); delete nodeMap[ident]; } }); }, serialize: function(element) { element = $(element); var options = Object.extend(Sortable.options(element), arguments[1] || {}); var name = encodeURIComponent( (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); if (options.tree) { return Sortable.tree(element, arguments[1]).children.map( function (item) { return [name + Sortable._constructIndex(item) + "[id]=" + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); }).flatten().join('&'); } else { return Sortable.sequence(element, arguments[1]).map( function(item) { return name + "[]=" + encodeURIComponent(item); }).join('&'); } } } // Returns true if child is contained within element Element.isParent = function(child, element) { if (!child.parentNode || child == element) return false; if (child.parentNode == element) return true; return Element.isParent(child.parentNode, element); } Element.findChildren = function(element, only, recursive, tagName) { if(!element.hasChildNodes()) return null; tagName = tagName.toUpperCase(); if(only) only = [only].flatten(); var elements = []; $A(element.childNodes).each( function(e) { if(e.tagName && e.tagName.toUpperCase()==tagName && (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) elements.push(e); if(recursive) { var grandchildren = Element.findChildren(e, only, recursive, tagName); if(grandchildren) elements.push(grandchildren); } }); return (elements.length>0 ? elements.flatten() : []); } Element.offsetSize = function (element, type) { return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; } Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Shttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/dragdrop.js./01X$classesZ$classname12UNSURLXNSObject#A6Vp 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=149Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTU30619_"5964373-779b-46b4ab8d"_Sat, 04 Aug 2007 16:38:37 GMT./_``a2_NSMutableDictionary\NSDictionaryw./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  bgp{~ -2=K`f:@ZzgDE%F_Shttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/lightbox.jsOT// ----------------------------------------------------------------------------------- // // Lightbox v2.02 // by Lokesh Dhakar - http://www.huddletogether.com // 3/31/06 // // For more information on this script, visit: // http://huddletogether.com/projects/lightbox2/ // // Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ // // Credit also due to those who have helped, inspired, and made their code available to the public. // Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.org), Thomas Fuchs(mir.aculo.us), and others. // // // ----------------------------------------------------------------------------------- /* Table of Contents ----------------- Configuration Global Variables Extending Built-in Objects - Object.extend(Element) - Array.prototype.removeDuplicates() - Array.prototype.empty() Lightbox Class Declaration - initialize() - start() - changeImage() - resizeImageContainer() - showImage() - updateDetails() - updateNav() - enableKeyboardNav() - disableKeyboardNav() - keyboardAction() - preloadNeighborImages() - end() Miscellaneous Functions - getPageScroll() - getPageSize() - getKey() - listenKey() - showSelectBoxes() - hideSelectBoxes() - pause() - initLightbox() Function Calls - addLoadEvent(initLightbox) */ // ----------------------------------------------------------------------------------- // // Configuration // // var fileLoadingImage = "images/loading.gif"; // var fileBottomNavCloseImage = "images/closelabel.gif"; var resizeSpeed = 7; // controls the speed of the image resizing (1=slowest and 10=fastest) var borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable // ----------------------------------------------------------------------------------- // // Global Variables // var imageArray = new Array; var activeImage; if(resizeSpeed > 10){ resizeSpeed = 10;} if(resizeSpeed < 1){ resizeSpeed = 1;} resizeDuration = (11 - resizeSpeed) * 0.15; // ----------------------------------------------------------------------------------- // // Additional methods for Element added by SU, Couloir // - further additions by Lokesh Dhakar (huddletogether.com) // Object.extend(Element, { getWidth: function(element) { element = $(element); return element.offsetWidth; }, setWidth: function(element,w) { element = $(element); element.style.width = w +"px"; }, setHeight: function(element,h) { element = $(element); element.style.height = h +"px"; }, setTop: function(element,t) { element = $(element); element.style.top = t +"px"; }, setSrc: function(element,src) { element = $(element); element.src = src; }, setHref: function(element,href) { element = $(element); element.href = href; }, setInnerHTML: function(element,content) { element = $(element); element.innerHTML = content; } }); // ----------------------------------------------------------------------------------- // // Extending built-in Array object // - array.removeDuplicates() // - array.empty() // Array.prototype.removeDuplicates = function () { for(i = 1; i < this.length; i++){ if(this[i][0] == this[i-1][0]){ this.splice(i,1); } } } // ----------------------------------------------------------------------------------- Array.prototype.empty = function () { for(i = 0; i <= this.length; i++){ this.shift(); } } // ----------------------------------------------------------------------------------- // // Lightbox Class Declaration // - initialize() // - start() // - changeImage() // - resizeImageContainer() // - showImage() // - updateDetails() // - updateNav() // - enableKeyboardNav() // - disableKeyboardNav() // - keyboardNavAction() // - preloadNeighborImages() // - end() // // Structuring of code inspired by Scott Upton (http://www.uptonic.com/) // var Lightbox = Class.create(); Lightbox.prototype = { // initialize() // Constructor runs on completion of the DOM loading. Loops through anchor tags looking for // 'lightbox' references and applies onclick events to appropriate links. The 2nd section of // the function inserts html at the bottom of the page which is used to display the shadow // overlay and the image container. // initialize: function() { if (!document.getElementsByTagName){ return; } var anchors = document.getElementsByTagName('a'); // loop through all anchor tags for (var i=0; i // var objBody = document.getElementsByTagName("body").item(0); var objOverlay = document.createElement("div"); objOverlay.setAttribute('id','overlay'); objOverlay.style.display = 'none'; objOverlay.onclick = function() { myLightbox.end(); return false; } objBody.appendChild(objOverlay); var objLightbox = document.createElement("div"); objLightbox.setAttribute('id','lightbox'); objLightbox.style.display = 'none'; objBody.appendChild(objLightbox); var objOuterImageContainer = document.createElement("div"); objOuterImageContainer.setAttribute('id','outerImageContainer'); objLightbox.appendChild(objOuterImageContainer); var objImageContainer = document.createElement("div"); objImageContainer.setAttribute('id','imageContainer'); objOuterImageContainer.appendChild(objImageContainer); var objLightboxImage = document.createElement("img"); objLightboxImage.setAttribute('id','lightboxImage'); objImageContainer.appendChild(objLightboxImage); var objHoverNav = document.createElement("div"); objHoverNav.setAttribute('id','hoverNav'); objImageContainer.appendChild(objHoverNav); var objPrevLink = document.createElement("a"); objPrevLink.setAttribute('id','prevLink'); objPrevLink.setAttribute('href','#'); objHoverNav.appendChild(objPrevLink); var objNextLink = document.createElement("a"); objNextLink.setAttribute('id','nextLink'); objNextLink.setAttribute('href','#'); objHoverNav.appendChild(objNextLink); var objLoading = document.createElement("div"); objLoading.setAttribute('id','loading'); objImageContainer.appendChild(objLoading); var objLoadingLink = document.createElement("a"); objLoadingLink.setAttribute('id','loadingLink'); objLoadingLink.setAttribute('href','#'); objLoadingLink.onclick = function() { myLightbox.end(); return false; } objLoading.appendChild(objLoadingLink); var objLoadingImage = document.createElement("img"); objLoadingImage.setAttribute('src', fileLoadingImage); objLoadingLink.appendChild(objLoadingImage); var objImageDataContainer = document.createElement("div"); objImageDataContainer.setAttribute('id','imageDataContainer'); objImageDataContainer.className = 'clearfix'; objLightbox.appendChild(objImageDataContainer); var objImageData = document.createElement("div"); objImageData.setAttribute('id','imageData'); objImageDataContainer.appendChild(objImageData); var objImageDetails = document.createElement("div"); objImageDetails.setAttribute('id','imageDetails'); objImageData.appendChild(objImageDetails); var objCaption = document.createElement("span"); objCaption.setAttribute('id','caption'); objImageDetails.appendChild(objCaption); var objNumberDisplay = document.createElement("span"); objNumberDisplay.setAttribute('id','numberDisplay'); objImageDetails.appendChild(objNumberDisplay); var objBottomNav = document.createElement("div"); objBottomNav.setAttribute('id','bottomNav'); objImageData.appendChild(objBottomNav); var objBottomNavCloseLink = document.createElement("a"); objBottomNavCloseLink.setAttribute('id','bottomNavClose'); objBottomNavCloseLink.setAttribute('href','#'); objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; } objBottomNav.appendChild(objBottomNavCloseLink); var objBottomNavCloseImage = document.createElement("img"); objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage); objBottomNavCloseLink.appendChild(objBottomNavCloseImage); }, // // start() // Display overlay and lightbox. If image is part of a set, add siblings to imageArray. // start: function(imageLink) { hideSelectBoxes(); // stretch overlay to fill page and fade in var arrayPageSize = getPageSize(); Element.setHeight('overlay', arrayPageSize[1]); new Effect.Appear('overlay', { duration: 0.2, from: 0.0, to: 0.8 }); imageArray = []; imageNum = 0; if (!document.getElementsByTagName){ return; } var anchors = document.getElementsByTagName('a'); // if image is NOT part of a set.. if((imageLink.getAttribute('rel') == 'lightbox')){ // add single image to imageArray imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title'))); } else { // if image is part of a set.. // loop through anchors, find other images in set, and add them to imageArray for (var i=0; i 1){ number_display = "Image:"; current_image =eval(activeImage + 1); image_count = 0; for(var image_count = imageArray.length; image_count >= 1; image_count-- ) { var selected_link = ""; if(current_image == image_count) { selected_link = "style='text-decoration: underline;'"; } number_display += " "+(imageArray.length - image_count +1)+" "; } Element.show('numberDisplay'); Element.setInnerHTML( 'numberDisplay', number_display); // for(var image_count = 1; image_count <= imageArray.length; image_count++ ) { // document.getElementById("lightbox_image_link_"+image_count+"").onclick = // } } new Effect.Parallel( [ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration + 0.25, from: 0.0, to: 1.0 }), new Effect.Appear('imageDataContainer', { sync: true, duration: 1.0 }) ], { duration: 0.65, afterFinish: function() { myLightbox.updateNav();} } ); }, // // updateNav() // Display appropriate previous and next hover navigation. // updateNav: function() { Element.show('hoverNav'); // if not first image in set, display prev image button if(activeImage != 0){ Element.show('prevLink'); document.getElementById('prevLink').onclick = function() { myLightbox.changeImage(activeImage - 1); return false; } } // if not last image in set, display next image button if(activeImage != (imageArray.length - 1)){ Element.show('nextLink'); document.getElementById('nextLink').onclick = function() { myLightbox.changeImage(activeImage + 1); return false; } } this.enableKeyboardNav(); }, // // enableKeyboardNav() // enableKeyboardNav: function() { document.onkeydown = this.keyboardAction; }, // // disableKeyboardNav() // disableKeyboardNav: function() { document.onkeydown = ''; }, // // keyboardAction() // keyboardAction: function(e) { if (e == null) { // ie keycode = event.keyCode; } else { // mozilla keycode = e.which; } key = String.fromCharCode(keycode).toLowerCase(); if((key == 'x') || (key == 'o') || (key == 'c')){ // close lightbox myLightbox.end(); } else if(key == 'p'){ // display previous image if(activeImage != 0){ myLightbox.disableKeyboardNav(); myLightbox.changeImage(activeImage - 1); } } else if(key == 'n'){ // display next image if(activeImage != (imageArray.length - 1)){ myLightbox.disableKeyboardNav(); myLightbox.changeImage(activeImage + 1); } } }, // // preloadNeighborImages() // Preload previous and next images. // preloadNeighborImages: function(){ if((imageArray.length - 1) > activeImage){ preloadNextImage = new Image(); preloadNextImage.src = imageArray[activeImage + 1][0]; } if(activeImage > 0){ preloadPrevImage = new Image(); preloadPrevImage.src = imageArray[activeImage - 1][0]; } }, // // end() // end: function() { this.disableKeyboardNav(); Element.hide('lightbox'); new Effect.Fade('overlay', { duration: 0.2}); showSelectBoxes(); } } // ----------------------------------------------------------------------------------- // // getPageScroll() // Returns array with x,y page scroll values. // Core code from - quirksmode.org // function getPageScroll(){ var yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict yScroll = document.documentElement.scrollTop; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; } arrayPageScroll = new Array('',yScroll) return arrayPageScroll; } // ----------------------------------------------------------------------------------- // // getPageSize() // Returns array with page width, height and window width, height // Core code from - quirksmode.org // Edit for Firefox by pHaez // function getPageSize(){ var xScroll, yScroll; if (window.innerHeight && window.scrollMaxY) { xScroll = document.body.scrollWidth; yScroll = window.innerHeight + window.scrollMaxY; } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac xScroll = document.body.scrollWidth; yScroll = document.body.scrollHeight; } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari xScroll = document.body.offsetWidth; yScroll = document.body.offsetHeight; } var windowWidth, windowHeight; if (self.innerHeight) { // all except Explorer windowWidth = self.innerWidth; windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowWidth = document.documentElement.clientWidth; windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowWidth = document.body.clientWidth; windowHeight = document.body.clientHeight; } // for small pages with total height less then height of the viewport if(yScroll < windowHeight){ pageHeight = windowHeight; } else { pageHeight = yScroll; } // for small pages with total width less then width of the viewport if(xScroll < windowWidth){ pageWidth = windowWidth; } else { pageWidth = xScroll; } arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) return arrayPageSize; } // ----------------------------------------------------------------------------------- // // getKey(key) // Gets keycode. If 'x' is pressed then it hides the lightbox. // function getKey(e){ if (e == null) { // ie keycode = event.keyCode; } else { // mozilla keycode = e.which; } key = String.fromCharCode(keycode).toLowerCase(); if(key == 'x'){ } } // ----------------------------------------------------------------------------------- // // listenKey() // function listenKey () { document.onkeypress = getKey; } // --------------------------------------------------- function showSelectBoxes(){ selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "visible"; } } // --------------------------------------------------- function hideSelectBoxes(){ selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "hidden"; } } // --------------------------------------------------- // // pause(numberMillis) // Pauses code execution for specified time. Uses busy code, not good. // Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602 // function pause(numberMillis) { var now = new Date(); var exitTime = now.getTime() + numberMillis; while (true) { now = new Date(); if (now.getTime() > exitTime) return; } } // --------------------------------------------------- function initLightbox() { myLightbox = new Lightbox(); } Event.observe(window, 'load', initLightbox, false);Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Shttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/js/lightbox.js./01X$classesZ$classname12UNSURLXNSObject#A6my 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=147Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:28 GMTU21508_"5964375-5404-46b4ab90"_Sat, 04 Aug 2007 16:38:40 GMT./_``a2_NSMutableDictionary\NSDictionaryT./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  bgp{~ -2=K`f:@ZzgHI%J_Lhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/user.jsOvar testsuccess = 0; var lnid = new Array(); function categorylist(url) { self.location = url; } var getresults=function(results) { if(window.drag_and_drop_cart_updater) { drag_and_drop_cart_updater(); } if(document.getElementById('shoppingcartcontents') != null) { document.getElementById('shoppingcartcontents').innerHTML = results; } if(document.getElementById('loadingimage') != null) { document.getElementById('loadingindicator').style.visibility = 'hidden'; } else if(document.getElementById('alt_loadingimage') != null) { document.getElementById('alt_loadingindicator').style.visibility = 'hidden'; } } function submitform(frm) { //alert(ajax.serialize(frm)); ajax.post("index.php?ajax=true&user=true",getresults,ajax.serialize(frm)); if(document.getElementById('loadingimage') != null) { document.getElementById('loadingimage').src = base_url+'/wp-content/plugins/wp-shopping-cart/images/indicator.gif'; document.getElementById('loadingindicator').style.visibility = 'visible'; } else if(document.getElementById('alt_loadingimage') != null) { document.getElementById('alt_loadingimage').src = base_url+'/wp-content/plugins/wp-shopping-cart/images/indicator.gif'; document.getElementById('alt_loadingindicator').style.visibility = 'visible'; } return false; } function emptycart() { ajax.post("index.php",getresults,"ajax=true&user=true&emptycart=true"); if(document.getElementById('loadingimage') != null) { document.getElementById('loadingimage').src = base_url+'/wp-content/plugins/wp-shopping-cart/images/indicator.gif'; document.getElementById('loadingindicator').style.visibility = 'visible'; } else if(document.getElementById('alt_loadingimage') != null) { document.getElementById('alt_loadingimage').src = base_url+'/wp-content/plugins/wp-shopping-cart/images/indicator.gif'; document.getElementById('alt_loadingindicator').style.visibility = 'visible'; } } function show_additional_description(id,image_id) { currentstate = document.getElementById(id).style.display; //document.getElementById(id).style.display = 'inline'; if(currentstate != 'inline') { document.getElementById(id).style.display = 'inline'; document.getElementById(image_id).src = base_url+'/wp-content/plugins/wp-shopping-cart/images/icon_window_collapse.gif'; } else { document.getElementById(id).style.display = 'none'; document.getElementById(image_id).src = base_url+'/wp-content/plugins/wp-shopping-cart/images/icon_window_expand.gif'; } return false; } function prodgroupswitch(state) { if(state == 'brands') { document.getElementById('categorydisplay').style.display = 'none'; document.getElementById('branddisplay').style.display = 'block'; } else if(state == 'categories') { document.getElementById('branddisplay').style.display = 'none'; document.getElementById('categorydisplay').style.display = 'block'; } return false; } var previous_rating; function ie_rating_rollover(id,state) { target_element = document.getElementById(id); switch(state) { case 1: previous_rating = target_element.style.background; target_element.style.background = "url("+base_url+"/wp-content/plugins/wp-shopping-cart/images/blue-star.gif)"; break; default: if(target_element.style.background != "url("+base_url+"/wp-content/plugins/wp-shopping-cart/images/gold-star.gif)") { target_element.style.background = previous_rating; } break; } } var apply_rating=function(results) { outarr = results.split(","); //alert(results); for(i=1;i<=outarr[1];i++) { id = outarr[0]+"and"+i+"_link"; document.getElementById(id).style.background = "url("+base_url+"/wp-content/plugins/wp-shopping-cart/images/gold-star.gif)"; } for(i=5;i>outarr[1];i--) { id = outarr[0]+"and"+i+"_link"; document.getElementById(id).style.background = "#c4c4b8"; } lnid[outarr[0]] = 1; rating_id = 'rating_'+outarr[0]+'_text'; //alert(rating_id); if(document.getElementById(rating_id).innerHTML != "Your Rating:") { document.getElementById(rating_id).innerHTML = "Your Rating:"; } saved_id = 'saved_'+outarr[0]+'_text'; document.getElementById(saved_id).style.display = "inline"; update_vote_count(outarr[0]); } function hide_save_indicator(id) { document.getElementById(id).style.display = "none"; } function rate_item(prodid,rating) { ajax.post("index.php",apply_rating,"ajax=true&rate_item=true&product_id="+prodid+"&rating="+rating); } function update_vote_count(prodid) { var update_vote_count=function(results) { outarr = results.split(","); vote_count = outarr[0]; prodid = outarr[1]; vote_count_id = 'vote_total_'+prodid; document.getElementById(vote_count_id).innerHTML = vote_count; } ajax.post("index.php",update_vote_count,"ajax=true&get_rating_count=true&product_id="+prodid); } function submit_change_country() { document.forms.change_country.submit(); } function update_preview_url(prodid) { image_height = document.getElementById("image_height").value; image_width = document.getElementById("image_width").value; if(((image_height > 0) && (image_height <= 1024)) && ((image_width > 0) && (image_width <= 1024))) { new_url = "index.php?productid="+prodid+"&height="+image_height+"&width="+image_width+""; document.getElementById("preview_link").setAttribute('href',new_url); } else { new_url = "index.php?productid="+prodid+""; document.getElementById("preview_link").setAttribute('href',new_url); } return false; } function change_variation(product_id, variation_ids) { value_ids = ''; form_id = "product_"+product_id; for(var i in variation_ids) { if(!isNaN(parseInt(i))) { variation_name = "variation["+variation_ids[i]+"]"; value_ids += "&variation[]="+document.getElementById(form_id).elements[variation_name].value; } } var return_price=function(results) { //alert(results); eval(results); if(product_id != null) { target_id = "product_price_"+product_id; document.getElementById(target_id).firstChild.innerHTML = price; } } ajax.post("index.php",return_price,"ajax=true&get_updated_price=true&product_id="+product_id+value_ids); }Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\M]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Lhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/user.js./01X$classesZ$classname12UNSURLXNSObject#A68 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=146Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7a_application/x-javascript_Wed, 18 Aug 2010 15:34:29 GMTT6563_"596439d-19a3-46b4abb8"_Sat, 04 Aug 2007 16:39:20 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  [`itw}&+6DY_38Rrw{gLMNO_Bhttp://www.brattleboromuseum.org/event_images/20100116b-banner.jpgOyJFIFddDucky(Adobed     $$''$$53335;;;;;;;;;;  %% ## ((%%((22022;;;;;;;;;;"!1A"Qaq2B#Rb3rC񂒢$Sc1!A ?bc~o2 Q4 j]I [5 +n?º 芚1*ރne\(8訲A&^7~G\az֠91ܓr$?"]Y.`8W6Bnmc{kire1״j?Plj#&C[r*JDR Ȭw bRL0T4-%Z^<Y{5SgURQ*TA*TA*TAI pz(tt,B/bt6#Z_]lMz ;FL݄"q6J~1x1XZS<ݚ)@q;Ѽ+# ~+X'`cekP.DqŗH{^/ǥ '4kr:hzR( fthR7[q|EHMovuYs Oܶ"Ψoef!ؑ[e[Ypʼn ۶ʧ?"Ve(.cmD1<{ZrpA΃:$@Ey0 @/Gܶ{U*P#,* JaYib3`-kua'O5$_vr! ǎ@,6Ǩ M'b`m,ĉ6ǽ;K H:)w\CW\ mҬBTt ' UQVj8Ŕğ5Ԝi"d6*m1KUԠT]J KUԠ*TۋOEBuSR]lM(i ` wޛER%DjAR f;8ѵSm@ʤKz (Yl, -]t׭ =֓F(h hAzp{?* UԠj(%J(%JE!ź\\PJVjm`*b+Q*b+*PsUԠW`*ZUڥXUXWUUTuum{KUkXdx%Y8Ȇ¹_Ŏnj4 H *!g)as븬y +bkM1HL@f{0 V:ҿ&8&D&6 3>; +)QmfR7AI%?-peDKeďsIUuc<RU.)*B9_mad]1QuּqNRI!_ v: ̢DņP?[=;ԫ n0Ce%VKgF!@YmL9*呐oan.?UZ寧VgMÐrp)V[vnړs&$orL d]mK~JԨX45bPuukRN419B!I_jF>Uu( 0?YDwT\-&^b9`wR5~%a^0pK ]WEj֩C)`10ȖYv]f!.m{EG0pvSh܍3R or?ī\AV 1;hPvPouB.5%?}$M3cGvHJ\с#fB,ELyN<*Ch J"0`?iO~15R5^X Gj^(aWU,A]kp/#Hpn]]G J¼EYIl}*#PX6sE||rOʳɨuJC^4 kMo*V5\i+4ʖds릕.Ycg#_tN8O3!ď21 zޘr̕XF@athE#X}zUs5 f,6Z[`fH㠦<`,2]#M!;H2ggFJۍŗ"7\=th4_>bG,"BXz .ړ~jRcة?v@MDKHȣߵbߪ4E]tM})4$BHMsouzDgKv*H=z¼7udrY *KTZDRWRUPJfV 5t:LnèQִI9؛H'%?Ɵݐ=#NSA<*]Ad@:H\Rq jBΑ ~@ ǓL#\[^#vQO$pZzk f9b#pTѳ1{|{ֱ$xsuH 1'ao\"Lo}/AfӥLc`$kk]GVwAT }+_J1B5!nNU|zD"2Uڸącu;ަ|[>R'F{IuU'zh }|C8ē^H2@N ~ߡI~Q\QTǶ,?v(QR t5UD16o <8/P.H}oh13P?RI P*{lH+^?6uGpS.? [#]TjI"F}~Tq.tI` da7@BB1Z:SkXJWrs`n{)$!TjFC6ySpC6 믑h [ ޢ3bRu5dM;ēJN9t5ETUͮv3Ѩ) TFm)$M8MVx*ěϠC"В咽 N&9ŏǏ$[ܷKIRӾAԻ pCXC3 9dXt:%  0S!koY2ObsSEN@q׭7SɡYUԢ%J(RJ*UԠ(%KTA-V J [\.: f^7Vpذ.?^8]NV|=-JUE/*+Rt))bHI,cQnэ%IX$ES3`E˳75!ITj߅'"9ȱd$ lx?;VH.94Q\ 0BV[m*#/ brsb^,gBN#I:*on/nuHA1\!O:ש8ĞIA7^>9Ɗ]A.  }${/YLQ6 ~t= s$Gchb[WȒCV5-X n.u#"#W?Wk~T-nSqߕ": aj!hI7wRĵ%l *P_Ha,,'%H m-}*gA'0eq銋 'ĎhHtٖ2J3eQɍg ֋> iҲsR\p{l0:w5չ,U^TY<U_/Peˆ^'DJV#zhD\oyYr2 #_8ef2=/@'2mBrԇރ`U7q]K+J6 )4DgƛWs/{R;JPfΊUz_#`ter\]կZpX^Ӡ_/Dxk\cm?:dG"䝍 kaG^_ Zٵ?qFן|yyV=HP mWR? m,@!H.sJy3-V ~WY>+}-\뽯׬+h=%XF+mi8CȤJbxw]_LzJ*S/@ZI` 돯ք+w_,5 ڕ,w {5 /b2 ~;Ĝ@ʀm:饷ݚ@..;i\_)B$lr\r"#:ӍpU06R/BY$hNoN8?~wC1oR>2ze/lr/* ]X$#9@yUH FL'uۥj׆"$j-]?i\|Ss'j;(x7caʋ~~A lCPQЏmU\a<r R}:Wď́bA[}mko^ܩ][=)2'7$9֬)4wO `' ݧMvfv7 7O㯁6" 4VhmzH!S ~R\>4`$N,I:]4`|zINZb81WHCLq?%T\*._"(Z,"[v.m_xx8uΠ3܀lSv"%2r^Y-֥ewpzcﭛ_y  UQŖ.r,(B}4ތ,W,P%[E6TW x<LHAnWQq&syN޴zĦ5i8΀e4 OmU区Imu_ʦQGqu>W&-Ĝ2~}:VfN3V`- Pj&#Z5ۃ@4H`-hh.zmED0ECi/zlZ_jېJ/jd:tvb 3+\kqОc:e 37*Bzkk%H+5T5DŽy1yc\:G(^ l6(U yRY7X%ã{9vӏl RRyvZߪm+$9 E~`ƛ;*㉉جW6RSox0@AbHĕ(a4\,YW]k S񡋐)P m{LtVa}d/k/L2Fw,,2AapŬI3&FnMҺĬݞK-r(x|lN,?:r%2BP U?:U ^Gݑ#"zӟ6IJ Wok {innHT j f k WRT/Lc_:Y :\hNbR1^RI~[* r4ب+-#3PBu,.4jrYUaq usr!xX\9?RA>;d4qi|~=޷Ⓨ|AdMnr >oTk`קL6:])m&N<',+L%!I4Ǔ]:OYo# |<y\$.DePHЊ&0]$rHqKaz"&Eŭ{}h*TEJ*PJ*A:UUԠh*Uڃ*PxI="' H؏jߔKJ \ זk9!ō`HTk{Ү< jCxC\c^!yҐVf7TQŁ#D| q Kr78Qڦ.XFqs0cSD͕ȒᇧGz|o圤ŕ;nOq*IEr"٤gv#Ea|H.rW90NK6W%U #,]5bwH'/3,#TSQ},E>h?#;'+G_Ʀ|90%IcҮt6XitTWA Tk OMzy-dPq*1+_P+]c{R_gU<eZJ2Jnn[ jtoҭĄ+㊀MkLef㦟N+%#%&igycIxI/䌍fvPI cA W{]"at;z"Ue\s dJ!P]XlzVʨ8rq^;PJhS@0{)ei5'ɣ)їR 8² {\Q) ci[ *'X2XXG4,Dbtmр$Ǜ q=A A(I XF9~&Vq! pYuQJE~[dR&lTմ#+9؞)@lK&p:bF2:FA _nh `; @ dJоr¥9 4KЁVVvqP޹mnrlH1 P~KDFb|l{oeX4SHce׵N I[+.7xyklEtEf8 j W'&IB*;5AHeH|0 2"+ͬBV2 0+(4{@]NYWoJfE]Q#j D1}^D/Oׯ+F:1A'M5y%~C+Q|jƼ y3>ca^PȩĆV4*YDrY9#&ֽ!AZG??1bnj2m2=*+exp8*HR :ozօ"2$\w]hמU]*{ oޔcQIOC}HW1oDZ$XnZ9Y[&e Pv2h6[!6rMox!@cJȓ[uRN|KԉݯQt',r2ӰJqrݙ@F.oR}ߝ,xLǺ][.7&/55vLNuxKx+(xƮ.!dC_𫛍+NOanb\nXYqA A Y^ĩ.'^1ӧQ[T~Ek&=m 3p"6$ h8c 8r1ӽ7.:р<,2 ( '{"Qd R:X̊Lr"29bv"jK*`PI [*3ž2ۏ7[$ĮX1kQD0U7ݍ_>Fwv0&D$oVx%FHROMoqzSX e0ԁ)A]z G]=q9\@n/}ϥDU%>;;x\]UC/v /H?]тc2b%Qr;=rNiDI%fL[P~N TTegmrGup]reԎ(Z Hw]ksʍWs%Xok}kqd)1*@=G֊Yاg L^<|zOtV2X%Ly g/ZդR$H%RXeQ,K%{)ޭ<%[!oS[!(y%!(vυ8e*ٮ9$_EU e?oEQwwxB ]kyW .vhd?Ŗ[)1dd۽na"D/e}SmiLPg q9-Zo7e$[^SJMkB6M7)j@4Ri],t.KhVذ!#(;n۟e"=rTQ~,?¨| 6&mniMbN!33J-b ;GCǾͤkl}GoZE8Gbu+U*ԏ{SOĐIp,td0C2 Dˆ <1: ~$Sǝq;(Ԛ +"tKꮠ$NDPp{RUoP.3# 3x /kZixyU{_PS\.l#wc[HccmKU\6Sbhѧ+fy 0fsj %_ʇE$F;ݶnY 0W \~k-jF(ݳ,~DRK9{zt#^䤍Fd$rlVUX` M$Q` 2XcHKm($")aUi e'HJH!`̨'[69 qˊ5dL0p ;I2O4"]FGMM ʏ|XyFfqttƠ:ܺr;7g`%[iRqd+ Z91PV:S|?IgRpƻ|w3i.ls# nIG `b_".GyhwH7@օ*J PTJ RJ * ҃**J (,Y\HCZԠvk?h >A^ڼD\nnqx!k(jj[OZY~Wy:Ȭz{0ZS$.$XȥybHc%@X/N*ȑQ{#p *O%^ (hݥ cL4-xF&P9MUr$vlNVkN"A&Ap2<qQM!y݉*IRF#!ƦEOUB dպZO>vI[51S."R_00d1ŨiWAe+w㨏RG(L~O,f䩅d@nBI2,tR  (g DTr+!}A}wduc]o8r: hk1rEP!Ib)g/8h~#]SF,ݎ'p$o"<%jި|xVk.A8D GW$FEtՓu7AsW@? Oy&wGb2Bp M3 2b;u'VGieb.NRTڈq;Fֶ¥dcniZܛ UWFV<7fS_/1f!eU$@=_ZJ,hŎknk_(RXĖ[btr*PD0F`2j31bg {ڹRD F.y ]~ ionQ;7c9}mԋUYG7Z୿EmG!6d{̭:Ьk=9"m4/G~#Aq0ԙcȟu;9UNw@ʧEeQo؎>~Hr\ T<"D#]U;mmtfB9\{xRfSғeIe^#o*~݇+5).y8$_ ĝq՛aIV '.6Qz:3M~뭘U\^ @FeS1-Cklm_^5 [VbI#Y$2KgU[ZK\*̖I&Y@&elREpz]#m2scAM8Pl6+A2  @I :;[?8̊ijlV޵H{jJnBdbX͠ԏ4lIQM6V1/Ig("zEdXFlOږ7m[LVđ7*HT ufTi #LqR{uѷ$VЃte 9dw=o]7O+6e@\IWu+Pu6?dZ41;Qz8/!|M¹qP0خ: `qV/5ٶ1&X€N"ڄǥffKb`z㥾&xDCk5W(Hql|n xrsX__Zb,R兮IZk*Oح@@W(j 3G36m6:ۧi'ZWq LrRri *4e7aE k"{)~*ӤVM_ڎ/EHZ4"Df!¿kV/-گW8!ȃ%`lTXƑ(Z.pX뭪CR7Z^ZUJ h9FڀMؑ=(1˵ڸu,j,WKz[k;:z *\P_1jrmUe;C^gcM&`#i(AܫYUʹEppQrb& [ZZ̒L!xIe딍-PGbވ1H؈xDYYK,Lhr[]uxI1 ~Laf&Nc{"5^,M$exگzX09x kpVE[(fA㮔 XײF?TR՛,/XHPr<44"`nM醏!Ʋų)kdO[78y2ɫ* GUf8a"1?w]+<́XF@P9 qҀNGN$hT^.zb#&C#5}5umC˒=b5+}Է? X&Ų{}4;T&imEE E݈2whF Ω`q{-%zemBjG@(㫲RQ:Vqr9c'*ŋ`E?p:xZx극IG`W@@dme[J1UsVLݧQ/gŝ;82V6ɀNk[1)k C] &_nKp;&Gǩ( =v+OƳ7eq$wAc6Zg!%kT\ݝ܈;T8q2A: 1ae oi'eBw9)Q B]{mVpa푌c NzʭUņ`./ , XȫA-(OC&HGrH-DkD\wKg{0ai CrAf8FLQy C}.[CmlP"]"rv~f2'$8!$֜O1dp_=~¼:8#ьz Ԗ4wM{9ď ꭯N>jq/,H<} f0 0PcXjM馻KcR#|=)=i ]7꽽uV+Qo $[P_oG)1@JblMaXQH*k}%. CQZBds1Tk)urM U7r:@,ܡ9v@B׊rTq ^R,bEa֯>^<[޹]ǠmǵPں0pT_14TH ͯcoGp<>H0Ҫwze lKET6cXQ0F o!"J],7qFa2iBHtE[bw︢Es ߹vNZM݋ /o>\k;fNĎVPiB]XG0*F:CrQP3 8ԑ}0#fh5 "q }B/A2VGmmXÑ'ݑm^VO%v8\Bpo}Z1Nj1d*>*/M؛Y~h+ ;t^G!v 5V$Y:ȜYX ݬCrBҬJg>tR [/(KϏi8\bѸȩ#e*U/<> ?-y[,%ut?f6av؟Z3g&1[ eă֝o e0blcR~2̄(B_!{SόI_H.Qm`5#ҳU4𐑈`Gvނ*nLFݭ6+Ej2 jn Ҷ,%Xr \YWQr+ua>F#P~'[RghUL\qC/z<ʜrCP}[}MJ^ ,&CL;֯,LAv.u#2ɅAdYn3^HC Y/W}-?XV(u8 ^ f3a|tx|k[,Fm.tiS"crEIMC롭2I L^plV^oZx6X}N`j)E'XX؃m2EHSڃy"̨{N$zR..lZf^Dq*H9!#OZ,-%1&;P㜷9XXN$.+gZ1|t\u}rSXCňw[OJ/%FN4q$u޲X`aR#3|-mAx,ŐX6u=7~7dcQp6'M$FcziT"(~~I>:lvGezkp=5W7Z77נ޵Z6YV؀уE$&[7m{ҙbpJX1$ FݭY^~;і"KB8Z;ȥn5`2&@,Kq7z\Ҟw8|GIhd$F)م;_F . BUx\ #Mt`=T*fi%c&Ȍ0[D`Ks10ֽn,K l E&鱠<$ոEP/>B~W.)")9 x008˷ҺK\fI,Ze sXrⓏ7#Lb4j ض]Ƽ'm q론?{R2rVoq`먵<p"<<ɋ*o ,jNGԛJj6ֈ^U&Qz\EW2^Sҹsj UTUJ Thk}-_!PckU[!X#jq^'UFzTjQ*,7dȏ`R*jOAZANW$xطRt~>hPQ6f :240:GKlzX s\ȬKRBn kj/oY貥꫸_޶P]:)`ܞ@B#$S4q$ƭgQm9-͆r,fYdbvu#,]F^o{mX@Ѯ-8cX*XāPe`ڐ{ ʡQ "Y$=fYINE+9wȊ:6 {W}j/l+]EAEK;}:QxQ5e*4Q֬T3@IpM]u'x{Y_iXq@qx#ṕKiJ J׍yx$n"29jQZ9Le Q۬G}lii8A+,R8!pCX٣ qfAԓ弐rf -i~NxE*- րvɕʨh} N6>2*~{PǼ^BwF=mJ}J8V2EUȴRc,}j9,$V-]F ]hց7>7H?2lC}ЫkƍRp bغvm^hc!ܕ!{H67s:*H)m:v׳E[2mf{Ͳokf]IT_bv"fb `/6ּ|Dq;Ywվ/}mRM4Ƭݬ [렿H"#XQ*{_zW9{kb-afB>,?/.(P- :l=:J`'GX>/ae@r_r_umG;EXA*6x6Ihޔ#njAPalvޕ97)" Q-㕵*8uևN\\&@c%֐|5\9%8Je*K Ha-K9q1α# f,;`;C1FNC8l&Ҍ W[}&4,.QZUYBe}vJ~G5|R%INA 䰾KNϞ |gY 4 ߼ w^a"~LF!gylHfT&HN2aJykK_3|$1s@ߤJ4~ҬkrM>U kޕ6j*U{7fº4SszAU*^K,ڳ$oZbw7jUTu#Mj ;6 @-^Z^*zU?JPH ؍A-^I?!kkvU"]4|K̰g4d_FOzqbEEdx-A[)pݨuJ$!`pn7'S0<"(˜zYՅt.2?as)}dƛ)ӧ[eYqdSFx1MKsm P`<v#W=i,8 F!j-7!UN^Zr#$؀lu>L0f6c K++F rXQ߻}Wh@D}Ȋ̥*FD8e)j6d:}h~8<'&8 $CocE7H%CoGB&64eq'V7QcZrXx\c'm*+ñgG'sc1dQE*̓.Hv`M_ҙ`[g~K䠰LA.> v`]Ţw `m=C"L EX?mJ+dGw*5 JAAJ)9-؋Oư~=n@tִD@`JG-㺬k)'MzPq$uS(2I \yT(زRv5c"J2R\0#{+iK+R|G`@״@[iYwa9^Gd`H>~ё\n ǖi R")R{藺4 < +/z6qDFe,2OC^߉I{H@VѮF\#@hA:TdrENV!qe&гO6$|Ej $ >0A=͕ "&'CrZWR26lwcaw #C'W*M~B)T4rX:nu%nK#0*HI!,T1kdKkԫ#uP٨Łf׻}=+E@6l˓lFe&Civq$*`Xb-u؋PnC8K /e0' GŇ"8N~:bܩvΩs{ZuqĐ2M :Hp\2y 3uzU^ʌ5R%LD6IWB؝Ufp܎$LY뵕zIÑtn1ʲ*IT9ZdYe.%&.4Ӹ!Kn<]) |tFFĹ:mHoEF`rbHQ@_JZ&[:'a-W4+:I4kٷSw(Ơ2JhN/dHTBr^ 2,8Ȥc7/Ѕ^}Ć@#`{ZB6{II-U!FP\ڪ*wQ코N:G .Mltk-hjo1x߫[q)(6P{ї+Dl\P#ir|J7RTOٮC=2հ䬲=` D7TұUƋĝJKc/~밸 r(-G"'R %UG>ORNLCqI kƚLEͬX!I^Z]Ш*AFT [l(9njTᆕkY QUJTXv~*oΠܚO񨎺\ҽ#A y f, (>(É%%,n6oJ d >Q D`Ln)g!:Z6q8nGXb^?!eT$xʾ^A rQbu' IUvQbmօn3|G?- rO_ܐp67Ypm-YRyoȼIm>Jg>( 9ȓ 7.?-hq9}R=t4(cUIt!E0y/aM. <os# GHH29> u?5xI]X&-/\@bN:0*^ױfվ{KĐ:h8"7D|20orR.LEF|M~[T?np-lbOaD4&^7ukvVO ,Jqd2ğz*x|"؇C]ݽr2+xmzRp" \9Δ41"ni:(e -؈('=oO4V,@0mJx`8i]]92ɢצƥ$cb2+lHj:d\\-q¸|tV}H56q\sy$T"0{]?nLI%ڱ;s Z[kQp{ُx+S ห,H: 4ZE e=.Am5s6bĜigXI%dG~N$ȞC%c{U3^"sb@$ăk|G7kxC[W\ e^DobKiLn_1(ilcyMb@O9E M߷~|+;dzy4RED#&Q"p,XXzW5'(֐}4Ƞm}O3lj8*QkLXTsqu$-{:eJ#(ԕ\7d7UoZF"x{Rl2EळJ._$ܜ߮W"_$_aՖ2.ajl$-,w-sRW!ƢGP<`_T"qaqQXH8 K|9<S Q`{u֛§(e6~6[ "X|@a5\wď {H14I421k4z |dAV i99`JV^D1VuPTY|ŪCDoq!LNYqG$N 2SP.if c`y@q3㹾Gcm7 v"ݣ{F˪68 !f[wVm62J҅S|#jh9 f3wg%䓊7C1\~4G"!õknMJ.@i oo9u4&8V&[}jZ 1&H1.satˆ"18F=UW"uʸ4{UIw6\,FC5qas+ &E)`]U21dz2 L/ٰ:Y|̓G ~@rN~6XO )(ks2iȢD#1"hWkGaIs5l 4S*0lTb,~}LL2#|Fe lUEM'(2^ȱSj% 7*1qc]qXGPn͘WF2Uī[=M5(R$9 W1t-USL-ł$(\[! S.Sq_+V ?mO!i(>=cw'HdhZBN dw n|F~\h ?7\}]tP4Od QupV4!GQ p0!Fܩ/UX㍎,?p _Kk) &UUQzyqO$O ǡ uJ^G*^dIbC6ΊGf[\2Wn~3qWἊ'_\i"`GdK}\&F &<4]OX8s)bnyK_Gha|Ȓs-#Pk其mKNz6yYܞt3:V_!ƎxiĈv0%;-V鈵]L!h۶\QxQnCu{ YUz($4EYֻGqGX\ :7nOETΏΗ_Gl/mӭk+H9II6Z?# @y!㌓͊zx'#6g`-{}ތhe޽COp3̾JE's1 ̧cMZ2o"#4i }Y g㿼"ȐBsBGPJ|#&%v[ r2H]N&'&<]ʅݛ wHҺ9LR 4Cm-^޳x_Aʕn{[Ƈ&KqX59(Ĵ2Udh8w~koCf z[RpF!ti9$/_ny4^#"%6$ݶ]j51$Oo)/ʸg2v1('/}|rx_Y%?uޛd0F& ݟo=MY' Ǻӥ|TN$G1v#niI\^ (C1a s*Gp M2R=$;^V.K+I|xKP κ"d@t537AnP#O8$9]1ȣ׽k7$ *^u7Kk1+Ĩ΂x 80 ofz<ď7iYaU#CzI`Ůsx^,oj^B;]l}?rBG2%*Cq/8>\nE48DXH֟%F|H+u54 o,QAw]~<" (ne Lzϕ bF Dwe#$Rߧ[V$.'mc+nWV̂~/g)81,&<oA?! Uߘy&F!$3YS(l#ƍLy"H?Mt1{uȜC^Yo{!,(mτ$#2FCmpLK;'k_3QF huK]\ڬuַ}蘹j΅SvavT Z쯓l?*I"DRPab@*^r"&'BhA72@sȌ !!P@ $tWcE4yE}Ƞ@>2t˝Q\Āsg?39 F: vsn;{ ~bω#4S$lYWS袝L!!dQ":<4p4`Rݫ|nAO&ZQ܈%)Ar 8^o(Vv>c,WSE/"g 5 |bw_M1㶪H|eE*cZ@ H,aGR-҉`NqdICmѺ\a?gpbˢ2rpxRx, /+4—8G<|A ʦ7IΌ݅k-NeƦ>(5-x#Jd"9 _-XAQ8l*~n%2s$b;|xAʰVDFdKi~oyY4v#CJ*X0$:6M7zq9[3;FL5ՙeс>/7 (΀+*Q9"IOyeXyVԋ19,;["3 aYزu]}(_96]Ţ`6.p4KΪ" l{^ *U5Y#ʳ.Fڛh}yߖ2܀I,ō֩R \+BUH$t5*PmȐ,q4bOGANx|N/Fg(2/pJ*PiR+{7s$4af`I _oRd1֐im`7*udEk-r R"4 C1 S?"NBr af&ڟkԩZGHBM"k؁ܧmN+!7H%ȊܰOCojX{TԩZ`nlwҪJ RJJ_ejɠmTRNJ1F@( VUsx1AM=TRr!vDPUdSj9ܷ-:/BlnGRXPR9ݭR: 5]u JC 96%CblA=[qYPcfȞR [gS>ՅJA(XOQoZj ` Bo *TE#"`EEب:_ڹD^,@*[~ҥJ$wWEp (&GH02ٍԩPn\6H6VL82qqy%⹼. u']GREŘ$2nָ?SYJx!v7P*T au\Ⱥ/MSLbp+c+3koaR_'(M+ mƵL*ܫ$loOz*^WMj(l Oxn,mMݿJ b?d["NO6*TWI, D"C\]h͔[moڴ17o=1c܃Kr_kTAO%YnEbý_1+4h1y#,S$`.WI׸ڥJ.^.^Ye 6>HwPS@5O=[ʛ^^*UB:kU *`qae LZuz+Ԫ){}jTHltcR 2*>_U4|2BXPw *(?CŊ8NX83 Ƈ@/ѬE/sȞq[$5 l]T3)#bK87,O}WͭO$TϊmtmooJ<"feR*WAeH58[ǩR+?Xei,c2N7 uښȏ?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=149Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aZimage/jpeg_Wed, 18 Aug 2010 15:39:10 GMTU33913_"5965265-8479-4b0704bd"_Fri, 20 Nov 2009 21:06:05 GMT./_``a2_NSMutableDictionary\NSDictionaryy./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  QV_jms| !,:OU9Y^bxgQRS_Whttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/images/loading.gifO GIF89a 򺺺444ėTTT! NETSCAPE2.0! , H *\p hp"8G>D)R4CIË\9p:ȹs1_2`p` u< uSYڐkǞ`Fhvƴ6S>u+ryJ/QM.0@p_ ++/KY&]9ى Mr `ixr\˪ vfjMO&*Z؇o>;ܦŝ",,@CPؼrSE.ٴjTWYR Y+ѫKb ڌ! ,H*?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=144Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aYimage/gif_Wed, 18 Aug 2010 15:34:31 GMTT2767_"596435b-acf-46b4ab7d"_Sat, 04 Aug 2007 16:38:21 GMT./_``a2_NSMutableDictionary\NSDictionary ./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  fkt "16AOdj -2KkptgUVW_Zhttp://www.brattleboromuseum.org/wp-content/plugins/wp-shopping-cart/images/closelabel.gifOGIF89aBYYY҃PPPTTTVVVRRRQQQXXXUUUSSSWWWLLLOOOfff```{{{lllxxxKKK___ߴpppccc咒nnnoooՎeeevvvmmm|||籱yyyZZZdddMMMsssgggNNNiiizzz!,B\]\'\,GB\\#]!@Q"].4UZ]×ZZM2EZ$ > [ ][̕[ /\냣[ T6Fа0 ]"lYAKșd` Z0Q.d|J$@ HU&xN-* 8zP$&$!-,ɳU]**ytKRCHa )i%Zڥ-m!FQ0`B&E71K|H†O$c tM"neIQbU2Ǒg 1%qM`puNc9'[lI@q+BiY@8pI :,`3GUq#ذ7l9YπDQq=+/8¹M?@AB DEFGHIJKLZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_timeout=5, max=145Ubytes_Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.7aYimage/gif_Wed, 18 Aug 2010 15:34:31 GMTS979_"5964350-3d3-46b4ab76"_Sat, 04 Aug 2007 16:38:14 GMT./_``a2_NSMutableDictionary\NSDictionary./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd  inw  %49DRgm04MmrvgYZ[\_(http://brattleboromuseum.org/favicon.icoOf(F nhV  ( "(3DN[dxC'"_"$ ez ߫ _ QZHbf  @oB2)"O$( @ #/CMX`kry![' &a1_/s: fKvp `xcO/`n;{uVi`>$ @ @  @ p@O p@ p@ p4I3{ p7'*pYKipb ߺp p Op p 0 p p!q(       !"  !&(&$1%/$0")&/&/,5/:3@@I:F@HBJALJPLVFSOYW`U^UaT\Y^bjbkirqvp{~( CP3u!!, ';7KDc`)! W\jt  8L1zE Zr! p9q4 $}e_xS6  !gwa>X"|sh~{^5lMJ[rn$2b+Hy?!i&N<:O#m%.d=V$]v@FBT YYkfQ#IGoR#I0AM-$"U/T#*( @               !   "   !$$"( ,!*#.$0'4%0'3/9-6.8.:3</>5A@EBxL48>D?[=7?@>C@BCP; '*%Gf!{k  !2@'+)N:I̸zB1E#'#ߓwc4?'*'vZE#&'&JW]9'  v|~m D&"(#'s7T%#lɚx@!+'!Fn +#' A3 v"#+ BYjT&#+&1} ++#0^,!̐tu}zQ$Nt 3Žq~_6HLKeVN-0DZigwS !>*mA EĽk i '+>q Up_ '(!