bplist00_WebMainResource_WebSubresources_WebSubframeArchives ^WebResourceURL_WebResourceTextEncodingName_WebResourceMIMEType_WebResourceData_WebResourceFrameName_chttp://www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/homeUUTF-8Ytext/htmlO globeandmail.com: Does Canada's science minister really see the evolutionary light?

Skip navigation

Login close

Click Here

Does Canada's science minister really see the evolutionary light?

From Friday's Globe and Mail

Does Gary Goodyear really get this evolution thing?

In an interview with The Globe and Mail that was published on Tuesday, our federal Minister of State for Science and Technology oddly dodged questions about whether he believed in evolution. Scientists were quick to point out that having someone in charge of science who was uncomfortable with one of its most important principles might not be such a good thing. Later in the day, the minister set the record straight, saying: "We are evolving every year, every decade. That's a fact." Tempest in a teacup, all cooled down, let's move on to the economy.

But if one listens to the rest of the quote, Red Rose whitecaps reappear. Mr. Goodyear says this evolution is "to the intensity of the sun, whether it is to, as a chiropractor, walking on cement versus anything else, whether it is running shoes or high heels, of course we are evolving to our environment."

What on earth can he mean? Does he really think the human species is changing generation by generation to be better able to walk in high heels?

As a chiropractor, Mr. Goodyear well knows that a life of walking in high heels does all sorts of bad things to one's back, and I'm sure he can look at an X-ray and tell in an instant whether the patient is a high-heels or flats kind of girl. This is science, but it isn't evolution.

Mr. Goodyear seems to be confusing evolution with development, a common mistake. Individuals develop by year and by decade as a result of their interactions with their environment - leathery skin, curved backs, strong calves. But evolution is when genes change from generation to generation. If everyone wore high heels all the time, and a minority of people were genetically predisposed not to tip into oncoming traffic, then this genetic trait might become more common in the next generation of high-heel wearers. That would be evolution associated with wearing high heels. We know of no evidence that this is taking place. The same goes for walking on cement, in running shoes or in brogues.

Now, intensity of the sun really is associated with past evolutionary changes in our species. The evidence is strong that light skin in northern climes, where there is less sun, is an evolved adaptation for aiding the production of vitamin D, which we all need. The ability to digest lactose is another evolved adaptation in people from cultures that raised cows for milk. In fact, much or even most of the common variations we see among groups of humans living in different parts of the globe is the result of past evolution in our species. We are indeed the product of past evolution, and there is every reason to think that, collectively, humans are still evolving, generation by generation. But this takes a bit longer than "every year, every decade."

We hope we are wrong about Mr. Goodyear's understanding. He can set us straight in a flash, and we hope he does. He just needs to say that he wasn't serious about the shoe thing and that the evolution to which he was referring is the evolution to which we are referring. But if we aren't wrong, and his record-setting was another odd dodge, then this is a serious issue that should be debated more fully.

Past evolution is the reason why wearing high heels, giving birth and running on pavement all hurt. It is also integral to human genomics research, it is the reason behind serious multiple drug resistance in our hospitals, it is the reason we can't yet engineer a cure for HIV-AIDS, why we get cancer, and why we spend billions on pesticides every year.

Evolution, in other words, is integral to much that Mr. Goodyear must take an interest in. Does he get it? If he really doesn't, he won't be alone - a sizable minority of Canadians and a few MPs still don't understand what evolution is and how it works. But, unlike most of us, Mr. Goodyear is responsible for a large science budget and is making important decisions about science and its role in our future.

Canadian society as a whole should be asking whether someone in such a position should be better informed. As a man passionate about science and as a chiropractor, we're confident he would want to get it right.

Arne Mooers and Dolph Schluter are professors of evolutionary biology at Simon Fraser University and the University of British Columbia, respectively.

Recommend this article? 18 votes

Autos

Make no mistake, the Prius is the franchise, the brand, a rolling metaphor for everything Toyota is and wants to be.

Prius isn't about sales; it's about validation for the Toyota brand.

Travel

The beauty of South Beach, away from the buzz

The beauty of South Beach, away from the buzz

Campus

Kathy Dobson, A Parent's View blog

In an online world, why bother going to class?

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#Ax 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=48946_Sat, 21 Mar 2009 04:26:24 GMTUbytesXtext/css_Apache/2.2.0 (Unix) DAV/2U19579_Fri, 20 Mar 2009 14:50:38 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#AVm 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=51004_Sat, 21 Mar 2009 05:00:25 GMTUbytesXtext/css_Apache/2.2.0 (Unix) DAV/2R53_Fri, 20 Mar 2009 14:50:21 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#AF 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=63762_Fri, 20 Mar 2009 15:29:41 GMTUbytes_Apache/2.2.0 (Unix) DAV/2Xtext/cssT1991_Thu, 19 Mar 2009 21:46:59 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#AGF 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-RangesVServer\Content-Type^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=85132_Fri, 20 Mar 2009 21:25:51 GMTUbytes_Apache/2.2.0 (Unix) DAV/2_application/x-javascriptV221864_Thu, 19 Mar 2009 21:46:59 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#Ai 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_Fri, 20 Mar 2009 15:02:41 GMT_SorionSession1431=7578; domain=.eyereturn.com; expires=Fri, 20-Mar-2009 15:32:41 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?@ABC EFGHIJKLMNSP3pZKeep-Alive]Accept-RangesVServer\Content-TypeTDate^Content-LengthTEtagZConnection]Last-Modified_policyref="http://www.theglobeandmail.com/w3c/p3p.xml", CP="CAO DSP COR CURa ADMa DEVa TAIa PSAa PSDa CONi OUR NOR IND PHY ONL UNI COM NAV INT DEM STA PRE"_timeout=15, max=94UbytesVApache_application/x-javascript_Thu, 19 Mar 2009 21:28:39 GMTT1683_"151ca1-693-498a0330"_Wed, 04 Feb 2009 21:05:52 GMT./cdde2_NSMutableDictionary\NSDictionary./hiij2_NSHTTPURLResponse]NSURLResponse)27:PRd  DIR]`foxz )727OotxkO//check site for Beacom Tracking var BeaconTrackSite,pos,numPos,everythingAfterUrl; BeaconTrackSite = document.URL; if(BeaconTrackSite.indexOf(encodeURI(WEBSITE_CO_GLOBEINVESTOR_DB)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_CO_GLOBEINVESTOR)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_TGAM_SECURE)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_TGAM)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_FINANCE)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_FINANCE_FUND)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_FINANCE_PORTFOLIO)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_ROB)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_TGAM_SECURE)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_TGAM)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_IMAGES)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_CARS)) > -1 || BeaconTrackSite.indexOf(encodeURI(WEBSITE_SPORTS)) > -1) { if(BeaconTrackSite.indexOf("https://") > -1){ numPos = "8"; pos = BeaconTrackSite.indexOf("https://"); }else{ numPos = "7"; pos = BeaconTrackSite.indexOf("http://"); } //console.log(numPos); //console.log(pos); everythingAfterUrl = BeaconTrackSite.substring(pos+numPos,BeaconTrackSite.length); document.write("");document.getElementById("img1").src="http://beacon.scorecardresearch.com/scripts/beacon.dll?C1=2&C2=3005664&C3=3005664&C4=" + everythingAfterUrl + " &C5=&C6=&C7=" + escape(window.location.href) + "&C8=" + escape(document.title) + "&C9=" + escape(document.referrer) + "&rn=" + Math.floor(Math.random()*99999999); //console.log("Beacon Tracking"); }else{ //console.log("Nothing"); }__http://beacon.scorecardresearch.com/scripts/beacon.dll?C1=2&C2=3005664&C3=3005664&C4=www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/home%20&C5=&C6=&C7=http%3A//www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/home&C8=globeandmail.com%3A%20Does%20Canada%27s%20science%20minister%20really%20see%20the%20evolutionary%20light%3F&C9=http%3A//www.theglobeandmail.com/opinions/&rn=49031613Ombplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXWYZ[\]^bcU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_http://beacon.scorecardresearch.com/scripts/beacon.dll?C1=2&C2=3005664&C3=3005664&C4=www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/home%20&C5=&C6=&C7=http%3A//www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/home&C8=globeandmail.com%3A%20Does%20Canada%27s%20science%20minister%20really%20see%20the%20evolutionary%20light%3F&C9=http%3A//www.theglobeandmail.com/opinions/&rn=49031613./01X$classesZ$classname12UNSURLXNSObject#A;2 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLSP3p]Cache-Control]Accept-RangesVPragmaVServer\Content-TypeTDate^Content-LengthZConnection_policyref="/w3c/p3p.xml"Xno-cacheUbytesVApacheYimage/gif_Fri, 20 Mar 2009 14:55:43 GMTR43Uclose./_``a2_NSMutableDictionary\NSDictionary+./deef2_NSHTTPURLResponse]NSURLResponse)27:PRd   #.0:<>@BDFHJLVXZ\^`bdfhlz &+/ERTY]qgO+GIF89a!,D;!_zhttp://ad.ca.doubleclick.net/adj/www.theglobeandmail.com/specialcomment-hub;abr=!webtv;mode=bn;mode2=wcoevolve20;loc=lower;adpg=home;arena=specialcomment;ops=;nc=;kw=;pos=boxr;sz=300x250;tile=3;u=|site-wwwtheglobeandmailcom|zone-specialcommenthub|mode-bn|mode2-wcoevolve20|loc-lower|adpg-home|arena-specialcomment|ops-|nc-|kw-|pos-boxr|sz-300x250|tile-3|;ord=003762983251363039?Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,07:;?@EWNS.keysZNS.objectsABCD FGHI_Content-EncodingVServer\Content-Type^Content-LengthTgzipZDCLK-AdSvr_application/x-javascriptT205112STTU6_NSMutableDictionary\NSDictionary 12XYYZ6_NSHTTPURLResponse]NSURLResponse)27:PRd|"$)+-/168:<>QXety[O document.write(''); google_ad_client = "pub-4377513809082079"; google_ad_width = 300; google_ad_height = 250; google_ad_format = "300x250_as"; google_ad_channel =""; google_ad_type = "text"; google_color_border = "000000"; google_color_bg = "FFFFFF"; google_color_link = "003366"; google_color_url = "800040"; google_color_text = "808080"; //--> document.write('\n'); google_ad_url = ''; google_date = new Date(); google_random = google_date.getTime(); google_org_error_handler = window.onerror; function quoted(str) { return (str != null) ? '"' + str + '"' : '""'; } function google_encodeURIComponent(str) { if (typeof(encodeURIComponent) == 'function') { return encodeURIComponent(str); } else { return escape(str); } } function google_write_tracker(tracker_event) { var img_url = window.google_ad_url.replace(/pagead\/ads/, 'pagead/imp.gif'); var img_src = img_url + '&event=' + tracker_event; var img_tag = ''; document.write(img_tag); } function google_append_url(param, value) { if (value) { window.google_ad_url += '&' + param + '=' + value; } } function google_append_url_esc(param, value) { if (value) { google_append_url(param, google_encodeURIComponent(value)); } } function google_append_color(param, value) { if (value && typeof(value) == 'object') { value = value[window.google_random % value.length]; } google_append_url('color_' + param, value); } function google_get_user_data() { var javaEnabled = navigator.javaEnabled(); var tz = -google_date.getTimezoneOffset(); if (window.screen) { google_append_url("u_h", window.screen.height); google_append_url("u_w", window.screen.width); google_append_url("u_ah", window.screen.availHeight); google_append_url("u_aw", window.screen.availWidth); google_append_url("u_cd", window.screen.colorDepth); } google_append_url("u_tz", tz); google_append_url("u_his", history.length); google_append_url("u_java", javaEnabled); if (navigator.plugins) { google_append_url("u_nplug", navigator.plugins.length); } if (navigator.mimeTypes) { google_append_url("u_nmime", navigator.mimeTypes.length); } } function google_show_ad() { var w = window; w.onerror = w.google_org_error_handler; if (w.google_num_ad_slots) { w.google_num_ad_slots = w.google_num_ad_slots + 1; } else { w.google_num_ad_slots = 1; } if (w.google_num_ad_slots > 3) { return; } w.google_ad_url = 'http://pagead2.googlesyndication.com/pagead/ads?'; w.google_ad_client = w.google_ad_client.toLowerCase(); if (w.google_ad_client.substring(0,3) != 'ca-') { w.google_ad_client = 'ca-' + w.google_ad_client; } w.google_ad_url += 'client=' + escape(w.google_ad_client) + '&dt=' + w.google_date.getTime(); google_append_url('hl', w.google_language); if (w.google_country) { google_append_url('gl', w.google_country); } else { google_append_url('gl', w.google_gl); } google_append_url('gr', w.google_region); google_append_url_esc('gcs', w.google_city); google_append_url_esc('hints', w.google_hints); google_append_url('adsafe', w.google_safe); google_append_url('oe', w.google_encoding); google_append_url('lmt', w.google_last_modified_time); google_append_url_esc('alternate_ad_url', w.google_alternate_ad_url); google_append_url('alt_color', w.google_alternate_color); if (w.google_skip) { google_append_url("skip", w.google_skip); } else if (w.google_prev_ad_formats) { google_append_url_esc('prev_fmts', w.google_prev_ad_formats.toLowerCase()); } if (w.google_ad_format) { google_append_url_esc('format', w.google_ad_format.toLowerCase()); if (w.google_prev_ad_formats) { w.google_prev_ad_formats = w.google_prev_ad_formats + ',' + w.google_ad_format; } else { w.google_prev_ad_formats = w.google_ad_format; } } google_append_url('num_ads', w.google_max_num_ads); google_append_url('output', w.google_ad_output); google_append_url('adtest', w.google_adtest); if (w.google_ad_channel) { google_append_url_esc('channel', w.google_ad_channel.toLowerCase()); } google_append_url_esc('url', w.google_page_url); google_append_color('bg', w.google_color_bg); google_append_color('text', w.google_color_text); google_append_color('link', w.google_color_link); google_append_color('url', w.google_color_url); google_append_color('border', w.google_color_border); google_append_color('line', w.google_color_line); google_append_url('kw_type', w.google_kw_type); google_append_url_esc('kw', w.google_kw); google_append_url_esc('contents', w.google_contents); google_append_url('num_radlinks', w.google_num_radlinks); google_append_url('max_radlink_len', w.google_max_radlink_len); google_append_url('rl_filtering', w.google_rl_filtering); google_append_url('rl_mode', w.google_rl_mode); google_append_url('ad_type', w.google_ad_type); google_append_url('image_size', w.google_image_size); google_append_url('feedback_link', w.google_feedback); google_append_url_esc('ref', w.google_referrer_url); google_append_url_esc('loc', w.google_page_location); google_get_user_data(); w.google_ad_url = w.google_ad_url.substring(0, 1000); w.google_ad_url = w.google_ad_url.replace(/%\w?$/, ''); if (google_ad_output == 'js' && w.google_ad_request_done) { document.write(''); } else if (google_ad_output == 'html') { if (w.name == 'google_ads_frame') { google_write_tracker('reboundredirect'); } else { document.write(''); google_write_tracker('noiframe'); document.write(''); } } w.google_ad_frameborder = null; w.google_ad_format = null; w.google_page_url = null; w.google_language = null; w.google_gl = null; w.google_country = null; w.google_region = null; w.google_city = null; w.google_hints = null; w.google_safe = null; w.google_encoding = null; w.google_ad_output = null; w.google_max_num_ads = null; w.google_ad_channel = null; w.google_contents = null; w.google_alternate_ad_url = null; w.google_alternate_color = null; w.google_color_bg = null; w.google_color_text = null; w.google_color_link = null; w.google_color_url = null; w.google_color_border = null; w.google_color_line = null; w.google_adtest = null; w.google_kw_type = null; w.google_kw = null; w.google_num_radlinks = null; w.google_max_radlink_len = null; w.google_rl_filtering = null; w.google_rl_mode = null; w.google_ad_type = null; w.google_image_size = null; w.google_feedback = null; w.google_skip = null; w.google_page_location = null; w.google_referrer_url = null; } function google_error_handler(message, url, line) { google_show_ad(); return true; } window.onerror = google_error_handler; if (window.google_ad_frameborder == null) { google_ad_frameborder = 0; } if (window.google_ad_output == null) { google_ad_output = 'html'; } if (window.google_ad_format == null && window.google_ad_output == 'html') { google_ad_format = google_ad_width + 'x' + google_ad_height; } if (window.google_page_url == null) { google_page_url = document.referrer; if (window.top.location == document.location) { google_page_url = document.location; google_last_modified_time = Date.parse(document.lastModified) / 1000; google_referrer_url = document.referrer; } } else { google_page_location = document.referrer; if (window.top.location == document.location) { google_page_location = document.location; } } google_show_ad(); document.write(''); !_http://ad.ca.doubleclick.net/adj/www.theglobeandmail.com/specialcomment-hub;abr=!webtv;mode=bn;mode2=wcoevolve20;loc=lower;adpg=home;arena=specialcomment;ops=;nc=;kw=;pos=halfpager;sz=300x600,160x600,300x250;tile=4;u=|site-wwwtheglobeandmailcom|zone-specialcommenthub|mode-bn|mode2-wcoevolve20|loc-lower|adpg-home|arena-specialcomment|ops-|nc-|kw-|pos-halfpager|sz-300x600,160x600,300x250|tile-4|;ord=003762983251363039?Obplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,07:;?@EWNS.keysZNS.objectsABCD FGHI_Content-EncodingVServer\Content-Type^Content-LengthTgzipZDCLK-AdSvr_application/x-javascriptT205112STTU6_NSMutableDictionary\NSDictionary 12XYYZ6_NSHTTPURLResponse]NSURLResponse)27:PRd|!'029ALNSUWY[`bdfh{[(O document.write(''); google_ad_client = "pub-4377513809082079"; google_ad_width = 160; google_ad_height = 600; google_ad_format = "160x600_as"; google_ad_channel =""; google_ad_type = "text"; google_color_border = "000000"; google_color_bg = "FFFFFF"; google_color_link = "003366"; google_color_url = "800040"; google_color_text = "808080"; //--> document.write('\n'); google_ad_url = ''; google_date = new Date(); google_random = google_date.getTime(); google_org_error_handler = window.onerror; function quoted(str) { return (str != null) ? '"' + str + '"' : '""'; } function google_encodeURIComponent(str) { if (typeof(encodeURIComponent) == 'function') { return encodeURIComponent(str); } else { return escape(str); } } function google_write_tracker(tracker_event) { var img_url = window.google_ad_url.replace(/pagead\/ads/, 'pagead/imp.gif'); var img_src = img_url + '&event=' + tracker_event; var img_tag = ''; document.write(img_tag); } function google_append_url(param, value) { if (value) { window.google_ad_url += '&' + param + '=' + value; } } function google_append_url_esc(param, value) { if (value) { google_append_url(param, google_encodeURIComponent(value)); } } function google_append_color(param, value) { if (value && typeof(value) == 'object') { value = value[window.google_random % value.length]; } google_append_url('color_' + param, value); } function google_get_user_data() { var javaEnabled = navigator.javaEnabled(); var tz = -google_date.getTimezoneOffset(); if (window.screen) { google_append_url("u_h", window.screen.height); google_append_url("u_w", window.screen.width); google_append_url("u_ah", window.screen.availHeight); google_append_url("u_aw", window.screen.availWidth); google_append_url("u_cd", window.screen.colorDepth); } google_append_url("u_tz", tz); google_append_url("u_his", history.length); google_append_url("u_java", javaEnabled); if (navigator.plugins) { google_append_url("u_nplug", navigator.plugins.length); } if (navigator.mimeTypes) { google_append_url("u_nmime", navigator.mimeTypes.length); } } function google_show_ad() { var w = window; w.onerror = w.google_org_error_handler; if (w.google_num_ad_slots) { w.google_num_ad_slots = w.google_num_ad_slots + 1; } else { w.google_num_ad_slots = 1; } if (w.google_num_ad_slots > 3) { return; } w.google_ad_url = 'http://pagead2.googlesyndication.com/pagead/ads?'; w.google_ad_client = w.google_ad_client.toLowerCase(); if (w.google_ad_client.substring(0,3) != 'ca-') { w.google_ad_client = 'ca-' + w.google_ad_client; } w.google_ad_url += 'client=' + escape(w.google_ad_client) + '&dt=' + w.google_date.getTime(); google_append_url('hl', w.google_language); if (w.google_country) { google_append_url('gl', w.google_country); } else { google_append_url('gl', w.google_gl); } google_append_url('gr', w.google_region); google_append_url_esc('gcs', w.google_city); google_append_url_esc('hints', w.google_hints); google_append_url('adsafe', w.google_safe); google_append_url('oe', w.google_encoding); google_append_url('lmt', w.google_last_modified_time); google_append_url_esc('alternate_ad_url', w.google_alternate_ad_url); google_append_url('alt_color', w.google_alternate_color); if (w.google_skip) { google_append_url("skip", w.google_skip); } else if (w.google_prev_ad_formats) { google_append_url_esc('prev_fmts', w.google_prev_ad_formats.toLowerCase()); } if (w.google_ad_format) { google_append_url_esc('format', w.google_ad_format.toLowerCase()); if (w.google_prev_ad_formats) { w.google_prev_ad_formats = w.google_prev_ad_formats + ',' + w.google_ad_format; } else { w.google_prev_ad_formats = w.google_ad_format; } } google_append_url('num_ads', w.google_max_num_ads); google_append_url('output', w.google_ad_output); google_append_url('adtest', w.google_adtest); if (w.google_ad_channel) { google_append_url_esc('channel', w.google_ad_channel.toLowerCase()); } google_append_url_esc('url', w.google_page_url); google_append_color('bg', w.google_color_bg); google_append_color('text', w.google_color_text); google_append_color('link', w.google_color_link); google_append_color('url', w.google_color_url); google_append_color('border', w.google_color_border); google_append_color('line', w.google_color_line); google_append_url('kw_type', w.google_kw_type); google_append_url_esc('kw', w.google_kw); google_append_url_esc('contents', w.google_contents); google_append_url('num_radlinks', w.google_num_radlinks); google_append_url('max_radlink_len', w.google_max_radlink_len); google_append_url('rl_filtering', w.google_rl_filtering); google_append_url('rl_mode', w.google_rl_mode); google_append_url('ad_type', w.google_ad_type); google_append_url('image_size', w.google_image_size); google_append_url('feedback_link', w.google_feedback); google_append_url_esc('ref', w.google_referrer_url); google_append_url_esc('loc', w.google_page_location); google_get_user_data(); w.google_ad_url = w.google_ad_url.substring(0, 1000); w.google_ad_url = w.google_ad_url.replace(/%\w?$/, ''); if (google_ad_output == 'js' && w.google_ad_request_done) { document.write(''); } else if (google_ad_output == 'html') { if (w.name == 'google_ads_frame') { google_write_tracker('reboundredirect'); } else { document.write(''); google_write_tracker('noiframe'); document.write(''); } } w.google_ad_frameborder = null; w.google_ad_format = null; w.google_page_url = null; w.google_language = null; w.google_gl = null; w.google_country = null; w.google_region = null; w.google_city = null; w.google_hints = null; w.google_safe = null; w.google_encoding = null; w.google_ad_output = null; w.google_max_num_ads = null; w.google_ad_channel = null; w.google_contents = null; w.google_alternate_ad_url = null; w.google_alternate_color = null; w.google_color_bg = null; w.google_color_text = null; w.google_color_link = null; w.google_color_url = null; w.google_color_border = null; w.google_color_line = null; w.google_adtest = null; w.google_kw_type = null; w.google_kw = null; w.google_num_radlinks = null; w.google_max_radlink_len = null; w.google_rl_filtering = null; w.google_rl_mode = null; w.google_ad_type = null; w.google_image_size = null; w.google_feedback = null; w.google_skip = null; w.google_page_location = null; w.google_referrer_url = null; } function google_error_handler(message, url, line) { google_show_ad(); return true; } window.onerror = google_error_handler; if (window.google_ad_frameborder == null) { google_ad_frameborder = 0; } if (window.google_ad_output == null) { google_ad_output = 'html'; } if (window.google_ad_format == null && window.google_ad_output == 'html') { google_ad_format = google_ad_width + 'x' + google_ad_height; } if (window.google_page_url == null) { google_page_url = document.referrer; if (window.top.location == document.location) { google_page_url = document.location; google_last_modified_time = Date.parse(document.lastModified) / 1000; google_referrer_url = document.referrer; } } else { google_page_location = document.referrer; if (window.top.location == document.location) { google_page_location = document.location; } } google_show_ad(); document.write(''); !_6http://www.lcnd.ca/phase5/GlobeGroup/js/p5_settings.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_6http://www.lcnd.ca/phase5/GlobeGroup/js/p5_settings.js./01X$classesZ$classname12UNSURLXNSObject#A^Е 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ\X-Powered-By]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtag]Last-ModifiedWASP.NETUbytes_application/x-javascript_Microsoft-IIS/6.0T1177_Fri, 20 Mar 2009 14:50:34 GMT_"5ab1c4fbe3a7c91:236"_Wed, 18 Mar 2009 16:09:58 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] = 40; P5_siteList[0] = 'globeandmail.com/' P5_frequency[1] = 40; P5_siteList[1] = 'globeandmail.ca/' P5_frequency[2] = 40; P5_siteList[2] = 'globesports.com/' P5_frequency[3] = 40; P5_siteList[3] = 'globeauto.com/' P5_frequency[4] = 40; P5_siteList[4] = 'cars.globeauto.com/' P5_frequency[5] = 40; P5_siteList[5] = 'globeinvestor.com/' P5_frequency[6] = 200; P5_siteList[6] = 'globefund.com/' P5_frequency[7] = 40; P5_siteList[7] = 'gold.globeinvestor.com/' P5_frequency[8] = 40; P5_siteList[8] = 'secure.theglobeandmail.com/' P5_frequency[9] = 40; P5_siteList[9] = 'globeinvestor.ar.wilink.com/' P5_frequency[10] = 40; P5_siteList[10] = 'globeadvisor.com/' P5_frequency[11] = 40; P5_siteList[11] = 'globecareers.workopolis.com/' P5_frequency[12] = 40; P5_siteList[12] = 'globeautos.com/' P5_frequency[13] = 40; P5_siteList[13] = 'reportonbusiness.com' P5_frequency[14] = 40; P5_siteList[14] = 'globeandmail.com/realestate' P5_frequency[15] = 40; P5_siteList[15] = 'globeandmail.com/technology' P5_frequency[16] = 40; 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#Al*E 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ\X-Powered-By]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtag]Last-ModifiedWASP.NETUbytes_application/x-javascript_Microsoft-IIS/6.0T4836_Thu, 19 Mar 2009 21:45:34 GMT_"a9e6b7b928bc91:236"_Tue, 10 Feb 2009 15:16:00 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(2010,12,31);P5_setCookie("P5GlobeGroup070404","true",dtExpire);if(P5_getCookie("P5GlobeGroup070404")!=null) {window.location='https://phase5.mergenta.com/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;}!_Ahttp://images.theglobeandmail.com/v5/scripts/s_code.js?v=20090128Olbplist00 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_Ahttp://images.theglobeandmail.com/v5/scripts/s_code.js?v=20090128./01X$classesZ$classname12UNSURLXNSObject#A]J 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=49763_Sat, 21 Mar 2009 04:39:48 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2U17232_Fri, 20 Mar 2009 14:50:25 GMT_"4350-244b2f40"Zkeep-alive_Wed, 28 Jan 2009 17:17:09 GMT./deef2_NSMutableDictionary\NSDictionaryCP./ijjk2_NSHTTPURLResponse]NSURLResponse)27:PRd  RW`knt}).3>LZz#9FINRfltOCP/* 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" /* * Plugin: getQueryParam 2.3 * Appended on Jan 28/09. Mantis # 4209: To receive clickthroughs on newsletters. */ s.getQueryParam=new Function("p","d","u","" +"var s=this,v='',i,t;d=d?d:'';u=u?u:(s.pageURL?s.pageURL:s.wd.locati" +"on);if(u=='f')u=s.gtfs().location;while(p){i=p.indexOf(',');i=i<0?p" +".length:i;t=s.p_gpv(p.substring(0,i),u+'');if(t){t=t.indexOf('#')>-" +"1?t.substring(0,t.indexOf('#')):t;}if(t)v+=v?d+t:t;p=p.substring(i=" +"=p.length?i:i+1)}return v"); s.p_gpv=new Function("k","u","" +"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v" +"=s.pt(q,'&','p_gvf',k)}return v"); s.p_gvf=new Function("t","k","" +"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'T" +"rue':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s." +"epa(v)}return ''"); /* 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=specialComment&l2=BN&l3=home&page=story&id=RTGAM.20090319.wcoevolve20Olbplist00 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=specialComment&l2=BN&l3=home&page=story&id=RTGAM.20090319.wcoevolve20./01X$classesZ$classname12UNSURLXNSObject#Aq  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_Fri, 20 Mar 2009 14:55:46 GMTS808Uclose./XYYZ2_NSMutableDictionary\NSDictionary(./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd"07DIXc(,27;Q^afj~`O(GIF89a!,; _http://www.theglobeandmail.com/v5/includes/global/regInfo-iFrame.html?user_URL=http%3A//www.theglobeandmail.com/servlet/story/RTGAM.20090319.wcoevolve20/BNStory/specialComment/home&pageType=storyO

 Login or Register | 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#AXV 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=50836_Sat, 21 Mar 2009 04:57:38 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2U33227_Fri, 20 Mar 2009 14:50:22 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#AX2 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=52343_Sat, 21 Mar 2009 05:22:46 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2T2900_Fri, 20 Mar 2009 14:50:23 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#AYeߨ 6789DWNS.keysZNS.objects:;<=>?@ABC EFGHIJKLMN]Cache-ControlWExpires]Accept-Ranges\Content-TypeVServer^Content-LengthTDateTEtagZConnection]Last-Modified]max-age=50832_Sat, 21 Mar 2009 04:57:35 GMTUbytes_application/x-javascript_Apache/2.2.0 (Unix) DAV/2U11761_Fri, 20 Mar 2009 14:50:23 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=1237561071449&format=728x90_as&output=html&url=http%3A%2F%2Fwww.theglobeandmail.com%2Fservlet%2Fstory%2FRTGAM.20090319.wcoevolve20%2FBNStory%2FspecialComment%2Fhome&color_bg=FFFFFF&color_text=808080&color_link=003366&color_url=800040&color_border=000000&ad_type=text&ref=http%3A%2F%2Fwww.theglobeandmail.com%2Fopinions%2F&u_h=800&u_w=1280&u_ah=719&u_aw=1280&u_cd=24&u_tz=-420&u_his=7&u_java=true&u_nplug=7&u_nmime=137O9Y
  • Costa Rica Real Estate
    Oversized Lots in Central Pacific. See Online Video. Learn More Today!
    www.CostaLandSales.com
  • Westminster Toyota
    Check out our timing belt special! We perform Toyota suggested service
    www.WestminsterToyota.com
  • Condo Size Furniture
    Canadian made solid wood furniture and Sofas. Custom and Condo Sized.
    www.creativehome.ca
Ads by Google
_google_ads_frame_:http://pagead2.googlesyndication.com/pagead/js/graphics.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345MNOPQRSTUVWXYZ[\]^_cdU$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_:http://pagead2.googlesyndication.com/pagead/js/graphics.js./01X$classesZ$classname12UNSURLXNSObject#A:2w 6789CWNS.keysZNS.objects:;<=>?@AB DEFGHIJKLSP3pWExpires]Cache-Control_Content-Encoding\Content-TypeVServerTDate^Content-Length]Last-Modified_lpolicyref="http://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA PVD OTP OUR OTR IND OTC"_Fri, 20 Mar 2009 21:46:08 GMT_)public, max-age=86400, x-gzip-ok="public"Tgzip_text/javascript; charset=UTF-8Tcafe_Thu, 19 Mar 2009 21:46:08 GMTT2184_Tue, 17 Mar 2009 15:16:21 GMT./`aab2_NSMutableDictionary\NSDictionary./effg2_NSHTTPURLResponse]NSURLResponse)27:PRd  INWbekt} (6<AafjhO(function(){ var a;AdSenseGraphics.POS_TOP_LEFT_=0;AdSenseGraphics.POS_TOP_RIGHT_=1;AdSenseGraphics.POS_BOTTOM_LEFT_=2;AdSenseGraphics.POS_BOTTOM_RIGHT_=3;AdSenseGraphics.X_INTERCEPT_TOP_=0;AdSenseGraphics.X_INTERCEPT_BOTTOM_=1;AdSenseGraphics.Y_INTERCEPT_LEFT_=2;AdSenseGraphics.Y_INTERCEPT_RIGHT_=3;AdSenseGraphics.USER_AGENT_=navigator.userAgent;AdSenseGraphics.IS_OPERA_=typeof opera!="undefined";AdSenseGraphics.IS_IE_=!AdSenseGraphics.IS_OPERA_&&AdSenseGraphics.USER_AGENT_.indexOf("MSIE")!=-1; AdSenseGraphics.IS_SAFARI_=!AdSenseGraphics.IS_OPERA_&&AdSenseGraphics.USER_AGENT_.indexOf("Safari")!=-1;AdSenseGraphics.S_CURVE_CLASS_NAME_="curve";AdSenseGraphics.ROUNDED_CORNER_BG_CLASS_NAME_="rc_bg";AdSenseGraphics.ROUNDED_CORNER_BORDER_CLASS_NAME_="rc_border";AdSenseGraphics.SIGMOID_FUNCTION_WIDTH=12;AdSenseGraphics.SIGMOID_FUNCTION_OFFSET=6;function AdSenseGraphics(){}a=AdSenseGraphics.prototype;a.getPixelLeftX_=function(b){return b};a.getPixelRightX_=function(b){return b+1}; a.getPixelBottomY_=function(b){return b};a.getPixelTopY_=function(b){return b+1};a.computeSigmoid_=function(b,e,c){b=12*b/e-6;return c/(1+Math.exp(b))};a.computeSigmoidInverse_=function(b,e,c){if(b<=0)return e;if(b>=c)return 0;b=b/c;var d=Math.log((1-b)/b);return e*(d+6)/12};a.computeCircle_=function(b,e){var c=Math.sqrt(Math.pow(e,2)-Math.pow(b,2));return isNaN(c)?0:c}; a.addStyleRule_=function(b,e){if(AdSenseGraphics.IS_IE_)document.styleSheets[0].addRule(b,e);else{var c=document.createElement("style");c.type="text/css";var d=AdSenseGraphics.IS_SAFARI_?"innerText":"innerHTML";c[d]=b+"{"+e+"}";var f=document.getElementsByTagName("head")[0];f.appendChild(c)}}; a.createDiv_=function(b,e,c,d,f){var g=document.createElement("div"),h="position:absolute;overflow:hidden;left:";h+=b;h+="px;top:";h+=e;h+="px;width:";h+=c;h+="px;height:";h+=d;h+="px;";if(f!=null){h+="opacity:";h+=f;if(AdSenseGraphics.IS_IE_){h+=";filter: alpha(opacity=";h+=Math.round(f*100);h+=");"}}g.style.cssText=h;return g}; a.getCirclePixelIntercepts_=function(b,e,c){var d=new Array(4);d[AdSenseGraphics.Y_INTERCEPT_LEFT_]=this.computeCircle_(this.getPixelLeftX_(b),c);d[AdSenseGraphics.Y_INTERCEPT_RIGHT_]=this.computeCircle_(this.getPixelRightX_(b),c);d[AdSenseGraphics.X_INTERCEPT_BOTTOM_]=this.computeCircle_(this.getPixelBottomY_(e),c);d[AdSenseGraphics.X_INTERCEPT_TOP_]=this.computeCircle_(this.getPixelTopY_(e),c);return d}; a.getSigmoidPixelIntercepts_=function(b,e,c,d){var f=new Array(4);f[AdSenseGraphics.Y_INTERCEPT_LEFT_]=this.computeSigmoid_(this.getPixelLeftX_(b),c,d);f[AdSenseGraphics.Y_INTERCEPT_RIGHT_]=this.computeSigmoid_(this.getPixelRightX_(b),c,d);f[AdSenseGraphics.X_INTERCEPT_BOTTOM_]=this.computeSigmoidInverse_(this.getPixelBottomY_(e),c,d);f[AdSenseGraphics.X_INTERCEPT_TOP_]=this.computeSigmoidInverse_(this.getPixelTopY_(e),c,d);return f}; a.getSigmoidAntiAliasOpacity_=function(b,e,c,d){var f=this.getSigmoidPixelIntercepts_(b,e,c,d),g=this.getAntiAliasOpacity_(b,e,f);return g==-1?0:g};a.getCircleAntiAliasOpacity_=function(b,e,c,d){var f=this.getCirclePixelIntercepts_(b,e,c),g=this.getAntiAliasOpacity_(b,e,f);if(g==-1)return 0;return d?1-g:g}; a.getAntiAliasOpacity_=function(b,e,c){var d=0,f=new Array(2),g=new Array(2),h=false,p=false,l=false,k=false,j=this.getPixelBottomY_(e),q=this.getPixelTopY_(e),o=this.getPixelLeftX_(b),t=this.getPixelRightX_(b);if(c[AdSenseGraphics.Y_INTERCEPT_LEFT_]>=j&&c[AdSenseGraphics.Y_INTERCEPT_LEFT_]=o&&c[AdSenseGraphics.X_INTERCEPT_TOP_]=j&&c[AdSenseGraphics.Y_INTERCEPT_RIGHT_]=o&&c[AdSenseGraphics.X_INTERCEPT_BOTTOM_]g[1]?g[0]:g[1];d=n+(m-n)/2}else if(h&&k)d=g[0]*f[1]/2;else if(p&&l)d=1-(1-f[0])*(1-g[1])/2;else if(p&&k){var r=f[0]<=f[1]?f[0]:f[1],u=f[0]>f[1]?f[0]: f[1];d=r+(u-r)/2}return d}; a.createSigmoidCurve=function(b,e,c,d,f,g){this.addStyleRule_("#"+b.id+" ."+AdSenseGraphics.S_CURVE_CLASS_NAME_+" div","background-color: "+d);b.style.display="none";var h=this.createDiv_(0,0,e,c);h.className=AdSenseGraphics.S_CURVE_CLASS_NAME_;var p,l=c-1,k,j,q,o,t=c-1,n=0;for(;n0){var t=j?e-o:0,n=this.createDiv_(t,0,o,c-g),m=n.style;m.backgroundColor=d;q?(m.borderTop=k):(m.borderBottom=k);b.appendChild(n)}var r=c-h;if(r>0){var u=q?c-r:0,n=this.createDiv_(0,u,e-g,r),m=n.style;m.backgroundColor=d;j?(m.borderLeft=k):(m.borderRight=k);b.appendChild(n)}this.createRoundedCorner_(b,e,c,h,g,j,q);l.display=""}; a.createRoundedCorner_=function(b,e,c,d,f,g,h){var p=f>0,l=d-f,k=g?0:e-d,j=h?0:c-d,q=this.createDiv_(k,j,d,d);q.className=AdSenseGraphics.ROUNDED_CORNER_BG_CLASS_NAME_;var o=this.createDiv_(k,j,d,d);o.className=p?AdSenseGraphics.ROUNDED_CORNER_BORDER_CLASS_NAME_:AdSenseGraphics.ROUNDED_CORNER_BG_CLASS_NAME_;var t=l,n=d,m=l,r=d,u,x,y,v,z=d-1,w=0;for(;w0){j=h?d-u-x:u;v=this.createDiv_(k,j,1,x);o.appendChild(v)}var s=m-1;for(;s?@A CDEFGHIJSP3pWExpires]Cache-Control\Content-TypeVServerTDate^Content-Length]Last-Modified_lpolicyref="http://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA PVD OTP OUR OTR IND OTC"_Fri, 20 Mar 2009 21:46:08 GMT_)public, max-age=86400, x-gzip-ok="public"Yimage/pngTcafe_Thu, 19 Mar 2009 21:46:08 GMTS963_Wed, 28 Mar 2007 02:19:40 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd W\epsy +9>BXehmqdOÉPNG  IHDRN.IgAMA7tEXtSoftwareAdobe ImageReadyqe<UIDATXohMqǏvmRlXWwr/.Eh[uVB 八P-!ڭiyL-qhkLR:ӹס\t=s~{w VaX1{TjˉtN0 pWx_O.#l}T? qK 2=cи,vEZKuD4At1~\kA0D75Nen]Rt0%_B" wBvǁqb(A¶t>ɈhU˜[h Lx0[a1B&B7Be)p!v~i_ "u.rGDW{E⃠;1;D jSmMZ _} 16* ra0DEL:UjNNV<˘1ѺB'zHNjL{[Yv.vy[mRחWOgYQGv_E]9lB[|u=iu~8K.T-Ʒ*blߣ¾؝/'$[a)G;p |zLz9djZD\ZiF\L0L\쥿c֍I:6P>? ZapEYsZLp~{?x<#N]_o꙯/Q|U =Vh&Ұȋp(bι,'\sfCxinN& ݢW.{U{\ΙR˧VX:bnqiaQ l3fS4!+0s뤆֯\ſ8ϩé?ub7^WmU A)N.Q^/GiPIENDB` _http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4377513809082079&dt=1237561072177&prev_fmts=728x90_as&format=300x250_as&output=html&url=http%3A%2F%2Fwww.theglobeandmail.com%2Fservlet%2Fstory%2FRTGAM.20090319.wcoevolve20%2FBNStory%2FspecialComment%2Fhome&color_bg=FFFFFF&color_text=808080&color_link=003366&color_url=800040&color_border=000000&ad_type=text&ref=http%3A%2F%2Fwww.theglobeandmail.com%2Fopinions%2F&u_h=800&u_w=1280&u_ah=719&u_aw=1280&u_cd=24&u_tz=-420&u_his=7&u_java=true&u_nplug=7&u_nmime=137O7r
Ads by Google
_ -->B  _http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-4377513809082079&dt=1237561072413&prev_fmts=728x90_as%2C300x250_as&format=160x600_as&output=html&url=http%3A%2F%2Fwww.theglobeandmail.com%2Fservlet%2Fstory%2FRTGAM.20090319.wcoevolve20%2FBNStory%2FspecialComment%2Fhome&color_bg=FFFFFF&color_text=808080&color_link=003366&color_url=800040&color_border=000000&ad_type=text&ref=http%3A%2F%2Fwww.theglobeandmail.com%2Fopinions%2F&u_h=800&u_w=1280&u_ah=719&u_aw=1280&u_cd=24&u_tz=-420&u_his=7&u_java=true&u_nplug=7&u_nmime=137OF
Ads by Google
_ -->B'9Ods6<FQR! V*K\*ggh8lYj $YZ ZE^sssxC*; ,1 11e55;;<-@CCD2HNOO8S|||\U6GB ̛̬e t Q Q Ql U J    I J J K, O P P P UR Y Y Z* ^ m m n rf r r s w] w w x- | | 3 J "A "R " ': & N _ j ? P 7 ; I Z Y     < M     M !% B B C H i i i m r r r v   |  # , A  * h[hlhm&x~xx}s}x}}}}}~UhmnHY٦% d.dQdVdkd|