bplist00_WebSubresources_WebMainResource_WebSubframeArchives-#'+/37;?CGKOSX\`dhmquy} _WebResourceResponse_WebResourceData^WebResourceURL_WebResourceMIMETypeObplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 26 Jul 2006 16:36:03 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTU11176_Tue, 03 Oct 2006 15:19:36 GMT_"2b7f8e-2ba8-acd422c0"R2812jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357qv  )7BGV^cpt#'=JORnswtO+@import url(base.css); @import url(bundles.css); @import url(comments.css); @import url(ppv.css); @import url(movie-search.css); @import url(subnav.css); /*NB: design */ html>body.story #author { overflow: auto; } .story #fontSize small { margin-right: 5px; padding-right: 5px; border-right: 1px solid transparent; } .story #fontSize big, .story #fontSize small { cursor: pointer; } #articleBottomToolsHolder { clear: both; } .story #articleTools li, .story ul#articleBottomTools li { padding: 0 0 6px 14px; } .story p#storyLogo, .story #headline h2, .story p#subtitle, .story #author ul.columnistInfo, .story #secondaryNav .nav h4, .story #secondaryNav .nav h5, .story #secondaryNav .nav h4 img, .story #secondaryNav .nav h5 img, .story #article .nav h4, .story #article .nav h5, .story #article .nav h4 img, .story #article .nav h5 img { padding: 0; } .nav ol.storyList, .story ul#articleTools, .story ul#articleBottomTools, .story #secondaryNav h4 { padding-left: 0; } .story #articleTools li#fontSize { padding-left: 5px; } .story #chewy { margin-left: 0; } .story p#storyLogo, .story #pagePlace, .story #pagination, .story p#subtitle, .story #author p, .story #article .nav #photo p, .story #author ul.columnistInfo, .story #secondaryNav .nav h4 img, .story #secondaryNav .nav h5 img, .story #article .nav h4 img, .story #article .nav h5 img, .story #article #inTP.nav h4 { margin: 0; } .story #headline h2 { margin: 0 0 0.5em 0; } .story h3#deck { margin: -10px 0 0.85em 0; font-size: 1.1em; } .story #article { margin-top: 1.5em; } /* give GA secondaryNavWrapper a rule of it's own so that the bog box ad lines up with My Garage nav */ .globeauto.story #secondaryNav #secondaryNavWrapper { margin: 0.50em 0 0 0; } .story #secondaryNav #secondaryNavWrapper { margin: 1.2em 0 0 0; } .story #secondaryNav #secondaryNavWrapper .bigbox.ad { margin-bottom: 2em; } /* .story #secondaryNav #secondaryNavWrapper div.nav h4#rtta { margin-bottom: 1em; } */ .story #article .nav { float: left; width: 235px; padding-right: 20px; } .story #article .nav h4#mostComment, .story #article .nav h5 { margin: 0 0 5px 0; } .story #author img { margin: 5px 10px 0 0; float: left; border: 1px solid transparent; } .story #secondaryNav h4#rrGAMelsewhere { /*padding: 1.75px 0 2px 10px;*/ padding-bottom: 3px; border-bottom: 1px solid #eee; clear: both; margin: 0 0 1em 0; } .story #article #hubCol, .story #article .nav { margin-right: 0; } .story #secondaryNav .nav ul, .story #article .nav ul { margin: 0.25em 0 1.2em 0; } .story #secondaryNav .nav li, .story #article .nav li { /*margin-bottom: 1em;*/ margin-bottom: 0.25em; } .story ul#articleTools, .story ul#articleBottomTools { margin-top: 10px; } .story #photo, .story #inTP #TPphoto { margin: 0 0 1em 0; } .story #inTP #TPphoto p img, .story #inTP #TPphoto p a img { margin: 0.75em 0 0 0; } .story #chewy #headline p.logo cite, .story #author .update, .story #article #photo img, .story #article #photo a img, .story #article #inTP #TPphoto p img, .story #article #inTP #TPphoto p a img { display: block; } .story #articleTools li, .story ul#articleBottomTools li, .story #author ul.columnistInfo li { display: inline; } .nav ol.storyList, .story #author ul.columnistInfo, .story #secondaryNav .nav ul, .story #article .nav ul { list-style-type: none; } .story #article .nav ul { padding-left: 0; } .story #article .nav h4, .story #article .nav h5 { border-bottom: 1px solid transparent; } /*.story #secondaryNav h4#rrGAMelsewhere,*/ .story #secondaryNav .nav h4 img, .story #secondaryNav .nav h5 img, .story #article .nav h4 img, .story #article .nav h5 img { border: none; } .story #secondaryNav .nav, .story #secondaryNav .nav h4 img, .story #secondaryNav .nav h5 img { float: none; } .story #secondaryNav #hubCol, .story #secondaryNav #moreCol { /*width: 160px;*/ } /* .story #secondaryNav #hubCol { float: right; padding-right: 0; } .story #secondaryNav #moreCol { float: left; } */ .story #secondaryNav .nav { width: auto; } .story #articleTools li.email, .story ul#articleBottomTools li.email { background: url(/v5/images/icon/icon-email.gif) no-repeat; } .story #articleTools li.print, .story ul#articleBottomTools li.print { background: url(/v5/images/icon/icon-print.gif) no-repeat; } .story #articleTools li.comment, .story ul#articleBottomTools li.comment { background: url(/v5/images/icon/icon-comment.gif) no-repeat; } .story #articleTools li.share, .story ul#articleBottomTools li.share { background: url(/v5/images/icon/icon-share-11x9.gif) no-repeat; } .story #photo a#enlarge, .story #inTP #TPphoto a#enlarge { background: url(/v5/images/icon/icon-popup.gif) no-repeat right 50%; padding-right: 14px; } .story #article #inTP #TPphoto p a#enlarge { margin-left: -7px; } .story #article #photo img, .story #article #photo a img, .story #article #inTP #TPphoto p img, .story #article #inTP #TPphoto p a img { border: 1px solid transparent; } .story #topStoriesInSection { clear: left; } .story #pagePlace, .story #pagination { text-align: right; } /*NB: fonts */ .story #headline h3#deck, .story #author p.source, .story #secondaryNav .nav li a.normalWeight, .story #article .nav li a.normalWeight, .story #article .nav #photo p { font-weight: normal; } .story p#subtitle, .story #secondaryNav h4, .story #article .nav h5, .story #article #inTP.nav h4, .story p#storyLogo { text-transform: uppercase; } .story p#storyLogo, .story p#subtitle { font-weight: bold; } .story p#storyLogo, .story p#subtitle { font-size: 0.625em; } .story #chewy #article p { clear: none; margin-left: 0; } .story #article p.jumpline, .story #articleNavigation p#pagePlace, .story #articleNavigation p#pagination, .story #article #photo p, .story #article #photo a#enlarge { font-size: 0.7em; } .story #author p.byline, .story #author p.source, .story #article #inTP #TPphoto a#enlarge { font-size: 0.8em; } .story #author ul.columnistInfo { font-size: 0.875em; } .story #fontSize big, .story #fontSize small, .story ul#articleTools, .story ul#articleBottomTools, .story #secondaryNav #secondaryNavWrapper h4, .story #article h4, /*.story #secondaryNav #secondaryNavWrapper div.nav h4#rtta,*/ .story #article #photo, .story #article #inTP #TPphoto { font-size: 1em; } .story #secondaryNav .nav #moreCol li, .globeinvestor.story #secondaryNav .nav li, .globefund.story #secondaryNav .nav li { font-size: 1.1em !important; } .story cite { font-style: normal; } .story #article h4#rtta, .story #secondaryNav #secondaryNavWrapper h4#rrGAMelsewhere { text-transform: none; font-size: 1.50em; font-weight: normal; } .globeinvestor.story #secondaryNav #secondaryNavWrapper h4#rrGAMelsewhere, .globefund.story #secondaryNav #secondaryNavWrapper h4#rrGAMelsewhere { font-size: 0.942em !important; } .story #article h4#rtta { margin-top: 0; pading-top: 0; font-size: 0.90em; } .story #article .nav h4, .story #article .nav h5 { font-size: 0.625em; color: rgb(51,51,51); } /* .globeinvestor.story #article h4#rtta, .globeinvestor.story #secondaryNav #secondaryNavWrapper h4#rrGAMelsewhere, .globefund.story #article h4#rtta, .globefund.story #secondaryNav #secondaryNavWrapper h4#rrGAMelsewhere { font-size: 1em; } */ /*NB: colour */ .story p#subtitle, .story p#storyLogo { color: #666; } .story #fontSize small, .story #author img, .story #article #photo img, .story #article #photo a img, .story #article #inTP #TPphoto p img, .story #article #inTP #TPphoto p a img { border-color: #000; } .story #fontSize #fs-3, .story #fontSize #fs3 { color: #CCC !important; } .story #fontSize big, .story #fontSize small { color: #039; } .story #secondaryNav h4, .story #secondaryNav .nav h4, .story #secondaryNav .nav h5, .story #article .nav h4, .story #article .nav h5 { border-color: #eee; } /* NB: dynamic widen function */ #content.widen #secondaryNav, #content.widen #article .ad { display: none; } #content.widen #chewy { width: auto; margin-right: 0; max-width: 100%; } /* SYMBOL AD */ .story #secondaryNav ul.symbolNav { font: 10px; padding-bottom: 1px; margin-bottom: 0px; border-bottom: solid 1px #999; } .story #secondaryNav p.symbolLookup { display: none; } * html .story #secondaryNav #switchStockIntro { margin-top: -20px; } .globefund #lugHolder form select { font-size: 0.75em; vertical-align: 6px !important; } .globefund #articleTools li.email { display: none !important; } /* globeinvestor */ .globeinvestor #article div { font-size: 0.825em; } /* .globeinvestor #secondaryNav #moreCol .nav h3, .globeinvestor #secondaryNav #moreCol .nav p { font-size: 1.25em; margin: 0; padding: 0; } .globeinvestor #secondaryNav #moreCol .nav h3 { margin-bottom: 0.5em; } .globeinvestor #secondaryNav #moreCol .nav h3 a { font-weight: normal; } */ .globeinvestor #secondaryNav #dailyfxNews.nav p, .globeinvestor #secondaryNav #moreCol .nav p.byline { display: none; } /* BNStory tag search */ .story #chewy p#tags { clear: left; font-size: 0.75em; padding: 0.25em 0; border-top: 1px solid #DFDFDF; border-bottom: 1px solid #DFDFDF; } .story #chewy #status { font-weight: bold; } .story #chewy #status img#spinner { vertical-align: baseline; margin-right: 7px; padding-top: 2px; } .story #chewy #response { background: #f5f5f5; margin: 0 0 2em 0; padding: 3px; height: auto; max-height: 340px; overflow: auto; } .story #chewy #response p { padding-left: 5px; margin: 0; } .story #chewy #response .tagStory.blogTag { padding-left: 0; } .story #chewy #response #responseMsg { margin: 0; font-weight: bold; } .story #chewy #response #responseMsg span { float: right; text-align: right; width: 20%; padding-right: 10px; } .story #chewy #response #responseMsg span a.close-link { font-size: 1em; } .story #chewy #response #responseMsg span.date { float: none; padding-right: 0; } .story #chewy #response .tagStory { padding: 0 5px 5px 5px; margin: 0; } .story #chewy .tagStory h3 { font-size: 0.80em; padding: 5px 0 0 0; margin-bottom: 0; border-top: 1px solid #BFBFBF; } .story #chewy #response .tagStory.blogTag h3 { padding-left: 5px; } .story #chewy .tagStory p#posted { margin: 0; padding: 0; display: inline; } .story #chewy .tagStory span.comment { padding-left: 14px; vertical-align: baseline; background: url(/v5/images/icon/icon-comment.gif) no-repeat left; } .story #chewy .tagStory p.respSumm { margin: 0; padding: 0; } /* 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; }_7http://images.theglobeandmail.com/v5/styles/article.cssXtext/css  Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Fri, 12 May 2006 19:24:10 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:55 GMTT1970_Tue, 03 Oct 2006 15:18:21 GMT_"24d4b9-7b2-47f66a80"S14412jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357w|  !/=HM\divz#(,BOTWsx|tOhtml, 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 { 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/styles/article-print.css Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Tue, 26 Sep 2006 16:53:51 GMTUbytesUclose_Mon, 02 Oct 2006 12:03:31 GMTU22957_Tue, 03 Oct 2006 01:57:46 GMT_"26ce73-59ad-26a5c5c0"R3812jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357mr{  ")7EPUdlq~),15KX]`|tOYvar d = document; var ua = navigator.userAgent.toLowerCase(); var openmenu,x,tickerStories,omniDisabled; var ldbdAC="";var lugAC="";var skyRAC="";var boxRAC="";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: AJaX */ function doXSLT(nObj,xml,xsl){ // script block 1 processes XSL // script block 2 processes XML // script block 3 adds result to desired object (nObj) if(window.XMLHttpRequest){// not IE 6 or lower xsltProcessor = new XSLTProcessor(); xslhttp = new XMLHttpRequest(); xslhttp.open("GET", xsl, false); xslhttp.send(null); xsltProcessor.importStylesheet(xslhttp.responseXML); xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", xml, false); xmlhttp.send(null); result = xsltProcessor.transformToFragment(xmlhttp.responseXML,d); nObj.appendChild(result); } else if(window.ActiveXObject){// IE 6 or lower xmlhttp = new ActiveXObject("MSXML2.DOMDocument"); xmlhttp.async = false xmlhttp.load(xml) xslhttp = new ActiveXObject("MSXML2.DOMDocument"); xslhttp.async = false; xslhttp.load(xsl); nObj.innerHTML=xmlhttp.transformNode(xslhttp); } } /* 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){ var time = new Date(); time.setTime(time.getTime() + (1000*60*60*24*365));//expires in a year d.cookie = name + "=" + escape(value) + "; path=/; expires=" + time.toGMTString(); } 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; } }) } } /* 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) { 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; params += ',menubar=no,resizable=yes,toolbar=no,scrollbars=yes,location=no'; window.open(url, n, params); return false; } 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){ 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; iw && 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 loadTicker() { var c = d.getElementById("ticker"); var tickerCookie = getCookie("TGAM-ticker"); if(tickerCookie == "off" || (c && c.getElementsByTagName("MARQUEE").length>0)) { c.style.display = "none" return; } if (c) { c.style.visibility = "visible"; c.style.overflow = "visible"; m = document.createElement("MARQUEE"); m.setAttribute("scrollDelay", 130); m.setAttribute("direction", "left"); m.setAttribute("scrollAmount", 5); m.onmouseover = function(){ this.stop(); }; m.onmouseout = function(){ this.start(); }; if (tickerStories.length == 1) { m.setAttribute("class", "override"); } for (var i=0; ix;x++){ if(d.getElementById(acSpots[x]) && d.getElementById(acSpots[x]+"Holder")){ if(4>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(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")); } } } } } 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 "skyR": mod = [4,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; if(d.getElementById("transLeader")){ d.getElementById("transLeader").style.position = "absolute"; if(d.all && d.compatMode && d.compatMode!="BackCompat"){ d.getElementById("transLeader").style.left = eval(pos[0]+4)+"px" nObj.style.width = eval(getElPos(d.getElementById("atticPromo"))[0])+"px"; addEvent(window,"resize",function(){ d.getElementById("ldbdHolder").style.width = eval(getElPos(d.getElementById("atticPromo"))[0])+"px"; }); } else if(d.all) { d.getElementById("transLeader").style.left = eval(pos[0])+"px"; d.getElementById("transLeader").style.top = 0 nObj.style.width = eval(getElPos(d.getElementById("atticPromo"))[0])+"px"; addEvent(window,"resize",function(){ d.getElementById("ldbdHolder").style.width = eval(getElPos(d.getElementById("atticPromo"))[0])+"px"; }); } } } else if(acType=="topLayer" && i=="ldbd") { nObj.style.overflow = "visible"; } else { nObj.onmouseover = function(){ this.style.overflow = "visible"; }; nObj.onmouseout = function(){ this.style.overflow = "hidden"; }; if(d.getElementById(i).parentNode.id.indexOf("secondaryNav")==0 && i=="boxR") { 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"; } } } } 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 = d.getElementById(objToToggleId); var closeLink = d.getElementById(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(d.getElementById(objToggle.id)); break; case "fade": new Effect.Fade(d.getElementById(objToggle.id)); break; case "slide": new Effect.SlideUp(d.getElementById(objToggle.id)); break; case "switch": new Effect.SwitchOff(d.getElementById(objToggle.id)); break; default: new Effect.Fade(d.getElementById(objToggle.id)); } } else { new Effect.Fade(d.getElementById(objToggle.id)); } return false; }); /* add the show effect */ if(effectType) { switch(effectType) { case "blind": new Effect.BlindDown(d.getElementById(objToggle.id)); break; case "fade": new Effect.Appear(d.getElementById(objToggle.id)); break; case "slide": new Effect.SlideDown(d.getElementById(objToggle.id)); break; case "switch": new Effect.Appear(d.getElementById(objToggle.id)); break; default: new Effect.Appear(d.getElementById(objToggle.id)); } } else { new Effect.Appear(d.getElementById(objToggle.id)); } } else { //end if closeLinkId /* if there's no closeLink use objToggle as display toggler */ new Effect.toggle(d.getElementById(objToggle.id),"appear"); } return false; }// end showHelp_3http://images.theglobeandmail.com/v5/scripts/api.js_application/x-javascript Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Thu, 04 May 2006 18:24:40 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:55 GMTT7707_Tue, 03 Oct 2006 15:20:35 GMT_"1ca217-1e1b-84718a00"S20212jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357sx "$&(/=KV[jrw.27;Q^cftO/** * SWFObject v1.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * * **SWFObject is the SWF embed script formarly known as FlashObject. The name was changed for * legal reasons. */ if(typeof deconcept == "undefined") var deconcept = new Object(); if(typeof deconcept.util == "undefined") deconcept.util = new Object(); if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = new Object(); deconcept.SWFObject = function(swf, id, w, h, ver, c, useExpressInstall, quality, xiRedirectUrl, redirectUrl, detectKey){ if (!document.createElement || !document.getElementById) { return; } this.DETECT_KEY = detectKey ? detectKey : 'detectflash'; this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY); this.params = new Object(); this.variables = new Object(); this.attributes = new Array(); if(swf) { this.setAttribute('swf', swf); } if(id) { this.setAttribute('id', id); } if(w) { this.setAttribute('width', w); } if(h) { this.setAttribute('height', h); } if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); } this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(this.getAttribute('version'), useExpressInstall); if(c) { this.addParam('bgcolor', c); } var q = quality ? quality : 'high'; this.addParam('quality', q); this.setAttribute('useExpressInstall', useExpressInstall); this.setAttribute('doExpressInstall', false); var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location; this.setAttribute('xiRedirectUrl', xir); this.setAttribute('redirectUrl', ''); if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); } } deconcept.SWFObject.prototype = { setAttribute: function(name, value){ this.attributes[name] = value; }, getAttribute: function(name){ return this.attributes[name]; }, addParam: function(name, value){ this.params[name] = value; }, getParams: function(){ return this.params; }, addVariable: function(name, value){ this.variables[name] = value; }, getVariable: function(name){ return this.variables[name]; }, getVariables: function(){ return this.variables; }, getVariablePairs: function(){ var variablePairs = new Array(); var key; var variables = this.getVariables(); for(key in variables){ variablePairs.push(key +"="+ variables[key]); } return variablePairs; }, getSWFHTML: function() { var swfNode = ""; if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture if (this.getAttribute("doExpressInstall")) this.addVariable("MMplayerType", "PlugIn"); swfNode = ' 0){ swfNode += 'flashvars="'+ pairs +'"'; } swfNode += '/>'; } else { // PC IE if (this.getAttribute("doExpressInstall")) this.addVariable("MMplayerType", "ActiveX"); swfNode = ''; swfNode += ''; var params = this.getParams(); for(var key in params) { swfNode += ''; } var pairs = this.getVariablePairs().join("&"); if(pairs.length > 0) {swfNode += '';} swfNode += ""; } return swfNode; }, write: function(elementId){ if(this.getAttribute('useExpressInstall')) { // check to see if we need to do an express install var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]); if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) { this.setAttribute('doExpressInstall', true); this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl'))); document.title = document.title.slice(0, 47) + " - Flash Player Installation"; this.addVariable("MMdoctitle", document.title); } } if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))){ var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId; n.innerHTML = this.getSWFHTML(); return true; }else{ if(this.getAttribute('redirectUrl') != "") { document.location.replace(this.getAttribute('redirectUrl')); } } return false; } } /* ---- detection functions ---- */ deconcept.SWFObjectUtil.getPlayerVersion = function(reqVer, xiInstall){ var PlayerVersion = new deconcept.PlayerVersion([0,0,0]); if(navigator.plugins && navigator.mimeTypes.length){ var x = navigator.plugins["Shockwave Flash"]; if(x && x.description) { PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-z]|[A-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); } }else{ try{ var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); for (var i=3; axo!=null; i++) { axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+i); PlayerVersion = new deconcept.PlayerVersion([i,0,0]); } }catch(e){} if (reqVer && PlayerVersion.major > reqVer.major) return PlayerVersion; // version is ok, skip minor detection // this only does the minor rev lookup if the user's major version // is not 6 or we are checking for a specific minor or revision number // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/ if (!reqVer || ((reqVer.minor != 0 || reqVer.rev != 0) && PlayerVersion.major == reqVer.major) || PlayerVersion.major != 6 || xiInstall) { try{ PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); }catch(e){} } } return PlayerVersion; } deconcept.PlayerVersion = function(arrVersion){ this.major = parseInt(arrVersion[0]) != null ? parseInt(arrVersion[0]) : 0; this.minor = parseInt(arrVersion[1]) || 0; this.rev = parseInt(arrVersion[2]) || 0; } deconcept.PlayerVersion.prototype.versionIsValid = function(fv){ if(this.major < fv.major) return false; if(this.major > fv.major) return true; if(this.minor < fv.minor) return false; if(this.minor > fv.minor) return true; if(this.rev < fv.rev) return false; return true; } /* ---- get value of query string param ---- */ deconcept.util = { getRequestParameter: function(param){ var q = document.location.search || document.location.hash; if(q){ var startIndex = q.indexOf(param +"="); var endIndex = (q.indexOf("&", startIndex) > -1) ? q.indexOf("&", startIndex) : q.length; if (q.length > 1 && startIndex > -1) { return q.substring(q.indexOf("=", startIndex)+1, endIndex); } } return ""; } } /* add Array.push if needed (ie5) */ if (Array.prototype.push == null) { Array.prototype.push = function(item) { this[this.length] = item; return this.length; }} /* add some aliases for ease of use/backwards compatibility */ var getQueryParamValue = deconcept.util.getRequestParameter; var FlashObject = deconcept.SWFObject; // for legacy support var SWFObject = deconcept.SWFObject; _9http://images.theglobeandmail.com/v5/scripts/swfobject.js Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Fri, 12 May 2006 16:01:34 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:55 GMTT2629_Tue, 03 Oct 2006 15:20:48 GMT_"26d8cb-a45-73689380"R4612jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357sx "$&(/=KV[jrw-059O\adtO E/* NB: nav behaviour */ function globalNav(){ if(!d.getElementById("header")) { return; } if (d.getElementById("header").getElementsByTagName("UL")[0]) { if (d.getElementById("header").getElementsByTagName("UL")[0]) { var nav = d.getElementById("header").getElementsByTagName("UL")[0]; var nav_items = nav.getElementsByTagName("LI"); setActive(nav_items); setCurrent(nav_items,1); setCurrent(nav_items,2); } } } function setActive(nObj){ var bodyCN = d.getElementsByTagName("BODY")[0].className.split(" "); for(x=0;nObj.length>x;x++){ if(nObj[x].className.indexOf(bodyCN[1])!=0 || nObj[x].className.indexOf(bodyCN[2])!=0){ addEvent(nObj[x],"mouseover", menuOn); addEvent(nObj[x],"mouseout", menuOff); nObj[x].setActiveMenuOn = SetActiveMenuOn; } } } var currClassName, oldClassName; function menuOn(e){ e = (!e) ? window.event : e; obj = this; if (window.event) { cls = e.srcElement.className; } else { cls = e.target.className; } oldClassName = currClassName; currClassName = cls; var temp = function() {obj.setActiveMenuOn();} setTimeout(temp, 500); clearTimeout(openmenu); //setActiveMenuOn(this); } function menuOff(e){ e = (!e) ? window.event : e; e.cancelBubble = true; if(e.stopPropagation) { e.stopPropagation(); } openmenu = setTimeout("resetActiveMenu()",1000) } function setCurrent(nObj,v){ var bodyCN = d.getElementsByTagName("BODY")[0].className.split(" "); for(x=0;nObj.length>x;x++){ if(bodyCN[v]==nObj[x].className){ nObj[x].className += " dynActive"; } } } function SetActiveMenuOn(){ if(this.parentNode.parentNode.className.indexOf("dynActive")==-1) { setActiveMenuOff(); } // keeps parent on if sub active this.className += " dynActive"; if(ua.indexOf("safari")!=-1) { this.style.opacity = "99.99"; window.scrollBy(0,0); } // trying to fix Safari redraw bug if (isOpera) { if (d.getElementById("header").getElementsByTagName("UL")[0]) { var nav = d.getElementById("header").getElementsByTagName("UL")[0]; var subs = nav.getElementsByTagName("UL"); for (var i=0; ix;x++){ nObj[x].className = nObj[x].className.replace(/\sdynActive/,""); } } function resetActiveMenu(e){ var nav_items = d.getElementById("header").getElementsByTagName("UL")[0].getElementsByTagName("LI"); setActiveMenuOff(); setCurrent(nav_items,1); setCurrent(nav_items,2); } addEvent(window,"load",globalNav);_9http://images.theglobeandmail.com/v5/scripts/globalNav.js !"Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 26 Jul 2006 14:03:27 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTT8290_Tue, 03 Oct 2006 15:14:01 GMT_"28076a-2062-8b16a9c0"R5512jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357rw!#%'.<JUZiqv-059O\adtO bvar hub; /* NB: font size */ function fontSizer(){ if(!d.getElementById("articleTools") || d.getElementById("fontSize")){ return; }; var fS = parseInt(checkFontSize()); newSize(fS); var fsHolder = d.createElement("li"); fsHolder.id = "fontSize"; var smallerObj = createFontSizer("fsSmaller"); var largerObj = createFontSizer("fsLarger"); d.getElementById("articleTools").appendChild(fsHolder); fsHolder.appendChild(smallerObj); fsHolder.appendChild(d.createTextNode("Text Size")); fsHolder.appendChild(largerObj); function checkFontSize(){ function convertFontSize(){ var cookie = getCookie("gam_style"); if(cookie==null){ return; } cookie = cookie.split(";"); for(x=0;cookie.length>x;x++){ if(cookie[x].indexOf("fS")!=-1) { switch(cookie[x].split("fS=")[1]){ case -2: fS = 0; break; case 0: fS = 2; break; case 1: fS = 3; break; case 2: fS = 4; break; default: fS = 1; break; } } } deleteCookie("gam_style"); setCookie("TGAM-fontSize", "fS="+fS+";"); } convertFontSize(); var cookie = getCookie("TGAM-fontSize"); if(cookie==null){ cookie = "fS=1;"; } cookie = cookie.split(";"); for(x=0;cookie.length>x;x++){ if(cookie[x].indexOf("fS")!=-1) { var fS = cookie[x].split("fS=")[1]; if(isNaN(fS)) { fS = 1; } setCookie("TGAM-fontSize", "fS="+fS+";"); } } return fS; } function createFontSizer(v){ switch(v){ case "fsSmaller": var parms = [smallerObj,"Decrease","\u2212","minus",0]; var smallerObj = d.createElement("img"); break; case "fsLarger": var parms = [largerObj,"Increase","+","plus",4]; var largerObj = d.createElement("img"); break; } parms[0] = d.createElement("img"); parms[0].src = "http://images.theglobeandmail.com/v5/images/icon/icon-"+parms[3]+".gif"; parms[0].width = 12; parms[0].height = 11; parms[0].alt = parms[3]; parms[0].id = v; parms[0].style.verticalAlign = "-1px"; parms[0].style.margin = "0 2px"; if(parms[4]!=fS) { addEvent(parms[0],"click",changeSize); parms[0].title = parms[1] +" the text size"; parms[0].style.cursor = (d.all) ? "hand" : "pointer"; parms[0].style.opacity = "1"; } else { parms[0].title = "You cannot " + parms[1].toLowerCase() + " the text size any further"; parms[0].style.cursor = "default"; parms[0].style.opacity = "0.2"; } return parms[0]; } function changeSize(){ switch(this.id){ case "fsSmaller": var parms = [smallerObj,largerObj,"Decrease","Increase","\u2212","minus",0,-1]; break; case "fsLarger": var parms = [largerObj,smallerObj,"Increase","Decrease","+","plus",4,1]; break; } var fS = checkFontSize(); var nfS = eval(parseInt(fS)+parms[7]); if(parms[6]!=nfS){ newSize(nfS); addEvent(parms[1],"click",changeSize); parms[1].title = parms[3] +" the text size"; parms[1].style.opacity = "1"; parms[1].style.cursor = (d.all) ? "hand" : "pointer"; } else { newSize(nfS); removeEvent(parms[0],"click",changeSize); parms[0].title = "You cannot " + parms[2].toLowerCase() +" the text size any further"; parms[0].style.opacity = "0.2"; parms[0].style.cursor = "default"; } if(d.getElementById("skyRHolder") && d.getElementById("skyR") ) { placeAC("skyR"); } if(d.getElementById("boxRHolder") && d.getElementById("boxR") ) { placeAC("boxR"); } } function newSize(fS){ switch(fS) { case 0: size = 85; break; case 2: size = 115; break; case 3: size = 130; break; case 4: size = 150; break; default: size = 100; break; } if(d.getElementById("article")) { d.getElementById("article").style.fontSize = size+"%"; } setCookie("TGAM-fontSize", "fS="+fS+";"); } } /* NB: widen page on finance sites */ function writeWidenPage(){ if(d.getElementsByTagName("BODY")[0].className.indexOf("globeinvestor")!=-1 || d.getElementsByTagName("BODY")[0].className.indexOf("globefund")!=-1){ var pt = d.getElementById("articleTools"); var li = d.createElement("LI"); var an = d.createElement("A"); li.className = "widen"; an.href = "#"; addEvent(an,"click",function () { widenPage(this); return false; }); an.appendChild(d.createTextNode("Widen this Page")); li.appendChild(an); pt.appendChild(li); } function widenPage(el){ var nObj = d.getElementById("articleTools").childNodes; var text = el.firstChild.nodeValue; if(text.indexOf("Widen")!=-1){ d.getElementById("content").className = "widen"; el.firstChild.nodeValue = "Narrow this Page"; d.getElementById("boxRHolder").style.visibility = "hidden"; d.getElementById("skyRHolder").style.visibility = "hidden"; el.parentNode.className = "narrow"; } else { d.getElementById("content").className = ""; d.getElementById("boxRHolder").style.visibility = ""; d.getElementById("skyRHolder").style.visibility = ""; el.firstChild.nodeValue = "Widen this Page"; el.parentNode.className = "widen"; } } } /* NB: duplicate tools within aricles */ function addArticleTools(){ if(d.getElementById("articleBottomTools")) { return; } var aTools = d.getElementById("articleTools").cloneNode(true); aTools.id = "articleBottomTools"; aToolsLinks = aTools.getElementsByTagName("a"); if(d.getElementById("articleBottomToolsHolder")){ aToolsHolder = d.getElementById("articleBottomToolsHolder"); } for(x=0;aToolsLinks.length>x;x++){ if(aToolsLinks[x].parentNode.className=="comment" && d.getElementById("commentRSS")) { if(aToolsLinks[x].className=="closed"){ commentvalue = aToolsLinks[x].firstChild.nodeValue.replace(/Comments \(([0-9]+)/,"Follow conversation ($1"); } else if(aToolsLinks[x].firstChild.nodeValue.search(/Comment(|[s]) \(([0-9]+)/)!=-1){ commentvalue = aToolsLinks[x].firstChild.nodeValue.replace(/Comment(|[s]) \(([0-9]+)/,"Join conversation ($2"); } else { commentvalue = aToolsLinks[x].firstChild.nodeValue.replace(/Comment/,"Leave the first comment"); } aToolsLinks[x].firstChild.nodeValue=commentvalue; } } if(d.getElementById("articleBottomToolsHolder") && aToolsHolder) { aToolsHolder.appendChild(aTools); } } /* NB: get stories, and hide if listed */ function getSLinks(i,s_id,count){ var s_links = d.getElementById(i).getElementsByTagName("a"); for(x=0;s_links.length>x;x++){ if((s_links[x].href.indexOf(s_id)>1) || (x>=count)){ nObj = ((i=="relatedNewsNav" || i=="wiseNav") && s_links[x].parentNode.parentNode.nodeName=="LI") ? s_links[x].parentNode.parentNode : s_links[x].parentNode; nObj.style.display = "none"; return; } } } /* NB: init */ function articleInit(){ if(d.getElementById("articleTools") && location.href.indexOf("CommentStory")==-1) { addArticleTools(); if(window.print){ printThis(d.getElementById("articleTools")); if(d.getElementById("articleBottomTools")) { printThis(d.getElementById("articleBottomTools")); } } } if((location.href.indexOf("PPVStoryOwn")==-1) && (d.getElementsByTagName("BODY")[0].className.indexOf("bundle")==-1)) { fontSizer(); } if(d.getElementById("feedsAvailable")) { makeRSSLink("feedsAvailable","A"); } var shareLinks = getElementsByClassName(d.getElementById("chewy"), "A", "share-article"); if(shareLinks.length > 0) { for(var i=0; i<"+"/script>"); /*@end @*/_8http://images.theglobeandmail.com/v5/scripts/articles.js $%&Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 17 May 2006 21:14:43 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTU55149_Tue, 03 Oct 2006 15:17:37 GMT_"2a3cc5-d76d-6886d6c0"S54712jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357z  !#%')+-/6DR]bqy~6:?CYfkntOm/* Prototype JavaScript framework, version 1.5.0_rc0 * (c) 2005 Sam Stephenson * * Prototype is freely distributable under the terms of an MIT-style license. * For details, see the Prototype web site: http://prototype.conio.net/ * /*--------------------------------------------------------------------------*/ var Prototype = { Version: '1.5.0_rc0', ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', emptyFunction: function() {}, K: function(x) {return x} } var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } } var Abstract = new Object(); Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } Object.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; } } 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; return function(event) { return __method.call(object, event || window.event); } } Object.extend(Number.prototype, { toColorPart: function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; }, succ: function() { return this + 1; }, times: function(iterator) { $R(0, this, true).each(iterator); return this; } }); var Try = { these: function() { var returnValue; for (var i = 0; i < arguments.length; i++) { var lambda = arguments[i]; try { returnValue = lambda(); break; } catch (e) {} } return returnValue; } } /*--------------------------------------------------------------------------*/ var PeriodicalExecuter = Class.create(); PeriodicalExecuter.prototype = { initialize: function(callback, frequency) { this.callback = callback; this.frequency = frequency; this.currentlyExecuting = false; this.registerCallback(); }, registerCallback: function() { setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.callback(); } finally { this.currentlyExecuting = false; } } } } Object.extend(String.prototype, { gsub: function(pattern, replacement) { var result = '', source = this, match; replacement = arguments.callee.prepareReplacement(replacement); while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += (replacement(match) || '').toString(); source = source.slice(match.index + match[0].length); } else { result += source, source = ''; } } return result; }, sub: function(pattern, replacement, count) { replacement = this.gsub.prepareReplacement(replacement); count = count === undefined ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) return match[0]; return replacement(match); }); }, scan: function(pattern, iterator) { this.gsub(pattern, iterator); return this; }, truncate: function(length, truncation) { length = length || 30; truncation = truncation === undefined ? '...' : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : this; }, strip: function() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); }, stripTags: function() { return this.replace(/<\/?[^>]+>/gi, ''); }, stripScripts: function() { return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); }, extractScripts: function() { var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ['', ''])[1]; }); }, evalScripts: function() { return this.extractScripts().map(function(script) { return eval(script) }); }, escapeHTML: function() { var div = document.createElement('div'); var text = document.createTextNode(this); div.appendChild(text); return div.innerHTML; }, unescapeHTML: function() { var div = document.createElement('div'); div.innerHTML = this.stripTags(); return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; }, toQueryParams: function() { var pairs = this.match(/^\??(.*)$/)[1].split('&'); return pairs.inject({}, function(params, pairString) { var pair = pairString.split('='); params[pair[0]] = pair[1]; return params; }); }, toArray: function() { return this.split(''); }, camelize: function() { var oStringList = this.split('-'); if (oStringList.length == 1) return oStringList[0]; var camelizedString = this.indexOf('-') == 0 ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) : oStringList[0]; for (var i = 1, len = oStringList.length; i < len; i++) { var s = oStringList[i]; camelizedString += s.charAt(0).toUpperCase() + s.substring(1); } return camelizedString; }, inspect: function() { return "'" + this.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; var Template = Class.create(); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; Template.prototype = { initialize: function(template, pattern) { this.template = template.toString(); this.pattern = pattern || Template.Pattern; }, evaluate: function(object) { return this.template.gsub(this.pattern, function(match) { var before = match[1]; if (before == '\\') return match[2]; return before + (object[match[3]] || '').toString(); }); } } var $break = new Object(); var $continue = new Object(); var Enumerable = { each: function(iterator) { var index = 0; try { this._each(function(value) { try { iterator(value, index++); } catch (e) { if (e != $continue) throw e; } }); } catch (e) { if (e != $break) throw e; } }, 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 = true; this.each(function(value, index) { if (result = !!(iterator || Prototype.K)(value, index)) throw $break; }); return result; }, collect: function(iterator) { var results = []; this.each(function(value, index) { results.push(iterator(value, index)); }); return results; }, detect: function (iterator) { var result; this.each(function(value, index) { if (iterator(value, index)) { result = value; throw $break; } }); return result; }, findAll: function(iterator) { var results = []; this.each(function(value, index) { if (iterator(value, index)) results.push(value); }); return results; }, grep: function(pattern, iterator) { var results = []; this.each(function(value, index) { var stringValue = value.toString(); if (stringValue.match(pattern)) results.push((iterator || Prototype.K)(value, index)); }) return results; }, include: function(object) { var found = false; this.each(function(value) { if (value == object) { found = true; throw $break; } }); return found; }, inject: function(memo, iterator) { this.each(function(value, index) { memo = iterator(memo, value, index); }); return memo; }, invoke: function(method) { var args = $A(arguments).slice(1); return this.collect(function(value) { return value[method].apply(value, args); }); }, max: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value >= result) result = value; }); return result; }, min: function(iterator) { var result; this.each(function(value, index) { value = (iterator || Prototype.K)(value, index); if (result == undefined || value < result) result = value; }); return result; }, partition: function(iterator) { var trues = [], falses = []; this.each(function(value, index) { ((iterator || Prototype.K)(value, index) ? trues : falses).push(value); }); return [trues, falses]; }, pluck: function(property) { var results = []; this.each(function(value, index) { results.push(value[property]); }); return results; }, reject: function(iterator) { var results = []; this.each(function(value, index) { if (!iterator(value, index)) results.push(value); }); return results; }, sortBy: function(iterator) { return this.collect(function(value, index) { return {value: value, criteria: iterator(value, index)}; }).sort(function(left, right) { var a = left.criteria, b = right.criteria; return a < b ? -1 : a > b ? 1 : 0; }).pluck('value'); }, toArray: function() { return this.collect(Prototype.K); }, zip: function() { var iterator = Prototype.K, args = $A(arguments); if (typeof args.last() == 'function') iterator = args.pop(); var collections = [this].concat(args).map($A); return this.map(function(value, index) { return iterator(collections.pluck(index)); }); }, inspect: function() { return '#'; } } Object.extend(Enumerable, { map: Enumerable.collect, find: Enumerable.detect, select: Enumerable.findAll, member: Enumerable.include, entries: Enumerable.toArray }); var $A = Array.from = function(iterable) { if (!iterable) return []; if (iterable.toArray) { return iterable.toArray(); } else { var results = []; for (var i = 0; i < iterable.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; i < this.length; i++) iterator(this[i]); }, clear: function() { this.length = 0; return this; }, first: function() { return this[0]; }, last: function() { return this[this.length - 1]; }, compact: function() { return this.select(function(value) { return value != undefined || value != null; }); }, flatten: function() { return this.inject([], function(array, value) { return array.concat(value && value.constructor == Array ? value.flatten() : [value]); }); }, without: function() { var values = $A(arguments); return this.select(function(value) { return !values.include(value); }); }, indexOf: function(object) { for (var i = 0; i < this.length; i++) if (this[i] == object) return i; return -1; }, reverse: function(inline) { return (inline !== false ? this : this.toArray())._reverse(); }, inspect: function() { return '[' + this.map(Object.inspect).join(', ') + ']'; } }); var Hash = { _each: function(iterator) { for (var key in this) { var value = this[key]; if (typeof value == 'function') continue; var pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }, keys: function() { return this.pluck('key'); }, values: function() { return this.pluck('value'); }, merge: function(hash) { return $H(hash).inject($H(this), function(mergedHash, pair) { mergedHash[pair.key] = pair.value; return mergedHash; }); }, toQueryString: function() { return this.map(function(pair) { return pair.map(encodeURIComponent).join('='); }).join('&'); }, inspect: function() { return '#'; } } function $H(object) { var hash = Object.extend({}, object || {}); Object.extend(hash, Enumerable); Object.extend(hash, Hash); return hash; } ObjectRange = Class.create(); Object.extend(ObjectRange.prototype, Enumerable); Object.extend(ObjectRange.prototype, { initialize: function(start, end, exclusive) { this.start = start; this.end = end; this.exclusive = exclusive; }, _each: function(iterator) { var value = this.start; do { iterator(value); value = value.succ(); } while (this.include(value)); }, 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(responderToAdd) { if (!this.include(responderToAdd)) this.responders.push(responderToAdd); }, unregister: function(responderToRemove) { this.responders = this.responders.without(responderToRemove); }, dispatch: function(callback, request, transport, json) { this.each(function(responder) { if (responder[callback] && 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', parameters: '' } Object.extend(this.options, options || {}); }, responseIsSuccess: function() { return this.transport.status == undefined || this.transport.status == 0 || (this.transport.status >= 200 && this.transport.status < 300); }, responseIsFailure: function() { return !this.responseIsSuccess(); } } Ajax.Request = Class.create(); Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; Ajax.Request.prototype = Object.extend(new Ajax.Base(), { initialize: function(url, options) { this.transport = Ajax.getTransport(); this.setOptions(options); this.request(url); }, request: function(url) { var parameters = this.options.parameters || ''; if (parameters.length > 0) parameters += '&_='; try { this.url = url; if (this.options.method == 'get' && parameters.length > 0) this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; Ajax.Responders.dispatch('onCreate', this, this.transport); this.transport.open(this.options.method, this.url, this.options.asynchronous); if (this.options.asynchronous) { this.transport.onreadystatechange = this.onStateChange.bind(this); setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); } this.setRequestHeaders(); var body = this.options.postBody ? this.options.postBody : parameters; this.transport.send(this.options.method == 'post' ? body : null); } catch (e) { this.dispatchException(e); } }, setRequestHeaders: function() { var requestHeaders = ['X-Requested-With', 'XMLHttpRequest', 'X-Prototype-Version', Prototype.Version, 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*']; if (this.options.method == 'post') { requestHeaders.push('Content-type', this.options.contentType); /* Force "Connection: close" for Mozilla browsers to work around * a bug where XMLHttpReqeuest sends an incorrect Content-length * header. See Mozilla Bugzilla #246651. */ if (this.transport.overrideMimeType) requestHeaders.push('Connection', 'close'); } if (this.options.requestHeaders) requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); for (var i = 0; i < requestHeaders.length; i += 2) this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); }, onStateChange: function() { var readyState = this.transport.readyState; if (readyState != 1) this.respondToReadyState(this.transport.readyState); }, header: function(name) { try { return this.transport.getResponseHeader(name); } catch (e) {} }, evalJSON: function() { try { return eval('(' + this.header('X-JSON') + ')'); } catch (e) {} }, evalResponse: function() { try { return eval(this.transport.responseText); } catch (e) { this.dispatchException(e); } }, respondToReadyState: function(readyState) { var event = Ajax.Request.Events[readyState]; var transport = this.transport, json = this.evalJSON(); if (event == 'Complete') { try { (this.options['on' + this.transport.status] || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] || Prototype.emptyFunction)(transport, json); } catch (e) { this.dispatchException(e); } if ((this.header('Content-type') || '').match(/^text\/javascript/i)) this.evalResponse(); } try { (this.options['on' + event] || Prototype.emptyFunction)(transport, json); Ajax.Responders.dispatch('on' + event, this, transport, json); } catch (e) { this.dispatchException(e); } /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ if (event == 'Complete') this.transport.onreadystatechange = Prototype.emptyFunction; }, 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.containers = { success: container.success ? $(container.success) : $(container), failure: 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, object) { this.updateContent(); onComplete(transport, object); }).bind(this); this.request(url); }, updateContent: function() { var receiver = this.responseIsSuccess() ? this.containers.success : this.containers.failure; var response = this.transport.responseText; if (!this.options.evalScripts) response = response.stripScripts(); if (receiver) { if (this.options.insertion) { new this.options.insertion(receiver, response); } else { Element.update(receiver, response); } } if (this.responseIsSuccess()) { 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.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 $() { var results = [], element; for (var i = 0; i < arguments.length; i++) { element = arguments[i]; if (typeof element == 'string') element = document.getElementById(element); results.push(Element.extend(element)); } return results.length < 2 ? results[0] : results; } document.getElementsByClassName = function(className, parentElement) { var children = ($(parentElement) || document.body).getElementsByTagName('*'); return $A(children).inject([], function(elements, child) { if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) elements.push(Element.extend(child)); return elements; }); } /*--------------------------------------------------------------------------*/ if (!window.Element) var Element = new Object(); Element.extend = function(element) { if (!element) return; if (_nativeExtensions) return element; if (!element._extended && element.tagName && element != window) { var methods = Element.Methods, cache = Element.extend.cache; for (property in methods) { var value = methods[property]; if (typeof value == 'function') element[property] = cache.findOrStore(value); } } element._extended = true; return element; } Element.extend.cache = { findOrStore: function(value) { return this[value] = this[value] || function() { return value.apply(null, [this].concat($A(arguments))); } } } Element.Methods = { visible: function(element) { return $(element).style.display != 'none'; }, toggle: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); Element[Element.visible(element) ? 'hide' : 'show'](element); } }, hide: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); element.style.display = 'none'; } }, show: function() { for (var i = 0; i < arguments.length; i++) { var element = $(arguments[i]); element.style.display = ''; } }, remove: function(element) { element = $(element); element.parentNode.removeChild(element); }, update: function(element, html) { $(element).innerHTML = html.stripScripts(); setTimeout(function() {html.evalScripts()}, 10); }, replace: function(element, html) { element = $(element); if (element.outerHTML) { element.outerHTML = html.stripScripts(); } else { var range = element.ownerDocument.createRange(); range.selectNodeContents(element); element.parentNode.replaceChild( range.createContextualFragment(html.stripScripts()), element); } setTimeout(function() {html.evalScripts()}, 10); }, getHeight: function(element) { element = $(element); return element.offsetHeight; }, classNames: function(element) { return new Element.ClassNames(element); }, hasClassName: function(element, className) { if (!(element = $(element))) return; return Element.classNames(element).include(className); }, addClassName: function(element, className) { if (!(element = $(element))) return; return Element.classNames(element).add(className); }, removeClassName: function(element, className) { if (!(element = $(element))) return; return Element.classNames(element).remove(className); }, // removes whitespace-only text node children cleanWhitespace: function(element) { element = $(element); for (var i = 0; i < element.childNodes.length; i++) { var node = element.childNodes[i]; if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) Element.remove(node); } }, empty: function(element) { return $(element).innerHTML.match(/^\s*$/); }, childOf: function(element, ancestor) { element = $(element), ancestor = $(ancestor); while (element = element.parentNode) if (element == ancestor) return true; return false; }, scrollTo: function(element) { element = $(element); var x = element.x ? element.x : element.offsetLeft, y = element.y ? element.y : element.offsetTop; window.scrollTo(x, y); }, getStyle: function(element, style) { element = $(element); var value = element.style[style.camelize()]; if (!value) { if (document.defaultView && document.defaultView.getComputedStyle) { var css = document.defaultView.getComputedStyle(element, null); value = css ? css.getPropertyValue(style) : null; } else if (element.currentStyle) { value = element.currentStyle[style.camelize()]; } } if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) if (Element.getStyle(element, 'position') == 'static') value = 'auto'; return value == 'auto' ? null : value; }, setStyle: function(element, style) { element = $(element); for (var name in style) element.style[name.camelize()] = style[name]; }, getDimensions: function(element) { element = $(element); if (Element.getStyle(element, 'display') != 'none') return {width: element.offsetWidth, height: element.offsetHeight}; // All *Width and *Height properties give 0 on elements with display none, // so enable the element temporarily var els = element.style; var originalVisibility = els.visibility; var originalPosition = els.position; els.visibility = 'hidden'; els.position = 'absolute'; els.display = ''; var originalWidth = element.clientWidth; var originalHeight = element.clientHeight; els.display = 'none'; els.position = originalPosition; els.visibility = originalVisibility; return {width: originalWidth, height: originalHeight}; }, makePositioned: function(element) { element = $(element); var pos = Element.getStyle(element, 'position'); if (pos == 'static' || !pos) { element._madePositioned = true; element.style.position = 'relative'; // Opera returns the offset relative to the positioning context, when an // element is position relative but top and left have not been defined if (window.opera) { element.style.top = 0; element.style.left = 0; } } }, 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 = ''; } }, makeClipping: function(element) { element = $(element); if (element._overflow) return; element._overflow = element.style.overflow; if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') element.style.overflow = 'hidden'; }, undoClipping: function(element) { element = $(element); if (element._overflow) return; element.style.overflow = element._overflow; element._overflow = undefined; } } Object.extend(Element, Element.Methods); var _nativeExtensions = false; if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) { var HTMLElement = {} HTMLElement.prototype = document.createElement('div').__proto__; } Element.addMethods = function(methods) { Object.extend(Element.Methods, methods || {}); if(typeof HTMLElement != 'undefined') { var methods = Element.Methods, cache = Element.extend.cache; for (property in methods) { var value = methods[property]; if (typeof value == 'function') HTMLElement.prototype[property] = cache.findOrStore(value); } _nativeExtensions = true; } } Element.addMethods(); var Toggle = new Object(); Toggle.display = Element.toggle; /*--------------------------------------------------------------------------*/ Abstract.Insertion = function(adjacency) { this.adjacency = adjacency; } Abstract.Insertion.prototype = { initialize: function(element, content) { this.element = $(element); this.content = content.stripScripts(); if (this.adjacency && this.element.insertAdjacentHTML) { try { this.element.insertAdjacentHTML(this.adjacency, this.content); } catch (e) { var tagName = this.element.tagName.toLowerCase(); if (tagName == 'tbody' || tagName == 'tr') { this.insertContent(this.contentFromAnonymousTable()); } else { throw e; } } } else { this.range = this.element.ownerDocument.createRange(); if (this.initializeRange) this.initializeRange(); this.insertContent([this.range.createContextualFragment(this.content)]); } setTimeout(function() {content.evalScripts()}, 10); }, contentFromAnonymousTable: function() { var div = document.createElement('div'); div.innerHTML = '' + this.content + '
'; return $A(div.childNodes[0].childNodes[0].childNodes); } } var Insertion = new Object(); Insertion.Before = Class.create(); Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { initializeRange: function() { this.range.setStartBefore(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element); }).bind(this)); } }); Insertion.Top = Class.create(); Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(true); }, insertContent: function(fragments) { fragments.reverse(false).each((function(fragment) { this.element.insertBefore(fragment, this.element.firstChild); }).bind(this)); } }); Insertion.Bottom = Class.create(); Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { initializeRange: function() { this.range.selectNodeContents(this.element); this.range.collapse(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.appendChild(fragment); }).bind(this)); } }); Insertion.After = Class.create(); Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { initializeRange: function() { this.range.setStartAfter(this.element); }, insertContent: function(fragments) { fragments.each((function(fragment) { this.element.parentNode.insertBefore(fragment, this.element.nextSibling); }).bind(this)); } }); /*--------------------------------------------------------------------------*/ Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(element) { this.element = $(element); }, _each: function(iterator) { this.element.className.split(/\s+/).select(function(name) { return name.length > 0; })._each(iterator); }, set: function(className) { this.element.className = className; }, add: function(classNameToAdd) { if (this.include(classNameToAdd)) return; this.set(this.toArray().concat(classNameToAdd).join(' ')); }, remove: function(classNameToRemove) { if (!this.include(classNameToRemove)) return; this.set(this.select(function(className) { return className != classNameToRemove; }).join(' ')); }, toString: function() { return this.toArray().join(' '); } } Object.extend(Element.ClassNames.prototype, Enumerable); var Selector = Class.create(); Selector.prototype = { initialize: function(expression) { this.params = {classNames: []}; this.expression = expression.toString().strip(); this.parseExpression(); this.compileMatcher(); }, parseExpression: function() { function abort(message) { throw 'Parse error in selector: ' + message; } if (this.expression == '') abort('empty expression'); var params = this.params, expr = this.expression, match, modifier, clause, rest; while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) { params.attributes = params.attributes || []; params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''}); expr = match[1]; } if (expr == '*') return this.params.wildcard = true; while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) { modifier = match[1], clause = match[2], rest = match[3]; switch (modifier) { case '#': params.id = clause; break; case '.': params.classNames.push(clause); break; case '': case undefined: params.tagName = clause.toUpperCase(); break; default: abort(expr.inspect()); } expr = rest; } if (expr.length > 0) abort(expr.inspect()); }, buildMatchExpression: function() { var params = this.params, conditions = [], clause; if (params.wildcard) conditions.push('true'); if (clause = params.id) conditions.push('element.id == ' + clause.inspect()); if (clause = params.tagName) conditions.push('element.tagName.toUpperCase() == ' + clause.inspect()); if ((clause = params.classNames).length > 0) for (var i = 0; i < clause.length; i++) conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')'); if (clause = params.attributes) { clause.each(function(attribute) { var value = 'element.getAttribute(' + attribute.name.inspect() + ')'; var splitValueBy = function(delimiter) { return value + ' && ' + value + '.split(' + delimiter.inspect() + ')'; } switch (attribute.operator) { case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break; case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break; case '|=': conditions.push( splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect() ); break; case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break; case '': case undefined: conditions.push(value + ' != null'); break; default: throw 'Unknown operator ' + attribute.operator + ' in selector'; } }); } return conditions.join(' && '); }, compileMatcher: function() { this.match = new Function('element', 'if (!element.tagName) return false; \ return ' + this.buildMatchExpression()); }, findElements: function(scope) { var element; if (element = $(this.params.id)) if (this.match(element)) if (!scope || Element.childOf(element, scope)) return [element]; scope = (scope || document).getElementsByTagName(this.params.tagName || '*'); var results = []; for (var i = 0; i < scope.length; i++) if (this.match(element = scope[i])) results.push(Element.extend(element)); return results; }, toString: function() { return this.expression; } } function $$() { return $A(arguments).map(function(expression) { return expression.strip().split(/\s+/).inject([null], function(results, expr) { var selector = new Selector(expr); return results.map(selector.findElements.bind(selector)).flatten(); }); }).flatten(); } var Field = { clear: function() { for (var i = 0; i < arguments.length; i++) $(arguments[i]).value = ''; }, focus: function(element) { $(element).focus(); }, present: function() { for (var i = 0; i < arguments.length; i++) if ($(arguments[i]).value == '') return false; return true; }, select: function(element) { $(element).select(); }, activate: function(element) { element = $(element); element.focus(); if (element.select) element.select(); } } /*--------------------------------------------------------------------------*/ var Form = { serialize: function(form) { var elements = Form.getElements($(form)); var queryComponents = new Array(); for (var i = 0; i < elements.length; i++) { var queryComponent = Form.Element.serialize(elements[i]); if (queryComponent) queryComponents.push(queryComponent); } return queryComponents.join('&'); }, getElements: function(form) { form = $(form); var elements = new Array(); for (var tagName in Form.Element.Serializers) { var tagElements = form.getElementsByTagName(tagName); for (var j = 0; j < tagElements.length; j++) elements.push(tagElements[j]); } return elements; }, getInputs: function(form, typeName, name) { form = $(form); var inputs = form.getElementsByTagName('input'); if (!typeName && !name) return inputs; var matchingInputs = new Array(); for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; if ((typeName && input.type != typeName) || (name && input.name != name)) continue; matchingInputs.push(input); } return matchingInputs; }, disable: function(form) { var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.blur(); element.disabled = 'true'; } }, enable: function(form) { var elements = Form.getElements(form); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.disabled = ''; } }, findFirstElement: function(form) { return Form.getElements(form).find(function(element) { return element.type != 'hidden' && !element.disabled && ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); }); }, focusFirstElement: function(form) { Field.activate(Form.findFirstElement(form)); }, reset: function(form) { $(form).reset(); } } Form.Element = { serialize: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) { var key = encodeURIComponent(parameter[0]); if (key.length == 0) return; if (parameter[1].constructor != Array) parameter[1] = [parameter[1]]; return parameter[1].map(function(value) { return key + '=' + encodeURIComponent(value); }).join('&'); } }, getValue: function(element) { element = $(element); var method = element.tagName.toLowerCase(); var parameter = Form.Element.Serializers[method](element); if (parameter) return parameter[1]; } } Form.Element.Serializers = { input: function(element) { switch (element.type.toLowerCase()) { case 'submit': case 'hidden': case 'password': case 'text': return Form.Element.Serializers.textarea(element); case 'checkbox': case 'radio': return Form.Element.Serializers.inputSelector(element); } return false; }, inputSelector: function(element) { if (element.checked) return [element.name, element.value]; }, textarea: function(element) { return [element.name, element.value]; }, select: function(element) { return Form.Element.Serializers[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element); }, selectOne: function(element) { var value = '', opt, index = element.selectedIndex; if (index >= 0) { opt = element.options[index]; value = opt.value || opt.text; } return [element.name, value]; }, selectMany: function(element) { var value = []; for (var i = 0; i < element.length; i++) { var opt = element.options[i]; if (opt.selected) value.push(opt.value || opt.text); } return [element.name, value]; } } /*--------------------------------------------------------------------------*/ var $F = Form.Element.getValue; /*--------------------------------------------------------------------------*/ Abstract.TimedObserver = function() {} Abstract.TimedObserver.prototype = { initialize: function(element, frequency, callback) { this.frequency = frequency; this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); this.registerCallback(); }, registerCallback: function() { setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); }, onTimerEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } } } Form.Element.Observer = Class.create(); Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.Element.getValue(this.element); } }); Form.Observer = Class.create(); Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { getValue: function() { return Form.serialize(this.element); } }); /*--------------------------------------------------------------------------*/ Abstract.EventObserver = function() {} Abstract.EventObserver.prototype = { initialize: function(element, callback) { this.element = $(element); this.callback = callback; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == 'form') this.registerFormCallbacks(); else this.registerCallback(this.element); }, onElementEvent: function() { var value = this.getValue(); if (this.lastValue != value) { this.callback(this.element, value); this.lastValue = value; } }, registerFormCallbacks: function() { var elements = Form.getElements(this.element); for (var i = 0; i < elements.length; i++) this.registerCallback(elements[i]); }, registerCallback: function(element) { if (element.type) { switch (element.type.toLowerCase()) { case 'checkbox': case 'radio': Event.observe(element, 'click', this.onElementEvent.bind(this)); break; case 'password': case 'text': case 'textarea': case 'select-one': case 'select-multiple': 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, 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; i < Event.observers.length; i++) { Event.stopObserving.apply(this, Event.observers[i]); Event.observers[i][0] = null; } Event.observers = false; }, observe: function(element, name, observer, useCapture) { var element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)) name = 'keydown'; this._observeAndCache(element, name, observer, useCapture); }, stopObserving: function(element, name, observer, useCapture) { var element = $(element); useCapture = useCapture || false; if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent)) name = 'keydown'; if (element.removeEventListener) { element.removeEventListener(name, observer, useCapture); } else if (element.detachEvent) { element.detachEvent('on' + name, observer); } } }); /* prevent memory leaks in IE */ if (navigator.appVersion.match(/\bMSIE\b/)) Event.observe(window, 'unload', Event.unloadCache, false); var Position = { // set to true if needed, warning: firefox performance problems // NOT neeeded for page scrolling, only if draggable contained in // scrollable elements includeScrollOffsets: false, // must be called before calling withinIncludingScrolloffset, every time the // page is scrolled prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; }, realOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.scrollTop || 0; valueL += element.scrollLeft || 0; element = element.parentNode; } while (element); return [valueL, valueT]; }, cumulativeOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; } while (element); return [valueL, valueT]; }, positionedOffset: function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; element = element.offsetParent; if (element) { 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; }, clone: function(source, target) { source = $(source); target = $(target); target.style.position = 'absolute'; var offsets = this.cumulativeOffset(source); target.style.top = offsets[1] + 'px'; target.style.left = offsets[0] + 'px'; target.style.width = source.offsetWidth + 'px'; target.style.height = source.offsetHeight + 'px'; }, 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 { valueT -= element.scrollTop || 0; valueL -= element.scrollLeft || 0; } while (element = element.parentNode); return [valueL, valueT]; }, clone: function(source, target) { var options = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || {}) // find page position of source source = $(source); var p = Position.page(source); // find coordinate system to use target = $(target); var delta = [0, 0]; var parent = null; // delta [0,0] will do fine with position: fixed elements, // position:absolute needs offsetParent deltas if (Element.getStyle(target,'position') == 'absolute') { parent = Position.offsetParent(target); delta = Position.page(parent); } // correct by body offsets (fixes Safari) if (parent == document.body) { delta[0] -= document.body.offsetLeft; delta[1] -= document.body.offsetTop; } // set position if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; if(options.setWidth) target.style.width = source.offsetWidth + 'px'; if(options.setHeight) target.style.height = source.offsetHeight + 'px'; }, absolutize: function(element) { element = $(element); if (element.style.position == 'absolute') return; Position.prepare(); var offsets = Position.positionedOffset(element); var top = offsets[1]; var left = offsets[0]; var width = element.clientWidth; var height = element.clientHeight; element._originalLeft = left - parseFloat(element.style.left || 0); element._originalTop = top - parseFloat(element.style.top || 0); element._originalWidth = element.style.width; element._originalHeight = element.style.height; element.style.position = 'absolute'; element.style.top = top + 'px';; element.style.left = left + 'px';; element.style.width = width + 'px';; element.style.height = height + 'px';; }, relativize: function(element) { element = $(element); if (element.style.position == 'relative') return; Position.prepare(); element.style.position = 'relative'; var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); element.style.top = top + 'px'; element.style.left = left + 'px'; element.style.height = element._originalHeight; element.style.width = element._originalWidth; } } // Safari returns margins on body which is incorrect if the child is absolutely // positioned. For performance reasons, redefine Position.cumulativeOffset for // KHTML/WebKit only. if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { Position.cumulativeOffset = function(element) { var valueT = 0, valueL = 0; do { valueT += element.offsetTop || 0; valueL += element.offsetLeft || 0; if (element.offsetParent == document.body) if (Element.getStyle(element, 'position') == 'absolute') break; element = element.offsetParent; } while (element); return [valueL, valueT]; } }_@http://images.theglobeandmail.com/v5/scripts/sc/lib/prototype.js ()*Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 16 Aug 2006 14:38:32 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTT2247_Tue, 03 Oct 2006 15:19:13 GMT_"29e567-8c7-7b394a00"R4912jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357~  !#%')+-/13:HVafu} 8;@DZglotO// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var Scriptaculous = { Version: '1.6.2', require: function(libraryName) { // inserting via DOM fails in Safari 2.0, so brute force approach document.write(''); }, load: function() { if((typeof Prototype=='undefined') || (typeof Element == 'undefined') || (typeof Element.Methods=='undefined') || parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.5) throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); $A(document.getElementsByTagName("script")).findAll( function(s) { return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) }).each( function(s) { var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); var includes = s.src.match(/\?.*load=([a-z,]*)/); (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( function(include) { Scriptaculous.require(path+include+'.js') }); }); } } Scriptaculous.load();_Dhttp://images.theglobeandmail.com/v5/scripts/sc/src/scriptaculous.js ,-.Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078http://images.theglobeandmail.com/v5/scripts/sc/src/builder.js1234X$classesZ$classname456UNSURLV%NSURLXNSObject_application/x-javascript9:;=>?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 16 Aug 2006 14:38:33 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTT3361_Tue, 03 Oct 2006 15:20:22 GMT_"231e8e-d21-7b488c40"R4112jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357x}  !#%')+-4BP[`ow|25:>TafitO !// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // // See scriptaculous.js for full license. var Builder = { NODEMAP: { AREA: 'map', CAPTION: 'table', COL: 'table', COLGROUP: 'table', LEGEND: 'fieldset', OPTGROUP: 'select', OPTION: 'select', PARAM: 'object', TBODY: 'table', TD: 'table', TFOOT: 'table', TH: 'table', THEAD: 'table', TR: 'table' }, // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken, // due to a Firefox bug node: function(elementName) { elementName = elementName.toUpperCase(); // try innerHTML approach var parentTag = this.NODEMAP[elementName] || 'div'; var parentElement = document.createElement(parentTag); try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" + elementName + ">"; } catch(e) {} var element = parentElement.firstChild || null; // see if browser added wrapping tags if(element && (element.tagName != elementName)) element = element.getElementsByTagName(elementName)[0]; // fallback to createElement approach if(!element) element = document.createElement(elementName); // abort if nothing could be created if(!element) return; // attributes (or text) if(arguments[1]) if(this._isStringOrNumber(arguments[1]) || (arguments[1] instanceof Array)) { this._children(element, arguments[1]); } else { var attrs = this._attributes(arguments[1]); if(attrs.length) { try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 parentElement.innerHTML = "<" +elementName + " " + attrs + ">"; } catch(e) {} element = parentElement.firstChild || null; // workaround firefox 1.0.X bug if(!element) { element = document.createElement(elementName); for(attr in arguments[1]) element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; } if(element.tagName != elementName) element = parentElement.getElementsByTagName(elementName)[0]; } } // text, or array of children if(arguments[2]) this._children(element, arguments[2]); return element; }, _text: function(text) { return document.createTextNode(text); }, _attributes: function(attributes) { var attrs = []; for(attribute in attributes) attrs.push((attribute=='className' ? 'class' : attribute) + '="' + attributes[attribute].toString().escapeHTML() + '"'); return attrs.join(" "); }, _children: function(element, children) { if(typeof children=='object') { // array can hold nodes and text children.flatten().each( function(e) { if(typeof e=='object') element.appendChild(e) else if(Builder._isStringOrNumber(e)) element.appendChild(Builder._text(e)); }); } else if(Builder._isStringOrNumber(children)) element.appendChild(Builder._text(children)); }, _isStringOrNumber: function(param) { return(typeof param=='string' || typeof param=='number'); } }_>http://images.theglobeandmail.com/v5/scripts/sc/src/builder.js 012Obplist00 Y$archiverX$versionT$topX$objects_NSKeyedArchiver _WebResourceResponse )/078http://images.theglobeandmail.com/v5/scripts/sc/src/effects.js1234X$classesZ$classname456UNSURLV%NSURLXNSObject_application/x-javascript9:;=>?JUZNS.objectsWNS.keys@ABCDEFGHIKLMNOPQRST VServer]Last-Modified]Accept-RangesZConnectionTDate^Content-LengthWExpiresTEtag\Content-TypeSAge_Apache/2.2.0 (Unix) DAV/2_Wed, 16 Aug 2006 14:38:33 GMTUbytesUclose_Mon, 02 Oct 2006 15:20:56 GMTU33092_Tue, 03 Oct 2006 15:20:22 GMT_"2995b6-8144-7b488c40"R1112jkkl6_NSMutableDictionary\NSDictionary12noo6_NSHTTPURLResponseInternal12qrrs6_NSHTTPURLResponse]NSURLResponse$)2DILbd  %1357x}  !#%')+-4BP[`ow|47<@VchktOD// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) // Contributors: // Justin Palmer (http://encytemedia.com/) // Mark Pilgrim (http://diveintomark.org/) // Martin Bialasinki // // See scriptaculous.js for full license. // converts rgb() and #xxx to #xxxxxx format, // returns self (or first argument) if not convertable String.prototype.parseColor = function() { var color = '#'; if(this.slice(0,4) == 'rgb(') { var cols = this.slice(4,this.length-1).split(','); var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); } else { if(this.slice(0,1) == '#') { if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); if(this.length==7) color = this.toLowerCase(); } } return(color.length==7 ? color : (arguments[0] || this)); } /*--------------------------------------------------------------------------*/ Element.collectTextNodes = function(element) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); }).flatten().join(''); } Element.collectTextNodesIgnoreClass = function(element, className) { return $A($(element).childNodes).collect( function(node) { return (node.nodeType==3 ? node.nodeValue : ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? Element.collectTextNodesIgnoreClass(node, className) : '')); }).flatten().join(''); } Element.setContentZoom = function(element, percent) { element = $(element); Element.setStyle(element, {fontSize: (percent/100) + 'em'}); if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); } Element.getOpacity = function(element){ var opacity; if (opacity = Element.getStyle(element, 'opacity')) return parseFloat(opacity); if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) if(opacity[1]) return parseFloat(opacity[1]) / 100; return 1.0; } Element.setOpacity = function(element, value){ element= $(element); if (value == 1){ Element.setStyle(element, { opacity: (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?