bplist00_WebMainResource_WebSubresources_WebSubframeArchives ^WebResourceURL_WebResourceTextEncodingName_WebResourceMIMEType_WebResourceData_WebResourceFrameName_http://www.theglobeandmail.com/servlet/story/LAC.20080419.LISTINGSBOAT19/PPVStory?URL_Article_ID=LAC.20080419.LISTINGSBOAT19&DENIED=1UUTF-8Ytext/htmlOP globeandmail.com

Skip navigation

Login close

Click here to find out more!

NO. 9: CONTEMPORARY ART AND THE ENVIRONMENT

Special to The Globe and Mail

"Danger" reads the red tape at the corner of East Don Roadway and Queen Street East.

It's a warning to passersby of the nearby condo construction zone, but another danger is steps away - the condition of the Lower Don River. These days, it sports the yellow-green hue of honey Dijon and smells like a dirty toilet bowl. And a new public-art project won't let us forget about the sewage and pollution we drive over daily.

From the Don Valley Parkway, it's hard to miss the 4.5 metre (15-foot) orange life preserver (which is big enough to save Godzilla from drowning) hinged from the rusty Eastern Avenue Bridge. Reading "Don River" in black caps, it is a sculpture by the Montreal-based art collective BGL (which stands for the surnames of members Jasmin Bilodeau, Nicolas Laverdière and Sébastien Giguère). A closer look into the sludgy river reveals what the life preserver is looking to rescue - a miniature black cruise ship called the Nowhere II, crafted from an ice canoe and fashioned after the Queen Mary II.

The sculptures are hosted by a new curatorial collective called No. 9, which on Tuesday (Earth Day) will be also hosting historical walking tours of the Don. "Culture can play a role in environmental awareness," notes the executive director, Andrew Davies, who co-founded No. 9 with curator Catherine Dean. "We'd like to see the switch from thinking about consumption to thinking about sustainability."

Nadja Sayej

Tours and family activities Tuesday, 3:30 p.m. to 5:30 p.m. Ship viewable until June 29. Lower Don River, south of Queen Street Viaduct. 416-644-1019 ext. 3. http://www.no9.ca.

Accessing Your Pay-Per-View Articles

This article is available for you through the Member Centre 30 days after it was ordered. Look for “NO. 9: CONTEMPORARY ART AND THE ENVIRONMENT” listed within your Member Centre’s Pay-Per-View article archive.

You may also print this article using the Print this article link on this page, or through the printing option found within your Web browser.

Back to top

P #'+/37;@DHLPTX]aeimquy~_WebResourceResponse_Fhttp://images.theglobeandmail.com/v5/styles/article-rob.css?v=20070423O_bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Fhttp://images.theglobeandmail.com/v5/styles/article-rob.css?v=20070423./01X$classesZ$classname12UNSURLXNSObject#AzM| 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=18414_Tue, 23 Dec 2008 20:44:04 GMTUbytes_Apache/2.2.0 (Unix) DAV/2Xtext/cssU19579_Tue, 23 Dec 2008 15:37:10 GMT_"4c7b-3ca28d40"Zkeep-alive_Thu, 24 Jul 2008 19:41:01 GMT./deef2_NSMutableDictionary\NSDictionaryL{./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  W\epsy .38CQ_ ,9<AEYlgXtext/cssOL{@import url(base.css?v=20070423); @import url(comments.css); @import url(ppv.css); @import url(subnav.css?v=20070423); @import url(most-popular.css); @import url(sectionFooter.css); .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } * html .clearfix { height: 1%; } *:first-child+html .clearfix { height: 1%; } .story #chewy { padding-right: 1em; } .story #headline #subtitle, .story #headline h2, .story #headline #deck, .story #author p, .story .caption, .story #related #photo p, .story #related_articles p, .story #secondaryNav p, .story #secondaryNav #articleTools, .story ul.columnistInfo, .story #related .related_video p { margin: 0; padding: 0; } .story #headline #subtitle, .story .caption, .story #related .caption, .story #related #photo p { font-size: 0.625em; } .story #related_articles p, .story #related .related_video p { font-size: 0.70em; } .story #related h5 { font-size: 0.725em; } .story div.nav ul, .story div.nav ol { font-size: 0.90em; } .story #headline #deck, .story #author p { font-weight: normal; } .story #headline h2, .story #headline #deck, .story #headline #subtitle, .story #author p.byline, .story #secondaryNav #conversation #story-num-comments { font-weight: bold; } .story #headline #deck, .story #related h5, .story #related_articles p, .story #secondaryNav a.section, body.story div#secondaryNav a.section:link, body.story div#secondaryNav a.section:visited { color: #686868; } .story #headline #subtitle, .story .caption, .story #related #photo p, .story ul#articleBottomTools li a { color: #666; } .story #headline { margin-top: 1.20em; } .story #headline h2, .story #headline #deck { font: 1.8em "Trebuchet MS","Lucida Sans","Lucida Sans Unicode","Lucida Grande",sans-serif; letter-spacing: -1px; } .story #headline h2 { font-weight: bolder; line-height: 1.1em; } .story #headline #deck { margin-top: 0.50em; font-size: 1.2em; } .story #headline #subtitle { text-transform: uppercase; } .story #author { margin: 1.3em 0; } /* headshot */ /* .story #author img { float: left; margin-right: 10px; } */ .story #author img { display: none; } .story ul.columnistInfo { list-style-type: none; font-size: 1em; } .story ul.columnistInfo li { display: inline; } .story #related { float: left; width: 188px; margin-right: 17px; } .story #related h5 { padding-bottom: 2px; margin-bottom: 0; border-bottom: 1px dotted #999; clear: left; } .tpstory #TPphoto a#enlarge { font-size: 0.85em; background: url(/v5/images/icon/icon-popup.gif) no-repeat right 30%; padding-right: 15px; margin-left: -1em; } * html .tpstory #TPphoto a#enlarge { margin-left: 0; } .story #related_articles p { margin-top: 0.50em; } .story #related .caption, .story #related #photo p { margin-bottom: 2.5em; } .story #related cite { font-style: normal; } .story #related h5.chart_title { border-bottom: 2px solid #999; } /* video */ .story #related #video { margin-bottom: 1.5em; } .story #related .related_video { clear: left; padding: 0.50em 0; } .story #related .wmv .thumbnailHolder { background-repeat: no-repeat; width: 174px; background-position:center; border: 1px solid #DFDFDF; } .story #related .wmv .thumbnailImageHolder { margin: 7px; background-color:#000000; width: 160px; text-align: center; } .story #related .wmv .thumbnailImage { margin: auto; } .story #related .flv .thumbnailHolder { background-repeat: no-repeat; width: 174px; height: 104px; background-position:center; border: 1px solid #DFDFDF; } .story #related .flv .thumbnailTextHolder { margin: 80px 8px 0 8px; padding-right: 5px; height: 15px; background-color:#222222; border: 1px solid #222222; filter:alpha(opacity=60); opacity:0.6; text-align: right; } .story #related .flv .thumbnailText { font-size: 0.7em; filter:alpha(opacity=100); opacity:1; color: #ffffff; } .story #related .flv img.thumbnail { padding: 10px; } h4#globe-video { margin: 0 0 5px; } /* secondaryNav realestate specific */ .story.realestate #secondaryNav #zoneSearch select { margin-bottom: 5px; width: 160px; } /* secondaryNav article tools */ .story #secondaryNav #articleTools { padding-top: 3px; margin-bottom: 1.25em; /*width: 200px;*/ width: 330px; border-top: 4px solid #DFDFDF; list-style-type: none; float: left; } .sports #content #secondaryNav #articleTools { margin: .5em 0 1.25em; } .story #secondaryNav #articleTools li { float: left; /*width: 70px;*/ width: 90px; } /* letters to the ed link */ .tpstory #secondaryNav #articleTools li.comment { background-image: url(/v5/images/icon/icon-email.gif); } .story #secondaryNav #articleTools li a:visited { color: #4D6699; } .story #secondaryNav #articleTools li#fontSize { /*width: 86px;*/ padding-left: 0; margin-left: -3px; } .story #secondaryNav .sponsoredBy { float: right; margin: -1em 0 1em 0; } .story #secondaryNav #stockProfile .sponsoredBy { margin: 0; float: none; } .story #secondaryNav .sponsoredBy p { font-size: 0.625em; margin: 0; } .story div.nav ul, .story #secondaryNav div.nav ul { list-style-type: disc; margin: 0.50em 0; padding: 0 0 0 1em; color: #585858; } .story div.nav ul li, .story #secondaryNav div.nav ul li, .story div.nav ol li { margin: 0; padding: 0 0 0.50em 0; } .story #secondaryNav div.nav ul { padding-left: 1.75em; font-size: 0.85em; margin-bottom: 2.25em; } .story ul#articleTools li, .story ul#articleBottomTools li { background-position: left 50%; padding-left: 16px; background-repeat: no-repeat; } .story #articleBottomToolsHolder { padding: 0 0 1em 0; clear: left; } .story #articleBottomTools { padding: 0.15em 0; border-bottom: 1px dotted #999; border-top: 1px dotted #999; } .story #articleBottomTools:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } /* IE 7 */ *:first-child+html .story #articleBottomTools { height: 1%; } .story #articleBottomTools li { display: block; float: left; width: 120px; } .story #articleTools li.email, .story ul#articleBottomTools li.email { background-image: url(/v5/images/icon/icon-email.gif); } .story #articleTools li.print, .story ul#articleBottomTools li.print { background-image: url(/v5/images/icon/icon-print.gif); } .story #articleTools li.comment, .story ul#articleBottomTools li.comment { background-image: url(/v5/images/icon/icon-comment.gif); white-space: nowrap; } .story #articleTools li.share, .story ul#articleBottomTools li.share { background-image: url(/v5/images/icon/icon-share-11x9.gif); } .story #articleTools li.license, .story ul#articleBottomTools li.license { background-image: url(/v5/images/icon/icon-license.png); } /* real estate favourites */ .story.realestate #articleTools li.favourites, .story.realestate ul#articleBottomTools li.favourites { background-image: url(/v5/images/icon/icon-plus.gif); } .story.realestate #secondaryNav #articleTools li.favourites { display: none; } /* real estate commercial search */ .story.smallbusiness #secondaryNav iframe#commercialSearch, .story.realestate #secondaryNav iframe#commercialSearch { margin: 0 0 2em 0; padding: 0; border: 0; overflow: hidden; border-top: 1px solid #DFDFDF; } .story #photo a#enlarge, .story #inTP #TPphoto a#enlarge { background: url(/v5/images/icon/icon-popup.gif) no-repeat right 50%; padding-right: 14px; font-size: 0.625em; } /* secondaryNav */ .story #secondaryNav { margin-left: -339px; margin-bottom: 2em; width: 330px; padding-left: 7px; border-left: 1px dotted #989898; color: #6C6C6C; } .story #secondaryNav .nav { width: 330px; margin-right: 0; } /* override h4 rules elsewhere */ body.story div#secondaryNav div.nav h4 { color: #7A7A7A; border-top: 4px solid #DFDFDF; border-bottom: 1px solid #DFDFDF; padding: 2px 0; margin-bottom: 0.25em; font-size: 1.1em; font-weight: bolder; letter-spacing: 0.025em; } /* join the conversation block */ .story #secondaryNav #conversation { clear: both; } .story #secondaryNav #conversation p { font-size: 1.1em; margin: 0.25em 0; } .story #secondaryNav #conversation em { font-style: normal; font-weight: bold; color: #6D6D6D; } /* share this article */ .story ul#network { font-size: 0.75em; } .story ul#network { list-style-type: none; margin: 1em 0 0 0; padding: 0; } .story ul#network li { padding: 0 0 5px 20px; } .story ul#network li.delicious { background: url(/v5/images/icon/icon-delicious.png) no-repeat; } .story ul#network li.newsvine { background: url(/v5/images/icon/icon-newsvine.png) no-repeat; } .story ul#network li.technorati { background: url(/v5/images/icon/icon-technorati.png) no-repeat; } .story ul#network li.magnolia { background: url(/v5/images/icon/icon-magnolia.png) no-repeat; } .story ul#network li.digg { background: url(/v5/images/icon/icon-digg.png) no-repeat; } .story ul#network li.facebook { background: url(/v5/images/icon/icon-facebook.png) no-repeat; } /* follow this story alerts */ .helpBox p#addAlert { margin: -0.25em 0 0 0; padding: 0; } .helpBox.alert ul { margin: 0; padding: 0; list-style-type: none; } .helpBox ul.manageAlerts { margin-top: 0.50em; font-size: 0.70em } .helpBox ul.manageAlerts li { display: inline; padding: 0 7px 0 0; border-right: 1px solid #BFBFBF; } .helpBox ul.manageAlerts li.last { padding: 0 0 0 7px; border-right: none; } /* ads */ .story #secondaryNav .bigbox, .story #secondaryNav .halfpage { margin-left: 10px; background-color: transparent; } /* hub specific */ /* movie search form, tv listings form */ .story #secondaryNav div.tool-search { font-size: 1.1em; margin-bottom: 2em; } .story #secondaryNav div.tool-search form { margin: 1em 0; } /* PPV Story rules */ .ppv #secondaryNav { border-left: none !important; } .ppv #articleBottomToolsHolder, .ppv #secondaryNav ul#articleTools li.print, .ppv #secondaryNav ul#articleTools li.email, .ppv #secondaryNav ul#articleTools li.share, .ppv #secondaryNav ul#articleTools li.comment { display: none !important; } /* BMO stock lookup */ #profileBG { display: none; } body #content #secondaryNav #stockProfile table { border-collapse: collapse; width: 330px; margin-bottom:5px; font-size:11px; } body #content #secondaryNav #stockProfile table td { padding-top:5px; } body #content #stockProfile thead th { text-align: left; background-color: #EFEFEF; } body #content #secondaryNav #stockProfile table .sponsoredBy { font-weight: normal; } body #content #secondaryNav #stockProfile #profileBG { display: block !important; margin-top: 0 !important; padding-top: 0 !important; } body #content #secondaryNav #stockProfile #profileBG #stockProfileType { margin: 0.5em 0 0 0; } body #content #secondaryNav #stockProfile #profileBG .symbolNav { margin: 0 0 0 0 !important; padding-left: 0 !important; } body #content #secondaryNav #stockProfile #profileBG .symbolNav li { color:#001F5E; display:inline; text-decoration:none; margin:0pt -2px 0pt 0pt; padding:0 5px; border-right: none; } body #content #secondaryNav #stockProfile #profileBG .symbolNav li.selected { font-weight: bold; } body #content #secondaryNav #stockProfile #profileBG #stockProfileType .field { width: 100px; margin-right: 5px; } body #content #secondaryNav #stockProfile #profileBG #stockProfileType .symbolLookup { padding-left: 3px; } body #content #secondaryNav #stockProfile #profileBG .symbolLookup { margin: 2px 0 0 0; z-index: 100; display: inline; } /* recommend */ .story #recommend { font-size: 0.95em; margin: 2em 0 0 0; color: #888; } .story #recommend a { outline: none; } .story #recommend #vote { display: block; float: left; margin: -0.25em 0.50em 0 0.50em; width: 45px; height: 22px; background: url(/v5/images/button/button-yes.png) no-repeat top left; } .story #recommend #vote:hover { background-position: 0 -22px; } .story #recommend .new-feature { color: #DA162C; margin-bottom: 1em; } .story #recommend #recommend-invite { text-transform: uppercase; font-weight: bold; display: block; float: left; } .stroy #recommend #recommend-count { font-weight: normal; } .story #recommend p { clear: left; margin: 0; } .story #recommend #rec-response { color: #797979; padding: 3px; background: url(/v5/images/styles/gradient-readerschoice.gif) repeat-x top left; border: 1px solid #dfdfdf; margin: 0.50em 0; } .story #recommend #view-recommended { background: url(/v5/images/icon/bullet_arrow_grey.gif) no-repeat left 60%; padding-left: 10px; } /* end recommend */ /* IE 6 hacks */ * html .story div.nav ul { padding-left: 1.2em; } * html .story #articleBottomTools { height: 1%; } /* overwrite iewin.css */ * html #secondaryNav div.nav ul li { font-size: 1.35em !important; } /* comment story fixes */ * html .comments.story #secondaryNav { padding-left: 7px !important; } * html .story #secondaryNav .nav #most-popular table h3 { margin-bottom: 3px; } * html .story #secondaryNav .nav #most-popular #most-popular-categories li.selected, * html .story #secondaryNav .nav #most-popular #most-popular-hub { margin-bottom: -1px; } * html .story #secondaryNav .nav #most-popular #most-popular-categories li a { padding-top: 5px; } /* story flag fixes */ .story.business #header h2 { margin: -8px 0 8px 0 !important; } /* temp styles */ table.data { border: 0; border-collapse: collapse; width: 100%; margin-bottom: 1em; } #chewy table.data { font-size: .9em; } #chewy table.data th { font-size: .775em; text-align: left; font-weight: bold; } #chewy table.data { text-align: center; } table.data caption { font-size: .75em; color: #1E1E1E; background-color: #F4F4F4; margin: 1em 0; } table.data caption .sortedby { font-weight: bold; } table.data caption .sortkey { font-weight: bold; } table.data caption .sorted { float: left; display: inline; } table.data caption .help, #chewy table.data caption .timestamp { float: right; display: inline; } table.data thead td { font-weight: bold; padding-top: 0.5em; padding-bottom: 0.5em; vertical-align: bottom; color: #888; background-color: #FFF; } table.data thead a { color: #888; } table.data tr.evenrow { background-color: #F4F4F4;} #chewy table.data a:link, #chewy table.data a:visited, #chewy table.data a:hover, #chewy table.data a:active { color: #001F5E; font-weight: bold; } table.data td { color: #1E1E1E; padding: 2px 0.5em 2px 0; } table.data .slim { width: 3em } table.data .number { text-align: right; } table.dividends caption { margin-top: 3em; } table.data caption { font-size: .7em; background-color: #fff; color: #888; } * html table.data caption { padding: 1em 0; font-size: .75em; } * html #chewy table.data td, * html #chewy table.data th { font-size: 12px; } /* TECH GIFT GUIDE */ .story.technology #secondaryNav div.nav.techgift { height: 250px; } * html .story.technology #secondaryNav div.nav.techgift { height: 230px; } .story.technology ul#techCarouselLinks { width: 330px; } .story.technology #techCarouselLinks li { margin: 0; list-style-type: none; font-family: Arial, sans-serif; width: 100px; float: left; font-size: 11px; line-height: 1.1; } .story.technology #techCarouselLinks li#techCarouselMobile, .story.technology #techCarouselLinks li#techCarouselEntertainment, .story.technology #techCarouselLinks li#techCarouselCameras, .story.technology #techCarouselLinks li#techCarouselGames { margin-right: 5px; background: transparent url(/v5/content/ROB/styles/images/text_divide.png) no-repeat scroll 100% 50%; } .story.technology #techCarouselLinks li#techCarouselMobile { width: 85px; } .story.technology #techCarouselLinks li#techCarouselEntertainment { width: 105px; } .story.technology #techCarouselLinks li#techCarouselMultimedia { width: 100px; } .story.technology #techCarouselLinks li#techCarouselCameras { width: 119px; margin-left: -15px; } * html .story.technology #techCarouselLinks li#techCarouselCameras { margin-left: -5px; } .story.technology #techCarouselLinks li#techCarouselGames { width: 76px; } .story.technology #techCarouselLinks li#techCarouselComputers { width: 120px; padding-bottom: .5em; } .story.technology #techCarouselLinks li#techCarouselMobile, .story.technology #techCarouselLinks li#techCarouselEntertainment, .story.technology #techCarouselLinks li#techCarouselCameras, .story.technology #techCarouselLinks li#techCarouselGames { margin-right: 5px; background: transparent url(/v5/content/ROB/styles/images/text_divide.png) no-repeat scroll 100% 50%; } /* Interactive Styles */ .story #articleInteractive { float: left; width: 545px; border-bottom: 1px dotted #999; padding-bottom: 2px; margin-bottom: 15px; } .story #articleInteractive h5 { color: #686868; font-size: .725em; border-bottom: 1px dotted #999; clear:left; margin-bottom: 0; padding-bottom: 2px; } /* BDA styles */ .births #article, .deaths #article { font-size: 1em !important; } .births, .deaths { min-height: 0em; } .births #updated, .deaths #updated { font-weight: bold; text-transform: uppercase; color: #5F5F5F; background-color: #FFFFFF; padding: 10px 0 !important; } .births #secondaryNav h5, .deaths #secondaryNav h5 { margin:1em 0pt; padding:0pt; } .births #secondaryNav p { margin-bottom: 10px; } .deaths input.button { border: 0 !important; margin: 0 !important; padding: 0 !important; } /* package nav styles */ .story .packageNav { list-style-type: none; margin: 0.6em 0; padding: 0; border-top: solid #CCCCCC 1px; border-bottom: solid #CCCCCC 1px; font-style: normal; height: 28px; clear: both; } .story .packageNav li { font-weight: bold; display: inline; padding-right: 13px; margin-right: 5px; border-right:solid #CCCCCC 1px; position: relative; font-size: 11.5px; top: -10px; } .story .packageNav li a:hover, .story .packageNav li a:visited, .story .packageNav li a:visited:hover, .story .packageNav li a:link { color: #000000 !important; } .story .packageNav li.currentPageType, .story .packageNav li.currentPageType .comment, .story .packageNav li.currentPageType a:hover, .story .packageNav li.currentPageType a:visited, .story .packageNav li.currentPageType a:visited:hover, .story .packageNav li.currentPageType a:link { color: #D9162B !important; } .story .packageNav li.last { border-right: none; margin-right: 0; padding-right: 0; } .story .packageNav .icon { position: relative; top: 0.25em; left: 0.15em; padding-right: 0.2em; } .story .packageNav li.chevron { border-right: none; } .story .packageNav li.chevron img { position: relative; top: 9px; left: 1em; } .story .packageNav .comment img { display: none; } .story .packageNav .comment, .story .packageNav .comment a:hover, .story .packageNav .comment a:visited, .story .packageNav .comment a:visited:hover, .story .packageNav .comment a:link { color: #8A8A8A !important; } .story #related h5.relatedVideoHeader { border-bottom: solid 5px #cccccc; } .story #related .related_video .headline { margin-top: 14px; font-size: 14px; font-family: "Trebuchet MS","Lucida Sans","Lucida Sans Unicode","Lucida Grande",sans-serif; } .story #related .related_video .description { font-size: 11px; } .story #related .related_video .playVideo { font-size: 12px; font-weight: bold; font-family: "Trebuchet MS","Lucida Sans","Lucida Sans Unicode","Lucida Grande",sans-serif; } .story #related .related_video .playVideo img { position: relative; top: 1px; }_6http://images.theglobeandmail.com/v5/styles/iphone.cssOGbplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_6http://images.theglobeandmail.com/v5/styles/iphone.css./01X$classesZ$classname12UNSURLXNSObject#At3( 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=19322_Tue, 23 Dec 2008 20:46:12 GMTUbytesXtext/css_Apache/2.2.0 (Unix) DAV/2R53_Tue, 23 Dec 2008 15:24:10 GMT]"35-dd2ca240"Zkeep-alive_Tue, 08 Jul 2008 17:53:05 GMT./deef2_NSMutableDictionary\NSDictionary5./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  GLU`cir{}#(3AOou~"$)-AlOO5#globalNav li { -webkit-text-size-adjust: none; }_=http://images.theglobeandmail.com/v5/styles/article-print.cssORbplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_=http://images.theglobeandmail.com/v5/styles/article-print.css./01X$classesZ$classname12UNSURLXNSObject#AzM{ 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=13073_Tue, 23 Dec 2008 19:15:03 GMTUbytes_Apache/2.2.0 (Unix) DAV/2Xtext/cssT1991_Tue, 23 Dec 2008 15:37:10 GMT^"7c7-4f9fef00"Zkeep-alive_Tue, 06 Feb 2007 16:29:16 GMT./deef2_NSMutableDictionary\NSDictionary./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  NS\gjpy %*/:HVv| ,/48LlZOhtml, body { background: #FFF; color: #000; } body { margin: 0 1em 1em; } a:link, a:visited { color: #000; text-decoration: none; } abbr, acronym { border-bottom: none; } .access, #attic, #header, .centerAll2, .ad, #headline p.logo, #author ul, #pagination, #memberInfo, #newsletterPromo, #secondaryNav, #subscribePromo, #siteSearch, #articleTools, p.back, #footer h3, #footer ul, #sidebar, #comments, #subnav, #articleTools, #articleBottomTools, #ppvHelpPromo { display: none; } div#ldbdHolder, div#lugHolder, div#skyRHolder, div#boxRHolder, div#b1Holder, div#b2Holder, div#b3Holder, div#b4Holder, div#halfpageRHolder { visibility: hidden !important; } #footer ul#footerNav, #header.print { display: block; list-style: none; margin-left: 0; padding-left: 0; } #headline h1 { font: bold 0.9em Arial, sans-serif; margin: 0.2em 0; text-transform: uppercase; } #headline h2 { font-size: 1.6em; margin: 0.2em 0; } #headline h3 { font-size: 1em; margin: 0.2em 0 1em; } #author img { border: 1px solid #000; float: left; margin-right: 0.5em; } #author p.dateline img { display: none; } #author p { font-size: 0.7em; text-transform: uppercase; margin: 0; } #updated, #author p.byline, #author p.source { font-family: Arial, sans-serif; } #updated { font-size: 0.7em; } #author p.byline { font-weight: bold; } #author p.dateline { margin-top: 0.7em; } #author p.dateline span.update { display: block; } #article pre { font-size: 0.8em; } #articleNavigation p.jumpline { font: bold 0.7em Arial, sans-serif; text-align: right; text-transform: uppercase; } p#printThis { float: right; width: 8em; } p#printThis a { display: block; text-align: center; padding: 1em; margin: 1em; border: 1px outset #CCC; color: #333; background: #DDD; font: bold 11px Arial, sans-serif; } p#printThis a:hover { color: #000; border-style: inset; } @media print { p#printThis { display: none; } } #footer img { float: right; border: none; } !"_?http://images.theglobeandmail.com/v5/scripts/build/tp-merged.jsOmbplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_?http://images.theglobeandmail.com/v5/scripts/build/tp-merged.js./01X$classesZ$classname12UNSURLXNSObject#AzMz 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=18470_Tue, 23 Dec 2008 20:45:00 GMTUbytes_Apache/2.2.0 (Unix) DAV/2_application/x-javascriptV221864_Tue, 23 Dec 2008 15:37:10 GMT_"362a8-da03ac0"Zkeep-alive_Wed, 05 Nov 2008 15:44:19 GMT./deef2_NSMutableDictionary\NSDictionaryb./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  PU^ilr{ ',1<JXx~"8EJOSglu_application/x-javascriptOb/* Prototype JavaScript framework, version 1.5.1 * (c) 2005-2007 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://www.prototypejs.org/ * /*--------------------------------------------------------------------------*/ var Prototype = { Version: '1.5.1', Browser: { IE: !!(window.attachEvent && !window.opera), Opera: !!window.opera, WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1 }, BrowserFeatures: { XPath: !!document.evaluate, ElementExtensions: !!window.HTMLElement, SpecificElementExtensions: (document.createElement('div').__proto__ !== document.createElement('form').__proto__) }, ScriptFragment: ']*>([\u0001-\uFFFF]*?)', JSONFilter: /^\/\*-secure-\s*(.*)\s*\*\/\s*$/, 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; } }, toJSON: function(object) { var type = typeof object; switch(type) { case 'undefined': case 'function': case 'unknown': return; case 'boolean': return object.toString(); } if (object === null) return 'null'; if (object.toJSON) return object.toJSON(); if (object.ownerDocument === document) return; var results = []; for (var property in object) { var value = Object.toJSON(object[property]); if (value !== undefined) results.push(property.toJSON() + ': ' + value); } return '{' + results.join(', ') + '}'; }, 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)); } } Object.extend(Number.prototype, { toColorPart: function() { return this.toPaddedString(2, 16); }, succ: function() { return this + 1; }, times: function(iterator) { $R(0, this, true).each(iterator); return this; }, toPaddedString: function(length, radix) { var string = this.toString(radix || 10); return '0'.times(length - string.length) + string; }, toJSON: function() { return isFinite(this) ? this.toString() : 'null'; } }); Date.prototype.toJSON = function() { return '"' + this.getFullYear() + '-' + (this.getMonth() + 1).toPaddedString(2) + '-' + this.getDate().toPaddedString(2) + 'T' + this.getHours().toPaddedString(2) + ':' + this.getMinutes().toPaddedString(2) + ':' + this.getSeconds().toPaddedString(2) + '"'; }; var Try = { these: function() { var returnValue; for (var i = 0, length = arguments.length; i < 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, { interpret: function(value) { return value == null ? '' : String(value); }, specialChar: { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\\': '\\\\' } }); 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 += String.interpret(replacement(match)); 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 self = arguments.callee; self.text.data = this; return self.div.innerHTML; }, unescapeHTML: function() { var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0] ? (div.childNodes.length > 1 ? $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : div.childNodes[0].nodeValue) : ''; }, toQueryParams: function(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) return {}; return match[1].split(separator || '&').inject({}, function(hash, pair) { if ((pair = pair.split('='))[0]) { var key = decodeURIComponent(pair.shift()); var value = pair.length > 1 ? pair.join('=') : pair[0]; if (value != undefined) value = decodeURIComponent(value); if (key in hash) { if (hash[key].constructor != Array) hash[key] = [hash[key]]; hash[key].push(value); } else hash[key] = value; } return hash; }); }, toArray: function() { return this.split(''); }, succ: function() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); }, times: function(count) { var result = ''; for (var i = 0; i < count; i++) result += this; return result; }, camelize: function() { var parts = this.split('-'), len = parts.length; if (len == 1) return parts[0]; var camelized = this.charAt(0) == '-' ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0]; for (var i = 1; i < len; i++) camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); return camelized; }, capitalize: function() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); }, underscore: function() { return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); }, dasherize: function() { return this.gsub(/_/,'-'); }, inspect: function(useDoubleQuotes) { var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { var character = String.specialChar[match[0]]; return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); }); if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; return "'" + escapedString.replace(/'/g, '\\\'') + "'"; }, toJSON: function() { return this.inspect(true); }, unfilterJSON: function(filter) { return this.sub(filter || Prototype.JSONFilter, '#{1}'); }, evalJSON: function(sanitize) { var json = this.unfilterJSON(); try { if (!sanitize || (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json))) return eval('(' + json + ')'); } catch (e) { } throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); }, include: function(pattern) { return this.indexOf(pattern) > -1; }, startsWith: function(pattern) { return this.indexOf(pattern) === 0; }, endsWith: function(pattern) { var d = this.length - pattern.length; return d >= 0 && this.lastIndexOf(pattern) === d; }, empty: function() { return this == ''; }, blank: function() { return /^\s*$/.test(this); } }); if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { escapeHTML: function() { return this.replace(/&/g,'&').replace(//g,'>'); }, unescapeHTML: function() { return this.replace(/&/g,'&').replace(/</g,'<').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; Object.extend(String.prototype.escapeHTML, { div: document.createElement('div'), text: document.createTextNode('') }); with (String.prototype.escapeHTML) div.appendChild(text); 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 + String.interpret(object[match[3]]); }); } } var $break = {}, $continue = new Error('"throw $continue" is deprecated, use "return" instead'); var Enumerable = { each: function(iterator) { var index = 0; try { this._each(function(value) { iterator(value, index++); }); } 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.map(iterator); }, 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 || Prototype.K)(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 === undefined ? null : fillWith; return this.eachSlice(number, function(slice) { while(slice.length < number) slice.push(fillWith); return slice; }); }, 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.map(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.map(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.map(); }, 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)); }); }, size: function() { return this.toArray().length; }, 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; } } if (Prototype.Browser.WebKit) { $A = Array.from = function(iterable) { if (!iterable) return []; if (!(typeof iterable == 'function' && iterable == '[object NodeList]') && 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 != 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(sorted) { return this.inject([], function(array, value, index) { if (0 == index || (sorted ? array.last() != value : !array.include(value))) array.push(value); return array; }); }, clone: function() { return [].concat(this); }, size: function() { return this.length; }, inspect: function() { return '[' + this.map(Object.inspect).join(', ') + ']'; }, toJSON: function() { var results = []; this.each(function(object) { var value = Object.toJSON(object); if (value !== undefined) results.push(value); }); return '[' + results.join(', ') + ']'; } }); Array.prototype.toArray = Array.prototype.clone; function $w(string) { string = string.strip(); return string ? string.split(/\s+/) : []; } if (Prototype.Browser.Opera){ Array.prototype.concat = function() { var array = []; for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); for (var i = 0, length = arguments.length; i < length; i++) { if (arguments[i].constructor == Array) { for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) array.push(arguments[i][j]); } else { array.push(arguments[i]); } } return array; } } var Hash = function(object) { if (object instanceof Hash) this.merge(object); else Object.extend(this, object || {}); }; Object.extend(Hash, { toQueryString: function(obj) { var parts = []; parts.add = arguments.callee.addPair; this.prototype._each.call(obj, function(pair) { if (!pair.key) return; var value = pair.value; if (value && typeof value == 'object') { if (value.constructor == Array) value.each(function(value) { parts.add(pair.key, value); }); return; } parts.add(pair.key, value); }); return parts.join('&'); }, toJSON: function(object) { var results = []; this.prototype._each.call(object, function(pair) { var value = Object.toJSON(pair.value); if (value !== undefined) results.push(pair.key.toJSON() + ': ' + value); }); return '{' + results.join(', ') + '}'; } }); Hash.toQueryString.addPair = function(key, value, prefix) { key = encodeURIComponent(key); if (value === undefined) this.push(key); else this.push(key + '=' + (value == null ? '' : encodeURIComponent(value))); } Object.extend(Hash.prototype, Enumerable); Object.extend(Hash.prototype, { _each: function(iterator) { for (var key in this) { var value = this[key]; if (value && value == Hash.prototype[key]) 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; }); }, remove: function() { var result; for(var i = 0, length = arguments.length; i < length; i++) { var value = this[arguments[i]]; if (value !== undefined){ if (result === undefined) result = value; else { if (result.constructor != Array) result = [result]; result.push(value) } } delete this[arguments[i]]; } return result; }, toQueryString: function() { return Hash.toQueryString(this); }, inspect: function() { return '#'; }, toJSON: function() { return Hash.toJSON(this); } }); function $H(object) { if (object instanceof Hash) return object; return new Hash(object); }; // Safari iterates over shadowed properties if (function() { var i = 0, Test = function(value) { this.key = value }; Test.prototype.key = 'foo'; for (var property in new Test('bar')) i++; return i > 1; }()) Hash.prototype._each = function(iterator) { var cache = []; for (var key in this) { var value = this[key]; if ((value && value == Hash.prototype[key]) || cache.include(key)) continue; cache.push(key); var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }; 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(); if (typeof this.options.parameters == 'string') this.options.parameters = this.options.parameters.toQueryParams(); } } Ajax.Request = Class.create(); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Request.prototype = Object.extend(new Ajax.Base(), { _complete: false, initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); this.request(url); }, request: function(url) { this.url = url; this.method = this.options.method; var params = Object.clone(this.options.parameters); if (!['get', 'post'].include(this.method)) { // simulate other verbs over post params['_method'] = this.method; this.method = 'post'; } this.parameters = params; if (params = Hash.toQueryString(params)) { // when GET, append parameters to URL if (this.method == 'get') this.url += (this.url.include('?') ? '&' : '?') + params; else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='; } try { if (this.options.onCreate) this.options.onCreate(this.transport); Ajax.Responders.dispatch('onCreate', this, this.transport); this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); if (this.options.asynchronous) setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10); this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); this.body = this.method == 'post' ? (this.options.postBody || params) : null; this.transport.send(this.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 && !((readyState == 4) && this._complete)) 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.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, length = extras.length; i < 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._complete = true; (this.options['on' + this.transport.status] || this.options['on' + (this.success() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json); } catch (e) { this.dispatchException(e); } var contentType = this.getHeader('Content-type'); if (contentType && contentType.strip(). match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i)) this.evalResponse(); } 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') { // 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 ? json.evalJSON() : null; } catch (e) { return null } }, evalResponse: function() { try { return eval((this.transport.responseText || '').unfilterJSON()); } 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, length = query.snapshotLength; i < length; i++) results.push(query.snapshotItem(i)); return results; }; document.getElementsByClassName = function(className, parentElement) { var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]"; return document._getElementsByXPath(q, parentElement); } } else document.getElementsByClassName = function(className, parentElement) { 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 = {}; Element.extend = function(element) { var F = Prototype.BrowserFeatures; if (!element || !element.tagName || element.nodeType == 3 || element._extended || F.SpecificElementExtensions || element == window) return element; var methods = {}, tagName = element.tagName, cache = Element.extend.cache, T = Element.Methods.ByTag; // extend methods for all tags (Safari doesn't need this) if (!F.ElementExtensions) { Object.extend(methods, Element.Methods), Object.extend(methods, Element.Methods.Simulated); } // extend methods for specific tags if (T[tagName]) Object.extend(methods, T[tagName]); for (var property in methods) { var value = methods[property]; if (typeof value == 'function' && !(property in element)) element[property] = cache.findOrStore(value); } element._extended = Prototype.emptyFunction; 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); html = typeof html == 'undefined' ? '' : html.toString(); 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) { return $A($(element).getElementsByTagName('*')).each(Element.extend); }, firstDescendant: function(element) { element = $(element).firstChild; while (element && element.nodeType != 1) element = element.nextSibling; return $(element); }, immediateDescendants: function(element) { if (!(element = $(element).firstChild)) return []; while (element && element.nodeType != 1) element = element.nextSibling; if (element) return [element].concat($(element).nextSiblings()); return []; }, 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) { if (typeof selector == 'string') selector = new Selector(selector); return selector.match($(element)); }, up: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(element.parentNode); var ancestors = element.ancestors(); return expression ? Selector.findElement(ancestors, expression, index) : ancestors[index || 0]; }, down: function(element, expression, index) { element = $(element); if (arguments.length == 1) return element.firstDescendant(); var descendants = element.descendants(); return expression ? Selector.findElement(descendants, expression, index) : descendants[index || 0]; }, previous: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); var previousSiblings = element.previousSiblings(); return expression ? Selector.findElement(previousSiblings, expression, index) : previousSiblings[index || 0]; }, next: function(element, expression, index) { element = $(element); if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); var nextSiblings = element.nextSiblings(); return expression ? Selector.findElement(nextSiblings, expression, index) : nextSiblings[index || 0]; }, getElementsBySelector: function() { var args = $A(arguments), element = $(args.shift()); return Selector.findChildElements(element, args); }, getElementsByClassName: function(element, className) { return document.getElementsByClassName(className, element); }, readAttribute: function(element, name) { element = $(element); if (Prototype.Browser.IE) { if (!element.attributes) return null; var t = Element._attributeTranslations; if (t.values[name]) return t.values[name](element, name); if (t.names[name]) name = t.names[name]; var attribute = element.attributes[name]; return attribute ? attribute.nodeValue : null; } return element.getAttribute(name); }, getHeight: function(element) { return $(element).getDimensions().height; }, getWidth: function(element) { return $(element).getDimensions().width; }, 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; }, toggleClassName: function(element, className) { if (!(element = $(element))) return; Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](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.blank(); }, descendantOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var pos = Position.cumulativeOffset(element); window.scrollTo(pos[0], pos[1]); return element; }, getStyle: function(element, style) { element = $(element); style = style == 'float' ? 'cssFloat' : style.camelize(); var value = element.style[style]; if (!value) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css[style] : null; } if (style == 'opacity') return value ? parseFloat(value) : 1.0; return value == 'auto' ? null : value; }, getOpacity: function(element) { return $(element).getStyle('opacity'); }, setStyle: function(element, styles, camelized) { element = $(element); var elementStyle = element.style; for (var property in styles) if (property == 'opacity') element.setOpacity(styles[property]) else elementStyle[(property == 'float' || property == 'cssFloat') ? (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : (camelized ? property : property.camelize())] = styles[property]; return element; }, setOpacity: function(element, value) { element = $(element); element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }, getDimensions: function(element) { element = $(element); var display = $(element).getStyle('display'); if (display != 'none' && display != null) // Safari bug 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; var originalDisplay = els.display; els.visibility = 'hidden'; els.position = 'absolute'; els.display = 'block'; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = originalDisplay; 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; } }; Object.extend(Element.Methods, { childOf: Element.Methods.descendantOf, childElements: Element.Methods.immediateDescendants }); if (Prototype.Browser.Opera) { Element.Methods._getStyle = Element.Methods.getStyle; Element.Methods.getStyle = function(element, style) { switch(style) { case 'left': case 'top': case 'right': case 'bottom': if (Element._getStyle(element, 'position') == 'static') return null; default: return Element._getStyle(element, style); } }; } else if (Prototype.Browser.IE) { Element.Methods.getStyle = function(element, style) { element = $(element); style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); var value = element.style[style]; if (!value && element.currentStyle) value = element.currentStyle[style]; if (style == 'opacity') { if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) if (value[1]) return parseFloat(value[1]) / 100; return 1.0; } if (value == 'auto') { if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) return element['offset'+style.capitalize()] + 'px'; return null; } return value; }; Element.Methods.setOpacity = function(element, value) { element = $(element); var filter = element.getStyle('filter'), style = element.style; if (value == 1 || value === '') { style.filter = filter.replace(/alpha\([^\)]*\)/gi,''); return element; } else if (value < 0.00001) value = 0; style.filter = filter.replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + (value * 100) + ')'; return element; }; // IE is missing .innerHTML support for TABLE-related elements Element.Methods.update = function(element, html) { element = $(element); html = typeof html == 'undefined' ? '' : html.toString(); var tagName = element.tagName.toUpperCase(); if (['THEAD','TBODY','TR','TD'].include(tagName)) { 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; } } else if (Prototype.Browser.Gecko) { Element.Methods.setOpacity = function(element, value) { element = $(element); element.style.opacity = (value == 1) ? 0.999999 : (value === '') ? '' : (value < 0.00001) ? 0 : value; return element; }; } Element._attributeTranslations = { names: { colspan: "colSpan", rowspan: "rowSpan", valign: "vAlign", datetime: "dateTime", accesskey: "accessKey", tabindex: "tabIndex", enctype: "encType", maxlength: "maxLength", readonly: "readOnly", longdesc: "longDesc" }, values: { _getAttr: function(element, attribute) { return element.getAttribute(attribute, 2); }, _flag: function(element, attribute) { return $(element).hasAttribute(attribute) ? attribute : null; }, style: function(element) { return element.style.cssText.toLowerCase(); }, title: function(element) { var node = element.getAttributeNode('title'); return node.specified ? node.nodeValue : null; } } }; (function() { Object.extend(this, { href: this._getAttr, src: this._getAttr, type: this._getAttr, disabled: this._flag, checked: this._flag, readonly: this._flag, multiple: this._flag }); }).call(Element._attributeTranslations.values); Element.Methods.Simulated = { hasAttribute: function(element, attribute) { var t = Element._attributeTranslations, node; attribute = t.names[attribute] || attribute; node = $(element).getAttributeNode(attribute); return node && node.specified; } }; Element.Methods.ByTag = {}; Object.extend(Element, Element.Methods); if (!Prototype.BrowserFeatures.ElementExtensions && document.createElement('div').__proto__) { window.HTMLElement = {}; window.HTMLElement.prototype = document.createElement('div').__proto__; Prototype.BrowserFeatures.ElementExtensions = true; } Element.hasAttribute = function(element, attribute) { if (element.hasAttribute) return element.hasAttribute(attribute); return Element.Methods.Simulated.hasAttribute(element, attribute); }; Element.addMethods = function(methods) { var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; if (!methods) { Object.extend(Form, Form.Methods); Object.extend(Form.Element, Form.Element.Methods); Object.extend(Element.Methods.ByTag, { "FORM": Object.clone(Form.Methods), "INPUT": Object.clone(Form.Element.Methods), "SELECT": Object.clone(Form.Element.Methods), "TEXTAREA": Object.clone(Form.Element.Methods) }); } if (arguments.length == 2) { var tagName = methods; methods = arguments[1]; } if (!tagName) Object.extend(Element.Methods, methods || {}); else { if (tagName.constructor == Array) tagName.each(extend); else extend(tagName); } function extend(tagName) { tagName = tagName.toUpperCase(); if (!Element.Methods.ByTag[tagName]) Element.Methods.ByTag[tagName] = {}; Object.extend(Element.Methods.ByTag[tagName], 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); } } function findDOMClass(tagName) { var klass; var trans = { "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": "FrameSet", "IFRAME": "IFrame" }; if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName + 'Element'; if (window[klass]) return window[klass]; klass = 'HTML' + tagName.capitalize() + 'Element'; if (window[klass]) return window[klass]; window[klass] = {}; window[klass].prototype = document.createElement(tagName).__proto__; return window[klass]; } if (F.ElementExtensions) { copy(Element.Methods, HTMLElement.prototype); copy(Element.Methods.Simulated, HTMLElement.prototype, true); } if (F.SpecificElementExtensions) { for (var tag in Element.Methods.ByTag) { var klass = findDOMClass(tag); if (typeof klass == "undefined") continue; copy(T[tag], klass.prototype); } } Object.extend(Element, Element.Methods); delete Element.ByTag; }; var 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.toUpperCase(); if (['TBODY', 'TR'].include(tagName)) { 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); /* Portions of the Selector class are derived from Jack Slocum???s DomQuery, * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style * license. Please see http://www.yui-ext.com/ for more information. */ var Selector = Class.create(); Selector.prototype = { initialize: function(expression) { this.expression = expression.strip(); this.compileMatcher(); }, compileMatcher: function() { // Selectors with namespaced attributes can't use the XPath version if (Prototype.BrowserFeatures.XPath && !(/\[[\w-]*?:/).test(this.expression)) return this.compileXPathMatcher(); var e = this.expression, ps = Selector.patterns, h = Selector.handlers, c = Selector.criteria, le, p, m; if (Selector._cache[e]) { this.matcher = Selector._cache[e]; return; } this.matcher = ["this.matcher = function(root) {", "var r = root, h = Selector.handlers, c = false, n;"]; while (e && le != e && (/\S/).test(e)) { le = e; for (var i in ps) { p = ps[i]; if (m = e.match(p)) { this.matcher.push(typeof c[i] == 'function' ? c[i](m) : new Template(c[i]).evaluate(m)); e = e.replace(m[0], ''); break; } } } this.matcher.push("return h.unique(n);\n}"); eval(this.matcher.join('\n')); Selector._cache[this.expression] = this.matcher; }, compileXPathMatcher: function() { var e = this.expression, ps = Selector.patterns, x = Selector.xpath, le, m; if (Selector._cache[e]) { this.xpath = Selector._cache[e]; return; } this.matcher = ['.//*']; while (e && le != e && (/\S/).test(e)) { le = e; for (var i in ps) { if (m = e.match(ps[i])) { this.matcher.push(typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m)); e = e.replace(m[0], ''); break; } } } this.xpath = this.matcher.join(''); Selector._cache[this.expression] = this.xpath; }, findElements: function(root) { root = root || document; if (this.xpath) return document._getElementsByXPath(this.xpath, root); return this.matcher(root); }, match: function(element) { return this.findElements(document).include(element); }, toString: function() { return this.expression; }, inspect: function() { return "#"; } }; Object.extend(Selector, { _cache: {}, xpath: { descendant: "//*", child: "/*", adjacent: "/following-sibling::*[1]", laterSibling: '/following-sibling::*', tagName: function(m) { if (m[1] == '*') return ''; return "[local-name()='" + m[1].toLowerCase() + "' or local-name()='" + m[1].toUpperCase() + "']"; }, className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", id: "[@id='#{1}']", attrPresence: "[@#{1}]", attr: function(m) { m[3] = m[5] || m[6]; return new Template(Selector.xpath.operators[m[2]]).evaluate(m); }, pseudo: function(m) { var h = Selector.xpath.pseudos[m[1]]; if (!h) return ''; if (typeof h === 'function') return h(m); return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); }, operators: { '=': "[@#{1}='#{3}']", '!=': "[@#{1}!='#{3}']", '^=': "[starts-with(@#{1}, '#{3}')]", '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", '*=': "[contains(@#{1}, '#{3}')]", '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" }, pseudos: { 'first-child': '[not(preceding-sibling::*)]', 'last-child': '[not(following-sibling::*)]', 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", 'checked': "[@checked]", 'disabled': "[@disabled]", 'enabled': "[not(@disabled)]", 'not': function(m) { var e = m[6], p = Selector.patterns, x = Selector.xpath, le, m, v; var exclusion = []; while (e && le != e && (/\S/).test(e)) { le = e; for (var i in p) { if (m = e.match(p[i])) { v = typeof x[i] == 'function' ? x[i](m) : new Template(x[i]).evaluate(m); exclusion.push("(" + v.substring(1, v.length - 1) + ")"); e = e.replace(m[0], ''); break; } } } return "[not(" + exclusion.join(" and ") + ")]"; }, 'nth-child': function(m) { return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); }, 'nth-last-child': function(m) { return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); }, 'nth-of-type': function(m) { return Selector.xpath.pseudos.nth("position() ", m); }, 'nth-last-of-type': function(m) { return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); }, 'first-of-type': function(m) { m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); }, 'last-of-type': function(m) { m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); }, 'only-of-type': function(m) { var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); }, nth: function(fragment, m) { var mm, formula = m[6], predicate; if (formula == 'even') formula = '2n+0'; if (formula == 'odd') formula = '2n+1'; if (mm = formula.match(/^(\d+)$/)) // digit only return '[' + fragment + "= " + mm[1] + ']'; if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b if (mm[1] == "-") mm[1] = -1; var a = mm[1] ? Number(mm[1]) : 1; var b = mm[2] ? Number(mm[2]) : 0; predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + "((#{fragment} - #{b}) div #{a} >= 0)]"; return new Template(predicate).evaluate({ fragment: fragment, a: a, b: b }); } } } }, criteria: { tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', className: 'n = h.className(n, r, "#{1}", c); c = false;', id: 'n = h.id(n, r, "#{1}", c); c = false;', attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', attr: function(m) { m[3] = (m[5] || m[6]); return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); }, pseudo: function(m) { if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); }, descendant: 'c = "descendant";', child: 'c = "child";', adjacent: 'c = "adjacent";', laterSibling: 'c = "laterSibling";' }, patterns: { // combinators must be listed first // (and descendant needs to be last combinator) laterSibling: /^\s*~\s*/, child: /^\s*>\s*/, adjacent: /^\s*\+\s*/, descendant: /^\s/, // selectors follow tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, id: /^#([\w\-\*]+)(\b|$)/, className: /^\.([\w\-\*]+)(\b|$)/, pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|\s|(?=:))/, attrPresence: /^\[([\w]+)\]/, attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\]]*?)\4|([^'"][^\]]*?)))?\]/ }, handlers: { // UTILITY FUNCTIONS // joins two collections concat: function(a, b) { for (var i = 0, node; node = b[i]; i++) a.push(node); return a; }, // marks an array of nodes for counting mark: function(nodes) { for (var i = 0, node; node = nodes[i]; i++) node._counted = true; return nodes; }, unmark: function(nodes) { for (var i = 0, node; node = nodes[i]; i++) node._counted = undefined; return nodes; }, // mark each child node with its position (for nth calls) // "ofType" flag indicates whether we're indexing for nth-of-type // rather than nth-child index: function(parentNode, reverse, ofType) { parentNode._counted = true; if (reverse) { for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { node = nodes[i]; if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; } } else { for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; } }, // filters out duplicates and extends all nodes unique: function(nodes) { if (nodes.length == 0) return nodes; var results = [], n; for (var i = 0, l = nodes.length; i < l; i++) if (!(n = nodes[i])._counted) { n._counted = true; results.push(Element.extend(n)); } return Selector.handlers.unmark(results); }, // COMBINATOR FUNCTIONS descendant: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) h.concat(results, node.getElementsByTagName('*')); return results; }, child: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) { for (var j = 0, children = [], child; child = node.childNodes[j]; j++) if (child.nodeType == 1 && child.tagName != '!') results.push(child); } return results; }, adjacent: function(nodes) { for (var i = 0, results = [], node; node = nodes[i]; i++) { var next = this.nextElementSibling(node); if (next) results.push(next); } return results; }, laterSibling: function(nodes) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) h.concat(results, Element.nextSiblings(node)); return results; }, nextElementSibling: function(node) { while (node = node.nextSibling) if (node.nodeType == 1) return node; return null; }, previousElementSibling: function(node) { while (node = node.previousSibling) if (node.nodeType == 1) return node; return null; }, // TOKEN FUNCTIONS tagName: function(nodes, root, tagName, combinator) { tagName = tagName.toUpperCase(); var results = [], h = Selector.handlers; if (nodes) { if (combinator) { // fastlane for ordinary descendant combinators if (combinator == "descendant") { for (var i = 0, node; node = nodes[i]; i++) h.concat(results, node.getElementsByTagName(tagName)); return results; } else nodes = this[combinator](nodes); if (tagName == "*") return nodes; } for (var i = 0, node; node = nodes[i]; i++) if (node.tagName.toUpperCase() == tagName) results.push(node); return results; } else return root.getElementsByTagName(tagName); }, id: function(nodes, root, id, combinator) { var targetNode = $(id), h = Selector.handlers; if (!nodes && root == document) return targetNode ? [targetNode] : []; if (nodes) { if (combinator) { if (combinator == 'child') { for (var i = 0, node; node = nodes[i]; i++) if (targetNode.parentNode == node) return [targetNode]; } else if (combinator == 'descendant') { for (var i = 0, node; node = nodes[i]; i++) if (Element.descendantOf(targetNode, node)) return [targetNode]; } else if (combinator == 'adjacent') { for (var i = 0, node; node = nodes[i]; i++) if (Selector.handlers.previousElementSibling(targetNode) == node) return [targetNode]; } else nodes = h[combinator](nodes); } for (var i = 0, node; node = nodes[i]; i++) if (node == targetNode) return [targetNode]; return []; } return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; }, className: function(nodes, root, className, combinator) { if (nodes && combinator) nodes = this[combinator](nodes); return Selector.handlers.byClassName(nodes, root, className); }, byClassName: function(nodes, root, className) { if (!nodes) nodes = Selector.handlers.descendant([root]); var needle = ' ' + className + ' '; for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { nodeClassName = node.className; if (nodeClassName.length == 0) continue; if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) results.push(node); } return results; }, attrPresence: function(nodes, root, attr) { var results = []; for (var i = 0, node; node = nodes[i]; i++) if (Element.hasAttribute(node, attr)) results.push(node); return results; }, attr: function(nodes, root, attr, value, operator) { if (!nodes) nodes = root.getElementsByTagName("*"); var handler = Selector.operators[operator], results = []; for (var i = 0, node; node = nodes[i]; i++) { var nodeValue = Element.readAttribute(node, attr); if (nodeValue === null) continue; if (handler(nodeValue, value)) results.push(node); } return results; }, pseudo: function(nodes, name, value, root, combinator) { if (nodes && combinator) nodes = this[combinator](nodes); if (!nodes) nodes = root.getElementsByTagName("*"); return Selector.pseudos[name](nodes, value, root); } }, pseudos: { 'first-child': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { if (Selector.handlers.previousElementSibling(node)) continue; results.push(node); } return results; }, 'last-child': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { if (Selector.handlers.nextElementSibling(node)) continue; results.push(node); } return results; }, 'only-child': function(nodes, value, root) { var h = Selector.handlers; for (var i = 0, results = [], node; node = nodes[i]; i++) if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) results.push(node); return results; }, 'nth-child': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root); }, 'nth-last-child': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, true); }, 'nth-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, false, true); }, 'nth-last-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, formula, root, true, true); }, 'first-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, "1", root, false, true); }, 'last-of-type': function(nodes, formula, root) { return Selector.pseudos.nth(nodes, "1", root, true, true); }, 'only-of-type': function(nodes, formula, root) { var p = Selector.pseudos; return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); }, // handles the an+b logic getIndices: function(a, b, total) { if (a == 0) return b > 0 ? [b] : []; return $R(1, total).inject([], function(memo, i) { if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); return memo; }); }, // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type nth: function(nodes, formula, root, reverse, ofType) { if (nodes.length == 0) return []; if (formula == 'even') formula = '2n+0'; if (formula == 'odd') formula = '2n+1'; var h = Selector.handlers, results = [], indexed = [], m; h.mark(nodes); for (var i = 0, node; node = nodes[i]; i++) { if (!node.parentNode._counted) { h.index(node.parentNode, reverse, ofType); indexed.push(node.parentNode); } } if (formula.match(/^\d+$/)) { // just a number formula = Number(formula); for (var i = 0, node; node = nodes[i]; i++) if (node.nodeIndex == formula) results.push(node); } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b if (m[1] == "-") m[1] = -1; var a = m[1] ? Number(m[1]) : 1; var b = m[2] ? Number(m[2]) : 0; var indices = Selector.pseudos.getIndices(a, b, nodes.length); for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { for (var j = 0; j < l; j++) if (node.nodeIndex == indices[j]) results.push(node); } } h.unmark(nodes); h.unmark(indexed); return results; }, 'empty': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) { // IE treats comments as element nodes if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; results.push(node); } return results; }, 'not': function(nodes, selector, root) { var h = Selector.handlers, selectorType, m; var exclusions = new Selector(selector).findElements(root); h.mark(exclusions); for (var i = 0, results = [], node; node = nodes[i]; i++) if (!node._counted) results.push(node); h.unmark(exclusions); return results; }, 'enabled': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (!node.disabled) results.push(node); return results; }, 'disabled': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (node.disabled) results.push(node); return results; }, 'checked': function(nodes, value, root) { for (var i = 0, results = [], node; node = nodes[i]; i++) if (node.checked) results.push(node); return results; } }, operators: { '=': function(nv, v) { return nv == v; }, '!=': function(nv, v) { return nv != v; }, '^=': function(nv, v) { return nv.startsWith(v); }, '$=': function(nv, v) { return nv.endsWith(v); }, '*=': function(nv, v) { return nv.include(v); }, '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } }, matchElements: function(elements, expression) { var matches = new Selector(expression).findElements(), h = Selector.handlers; h.mark(matches); for (var i = 0, results = [], element; element = elements[i]; i++) if (element._counted) results.push(element); h.unmark(matches); return results; }, findElement: function(elements, expression, index) { if (typeof expression == 'number') { index = expression; expression = false; } return Selector.matchElements(elements, expression || '*')[index || 0]; }, findChildElements: function(element, expressions) { var exprs = expressions.join(','), expressions = []; exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { expressions.push(m[1].strip()); }); var results = [], h = Selector.handlers; for (var i = 0, l = expressions.length, selector; i < l; i++) { selector = new Selector(expressions[i].strip()); h.concat(results, selector.findElements(element)); } return (l > 1) ? h.unique(results) : results; } }); function $$() { return Selector.findChildElements(document, $A(arguments)); } var Form = { reset: function(form) { $(form).reset(); return form; }, serializeElements: function(elements, getHash) { var data = elements.inject({}, function(result, element) { if (!element.disabled && element.name) { var key = element.name, value = $(element).getValue(); if (value != null) { if (key in result) { if (result[key].constructor != Array) result[key] = [result[key]]; result[key].push(value); } else result[key] = value; } } return result; }); return getHash ? data : Hash.toQueryString(data); } }; Form.Methods = { serialize: function(form, getHash) { return Form.serializeElements(Form.getElements(form), getHash); }, 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 $A(inputs).map(Element.extend); for (var i = 0, matchingInputs = [], 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(form).invoke('disable'); return form; }, enable: function(form) { form = $(form); Form.getElements(form).invoke('enable'); 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; }, request: function(form, options) { form = $(form), options = Object.clone(options || {}); var params = options.parameters; options.parameters = form.serialize(true); if (params) { if (typeof params == 'string') params = params.toQueryParams(); Object.extend(options.parameters, params); } if (form.hasAttribute('method') && !options.method) options.method = form.method; return new Ajax.Request(form.readAttribute('action'), options); } } /*--------------------------------------------------------------------------*/ 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 && element.name) { var value = element.getValue(); if (value != undefined) { var pair = {}; pair[element.name] = value; return Hash.toQueryString(pair); } } return ''; }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); return Form.Element.Serializers[method](element); }, clear: function(element) { $(element).value = ''; return element; }, present: function(element) { return $(element).value != ''; }, activate: function(element) { element = $(element); try { element.focus(); if (element.select && (element.tagName.toLowerCase() != 'input' || !['button', 'reset', 'submit'].include(element.type))) element.select(); } catch (e) {} return element; }, disable: function(element) { element = $(element); element.blur(); element.disabled = true; return element; }, enable: function(element) { element = $(element); element.disabled = false; return element; } } /*--------------------------------------------------------------------------*/ var Field = Form.Element; var $F = Form.Element.Methods.getValue; /*--------------------------------------------------------------------------*/ 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); } }, inputSelector: function(element) { return element.checked ? element.value : null; }, textarea: function(element) { return element.value; }, select: function(element) { return this[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); }, selectOne: function(element) { var index = element.selectedIndex; return index >= 0 ? this.optionValue(element.options[index]) : null; }, selectMany: function(element) { var values, length = element.length; if (!length) return null; for (var i = 0, values = []; i < length; i++) { var opt = element.options[i]; if (opt.selected) values.push(this.optionValue(opt)); } return values; }, optionValue: function(opt) { // extend element because hasAttribute may not be native return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; } } /*--------------------------------------------------------------------------*/ 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(); var changed = ('string' == typeof this.lastValue && 'string' == typeof value ? this.lastValue != value : String(this.lastValue) != String(value)); if (changed) { 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' && (Prototype.Browser.WebKit || element.attachEvent)) name = 'keydown'; Event._observeAndCache(element, name, observer, useCapture); }, stopObserving: function(element, name, observer, useCapture) { element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (Prototype.Browser.WebKit || element.attachEvent)) 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 (Prototype.Browser.IE) 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 (Prototype.Browser.WebKit) { 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(); Object.extend(Event, { _domReady : function() { if (arguments.callee.done) return; arguments.callee.done = true; if (Event._timer) clearInterval(Event._timer); Event._readyCallbacks.each(function(f) { f() }); Event._readyCallbacks = null; }, onReady : function(f) { if (!this._readyCallbacks) { var domReady = this._domReady; if (domReady.done) return f(); if (document.addEventListener) document.addEventListener("DOMContentLoaded", domReady, false); /*@cc_on @*/ /*@if (@_win32) document.write("'); } else { document.write(''); } } else if (url.indexOf('globeandmail.ca') > -1){ if (url.indexOf('politics') > -1){ document.write(''); } else { document.write(''); } } else if (url.indexOf('globeandmail.com') > -1){ if (url.indexOf('politics') > -1){ document.write(''); } else { document.write(''); } } _Qhttp://orion.eyereturn.com/log.aspx?site=1431&page=ONTARIO_the_globe_and_mail_comUutf-8Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver" &,-345QRSTUVWXYZ[\]^_`]abcdefjkU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1!  '()$+WNS.base[NS.relative_Qhttp://orion.eyereturn.com/log.aspx?site=1431&page=ONTARIO_the_globe_and_mail_com./01X$classesZ$classname12UNSURLXNSObject#A{C 6789EWNS.keysZNS.objects:;<=>?@ABCD FGHIJKLMNOP_X-Aspnet-Version]Cache-ControlWExpires\X-Powered-BySP3pVPragma\Content-TypeVServer^Content-LengthTDateZSet-CookieY2.0.50727Xno-cacheR-1WASP.NET_bpolicyref="http://orion.eyereturn.com/w3c/p3p.xml", CP="NOI DSP PSAa PSDa OUR STP IND UNI COM NAV"_text/javascript; charset=utf-8_Microsoft-IIS/7.0T1686_Tue, 23 Dec 2008 15:46:05 GMT_SorionSession1431=8048; domain=.eyereturn.com; expires=Tue, 23-Dec-2008 16:16:05 GMT./ghhi2_NSMutableDictionary\NSDictionary./lmmn2_NSHTTPURLResponse]NSURLResponse)27:PRd  dir} #04;HO^cnx&+Ko_text/javascriptO erSE={theSE:""};erSE.search_engines=[['google','q'],['search\.yahoo','p'],['ca\.search\.yahoo','p'],['search\.msn','q'],['search\.live','q'],['search\.aol','query'],['ask\.com','q'],['altavista','q'],['search\.lycos','query'],['alltheweb','q']];erSE.decodeReferrer=function(referrer){var query=null;var regex=new RegExp('');for(var i=0;i=0) {qs=new String(referrer.substring(idx+2));} else {idx=referrer.indexOf('?');qs=new String(referrer.substring(idx+1));} if(idx>=0){idx=0;idx2=0;var loops=0;while((idx>=0)&&((idx2=qs.indexOf('=',idx))>=0)&&loops<15){var key,val;key=qs.substring(idx,idx2);idx=qs.indexOf('&',idx2)+1;if(key==match){if(idx<=0){return qs.substring(idx2+1);}else{return qs.substring(idx2+1,idx-1);}} loops++;}} return null;};erSE.getKeywords=function() {q=erSE.decodeReferrer(document.referrer) var keywords="";if(q!=null) {for(var i=0;i?@A CDEFGHIJ\X-Powered-By]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtag]Last-ModifiedWASP.NETUbytes_application/x-javascript_Microsoft-IIS/5.0T1177_Tue, 23 Dec 2008 15:24:22 GMT_"307933635029c91:a98"_Wed, 08 Oct 2008 14:15:59 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd CHQ\_enwy %+FZ_dOvar P5_frequency = new Array(0); var P5_siteList = new Array(0); P5_frequency[0] = 10; P5_siteList[0] = 'globeandmail.com/' P5_frequency[1] = 10; P5_siteList[1] = 'globeandmail.ca/' P5_frequency[2] = 10; P5_siteList[2] = 'globesports.com/' P5_frequency[3] = 10; P5_siteList[3] = 'globeauto.com/' P5_frequency[4] = 10; P5_siteList[4] = 'cars.globeauto.com/' P5_frequency[5] = 20; P5_siteList[5] = 'globeinvestor.com/' P5_frequency[6] = 100; P5_siteList[6] = 'globefund.com/' P5_frequency[7] = 10; P5_siteList[7] = 'gold.globeinvestor.com/' P5_frequency[8] = 10; P5_siteList[8] = 'secure.theglobeandmail.com/' P5_frequency[9] = 10; P5_siteList[9] = 'globeinvestor.ar.wilink.com/' P5_frequency[10] = 10; P5_siteList[10] = 'globeadvisor.com/' P5_frequency[11] = 10; P5_siteList[11] = 'globecareers.workopolis.com/' P5_frequency[12] = 10; P5_siteList[12] = 'globeautos.com/' P5_frequency[13] = 10; P5_siteList[13] = 'reportonbusiness.com' P5_frequency[14] = 10; P5_siteList[14] = 'globeandmail.com/realestate' P5_frequency[15] = 10; P5_siteList[15] = 'globeandmail.com/technology' P5_frequency[16] = 10; P5_siteList[16] = 'globeandmail.com/life' !_7http://www.lcnd.ca/phase5/GlobeGroup/js/p5_exitMulti.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_7http://www.lcnd.ca/phase5/GlobeGroup/js/p5_exitMulti.js./01X$classesZ$classname12UNSURLXNSObject#At8 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ\X-Powered-By]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtag]Last-ModifiedWASP.NETUbytes_application/x-javascript_Microsoft-IIS/5.0T4835_Tue, 23 Dec 2008 15:24:22 GMT_"096f6a5279c81:a98"_Wed, 27 Feb 2008 15:07:06 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd DIR]`foxz &,G[`dO var P5_unLoad=1;var P5_sourceSite=location.href;var P5_destSite=location.href;var P5_sourceAction=0;function P5_generateRandomNumber(intMin,intMax){return Math.round(Math.random()*(intMax-intMin)+intMin);} function P5_GetSiteID() {var siteId;var index;siteId=0;for(index=P5_siteList.length-1;index>=0;--index) if(location.href.indexOf(P5_siteList[index])>=0) siteId=index;if(location.href.indexOf('/realestate')>0) siteId=14;if(location.href.indexOf('/technology')>0) siteId=15;if(location.href.indexOf('/life')>0) siteId=16;return siteId;} function P5_GetFrequency() {var frequency;var siteNumber;frequency=0;siteNumber=P5_GetSiteID();if(siteNumber>0) frequency=P5_frequency[siteNumber];return frequency;} function P5_getCookie(name) {if(document.cookie==null) return null;var cookies=document.cookie;var index=cookies.indexOf(name+"=");if(index==-1) return null;index=cookies.indexOf("=",index)+1;var endstr=cookies.indexOf(";",index);if(endstr==-1) endstr=cookies.length;return unescape(cookies.substring(index,endstr));} function P5_setCookie(name,value,expiry) {var dtExpire=new Date(expiry);if(value!=null&&value!="") {document.cookie=name+"="+escape(value)+"; Version=1; Path=/; expires="+dtExpire.toGMTString();}} function P5_testCookie(){document.cookie="tst_cookie=1";if(P5_getCookie("tst_cookie")==null)return false;return true;} function P5_addHandler(obj,evt,newhandler,captures) {if(obj.attachEvent) obj.attachEvent('on'+evt,newhandler);else if(obj.addEventListener) obj.addEventListener(evt,newhandler,captures);else {var oldhandler;if(oldhandler=obj['on'+evt]) obj['on'+evt]=function() {oldhandler();newhandler();} else obj['on'+evt]=newhandler;}} function P5_disableIndividualElements() {xObj=eval(document.getElementById('flashSearch'));if(xObj) {P5_addHandler(xObj,'mouseover',P5_disarmIntercept,false);P5_addHandler(xObj,'mousemove',P5_disarmIntercept,false);P5_addHandler(xObj,'mouseout',P5_armIntercept,false);}} function P5_disableHyperlinks() {var x=document.getElementsByTagName('a');for(m=0;m=0;--index) if(loc.indexOf(P5_siteList[index])>=0) disarmSite=true;return disarmSite;} function P5_disarmIntercept(){P5_unLoad=0;return true;} function P5_armIntercept(){P5_unLoad=1;return true;} function P5_onExit(){if(P5_unLoad==1)return P5_showIntercept(location.href);return true;} function P5_setDestinationSite(loc){P5_sourceAction=1;P5_destSite=loc;} function P5_showIntercept() {if(P5_unLoad==0) return true;var sObj=new String(P5_destSite);if(sObj.indexOf('javascript')>=0) return true;if(P5_generateRandomNumber(1,1000)<=P5_GetFrequency()) {var dtExpire=new Date(2008,12,31);P5_setCookie("P5GlobeGroup070404","true",dtExpire);if(P5_getCookie("P5GlobeGroup070404")!=null) {window.location='https://www.lcnd.ca/phase5/GlobeGroup/Invitation.aspx?source='+escape(P5_sourceSite)+'&dest='+escape(P5_destSite)+'&action='+P5_sourceAction;return false;}} else {document.cookie="P5GlobeGroup070404=session;";} return true;} function prepareIntercept(strLanguage) {if(P5_GetFrequency()==0||top!=self||P5_testCookie()==false) return;if(P5_getCookie("P5GlobeGroup070404")==null) {var ua=navigator.userAgent.toLowerCase();if(document.addEventListener&&(ua.indexOf("opera")==-1&&ua.indexOf("safari")==-1)) {document.addEventListener("DOMContentLoaded",P5_onExitLinks,null);} window.addEvent?addEvent(window,"load",P5_onExitLinks):P5_addHandler(window,"load",P5_onExitLinks,false);} return;}!_8http://images.theglobeandmail.com/v5/scripts/s_code.js?1Ocbplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_8http://images.theglobeandmail.com/v5/scripts/s_code.js?1./01X$classesZ$classname12UNSURLXNSObject#At73 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=14149_Tue, 23 Dec 2008 19:20:01 GMTUbytes_Apache/2.2.0 (Unix) DAV/2_application/x-javascriptU16417_Tue, 23 Dec 2008 15:24:12 GMT_"4021-f8a0df00"Zkeep-alive_Fri, 05 Dec 2008 15:02:52 GMT./deef2_NSMutableDictionary\NSDictionary@!./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  INWbekt} %*5CQqw0=@EI]lkO@!/* SiteCatalyst code version: H.17. Copyright 1997-2008 Omniture, Inc. More info available at http://www.omniture.com */ var s_account="bellgmpprod" var s=s_gi(s_account) /************************** CONFIG SECTION **************************/ /* You may add or alter any code config here. */ s.charSet="ISO-8859-1" /* Conversion Config */ s.currencyCode="USD" /* Link Tracking Config */ s.trackDownloadLinks=true s.trackExternalLinks=true s.trackInlineStats=true s.linkDownloadFileTypes="exe,zip,wav,mp3,mov,mpg,avi,wmv,doc,pdf,xls" s.linkInternalFilters="javascript:,globeadvisor,globeinvestorgold,globefund,globeinvestor,theglobeandmail,globetechnology,globeauto,globesports,reportonbusiness,globecampus" s.linkLeaveQueryString=false s.linkTrackVars="None" s.linkTrackEvents="None" /* WARNING: Changing any of the below variables will cause drastic changes to how your visitor data is collected. Changes should only be made when instructed to do so by your account manager.*/ s.visitorNamespace="bellglobemediapublishing" s.dc=122 /************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/ var s_code='',s_objectID;function s_gi(un,pg,ss){var c="=fun@6(~){`Ks=^S~$h ~.substring(~.indexOf(~;@t~';`Bt`t~=new Fun@6(~.toLowerCase()~s_c_il['+s^sn+']~};s.~`m@t~.length~.toUpperCase~=new Object~s" +".wd~','~){@t~')q='~.location~var ~s.pt(~dynamicAccount~link~s.apv~='+@y(~)@tx^m!Object$eObject.prototype$eObject.prototype[x])~);s.~Element~.getTime()~=new Array~ookieDomainPeriods~s.m_~referrer~.p" +"rotocol~=new Date~BufferedRequests~}c$s(e){~visitor~;@X^js[k],255)}~=''~javaEnabled~conne@6^M~@0c_i~Name~:'')~onclick~}@t~else ~ternalFilters~javascript~s.dl~@Os.b.addBehavior(\"# default# ~=parseF" +"loat(~'+tm.get~=='~cookie~s.rep(~s.^T~track~o@0oid~browser~.parent~window~colorDepth~String~while(~.host~.lastIndexOf('~s.sq~s.maxDelay~s.vl_g~r=s.m(f)?s[f](~for(~s.un~s.eo~&&s.~parseInt(~t=s.ot(o)" +"~j='1.~#4URL~lugins~dynamicVariablePrefix~document~Type~Sampling~s.rc[un]~Download~Event~');~this~tfs~resolution~s.c_r(~s.c_w(~s.eh~s.isie~s.vl_l~s.vl_t~Height~t,h){t=t?t~tcf~isopera~ismac~escape(~" +".href~screen.~s.fl(~Version~harCode~&&(~_'+~variableProvider~s.pe~)?'Y':'N'~:'';h=h?h~._i~e&&l$HSESSION'~f',~onload~name~home#4~objectID~}else{~.s_~s.rl[u~Width~s.ssl~o.type~Timeout(~ction~Lifetime" +"~.mrq(\"'+un+'\")~sEnabled~;i++)~'){q='~&&l$HNONE'){~ExternalLinks~charSet~onerror~lnk~currencyCode~.src~s=s_gi(~etYear(~&&!~Opera~'s_~;try{~Math.~s.fsg~s.ns6~s.oun~InlineStats~Track~'0123456789~&&" +"t~s[k]=~s.epa(~m._d~n=s.oid(o)~,'sqs',q);~LeaveQuery~')>=~'=')~)+'/~){n=~\",''),~vo)~s.sampled~=s.oh(o);~+(y<1900?~s.disable~ingServer~n]=~true~sess~campaign~lif~if(~'http~,100)~s.co(~x in ~s.ape~f" +"fset~s.c_d~s.br~'&pe~s.gg(~s.gv(~s[mn]~s.qav~,'vo~s.pl~=(apn~Listener~\"s_gs(\")~vo._t~b.attach~d.create~=s.n.app~(''+~!='~'||t~'+n~s()+'~){p=~():''~a):f(~+1))~a['!'+t]~){v=s.n.~channel~un)~.target" +"~o.value~g+\"_c\"]~\".tl(\")~etscape~(ns?ns:~s_')t=t~k',s.bc~omePage~s.d.get~')<~||!~[b](e);~m[t+1](~return~mobile~height~events~random~code~'MSIE ~rs,~un,~,pev~floor(~atch~s.num(~[\"s_\"+~s.c_gd~s" +".dc~s.pg~,'lt~.inner~transa~;s.gl(~\"m_\"+n~idt='+~page~Group,~.fromC~sByTag~?'&~+';'~t&&~1);~){s.~[t]=~>=5)~[t](~=l[n];~!a[t])~~s._c=@Nc';`F=^1`5!`F`hn){`F`hl`U;`F`hn=0;}s^sl=`F`hl;s^sn=`F`hn;s^sl" +"[s^s@os;`F`hn++;s.m`0m){`2$Gm)`4'{$d0`Afl`0x,l){`2x?$Gx)`30,l):x`Aco`0o`H!o)`2o;`Kn`E,x;^B@xo)@tx`4'select$d0&&x`4'filter$d0)n[x]=o[x];`2n`Anum`0x){x`e+x;^B`Kp=0;p127){l=0;e`e;^4n||l<4){e=h`3n%16,n%16+1)+e;n=(n-n%16)/16;l++}y+" +"='%u'+e}`Bc`t+')y+='%2B';`my+=^gc)}x=y^zx=x?`v^g''+x),'+`G%2B'):x`5x&&c^Eem==1&&x`4'%u$d0&&x`4'%U$d0){i=x`4'%^R^4i>=0){i++`5h`38)`4x`3i,i+1)`D())>=0)`2x`30,i)+'u00'+x`3i);i=x`4'%',i)}}}}`2x`Aepa`0x" +"`1;`2x?un^g`v''+x,'+`G ')):x`Apt`0x,d,f,a`1,t=x,z=0,y,r;^4t){y=t`4d);y=y<0?t`C:y;t=t`30,y);^At,$Nt,a)`5r)`2r;z+=y+d`C;t=x`3z,x`C);t=z=0)a=a`30,c)`5t`30,2)`t" +"$Z`32);`2(t!`e@W==a)`Afsf`0t,a`1`5`La,`G,'is^ut))@Q+=(@Q!`e?`G`j+t;`20`Afs`0x,f`1;@Q`e;`Lx,`G,'fs^uf);`2@Q`Ac_d`e;$vf`0t,a`1`5!$tt))`21;`20`Ac_gd`0`1,d=`F`J^5^w,n=s.fpC`V,p`5!n)n=s.c`V`5d@L$0@gn?^F" +"n):2;n=n>2?n:2;p=d^6.')`5p>=0){^4p>=0&&n>1$Ld^6.',p-#Bn--}$0=p>0&&`Ld,'.`Gc_gd^u0)?d`3p):d}}`2$0`Ac_r`0k`1;k=@y(k);`Kc=' '+s.d.`u,i=c`4' '+k+@e,e=i<0?i:c`4';',i),v=i<0?'':@Yc`3i+2+k`C,e<0?c`C:e));`" +"2v$H[[B]]'?v:''`Ac_w`0k,v,e`1,d=$v(),l=s.`u@7,t;v`e+v;l=l?$Gl)`D$M`5^t@Ct=(v!`e?^Fl?l:0):-60)`5t){e`Z;e.setTime(e`T+(t*1000))}`lk@Cs.d.`u=k+'`Pv!`e?v:'[[B]]')+'; path=/;'+(^t?' expires='+e.toGMT^3(" +")#9`j+(d?' domain='+d#9`j;`2^Vk)==v}`20`Aeh`0o,e,r,f`1,b='s^ne+'^ns^sn,n=-1,l,i,x`5!^Xl)^Xl`U;l=^Xl;^Bi=0;i=5^m!s.^e||`O>=7)){^d`7's`Gf`Ga`Gt`G`Ke,r@O^A$Na)`br=s.m(t)?s#Fe):t(e)}`2r^Rr=^d(s,f,a,t)^z@ts.^f^Eu`4$n4@d0)r=s.m(b)?s[b](a):" +"b(a);else{^X(`F,'@F',0,o);^A$Na`Reh(`F,'@F',1)}}`2r`Ag^Tet`0e`1;`2`w`Ag^Toe`7'e`G`Ks=`9,c;^X(^1,\"@F\",1`Re^T=1;c=s.t()`5c)s.d.write(c`Re^T=0;`2@p'`Rg^Tfb`0a){`2^1`Ag^Tf`0w`1,p=w^0,l=w`J;`w=w`5p&&p" +"`J!=l&&p`J^5==l^5){`w=p;`2s.g^Tf(`w)}`2`w`Ag^T`0`1`5!`w){`w=`F`5!s.e^T)`w=s.cet('g^T^u`w,'g^Tet',s.g^Toe,'g^Tfb')}`2`w`Amrq`0u`1,l=@1],n,r;@1]=0`5l)^Bn=0;n5.5)rs=^j$o4095);`mrs=^j$o2047)`lid){$1(id,rs);$h}`ls.d.images&&`O>=3^m!s.^e||`O>=7)^m@R<0||`O>=6.1)`H!s.rc)s.rc`E`5!^O){^O=1`5!s.rl)s.rl`E;@1n]`U;set@5'" +"@t^1`hl)^1.`9@8',750)^zl=@1n]`5l){r.t=ta;r.u=un;r.r=rs;l[l`C]=r;`2''}imn+='^n^O;^O++}im=`F[imn]`5!im)im=`F[im@onew Image;im@0l=0;im.^v`7'e`G^S@0l=1`5^1`hl)^1.`9@8^Rim@I=rs`5rs`4$2=@d0^m!ta||ta`t_se" +"lf$Ia`t_top'||(`F.^w@Wa==`F.^w))){b=e`Z;^4!im@0l&&e`T-b`T<500)e`Z}`2''}`2''`Agg`0v`1`5!`F['s^nv])`F['s^nv]`e;`2`F['s^nv]`Aglf`0t,a`Ht`30,2)`" +"t$Z`32);`Ks=^S,v=$3t)`5v)s#Dv`Agl`0v`1`5$x)`Lv,`G,'gl^u0)`Agv`0v`1;`2s['vpm^nv]?s['vpv^nv]:(s[v]?s[v]`j`Ahavf`0t,a`1,b=t`30,4),x=t`34),n=^Fx),k='g^nt,m='vpm^nt,q=t,v=s.`N@UVa$oe=s.`N@U^Qs,mn;@X$4t)" +"`5s.@G||^D||^p`H^p^Epe`30,4)$H@G_'){mn=^p`30,1)`D()+^p`31)`5$5){v=$5.`xVars;e=$5.`x^Qs}}v=v?v+`G+^Z+`G+^Z2:''`5v@L`Lv,`G,'is^ut))s[k]`e`5t`t$k'&&e)@Xs.fs(s[k],e)}s[m]=0`5t`t^K`ID`6`cID`Ivid`6^I@Bg'" +"`d`Bt`t`X@Br'`d`Bt`tvmk`Ivmt`6@E@Bce'`5s[k]&&s[k]`D()`tAUTO')@X'ISO8859-1';`Bs[k]^Eem==2)@X'UTF-8'}`Bt`t`c`ispace`Ins`6c`V`Icdp`6`u@7`Icl`6^o`Ivvp`6@H`Icc`6$R`Ich`6#0@6ID`Ixact`6@r`Iv0`6^U`Is`6^2`I" +"c`6`o^k`Ij`6`f`Iv`6`u@9`Ik`6`z@2`Ibw`6`z^b`Ibh`6`g`Ict`6^x`Ihp`6p^J`Ip';`B$tx)`Hb`tprop`Ic$J;`Bb`teVar`Iv$J;`Bb`thier@Bh$J`d`ls[k]@W$H`N`i'@W$H`N^M')$6+='&'+q+'`Ps[k]);`2''`Ahav`0`1;$6`e;`L^a,`G,'h" +"av^u0);`2$6`Alnf`0^c`8^r`8:'';`Kte=t`4@e`5t@We>0&&h`4t`3te$O>=0)`2t`30,te);`2''`Aln`0h`1,n=s.`N`is`5n)`2`Ln,`G,'ln^uh);`2''`Altdf`0^c`8^r`8:'';`Kqi=h`4'?^Rh=qi>=0?h`30,qi):h`5#Ah`3h`C-(t`C$O`t.'+t)" +"`21;`20`Altef`0^c`8^r`8:''`5#Ah`4t)>=0)`21;`20`Alt`0h`1,lft=s.`N^PFile^Ms,lef=s.`NEx`n,@s=s.`NIn`n;@s=@s?@s:`F`J^5^w;h=h`8`5s.`x^PLinks&&lf#A`Llft,`G$yd^uh))`2'd'`5s.`x@D&&h`30,1)$H# '^mlef||@s)^m!" +"lef||`Llef,`G$ye^uh))^m!@s$e`L@s,`G$ye^uh)))`2'e';`2''`Alc`7'e`G`Ks=`9,b=^X(^S,\"`k\"`R@G=@w^S`Rt(`R@G=0`5b)`2^S$f`2@p'`Rbc`7'e`G`Ks=`9,f,^d`5s.d^Ed.all^Ed.all.cppXYctnr)$h;^D=e@I`S?e@I`S:e$T;^d`7" +"\"s\",\"`Ke@O@t^D^m^D.tag`i||^D^0`S||^D^0Node))s.t()`b}\");^d(s`Reo=0'`Roh`0o`1,l=`F`J,h=o^h?o^h:'',i,j,k,p;i=h`4':^Rj=h`4'?^Rk=h`4'/')`5h^mi<0||(j>=0&&i>j)||(k>=0&&i>k))$Lo`Y&&o`Y`C>1?o`Y:(l`Y?l`Y" +"`j;i=l.path^w^6/^Rh=(p?p+'//'`j+(o^5?o^5:(l^5?l^5`j)+(h`30,1)$H/'?l.path^w`30,i<0?0:i@f'`j+h}`2h`Aot`0o){`Kt=o.tag`i;t=t@W`D?t`D$M`5t`tSHAPE')t`e`5t`Ht`tINPUT'&&@4&&@4`D)t=@4`D();`B!#Ao^h)t='A';}`2" +"t`Aoid`0o`1,^G,p,c,n`e,x=0`5t@L`y$Lo`Y;c=o.`k`5o^h^mt`tA$I`tAREA')^m!c$ep||p`8`4'`o$d0))n@k`Bc@g`vs.rep(`vs.rep$Gc,\"\\r@h\"\\n@h\"\\t@h' `G^Rx=2}`B$U^mt`tINPUT$I`tSUBMIT')@g$U;x=3}`Bo@I@W`tIMAGE')" +"n=o@I`5n){`y=^jn@v;`yt=x}}`2`y`Arqf`0t,un`1,e=t`4@e,u=e>=0?`G+t`30,e)+`G:'';`2u&&u`4`G+un+`G)>=0?@Yt`3e$O:''`Arq`0un`1,c=un`4`G),v=^V@Nsq'),q`e`5c<0)`2`Lv,'&`Grq^u$S;`2`L$p`G,'rq',0)`Asqp`0t,a`1,e=" +"t`4@e,q=e<0?'':@Yt`3e+1)`Rsqq[q]`e`5e>=0)`Lt`30,e),`G@b`20`Asqs`0$pq`1;^7u[u@oq;`20`Asq`0q`1,k=@Nsq',v=^Vk),x,c=0;^7q`E;^7u`E;^7q[q]`e;`Lv,'&`Gsqp',0);`L^C,`G@bv`e;^B@x^7u`Q)^7q[^7u[x]]+=(^7q[^7u[x" +"]]?`G`j+x;^B@x^7q`Q&&^7q[x]^mx==q||c<2)){v+=(v#8'`j+^7q[x]+'`Px);c++}`2^Wk,v,0)`Awdl`7'e`G`Ks=`9,r=@p,b=^X(`F,\"^v\"),i,o,oc`5b)r=^S$f^Bi=0;i=0)&&oc`4$W<0)^X(o,\"`k\",0,s.lc);}`2r^R`Fs`0`1`5`O>3^m!^Y$es.^f||`O#E`Hs.b^E$D^Q)s.$D^Q('`k',s.bc);`Bs.b^Eb.add^Q$A)s.b.add^Q$A('clic$a,false);`m^X(`F,'^v',0,`Fl)}`Avs`0x`1,v=s" +".`c^N,g=s.`c^N#5k=@Nvsn^n^C+(g?'^ng`j,n=^Vk),e`Z,y=e.g@K);e.s@Ky+10@l1900:0))`5v){v*=100`5!n`H!^Wk,x,e))`20;n=x`ln%10000>v)`20}`21`Adyasmf`0t,m`H#Am&&m`4t)>=0)`21;`20`Adyasf`0t,m`1,i=t?t`4@e:-1,n,x" +"`5i>=0&&m){`Kn=t`30,i),x=t`3i+1)`5`Lx,`G,'dyasm^um))`2n}`20`Auns`0`1,x=s.`MSele@6,l=s.`MList,m=s.`MM$s,n,i;^C=^C`8`5x&&l`H!m)m=`F`J^5`5!m.toLowerCase)m`e+m;l=l`8;m=m`8;n=`Ll,';`Gdyas^um)`5n)^C=n}i=" +"^C`4`G`Rfun=i<0?^C:^C`30,i)`Asa`0un`1;^C=un`5!@S)@S=un;`B(`G+@S+`G)`4$S<0)@S+=`G+un;^Cs()`Am_i`0n,a`1,m,f=n`30,1),r,l,i`5!`Wl)`Wl`E`5!`Wnl)`Wnl`U;m=`Wl[n]`5!a&&m&&m._e@Lm^s)`Wa(n)`5!m){m`E,m._c=@Nm" +"';m^sn=`F`hn;m^sl=s^sl;m^sl[m^s@om;`F`hn++;m.s=s;m._n=n;m._l`U('_c`G_in`G_il`G_i`G_e`G_d`G_dl`Gs`Gn`G_r`G_g`G_g1`G_t`G_t1`G_x`G_x1`G_l'`Rm_l[@om;`Wnl[`Wnl`C]=n}`Bm._r@Lm._m){r=m._r;r._m=m;l=m._l;^B" +"i=0;i=0)x(s);`m`Wm(\"x\",n,x)}m=`Wi(n,1)`5@Zl)@Zl=@Z=0;`pt();`2f'`Rm_m`0t,n,d){t='^nt;`Ks=^S,i,x,m,f='^nt`5`Wl&&`Wnl)^Bi=0;i<`Wnl`C@A{x=`Wnl[i]`5!n||x==n){m=`Wi(x)" +"`5m[t]`Ht`t_d')`21`5d)m#Fd);`mm#F)`lm[t+1]@Lm[f]`Hd)$gd);`m$g)}m[f]=1}}`20`AloadModule`0n,u,d,l`1,m,i=n`4':'),g=i<0?#2:n`3i+1),o=0,f,c=s.h?s.h:s.b,^d`5i>=0)n=n`30,i);m=`Wi(n)`5(l$e`Wa(n,g))&&u^Ed&&" +"c^E$E`S`Hd){@Z=1;@Zl=1`l@3)u=`vu,@u:`Ghttps:^Rf`7'e`G`9.m_a(\"$J+'\",\"'+g+'\")^R^d`7's`Gf`Gu`Gc`G`Ke,o=0@Oo=s.$E`S(\"script\")`5o){@4=\"text/`o\"`5f)o.^v=f;o@I=u;c.appendChild(o)}`bo=0}`2o^Ro=^d(s" +",f,u,c)}`mm=`Wi(n);m._e=1;`2m`Avo1`0t,a`Ha[t]||$P)^S#Da[t]`Avo2`0t,a`H#H{a#D^S[t]`5#H$P=1}`Adlt`7'`Ks=`9,d`Z,i,vo,f=0`5`pl)^Bi=0;i<`pl`C@A{vo=`pl[i]`5vo`H!`Wm(\"d\")||d`T-$C>=^8){`pl[i]=0;s.t(@i}`m" +"f=1}`l`pi)clear@5`pi`Rdli=0`5f`H!`pi)`pi=set@5`pt,^8)}`m`pl=0'`Rdl`0vo`1,d`Z`5!@ivo`E;`L^9,`G$72',@i;$C=d`T`5!`pl)`pl`U;`pl[`pl`C]=vo`5!^8)^8=250;`pt()`At`0vo,id`1,trk=1,tm`Z,sed=Math&&@P$l?@P$r@P$" +"l()*10000000000000):tm`T,@q='s'+@P$rtm`T/10800000)%10+sed,y=tm.g@K),vt=tm.getDate(@f`sMonth(@f'@ly+1900:y)+' `sHour$K:`sMinute$K:`sSecond$K `sDay()+' `sTimezoneO@z(),^d,^T=s.g^T(),ta`e,q`e,qs`e,$m`" +"e,vb`E#1^9`Runs()`5!s.td){`Ktl=^T`J,a,o,i,x`e,c`e,v`e,p`e,bw`e,bh`e,^H0',k=^W@Ncc`G@p',0^q,hp`e,ct`e,pn=0,ps`5^3&&^3.prototype){^H1'`5j.m$s){^H2'`5tm.setUTCDate){^H3'`5^Y^E^f&&`O#E^H4'`5pn.toPrecis" +"ion){^H5';a`U`5a.forEach){^H6';i=0;o`E;^d`7'o`G`Ke,i=0@Oi=new Iterator(o)`b}`2i^Ri=^d(o)`5i&&i.next)^H7'}}}}`l`O>=4)x=^iwidth+'x'+^i$j`5s.isns||s.^e`H`O>=3$Q`f(^q`5`O>=4){c=^ipixelDepth;bw=`F$z@2;b" +"h=`F$z^b}}$8=s.n.p^J}`B^Y`H`O>=4$Q`f(^q;c=^i^2`5`O#E{bw=s.d.^L`S.o@z@2;bh=s.d.^L`S.o@z^b`5!s.^f^Eb){^d`7's`Gtl`G`Ke,hp=0`qh$b\");hp=s.b.isH$b(tl)?\"Y\":\"N\"`b}`2hp^Rhp=^d(s,tl);^d`7's`G`Ke,ct=0`qc" +"lientCaps\");ct=s.b.`g`b}`2ct^Rct=^d(s)}}}`mr`e`l$8)^4pn<$8`C&&pn<30){ps=^j$8[pn].^w@v#9`5p`4ps)<0)p+=ps;pn++}s.^U=x;s.^2=c;s.`o^k=j;s.`f=v;s.`u@9=k;s.`z@2=bw;s.`z^b=bh;s.`g=ct;s.^x=hp;s.p^J=p;s.td" +"=1`l@i{`L^9,`G$72',vb);`L^9,`G$71',@i`ls.useP^J)s.doP^J(s);`Kl=`F`J,r=^T.^L.`X`5!s.^I)s.^I=l^h?l^h:l`5!s.`X@Ls._1_`X#C`X=r;s._1_`X=1}`Wm('g')`5(vo&&$C)$e`Wm('d')`Hs.@G||^D){`Ko=^D?^D:s.@G`5!o)`2'';" +"`Kp=$4'#4`i'),w=1,^G,@a,x=`yt,h,l,i,oc`5^D&&o==^D){^4o@Ln@W$HBODY'){o=o^0`S?o^0`S:o^0Node`5!o)`2'';^G;@a;x=`yt}oc=o.`k?''+o.`k:''`5(oc`4$B>=0&&oc`4\"@0oc(\")<0)||oc`4$W>=0)`2''}ta=n?o$T:1;h@ki=h`4'" +"?^Rh=s.`N@c^3||i<0?h:h`30,i);l=s.`N`i?s.`N`i:s.ln(h);t=s.`N^M?s.`N^M`8:s.lt(h)`5t^mh||l))q+=$2=@G^n(t`td$I`te'?@y(t):'o')+(h?$2v1`Ph)`j+(l?$2v2`Pl)`j;`mtrk=0`5s.`x@T`H!p$L$4'^I^Rw=0}^G;i=o.sourceIn" +"dex`5$3'^y')@g$3'^y^Rx=1;i=1`lp&&n@W)qs='&pid`P^jp,255))+(w#8p#3w`j+'&oid`P^jn@v)+(x#8o#3x`j+'&ot`Pt)+(i#8oi='+i`j}`l!trk@Lqs)`2'';@j=s.vs(sed)`5trk`H@j)$m=s.mr(@q,(vt#8t`Pvt)`j+s.hav()+q+(qs?qs:s." +"rq(^C)),0,id,ta);qs`e;`Wm('t')`5s.p_r)s.p_r(`R`X`e}^7(qs);^z`p(@i;`l@i`L^9,`G$71',vb`R@G=^D=s.`N`i=s.`N^M=`F@0^y=s.ppu=^p=^pv1=^pv2=^pv3`e`5$x)`F@0@G=`F@0eo=`F@0`N`i=`F@0`N^M`e`5!id@Ls.tc#Ctc=1;s.f" +"lush`a()}`2$m`Atl`0o,t,n,vo`1;s.@G=@wo`R`N^M=t;s.`N`i=n;s.t(@i}`5pg){`F@0co`0o){`K@J\"_\",1,#B`2@wo)`Awd@0gs`0$S{`K@J$p1,#B`2s.t()`Awd@0dc`0$S{`K@J$p#B`2s.t()}}@3=(`F`J`Y`8`4@us@d0`Rd=^L;s.b=s.d.bo" +"dy`5$c`S#7`i#Ch=$c`S#7`i('HEAD')`5s.h)s.h=s.h[0]}s.n=navigator;s.u=s.n.userAgent;@R=s.u`4'N$X6/^R`Kapn$F`i,v$F^k,ie=v`4$n'),o=s.u`4'@M '),i`5v`4'@M@d0||o>0)apn='@M';^Y$9`tMicrosoft Internet Explore" +"r'`Risns$9`tN$X'`R^e$9`t@M'`R^f=(s.u`4'Mac@d0)`5o>0)`O`rs.u`3o+6));`Bie>0){`O=^Fi=v`3ie+5))`5`O>3)`O`ri)}`B@R>0)`O`rs.u`3@R+10));`m`O`rv`Rem=0`5^3#6^l){i=^g^3#6^l(256))`D(`Rem=(i`t%C4%80'?2:(i`t%U0" +"100'?1:0))}s.sa(un`Rvl_l='^K,`cID,vmk,ppu,@E,`c`ispace,c`V,`u@7,#4`i,^I,`X,@H';^a=^Z+',^o,$R,server,#4^M,#0@6ID,purchaseID,@r,state,zip,$k,products,`N`i,`N^M';^B`Kn=1;n<51;n++)^a+=',prop$J+',eVar$J" +"+',hier$J;^Z2=',^U,^2,`o^k,`f,`u@9,`z@2,`z^b,`g,^x,pe$q1$q2$q3,p^J';^a+=^Z2;^9=^a+',$i,`c^N,`c^N#5`MSele@6,`MList,`MM$s,`x^PLinks,`x@D,`x@T,`N@c^3,`N^PFile^Ms,`NEx`n,`NIn`n,`N@UVa$o`N@U^Qs,`N`is,@G" +",eo';$x=pg#1^9)`5!ss)`Fs()", w=window,l=w.s_c_il,n=navigator,u=n.userAgent,v=n.appVersion,e=v.indexOf('MSIE '),m=u.indexOf('Netscape6/'),a,i,s;if(un){un=un.toLowerCase();if(l)for(i=0;i=0&&x.split)x=(x.split(o)).join(n);else while(i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.indexOf(o)}return x"); w.s_d=new Function("x","var t='`^@$#',l='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',d,n=0,b,k,w,i=x.lastIndexOf('~~');if(i>0){d=x.substring(0,i);x=x.substring(i+2);while(d){w=d;i" +"=d.indexOf('~');if(i>0){w=d.substring(0,i);d=d.substring(i+1)}else d='';b=(n-n%62)/62;k=n-b*62;k=t.substring(b,b+1)+l.substring(k,k+1);x=s_r(x,k,w);n++}for(i=0;i<5;i++){w=t.substring(i,i+1);x=s_r(x" +",w+' ',w)}}return x"); w.s_fe=new Function("c","return s_r(s_r(s_r(c,'\\\\','\\\\\\\\'),'\"','\\\\\"'),\"\\n\",\"\\\\n\")"); w.s_fa=new Function("f","var s=f.indexOf('(')+1,e=f.indexOf(')'),a='',c;while(s>=0&&s=0){s++;d=1;q='';x=0;f=c.substring(s);a=s_fa(f);e=o=c.indexOf('{',s);e++;while(d>0){h=c.substring(e,e+1);if(q){i" +"f(h==q&&!x)q='';if(h=='\\\\')x=x?0:1;else x=0}else{if(h=='\"'||h==\"'\")q=h;if(h=='{')d++;if(h=='}')d--}if(d>0)e++}c=c.substring(0,s)+'new Function('+(a?a+',':'')+'\"'+s_fe(c.substring(o+1,e))+'\")" +"'+c.substring(e+1);s=c.indexOf('=function(')}return c;"); c=s_d(c);if(e>0){a=parseInt(i=v.substring(e+5));if(a>3)a=parseFloat(i)}else if(m>0)a=parseFloat(u.substring(m+10));else a=parseFloat(v);if(a>=5&&v.indexOf('Opera')<0&&u.indexOf('Opera')<0){w.s_c=new Function("un","pg","ss","var s=this;"+c);return new s_c(un,pg,ss)}else s=new Function("un","pg","ss","var s=new Object;"+s_ft(c)+";return s");return s(un,pg,ss)} [_http://visit.theglobeandmail.com/counter.visit?grp=news&site=theglobeandmail&l1=&l2=BN&l3=home&page=story&id=LAC.20080419.LISTINGSBOAT19O_bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345IJKLMNOPQRSTUVW[\U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_http://visit.theglobeandmail.com/counter.visit?grp=news&site=theglobeandmail&l1=&l2=BN&l3=home&page=story&id=LAC.20080419.LISTINGSBOAT19./01X$classesZ$classname12UNSURLXNSObject#A{{J 6789AWNS.keysZNS.objects:;<=>?@ BCDEFGHSP3p]Cache-ControlVServer\Content-TypeTDate^Content-LengthZConnection_bpolicyref="http://www.theglobeandmail.com/w3c/p3p.xml", CP="NOI DSP COR PSAi PSDi OUR BUS UNI NID"_private, max-age=0, no-cache_Apache/2.0.44 (Unix)Yimage/gif_Tue, 23 Dec 2008 15:39:56 GMTS808Uclose./XYYZ2_NSMutableDictionary\NSDictionary(./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd   #*7<KV%*.DQTY]q`O(GIF89a!,; _http://www.theglobeandmail.com/v5/includes/global/regInfo-iFrame.html?user_URL=http%3A//www.theglobeandmail.com/servlet/story/LAC.20080419.LISTINGSBOAT19/PPVStory%3FURL_Article_ID%3DLAC.20080419.LISTINGSBOAT19%26DENIED%3D1&pageType=storyO

andrewmldavies (logout) | Member Centre

WregInfo!_3http://images.theglobeandmail.com/v5/scripts/api.jsO^bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_3http://images.theglobeandmail.com/v5/scripts/api.js./01X$classesZ$classname12UNSURLXNSObject#At5C 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=14089_Tue, 23 Dec 2008 19:19:00 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2U33227_Tue, 23 Dec 2008 15:24:11 GMT_"81cb-169d8600"Zkeep-alive_Thu, 06 Nov 2008 21:36:24 GMT./deef2_NSMutableDictionary\NSDictionary./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  DIR]`foxz  %0>Llr +8;@DXlfOif(!WEBSITE_TGAM){ var WEBSITE_TGAM = "http://"+location.host; var WEBSITE_IMAGES = WEBSITE_TGAM; var WEBSITE_TGAM_SECURE = "https://"+location.host; var WEBSITE_SECURE = WEBSITE_TGAM_SECURE; var WEBSITE_docroot = "/v5"; if(location.port && location.host.indexOf("ev.")==1){ WEBSITE_TGAM_SECURE = WEBSITE_TGAM; WEBSITE_SECURE = WEBSITE_TGAM_SECURE; } else { WEBSITE_IMAGES = WEBSITE_TGAM.replace(/www\./i,"images."); } } var today = new Date(); var random_number = Math.floor((Math.random()*1000))+""+today.getUTCMilliseconds(); var insider; var d = document; var ua = navigator.userAgent.toLowerCase(); var openmenu,x,tickerStories,omniDisabled; var ldbdAC="";var lugAC="";var skyRAC="";var boxRAC="";var halfpageRAC="";var b1AC="";var b2AC="";var b3AC="";var b4AC=""; /* NB: Get Opera version */ var isOpera = (window.opera) ? true : false; if (isOpera) { var ua = navigator.userAgent.toLowerCase(); var operaI = ua.indexOf('opera'); var opVer = ua.substring(operaI+5, ua.length); opVer = parseFloat(opVer); if (opVer<=8) { var isOperaOld=true; } } /* NB: Get Gecko version */ function geckoGetRv(){ if (navigator.product != 'Gecko'){ return -1; } var rvValue = 0; var rvStart = ua.indexOf('rv:'); var rvEnd = ua.indexOf(')', rvStart); var rv = ua.substring(rvStart+3, rvEnd); var rvParts = rv.split('.'); var exp = 1; for (i=0;rvParts.length>i;i++){ var val = parseInt(rvParts[i]); rvValue += val / exp; exp *= 100; } return rvValue; } /* NB: subscriber status */ function isSubscriber(v){ var time = new Date(); time.setTime(time.getTime() + (1000*60*60*24*15)) setCookie("TGAM_ID",v,time.toGMTString()); } function chkSubscriber(){ var xmlhttp = hector(); if(xmlhttp){ xmlhttp.open("GET", "/servlet/Page/document"+WEBSITE_docroot+"/content/Insider/chkSubscriber", true); xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4){ var response = xmlhttp.responseText; if(response.indexOf("[true][")==0){ isSubscriber(response); } else { deleteCookie("TGAM_ID"); } } } xmlhttp.send(null); } } /* NB: AJaX */ function hector() { var xmlhttp = false; if(window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); } else if(window.ActiveXObject){ try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (othermicrosoft) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (failed) { xmlhttp = false; } } } return xmlhttp; } function doXSLT(nObj,xml,xsl,where){ var xmlhttp = hector(); if(xmlhttp){ var result; xmlhttp.open("GET", xml, true); xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4){ if(xmlhttp.status==200){ var xslhttp = hector(); xslhttp.open("GET", xsl, true); xslhttp.onreadystatechange=function() { if(xslhttp.readyState==4){ if(xslhttp.status==200){ try { var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xslhttp.responseXML); result = xsltProcessor.transformToFragment(xmlhttp.responseXML,d); if(where && where=="top" && nObj.firstChild){ nObj.insertBefore(result,nObj.firstChild); } else { nObj.appendChild(result); } } catch (err) { try { result = xmlhttp.responseXML.transformNode(xslhttp.responseXML); if(where && where=="top" && nObj.firstChild){ nObj.innerHTML = result+nObj.innerHTML; } else { nObj.innerHTML += result; } } catch (err) { result = createElement("div","","error"); var msg_txt = createElement("p","","error"); msg_txt.appendChild(d.createTextNode("We were temporarily unable to load the requested content")); var msg_title = createElement("h4","","error"); msg_title.appendChild(d.createTextNode("Problem")); result.appendChild(msg_title); result.appendChild(msg_txt); nObj.appendChild(result); } } } } } xslhttp.send(null); } } } xmlhttp.send(null); } } /* NB: create an element */ function createElement(el,i,cN,url,alt,w,h,t,type,rel){ // only el is required; unused parms should be empty quotes // if el=="link" and the url ends with ".css", type and rel aren't needed // if el=="script" and the url ends with ".js", don't define type // if el=="input" and the url is included, don't define type // example: // 1) createElement("p"); // 2) createElement("img","","icon","/icon.gif","Icon",12,12); // 3) createElement("a","back","","/lastpage/","","","","Go back","","previous"); // returns: // 1)

// 2) Icon // 3) if(el) { el = el.toLowerCase(); } else { return null; } var nObj = d.createElement(el); if(i){ nObj.id = i; } if(cN){ nObj.className = cN; } if(t){ nObj.title = t; } if(w){ nObj.width = w; } if(h){ nObj.height = h; } if(url && (el=="a" || el=="area" || el=="link" || el=="base")){ nObj.href = url; } else if(url && (el=="img" || el=="input" || el=="script" || el=="frame" || el=="iframe")){ nObj.src = url; } else if(el=="object" && type=="application/x-shockwave-flash"){ nObj.data = url; } if(el=="img" || el=="input" || el=="area"){ nObj.alt = (alt) ? alt : ""; } if(el=="input" && url){ nObj.type = "image"; } else if(el=="link" && url.indexOf(".css")==url.length-4 && !rel){ nObj.type = "text/css"; nObj.rel = "stylesheet"; } else if(el=="script" && url.indexOf(".js")==url.length-3){ nObj.type = "text/javascript"; } else { if(rel){ nObj.rel = rel; } if(type){ nObj.type = type; } } return nObj; } /* NB: cookies*/ function getCookie(name){ var the_cookie = name + "="; if (d.cookie.length > 0) { begin = d.cookie.indexOf(the_cookie); if (begin != -1) { begin += the_cookie.length; end = d.cookie.indexOf(";", begin); if (end == -1) { end = d.cookie.length; } return unescape(d.cookie.substring(begin, end)); } } return null; } function setCookie(name, value, time){ if(!time){ var time = new Date(); time.setTime(time.getTime() + (1000*60*60*24*365)) time.toGMTString();//expires in a year } d.cookie = name + "=" + escape(value) + "; path=/; expires=" + time; } function deleteCookie(name) { if(getCookie(name)) d.cookie = name + "=" + "; path=/; expires=Mon, 01 Jan 01 01:01:01 GMT"; } /* NB: act link a link on mouseover */ function likeLinkOver(){ this.style.textDecoration = "underline"; this.style.cursor = (d.all) ? "hand" : "pointer"; } function likeLinkOut(){ this.style.textDecoration = "none"; } /* NB: collect RSS feeds */ function makeRSSLink(i,el){ var feeds = d.getElementById(i).getElementsByTagName(el); for(x=0;feeds.length>x;x++){ addEvent(feeds[x],"click", function(){ var ua = navigator.userAgent.toLowerCase(); if(ua.indexOf("mac")!=-1 && ua.indexOf("safari")!=-1){ var regex = new RegExp("http",""); this.href = this.href.replace(regex,"feed"); return true; } else { var type = (this.href.indexOf(".opml")==-1) ? ["RSS feed","paste it"] : ["OPML file","import the location"]; var key = (ua.indexOf("mac")!=-1) ? "Command" : "Ctrl"; var msg = "\nOnce it\u2019s copied, "+type[1]+" into your favourite RSS reader."; if(window.clipboardData && prompt("First copy this "+type[0]+" location by pressing OK or ["+key+"-C]."+msg,this.href)){ window.clipboardData.setData("Text",this.href); } else if(!window.clipboardData){ prompt("Copy this "+type[0]+" location (press ["+key+"-C]), then press OK."+msg,this.href) } return false; } }) } } function insertAfter(newElement,targetElement) { //targetElement is what you want newElement to go after. Look for targetElement elements parent. var parent = targetElement.parentNode; //if the parents lastchild is the targetElement... if(parent.lastchild == targetElement) { //add the newElement after the target element. parent.appendChild(newElement); } else { // else the target has siblings, insert the new element between the target and it's next sibling. //syntax for insertBefore: parentElement.insertBefore(newElement, targetElement); parent.insertBefore(newElement, targetElement.nextSibling); } } /* NB: yellow fade technique */ function YFTinit(x,i){ var colour = ["F","E","D","C","B","A"]; setTimeout("YFT("+x+",'"+colour[x]+"','"+i+"')", 500); } function YFT(x,c,i){ if(isNaN(x)) { return; } d.getElementById(i).style.backgroundColor = "#FF"+c; if(x>0) { YFTinit(x-1,i); } } /* NB: windows print */ function printThis(nObj){ var c = nObj.childNodes; for(x=0;c.length>x;x++){ if(c[x].className=="print"){ c[x].getElementsByTagName("a")[0].onclick=function(){ if(d.getElementById("pagination") && location.search.indexOf("pageRequested=all")==-1){ qmod = (location.search) ? "\u0026" : "?"; url = location.href.replace(/pageRequested=([0-9]+)/,""); location.href=url+qmod+"pageRequested=all\u0026print=true"; } else if(window.print) { window.print(); } else { alert("Press Cmd/Ctrl+P to print this page"); } return false; } } } } function chkPrint(){ if(location.search.indexOf("print=true")!=-1 && window.print){ window.print(); if(ua.indexOf("safari")==-1) { history.go(-1); } else { return; } } } /* NB: pop-up window */ function _open_popup_window(w,h,url,slug,t,top,left) { var regex = /\W+/; if(regex.test(slug)) { slug = slug.replace(/\W+/, '_'); } var n = "__" + n; if(regex.test(n)) { n = n.replace(/\W+/, '_'); } if (!w) w=780; if (!h) h=550; var params = ''; params += 'width=' + w; params += ',height=' + h; if (top) params += ',top=' + top; if (left) params += ',left=' + left; params += ',menubar=no,resizable=yes,toolbar=no,scrollbars=yes,location=no'; window.open(url, n, params); return false; } /* sports_popup -- requires a return false */ function sports_popup(w,h,url,slug,t,top,left) { var regex = /\W+/; if(regex.test(slug)) { slug = slug.replace(/\W+/, '_'); } var n = "__" + n; if(regex.test(n)) { n = n.replace(/\W+/, '_'); } if (!w) w=780; if (!h) h=550; var params = ''; params += 'width=' + w; params += ',height=' + h; if (top) params += ',top=' + top; if (left) params += ',left=' + left; params += ',menubar=no,resizable=yes,toolbar=no,scrollbars=yes,location=no'; window.open(url, n, params); } function framesPopUp(filename,t,n,w,h) { var n = "__" + n; var regex = /\W+/; if(regex.test(n)) { n = n.replace(/\W+/, '_'); } params = "width="+ w +",height="+h + ",resizable"; winExec = n +"= window.open('','"+n+"', params)"; content = ""+t+"<body>This require a browser that supports frames.</body>"; eval(winExec); eval(n + ".document.open()"); eval(n + ".document.write(content)"); eval(n + ".document.close()"); } /* NB: set top to height of another object */ function setTop(obj1,obj2,mod){ obj2.style.top = obj1.offsetHeight+mod+"px"; } /* NB: get elements exact position */ function getElPos(nObj){ var l = 0; var t = 0; if(nObj) { if(nObj.offsetParent) { while (nObj.offsetParent){ l += nObj.offsetLeft t += nObj.offsetTop nObj = nObj.offsetParent; } } var el_pos = [l,t] return el_pos; } } /* NB: add + remove elements written by Dean Edwards, 2005 with input from Tino Zijdel http://dean.edwards.name/weblog/2005/10/add-event/ */ function addEvent(element, type, handler) { if (!handler.$$guid) handler.$$guid = addEvent.guid++; if (!element.events) element.events = {}; var handlers = element.events[type]; if (!handlers) { handlers = element.events[type] = {}; if (element["on" + type]) { handlers[0] = element["on" + type]; } } handlers[handler.$$guid] = handler; element["on" + type] = handleEvent; }; addEvent.guid = 1; function removeEvent(element, type, handler) { if (element.events && element.events[type]) { delete element.events[type][handler.$$guid]; } }; function handleEvent(event) { var returnValue = true; event = event || fixEvent(window.event); var handlers = this.events[event.type]; for (var i in handlers) { this.$$handleEvent = handlers[i]; if (this.$$handleEvent(event) == false) { returnValue = false; } } return returnValue; }; function fixEvent(event) { event.preventDefault = fixEvent.preventDefault; event.stopPropagation = fixEvent.stopPropagation; return event; }; fixEvent.preventDefault = function() { this.returnValue = false; }; fixEvent.stopPropagation = function() { this.cancelBubble = true; }; /* NB: Written by Jonathan Snook, http://www.snook.ca/jonathan Add-ons by Robert Nyman, http://www.robertnyman.com */ function getElementsByClassName(oElm, strTagName, strClassName){ if((typeof oElm != "object" && typeof oElm == "string") && (typeof strTagName != "string" && typeof strTagName == "object")){ /* probably a prototype call, so remap */ oElm = strClassName; strTagName = oElm; } var arrElements = (strTagName == "*" && d.all)? document.all : oElm.getElementsByTagName(strTagName); var arrReturnElements = new Array(); strClassName = strClassName.replace(/\-/g, "\\-"); var oRegExp = new RegExp("\\b" + strClassName + "\\b"); var oElement; for(var i=0; i 11) { ampm = "PM"; } if (hh > 12) { hh -= 12; } hh = leadingZero(hh); var m = leadingZero(dateObj.getMinutes()); var ss = leadingZero(dateObj.getSeconds()); var date_values = [yy,mm,dd,hh,m,ss,ampm]; return date_values; function takeYear(theDate){ var x = theDate.getYear(); var y = x % 100; y += (38 > y) ? 2000 : 1900; return y; } function leadingZero(nr){ if(10>nr) { nr = "0"+nr; } return nr; } } /* NB: adjust the layout width/height as needed */ function layoutAdjust(){ if(d.getElementById("chewy")){ var chewyObj = d.getElementById("chewy"); var w = (chewyObj.offsetWidth) ? chewyObj.offsetWidth : 404; /* hide wide elements */ if(d.getElementById("sectionD")){ if(404>w && d.getElementById("sectionD").length>1){ d.getElementById("sectionD").getElementsByTagName("DIV")[1].style.display = "none"; } else if(w>=404 && d.getElementById("sectionD").length>1){ d.getElementById("sectionD").getElementsByTagName("DIV")[1].style.display = "block"; } } } if(d.getElementById("sectionC")){ var isMega = false; var nObj = d.getElementsByTagName("BODY")[0]; if(nObj.className) { var hubClass = nObj.className.split(" "); for(var i=0; i=geckoRv){ d.getElementById("chewy").style.minHeight = "900px"; } }/* Fix clearing problem in Gecko 1.7*/ d.getElementsByTagName("BODY")[0].style.minHeight = 0; /* reset minHeight to 0 */ } /* NB: get hub class */ function getHub(){ var nObj = d.getElementsByTagName("BODY")[0]; if(nObj.className) { var hubClass = nObj.className.split(" "); return hubClass[1]; } else { return false; } } /* NB: enlarge image */ function viewBigImage(w,h,url,n,t){ var iW; t = "Image from \u201C"+t+"\u201D"; n = "__"+n; var regex = /\W+/; if(regex.test(n)) { n = n.replace(/\W+/,'_'); } var scrolling = false; try { if(w>screen.availWidth) { w = screen.availWidth; scrolling = true; } if(h>screen.availHeight) { h = screen.availHeight; scrolling = true; } } catch(e) {} iWw = eval(w)+20; var f = "width="+iWw+",height="+h; f += ",left=10,top=10,menubar=no,toolbar=no,status=no,screenX=0,screenY=0"; f += (!scrolling) ? ",scrollbars=0" : ",scrollbars=1"; (window.iW==null||iW.closed) ? iW=window.open("",n,f) : iW.location.href = ""; iW.document.write(""+t+"
\""+t+"\"
"); iW.document.close(); iW.focus(); return false; } /* NB: create ticker */ function writeTicker(url,i,bg_c,tag_c,tkr_c){ var ticker = new SWFObject(WEBSITE_IMAGES+"/v5/includes/global/newsticker.swf", i, "600", "20", "8", bg_c, true); ticker.addVariable("RSS_Source", url); ticker.addVariable("tagColour", tag_c); ticker.addParam("wmode", "transparent"); ticker.addVariable("tickerColour", tkr_c); ticker.write(i); } /* browser detecttion -- via PPK @ http://www.quirksmode.org */ /* http://www.quirksmode.org/js/detect.html */ /* to use: call BrowserDetect.init(); */ /* access BrowserDetect.browser and so on... */ var BrowserDetect = { init: function () { this.browser = this.searchString(this.dataBrowser) || "An unknown browser"; this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version"; this.OS = this.searchString(this.dataOS) || "an unknown OS"; }, searchString: function (data) { for (var i=0;ix;x++){ if(d.getElementById(acSpots[x]) && d.getElementById(acSpots[x]+"Holder")){ /*if (lte_ie_6) { addEvent(d.getElementById(acSpots[x]+"Holder"),"mouseover",function() { this.style.overflow = 'visible'; }); addEvent(d.getElementById(acSpots[x]+"Holder"),"mouseout",function() { this.style.overflow = 'hidden'; }); }*/ if(8>x) { placeAC(acSpots[x]); if(x==0) { addEvent(window,"resize",function(){ placeAC("ldbd"); }); } else if(x==1) { addEvent(window,"resize",function(){ placeAC("lug"); }); } else if(x==2) { addEvent(window,"resize",function(){ placeAC("skyR"); }); } else if(x==3) { addEvent(window,"resize",function(){ placeAC("boxR"); }); } else if(x==4) { addEvent(window,"resize",function(){ placeAC("lug2"); });} else if(x==5) { addEvent(window,"resize",function(){ placeAC("box2"); }); } else if(x==6) { addEvent(window,"resize",function(){ placeAC("box3"); }); } else if(x==7) { addEvent(window,"resize",function(){ placeAC("halfpageR"); }); } } else if(d.getElementById(acSpots[x]) && d.getElementById(acSpots[x]+"Holder")) { d.getElementById(acSpots[x]).innerHTML = d.getElementById(acSpots[x]+"Holder").innerHTML; if(acType!="transAd") { d.getElementsByTagName("BODY")[0].removeChild(d.getElementById(acSpots[x]+"Holder")); } } } } } var swfCheck, iFrameCheck; function placeAC(i){ if(!d.getElementById(i) || !d.getElementById(i+"Holder")){ return; } var pos = getElPos(d.getElementById(i)); var nObj = d.getElementById(i+"Holder"); var mod = [0,0]; if(d.all && d.compatMode && d.compatMode!="BackCompat"){ switch(i){ case "ldbd": mod = [4,4]; break; case "boxR": mod = [1,4]; break; case "box2": mod = [1,4]; break; case "skyR": mod = [4,4]; break; case "halfpageR": mod = [1,4]; break; default: mod = [-1,4]; break; } } if(d.getElementsByTagName("BODY")[0].className.indexOf("minWidth")!=-1){ switch(i){ case "ldbd": mod = [0,4]; break; } } nObj.style.position = "absolute"; nObj.style.top = eval(pos[1]+mod[1])+"px"; nObj.style.left = eval(pos[0]+mod[0])+"px"; nObj.style.display = "block"; if((acType=="transAd" && i=="ldbd") || (d.getElementById("transHeader") && i=="ldbd")) { nObj.style.overflow = "visible"; nObj.style.left = 0; nObj.style.top = 0 if(d.getElementById("transLeader")){ var tLdbd = d.getElementById("transLeader"); tLdbd.style.position = "absolute"; tLdbd.style.left = eval(pos[0])+"px"; tLdbd.style.top = eval(getElPos(d.getElementById("ldbd"))[1])+"px"; nObj.style.width = eval(getElPos(d.getElementById("ldbd"))[0])+"px"; addEvent(window,"resize",function(){ d.getElementById("ldbdHolder").style.width = eval(getElPos(d.getElementById("ldbd"))[0])+"px"; }); if(d.all && d.compatMode && d.compatMode!="BackCompat"){ tLdbd.style.margin = "4px 0 0 4px !important"; } else if(d.all){ tLdbd.style.margin = "4px 0 0 0 !important"; } } } else if(acType=="topLayer" && i=="ldbd") { // "topLayer" ads float down the page and do funky things. "expand" ads are in the ldbd and expand when hovered over nObj.style.overflow = "visible"; } else { // if this is the leaderboard let's check every 50 milliseconds (until 5 seconds has passed) // to see if there's any element with tag name "object" (swf ad) // if there is, when a user mouses over the ldbd set height to auto // on mouseout set height back to 90px // swfCheck = setTimeout(function() { getSwf(nObj, "swf") }, 50); if (acType=="expand" && i=="ldbd") { // leaderboard expander ad. at this point nObj should == "ldbdHolder". ** DON'T USE OVERFLOW CAUSE IT'LL MAKE FIREFOX RESTART THE AD ON HOVER ** Event.onReady(function() { var nav_zindex = document.getElementById('globalNav').style.zIndex; var ldbd_zindex = document.getElementById('ldbd').style.zIndex; nObj.onmouseover = function() { document.getElementById('globalNav').style.zIndex = 1; this.style.height = "auto"; this.style.zIndex = 20000; // ldbd takes highest stacking order //this.style.overflow = "visible"; }; nObj.onmouseout = function() { document.getElementById('globalNav').style.zIndex = nav_zindex; this.style.zIndex = ldbd_zindex; // reset stacking order to "original" state //this.style.overflow = "hidden"; }; }); } // if( (d.getElementById(i).parentNode.id.indexOf("secondaryNav")==0 && i=="boxR") || (i=="halfpageR") ) { if( (Element.descendantOf(d.getElementById(i), d.getElementById("secondaryNav")) && i=="boxR") || (i=="halfpageR") ) { if((d.all && d.compatMode && d.compatMode != "BackCompat") || !d.all) { nObj.style.paddingLeft = "15px"; nObj.style.paddingTop = "15px"; nObj.style.left = eval(pos[0]-1)+"px"; } } } } var counter = 0; function getSwf(obj, type) { var toClear, swfs; type == "swf" ? toClear = swfCheck : toClear = iFrameCheck; type == "swf" ? swfs = obj.getElementsByTagName("OBJECT") : swfs = obj.getElementsByTagName("IFRAME"); if (swfs.length == 0) { if (counter == 1000) { clearTimeout(toClear); } else { counter ++; } } else { obj.onmouseover = function() { this.style.height = "auto"; }; obj.onmouseout = function() { this.style.height = "90px"; }; clearTimeout(toClear); } } function changeSelectList(){ // pd1 = first pulldown // pd1_i = first pulldown id var pd1_i = "district"; // pd2 = second pulldown // pd2_i = second pulldown id var pd2_i = "zone"; if(!d.all){ // if !IE addEvent(d.getElementById(pd1_i),"change", function (){ var pd1_class = this.value; //get the value from the first pulldown var pd2 = d.getElementById(pd2_i).getElementsByTagName("OPTION"); //get the list of opitions in second pulldown for(x=0;pd2.length>x;x++){ pd2[x].className = pd2[x].className.replace(/\s(hide)/,""); if(pd2[x].className.indexOf(pd1_class)==-1){ pd2[x].className += " hide"; // set options in pd2 to hide based on pd1's value } } }); } else if(d.all) { // if IE var pd1 = d.getElementById(pd1_i).getElementsByTagName("OPTION"); var pd1_classes = new Array(); for(x=0;pd1.length>x;x++){ pd1_classes.push(pd1[x].value); } pd1_classes = pd1_classes.slice(1); var pd2_0_arr = new Array(); var pd2_1_arr = new Array(); var pd2_2_arr = new Array(); var pd2_3_arr = new Array(); var pd2_perm = d.getElementById(pd2_i).getElementsByTagName("OPTION"); var pd2_length = pd2_perm.length; for(x=0;pd2_length>x;x++){ if(pd2_perm[x].className==pd1_classes[0]){ pd2_0_arr.push(pd2_perm[x]); } else if(pd2_perm[x].className==pd1_classes[1]){ pd2_1_arr.push(pd2_perm[x]); } else if(pd2_perm[x].className==pd1_classes[2]){ pd2_2_arr.push(pd2_perm[x]); } else if(pd2_perm[x].className==pd1_classes[3]){ pd2_3_arr.push(pd2_perm[x]); } } var pd2_arr = [pd2_0_arr,pd2_1_arr,pd2_2_arr,pd2_3_arr]; // for(x=1;pd2_length>x;x++){ // d.getElementById(pd2_i).removeChild(pd2_perm[1]); // } addEvent(d.getElementById(pd1_i),"change",function(){ var pd1_class = this.value; //get the value from the district pulldown pd2_temp_length = d.getElementById(pd2_i).getElementsByTagName("OPTION").length; for(x=1;pd2_temp_length>x;x++){ d.getElementById(pd2_i).removeChild(d.getElementById(pd2_i).getElementsByTagName("OPTION")[1]); } for(y=0;pd1_classes.length>y;y++){ if(pd1_classes[y]==pd1_class){ for(x=0;pd2_arr[y].length>x;x++){ d.getElementById(pd2_i).appendChild(pd2_arr[y][x]); } } } }); // end change addEvent } // end IE } function showHelp(objToToggleId,objClicked,effectType,closeLinkId,topOffset,rightOffset,bottomOffset,leftOffset) { var pos = getElPos(objClicked); var left = pos[0]; var top = pos[1]; var objToggle = $(objToToggleId); var closeLink = $(closeLinkId); /* uncomment for debug -- assuming you're using Firefox and have the Firebug extension */ /* //console.log("initital top: " + objToggle.style.top); //console.log("left: " + left); //console.log("top: " + top); //console.log("objToggle: " + objToggle); //console.log("objToggle ID; " + objToggle.id); //console.log("thing that fired the event: " + objClicked); //console.log("thing to toggle: " + objToggle); //console.log("link that closes: " + closeLinkId); //console.log("effectType: " + effectType); */ if(topOffset && topOffset != "") { objToggle.style.top = (top + topOffset) + "px"; } else { if((bottomOffset && bottomOffset != "")) { objToggle.style.top = (top - bottomOffset) + "px"; } else { objToggle.style.top = top + "px"; } } if(leftOffset && leftOffset != "") { objToggle.style.left = (left + leftOffset) + "px"; } else { if(rightOffset && rightOffset!= "") { objToggle.style.left = (left - rightOffset) + "px"; } else { objToggle.style.left = left + "px"; } } if(closeLinkId) { /* add the hide effect */ addEvent(closeLink, "click", function() { if(effectType) { switch(effectType) { case "blind": new Effect.BlindUp(objToggle); break; case "fade": new Effect.Fade(objToggle); break; case "slide": new Effect.SlideUp(objToggle); break; case "switch": new Effect.SwitchOff(objToggle); break; default: new Effect.Fade(objToggle); } } else { new Effect.Fade(objToggle); } return false; }); /* add the show effect */ if(effectType) { switch(effectType) { case "blind": new Effect.BlindDown(objToggle); break; case "fade": new Effect.Appear(objToggle); break; case "slide": new Effect.SlideDown(objToggle); break; case "switch": new Effect.Appear(objToggle); break; default: new Effect.Appear(objToggle); } } else { new Effect.Appear(objToggle); } } else { //end if closeLinkId /* if there's no closeLink use objToggle as display toggler */ new Effect.toggle(objToggle,"appear"); } objToggle.style.zIndex = "6000"; objToggle.style.cursor = "move"; new Draggable(objToggle); return false; }// end showHelp function isNull(obj) { if( (obj.value == null) || (obj.value =='') ) { return true; } else { return false; } } // returns a URL param specified by name function get_url_param(name) { var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var tmpURL = window.location.href; var results = regex.exec(tmpURL); if (results == null) { return ""; } else { return results[1]; } } // Open a pop-up and play Video Story article_type - jluu var videoArray = null; function playVideoStory(id, slug, headline, creditline) { var row = getRow(id); var url = "/servlet/Page/document/video/vs?id=" + id + "&ids=" + row.ids + "&hub=search"; var vidPlayer = window.open(url, "videoStoryPlayer","width=800,height=800,resizable=yes,scrollbars=yes,status=yes"); vidPlayer.focus(); } function getRow(id) { var row = null; if (videoArray != null) { for(i = 0; i < videoArray.length; i++) { if (id == videoArray[i].id) { var ids = getIDS(i); videoArray[i].ids = ids; row = videoArray[i]; i = videoArray.length; } } } return row; } // -2/+2 logic function getIDS(_idx) { var idx = _idx + 1; var videoLength = videoArray.length; var pre = 0; var post = 0; if (idx == 1) { if (videoLength < 5) { post = videoLength - idx; } else { post = 4; } } else if (idx == 2) { pre = 1; if (videoLength < 5) { post = videoLength - idx; } else { post = 3; } } else if (idx == (videoLength - 1)) { if (idx > 3) { pre = 3; } else { pre = 2; } post = 1; } else if (idx == videoLength) { if (videoLength < 5) { pre = idx - 1; } else { pre = 4; } } else { pre = 2; post = 2; } var ids = ""; for (var i = pre; i > 0; i--) { ids = ids + "," + videoArray[_idx - i].id; } ids = ids + "," + videoArray[_idx].id; for (var i = _idx + 1; i < idx + post ; i ++) { ids = ids + "," + videoArray[i].id; } ids = ids.substr(1); return ids; } function setVideoArray(vArray) { // remove that extra comma from the list producer vArray.pop(); videoArray = vArray; } // Create Video array - jluu function loadTicker(){ return; }!_Fhttp://images.theglobeandmail.com/v5/scripts/regInfo.js?v=200804091048Ombplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Fhttp://images.theglobeandmail.com/v5/scripts/regInfo.js?v=200804091048./01X$classesZ$classname12UNSURLXNSObject#At5ONf 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=56413_Wed, 24 Dec 2008 07:04:24 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2T2900_Tue, 23 Dec 2008 15:24:11 GMT^"b54-beeff780"Zkeep-alive_Wed, 09 Apr 2008 14:45:02 GMT./deef2_NSMutableDictionary\NSDictionary T./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  W\epsy .38CQ_ $:GJOSgluO Tvar d = (!d) ? document : d; var hasCookie = false; function cookieShow(cookieName) { var userID = ""; var indexNameBegin; var indexNameEnd; var cookieValueStartIndex = -1; var SSOcookieValueStartIndex = -1; var cookieLength = 0; var tlh = WEBSITE_TGAM+"/v5/includes/global/regInfo-iFrame.html?user_URL="+escape(d.referrer); // Get the user_URL from the querystring var queryString = window.location.search; var forwarded_URL = ""; var queryString = (queryString.length > 1) ? queryString.substring(1, queryString.length) : null; queryKeyVals = new Array(); if(queryString) { for(var i=0; i < queryString.split("&").length; i++) { queryKeyVals[i] = queryString.split("&")[i]; } for(var j=0; j < queryKeyVals.length; j++) { var Key = queryKeyVals[j].split("=")[0]; var Value = queryKeyVals[j].split("=")[1]; if(Key == "user_URL") { var loginPageIndex = -1; var logoutPageIndex = -1; loginPageIndex = Value.indexOf("loginRegistrationPage"); logoutPageIndex = Value.indexOf("logoutPage"); maxLoginPageIndex = Value.indexOf("services/site/concurrentLogin"); forwarded_URL = (loginPageIndex == -1 && logoutPageIndex == -1 && maxLoginPageIndex == -1 ) ? Value : WEBSITE_TGAM; } } } hasCookie = d.cookie; if (hasCookie) { cookieLength = d.cookie.length; cookieValueStartIndex = d.cookie.indexOf(cookieName + "="); SSOcookieValueStartIndex = d.cookie.indexOf("SSO_COOKIE"); if ((cookieValueStartIndex != -1) && (SSOcookieValueStartIndex != -1)) { // then user is logged in; retrieve the userID from the cookie indexNameBegin = d.cookie.indexOf(cookieName) + cookieName.length + 1; nameAll = d.cookie.substr(indexNameBegin); indexNameEnd = nameAll.search(";"); userID = (indexNameEnd != -1) ? nameAll.substring(0, indexNameEnd) : nameAll; newUserID = userID.replace(/\+/g, " "); // output username d.getElementById("welcome").getElementsByTagName("EM")[0].firstChild.nodeValue = " "+unescape(newUserID); // output logout link addEvent(d.getElementById("user"),"click",function(){ if(parent.frames[0].location.href.indexOf("insiderhome")!=-1 || parent.frames[0].location.href.indexOf("Inside/home")!=-1){ return confirm("Your preferences may not be saved if you logout from this page directly.\nWe recommend logging out from another page.\nDo you still wish to logout?") } }); d.getElementById("user").href = WEBSITE_TGAM+"/servlet/Page/document/v4/reg/logoutPage?ord="+random_number; d.getElementById("user").firstChild.nodeValue = " (logout) "; //d.getElementById("welcome").innerHTML += ' | Member Centre'; } else { // required cookie info does not exist hasCookie = false; //setTimeout("cookieShow('USERNAME')",50); } } } addEvent(window,"load",function(){ cookieShow("USERNAME"); });!:_Yhttp://images.theglobeandmail.com/v5/content/Subscription/scripts/login.js?v=200804071544Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345OPQRSTUVWXYZ[\]^_`abcghU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_Yhttp://images.theglobeandmail.com/v5/content/Subscription/scripts/login.js?v=200804071544./01X$classesZ$classname12UNSURLXNSObject#At5Y 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=54509_Wed, 24 Dec 2008 06:32:40 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2U11761_Tue, 23 Dec 2008 15:24:11 GMT_"2df1-bfe41b80"Zkeep-alive_Wed, 09 Apr 2008 14:45:18 GMT./deef2_NSMutableDictionary\NSDictionary-./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  jox+2AFKVdr27;Q^afj~l _)http://www.theglobeandmail.com/blank.htmlO\login_holder _http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4377513809082079&dt=1230046796385&format=728x90_as&output=html&url=http%3A%2F%2Fwww.theglobeandmail.com%2Fservlet%2Fstory%2FLAC.20080419.LISTINGSBOAT19%2FPPVStory%3FURL_Article_ID%3DLAC.20080419.LISTINGSBOAT19%26DENIED%3D1&color_bg=ededed&color_text=000000&color_link=0000FF&color_url=008000&color_border=000000&ad_type=text&ref=http%3A%2F%2Fwww.theglobeandmail.com%2Fservlet%2Fstory%2FLAC.20080419.LISTINGSBOAT19%2FPPVStory%3FURL_Article_ID%3DLAC.20080419.LISTINGSBOAT19%26DENIED%3D1&u_h=1050&u_w=1680&u_ah=949&u_aw=1680&u_cd=24&u_tz=-300&u_his=31&u_java=true&u_nplug=10&u_nmime=169O
Trade Forex Online - Zero commissions, Free software
Try a practice account today www.gcitrading.com
_google_ads_frame!3ITcHNX8#,e    1R[)}}~$   OPPQUhiijnn"+"|""'0':-E-N-1595B59JJJOIwwx|gfoN"X".%u Z ^ ^ ^ c@  n ]    Z ` ] o  K H ( $  O ) ) *o . 1 2 2 2 3 9 9 9 9 9 >G   h 1 : Ж  ! , X u Ղ Յ Ր  4 G