From: "Saved by Windows Internet Explorer 7"
Subject: Print Story: Few remain as 1962 Pa. coal town fire still burns - Yahoo! News
Date: Fri, 5 Feb 2010 12:50:12 -0500
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01CAA661.C174B450"
X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6002.18005

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://news.yahoo.com/s/ap/20100205/ap_on_re_us/us_centralia_s_final_days/print

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML lang=3Den-US><HEAD><TITLE>Print Story: Few remain as 1962 Pa. coal =
town fire still burns - Yahoo! News</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">
<META=20
content=3D"Standing before the wreckage of his bulldozed home, John =
Lokitis Jr. felt sick to his stomach, certain that a terrible mistake =
had been made."=20
name=3Ddescription>
<META content=3D"Fire Underground,U.S. National,AP" =
name=3Dkeywords><LINK=20
href=3D"http://l.yimg.com/b/news/combo/D7H8FL9F?common/assets/css/1.0.6/g=
eneric/print.css"=20
type=3Dtext/css rel=3Dstylesheet></LINK>
<STYLE type=3Dtext/css media=3Dprint>.darla_ad {
	DISPLAY: none
}
</STYLE>

<META content=3D"MSHTML 6.00.6002.18167" name=3DGENERATOR></HEAD>
<BODY>
<DIV id=3Ddoc>
<DIV class=3Dhd>
<DIV class=3Dnav>
<UL>
  <LI><A class=3Dprint onclick=3D"window.print(); return false;"=20
  =
href=3D"http://news.yahoo.com/s/ap/20100205/ap_on_re_us/us_centralia_s_fi=
nal_days/print;_ylt=3DAgcH6yTMWEV15yld73Vk9i9H2ocA;_ylu=3DX3oDMTFhcGtkMm1=
tBHBvcwMxBHNlYwN5bl9zdG9yeV9wcmludF9jb250ZW50BHNsawNwcmludA--">Print</A> =

  </LI>
  <LI><A class=3Daction=20
  =
href=3D"http://news.yahoo.com/s/ap/20100205/ap_on_re_us/us_centralia_s_fi=
nal_days;_ylt=3DAqA2DU6ZekjPo0HX.J5qt5xH2ocA;_ylu=3DX3oDMTE2bWZsdGExBHBvc=
wMyBHNlYwN5bl9wcmludHBhZ2UEc2xrA2JhY2t0b3N0b3J5">Back=20
  to story</A> </LI></UL></DIV><A class=3Dlogo=20
href=3D"http://news.yahoo.com/;_ylt=3DAmSkL5e1SogRbQr2mRWPCBxH2ocA;_ylu=3D=
X3oDMTEzaHZham9hBHBvcwMzBHNlYwN5bi1wcnZkbGluawRzbGsDeWFob29uZXdz"><IMG=20
alt=3D"Yahoo! News" =
src=3D"http://l.yimg.com/a/i/brand/purplelogo/uh/us/news.gif">=20
</A></DIV>
<DIV class=3Dbd><IMG class=3Dprovider alt=3D""=20
src=3D"http://l.yimg.com/a/i/us/nws/p/ap_logo_106.png">=20
<H1>Few remain as 1962 Pa. coal town fire still burns</H1>
<DIV class=3Dbyline><CITE class=3Dvcard>By MICHAEL RUBINKAM, Associated =
Press Writer=20
<SPAN class=3D"fn org">Michael Rubinkam, Associated Press Writer</SPAN>=20
</CITE><ABBR class=3Drecenttimedate=20
title=3D2010-02-05T07:40:15-0800>2&nbsp;hrs&nbsp;8&nbsp;mins&nbsp;ago</AB=
BR>=20
</DIV><!-- end .byline -->
<DIV class=3D"mod ad darla_ad" id=3Ddarla-ad__LREC></DIV>
<P>CENTRALIA, Pa. =E2=80=93 Standing before the wreckage of his =
bulldozed home, John=20
Lokitis Jr. felt sick to his stomach, certain that a terrible mistake =
had been=20
made.</P>
<P>He'd fought for years to stay in the house. It was one of the few =
left=20
standing in the moonscape of Centralia, a once-proud coal town whose =
population=20
fled an underground mine fire that began in 1962 and continues to =
burn.</P>
<P>But the state had ordered Lokitis to vacate, leaving the =
fourth-generation=20
Centralian little choice but to say goodbye =E2=80=94 to the house, and =
to what's left=20
of the town he loved.</P>
<P>"I never had any desire to move," said Lokitis, 39. "It was my =
home."</P>
<P>After years of delay, state officials are now trying to complete the=20
demolition of Centralia, a borough in the mountains of northeastern =
Pennsylvania=20
that all but ceased to exist in the 1980s after the mine fire spread =
beneath=20
homes and businesses, threatening residents with poisonous gases and =
dangerous=20
sinkholes.</P>
<P>More than 1,000 people moved out, and 500 structures were razed under =
a $42=20
million federal relocation program.</P>
<P>But dozens of holdouts, Lokitis included, refused to go =E2=80=94 =
even after their=20
houses were seized through eminent domain in the early 1990s. They said =
the fire=20
posed little danger to their part of town, accused government officials =
and=20
mining companies of a plot to grab the mineral rights and vowed to stay =
put.=20
State and local officials had little stomach to oust the diehards, who =
squatted=20
tax- and rent-free in houses they no longer owned.</P>
<P>Steve Fishman, attorney for the state Department of Community and =
Economic=20
Development, said "benign neglect" on the part of state and local =
officials=20
allowed the residents to stay for so long.</P>
<P>No more.</P>
<P>Fishman told The Associated Press that the state is moving as quickly =
as=20
possible to take possession of the remaining homes and get them knocked=20
down.</P>
<P>"Everyone agreed that we needed to move this along," he said.</P>
<P>In 2006, there were 16 properties left standing. A year ago, the town =
was=20
down to 11. Now there are five houses occupied with fewer than a dozen=20
holdouts.</P>
<P>Centralia appears to be entering its final days.</P>
<P>The remaining holdouts, weary after decades of media scrutiny, rarely =
give=20
interviews. But the town's 86-year-old mayor, Carl Womer, said he doubts =
he'll=20
have to go. Indeed, Lokitis and others believe that elderly residents =
will be=20
allowed to live out their final years in <SPAN class=3Dyshortcuts=20
id=3Dlw_1265391933_0>Centralia</SPAN> =E2=80=94 even after a <SPAN =
class=3Dyshortcuts=20
id=3Dlw_1265391933_1>Columbia County judge</SPAN> decides next month how =
much they=20
should be paid for their homes.</P>
<P>"Nothing's happened. We're still here," said Womer, whose wife, =
Helen, who=20
died in 2001, was an implacable foe of relocation. "No one's told us to=20
move."</P>
<P>Like Womer, resident John Lokitis Sr., 68, father of Lokitis Jr., was =
polite=20
but short. "Why worry about it? When it comes, it comes. I don't give a =
rat's=20
ass," he said, shutting the door.</P>
<P>Those who remain in Centralia like to keep up appearances. In =
mid-January,=20
Christmas decorations still adorned the street lamps, a large manger =
scene=20
occupied a corner of the main intersection and a 2010 calendar hung in =
the empty=20
borough building. But the holdouts are fighting a losing battle. The =
building's=20
wooden facade is in dire need of a paint job; in the Odd Fellows =
Cemetery,=20
vandals recently knocked over dozens of tombstones. Nature has reclaimed =
parts=20
of the town.</P>
<P>In reality, Centralia is already a memory =E2=80=94 an intact street =
grid with hardly=20
anything on it. All the familiar places that define a town =E2=80=94 =
churches,=20
businesses, schools, homes =E2=80=94 are long gone.=20
<P>A hand-lettered sign tacked to a tree near Womer's home directs =
tourists to a=20
rocky outcropping off the main street where opaque clouds of steam rise =
from the=20
ground.=20
<P>"It was a real community, and people loved the place," said author =
and=20
journalist Dave DeKok, who has been writing about Centralia for 30 years =
and=20
recently published "<SPAN class=3Dyshortcuts id=3Dlw_1265391933_2>Fire=20
Underground</SPAN>," an updated version of his 1986 book on the town. =
"People=20
lived their entire lives in that town and would have been quite happy to =
get rid=20
of the mine fire and keep on living there."=20
<P>With swifter action, DeKok said, that might have been <SPAN =
class=3Dyshortcuts=20
id=3Dlw_1265391933_3>Centralia</SPAN>'s destiny.=20
<P>The fire began at the town dump and ignited an exposed coal vein. It =
could=20
have been extinguished for thousands of dollars then, but a series of=20
bureaucratic half-measures and a lack of funding allowed the fire to =
grow into a=20
voracious monster =E2=80=94 feeding on millions of tons of slow-burning =
<SPAN=20
class=3Dyshortcuts id=3Dlw_1265391933_4>anthracite coal</SPAN> in the =
abandoned=20
network of mines beneath the town.=20
<P>At first, most Centralians ignored the fire. Some denied its =
existence,=20
choosing to disregard the threat.=20
<P>That changed in the 1970s, when carbon monoxide began entering homes =
and=20
sickening people. The beginning of the end came in 1981, when a cave-in =
sucked a=20
12-year-old boy into a hot, gaseous void, nearly killing him. The town =
divided=20
into two warring camps, one in favor of relocation and one opposed.=20
<P>Finally, in 1983, the federal government appropriated $42 million to =
acquire=20
and demolish every building in Centralia. Nearly everyone participated =
in the=20
voluntary buyouts; by 1990, Census figures showed only 63 people =
remaining.=20
<P>Two years later, Gov. Robert Casey decided to shut the town, saying =
the fire=20
had become too dangerous. The holdouts fought condemnation, blocking =
appraisers=20
from entering their homes. The legal process eventually ground to a =
halt.=20
<P>Until recently, Lokitis Jr., who works a civilian job with the state =
police=20
in Harrisburg, had been one of Centralia's most vocal defenders =
=E2=80=94 star of a 2007=20
documentary on Centralia. He expressed hope that it could stage a =
comeback,=20
claiming the fire had gone out or moved away.=20
<P>State officials say the fire continues to burn uncontrolled and could =
for=20
hundreds of years, until it runs out of fuel. One of their biggest =
concerns is=20
the danger to tourists who often cluster around steam vents on unstable =
ground.=20
<P>While Lokitis felt he was in no danger, he had little recourse than =
to move=20
from his late grandfather's two-story row home on <SPAN =
class=3Dyshortcuts=20
id=3Dlw_1265391933_5>West Park Street</SPAN> when an order to vacate =
arrived, one=20
of two such notices sent last year.=20
<P>Now living a few miles away, he tacked a sign on the front porch of =
the old=20
homestead. "REQUIESCAT IN PACE" =E2=80=94 rest in peace, it said. "SORRY =
POP."=20
<P>He couldn't bear to watch the home get knocked down a few weeks =
before <SPAN=20
class=3Dyshortcuts id=3Dlw_1265391933_6>Christmas</SPAN>. But he =
couldn't stay away,=20
either, going back after the wrecking crew had finished its work.=20
<P>"It was part of my life for all 39 years, that house," he said. "It =
was=20
difficult to leave it and difficult to see it demolished."=20
<P>Difficult, too, to give up his dream of Centralia's rebirth.=20
<P>"I'd always hoped the town would come back and be rebuilt," Lokitis =
said,=20
"but I guess that's never going to happen."</P></DIV>
<DIV class=3Dft></DIV>
<DIV class=3D"mod ad ad_footer">
<DIV class=3Dbd><!-- Ad Keywords: home; house; It; government; tax; =
give; elderly; Columbia; it; network; police; fuel;-->
<DIV id=3Dcopyright><CITE>Copyright =C2=A9 2010 Yahoo! Inc. All rights =
reserved.</CITE>
<UL>
  <LI class=3Dfirst><A=20
  =
href=3D"http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879=
306.12123427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77=
yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860=
466/K=3Dd0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D0/SIG=3D1184ggc4j;_ylt=3DA=
mWbU4AKUq4cy.t1_zICq6BH2ocA;_ylu=3DX3oDMTExZWdkNmg4BHBvcwMxBHNlYwNmb290ZX=
IEc2xrA3F1ZXN0aW9uc29yYw--/*http://help.yahoo.com/l/us/yahoo/news/">Quest=
ions=20
  or Comments</A>
  <LI><A=20
  =
href=3D"http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879=
306.12123427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77=
yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860=
466/K=3Dd0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D1/SIG=3D11q1ej28f;_ylt=3DA=
qfvk1Nd7Fz42C6t1is1TbxH2ocA;_ylu=3DX3oDMTExa2s2dXRsBHBvcwMyBHNlYwNmb290ZX=
IEc2xrA3ByaXZhY3lwb2xpYw--/*http://info.yahoo.com/privacy/us/yahoo/news/d=
etails.html">Privacy=20
  Policy</A>
  <LI><A=20
  =
href=3D"http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879=
306.12123427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77=
yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860=
466/K=3Dd0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D2/SIG=3D11475d5s1;_ylt=3DA=
qkBug_A7vlB86F_RaIFp1dH2ocA;_ylu=3DX3oDMTEwODVuYzhrBHBvcwMzBHNlYwNmb290ZX=
IEc2xrA2Fib3V0b3VyYWRz/*http://info.yahoo.com/relevantads/">About=20
  Our Ads</A>
  <LI><A=20
  =
href=3D"http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879=
306.12123427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77=
yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860=
466/K=3Dd0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D3/SIG=3D1136qnvkg;_ylt=3DA=
le2gA6IE3S1RmjT8Ax9M6hH2ocA;_ylu=3DX3oDMTExbWNza2cxBHBvcwM0BHNlYwNmb290ZX=
IEc2xrA3Rlcm1zb2ZzZXJ2aQ--/*http://docs.yahoo.com/info/terms/">Terms=20
  of Service</A>
  <LI><A=20
  =
href=3D"http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879=
306.12123427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77=
yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860=
466/K=3Dd0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D4/SIG=3D11lp7krrc;_ylt=3DA=
pNgVigIrNIszUXeTh6yCdRH2ocA;_ylu=3DX3oDMTExaTZqczBqBHBvcwM1BHNlYwNmb290ZX=
IEc2xrA2NvcHlyaWdodGlwcA--/*http://docs.yahoo.com/info/copyright/copyrigh=
t.html">Copyright/IP=20
  Policy</A></LI></UL></DIV><!-- =
http://us.ard.yahoo.com/SIG=3D15ocu16gn/M=3D289534.13891068.13879306.1212=
3427/D=3Dnews/S=3D8903239:FOOT2/Y=3DYAHOO/EXP=3D1265399335/L=3D77yuXWKIRl=
grCHVFS2Z8Nw9eRhRVi0tsWgcADLq9/B=3DR1GkCUWTSTY-/J=3D1265392135860466/K=3D=
d0GXOUAM59PtV0Z.4kmdcA/A=3D5304694/R=3D5/* --><!-- SpaceID=3D8903239 =
loc=3DFR01 noad --><IMG=20
height=3D1 =
src=3D"http://ads.bluelithium.com/pixel?id=3D298793&amp;t=3D2" =
width=3D1>
<SCRIPT language=3Djavascript>=0A=
if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object();=0A=
window.yzq_d['c1GkCUWTSTY-']=3D'&U=3D13fhpk1jv%2fN%3dc1GkCUWTSTY-%2fC%3d6=
24324.13238302.13375956.12549985%2fD%3dSIP%2fB%3d5600123%2fV%3d1';=0A=
</SCRIPT>
<NOSCRIPT><IMG height=3D1 alt=3D""=20
src=3D"http://us.bc.yahoo.com/b?P=3D77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcAD=
Lq9&amp;T=3D18nobbfi2%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2=
fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d572969557%2fH%3dY2FjaGVoaW50PSJuZXdzIi=
Bjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJ=
seTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3d=
1%2fJ%3dF7740D4C&amp;U=3D13fhpk1jv%2fN%3dc1GkCUWTSTY-%2fC%3d624324.132383=
02.13375956.12549985%2fD%3dSIP%2fB%3d5600123%2fV%3d1"=20
width=3D1></NOSCRIPT>
<SCRIPT language=3Djavascript>=0A=
if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object();=0A=
window.yzq_d['R1GkCUWTSTY-']=3D'&U=3D13h3ol3u4%2fN%3dR1GkCUWTSTY-%2fC%3d2=
89534.13891068.13879306.12123427%2fD%3dFOOT2%2fB%3d5304694%2fV%3d1';=0A=
</SCRIPT>
<NOSCRIPT><IMG height=3D1 alt=3D""=20
src=3D"http://us.bc.yahoo.com/b?P=3D77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcAD=
Lq9&amp;T=3D18nrkofo3%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2=
fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d216218068%2fH%3dY2FjaGVoaW50PSJuZXdzIi=
Bjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJ=
seTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3d=
1%2fJ%3dF7740D4C&amp;U=3D13h3ol3u4%2fN%3dR1GkCUWTSTY-%2fC%3d289534.138910=
68.13879306.12123427%2fD%3dFOOT2%2fB%3d5304694%2fV%3d1"=20
width=3D1></NOSCRIPT> </DIV></DIV></DIV>
<SCRIPT=20
src=3D"http://l.yimg.com/b/news/combo/D7H8FL9F?common/assets/yui/2.6.0/ge=
neric/yahoo/yahoo.js&amp;common/assets/yui/2.6.0/generic/dom/dom.js&amp;c=
ommon/assets/yui/2.6.0/generic/event/event.js&amp;common/assets/yui/2.6.0=
/generic/connection/connection.js&amp;common/assets/js/1.0.6/generic/darl=
a.js&amp;common/assets/js/1.0.6/generic/ads.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
                        // Set spaceid for page=0A=
                        YAHOO.News.SPACEID =3D '8903239';=0A=
                        // Darla URL=0A=
                        YAHOO.News.DARLA_URL =3D =
'/news/common/pages/generic/darla/fc';=0A=
                        // Darla Keywords=0A=
                        YAHOO.News.DARLA_KEYWORDS =3D 'home; house; It; =
government; tax; give; elderly; Columbia; it; network; police; fuel;';=0A=
                        // Referrer=0A=
                        YAHOO.News.DARLA_REFERRER =3D '';=0A=
                        =0A=
                        =
YAHOO.util.Event.onDOMReady(YAHOO.News.Apply.start, null, =
YAHOO.News.Apply);=0A=
                    </SCRIPT>
<!-- news:story-us:0:Success -->
<SCRIPT language=3Djavascript>=0A=
if(window.yzq_p=3D=3Dnull)document.write("<scr"+"ipt =
language=3Djavascript =
src=3Dhttp://l.yimg.com/d/lib/bc/bc_2.0.4.js></scr"+"ipt>");=0A=
</SCRIPT>

<SCRIPT language=3Djavascript>=0A=
if(window.yzq_p)yzq_p('P=3D77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9&T=3D1=
8j0v4lfl%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2fV%3d1.1%2fW%=
3dJ%2fY%3dYAHOO%2fF%3d1017331011%2fH%3dY2FjaGVoaW50PSJuZXdzIiBjb250ZW50PS=
Job21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJseTsgQ29sdW1=
iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fS%3d1%2fJ%3dF7740D4C');=0A=
if(window.yzq_s)yzq_s();=0A=
</SCRIPT>
<NOSCRIPT><IMG height=3D1 alt=3D""=20
src=3D"http://us.bc.yahoo.com/b?P=3D77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcAD=
Lq9&amp;T=3D18ocoojph%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2=
fV%3d3.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d2321671248%2fH%3dY2FjaGVoaW50PSJuZXdzI=
iBjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZX=
JseTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3=
d1%2fJ%3dF7740D4C"=20
width=3D1></NOSCRIPT> <!-- fe18.story.media.ac4.yahoo.com =
compressed/chunked Fri Feb  5 09:48:55 PST 2010 --></BODY></HTML>

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://l.yimg.com/a/i/brand/purplelogo/uh/us/news.gif

R0lGODlh1QAaAMQfAJxAs71/zK+vr96/5ffv+YMQn4KCgubP7Iwgpu7f8pQwrPT09K1gv82f2bVw
xqRQudav39HR0V9fX42Njbu7u93d3XZ2dsWP0mtra+jo6JiYmKSkpMbGxlRUVHsAmf///yH5BAEA
AB8ALAAAAADVABoAAAX/4CeOZGmeaKqubOu+qRME1zDAeK6jhO3/QB9hRywajwCPchk4Op+fwHJK
rUKv2Oejesh6Xw1FtaoAAB6N72uoRiUaAYbZzAhA2CbpFNHur3oNBVUMfjBJYx4KWAkOCIhTDzcl
eksOhZcoB4JUECiHj0pmeEYND59KCg6dTwQMiACbVAyjlEqrmLgjmlQFCScOoFNNKsFKJ4fDmXCm
ZjRdKAOxHgUOkiNvpwp4tR65WRURLbtT2icHAwEO0h4ADg3PKsxie83HSskkjOtUCAGjHxCoOPhX
AkKsByNqAXhhoEMHCiUEOBQwQqLDixhFNOywocQEhxxILLhYQcSCDRIu/2IQsEBFg0EqDkAi6OIT
PnsebhIANqVAMzN74CWQloaFzCXPat1UsbFDyYoToWKcKoKCQwwiL2ogYbWDhREWpjqU8BTFhSpF
TURTUuDWB3Qz4salaXPFJnwE5ilhAG8EgQubCjzjufeFKyWWokyxxqIphpYiLFKMfNWA5csGTJIc
0bWDBBIaon6wKGGDgI2ZVxye0lfES1S+SLyuwgenhwsrKpHQq6B1iXEFhjhaErvFgCWKFC+B0bTD
BKmTR4tG8bFD9OoOy6bskEGjQ4giMhjozkKvEgSjCBM6QWDLEvQpPjE+sWSh6yXBWVBKQwXG8eXK
JcLcVJNJBp0KXX31wf9IGHX0QQQOKfjBRs/lQMA69hHwSVomXOiBex74NsInZcwx3Bj2fXAibiz8
5wEh/b3gYjcBJuYCapsZSFkHBgjg449ZOdRSV9Vh9cEG01nkmQYUQObCUcIcMJxgKuiRwHDr2VZM
fSMs5gKX5hXHwmz2UeJWYw5FUOQCOkonlkMeffdBdRXQ+QEGDpG3YFhTaeDkmFUEJqJfghBy1jQ0
fUBiO3JB8MM8KXppFJdKvbChCJQkisJGESyAJ49tKilWCUQyiFVXG1QQYQlsbneRBHqysFpPYp5g
5QcJLMGiCZ/s6kkoXepq3BKEeMjWoCUcKiCm5+HA6QeqjpWkQxpEYO3/taxe1BVFprZZQgUCfMrR
GicitUKuHiDgwzy18crECoekeCJ8KxC2yjjTzGeCslSKAEE9wdK4aZo7XhSdt9RJy50I1W0X64IR
OZSaC7OyIysoZ4pQlwrxJkSOph/MlpwIUkJyx28XnNhbbl2m8CzDGB08XQqdecUZRhKGJwFLN/MI
AzcpusGWHTYEBCwJPej1QK35QOqXeQhwqMtqvZSwU6BmlHsPyB90s5zAJby8p8FSYYDZZay6Gh2D
My/ApwQTCKDBdtG1ADS8tpSwWmxaV4GQxoj08wEB3LDzQACmSAMA0yIkwMA+e/ijFjvtiOA1jWCT
IDa0dEv1ZgcmhJYnsQnYPYzkmxb8qR8VQU9ucQnovmh5MCkSVkWKCQTQNxWRGDcDMzJAwLgILg7j
ddfIn7D5B9t6/qYJHKxKQvQ2m5CBBuJK4CcOd5uQ+yf9nLk3rl8kAEE6c8wwANdGuJiWwJl7k8MC
EZTFPRUjkwDiFK1DmaX8anCcGfoCIAB64wDmUYJv6iCXGaTFFLw4nAEnSEE1HAAAu3vFpB5RwQ56
8AhG29LRVNCDIPjggyhMYQlCAAA7

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://l.yimg.com/a/i/us/nws/p/ap_logo_106.png

iVBORw0KGgoAAAANSUhEUgAAAGoAAAAbCAMAAACjgerBAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAGNQTFRFkY+PWldYPzs85ldcMS0unp2dTElKyMfH7o+S1tXV8fHxhIGC
rKurdnN0urm54C0098fJaGVm6nN4/fHx6GVq++Pk4jtB+dXW4+Pj7IGF9bm75ElP86ut8Z2gIx8g
3h8m////g1mcnwAAACF0Uk5T//////////////////////////////////////////8An8HQIQAA
ActJREFUeNrslstygzAMRSUhm4CBBJI06Uvw/1/ZKzO0tJPsGhadeiE/ZOnY1xoGmjZr9MdRx6dx
HHeboIZxK9TLuBXquM+oItvx6XR4HOo0rlFow6NQL+NP1O9rSV/y7RfUbsjT7Gkt3Ik0zl1N1bJS
mmczs9jWd1FOKIoFNU0X7y6eyEzuoDjNCaz8gWKSm+fLqHfPfF6hJu+8MoIJUiUAK3JTs1maGsXQ
uFOzBpcIgmkFM6Nogs+icTRtKuyhHJ9RZ9frdFihdgtKtLK2Nm64MwlMvYXeksVOe+MUS2G21rQT
gaedUcK4FQBqXVTGMnt8k1HFV0kUq9rIkkRcpo6Qv4SRDg9U+z2yUGWv7i9NkVx4ERB48pdUX4YK
mnK8o97Hm6ghFwVDBgqpxUVSUlWBOgIN22CsUkZ2VCwTsUzdIuBcNCIlUZfwci3iGajL/ibq9ehF
IbkycD7r3SCxqOJZIlRkX4FU4mfPnu8osqgCBiKwsQXq1b8OO7RP1Bsmb77/Sl5dDeF0ob66wQTF
XWM4UVMRNQRThdnT5e3ZwOuBdK0D/FUOpc8KmNYV+JBvYIH2nIfPGA2PRH2fHv4k6uz18f8b84/a
DvUhwAA1FDtPSfAcjAAAAABJRU5ErkJggg==

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://ads.bluelithium.com/pixel?id=298793&t=2

R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://us.bc.yahoo.com/b?P=77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9&T=18nobbfi2%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d572969557%2fH%3dY2FjaGVoaW50PSJuZXdzIiBjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJseTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3d1%2fJ%3dF7740D4C&U=13fhpk1jv%2fN%3dc1GkCUWTSTY-%2fC%3d624324.13238302.13375956.12549985%2fD%3dSIP%2fB%3d5600123%2fV%3d1

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://us.bc.yahoo.com/b?P=77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9&T=18nrkofo3%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO%2fF%3d216218068%2fH%3dY2FjaGVoaW50PSJuZXdzIiBjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJseTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3d1%2fJ%3dF7740D4C&U=13h3ol3u4%2fN%3dR1GkCUWTSTY-%2fC%3d289534.13891068.13879306.12123427%2fD%3dFOOT2%2fB%3d5304694%2fV%3d1

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://us.bc.yahoo.com/b?P=77yuXWKIRlgrCHVFS2Z8Nw9eRhRVi0tsWgcADLq9&T=18ocoojph%2fX%3d1265392135%2fE%3d8903239%2fR%3dnews%2fK%3d5%2fV%3d3.1%2fW%3dJ%2fY%3dYAHOO%2fF%3d2321671248%2fH%3dY2FjaGVoaW50PSJuZXdzIiBjb250ZW50PSJob21lOyBob3VzZTsgSXQ7IGdvdmVybm1lbnQ7IHRheDsgZ2l2ZTsgZWxkZXJseTsgQ29sdW1iaWE7IGl0OyBuZXR3b3JrOyBwb2xpY2U7IGZ1ZWw7Ig--%2fQ%3d-1%2fS%3d1%2fJ%3dF7740D4C

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://l.yimg.com/b/news/combo/D7H8FL9F?common/assets/css/1.0.6/generic/print.css

HTML {
	BACKGROUND: #fff; COLOR: #000
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
DIV {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
DL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
DT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
DD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
OL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H5 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
H6 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
PRE {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
CODE {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
FORM {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
FIELDSET {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
LEGEND {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
INPUT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
TEXTAREA {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
BLOCKQUOTE {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
TH {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
TABLE {
	BORDER-COLLAPSE: collapse; border-spacing: 0
}
FIELDSET {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
ADDRESS {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
CAPTION {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
CITE {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
CODE {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
DFN {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
EM {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
STRONG {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
TH {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
VAR {
	FONT-WEIGHT: normal; FONT-STYLE: normal
}
LI {
	LIST-STYLE-TYPE: none
}
CAPTION {
	TEXT-ALIGN: left
}
TH {
	TEXT-ALIGN: left
}
H1 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
H2 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
H3 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
H4 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
H5 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
H6 {
	FONT-WEIGHT: normal; FONT-SIZE: 100%
}
Q:unknown {
	content: ''
}
Q:unknown {
	content: ''
}
ABBR {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px; FONT-VARIANT: normal
}
ACRONYM {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px; FONT-VARIANT: normal
}
SUP {
	VERTICAL-ALIGN: text-top
}
SUB {
	VERTICAL-ALIGN: text-bottom
}
INPUT {
	FONT-FAMILY: inherit
}
TEXTAREA {
	FONT-FAMILY: inherit
}
SELECT {
	FONT-FAMILY: inherit
}
INPUT {
	FONT-SIZE: 100%
}
TEXTAREA {
	FONT-SIZE: 100%
}
SELECT {
	FONT-SIZE: 100%
}
LEGEND {
	COLOR: #000
}
BODY {
	FONT: small/1.231 arial,helvetica,clean,sans-serif
}
TABLE {
=09
}
PRE {
	FONT-SIZE: 108%; LINE-HEIGHT: 100%; FONT-FAMILY: monospace
}
CODE {
	FONT-SIZE: 108%; LINE-HEIGHT: 100%; FONT-FAMILY: monospace
}
KBD {
	FONT-SIZE: 108%; LINE-HEIGHT: 100%; FONT-FAMILY: monospace
}
SAMP {
	FONT-SIZE: 108%; LINE-HEIGHT: 100%; FONT-FAMILY: monospace
}
TT {
	FONT-SIZE: 108%; LINE-HEIGHT: 100%; FONT-FAMILY: monospace
}
BODY {
	TEXT-ALIGN: center
}
#ft {
	CLEAR: both
}
#doc {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
#doc2 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
#doc3 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
#doc4 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t1 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t2 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t3 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t4 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t5 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t6 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
.yui-t7 {
	MIN-WIDTH: 750px; MARGIN: auto; WIDTH: 56.25em; TEXT-ALIGN: left
}
#doc2 {
	WIDTH: 71.25em
}
#doc3 {
	MARGIN: auto 10px; WIDTH: auto
}
#doc4 {
	WIDTH: 73.05em
}
.yui-b {
	POSITION: relative
}
.yui-b {
	_position: static
}
#yui-main .yui-b {
	POSITION: static
}
#yui-main {
	WIDTH: 100%
}
.yui-t1 #yui-main {
	FLOAT: right; MARGIN-LEFT: -25em
}
.yui-t2 #yui-main {
	FLOAT: right; MARGIN-LEFT: -25em
}
.yui-t3 #yui-main {
	FLOAT: right; MARGIN-LEFT: -25em
}
.yui-t4 #yui-main {
	FLOAT: left; MARGIN-RIGHT: -25em
}
.yui-t5 #yui-main {
	FLOAT: left; MARGIN-RIGHT: -25em
}
.yui-t6 #yui-main {
	FLOAT: left; MARGIN-RIGHT: -25em
}
.yui-t1 .yui-b {
	FLOAT: left; WIDTH: 12em
}
.yui-t1 #yui-main .yui-b {
	MARGIN-LEFT: 13.05em
}
.yui-t2 .yui-b {
	FLOAT: left; WIDTH: 13.5em
}
.yui-t2 #yui-main .yui-b {
	MARGIN-LEFT: 14.55em
}
.yui-t3 .yui-b {
	FLOAT: left; WIDTH: 22.5em
}
.yui-t3 #yui-main .yui-b {
	MARGIN-LEFT: 23.62em
}
.yui-t4 .yui-b {
	FLOAT: right; WIDTH: 13.5em
}
.yui-t4 #yui-main .yui-b {
	MARGIN-RIGHT: 14.55em
}
.yui-t5 .yui-b {
	FLOAT: right; WIDTH: 18em
}
.yui-t5 #yui-main .yui-b {
	MARGIN-RIGHT: 19.12em
}
.yui-t6 .yui-b {
	FLOAT: right; WIDTH: 22.5em
}
.yui-t6 #yui-main .yui-b {
	MARGIN-RIGHT: 23.62em
}
.yui-t7 #yui-main .yui-b {
	DISPLAY: block; MARGIN: 0px 0px 1em
}
#yui-main .yui-b {
	FLOAT: none; WIDTH: auto
}
.yui-gb .yui-u {
	FLOAT: left
}
.yui-g .yui-gb .yui-u {
	FLOAT: left
}
.yui-gb .yui-g {
	FLOAT: left
}
.yui-gb .yui-gb {
	FLOAT: left
}
.yui-gb .yui-gc {
	FLOAT: left
}
.yui-gb .yui-gd {
	FLOAT: left
}
.yui-gb .yui-ge {
	FLOAT: left
}
.yui-gb .yui-gf {
	FLOAT: left
}
.yui-gc .yui-u {
	FLOAT: left
}
.yui-gc .yui-g {
	FLOAT: left
}
.yui-gd .yui-u {
	FLOAT: left
}
.yui-g .yui-u {
	FLOAT: right
}
.yui-g .yui-g {
	FLOAT: right
}
.yui-g .yui-gb {
	FLOAT: right
}
.yui-g .yui-gc {
	FLOAT: right
}
.yui-g .yui-gd {
	FLOAT: right
}
.yui-g .yui-ge {
	FLOAT: right
}
.yui-g .yui-gf {
	FLOAT: right
}
.yui-gc .yui-u {
	FLOAT: right
}
.yui-gd .yui-g {
	FLOAT: right
}
.yui-g .yui-gc .yui-u {
	FLOAT: right
}
.yui-ge .yui-u {
	FLOAT: right
}
.yui-ge .yui-g {
	FLOAT: right
}
.yui-gf .yui-g {
	FLOAT: right
}
.yui-gf .yui-u {
	FLOAT: right
}
.yui-g DIV.first {
	FLOAT: left
}
.yui-gb DIV.first {
	FLOAT: left
}
.yui-gc DIV.first {
	FLOAT: left
}
.yui-gd DIV.first {
	FLOAT: left
}
.yui-ge DIV.first {
	FLOAT: left
}
.yui-gf DIV.first {
	FLOAT: left
}
.yui-g .yui-gc DIV.first {
	FLOAT: left
}
.yui-g .yui-ge DIV.first {
	FLOAT: left
}
.yui-gc DIV.first DIV.first {
	FLOAT: left
}
.yui-g .yui-u {
	WIDTH: 49.1%
}
.yui-g .yui-g {
	WIDTH: 49.1%
}
.yui-g .yui-gb {
	WIDTH: 49.1%
}
.yui-g .yui-gc {
	WIDTH: 49.1%
}
.yui-g .yui-gd {
	WIDTH: 49.1%
}
.yui-g .yui-ge {
	WIDTH: 49.1%
}
.yui-g .yui-gf {
	WIDTH: 49.1%
}
.yui-gb .yui-u {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-g .yui-gb .yui-u {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-g {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-gb {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-gc {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-gd {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-ge {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-gf {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gc .yui-u {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gc .yui-g {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gd .yui-u {
	MARGIN-LEFT: 1.99%; WIDTH: 32%
}
.yui-gb .yui-u {
	MARGIN-LEFT: 1.9%; WIDTH: 31.9%
}
.yui-gc DIV.first {
	WIDTH: 66%
}
.yui-gd .yui-u {
	WIDTH: 66%
}
.yui-gd DIV.first {
	WIDTH: 32%
}
.yui-ge DIV.first {
	WIDTH: 74.2%
}
.yui-gf .yui-u {
	WIDTH: 74.2%
}
.yui-ge .yui-u {
	WIDTH: 24%
}
.yui-gf DIV.first {
	WIDTH: 24%
}
.yui-g .yui-gb DIV.first {
	MARGIN-LEFT: 0px
}
.yui-gb DIV.first {
	MARGIN-LEFT: 0px
}
.yui-gc DIV.first {
	MARGIN-LEFT: 0px
}
.yui-gd DIV.first {
	MARGIN-LEFT: 0px
}
.yui-g .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-gb .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-gc .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-gd .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-ge .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-gf .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-g .yui-gb DIV.first {
	WIDTH: 32%; MARGIN-RIGHT: 0px; _width: 31.7%
}
.yui-gb .yui-gb DIV.first {
	WIDTH: 32%; MARGIN-RIGHT: 0px; _width: 31.7%
}
.yui-g .yui-gc DIV.first {
	WIDTH: 66%
}
.yui-gd .yui-g {
	WIDTH: 66%
}
.yui-gb .yui-g DIV.first {
	MARGIN-RIGHT: 4%; _margin-right: 1.3%
}
.yui-gb .yui-gc DIV.first {
	MARGIN-RIGHT: 0px
}
.yui-gb .yui-gd DIV.first {
	MARGIN-RIGHT: 0px
}
.yui-gb .yui-gb .yui-u {
	MARGIN-LEFT: 1.8%; _margin-left: 4%
}
.yui-gb .yui-gc .yui-u {
	MARGIN-LEFT: 1.8%; _margin-left: 4%
}
.yui-g .yui-gb .yui-u {
	_margin-left: 1.0%
}
.yui-gb .yui-gd .yui-u {
	WIDTH: 66%; _width: 61.2%
}
.yui-gb .yui-gd DIV.first {
	WIDTH: 31%; _width: 29.5%
}
.yui-g .yui-gc .yui-u {
	WIDTH: 32%; MARGIN-RIGHT: 0px; _margin-left: 0; _float: right
}
.yui-gb .yui-gc .yui-u {
	WIDTH: 32%; MARGIN-RIGHT: 0px; _margin-left: 0; _float: right
}
.yui-gb .yui-gc DIV.first {
	FLOAT: left; MARGIN-LEFT: 0px; WIDTH: 66%
}
.yui-gb .yui-ge .yui-u {
	MARGIN: 0px
}
.yui-gb .yui-gf .yui-u {
	MARGIN: 0px
}
.yui-gb .yui-gb .yui-u {
	_margin-left: .7%
}
.yui-gb .yui-g DIV.first {
	MARGIN-LEFT: 0px
}
.yui-gb .yui-gb DIV.first {
	MARGIN-LEFT: 0px
}
.yui-gc .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
.yui-gd .yui-g .yui-u {
	MARGIN-LEFT: 0px; WIDTH: 48.1%
}
S .yui-gb .yui-gd DIV.first {
	WIDTH: 32%
}
.yui-g .yui-gd DIV.first {
	_width: 29.9%
}
.yui-ge .yui-g {
	WIDTH: 24%
}
.yui-gf .yui-g {
	WIDTH: 74.2%
}
.yui-gb .yui-ge DIV.yui-u {
	FLOAT: right
}
.yui-gb .yui-gf DIV.yui-u {
	FLOAT: right
}
.yui-gb .yui-ge DIV.first {
	FLOAT: left
}
.yui-gb .yui-gf DIV.first {
	FLOAT: left
}
.yui-gb .yui-ge .yui-u {
	WIDTH: 24%; _width: 20%
}
.yui-gb .yui-gf DIV.first {
	WIDTH: 24%; _width: 20%
}
.yui-gb .yui-ge DIV.first {
	WIDTH: 73.5%; _width: 65.5%
}
.yui-gb .yui-gf .yui-u {
	WIDTH: 73.5%; _width: 65.5%
}
.yui-ge DIV.first .yui-gd .yui-u {
	WIDTH: 65%
}
.yui-ge DIV.first .yui-gd DIV.first {
	WIDTH: 32%
}
#bd:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-g:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-gb:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-gc:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-gd:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-ge:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.yui-gf:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
#bd {
	ZOOM: 1
}
.yui-g {
	ZOOM: 1
}
.yui-gb {
	ZOOM: 1
}
.yui-gc {
	ZOOM: 1
}
.yui-gd {
	ZOOM: 1
}
.yui-ge {
	ZOOM: 1
}
.yui-gf {
	ZOOM: 1
}
#ft .services LI {
	PADDING-RIGHT: 4px; DISPLAY: inline; PADDING-LEFT: 11px; BACKGROUND: =
url(http://l.yimg.com/a/i/us/nws/2008/news/us/assets/common/images/map1.v=
14.png) no-repeat -6px -94px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
#copyright LI {
	PADDING-RIGHT: 4px; DISPLAY: inline; PADDING-LEFT: 11px; BACKGROUND: =
url(http://l.yimg.com/a/i/us/nws/2008/news/us/assets/common/images/map1.v=
14.png) no-repeat -6px -94px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
#ft .services LI.first {
	PADDING-LEFT: 5px; BACKGROUND: none transparent scroll repeat 0% 0%
}
#copyright LI.first {
	PADDING-LEFT: 5px; BACKGROUND: none transparent scroll repeat 0% 0%
}
#ft {
	BORDER-RIGHT: #dcdcdc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: =
#dcdcdc 1px solid; PADDING-LEFT: 5px; FONT-SIZE: 85%; BACKGROUND: =
url(http://l.yimg.com/a/i/us/nws/2008/news/us/assets/common/images/map1.v=
14.png) #f7f7f7 repeat-x 0px 0px; PADDING-BOTTOM: 10px; MARGIN: 0px 0px =
10px; BORDER-LEFT: #dcdcdc 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: =
#dcdcdc 1px solid; TEXT-ALIGN: center
}
#ft H6 {
	DISPLAY: inline; TEXT-TRANSFORM: uppercase
}
#ft .nav {
	MARGIN-BOTTOM: 11px
}
#ft .nav H6 {
	DISPLAY: none
}
#ft .services UL {
	DISPLAY: inline
}
#ft .services LI {
	BACKGROUND-POSITION: -6px -96px
}
#ft LI.rss A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 22px; BACKGROUND: =
url(http://l.yimg.com/a/i/us/nws/2008/news/us/assets/common/images/map1.v=
14.png) no-repeat 3px -200px; PADDING-BOTTOM: 2px; MARGIN: -2px 0px; =
PADDING-TOP: 2px
}
#ft .mobile {
	PADDING-LEFT: 10px; MARGIN-LEFT: 6px; BORDER-LEFT: #9f9f9f 1px solid
}
#copyright {
	FONT-SIZE: 85%; MARGIN: 10px 0px 0px; TEXT-ALIGN: center
}
#copyright UL {
	DISPLAY: inline
}
#copyright LI {
	PADDING-RIGHT: 6px; BACKGROUND-POSITION: -6px -96px; PADDING-LEFT: 10px
}
#copyright P {
	PADDING-TOP: 3px
}
#copyright CITE {
	FONT-SIZE: 100%; COLOR: #000
}
#banner-ad {
	MIN-HEIGHT: 75px; _height: 75px
}
#banner-ad .bd {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; Z-INDEX: 2000; PADDING-BOTTOM: =
0px; WIDTH: 974px; PADDING-TOP: 15px; TEXT-ALIGN: center
}
#banner-ad .bd IFRAME {
	DISPLAY: block; MARGIN: 0px auto
}
#banner-ad .bd OBJECT {
	DISPLAY: block; MARGIN: 0px auto
}
#banner-ad .bd EMBED {
	DISPLAY: block; MARGIN: 0px auto
}
#banner-ad .bd IMG {
	DISPLAY: block; MARGIN: 0px auto
}
#banner-ad .banner-style {
	PADDING-RIGHT: 0px; BORDER-TOP: #fff 1px solid; PADDING-LEFT: 0px; =
PADDING-BOTTOM: 6px; PADDING-TOP: 6px; BACKGROUND-COLOR: #ebe9ea
}
#sidebar #sponsored-links {
	BORDER-RIGHT: #eee 3px solid; BORDER-TOP: #eee 3px solid; =
BACKGROUND-IMAGE: none; OVERFLOW: hidden; BORDER-LEFT: #eee 3px solid; =
COLOR: #626262; BORDER-BOTTOM: #eee 3px solid; _width: 294px
}
#sidebar #sponsored-links H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: =
100%; BACKGROUND: none transparent scroll repeat 0% 0%; PADDING-BOTTOM: =
0px; MARGIN: 0px; TEXT-TRANSFORM: lowercase; COLOR: #2f4251; =
BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
#sidebar #sponsored-links .hd {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 4px; =
BORDER-TOP-STYLE: none; PADDING-TOP: 3px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #eee; BORDER-BOTTOM-STYLE: =
none
}
#sidebar #sponsored-links .bd {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BACKGROUND-COLOR: #fff; BORDER-BOTTOM-STYLE: =
none
}
#sidebar #sponsored-links UL LI {
	MARGIN-TOP: 10px; DISPLAY: block; COLOR: #000
}
#sidebar #sponsored-links UL LI A {
	DISPLAY: block; FONT-WEIGHT: bold
}
#sidebar #sponsored-links UL LI A.host {
	FONT-WEIGHT: normal; COLOR: #1da612; _margin-bottom: -15px
}
.ad-links .hd H3 {
	FONT-SIZE: 100%
}
.ad-links .bd UL {
	MARGIN-BOTTOM: 20px
}
.ad-links .bd LI {
	PADDING-LEFT: 30px; WIDTH: 171px; LINE-HEIGHT: 0; HEIGHT: 25px
}
.ad-links .bd LI IMG {
	PADDING-RIGHT: 3px; MARGIN-LEFT: -30px; VERTICAL-ALIGN: middle
}
.ad-links .bd LI:first-child {
	BACKGROUND: none transparent scroll repeat 0% 0%; PADDING-TOP: 0px
}
.ad-links .ft {
	BORDER-RIGHT: #dcdcdc 1px solid; BORDER-TOP: #dcdcdc 1px solid; =
PADDING-BOTTOM: 10px; BORDER-LEFT: #dcdcdc 1px solid; WIDTH: 190px; =
PADDING-TOP: 10px; BORDER-BOTTOM: #dcdcdc 1px solid; HEIGHT: 165px
}
.ad-links .darla_ad {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px
}
.ad-links .dynamic_ad {
	PADDING-LEFT: 10px
}
.ad_sidebar IFRAME {
	DISPLAY: block
}
.darla_ad IFRAME {
	WIDTH: 100%; HEIGHT: 100%
}
.dynamic_ad IFRAME {
	WIDTH: 100%; HEIGHT: 100%
}
#dynamic-ad__LREC2 {
	WIDTH: 300px; HEIGHT: 265px
}
#darla-ad__LREC {
	WIDTH: 300px; HEIGHT: 265px
}
#darla-ad__LREC2 {
	WIDTH: 300px; HEIGHT: 265px
}
.ad_small_ad {
	MARGIN-TOP: 8px
}
BODY {
	TEXT-ALIGN: center
}
A {
	COLOR: #4485be; TEXT-DECORATION: none
}
A:hover {
	TEXT-DECORATION: underline
}
#doc {
	MARGIN: 20px auto 0px; WIDTH: 950px; TEXT-ALIGN: left
}
#doc .hd {
	PADDING-BOTTOM: 5px; BORDER-BOTTOM: #999 1px solid
}
#doc .hd .nav {
	FONT-SIZE: 85%; FLOAT: right
}
#doc .hd .nav LI {
	FLOAT: left
}
#doc .hd A.action {
	LINE-HEIGHT: 32px
}
#doc .hd A.logo {
	FLOAT: left
}
#doc .bd {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 25px; =
PADDING-TOP: 15px
}
#doc .bd IMG.provider {
	MARGIN-TOP: 10px; FLOAT: right
}
#doc .ft {
	BORDER-TOP: #999 1px solid; FONT-SIZE: 85%; TEXT-ALIGN: center
}
#doc .ft P {
	PADDING-RIGHT: 100px; PADDING-LEFT: 100px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 0px
}
#doc .ft A {
	VERTICAL-ALIGN: top
}
#doc H1 {
	FONT-SIZE: 225%; MARGIN-BOTTOM: 15px; FONT-FAMILY: Georgia, "Times New =
Roman", Times, serif
}
#doc .byline {
	DISPLAY: block; FONT-SIZE: 85%
}
#doc .byline ABBR {
	MARGIN-TOP: 2px; DISPLAY: block; COLOR: #6f6f6f
}
#doc .byline .fn {
	DISPLAY: none
}
#doc P {
	MARGIN-TOP: 15px
}
#doc .bd P {
	LINE-HEIGHT: 146.5%
}
#doc .bd .ad {
	FLOAT: right; MARGIN-BOTTOM: 20px; MARGIN-LEFT: 20px
}
A.print {
	DISPLAY: block; PADDING-LEFT: 35px; FONT-WEIGHT: bold; BACKGROUND: =
url(http://l.yimg.com/us.yimg.com/i/us/nws/pv/ypv_sprite_main3.gif) =
no-repeat -235px -60px; TEXT-TRANSFORM: uppercase; WIDTH: 60px; COLOR: =
#000; LINE-HEIGHT: 32px; MARGIN-RIGHT: 10px; HEIGHT: 32px
}
#doc .hd {
	ZOOM: 1
}
#doc .hd:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}

@media Print   =20
{
BODY {
	FONT-SIZE: 12pt
}
#doc {
	MARGIN: 0px; WIDTH: auto
}

}

------=_NextPart_000_0000_01CAA661.C174B450
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://l.yimg.com/b/news/combo/D7H8FL9F?common/assets/yui/2.6.0/generic/yahoo/yahoo.js&common/assets/yui/2.6.0/generic/dom/dom.js&common/assets/yui/2.6.0/generic/event/event.js&common/assets/yui/2.6.0/generic/connection/connection.js&common/assets/js/1.0.6/generic/darla.js&common/assets/js/1.0.6/generic/ads.js

/*=0A=
Copyright (c) 2008, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.5.1=0A=
*/=0A=
/**=0A=
 * The YAHOO object is the single global object used by YUI Library.  It=0A=
 * contains utility function for setting up namespaces, inheritance, and=0A=
 * logging.  YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces=0A=
 * created automatically for and used by the library.=0A=
 * @module yahoo=0A=
 * @title  YAHOO Global=0A=
 */=0A=
=0A=
/**=0A=
 * YAHOO_config is not included as part of the library.  Instead it is =
an =0A=
 * object that can be defined by the implementer immediately before =0A=
 * including the YUI library.  The properties included in this object=0A=
 * will be used to configure global properties needed as soon as the =0A=
 * library begins to load.=0A=
 * @class YAHOO_config=0A=
 * @static=0A=
 */=0A=
=0A=
/**=0A=
 * A reference to a function that will be executed every time a YAHOO =
module=0A=
 * is loaded.  As parameter, this function will receive the version=0A=
 * information for the module. See <a href=3D"YAHOO.env.html#getVersion">=0A=
 * YAHOO.env.getVersion</a> for the description of the version data =
structure.=0A=
 * @property listener=0A=
 * @type Function=0A=
 * @static=0A=
 * @default undefined=0A=
 */=0A=
=0A=
/**=0A=
 * Set to true if the library will be dynamically loaded after =
window.onload.=0A=
 * Defaults to false =0A=
 * @property injecting=0A=
 * @type boolean=0A=
 * @static=0A=
 * @default undefined=0A=
 */=0A=
=0A=
/**=0A=
 * Instructs the yuiloader component to dynamically load yui components =
and=0A=
 * their dependencies.  See the yuiloader documentation for more =
information=0A=
 * about dynamic loading=0A=
 * @property load=0A=
 * @static=0A=
 * @default undefined=0A=
 * @see yuiloader=0A=
 */=0A=
=0A=
/**=0A=
 * Forces the use of the supplied locale where applicable in the library=0A=
 * @property locale=0A=
 * @type string=0A=
 * @static=0A=
 * @default undefined=0A=
 */=0A=
=0A=
if (typeof YAHOO =3D=3D "undefined" || !YAHOO) {=0A=
    /**=0A=
     * The YAHOO global namespace object.  If YAHOO is already defined, =
the=0A=
     * existing YAHOO object will not be overwritten so that defined=0A=
     * namespaces are preserved.=0A=
     * @class YAHOO=0A=
     * @static=0A=
     */=0A=
    var YAHOO =3D {};=0A=
}=0A=
=0A=
/**=0A=
 * Returns the namespace specified and creates it if it doesn't exist=0A=
 * <pre>=0A=
 * YAHOO.namespace("property.package");=0A=
 * YAHOO.namespace("YAHOO.property.package");=0A=
 * </pre>=0A=
 * Either of the above would create YAHOO.property, then=0A=
 * YAHOO.property.package=0A=
 *=0A=
 * Be careful when naming packages. Reserved words may work in some =
browsers=0A=
 * and not others. For instance, the following will fail in Safari:=0A=
 * <pre>=0A=
 * YAHOO.namespace("really.long.nested.namespace");=0A=
 * </pre>=0A=
 * This fails because "long" is a future reserved word in ECMAScript=0A=
 *=0A=
 * @method namespace=0A=
 * @static=0A=
 * @param  {String*} arguments 1-n namespaces to create =0A=
 * @return {Object}  A reference to the last namespace object created=0A=
 */=0A=
YAHOO.namespace =3D function() {=0A=
    var a=3Darguments, o=3Dnull, i, j, d;=0A=
    for (i=3D0; i<a.length; i=3Di+1) {=0A=
        d=3Da[i].split(".");=0A=
        o=3DYAHOO;=0A=
=0A=
        // YAHOO is implied, so it is ignored if it is included=0A=
        for (j=3D(d[0] =3D=3D "YAHOO") ? 1 : 0; j<d.length; j=3Dj+1) {=0A=
            o[d[j]]=3Do[d[j]] || {};=0A=
            o=3Do[d[j]];=0A=
        }=0A=
    }=0A=
=0A=
    return o;=0A=
};=0A=
=0A=
/**=0A=
 * Uses YAHOO.widget.Logger to output a log message, if the widget is=0A=
 * available.=0A=
 *=0A=
 * @method log=0A=
 * @static=0A=
 * @param  {String}  msg  The message to log.=0A=
 * @param  {String}  cat  The log category for the message.  Default=0A=
 *                        categories are "info", "warn", "error", time".=0A=
 *                        Custom categories can be used as well. (opt)=0A=
 * @param  {String}  src  The source of the the message (opt)=0A=
 * @return {Boolean}      True if the log operation was successful.=0A=
 */=0A=
YAHOO.log =3D function(msg, cat, src) {=0A=
    var l=3DYAHOO.widget.Logger;=0A=
    if(l && l.log) {=0A=
        return l.log(msg, cat, src);=0A=
    } else {=0A=
        return false;=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * Registers a module with the YAHOO object=0A=
 * @method register=0A=
 * @static=0A=
 * @param {String}   name    the name of the module (event, slider, etc)=0A=
 * @param {Function} mainClass a reference to class in the module.  This=0A=
 *                             class will be tagged with the version info=0A=
 *                             so that it will be possible to identify =
the=0A=
 *                             version that is in use when multiple =
versions=0A=
 *                             have loaded=0A=
 * @param {Object}   data      metadata object for the module.  =
Currently it=0A=
 *                             is expected to contain a "version" =
property=0A=
 *                             and a "build" property at minimum.=0A=
 */=0A=
YAHOO.register =3D function(name, mainClass, data) {=0A=
    var mods =3D YAHOO.env.modules;=0A=
    if (!mods[name]) {=0A=
        mods[name] =3D { versions:[], builds:[] };=0A=
    }=0A=
    var =
m=3Dmods[name],v=3Ddata.version,b=3Ddata.build,ls=3DYAHOO.env.listeners;=0A=
    m.name =3D name;=0A=
    m.version =3D v;=0A=
    m.build =3D b;=0A=
    m.versions.push(v);=0A=
    m.builds.push(b);=0A=
    m.mainClass =3D mainClass;=0A=
    // fire the module load listeners=0A=
    for (var i=3D0;i<ls.length;i=3Di+1) {=0A=
        ls[i](m);=0A=
    }=0A=
    // label the main class=0A=
    if (mainClass) {=0A=
        mainClass.VERSION =3D v;=0A=
        mainClass.BUILD =3D b;=0A=
    } else {=0A=
        YAHOO.log("mainClass is undefined for module " + name, "warn");=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * YAHOO.env is used to keep track of what is known about the YUI =
library and=0A=
 * the browsing environment=0A=
 * @class YAHOO.env=0A=
 * @static=0A=
 */=0A=
YAHOO.env =3D YAHOO.env || {=0A=
=0A=
    /**=0A=
     * Keeps the version info for all YUI modules that have reported =
themselves=0A=
     * @property modules=0A=
     * @type Object[]=0A=
     */=0A=
    modules: [],=0A=
    =0A=
    /**=0A=
     * List of functions that should be executed every time a YUI module=0A=
     * reports itself.=0A=
     * @property listeners=0A=
     * @type Function[]=0A=
     */=0A=
    listeners: []=0A=
};=0A=
=0A=
/**=0A=
 * Returns the version data for the specified module:=0A=
 *      <dl>=0A=
 *      <dt>name:</dt>      <dd>The name of the module</dd>=0A=
 *      <dt>version:</dt>   <dd>The version in use</dd>=0A=
 *      <dt>build:</dt>     <dd>The build number in use</dd>=0A=
 *      <dt>versions:</dt>  <dd>All versions that were registered</dd>=0A=
 *      <dt>builds:</dt>    <dd>All builds that were registered.</dd>=0A=
 *      <dt>mainClass:</dt> <dd>An object that was was stamped with the=0A=
 *                 current version and build. If =0A=
 *                 mainClass.VERSION !=3D version or mainClass.BUILD =
!=3D build,=0A=
 *                 multiple versions of pieces of the library have been=0A=
 *                 loaded, potentially causing issues.</dd>=0A=
 *       </dl>=0A=
 *=0A=
 * @method getVersion=0A=
 * @static=0A=
 * @param {String}  name the name of the module (event, slider, etc)=0A=
 * @return {Object} The version info=0A=
 */=0A=
YAHOO.env.getVersion =3D function(name) {=0A=
    return YAHOO.env.modules[name] || null;=0A=
};=0A=
=0A=
/**=0A=
 * Do not fork for a browser if it can be avoided.  Use feature =
detection when=0A=
 * you can.  Use the user agent as a last resort.  YAHOO.env.ua stores a =
version=0A=
 * number for the browser engine, 0 otherwise.  This value may or may =
not map=0A=
 * to the version number of the browser using the engine.  The value is =0A=
 * presented as a float so that it can easily be used for boolean =
evaluation =0A=
 * as well as for looking for a particular range of versions.  Because =
of this, =0A=
 * some of the granularity of the version info may be lost (e.g., Gecko =
1.8.0.9 =0A=
 * reports 1.8).=0A=
 * @class YAHOO.env.ua=0A=
 * @static=0A=
 */=0A=
YAHOO.env.ua =3D function() {=0A=
    var o=3D{=0A=
=0A=
        /**=0A=
         * Internet Explorer version number or 0.  Example: 6=0A=
         * @property ie=0A=
         * @type float=0A=
         */=0A=
        ie:0,=0A=
=0A=
        /**=0A=
         * Opera version number or 0.  Example: 9.2=0A=
         * @property opera=0A=
         * @type float=0A=
         */=0A=
        opera:0,=0A=
=0A=
        /**=0A=
         * Gecko engine revision number.  Will evaluate to 1 if Gecko =0A=
         * is detected but the revision could not be found. Other =
browsers=0A=
         * will be 0.  Example: 1.8=0A=
         * <pre>=0A=
         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7=0A=
         * Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8=0A=
         * Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8=0A=
         * Firefox 3 alpha: 1.9a4   <-- Reports 1.9=0A=
         * </pre>=0A=
         * @property gecko=0A=
         * @type float=0A=
         */=0A=
        gecko:0,=0A=
=0A=
        /**=0A=
         * AppleWebKit version.  KHTML browsers that are not WebKit =
browsers =0A=
         * will evaluate to 1, other browsers 0.  Example: 418.9.1=0A=
         * <pre>=0A=
         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently =
the =0A=
         *                                   latest available for Mac =
OSX 10.3.=0A=
         * Safari 2.0.2:         416     <-- hasOwnProperty introduced=0A=
         * Safari 2.0.4:         418     <-- preventDefault fixed=0A=
         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may =
run=0A=
         *                                   different versions of webkit=0A=
         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that =
have been=0A=
         *                                   updated, but not updated=0A=
         *                                   to the latest patch.=0A=
         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with =
native SVG=0A=
         *                                   and many major issues =
fixed).  =0A=
         * 3.x yahoo.com, flickr:422     <-- Safari 3.x hacks the user =
agent=0A=
         *                                   string when hitting =
yahoo.com and =0A=
         *                                   flickr.com.=0A=
         * Safari 3.0.4 (523.12):523.12  <-- First Tiger release - =
automatic update=0A=
         *                                   from 2.x via the 10.4.11 OS =
patch=0A=
         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded =
event.=0A=
         *                                   yahoo.com user agent hack =
removed.=0A=
         *                                   =0A=
         * </pre>=0A=
         * http://developer.apple.com/internet/safari/uamatrix.html=0A=
         * @property webkit=0A=
         * @type float=0A=
         */=0A=
        webkit: 0,=0A=
=0A=
        /**=0A=
         * The mobile property will be set to a string containing any =
relevant=0A=
         * user agent information when a modern mobile browser is =
detected.=0A=
         * Currently limited to Safari on the iPhone/iPod Touch, Nokia =
N-series=0A=
         * devices with the WebKit-based browser, and Opera Mini.  =0A=
         * @property mobile =0A=
         * @type string=0A=
         */=0A=
        mobile: null,=0A=
=0A=
        /**=0A=
         * Adobe AIR version number or 0.  Only populated if webkit is =
detected.=0A=
         * Example: 1.0=0A=
         * @property air=0A=
         * @type float=0A=
         */=0A=
        air: 0=0A=
=0A=
    };=0A=
=0A=
    var ua=3Dnavigator.userAgent, m;=0A=
=0A=
    // Modern KHTML browsers should qualify as Safari X-Grade=0A=
    if ((/KHTML/).test(ua)) {=0A=
        o.webkit=3D1;=0A=
    }=0A=
    // Modern WebKit browsers are at least X-Grade=0A=
    m=3Dua.match(/AppleWebKit\/([^\s]*)/);=0A=
    if (m&&m[1]) {=0A=
        o.webkit=3DparseFloat(m[1]);=0A=
=0A=
        // Mobile browser check=0A=
        if (/ Mobile\//.test(ua)) {=0A=
            o.mobile =3D "Apple"; // iPhone or iPod Touch=0A=
        } else {=0A=
            m=3Dua.match(/NokiaN[^\/]*/);=0A=
            if (m) {=0A=
                o.mobile =3D m[0]; // Nokia N-series, ex: NokiaN95=0A=
            }=0A=
        }=0A=
=0A=
        m=3Dua.match(/AdobeAIR\/([^\s]*)/);=0A=
        if (m) {=0A=
            o.air =3D m[0]; // Adobe AIR 1.0 or better=0A=
        }=0A=
=0A=
    }=0A=
=0A=
    if (!o.webkit) { // not webkit=0A=
        // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; =
fi; U; ssr)=0A=
        m=3Dua.match(/Opera[\s\/]([^\s]*)/);=0A=
        if (m&&m[1]) {=0A=
            o.opera=3DparseFloat(m[1]);=0A=
            m=3Dua.match(/Opera Mini[^;]*/);=0A=
            if (m) {=0A=
                o.mobile =3D m[0]; // ex: Opera Mini/2.0.4509/1316=0A=
            }=0A=
        } else { // not opera or webkit=0A=
            m=3Dua.match(/MSIE\s([^;]*)/);=0A=
            if (m&&m[1]) {=0A=
                o.ie=3DparseFloat(m[1]);=0A=
            } else { // not opera, webkit, or ie=0A=
                m=3Dua.match(/Gecko\/([^\s]*)/);=0A=
                if (m) {=0A=
                    o.gecko=3D1; // Gecko detected, look for revision=0A=
                    m=3Dua.match(/rv:([^\s\)]*)/);=0A=
                    if (m&&m[1]) {=0A=
                        o.gecko=3DparseFloat(m[1]);=0A=
                    }=0A=
                }=0A=
            }=0A=
        }=0A=
    }=0A=
    =0A=
    return o;=0A=
}();=0A=
=0A=
/*=0A=
 * Initializes the global by creating the default namespaces and applying=0A=
 * any new configuration information that is detected.  This is the setup=0A=
 * for env.=0A=
 * @method init=0A=
 * @static=0A=
 * @private=0A=
 */=0A=
(function() {=0A=
    YAHOO.namespace("util", "widget", "example");=0A=
    if ("undefined" !=3D=3D typeof YAHOO_config) {=0A=
        var =
l=3DYAHOO_config.listener,ls=3DYAHOO.env.listeners,unique=3Dtrue,i;=0A=
        if (l) {=0A=
            // if YAHOO is loaded multiple times we need to check to see =
if=0A=
            // this is a new config object.  If it is, add the new =
component=0A=
            // load listener to the stack=0A=
            for (i=3D0;i<ls.length;i=3Di+1) {=0A=
                if (ls[i]=3D=3Dl) {=0A=
                    unique=3Dfalse;=0A=
                    break;=0A=
                }=0A=
            }=0A=
            if (unique) {=0A=
                ls.push(l);=0A=
            }=0A=
        }=0A=
    }=0A=
})();=0A=
/**=0A=
 * Provides the language utilites and extensions used by the library=0A=
 * @class YAHOO.lang=0A=
 */=0A=
YAHOO.lang =3D YAHOO.lang || {=0A=
    /**=0A=
     * Determines whether or not the provided object is an array.=0A=
     * Testing typeof/instanceof/constructor of arrays across frame =0A=
     * boundaries isn't possible in Safari unless you have a reference=0A=
     * to the other frame to test against its Array prototype.  To=0A=
     * handle this case, we test well-known array properties instead.=0A=
     * properties.=0A=
     * @method isArray=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isArray: function(o) { =0A=
        if (o) {=0A=
           var l =3D YAHOO.lang;=0A=
           return l.isNumber(o.length) && l.isFunction(o.splice);=0A=
        }=0A=
        return false;=0A=
    },=0A=
=0A=
    /**=0A=
     * Determines whether or not the provided object is a boolean=0A=
     * @method isBoolean=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isBoolean: function(o) {=0A=
        return typeof o =3D=3D=3D 'boolean';=0A=
    },=0A=
    =0A=
    /**=0A=
     * Determines whether or not the provided object is a function=0A=
     * @method isFunction=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isFunction: function(o) {=0A=
        return typeof o =3D=3D=3D 'function';=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is null=0A=
     * @method isNull=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isNull: function(o) {=0A=
        return o =3D=3D=3D null;=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is a legal number=0A=
     * @method isNumber=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isNumber: function(o) {=0A=
        return typeof o =3D=3D=3D 'number' && isFinite(o);=0A=
    },=0A=
      =0A=
    /**=0A=
     * Determines whether or not the provided object is of type object=0A=
     * or function=0A=
     * @method isObject=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */  =0A=
    isObject: function(o) {=0A=
return (o && (typeof o =3D=3D=3D 'object' || YAHOO.lang.isFunction(o))) =
|| false;=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is a string=0A=
     * @method isString=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isString: function(o) {=0A=
        return typeof o =3D=3D=3D 'string';=0A=
    },=0A=
        =0A=
    /**=0A=
     * Determines whether or not the provided object is undefined=0A=
     * @method isUndefined=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    isUndefined: function(o) {=0A=
        return typeof o =3D=3D=3D 'undefined';=0A=
    },=0A=
    =0A=
    /**=0A=
     * Determines whether or not the property was added=0A=
     * to the object instance.  Returns false if the property is not =
present=0A=
     * in the object, or was inherited from the prototype.=0A=
     * This abstraction is provided to enable hasOwnProperty for Safari =
1.3.x.=0A=
     * There is a discrepancy between YAHOO.lang.hasOwnProperty and=0A=
     * Object.prototype.hasOwnProperty when the property is a primitive =
added to=0A=
     * both the instance AND prototype with the same value:=0A=
     * <pre>=0A=
     * var A =3D function() {};=0A=
     * A.prototype.foo =3D 'foo';=0A=
     * var a =3D new A();=0A=
     * a.foo =3D 'foo';=0A=
     * alert(a.hasOwnProperty('foo')); // true=0A=
     * alert(YAHOO.lang.hasOwnProperty(a, 'foo')); // false when using =
fallback=0A=
     * </pre>=0A=
     * @method hasOwnProperty=0A=
     * @param {any} o The object being testing=0A=
     * @return {boolean} the result=0A=
     */=0A=
    hasOwnProperty: function(o, prop) {=0A=
        if (Object.prototype.hasOwnProperty) {=0A=
            return o.hasOwnProperty(prop);=0A=
        }=0A=
        =0A=
        return !YAHOO.lang.isUndefined(o[prop]) && =0A=
                o.constructor.prototype[prop] !=3D=3D o[prop];=0A=
    },=0A=
 =0A=
    /**=0A=
     * IE will not enumerate native functions in a derived object even =
if the=0A=
     * function was overridden.  This is a workaround for specific =
functions =0A=
     * we care about on the Object prototype. =0A=
     * @property _IEEnumFix=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @static=0A=
     * @private=0A=
     */=0A=
    _IEEnumFix: function(r, s) {=0A=
        if (YAHOO.env.ua.ie) {=0A=
            var add=3D["toString", "valueOf"], i;=0A=
            for (i=3D0;i<add.length;i=3Di+1) {=0A=
                var fname=3Dadd[i],f=3Ds[fname];=0A=
                if (YAHOO.lang.isFunction(f) && =
f!=3DObject.prototype[fname]) {=0A=
                    r[fname]=3Df;=0A=
                }=0A=
            }=0A=
        }=0A=
    },=0A=
       =0A=
    /**=0A=
     * Utility to set up the prototype, constructor and superclass =
properties to=0A=
     * support an inheritance strategy that can chain constructors and =
methods.=0A=
     * Static members will not be inherited.=0A=
     *=0A=
     * @method extend=0A=
     * @static=0A=
     * @param {Function} subc   the object to modify=0A=
     * @param {Function} superc the object to inherit=0A=
     * @param {Object} overrides  additional properties/methods to add =
to the=0A=
     *                              subclass prototype.  These will =
override the=0A=
     *                              matching items obtained from the =
superclass =0A=
     *                              if present.=0A=
     */=0A=
    extend: function(subc, superc, overrides) {=0A=
        if (!superc||!subc) {=0A=
            throw new Error("YAHOO.lang.extend failed, please check that =
" +=0A=
                            "all dependencies are included.");=0A=
        }=0A=
        var F =3D function() {};=0A=
        F.prototype=3Dsuperc.prototype;=0A=
        subc.prototype=3Dnew F();=0A=
        subc.prototype.constructor=3Dsubc;=0A=
        subc.superclass=3Dsuperc.prototype;=0A=
        if (superc.prototype.constructor =3D=3D =
Object.prototype.constructor) {=0A=
            superc.prototype.constructor=3Dsuperc;=0A=
        }=0A=
    =0A=
        if (overrides) {=0A=
            for (var i in overrides) {=0A=
                subc.prototype[i]=3Doverrides[i];=0A=
            }=0A=
=0A=
            YAHOO.lang._IEEnumFix(subc.prototype, overrides);=0A=
        }=0A=
    },=0A=
   =0A=
    /**=0A=
     * Applies all properties in the supplier to the receiver if the=0A=
     * receiver does not have these properties yet.  Optionally, one or =0A=
     * more methods/properties can be specified (as additional =0A=
     * parameters).  This option will overwrite the property if receiver =0A=
     * has it already.  If true is passed as the third parameter, all =0A=
     * properties will be applied and _will_ overwrite properties in =0A=
     * the receiver.=0A=
     *=0A=
     * @method augmentObject=0A=
     * @static=0A=
     * @since 2.3.0=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @param {String*|boolean}  arguments zero or more properties =
methods =0A=
     *        to augment the receiver with.  If none specified, =
everything=0A=
     *        in the supplier will be used unless it would=0A=
     *        overwrite an existing property in the receiver. If true=0A=
     *        is specified as the third parameter, all properties will=0A=
     *        be applied and will overwrite an existing property in=0A=
     *        the receiver=0A=
     */=0A=
    augmentObject: function(r, s) {=0A=
        if (!s||!r) {=0A=
            throw new Error("Absorb failed, verify dependencies.");=0A=
        }=0A=
        var a=3Darguments, i, p, override=3Da[2];=0A=
        if (override && override!=3D=3Dtrue) { // only absorb the =
specified properties=0A=
            for (i=3D2; i<a.length; i=3Di+1) {=0A=
                r[a[i]] =3D s[a[i]];=0A=
            }=0A=
        } else { // take everything, overwriting only if the third =
parameter is true=0A=
            for (p in s) { =0A=
                if (override || !r[p]) {=0A=
                    r[p] =3D s[p];=0A=
                }=0A=
            }=0A=
            =0A=
            YAHOO.lang._IEEnumFix(r, s);=0A=
        }=0A=
    },=0A=
 =0A=
    /**=0A=
     * Same as YAHOO.lang.augmentObject, except it only applies =
prototype properties=0A=
     * @see YAHOO.lang.augmentObject=0A=
     * @method augmentProto=0A=
     * @static=0A=
     * @param {Function} r  the object to receive the augmentation=0A=
     * @param {Function} s  the object that supplies the properties to =
augment=0A=
     * @param {String*|boolean}  arguments zero or more properties =
methods =0A=
     *        to augment the receiver with.  If none specified, =
everything =0A=
     *        in the supplier will be used unless it would overwrite an =
existing =0A=
     *        property in the receiver.  if true is specified as the =
third =0A=
     *        parameter, all properties will be applied and will =
overwrite an =0A=
     *        existing property in the receiver=0A=
     */=0A=
    augmentProto: function(r, s) {=0A=
        if (!s||!r) {=0A=
            throw new Error("Augment failed, verify dependencies.");=0A=
        }=0A=
        //var a=3D[].concat(arguments);=0A=
        var a=3D[r.prototype,s.prototype];=0A=
        for (var i=3D2;i<arguments.length;i=3Di+1) {=0A=
            a.push(arguments[i]);=0A=
        }=0A=
        YAHOO.lang.augmentObject.apply(this, a);=0A=
    },=0A=
=0A=
      =0A=
    /**=0A=
     * Returns a simple string representation of the object or array.=0A=
     * Other types of objects will be returned unprocessed.  Arrays=0A=
     * are expected to be indexed.  Use object notation for=0A=
     * associative arrays.=0A=
     * @method dump=0A=
     * @since 2.3.0=0A=
     * @param o {Object} The object to dump=0A=
     * @param d {int} How deep to recurse child objects, default 3=0A=
     * @return {String} the dump result=0A=
     */=0A=
    dump: function(o, d) {=0A=
        var l=3DYAHOO.lang,i,len,s=3D[],OBJ=3D"{...}",FUN=3D"f(){...}",=0A=
            COMMA=3D', ', ARROW=3D' =3D> ';=0A=
=0A=
        // Cast non-objects to string=0A=
        // Skip dates because the std toString is what we want=0A=
        // Skip HTMLElement-like objects because trying to dump =0A=
        // an element will cause an unhandled exception in FF 2.x=0A=
        if (!l.isObject(o)) {=0A=
            return o + "";=0A=
        } else if (o instanceof Date || ("nodeType" in o && "tagName" in =
o)) {=0A=
            return o;=0A=
        } else if  (l.isFunction(o)) {=0A=
            return FUN;=0A=
        }=0A=
=0A=
        // dig into child objects the depth specifed. Default 3=0A=
        d =3D (l.isNumber(d)) ? d : 3;=0A=
=0A=
        // arrays [1, 2, 3]=0A=
        if (l.isArray(o)) {=0A=
            s.push("[");=0A=
            for (i=3D0,len=3Do.length;i<len;i=3Di+1) {=0A=
                if (l.isObject(o[i])) {=0A=
                    s.push((d > 0) ? l.dump(o[i], d-1) : OBJ);=0A=
                } else {=0A=
                    s.push(o[i]);=0A=
                }=0A=
                s.push(COMMA);=0A=
            }=0A=
            if (s.length > 1) {=0A=
                s.pop();=0A=
            }=0A=
            s.push("]");=0A=
        // objects {k1 =3D> v1, k2 =3D> v2}=0A=
        } else {=0A=
            s.push("{");=0A=
            for (i in o) {=0A=
                if (l.hasOwnProperty(o, i)) {=0A=
                    s.push(i + ARROW);=0A=
                    if (l.isObject(o[i])) {=0A=
                        s.push((d > 0) ? l.dump(o[i], d-1) : OBJ);=0A=
                    } else {=0A=
                        s.push(o[i]);=0A=
                    }=0A=
                    s.push(COMMA);=0A=
                }=0A=
            }=0A=
            if (s.length > 1) {=0A=
                s.pop();=0A=
            }=0A=
            s.push("}");=0A=
        }=0A=
=0A=
        return s.join("");=0A=
    },=0A=
=0A=
    /**=0A=
     * Does variable substitution on a string. It scans through the =
string =0A=
     * looking for expressions enclosed in { } braces. If an expression =0A=
     * is found, it is used a key on the object.  If there is a space in=0A=
     * the key, the first word is used for the key and the rest is =
provided=0A=
     * to an optional function to be used to programatically determine =
the=0A=
     * value (the extra information might be used for this decision). If =0A=
     * the value for the key in the object, or what is returned from the=0A=
     * function has a string value, number value, or object value, it is =0A=
     * substituted for the bracket expression and it repeats.  If this=0A=
     * value is an object, it uses the Object's toString() if this has=0A=
     * been overridden, otherwise it does a shallow dump of the key/value=0A=
     * pairs.=0A=
     * @method substitute=0A=
     * @since 2.3.0=0A=
     * @param s {String} The string that will be modified.=0A=
     * @param o {Object} An object containing the replacement values=0A=
     * @param f {Function} An optional function that can be used to=0A=
     *                     process each match.  It receives the key,=0A=
     *                     value, and any extra metadata included with=0A=
     *                     the key inside of the braces.=0A=
     * @return {String} the substituted string=0A=
     */=0A=
    substitute: function (s, o, f) {=0A=
        var i, j, k, key, v, meta, l=3DYAHOO.lang, saved=3D[], token, =0A=
            DUMP=3D'dump', SPACE=3D' ', LBRACE=3D'{', RBRACE=3D'}';=0A=
=0A=
=0A=
        for (;;) {=0A=
            i =3D s.lastIndexOf(LBRACE);=0A=
            if (i < 0) {=0A=
                break;=0A=
            }=0A=
            j =3D s.indexOf(RBRACE, i);=0A=
            if (i + 1 >=3D j) {=0A=
                break;=0A=
            }=0A=
=0A=
            //Extract key and meta info =0A=
            token =3D s.substring(i + 1, j);=0A=
            key =3D token;=0A=
            meta =3D null;=0A=
            k =3D key.indexOf(SPACE);=0A=
            if (k > -1) {=0A=
                meta =3D key.substring(k + 1);=0A=
                key =3D key.substring(0, k);=0A=
            }=0A=
=0A=
            // lookup the value=0A=
            v =3D o[key];=0A=
=0A=
            // if a substitution function was provided, execute it=0A=
            if (f) {=0A=
                v =3D f(key, v, meta);=0A=
            }=0A=
=0A=
            if (l.isObject(v)) {=0A=
                if (l.isArray(v)) {=0A=
                    v =3D l.dump(v, parseInt(meta, 10));=0A=
                } else {=0A=
                    meta =3D meta || "";=0A=
=0A=
                    // look for the keyword 'dump', if found force obj =
dump=0A=
                    var dump =3D meta.indexOf(DUMP);=0A=
                    if (dump > -1) {=0A=
                        meta =3D meta.substring(4);=0A=
                    }=0A=
=0A=
                    // use the toString if it is not the Object toString =0A=
                    // and the 'dump' meta info was not found=0A=
                    if =
(v.toString=3D=3D=3DObject.prototype.toString||dump>-1) {=0A=
                        v =3D l.dump(v, parseInt(meta, 10));=0A=
                    } else {=0A=
                        v =3D v.toString();=0A=
                    }=0A=
                }=0A=
            } else if (!l.isString(v) && !l.isNumber(v)) {=0A=
                // This {block} has no replace string. Save it for later.=0A=
                v =3D "~-" + saved.length + "-~";=0A=
                saved[saved.length] =3D token;=0A=
=0A=
                // break;=0A=
            }=0A=
=0A=
            s =3D s.substring(0, i) + v + s.substring(j + 1);=0A=
=0A=
=0A=
        }=0A=
=0A=
        // restore saved {block}s=0A=
        for (i=3Dsaved.length-1; i>=3D0; i=3Di-1) {=0A=
            s =3D s.replace(new RegExp("~-" + i + "-~"), "{"  + saved[i] =
+ "}", "g");=0A=
        }=0A=
=0A=
        return s;=0A=
    },=0A=
=0A=
=0A=
    /**=0A=
     * Returns a string without any leading or trailing whitespace.  If =0A=
     * the input is not a string, the input will be returned untouched.=0A=
     * @method trim=0A=
     * @since 2.3.0=0A=
     * @param s {string} the string to trim=0A=
     * @return {string} the trimmed string=0A=
     */=0A=
    trim: function(s){=0A=
        try {=0A=
            return s.replace(/^\s+|\s+$/g, "");=0A=
        } catch(e) {=0A=
            return s;=0A=
        }=0A=
    },=0A=
=0A=
    /**=0A=
     * Returns a new object containing all of the properties of=0A=
     * all the supplied objects.  The properties from later objects=0A=
     * will overwrite those in earlier objects.=0A=
     * @method merge=0A=
     * @since 2.3.0=0A=
     * @param arguments {Object*} the objects to merge=0A=
     * @return the new merged object=0A=
     */=0A=
    merge: function() {=0A=
        var o=3D{}, a=3Darguments;=0A=
        for (var i=3D0, l=3Da.length; i<l; i=3Di+1) {=0A=
            YAHOO.lang.augmentObject(o, a[i], true);=0A=
        }=0A=
        return o;=0A=
    },=0A=
=0A=
    /**=0A=
     * Executes the supplied function in the context of the supplied =0A=
     * object 'when' milliseconds later.  Executes the function a =0A=
     * single time unless periodic is set to true.=0A=
     * @method later=0A=
     * @since 2.4.0=0A=
     * @param when {int} the number of milliseconds to wait until the fn =0A=
     * is executed=0A=
     * @param o the context object=0A=
     * @param fn {Function|String} the function to execute or the name =
of =0A=
     * the method in the 'o' object to execute=0A=
     * @param data [Array] data that is provided to the function.  This =
accepts=0A=
     * either a single item or an array.  If an array is provided, the=0A=
     * function is executed with one parameter for each array item.  If=0A=
     * you need to pass a single array parameter, it needs to be wrapped =
in=0A=
     * an array [myarray]=0A=
     * @param periodic {boolean} if true, executes continuously at =
supplied =0A=
     * interval until canceled=0A=
     * @return a timer object. Call the cancel() method on this object =
to =0A=
     * stop the timer.=0A=
     */=0A=
    later: function(when, o, fn, data, periodic) {=0A=
        when =3D when || 0; =0A=
        o =3D o || {};=0A=
        var m=3Dfn, d=3Ddata, f, r;=0A=
=0A=
        if (YAHOO.lang.isString(fn)) {=0A=
            m =3D o[fn];=0A=
        }=0A=
=0A=
        if (!m) {=0A=
            throw new TypeError("method undefined");=0A=
        }=0A=
=0A=
        if (!YAHOO.lang.isArray(d)) {=0A=
            d =3D [data];=0A=
        }=0A=
=0A=
        f =3D function() {=0A=
            m.apply(o, d);=0A=
        };=0A=
=0A=
        r =3D (periodic) ? setInterval(f, when) : setTimeout(f, when);=0A=
=0A=
        return {=0A=
            interval: periodic,=0A=
            cancel: function() {=0A=
                if (this.interval) {=0A=
                    clearInterval(r);=0A=
                } else {=0A=
                    clearTimeout(r);=0A=
                }=0A=
            }=0A=
        };=0A=
    },=0A=
    =0A=
    /**=0A=
     * A convenience method for detecting a legitimate non-null value.=0A=
     * Returns false for null/undefined/NaN, true for other values, =0A=
     * including 0/false/''=0A=
     * @method isValue=0A=
     * @since 2.3.0=0A=
     * @param o {any} the item to test=0A=
     * @return {boolean} true if it is not null/undefined/NaN || false=0A=
     */=0A=
    isValue: function(o) {=0A=
        // return (o || o =3D=3D=3D false || o =3D=3D=3D 0 || o =
=3D=3D=3D ''); // Infinity fails=0A=
        var l =3D YAHOO.lang;=0A=
return (l.isObject(o) || l.isString(o) || l.isNumber(o) || =
l.isBoolean(o));=0A=
    }=0A=
=0A=
};=0A=
=0A=
/*=0A=
 * An alias for <a href=3D"YAHOO.lang.html">YAHOO.lang</a>=0A=
 * @class YAHOO.util.Lang=0A=
 */=0A=
YAHOO.util.Lang =3D YAHOO.lang;=0A=
 =0A=
/**=0A=
 * Same as YAHOO.lang.augmentObject, except it only applies prototype =0A=
 * properties.  This is an alias for augmentProto.=0A=
 * @see YAHOO.lang.augmentObject=0A=
 * @method augment=0A=
 * @static=0A=
 * @param {Function} r  the object to receive the augmentation=0A=
 * @param {Function} s  the object that supplies the properties to =
augment=0A=
 * @param {String*|boolean}  arguments zero or more properties methods =
to =0A=
 *        augment the receiver with.  If none specified, everything=0A=
 *        in the supplier will be used unless it would=0A=
 *        overwrite an existing property in the receiver.  if true=0A=
 *        is specified as the third parameter, all properties will=0A=
 *        be applied and will overwrite an existing property in=0A=
 *        the receiver=0A=
 */=0A=
YAHOO.lang.augment =3D YAHOO.lang.augmentProto;=0A=
=0A=
/**=0A=
 * An alias for <a =
href=3D"YAHOO.lang.html#augment">YAHOO.lang.augment</a>=0A=
 * @for YAHOO=0A=
 * @method augment=0A=
 * @static=0A=
 * @param {Function} r  the object to receive the augmentation=0A=
 * @param {Function} s  the object that supplies the properties to =
augment=0A=
 * @param {String*}  arguments zero or more properties methods to =0A=
 *        augment the receiver with.  If none specified, everything=0A=
 *        in the supplier will be used unless it would=0A=
 *        overwrite an existing property in the receiver=0A=
 */=0A=
YAHOO.augment =3D YAHOO.lang.augmentProto;=0A=
       =0A=
/**=0A=
 * An alias for <a href=3D"YAHOO.lang.html#extend">YAHOO.lang.extend</a>=0A=
 * @method extend=0A=
 * @static=0A=
 * @param {Function} subc   the object to modify=0A=
 * @param {Function} superc the object to inherit=0A=
 * @param {Object} overrides  additional properties/methods to add to the=0A=
 *        subclass prototype.  These will override the=0A=
 *        matching items obtained from the superclass if present.=0A=
 */=0A=
YAHOO.extend =3D YAHOO.lang.extend;=0A=
=0A=
YAHOO.register("yahoo", YAHOO, {version: "2.5.1", build: "984"});=0A=
/*=0A=
Copyright (c) 2008, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.5.1=0A=
*/=0A=
/**=0A=
 * The dom module provides helper methods for manipulating Dom elements.=0A=
 * @module dom=0A=
 *=0A=
 */=0A=
=0A=
(function() {=0A=
    var Y =3D YAHOO.util,     // internal shorthand=0A=
        getStyle,           // for load time browser branching=0A=
        setStyle,           // ditto=0A=
        propertyCache =3D {}, // for faster hyphen converts=0A=
        reClassNameCache =3D {},          // cache regexes for className=0A=
        document =3D window.document;     // cache for faster lookups=0A=
    =0A=
    YAHOO.env._id_counter =3D YAHOO.env._id_counter || 0;     // for use =
with generateId (global to save state if Dom is overwritten)=0A=
=0A=
    // brower detection=0A=
    var isOpera =3D YAHOO.env.ua.opera,=0A=
        isSafari =3D YAHOO.env.ua.webkit, =0A=
        isGecko =3D YAHOO.env.ua.gecko,=0A=
        isIE =3D YAHOO.env.ua.ie; =0A=
    =0A=
    // regex cache=0A=
    var patterns =3D {=0A=
        HYPHEN: /(-[a-z])/i, // to normalize get/setStyle=0A=
        ROOT_TAG: /^body|html$/i, // body for quirks mode, html for =
standards,=0A=
        OP_SCROLL:/^(?:inline|table-row)$/i=0A=
    };=0A=
=0A=
    var toCamel =3D function(property) {=0A=
        if ( !patterns.HYPHEN.test(property) ) {=0A=
            return property; // no hyphens=0A=
        }=0A=
        =0A=
        if (propertyCache[property]) { // already converted=0A=
            return propertyCache[property];=0A=
        }=0A=
       =0A=
        var converted =3D property;=0A=
 =0A=
        while( patterns.HYPHEN.exec(converted) ) {=0A=
            converted =3D converted.replace(RegExp.$1,=0A=
                    RegExp.$1.substr(1).toUpperCase());=0A=
        }=0A=
        =0A=
        propertyCache[property] =3D converted;=0A=
        return converted;=0A=
        //return property.replace(/-([a-z])/gi, function(m0, m1) {return =
m1.toUpperCase()}) // cant use function as 2nd arg yet due to safari bug=0A=
    };=0A=
    =0A=
    var getClassRegEx =3D function(className) {=0A=
        var re =3D reClassNameCache[className];=0A=
        if (!re) {=0A=
            re =3D new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');=0A=
            reClassNameCache[className] =3D re;=0A=
        }=0A=
        return re;=0A=
    };=0A=
=0A=
    // branching at load instead of runtime=0A=
    if (document.defaultView && document.defaultView.getComputedStyle) { =
// W3C DOM method=0A=
        getStyle =3D function(el, property) {=0A=
            var value =3D null;=0A=
            =0A=
            if (property =3D=3D 'float') { // fix reserved word=0A=
                property =3D 'cssFloat';=0A=
            }=0A=
=0A=
            var computed =3D =
el.ownerDocument.defaultView.getComputedStyle(el, '');=0A=
            if (computed) { // test computed before touching for safari=0A=
                value =3D computed[toCamel(property)];=0A=
            }=0A=
            =0A=
            return el.style[property] || value;=0A=
        };=0A=
    } else if (document.documentElement.currentStyle && isIE) { // IE =
method=0A=
        getStyle =3D function(el, property) {                         =0A=
            switch( toCamel(property) ) {=0A=
                case 'opacity' :// IE opacity uses filter=0A=
                    var val =3D 100;=0A=
                    try { // will error if no DXImageTransform=0A=
                        val =3D =
el.filters['DXImageTransform.Microsoft.Alpha'].opacity;=0A=
=0A=
                    } catch(e) {=0A=
                        try { // make sure its in the document=0A=
                            val =3D el.filters('alpha').opacity;=0A=
                        } catch(e) {=0A=
                        }=0A=
                    }=0A=
                    return val / 100;=0A=
                case 'float': // fix reserved word=0A=
                    property =3D 'styleFloat'; // fall through=0A=
                default: =0A=
                    // test currentStyle before touching=0A=
                    var value =3D el.currentStyle ? =
el.currentStyle[property] : null;=0A=
                    return ( el.style[property] || value );=0A=
            }=0A=
        };=0A=
    } else { // default to inline only=0A=
        getStyle =3D function(el, property) { return el.style[property]; =
};=0A=
    }=0A=
    =0A=
    if (isIE) {=0A=
        setStyle =3D function(el, property, val) {=0A=
            switch (property) {=0A=
                case 'opacity':=0A=
                    if ( YAHOO.lang.isString(el.style.filter) ) { // in =
case not appended=0A=
                        el.style.filter =3D 'alpha(opacity=3D' + val * =
100 + ')';=0A=
                        =0A=
                        if (!el.currentStyle || =
!el.currentStyle.hasLayout) {=0A=
                            el.style.zoom =3D 1; // when no layout or =
cant tell=0A=
                        }=0A=
                    }=0A=
                    break;=0A=
                case 'float':=0A=
                    property =3D 'styleFloat';=0A=
                default:=0A=
                el.style[property] =3D val;=0A=
            }=0A=
        };=0A=
    } else {=0A=
        setStyle =3D function(el, property, val) {=0A=
            if (property =3D=3D 'float') {=0A=
                property =3D 'cssFloat';=0A=
            }=0A=
            el.style[property] =3D val;=0A=
        };=0A=
    }=0A=
=0A=
    var testElement =3D function(node, method) {=0A=
        return node && node.nodeType =3D=3D 1 && ( !method || =
method(node) );=0A=
    };=0A=
=0A=
    /**=0A=
     * Provides helper methods for DOM elements.=0A=
     * @namespace YAHOO.util=0A=
     * @class Dom=0A=
     */=0A=
    YAHOO.util.Dom =3D {=0A=
        /**=0A=
         * Returns an HTMLElement reference.=0A=
         * @method get=0A=
         * @param {String | HTMLElement |Array} el Accepts a string to =
use as an ID for getting a DOM reference, an actual DOM reference, or an =
Array of IDs and/or HTMLElements.=0A=
         * @return {HTMLElement | Array} A DOM reference to an HTML =
element or an array of HTMLElements.=0A=
         */=0A=
        get: function(el) {=0A=
            if (el && (el.nodeType || el.item)) { // Node, or NodeList=0A=
                return el;=0A=
            }=0A=
=0A=
            if (YAHOO.lang.isString(el) || !el) { // id or null=0A=
                return document.getElementById(el);=0A=
            }=0A=
            =0A=
            if (el.length !=3D=3D undefined) { // array-like =0A=
                var c =3D [];=0A=
                for (var i =3D 0, len =3D el.length; i < len; ++i) {=0A=
                    c[c.length] =3D Y.Dom.get(el[i]);=0A=
                }=0A=
                =0A=
                return c;=0A=
            }=0A=
=0A=
            return el; // some other object, just pass it back=0A=
        },=0A=
    =0A=
        /**=0A=
         * Normalizes currentStyle and ComputedStyle.=0A=
         * @method getStyle=0A=
         * @param {String | HTMLElement |Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements.=0A=
         * @param {String} property The style property whose value is =
returned.=0A=
         * @return {String | Array} The current value of the style =
property for the element(s).=0A=
         */=0A=
        getStyle: function(el, property) {=0A=
            property =3D toCamel(property);=0A=
            =0A=
            var f =3D function(element) {=0A=
                return getStyle(element, property);=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
    =0A=
        /**=0A=
         * Wrapper for setting style properties of HTMLElements.  =
Normalizes "opacity" across modern browsers.=0A=
         * @method setStyle=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements.=0A=
         * @param {String} property The style property to be set.=0A=
         * @param {String} val The value to apply to the given property.=0A=
         */=0A=
        setStyle: function(el, property, val) {=0A=
            property =3D toCamel(property);=0A=
            =0A=
            var f =3D function(element) {=0A=
                setStyle(element, property, val);=0A=
                =0A=
            };=0A=
            =0A=
            Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Gets the current position of an element based on page =
coordinates.  Element must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method getXY=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements=0A=
         * @return {Array} The XY position of the element(s)=0A=
         */=0A=
        getXY: function(el) {=0A=
            var f =3D function(el) {=0A=
                // has to be part of document to have pageXY=0A=
                if ( (el.parentNode =3D=3D=3D null || el.offsetParent =
=3D=3D=3D null ||=0A=
                        this.getStyle(el, 'display') =3D=3D 'none') && =
el !=3D el.ownerDocument.body) {=0A=
                    return false;=0A=
                }=0A=
                =0A=
                return getXY(el);=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Gets the current X position of an element based on page =
coordinates.  The element must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method getX=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements=0A=
         * @return {Number | Array} The X position of the element(s)=0A=
         */=0A=
        getX: function(el) {=0A=
            var f =3D function(el) {=0A=
                return Y.Dom.getXY(el)[0];=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Gets the current Y position of an element based on page =
coordinates.  Element must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method getY=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements=0A=
         * @return {Number | Array} The Y position of the element(s)=0A=
         */=0A=
        getY: function(el) {=0A=
            var f =3D function(el) {=0A=
                return Y.Dom.getXY(el)[1];=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Set the position of an html element in page coordinates, =
regardless of how the element is positioned.=0A=
         * The element(s) must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method setXY=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements=0A=
         * @param {Array} pos Contains X & Y values for new position =
(coordinates are page-based)=0A=
         * @param {Boolean} noRetry By default we try and set the =
position a second time if the first fails=0A=
         */=0A=
        setXY: function(el, pos, noRetry) {=0A=
            var f =3D function(el) {=0A=
                var style_pos =3D this.getStyle(el, 'position');=0A=
                if (style_pos =3D=3D 'static') { // default to relative=0A=
                    this.setStyle(el, 'position', 'relative');=0A=
                    style_pos =3D 'relative';=0A=
                }=0A=
=0A=
                var pageXY =3D this.getXY(el);=0A=
                if (pageXY =3D=3D=3D false) { // has to be part of doc =
to have pageXY=0A=
                    return false; =0A=
                }=0A=
                =0A=
                var delta =3D [ // assuming pixels; if not we will have =
to retry=0A=
                    parseInt( this.getStyle(el, 'left'), 10 ),=0A=
                    parseInt( this.getStyle(el, 'top'), 10 )=0A=
                ];=0A=
            =0A=
                if ( isNaN(delta[0]) ) {// in case of 'auto'=0A=
                    delta[0] =3D (style_pos =3D=3D 'relative') ? 0 : =
el.offsetLeft;=0A=
                } =0A=
                if ( isNaN(delta[1]) ) { // in case of 'auto'=0A=
                    delta[1] =3D (style_pos =3D=3D 'relative') ? 0 : =
el.offsetTop;=0A=
                } =0A=
        =0A=
                if (pos[0] !=3D=3D null) { el.style.left =3D pos[0] - =
pageXY[0] + delta[0] + 'px'; }=0A=
                if (pos[1] !=3D=3D null) { el.style.top =3D pos[1] - =
pageXY[1] + delta[1] + 'px'; }=0A=
              =0A=
                if (!noRetry) {=0A=
                    var newXY =3D this.getXY(el);=0A=
=0A=
                    // if retry is true, try one more time if we miss =0A=
                   if ( (pos[0] !=3D=3D null && newXY[0] !=3D pos[0]) || =0A=
                        (pos[1] !=3D=3D null && newXY[1] !=3D pos[1]) ) {=0A=
                       this.setXY(el, pos, true);=0A=
                   }=0A=
                }        =0A=
        =0A=
            };=0A=
            =0A=
            Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Set the X position of an html element in page coordinates, =
regardless of how the element is positioned.=0A=
         * The element must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method setX=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements.=0A=
         * @param {Int} x The value to use as the X coordinate for the =
element(s).=0A=
         */=0A=
        setX: function(el, x) {=0A=
            Y.Dom.setXY(el, [x, null]);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Set the Y position of an html element in page coordinates, =
regardless of how the element is positioned.=0A=
         * The element must be part of the DOM tree to have page =
coordinates (display:none or elements not appended return false).=0A=
         * @method setY=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements.=0A=
         * @param {Int} x To use as the Y coordinate for the element(s).=0A=
         */=0A=
        setY: function(el, y) {=0A=
            Y.Dom.setXY(el, [null, y]);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the region position of the given element.=0A=
         * The element must be part of the DOM tree to have a region =
(display:none or elements not appended return false).=0A=
         * @method getRegion=0A=
         * @param {String | HTMLElement | Array} el Accepts a string to =
use as an ID, an actual DOM reference, or an Array of IDs and/or =
HTMLElements.=0A=
         * @return {Region | Array} A Region or array of Region =
instances containing "top, left, bottom, right" member data.=0A=
         */=0A=
        getRegion: function(el) {=0A=
            var f =3D function(el) {=0A=
                if ( (el.parentNode =3D=3D=3D null || el.offsetParent =
=3D=3D=3D null ||=0A=
                        this.getStyle(el, 'display') =3D=3D 'none') && =
el !=3D el.ownerDocument.body) {=0A=
                    return false;=0A=
                }=0A=
=0A=
                var region =3D Y.Region.getRegion(el);=0A=
                return region;=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the width of the client (viewport).=0A=
         * @method getClientWidth=0A=
         * @deprecated Now using getViewportWidth.  This interface left =
intact for back compat.=0A=
         * @return {Int} The width of the viewable area of the page.=0A=
         */=0A=
        getClientWidth: function() {=0A=
            return Y.Dom.getViewportWidth();=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the height of the client (viewport).=0A=
         * @method getClientHeight=0A=
         * @deprecated Now using getViewportHeight.  This interface left =
intact for back compat.=0A=
         * @return {Int} The height of the viewable area of the page.=0A=
         */=0A=
        getClientHeight: function() {=0A=
            return Y.Dom.getViewportHeight();=0A=
        },=0A=
=0A=
        /**=0A=
         * Returns a array of HTMLElements with the given class.=0A=
         * For optimized performance, include a tag and/or root node =
when possible.=0A=
         * @method getElementsByClassName=0A=
         * @param {String} className The class name to match against=0A=
         * @param {String} tag (optional) The tag name of the elements =
being collected=0A=
         * @param {String | HTMLElement} root (optional) The HTMLElement =
or an ID to use as the starting point =0A=
         * @param {Function} apply (optional) A function to apply to =
each element when found =0A=
         * @return {Array} An array of elements that have the given =
class name=0A=
         */=0A=
        getElementsByClassName: function(className, tag, root, apply) {=0A=
            tag =3D tag || '*';=0A=
            root =3D (root) ? Y.Dom.get(root) : null || document; =0A=
            if (!root) {=0A=
                return [];=0A=
            }=0A=
=0A=
            var nodes =3D [],=0A=
                elements =3D root.getElementsByTagName(tag),=0A=
                re =3D getClassRegEx(className);=0A=
=0A=
            for (var i =3D 0, len =3D elements.length; i < len; ++i) {=0A=
                if ( re.test(elements[i].className) ) {=0A=
                    nodes[nodes.length] =3D elements[i];=0A=
                    if (apply) {=0A=
                        apply.call(elements[i], elements[i]);=0A=
                    }=0A=
                }=0A=
            }=0A=
            =0A=
            return nodes;=0A=
        },=0A=
=0A=
        /**=0A=
         * Determines whether an HTMLElement has the given className.=0A=
         * @method hasClass=0A=
         * @param {String | HTMLElement | Array} el The element or =
collection to test=0A=
         * @param {String} className the class name to search for=0A=
         * @return {Boolean | Array} A boolean value or array of boolean =
values=0A=
         */=0A=
        hasClass: function(el, className) {=0A=
            var re =3D getClassRegEx(className);=0A=
=0A=
            var f =3D function(el) {=0A=
                return re.test(el.className);=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
    =0A=
        /**=0A=
         * Adds a class name to a given element or collection of =
elements.=0A=
         * @method addClass         =0A=
         * @param {String | HTMLElement | Array} el The element or =
collection to add the class to=0A=
         * @param {String} className the class name to add to the class =
attribute=0A=
         * @return {Boolean | Array} A pass/fail boolean or array of =
booleans=0A=
         */=0A=
        addClass: function(el, className) {=0A=
            var f =3D function(el) {=0A=
                if (this.hasClass(el, className)) {=0A=
                    return false; // already present=0A=
                }=0A=
                =0A=
                =0A=
                el.className =3D YAHOO.lang.trim([el.className, =
className].join(' '));=0A=
                return true;=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
    =0A=
        /**=0A=
         * Removes a class name from a given element or collection of =
elements.=0A=
         * @method removeClass         =0A=
         * @param {String | HTMLElement | Array} el The element or =
collection to remove the class from=0A=
         * @param {String} className the class name to remove from the =
class attribute=0A=
         * @return {Boolean | Array} A pass/fail boolean or array of =
booleans=0A=
         */=0A=
        removeClass: function(el, className) {=0A=
            var re =3D getClassRegEx(className);=0A=
            =0A=
            var f =3D function(el) {=0A=
                if (!className || !this.hasClass(el, className)) {=0A=
                    return false; // not present=0A=
                }                 =0A=
=0A=
                =0A=
                var c =3D el.className;=0A=
                el.className =3D c.replace(re, ' ');=0A=
                if ( this.hasClass(el, className) ) { // in case of =
multiple adjacent=0A=
                    this.removeClass(el, className);=0A=
                }=0A=
=0A=
                el.className =3D YAHOO.lang.trim(el.className); // =
remove any trailing spaces=0A=
                return true;=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Replace a class with another class for a given element or =
collection of elements.=0A=
         * If no oldClassName is present, the newClassName is simply =
added.=0A=
         * @method replaceClass  =0A=
         * @param {String | HTMLElement | Array} el The element or =
collection to remove the class from=0A=
         * @param {String} oldClassName the class name to be replaced=0A=
         * @param {String} newClassName the class name that will be =
replacing the old class name=0A=
         * @return {Boolean | Array} A pass/fail boolean or array of =
booleans=0A=
         */=0A=
        replaceClass: function(el, oldClassName, newClassName) {=0A=
            if (!newClassName || oldClassName =3D=3D=3D newClassName) { =
// avoid infinite loop=0A=
                return false;=0A=
            }=0A=
            =0A=
            var re =3D getClassRegEx(oldClassName);=0A=
=0A=
            var f =3D function(el) {=0A=
            =0A=
                if ( !this.hasClass(el, oldClassName) ) {=0A=
                    this.addClass(el, newClassName); // just add it if =
nothing to replace=0A=
                    return true; // NOTE: return=0A=
                }=0A=
            =0A=
                el.className =3D el.className.replace(re, ' ' + =
newClassName + ' ');=0A=
=0A=
                if ( this.hasClass(el, oldClassName) ) { // in case of =
multiple adjacent=0A=
                    this.replaceClass(el, oldClassName, newClassName);=0A=
                }=0A=
=0A=
                el.className =3D YAHOO.lang.trim(el.className); // =
remove any trailing spaces=0A=
                return true;=0A=
            };=0A=
            =0A=
            return Y.Dom.batch(el, f, Y.Dom, true);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns an ID and applies it to the element "el", if provided.=0A=
         * @method generateId  =0A=
         * @param {String | HTMLElement | Array} el (optional) An =
optional element array of elements to add an ID to (no ID is added if =
one is already present).=0A=
         * @param {String} prefix (optional) an optional prefix to use =
(defaults to "yui-gen").=0A=
         * @return {String | Array} The generated ID, or array of =
generated IDs (or original ID if already present on an element)=0A=
         */=0A=
        generateId: function(el, prefix) {=0A=
            prefix =3D prefix || 'yui-gen';=0A=
=0A=
            var f =3D function(el) {=0A=
                if (el && el.id) { // do not override existing ID=0A=
                    return el.id;=0A=
                } =0A=
=0A=
                var id =3D prefix + YAHOO.env._id_counter++;=0A=
=0A=
                if (el) {=0A=
                    el.id =3D id;=0A=
                }=0A=
                =0A=
                return id;=0A=
            };=0A=
=0A=
            // batch fails when no element, so just generate and return =
single ID=0A=
            return Y.Dom.batch(el, f, Y.Dom, true) || f.apply(Y.Dom, =
arguments);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Determines whether an HTMLElement is an ancestor of another =
HTML element in the DOM hierarchy.=0A=
         * @method isAncestor=0A=
         * @param {String | HTMLElement} haystack The possible ancestor=0A=
         * @param {String | HTMLElement} needle The possible descendent=0A=
         * @return {Boolean} Whether or not the haystack is an ancestor =
of needle=0A=
         */=0A=
        isAncestor: function(haystack, needle) {=0A=
            haystack =3D Y.Dom.get(haystack);=0A=
            needle =3D Y.Dom.get(needle);=0A=
            =0A=
            if (!haystack || !needle) {=0A=
                return false;=0A=
            }=0A=
=0A=
            if (haystack.contains && needle.nodeType && !isSafari) { // =
safari contains is broken=0A=
                return haystack.contains(needle);=0A=
            }=0A=
            else if ( haystack.compareDocumentPosition && =
needle.nodeType ) {=0A=
                return !!(haystack.compareDocumentPosition(needle) & 16);=0A=
            } else if (needle.nodeType) {=0A=
                // fallback to crawling up (safari)=0A=
                return !!this.getAncestorBy(needle, function(el) {=0A=
                    return el =3D=3D haystack; =0A=
                }); =0A=
            }=0A=
            return false;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Determines whether an HTMLElement is present in the current =
document.=0A=
         * @method inDocument         =0A=
         * @param {String | HTMLElement} el The element to search for=0A=
         * @return {Boolean} Whether or not the element is present in =
the current document=0A=
         */=0A=
        inDocument: function(el) {=0A=
            return this.isAncestor(document.documentElement, el);=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns a array of HTMLElements that pass the test applied by =
supplied boolean method.=0A=
         * For optimized performance, include a tag and/or root node =
when possible.=0A=
         * @method getElementsBy=0A=
         * @param {Function} method - A boolean method for testing =
elements which receives the element as its only argument.=0A=
         * @param {String} tag (optional) The tag name of the elements =
being collected=0A=
         * @param {String | HTMLElement} root (optional) The HTMLElement =
or an ID to use as the starting point =0A=
         * @param {Function} apply (optional) A function to apply to =
each element when found =0A=
         * @return {Array} Array of HTMLElements=0A=
         */=0A=
        getElementsBy: function(method, tag, root, apply) {=0A=
            tag =3D tag || '*';=0A=
            root =3D (root) ? Y.Dom.get(root) : null || document; =0A=
=0A=
            if (!root) {=0A=
                return [];=0A=
            }=0A=
=0A=
            var nodes =3D [],=0A=
                elements =3D root.getElementsByTagName(tag);=0A=
            =0A=
            for (var i =3D 0, len =3D elements.length; i < len; ++i) {=0A=
                if ( method(elements[i]) ) {=0A=
                    nodes[nodes.length] =3D elements[i];=0A=
                    if (apply) {=0A=
                        apply(elements[i]);=0A=
                    }=0A=
                }=0A=
            }=0A=
=0A=
            =0A=
            return nodes;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Runs the supplied method against each item in the =
Collection/Array.=0A=
         * The method is called with the element(s) as the first arg, =
and the optional param as the second ( method(el, o) ).=0A=
         * @method batch=0A=
         * @param {String | HTMLElement | Array} el (optional) An =
element or array of elements to apply the method to=0A=
         * @param {Function} method The method to apply to the element(s)=0A=
         * @param {Any} o (optional) An optional arg that is passed to =
the supplied method=0A=
         * @param {Boolean} override (optional) Whether or not to =
override the scope of "method" with "o"=0A=
         * @return {Any | Array} The return value(s) from the supplied =
method=0A=
         */=0A=
        batch: function(el, method, o, override) {=0A=
            el =3D (el && (el.tagName || el.item)) ? el : Y.Dom.get(el); =
// skip get() when possible=0A=
=0A=
            if (!el || !method) {=0A=
                return false;=0A=
            } =0A=
            var scope =3D (override) ? o : window;=0A=
            =0A=
            if (el.tagName || el.length =3D=3D=3D undefined) { // =
element or not array-like =0A=
                return method.call(scope, el, o);=0A=
            } =0A=
=0A=
            var collection =3D [];=0A=
            =0A=
            for (var i =3D 0, len =3D el.length; i < len; ++i) {=0A=
                collection[collection.length] =3D method.call(scope, =
el[i], o);=0A=
            }=0A=
            =0A=
            return collection;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the height of the document.=0A=
         * @method getDocumentHeight=0A=
         * @return {Int} The height of the actual document (which =
includes the body and its margin).=0A=
         */=0A=
        getDocumentHeight: function() {=0A=
            var scrollHeight =3D (document.compatMode !=3D 'CSS1Compat') =
? document.body.scrollHeight : document.documentElement.scrollHeight;=0A=
=0A=
            var h =3D Math.max(scrollHeight, Y.Dom.getViewportHeight());=0A=
            return h;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the width of the document.=0A=
         * @method getDocumentWidth=0A=
         * @return {Int} The width of the actual document (which =
includes the body and its margin).=0A=
         */=0A=
        getDocumentWidth: function() {=0A=
            var scrollWidth =3D (document.compatMode !=3D 'CSS1Compat') =
? document.body.scrollWidth : document.documentElement.scrollWidth;=0A=
            var w =3D Math.max(scrollWidth, Y.Dom.getViewportWidth());=0A=
            return w;=0A=
        },=0A=
=0A=
        /**=0A=
         * Returns the current height of the viewport.=0A=
         * @method getViewportHeight=0A=
         * @return {Int} The height of the viewable area of the page =
(excludes scrollbars).=0A=
         */=0A=
        getViewportHeight: function() {=0A=
            var height =3D self.innerHeight; // Safari, Opera=0A=
            var mode =3D document.compatMode;=0A=
        =0A=
            if ( (mode || isIE) && !isOpera ) { // IE, Gecko=0A=
                height =3D (mode =3D=3D 'CSS1Compat') ?=0A=
                        document.documentElement.clientHeight : // =
Standards=0A=
                        document.body.clientHeight; // Quirks=0A=
            }=0A=
        =0A=
            return height;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the current width of the viewport.=0A=
         * @method getViewportWidth=0A=
         * @return {Int} The width of the viewable area of the page =
(excludes scrollbars).=0A=
         */=0A=
        =0A=
        getViewportWidth: function() {=0A=
            var width =3D self.innerWidth;  // Safari=0A=
            var mode =3D document.compatMode;=0A=
            =0A=
            if (mode || isIE) { // IE, Gecko, Opera=0A=
                width =3D (mode =3D=3D 'CSS1Compat') ?=0A=
                        document.documentElement.clientWidth : // =
Standards=0A=
                        document.body.clientWidth; // Quirks=0A=
            }=0A=
            return width;=0A=
        },=0A=
=0A=
       /**=0A=
         * Returns the nearest ancestor that passes the test applied by =
supplied boolean method.=0A=
         * For performance reasons, IDs are not accepted and argument =
validation omitted.=0A=
         * @method getAncestorBy=0A=
         * @param {HTMLElement} node The HTMLElement to use as the =
starting point =0A=
         * @param {Function} method - A boolean method for testing =
elements which receives the element as its only argument.=0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getAncestorBy: function(node, method) {=0A=
            while (node =3D node.parentNode) { // NOTE: assignment=0A=
                if ( testElement(node, method) ) {=0A=
                    return node;=0A=
                }=0A=
            } =0A=
=0A=
            return null;=0A=
        },=0A=
        =0A=
        /**=0A=
         * Returns the nearest ancestor with the given className.=0A=
         * @method getAncestorByClassName=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @param {String} className=0A=
         * @return {Object} HTMLElement=0A=
         */=0A=
        getAncestorByClassName: function(node, className) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
            var method =3D function(el) { return Y.Dom.hasClass(el, =
className); };=0A=
            return Y.Dom.getAncestorBy(node, method);=0A=
        },=0A=
=0A=
        /**=0A=
         * Returns the nearest ancestor with the given tagName.=0A=
         * @method getAncestorByTagName=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @param {String} tagName=0A=
         * @return {Object} HTMLElement=0A=
         */=0A=
        getAncestorByTagName: function(node, tagName) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
            var method =3D function(el) {=0A=
                 return el.tagName && el.tagName.toUpperCase() =3D=3D =
tagName.toUpperCase();=0A=
            };=0A=
=0A=
            return Y.Dom.getAncestorBy(node, method);=0A=
        },=0A=
=0A=
        /**=0A=
         * Returns the previous sibling that is an HTMLElement. =0A=
         * For performance reasons, IDs are not accepted and argument =
validation omitted.=0A=
         * Returns the nearest HTMLElement sibling if no method provided.=0A=
         * @method getPreviousSiblingBy=0A=
         * @param {HTMLElement} node The HTMLElement to use as the =
starting point =0A=
         * @param {Function} method A boolean function used to test =
siblings=0A=
         * that receives the sibling node being tested as its only =
argument=0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getPreviousSiblingBy: function(node, method) {=0A=
            while (node) {=0A=
                node =3D node.previousSibling;=0A=
                if ( testElement(node, method) ) {=0A=
                    return node;=0A=
                }=0A=
            }=0A=
            return null;=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the previous sibling that is an HTMLElement =0A=
         * @method getPreviousSibling=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getPreviousSibling: function(node) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
=0A=
            return Y.Dom.getPreviousSiblingBy(node);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the next HTMLElement sibling that passes the boolean =
method. =0A=
         * For performance reasons, IDs are not accepted and argument =
validation omitted.=0A=
         * Returns the nearest HTMLElement sibling if no method provided.=0A=
         * @method getNextSiblingBy=0A=
         * @param {HTMLElement} node The HTMLElement to use as the =
starting point =0A=
         * @param {Function} method A boolean function used to test =
siblings=0A=
         * that receives the sibling node being tested as its only =
argument=0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getNextSiblingBy: function(node, method) {=0A=
            while (node) {=0A=
                node =3D node.nextSibling;=0A=
                if ( testElement(node, method) ) {=0A=
                    return node;=0A=
                }=0A=
            }=0A=
            return null;=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the next sibling that is an HTMLElement =0A=
         * @method getNextSibling=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getNextSibling: function(node) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
=0A=
            return Y.Dom.getNextSiblingBy(node);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the first HTMLElement child that passes the test =
method. =0A=
         * @method getFirstChildBy=0A=
         * @param {HTMLElement} node The HTMLElement to use as the =
starting point =0A=
         * @param {Function} method A boolean function used to test =
children=0A=
         * that receives the node being tested as its only argument=0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getFirstChildBy: function(node, method) {=0A=
            var child =3D ( testElement(node.firstChild, method) ) ? =
node.firstChild : null;=0A=
            return child || Y.Dom.getNextSiblingBy(node.firstChild, =
method);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the first HTMLElement child. =0A=
         * @method getFirstChild=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getFirstChild: function(node, method) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
            return Y.Dom.getFirstChildBy(node);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the last HTMLElement child that passes the test =
method. =0A=
         * @method getLastChildBy=0A=
         * @param {HTMLElement} node The HTMLElement to use as the =
starting point =0A=
         * @param {Function} method A boolean function used to test =
children=0A=
         * that receives the node being tested as its only argument=0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getLastChildBy: function(node, method) {=0A=
            if (!node) {=0A=
                return null;=0A=
            }=0A=
            var child =3D ( testElement(node.lastChild, method) ) ? =
node.lastChild : null;=0A=
            return child || Y.Dom.getPreviousSiblingBy(node.lastChild, =
method);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the last HTMLElement child. =0A=
         * @method getLastChild=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @return {Object} HTMLElement or null if not found=0A=
         */=0A=
        getLastChild: function(node) {=0A=
            node =3D Y.Dom.get(node);=0A=
            return Y.Dom.getLastChildBy(node);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns an array of HTMLElement childNodes that pass the test =
method. =0A=
         * @method getChildrenBy=0A=
         * @param {HTMLElement} node The HTMLElement to start from=0A=
         * @param {Function} method A boolean function used to test =
children=0A=
         * that receives the node being tested as its only argument=0A=
         * @return {Array} A static array of HTMLElements=0A=
         */=0A=
        getChildrenBy: function(node, method) {=0A=
            var child =3D Y.Dom.getFirstChildBy(node, method);=0A=
            var children =3D child ? [child] : [];=0A=
=0A=
            Y.Dom.getNextSiblingBy(child, function(node) {=0A=
                if ( !method || method(node) ) {=0A=
                    children[children.length] =3D node;=0A=
                }=0A=
                return false; // fail test to collect all children=0A=
            });=0A=
=0A=
            return children;=0A=
        },=0A=
 =0A=
        /**=0A=
         * Returns an array of HTMLElement childNodes. =0A=
         * @method getChildren=0A=
         * @param {String | HTMLElement} node The HTMLElement or an ID =
to use as the starting point =0A=
         * @return {Array} A static array of HTMLElements=0A=
         */=0A=
        getChildren: function(node) {=0A=
            node =3D Y.Dom.get(node);=0A=
            if (!node) {=0A=
            }=0A=
=0A=
            return Y.Dom.getChildrenBy(node);=0A=
        },=0A=
 =0A=
        /**=0A=
         * Returns the left scroll value of the document =0A=
         * @method getDocumentScrollLeft=0A=
         * @param {HTMLDocument} document (optional) The document to get =
the scroll value of=0A=
         * @return {Int}  The amount that the document is scrolled to =
the left=0A=
         */=0A=
        getDocumentScrollLeft: function(doc) {=0A=
            doc =3D doc || document;=0A=
            return Math.max(doc.documentElement.scrollLeft, =
doc.body.scrollLeft);=0A=
        }, =0A=
=0A=
        /**=0A=
         * Returns the top scroll value of the document =0A=
         * @method getDocumentScrollTop=0A=
         * @param {HTMLDocument} document (optional) The document to get =
the scroll value of=0A=
         * @return {Int}  The amount that the document is scrolled to =
the top=0A=
         */=0A=
        getDocumentScrollTop: function(doc) {=0A=
            doc =3D doc || document;=0A=
            return Math.max(doc.documentElement.scrollTop, =
doc.body.scrollTop);=0A=
        },=0A=
=0A=
        /**=0A=
         * Inserts the new node as the previous sibling of the reference =
node =0A=
         * @method insertBefore=0A=
         * @param {String | HTMLElement} newNode The node to be inserted=0A=
         * @param {String | HTMLElement} referenceNode The node to =
insert the new node before =0A=
         * @return {HTMLElement} The node that was inserted (or null if =
insert fails) =0A=
         */=0A=
        insertBefore: function(newNode, referenceNode) {=0A=
            newNode =3D Y.Dom.get(newNode); =0A=
            referenceNode =3D Y.Dom.get(referenceNode); =0A=
            =0A=
            if (!newNode || !referenceNode || !referenceNode.parentNode) =
{=0A=
                return null;=0A=
            }       =0A=
=0A=
            return referenceNode.parentNode.insertBefore(newNode, =
referenceNode); =0A=
        },=0A=
=0A=
        /**=0A=
         * Inserts the new node as the next sibling of the reference =
node =0A=
         * @method insertAfter=0A=
         * @param {String | HTMLElement} newNode The node to be inserted=0A=
         * @param {String | HTMLElement} referenceNode The node to =
insert the new node after =0A=
         * @return {HTMLElement} The node that was inserted (or null if =
insert fails) =0A=
         */=0A=
        insertAfter: function(newNode, referenceNode) {=0A=
            newNode =3D Y.Dom.get(newNode); =0A=
            referenceNode =3D Y.Dom.get(referenceNode); =0A=
            =0A=
            if (!newNode || !referenceNode || !referenceNode.parentNode) =
{=0A=
                return null;=0A=
            }       =0A=
=0A=
            if (referenceNode.nextSibling) {=0A=
                return referenceNode.parentNode.insertBefore(newNode, =
referenceNode.nextSibling); =0A=
            } else {=0A=
                return referenceNode.parentNode.appendChild(newNode);=0A=
            }=0A=
        },=0A=
=0A=
        /**=0A=
         * Creates a Region based on the viewport relative to the =
document. =0A=
         * @method getClientRegion=0A=
         * @return {Region} A Region object representing the viewport =
which accounts for document scroll=0A=
         */=0A=
        getClientRegion: function() {=0A=
            var t =3D Y.Dom.getDocumentScrollTop(),=0A=
                l =3D Y.Dom.getDocumentScrollLeft(),=0A=
                r =3D Y.Dom.getViewportWidth() + l,=0A=
                b =3D Y.Dom.getViewportHeight() + t;=0A=
=0A=
            return new Y.Region(t, r, b, l);=0A=
        }=0A=
    };=0A=
    =0A=
    var getXY =3D function() {=0A=
        if (document.documentElement.getBoundingClientRect) { // IE=0A=
            return function(el) {=0A=
                var box =3D el.getBoundingClientRect();=0A=
=0A=
                var rootNode =3D el.ownerDocument;=0A=
                return [box.left + =
Y.Dom.getDocumentScrollLeft(rootNode), box.top +=0A=
                        Y.Dom.getDocumentScrollTop(rootNode)];=0A=
            };=0A=
        } else {=0A=
            return function(el) { // manually calculate by crawling up =
offsetParents=0A=
                var pos =3D [el.offsetLeft, el.offsetTop];=0A=
                var parentNode =3D el.offsetParent;=0A=
=0A=
                // safari: subtract body offsets if el is abs (or any =
offsetParent), unless body is offsetParent=0A=
                var accountForBody =3D (isSafari &&=0A=
                        Y.Dom.getStyle(el, 'position') =3D=3D 'absolute' =
&&=0A=
                        el.offsetParent =3D=3D el.ownerDocument.body);=0A=
=0A=
                if (parentNode !=3D el) {=0A=
                    while (parentNode) {=0A=
                        pos[0] +=3D parentNode.offsetLeft;=0A=
                        pos[1] +=3D parentNode.offsetTop;=0A=
                        if (!accountForBody && isSafari && =0A=
                                Y.Dom.getStyle(parentNode,'position') =
=3D=3D 'absolute' ) { =0A=
                            accountForBody =3D true;=0A=
                        }=0A=
                        parentNode =3D parentNode.offsetParent;=0A=
                    }=0A=
                }=0A=
=0A=
                if (accountForBody) { //safari doubles in this case=0A=
                    pos[0] -=3D el.ownerDocument.body.offsetLeft;=0A=
                    pos[1] -=3D el.ownerDocument.body.offsetTop;=0A=
                } =0A=
                parentNode =3D el.parentNode;=0A=
=0A=
                // account for any scrolled ancestors=0A=
                while ( parentNode.tagName && =
!patterns.ROOT_TAG.test(parentNode.tagName) ) =0A=
                {=0A=
                    if (parentNode.scrollTop || parentNode.scrollLeft) {=0A=
                        // work around opera inline/table scrollLeft/Top =
bug (false reports offset as scroll)=0A=
                        if =
(!patterns.OP_SCROLL.test(Y.Dom.getStyle(parentNode, 'display'))) { =0A=
                            if (!isOpera || Y.Dom.getStyle(parentNode, =
'overflow') !=3D=3D 'visible') { // opera inline-block misreports when =
visible=0A=
                                pos[0] -=3D parentNode.scrollLeft;=0A=
                                pos[1] -=3D parentNode.scrollTop;=0A=
                            }=0A=
                        }=0A=
                    }=0A=
                    =0A=
                    parentNode =3D parentNode.parentNode; =0A=
                }=0A=
=0A=
                return pos;=0A=
            };=0A=
        }=0A=
    }() // NOTE: Executing for loadtime branching=0A=
})();=0A=
/**=0A=
 * A region is a representation of an object on a grid.  It is defined=0A=
 * by the top, right, bottom, left extents, so is rectangular by =
default.  If =0A=
 * other shapes are required, this class could be extended to support it.=0A=
 * @namespace YAHOO.util=0A=
 * @class Region=0A=
 * @param {Int} t the top extent=0A=
 * @param {Int} r the right extent=0A=
 * @param {Int} b the bottom extent=0A=
 * @param {Int} l the left extent=0A=
 * @constructor=0A=
 */=0A=
YAHOO.util.Region =3D function(t, r, b, l) {=0A=
=0A=
    /**=0A=
     * The region's top extent=0A=
     * @property top=0A=
     * @type Int=0A=
     */=0A=
    this.top =3D t;=0A=
    =0A=
    /**=0A=
     * The region's top extent as index, for symmetry with set/getXY=0A=
     * @property 1=0A=
     * @type Int=0A=
     */=0A=
    this[1] =3D t;=0A=
=0A=
    /**=0A=
     * The region's right extent=0A=
     * @property right=0A=
     * @type int=0A=
     */=0A=
    this.right =3D r;=0A=
=0A=
    /**=0A=
     * The region's bottom extent=0A=
     * @property bottom=0A=
     * @type Int=0A=
     */=0A=
    this.bottom =3D b;=0A=
=0A=
    /**=0A=
     * The region's left extent=0A=
     * @property left=0A=
     * @type Int=0A=
     */=0A=
    this.left =3D l;=0A=
    =0A=
    /**=0A=
     * The region's left extent as index, for symmetry with set/getXY=0A=
     * @property 0=0A=
     * @type Int=0A=
     */=0A=
    this[0] =3D l;=0A=
};=0A=
=0A=
/**=0A=
 * Returns true if this region contains the region passed in=0A=
 * @method contains=0A=
 * @param  {Region}  region The region to evaluate=0A=
 * @return {Boolean}        True if the region is contained with this =
region, =0A=
 *                          else false=0A=
 */=0A=
YAHOO.util.Region.prototype.contains =3D function(region) {=0A=
    return ( region.left   >=3D this.left   && =0A=
             region.right  <=3D this.right  && =0A=
             region.top    >=3D this.top    && =0A=
             region.bottom <=3D this.bottom    );=0A=
=0A=
};=0A=
=0A=
/**=0A=
 * Returns the area of the region=0A=
 * @method getArea=0A=
 * @return {Int} the region's area=0A=
 */=0A=
YAHOO.util.Region.prototype.getArea =3D function() {=0A=
    return ( (this.bottom - this.top) * (this.right - this.left) );=0A=
};=0A=
=0A=
/**=0A=
 * Returns the region where the passed in region overlaps with this one=0A=
 * @method intersect=0A=
 * @param  {Region} region The region that intersects=0A=
 * @return {Region}        The overlap region, or null if there is no =
overlap=0A=
 */=0A=
YAHOO.util.Region.prototype.intersect =3D function(region) {=0A=
    var t =3D Math.max( this.top,    region.top    );=0A=
    var r =3D Math.min( this.right,  region.right  );=0A=
    var b =3D Math.min( this.bottom, region.bottom );=0A=
    var l =3D Math.max( this.left,   region.left   );=0A=
    =0A=
    if (b >=3D t && r >=3D l) {=0A=
        return new YAHOO.util.Region(t, r, b, l);=0A=
    } else {=0A=
        return null;=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * Returns the region representing the smallest region that can contain =
both=0A=
 * the passed in region and this region.=0A=
 * @method union=0A=
 * @param  {Region} region The region that to create the union with=0A=
 * @return {Region}        The union region=0A=
 */=0A=
YAHOO.util.Region.prototype.union =3D function(region) {=0A=
    var t =3D Math.min( this.top,    region.top    );=0A=
    var r =3D Math.max( this.right,  region.right  );=0A=
    var b =3D Math.max( this.bottom, region.bottom );=0A=
    var l =3D Math.min( this.left,   region.left   );=0A=
=0A=
    return new YAHOO.util.Region(t, r, b, l);=0A=
};=0A=
=0A=
/**=0A=
 * toString=0A=
 * @method toString=0A=
 * @return string the region properties=0A=
 */=0A=
YAHOO.util.Region.prototype.toString =3D function() {=0A=
    return ( "Region {"    +=0A=
             "top: "       + this.top    + =0A=
             ", right: "   + this.right  + =0A=
             ", bottom: "  + this.bottom + =0A=
             ", left: "    + this.left   + =0A=
             "}" );=0A=
};=0A=
=0A=
/**=0A=
 * Returns a region that is occupied by the DOM element=0A=
 * @method getRegion=0A=
 * @param  {HTMLElement} el The element=0A=
 * @return {Region}         The region that the element occupies=0A=
 * @static=0A=
 */=0A=
YAHOO.util.Region.getRegion =3D function(el) {=0A=
    var p =3D YAHOO.util.Dom.getXY(el);=0A=
=0A=
    var t =3D p[1];=0A=
    var r =3D p[0] + el.offsetWidth;=0A=
    var b =3D p[1] + el.offsetHeight;=0A=
    var l =3D p[0];=0A=
=0A=
    return new YAHOO.util.Region(t, r, b, l);=0A=
};=0A=
=0A=
/////////////////////////////////////////////////////////////////////////=
////=0A=
=0A=
=0A=
/**=0A=
 * A point is a region that is special in that it represents a single =
point on =0A=
 * the grid.=0A=
 * @namespace YAHOO.util=0A=
 * @class Point=0A=
 * @param {Int} x The X position of the point=0A=
 * @param {Int} y The Y position of the point=0A=
 * @constructor=0A=
 * @extends YAHOO.util.Region=0A=
 */=0A=
YAHOO.util.Point =3D function(x, y) {=0A=
   if (YAHOO.lang.isArray(x)) { // accept input from Dom.getXY, =
Event.getXY, etc.=0A=
      y =3D x[1]; // dont blow away x yet=0A=
      x =3D x[0];=0A=
   }=0A=
   =0A=
    /**=0A=
     * The X position of the point, which is also the right, left and =
index zero (for Dom.getXY symmetry)=0A=
     * @property x=0A=
     * @type Int=0A=
     */=0A=
=0A=
    this.x =3D this.right =3D this.left =3D this[0] =3D x;=0A=
     =0A=
    /**=0A=
     * The Y position of the point, which is also the top, bottom and =
index one (for Dom.getXY symmetry)=0A=
     * @property y=0A=
     * @type Int=0A=
     */=0A=
    this.y =3D this.top =3D this.bottom =3D this[1] =3D y;=0A=
};=0A=
=0A=
YAHOO.util.Point.prototype =3D new YAHOO.util.Region();=0A=
=0A=
YAHOO.register("dom", YAHOO.util.Dom, {version: "2.5.1", build: "984"});=0A=
/*=0A=
Copyright (c) 2008, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.5.1=0A=
*/=0A=
=0A=
/**=0A=
 * The CustomEvent class lets you define events for your application=0A=
 * that can be subscribed to by one or more independent component.=0A=
 *=0A=
 * @param {String}  type The type of event, which is passed to the =
callback=0A=
 *                  when the event fires=0A=
 * @param {Object}  oScope The context the event will fire from.  "this" =
will=0A=
 *                  refer to this object in the callback.  Default =
value: =0A=
 *                  the window object.  The listener can override this.=0A=
 * @param {boolean} silent pass true to prevent the event from writing to=0A=
 *                  the debugsystem=0A=
 * @param {int}     signature the signature that the custom event =
subscriber=0A=
 *                  will receive. YAHOO.util.CustomEvent.LIST or =0A=
 *                  YAHOO.util.CustomEvent.FLAT.  The default is=0A=
 *                  YAHOO.util.CustomEvent.LIST.=0A=
 * @namespace YAHOO.util=0A=
 * @class CustomEvent=0A=
 * @constructor=0A=
 */=0A=
YAHOO.util.CustomEvent =3D function(type, oScope, silent, signature) {=0A=
=0A=
    /**=0A=
     * The type of event, returned to subscribers when the event fires=0A=
     * @property type=0A=
     * @type string=0A=
     */=0A=
    this.type =3D type;=0A=
=0A=
    /**=0A=
     * The scope the the event will fire from by default.  Defaults to =
the window =0A=
     * obj=0A=
     * @property scope=0A=
     * @type object=0A=
     */=0A=
    this.scope =3D oScope || window;=0A=
=0A=
    /**=0A=
     * By default all custom events are logged in the debug build, set =
silent=0A=
     * to true to disable debug outpu for this event.=0A=
     * @property silent=0A=
     * @type boolean=0A=
     */=0A=
    this.silent =3D silent;=0A=
=0A=
    /**=0A=
     * Custom events support two styles of arguments provided to the =
event=0A=
     * subscribers.  =0A=
     * <ul>=0A=
     * <li>YAHOO.util.CustomEvent.LIST: =0A=
     *   <ul>=0A=
     *   <li>param1: event name</li>=0A=
     *   <li>param2: array of arguments sent to fire</li>=0A=
     *   <li>param3: <optional> a custom object supplied by the =
subscriber</li>=0A=
     *   </ul>=0A=
     * </li>=0A=
     * <li>YAHOO.util.CustomEvent.FLAT=0A=
     *   <ul>=0A=
     *   <li>param1: the first argument passed to fire.  If you need to=0A=
     *           pass multiple parameters, use and array or object =
literal</li>=0A=
     *   <li>param2: <optional> a custom object supplied by the =
subscriber</li>=0A=
     *   </ul>=0A=
     * </li>=0A=
     * </ul>=0A=
     *   @property signature=0A=
     *   @type int=0A=
     */=0A=
    this.signature =3D signature || YAHOO.util.CustomEvent.LIST;=0A=
=0A=
    /**=0A=
     * The subscribers to this event=0A=
     * @property subscribers=0A=
     * @type Subscriber[]=0A=
     */=0A=
    this.subscribers =3D [];=0A=
=0A=
    if (!this.silent) {=0A=
    }=0A=
=0A=
    var onsubscribeType =3D "_YUICEOnSubscribe";=0A=
=0A=
    // Only add subscribe events for events that are not generated by =0A=
    // CustomEvent=0A=
    if (type !=3D=3D onsubscribeType) {=0A=
=0A=
        /**=0A=
         * Custom events provide a custom event that fires whenever =
there is=0A=
         * a new subscriber to the event.  This provides an opportunity =
to=0A=
         * handle the case where there is a non-repeating event that has=0A=
         * already fired has a new subscriber.  =0A=
         *=0A=
         * @event subscribeEvent=0A=
         * @type YAHOO.util.CustomEvent=0A=
         * @param {Function} fn The function to execute=0A=
         * @param {Object}   obj An object to be passed along when the =
event =0A=
         *                       fires=0A=
         * @param {boolean|Object}  override If true, the obj passed in =
becomes =0A=
         *                                   the execution scope of the =
listener.=0A=
         *                                   if an object, that object =
becomes the=0A=
         *                                   the execution scope.=0A=
         */=0A=
        this.subscribeEvent =3D =0A=
                new YAHOO.util.CustomEvent(onsubscribeType, this, true);=0A=
=0A=
    } =0A=
=0A=
=0A=
    /**=0A=
     * In order to make it possible to execute the rest of the subscriber=0A=
     * stack when one thows an exception, the subscribers exceptions are=0A=
     * caught.  The most recent exception is stored in this property=0A=
     * @property lastError=0A=
     * @type Error=0A=
     */=0A=
    this.lastError =3D null;=0A=
};=0A=
=0A=
/**=0A=
 * Subscriber listener sigature constant.  The LIST type returns three=0A=
 * parameters: the event type, the array of args passed to fire, and=0A=
 * the optional custom object=0A=
 * @property YAHOO.util.CustomEvent.LIST=0A=
 * @static=0A=
 * @type int=0A=
 */=0A=
YAHOO.util.CustomEvent.LIST =3D 0;=0A=
=0A=
/**=0A=
 * Subscriber listener sigature constant.  The FLAT type returns two=0A=
 * parameters: the first argument passed to fire and the optional =0A=
 * custom object=0A=
 * @property YAHOO.util.CustomEvent.FLAT=0A=
 * @static=0A=
 * @type int=0A=
 */=0A=
YAHOO.util.CustomEvent.FLAT =3D 1;=0A=
=0A=
YAHOO.util.CustomEvent.prototype =3D {=0A=
=0A=
    /**=0A=
     * Subscribes the caller to this event=0A=
     * @method subscribe=0A=
     * @param {Function} fn        The function to execute=0A=
     * @param {Object}   obj       An object to be passed along when the =
event =0A=
     *                             fires=0A=
     * @param {boolean|Object}  override If true, the obj passed in =
becomes =0A=
     *                                   the execution scope of the =
listener.=0A=
     *                                   if an object, that object =
becomes the=0A=
     *                                   the execution scope.=0A=
     */=0A=
    subscribe: function(fn, obj, override) {=0A=
=0A=
        if (!fn) {=0A=
throw new Error("Invalid callback for subscriber to '" + this.type + =
"'");=0A=
        }=0A=
=0A=
        if (this.subscribeEvent) {=0A=
            this.subscribeEvent.fire(fn, obj, override);=0A=
        }=0A=
=0A=
        this.subscribers.push( new YAHOO.util.Subscriber(fn, obj, =
override) );=0A=
    },=0A=
=0A=
    /**=0A=
     * Unsubscribes subscribers.=0A=
     * @method unsubscribe=0A=
     * @param {Function} fn  The subscribed function to remove, if not =
supplied=0A=
     *                       all will be removed=0A=
     * @param {Object}   obj  The custom object passed to subscribe.  =
This is=0A=
     *                        optional, but if supplied will be used to=0A=
     *                        disambiguate multiple listeners that are =
the same=0A=
     *                        (e.g., you subscribe many object using a =
function=0A=
     *                        that lives on the prototype)=0A=
     * @return {boolean} True if the subscriber was found and detached.=0A=
     */=0A=
    unsubscribe: function(fn, obj) {=0A=
=0A=
        if (!fn) {=0A=
            return this.unsubscribeAll();=0A=
        }=0A=
=0A=
        var found =3D false;=0A=
        for (var i=3D0, len=3Dthis.subscribers.length; i<len; ++i) {=0A=
            var s =3D this.subscribers[i];=0A=
            if (s && s.contains(fn, obj)) {=0A=
                this._delete(i);=0A=
                found =3D true;=0A=
            }=0A=
        }=0A=
=0A=
        return found;=0A=
    },=0A=
=0A=
    /**=0A=
     * Notifies the subscribers.  The callback functions will be executed=0A=
     * from the scope specified when the event was created, and with the =0A=
     * following parameters:=0A=
     *   <ul>=0A=
     *   <li>The type of event</li>=0A=
     *   <li>All of the arguments fire() was executed with as an =
array</li>=0A=
     *   <li>The custom object (if any) that was passed into the =
subscribe() =0A=
     *       method</li>=0A=
     *   </ul>=0A=
     * @method fire =0A=
     * @param {Object*} arguments an arbitrary set of parameters to pass =
to =0A=
     *                            the handler.=0A=
     * @return {boolean} false if one of the subscribers returned false, =0A=
     *                   true otherwise=0A=
     */=0A=
    fire: function() {=0A=
        var len=3Dthis.subscribers.length;=0A=
        if (!len && this.silent) {=0A=
            return true;=0A=
        }=0A=
=0A=
        var args=3D[].slice.call(arguments, 0), ret=3Dtrue, i, =
rebuild=3Dfalse;=0A=
=0A=
        if (!this.silent) {=0A=
        }=0A=
=0A=
        // make a copy of the subscribers so that there are=0A=
        // no index problems if one subscriber removes another.=0A=
        var subs =3D this.subscribers.slice();=0A=
=0A=
        for (i=3D0; i<len; ++i) {=0A=
            var s =3D subs[i];=0A=
            if (!s) {=0A=
                rebuild=3Dtrue;=0A=
            } else {=0A=
                if (!this.silent) {=0A=
                }=0A=
=0A=
                var scope =3D s.getScope(this.scope);=0A=
=0A=
                if (this.signature =3D=3D YAHOO.util.CustomEvent.FLAT) {=0A=
                    var param =3D null;=0A=
                    if (args.length > 0) {=0A=
                        param =3D args[0];=0A=
                    }=0A=
=0A=
                    try {=0A=
                        ret =3D s.fn.call(scope, param, s.obj);=0A=
                    } catch(e) {=0A=
                        this.lastError =3D e;=0A=
                    }=0A=
                } else {=0A=
                    try {=0A=
                        ret =3D s.fn.call(scope, this.type, args, s.obj);=0A=
                    } catch(ex) {=0A=
                        this.lastError =3D ex;=0A=
                    }=0A=
                }=0A=
                if (false =3D=3D=3D ret) {=0A=
                    if (!this.silent) {=0A=
                    }=0A=
=0A=
                    //break;=0A=
                    return false;=0A=
                }=0A=
            }=0A=
        }=0A=
=0A=
        =0A=
        // if (rebuild) {=0A=
        //     var newlist=3Dthis.,subs=3Dthis.subscribers;=0A=
        //     for (i=3D0,len=3Dsubs.length; i<len; i=3Di+1) {=0A=
        //         // this wasn't doing anything before=0A=
        //         newlist.push(subs[i]);=0A=
        //     }=0A=
        //     this.subscribers=3Dnewlist;=0A=
        // }=0A=
=0A=
        return true;=0A=
    },=0A=
=0A=
    /**=0A=
     * Removes all listeners=0A=
     * @method unsubscribeAll=0A=
     * @return {int} The number of listeners unsubscribed=0A=
     */=0A=
    unsubscribeAll: function() {=0A=
        for (var i=3Dthis.subscribers.length-1; i>-1; i--) {=0A=
            this._delete(i);=0A=
        }=0A=
=0A=
        this.subscribers=3D[];=0A=
=0A=
        return i;=0A=
    },=0A=
=0A=
    /**=0A=
     * @method _delete=0A=
     * @private=0A=
     */=0A=
    _delete: function(index) {=0A=
        var s =3D this.subscribers[index];=0A=
        if (s) {=0A=
            delete s.fn;=0A=
            delete s.obj;=0A=
        }=0A=
=0A=
        // this.subscribers[index]=3Dnull;=0A=
        this.subscribers.splice(index, 1);=0A=
    },=0A=
=0A=
    /**=0A=
     * @method toString=0A=
     */=0A=
    toString: function() {=0A=
         return "CustomEvent: " + "'" + this.type  + "', " + =0A=
             "scope: " + this.scope;=0A=
=0A=
    }=0A=
};=0A=
=0A=
/////////////////////////////////////////////////////////////////////=0A=
=0A=
/**=0A=
 * Stores the subscriber information to be used when the event fires.=0A=
 * @param {Function} fn       The function to execute=0A=
 * @param {Object}   obj      An object to be passed along when the =
event fires=0A=
 * @param {boolean}  override If true, the obj passed in becomes the =
execution=0A=
 *                            scope of the listener=0A=
 * @class Subscriber=0A=
 * @constructor=0A=
 */=0A=
YAHOO.util.Subscriber =3D function(fn, obj, override) {=0A=
=0A=
    /**=0A=
     * The callback that will be execute when the event fires=0A=
     * @property fn=0A=
     * @type function=0A=
     */=0A=
    this.fn =3D fn;=0A=
=0A=
    /**=0A=
     * An optional custom object that will passed to the callback when=0A=
     * the event fires=0A=
     * @property obj=0A=
     * @type object=0A=
     */=0A=
    this.obj =3D YAHOO.lang.isUndefined(obj) ? null : obj;=0A=
=0A=
    /**=0A=
     * The default execution scope for the event listener is defined =
when the=0A=
     * event is created (usually the object which contains the event).=0A=
     * By setting override to true, the execution scope becomes the =
custom=0A=
     * object passed in by the subscriber.  If override is an object, =
that =0A=
     * object becomes the scope.=0A=
     * @property override=0A=
     * @type boolean|object=0A=
     */=0A=
    this.override =3D override;=0A=
=0A=
};=0A=
=0A=
/**=0A=
 * Returns the execution scope for this listener.  If override was set =
to true=0A=
 * the custom obj will be the scope.  If override is an object, that is =
the=0A=
 * scope, otherwise the default scope will be used.=0A=
 * @method getScope=0A=
 * @param {Object} defaultScope the scope to use if this listener does =
not=0A=
 *                              override it.=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.getScope =3D function(defaultScope) {=0A=
    if (this.override) {=0A=
        if (this.override =3D=3D=3D true) {=0A=
            return this.obj;=0A=
        } else {=0A=
            return this.override;=0A=
        }=0A=
    }=0A=
    return defaultScope;=0A=
};=0A=
=0A=
/**=0A=
 * Returns true if the fn and obj match this objects properties.=0A=
 * Used by the unsubscribe method to match the right subscriber.=0A=
 *=0A=
 * @method contains=0A=
 * @param {Function} fn the function to execute=0A=
 * @param {Object} obj an object to be passed along when the event fires=0A=
 * @return {boolean} true if the supplied arguments match this =0A=
 *                   subscriber's signature.=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.contains =3D function(fn, obj) {=0A=
    if (obj) {=0A=
        return (this.fn =3D=3D fn && this.obj =3D=3D obj);=0A=
    } else {=0A=
        return (this.fn =3D=3D fn);=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * @method toString=0A=
 */=0A=
YAHOO.util.Subscriber.prototype.toString =3D function() {=0A=
    return "Subscriber { obj: " + this.obj  + =0A=
           ", override: " +  (this.override || "no") + " }";=0A=
};=0A=
=0A=
/**=0A=
 * The Event Utility provides utilities for managing DOM Events and tools=0A=
 * for building event systems=0A=
 *=0A=
 * @module event=0A=
 * @title Event Utility=0A=
 * @namespace YAHOO.util=0A=
 * @requires yahoo=0A=
 */=0A=
=0A=
// The first instance of Event will win if it is loaded more than once.=0A=
// @TODO this needs to be changed so that only the state data that needs =
to=0A=
// be preserved is kept, while methods are overwritten/added as needed.=0A=
// This means that the module pattern can't be used.=0A=
if (!YAHOO.util.Event) {=0A=
=0A=
/**=0A=
 * The event utility provides functions to add and remove event =
listeners,=0A=
 * event cleansing.  It also tries to automatically remove listeners it=0A=
 * registers during the unload event.=0A=
 *=0A=
 * @class Event=0A=
 * @static=0A=
 */=0A=
    YAHOO.util.Event =3D function() {=0A=
=0A=
        /**=0A=
         * True after the onload event has fired=0A=
         * @property loadComplete=0A=
         * @type boolean=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var loadComplete =3D  false;=0A=
=0A=
        /**=0A=
         * Cache of wrapped listeners=0A=
         * @property listeners=0A=
         * @type array=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var listeners =3D [];=0A=
=0A=
        /**=0A=
         * User-defined unload function that will be fired before all =
events=0A=
         * are detached=0A=
         * @property unloadListeners=0A=
         * @type array=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var unloadListeners =3D [];=0A=
=0A=
        /**=0A=
         * Cache of DOM0 event handlers to work around issues with DOM2 =
events=0A=
         * in Safari=0A=
         * @property legacyEvents=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyEvents =3D [];=0A=
=0A=
        /**=0A=
         * Listener stack for DOM0 events=0A=
         * @property legacyHandlers=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyHandlers =3D [];=0A=
=0A=
        /**=0A=
         * The number of times to poll after window.onload.  This number =
is=0A=
         * increased if additional late-bound handlers are requested =
after=0A=
         * the page load.=0A=
         * @property retryCount=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var retryCount =3D 0;=0A=
=0A=
        /**=0A=
         * onAvailable listeners=0A=
         * @property onAvailStack=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var onAvailStack =3D [];=0A=
=0A=
        /**=0A=
         * Lookup table for legacy events=0A=
         * @property legacyMap=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var legacyMap =3D [];=0A=
=0A=
        /**=0A=
         * Counter for auto id generation=0A=
         * @property counter=0A=
         * @static=0A=
         * @private=0A=
         */=0A=
        var counter =3D 0;=0A=
        =0A=
        /**=0A=
         * Normalized keycodes for webkit/safari=0A=
         * @property webkitKeymap=0A=
         * @type {int: int}=0A=
         * @private=0A=
         * @static=0A=
         * @final=0A=
         */=0A=
        var webkitKeymap =3D {=0A=
            63232: 38, // up=0A=
            63233: 40, // down=0A=
            63234: 37, // left=0A=
            63235: 39, // right=0A=
            63276: 33, // page up=0A=
            63277: 34, // page down=0A=
            25: 9      // SHIFT-TAB (Safari provides a different key =
code in=0A=
                       // this case, even though the shiftKey modifier =
is set)=0A=
        };=0A=
=0A=
        return {=0A=
=0A=
            /**=0A=
             * The number of times we should look for elements that are =
not=0A=
             * in the DOM at the time the event is requested after the =
document=0A=
             * has been loaded.  The default is 2000@amp;20 ms, so it =
will poll=0A=
             * for 40 seconds or until all outstanding handlers are bound=0A=
             * (whichever comes first).=0A=
             * @property POLL_RETRYS=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            POLL_RETRYS: 2000,=0A=
=0A=
            /**=0A=
             * The poll interval in milliseconds=0A=
             * @property POLL_INTERVAL=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            POLL_INTERVAL: 20,=0A=
=0A=
            /**=0A=
             * Element to bind, int constant=0A=
             * @property EL=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            EL: 0,=0A=
=0A=
            /**=0A=
             * Type of event, int constant=0A=
             * @property TYPE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            TYPE: 1,=0A=
=0A=
            /**=0A=
             * Function to execute, int constant=0A=
             * @property FN=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            FN: 2,=0A=
=0A=
            /**=0A=
             * Function wrapped for scope correction and cleanup, int =
constant=0A=
             * @property WFN=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            WFN: 3,=0A=
=0A=
            /**=0A=
             * Object passed in by the user that will be returned as a =0A=
             * parameter to the callback, int constant.  Specific to=0A=
             * unload listeners=0A=
             * @property OBJ=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            UNLOAD_OBJ: 3,=0A=
=0A=
            /**=0A=
             * Adjusted scope, either the element we are registering the =
event=0A=
             * on or the custom object passed in by the listener, int =
constant=0A=
             * @property ADJ_SCOPE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            ADJ_SCOPE: 4,=0A=
=0A=
            /**=0A=
             * The original obj passed into addListener=0A=
             * @property OBJ=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            OBJ: 5,=0A=
=0A=
            /**=0A=
             * The original scope parameter passed into addListener=0A=
             * @property OVERRIDE=0A=
             * @type int=0A=
             * @static=0A=
             * @final=0A=
             */=0A=
            OVERRIDE: 6,=0A=
=0A=
            /**=0A=
             * addListener/removeListener can throw errors in unexpected =
scenarios.=0A=
             * These errors are suppressed, the method returns false, =
and this property=0A=
             * is set=0A=
             * @property lastError=0A=
             * @static=0A=
             * @type Error=0A=
             */=0A=
            lastError: null,=0A=
=0A=
            /**=0A=
             * Safari detection=0A=
             * @property isSafari=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.webkit=0A=
             */=0A=
            isSafari: YAHOO.env.ua.webkit,=0A=
            =0A=
            /**=0A=
             * webkit version=0A=
             * @property webkit=0A=
             * @type string=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.webkit=0A=
             */=0A=
            webkit: YAHOO.env.ua.webkit,=0A=
            =0A=
            /**=0A=
             * IE detection =0A=
             * @property isIE=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated use YAHOO.env.ua.ie=0A=
             */=0A=
            isIE: YAHOO.env.ua.ie,=0A=
=0A=
            /**=0A=
             * poll handle=0A=
             * @property _interval=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _interval: null,=0A=
=0A=
            /**=0A=
             * document readystate poll handle=0A=
             * @property _dri=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
             _dri: null,=0A=
=0A=
            /**=0A=
             * True when the document is initially usable=0A=
             * @property DOMReady=0A=
             * @type boolean=0A=
             * @static=0A=
             */=0A=
            DOMReady: false,=0A=
=0A=
            /**=0A=
             * @method startInterval=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            startInterval: function() {=0A=
                if (!this._interval) {=0A=
                    var self =3D this;=0A=
                    var callback =3D function() { =
self._tryPreloadAttach(); };=0A=
                    this._interval =3D setInterval(callback, =
this.POLL_INTERVAL);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Executes the supplied callback when the item with the =
supplied=0A=
             * id is found.  This is meant to be used to execute =
behavior as=0A=
             * soon as possible as the page loads.  If you use this =
after the=0A=
             * initial page load it will poll for a fixed time for the =
element.=0A=
             * The number of times it will poll and the frequency are=0A=
             * configurable.  By default it will poll for 10 seconds.=0A=
             *=0A=
             * <p>The callback is executed with a single parameter:=0A=
             * the custom object parameter, if provided.</p>=0A=
             *=0A=
             * @method onAvailable=0A=
             *=0A=
             * @param {string||string[]}   p_id the id of the element, =
or an array=0A=
             * of ids to look for.=0A=
             * @param {function} p_fn what to execute when the element =
is found.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_override If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj, if set to an =
object it=0A=
             *                   will execute in the scope of that object=0A=
             * @param checkContent {boolean} check child node readiness =
(onContentReady)=0A=
             * @static=0A=
             */=0A=
            onAvailable: function(p_id, p_fn, p_obj, p_override, =
checkContent) {=0A=
=0A=
                var a =3D (YAHOO.lang.isString(p_id)) ? [p_id] : p_id;=0A=
=0A=
                for (var i=3D0; i<a.length; i=3Di+1) {=0A=
                    onAvailStack.push({id:         a[i], =0A=
                                       fn:         p_fn, =0A=
                                       obj:        p_obj, =0A=
                                       override:   p_override, =0A=
                                       checkReady: checkContent });=0A=
                }=0A=
=0A=
                retryCount =3D this.POLL_RETRYS;=0A=
=0A=
                this.startInterval();=0A=
            },=0A=
=0A=
            /**=0A=
             * Works the same way as onAvailable, but additionally =
checks the=0A=
             * state of sibling elements to determine if the content of =
the=0A=
             * available element is safe to modify.=0A=
             *=0A=
             * <p>The callback is executed with a single parameter:=0A=
             * the custom object parameter, if provided.</p>=0A=
             *=0A=
             * @method onContentReady=0A=
             *=0A=
             * @param {string}   p_id the id of the element to look for.=0A=
             * @param {function} p_fn what to execute when the element =
is ready.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_override If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj.  If an object, =
p_fn will=0A=
             *                   exectute in the scope of that object=0A=
             *=0A=
             * @static=0A=
             */=0A=
            onContentReady: function(p_id, p_fn, p_obj, p_override) {=0A=
                this.onAvailable(p_id, p_fn, p_obj, p_override, true);=0A=
            },=0A=
=0A=
            /**=0A=
             * Executes the supplied callback when the DOM is first =
usable.  This=0A=
             * will execute immediately if called after the DOMReady =
event has=0A=
             * fired.   @todo the DOMContentReady event does not fire =
when the=0A=
             * script is dynamically injected into the page.  This means =
the=0A=
             * DOMReady custom event will never fire in FireFox or Opera =
when the=0A=
             * library is injected.  It _will_ fire in Safari, and the =
IE =0A=
             * implementation would allow for us to fire it if the =
defered script=0A=
             * is not available.  We want this to behave the same in all =
browsers.=0A=
             * Is there a way to identify when the script has been =
injected =0A=
             * instead of included inline?  Is there a way to know =
whether the =0A=
             * window onload event has fired without having had a =
listener attached =0A=
             * to it when it did so?=0A=
             *=0A=
             * <p>The callback is a CustomEvent, so the signature is:</p>=0A=
             * <p>type &lt;string&gt;, args &lt;array&gt;, customobject =
&lt;object&gt;</p>=0A=
             * <p>For DOMReady events, there are no fire argments, so the=0A=
             * signature is:</p>=0A=
             * <p>"DOMReady", [], obj</p>=0A=
             *=0A=
             *=0A=
             * @method onDOMReady=0A=
             *=0A=
             * @param {function} p_fn what to execute when the element =
is found.=0A=
             * @param {object}   p_obj an optional object to be passed =
back as=0A=
             *                   a parameter to p_fn.=0A=
             * @param {boolean|object}  p_scope If set to true, p_fn =
will execute=0A=
             *                   in the scope of p_obj, if set to an =
object it=0A=
             *                   will execute in the scope of that object=0A=
             *=0A=
             * @static=0A=
             */=0A=
            onDOMReady: function(p_fn, p_obj, p_override) {=0A=
                if (this.DOMReady) {=0A=
                    setTimeout(function() {=0A=
                        var s =3D window;=0A=
                        if (p_override) {=0A=
                            if (p_override =3D=3D=3D true) {=0A=
                                s =3D p_obj;=0A=
                            } else {=0A=
                                s =3D p_override;=0A=
                            }=0A=
                        }=0A=
                        p_fn.call(s, "DOMReady", [], p_obj);=0A=
                    }, 0);=0A=
                } else {=0A=
                    this.DOMReadyEvent.subscribe(p_fn, p_obj, =
p_override);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Appends an event handler=0A=
             *=0A=
             * @method addListener=0A=
             *=0A=
             * @param {String|HTMLElement|Array|NodeList} el An id, an =
element =0A=
             *  reference, or a collection of ids and/or elements to =
assign the =0A=
             *  listener to.=0A=
             * @param {String}   sType     The type of event to append=0A=
             * @param {Function} fn        The method the event invokes=0A=
             * @param {Object}   obj    An arbitrary object that will be =0A=
             *                             passed as a parameter to the =
handler=0A=
             * @param {Boolean|object}  override  If true, the obj =
passed in becomes=0A=
             *                             the execution scope of the =
listener. If an=0A=
             *                             object, this object becomes =
the execution=0A=
             *                             scope.=0A=
             * @return {Boolean} True if the action was successful or =
defered,=0A=
             *                        false if one or more of the =
elements =0A=
             *                        could not have the listener =
attached,=0A=
             *                        or if the operation throws an =
exception.=0A=
             * @static=0A=
             */=0A=
            addListener: function(el, sType, fn, obj, override) {=0A=
=0A=
                if (!fn || !fn.call) {=0A=
                    return false;=0A=
                }=0A=
=0A=
                // The el argument can be an array of elements or =
element ids.=0A=
                if ( this._isValidCollection(el)) {=0A=
                    var ok =3D true;=0A=
                    for (var i=3D0,len=3Del.length; i<len; ++i) {=0A=
                        ok =3D this.on(el[i], =0A=
                                       sType, =0A=
                                       fn, =0A=
                                       obj, =0A=
                                       override) && ok;=0A=
                    }=0A=
                    return ok;=0A=
=0A=
                } else if (YAHOO.lang.isString(el)) {=0A=
                    var oEl =3D this.getEl(el);=0A=
                    // If the el argument is a string, we assume it is =0A=
                    // actually the id of the element.  If the page is =
loaded=0A=
                    // we convert el to the actual element, otherwise we =0A=
                    // defer attaching the event until onload event fires=0A=
=0A=
                    // check to see if we need to delay hooking up the =
event =0A=
                    // until after the page loads.=0A=
                    if (oEl) {=0A=
                        el =3D oEl;=0A=
                    } else {=0A=
                        // defer adding the event until the element is =
available=0A=
                        this.onAvailable(el, function() {=0A=
                           YAHOO.util.Event.on(el, sType, fn, obj, =
override);=0A=
                        });=0A=
=0A=
                        return true;=0A=
                    }=0A=
                }=0A=
=0A=
                // Element should be an html element or an array if we =
get =0A=
                // here.=0A=
                if (!el) {=0A=
                    return false;=0A=
                }=0A=
=0A=
                // we need to make sure we fire registered unload events =0A=
                // prior to automatically unhooking them.  So we hang on =
to =0A=
                // these instead of attaching them to the window and =
fire the=0A=
                // handles explicitly during our one unload event.=0A=
                if ("unload" =3D=3D sType && obj !=3D=3D this) {=0A=
                    unloadListeners[unloadListeners.length] =3D=0A=
                            [el, sType, fn, obj, override];=0A=
                    return true;=0A=
                }=0A=
=0A=
=0A=
                // if the user chooses to override the scope, we use the =
custom=0A=
                // object passed in, otherwise the executing scope will =
be the=0A=
                // HTML element that the event is registered on=0A=
                var scope =3D el;=0A=
                if (override) {=0A=
                    if (override =3D=3D=3D true) {=0A=
                        scope =3D obj;=0A=
                    } else {=0A=
                        scope =3D override;=0A=
                    }=0A=
                }=0A=
=0A=
                // wrap the function so we can return the obj object when=0A=
                // the event fires;=0A=
                var wrappedFn =3D function(e) {=0A=
                        return fn.call(scope, =
YAHOO.util.Event.getEvent(e, el), =0A=
                                obj);=0A=
                    };=0A=
=0A=
                var li =3D [el, sType, fn, wrappedFn, scope, obj, =
override];=0A=
                var index =3D listeners.length;=0A=
                // cache the listener so we can try to automatically =
unload=0A=
                listeners[index] =3D li;=0A=
=0A=
                if (this.useLegacyEvent(el, sType)) {=0A=
                    var legacyIndex =3D this.getLegacyIndex(el, sType);=0A=
=0A=
                    // Add a new dom0 wrapper if one is not detected for =
this=0A=
                    // element=0A=
                    if ( legacyIndex =3D=3D -1 || =0A=
                                el !=3D legacyEvents[legacyIndex][0] ) {=0A=
=0A=
                        legacyIndex =3D legacyEvents.length;=0A=
                        legacyMap[el.id + sType] =3D legacyIndex;=0A=
=0A=
                        // cache the signature for the DOM0 event, and =0A=
                        // include the existing handler for the event, =
if any=0A=
                        legacyEvents[legacyIndex] =3D =0A=
                            [el, sType, el["on" + sType]];=0A=
                        legacyHandlers[legacyIndex] =3D [];=0A=
=0A=
                        el["on" + sType] =3D =0A=
                            function(e) {=0A=
                                YAHOO.util.Event.fireLegacyEvent(=0A=
                                    YAHOO.util.Event.getEvent(e), =
legacyIndex);=0A=
                            };=0A=
                    }=0A=
=0A=
                    // add a reference to the wrapped listener to our =
custom=0A=
                    // stack of events=0A=
                    //legacyHandlers[legacyIndex].push(index);=0A=
                    legacyHandlers[legacyIndex].push(li);=0A=
=0A=
                } else {=0A=
                    try {=0A=
                        this._simpleAdd(el, sType, wrappedFn, false);=0A=
                    } catch(ex) {=0A=
                        // handle an error trying to attach an event.  =
If it fails=0A=
                        // we need to clean up the cache=0A=
                        this.lastError =3D ex;=0A=
                        this.removeListener(el, sType, fn);=0A=
                        return false;=0A=
                    }=0A=
                }=0A=
=0A=
                return true;=0A=
                =0A=
            },=0A=
=0A=
            /**=0A=
             * When using legacy events, the handler is routed to this =
object=0A=
             * so we can fire our custom listener stack.=0A=
             * @method fireLegacyEvent=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            fireLegacyEvent: function(e, legacyIndex) {=0A=
                var ok=3Dtrue, le, lh, li, scope, ret;=0A=
                =0A=
                lh =3D legacyHandlers[legacyIndex].slice();=0A=
                for (var i=3D0, len=3Dlh.length; i<len; ++i) {=0A=
                // for (var i in lh.length) {=0A=
                    li =3D lh[i];=0A=
                    if ( li && li[this.WFN] ) {=0A=
                        scope =3D li[this.ADJ_SCOPE];=0A=
                        ret =3D li[this.WFN].call(scope, e);=0A=
                        ok =3D (ok && ret);=0A=
                    }=0A=
                }=0A=
=0A=
                // Fire the original handler if we replaced one.  We =
fire this=0A=
                // after the other events to keep =
stopPropagation/preventDefault=0A=
                // that happened in the DOM0 handler from touching our =
DOM2=0A=
                // substitute=0A=
                le =3D legacyEvents[legacyIndex];=0A=
                if (le && le[2]) {=0A=
                    le[2](e);=0A=
                }=0A=
                =0A=
                return ok;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the legacy event index that matches the supplied =0A=
             * signature=0A=
             * @method getLegacyIndex=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            getLegacyIndex: function(el, sType) {=0A=
                var key =3D this.generateId(el) + sType;=0A=
                if (typeof legacyMap[key] =3D=3D "undefined") { =0A=
                    return -1;=0A=
                } else {=0A=
                    return legacyMap[key];=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Logic that determines when we should automatically use =
legacy=0A=
             * events instead of DOM2 events.  Currently this is limited =
to old=0A=
             * Safari browsers with a broken preventDefault=0A=
             * @method useLegacyEvent=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            useLegacyEvent: function(el, sType) {=0A=
                if (this.webkit && ("click"=3D=3DsType || =
"dblclick"=3D=3DsType)) {=0A=
                    var v =3D parseInt(this.webkit, 10);=0A=
                    if (!isNaN(v) && v<418) {=0A=
                        return true;=0A=
                    }=0A=
                }=0A=
                return false;=0A=
            },=0A=
                    =0A=
            /**=0A=
             * Removes an event listener=0A=
             *=0A=
             * @method removeListener=0A=
             *=0A=
             * @param {String|HTMLElement|Array|NodeList} el An id, an =
element =0A=
             *  reference, or a collection of ids and/or elements to =
remove=0A=
             *  the listener from.=0A=
             * @param {String} sType the type of event to remove.=0A=
             * @param {Function} fn the method the event invokes.  If fn =
is=0A=
             *  undefined, then all event handlers for the type of event =
are =0A=
             *  removed.=0A=
             * @return {boolean} true if the unbind was successful, =
false =0A=
             *  otherwise.=0A=
             * @static=0A=
             */=0A=
            removeListener: function(el, sType, fn) {=0A=
                var i, len, li;=0A=
=0A=
                // The el argument can be a string=0A=
                if (typeof el =3D=3D "string") {=0A=
                    el =3D this.getEl(el);=0A=
                // The el argument can be an array of elements or =
element ids.=0A=
                } else if ( this._isValidCollection(el)) {=0A=
                    var ok =3D true;=0A=
                    for (i=3Del.length-1; i>-1; i--) {=0A=
                        ok =3D ( this.removeListener(el[i], sType, fn) =
&& ok );=0A=
                    }=0A=
                    return ok;=0A=
                }=0A=
=0A=
                if (!fn || !fn.call) {=0A=
                    //return false;=0A=
                    return this.purgeElement(el, false, sType);=0A=
                }=0A=
=0A=
                if ("unload" =3D=3D sType) {=0A=
=0A=
                    for (i=3DunloadListeners.length-1; i>-1; i--) {=0A=
                        li =3D unloadListeners[i];=0A=
                        if (li && =0A=
                            li[0] =3D=3D el && =0A=
                            li[1] =3D=3D sType && =0A=
                            li[2] =3D=3D fn) {=0A=
                                unloadListeners.splice(i, 1);=0A=
                                // unloadListeners[i]=3Dnull;=0A=
                                return true;=0A=
                        }=0A=
                    }=0A=
=0A=
                    return false;=0A=
                }=0A=
=0A=
                var cacheItem =3D null;=0A=
=0A=
                // The index is a hidden parameter; needed to remove it =
from=0A=
                // the method signature because it was tempting users to=0A=
                // try and take advantage of it, which is not possible.=0A=
                var index =3D arguments[3];=0A=
  =0A=
                if ("undefined" =3D=3D=3D typeof index) {=0A=
                    index =3D this._getCacheIndex(el, sType, fn);=0A=
                }=0A=
=0A=
                if (index >=3D 0) {=0A=
                    cacheItem =3D listeners[index];=0A=
                }=0A=
=0A=
                if (!el || !cacheItem) {=0A=
                    return false;=0A=
                }=0A=
=0A=
=0A=
                if (this.useLegacyEvent(el, sType)) {=0A=
                    var legacyIndex =3D this.getLegacyIndex(el, sType);=0A=
                    var llist =3D legacyHandlers[legacyIndex];=0A=
                    if (llist) {=0A=
                        for (i=3D0, len=3Dllist.length; i<len; ++i) {=0A=
                        // for (i in llist.length) {=0A=
                            li =3D llist[i];=0A=
                            if (li && =0A=
                                li[this.EL] =3D=3D el && =0A=
                                li[this.TYPE] =3D=3D sType && =0A=
                                li[this.FN] =3D=3D fn) {=0A=
                                    llist.splice(i, 1);=0A=
                                    // llist[i]=3Dnull;=0A=
                                    break;=0A=
                            }=0A=
                        }=0A=
                    }=0A=
=0A=
                } else {=0A=
                    try {=0A=
                        this._simpleRemove(el, sType, =
cacheItem[this.WFN], false);=0A=
                    } catch(ex) {=0A=
                        this.lastError =3D ex;=0A=
                        return false;=0A=
                    }=0A=
                }=0A=
=0A=
                // removed the wrapped handler=0A=
                delete listeners[index][this.WFN];=0A=
                delete listeners[index][this.FN];=0A=
                listeners.splice(index, 1);=0A=
                // listeners[index]=3Dnull;=0A=
=0A=
                return true;=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's target element.  Safari sometimes =
provides=0A=
             * a text node, and this is automatically resolved to the =
text=0A=
             * node's parent so that it behaves like other browsers.=0A=
             * @method getTarget=0A=
             * @param {Event} ev the event=0A=
             * @param {boolean} resolveTextNode when set to true the =
target's=0A=
             *                  parent will be returned if the target is =
a =0A=
             *                  text node.  @deprecated, the text node is=0A=
             *                  now resolved automatically=0A=
             * @return {HTMLElement} the event's target=0A=
             * @static=0A=
             */=0A=
            getTarget: function(ev, resolveTextNode) {=0A=
                var t =3D ev.target || ev.srcElement;=0A=
                return this.resolveTextNode(t);=0A=
            },=0A=
=0A=
            /**=0A=
             * In some cases, some browsers will return a text node =
inside=0A=
             * the actual element that was targeted.  This normalizes the=0A=
             * return value for getTarget and getRelatedTarget.=0A=
             * @method resolveTextNode=0A=
             * @param {HTMLElement} node node to resolve=0A=
             * @return {HTMLElement} the normized node=0A=
             * @static=0A=
             */=0A=
            resolveTextNode: function(n) {=0A=
                try {=0A=
                    if (n && 3 =3D=3D n.nodeType) {=0A=
                        return n.parentNode;=0A=
                    }=0A=
                } catch(e) { }=0A=
=0A=
                return n;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's pageX=0A=
             * @method getPageX=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's pageX=0A=
             * @static=0A=
             */=0A=
            getPageX: function(ev) {=0A=
                var x =3D ev.pageX;=0A=
                if (!x && 0 !=3D=3D x) {=0A=
                    x =3D ev.clientX || 0;=0A=
=0A=
                    if ( this.isIE ) {=0A=
                        x +=3D this._getScrollLeft();=0A=
                    }=0A=
                }=0A=
=0A=
                return x;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's pageY=0A=
             * @method getPageY=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's pageY=0A=
             * @static=0A=
             */=0A=
            getPageY: function(ev) {=0A=
                var y =3D ev.pageY;=0A=
                if (!y && 0 !=3D=3D y) {=0A=
                    y =3D ev.clientY || 0;=0A=
=0A=
                    if ( this.isIE ) {=0A=
                        y +=3D this._getScrollTop();=0A=
                    }=0A=
                }=0A=
=0A=
=0A=
                return y;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the pageX and pageY properties as an indexed =
array.=0A=
             * @method getXY=0A=
             * @param {Event} ev the event=0A=
             * @return {[x, y]} the pageX and pageY properties of the =
event=0A=
             * @static=0A=
             */=0A=
            getXY: function(ev) {=0A=
                return [this.getPageX(ev), this.getPageY(ev)];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the event's related target =0A=
             * @method getRelatedTarget=0A=
             * @param {Event} ev the event=0A=
             * @return {HTMLElement} the event's relatedTarget=0A=
             * @static=0A=
             */=0A=
            getRelatedTarget: function(ev) {=0A=
                var t =3D ev.relatedTarget;=0A=
                if (!t) {=0A=
                    if (ev.type =3D=3D "mouseout") {=0A=
                        t =3D ev.toElement;=0A=
                    } else if (ev.type =3D=3D "mouseover") {=0A=
                        t =3D ev.fromElement;=0A=
                    }=0A=
                }=0A=
=0A=
                return this.resolveTextNode(t);=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the time of the event.  If the time is not =
included, the=0A=
             * event is modified using the current time.=0A=
             * @method getTime=0A=
             * @param {Event} ev the event=0A=
             * @return {Date} the time of the event=0A=
             * @static=0A=
             */=0A=
            getTime: function(ev) {=0A=
                if (!ev.time) {=0A=
                    var t =3D new Date().getTime();=0A=
                    try {=0A=
                        ev.time =3D t;=0A=
                    } catch(ex) { =0A=
                        this.lastError =3D ex;=0A=
                        return t;=0A=
                    }=0A=
                }=0A=
=0A=
                return ev.time;=0A=
            },=0A=
=0A=
            /**=0A=
             * Convenience method for stopPropagation + preventDefault=0A=
             * @method stopEvent=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            stopEvent: function(ev) {=0A=
                this.stopPropagation(ev);=0A=
                this.preventDefault(ev);=0A=
            },=0A=
=0A=
            /**=0A=
             * Stops event propagation=0A=
             * @method stopPropagation=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            stopPropagation: function(ev) {=0A=
                if (ev.stopPropagation) {=0A=
                    ev.stopPropagation();=0A=
                } else {=0A=
                    ev.cancelBubble =3D true;=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Prevents the default behavior of the event=0A=
             * @method preventDefault=0A=
             * @param {Event} ev the event=0A=
             * @static=0A=
             */=0A=
            preventDefault: function(ev) {=0A=
                if (ev.preventDefault) {=0A=
                    ev.preventDefault();=0A=
                } else {=0A=
                    ev.returnValue =3D false;=0A=
                }=0A=
            },=0A=
             =0A=
            /**=0A=
             * Finds the event in the window object, the caller's =
arguments, or=0A=
             * in the arguments of another method in the callstack.  =
This is=0A=
             * executed automatically for events registered through the =
event=0A=
             * manager, so the implementer should not normally need to =
execute=0A=
             * this function at all.=0A=
             * @method getEvent=0A=
             * @param {Event} e the event parameter from the handler=0A=
             * @param {HTMLElement} boundEl the element the listener is =
attached to=0A=
             * @return {Event} the event =0A=
             * @static=0A=
             */=0A=
            getEvent: function(e, boundEl) {=0A=
                var ev =3D e || window.event;=0A=
=0A=
                if (!ev) {=0A=
                    var c =3D this.getEvent.caller;=0A=
                    while (c) {=0A=
                        ev =3D c.arguments[0];=0A=
                        if (ev && Event =3D=3D ev.constructor) {=0A=
                            break;=0A=
                        }=0A=
                        c =3D c.caller;=0A=
                    }=0A=
                }=0A=
=0A=
                return ev;=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the charcode for an event=0A=
             * @method getCharCode=0A=
             * @param {Event} ev the event=0A=
             * @return {int} the event's charCode=0A=
             * @static=0A=
             */=0A=
            getCharCode: function(ev) {=0A=
                var code =3D ev.keyCode || ev.charCode || 0;=0A=
=0A=
                // webkit key normalization=0A=
                if (YAHOO.env.ua.webkit && (code in webkitKeymap)) {=0A=
                    code =3D webkitKeymap[code];=0A=
                }=0A=
                return code;=0A=
            },=0A=
=0A=
            /**=0A=
             * Locating the saved event handler data by function ref=0A=
             *=0A=
             * @method _getCacheIndex=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getCacheIndex: function(el, sType, fn) {=0A=
                for (var i=3D0, l=3Dlisteners.length; i<l; i=3Di+1) {=0A=
                    var li =3D listeners[i];=0A=
                    if ( li                 && =0A=
                         li[this.FN] =3D=3D fn  && =0A=
                         li[this.EL] =3D=3D el  && =0A=
                         li[this.TYPE] =3D=3D sType ) {=0A=
                        return i;=0A=
                    }=0A=
                }=0A=
=0A=
                return -1;=0A=
            },=0A=
=0A=
            /**=0A=
             * Generates an unique ID for the element if it does not =
already =0A=
             * have one.=0A=
             * @method generateId=0A=
             * @param el the element to create the id for=0A=
             * @return {string} the resulting id of the element=0A=
             * @static=0A=
             */=0A=
            generateId: function(el) {=0A=
                var id =3D el.id;=0A=
=0A=
                if (!id) {=0A=
                    id =3D "yuievtautoid-" + counter;=0A=
                    ++counter;=0A=
                    el.id =3D id;=0A=
                }=0A=
=0A=
                return id;=0A=
            },=0A=
=0A=
=0A=
            /**=0A=
             * We want to be able to use getElementsByTagName as a =
collection=0A=
             * to attach a group of events to.  Unfortunately, different =0A=
             * browsers return different types of collections.  This =
function=0A=
             * tests to determine if the object is array-like.  It will =
also =0A=
             * fail if the object is an array, but is empty.=0A=
             * @method _isValidCollection=0A=
             * @param o the object to test=0A=
             * @return {boolean} true if the object is array-like and =
populated=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _isValidCollection: function(o) {=0A=
                try {=0A=
                    return ( o                     && // o is something=0A=
                             typeof o !=3D=3D "string" && // o is not a =
string=0A=
                             o.length              && // o is indexed=0A=
                             !o.tagName            && // o is not an =
HTML element=0A=
                             !o.alert              && // o is not a =
window=0A=
                             typeof o[0] !=3D=3D "undefined" );=0A=
                } catch(ex) {=0A=
                    return false;=0A=
                }=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * @private=0A=
             * @property elCache=0A=
             * DOM element cache=0A=
             * @static=0A=
             * @deprecated Elements are not cached due to issues that =
arise when=0A=
             * elements are removed and re-added=0A=
             */=0A=
            elCache: {},=0A=
=0A=
            /**=0A=
             * We cache elements bound by id because when the unload =
event =0A=
             * fires, we can no longer use document.getElementById=0A=
             * @method getEl=0A=
             * @static=0A=
             * @private=0A=
             * @deprecated Elements are not cached any longer=0A=
             */=0A=
            getEl: function(id) {=0A=
                return (typeof id =3D=3D=3D "string") ? =
document.getElementById(id) : id;=0A=
            },=0A=
=0A=
            /**=0A=
             * Clears the element cache=0A=
             * @deprecated Elements are not cached any longer=0A=
             * @method clearCache=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            clearCache: function() { },=0A=
=0A=
            /**=0A=
             * Custom event the fires when the dom is initially usable=0A=
             * @event DOMReadyEvent=0A=
             */=0A=
            DOMReadyEvent: new YAHOO.util.CustomEvent("DOMReady", this),=0A=
=0A=
            /**=0A=
             * hook up any deferred listeners=0A=
             * @method _load=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _load: function(e) {=0A=
=0A=
                if (!loadComplete) {=0A=
                    loadComplete =3D true;=0A=
                    var EU =3D YAHOO.util.Event;=0A=
=0A=
                    // Just in case DOMReady did not go off for some =
reason=0A=
                    EU._ready();=0A=
=0A=
                    // Available elements may not have been detected =
before the=0A=
                    // window load event fires. Try to find them now so =
that the=0A=
                    // the user is more likely to get the onAvailable =
notifications=0A=
                    // before the window load notification=0A=
                    EU._tryPreloadAttach();=0A=
=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Fires the DOMReady event listeners the first time the =
document is=0A=
             * usable.=0A=
             * @method _ready=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _ready: function(e) {=0A=
                var EU =3D YAHOO.util.Event;=0A=
                if (!EU.DOMReady) {=0A=
                    EU.DOMReady=3Dtrue;=0A=
=0A=
                    // Fire the content ready custom event=0A=
                    EU.DOMReadyEvent.fire();=0A=
=0A=
                    // Remove the DOMContentLoaded (FF/Opera)=0A=
                    EU._simpleRemove(document, "DOMContentLoaded", =
EU._ready);=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Polling function that runs before the onload event fires, =0A=
             * attempting to attach to DOM Nodes as soon as they are =0A=
             * available=0A=
             * @method _tryPreloadAttach=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _tryPreloadAttach: function() {=0A=
=0A=
                if (onAvailStack.length =3D=3D=3D 0) {=0A=
                    retryCount =3D 0;=0A=
                    clearInterval(this._interval);=0A=
                    this._interval =3D null;=0A=
                    return;=0A=
                }=0A=
=0A=
                if (this.locked) {=0A=
                    return;=0A=
                }=0A=
=0A=
                if (this.isIE) {=0A=
                    // Hold off if DOMReady has not fired and check =
current=0A=
                    // readyState to protect against the IE operation =
aborted=0A=
                    // issue.=0A=
                    if (!this.DOMReady) {=0A=
                        this.startInterval();=0A=
                        return;=0A=
                    }=0A=
                }=0A=
=0A=
                this.locked =3D true;=0A=
=0A=
=0A=
                // keep trying until after the page is loaded.  We need =
to =0A=
                // check the page load state prior to trying to bind the =0A=
                // elements so that we can be certain all elements have =
been =0A=
                // tested appropriately=0A=
                var tryAgain =3D !loadComplete;=0A=
                if (!tryAgain) {=0A=
                    tryAgain =3D (retryCount > 0 && onAvailStack.length =
> 0);=0A=
                }=0A=
=0A=
                // onAvailable=0A=
                var notAvail =3D [];=0A=
=0A=
                var executeItem =3D function (el, item) {=0A=
                    var scope =3D el;=0A=
                    if (item.override) {=0A=
                        if (item.override =3D=3D=3D true) {=0A=
                            scope =3D item.obj;=0A=
                        } else {=0A=
                            scope =3D item.override;=0A=
                        }=0A=
                    }=0A=
                    item.fn.call(scope, item.obj);=0A=
                };=0A=
=0A=
                var i, len, item, el, ready=3D[];=0A=
=0A=
                // onAvailable onContentReady=0A=
                for (i=3D0, len=3DonAvailStack.length; i<len; i=3Di+1) {=0A=
                    item =3D onAvailStack[i];=0A=
                    if (item) {=0A=
                        el =3D this.getEl(item.id);=0A=
                        if (el) {=0A=
                            if (item.checkReady) {=0A=
                                if (loadComplete || el.nextSibling || =
!tryAgain) {=0A=
                                    ready.push(item);=0A=
                                    onAvailStack[i] =3D null;=0A=
                                }=0A=
                            } else {=0A=
                                executeItem(el, item);=0A=
                                onAvailStack[i] =3D null;=0A=
                            }=0A=
                        } else {=0A=
                            notAvail.push(item);=0A=
                        }=0A=
                    }=0A=
                }=0A=
                =0A=
                // make sure onContentReady fires after onAvailable=0A=
                for (i=3D0, len=3Dready.length; i<len; i=3Di+1) {=0A=
                    item =3D ready[i];=0A=
                    executeItem(this.getEl(item.id), item);=0A=
                }=0A=
=0A=
=0A=
                retryCount--;=0A=
=0A=
                if (tryAgain) {=0A=
                    for (i=3DonAvailStack.length-1; i>-1; i--) {=0A=
                        item =3D onAvailStack[i];=0A=
                        if (!item || !item.id) {=0A=
                            onAvailStack.splice(i, 1);=0A=
                        }=0A=
                    }=0A=
=0A=
                    this.startInterval();=0A=
                } else {=0A=
                    clearInterval(this._interval);=0A=
                    this._interval =3D null;=0A=
                }=0A=
=0A=
                this.locked =3D false;=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Removes all listeners attached to the given element via =
addListener.=0A=
             * Optionally, the node's children can also be purged.=0A=
             * Optionally, you can specify a specific type of event to =
remove.=0A=
             * @method purgeElement=0A=
             * @param {HTMLElement} el the element to purge=0A=
             * @param {boolean} recurse recursively purge this element's =
children=0A=
             * as well.  Use with caution.=0A=
             * @param {string} sType optional type of listener to purge. =
If=0A=
             * left out, all listeners will be removed=0A=
             * @static=0A=
             */=0A=
            purgeElement: function(el, recurse, sType) {=0A=
                var oEl =3D (YAHOO.lang.isString(el)) ? this.getEl(el) : =
el;=0A=
                var elListeners =3D this.getListeners(oEl, sType), i, =
len;=0A=
                if (elListeners) {=0A=
                    for (i=3DelListeners.length-1; i>-1; i--) {=0A=
                        var l =3D elListeners[i];=0A=
                        this.removeListener(oEl, l.type, l.fn);=0A=
                    }=0A=
                }=0A=
=0A=
                if (recurse && oEl && oEl.childNodes) {=0A=
                    for (i=3D0,len=3DoEl.childNodes.length; i<len ; ++i) =
{=0A=
                        this.purgeElement(oEl.childNodes[i], recurse, =
sType);=0A=
                    }=0A=
                }=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns all listeners attached to the given element via =
addListener.=0A=
             * Optionally, you can specify a specific type of event to =
return.=0A=
             * @method getListeners=0A=
             * @param el {HTMLElement|string} the element or element id =
to inspect =0A=
             * @param sType {string} optional type of listener to =
return. If=0A=
             * left out, all listeners will be returned=0A=
             * @return {Object} the listener. Contains the following =
fields:=0A=
             * &nbsp;&nbsp;type:   (string)   the type of event=0A=
             * &nbsp;&nbsp;fn:     (function) the callback supplied to =
addListener=0A=
             * &nbsp;&nbsp;obj:    (object)   the custom object supplied =
to addListener=0A=
             * &nbsp;&nbsp;adjust: (boolean|object)  whether or not to =
adjust the default scope=0A=
             * &nbsp;&nbsp;scope: (boolean)  the derived scope based on =
the adjust parameter=0A=
             * &nbsp;&nbsp;index:  (int)      its position in the Event =
util listener cache=0A=
             * @static=0A=
             */           =0A=
            getListeners: function(el, sType) {=0A=
                var results=3D[], searchLists;=0A=
                if (!sType) {=0A=
                    searchLists =3D [listeners, unloadListeners];=0A=
                } else if (sType =3D=3D=3D "unload") {=0A=
                    searchLists =3D [unloadListeners];=0A=
                } else {=0A=
                    searchLists =3D [listeners];=0A=
                }=0A=
=0A=
                var oEl =3D (YAHOO.lang.isString(el)) ? this.getEl(el) : =
el;=0A=
=0A=
                for (var j=3D0;j<searchLists.length; j=3Dj+1) {=0A=
                    var searchList =3D searchLists[j];=0A=
                    if (searchList) {=0A=
                        for (var i=3D0,len=3DsearchList.length; i<len ; =
++i) {=0A=
                            var l =3D searchList[i];=0A=
                            if ( l  && l[this.EL] =3D=3D=3D oEl && =0A=
                                    (!sType || sType =3D=3D=3D =
l[this.TYPE]) ) {=0A=
                                results.push({=0A=
                                    type:   l[this.TYPE],=0A=
                                    fn:     l[this.FN],=0A=
                                    obj:    l[this.OBJ],=0A=
                                    adjust: l[this.OVERRIDE],=0A=
                                    scope:  l[this.ADJ_SCOPE],=0A=
                                    index:  i=0A=
                                });=0A=
                            }=0A=
                        }=0A=
                    }=0A=
                }=0A=
=0A=
                return (results.length) ? results : null;=0A=
            },=0A=
=0A=
            /**=0A=
             * Removes all listeners registered by pe.event.  Called =0A=
             * automatically during the unload event.=0A=
             * @method _unload=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _unload: function(e) {=0A=
=0A=
                var EU =3D YAHOO.util.Event, i, j, l, len, index,=0A=
                         ul =3D unloadListeners.slice();=0A=
=0A=
                // execute and clear stored unload listeners=0A=
                for (i=3D0,len=3DunloadListeners.length; i<len; ++i) {=0A=
                    l =3D ul[i];=0A=
                    if (l) {=0A=
                        var scope =3D window;=0A=
                        if (l[EU.ADJ_SCOPE]) {=0A=
                            if (l[EU.ADJ_SCOPE] =3D=3D=3D true) {=0A=
                                scope =3D l[EU.UNLOAD_OBJ];=0A=
                            } else {=0A=
                                scope =3D l[EU.ADJ_SCOPE];=0A=
                            }=0A=
                        }=0A=
                        l[EU.FN].call(scope, EU.getEvent(e, l[EU.EL]), =
l[EU.UNLOAD_OBJ] );=0A=
                        ul[i] =3D null;=0A=
                        l=3Dnull;=0A=
                        scope=3Dnull;=0A=
                    }=0A=
                }=0A=
=0A=
                unloadListeners =3D null;=0A=
=0A=
                // Remove listeners to handle IE memory leaks=0A=
                //if (YAHOO.env.ua.ie && listeners && listeners.length > =
0) {=0A=
                =0A=
                // 2.5.0 listeners are removed for all browsers again.  =
FireFox preserves=0A=
                // at least some listeners between page refreshes, =
potentially causing=0A=
                // errors during page load (mouseover listeners firing =
before they=0A=
                // should if the user moves the mouse at the correct =
moment).=0A=
                if (listeners) {=0A=
                    for (j=3Dlisteners.length-1; j>-1; j--) {=0A=
                        l =3D listeners[j];=0A=
                        if (l) {=0A=
                            EU.removeListener(l[EU.EL], l[EU.TYPE], =
l[EU.FN], j);=0A=
                        } =0A=
                    }=0A=
                    l=3Dnull;=0A=
                }=0A=
=0A=
                legacyEvents =3D null;=0A=
=0A=
                EU._simpleRemove(window, "unload", EU._unload);=0A=
=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns scrollLeft=0A=
             * @method _getScrollLeft=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScrollLeft: function() {=0A=
                return this._getScroll()[1];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns scrollTop=0A=
             * @method _getScrollTop=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScrollTop: function() {=0A=
                return this._getScroll()[0];=0A=
            },=0A=
=0A=
            /**=0A=
             * Returns the scrollTop and scrollLeft.  Used to calculate =
the =0A=
             * pageX and pageY in Internet Explorer=0A=
             * @method _getScroll=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _getScroll: function() {=0A=
                var dd =3D document.documentElement, db =3D =
document.body;=0A=
                if (dd && (dd.scrollTop || dd.scrollLeft)) {=0A=
                    return [dd.scrollTop, dd.scrollLeft];=0A=
                } else if (db) {=0A=
                    return [db.scrollTop, db.scrollLeft];=0A=
                } else {=0A=
                    return [0, 0];=0A=
                }=0A=
            },=0A=
            =0A=
            /**=0A=
             * Used by old versions of CustomEvent, restored for =
backwards=0A=
             * compatibility=0A=
             * @method regCE=0A=
             * @private=0A=
             * @static=0A=
             * @deprecated still here for backwards compatibility=0A=
             */=0A=
            regCE: function() {=0A=
                // does nothing=0A=
            },=0A=
=0A=
            /**=0A=
             * Adds a DOM event directly without the caching, cleanup, =
scope adj, etc=0A=
             *=0A=
             * @method _simpleAdd=0A=
             * @param {HTMLElement} el      the element to bind the =
handler to=0A=
             * @param {string}      sType   the type of event handler=0A=
             * @param {function}    fn      the callback to invoke=0A=
             * @param {boolen}      capture capture or bubble phase=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _simpleAdd: function () {=0A=
                if (window.addEventListener) {=0A=
                    return function(el, sType, fn, capture) {=0A=
                        el.addEventListener(sType, fn, (capture));=0A=
                    };=0A=
                } else if (window.attachEvent) {=0A=
                    return function(el, sType, fn, capture) {=0A=
                        el.attachEvent("on" + sType, fn);=0A=
                    };=0A=
                } else {=0A=
                    return function(){};=0A=
                }=0A=
            }(),=0A=
=0A=
            /**=0A=
             * Basic remove listener=0A=
             *=0A=
             * @method _simpleRemove=0A=
             * @param {HTMLElement} el      the element to bind the =
handler to=0A=
             * @param {string}      sType   the type of event handler=0A=
             * @param {function}    fn      the callback to invoke=0A=
             * @param {boolen}      capture capture or bubble phase=0A=
             * @static=0A=
             * @private=0A=
             */=0A=
            _simpleRemove: function() {=0A=
                if (window.removeEventListener) {=0A=
                    return function (el, sType, fn, capture) {=0A=
                        el.removeEventListener(sType, fn, (capture));=0A=
                    };=0A=
                } else if (window.detachEvent) {=0A=
                    return function (el, sType, fn) {=0A=
                        el.detachEvent("on" + sType, fn);=0A=
                    };=0A=
                } else {=0A=
                    return function(){};=0A=
                }=0A=
            }()=0A=
        };=0A=
=0A=
    }();=0A=
=0A=
    (function() {=0A=
        var EU =3D YAHOO.util.Event;=0A=
=0A=
        /**=0A=
         * YAHOO.util.Event.on is an alias for addListener=0A=
         * @method on=0A=
         * @see addListener=0A=
         * @static=0A=
         */=0A=
        EU.on =3D EU.addListener;=0A=
=0A=
/*! DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller =
*/=0A=
=0A=
        // Internet Explorer: use the readyState of a defered script.=0A=
        // This isolates what appears to be a safe moment to manipulate=0A=
        // the DOM prior to when the document's readyState suggests=0A=
        // it is safe to do so.=0A=
        if (EU.isIE) {=0A=
=0A=
            // Process onAvailable/onContentReady items when the =0A=
            // DOM is ready.=0A=
            YAHOO.util.Event.onDOMReady(=0A=
                    YAHOO.util.Event._tryPreloadAttach,=0A=
                    YAHOO.util.Event, true);=0A=
            =0A=
            var n =3D document.createElement('p');  =0A=
=0A=
            EU._dri =3D setInterval(function() {=0A=
                try {=0A=
                    // throws an error if doc is not ready=0A=
                    n.doScroll('left');=0A=
                    clearInterval(EU._dri);=0A=
                    EU._dri =3D null;=0A=
                    EU._ready();=0A=
                    n =3D null;=0A=
                } catch (ex) { =0A=
                }=0A=
            }, EU.POLL_INTERVAL); =0A=
=0A=
        =0A=
        // The document's readyState in Safari currently will=0A=
        // change to loaded/complete before images are loaded.=0A=
        } else if (EU.webkit && EU.webkit < 525) {=0A=
=0A=
            EU._dri =3D setInterval(function() {=0A=
                var rs=3Ddocument.readyState;=0A=
                if ("loaded" =3D=3D rs || "complete" =3D=3D rs) {=0A=
                    clearInterval(EU._dri);=0A=
                    EU._dri =3D null;=0A=
                    EU._ready();=0A=
                }=0A=
            }, EU.POLL_INTERVAL); =0A=
=0A=
        // FireFox and Opera: These browsers provide a event for this=0A=
        // moment.  The latest WebKit releases now support this event.=0A=
        } else {=0A=
=0A=
            EU._simpleAdd(document, "DOMContentLoaded", EU._ready);=0A=
=0A=
        }=0A=
        /////////////////////////////////////////////////////////////=0A=
=0A=
=0A=
        EU._simpleAdd(window, "load", EU._load);=0A=
        EU._simpleAdd(window, "unload", EU._unload);=0A=
        EU._tryPreloadAttach();=0A=
    })();=0A=
=0A=
}=0A=
/**=0A=
 * EventProvider is designed to be used with YAHOO.augment to wrap =0A=
 * CustomEvents in an interface that allows events to be subscribed to =0A=
 * and fired by name.  This makes it possible for implementing code to=0A=
 * subscribe to an event that either has not been created yet, or will=0A=
 * not be created at all.=0A=
 *=0A=
 * @Class EventProvider=0A=
 */=0A=
YAHOO.util.EventProvider =3D function() { };=0A=
=0A=
YAHOO.util.EventProvider.prototype =3D {=0A=
=0A=
    /**=0A=
     * Private storage of custom events=0A=
     * @property __yui_events=0A=
     * @type Object[]=0A=
     * @private=0A=
     */=0A=
    __yui_events: null,=0A=
=0A=
    /**=0A=
     * Private storage of custom event subscribers=0A=
     * @property __yui_subscribers=0A=
     * @type Object[]=0A=
     * @private=0A=
     */=0A=
    __yui_subscribers: null,=0A=
    =0A=
    /**=0A=
     * Subscribe to a CustomEvent by event type=0A=
     *=0A=
     * @method subscribe=0A=
     * @param p_type     {string}   the type, or name of the event=0A=
     * @param p_fn       {function} the function to exectute when the =
event fires=0A=
     * @param p_obj      {Object}   An object to be passed along when =
the event =0A=
     *                              fires=0A=
     * @param p_override {boolean}  If true, the obj passed in becomes =
the =0A=
     *                              execution scope of the listener=0A=
     */=0A=
    subscribe: function(p_type, p_fn, p_obj, p_override) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var ce =3D this.__yui_events[p_type];=0A=
=0A=
        if (ce) {=0A=
            ce.subscribe(p_fn, p_obj, p_override);=0A=
        } else {=0A=
            this.__yui_subscribers =3D this.__yui_subscribers || {};=0A=
            var subs =3D this.__yui_subscribers;=0A=
            if (!subs[p_type]) {=0A=
                subs[p_type] =3D [];=0A=
            }=0A=
            subs[p_type].push(=0A=
                { fn: p_fn, obj: p_obj, override: p_override } );=0A=
        }=0A=
    },=0A=
=0A=
    /**=0A=
     * Unsubscribes one or more listeners the from the specified event=0A=
     * @method unsubscribe=0A=
     * @param p_type {string}   The type, or name of the event.  If the =
type=0A=
     *                          is not specified, it will attempt to =
remove=0A=
     *                          the listener from all hosted events.=0A=
     * @param p_fn   {Function} The subscribed function to unsubscribe, =
if not=0A=
     *                          supplied, all subscribers will be =
removed.=0A=
     * @param p_obj  {Object}   The custom object passed to subscribe.  =
This is=0A=
     *                        optional, but if supplied will be used to=0A=
     *                        disambiguate multiple listeners that are =
the same=0A=
     *                        (e.g., you subscribe many object using a =
function=0A=
     *                        that lives on the prototype)=0A=
     * @return {boolean} true if the subscriber was found and detached.=0A=
     */=0A=
    unsubscribe: function(p_type, p_fn, p_obj) {=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var evts =3D this.__yui_events;=0A=
        if (p_type) {=0A=
            var ce =3D evts[p_type];=0A=
            if (ce) {=0A=
                return ce.unsubscribe(p_fn, p_obj);=0A=
            }=0A=
        } else {=0A=
            var ret =3D true;=0A=
            for (var i in evts) {=0A=
                if (YAHOO.lang.hasOwnProperty(evts, i)) {=0A=
                    ret =3D ret && evts[i].unsubscribe(p_fn, p_obj);=0A=
                }=0A=
            }=0A=
            return ret;=0A=
        }=0A=
=0A=
        return false;=0A=
    },=0A=
    =0A=
    /**=0A=
     * Removes all listeners from the specified event.  If the event type=0A=
     * is not specified, all listeners from all hosted custom events will=0A=
     * be removed.=0A=
     * @method unsubscribeAll=0A=
     * @param p_type {string}   The type, or name of the event=0A=
     */=0A=
    unsubscribeAll: function(p_type) {=0A=
        return this.unsubscribe(p_type);=0A=
    },=0A=
=0A=
    /**=0A=
     * Creates a new custom event of the specified type.  If a custom =
event=0A=
     * by that name already exists, it will not be re-created.  In either=0A=
     * case the custom event is returned. =0A=
     *=0A=
     * @method createEvent=0A=
     *=0A=
     * @param p_type {string} the type, or name of the event=0A=
     * @param p_config {object} optional config params.  Valid =
properties are:=0A=
     *=0A=
     *  <ul>=0A=
     *    <li>=0A=
     *      scope: defines the default execution scope.  If not defined=0A=
     *      the default scope will be this instance.=0A=
     *    </li>=0A=
     *    <li>=0A=
     *      silent: if true, the custom event will not generate log =
messages.=0A=
     *      This is false by default.=0A=
     *    </li>=0A=
     *    <li>=0A=
     *      onSubscribeCallback: specifies a callback to execute when the=0A=
     *      event has a new subscriber.  This will fire immediately for=0A=
     *      each queued subscriber if any exist prior to the creation of=0A=
     *      the event.=0A=
     *    </li>=0A=
     *  </ul>=0A=
     *=0A=
     *  @return {CustomEvent} the custom event=0A=
     *=0A=
     */=0A=
    createEvent: function(p_type, p_config) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var opts =3D p_config || {};=0A=
        var events =3D this.__yui_events;=0A=
=0A=
        if (events[p_type]) {=0A=
        } else {=0A=
=0A=
            var scope  =3D opts.scope  || this;=0A=
            var silent =3D (opts.silent);=0A=
=0A=
            var ce =3D new YAHOO.util.CustomEvent(p_type, scope, silent,=0A=
                    YAHOO.util.CustomEvent.FLAT);=0A=
            events[p_type] =3D ce;=0A=
=0A=
            if (opts.onSubscribeCallback) {=0A=
                ce.subscribeEvent.subscribe(opts.onSubscribeCallback);=0A=
            }=0A=
=0A=
            this.__yui_subscribers =3D this.__yui_subscribers || {};=0A=
            var qs =3D this.__yui_subscribers[p_type];=0A=
=0A=
            if (qs) {=0A=
                for (var i=3D0; i<qs.length; ++i) {=0A=
                    ce.subscribe(qs[i].fn, qs[i].obj, qs[i].override);=0A=
                }=0A=
            }=0A=
        }=0A=
=0A=
        return events[p_type];=0A=
    },=0A=
=0A=
=0A=
   /**=0A=
     * Fire a custom event by name.  The callback functions will be =
executed=0A=
     * from the scope specified when the event was created, and with the =0A=
     * following parameters:=0A=
     *   <ul>=0A=
     *   <li>The first argument fire() was executed with</li>=0A=
     *   <li>The custom object (if any) that was passed into the =
subscribe() =0A=
     *       method</li>=0A=
     *   </ul>=0A=
     * If the custom event has not been explicitly created, it will be=0A=
     * created now with the default config, scoped to the host object=0A=
     * @method fireEvent=0A=
     * @param p_type    {string}  the type, or name of the event=0A=
     * @param arguments {Object*} an arbitrary set of parameters to pass =
to =0A=
     *                            the handler.=0A=
     * @return {boolean} the return value from CustomEvent.fire=0A=
     *                   =0A=
     */=0A=
    fireEvent: function(p_type, arg1, arg2, etc) {=0A=
=0A=
        this.__yui_events =3D this.__yui_events || {};=0A=
        var ce =3D this.__yui_events[p_type];=0A=
=0A=
        if (!ce) {=0A=
            return null;=0A=
        }=0A=
=0A=
        var args =3D [];=0A=
        for (var i=3D1; i<arguments.length; ++i) {=0A=
            args.push(arguments[i]);=0A=
        }=0A=
        return ce.fire.apply(ce, args);=0A=
    },=0A=
=0A=
    /**=0A=
     * Returns true if the custom event of the provided type has been =
created=0A=
     * with createEvent.=0A=
     * @method hasEvent=0A=
     * @param type {string} the type, or name of the event=0A=
     */=0A=
    hasEvent: function(type) {=0A=
        if (this.__yui_events) {=0A=
            if (this.__yui_events[type]) {=0A=
                return true;=0A=
            }=0A=
        }=0A=
        return false;=0A=
    }=0A=
=0A=
};=0A=
=0A=
/**=0A=
* KeyListener is a utility that provides an easy interface for listening =
for=0A=
* keydown/keyup events fired against DOM elements.=0A=
* @namespace YAHOO.util=0A=
* @class KeyListener=0A=
* @constructor=0A=
* @param {HTMLElement} attachTo The element or element ID to which the =
key =0A=
*                               event should be attached=0A=
* @param {String}      attachTo The element or element ID to which the =
key=0A=
*                               event should be attached=0A=
* @param {Object}      keyData  The object literal representing the =
key(s) =0A=
*                               to detect. Possible attributes are =0A=
*                               shift(boolean), alt(boolean), =
ctrl(boolean) =0A=
*                               and keys(either an int or an array of =
ints =0A=
*                               representing keycodes).=0A=
* @param {Function}    handler  The CustomEvent handler to fire when the =0A=
*                               key event is detected=0A=
* @param {Object}      handler  An object literal representing the =
handler. =0A=
* @param {String}      event    Optional. The event (keydown or keyup) =
to =0A=
*                               listen for. Defaults automatically to =
keydown.=0A=
*=0A=
* @knownissue the "keypress" event is completely broken in Safari 2.x =
and below.=0A=
*             the workaround is use "keydown" for key listening.  =
However, if=0A=
*             it is desired to prevent the default behavior of the =
keystroke,=0A=
*             that can only be done on the keypress event.  This makes =
key=0A=
*             handling quite ugly.=0A=
* @knownissue keydown is also broken in Safari 2.x and below for the ESC =
key.=0A=
*             There currently is no workaround other than choosing =
another=0A=
*             key to listen for.=0A=
*/=0A=
YAHOO.util.KeyListener =3D function(attachTo, keyData, handler, event) {=0A=
    if (!attachTo) {=0A=
    } else if (!keyData) {=0A=
    } else if (!handler) {=0A=
    } =0A=
    =0A=
    if (!event) {=0A=
        event =3D YAHOO.util.KeyListener.KEYDOWN;=0A=
    }=0A=
=0A=
    /**=0A=
    * The CustomEvent fired internally when a key is pressed=0A=
    * @event keyEvent=0A=
    * @private=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    var keyEvent =3D new YAHOO.util.CustomEvent("keyPressed");=0A=
    =0A=
    /**=0A=
    * The CustomEvent fired when the KeyListener is enabled via the =
enable() =0A=
    * function=0A=
    * @event enabledEvent=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    this.enabledEvent =3D new YAHOO.util.CustomEvent("enabled");=0A=
=0A=
    /**=0A=
    * The CustomEvent fired when the KeyListener is disabled via the =0A=
    * disable() function=0A=
    * @event disabledEvent=0A=
    * @param {Object} keyData The object literal representing the key(s) =
to =0A=
    *                         detect. Possible attributes are =
shift(boolean), =0A=
    *                         alt(boolean), ctrl(boolean) and =
keys(either an =0A=
    *                         int or an array of ints representing =
keycodes).=0A=
    */=0A=
    this.disabledEvent =3D new YAHOO.util.CustomEvent("disabled");=0A=
=0A=
    if (typeof attachTo =3D=3D 'string') {=0A=
        attachTo =3D document.getElementById(attachTo);=0A=
    }=0A=
=0A=
    if (typeof handler =3D=3D 'function') {=0A=
        keyEvent.subscribe(handler);=0A=
    } else {=0A=
        keyEvent.subscribe(handler.fn, handler.scope, =
handler.correctScope);=0A=
    }=0A=
=0A=
    /**=0A=
    * Handles the key event when a key is pressed.=0A=
    * @method handleKeyPress=0A=
    * @param {DOMEvent} e   The keypress DOM event=0A=
    * @param {Object}   obj The DOM event scope object=0A=
    * @private=0A=
    */=0A=
    function handleKeyPress(e, obj) {=0A=
        if (! keyData.shift) {  =0A=
            keyData.shift =3D false; =0A=
        }=0A=
        if (! keyData.alt) {    =0A=
            keyData.alt =3D false;=0A=
        }=0A=
        if (! keyData.ctrl) {=0A=
            keyData.ctrl =3D false;=0A=
        }=0A=
=0A=
        // check held down modifying keys first=0A=
        if (e.shiftKey =3D=3D keyData.shift && =0A=
            e.altKey   =3D=3D keyData.alt &&=0A=
            e.ctrlKey  =3D=3D keyData.ctrl) { // if we pass this, all =
modifiers match=0A=
            =0A=
            var dataItem;=0A=
=0A=
            if (keyData.keys instanceof Array) {=0A=
                for (var i=3D0;i<keyData.keys.length;i++) {=0A=
                    dataItem =3D keyData.keys[i];=0A=
=0A=
                    if (dataItem =3D=3D e.charCode ) {=0A=
                        keyEvent.fire(e.charCode, e);=0A=
                        break;=0A=
                    } else if (dataItem =3D=3D e.keyCode) {=0A=
                        keyEvent.fire(e.keyCode, e);=0A=
                        break;=0A=
                    }=0A=
                }=0A=
            } else {=0A=
                dataItem =3D keyData.keys;=0A=
                if (dataItem =3D=3D e.charCode ) {=0A=
                    keyEvent.fire(e.charCode, e);=0A=
                } else if (dataItem =3D=3D e.keyCode) {=0A=
                    keyEvent.fire(e.keyCode, e);=0A=
                }=0A=
            }=0A=
        }=0A=
    }=0A=
=0A=
    /**=0A=
    * Enables the KeyListener by attaching the DOM event listeners to =
the =0A=
    * target DOM element=0A=
    * @method enable=0A=
    */=0A=
    this.enable =3D function() {=0A=
        if (! this.enabled) {=0A=
            YAHOO.util.Event.addListener(attachTo, event, =
handleKeyPress);=0A=
            this.enabledEvent.fire(keyData);=0A=
        }=0A=
        /**=0A=
        * Boolean indicating the enabled/disabled state of the Tooltip=0A=
        * @property enabled=0A=
        * @type Boolean=0A=
        */=0A=
        this.enabled =3D true;=0A=
    };=0A=
=0A=
    /**=0A=
    * Disables the KeyListener by removing the DOM event listeners from =
the =0A=
    * target DOM element=0A=
    * @method disable=0A=
    */=0A=
    this.disable =3D function() {=0A=
        if (this.enabled) {=0A=
            YAHOO.util.Event.removeListener(attachTo, event, =
handleKeyPress);=0A=
            this.disabledEvent.fire(keyData);=0A=
        }=0A=
        this.enabled =3D false;=0A=
    };=0A=
=0A=
    /**=0A=
    * Returns a String representation of the object.=0A=
    * @method toString=0A=
    * @return {String}  The string representation of the KeyListener=0A=
    */ =0A=
    this.toString =3D function() {=0A=
        return "KeyListener [" + keyData.keys + "] " + attachTo.tagName =
+ =0A=
                (attachTo.id ? "[" + attachTo.id + "]" : "");=0A=
    };=0A=
=0A=
};=0A=
=0A=
/**=0A=
* Constant representing the DOM "keydown" event.=0A=
* @property YAHOO.util.KeyListener.KEYDOWN=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYDOWN =3D "keydown";=0A=
=0A=
/**=0A=
* Constant representing the DOM "keyup" event.=0A=
* @property YAHOO.util.KeyListener.KEYUP=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYUP =3D "keyup";=0A=
=0A=
/**=0A=
 * keycode constants for a subset of the special keys=0A=
 * @property KEY=0A=
 * @static=0A=
 * @final=0A=
 */=0A=
YAHOO.util.KeyListener.KEY =3D {=0A=
    ALT          : 18,=0A=
    BACK_SPACE   : 8,=0A=
    CAPS_LOCK    : 20,=0A=
    CONTROL      : 17,=0A=
    DELETE       : 46,=0A=
    DOWN         : 40,=0A=
    END          : 35,=0A=
    ENTER        : 13,=0A=
    ESCAPE       : 27,=0A=
    HOME         : 36,=0A=
    LEFT         : 37,=0A=
    META         : 224,=0A=
    NUM_LOCK     : 144,=0A=
    PAGE_DOWN    : 34,=0A=
    PAGE_UP      : 33, =0A=
    PAUSE        : 19,=0A=
    PRINTSCREEN  : 44,=0A=
    RIGHT        : 39,=0A=
    SCROLL_LOCK  : 145,=0A=
    SHIFT        : 16,=0A=
    SPACE        : 32,=0A=
    TAB          : 9,=0A=
    UP           : 38=0A=
};=0A=
YAHOO.register("event", YAHOO.util.Event, {version: "2.5.1", build: =
"984"});=0A=
/*=0A=
Copyright (c) 2008, Yahoo! Inc. All rights reserved.=0A=
Code licensed under the BSD License:=0A=
http://developer.yahoo.net/yui/license.txt=0A=
version: 2.5.1=0A=
*/=0A=
/**=0A=
 * The Connection Manager provides a simplified interface to the =
XMLHttpRequest=0A=
 * object.  It handles cross-browser instantiantion of XMLHttpRequest, =
negotiates the=0A=
 * interactive states and server response, returning the results to a =
pre-defined=0A=
 * callback you create.=0A=
 *=0A=
 * @namespace YAHOO.util=0A=
 * @module connection=0A=
 * @requires yahoo=0A=
 * @requires event=0A=
 */=0A=
=0A=
/**=0A=
 * The Connection Manager singleton provides methods for creating and =
managing=0A=
 * asynchronous transactions.=0A=
 *=0A=
 * @class Connect=0A=
 */=0A=
=0A=
YAHOO.util.Connect =3D=0A=
{=0A=
  /**=0A=
   * @description Array of MSFT ActiveX ids for XMLHttpRequest.=0A=
   * @property _msxml_progid=0A=
   * @private=0A=
   * @static=0A=
   * @type array=0A=
   */=0A=
	_msxml_progid:[=0A=
		'Microsoft.XMLHTTP',=0A=
		'MSXML2.XMLHTTP.3.0',=0A=
		'MSXML2.XMLHTTP'=0A=
		],=0A=
=0A=
  /**=0A=
   * @description Object literal of HTTP header(s)=0A=
   * @property _http_header=0A=
   * @private=0A=
   * @static=0A=
   * @type object=0A=
   */=0A=
	_http_headers:{},=0A=
=0A=
  /**=0A=
   * @description Determines if HTTP headers are set.=0A=
   * @property _has_http_headers=0A=
   * @private=0A=
   * @static=0A=
   * @type boolean=0A=
   */=0A=
	_has_http_headers:false,=0A=
=0A=
 /**=0A=
  * @description Determines if a default header of=0A=
  * Content-Type of 'application/x-www-form-urlencoded'=0A=
  * will be added to any client HTTP headers sent for POST=0A=
  * transactions.=0A=
  * @property _use_default_post_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _use_default_post_header:true,=0A=
=0A=
 /**=0A=
  * @description The default header used for POST transactions.=0A=
  * @property _default_post_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _default_post_header:'application/x-www-form-urlencoded; =
charset=3DUTF-8',=0A=
=0A=
 /**=0A=
  * @description The default header used for transactions involving the=0A=
  * use of HTML forms.=0A=
  * @property _default_form_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _default_form_header:'application/x-www-form-urlencoded',=0A=
=0A=
 /**=0A=
  * @description Determines if a default header of=0A=
  * 'X-Requested-With: XMLHttpRequest'=0A=
  * will be added to each transaction.=0A=
  * @property _use_default_xhr_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _use_default_xhr_header:true,=0A=
=0A=
 /**=0A=
  * @description The default header value for the label=0A=
  * "X-Requested-With".  This is sent with each=0A=
  * transaction, by default, to identify the=0A=
  * request as being made by YUI Connection Manager.=0A=
  * @property _default_xhr_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _default_xhr_header:'XMLHttpRequest',=0A=
=0A=
 /**=0A=
  * @description Determines if custom, default headers=0A=
  * are set for each transaction.=0A=
  * @property _has_default_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _has_default_headers:true,=0A=
=0A=
 /**=0A=
  * @description Determines if custom, default headers=0A=
  * are set for each transaction.=0A=
  * @property _has_default_header=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _default_headers:{},=0A=
=0A=
 /**=0A=
  * @description Property modified by setForm() to determine if the data=0A=
  * should be submitted as an HTML form.=0A=
  * @property _isFormSubmit=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _isFormSubmit:false,=0A=
=0A=
 /**=0A=
  * @description Property modified by setForm() to determine if a file(s)=0A=
  * upload is expected.=0A=
  * @property _isFileUpload=0A=
  * @private=0A=
  * @static=0A=
  * @type boolean=0A=
  */=0A=
    _isFileUpload:false,=0A=
=0A=
 /**=0A=
  * @description Property modified by setForm() to set a reference to =
the HTML=0A=
  * form node if the desired action is file upload.=0A=
  * @property _formNode=0A=
  * @private=0A=
  * @static=0A=
  * @type object=0A=
  */=0A=
    _formNode:null,=0A=
=0A=
 /**=0A=
  * @description Property modified by setForm() to set the HTML form data=0A=
  * for each transaction.=0A=
  * @property _sFormData=0A=
  * @private=0A=
  * @static=0A=
  * @type string=0A=
  */=0A=
    _sFormData:null,=0A=
=0A=
 /**=0A=
  * @description Collection of polling references to the polling =
mechanism in handleReadyState.=0A=
  * @property _poll=0A=
  * @private=0A=
  * @static=0A=
  * @type object=0A=
  */=0A=
    _poll:{},=0A=
=0A=
 /**=0A=
  * @description Queue of timeout values for each transaction callback =
with a defined timeout value.=0A=
  * @property _timeOut=0A=
  * @private=0A=
  * @static=0A=
  * @type object=0A=
  */=0A=
    _timeOut:{},=0A=
=0A=
  /**=0A=
   * @description The polling frequency, in milliseconds, for =
HandleReadyState.=0A=
   * when attempting to determine a transaction's XHR readyState.=0A=
   * The default is 50 milliseconds.=0A=
   * @property _polling_interval=0A=
   * @private=0A=
   * @static=0A=
   * @type int=0A=
   */=0A=
     _polling_interval:50,=0A=
=0A=
  /**=0A=
   * @description A transaction counter that increments the transaction =
id for each transaction.=0A=
   * @property _transaction_id=0A=
   * @private=0A=
   * @static=0A=
   * @type int=0A=
   */=0A=
     _transaction_id:0,=0A=
=0A=
  /**=0A=
   * @description Tracks the name-value pair of the "clicked" submit =
button if multiple submit=0A=
   * buttons are present in an HTML form; and, if YAHOO.util.Event is =
available.=0A=
   * @property _submitElementValue=0A=
   * @private=0A=
   * @static=0A=
   * @type string=0A=
   */=0A=
	 _submitElementValue:null,=0A=
=0A=
  /**=0A=
   * @description Determines whether YAHOO.util.Event is available and =
returns true or false.=0A=
   * If true, an event listener is bound at the document level to trap =
click events that=0A=
   * resolve to a target type of "Submit".  This listener will enable =
setForm() to determine=0A=
   * the clicked "Submit" value in a multi-Submit button, HTML form.=0A=
   * @property _hasSubmitListener=0A=
   * @private=0A=
   * @static=0A=
   */=0A=
	 _hasSubmitListener:(function()=0A=
	 {=0A=
		if(YAHOO.util.Event){=0A=
			YAHOO.util.Event.addListener(=0A=
				document,=0A=
				'click',=0A=
				function(e){=0A=
					var obj =3D YAHOO.util.Event.getTarget(e);=0A=
					if(obj.nodeName.toLowerCase() =3D=3D 'input' && (obj.type && =
obj.type.toLowerCase() =3D=3D 'submit')){=0A=
						YAHOO.util.Connect._submitElementValue =3D =
encodeURIComponent(obj.name) + "=3D" + encodeURIComponent(obj.value);=0A=
					}=0A=
				});=0A=
			return true;=0A=
	    }=0A=
	    return false;=0A=
	 })(),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires at the start of a transaction=0A=
   * @property startEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	startEvent: new YAHOO.util.CustomEvent('start'),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires when a transaction response =
has completed.=0A=
   * @property completeEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	completeEvent: new YAHOO.util.CustomEvent('complete'),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires when =
handleTransactionResponse() determines a=0A=
   * response in the HTTP 2xx range.=0A=
   * @property successEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	successEvent: new YAHOO.util.CustomEvent('success'),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires when =
handleTransactionResponse() determines a=0A=
   * response in the HTTP 4xx/5xx range.=0A=
   * @property failureEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	failureEvent: new YAHOO.util.CustomEvent('failure'),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires when =
handleTransactionResponse() determines a=0A=
   * response in the HTTP 4xx/5xx range.=0A=
   * @property failureEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	uploadEvent: new YAHOO.util.CustomEvent('upload'),=0A=
=0A=
  /**=0A=
   * @description Custom event that fires when a transaction is =
successfully aborted.=0A=
   * @property abortEvent=0A=
   * @private=0A=
   * @static=0A=
   * @type CustomEvent=0A=
   */=0A=
	abortEvent: new YAHOO.util.CustomEvent('abort'),=0A=
=0A=
  /**=0A=
   * @description A reference table that maps callback custom events =
members to its specific=0A=
   * event name.=0A=
   * @property _customEvents=0A=
   * @private=0A=
   * @static=0A=
   * @type object=0A=
   */=0A=
	_customEvents:=0A=
	{=0A=
		onStart:['startEvent', 'start'],=0A=
		onComplete:['completeEvent', 'complete'],=0A=
		onSuccess:['successEvent', 'success'],=0A=
		onFailure:['failureEvent', 'failure'],=0A=
		onUpload:['uploadEvent', 'upload'],=0A=
		onAbort:['abortEvent', 'abort']=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Member to add an ActiveX id to the existing xml_progid =
array.=0A=
   * In the event(unlikely) a new ActiveX id is introduced, it can be =
added=0A=
   * without internal code modifications.=0A=
   * @method setProgId=0A=
   * @public=0A=
   * @static=0A=
   * @param {string} id The ActiveX id to be added to initialize the XHR =
object.=0A=
   * @return void=0A=
   */=0A=
	setProgId:function(id)=0A=
	{=0A=
		this._msxml_progid.unshift(id);=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Member to override the default POST header.=0A=
   * @method setDefaultPostHeader=0A=
   * @public=0A=
   * @static=0A=
   * @param {boolean} b Set and use default header - true or false .=0A=
   * @return void=0A=
   */=0A=
	setDefaultPostHeader:function(b)=0A=
	{=0A=
		if(typeof b =3D=3D 'string'){=0A=
			this._default_post_header =3D b;=0A=
		}=0A=
		else if(typeof b =3D=3D 'boolean'){=0A=
			this._use_default_post_header =3D b;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Member to override the default transaction header..=0A=
   * @method setDefaultXhrHeader=0A=
   * @public=0A=
   * @static=0A=
   * @param {boolean} b Set and use default header - true or false .=0A=
   * @return void=0A=
   */=0A=
	setDefaultXhrHeader:function(b)=0A=
	{=0A=
		if(typeof b =3D=3D 'string'){=0A=
			this._default_xhr_header =3D b;=0A=
		}=0A=
		else{=0A=
			this._use_default_xhr_header =3D b;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Member to modify the default polling interval.=0A=
   * @method setPollingInterval=0A=
   * @public=0A=
   * @static=0A=
   * @param {int} i The polling interval in milliseconds.=0A=
   * @return void=0A=
   */=0A=
	setPollingInterval:function(i)=0A=
	{=0A=
		if(typeof i =3D=3D 'number' && isFinite(i)){=0A=
			this._polling_interval =3D i;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Instantiates a XMLHttpRequest object and returns an =
object with two properties:=0A=
   * the XMLHttpRequest instance and the transaction id.=0A=
   * @method createXhrObject=0A=
   * @private=0A=
   * @static=0A=
   * @param {int} transactionId Property containing the transaction id =
for this transaction.=0A=
   * @return object=0A=
   */=0A=
	createXhrObject:function(transactionId)=0A=
	{=0A=
		var obj,http;=0A=
		try=0A=
		{=0A=
			// Instantiates XMLHttpRequest in non-IE browsers and assigns to http.=0A=
			http =3D new XMLHttpRequest();=0A=
			//  Object literal with http and tId properties=0A=
			obj =3D { conn:http, tId:transactionId };=0A=
		}=0A=
		catch(e)=0A=
		{=0A=
			for(var i=3D0; i<this._msxml_progid.length; ++i){=0A=
				try=0A=
				{=0A=
					// Instantiates XMLHttpRequest for IE and assign to http=0A=
					http =3D new ActiveXObject(this._msxml_progid[i]);=0A=
					//  Object literal with conn and tId properties=0A=
					obj =3D { conn:http, tId:transactionId };=0A=
					break;=0A=
				}=0A=
				catch(e){}=0A=
			}=0A=
		}=0A=
		finally=0A=
		{=0A=
			return obj;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description This method is called by asyncRequest to create a=0A=
   * valid connection object for the transaction.  It also passes a=0A=
   * transaction id and increments the transaction id counter.=0A=
   * @method getConnectionObject=0A=
   * @private=0A=
   * @static=0A=
   * @return {object}=0A=
   */=0A=
	getConnectionObject:function(isFileUpload)=0A=
	{=0A=
		var o;=0A=
		var tId =3D this._transaction_id;=0A=
=0A=
		try=0A=
		{=0A=
			if(!isFileUpload){=0A=
				o =3D this.createXhrObject(tId);=0A=
			}=0A=
			else{=0A=
				o =3D {};=0A=
				o.tId =3D tId;=0A=
				o.isUpload =3D true;=0A=
			}=0A=
=0A=
			if(o){=0A=
				this._transaction_id++;=0A=
			}=0A=
		}=0A=
		catch(e){}=0A=
		finally=0A=
		{=0A=
			return o;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Method for initiating an asynchronous request via the =
XHR object.=0A=
   * @method asyncRequest=0A=
   * @public=0A=
   * @static=0A=
   * @param {string} method HTTP transaction method=0A=
   * @param {string} uri Fully qualified path of resource=0A=
   * @param {callback} callback User-defined callback function or object=0A=
   * @param {string} postData POST body=0A=
   * @return {object} Returns the connection object=0A=
   */=0A=
	asyncRequest:function(method, uri, callback, postData)=0A=
	{=0A=
		var o =3D =
(this._isFileUpload)?this.getConnectionObject(true):this.getConnectionObj=
ect();=0A=
		var args =3D (callback && callback.argument)?callback.argument:null;=0A=
=0A=
		if(!o){=0A=
			return null;=0A=
		}=0A=
		else{=0A=
=0A=
			// Intialize any transaction-specific custom events, if provided.=0A=
			if(callback && callback.customevents){=0A=
				this.initCustomEvents(o, callback);=0A=
			}=0A=
=0A=
			if(this._isFormSubmit){=0A=
				if(this._isFileUpload){=0A=
					this.uploadFile(o, callback, uri, postData);=0A=
					return o;=0A=
				}=0A=
=0A=
				// If the specified HTTP method is GET, setForm() will return an=0A=
				// encoded string that is concatenated to the uri to=0A=
				// create a querystring.=0A=
				if(method.toUpperCase() =3D=3D 'GET'){=0A=
					if(this._sFormData.length !=3D=3D 0){=0A=
						// If the URI already contains a querystring, append an ampersand=0A=
						// and then concatenate _sFormData to the URI.=0A=
						uri +=3D ((uri.indexOf('?') =3D=3D -1)?'?':'&') + this._sFormData;=0A=
					}=0A=
				}=0A=
				else if(method.toUpperCase() =3D=3D 'POST'){=0A=
					// If POST data exist in addition to the HTML form data,=0A=
					// it will be concatenated to the form data.=0A=
					postData =3D postData?this._sFormData + "&" + =
postData:this._sFormData;=0A=
				}=0A=
			}=0A=
=0A=
			if(method.toUpperCase() =3D=3D 'GET' && (callback && callback.cache =
=3D=3D=3D false)){=0A=
				// If callback.cache is defined and set to false, a=0A=
				// timestamp value will be added to the querystring.=0A=
				uri +=3D ((uri.indexOf('?') =3D=3D -1)?'?':'&') + "rnd=3D" + new =
Date().valueOf().toString();=0A=
			}=0A=
=0A=
			o.conn.open(method, uri, true);=0A=
=0A=
			// Each transaction will automatically include a custom header of=0A=
			// "X-Requested-With: XMLHttpRequest" to identify the request as=0A=
			// having originated from Connection Manager.=0A=
			if(this._use_default_xhr_header){=0A=
				if(!this._default_headers['X-Requested-With']){=0A=
					this.initHeader('X-Requested-With', this._default_xhr_header, true);=0A=
				}=0A=
			}=0A=
=0A=
			//If the transaction method is POST and the POST header value is set =
to true=0A=
			//or a custom value, initalize the Content-Type header to this value.=0A=
			if((method.toUpperCase() =3D=3D 'POST' && =
this._use_default_post_header) && this._isFormSubmit =3D=3D=3D false){=0A=
				this.initHeader('Content-Type', this._default_post_header);=0A=
			}=0A=
=0A=
			//Initialize all default and custom HTTP headers,=0A=
			if(this._has_default_headers || this._has_http_headers){=0A=
				this.setHeader(o);=0A=
			}=0A=
=0A=
			this.handleReadyState(o, callback);=0A=
			o.conn.send(postData || '');=0A=
=0A=
=0A=
			// Reset the HTML form data and state properties as=0A=
			// soon as the data are submitted.=0A=
			if(this._isFormSubmit =3D=3D=3D true){=0A=
				this.resetFormState();=0A=
			}=0A=
=0A=
			// Fire global custom event -- startEvent=0A=
			this.startEvent.fire(o, args);=0A=
=0A=
			if(o.startEvent){=0A=
				// Fire transaction custom event -- startEvent=0A=
				o.startEvent.fire(o, args);=0A=
			}=0A=
=0A=
			return o;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description This method creates and subscribes custom events,=0A=
   * specific to each transaction=0A=
   * @method initCustomEvents=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object=0A=
   * @param {callback} callback The user-defined callback object=0A=
   * @return {void}=0A=
   */=0A=
	initCustomEvents:function(o, callback)=0A=
	{=0A=
		// Enumerate through callback.customevents members and bind/subscribe=0A=
		// events that match in the _customEvents table.=0A=
		for(var prop in callback.customevents){=0A=
			if(this._customEvents[prop][0]){=0A=
				// Create the custom event=0A=
				o[this._customEvents[prop][0]] =3D new =
YAHOO.util.CustomEvent(this._customEvents[prop][1], =
(callback.scope)?callback.scope:null);=0A=
=0A=
				// Subscribe the custom event=0A=
				=
o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]);=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description This method serves as a timer that polls the XHR =
object's readyState=0A=
   * property during a transaction, instead of binding a callback to the=0A=
   * onreadystatechange event.  Upon readyState 4, =
handleTransactionResponse=0A=
   * will process the response, and the timer will be cleared.=0A=
   * @method handleReadyState=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object=0A=
   * @param {callback} callback The user-defined callback object=0A=
   * @return {void}=0A=
   */=0A=
=0A=
    handleReadyState:function(o, callback)=0A=
=0A=
    {=0A=
		var oConn =3D this;=0A=
		var args =3D (callback && callback.argument)?callback.argument:null;=0A=
=0A=
		if(callback && callback.timeout){=0A=
			this._timeOut[o.tId] =3D window.setTimeout(function(){ oConn.abort(o, =
callback, true); }, callback.timeout);=0A=
		}=0A=
=0A=
		this._poll[o.tId] =3D window.setInterval(=0A=
			function(){=0A=
				if(o.conn && o.conn.readyState =3D=3D=3D 4){=0A=
=0A=
					// Clear the polling interval for the transaction=0A=
					// and remove the reference from _poll.=0A=
					window.clearInterval(oConn._poll[o.tId]);=0A=
					delete oConn._poll[o.tId];=0A=
=0A=
					if(callback && callback.timeout){=0A=
						window.clearTimeout(oConn._timeOut[o.tId]);=0A=
						delete oConn._timeOut[o.tId];=0A=
					}=0A=
=0A=
					// Fire global custom event -- completeEvent=0A=
					oConn.completeEvent.fire(o, args);=0A=
=0A=
					if(o.completeEvent){=0A=
						// Fire transaction custom event -- completeEvent=0A=
						o.completeEvent.fire(o, args);=0A=
					}=0A=
=0A=
					oConn.handleTransactionResponse(o, callback);=0A=
				}=0A=
			}=0A=
		,this._polling_interval);=0A=
    },=0A=
=0A=
  /**=0A=
   * @description This method attempts to interpret the server response =
and=0A=
   * determine whether the transaction was successful, or if an error or=0A=
   * exception was encountered.=0A=
   * @method handleTransactionResponse=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object=0A=
   * @param {object} callback The user-defined callback object=0A=
   * @param {boolean} isAbort Determines if the transaction was =
terminated via abort().=0A=
   * @return {void}=0A=
   */=0A=
    handleTransactionResponse:function(o, callback, isAbort)=0A=
    {=0A=
		var httpStatus, responseObject;=0A=
		var args =3D (callback && callback.argument)?callback.argument:null;=0A=
=0A=
		try=0A=
		{=0A=
			if(o.conn.status !=3D=3D undefined && o.conn.status !=3D=3D 0){=0A=
				httpStatus =3D o.conn.status;=0A=
			}=0A=
			else{=0A=
				httpStatus =3D 13030;=0A=
			}=0A=
		}=0A=
		catch(e){=0A=
=0A=
			 // 13030 is a custom code to indicate the condition -- in Mozilla/FF =
--=0A=
			 // when the XHR object's status and statusText properties are=0A=
			 // unavailable, and a query attempt throws an exception.=0A=
			httpStatus =3D 13030;=0A=
		}=0A=
=0A=
		if(httpStatus >=3D 200 && httpStatus < 300 || httpStatus =3D=3D=3D =
1223){=0A=
			responseObject =3D this.createResponseObject(o, args);=0A=
			if(callback && callback.success){=0A=
				if(!callback.scope){=0A=
					callback.success(responseObject);=0A=
				}=0A=
				else{=0A=
					// If a scope property is defined, the callback will be fired from=0A=
					// the context of the object.=0A=
					callback.success.apply(callback.scope, [responseObject]);=0A=
				}=0A=
			}=0A=
=0A=
			// Fire global custom event -- successEvent=0A=
			this.successEvent.fire(responseObject);=0A=
=0A=
			if(o.successEvent){=0A=
				// Fire transaction custom event -- successEvent=0A=
				o.successEvent.fire(responseObject);=0A=
			}=0A=
		}=0A=
		else{=0A=
			switch(httpStatus){=0A=
				// The following cases are wininet.dll error codes that may be =
encountered.=0A=
				case 12002: // Server timeout=0A=
				case 12029: // 12029 to 12031 correspond to dropped connections.=0A=
				case 12030:=0A=
				case 12031:=0A=
				case 12152: // Connection closed by server.=0A=
				case 13030: // See above comments for variable status.=0A=
					responseObject =3D this.createExceptionObject(o.tId, args, =
(isAbort?isAbort:false));=0A=
					if(callback && callback.failure){=0A=
						if(!callback.scope){=0A=
							callback.failure(responseObject);=0A=
						}=0A=
						else{=0A=
							callback.failure.apply(callback.scope, [responseObject]);=0A=
						}=0A=
					}=0A=
=0A=
					break;=0A=
				default:=0A=
					responseObject =3D this.createResponseObject(o, args);=0A=
					if(callback && callback.failure){=0A=
						if(!callback.scope){=0A=
							callback.failure(responseObject);=0A=
						}=0A=
						else{=0A=
							callback.failure.apply(callback.scope, [responseObject]);=0A=
						}=0A=
					}=0A=
			}=0A=
=0A=
			// Fire global custom event -- failureEvent=0A=
			this.failureEvent.fire(responseObject);=0A=
=0A=
			if(o.failureEvent){=0A=
				// Fire transaction custom event -- failureEvent=0A=
				o.failureEvent.fire(responseObject);=0A=
			}=0A=
=0A=
		}=0A=
=0A=
		this.releaseObject(o);=0A=
		responseObject =3D null;=0A=
    },=0A=
=0A=
  /**=0A=
   * @description This method evaluates the server response, creates and =
returns the results via=0A=
   * its properties.  Success and failure cases will differ in the =
response=0A=
   * object's property values.=0A=
   * @method createResponseObject=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object=0A=
   * @param {callbackArg} callbackArg The user-defined argument or =
arguments to be passed to the callback=0A=
   * @return {object}=0A=
   */=0A=
    createResponseObject:function(o, callbackArg)=0A=
    {=0A=
		var obj =3D {};=0A=
		var headerObj =3D {};=0A=
=0A=
		try=0A=
		{=0A=
			var headerStr =3D o.conn.getAllResponseHeaders();=0A=
			var header =3D headerStr.split('\n');=0A=
			for(var i=3D0; i<header.length; i++){=0A=
				var delimitPos =3D header[i].indexOf(':');=0A=
				if(delimitPos !=3D -1){=0A=
					headerObj[header[i].substring(0,delimitPos)] =3D =
header[i].substring(delimitPos+2);=0A=
				}=0A=
			}=0A=
		}=0A=
		catch(e){}=0A=
=0A=
		obj.tId =3D o.tId;=0A=
		// Normalize IE's response to HTTP 204 when Win error 1223.=0A=
		obj.status =3D (o.conn.status =3D=3D 1223)?204:o.conn.status;=0A=
		// Normalize IE's statusText to "No Content" instead of "Unknown".=0A=
		obj.statusText =3D (o.conn.status =3D=3D 1223)?"No =
Content":o.conn.statusText;=0A=
		obj.getResponseHeader =3D headerObj;=0A=
		obj.getAllResponseHeaders =3D headerStr;=0A=
		obj.responseText =3D o.conn.responseText;=0A=
		obj.responseXML =3D o.conn.responseXML;=0A=
=0A=
		if(callbackArg){=0A=
			obj.argument =3D callbackArg;=0A=
		}=0A=
=0A=
		return obj;=0A=
    },=0A=
=0A=
  /**=0A=
   * @description If a transaction cannot be completed due to dropped or =
closed connections,=0A=
   * there may be not be enough information to build a full response =
object.=0A=
   * The failure callback will be fired and this specific condition can =
be identified=0A=
   * by a status property value of 0.=0A=
   *=0A=
   * If an abort was successful, the status property will report a value =
of -1.=0A=
   *=0A=
   * @method createExceptionObject=0A=
   * @private=0A=
   * @static=0A=
   * @param {int} tId The Transaction Id=0A=
   * @param {callbackArg} callbackArg The user-defined argument or =
arguments to be passed to the callback=0A=
   * @param {boolean} isAbort Determines if the exception case is caused =
by a transaction abort=0A=
   * @return {object}=0A=
   */=0A=
    createExceptionObject:function(tId, callbackArg, isAbort)=0A=
    {=0A=
		var COMM_CODE =3D 0;=0A=
		var COMM_ERROR =3D 'communication failure';=0A=
		var ABORT_CODE =3D -1;=0A=
		var ABORT_ERROR =3D 'transaction aborted';=0A=
=0A=
		var obj =3D {};=0A=
=0A=
		obj.tId =3D tId;=0A=
		if(isAbort){=0A=
			obj.status =3D ABORT_CODE;=0A=
			obj.statusText =3D ABORT_ERROR;=0A=
		}=0A=
		else{=0A=
			obj.status =3D COMM_CODE;=0A=
			obj.statusText =3D COMM_ERROR;=0A=
		}=0A=
=0A=
		if(callbackArg){=0A=
			obj.argument =3D callbackArg;=0A=
		}=0A=
=0A=
		return obj;=0A=
    },=0A=
=0A=
  /**=0A=
   * @description Method that initializes the custom HTTP headers for =
the each transaction.=0A=
   * @method initHeader=0A=
   * @public=0A=
   * @static=0A=
   * @param {string} label The HTTP header label=0A=
   * @param {string} value The HTTP header value=0A=
   * @param {string} isDefault Determines if the specific header is a =
default header=0A=
   * automatically sent with each transaction.=0A=
   * @return {void}=0A=
   */=0A=
	initHeader:function(label, value, isDefault)=0A=
	{=0A=
		var headerObj =3D (isDefault)?this._default_headers:this._http_headers;=0A=
		headerObj[label] =3D value;=0A=
=0A=
		if(isDefault){=0A=
			this._has_default_headers =3D true;=0A=
		}=0A=
		else{=0A=
			this._has_http_headers =3D true;=0A=
		}=0A=
	},=0A=
=0A=
=0A=
  /**=0A=
   * @description Accessor that sets the HTTP headers for each =
transaction.=0A=
   * @method setHeader=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object for the transaction.=0A=
   * @return {void}=0A=
   */=0A=
	setHeader:function(o)=0A=
	{=0A=
		if(this._has_default_headers){=0A=
			for(var prop in this._default_headers){=0A=
				if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){=0A=
					o.conn.setRequestHeader(prop, this._default_headers[prop]);=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		if(this._has_http_headers){=0A=
			for(var prop in this._http_headers){=0A=
				if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){=0A=
					o.conn.setRequestHeader(prop, this._http_headers[prop]);=0A=
				}=0A=
			}=0A=
			delete this._http_headers;=0A=
=0A=
			this._http_headers =3D {};=0A=
			this._has_http_headers =3D false;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Resets the default HTTP headers object=0A=
   * @method resetDefaultHeaders=0A=
   * @public=0A=
   * @static=0A=
   * @return {void}=0A=
   */=0A=
	resetDefaultHeaders:function(){=0A=
		delete this._default_headers;=0A=
		this._default_headers =3D {};=0A=
		this._has_default_headers =3D false;=0A=
	},=0A=
=0A=
  /**=0A=
   * @description This method assembles the form label and value pairs =
and=0A=
   * constructs an encoded string.=0A=
   * asyncRequest() will automatically initialize the transaction with a=0A=
   * a HTTP header Content-Type of application/x-www-form-urlencoded.=0A=
   * @method setForm=0A=
   * @public=0A=
   * @static=0A=
   * @param {string || object} form id or name attribute, or form object.=0A=
   * @param {boolean} optional enable file upload.=0A=
   * @param {boolean} optional enable file upload over SSL in IE only.=0A=
   * @return {string} string of the HTML form field name and value =
pairs..=0A=
   */=0A=
	setForm:function(formId, isUpload, secureUri)=0A=
	{=0A=
		// reset the HTML form data and state properties=0A=
		this.resetFormState();=0A=
=0A=
		var oForm;=0A=
		if(typeof formId =3D=3D 'string'){=0A=
			// Determine if the argument is a form id or a form name.=0A=
			// Note form name usage is deprecated, but supported=0A=
			// here for backward compatibility.=0A=
			oForm =3D (document.getElementById(formId) || document.forms[formId]);=0A=
		}=0A=
		else if(typeof formId =3D=3D 'object'){=0A=
			// Treat argument as an HTML form object.=0A=
			oForm =3D formId;=0A=
		}=0A=
		else{=0A=
			return;=0A=
		}=0A=
=0A=
		// If the isUpload argument is true, setForm will call createFrame to =
initialize=0A=
		// an iframe as the form target.=0A=
		//=0A=
		// The argument secureURI is also required by IE in SSL environments=0A=
		// where the secureURI string is a fully qualified HTTP path, used to =
set the source=0A=
		// of the iframe, to a stub resource in the same domain.=0A=
		if(isUpload){=0A=
=0A=
			// Create iframe in preparation for file upload.=0A=
			var io =3D =
this.createFrame((window.location.href.toLowerCase().indexOf("https") =
=3D=3D=3D 0 || secureUri)?true:false);=0A=
			// Set form reference and file upload properties to true.=0A=
			this._isFormSubmit =3D true;=0A=
			this._isFileUpload =3D true;=0A=
			this._formNode =3D oForm;=0A=
=0A=
			return;=0A=
=0A=
		}=0A=
=0A=
		var oElement, oName, oValue, oDisabled;=0A=
		var hasSubmit =3D false;=0A=
=0A=
		// Iterate over the form elements collection to construct the=0A=
		// label-value pairs.=0A=
		for (var i=3D0; i<oForm.elements.length; i++){=0A=
			oElement =3D oForm.elements[i];=0A=
			oDisabled =3D oElement.disabled;=0A=
			oName =3D oElement.name;=0A=
			oValue =3D oElement.value;=0A=
=0A=
			// Do not submit fields that are disabled or=0A=
			// do not have a name attribute value.=0A=
			if(!oDisabled && oName)=0A=
			{=0A=
				switch(oElement.type)=0A=
				{=0A=
					case 'select-one':=0A=
					case 'select-multiple':=0A=
						for(var j=3D0; j<oElement.options.length; j++){=0A=
							if(oElement.options[j].selected){=0A=
								if(window.ActiveXObject){=0A=
									this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oElement.options[j].attributes['value'].specified?oEle=
ment.options[j].value:oElement.options[j].text) + '&';=0A=
								}=0A=
								else{=0A=
									this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oElement.options[j].hasAttribute('value')?oElement.opt=
ions[j].value:oElement.options[j].text) + '&';=0A=
								}=0A=
							}=0A=
						}=0A=
						break;=0A=
					case 'radio':=0A=
					case 'checkbox':=0A=
						if(oElement.checked){=0A=
							this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';=0A=
						}=0A=
						break;=0A=
					case 'file':=0A=
						// stub case as XMLHttpRequest will only send the file path as a =
string.=0A=
					case undefined:=0A=
						// stub case for fieldset element which returns undefined.=0A=
					case 'reset':=0A=
						// stub case for input type reset button.=0A=
					case 'button':=0A=
						// stub case for input type button elements.=0A=
						break;=0A=
					case 'submit':=0A=
						if(hasSubmit =3D=3D=3D false){=0A=
							if(this._hasSubmitListener && this._submitElementValue){=0A=
								this._sFormData +=3D this._submitElementValue + '&';=0A=
							}=0A=
							else{=0A=
								this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';=0A=
							}=0A=
=0A=
							hasSubmit =3D true;=0A=
						}=0A=
						break;=0A=
					default:=0A=
						this._sFormData +=3D encodeURIComponent(oName) + '=3D' + =
encodeURIComponent(oValue) + '&';=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		this._isFormSubmit =3D true;=0A=
		this._sFormData =3D this._sFormData.substr(0, this._sFormData.length - =
1);=0A=
=0A=
=0A=
		this.initHeader('Content-Type', this._default_form_header);=0A=
=0A=
		return this._sFormData;=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Resets HTML form properties when an HTML form or HTML =
form=0A=
   * with file upload transaction is sent.=0A=
   * @method resetFormState=0A=
   * @private=0A=
   * @static=0A=
   * @return {void}=0A=
   */=0A=
	resetFormState:function(){=0A=
		this._isFormSubmit =3D false;=0A=
		this._isFileUpload =3D false;=0A=
		this._formNode =3D null;=0A=
		this._sFormData =3D "";=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Creates an iframe to be used for form file uploads.  =
It is remove from the=0A=
   * document upon completion of the upload transaction.=0A=
   * @method createFrame=0A=
   * @private=0A=
   * @static=0A=
   * @param {string} optional qualified path of iframe resource for SSL =
in IE.=0A=
   * @return {void}=0A=
   */=0A=
	createFrame:function(secureUri){=0A=
=0A=
		// IE does not allow the setting of id and name attributes as object=0A=
		// properties via createElement().  A different iframe creation=0A=
		// pattern is required for IE.=0A=
		var frameId =3D 'yuiIO' + this._transaction_id;=0A=
		var io;=0A=
		if(window.ActiveXObject){=0A=
			io =3D document.createElement('<iframe id=3D"' + frameId + '" =
name=3D"' + frameId + '" />');=0A=
=0A=
			// IE will throw a security exception in an SSL environment if the=0A=
			// iframe source is undefined.=0A=
			if(typeof secureUri =3D=3D 'boolean'){=0A=
				io.src =3D 'javascript:false';=0A=
			}=0A=
		}=0A=
		else{=0A=
			io =3D document.createElement('iframe');=0A=
			io.id =3D frameId;=0A=
			io.name =3D frameId;=0A=
		}=0A=
=0A=
		io.style.position =3D 'absolute';=0A=
		io.style.top =3D '-1000px';=0A=
		io.style.left =3D '-1000px';=0A=
=0A=
		document.body.appendChild(io);=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Parses the POST data and creates hidden form elements=0A=
   * for each key-value, and appends them to the HTML form object.=0A=
   * @method appendPostData=0A=
   * @private=0A=
   * @static=0A=
   * @param {string} postData The HTTP POST data=0A=
   * @return {array} formElements Collection of hidden fields.=0A=
   */=0A=
	appendPostData:function(postData)=0A=
	{=0A=
		var formElements =3D [];=0A=
		var postMessage =3D postData.split('&');=0A=
		for(var i=3D0; i < postMessage.length; i++){=0A=
			var delimitPos =3D postMessage[i].indexOf('=3D');=0A=
			if(delimitPos !=3D -1){=0A=
				formElements[i] =3D document.createElement('input');=0A=
				formElements[i].type =3D 'hidden';=0A=
				formElements[i].name =3D postMessage[i].substring(0,delimitPos);=0A=
				formElements[i].value =3D postMessage[i].substring(delimitPos+1);=0A=
				this._formNode.appendChild(formElements[i]);=0A=
			}=0A=
		}=0A=
=0A=
		return formElements;=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Uploads HTML form, inclusive of files/attachments, =
using the=0A=
   * iframe created in createFrame to facilitate the transaction.=0A=
   * @method uploadFile=0A=
   * @private=0A=
   * @static=0A=
   * @param {int} id The transaction id.=0A=
   * @param {object} callback User-defined callback object.=0A=
   * @param {string} uri Fully qualified path of resource.=0A=
   * @param {string} postData POST data to be submitted in addition to =
HTML form.=0A=
   * @return {void}=0A=
   */=0A=
	uploadFile:function(o, callback, uri, postData){=0A=
=0A=
		// Each iframe has an id prefix of "yuiIO" followed=0A=
		// by the unique transaction id.=0A=
		var oConn =3D this;=0A=
		var frameId =3D 'yuiIO' + o.tId;=0A=
		var uploadEncoding =3D 'multipart/form-data';=0A=
		var io =3D document.getElementById(frameId);=0A=
		var args =3D (callback && callback.argument)?callback.argument:null;=0A=
=0A=
		// Track original HTML form attribute values.=0A=
		var rawFormAttributes =3D=0A=
		{=0A=
			action:this._formNode.getAttribute('action'),=0A=
			method:this._formNode.getAttribute('method'),=0A=
			target:this._formNode.getAttribute('target')=0A=
		};=0A=
=0A=
		// Initialize the HTML form properties in case they are=0A=
		// not defined in the HTML form.=0A=
		this._formNode.setAttribute('action', uri);=0A=
		this._formNode.setAttribute('method', 'POST');=0A=
		this._formNode.setAttribute('target', frameId);=0A=
=0A=
		if(this._formNode.encoding){=0A=
			// IE does not respect property enctype for HTML forms.=0A=
			// Instead it uses the property - "encoding".=0A=
			this._formNode.setAttribute('encoding', uploadEncoding);=0A=
		}=0A=
		else{=0A=
			this._formNode.setAttribute('enctype', uploadEncoding);=0A=
		}=0A=
=0A=
		if(postData){=0A=
			var oElements =3D this.appendPostData(postData);=0A=
		}=0A=
=0A=
		// Start file upload.=0A=
		this._formNode.submit();=0A=
=0A=
		// Fire global custom event -- startEvent=0A=
		this.startEvent.fire(o, args);=0A=
=0A=
		if(o.startEvent){=0A=
			// Fire transaction custom event -- startEvent=0A=
			o.startEvent.fire(o, args);=0A=
		}=0A=
=0A=
		// Start polling if a callback is present and the timeout=0A=
		// property has been defined.=0A=
		if(callback && callback.timeout){=0A=
			this._timeOut[o.tId] =3D window.setTimeout(function(){ oConn.abort(o, =
callback, true); }, callback.timeout);=0A=
		}=0A=
=0A=
		// Remove HTML elements created by appendPostData=0A=
		if(oElements && oElements.length > 0){=0A=
			for(var i=3D0; i < oElements.length; i++){=0A=
				this._formNode.removeChild(oElements[i]);=0A=
			}=0A=
		}=0A=
=0A=
		// Restore HTML form attributes to their original=0A=
		// values prior to file upload.=0A=
		for(var prop in rawFormAttributes){=0A=
			if(YAHOO.lang.hasOwnProperty(rawFormAttributes, prop)){=0A=
				if(rawFormAttributes[prop]){=0A=
					this._formNode.setAttribute(prop, rawFormAttributes[prop]);=0A=
				}=0A=
				else{=0A=
					this._formNode.removeAttribute(prop);=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		// Reset HTML form state properties.=0A=
		this.resetFormState();=0A=
=0A=
		// Create the upload callback handler that fires when the iframe=0A=
		// receives the load event.  Subsequently, the event handler is =
detached=0A=
		// and the iframe removed from the document.=0A=
		var uploadCallback =3D function()=0A=
		{=0A=
			if(callback && callback.timeout){=0A=
				window.clearTimeout(oConn._timeOut[o.tId]);=0A=
				delete oConn._timeOut[o.tId];=0A=
			}=0A=
=0A=
			// Fire global custom event -- completeEvent=0A=
			oConn.completeEvent.fire(o, args);=0A=
=0A=
			if(o.completeEvent){=0A=
				// Fire transaction custom event -- completeEvent=0A=
				o.completeEvent.fire(o, args);=0A=
			}=0A=
=0A=
			var obj =3D {};=0A=
			obj.tId =3D o.tId;=0A=
			obj.argument =3D callback.argument;=0A=
=0A=
			try=0A=
			{=0A=
				// responseText and responseXML will be populated with the same data =
from the iframe.=0A=
				// Since the HTTP headers cannot be read from the iframe=0A=
				obj.responseText =3D =
io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:i=
o.contentWindow.document.documentElement.textContent;=0A=
				obj.responseXML =3D =
io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocume=
nt:io.contentWindow.document;=0A=
			}=0A=
			catch(e){}=0A=
=0A=
			if(callback && callback.upload){=0A=
				if(!callback.scope){=0A=
					callback.upload(obj);=0A=
				}=0A=
				else{=0A=
					callback.upload.apply(callback.scope, [obj]);=0A=
				}=0A=
			}=0A=
=0A=
			// Fire global custom event -- uploadEvent=0A=
			oConn.uploadEvent.fire(obj);=0A=
=0A=
			if(o.uploadEvent){=0A=
				// Fire transaction custom event -- uploadEvent=0A=
				o.uploadEvent.fire(obj);=0A=
			}=0A=
=0A=
			YAHOO.util.Event.removeListener(io, "load", uploadCallback);=0A=
=0A=
			setTimeout(=0A=
				function(){=0A=
					document.body.removeChild(io);=0A=
					oConn.releaseObject(o);=0A=
				}, 100);=0A=
		};=0A=
=0A=
		// Bind the onload handler to the iframe to detect the file upload =
response.=0A=
		YAHOO.util.Event.addListener(io, "load", uploadCallback);=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Method to terminate a transaction, if it has not =
reached readyState 4.=0A=
   * @method abort=0A=
   * @public=0A=
   * @static=0A=
   * @param {object} o The connection object returned by asyncRequest.=0A=
   * @param {object} callback  User-defined callback object.=0A=
   * @param {string} isTimeout boolean to indicate if abort resulted =
from a callback timeout.=0A=
   * @return {boolean}=0A=
   */=0A=
	abort:function(o, callback, isTimeout)=0A=
	{=0A=
		var abortStatus;=0A=
		var args =3D (callback && callback.argument)?callback.argument:null;=0A=
=0A=
=0A=
		if(o && o.conn){=0A=
			if(this.isCallInProgress(o)){=0A=
				// Issue abort request=0A=
				o.conn.abort();=0A=
=0A=
				window.clearInterval(this._poll[o.tId]);=0A=
				delete this._poll[o.tId];=0A=
=0A=
				if(isTimeout){=0A=
					window.clearTimeout(this._timeOut[o.tId]);=0A=
					delete this._timeOut[o.tId];=0A=
				}=0A=
=0A=
				abortStatus =3D true;=0A=
			}=0A=
		}=0A=
		else if(o && o.isUpload =3D=3D=3D true){=0A=
			var frameId =3D 'yuiIO' + o.tId;=0A=
			var io =3D document.getElementById(frameId);=0A=
=0A=
			if(io){=0A=
				// Remove all listeners on the iframe prior to=0A=
				// its destruction.=0A=
				YAHOO.util.Event.removeListener(io, "load");=0A=
				// Destroy the iframe facilitating the transaction.=0A=
				document.body.removeChild(io);=0A=
=0A=
				if(isTimeout){=0A=
					window.clearTimeout(this._timeOut[o.tId]);=0A=
					delete this._timeOut[o.tId];=0A=
				}=0A=
=0A=
				abortStatus =3D true;=0A=
			}=0A=
		}=0A=
		else{=0A=
			abortStatus =3D false;=0A=
		}=0A=
=0A=
		if(abortStatus =3D=3D=3D true){=0A=
			// Fire global custom event -- abortEvent=0A=
			this.abortEvent.fire(o, args);=0A=
=0A=
			if(o.abortEvent){=0A=
				// Fire transaction custom event -- abortEvent=0A=
				o.abortEvent.fire(o, args);=0A=
			}=0A=
=0A=
			this.handleTransactionResponse(o, callback, true);=0A=
		}=0A=
=0A=
		return abortStatus;=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Determines if the transaction is still being processed.=0A=
   * @method isCallInProgress=0A=
   * @public=0A=
   * @static=0A=
   * @param {object} o The connection object returned by asyncRequest=0A=
   * @return {boolean}=0A=
   */=0A=
	isCallInProgress:function(o)=0A=
	{=0A=
		// if the XHR object assigned to the transaction has not been =
dereferenced,=0A=
		// then check its readyState status.  Otherwise, return false.=0A=
		if(o && o.conn){=0A=
			return o.conn.readyState !=3D=3D 4 && o.conn.readyState !=3D=3D 0;=0A=
		}=0A=
		else if(o && o.isUpload =3D=3D=3D true){=0A=
			var frameId =3D 'yuiIO' + o.tId;=0A=
			return document.getElementById(frameId)?true:false;=0A=
		}=0A=
		else{=0A=
			return false;=0A=
		}=0A=
	},=0A=
=0A=
  /**=0A=
   * @description Dereference the XHR instance and the connection object =
after the transaction is completed.=0A=
   * @method releaseObject=0A=
   * @private=0A=
   * @static=0A=
   * @param {object} o The connection object=0A=
   * @return {void}=0A=
   */=0A=
	releaseObject:function(o)=0A=
	{=0A=
		if(o && o.conn){=0A=
			//dereference the XHR instance.=0A=
			o.conn =3D null;=0A=
=0A=
=0A=
			//dereference the connection object.=0A=
			o =3D null;=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
YAHOO.register("connection", YAHOO.util.Connect, {version: "2.5.1", =
build: "984"});=0A=
/**=0A=
 * Package version: darla-0.3.3=0A=
 * Twiki: http://twiki.ads.yahoo.com/twiki/bin/view/Adserver/DARLA=0A=
 * Deploying: =
http://twiki.ads.yahoo.com/twiki/bin/view/Adserver/DarlaFaqUsage#Deployin=
g_Darla_for_use_on_your=0A=
 * JS Source: =
http://l.yimg.com/us.js.yimg.com/combo?darla/fc_0.2.7.js&darla/util_0.2.6=
.js&darla/renderers/complex_renderer_0.2.6.js=0A=
 */=0A=
if(typeof YAHOO=3D=3D=3D"undefined"){var YAHOO=3D{}}if(typeof =
YAHOO.ads=3D=3D=3D"undefined"){YAHOO.ads=3D{}}YAHOO.ads.darla=3D{_beacons=
:[],_eventTimer:null,_lastEvent:null,_handoffStore:null,_renderStore:null=
,_rotationTimer:null,_rotationTime:(new =
Date()).getTime(),_rotationEvents:false,_config:null,_baseConfig:{callFra=
me:"fccall",callScript:"/darla/fc.php",rotation:5000,autoRotation:false,a=
utoRotationWindow:1000,cancelShortEvents:true,doubleBuffering:true,autoSw=
itchRendering:true,property:"yahoo",encoding:"utf-8",standardDelay:100,ca=
ncellableDelay:500,beaconDelay:2000,beaconUrl:"http://geo.yahoo.com/serv?=
s=3D",beaconType:"geo",throbberDelay:350,simpleTemplate:"<html><head><!--=
ENCODING--><base target=3D'_blank' /><!--STYLE--></head><body =
style=3D'overflow:hidden;'><table width=3D'100%' cellspacing=3D'0' =
cellpadding=3D'0'><tr><td align=3Dcenter =
valign=3Dtop><!--ADHTML--></td></tr></table></body></html>",simpleTemplat=
eEncodingTag:"<meta http-equiv=3D'Content-Type' =
content=3D'text/html;charset=3D__ENCODING__'>",simpleTemplateStyleTag:"<s=
tyle> body { background-color: __BGCOLOR__; } =
</style>"},setConfig:function(A,B){YAHOO.ads.darla._config=3DA;if(B=3D=3D=
=3D0){YAHOO.ads.darla._config._startRotationTimer()}},event:function(A,C)=
{if(YAHOO.ads.darla._config=3D=3Dnull){return }var =
B=3DYAHOO.ads.darla.lookupActionSettings(A,C);YAHOO.ads.darla.log("YAHOO.=
ads.darla.event called with action: =
"+A+"-"+YAHOO.ads.darla.lookupSpaceID(A),true);if((B.lv=3D=3D-1)&&!YAHOO.=
ads.darla.getConfigSetting("autoRotation")){return =
}if(YAHOO.ads.darla._eventTimer!=3Dnull){if((YAHOO.ads.darla.getConfigSet=
ting("cancelShortEvents")=3D=3Dtrue)||(YAHOO.ads.darla._lastEvent&&YAHOO.=
ads.darla._lastEvent.settings&&YAHOO.ads.darla._lastEvent.settings.ca)){c=
learTimeout(YAHOO.ads.darla._eventTimer);YAHOO.ads.darla._eventTimer=3Dnu=
ll;YAHOO.ads.darla.log("YAHOO.ads.darla.event: cancelling prior =
short-lived event",true)}}YAHOO.ads.darla.log("YAHOO.ads.darla.event =
firing timer for action: =
"+A+"-"+B.sp,true);YAHOO.ads.darla._lastEvent=3D{action:A,settings:B};YAH=
OO.ads.darla._startEventTimer(YAHOO.ads.darla._lastEvent)},sendBeacon:fun=
ction(action,delay){if(delay=3D=3D=3Dtrue){delay=3DYAHOO.ads.darla.getCon=
figSetting("beaconDelay")}if(typeof =
delay=3D=3D"number"&&delay>0){setTimeout("YAHOO.ads.darla.sendBeacon( =
'"+action+"', null )",delay);return }var =
spaceid=3DYAHOO.ads.darla.lookupSpaceID(action);if((spaceid=3D=3Dnull)||(=
spaceid=3D=3D"undefined")||(spaceid=3D=3D"null")){return }var =
url=3DYAHOO.ads.darla._getBeaconUrl(spaceid);if(url=3D=3Dnull||url=3D=3D"=
"){YAHOO.ads.darla.log("ignoring spaceid (no beacon url provided): =
"+action+"-"+spaceid,true);return =
}if(YAHOO.ads.darla._beacons=3D=3Dnull){YAHOO.ads.darla._beacons=3D[]}var=
 id=3Dnew =
Date().getTime();while(YAHOO.ads.darla._beacons["x"+id]!=3Dnull){--id}id=3D=
"x"+id;var beacon=3Dnew =
Image();YAHOO.ads.darla._beacons[id]=3Dbeacon;beacon.onload=3Dfunction(){=
eval("'onload'; YAHOO.ads.darla._beacons['"+id+"']=3Dnull;this.onload =
=3D null; this.onerror =3D null; YAHOO.ads.darla._throbberHack( true =
);")};beacon.onerror=3Dfunction(){eval("'onerror'; =
YAHOO.ads.darla._beacons['"+id+"']=3Dnull;this.onload =3D null; =
this.onerror =3D null; YAHOO.ads.darla._throbberHack( true =
);")};beacon.src=3Durl;YAHOO.ads.darla.log("beaconing spaceid: =
"+action+" - =
"+spaceid)},stallAdRequest:function(A){if((YAHOO.ads.darla._config=3D=3Dn=
ull)||(YAHOO.ads.darla._lastEvent=3D=3Dnull)){return =
}if(A=3D=3Dnull){A=3DYAHOO.ads.darla.getConfigSetting("cancellableDelay")=
}if(A=3D=3Dnull){return =
}YAHOO.ads.darla._startEventTimer(YAHOO.ads.darla._lastEvent,A);YAHOO.ads=
.darla.log("Stalling outstanding ad =
event",true)},lookupSpaceID:function(B,A){if(YAHOO.ads.darla._config=3D=3D=
null){return null}var =
D=3DYAHOO.ads.darla._config.events[B];if(D=3D=3Dnull){return null}var =
C=3DD.sp;if(A){return C}if(C=3D=3Dnull){return =
null}if(YAHOO.ads.darla._config.spaceIdOffset=3D=3Dnull){YAHOO.ads.darla.=
_config.spaceIdOffset=3D0}return((C-0)+(YAHOO.ads.darla._config.spaceIdOf=
fset-0))},overrideSpaceID:function(A,B){if(YAHOO.ads.darla._config=3D=3Dn=
ull){return false}var =
C=3DYAHOO.ads.darla._config.events[A];if(C=3D=3Dnull){return =
false}C.sp=3DB;return =
true},lookupActionSettings:function(A,F){if(YAHOO.ads.darla._config=3D=3D=
null){return F}var B=3D{};var =
E=3DYAHOO.ads.darla._config.events["default"];if(E!=3Dnull){for(var D in =
E){B[D]=3DE[D]}}var =
E=3DYAHOO.ads.darla._config.events[A];if(E!=3Dnull){for(var D in =
E){B[D]=3DE[D]}}if(F!=3Dnull){for(var D in =
F){B[D]=3DF[D]}if(F.sp){YAHOO.ads.darla.overrideSpaceID(A,F.sp)}}B.sp=3DY=
AHOO.ads.darla.lookupSpaceID(A);if(YAHOO.ads.darla._config.levelOverride!=
=3Dnull){B.lv=3DYAHOO.ads.darla._config.levelOverride}if(YAHOO.ads.darla.=
_config.events[A]=3D=3D-1){result.lv=3D-1}B=3DYAHOO.ads.darla._preparePos=
itionString(B);if(YAHOO.ads.darla._config.verboseLogging){var =
C=3D"";for(var D in B){C+=3DD+":"+B[D]+"; =
"}YAHOO.ads.darla.log("computed action settings: "+A+" - =
"+C,true)}return B},_preparePositionString:function(E){var =
G=3DE.ps;if(G=3D=3Dnull){return""}var C=3D[];var =
B=3DG.split(",");for(var D=3D0;D<B.length;++D){var A=3DB[D];var =
F=3DYAHOO.ads.darla._config.destinationMap[A];if(!F||F=3D=3D""){E.inlineR=
enderPos=3DA}if(typeof =
F=3D=3D"object"){C[C.length]=3D"n"+F.length+A}else{C[C.length]=3DA}}E.psS=
tr=3DC.join(",");return E},getConfigSetting:function(B,A){var =
C=3Dnull;if(YAHOO.ads.darla._config){C=3DYAHOO.ads.darla._config[B]}if(A|=
|(C=3D=3D=3Dnull)){return C}if(C=3D=3Dnull){return =
YAHOO.ads.darla._baseConfig[B]}return C},getTemplate:function(A){var =
D=3DYAHOO.ads.darla._config;if(D=3D=3Dnull||D.templates=3D=3Dnull||D.temp=
lates[A]=3D=3Dnull){return null}var =
C=3Ddocument.getElementById(A);if(C=3D=3Dnull||C.tagName.toLowerCase()!=3D=
"iframe"){return null}var =
B=3D[];if(D.templatePrefix!=3D=3Dnull){B[B.length]=3DD.templatePrefix;if(=
YAHOO.ads.util._isIE){B[B.length-1]=3DB[B.length-1].replace(new =
RegExp("<base =
href=3D.*?>","i"),"")}}B[B.length]=3DD.templates[A];if(D.templatePostfix!=
=3D=3Dnull){B[B.length]=3DD.templatePostfix}return =
B.join("")},fillSimpleTemplate:function(E,B){var =
A=3DYAHOO.ads.darla.getConfigSetting("simpleTemplate");if((A=3D=3Dnull)||=
(A=3D=3D"")){return null}var =
D=3DYAHOO.ads.darla.getConfigSetting("encoding");if((D!=3Dnull)&&(D!=3D""=
)){var =
C=3DYAHOO.ads.darla.getConfigSetting("simpleTemplateEncodingTag");if(C){C=
=3DC.replace(new RegExp("__ENCODING__","g"),D);A=3DA.replace(new =
RegExp("<!--ENCODING-->","g"),C)}}var =
D=3DYAHOO.ads.darla.getConfigSetting("bg");if((D!=3Dnull)&&(D!=3D"")){var=
 =
C=3DYAHOO.ads.darla.getConfigSetting("simpleTemplateStyleTag");if(C){C=3D=
C.replace(new RegExp("__BGCOLOR__","g"),D);A=3DA.replace(new =
RegExp("<!--STYLE-->","g"),C)}}B=3DB.replace(/\$/g,"%24");A=3DA.replace(n=
ew RegExp("<!--ADHTML-->","g"),B);YAHOO.ads.darla.log("built from simple =
template: "+A,true);return =
A},log:function(B,A){if(YAHOO.ads.darla._config=3D=3Dnull||YAHOO.ads.darl=
a._config.log=3D=3Dnull){return =
}if(A&&YAHOO.ads.darla._config.verboseLogging!=3Dtrue){return =
}if(B=3D=3Dnull){B=3D"null"}var =
C;try{YAHOO.ads.darla._config.log(B)}catch(C){}},_startEventTimer:functio=
n(B,C){if(YAHOO.ads.darla._eventTimer!=3Dnull){clearTimeout();YAHOO.ads.d=
arla._eventTimer=3Dnull}if(B=3D=3Dnull){return }var =
A=3D(C!=3Dnull)?C:(B.settings.ca?YAHOO.ads.darla.getConfigSetting("cancel=
lableDelay"):YAHOO.ads.darla.getConfigSetting("standardDelay"));YAHOO.ads=
.darla._lastEvent=3DB;YAHOO.ads.darla._eventTimer=3DsetTimeout("YAHOO.ads=
.darla._processEvent('"+B.action+"')",A)},_processEvent:function(A){YAHOO=
.ads.darla.log("YAHOO.ads.darla._processEvent firing for action: =
"+A);YAHOO.ads.darla._eventTimer=3Dnull;if(YAHOO.ads.darla._config=3D=3Dn=
ull){return =
}if(YAHOO.ads.darla._lastEvent=3D=3Dnull||YAHOO.ads.darla._lastEvent.acti=
on!=3DA){return null}YAHOO.ads.darla._recordEvent();var =
B=3DYAHOO.ads.darla._lastEvent.settings;var =
C=3DB.lv;if(C=3D=3Dnull){C=3D(B.sp!=3Dnull)?1:-1}if(C<0){if(YAHOO.ads.dar=
la.getConfigSetting("autoRotation")){C=3D1}else{return =
}}if(C>1){YAHOO.ads.darla._clearRotationTimer();C=3D1}if((C=3D=3D1)&&YAHO=
O.ads.darla._checkRotation(B.ro)){if(YAHOO.ads.darla._call(A,B)=3D=3Dtrue=
){return =
}}if(YAHOO.ads.darla.getConfigSetting("beaconsDisabled")!=3Dtrue){YAHOO.a=
ds.darla.sendBeacon(A,YAHOO.ads.darla.getConfigSetting("beaconDelay"))}},=
_recordEvent:function(){if(YAHOO.ads.darla.getConfigSetting("autoRotation=
")){var B=3DYAHOO.ads.darla.getConfigSetting("autoRotationWindow");var =
A=3DYAHOO.ads.darla.getConfigSetting("rotation");if(B=3D=3Dnull||B>A){B=3D=
A}if((YAHOO.ads.darla._rotationTime=3D=3D0)||((new =
Date()).getTime()-YAHOO.ads.darla._rotationTime)>(A-B)){YAHOO.ads.darla._=
rotationEvents=3Dtrue}}},_call:function(F,D){if(YAHOO.ads.darla._config=3D=
=3Dnull){return }var =
H=3DYAHOO.ads.darla._config;if(H.callFrame=3D=3Dnull){YAHOO.ads.darla.log=
("YAHOO.ads.darla._call called, but no call iframe =
specified.",true);return }var =
G;if(D.callFrame=3D=3Dnull){G=3Ddocument.getElementById(YAHOO.ads.darla.g=
etConfigSetting("callFrame"))}else{G=3Ddocument.getElementById(D.callFram=
e)}YAHOO.ads.darla.log("callFrame specified: =
"+G.id,true);if(G=3D=3Dnull){YAHOO.ads.darla.log("YAHOO.ads.darla._call =
called, but call iframe not found, id: "+H.callFrame,true);return }var =
A=3DD.sp;if(A=3D=3Dnull||A=3D=3D""){YAHOO.ads.darla.log("YAHOO.ads.darla.=
_call called, but null space ID found; the action was: "+F,true);return =
false}var =
J=3DD.psStr;if(J=3D=3D""){YAHOO.ads.darla._clearRotationTimer();YAHOO.ads=
.darla.log("YAHOO.ads.darla._call called, but no positions to update; =
the action was: "+F,true);return false}var =
L=3DD.em;if(L=3D=3Dnull){L=3DH.extraMime}var =
M=3DD.bg;if(M=3D=3Dnull){M=3D""}YAHOO.ads.darla._handoffStore=3Dnull;var =
K=3DYAHOO.ads.darla.getConfigSetting("mb_source_encoding");var =
C=3DYAHOO.ads.darla.getConfigSetting("indirect_render_pos");var =
B=3D[YAHOO.ads.darla.getConfigSetting("callScript")+"?cb=3DYAHOO.ads.darl=
a._loaded"];B[B.length]=3D"p=3D"+YAHOO.ads.darla.getConfigSetting("proper=
ty");B[B.length]=3D"f=3D"+A;B[B.length]=3D"l=3D"+J;B[B.length]=3D"en=3D"+=
YAHOO.ads.darla.getConfigSetting("encoding");if(D.npv){B[B.length]=3D"npv=
=3D1"}if(K&&K!=3Dnull){B[B.length]=3D"mb_s_en=3D"+K}if(C&&typeof =
(C)=3D=3D"object"){B[B.length]=3D"indirect=3D"+C.join(",")}B[B.length]=3D=
"rn=3D"+(new =
Date().getTime());if(D.inlineRenderPos&&D.inlineRenderPos!=3D""){B[B.leng=
th]=3D"inlinePos=3D"+D.inlineRenderPos}if(L!=3Dnull){B[B.length]=3D"em=3D=
"+L}if(H.target){B[B.length]=3D"tgt=3D"+H.target}if(H.domain){B[B.length]=
=3D"dm=3D"+H.domain}if(D.op){var E=3DD.op;for(var I in =
E){B[B.length]=3DI+"=3D"+E[I]}}if(H.otherParams){var =
E=3DH.otherParams;for(var I in =
E){if(D.op&&D.op[I]){continue}B[B.length]=3DI+"=3D"+E[I]}}B=3DB.join("&")=
;YAHOO.ads.darla.log("ad request: "+F+"; =
url=3D"+B);YAHOO.ads.util.replaceIframe(G,B);return =
true},_startRotationTimer:function(A){if(YAHOO.ads.darla._config=3D=3Dnul=
l){return =
}YAHOO.ads.darla._clearRotationTimer();YAHOO.ads.darla._rotationEvents=3D=
false;YAHOO.ads.darla._rotationTime=3D(new =
Date()).getTime();if(YAHOO.ads.darla.getConfigSetting("autoRotation")){if=
(A=3D=3Dnull){A=3DYAHOO.ads.darla.getConfigSetting("rotation")}if(A=3D=3D=
null){return =
}YAHOO.ads.darla._rotationTimer=3DsetTimeout("YAHOO.ads.darla._rotateAdSt=
ate()",A);YAHOO.ads.darla.log("start ad timer: =
"+A,true)}},_clearRotationTimer:function(){YAHOO.ads.darla._rotationTime=3D=
0;if(YAHOO.ads.darla._rotationTimer!=3Dnull){clearTimeout(YAHOO.ads.darla=
._rotationTimer);YAHOO.ads.darla._rotationTimer=3Dnull}},_rotateAdState:f=
unction(){YAHOO.ads.darla._clearRotationTimer();if(YAHOO.ads.darla.getCon=
figSetting("autoRotation")&&YAHOO.ads.darla._rotationEvents){YAHOO.ads.da=
rla.event("default")}YAHOO.ads.darla._rotationEvents=3Dfalse},_checkRotat=
ion:function(A){if(YAHOO.ads.darla._config=3D=3Dnull){return =
false}if(YAHOO.ads.darla._rotationTime=3D=3D0){return =
true}if(A=3D=3Dnull){A=3DYAHOO.ads.darla.getConfigSetting("rotation")}ret=
urn(YAHOO.ads.darla._rotationTime+A<=3D(new =
Date().getTime()))},_throbberHack:function(A){if((YAHOO.ads.darla._config=
=3D=3Dnull)||(typeof =
YAHOO.ads.darla._config.throbberHack!=3D"function")){return =
}if(A=3D=3D=3Dtrue){A=3DYAHOO.ads.darla.getConfigSetting("throbberDelay")=
}if(typeof =
A=3D=3D"number"&&A>0){if(YAHOO.ads.darla._throbTimer!=3Dnull){clearTimeou=
t(YAHOO.ads.darla._throbTimer)}YAHOO.ads.darla._throbTimer=3DsetTimeout("=
YAHOO.ads.darla._throbberHack()",A);return }if(typeof =
YAHOO.ads.darla._config.throbberHack=3D=3D"function"){YAHOO.ads.darla.log=
("letting loose the throbber =
hack",true);YAHOO.ads.darla._config.throbberHack()}},_getBeaconUrl:functi=
on(C){var =
A=3DYAHOO.ads.darla.getConfigSetting("beaconType");if(A=3D=3D"geo"){var =
B=3DYAHOO.ads.darla.getConfigSetting("beaconUrl")+C}else{var =
B=3D[YAHOO.ads.darla.getConfigSetting("callScript")+"?pvcsc=3Dtrue"];B[B.=
length]=3D"p=3D"+YAHOO.ads.darla.getConfigSetting("property");B[B.length]=
=3D"f=3D"+C;B[B.length]=3D"l=3DZ";B=3DB.join("&")}if((B=3D=3Dnull)||(B=3D=
=3D"")){return null}return =
B+"&t=3D"+Math.random()},renderHandoffs:function(A){if(YAHOO.ads.darla._h=
andoffStore!=3Dnull){if(YAHOO.ads.darla._lastEvent){YAHOO.ads.darla.log("=
rendering request: =
'"+YAHOO.ads.darla._lastEvent.settings.ps+"'")}YAHOO.ads.darla._renderSto=
re=3D{};for(var C in YAHOO.ads.darla._handoffStore){var =
D=3DYAHOO.ads.darla._config.destinationMap[C];YAHOO.ads.darla.log("found =
ad in handoff store: "+C);switch(typeof =
D){case"string":YAHOO.ads.darla._updateTemplate(C,0,D);break;case"object"=
:for(var =
B=3D0;B<D.length;++B){YAHOO.ads.darla._updateTemplate(C,B,D[B])}break}}fo=
r(var C in =
YAHOO.ads.darla._renderStore){YAHOO.ads.darla._renderTemplate(C)}}},_upda=
teTemplate:function(F,B,A){var =
D=3DYAHOO.ads.darla._handoffStore[F][B];if(D=3D=3Dnull){return =
}if(YAHOO.ads.darla._renderStore[A]=3D=3Dnull){var =
C=3DYAHOO.ads.darla.getTemplate(A);if((C=3D=3Dnull)||(C=3D=3D"")){var =
E=3Ddocument.getElementById(A);if(E&&E.tagName.toLowerCase()=3D=3D"iframe=
"){var =
C=3DYAHOO.ads.darla.fillSimpleTemplate(F,D)}if(C!=3Dnull){YAHOO.ads.darla=
._renderStore[A]=3DC;return }YAHOO.ads.darla._renderStore[A]=3DD;return =
}YAHOO.ads.darla._renderStore[A]=3DC;YAHOO.ads.darla.log("template =
found: "+F+"->"+A+": "+C,true)}var =
C=3DYAHOO.ads.darla._renderStore[A];YAHOO.ads.darla._renderStore[A]=3DC.r=
eplace(new RegExp("<!--"+F+"-->",""),D)},_renderTemplate:function(B){var =
C=3Dnull;if(YAHOO.ads.darla.getConfigSetting("doubleBuffering")){C=3Ddocu=
ment.getElementById(B+"_")}if(!C){C=3Ddocument.getElementById(B)}var =
A=3DYAHOO.ads.darla._renderStore[B];YAHOO.ads.darla._renderAdThroughConfi=
guredRenderer(A,C)},_renderAdThroughConfiguredRenderer:function(G,D){var =
F=3DYAHOO.ads.darla.getConfigSetting("renderer");if(!F){try{F=3DYAHOO.ads=
.renderer.ComplexRenderer;if(!F){throw"Couldn't find default =
renderer!"}}catch(E){YAHOO.ads.darla.log("Error: Couldn't find a =
renderer for Darla!");return }}var =
C=3D{en:YAHOO.ads.darla.getConfigSetting("encoding")};var =
B=3DYAHOO.ads.darla.getConfigSetting("rendererOptions");if(C){for(var A =
in =
B){C[A]=3DB[A]}}F.registerPostRenderCallback(this,YAHOO.ads.darla._postRe=
nderHandler);try{F.renderContent(G,D,C)}catch(E){YAHOO.ads.darla.log("Err=
or occured while rendering the ad: =
"+E.message)}},_postRenderHandler:function(A){YAHOO.ads.darla._swapForDou=
bleBuffering(A)},_blankIframe:function(A){if(typeof =
A=3D=3D"string"){A=3Ddocument.getElementById(A)}if((A=3D=3Dnull)||(A.tagN=
ame.toLowerCase()!=3D"iframe")){return =
}YAHOO.ads.util.replaceIframe(A,YAHOO.ads.util._isIE?"javascript:'<html><=
/html>'":"about:blank")},_swapElements:function(A){function B(G){var =
F=3Ddocument.getElementById(G+"_");var =
E=3Ddocument.getElementById(G);if(F=3D=3Dnull||E=3D=3Dnull){return =
}F.id=3DG;F.style.display=3D"block";F.style.visibility=3D"visible";E.id=3D=
G+"_";E.style.display=3D"none";if(E.tagName.toLowerCase()=3D=3D"iframe"){=
YAHOO.ads.darla._blankIframe(E)}else{E.innerHTML=3D""}}YAHOO.ads.darla.lo=
g("swapping positions: "+A,true);var D=3DA.split(",");for(var =
C=3D0;C<D.length;++C){B(D[C])}YAHOO.ads.darla._throbberHack(true)},_swapF=
orDoubleBuffering:function(A){var C=3Dnull;if(A.id){C=3DA.id}var =
B=3Ddocument.getElementById(C);YAHOO.ads.darla.log("frame loaded: =
"+C,true);if(YAHOO.ads.darla.getConfigSetting("doubleBuffering")&&C.charA=
t(C.length-1)=3D=3D"_"){YAHOO.ads.darla._swapElements(C.substring(0,C.len=
gth-1))}},_loaded:function(A,B){if(B!=3Dnull){YAHOO.ads.darla.log("callin=
g through to _handoff");return =
YAHOO.ads.darla._handoff(A,B)}YAHOO.ads.darla.log("ads returned: =
'"+A+"'");YAHOO.ads.darla.renderHandoffs(A);YAHOO.ads.darla._startRotatio=
nTimer();if(YAHOO.ads.darla._config&&YAHOO.ads.darla._config.finish){YAHO=
O.ads.darla._config.finish(A)}},_handoff:function(A,C){YAHOO.ads.darla.lo=
g("ad hand-off: "+A+" - =
"+C);if(YAHOO.ads.darla._handoffStore=3D=3Dnull){YAHOO.ads.darla._handoff=
Store=3D{}}if(YAHOO.ads.darla._handoffStore[A]=3D=3Dnull){YAHOO.ads.darla=
._handoffStore[A]=3D[]}var =
B=3DYAHOO.ads.darla._handoffStore[A];B[B.length]=3DC;return =
true}};if(typeof YAHOO=3D=3D=3D"undefined"){var YAHOO=3D{}}if(typeof =
YAHOO.ads=3D=3D=3D"undefined"){YAHOO.ads=3D{}}if(typeof =
YAHOO.ads.util=3D=3D=3D"undefined"){YAHOO.ads.util=3D{}}YAHOO.ads.util=3D=
function(){return{_isIE:(!navigator.userAgent.match(/AppleWebKit\/([^ =
]*)/)&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/=
msie/gi)),replaceIframe:function(G,A,H){if(!YAHOO.ads.util._isIE){if(H){G=
.onload=3DH}if(G.contentWindow=3D=3Dnull){G.src=3DA}else{G.contentWindow.=
location.replace(A)}return G}var =
E;try{if(G.contentWindow&&G.contentWindow.Unloader){G.contentWindow.Unloa=
der.fire()}}catch(E){}var B=3Ddocument.createElement("iframe");var =
F=3DG.attributes;if(F=3D=3Dnull){F=3D[]}var =
C=3DF.length;if(!A){A=3DG.getAttribute("src")}for(var D=3D0;D<C;++D){var =
J=3DF[D].nodeName;var =
I=3DF[D].nodeValue;switch(J.toLowerCase()){case"style":continue;case"src"=
:I=3DA;break}if(!I){continue}B.setAttribute(J,I)}if(A&&A.length>0&&!B.get=
Attribute("src")){B.setAttribute("src",A)}if(H){B.onload=3DH;if(B.attachE=
vent){B.attachEvent("onload",H)}}if(YAHOO.ads.util._isIE&&G.className){B.=
className=3DG.className}B.style.cssText=3DG.style.cssText;try{if(G.conten=
tWindow.document.readyState=3D=3D"complete"){YAHOO.ads.darla.log("replaci=
ng iframe immediately: "+G.id);G.parentNode.replaceChild(B,G);return =
B}}catch(E){}if(YAHOO.ads.util.replaceIframe.killCount=3D=3Dnull){YAHOO.a=
ds.util.replaceIframe.killCount=3D0}G.id=3D"killMeNow"+YAHOO.ads.util.rep=
laceIframe.killCount++;G.style.display=3D"none";G.parentNode.insertBefore=
(B,G);setTimeout("YAHOO.ads.util.deleteIframeWhenLoaded('"+G.id+"')",250)=
;try{YAHOO.ads.darla.log("timing out to delete incomplete iframe: =
"+G.id+" with readyState: =
"+G.contentWindow.document.readyState)}catch(E){YAHOO.ads.darla.log("timi=
ng out to delete incomplete iframe: "+G.id+" - couldn't access iframe =
readyState")}return =
B},deleteIframeWhenLoaded:function(D,A){if(A=3D=3Dnull){A=3D0}var =
B=3Ddocument.getElementById(D);if(B){var =
C;try{if(A>10||B.contentWindow.document.readyState=3D=3D"complete"){YAHOO=
.ads.darla.log("deleting replaced iframe: =
"+B.id);B.parentNode.removeChild(B)}else{YAHOO.ads.darla.log("retrying =
to delete iframe: =
"+B.id);setTimeout("YAHOO.ads.util.deleteIframeWhenLoaded('"+D+"',"+(A+1)=
+")",1000)}}catch(C){try{if(B.parentNode){B.parentNode.removeChild(B)}}ca=
tch(C){}}}}}}();if(typeof YAHOO=3D=3D=3D"undefined"){var =
YAHOO=3D{}}if(typeof =
YAHOO.ads=3D=3D=3D"undefined"){YAHOO.ads=3D{}}if(typeof =
YAHOO.ads.renderer=3D=3D=3D"undefined"){YAHOO.ads.renderer=3D{}}YAHOO.ads=
.renderer.ComplexRenderer=3Dfunction(){var _renderMap=3D[];var =
_renderIndex=3D1;var _defaultMiniDocUrl=3D"/darla/md.php";var =
_subscriberObject;var _subscriber;function =
_appendToRenderMap(content,frameElement,subscriber,subscriberObject){var =
currentIndex=3D_renderIndex;_renderMap[currentIndex]=3D{content:content,f=
rameElement:frameElement,subscriber:subscriber,subscriberObject:subscribe=
rObject};_renderIndex=3D_renderIndex+1;if(_renderIndex>10){_renderIndex=3D=
1}return currentIndex}function =
_renderThroughMiniDoc(htmlContent,frameElement,configObject){var =
domainHint=3DconfigObject.dh;var =
mdURL=3DconfigObject.mdUrl||_defaultMiniDocUrl;var =
miniDocUrl=3DmdURL+"?en=3D"+configObject.en;if(domainHint){miniDocUrl+=3D=
"&dh=3D"+domainHint}var =
contentId=3D_appendToRenderMap(htmlContent,frameElement,_subscriber,_subs=
criberObject);frameElement.setAttribute("contentId",contentId);YAHOO.ads.=
util.replaceIframe(frameElement,miniDocUrl,_triggerParentHandler)}functio=
n _triggerParentHandler(){var =
srcElementId=3Dthis.id||event.srcElement.id;var =
srcElement=3Ddocument.getElementById(srcElementId);var =
contentId=3DsrcElement.getAttribute("contentId");if(contentId){var =
frameElement=3Ddocument.getElementById(srcElement.id);_unsubscribeOnRende=
rHandlers(frameElement);var =
renderContext=3D_renderMap[contentId];if(renderContext.subscriber&&render=
Context.subscriberObject){renderContext.subscriber.call(renderContext.sub=
scriberObject,frameElement)}}else{_subscriber.call(_subscriberObject,srcE=
lement)}}function =
_unsubscribeOnRenderHandlers(element){if(element.tagName&&element.tagName=
.toLowerCase()=3D=3D"iframe"){if(element.onload=3D=3D_triggerParentHandle=
r){element.onload=3Dnull}else{if(element.detachEvent){element.detachEvent=
("onload",_triggerParentHandler)}}}}YAHOO.ads.renderer.ComplexScriptRende=
rer=3D{_iframeTag:new =
RegExp(/(<iframe[^>]*>)([\s]|[^\s])*?(<\/iframe>)/igm),_noscriptTag:new =
RegExp(/<noscript[^>]*>([\s]|[^\s])*?<\/noscript>/igm),_scriptTag:new =
RegExp(/<script[^>]*>(([\s]|[^\s])*?)<\/script>/im),_externalScript:new =
RegExp(/^\s*<script[^>]* =
src=3D([^\s>]*)>([\s]|[^\s])*?<\/script>/im),_vbScript:new =
RegExp(/<script[^>]* =
language=3D['"]?VBScript([^\s>]*)>([\s]|[^\s])*?<\/script>/im),_quotedStr=
ing:new RegExp(/^('|")(.*)('|")$/),_htmlComment:new =
RegExp(/\s*<!--(([\s]|[^\s])*)\/\/\s*-->\s*/m),_rendered:{},_handoffs:{},=
renderHandoffs:function(htmlContent,dest){dest=3Ddest.id;YAHOO.ads.render=
er.ComplexScriptRenderer._handoffs[dest]=3DhtmlContent;YAHOO.ads.renderer=
.ComplexScriptRenderer._continueHandoffs(dest)},_continueHandoffs:functio=
n(dest){YAHOO.ads.renderer.ComplexScriptRenderer._setupRender();if(YAHOO.=
ads.renderer.ComplexScriptRenderer._handoffs[dest]!=3Dnull){var =
html=3DYAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest];html=3Dht=
ml.replace(YAHOO.ads.renderer.ComplexScriptRenderer._iframeTag,"$1$2");ht=
ml=3Dhtml.replace(YAHOO.ads.renderer.ComplexScriptRenderer._noscriptTag,"=
");YAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest]=3Dhtml;if(!YA=
HOO.ads.renderer.ComplexScriptRenderer._render1Handoff(dest)){return =
}}YAHOO.ads.renderer.ComplexScriptRenderer._finishRender(dest)},_render1H=
andoff:function(dest,continuing){function =
_continue1ExternalRender(){if(YAHOO.ads.renderer.ComplexScriptRenderer._h=
andoffs[dest]=3D=3Dnull){return =
}YAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest]=3DYAHOO.ads.ren=
derer.ComplexScriptRenderer._insertWriteStore(YAHOO.ads.renderer.ComplexS=
criptRenderer._handoffs[dest]);YAHOO.ads.renderer.ComplexScriptRenderer._=
render1Handoff(dest,true)}if(!continuing){YAHOO.ads.renderer.ComplexScrip=
tRenderer._scriptCount=3D0}var =
html=3DYAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest];var =
match=3Dhtml.match(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag);w=
hile(match){YAHOO.ads.renderer.ComplexScriptRenderer._scriptCount+=3D1;if=
(YAHOO.ads.renderer.ComplexScriptRenderer._scriptCount>10){break}var =
ematch=3Dmatch[0].match(YAHOO.ads.renderer.ComplexScriptRenderer._externa=
lScript);if(ematch&&ematch[1]){var =
qmatch=3Dematch[1].match(YAHOO.ads.renderer.ComplexScriptRenderer._quoted=
String);if(qmatch&&qmatch[2]){ematch[1]=3Dqmatch[2]}YAHOO.ads.renderer.Co=
mplexScriptRenderer.loadScriptFile("external_script"+dest,ematch[1],_cont=
inue1ExternalRender,null,null,true,true);return false}if(match[1]){var =
isVB=3Dfalse;var =
hmatch=3Dmatch[0].match(YAHOO.ads.renderer.ComplexScriptRenderer._vbScrip=
t);if(hmatch&&hmatch[0]){isVB=3Dtrue}var =
hmatch=3Dmatch[1].match(YAHOO.ads.renderer.ComplexScriptRenderer._htmlCom=
ment);if(hmatch&&hmatch[1]){match[1]=3Dhmatch[1]}if(isVB){ExecuteVBS(matc=
h[1])}else{if(window.execScript){window.execScript(match[1])}else{window.=
eval(match[1])}}YAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest]=3D=
html=3DYAHOO.ads.renderer.ComplexScriptRenderer._insertWriteStore(html)}m=
atch=3Dhtml.match(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag)}YA=
HOO.ads.renderer.ComplexScriptRenderer._rendered[dest]=3DYAHOO.ads.render=
er.ComplexScriptRenderer._handoffs[dest];delete =
YAHOO.ads.renderer.ComplexScriptRenderer._handoffs[dest];YAHOO.ads.render=
er.ComplexScriptRenderer._scriptCount=3D0;if(continuing){YAHOO.ads.render=
er.ComplexScriptRenderer._continueHandoffs(dest)}else{return =
true}},_insertWriteStore:function(s){if(!s){return =
}if(YAHOO.ads.renderer.ComplexScriptRenderer._writeStore=3D=3Dnull){YAHOO=
.ads.renderer.ComplexScriptRenderer._writeStore=3D[""]}var =
i=3Ds.search(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag);s=3Ds.r=
eplace(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag,"");s=3Ds.slic=
e(0,i)+YAHOO.ads.renderer.ComplexScriptRenderer._writeStore.join("")+s.sl=
ice(i);YAHOO.ads.renderer.ComplexScriptRenderer._writeStore=3Dnull;return=
 =
s},_setupRender:function(){if(document.write!=3DYAHOO.ads.renderer.Comple=
xScriptRenderer._write){YAHOO.ads.renderer.ComplexScriptRenderer._write_o=
ld_=3Ddocument.write;document.write=3DYAHOO.ads.renderer.ComplexScriptRen=
derer._write}if(document.writeln!=3DYAHOO.ads.renderer.ComplexScriptRende=
rer._writeln){document._writeln_old_=3Ddocument.writeln;document.writeln=3D=
YAHOO.ads.renderer.ComplexScriptRenderer._writeln}},_write:function(s){if=
(s.search(/\/bc\/bc(.*)\.js/i)>-1){try{YAHOO.ads.renderer.ComplexScriptRe=
nderer._write_old_.call(this,s)}catch(e){YAHOO.ads.renderer.ComplexScript=
Renderer._write_old_(s)}return =
}if(YAHOO.ads.renderer.ComplexScriptRenderer._writeStore=3D=3Dnull){YAHOO=
.ads.renderer.ComplexScriptRenderer._writeStore=3D[]}YAHOO.ads.renderer.C=
omplexScriptRenderer._writeStore[YAHOO.ads.renderer.ComplexScriptRenderer=
._writeStore.length]=3Ds;if(s.search(/<\/script>/i)>-1){s=3DYAHOO.ads.ren=
derer.ComplexScriptRenderer._writeStore.join("");var =
match=3Ds.match(YAHOO.ads.renderer.ComplexScriptRenderer._externalScript)=
;if(match&&match[1]){return }var =
match=3Ds.match(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag);if(m=
atch&&match[1]){if(match[1].search(/document.write/i)>-1){return }var =
isVB=3Dfalse;var =
hmatch=3Dmatch[0].match(YAHOO.ads.renderer.ComplexScriptRenderer._vbScrip=
t);if(hmatch&&hmatch[0]){isVB=3Dtrue}var =
hmatch=3Dmatch[1].match(YAHOO.ads.renderer.ComplexScriptRenderer._htmlCom=
ment);if(hmatch&&hmatch[1]){match[1]=3Dhmatch[1]}if(isVB){ExecuteVBS(matc=
h[1])}else{if(window.execScript){window.execScript(match[1])}else{window.=
eval(match[1])}}YAHOO.ads.renderer.ComplexScriptRenderer._writeStore=3D[s=
.replace(YAHOO.ads.renderer.ComplexScriptRenderer._scriptTag,"")]}}},_wri=
teln:function(s){YAHOO.ads.renderer.ComplexScriptRenderer._write(s+"\n")}=
,_finishRender:function(dest){if(YAHOO.ads.renderer.ComplexScriptRenderer=
._rendered=3D=3Dnull){YAHOO.ads.renderer.ComplexScriptRenderer._rendered=3D=
{}}if(YAHOO.ads.renderer.ComplexScriptRenderer._rendered[dest]!=3Dnull){v=
ar =
dst=3Ddocument.getElementById(dest);if(dst){dst.innerHTML=3DYAHOO.ads.ren=
derer.ComplexScriptRenderer._rendered[dest]}delete =
YAHOO.ads.renderer.ComplexScriptRenderer._rendered[dest]}YAHOO.ads.render=
er.ComplexScriptRenderer._rendered=3D{};_triggerParentHandler.call(dst)},=
loadScriptFile:function(id,url,callbackfn,encoding,theWindow,bustTheCache=
,forceAReload){if(typeof =
theWindow=3D=3D"undefined"||theWindow=3D=3Dnull){theWindow=3Dwindow}if(YA=
HOO.ads.renderer.ComplexScriptRenderer.loadScriptFile._loadingIDs=3D=3Dnu=
ll){YAHOO.ads.renderer.ComplexScriptRenderer.loadScriptFile._loadingIDs=3D=
{}}if(!forceAReload&&id!=3Dnull&&id!=3D""){if(YAHOO.ads.renderer.ComplexS=
criptRenderer.loadScriptFile._loadingIDs[id]){return true}}var e;try{var =
old=3DtheWindow.document.getElementById(id);if(old){old.parentNode.remove=
Child(old)}var =
newTag=3DtheWindow.document.createElement("script");newTag.setAttribute("=
type","text/javascript");if(bustTheCache){var =
urlArgPos=3Durl.indexOf("?");if(urlArgPos=3D=3D-1){url+=3D"?cgicbs=3D"+(n=
ew =
Date().getTime()+Math.random())}else{url=3Durl.substring(0,urlArgPos+1)+"=
cgicbs=3D"+(new =
Date().getTime()+Math.random())+"&"+url.substring(urlArgPos+1)}}newTag.se=
tAttribute("src",url);newTag.setAttribute("charset",encoding?encoding:"ut=
f-8");newTag.setAttribute("id",id);var =
callCallback=3Dfunction(){if(id!=3Dnull&&id!=3D""){YAHOO.ads.renderer.Com=
plexScriptRenderer.loadScriptFile._loadingIDs[id]=3Dnull}if(window.Activi=
ty){Activity.updateTime(Activity.JS)}if(callbackfn=3D=3Dnull){return =
}if(typeof callbackfn=3D=3D"string"){var =
path=3Dcallbackfn.split(".");var arg=3DtheWindow;for(var =
k=3D0;k<path.length&&(arg!=3Dnull);++k){arg=3Darg[path[k]]}callbackfn=3Da=
rg}if(typeof callbackfn=3D=3D"function"){callbackfn()}};var =
iefunc=3Dfunction(){if(this.readyState=3D=3D"loaded"||this.readyState=3D=3D=
"complete"){callCallback();this.onreadystatechange=3Dnull}};if(newTag.onr=
eadystatechange){newTag.onreadystatechange=3Diefunc}else{newTag.onload=3D=
callCallback}if(id!=3Dnull&&id!=3D""){YAHOO.ads.renderer.ComplexScriptRen=
derer.loadScriptFile._loadingIDs[id]=3Dtrue}YAHOO.ads.renderer.ComplexScr=
iptRenderer.getHeadElement(theWindow.document).appendChild(newTag);if(win=
dow.Activity){Activity.updateTime(Activity.JS,true,url)}}catch(e){return =
false}return =
true},getHeadElement:function(doc){if(doc=3D=3Dnull){doc=3Ddocument}var =
e=3Ddoc.getElementsByTagName("head");if(e.length=3D=3D0){var =
h=3Ddoc.createElement("head");doc.documentElement.insertBefore(h,doc.body=
);e=3Ddoc.getElementsByTagName("head")}return =
e[0]}};return{renderContent:function(htmlContent,destination,configObject=
){if(!destination||!destination.tagName){throw {message:"Destination =
should be a valid html =
element!"}}if(destination.tagName.toLowerCase()=3D=3D"iframe"){_renderThr=
oughMiniDoc(htmlContent,destination,configObject)}else{YAHOO.ads.renderer=
.ComplexScriptRenderer.renderHandoffs(htmlContent,destination)}},register=
PostRenderCallback:function(object,subscriber){_subscriberObject=3Dobject=
;_subscriber=3Dsubscriber},fetchContentForMiniDoc:function(renderIndex){i=
f(renderIndex!=3Dnull){return _renderMap[renderIndex].content}}}}();=0A=
/**=0A=
 * Ads controls javascript interactions for Ad objects=0A=
 * @module Ads=0A=
 */=0A=
(function() {	// begin anonymous function=0A=
    =0A=
    YAHOO.namespace('News.Ads');=0A=
    =0A=
    /**=0A=
     * dynamic=0A=
     * @param {Object} el is the container to place the ad in=0A=
     * @param {Object} config is the object or config settings=0A=
     */=0A=
    YAHOO.News.Ads.dynamic =3D function(el, config)=0A=
    {=0A=
        if (!el) return false;=0A=
        =0A=
        // Config=0A=
        config =3D ( YAHOO.lang.isObject( config ) ) ? config : {};=0A=
        var width =3D config.width || 300;=0A=
        var height =3D config.height || 270;=0A=
        =0A=
        // Get ad position=0A=
        var position =3D el.id.split('__')[1];=0A=
        if (position)=0A=
        {=0A=
            // Create Iframe and display in container=0A=
            var html =3D [=0A=
                '<iframe =
src=3D"http://us.adserver.yahoo.com/a?f=3D'+YAHOO.News.SPACEID+'&p=3Dnews=
&l=3D'+position+'&c=3Dh&at=3Dcontent%3D%22no_expandable%22" ',=0A=
                'frameborder=3D"0"',=0A=
                'scrolling=3D"no"',=0A=
                'marginwidth=3D"0"',=0A=
                'marginheight=3D"0"',=0A=
                //'width=3D"'+width+'"',=0A=
                //'height=3D"'+height+'"',=0A=
                '></iframe>'=0A=
            ];=0A=
            el.innerHTML =3D html.join(' ');=0A=
            YAHOO.util.Dom.removeClass(el, 'hide');=0A=
        }=0A=
    }=0A=
    =0A=
    /**=0A=
     * darla=0A=
     * @param {Array} el is array of darla elements=0A=
     * @param {Object} config is the object or config settings=0A=
     */=0A=
    YAHOO.News.Ads.darla =3D function(el, config)=0A=
    {=0A=
        // Get element container=0A=
        this.el =3D el;=0A=
        if (!this.el) return false;=0A=
        =0A=
        // Config object settings=0A=
        config =3D ( YAHOO.lang.isObject( config ) ) ? config : {};=0A=
        this.property =3D config.property || 'news';=0A=
        this.intl =3D config.intl || 'us';=0A=
        this.space_id =3D config.space_id || YAHOO.News.SPACEID;=0A=
    	this.level =3D config.level || 2;=0A=
        this.darla_url =3D YAHOO.News.DARLA_URL || =
"/news/common/pages/generic/darla/fc";=0A=
        this.darla_mdurl =3D YAHOO.News.DARLA_MDURL || =
"/news/common/pages/generic/darla/md";=0A=
        this.call_frame_id =3D config.callframe_id || =
'yn-darla-callframe';=0A=
        this.beaconsDisabled =3D config.beaconsDisabled || false;=0A=
        this.npv =3D config.npv || null;=0A=
        =0A=
        // Build key value pair of position to container=0A=
        this.destinationMap =3D {};=0A=
        this.positions =3D [];=0A=
        =0A=
        // create call frame to handle darla ad calls=0A=
        this.call_frame =3D document.createElement('iframe'),=0A=
            attrs =3D { "id":this.call_frame_id, "frameborder":"0", =
"height":"0", "width":"0", "title":""};=0A=
        for(var attr in attrs)=0A=
        {=0A=
            this.call_frame.setAttribute(attr,attrs[attr]);=0A=
        }=0A=
        // assuming init was called onload/onDOMReady!=0A=
        document.body.appendChild(this.call_frame); =0A=
        =0A=
        // loop through each element to 1) parse out position to call 2) =
create iframe for ad=0A=
        for(var x=3D0, ln=3Dthis.el.length; x<ln; x++)=0A=
        {=0A=
            // get position from element id (e.g. ad-darla__LREC)=0A=
            var pos =3D this.el[x].id.split('__')[1];=0A=
            if (pos)=0A=
            {=0A=
                // Create Iframe and innerHTML to container=0A=
                var iframe_id =3D YAHOO.util.Dom.generateId(null, =
'yn-darla');=0A=
                var html =3D [=0A=
                    '<iframe ',=0A=
                    'id=3D"'+iframe_id+'"',=0A=
                    'frameborder=3D"0"',=0A=
                    'scrolling=3D"no"',=0A=
                    'marginwidth=3D"0"',=0A=
                    'marginheight=3D"0"',=0A=
                    '></iframe>'=0A=
                ];=0A=
                this.el[x].innerHTML =3D html.join(' ');=0A=
                =0A=
                // add to arrays=0A=
                this.destinationMap[pos] =3D iframe_id;=0A=
                this.positions.push(pos);=0A=
            }=0A=
        }=0A=
        =0A=
        // make sure positions exists=0A=
        if (this.positions.length > 0)=0A=
        {=0A=
            // delimit positions by comma separated list=0A=
            this.positions =3D this.positions.join(',');=0A=
            =0A=
    		if (YAHOO.ads.darla)=0A=
            {=0A=
        		// Create config object=0A=
        		var darlaConfig =3D =0A=
                {=0A=
        			// The frame used to make the call to get the ad. Calls the =
callScript url=0A=
        			callFrame : this.call_frame_id,=0A=
        		   =0A=
        			// The script that gets called to fetch the ads=0A=
                    callScript : this.darla_url,=0A=
        		 =0A=
        			// If lv=3D=3D1 then this is the time it waits before =
triggering ad rotation=0A=
        			rotation : 5000,=0A=
        		   =0A=
        			// Timed auto rotation is set to false=0A=
        			autoRotation: false,=0A=
        			=0A=
        			// Property name that gets passed as a parameter=0A=
        			property : this.property,=0A=
        			=0A=
        			// disable beaconing on events which dont result in =
ad-rotation.=0A=
        			beaconsDisabled:this.beaconsDisabled,=0A=
        		 =0A=
        			// Keep this empty since for ajax_certified expandables, the =0A=
        			// ad sits in the fccalls offset parent. =0A=
        			// The adelement can be a div or a frame (need to be tested =
for a frame)=0A=
        			destinationMap : this.destinationMap,=0A=
                    =0A=
                    // Custom HTML for the ad iframes (removes extra =
spacing)=0A=
                    simpleTemplate : [=0A=
                        '<html><head><!--ENCODING--><base =
target=3D"_blank" /><!--STYLE--></head>',=0A=
                        '<body =
style=3D"overflow:hidden;padding:0;margin:0;">',=0A=
                        '<center><!--ADHTML--></center>',=0A=
                        '</body></html>'=0A=
                    ].join(""),=0A=
        		=0A=
        			// Just keep these since ad client requires certain =
parameters.=0A=
        			otherParams : {=0A=
        				"t_e" : 1,=0A=
        				".intl" : this.intl=0A=
        			},=0A=
        		=0A=
        			// Refer to the details in the events configuration for Darla=0A=
        			events : {=0A=
        				"pageload" : {=0A=
        				    lv:this.level,=0A=
        				    sp:this.space_id,=0A=
        				    ps:this.positions,=0A=
        				    npv:this.npv,=0A=
        				    =
em:escape('{"site-attribute":"content=3D\'no_expandable;ajax_cert_expanda=
ble;' + YAHOO.News.DARLA_KEYWORDS + YAHOO.News.DARLA_REFERRER + ';\' =
refurl=3D\'' + YAHOO.News.DARLA_REFERRER + '\' topics=3D\'' + =
YAHOO.News.DARLA_REFERRER + '\'"}')=0A=
        				},=0A=
                        "changead" : {=0A=
                            lv:this.level,=0A=
                            sp:this.space_id,=0A=
        				    ps:this.positions,=0A=
        				    npv:this.npv,=0A=
        				    =
em:escape('{"site-attribute":"content=3D\'no_expandable;ajax_cert_expanda=
ble;' + YAHOO.News.DARLA_KEYWORDS + YAHOO.News.DARLA_REFERRER + ';\' =
refurl=3D\'' + YAHOO.News.DARLA_REFERRER + '\' topics=3D\'' + =
YAHOO.News.DARLA_REFERRER + '\'"}')=0A=
                        }=0A=
        			},=0A=
                    =0A=
                    rendererOptions : {=0A=
                        mdUrl : this.darla_mdurl=0A=
                    }=0A=
        		}=0A=
        =0A=
                // set darla config and fire event=0A=
                YAHOO.ads.darla.setConfig(darlaConfig);=0A=
        		YAHOO.ads.darla.event("pageload");=0A=
            } // end if windows.YAHOO.ads.darla=0A=
        } // end if positions=0A=
    }=0A=
    =0A=
    // run on window load=0A=
    YAHOO.util.Event.on(=0A=
        window,=0A=
        "load",=0A=
        function() {=0A=
            // Timeout=0A=
            var milliseconds =3D (YAHOO.News.ADS_POSTLOAD_TIMEOUT) ? =
YAHOO.News.ADS_POSTLOAD_TIMEOUT : 500;=0A=
        =0A=
            var timeout =3D setTimeout(=0A=
                function() {=0A=
                    // load dynamic ads=0A=
                    var ads =3D =
YAHOO.util.Dom.getElementsByClassName('dynamic_ad');=0A=
                    var ln =3D ads.length;=0A=
                    =0A=
                    if (ln > 0) {=0A=
                        for(var x=3D0; x<ln; x++) {=0A=
                            YAHOO.News.Ads.dynamic(ads[x]);=0A=
                        }=0A=
                    }=0A=
                    =0A=
                    // load darla ads=0A=
                    var ads =3D =
YAHOO.util.Dom.getElementsByClassName('darla_ad');=0A=
                    var ln =3D ads.length;=0A=
                    =0A=
                    if (ln > 0) {=0A=
                        var darla =3D new YAHOO.News.Ads.darla(ads, =
{npv:true});=0A=
                    }=0A=
                },=0A=
                milliseconds=0A=
            ); // end timeout=0A=
        }=0A=
    );=0A=
=0A=
})();	// end anonymous function=0A=

------=_NextPart_000_0000_01CAA661.C174B450--
