From: Subject: Air Force officials re-evaluate past UFO sightings - TruLife Date: Sat, 15 Mar 2008 08:02:46 -0400 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_01DC_01C88672.F4A755A0" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 This is a multi-part message in MIME format. ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://media.www.trumanindex.com/media/storage/paper607/news/2008/01/17/Trulife/Air-Force.Officials.ReEvaluate.Past.Ufo.Sightings-3155075-page2.shtml =EF=BB=BF Air Force = officials re-evaluate past UFO sightings - TruLife

Air Force officials re-evaluate past UFO sightings

Jessica Rapp

Issue date: 1/17/08 = Section: TruLife<= /DIV>
  • Prin= t
  • Email
  • <=20 prev Page 2 of 3 next=20 >
"There was some people in the military saying = that there=20 was legitimate reason to be concerned over here because what if what = we're=20 seeing ... [was] actually evidence of Russian spycraft, or the Soviets = [had]=20 developed some kind of new technology," Edis said. "Mostly, they looked = at it=20 and decided it was essentially noise."

Edis said the military = neglected=20 its investigations and sent out reports to the public that failed to = give enough=20 explanation as to what had been seen.

This caused people to = further blow=20 their claims of sightings out of proportion because they feared that the = government was keeping the truth a secret. He said that with the = addition of the=20 UFO pop culture that had been blooming in comic books and science = fiction since=20 the 1930s, the "UFO movement" spread.

In recent years, sightings = have=20 decreased and abduction claims have taken their place, Edis said. He = said these=20 claims generate from pop culture and should not be considered as a = phenomenon to=20 explore scientifically.

"The fact that there's this kind of = residue of=20 unexplained cases is not any more significant than the fact that there's = always=20 a certain percentage of murders unsolved," Edis said. "We don't assume = that=20 because there are murders unsolved that there are aliens coming down and = slitting people's throats."

Mark Rodeghier, scientific director = at the=20 Center for UFO Studies in Chicago, seems to think otherwise.

The = Center=20 for UFO Studies, started in 1973 by Ohio State University astronomy = professor=20 Dr. J. Allen Hynek, collects information from phone calls or e-mails = written by=20 people claiming to have experienced some type of UFO encounter. The = center hopes=20 to solve the unexplained cases by making the media and scientific = community more=20 aware of the ongoing UFO problem.

"If there's strange things = flying=20 around in the sky, why should we be ignoring them?" Rodeghier said. "Tax = dollars=20 are wasted because there's an incredible bias against UFOs being = something=20 worthy of study."=20
Continued...=20
<=20 prev Page 2 of 3 next=20 >

Article Tools

Share:
  • Facebook=20
  • B= logger=20
  • del.icio.us=20
  • digg=20
  • newsvine<= /A>=20
Subscribe:
  • My Yahoo!=20
  • Google

    Viewing Comments 1 - 10 of 10

    =

    Barboor smith

    posted 1/17/08 @ 9:28 AM CST

    UFOs or NOT?Well around 95% of ufo sightings are usually explained = and=20 fakes.What about the 5% as the British government with its investigation = claims=20 tht 5% of UFO could not explained . (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    Stephen Bassett

    posted 1/17/08 @ 10:40 AM CST

    First, they are not green they are, usually, gray.

    Second, = with all=20 do respect to professor Edis, he hasn't the slightest idea what he is = talking=20 about. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    Entity of Life

    posted 1/17/08 @ 10:57 AM CST

    The truth is, we seem blind to everything around us.

    I have = seen=20 crafts at VERY close proximity numerous times. Some of my close = encounters have=20 ships that have instant speed and it is a speed that would rip any man = apart=20 from the G-force. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    Jeff

    posted 1/17/08 @ 11:18 AM CST

    I'm confused by the title. I didn't see any comments from any = air-force=20 "officials", much less a re-evaluation by the air-force of anything.

    Details=20   Reply=20 to this comment

    Joe Capp

    posted 1/17/08 @ 4:18 PM CST

    Science Professor Taner Edis is either a liar or has never read a = book on UFO=20 evidence.

    There have been Three Thousand researched UFO landing = trace=20 cases, 5000 worldwide. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    Object Reporter

    posted 1/17/08 @ 4:27 PM CST

    Where there is smoke, there's usually fire. Tens of thousands of = eyewitnesses=20 around the globe see unexplainable craft in the skies above us each = year, many=20 of them are well documented cases from pilots, law enforcement personnel = and=20 ex-military officials. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    TJ

    posted 1/18/08 @ 11:36 AM CST

    With all of the technology that our government has, I find it very = hard to=20 believe that they are not aware of legitimate unknown spacecraft = entering our=20 air space. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    David Marler

    posted 1/19/08 @ 7:29 PM CST

    My thanks go to Jessica Rapp for a well-balanced article on a most=20 under-rated subject. I am a member of the Mutual UFO Network (MUFON) = which was=20 mentioned in the article. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    JS

    posted 1/25/08 @ 11:58 AM CST

    I don't think there is even a question of if UFOs or aliens are real. = The=20 question is how long the government is going to continue to lie about it = and how=20 long the bulk of the scientific community chooses to ignore the subject = for fear=20 of being labeled "crazy" or "spooky". (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    goat

    posted 1/26/08 @ 7:51 AM CST

    if they got a mile long object to fly all of our monitoring equipment = is just=20 toys to them im sure they can avoid them but where would they get the = material=20 they needed to get in our atmosphere and then get back out with out = ruining=20 there ship or crashing. (Continued=E2=80=A6)

    Details=20   Reply=20 to this comment

    Post a Comment

    • =20
    • =20
    • NOTE: = Email=20 address will not be published=20

    3D"Email=20 Email notify will not work because you are not currently logged = in.
    Click=20 here to quickly login or create a free account.

    Type your comment below (html not allowed)

     =20 I=20 understand posting spam or other comments that are unrelated to this = article=20 will cause my comment to be flagged for deletion and possibly cause my = IP=20 address to be permanently banned from this server.

    =20
    National = College=20 Advertising and Marketing | Privacy = Policy=20 (8/15/07) | Terms of = Use=20 (8/15/07)
    Content Submission Agreement (8/23/07) | Copyright=20 Compliance Policy (8/25/07) | RSS = Terms of=20 Use

    Advertisement

    Poll

    Do you support the idea of = superdelegates?
    =20
    =20
    Submit Vote=20

    View=20 Results

    Advertisement

    ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://media.collegepublisher.com/media/weatherbug/weatherbugsforchannelbar/63501.png iVBORw0KGgoAAAANSUhEUgAAAI8AAAAgCAIAAACkS7z/AAAHGklEQVR42u2aW0wUVxjHSTTGaHzy yZc+Go0PxPjuG7U+NGlfjOmFhz5UjbCACtiAyMqdXW6LCixQBEVtAbkq4rpcymWXZW8su+x9Biyt PpkaY31s/+yR0+NcllkqUXS+TCbfOTP7zZzvd77vfDOzSUuqbB1JUl2g0lJFpfWxy/LyskrrAxK3 L2qaDvSYfF0j3vsT/llXmOP5BGLrTExIY3h4GHpjYyP04uLioqIi8Q9qamqysrI2cKOsQdaIcoOF hYW4PZfLtTpst1ugX758eWMe3PCIEpLx2ZCuw5Gut6Tp3tquNNsHRhcVIvuPlsfjycjIuHTpUiQS QbOkpAT+Ff+ApZuQsAZZI8oN3rlzB2f29PRA7+7uFuidnZ3Kb+bmzZsFBQX/c0QJoLJMna6wpekt RS2OXx8FR21LYza+byxUd9eTFuNX2eH0LEaV0uJ5HhM/PT3d4XDE/8E7GdvGaCGScGZFRQX08vJy gU7ibFNvYAPyz9vy9+vXgh7+j7/Y5uOZANVlabW1tWE/MDDADoCMgShXr169ePEiOzaTyURndF9f 3/nz58+ePavT6axWKzknFAoRxWKxsAblnMVxHG4D8Y1Jo9frFxYWJJMhruL3+7HHr6hO0qCchQsX LuCc7Oxs3DM7OnaACH2ck5+fPzU1JWdK4AqFqOxJSWSjGOR62GY8WkRu3bolnn1EGR8fN5vNtBkI BOCC9vZ2cnJaWho6w+Ewaebk5KA5NDSEPXwUfzpTvbW1FYrNZrPb7VAARi4Z1tbWYl9XV0d1Mmni WIC70ZObmyt3A0gqZFbl5eXJmRK4QgktMYM4PQKlsdvNcbwErbKyMiy2UMbGxiRpCShifmVmZkaj b1JtZWUlMYLFD82WlhY0r127hj10hbQwi9mpg6ZcMiRRhRlDIoymQUkLk5OTiBgai+veDDlH0lSi OTMOm1evXsnRok2sZx2DCxK0fD4fEhemFaojNurlaDU1NbGxiKgyGo3ogV9WF9XxcehkOYGukBYJ UD5WHkmmQbYyxPyAjnWLrQYlLSCe0On1etmLEniJ3oxyWpHo0s99XgEJFsbLly8ljwoAQ9w+XrqC R9RjEmm1WmTt+LSgVFVVYUionikw9Gs0GugYJDI+afJrxSlrh/iCVDRUJ7HY29uLQIE3aVBKJkPU gdBRE7LVoKQFEiUIenIDxPUGg4GsrHK0JE0ppMXzUV1HEJEhyYnsX7x4IQYjx0+aFvvItS4tUk2A GSGHIWElw1pFTkOqxNH6+nrJMgwBh6qkoaGB1fHkgNWCVCsIF2SwOJUhmSXsU9fqjJayQDIhljcA wMygRQQKInF+o7qkKYW0XJ7ffixzld9wSJIg++fPn1N9bHq++bYpzkqmvsvYRClucWdUW9zeqMIq 44vUcmxxyg3pmlCVREWSlqbKom2eW1lZUVjBi2nJZkI1FN65ZNVaC5vmnj59+uzZM0EyFPcQVIQW 7WFP+GXEr9LaRCltc2j0Vqd36c+3JRT9vaFrXlNlcyxw5kkH5SS5Hfuu9OszDZm1s97gskprE+Xh ZAAFYaHRPr+4tLIm045oXoMN/edqbBHuSWXDvXVpfXX6ercpgN9ubVqDg4P79u2DYjabP4tJf38/ rUVTUlJKSkreDG9NxEYePHhw8OBBKHjWhIVDhw7RVzPsJRKyST9TNfd6AEajt9R0uvpG/S4vd67W Sl7g/nQdtJZzdf0p3xTFofX5t8V1N8xPYrKFaaFer66uTk5Ohn78+HG4Eg/pR44cIUd3796NE3bt 2kU9K2fn5MmT5NvQqVOnYAHPmnv27BFfIiGbLLBe82L+9dX37mVtjv7RxdXvIzFaxa12PDtn184g dI59XyaJ6ssfdMWGLj5mh/1EufVopaamIhp27NgBfefOnVxMoNAHZMQB/ZAm51mn07l//362x2az HThwQHwJ5TbFwnG8wxOxucOexai22U6A9Zh8qy8iPBEcGpt2DZutI6Oz2B6Ozj6emJuYcU5MO7Gy fQzfjhENRqORumzbtm2kf/v27dLDk8laeJDH0zHbc+LEidLSUvEllNsUiz/Ezc1HiB6KcCNTgccz wbX3HUtWZzjR4W8xWnv37mWdhZAKxwTJSs6zUlOeO3z4MPa0h82lgksotCmWUUsQS1TnfYkosThD V1rs9XfdHzktgcuOHj2KOCCZSrlnDQaDVqtlcyCqDJQVCqmsSwvT4Ea/h+Q9xJPgaPcjX2b1asVx +/7Cp0ULLiY1If3Qo8SzQEs/xZGvcbkxAft3Qstw15W29v+LKXuIPdQ+uPDmkN4yNO7/VGh9yEJ5 aKqsLm+E9i8GOc3aIWwTs0GV1vuXgsY5wgPFOvvtNxLldR1OQiunftYf5FRa7198AQ7FRWvvvMsr /BtTOMJ3PfIZ783POEIbyf+qc7fSaq26QKWlyqbIvxLQhgyksv4pAAAAAElFTkSuQmCC ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://stats.broadbandpublisher.com/pageCounter.adp?iPaper_id=607&random=&uid= R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=11&ipaper_id=607 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=dl18jo2mps&iSection_Id=&iStory_Id=&iPaper_Id=607&javascriptIncludeMode=0&iPosition=1 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager2.broadbandpublisher.com/storyImage.adp?iStory_ID=3155075 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://www.trumanindex.com/media/assets/icons/alert.gif R0lGODlhEAAQANUvAKh0IdqnKxgYGP/ghP/MM/7KM+yzL/vGMvO7MPa/MeWpLvfAMfrGMtydLNiX K+etLt+hLfjCMu60MPC5MO61L/nEMvzGMtORKuCkLeesLumuL/G6MP7KMuaqLffCMe+3MOOmLfrF MuOnLv3KM+uwLvzJM96fLf3JMvS+MeKlLvO8MdmaK/zIM9aVK9ubK////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAC8ALAAAAAAQABAAAAZkwJdw SCwahYHA8ZhcFgMDAsA5hEqpL+voMHVCBYJIlxkFJybj56AARkjS1SgL/CEp4NnBKQQ2ZFJwUAUW HioUGiIQLmlQJRUoYB0YDQ5jUBwMCxsGDyAmKy0XXQEApaanplhGQQA7 ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=dl18jo2mps&iSection_Id=&iStory_Id=&iPaper_Id=607&javascriptIncludeMode=0&iPosition=2 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=dl18jo2mps&iSection_Id=&iStory_Id=&iPaper_Id=607&javascriptIncludeMode=0&iPosition=3 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=dl18jo2mps&iSection_Id=&iStory_Id=&iPaper_Id=607&javascriptIncludeMode=0&iPosition=4 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=2&ipaper_id=607 R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.trumanindex.com/media/css/global.css?v45 BODY { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } A { TEXT-DECORATION: none } STRONG { FONT-WEIGHT: bold } IMG { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #cprightcol A { DISPLAY: block } #cpleftcol A { DISPLAY: block } #cprightcol H2 { DISPLAY: none } #cpleftcol H2 { DISPLAY: none } A.subnav:link { PADDING-LEFT: 1em; FONT-SIZE: 11px } A.subnav:visited { PADDING-LEFT: 1em; FONT-SIZE: 11px } BODY { MARGIN: 0px } BODY { FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333 } P { FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333 } TD { FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333 } LI { FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333 } H1 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 0.2em; PADDING-TOP: 0px } H2 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 0.2em; PADDING-TOP: 0px } H3 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 4px; FONT: bold 18px/1.2em Arial, Helvetica, sans-serif; = PADDING-TOP: 4px } H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 10px; PADDING-TOP: 0px } H5 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 10px; PADDING-TOP: 0px } P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 10px; PADDING-TOP: 0px } .smalltext { FONT-SIZE: 0.8em } .nobottommargin { MARGIN-TOP: 1em; MARGIN-BOTTOM: 0px } .graybox { PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px solid; PADDING-LEFT: 8px; = BACKGROUND: #eee; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; = BORDER-BOTTOM: #aaa 1px solid } .note { BORDER-RIGHT: #aaa 1px dashed; PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px = dashed; PADDING-LEFT: 8px; BACKGROUND: #fff; PADDING-BOTTOM: 8px; = MARGIN: 0px; BORDER-LEFT: #aaa 1px dashed; PADDING-TOP: 8px; = BORDER-BOTTOM: #aaa 1px dashed } .smallnote { BORDER-RIGHT: #aaa 1px dashed; PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px = dashed; PADDING-LEFT: 8px; FONT-SIZE: 0.8em; BACKGROUND: #fff; = PADDING-BOTTOM: 8px; MARGIN: 0px; BORDER-LEFT: #aaa 1px dashed; = PADDING-TOP: 8px; BORDER-BOTTOM: #aaa 1px dashed } A.button:link { BORDER-RIGHT: #eee 1px outset; PADDING-RIGHT: 8px; BORDER-TOP: #eee 1px = outset; DISPLAY: inline; PADDING-LEFT: 8px; BACKGROUND: #eee; = PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #eee 1px outset; = PADDING-TOP: 4px; BORDER-BOTTOM: #eee 1px outset; TEXT-ALIGN: center; = TEXT-DECORATION: none } A.button:visited { BORDER-RIGHT: #eee 1px outset; PADDING-RIGHT: 8px; BORDER-TOP: #eee 1px = outset; DISPLAY: inline; PADDING-LEFT: 8px; BACKGROUND: #eee; = PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #eee 1px outset; = PADDING-TOP: 4px; BORDER-BOTTOM: #eee 1px outset; TEXT-ALIGN: center; = TEXT-DECORATION: none } A.button:hover { BACKGROUND: #ccc } A.button:active { BORDER-RIGHT: #eee 1px inset; BORDER-TOP: #eee 1px inset; BACKGROUND: = #eee; BORDER-LEFT: #eee 1px inset; BORDER-BOTTOM: #eee 1px inset } INPUT.liquid { WIDTH: 95% } TEXTAREA.liquid { WIDTH: 95% } FORM TABLE.form_table TD { PADDING-BOTTOM: 5px } .form_error { BORDER-RIGHT: #cc0000 1px dotted; PADDING-RIGHT: 5px; BORDER-TOP: = #cc0000 1px dotted; PADDING-LEFT: 5px; FONT-SIZE: 15px; PADDING-BOTTOM: = 5px; MARGIN: 5px 5px 15px; BORDER-LEFT: #cc0000 1px dotted; COLOR: = black; PADDING-TOP: 5px; BORDER-BOTTOM: #cc0000 1px dotted } .validation_error { COLOR: #cc0000 } .validation_note { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: #cc0000; = MARGIN-BOTTOM: 4px; PADDING-BOTTOM: 2px; COLOR: #fff; PADDING-TOP: 2px } FORM { MARGIN-BOTTOM: 0px } .top_bar { BACKGROUND: #eeeeee; BORDER-BOTTOM: #999999 1px solid } .evenrow { PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #edf3fe; = PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 1px solid } TR.evenrow { BORDER-TOP: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid } .oddrow { PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #fff; = PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 1px solid } .forumname { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 10px; COLOR: blue; PADDING-TOP: 0px } .adminbutton { FONT-SIZE: 12px; WIDTH: 85px; FONT-FAMILY: arial, verdana, sans-serif } #cp_pdf_results LI { PADDING-RIGHT: 10px; PADDING-LEFT: 30px; LIST-STYLE-POSITION: inside; = FONT-SIZE: 1.1em; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px; = BORDER-BOTTOM: #666 1px solid; LIST-STYLE-TYPE: none } LI.pdf_oddrow { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/pdfimage.gif) = #f5f5f5 no-repeat 5px 50% } LI.pdf_evenrow { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/pdfimage.gif) = #edf3fe no-repeat 5px 50% } H4.cp_link_underline { FONT-SIZE: 11px; COLOR: #666; TEXT-ALIGN: right } H4.cp_link_underline A { COLOR: #666; TEXT-DECORATION: underline } #calendar_header { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px } .calendar_dark { BACKGROUND: #666666; COLOR: #c9c9c9 } #calendar_border { BORDER-BOTTOM: #aaa 1px solid } #forum .graybox { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 8px; = PADDING-TOP: 8px } #forum .originalmessage { PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #eeeeee; = PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; BORDER-BOTTOM: = #999999 1px solid; TEXT-DECORATION: none } #forum .replymessage_even { PADDING-RIGHT: 8px; BORDER-TOP: black 1px solid; PADDING-LEFT: 8px; = BACKGROUND: #eee; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; = TEXT-DECORATION: none } #forum .replymessage_odd { PADDING-RIGHT: 8px; BORDER-TOP: black 1px solid; PADDING-LEFT: 8px; = BACKGROUND: #fff; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; = TEXT-DECORATION: none } .recordSetBrowser TH { BACKGROUND: #eee; TEXT-ALIGN: left } .hilite_table { BORDER-RIGHT: #666 1px solid; BORDER-TOP: #666 1px solid; BACKGROUND: = #f3f3f3; BORDER-LEFT: #666 1px solid; BORDER-BOTTOM: #666 1px solid } #searchResults H1 { MARGIN: -4px 0px 4px; FONT: bold 13px arial, verdana, sans-serif } #searchResults H2 { MARGIN: 0px 0px 4px; FONT: bold 11px arial, verdana, sans-serif } #searchResults { MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif } #searchResults P { MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif } #searchResults TD { MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif } #searchResults .oddrow { BACKGROUND: #edf3fe } #searchResults .evenrow { BACKGROUND: #eee } #searchResults TD { PADDING-RIGHT: 8px; PADDING-LEFT: 8px; PADDING-BOTTOM: 8px; = PADDING-TOP: 8px } #searchResults TH { PADDING-LEFT: 7px; BACKGROUND: = url(http://media.collegepublisher.com/media/images/search_header.gif) = repeat-x 50% bottom; FONT: bold 11px arial, verdana, sans-serif; COLOR: = #4b4b4b; HEIGHT: 18px; TEXT-ALIGN: left } #searchResults .scorebar { BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; BACKGROUND: = #fff; BORDER-LEFT: #999 1px solid; WIDTH: 50px; BORDER-BOTTOM: #999 1px = solid } #post_form { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } #post_form TD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } #post_form_inner { BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BORDER-LEFT: = #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid } DL#post_form_inner { MARGIN: 0px 5px 5px } #post_form_inner DD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } #post_form_inner DT { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } .graybox DL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } .graybox DT { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } .graybox DD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } #search_directions_body { DISPLAY: none } .middletd { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px } .texttd { PADDING-RIGHT: 4px; BORDER-TOP: #fff 1px solid; PADDING-LEFT: 4px; = FONT-SIZE: 11px; PADDING-BOTTOM: 4px; COLOR: #58595b; PADDING-TOP: 4px; = FONT-FAMILY: Arial, Helvetica, sans-serif } .toptd { BORDER-RIGHT: #fff 1px solid; BORDER-TOP: #fff 1px solid; BORDER-LEFT: = #fff 1px solid; BORDER-BOTTOM: #fff 1px solid; FONT-FAMILY: Arial, = Helvetica, sans-serif } .buttons { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 3px } UL#address { MARGIN: 15px 0px } UL#address { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #address LI { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #login FIELDSET { BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666 1px = solid; PADDING-LEFT: 10px; BACKGROUND: #ccc; PADDING-BOTTOM: 10px; = BORDER-LEFT: #666 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #666 1px = solid } #login DL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #login DT { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #login DD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } .graybox DL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } .niceFont { FONT-SIZE: 10px; FONT-FAMILY: arial, helvetica, sans-serif } #fullcalendar { BORDER-RIGHT: #aaa 1px solid; BACKGROUND: #eee; BORDER-BOTTOM: #aaa 1px = solid } #fullcalendar TD { BORDER-RIGHT: #aaa 1px; BORDER-TOP: #aaa 1px solid; FONT-SIZE: 10px; = BORDER-LEFT: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px; FONT-FAMILY: = arial, helvetica, sans-serif } #fullcalendar TD TD { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } #cal_header { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: #666; = PADDING-BOTTOM: 3px; COLOR: #ccc; PADDING-TOP: 3px } .dark_head { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: #666; = PADDING-BOTTOM: 3px; COLOR: #ccc; PADDING-TOP: 3px } #cal_header STRONG { COLOR: #ccc } #cal_header A { COLOR: #fff } #loggedin_bar { BORDER-RIGHT: #eee 1px outset; BORDER-TOP: #eee 1px outset; BACKGROUND: = #eee; BORDER-LEFT: #eee 1px outset; BORDER-BOTTOM: #eee 1px outset } #loggedin_bar IMG { PADDING-RIGHT: 4px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #loggedin_bar TD { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 2px; = PADDING-TOP: 2px } #ncbar { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #fff 2px ridge } #agent99 { BORDER-RIGHT: #6a6a6a 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #6a6a6a 1px; PADDING-LEFT: 14px; Z-INDEX: 99; RIGHT: 444px; LEFT: 158px; = VISIBILITY: hidden; PADDING-BOTTOM: 0px; BORDER-LEFT: #6a6a6a 1px solid; = WIDTH: 291px; LINE-HEIGHT: 1.4em; PADDING-TOP: 10px; BORDER-BOTTOM: = #6a6a6a 1px solid; POSITION: absolute; TOP: 31px; BACKGROUND-COLOR: = #f0f0f0 } #agent99 TABLE { FONT: 12px/14px Arial, Helvetica, sans-serif } #agent99 A:link { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #agent99 A:hover { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #agent99 A:active { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #agent99 A:visited { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #formtext { WIDTH: 202px } #search { WIDTH: 54px } #cp_extras { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; FONT: 11px = Arial, Arial, Helvetica, sans-serif; PADDING-TOP: 6px } #cp_extras A:link { FONT-WEIGHT: bold; COLOR: #000 } #cp_extras A:visited { FONT-WEIGHT: bold; COLOR: #000 } #cp_extras A:active { FONT-WEIGHT: bold; COLOR: #000 } #cp_extras A:hover { FONT-WEIGHT: bold; COLOR: #900 } A#stafflogin { BORDER-RIGHT: #bbdff9 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #bbdff9 1px solid; DISPLAY: block; PADDING-LEFT: 5px; FONT-SIZE: 16px; = BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/over.jpg) #fff = repeat-x left bottom; PADDING-BOTTOM: 5px; BORDER-LEFT: #bbdff9 1px = solid; COLOR: #1a3787; LINE-HEIGHT: 24px; PADDING-TOP: 5px; = BORDER-BOTTOM: #bbdff9 1px solid; TEXT-ALIGN: center; TEXT-DECORATION: = none } A#stafflogin:hover { BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/click.jpg) = #fff repeat-x left bottom; BORDER-LEFT: #aaa 1px solid; COLOR: #666; = BORDER-BOTTOM: #aaa 1px solid } #log_left { FLOAT: left; WIDTH: 230px } #log_right { FLOAT: left; MARGIN: 0px 0px 0px 10px; WIDTH: 230px } #log_both { FLOAT: left; MARGIN: 0px 0px 25px } FORM#login { MARGIN: 0px } A.faux_button { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 4px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/vote.gif) #fff = repeat-x left bottom; PADDING-BOTTOM: 5px; FONT: 12px/12px = arial,sans-serif; BORDER-LEFT: #ccc 1px solid; WIDTH: 75px; COLOR: #666; = PADDING-TOP: 5px; BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: center; = TEXT-DECORATION: none } A.faux_button:hover { BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/click.jpg) = #fff repeat-x left bottom; BORDER-LEFT: #aaa 1px solid; COLOR: #666; = BORDER-BOTTOM: #aaa 1px solid } #poll A { MARGIN: 5px 5px 0px } .hidden { DISPLAY: none } #fplead { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 8px; MARGIN: 0px = 0px 8px; PADDING-TOP: 0px; BORDER-BOTTOM: gray 1px dashed } TD.fparticle { VERTICAL-ALIGN: top; TEXT-ALIGN: left } .lead_right .fparticle { PADDING-RIGHT: 8px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .lead_center .fparticle { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 8px } .fpimage P { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: = 0px; FONT: 10px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 4px } .fpimage IMG { DISPLAY: block } #cpcentercol { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 10px } #fpaio_3 #sidebar IMG { BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BORDER-LEFT: = #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid } #fp_feat_1 .fp_feat { CLEAR: left; FLOAT: left; MARGIN: 0px 0px 15px } #fp_feat_1 DL { BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px } #fp_feat_1 DD { BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px } #fp_feat_1 DT { BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px } #fp_feat_1 DD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #fp_feat_1 DT { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #fptemplate2 #fplead { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; = BORDER-RIGHT-WIDTH: 0px } #fptemplate2 #fpfeatured { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; = BORDER-RIGHT-WIDTH: 0px } #fptemplate2 #fpfeatured { PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fptemplate2 #fpfeatured H3 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 4px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; = PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid } #fptemplate2 H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 20px; BACKGROUND: = url(images/digiarrow.gif) no-repeat 0px 5px; PADDING-BOTTOM: 2px; = MARGIN: 0px; FONT: bold 14px/1.1em Arial, Helvetica, sans-serif; = PADDING-TOP: 2px } #fptemplate3 #fplead { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; = BORDER-RIGHT-WIDTH: 0px } #fptemplate3 #fpfeatured { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; = BORDER-RIGHT-WIDTH: 0px } #fptemplate3 #fpfeatured { PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fptemplate3 #fpfeatured H3 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 4px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; = PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid } #fptemplate3 H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 20px; BACKGROUND: = url(images/digiarrow.gif) no-repeat 0px 5px; PADDING-BOTTOM: 2px; = MARGIN: 0px; FONT: bold 14px/1.1em Arial, Helvetica, sans-serif; = PADDING-TOP: 2px } #fplead H2 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: = 0px; FONT: bold 18px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: = 0px } #fplead P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: = 0px; FONT: 11px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 0px } #fpfeatured H3 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: = 0px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: = 0px } #fpfeatured P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: = 0px; FONT: 11px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 0px } .article_byline { FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666 } .article_byline A .image_byline { FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666 } .image_byline A { FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666 } #profile_button { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: = url(/media/assets/images/profile.gif) repeat-x; PADDING-BOTTOM: 3px; = COLOR: white; PADDING-TOP: 3px } #fplead TD { PADDING-BOTTOM: 25px } .lead_left { MARGIN: 0px 0px 15px; TEXT-ALIGN: left } .lead_right { MARGIN: 0px 0px 15px; TEXT-ALIGN: left } .lead_center { MARGIN: 0px 0px 15px; TEXT-ALIGN: left } .lead_left TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; WIDTH: = 100%; PADDING-TOP: 0px } .lead_right TD { PADDING-RIGHT: 8px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; WIDTH: = 100%; PADDING-TOP: 0px } .lead_center .summary { MARGIN: 0px 0px 25px } .lead_center .fpimage { MARGIN: 0px 0px 8px } #fp_feat H4 { MARGIN: 0px 0px 7px } #fp_feat H5 { MARGIN: 0px 0px 7px } #fp_feat .article_byline { MARGIN: 0px 0px 7px } .article { CLEAR: left; FLOAT: left; MARGIN: 0px 0px 25px; WIDTH: 100% } #fp_feat_1 .summary { MARGIN: 0px 0px 0px 83px } .float_thumbnail { FLOAT: left; MARGIN: 0px 8px 0px 0px; WIDTH: 75px } #fp_feat_2 TD { PADDING-BOTTOM: 25px; WIDTH: 50% } #fp_feat_2 TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fp_feat_3 TD { PADDING-BOTTOM: 25px; WIDTH: 33% } #fp_feat_3 TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #sidebar P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #sidebar H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #sidebar H5 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #sidebar H4 { MARGIN: 0px 0px 5px } #sidebar P { MARGIN: 0px 0px 5px } #sidebar H5 { MARGIN: 0px 0px 5px } #fpaio_3 TD { VERTICAL-ALIGN: top } #fpaio_3 TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fpaio_3 .fpimage { MARGIN: 0px 0px 15px } #fpaio_3 #sidebar UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 15px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #fpaio_3 #sidebar LI { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/images/digiarrow.gif) = no-repeat left 3px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; = LIST-STYLE-TYPE: none } #fpaio_3 .featured { MARGIN: 0px 0px 15px } #fpaio_2 TD { VERTICAL-ALIGN: top } #fpaio_2 TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fpaio_2 .fpimage { MARGIN: 0px 0px 15px } #fpaio_2 H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; = PADDING-TOP: 0px; BORDER-BOTTOM: #aaa 1px solid } #fpaio_2 #sidebar UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 25px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #fpaio_2 #sidebar LI { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/images/digiarrow.gif) = no-repeat left 3px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; = PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #fpaio_2 .featured { MARGIN: 0px 0px 15px } #fpaio_1 TD { VERTICAL-ALIGN: top } #fpaio_1 TD + TD { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #fpaio_1 .fpimage { MARGIN: 0px 0px 15px } #fpaio_1 .featured { MARGIN: 0px 0px 15px } #article H2 { MARGIN: 0px 0px 7px } #article H4 { MARGIN: 0px 0px 7px } #meta { MARGIN: 0px 0px 7px } #article H3 { MARGIN: 0px 0px 7px; COLOR: #666 } TD.toptd { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } .toptd A { COLOR: #666 } #poll { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 5px; BACKGROUND: #eee; PADDING-BOTTOM: 5px; MARGIN: = 15px 5px 0px; BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 5px; = BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: left } P#view_results { MARGIN: 5px 0px 0px } #cp_poll_chart TABLE { Z-INDEX: 200! important } #cp_poll_legend { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; = PADDING-TOP: 4px } #cp_poll_legend TD { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: white; = PADDING-BOTTOM: 4px; VERTICAL-ALIGN: top; PADDING-TOP: 4px; TEXT-ALIGN: = left } .cp_poll_color DIV { BORDER-RIGHT: #666 1px solid; BORDER-TOP: #666 1px solid; BORDER-LEFT: = #666 1px solid; WIDTH: 1em; BORDER-BOTTOM: #666 1px solid; HEIGHT: 1em } #cp_poll_color_1 { BACKGROUND: #bc0303 } #cp_poll_color_2 { BACKGROUND: #0064d1 } #cp_poll_color_3 { BACKGROUND: #ff9800 } #cp_poll_color_4 { BACKGROUND: #108b00 } #cp_poll_color_5 { BACKGROUND: #6435b1 } #cp_poll_color_6 { BACKGROUND: #0614ca } #cp_poll_color_7 { BACKGROUND: #36c947 } #cp_poll_color_8 { BACKGROUND: #b23da8 } #cp_poll_color_9 { BACKGROUND: #746137 } #cp_poll_color_10 { BACKGROUND: #ec008c } #object9975 { TEXT-ALIGN: center } #object9974 { TEXT-ALIGN: center } #object9973 { TEXT-ALIGN: center } #banner_client_1 { TEXT-ALIGN: center } #banner_network_6 { TEXT-ALIGN: center } #weather { BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #666 1px = solid; PADDING-LEFT: 1px; BACKGROUND: #fff; PADDING-BOTTOM: 1px; MARGIN: = 0px auto; BORDER-LEFT: #666 1px solid; WIDTH: 120px; PADDING-TOP: 1px; = BORDER-BOTTOM: #666 1px solid } #weatherblock { PADDING-RIGHT: 3px; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 3px; = PADDING-BOTTOM: 3px; MARGIN: 1px 0px 0px; PADDING-TOP: 3px } .art { MARGIN: 0px 0px 15px } #breadcrumb { FONT-SIZE: 10px; MARGIN: 0px 0px 7px } #breadcrumb A { FONT-SIZE: 10px; MARGIN: 0px 0px 7px } #banner_network_1 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; = PADDING-TOP: 0px } #loggedin_controlbar { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; = PADDING-TOP: 0px } #article { TEXT-ALIGN: left } #article H2 { LINE-HEIGHT: 1.2em } UL#user_art_list_but { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 15px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } .user_art_list UL { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 15px; = BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #ccc 1px = solid } .user_art_list STRONG { MARGIN: 0px 0px 5px } .user_art_list LI { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 3px; = PADDING-TOP: 3px; LIST-STYLE-TYPE: none } .user_art_list LI.even { BACKGROUND: #f5f5f5 } .arch_group A { COLOR: #333 } .arch_group { BORDER-TOP: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid; TEXT-ALIGN: = left } .arch_group STRONG { DISPLAY: block } .arch_group .evenrow { CLEAR: left; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: = 0px; PADDING-TOP: 0px } .arch_group .oddrow { CLEAR: left; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: = 0px; PADDING-TOP: 0px } H2 { LINE-HEIGHT: 1.2em; TEXT-ALIGN: left } H3 { LINE-HEIGHT: 1.2em; TEXT-ALIGN: left } #banner_loc_3 { PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .textad-container .textad { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 4px; BACKGROUND: #eee; PADDING-BOTTOM: 4px; = BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #ccc 1px = solid; TEXT-ALIGN: left } .textad-container .textad H1 { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; = PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, = sans-serif; COLOR: #00f; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; = TEXT-DECORATION: underline } .textad-container .textad H1 A { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; = PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, = sans-serif; COLOR: #00f; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; = TEXT-DECORATION: underline } .textad-container .textad P { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; = PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, = sans-serif; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; = TEXT-DECORATION: none } .textad-container .textad P A { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; = PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, = sans-serif; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; = TEXT-DECORATION: none } .textad-container .textad P.url { COLOR: #3f9f3f; TEXT-DECORATION: none } .textad-container .textad P.url A { COLOR: #3f9f3f; TEXT-DECORATION: none } .textad-container .caption A { FONT: 10px/1.1em Arial, Helvetica, sans-serif; COLOR: #999 } #flan_article_top { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! = important; BORDER-BOTTOM: #ccc 1px solid } #flan_article_top UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_article_tools UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_article_bottom UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_article_bottom { MARGIN: 15px 0px } #flan_article_top UL { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } #flan_article_top LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #flan_article_bottom LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #flan_story_bot_nav { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #flan_article_top LI A { COLOR: #333333! important } #flan_article_bottom LI A { COLOR: #333333! important } #flan_story_bot_nav A { COLOR: #333333! important } #flan_article_top LI A:hover { COLOR: #000000! important } #flan_article_bottom A:hover { COLOR: #000000! important } #flan_article_top_left { FLOAT: left; WIDTH: 230px } #flan_article_top_left LI { DISPLAY: inline; MARGIN: 0px 5px 0px 0px } #flan_article_top_right { FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right } #flan_article_bottom_right { FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right } LI#flan_article_discuss A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) = no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#flan_article_print A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/print.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#flan_article_email A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/email.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#flan_article_more A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/down.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#flan_article_blog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) = no-repeat left 50% } LI#flan_article_live A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)= no-repeat left 50% } LI#flan_article_digg A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/digg.gif) = no-repeat left 50% } LI#flan_article_news A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) = no-repeat left 50% } LI#flan_article_deli A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) = no-repeat left 50% } LI#flan_article_yaho A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) = no-repeat left 50% } LI#flan_article_goog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/google.gif) = no-repeat left 0px } LI.flan_article_page DIV { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/page.gif) = no-repeat left center; FLOAT: right; PADDING-BOTTOM: 0px; PADDING-TOP: = 0px } #flan_story_text { MARGIN: 0px 0px 15px } #flan_article_tools { BORDER-TOP: #ccc 1px solid; BACKGROUND: #f5f5f5; MARGIN: 0px 0px 25px } P.flan_article_more_tools { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = FONT-WEIGHT: bold! important; FONT-SIZE: 12px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } P.flan_article_tools_header { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = FONT-WEIGHT: bold! important; FONT-SIZE: 11px; PADDING-BOTTOM: 0px! = important; MARGIN: 0px 0px 8px; PADDING-TOP: 0px! important } #flan_article_tools .flan_article_gutter { PADDING-RIGHT: 5px! important; PADDING-LEFT: 5px! important; = PADDING-BOTTOM: 5px! important; PADDING-TOP: 5px! important } #flan_article_tools UL { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: = 0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important } #flan_article_tools LI { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: = 0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important } #flan_article_tools LI A { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 17px! important; FONT-SIZE: 10px! important; = PADDING-BOTTOM: 3px! important; MARGIN: 0px 3px 0px 0px; PADDING-TOP: = 3px! important } #flan_article_tools LI A { DISPLAY: inline! important; FONT-SIZE: 10px! important } #flan_article_tools_book { MARGIN: 0px 0px 0px 85px; BORDER-LEFT: #fff 1px solid } #flan_article_tools_blog { FLOAT: left! important; WIDTH: 85px! important } #flan_article_tools_rss { FLOAT: right! important; BORDER-LEFT: #fff 1px solid; WIDTH: 150px! = important } #flan_story_bot_nav { MARGIN: 0px 0px 15px; TEXT-ALIGN: right } #flan_continued { FONT-SIZE: 11px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 17px } * HTML #flan_article_tools { HEIGHT: 47px } #cp_article_top { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! = important; BORDER-BOTTOM: #ccc 1px solid } #cp_article_top UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_tools UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_bottom UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_bottom { MARGIN: 15px 0px } #cp_article_top UL { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } #cp_article_top LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_article_bottom LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_story_bot_nav { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_article_top LI A { COLOR: #333333! important } #cp_article_bottom LI A { COLOR: #333333! important } #cp_story_bot_nav A { COLOR: #333333! important } #cp_article_top LI A:hover { COLOR: #000000! important } #cp_article_bottom A:hover { COLOR: #000000! important } #cp_article_top_left { FLOAT: left; WIDTH: 60% } #cp_article_top_left LI { DISPLAY: inline; MARGIN: 0px 5px 0px 0px } #cp_article_top_right { FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right } #cp_article_bottom_right { FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right } LI#cp_article_discuss A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) = no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_print A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/print.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_email A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/email.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_more A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/down.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } #cp_article_tools { MARGIN: 1em 0px 25px } #cp_article_tools H4 { MARGIN: 0px } #cp_article_tools H5 { FONT-SIZE: 11px; MARGIN: 0px } #cp_at_content { PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 0px; = BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/article_bkg.gif= ) #f5f5f5 repeat-x right bottom; PADDING-BOTTOM: 7px; PADDING-TOP: 5px } #cp_at_share { PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: = 0px; WIDTH: 70%; PADDING-TOP: 0px } #cp_at_rss { PADDING-RIGHT: 0px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #cp_article_tools #cp_at_content UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_at_content LI { DISPLAY: inline; MARGIN: 0px 8px 0px 0px; LIST-STYLE-TYPE: none } #cp_at_content LI A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; FONT-SIZE: 10px; = PADDING-BOTTOM: 3px; PADDING-TOP: 3px } LI#cp_at_blog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) = no-repeat left 50% } LI#cp_at_facebook A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/facebook.gif) = no-repeat left 50% } LI#cp_at_live A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)= no-repeat left 50% } LI#cp_at_digg A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/digg.gif) = no-repeat left 50% } LI#cp_at_news A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) = no-repeat left 50% } LI#cp_at_deli A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) = no-repeat left 50% } LI#cp_at_yaho A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) = no-repeat left 50% } LI#cp_at_goog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/google.gif) = no-repeat left 0px } #net_bar * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px; TEXT-ALIGN: left } #net_bar A { outline: none } #net_bar A:active { outline: none } :focus { -moz-outline-style: none } #net_bar UL { LIST-STYLE-TYPE: none } #net_bar LI { LIST-STYLE-TYPE: none } #net_bar FIELDSET { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } .hide { DISPLAY: none } .show { DISPLAY: block } #net_bar { BACKGROUND: #e0e0e0; FONT: 12px/1em Trebuchet MS, arial, verdana, = sans-serif; BORDER-BOTTOM: #7d87a2 1px solid; HEIGHT: 33px } #net_cp_a { Z-INDEX: 2; LEFT: 5px; WIDTH: 165px; TEXT-INDENT: -1000px; LINE-HEIGHT: = 26px; POSITION: absolute; TOP: 4px; HEIGHT: 26px } #net_cp_a A { DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/images/net_cp2.gif) = no-repeat left top; WIDTH: 165px; TEXT-INDENT: -1000px; LINE-HEIGHT: = 26px; HEIGHT: 26px } #net_cp_a A:hover { BACKGROUND-POSITION: 0px -26px } .unselected#net_cp_a A:hover { BACKGROUND-POSITION: 0px -26px } .selected#net_cp_a A { BACKGROUND-POSITION: 0px -52px } .selected#net_cp_a A:hover { BACKGROUND-POSITION: 0px -52px } #net_cp_a A:active { BACKGROUND-POSITION: 0px -52px } .unselected#net_cp_a A { BACKGROUND-POSITION: 0px 0px } #net_cp_nav_list { Z-INDEX: 1; LEFT: 5px; POSITION: absolute; TOP: 28px } UL#net_cp_nav_list { BORDER-RIGHT: #7d87a2 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #7d87a2 1px solid; PADDING-LEFT: 5px; BACKGROUND: #fff; PADDING-BOTTOM: = 3px; BORDER-LEFT: #7d87a2 1px solid; WIDTH: 225px; PADDING-TOP: 5px; = BORDER-BOTTOM: #7d87a2 1px solid; LIST-STYLE-TYPE: none } UL#net_cp_nav_list LI A { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ccc 1px = solid; DISPLAY: block; PADDING-LEFT: 5px; BACKGROUND: #f5f5f5; = PADDING-BOTTOM: 5px; MARGIN: 0px 0px 5px; FONT: 12px/1em Trebuchet MS, = arial, verdana, sans-serif; BORDER-LEFT: #ccc 1px solid; COLOR: #666; = PADDING-TOP: 5px; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none } UL#net_cp_nav_list LI A:hover { BACKGROUND: #fff; COLOR: #303030 } #net_search { VISIBILITY: visible } #net_search_input { FONT-SIZE: 12px; LEFT: 180px; WIDTH: 125px; POSITION: absolute; TOP: = 7px } #net_search_choose_link { Z-INDEX: 2; LEFT: 313px; WIDTH: 16px; TEXT-INDENT: -1000px; = LINE-HEIGHT: 22px; POSITION: absolute; TOP: 6px; HEIGHT: 23px } #net_search_choose_link A { DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/images/dropdown.png) = no-repeat left top; WIDTH: 16px; TEXT-INDENT: -1000px; LINE-HEIGHT: = 22px; HEIGHT: 22px } #net_search_choose_link A:hover { BACKGROUND-POSITION: 0px -22px } #net_bar .unselected#net_search_choose_link A:hover { BACKGROUND-POSITION: 0px -22px } #net_bar .selected#net_search_choose_link A { BACKGROUND-POSITION: 0px -44px } #net_bar .selected#net_search_choose_link A:hover { BACKGROUND-POSITION: 0px -44px } #net_bar #net_search_choose_link A:active { BACKGROUND-POSITION: 0px -44px } #net_bar .unselected#net_search_choose_link A { BACKGROUND-POSITION: 0px 0px } #net_search_choose_options { Z-INDEX: 1; LEFT: 313px; POSITION: absolute; TOP: 25px } UL#net_search_choose_options { BORDER-RIGHT: #7d87a2 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #7d87a2 1px solid; PADDING-LEFT: 5px; BACKGROUND: #fff; PADDING-BOTTOM: = 0px; BORDER-LEFT: #7d87a2 1px solid; WIDTH: 175px; PADDING-TOP: 5px; = BORDER-BOTTOM: #7d87a2 1px solid; LIST-STYLE-TYPE: none } UL#net_search_choose_options LI { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 0px 0px 5px; = FONT: 12px/1em Trebuchet MS, arial, verdana, sans-serif; BORDER-LEFT: = #ccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #ccc 1px solid } #net_search_choose_submit { Z-INDEX: 2; BACKGROUND: = url(http://media.collegepublisher.com/media/images/button_bg.png) = no-repeat right top; LEFT: 329px; OVERFLOW: hidden; POSITION: absolute; = TOP: 6px } #net_search_choose_submit A { MARGIN: 0px 6px 0px 4px; FONT: 11px/21px Trebuchet MS, arial, verdana, = sans-serif; COLOR: #333; TEXT-DECORATION: none } #net_channels { RIGHT: 200px; WIDTH: 375px; POSITION: absolute; TOP: 12px } #net_channels { WIDTH: auto } #net_channels UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #net_channels LI { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: = url(http://media.collegepublisher.com/media/images/nav_right_1.png) = no-repeat right top; FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: 0px 0px = 0px 2px; PADDING-TOP: 0px } #net_channels A { PADDING-RIGHT: 4px; DISPLAY: block; PADDING-LEFT: 4px; BACKGROUND: = url(http://media.collegepublisher.com/media/images/nav_left_1.png) = no-repeat left top; FLOAT: left; PADDING-BOTTOM: 4px; FONT: 11px/1em = Trebuchet MS, arial, verdana, sans-serif; COLOR: #303030; PADDING-TOP: = 4px; TEXT-DECORATION: none } #net_channels A { FLOAT: none } UL#net_cp_nav_list LI { MARGIN: 0px 0px -3px; HEIGHT: 1% } #net_weather { RIGHT: 0px; POSITION: absolute; TOP: 1px } #flan_pods H2 { MARGIN: 0px 0px 1em } #flan_pods .flan_pods_channels { MARGIN: 0px 0px 1em } #flan_pods .flan_pods_gutter { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; BACKGROUND: #f5f5f5; = PADDING-BOTTOM: 10px; PADDING-TOP: 10px } #flan_pods UL { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } #flan_pods UL LI { LIST-STYLE-POSITION: outside; LIST-STYLE-TYPE: none } #flan_pods H3 { MARGIN: 0px 0px 0.5em } #flan_pods H5 { FONT-SIZE: 10px; MARGIN: 0px 0px 3px; TEXT-TRANSFORM: uppercase; COLOR: = #999; BORDER-BOTTOM: #999 1px solid } #flan_pods IMG { BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; FLOAT: = right; MARGIN: 0px 0em 1em 1em; BORDER-LEFT: #d8d8d8 1px solid; = BORDER-BOTTOM: #d8d8d8 1px solid } .flan_pods_info { CLEAR: both; MARGIN: 0px 0px 1em } .flan_pods_tracklist { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } .flan_pods_list_even { BACKGROUND: #edf3fe } .flan_pods_list_odd { BACKGROUND: #fff } .flan_pods_list_odd:hover { BACKGROUND: #ffc } .flan_pods_list_even:hover { BACKGROUND: #ffc } .flan_pods_tracklist LI { PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; = PADDING-BOTTOM: 8px; PADDING-TOP: 10px } .flan_pods_tracklist LI P.flan_pods_title { DISPLAY: inline; FLOAT: left; MARGIN: 0px; LINE-HEIGHT: 17px } .flan_pods_tracklist LI P.flan_pods_description { FONT-SIZE: 0.9em; MARGIN: 0.5em 0px 0px } A.flan_pods_listen { DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/podcast.gif) = no-repeat left top; FLOAT: right; MARGIN: 0px; WIDTH: 37px; TEXT-INDENT: = -1000em; HEIGHT: 17px } A.flan_pods_listen:hover { BACKGROUND-POSITION: left bottom } .flan_pods_channels .more { FONT-SIZE: 1.2em; MARGIN: 0.5em 0px 0px; TEXT-ALIGN: right } .flan_pods_channels .more A { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = LINE-HEIGHT: 1.2em; PADDING-TOP: 5px } .flan_pods_subscription_links { TEXT-ALIGN: right } .flan_pods_subscription_links LI { DISPLAY: inline; MARGIN: 0px 10px 0px 0px } .flan_pods_subscription_links LI A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .flan_pods_rss A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) = no-repeat left center } .flan_pods_m3u A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center } .flan_pods_rss_itunes A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/podcast_icon_ori= ginal.png) no-repeat left center } .flan_pods_subscription_links LI.flan_pods_xspf { MARGIN: 0px } .flan_pods_xspf A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center } .flan_pods_all A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)= no-repeat left center } HTML > BODY .flan_pods_tracklist LI P.flan_pods_title { FLOAT: none } #flan_ads { FLOAT: right; WIDTH: 300px } .box { CLEAR: both; MARGIN: 0px 0px 10px; WIDTH: 300px } #flan_ads .cp_ad { CLEAR: both; MARGIN: 0px 0px 10px; WIDTH: 300px } #flan_ads .content .gutter { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px } #flan_ads .gutter P { MARGIN: 0px 0px 10px } #advertisements { MARGIN: 0px 0px 10px } #flan_ads .content { CLEAR: both; BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px = solid; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, sans-serif; = BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid } #advertisements { CLEAR: both; BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px = solid; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, sans-serif; = BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid } #flan_ads .content_300 { CLEAR: both; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, = sans-serif } #advertisements { CLEAR: both; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, = sans-serif } #flan_ads .content H4 { PADDING-RIGHT: 3px; PADDING-LEFT: 7px; BACKGROUND: #f5f5f5; = PADDING-BOTTOM: 3px; FONT: 14px/1em arial, verdana, sans-serif; = TEXT-TRANSFORM: uppercase; COLOR: #333333; PADDING-TOP: 3px; = BORDER-BOTTOM: #d8d8d8 1px solid } #advertisements H4 { PADDING-RIGHT: 3px; PADDING-LEFT: 7px; BACKGROUND: #f5f5f5; = PADDING-BOTTOM: 3px; FONT: 14px/1em arial, verdana, sans-serif; = TEXT-TRANSFORM: uppercase; COLOR: #333333; PADDING-TOP: 3px; = BORDER-BOTTOM: #d8d8d8 1px solid } #flan_ads .content A { COLOR: #333; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none } #flan_ads .content A:hover { BACKGROUND: #ffc } #flan_ads .content OL { LIST-STYLE-POSITION: inside } #flan_ads .content OL LI { MARGIN: 0px 0px 5px; LINE-HEIGHT: 1.2em } #box_120_240 { BACKGROUND: #f5f5f5 } #box_120_240 .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 120px } #box_120_600_loc .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 120px } #box_120_600 { BACKGROUND: #f5f5f5 } #box_120_600 .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 120px } #box_120_600_loc .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 120px } #box_160_600 { BACKGROUND: #f5f5f5 } #box_160_600 .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 160px } #box_160_600_loc .banner { BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; = WIDTH: 160px } #advertisements * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #advertisements H4 { MARGIN: 0px 0px 10px } #advertisements { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: = 10px; WIDTH: 298px; PADDING-TOP: 0px } #advertisements .left { BORDER-RIGHT: #e1e1e1 1px solid; FLOAT: left; WIDTH: 150px; TEXT-ALIGN: = center } #advertisements .right { TEXT-ALIGN: center } #flan_ads .content * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_nav .content * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_ads .content FORM { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: = 0px; PADDING-TOP: 10px } #flan_ads .content DIV { MARGIN: 0px 0px 5px } #flan_ads .pollquestionstyle { FONT: bold 13px/1.2em arial, verdana, sans-serif } #flan_ads .content_answers { FONT-SIZE: 11px; MARGIN: 7px 0px 0px } #flan_ads .content_answers DIV { MARGIN: 0px 0px 7px } #flan_ads .content A.faux_button { PADDING-RIGHT: 3px; DISPLAY: block; PADDING-LEFT: 3px; PADDING-BOTTOM: = 3px; MARGIN: 7px 0px 0px; PADDING-TOP: 3px } #flan_ads .content P#view_results { MARGIN: 7px 0px 0px } #flan_content UL { MARGIN: 1em } #dn_content UL { MARGIN: 1em } #flan_content OL { MARGIN: 1em } #dn_content OL { MARGIN: 1em } #flan_content P { MARGIN: 0px 0px 1em } #dn_content P { MARGIN: 0px 0px 1em } #flan_text_ads * { MARGIN: 0px } #flan_text_ads { BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #999999 1px solid; MARGIN: = 0px 0px 10px; BORDER-LEFT: #999999 1px solid; BORDER-BOTTOM: #999999 1px = solid } .flan_text_ad { BORDER-BOTTOM: #d8d8d8 1px solid } .flan_text_ad_title { COLOR: blue; TEXT-DECORATION: underline } .flan_text_ad_action { COLOR: blue } .flan_text_ad A { PADDING-RIGHT: 5px! important; DISPLAY: block; PADDING-LEFT: 5px! = important; BACKGROUND: #fff; PADDING-BOTTOM: 5px! important; = PADDING-TOP: 5px! important } .flan_text_ad A:hover { BACKGROUND: #f5f5f5 } .flan_text_ad_bar { PADDING-RIGHT: 3px! important; PADDING-LEFT: 3px! important; FONT-SIZE: = 0.9em! important; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 3px! important; = PADDING-TOP: 3px! important; TEXT-ALIGN: center! important } .flan_comment { BACKGROUND: #edf3fe; MARGIN: 0px 0px 0.5em; OVERFLOW: auto } .flan_comment_response { BACKGROUND: #f5f5f5; MARGIN: 0px 0px 0.5em } .flan_comment_response BLOCKQUOTE { BORDER-RIGHT: #ffcc33 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #ffcc33 1px solid; PADDING-LEFT: 10px; BACKGROUND: #ffff99; = PADDING-BOTTOM: 10px; MARGIN: 0px 0px 1em; BORDER-LEFT: #ffcc33 1px = solid; PADDING-TOP: 10px; BORDER-BOTTOM: #ffcc33 1px solid } .flan_comment_gutter { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px } .flan_comment_body { MARGIN: 0px 0px 1em } .flan_comment_reply { TEXT-ALIGN: right } .flan_comment_read { TEXT-ALIGN: right } .flan_comment_reply A { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .flan_comment_post A { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .flan_comment_article A { PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/page.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .flan_comment_all A { PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)= no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .flan_comment_read A { PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)= no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } UL.flan_comment_nav { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! = important } #maincontent UL.flan_comment_nav { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! = important } UL.flan_comment_nav LI.previous { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/minus.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } UL.flan_comment_nav LI.next { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center; LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; = POSITION: relative; TEXT-ALIGN: right } .flan_comment_nav LI { DISPLAY: inline; MARGIN: 0px 1em 0px 0px } .flan_comment_valid_img { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; = PADDING-TOP: 0px } .flan_comment_valid FIELDSET { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } .flan_comment_valid LABEL { DISPLAY: block; MARGIN: 0px 0px 0.5em } .flan_comment_valid INPUT { DISPLAY: block; MARGIN: 0px 0px 0.5em } .flan_disabled { COLOR: #999 } .post_comment_button { MARGIN: 1.5em 0px; TEXT-ALIGN: center } .post_comment_no { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: #cc0000; = PADDING-BOTTOM: 2px; MARGIN: 0px 0px 1.5em; COLOR: #fff; PADDING-TOP: = 2px } .post_comment_no A { COLOR: #fff! important; TEXT-DECORATION: underline } .cpfooter { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: = 2em; PADDING-TOP: 2em } UL.flan_breadcrumb { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! = important; LIST-STYLE-TYPE: none } .flan_breadcrumb LI { DISPLAY: inline; FONT-SIZE: 0.9em; MARGIN: 0px 1px 0px 0px } .flan_breadcrumb LI.flan_breadcrumb_parent { DISPLAY: inline; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)= no-repeat left center } .flan_breadcrumb LI { DISPLAY: inline; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/arrow_right_ligh= t.gif) no-repeat left center } #flan_syndication_feeds LI { LIST-STYLE-TYPE: none } .flan_rss { PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .flan_article_clear { CLEAR: both } .flan_clear { CLEAR: both } .cp_clear { CLEAR: both } .cp_article_clear { CLEAR: both } .flan_clear_auto:unknown { CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: = "." } .cp_clear:unknown { CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: = "." } .flan_clear_auto { DISPLAY: inline-block } .cp_clear { DISPLAY: inline-block } .flan_clear_auto { DISPLAY: block } .cp_clear { DISPLAY: block } * HTML .flan_clear_auto { HEIGHT: 1% } * HTML .cp_clear { HEIGHT: 1% } .cp_light { COLOR: #999999 } .cp_light P { COLOR: #999999 } .cp_small { FONT-SIZE: 0.9em; LINE-HEIGHT: 1.4em } .cp_small P { FONT-SIZE: 0.9em; LINE-HEIGHT: 1.4em } .cp_medium { FONT-SIZE: 1em; LINE-HEIGHT: 1.4em } .cp_medium P { FONT-SIZE: 1em; LINE-HEIGHT: 1.4em } .cp_large { FONT-SIZE: 1.3em; LINE-HEIGHT: 1.4em } .cp_large P { FONT-SIZE: 1.3em; LINE-HEIGHT: 1.4em } .cp_rss { PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .cp_table { BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; MARGIN: = 0px 0px 1em; BORDER-LEFT: #d8d8d8 1px solid; WIDTH: 100%; BORDER-BOTTOM: = #d8d8d8 1px solid } .cp_table TH { PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #cccccc; = PADDING-BOTTOM: 7px; PADDING-TOP: 7px; TEXT-ALIGN: left } .cp_table TD { PADDING-RIGHT: 7px; PADDING-LEFT: 7px; PADDING-BOTTOM: 7px; = PADDING-TOP: 7px } .cp_table P { MARGIN: 0px 0px 0.5em } .cp_even { BACKGROUND: #f5f5f5 } .cp_odd { BACKGROUND: #edf3fe } BLOCKQUOTE { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #d8d8d8 1px solid; PADDING-LEFT: 10px; BACKGROUND: #ffffff; = PADDING-BOTTOM: 10px; MARGIN: 0px 0px 1em; BORDER-LEFT: #d8d8d8 1px = solid; PADDING-TOP: 10px; BORDER-BOTTOM: #d8d8d8 1px solid } BLOCKQUOTE EM { DISPLAY: block; FONT-WEIGHT: bold; MARGIN: 0px 0px 0.3em; = BORDER-BOTTOM: #e9e9e9 1px solid } .cp_left_right { MARGIN: 0px 0px 1em } .cp_left { FLOAT: left } .cp_right { FLOAT: right } .callout_left { FLOAT: left; MARGIN: 0px 1em 1em 0px; WIDTH: 33% } .callout_right { FLOAT: right; MARGIN: 0px 0px 1em 1em; WIDTH: 33% } A.cp_reply { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/plus.gif) = no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .cp_warn { PADDING-RIGHT: 5px; PADDING-LEFT: 27px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/alert.gif) = #ffff99 no-repeat 5px 4px; PADDING-BOTTOM: 5px; MARGIN: 0px 0px 1em; = FONT: 1em/1.2em arial, verdana, sans-serif; PADDING-TOP: 5px } .cp_warn STRONG { COLOR: #af0000! important } .cp_warn P { MARGIN: 0px; COLOR: #000000! important } .cp_alert { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: #ffff99; = PADDING-BOTTOM: 5px; MARGIN: 0px 0px 1em; FONT: 1em/1.2em arial, = verdana, sans-serif; COLOR: #af0000; PADDING-TOP: 5px } .cp_hide { DISPLAY: none } .cp_forum_trail { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! = important } .cp_forum_trail LI { DISPLAY: inline; FONT-SIZE: 1.2em } .cp_forum_trail LI.cp_forum_trail_parent { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent = scroll repeat 0% 0%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .cp_form FIELDSET { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #d8d8d8 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 0px = 0px 1em; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 5px; = BORDER-BOTTOM: #d8d8d8 1px solid } .cp_form LEGEND { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-WEIGHT: bold; = PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 15px; COLOR: #000000; = PADDING-TOP: 0px } .cp_form UL { LIST-STYLE-TYPE: none } .cp_form LI { CLEAR: left; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: = 5px; MARGIN: 0px 0px 5px; PADDING-TOP: 5px } .cp_form LABEL { PADDING-RIGHT: 10px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: = 0px; WIDTH: 120px; PADDING-TOP: 3px; TEXT-ALIGN: right } .cp_form INPUT { FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px } .cp_form SELECT { FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px } .cp_form TEXTAREA { FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px } .cp_small_form INPUT { MARGIN: 0px 3px; WIDTH: 500px } .cp_small_form SELECT { MARGIN: 0px 3px; WIDTH: 500px } .cp_form IMG { FLOAT: left; MARGIN: 1px 0px 0px 3px } .cp_form .cp_alert { CLEAR: both; MARGIN: 0px 0px 0px 130px; WIDTH: 240px } .cp_form .cp_radio { FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px; BORDER-TOP-STYLE: none; = BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: = none } .cp_form .cp_radio INPUT { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: = 0px; MARGIN: 0px; WIDTH: auto; PADDING-TOP: 0px } .cp_form .cp_check INPUT { FLOAT: none; MARGIN: 0px 5px 0px 0px; WIDTH: auto } .cp_form .cp_image_verify IMG { MARGIN: 0px 10px 0px 0px } .cp_form .cp_image_verify LI { LIST-STYLE-POSITION: outside } .cp_form .cp_image_verify INPUT { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FLOAT: = none; PADDING-BOTTOM: 0px! important; MARGIN: 0px; WIDTH: 250px; = PADDING-TOP: 0px! important; TEXT-ALIGN: left } .cp_form .cp_image_verify LABEL { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FLOAT: = none; PADDING-BOTTOM: 0px! important; MARGIN: 0px; WIDTH: 250px; = PADDING-TOP: 0px! important; TEXT-ALIGN: left } .cp_form .cp_submit { TEXT-ALIGN: center } .cp_form .cp_submit INPUT { FLOAT: none; WIDTH: auto } #cp_staff { BORDER-TOP: #ccc 1px solid } #cp_staff .staff_member { CLEAR: left; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; = PADDING-BOTTOM: 1em; WIDTH: 100%; PADDING-TOP: 1em; BORDER-BOTTOM: #ccc = 1px solid } #cp_staff .staff_member IMG { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; FLOAT: left; = BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 1em 0px 0px; WIDTH: 75px; = BORDER-RIGHT-WIDTH: 0px } #cp_staff .staff_member .cp_staff_name { FLOAT: left; WIDTH: 50% } #cp_staff .staff_member .cp_staff_name DT { FONT-SIZE: 1.5em; MARGIN: 0px 0px 0.2em } #cp_staff .staff_member .cp_staff_name DD { FONT-SIZE: 1.2em } #cp_staff .staff_member .cp_staff_contact { FLOAT: left } #cp_staff .staff_member .cp_staff_contact DT { FONT-WEIGHT: bold } #cp_staff .staff_member .cp_staff_contact DD { MARGIN: 0px 0px 0.2em } IFRAME { BORDER-TOP-WIDTH: 0px! important; BORDER-LEFT-WIDTH: 0px! important; = BORDER-BOTTOM-WIDTH: 0px! important; OVERFLOW: hidden! important; = BORDER-RIGHT-WIDTH: 0px! important } #cp_bn_wrap { FONT: 1em/1.4em arial, sans-serif } #cp_bn_wrap * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_bn_wrap A { BORDER-RIGHT: #900000 5px solid; BORDER-TOP: #900000 5px solid; = DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/breaking_news_b= kg.jpg) #900000 repeat-x 0px 0px; MARGIN: 0px 0px 10px; BORDER-LEFT: = #900000 5px solid; BORDER-BOTTOM: #900000 5px solid; TEXT-DECORATION: = none } #cp_bn_wrap A:hover { BORDER-RIGHT: #de0000 5px solid; BORDER-TOP: #de0000 5px solid; = BACKGROUND: #de0000; BORDER-LEFT: #de0000 5px solid; BORDER-BOTTOM: = #de0000 5px solid } #cp_bn_wrap A .gutter { BORDER-RIGHT: #fff 1px solid; PADDING-RIGHT: 7px; BORDER-TOP: #fff 1px = solid; PADDING-LEFT: 7px; BACKGROUND: none transparent scroll repeat 0% = 0%; PADDING-BOTTOM: 7px; MARGIN: 0px; BORDER-LEFT: #fff 1px solid; = PADDING-TOP: 7px; BORDER-BOTTOM: #fff 1px solid; POSITION: relative } #cp_bn_wrap A H2 { COLOR: #fff } #cp_bn_wrap A H3 { COLOR: #fff } #cp_bn_wrap A H4 { COLOR: #fff } #cp_bn_wrap A P { COLOR: #fff } #cp_bn_wrap A H2 { FONT-SIZE: 18px; MARGIN: 0px 0px 0.5em; TEXT-TRANSFORM: uppercase; = FONT-FAMILY: "Trebuchet MS", serif } #cp_bn_wrap A H3 { FONT-SIZE: 22px; MARGIN: 0px 0px 0.25em; FONT-STYLE: italic } #cp_bn_wrap A H4 { FONT-SIZE: 16px; MARGIN: 0px 0px 0.5em } #cp_bn_wrap A P { FONT-SIZE: 11px; MARGIN: 0px; LINE-HEIGHT: 13px } #cp_bn_wrap A .with_img { FLOAT: left; WIDTH: 65% } #cp_bn_wrap A IMG { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; FLOAT: right; = BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px; WIDTH: 32%; BORDER-RIGHT-WIDTH: = 0px } #cp_bn_article_header { FONT-SIZE: 20px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/breaking_news_b= kg.jpg) #de0000 repeat-x 0px 0px; TEXT-TRANSFORM: uppercase; COLOR: = #fff; TEXT-INDENT: 0.3em; LINE-HEIGHT: 40px; FONT-FAMILY: 'trebuchet = ms', serif } BLOCKQUOTE.cp_pullquote { BORDER-TOP: #000 3px double; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM: = #000 3px double; BORDER-RIGHT-WIDTH: 0px } BLOCKQUOTE.cp_pullquote P { MARGIN: 0px; FONT: 18px/22px georgia, serif } BLOCKQUOTE.cp_pullquote P:first-letter { TEXT-TRANSFORM: uppercase } #cp_article_top { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! = important; BORDER-BOTTOM: #ccc 1px solid } #cp_article_top UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_tools UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_bottom UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_ads .cp_ad H4.ad_slug { DISPLAY: none; BACKGROUND: none transparent scroll repeat 0% 0%; FONT: = 10px/14px 'trebuchet ms', arial, sans-serif; TEXT-TRANSFORM: uppercase; = COLOR: #aaa; TEXT-ALIGN: center } .cp_ad { OVERFLOW: hidden; WIDTH: 300px; HEIGHT: 250px } #cp_article_bottom { MARGIN: 15px 0px } #cp_article_top UL { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } #cp_article_top LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_article_bottom LI { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_story_bot_nav { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: = 11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; = PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none } #cp_article_top LI A { COLOR: #333333! important } #cp_article_bottom LI A { COLOR: #333333! important } #cp_story_bot_nav A { COLOR: #333333! important } #cp_article_top LI A:hover { COLOR: #000000! important } #cp_article_bottom A:hover { COLOR: #000000! important } #cp_article_top_left { FLOAT: left } #cp_article_top_left LI { DISPLAY: inline; MARGIN: 0px 5px 0px 0px } #cp_article_top_right { FLOAT: right; TEXT-ALIGN: right } #cp_article_bottom_right { FLOAT: right; TEXT-ALIGN: right } LI#cp_article_discuss A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) = no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_print A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/print.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_email A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/email.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_more A { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/down.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_answertips A { PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/answertips.gif) = no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } LI#cp_article_blog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) = no-repeat left 50% } LI#cp_article_facebook A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/facebook.gif) = no-repeat left 50% } LI#cp_article_live A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)= no-repeat left 50% } LI#cp_article_digg A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/digg.gif) = no-repeat left 50% } LI#cp_article_news A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) = no-repeat left 50% } LI#cp_article_deli A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) = no-repeat left 50% } LI#cp_article_yaho A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) = no-repeat left 50% } LI#cp_article_goog A { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/google.gif) = no-repeat left 0px } LI.cp_article_page DIV { PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/pageIcon.gif) = no-repeat left center; FLOAT: right; PADDING-BOTTOM: 0px; PADDING-TOP: = 0px } #cp_story_text { MARGIN: 0px 0px 15px } #cp_article_tools { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px = 0px 25px; PADDING-TOP: 0px } P.cp_article_more_tools { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = FONT-WEIGHT: bold! important; FONT-SIZE: 12px! important; = PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important } P.cp_article_tools_header { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = FONT-WEIGHT: bold! important; FONT-SIZE: 11px; PADDING-BOTTOM: 0px! = important; MARGIN: 0px 0px 8px; PADDING-TOP: 0px! important } #cp_article_tools .cp_article_gutter { PADDING-RIGHT: 5px! important; PADDING-LEFT: 5px! important; = PADDING-BOTTOM: 5px! important; PADDING-TOP: 5px! important } #cp_article_tools UL { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: = 0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important } #cp_article_tools LI { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: = 0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important } #cp_article_tools LI A { PADDING-RIGHT: 0px! important; DISPLAY: inline! important; = PADDING-LEFT: 17px! important; FONT-SIZE: 10px! important; = PADDING-BOTTOM: 3px! important; MARGIN: 0px 3px 0px 0px; PADDING-TOP: = 3px! important } #cp_article_tools LI A { DISPLAY: inline! important; FONT-SIZE: 10px! important } #cp_article_tools_book { CLEAR: left; MARGIN: -12px 0px 0px 5px } HTML > BODY #cp_article_tools_book { LEFT: 5px; MARGIN: 27px 0px 0px; POSITION: relative; TOP: -5px } #cp_article_tools_blog { FLOAT: left! important; WIDTH: 0px! important } #cp_article_tools_rss { FLOAT: right! important; BORDER-LEFT: #fff 1px solid; WIDTH: 140px! = important } HTML > BODY #cp_article_tools_rss { WIDTH: 160px! important } #cp_story_bot_nav { MARGIN: 0px 0px 15px; TEXT-ALIGN: right } #cp_continued { FONT-SIZE: 11px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 17px } * HTML #cp_article_tools { HEIGHT: 47px } .RSSItemListRow { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 4px; COLOR: = #000; LINE-HEIGHT: 1.1em; PADDING-TOP: 4px } #slider2_wrap .slider2_hot { DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/lightning.pn= g) no-repeat left center; FLOAT: left; WIDTH: 19px; TEXT-INDENT: = -1000em; HEIGHT: 16px } .RSSItemListSchool { FONT-SIZE: 10px; COLOR: #666; LINE-HEIGHT: 1.3em } .FlippyEvenRow { BACKGROUND-COLOR: #eee } .ListBoxItemHover { CURSOR: pointer; COLOR: #000; BACKGROUND-COLOR: #ff9 } .SelectedListBoxItem { BACKGROUND: #ff0; COLOR: #000 } .RSSItemListFeedback { MARGIN: 75px auto auto; HEIGHT: 32px } .RSSItemListFeedback TD { FONT: 0.9em/1.4em trebuchet ms; COLOR: #666 } .ClearAll { CLEAR: both; FONT-SIZE: 0px; LINE-HEIGHT: 0; HEIGHT: 0px } .SpryHiddenRegion { VISIBILITY: hidden } #slider2_wrap { CLEAR: left; MARGIN: 10px 0px; WIDTH: 300px } #slider2_wrap H3 A { PADDING-RIGHT: 20px; DISPLAY: block; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/bullet_go.pn= g) no-repeat right center; COLOR: #333! important; BORDER-BOTTOM: #ccc = 1px dashed } #slider2_wrap H3 A:hover { BACKGROUND-COLOR: #ff9 } #slider2_wrap .lead_wrap { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #ccc 1px; = PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; BORDER-LEFT: #ccc 1px solid; = PADDING-TOP: 0px; BORDER-BOTTOM: #ccc 1px solid } #slider2_wrap .contentslide { PADDING-RIGHT: 1px; PADDING-LEFT: 1px; BACKGROUND: #fff; = PADDING-BOTTOM: 1px; PADDING-TOP: 1px; POSITION: relative; HEIGHT: 257px } #slider2_wrap .contentdiv_scroller { PADDING-RIGHT: 9px; PADDING-LEFT: 5px; BACKGROUND: #fff; = PADDING-BOTTOM: 0px; OVERFLOW: auto; PADDING-TOP: 5px; POSITION: = relative; HEIGHT: 230px } #slider2_wrap .linkbar { PADDING-RIGHT: 4px; BORDER-TOP: #ddd 1px solid; MARGIN-TOP: 1px; = PADDING-LEFT: 4px; FONT-SIZE: 0.95em; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi= f) #fff repeat-x; PADDING-BOTTOM: 0px; VERTICAL-ALIGN: middle; COLOR: = #666; LINE-HEIGHT: 20px; PADDING-TOP: 0px; TEXT-ALIGN: right } #slider2_wrap .linkbar IMG { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px } #slider2_wrap .linkbar A { COLOR: #fff } #slider2_wrap .linkbar A:hover { BACKGROUND: #ff9 } #slider2_wrap .contentslide .contentdiv { DISPLAY: none } #slider2_wrap .contentslide A { COLOR: #000 } #slider2_wrap .contentdiv_scroller A:hover * { DISPLAY: block; COLOR: #000; BACKGROUND-COLOR: #ff9 } #slider2_wrap DIV.pagination_wrap { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 11px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/bottom_line.gif= ) #eee repeat-x left bottom; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } #slider2_wrap .pagination { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; OVERFLOW: hidden; PADDING-TOP: 0px; TEXT-ALIGN: left } #slider2_wrap .pagination UL { DISPLAY: inline } #slider2_wrap .pagination LI { DISPLAY: inline } #slider2_wrap .pagination A { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px = solid; DISPLAY: block; PADDING-LEFT: 4px; FLOAT: left; PADDING-BOTTOM: = 3px; FONT: 10px/20px "arial narrow", arial, helvetica, sans-serif; = BORDER-LEFT: #ccc 1px solid; COLOR: #333; MARGIN-RIGHT: 3px; = PADDING-TOP: 3px; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none } .ie6 #slider2_wrap .pagination A { LETTER-SPACING: -1px } #slider2_wrap .pagination A SPAN { DISPLAY: block; PADDING-LEFT: 20px; LINE-HEIGHT: 16px } #slider2_wrap .pagination A#tab_mp SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/newspaper_po= p.png) no-repeat left top } #slider2_wrap .pagination A#tab_me SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/email_go.png= ) no-repeat left top } #slider2_wrap .pagination A#tab_mc SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/user_comment= .png) no-repeat left top } #slider2_wrap .pagination A#tab_pc SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/ipod.png) = no-repeat left top } #slider2_wrap .pagination A#tab_ce SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/date.png) = no-repeat left top } #slider2_wrap .pagination A#tab_mb SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/comments.png= ) no-repeat left top } #slider2_wrap .pagination A#tab_ci SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/newspaper_ad= d.png) no-repeat left top } #slider2_wrap .pagination A#tab_rc SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/transmit.png= ) no-repeat left top } #slider2_wrap .pagination A#tab_nc SPAN { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/transmit_blu= e.png) no-repeat left top } #slider2_wrap .pagination A:hover { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi= f) #fff repeat-x 0px 1px; BORDER-BOTTOM: #fff 1px solid } #slider2_wrap .pagination A.selected { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi= f) #fff repeat-x 0px 1px; BORDER-BOTTOM: #fff 1px solid } #slider2_wrap .pagination A:hover { BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; BORDER-LEFT: = #ccc 1px solid; BORDER-BOTTOM: #ccc 1px solid } #slider2_wrap .pagination A.selected:hover { BORDER-BOTTOM: #fff 1px solid } #slider2_wrap .pagination A.pagination_next { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: none transparent = scroll repeat 0% 0%; PADDING-BOTTOM: 0px; FONT: 16px/22px arial, = helvetica, sans-serif; COLOR: #fff; BORDER-TOP-STYLE: none; PADDING-TOP: = 5px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; TEXT-DECORATION: = none; BORDER-BOTTOM-STYLE: none } #slider2_wrap .pagination A.pagination_next:hover { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: none transparent = scroll repeat 0% 0%; PADDING-BOTTOM: 0px; FONT: 16px/22px arial, = helvetica, sans-serif; COLOR: #fff; BORDER-TOP-STYLE: none; PADDING-TOP: = 5px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; TEXT-DECORATION: = none; BORDER-BOTTOM-STYLE: none } #slider2_wrap .pagination IMG { PADDING-BOTTOM: 2px; VERTICAL-ALIGN: middle; BORDER-TOP-STYLE: none; = BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: = none } .safari .box { FLOAT: none! important } .ie6 #slider2_wrap .pagination A { WIDTH: 16px; LINE-HEIGHT: 16px } .cp_local_ad { OVERFLOW: hidden } .cp_banner_client { OVERFLOW: hidden } .carousel-component { VISIBILITY: hidden; OVERFLOW: hidden; POSITION: relative } .carousel-component UL.carousel-list { Z-INDEX: 1; WIDTH: 10000000px; POSITION: relative } .carousel-component .carousel-list LI { FLOAT: left; OVERFLOW: hidden; LIST-STYLE-TYPE: none } .carousel-component .carousel-vertical LI { FLOAT: none; MARGIN-BOTTOM: 0px } .carousel-component UL.carousel-vertical { WIDTH: auto } .carousel-component .carousel-clip-region { MARGIN: 0px auto; OVERFLOW: hidden; POSITION: relative } #roo_component_wrapper { MARGIN: 0px; WIDTH: 300px } #roo_component_header { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #eee; = PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: = #c2c2c2 1px solid } #roo_component_header LI { PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; BACKGROUND: = #eee; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px } #roo_component_header LI A { PADDING-RIGHT: 0px; PADDING-LEFT: 4px; PADDING-BOTTOM: 0px; FONT: = 10px/23px arial, helvetica, sans-serif; COLOR: #609fdf; PADDING-TOP: 0px } #roo_component_header LI H5 { BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: = #c2c2c2 1px solid; PADDING-LEFT: 26px; BACKGROUND: = url(http://collegepublisher.com/media/assets/icons/fff/television.png) = #fff no-repeat 6px 1px; FLOAT: left; PADDING-BOTTOM: 3px; MARGIN: 0px = 0px 0px 6px; FONT: bold 14px/1.2em Arial, Helvetica, sans-serif; = BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 2px; BORDER-BOTTOM: #fff = 1px solid } .ie6 #roo_component_header LI H5 { MARGIN: 0px 0px 0px 3px } .safari #roo_component_header LI H5 { PADDING-RIGHT: 6px; PADDING-LEFT: 26px; PADDING-BOTTOM: 4px; = PADDING-TOP: 2px; BORDER-BOTTOM: #fff 1px solid } #roo_component { BORDER-RIGHT: #c2c2c2 1px solid; BORDER-TOP: #c2c2c2 0px solid; = BORDER-LEFT: #c2c2c2 1px solid; WIDTH: 298px; BORDER-BOTTOM: #c2c2c2 0px = solid } .carousel-component { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BACKGROUND: #fff; BORDER-BOTTOM-WIDTH: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px auto; COLOR: #618cbe; PADDING-TOP: 0px; = BORDER-RIGHT-WIDTH: 0px; -moz-border-radius: 0px } .carousel-component UL.carousel-list { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } .carousel-component .carousel-prev { Z-INDEX: 3; LEFT: 0px; CURSOR: pointer; POSITION: absolute; TOP: 27px } .carousel-component .carousel-next { Z-INDEX: 3; RIGHT: 0px; CURSOR: pointer; POSITION: absolute; TOP: 27px } #roo_component .carousel-button { DISPLAY: block; WIDTH: 16px; TEXT-INDENT: -1000em; HEIGHT: 16px } #roo_component #prev-arrow { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_star= t_blue.png) } #roo_component #next-arrow { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_end_= blue.png) } .carousel-component .carousel-list LI { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: 4px = 0px 0px; FONT: 9px verdana,arial,sans-serif; WIDTH: 130px; COLOR: #666; = PADDING-TOP: 0px; TEXT-ALIGN: center } .carousel-component .carousel-vertical LI { =09 } .carousel-component UL.carousel-vertical { =09 } .carousel-component .carousel-list LI A { BORDER-RIGHT: #fff 2px solid; BORDER-TOP: #fff 2px solid; DISPLAY: = block; BORDER-LEFT: #fff 2px solid; COLOR: #000; BORDER-BOTTOM: #fff 2px = solid; HEIGHT: 55px; TEXT-DECORATION: none! important; outline: none; = -moz-outline: none } .carousel-component .carousel-list LI A:hover { BORDER-RIGHT: #fffccc 2px solid; BORDER-TOP: #fffccc 2px solid; = BACKGROUND: #fffccc; BORDER-LEFT: #fffccc 2px solid; COLOR: #000; = BORDER-BOTTOM: #fffccc 2px solid; TEXT-DECORATION: none! important } .carousel-component .carousel-list LI.active A { BORDER-RIGHT: #708fc7 2px solid; BORDER-TOP: #708fc7 2px solid; = BORDER-LEFT: #708fc7 2px solid; BORDER-BOTTOM: #708fc7 2px solid } .carousel-component .carousel-list LI STRONG { DISPLAY: block } .carousel-component .carousel-list LI { POSITION: relative } .carousel-component .carousel-list LI IMG { BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; DISPLAY: = block; LEFT: 2px; BORDER-LEFT: #999 1px solid; WIDTH: 50px; = BORDER-BOTTOM: #999 1px solid; POSITION: absolute; TOP: 2px; HEIGHT: = 50px } .carousel-component .carousel-list LI DIV.roo_module_title { Z-INDEX: 4; RIGHT: 0px; OVERFLOW: hidden; WIDTH: 70px; COLOR: black; = LINE-HEIGHT: 1em; POSITION: absolute; TOP: 2px; TEXT-ALIGN: left; = TEXT-DECORATION: none } .carousel-component .carousel-list LI SPAN.roo_module_play { DISPLAY: block; TEXT-TRANSFORM: uppercase; COLOR: #609fdf! important; = TEXT-DECORATION: none } .carousel-component .carousel-list LI A:hover SPAN.roo_module_play { TEXT-DECORATION: underline } #video_carousel { WIDTH: 300px } #video_carousel H5 { BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #c2c2c2 1px; PADDING-LEFT: 0px; BACKGROUND: #eeeeee; PADDING-BOTTOM: = 3px; MARGIN: 0px 0px 10px; FONT: 12px arial, verdana, sans-serif; = BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #c2c2c2 = 1px solid; TEXT-ALIGN: center } #video_carousel H5 A { PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 18px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_play= _blue.png) no-repeat left center; PADDING-BOTTOM: 0px; MARGIN: 0px 0px = 0px 2px; COLOR: #609fdf; PADDING-TOP: 0px } #cp_video { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #e1e1e1; = PADDING-BOTTOM: 1em; MARGIN: 0px; FONT: 16px/18px "trebuchet ms", = helvetica, arial, sans-serif; COLOR: #000; PADDING-TOP: 0px; TEXT-ALIGN: = center } #cp_video #cp_video_wrap { BORDER-RIGHT: #888 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #888 1px = solid; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 0px; MARGIN: = 0px auto; BORDER-LEFT: #888 1px solid; WIDTH: 987px; PADDING-TOP: 0px; = BORDER-BOTTOM: #888 1px solid; TEXT-ALIGN: left } #cp_video .leaderboard { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #eee; = PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; TEXT-ALIGN: center } #cp_video .leaderboard IMG { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } #cp_video #header { MARGIN: 0px 0px 1.5em; WIDTH: 100% } #cp_video #header H1 { FONT: bold 1.8em/1.8em georgia, "times new roman", serif; WIDTH: 100%; = TEXT-INDENT: -1000em } #cp_video #header H1 A { DISPLAY: block; HEIGHT: 107px } #cp_video #top_bar { FONT-SIZE: 80%; BACKGROUND: #2b004d; MARGIN: 10px 10px 0px; OVERFLOW: = hidden; WIDTH: 967px } #cp_video #top_bar A { COLOR: #fff; TEXT-DECORATION: underline } #cp_video #top_bar A:visited { COLOR: #fff; TEXT-DECORATION: underline } #cp_video #top_bar H3 { PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 10px; = PADDING-BOTTOM: 0px; FONT: 1.1em/27px arial, helvetica, sans-serif; = COLOR: #fff; PADDING-TOP: 0px } #cp_video #video_iframe { PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: = 0px; MARGIN: 0px 0px 1em; PADDING-TOP: 0px } #cp_video #roo_frame { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: = 0px; MARGIN: 0px; OVERFLOW: hidden; BORDER-TOP-STYLE: none; PADDING-TOP: = 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; = BORDER-BOTTOM-STYLE: none } #cp_video #video_feed { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/feed_gradient.g= if) #fff repeat-y left top; FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: = 0px; OVERFLOW: hidden; WIDTH: 200px; PADDING-TOP: 0px; HEIGHT: 920px } #cp_video #video_feed H2 { PADDING-RIGHT: 0px; PADDING-LEFT: 0.5em; BACKGROUND: #e7e7e7; = PADDING-BOTTOM: 0px; FONT: bold 12px/1.6em arial, helvetica, sans-serif; = WIDTH: 100%; COLOR: #666; PADDING-TOP: 0px } #cp_video #video_feed UL { PADDING-RIGHT: 0px; PADDING-LEFT: 13px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_video #video_feed LI { PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: = 5px; MARGIN: 0px; PADDING-TOP: 5px; BORDER-BOTTOM: #c2c2c2 1px solid; = LIST-STYLE-TYPE: none } #cp_video #video_feed LI:hover { BACKGROUND: #fffccc } #cp_video #video_feed IMG { BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #c2c2c2 1px solid; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: 0px; = MARGIN: 0px 5px 0px 0px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: = 0px; BORDER-BOTTOM: #c2c2c2 1px solid } #cp_video #video_feed LI H3 { FLOAT: left; FONT: bold 1em/1.2em arial, helvetica, sans-serif; = TEXT-TRANSFORM: none; WIDTH: 45%; COLOR: #666 } #cp_video #video_feed LI H3 SPAN { DISPLAY: block; TEXT-TRANSFORM: uppercase; COLOR: #609fdf } #cp_video #video_feed LI A:hover SPAN { TEXT-DECORATION: underline } #cp_video .cp_clear { CLEAR: both } #cp_video #footer { BORDER-TOP: #2b004d 4px solid; BACKGROUND: #fff; WIDTH: 100%; = TEXT-ALIGN: left } #cp_video #footer P { PADDING-RIGHT: 0.5em; PADDING-LEFT: 0.5em; FONT-SIZE: 11px; = PADDING-BOTTOM: 0.5em; COLOR: #666; PADDING-TOP: 0.5em } #cp_video #footer P A { FONT-WEIGHT: bold; COLOR: #2b004d; TEXT-DECORATION: none } #cp_article_photos * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #cp_article_photos A { COLOR: #666 } #cp_article_photos A:hover { COLOR: #000; BACKGROUND-COLOR: #ff9 } #cp_photo_wrapper { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; FONT: = 11px/1em Arial, Helvetica, sans-serif; WIDTH: 250px; PADDING-TOP: 0px } #cp_photo { BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: = #dadada 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: = #dadada 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #dadada 1px solid } #cp_photo * { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = MARGIN: 0px; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px } #cp_photo LI { DISPLAY: block } #cp_photo UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } LI.cp_photo_block { LIST-STYLE-TYPE: none; TEXT-ALIGN: center } .cp_photo_container { BACKGROUND: #dadada; WIDTH: 240px } A .cp_photo_instructions { FONT-WEIGHT: bold; FONT-SIZE: 0.9em; TEXT-TRANSFORM: uppercase; COLOR: = #bbb! important } A:hover .cp_photo_instructions { BACKGROUND: #ff9; COLOR: black! important } LI.cp_photo_credit { FONT-SIZE: 0.9em; MARGIN-BOTTOM: 0.5em! important; LIST-STYLE-TYPE: = none; TEXT-ALIGN: right } .cp_photo_caption { MARGIN-BOTTOM: 1em! important; TEXT-ALIGN: left } .cp_slideshow_controls { PADDING-RIGHT: 1em! important; PADDING-LEFT: 1em! important; = BACKGROUND: url(images/fade_up.gif) no-repeat center top; = PADDING-BOTTOM: 1em! important; PADDING-TOP: 1em! important; TEXT-ALIGN: = center } .cp_slideshow_controls A { COLOR: gray! important } .cp_slideshow_controls A:hover { COLOR: black! important } A#cp_photo_prev { PADDING-RIGHT: 0px; PADDING-LEFT: 18px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_star= t.png) no-repeat left center; PADDING-BOTTOM: 1px; PADDING-TOP: 1px } A#cp_photo_next { PADDING-RIGHT: 18px; PADDING-LEFT: 0px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_end.= png) no-repeat right center; PADDING-BOTTOM: 1px; MARGIN-LEFT: 1em; = PADDING-TOP: 1px } #cp_gallery_wrapper { PADDING-BOTTOM: 5px; FONT: 11px/1em Arial, Helvetica, sans-serif; = WIDTH: 250px } #cp_gallery { BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: = #dadada 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: = #dadada 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #dadada 1px solid } #cp_gallery * { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = MARGIN: 0px; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px } .cp_gallery_loop LI { DISPLAY: block; FLOAT: left; WIDTH: 80px; HEIGHT: 80px } .cp_gallery_loop LI A { WIDTH: 75px; HEIGHT: 75px } .cp_gallery_loop LI A:hover IMG { BORDER-RIGHT: #ff9 2px solid; BORDER-TOP: #ff9 2px solid; BORDER-LEFT: = #ff9 2px solid; BORDER-BOTTOM: #ff9 2px solid } .cp_gallery_loop LI IMG { BORDER-RIGHT: white 2px solid; BORDER-TOP: white 2px solid; MARGIN: 1px = 0px 0px 1px; BORDER-LEFT: white 2px solid; WIDTH: 75px; BORDER-BOTTOM: = white 2px solid; HEIGHT: 75px } UL.cp_gallery_instructions { CLEAR: left; DISPLAY: block } UL.cp_gallery_instructions LI { DISPLAY: block; FONT-WEIGHT: bold; FONT-SIZE: 0.9em; TEXT-TRANSFORM: = uppercase; COLOR: #bbb! important; PADDING-TOP: 5px! important; = TEXT-ALIGN: center } #cp_lgphoto_wrapper { PADDING-BOTTOM: 15px; FONT: 11px/1em Arial, Helvetica, sans-serif } .cp_lgphoto_loop UL { DISPLAY: block } .cp_lgphoto_loop LI { DISPLAY: block } #cp_lgphoto_wrapper IMG { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } #cp_photo LI { DISPLAY: block } #cp_lgphoto_wrapper .cp_photo_container { BACKGROUND: #dadada; OVERFLOW: hidden; WIDTH: 100%; TEXT-ALIGN: center } .cp_slideshow_controls { PADDING-RIGHT: 1em! important; PADDING-LEFT: 1em! important; = BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/fade_up.gif) = no-repeat center top; PADDING-BOTTOM: 1em! important; PADDING-TOP: 1em! = important; TEXT-ALIGN: center } .cp_slideshow_controls A { COLOR: gray! important } .cp_slideshow_controls A:hover { COLOR: black! important } A#cp_photo_prev { PADDING-RIGHT: 0px; PADDING-LEFT: 18px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_star= t.png) no-repeat left center; PADDING-BOTTOM: 1px; PADDING-TOP: 1px } A#cp_photo_next { PADDING-RIGHT: 18px; PADDING-LEFT: 0px; BACKGROUND: = url(http://media.collegepublisher.com/media/assets/icons/fff/control_end.= png) no-repeat right center; PADDING-BOTTOM: 1px; MARGIN-LEFT: 1em; = PADDING-TOP: 1px } .cp_slideshow_controls { DISPLAY: none! important } .cp_photo_loop { DISPLAY: none! important } #cp_photo_wrapper { DISPLAY: none! important } #cp_gallery_wrapper { DISPLAY: none! important } #cp_lgphoto_wrapper { DISPLAY: none! important } .layout_r #cp_photo_wrapper { DISPLAY: block! important } .layout_r .cp_photo_loop { DISPLAY: block! important } .layout_l #cp_photo_wrapper { DISPLAY: block! important } .layout_l .cp_photo_loop { DISPLAY: block! important } .layout_rs #cp_photo_wrapper { DISPLAY: block! important } .layout_ls #cp_photo_wrapper { DISPLAY: block! important } .layout_rs .cp_photo_first { DISPLAY: block! important } .layout_ls .cp_photo_first { DISPLAY: block! important } .layout_rs .cp_slideshow_controls { DISPLAY: block! important } .layout_ls .cp_slideshow_controls { DISPLAY: block! important } .layout_7 .cp_slideshow_controls { DISPLAY: block! important } .layout_7 .cp_slideshow_controls { DISPLAY: block! important } .layout_rg #cp_gallery_wrapper { DISPLAY: block! important } .layout_lg #cp_gallery_wrapper { DISPLAY: block! important } .layout_l { FLOAT: left! important; MARGIN-RIGHT: 0.5em! important } .layout_ls { FLOAT: left! important; MARGIN-RIGHT: 0.5em! important } .layout_lg { FLOAT: left! important; MARGIN-RIGHT: 0.5em! important } .layout_r { FLOAT: right! important; MARGIN-LEFT: 0.5em! important } .layout_rs { FLOAT: right! important; MARGIN-LEFT: 0.5em! important } .layout_rg { FLOAT: right! important; MARGIN-LEFT: 0.5em! important } .layout_7 #cp_lgphoto_wrapper { DISPLAY: block! important } .layout_7 #cp_at_wrapper { FLOAT: right! important; MARGIN-LEFT: 0.5em! important } #related_stories { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/rl_bkg.gif) = no-repeat left bottom; FONT: 11px/18px Arial, Helvetica, sans-serif; = WIDTH: 491px } #related_stories * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #related_stories H4 { BACKGROUND: = url(http://media.collegepublisher.com/media/assets/images/rl_top.gif) = no-repeat left top; TEXT-INDENT: -1000em } #related_stories UL { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; LIST-STYLE-POSITION: inside; = PADDING-BOTTOM: 5px; PADDING-TOP: 5px; LIST-STYLE-TYPE: none } #related_stories UL LI { PADDING-RIGHT: 0px; PADDING-LEFT: 18px; FONT-SIZE: 1.1em; BACKGROUND: = url(http://collegepublisher.com/media/assets/icons/fff/link.png) = no-repeat left center; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 8px; = PADDING-TOP: 0px; BORDER-BOTTOM: #eee 1px dotted } #related_stories UL LI A { TEXT-DECORATION: none } #global_footer { CLEAR: left; PADDING-RIGHT: 0px; BORDER-TOP: #eee 2px solid; = PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: #e0e0e0; PADDING-BOTTOM: = 10px; WIDTH: 100%; COLOR: #303030; LINE-HEIGHT: 16px; PADDING-TOP: 10px; = POSITION: relative; TOP: 30px; TEXT-ALIGN: center } #global_footer #logo_mtvu { DISPLAY: inline-block; FONT-SIZE: 0px; BACKGROUND: = url(/media/assets/images/logo_mtvu.gif) no-repeat left top; = VERTICAL-ALIGN: bottom; OVERFLOW: hidden; WIDTH: 31px; TEXT-INDENT: = -9999em; LINE-HEIGHT: 16px; HEIGHT: 16px } #global_footer #logo_mtvn { DISPLAY: inline-block; FONT-SIZE: 0px; BACKGROUND: = url(/media/assets/images/logo_mtvn.gif) no-repeat left top; = VERTICAL-ALIGN: bottom; OVERFLOW: hidden; WIDTH: 85px; TEXT-INDENT: = -9999em; LINE-HEIGHT: 16px; HEIGHT: 16px } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: 7bit Content-Location: http://media.collegepublisher.com/media/css/features_1024.css?v1 #net_search { VISIBILITY: hidden } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/css/popup_new.css?v12 .dialog { DISPLAY: block; POSITION: absolute; TEXT-ALIGN: left! important } .dialog TABLE.table_window { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; WIDTH: 100%; PADDING-TOP: 0px; BORDER-COLLAPSE: collapse; = border-spacing: 0 } .dialog TABLE.table_window TD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .dialog TABLE.table_window TH { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } .dialog .title_window { -moz-user-select: none } .dialog_close { Z-INDEX: 2000; BACKGROUND: url(/media/assets/icons/close.gif) no-repeat = 0px 0px; LEFT: 97%; WIDTH: 14px; CURSOR: pointer; POSITION: absolute; = TOP: 22px; HEIGHT: 14px } .overlay_popup { FILTER: alpha(opacity=3D50); BACKGROUND-COLOR: #000000; -moz-opacity: = 0.50; opacity: 0.50 } .overlay_dialog { FILTER: alpha(opacity=3D70); BACKGROUND-COLOR: #000000; -moz-opacity: = 0.7; opacity: 0.7 } .overlay_dialog IFRAME { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } .overlay___invisible__ { FILTER: alpha(opacity=3D0); BACKGROUND-COLOR: #000000; -moz-opacity: 0; = opacity: 0 } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/css/print.css?v1 * { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } #topbar { DISPLAY: none } #topsearchform { DISPLAY: none } #cpleftcol { DISPLAY: none } #cprightcol { DISPLAY: none } #banner_network_5 { DISPLAY: none } #cpheader { DISPLAY: none } #cpleftcol { DISPLAY: none } #cprightcol { DISPLAY: none } #issuesummary { DISPLAY: none } #ncbar { DISPLAY: none } .goner { DISPLAY: none } #cpfooter { DISPLAY: none } #ncbar TD { DISPLAY: none } #agent99 { DISPLAY: none } #loggedin_bar { DISPLAY: none } #maincontent { DISPLAY: block } #cpcentercol { WIDTH: 100% } #left_cell { DISPLAY: none } IFRAME { DISPLAY: none } #banner_network_2 { DISPLAY: none } #right_cell { DISPLAY: none } #topbar { DISPLAY: none } #cpheader { DISPLAY: none } #cpfooter { DISPLAY: none } .goner { DISPLAY: none } #banner_client_1 { DISPLAY: none } #flan_header { DISPLAY: none } #flan_ads { DISPLAY: none } #flan_nav { DISPLAY: none } #weatherm { DISPLAY: none } #flan_footer { DISPLAY: none } #topbar { DISPLAY: none } #flan_content { WIDTH: 100% } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.trumanindex.com/media/paper607/styles.css?v13 A { COLOR: #6c4670 } A:hover { COLOR: #8e5c93 } #flan_header_meta { BORDER-TOP: #e5ffd0 1px solid; BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/cp_meta.jpg) #6c4670 repeat-x 0px 0px; BORDER-BOTTOM: #ada7a7 1px = solid } #flan_header_meta * { COLOR: #ffffff } #flan_nav H4 { BACKGROUND: #6c4670; COLOR: #fff } #flan_nav LI A { BACKGROUND: #ffffff; COLOR: #6c4670; BORDER-BOTTOM: #dddddd 1px solid; = FONT-FAMILY: Georgia } #flan_nav LI A:hover { BACKGROUND: #f5f5f5 } * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } BODY { =09 } H4 { =09 } #flan_wrap { BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/cp_nav.jpg) repeat-y -120px 0px; MARGIN: 0px auto; WIDTH: 1000px } #flan_header * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } #flan_header { FLOAT: left; POSITION: relative } #flan_header_main { BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/cp_header.jpg) no-repeat 0px 0px; POSITION: relative; HEIGHT: 110px } #flan_header_meta { FLOAT: left; WIDTH: 1000px } #flan_header_meta * { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: = 14px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; text-shadow: = 2px 2px 1px #000 } #flan_meta_left { PADDING-RIGHT: 0px; PADDING-LEFT: 7px; FLOAT: left; PADDING-BOTTOM: = 0px; WIDTH: 466px; PADDING-TOP: 8px; TEXT-ALIGN: left } #flan_meta_right { PADDING-RIGHT: 7px; PADDING-LEFT: 7px; FLOAT: right; PADDING-BOTTOM: = 6px; WIDTH: 466px; PADDING-TOP: 6px; TEXT-ALIGN: right } #flan_meta_right FIELDSET { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } #flan_meta_right INPUT { FONT-SIZE: 12px; COLOR: #000000! important } H1#flan_logo { WIDTH: 1000px; TEXT-INDENT: 0px; LINE-HEIGHT: 110px; HEIGHT: 110px } H1#flan_logo A { DISPLAY: block; WIDTH: 255px; TEXT-INDENT: -1000px; LINE-HEIGHT: 110px; = HEIGHT: 110px } #flan_body { FLOAT: left } #flan_nav { FLOAT: left; WIDTH: 180px } #flan_body_wrap { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: = 0px; WIDTH: 820px; PADDING-TOP: 10px } #flan_leader { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: #ccc; = PADDING-BOTTOM: 5px; PADDING-TOP: 5px; TEXT-ALIGN: center } #flan_content { FLOAT: left; WIDTH: 520px } #flan_content .gutter { MARGIN: 0px 10px 10px } .flan_lead { MARGIN: 0px 0px 20px } .flan_lead H2 { =09 } .flan_lead IMG { FLOAT: left; MARGIN: 0px 10px 10px 0px } .flan_fp_section { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; MARGIN: = 0px 0px 20px; PADDING-TOP: 0px; BORDER-BOTTOM: #d8d8d8 1px solid } .flan_fp_section IMG { FLOAT: left; MARGIN: 0px 5px 5px 0px } .flan_fp_section H4 { FONT-SIZE: 1.5em; MARGIN: 0px; LINE-HEIGHT: 1.4em } .flan_fp_section H3 { PADDING-RIGHT: 0px; BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 5px; = FONT-SIZE: 1.2em; BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/section_bg.jpg) #ececec repeat-x left top; PADDING-BOTTOM: 0px; = MARGIN: 0px 0px 10px; TEXT-TRANSFORM: uppercase; LINE-HEIGHT: 1.8em; = PADDING-TOP: 0px; BORDER-BOTTOM: #d8d8d8 1px solid } .flan_section_lead { FLOAT: left; WIDTH: 300px } .flan_section_lead IMG { BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: = #d8d8d8 1px solid; PADDING-LEFT: 3px; FLOAT: left! important; = PADDING-BOTTOM: 3px; MARGIN: 0px 5px 0px 0px; BORDER-LEFT: #d8d8d8 1px = solid; PADDING-TOP: 3px; BORDER-BOTTOM: #d8d8d8 1px solid } .flan_fp_section UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: = 0px; MARGIN: 0px; WIDTH: 155px; PADDING-TOP: 0px } .flan_fp_section LI { LIST-STYLE-POSITION: inside; FONT-SIZE: 14px; MARGIN: 0px 0px 5px; = LIST-STYLE-TYPE: disc } .flan_section_more { TEXT-ALIGN: right } .flan_clear { CLEAR: both } .flan_section { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 15px; MARGIN: = 0px 0px 15px; PADDING-TOP: 0px; BORDER-BOTTOM: #999 1px dotted } .flan_section_title { FONT-SIZE: 22px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 1.2em; = BORDER-BOTTOM: #666 1px solid } .flan_section H2 { FONT-SIZE: 18px; MARGIN: 0px 0px 2px; LINE-HEIGHT: 1.2em } .flan_section H3 { FONT-WEIGHT: normal; FONT-SIZE: 16px; MARGIN: 0px 0px 5px; LINE-HEIGHT: = 1.2em } .flan_section H5 { MARGIN: 0px 0px 5px; FONT: 16px/1.2em Georgia, Georgia, serif } .flan_section P { MARGIN: 0px } .flan_author { =09 } #flan_footer { CLEAR: both; PADDING-RIGHT: 10px; BORDER-TOP: #dddddd 4px solid; = PADDING-LEFT: 10px; BACKGROUND: #e5e5e5; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px; POSITION: relative; TOP: 33px } #flan_footer A { COLOR: #000 } #flan_footer A:hover { COLOR: #000; TEXT-DECORATION: underline } #flan_nav H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 7px; PADDING-BOTTOM: 0px; MARGIN: = 0px; FONT: 13px/25px arial, verdana, sans-serif; PADDING-TOP: 0px; = text-shadow: 2px 2px 1px #000000 } #flan_nav LI { DISPLAY: inline; LIST-STYLE-TYPE: none } #flan_nav LI A { PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 7px; PADDING-BOTTOM: = 0px; FONT: 13px/25px arial, verdana, sans-serif; PADDING-TOP: 0px; = TEXT-DECORATION: none } #flan_nav LI UL A { PADDING-RIGHT: 0px; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px; = PADDING-TOP: 0px } #flan_nav LI UL A:unknown { content: "- " } #banner_client_1 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; = PADDING-TOP: 10px; TEXT-ALIGN: center } #cp_video { BACKGROUND: #fff } #cp_video #header H1 { BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/cp_header.jpg) no-repeat 0px 0px; MARGIN: 0px; WIDTH: 100%; = TEXT-INDENT: -1000em; HEIGHT: 110px } #cp_video #top_bar { PADDING-RIGHT: 0px; BORDER-TOP: #e5ffd0 1px solid; PADDING-LEFT: 0px; = BACKGROUND: = url(http://media.collegepublisher.com/media/paper607/template/templatemed= ia/cp_meta.jpg) #6c4670 repeat-x 0px 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; WIDTH: 987px; PADDING-TOP: 0px; BORDER-BOTTOM: #ada7a7 1px solid } #cp_video #header #top_bar H3 A { COLOR: #fff } #cp_video #footer { PADDING-RIGHT: 0px; BORDER-TOP: #dddddd 4px solid; PADDING-LEFT: 0px; = BACKGROUND: #e5e5e5; PADDING-BOTTOM: 10px; PADDING-TOP: 10px } #cp_video #footer P { PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; COLOR: = #000; PADDING-TOP: 0px } #cp_video #footer P A { COLOR: #000 } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/coda/mtvi_reporting.js /*Build Date: Wed Jan 24, 2007 13:39:48*/=0A= =0A= var = com=3D{mtvi:{util:{},logger:{},config:{},ads:{},reporting:{}}};String.pro= totype.trim=3Dfunction(){return this.replace(/^\\s+|\\s+$/g,'');}=0A= String.prototype.chop=3Dfunction(n){if(isNaN(n)){n=3Dthis.length-1;}retur= n(this.substring(0,n));}=0A= String.prototype.ucFirst=3Dfunction(){return(this.charAt(0).toUpperCase()= +this.substr(1,this.length));}=0A= if(typeof = document.getElementsByClassName=3D=3D"undefined"){document.getElementsByC= lassName=3Dfunction(s){var nodes=3D[];var name=3Dnew = RegExp('\\b'+s+'\\b');var elems=3Dthis.getElementsByTagName('*');for(var = i=3D0;i";}catch(e){}}};com.mtvi.logger=3D{url= :"http://viarnd.112.2o7.net/b/ss/viarnd/1/EMAIL?",send:function(msg){if(M= TVi.util.isDefined(msg)){var img=3Dnew = Image();img.src=3Dmsg;}},JsError:function(e){try{var = map=3D{message:'c21',name:'c22',stack:'c23'};var = msg=3Dthis.url+"pageName=3DJS_ER-"+window.location;if(!MTVi.util.isDefine= d(e.stack)){e.stack=3Dwindow.location.href;}=0A= for(var i in = map){if(MTVi.util.isDefined(e[i])){msg+=3D"&"+map[i]+"=3D"+e[i];}}=0A= this.send(msg);}catch(e){try{this.send(this.url+"pageName=3DJS_ER-"+"com.= mtvi.logger = error:"+e.message);}catch(e){}}}};com.mtvi.reporting.Widget=3Ds_gi('none'= );com.mtvi.reporting.Widget.setAttribute=3Dfunction(k,v){try{if(com.mtvi.= util.isDefined(k)){this[k]=3Dcom.mtvi.util.isDefined(v)?v:'';}}catch(e){}= };com.mtvi.reporting.Widget.getAttribute=3Dfunction(k){try{if(com.mtvi.ut= il.isDefined(k)){return = this[k];}else{return;}}catch(e){}};com.mtvi.reporting.Widget.setAccount=3D= function(v){try{this.setAttribute("un",v);}catch(e){}};com.mtvi.reporting= .Widget.getAccount=3Dfunction(v){try{this.getAttribute("un");}catch(e){}}= ;com.mtvi.reporting.Widget.appendCall=3Dfunction(s){try{document.write('<= div style=3D"display:none;">'+s+'
    ');}catch(e){}};var = s_objectID;function s_c2fe(f){var = x=3D'',s=3D0,e,a,b,c;while(1){e=3Df.indexOf('"',s);b=3Df.indexOf('\\',s);= c=3Df.indexOf("\n",s);if(e<0||(b>=3D0&&b=3D0&&c=3D0){x+=3D(e>s?f.substring(s,e):'')+(e=3D=3Dc?'\\n':'\\'+f.sub= string(e,e+1));s=3De+1}else return x=0A= +f.substring(s)}return f}function s_c2fa(f){var = s=3Df.indexOf('(')+1,e=3Df.indexOf(')'),a=3D'',c;while(s>=3D0&&s=3D0){= d=3D1;q=3D'';x=3D0;f=3Dc.substring(s);a=3Ds_c2fa(f);e=3Do=3Dc.indexOf('{'= ,s);e++;while(d>0){h=3Dc.substring(e,e+1);if(q){if(h=3D=3Dq&&!x)q=3D'';if= (h=3D=3D'\\')x=3Dx?0:1;else = x=3D0}else{if(h=3D=3D'"'||h=3D=3D"'")q=3Dh;if(h=3D=3D'{')d++;if(h=3D=3D'}= ')d--}if(d>0)e++}c=3Dc.substring(0,s)=0A= +'new Function('+(a?a+',':'')+'"'+s_c2fe(c.substring(o+1,e))+'")'=0A= +c.substring(e+1);s=3Dc.indexOf('function')}fc+=3Ds_c2fe(c)+';return = s");'=0A= eval(fc);return f}function s_gi(un,pg,ss){var c=3D"function s_c(un,pg,s"=0A= +"s){var s=3Dthis;s.wd=3Dwindow;if(!s.wd.s_c_in){s.wd.s_c_il=3Dnew = Array;s."=0A= +"wd.s_c_in=3D0;}s._il=3Ds.wd.s_c_il;s._in=3Ds.wd.s_c_in;s._il[s._in]=3Ds= ;s.w"=0A= +"d.s_c_in++;s.m=3Dfunction(m){return = (''+m).indexOf('{')<0};s.fl=3Dfunct"=0A= +"ion(x,l){return x?(''+x).substring(0,l):x};s.co=3Dfunction(o){if(!o)r"=0A= +"eturn o;var n=3Dnew Object,x;for(x in o)if(x.indexOf('select')<0&&x.i"=0A= +"ndexOf('filter')<0)n[x]=3Do[x];return = n};s.num=3Dfunction(x){x=3D''+x;for"=0A= +"(var p=3D0;p0?n.length:1;while(x&&i>=3D0){x=3Dx.substring(0,i)+n+x.substri= "=0A= +"ng(i+o.length);i=3Dx.indexOf(o,i+l)}return x};s.ape=3Dfunction(x){var = s"=0A= +"=3Dthis,i;x=3Dx?s.rep(escape(''+x),'+','%2B'):x;if(x&&s.charSet&&s.em=3D= =3D"=0A= +"1&&x.indexOf('%u')<0&&x.indexOf('%U')<0){i=3Dx.indexOf('%');while(i>=3D= "=0A= +"0){i++;if(('89ABCDEFabcdef').indexOf(x.substring(i,i+1))>=3D0)return "=0A= +"x.substring(0,i)+'u00'+x.substring(i);i=3Dx.indexOf('%',i)}}return x}"=0A= +";s.epa=3Dfunction(x){var s=3Dthis;return x?unescape(s.rep(''+x,'+',' = ')"=0A= +"):x};s.pt=3Dfunction(x,d,f,a){var = s=3Dthis,t=3Dx,z=3D0,y,r;while(t){y=3Dt.ind"=0A= +"exOf(d);y=3Dy<0?t.length:y;t=3Dt.substring(0,y);r=3Ds.m(f)?s[f](t,a):f(= t,"=0A= +"a);if(r)return = r;z+=3Dy+d.length;t=3Dx.substring(z,x.length);t=3Dz=3D0"=0A= +")a=3Da.substring(0,c);if(t.substring(0,2)=3D=3D's_')t=3Dt.substring(2);= retu"=0A= +"rn (t!=3D''&&t=3D=3Da)};s.fsf=3Dfunction(t,a){var = s=3Dthis;if(s.pt(a,',','isf"=0A= +"',t))s.fsg+=3D(s.fsg!=3D''?',':'')+t;return = 0};s.fs=3Dfunction(x,f){var s"=0A= +"=3Dthis;s.fsg=3D'';s.pt(x,',','fsf',f);return = s.fsg};s.c_d=3D'';s.c_gdf=3Df"=0A= +"unction(t,a){var s=3Dthis;if(!s.num(t))return 1;return = 0};s.c_gd=3Dfunc"=0A= +"tion(){var = s=3Dthis,d=3Ds.wd.location.hostname,n=3Ds.cookieDomainPeriods,"=0A= +"p;if(d&&!s.c_d){n=3Dn?parseInt(n):2;n=3Dn>2?n:2;p=3Dd.lastIndexOf('.');= wh"=0A= +"ile(p>=3D0&&n>1){p=3Dd.lastIndexOf('.',p-1);n--}s.c_d=3Dp>0&&s.pt(d,'.'= ,'"=0A= +"c_gdf',0)?d.substring(p):''}return s.c_d};s.c_r=3Dfunction(k){var = s=3Dt"=0A= +"his;k=3Ds.ape(k);var c=3D' '+s.d.cookie,i=3Dc.indexOf(' = '+k+'=3D'),e=3Di<0?i:"=0A= +"c.indexOf(';',i),v=3Di<0?'':s.epa(c.substring(i+2+k.length,e<0?c.leng"=0A= +"th:e));return v!=3D'[[B]]'?v:''};s.c_w=3Dfunction(k,v,e){var = s=3Dthis,d=3Ds"=0A= +".c_gd(),l=3Ds.cookieLifetime,t;v=3D''+v;l=3Dl?(''+l).toUpperCase():'';i= f("=0A= +"e&&l!=3D'SESSION'&&l!=3D'NONE'){t=3D(v!=3D''?parseInt(l?l:0):-60);if(t)= {e=3Dn"=0A= +"ew Date;e.setTime(e.getTime()+(t*1000))}}if(k&&l!=3D'NONE'){s.d.cooki"=0A= +"e=3Dk+'=3D'+s.ape(v!=3D''?v:'[[B]]')+'; = path=3D/;'+(e&&l!=3D'SESSION'?' expir"=0A= +"es=3D'+e.toGMTString()+';':'')+(d?' domain=3D'+d+';':'');return = s.c_r(k"=0A= +")=3D=3Dv}return 0};s.eh=3Dfunction(o,e,r,f){var = s=3Dthis,b=3D's_'+e+'_'+s._in"=0A= +",n=3D-1,l,i,x;if(!s.ehl)s.ehl=3Dnew = Array;l=3Ds.ehl;for(i=3D0;i=3D5)eval('try{r=3Ds.m(f)?s[f](a):f(a)}catch(e){r=3Ds.= m("=0A= +"t)?s[t](e):t(e)}');else{if(s.ismac&&s.u.indexOf('MSIE = 4')>=3D0)r=3Ds.m("=0A= +"b)?s[b](a):b(a);else{s.eh(s.wd,'onerror',0,o);r=3Ds.m(f)?s[f](a):f(a)"=0A= +";s.eh(s.wd,'onerror',1)}}return r};s.gtfset=3Dfunction(e){var = s=3Dthis;"=0A= +"return s.tfs};s.gtfsoe=3Dnew Function('e','var = s=3Ds_c_il['+s._in+'];s."=0A= +"eh(window,\"onerror\",1);s.etfs=3D1;var = c=3Ds.t();if(c)s.d.write(c);s.e"=0A= +"tfs=3D0;return true');s.gtfsfb=3Dfunction(a){return = window};s.gtfsf=3Dfun"=0A= +"ction(w){var = s=3Dthis,p=3Dw.parent,l=3Dw.location;s.tfs=3Dw;if(p&&p.locatio"=0A= +"n!=3Dl&&p.location.host=3D=3Dl.host){s.tfs=3Dp;return = s.gtfsf(s.tfs)}return"=0A= +" s.tfs};s.gtfs=3Dfunction(){var = s=3Dthis;if(!s.tfs){s.tfs=3Ds.wd;if(!s.et"=0A= +"fs)s.tfs=3Ds.cet('gtfsf',s.tfs,'gtfset',s.gtfsoe,'gtfsfb')}return s.t"=0A= +"fs};s.ca=3Dfunction(){var = s=3Dthis,imn=3D's_i_'+s.fun;if(s.d.images&&s.ap"=0A= +"v>=3D3&&!s.isopera&&(s.ns6<0||s.apv>=3D6.1)){s.ios=3D1;if(!s.d.images[i= mn"=0A= +"]&&(!s.isns||(s.apv<4||s.apv>=3D5))){s.d.write('
    ');if(!s.d.images[imn])s.ios"=0A= +"=3D0}}};s.mr=3Dfunction(sess,q,ta){var = s=3Dthis,ns=3Ds.visitorNamespace,unc"=0A= +"=3Ds.rep(s.fun,'_','-'),imn=3D's_i_'+s.fun,im,b,e,rs=3D'http'+(s.ssl?'s= ':"=0A= +"'')+'://'+(ns?ns:(s.ssl?'102':unc))+'.112.2O7.net/b/ss/'+s.un+'/1/H"=0A= +".1-pdv-2/'+sess+'?[AQB]&ndh=3D1'+(q?q:'')+(s.q?s.q:'')+'&[AQE]';if(s."=0A= +"isie&&!s.ismac){if(s.apv>5.5)rs=3Ds.fl(rs,4095);else = rs=3Ds.fl(rs,2047)"=0A= +"}if(s.ios){im=3Ds.wd[imn]?s.wd[imn]:s.d.images[imn];if(!im)im=3Ds.wd[im= "=0A= +"n]=3Dnew = Image;im.src=3Drs;if(rs.indexOf('&pe=3D')>=3D0&&(!ta||ta=3D=3D'_self'|"=0A= +"|ta=3D=3D'_top'||(s.wd.name&&ta=3D=3Ds.wd.name))){b=3De=3Dnew = Date;while(e.getT"=0A= +"ime()-b.getTime()<500)e=3Dnew Date}return ''}return ''};s.gg=3Dfunction(v){v"=0A= +"ar s=3Dthis;return = s.wd['s_'+v]};s.glf=3Dfunction(t,a){if(t.substring(0"=0A= +",2)=3D=3D's_')t=3Dt.substring(2);var = s=3Dthis,v=3Ds.gg(t);if(v)s[t]=3Dv};s.gl=3Df"=0A= +"unction(v){var s=3Dthis;s.pt(v,',','glf',0)};s.gv=3Dfunction(v){var = s=3Dt"=0A= +"his;return s['vpm_'+v]?s['vpv_'+v]:s[v]};s.havf=3Dfunction(t,a){var s"=0A= +"=3Dthis,b=3Dt.substring(0,4),x=3Dt.substring(4),n=3DparseInt(x),k=3D'g_= '+t,m=3D"=0A= +"'vpm_'+t,q=3Dt,v=3Ds.linkTrackVars,e=3Ds.linkTrackEvents;s[k]=3Ds.gv(t)= ;if("=0A= +"s.lnk||s.eo){v=3Dv?v+','+s.vl_l:'';if(v&&!s.pt(v,',','isf',t))s[k]=3D''= "=0A= +";if(t=3D=3D'events'&&e)s[k]=3Ds.fs(s[k],e)}s[m]=3D0;if(t=3D=3D'pageURL'= )q=3D'g';e"=0A= +"lse if(t=3D=3D'referrer')q=3D'r';else = if(t=3D=3D'charSet'){q=3D'ce';if(s[k]&&s."=0A= +"em=3D=3D2)s[k]=3D'UTF-8'}else = if(t=3D=3D'visitorNamespace')q=3D'ns';else if(t=3D=3D"=0A= +"'cookieDomainPeriods')q=3D'cdp';else = if(t=3D=3D'cookieLifetime')q=3D'cl';el"=0A= +"se if(t=3D=3D'visitVariableProvider')q=3D'vvp';else = if(t=3D=3D'currencyCode')"=0A= +"q=3D'cc';else if(t=3D=3D'channel')q=3D'ch';else = if(t=3D=3D'campaign')q=3D'v0';els"=0A= +"e if(s.num(x)) {if(b=3D=3D'prop')q=3D'c'+n;else = if(b=3D=3D'eVar')q=3D'v'+n;else"=0A= +" = if(b=3D=3D'hier'){q=3D'h'+n;s[k]=3Ds.fl(s[k],255)}}if(s[k]&&t!=3D'linkNam= e'&"=0A= +"&t!=3D'linkType')s.qav+=3D'&'+q+'=3D'+s.ape(s[k]);return = ''};s.hav=3Dfuncti"=0A= +"on(){var s=3Dthis;s.qav=3D'';s.pt(s.vl_t,',','havf',0);return = s.qav};s."=0A= +"lnf=3Dfunction(t,h){t=3Dt?t.toLowerCase():'';h=3Dh?h.toLowerCase():'';v= ar"=0A= +" = te=3Dt.indexOf('=3D');if(t&&te>0&&h.indexOf(t.substring(te+1))>=3D0)retu"=0A= +"rn t.substring(0,te);return ''};s.ln=3Dfunction(h){var = s=3Dthis,n=3Ds.lin"=0A= +"kNames;if(n)return s.pt(n,',','lnf',h);return ''};s.ltdf=3Dfunction(t"=0A= +",h){t=3Dt?t.toLowerCase():'';h=3Dh?h.toLowerCase():'';var = qi=3Dh.indexOf("=0A= +"'?');h=3Dqi>=3D0?h.substring(0,qi):h;if(t&&h.substring(h.length-(t.leng= "=0A= +"th+1))=3D=3D'.'+t)return 1;return = 0};s.ltef=3Dfunction(t,h){t=3Dt?t.toLower"=0A= +"Case():'';h=3Dh?h.toLowerCase():'';if(t&&h.indexOf(t)>=3D0)return = 1;ret"=0A= +"urn 0};s.lt=3Dfunction(h){var = s=3Dthis,lft=3Ds.linkDownloadFileTypes,lef=3D"=0A= +"s.linkExternalFilters,lif=3Ds.linkInternalFilters;lif=3Dlif?lif:s.wd.lo= "=0A= +"cation.hostname;h=3Dh.toLowerCase();if(s.trackDownloadLinks&&lft&&s.p"=0A= +"t(lft,',','ltdf',h))return 'd';if(s.trackExternalLinks&&(lef||lif)&"=0A= +"&(!lef||s.pt(lef,',','ltef',h))&&(!lif||!s.pt(lif,',','ltef',h)))re"=0A= +"turn 'e';return ''};s.lc=3Dnew Function('e','var = s=3Ds_c_il['+s._in+'],"=0A= +"b=3Ds.eh(this,\"onclick\");s.lnk=3Ds.co(this);s.t();s.lnk=3D0;if(b)retu= rn"=0A= +" this[b](e);return true');s.bc=3Dnew Function('e','var = s=3Ds_c_il['+s._"=0A= +"in+'];if(s.d&&s.d.all&&s.d.all.cppXYctnr)return;s.eo=3De.srcElement?e"=0A= +".srcElement:e.target;s.t();s.eo=3D0');s.ot=3Dfunction(o){var = a=3Do.type,b"=0A= +"=3Do.tagName;return (a&&a.toUpperCase?a:b&&b.toUpperCase?b:o.href?'A'"=0A= +":'').toUpperCase()};s.oid=3Dfunction(o){var = s=3Dthis,t=3Ds.ot(o),p=3Do.prot"=0A= +"ocol,c=3Do.onclick,n=3D'',x=3D0;if(!o.s_oid){if(o.href&&(t=3D=3D'A'||t=3D= =3D'AREA"=0A= +"')&&(!c||!p||p.toLowerCase().indexOf('javascript')<0))n=3Do.href;else"=0A= +" if(c){n=3Ds.rep(s.rep(s.rep(s.rep(''+c,\"\\r\",''),\"\\n\",''),\"\\t"=0A= +"\",''),' ','');x=3D2}else = if(o.value&&(t=3D=3D'INPUT'||t=3D=3D'SUBMIT')){n=3Do."=0A= +"value;x=3D3}else = if(o.src&&t=3D=3D'IMAGE')n=3Do.src;if(n){o.s_oid=3Ds.fl(n,10"=0A= +"0);o.s_oidt=3Dx}}return o.s_oid};s.rqf=3Dfunction(t,un){var = s=3Dthis,e=3Dt."=0A= +"indexOf('=3D'),u=3De>=3D0?','+t.substring(0,e)+',':'';return = u&&u.indexOf"=0A= +"(','+un+',')>=3D0?s.epa(t.substring(e+1)):''};s.rq=3Dfunction(un){var = s"=0A= +"=3Dthis,c=3Dun.indexOf(','),v=3Ds.c_r('s_sq'),q=3D'';if(c<0)return = s.pt(v,'"=0A= +"&','rqf',un);return s.pt(un,',','rq',0)};s.sqp=3Dfunction(t,a){var = s=3D"=0A= +"this,e=3Dt.indexOf('=3D'),q=3De<0?'':s.epa(t.substring(e+1));s.sqq[q]=3D= '';"=0A= +"if(e>=3D0)s.pt(t.substring(0,e),',','sqs',q);return = 0};s.sqs=3Dfunction"=0A= +"(un,q){var s=3Dthis;s.squ[un]=3Dq;return 0};s.sq=3Dfunction(q){var = s=3Dthis"=0A= +",k=3D's_sq',v=3Ds.c_r(k),x,c=3D0;s.sqq=3Dnew Object;s.squ=3Dnew = Object;s.sqq["=0A= +"q]=3D'';s.pt(v,'&','sqp',0);s.pt(s.un,',','sqs',q);v=3D'';for(x in = s.sq"=0A= +"u)s.sqq[s.squ[x]]+=3D(s.sqq[s.squ[x]]?',':'')+x;for(x in s.sqq)if(x&&"=0A= +"s.sqq[x]&&(x=3D=3Dq||c<2)){v+=3D(v?'&':'')+s.sqq[x]+'=3D'+s.ape(x);c++}= retu"=0A= +"rn s.c_w(k,v,0)};s.wdl=3Dnew Function('e','var = s=3Ds_c_il['+s._in+'],r=3D"=0A= +"true,b=3Ds.eh(s.wd,\"onload\"),i,o,oc;if(b)r=3Dthis[b](e);for(i=3D0;i=3D0)&&oc.indexOf"=0A= +"(\".tl(\")<0)s.eh(o,\"onclick\",0,s.lc);}return r');s.wds=3Dfunction("=0A= +"){var = s=3Dthis;if(s.apv>3&&(!s.isie||!s.ismac||s.apv>=3D5)){if(s.b&&s.b"=0A= +".attachEvent)s.b.attachEvent('onclick',s.bc);else if(s.b&&s.b.addEv"=0A= +"entListener)s.b.addEventListener('click',s.bc,false);else s.eh(s.wd"=0A= +",'onload',0,s.wdl)}};s.vs=3Dfunction(x){var = s=3Dthis,v=3Ds.visitorSamplin"=0A= +"g,g=3Ds.visitorSamplingGroup,k=3D's_vsn_'+s.un+(g?'_'+g:''),n=3Ds.c_r(k= ),"=0A= +"e=3Dnew = Date,y=3De.getYear();e.setYear(y+10+(y<1900?1900:0));if(v){v*=3D1"=0A= +"00;if(!n){if(!s.c_w(k,x,e))return 0;n=3Dx}if(n%10000>v)return 0}retur"=0A= +"n 1};s.dyasmf=3Dfunction(t,m){if(t&&m&&m.indexOf(t)>=3D0)return = 1;retur"=0A= +"n 0};s.dyasf=3Dfunction(t,m){var = s=3Dthis,i=3Dt?t.indexOf('=3D'):-1,n,x;if("=0A= +"i>=3D0&&m){var = n=3Dt.substring(0,i),x=3Dt.substring(i+1);if(s.pt(x,',','d"=0A= +"yasmf',m))return n}return 0};s.uns=3Dfunction(){var = s=3Dthis,x=3Ds.dynami"=0A= +"cAccountSelection,l=3Ds.dynamicAccountList,m=3Ds.dynamicAccountMatch,n,= "=0A= +"i;s.un.toLowerCase();if(x&&l){if(!m)m=3Ds.wd.location.host;if(!m.toLo"=0A= +"werCase)m=3D''+m;l=3Dl.toLowerCase();m=3Dm.toLowerCase();n=3Ds.pt(l,';'= ,'dy"=0A= +"asf',m);if(n)s.un=3Dn}i=3Ds.un.indexOf(',');s.fun=3Di<0?s.un:s.un.subst= ri"=0A= +"ng(0,i)};s.t=3Dfunction(){var s=3Dthis,trk=3D1,tm=3Dnew = Date,sed=3DMath&&Math"=0A= +".random?Math.floor(Math.random()*10000000000000):tm.getTime(),sess=3D"=0A= +"'s'+Math.floor(tm.getTime()/10800000)%10+sed,yr=3Dtm.getYear(),vt=3Dtm.= "=0A= +"getDate()+'/'+tm.getMonth()+'/'+(yr<1900?yr+1900:yr)+' '+tm.getHour"=0A= +"s()+':'+tm.getMinutes()+':'+tm.getSeconds()+' '+tm.getDay()+' '+tm."=0A= +"getTimezoneOffset(),tfs=3Ds.gtfs(),ta=3D'',q=3D'',qs=3D'';s.uns();if(!s= .q){"=0A= +"var = tl=3Dtfs.location,x=3D'',c=3D'',v=3D'',p=3D'',bw=3D'',bh=3D'',j=3D'1.0',k= =3Ds.c_w"=0A= +"('s_cc','true',0)?'Y':'N',hp=3D'',ct=3D'',pn=3D0,ps;if(s.apv>=3D4)x=3Ds= creen."=0A= +"width+'x'+screen.height;if(s.isns||s.isopera){if(s.apv>=3D3){j=3D'1.1';= "=0A= +"v=3Ds.n.javaEnabled()?'Y':'N';if(s.apv>=3D4){j=3D'1.2';c=3Dscreen.pixel= Dept"=0A= +"h;bw=3Ds.wd.innerWidth;bh=3Ds.wd.innerHeight;if(s.apv>=3D4.06)j=3D'1.3'= }}s."=0A= +"pl=3Ds.n.plugins}else = if(s.isie){if(s.apv>=3D4){v=3Ds.n.javaEnabled()?'Y'"=0A= +":'N';j=3D'1.2';c=3Dscreen.colorDepth;if(s.apv>=3D5){bw=3Ds.d.documentEl= emen"=0A= +"t.offsetWidth;bh=3Ds.d.documentElement.offsetHeight;j=3D'1.3';if(!s.ism= "=0A= +"ac&&s.b){s.b.addBehavior('#default#homePage');hp=3Ds.b.isHomePage(tl)"=0A= +"?\"Y\":\"N\";s.b.addBehavior('#default#clientCaps');ct=3Ds.b.connecti"=0A= +"onType}}}else = r=3D''}if(s.pl)while(pn=3D0&&oc.indexOf(\".s_"=0A= +"oc(\")<0)||oc.indexOf(\".tl(\")>=3D0)return = ''}ta=3Do.target;h=3Do.href?o"=0A= +".href:'';i=3Dh.indexOf('?');h=3Ds.linkLeaveQueryString||i<0?h:h.substri= "=0A= +"ng(0,i);l=3Ds.linkName?s.linkName:s.ln(h);t=3Ds.linkType?s.linkType.toL= "=0A= +"owerCase():s.lt(h);if(t&&(h||l))q+=3D'&pe=3Dlnk_'+(t=3D=3D'd'||t=3D=3D'= e'?s.ape"=0A= +"(t):'o')+(h?'&pev1=3D'+s.ape(h):'')+(l?'&pev2=3D'+s.ape(l):'');else = trk"=0A= +"=3D0;if(s.trackInlineStats){if(!p){p=3Ds.gv('pageURL');w=3D0}t=3Ds.ot(o= );i=3D"=0A= +"o.sourceIndex;if(s.gg('objectID')){n=3Ds.gg('objectID');x=3D1;i=3D1}if(= p&"=0A= +"&n&&t)qs=3D'&pid=3D'+s.ape(s.fl(p,255))+(w?'&pidt=3D'+w:'')+'&oid=3D'+s= .ape"=0A= +"(s.fl(n,100))+(x?'&oidt=3D'+x:'')+'&ot=3D'+s.ape(t)+(i?'&oi=3D'+i:'')}}= if"=0A= +"(!trk&&!qs)return '';var = code=3D'';if(trk&&s.vs(sed))code=3Ds.mr(sess,("=0A= +"vt?'&t=3D'+s.ape(vt):'')+s.hav()+q+(qs?qs:s.rq(s.un)),ta);s.sq(trk?''"=0A= +":qs);s.lnk=3Ds.eo=3Ds.linkName=3Ds.linkType=3Ds.wd.s_objectID=3D'';retu= rn cod"=0A= +"e};s.tl=3Dfunction(o,t,n){var = s=3Dthis;s.lnk=3Ds.co(o);s.linkType=3Dt;s.lin"=0A= +"kName=3Dn;s.t()};s.ssl=3D(s.wd.location.protocol.toLowerCase().indexOf(= "=0A= +"'https')>=3D0);s.d=3Ddocument;s.b=3Ds.d.body;s.n=3Dnavigator;s.u=3Ds.n.= userAg"=0A= +"ent;s.ns6=3Ds.u.indexOf('Netscape6/');var = apn=3Ds.n.appName,v=3Ds.n.appVe"=0A= +"rsion,ie=3Dv.indexOf('MSIE = '),i;if(v.indexOf('Opera')>=3D0||s.u.indexOf"=0A= +"('Opera')>=3D0)apn=3D'Opera';s.isie=3D(apn=3D=3D'Microsoft Internet = Explorer'"=0A= +");s.isns=3D(apn=3D=3D'Netscape');s.isopera=3D(apn=3D=3D'Opera');s.ismac= =3D(s.u.in"=0A= +"dexOf('Mac')>=3D0);if(ie>0){s.apv=3DparseInt(i=3Dv.substring(ie+5));if(= s."=0A= +"apv>3)s.apv=3DparseFloat(i)}else = if(s.ns6>0)s.apv=3DparseFloat(s.u.subs"=0A= +"tring(s.ns6+10));else = s.apv=3DparseFloat(v);s.em=3D0;if(String.fromChar"=0A= +"Code){i=3Descape(String.fromCharCode(256)).toUpperCase();s.em=3D(i=3D=3D= '%C"=0A= +"4%80'?2:(i=3D=3D'%U0100'?1:0))}s.un=3Dun;s.uns();s.vl_l=3D'charSet,visi= torN"=0A= +"amespace,cookieDomainPeriods,cookieLifetime,visitVariableProvider,p"=0A= +"ageName,pageURL,referrer,currencyCode,purchaseID';s.vl_t=3Ds.vl_l+',c"=0A= +"hannel,server,pageType,campaign,state,zip,events,products,linkName,"=0A= +"linkType';for(var = n=3D1;n<51;n++)s.vl_t+=3D',prop'+n+',eVar'+n+',hier'+"=0A= +"n;s.vl_g=3Ds.vl_t+',trackDownloadLinks,trackExternalLinks,trackInline"=0A= +"Stats,linkLeaveQueryString,linkDownloadFileTypes,linkExternalFilter"=0A= +"s,linkInternalFilters,linkNames';if(pg)s.gl(s.vl_g);if(!ss){s.wds()"=0A= +";s.ca()}}",l=3Dwindow.s_c_il,n=3Dnavigator,u=3Dn.userAgent,v=3Dn.appVer= sion,e=3Dv.indexOf('MSIE = '),m=3Du.indexOf('Netscape6/'),a,i,s;if(l)for(i=3D0;i0){a=3DparseInt(i=3Dv.substring(e=0A= +5));if(a>3)a=3DparseFloat(i)}else = if(m>0)a=3DparseFloat(u.substring(m+10));else = a=3DparseFloat(v);if(a>=3D5&&v.indexOf('Opera')<0&&u.indexOf('Opera')<0){= eval(c);return new s_c(un,pg,ss)}else s=3Ds_c2f(c);return = s(un,pg,ss)}com.mtvi.reporting.Dispatcher=3Dnew = function(){this.version=3D"2.0";try{this.widget=3Dcom.mtvi.reporting.Widg= et;}catch(e){}=0A= this.send=3Dfunction(){try{if(com.mtvi.util.isDefined(this.widget.un)){va= r = hcode=3Dthis.widget.t();}}catch(e){try{com.mtvi.logger.JsError(e);}catch(= e){}}};this.setAccountVars=3Dfunction(o){try{this.widget.setAccount(o.nam= e);this.widget.setAttribute("dynamicAccountSelection",o.dynamic);this.wid= get.setAttribute("dynamicAccountList",o.list);this.widget.setAttribute("l= inkInternalFilters",o.filters);}catch(e){}};this.setValues=3Dfunction(o){= try{for(var i in = o){this.widget.setAttribute(i,o[i]);}}catch(e){}};this.config=3Dfunction(= ){try{this.setAccountVars(com.mtvi.reporting.Account);}catch(e){}=0A= try{this.setValues(com.mtvi.reporting.Map());}catch(e){}};this.sendCall=3D= function(){try{this.setAccountVars(com.mtvi.reporting.Account);try{this.s= etValues(com.mtvi.reporting.Map());}catch(e){}=0A= try{this.setValues(com.mtvi.config.SectionSetup);}catch(e){}=0A= this.send();}catch(e){try{com.mtvi.logger.JsError(e);}catch(e){}}};this.s= etDefaultData=3Dfunction(){try{var = pn=3Dlocation.href;pn=3Dpn.replace(/^.*www\.(.*)\.com/g,"");pn=3Dpn.repla= ce(/^.*(.*)\.com/g,"");pn=3Dcom.mtvi.config.Get.channel+pn;this.widget.se= tAttribute("pageName","/"+pn);this.widget.setAttribute("hier1",pn);this.w= idget.setAttribute("channel",com.mtvi.config.Get.channel);this.widget.set= Attribute(com.mtvi.config.Get.site,com.mtvi.config.Get.channel);}catch(e)= {try{com.mtvi.logger.JsError(e);}catch(e){}}};this.sendThirdPartyCall=3Df= unction(){try{this.setAccountVars(com.mtvi.config.Get);this.setThirdParty= Data();try{this.setValues(com.mtvi.reporting.Map());}catch(e){}=0A= this.send();}catch(e){try{com.mtvi.logger.JsError(e);}catch(e){}}};this.s= endLinkEvent=3Dfunction(name){try{var = hier2=3Dthis.widget.getAttribute("hier2");this.widget=3Dcom.mtvi.reportin= g.Widget;this.config();this.setValues({linkType:"o",lnk:true,linkName:nam= e,hier2:""});this.send();this.widget.setAttribute("hier2",hier2);}catch(e= ){try{com.mtvi.logger.JsError(e);}catch(e){}}};this.getBaseUrl=3Dfunction= (){try{this.config();var = vendorUrl=3D".112.2o7.net/b/ss/";return("http"+(this.widget.ssl?'s':'')+"= ://"+this.widget.un+vendorUrl+this.widget.un+"/1/");}catch(e){try{com.mtv= i.logger.JsError(e);}catch(e){}}};this.sendFailedSearch=3Dfunction(v){try= {if(com.mtvi.util.isDefined(v)){var = aImg=3Ddocument.createElement('img');aImg.src=3Dthis.getBaseUrl()+"EMAIL?= pageName=3DFAILED+SEARCH&v4=3D"+v;aImg.id=3D"failedSearchCall";document.g= etElementsByTagName('body')[0].appendChild(aImg);}}catch(e){try{com.mtvi.= logger.JsError(e);}catch(e){}}};this.replacePathSection=3Dfunction(path,n= ewValue,replaceAt){try{var = pathParts=3D(path.charAt(0)!=3D"/")?path.split("/"):path.substring(1).spl= it("/");if(isNaN(replaceAt)||replaceAt>=3DpathParts.length)return = false;pathParts[replaceAt]=3DnewValue;var = newPath=3DpathParts.join("/");return = newPath;}catch(e){try{com.mtvi.logger.JsError(e);return = false}catch(e){return = false}}};this.deletePathSection=3Dfunction(path,removeAt){try{var = pathParts=3D(path.charAt(0)!=3D"/")?path.split("/"):path.substring(1).spl= it("/");if(isNaN(removeAt)||removeAt>=3DpathParts.length)return = false;pathParts.splice(removeAt,1);var = newPath=3DpathParts.join("/");return = newPath;}catch(e){try{com.mtvi.logger.JsError(e);return = false}catch(e){return = false}}};this.setAttribute=3Dfunction(k,v){this.widget.setAttribute(k,v);= };this.getAttribute=3Dfunction(k){return this.widget.getAttribute(k);};}; ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/prototype.js /* Prototype JavaScript framework, version 1.5.0=0A= * (c) 2005-2007 Sam Stephenson=0A= *=0A= * Prototype is freely distributable under the terms of an MIT-style = license.=0A= * For details, see the Prototype web site: http://prototype.conio.net/=0A= *=0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Prototype =3D {=0A= Version: '1.5.0',=0A= BrowserFeatures: {=0A= XPath: !!document.evaluate=0A= },=0A= =0A= ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)',=0A= emptyFunction: function() {},=0A= K: function(x) { return x }=0A= }=0A= =0A= var Class =3D {=0A= create: function() {=0A= return function() {=0A= this.initialize.apply(this, arguments);=0A= }=0A= }=0A= }=0A= =0A= var Abstract =3D new Object();=0A= =0A= Object.extend =3D function(destination, source) {=0A= for (var property in source) {=0A= destination[property] =3D source[property];=0A= }=0A= return destination;=0A= }=0A= =0A= Object.extend(Object, {=0A= inspect: function(object) {=0A= try {=0A= if (object =3D=3D=3D undefined) return 'undefined';=0A= if (object =3D=3D=3D null) return 'null';=0A= return object.inspect ? object.inspect() : object.toString();=0A= } catch (e) {=0A= if (e instanceof RangeError) return '...';=0A= throw e;=0A= }=0A= },=0A= =0A= keys: function(object) {=0A= var keys =3D [];=0A= for (var property in object)=0A= keys.push(property);=0A= return keys;=0A= },=0A= =0A= values: function(object) {=0A= var values =3D [];=0A= for (var property in object)=0A= values.push(object[property]);=0A= return values;=0A= },=0A= =0A= clone: function(object) {=0A= return Object.extend({}, object);=0A= }=0A= });=0A= =0A= Function.prototype.bind =3D function() {=0A= var __method =3D this, args =3D $A(arguments), object =3D args.shift();=0A= return function() {=0A= return __method.apply(object, args.concat($A(arguments)));=0A= }=0A= }=0A= =0A= Function.prototype.bindAsEventListener =3D function(object) {=0A= var __method =3D this, args =3D $A(arguments), object =3D args.shift();=0A= return function(event) {=0A= return __method.apply(object, [( event || = window.event)].concat(args).concat($A(arguments)));=0A= }=0A= }=0A= =0A= Object.extend(Number.prototype, {=0A= toColorPart: function() {=0A= var digits =3D this.toString(16);=0A= if (this < 16) return '0' + digits;=0A= return digits;=0A= },=0A= =0A= succ: function() {=0A= return this + 1;=0A= },=0A= =0A= times: function(iterator) {=0A= $R(0, this, true).each(iterator);=0A= return this;=0A= }=0A= });=0A= =0A= var Try =3D {=0A= these: function() {=0A= var returnValue;=0A= =0A= for (var i =3D 0, length =3D arguments.length; i < length; i++) {=0A= var lambda =3D arguments[i];=0A= try {=0A= returnValue =3D lambda();=0A= break;=0A= } catch (e) {}=0A= }=0A= =0A= return returnValue;=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var PeriodicalExecuter =3D Class.create();=0A= PeriodicalExecuter.prototype =3D {=0A= initialize: function(callback, frequency) {=0A= this.callback =3D callback;=0A= this.frequency =3D frequency;=0A= this.currentlyExecuting =3D false;=0A= =0A= this.registerCallback();=0A= },=0A= =0A= registerCallback: function() {=0A= this.timer =3D setInterval(this.onTimerEvent.bind(this), = this.frequency * 1000);=0A= },=0A= =0A= stop: function() {=0A= if (!this.timer) return;=0A= clearInterval(this.timer);=0A= this.timer =3D null;=0A= },=0A= =0A= onTimerEvent: function() {=0A= if (!this.currentlyExecuting) {=0A= try {=0A= this.currentlyExecuting =3D true;=0A= this.callback(this);=0A= } finally {=0A= this.currentlyExecuting =3D false;=0A= }=0A= }=0A= }=0A= }=0A= String.interpret =3D function(value){=0A= return value =3D=3D null ? '' : String(value);=0A= }=0A= =0A= Object.extend(String.prototype, {=0A= gsub: function(pattern, replacement) {=0A= var result =3D '', source =3D this, match;=0A= replacement =3D arguments.callee.prepareReplacement(replacement);=0A= =0A= while (source.length > 0) {=0A= if (match =3D source.match(pattern)) {=0A= result +=3D source.slice(0, match.index);=0A= result +=3D String.interpret(replacement(match));=0A= source =3D source.slice(match.index + match[0].length);=0A= } else {=0A= result +=3D source, source =3D '';=0A= }=0A= }=0A= return result;=0A= },=0A= =0A= sub: function(pattern, replacement, count) {=0A= replacement =3D this.gsub.prepareReplacement(replacement);=0A= count =3D count =3D=3D=3D undefined ? 1 : count;=0A= =0A= return this.gsub(pattern, function(match) {=0A= if (--count < 0) return match[0];=0A= return replacement(match);=0A= });=0A= },=0A= =0A= scan: function(pattern, iterator) {=0A= this.gsub(pattern, iterator);=0A= return this;=0A= },=0A= =0A= truncate: function(length, truncation) {=0A= length =3D length || 30;=0A= truncation =3D truncation =3D=3D=3D undefined ? '...' : truncation;=0A= return this.length > length ?=0A= this.slice(0, length - truncation.length) + truncation : this;=0A= },=0A= =0A= strip: function() {=0A= return this.replace(/^\s+/, '').replace(/\s+$/, '');=0A= },=0A= =0A= stripTags: function() {=0A= return this.replace(/<\/?[^>]+>/gi, '');=0A= },=0A= =0A= stripScripts: function() {=0A= return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');=0A= },=0A= =0A= extractScripts: function() {=0A= var matchAll =3D new RegExp(Prototype.ScriptFragment, 'img');=0A= var matchOne =3D new RegExp(Prototype.ScriptFragment, 'im');=0A= return (this.match(matchAll) || []).map(function(scriptTag) {=0A= return (scriptTag.match(matchOne) || ['', ''])[1];=0A= });=0A= },=0A= =0A= evalScripts: function() {=0A= return this.extractScripts().map(function(script) { return = eval(script) });=0A= },=0A= =0A= escapeHTML: function() {=0A= var div =3D document.createElement('div');=0A= var text =3D document.createTextNode(this);=0A= div.appendChild(text);=0A= return div.innerHTML;=0A= },=0A= =0A= unescapeHTML: function() {=0A= var div =3D document.createElement('div');=0A= div.innerHTML =3D this.stripTags();=0A= return div.childNodes[0] ? (div.childNodes.length > 1 ?=0A= $A(div.childNodes).inject('',function(memo,node){ return = memo+node.nodeValue }) :=0A= div.childNodes[0].nodeValue) : '';=0A= },=0A= =0A= toQueryParams: function(separator) {=0A= var match =3D this.strip().match(/([^?#]*)(#.*)?$/);=0A= if (!match) return {};=0A= =0A= return match[1].split(separator || '&').inject({}, function(hash, = pair) {=0A= if ((pair =3D pair.split('=3D'))[0]) {=0A= var name =3D decodeURIComponent(pair[0]);=0A= var value =3D pair[1] ? decodeURIComponent(pair[1]) : undefined;=0A= =0A= if (hash[name] !=3D=3D undefined) {=0A= if (hash[name].constructor !=3D Array)=0A= hash[name] =3D [hash[name]];=0A= if (value) hash[name].push(value);=0A= }=0A= else hash[name] =3D value;=0A= }=0A= return hash;=0A= });=0A= },=0A= =0A= toArray: function() {=0A= return this.split('');=0A= },=0A= =0A= succ: function() {=0A= return this.slice(0, this.length - 1) +=0A= String.fromCharCode(this.charCodeAt(this.length - 1) + 1);=0A= },=0A= =0A= camelize: function() {=0A= var parts =3D this.split('-'), len =3D parts.length;=0A= if (len =3D=3D 1) return parts[0];=0A= =0A= var camelized =3D this.charAt(0) =3D=3D '-'=0A= ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)=0A= : parts[0];=0A= =0A= for (var i =3D 1; i < len; i++)=0A= camelized +=3D parts[i].charAt(0).toUpperCase() + = parts[i].substring(1);=0A= =0A= return camelized;=0A= },=0A= =0A= capitalize: function(){=0A= return this.charAt(0).toUpperCase() + = this.substring(1).toLowerCase();=0A= },=0A= =0A= underscore: function() {=0A= return this.gsub(/::/, = '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{= 1}_#{2}').gsub(/-/,'_').toLowerCase();=0A= },=0A= =0A= dasherize: function() {=0A= return this.gsub(/_/,'-');=0A= },=0A= =0A= inspect: function(useDoubleQuotes) {=0A= var escapedString =3D this.replace(/\\/g, '\\\\');=0A= if (useDoubleQuotes)=0A= return '"' + escapedString.replace(/"/g, '\\"') + '"';=0A= else=0A= return "'" + escapedString.replace(/'/g, '\\\'') + "'";=0A= }=0A= });=0A= =0A= String.prototype.gsub.prepareReplacement =3D function(replacement) {=0A= if (typeof replacement =3D=3D 'function') return replacement;=0A= var template =3D new Template(replacement);=0A= return function(match) { return template.evaluate(match) };=0A= }=0A= =0A= String.prototype.parseQuery =3D String.prototype.toQueryParams;=0A= =0A= var Template =3D Class.create();=0A= Template.Pattern =3D /(^|.|\r|\n)(#\{(.*?)\})/;=0A= Template.prototype =3D {=0A= initialize: function(template, pattern) {=0A= this.template =3D template.toString();=0A= this.pattern =3D pattern || Template.Pattern;=0A= },=0A= =0A= evaluate: function(object) {=0A= return this.template.gsub(this.pattern, function(match) {=0A= var before =3D match[1];=0A= if (before =3D=3D '\\') return match[2];=0A= return before + String.interpret(object[match[3]]);=0A= });=0A= }=0A= }=0A= =0A= var $break =3D new Object();=0A= var $continue =3D new Object();=0A= =0A= var Enumerable =3D {=0A= each: function(iterator) {=0A= var index =3D 0;=0A= try {=0A= this._each(function(value) {=0A= try {=0A= iterator(value, index++);=0A= } catch (e) {=0A= if (e !=3D $continue) throw e;=0A= }=0A= });=0A= } catch (e) {=0A= if (e !=3D $break) throw e;=0A= }=0A= return this;=0A= },=0A= =0A= eachSlice: function(number, iterator) {=0A= var index =3D -number, slices =3D [], array =3D this.toArray();=0A= while ((index +=3D number) < array.length)=0A= slices.push(array.slice(index, index+number));=0A= return slices.map(iterator);=0A= },=0A= =0A= all: function(iterator) {=0A= var result =3D true;=0A= this.each(function(value, index) {=0A= result =3D result && !!(iterator || Prototype.K)(value, index);=0A= if (!result) throw $break;=0A= });=0A= return result;=0A= },=0A= =0A= any: function(iterator) {=0A= var result =3D false;=0A= this.each(function(value, index) {=0A= if (result =3D !!(iterator || Prototype.K)(value, index))=0A= throw $break;=0A= });=0A= return result;=0A= },=0A= =0A= collect: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= results.push((iterator || Prototype.K)(value, index));=0A= });=0A= return results;=0A= },=0A= =0A= detect: function(iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= if (iterator(value, index)) {=0A= result =3D value;=0A= throw $break;=0A= }=0A= });=0A= return result;=0A= },=0A= =0A= findAll: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (iterator(value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= },=0A= =0A= grep: function(pattern, iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= var stringValue =3D value.toString();=0A= if (stringValue.match(pattern))=0A= results.push((iterator || Prototype.K)(value, index));=0A= })=0A= return results;=0A= },=0A= =0A= include: function(object) {=0A= var found =3D false;=0A= this.each(function(value) {=0A= if (value =3D=3D object) {=0A= found =3D true;=0A= throw $break;=0A= }=0A= });=0A= return found;=0A= },=0A= =0A= inGroupsOf: function(number, fillWith) {=0A= fillWith =3D fillWith =3D=3D=3D undefined ? null : fillWith;=0A= return this.eachSlice(number, function(slice) {=0A= while(slice.length < number) slice.push(fillWith);=0A= return slice;=0A= });=0A= },=0A= =0A= inject: function(memo, iterator) {=0A= this.each(function(value, index) {=0A= memo =3D iterator(memo, value, index);=0A= });=0A= return memo;=0A= },=0A= =0A= invoke: function(method) {=0A= var args =3D $A(arguments).slice(1);=0A= return this.map(function(value) {=0A= return value[method].apply(value, args);=0A= });=0A= },=0A= =0A= max: function(iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D (iterator || Prototype.K)(value, index);=0A= if (result =3D=3D undefined || value >=3D result)=0A= result =3D value;=0A= });=0A= return result;=0A= },=0A= =0A= min: function(iterator) {=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D (iterator || Prototype.K)(value, index);=0A= if (result =3D=3D undefined || value < result)=0A= result =3D value;=0A= });=0A= return result;=0A= },=0A= =0A= partition: function(iterator) {=0A= var trues =3D [], falses =3D [];=0A= this.each(function(value, index) {=0A= ((iterator || Prototype.K)(value, index) ?=0A= trues : falses).push(value);=0A= });=0A= return [trues, falses];=0A= },=0A= =0A= pluck: function(property) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= results.push(value[property]);=0A= });=0A= return results;=0A= },=0A= =0A= reject: function(iterator) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (!iterator(value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= },=0A= =0A= sortBy: function(iterator) {=0A= return this.map(function(value, index) {=0A= return {value: value, criteria: iterator(value, index)};=0A= }).sort(function(left, right) {=0A= var a =3D left.criteria, b =3D right.criteria;=0A= return a < b ? -1 : a > b ? 1 : 0;=0A= }).pluck('value');=0A= },=0A= =0A= toArray: function() {=0A= return this.map();=0A= },=0A= =0A= zip: function() {=0A= var iterator =3D Prototype.K, args =3D $A(arguments);=0A= if (typeof args.last() =3D=3D 'function')=0A= iterator =3D args.pop();=0A= =0A= var collections =3D [this].concat(args).map($A);=0A= return this.map(function(value, index) {=0A= return iterator(collections.pluck(index));=0A= });=0A= },=0A= =0A= size: function() {=0A= return this.toArray().length;=0A= },=0A= =0A= inspect: function() {=0A= return '#';=0A= }=0A= }=0A= =0A= Object.extend(Enumerable, {=0A= map: Enumerable.collect,=0A= find: Enumerable.detect,=0A= select: Enumerable.findAll,=0A= member: Enumerable.include,=0A= entries: Enumerable.toArray=0A= });=0A= var $A =3D Array.from =3D function(iterable) {=0A= if (!iterable) return [];=0A= if (iterable.toArray) {=0A= return iterable.toArray();=0A= } else {=0A= var results =3D [];=0A= for (var i =3D 0, length =3D iterable.length; i < length; i++)=0A= results.push(iterable[i]);=0A= return results;=0A= }=0A= }=0A= =0A= Object.extend(Array.prototype, Enumerable);=0A= =0A= if (!Array.prototype._reverse)=0A= Array.prototype._reverse =3D Array.prototype.reverse;=0A= =0A= Object.extend(Array.prototype, {=0A= _each: function(iterator) {=0A= for (var i =3D 0, length =3D this.length; i < length; i++)=0A= iterator(this[i]);=0A= },=0A= =0A= clear: function() {=0A= this.length =3D 0;=0A= return this;=0A= },=0A= =0A= first: function() {=0A= return this[0];=0A= },=0A= =0A= last: function() {=0A= return this[this.length - 1];=0A= },=0A= =0A= compact: function() {=0A= return this.select(function(value) {=0A= return value !=3D null;=0A= });=0A= },=0A= =0A= flatten: function() {=0A= return this.inject([], function(array, value) {=0A= return array.concat(value && value.constructor =3D=3D Array ?=0A= value.flatten() : [value]);=0A= });=0A= },=0A= =0A= without: function() {=0A= var values =3D $A(arguments);=0A= return this.select(function(value) {=0A= return !values.include(value);=0A= });=0A= },=0A= =0A= indexOf: function(object) {=0A= for (var i =3D 0, length =3D this.length; i < length; i++)=0A= if (this[i] =3D=3D object) return i;=0A= return -1;=0A= },=0A= =0A= reverse: function(inline) {=0A= return (inline !=3D=3D false ? this : this.toArray())._reverse();=0A= },=0A= =0A= reduce: function() {=0A= return this.length > 1 ? this : this[0];=0A= },=0A= =0A= uniq: function() {=0A= return this.inject([], function(array, value) {=0A= return array.include(value) ? array : array.concat([value]);=0A= });=0A= },=0A= =0A= clone: function() {=0A= return [].concat(this);=0A= },=0A= =0A= size: function() {=0A= return this.length;=0A= },=0A= =0A= inspect: function() {=0A= return '[' + this.map(Object.inspect).join(', ') + ']';=0A= }=0A= });=0A= =0A= Array.prototype.toArray =3D Array.prototype.clone;=0A= =0A= function $w(string){=0A= string =3D string.strip();=0A= return string ? string.split(/\s+/) : [];=0A= }=0A= =0A= if(window.opera){=0A= Array.prototype.concat =3D function(){=0A= var array =3D [];=0A= for(var i =3D 0, length =3D this.length; i < length; i++) = array.push(this[i]);=0A= for(var i =3D 0, length =3D arguments.length; i < length; i++) {=0A= if(arguments[i].constructor =3D=3D Array) {=0A= for(var j =3D 0, arrayLength =3D arguments[i].length; j < = arrayLength; j++)=0A= array.push(arguments[i][j]);=0A= } else {=0A= array.push(arguments[i]);=0A= }=0A= }=0A= return array;=0A= }=0A= }=0A= var Hash =3D function(obj) {=0A= Object.extend(this, obj || {});=0A= };=0A= =0A= Object.extend(Hash, {=0A= toQueryString: function(obj) {=0A= var parts =3D [];=0A= =0A= this.prototype._each.call(obj, function(pair) {=0A= if (!pair.key) return;=0A= =0A= if (pair.value && pair.value.constructor =3D=3D Array) {=0A= var values =3D pair.value.compact();=0A= if (values.length < 2) pair.value =3D values.reduce();=0A= else {=0A= key =3D encodeURIComponent(pair.key);=0A= values.each(function(value) {=0A= value =3D value !=3D undefined ? encodeURIComponent(value) : = '';=0A= parts.push(key + '=3D' + encodeURIComponent(value));=0A= });=0A= return;=0A= }=0A= }=0A= if (pair.value =3D=3D undefined) pair[1] =3D '';=0A= parts.push(pair.map(encodeURIComponent).join('=3D'));=0A= });=0A= =0A= return parts.join('&');=0A= }=0A= });=0A= =0A= Object.extend(Hash.prototype, Enumerable);=0A= Object.extend(Hash.prototype, {=0A= _each: function(iterator) {=0A= for (var key in this) {=0A= var value =3D this[key];=0A= if (value && value =3D=3D Hash.prototype[key]) continue;=0A= =0A= var pair =3D [key, value];=0A= pair.key =3D key;=0A= pair.value =3D value;=0A= iterator(pair);=0A= }=0A= },=0A= =0A= keys: function() {=0A= return this.pluck('key');=0A= },=0A= =0A= values: function() {=0A= return this.pluck('value');=0A= },=0A= =0A= merge: function(hash) {=0A= return $H(hash).inject(this, function(mergedHash, pair) {=0A= mergedHash[pair.key] =3D pair.value;=0A= return mergedHash;=0A= });=0A= },=0A= =0A= remove: function() {=0A= var result;=0A= for(var i =3D 0, length =3D arguments.length; i < length; i++) {=0A= var value =3D this[arguments[i]];=0A= if (value !=3D=3D undefined){=0A= if (result =3D=3D=3D undefined) result =3D value;=0A= else {=0A= if (result.constructor !=3D Array) result =3D [result];=0A= result.push(value)=0A= }=0A= }=0A= delete this[arguments[i]];=0A= }=0A= return result;=0A= },=0A= =0A= toQueryString: function() {=0A= return Hash.toQueryString(this);=0A= },=0A= =0A= inspect: function() {=0A= return '#';=0A= }=0A= });=0A= =0A= function $H(object) {=0A= if (object && object.constructor =3D=3D Hash) return object;=0A= return new Hash(object);=0A= };=0A= ObjectRange =3D Class.create();=0A= Object.extend(ObjectRange.prototype, Enumerable);=0A= Object.extend(ObjectRange.prototype, {=0A= initialize: function(start, end, exclusive) {=0A= this.start =3D start;=0A= this.end =3D end;=0A= this.exclusive =3D exclusive;=0A= },=0A= =0A= _each: function(iterator) {=0A= var value =3D this.start;=0A= while (this.include(value)) {=0A= iterator(value);=0A= value =3D value.succ();=0A= }=0A= },=0A= =0A= include: function(value) {=0A= if (value < this.start)=0A= return false;=0A= if (this.exclusive)=0A= return value < this.end;=0A= return value <=3D this.end;=0A= }=0A= });=0A= =0A= var $R =3D function(start, end, exclusive) {=0A= return new ObjectRange(start, end, exclusive);=0A= }=0A= =0A= var Ajax =3D {=0A= getTransport: function() {=0A= return Try.these(=0A= function() {return new XMLHttpRequest()},=0A= function() {return new ActiveXObject('Msxml2.XMLHTTP')},=0A= function() {return new ActiveXObject('Microsoft.XMLHTTP')}=0A= ) || false;=0A= },=0A= =0A= activeRequestCount: 0=0A= }=0A= =0A= Ajax.Responders =3D {=0A= responders: [],=0A= =0A= _each: function(iterator) {=0A= this.responders._each(iterator);=0A= },=0A= =0A= register: function(responder) {=0A= if (!this.include(responder))=0A= this.responders.push(responder);=0A= },=0A= =0A= unregister: function(responder) {=0A= this.responders =3D this.responders.without(responder);=0A= },=0A= =0A= dispatch: function(callback, request, transport, json) {=0A= this.each(function(responder) {=0A= if (typeof responder[callback] =3D=3D 'function') {=0A= try {=0A= responder[callback].apply(responder, [request, transport, = json]);=0A= } catch (e) {}=0A= }=0A= });=0A= }=0A= };=0A= =0A= Object.extend(Ajax.Responders, Enumerable);=0A= =0A= Ajax.Responders.register({=0A= onCreate: function() {=0A= Ajax.activeRequestCount++;=0A= },=0A= onComplete: function() {=0A= Ajax.activeRequestCount--;=0A= }=0A= });=0A= =0A= Ajax.Base =3D function() {};=0A= Ajax.Base.prototype =3D {=0A= setOptions: function(options) {=0A= this.options =3D {=0A= method: 'post',=0A= asynchronous: true,=0A= contentType: 'application/x-www-form-urlencoded',=0A= encoding: 'UTF-8',=0A= parameters: ''=0A= }=0A= Object.extend(this.options, options || {});=0A= =0A= this.options.method =3D this.options.method.toLowerCase();=0A= if (typeof this.options.parameters =3D=3D 'string')=0A= this.options.parameters =3D = this.options.parameters.toQueryParams();=0A= }=0A= }=0A= =0A= Ajax.Request =3D Class.create();=0A= Ajax.Request.Events =3D=0A= ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];=0A= =0A= Ajax.Request.prototype =3D Object.extend(new Ajax.Base(), {=0A= _complete: false,=0A= =0A= initialize: function(url, options) {=0A= this.transport =3D Ajax.getTransport();=0A= this.setOptions(options);=0A= this.request(url);=0A= },=0A= =0A= request: function(url) {=0A= this.url =3D url;=0A= this.method =3D this.options.method;=0A= var params =3D this.options.parameters;=0A= =0A= if (!['get', 'post'].include(this.method)) {=0A= // simulate other verbs over post=0A= params['_method'] =3D this.method;=0A= this.method =3D 'post';=0A= }=0A= =0A= params =3D Hash.toQueryString(params);=0A= if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) = params +=3D '&_=3D'=0A= =0A= // when GET, append parameters to URL=0A= if (this.method =3D=3D 'get' && params)=0A= this.url +=3D (this.url.indexOf('?') > -1 ? '&' : '?') + params;=0A= =0A= try {=0A= Ajax.Responders.dispatch('onCreate', this, this.transport);=0A= =0A= this.transport.open(this.method.toUpperCase(), this.url,=0A= this.options.asynchronous);=0A= =0A= if (this.options.asynchronous)=0A= setTimeout(function() { this.respondToReadyState(1) = }.bind(this), 10);=0A= =0A= this.transport.onreadystatechange =3D = this.onStateChange.bind(this);=0A= this.setRequestHeaders();=0A= =0A= var body =3D this.method =3D=3D 'post' ? (this.options.postBody || = params) : null;=0A= =0A= this.transport.send(body);=0A= =0A= /* Force Firefox to handle ready state 4 for synchronous requests = */=0A= if (!this.options.asynchronous && this.transport.overrideMimeType)=0A= this.onStateChange();=0A= =0A= }=0A= catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= onStateChange: function() {=0A= var readyState =3D this.transport.readyState;=0A= if (readyState > 1 && !((readyState =3D=3D 4) && this._complete))=0A= this.respondToReadyState(this.transport.readyState);=0A= },=0A= =0A= setRequestHeaders: function() {=0A= var headers =3D {=0A= 'X-Requested-With': 'XMLHttpRequest',=0A= 'X-Prototype-Version': Prototype.Version,=0A= 'Accept': 'text/javascript, text/html, application/xml, text/xml, = */*'=0A= };=0A= =0A= if (this.method =3D=3D 'post') {=0A= headers['Content-type'] =3D this.options.contentType +=0A= (this.options.encoding ? '; charset=3D' + this.options.encoding = : '');=0A= =0A= /* Force "Connection: close" for older Mozilla browsers to work=0A= * around a bug where XMLHttpRequest sends an incorrect=0A= * Content-length header. See Mozilla Bugzilla #246651.=0A= */=0A= if (this.transport.overrideMimeType &&=0A= (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < = 2005)=0A= headers['Connection'] =3D 'close';=0A= }=0A= =0A= // user-defined headers=0A= if (typeof this.options.requestHeaders =3D=3D 'object') {=0A= var extras =3D this.options.requestHeaders;=0A= =0A= if (typeof extras.push =3D=3D 'function')=0A= for (var i =3D 0, length =3D extras.length; i < length; i +=3D 2)=0A= headers[extras[i]] =3D extras[i+1];=0A= else=0A= $H(extras).each(function(pair) { headers[pair.key] =3D = pair.value });=0A= }=0A= =0A= for (var name in headers)=0A= this.transport.setRequestHeader(name, headers[name]);=0A= },=0A= =0A= success: function() {=0A= return !this.transport.status=0A= || (this.transport.status >=3D 200 && this.transport.status < = 300);=0A= },=0A= =0A= respondToReadyState: function(readyState) {=0A= var state =3D Ajax.Request.Events[readyState];=0A= var transport =3D this.transport, json =3D this.evalJSON();=0A= =0A= if (state =3D=3D 'Complete') {=0A= try {=0A= this._complete =3D true;=0A= (this.options['on' + this.transport.status]=0A= || this.options['on' + (this.success() ? 'Success' : 'Failure')]=0A= || Prototype.emptyFunction)(transport, json);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= if ((this.getHeader('Content-type') || 'text/javascript').strip().=0A= match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))=0A= this.evalResponse();=0A= }=0A= =0A= try {=0A= (this.options['on' + state] || Prototype.emptyFunction)(transport, = json);=0A= Ajax.Responders.dispatch('on' + state, this, transport, json);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= if (state =3D=3D 'Complete') {=0A= // avoid memory leak in MSIE: clean up=0A= this.transport.onreadystatechange =3D Prototype.emptyFunction;=0A= }=0A= },=0A= =0A= getHeader: function(name) {=0A= try {=0A= return this.transport.getResponseHeader(name);=0A= } catch (e) { return null }=0A= },=0A= =0A= evalJSON: function() {=0A= try {=0A= var json =3D this.getHeader('X-JSON');=0A= return json ? eval('(' + json + ')') : null;=0A= } catch (e) { return null }=0A= },=0A= =0A= evalResponse: function() {=0A= try {=0A= return eval(this.transport.responseText);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= dispatchException: function(exception) {=0A= (this.options.onException || Prototype.emptyFunction)(this, = exception);=0A= Ajax.Responders.dispatch('onException', this, exception);=0A= }=0A= });=0A= =0A= Ajax.Updater =3D Class.create();=0A= =0A= Object.extend(Object.extend(Ajax.Updater.prototype, = Ajax.Request.prototype), {=0A= initialize: function(container, url, options) {=0A= this.container =3D {=0A= success: (container.success || container),=0A= failure: (container.failure || (container.success ? null : = container))=0A= }=0A= =0A= this.transport =3D Ajax.getTransport();=0A= this.setOptions(options);=0A= =0A= var onComplete =3D this.options.onComplete || = Prototype.emptyFunction;=0A= this.options.onComplete =3D (function(transport, param) {=0A= this.updateContent();=0A= onComplete(transport, param);=0A= }).bind(this);=0A= =0A= this.request(url);=0A= },=0A= =0A= updateContent: function() {=0A= var receiver =3D this.container[this.success() ? 'success' : = 'failure'];=0A= var response =3D this.transport.responseText;=0A= =0A= if (!this.options.evalScripts) response =3D response.stripScripts();=0A= =0A= if (receiver =3D $(receiver)) {=0A= if (this.options.insertion)=0A= new this.options.insertion(receiver, response);=0A= else=0A= receiver.update(response);=0A= }=0A= =0A= if (this.success()) {=0A= if (this.onComplete)=0A= setTimeout(this.onComplete.bind(this), 10);=0A= }=0A= }=0A= });=0A= =0A= Ajax.PeriodicalUpdater =3D Class.create();=0A= Ajax.PeriodicalUpdater.prototype =3D Object.extend(new Ajax.Base(), {=0A= initialize: function(container, url, options) {=0A= this.setOptions(options);=0A= this.onComplete =3D this.options.onComplete;=0A= =0A= this.frequency =3D (this.options.frequency || 2);=0A= this.decay =3D (this.options.decay || 1);=0A= =0A= this.updater =3D {};=0A= this.container =3D container;=0A= this.url =3D url;=0A= =0A= this.start();=0A= },=0A= =0A= start: function() {=0A= this.options.onComplete =3D this.updateComplete.bind(this);=0A= this.onTimerEvent();=0A= },=0A= =0A= stop: function() {=0A= this.updater.options.onComplete =3D undefined;=0A= clearTimeout(this.timer);=0A= (this.onComplete || Prototype.emptyFunction).apply(this, arguments);=0A= },=0A= =0A= updateComplete: function(request) {=0A= if (this.options.decay) {=0A= this.decay =3D (request.responseText =3D=3D this.lastText ?=0A= this.decay * this.options.decay : 1);=0A= =0A= this.lastText =3D request.responseText;=0A= }=0A= this.timer =3D setTimeout(this.onTimerEvent.bind(this),=0A= this.decay * this.frequency * 1000);=0A= },=0A= =0A= onTimerEvent: function() {=0A= this.updater =3D new Ajax.Updater(this.container, this.url, = this.options);=0A= }=0A= });=0A= function $(element) {=0A= if (arguments.length > 1) {=0A= for (var i =3D 0, elements =3D [], length =3D arguments.length; i < = length; i++)=0A= elements.push($(arguments[i]));=0A= return elements;=0A= }=0A= if (typeof element =3D=3D 'string')=0A= element =3D document.getElementById(element);=0A= return Element.extend(element);=0A= }=0A= =0A= if (Prototype.BrowserFeatures.XPath) {=0A= document._getElementsByXPath =3D function(expression, parentElement) {=0A= var results =3D [];=0A= var query =3D document.evaluate(expression, $(parentElement) || = document,=0A= null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);=0A= for (var i =3D 0, length =3D query.snapshotLength; i < length; i++)=0A= results.push(query.snapshotItem(i));=0A= return results;=0A= };=0A= }=0A= =0A= document.getElementsByClassName =3D function(className, parentElement) {=0A= if (Prototype.BrowserFeatures.XPath) {=0A= var q =3D ".//*[contains(concat(' ', @class, ' '), ' " + className + = " ')]";=0A= return document._getElementsByXPath(q, parentElement);=0A= } else {=0A= var children =3D ($(parentElement) || = document.body).getElementsByTagName('*');=0A= var elements =3D [], child;=0A= for (var i =3D 0, length =3D children.length; i < length; i++) {=0A= child =3D children[i];=0A= if (Element.hasClassName(child, className))=0A= elements.push(Element.extend(child));=0A= }=0A= return elements;=0A= }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= if (!window.Element)=0A= var Element =3D new Object();=0A= =0A= Element.extend =3D function(element) {=0A= if (!element || _nativeExtensions || element.nodeType =3D=3D 3) return = element;=0A= =0A= if (!element._extended && element.tagName && element !=3D window) {=0A= var methods =3D Object.clone(Element.Methods), cache =3D = Element.extend.cache;=0A= =0A= if (element.tagName =3D=3D 'FORM')=0A= Object.extend(methods, Form.Methods);=0A= if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))=0A= Object.extend(methods, Form.Element.Methods);=0A= =0A= Object.extend(methods, Element.Methods.Simulated);=0A= =0A= for (var property in methods) {=0A= var value =3D methods[property];=0A= if (typeof value =3D=3D 'function' && !(property in element))=0A= element[property] =3D cache.findOrStore(value);=0A= }=0A= }=0A= =0A= element._extended =3D true;=0A= return element;=0A= };=0A= =0A= Element.extend.cache =3D {=0A= findOrStore: function(value) {=0A= return this[value] =3D this[value] || function() {=0A= return value.apply(null, [this].concat($A(arguments)));=0A= }=0A= }=0A= };=0A= =0A= Element.Methods =3D {=0A= visible: function(element) {=0A= return $(element).style.display !=3D 'none';=0A= },=0A= =0A= toggle: function(element) {=0A= element =3D $(element);=0A= Element[Element.visible(element) ? 'hide' : 'show'](element);=0A= return element;=0A= },=0A= =0A= hide: function(element) {=0A= $(element).style.display =3D 'none';=0A= return element;=0A= },=0A= =0A= show: function(element) {=0A= $(element).style.display =3D '';=0A= return element;=0A= },=0A= =0A= remove: function(element) {=0A= element =3D $(element);=0A= element.parentNode.removeChild(element);=0A= return element;=0A= },=0A= =0A= update: function(element, html) {=0A= html =3D typeof html =3D=3D 'undefined' ? '' : html.toString();=0A= $(element).innerHTML =3D html.stripScripts();=0A= setTimeout(function() {html.evalScripts()}, 10);=0A= return element;=0A= },=0A= =0A= replace: function(element, html) {=0A= element =3D $(element);=0A= html =3D typeof html =3D=3D 'undefined' ? '' : html.toString();=0A= if (element.outerHTML) {=0A= element.outerHTML =3D html.stripScripts();=0A= } else {=0A= var range =3D element.ownerDocument.createRange();=0A= range.selectNodeContents(element);=0A= element.parentNode.replaceChild(=0A= range.createContextualFragment(html.stripScripts()), element);=0A= }=0A= setTimeout(function() {html.evalScripts()}, 10);=0A= return element;=0A= },=0A= =0A= inspect: function(element) {=0A= element =3D $(element);=0A= var result =3D '<' + element.tagName.toLowerCase();=0A= $H({'id': 'id', 'className': 'class'}).each(function(pair) {=0A= var property =3D pair.first(), attribute =3D pair.last();=0A= var value =3D (element[property] || '').toString();=0A= if (value) result +=3D ' ' + attribute + '=3D' + = value.inspect(true);=0A= });=0A= return result + '>';=0A= },=0A= =0A= recursivelyCollect: function(element, property) {=0A= element =3D $(element);=0A= var elements =3D [];=0A= while (element =3D element[property])=0A= if (element.nodeType =3D=3D 1)=0A= elements.push(Element.extend(element));=0A= return elements;=0A= },=0A= =0A= ancestors: function(element) {=0A= return $(element).recursivelyCollect('parentNode');=0A= },=0A= =0A= descendants: function(element) {=0A= return $A($(element).getElementsByTagName('*'));=0A= },=0A= =0A= immediateDescendants: function(element) {=0A= if (!(element =3D $(element).firstChild)) return [];=0A= while (element && element.nodeType !=3D 1) element =3D = element.nextSibling;=0A= if (element) return [element].concat($(element).nextSiblings());=0A= return [];=0A= },=0A= =0A= previousSiblings: function(element) {=0A= return $(element).recursivelyCollect('previousSibling');=0A= },=0A= =0A= nextSiblings: function(element) {=0A= return $(element).recursivelyCollect('nextSibling');=0A= },=0A= =0A= siblings: function(element) {=0A= element =3D $(element);=0A= return = element.previousSiblings().reverse().concat(element.nextSiblings());=0A= },=0A= =0A= match: function(element, selector) {=0A= if (typeof selector =3D=3D 'string')=0A= selector =3D new Selector(selector);=0A= return selector.match($(element));=0A= },=0A= =0A= up: function(element, expression, index) {=0A= return Selector.findElement($(element).ancestors(), expression, = index);=0A= },=0A= =0A= down: function(element, expression, index) {=0A= return Selector.findElement($(element).descendants(), expression, = index);=0A= },=0A= =0A= previous: function(element, expression, index) {=0A= return Selector.findElement($(element).previousSiblings(), = expression, index);=0A= },=0A= =0A= next: function(element, expression, index) {=0A= return Selector.findElement($(element).nextSiblings(), expression, = index);=0A= },=0A= =0A= getElementsBySelector: function() {=0A= var args =3D $A(arguments), element =3D $(args.shift());=0A= return Selector.findChildElements(element, args);=0A= },=0A= =0A= getElementsByClassName: function(element, className) {=0A= return document.getElementsByClassName(className, element);=0A= },=0A= =0A= readAttribute: function(element, name) {=0A= element =3D $(element);=0A= if (document.all && !window.opera) {=0A= var t =3D Element._attributeTranslations;=0A= if (t.values[name]) return t.values[name](element, name);=0A= if (t.names[name]) name =3D t.names[name];=0A= var attribute =3D element.attributes[name];=0A= if(attribute) return attribute.nodeValue;=0A= }=0A= return element.getAttribute(name);=0A= },=0A= =0A= getHeight: function(element) {=0A= return $(element).getDimensions().height;=0A= },=0A= =0A= getWidth: function(element) {=0A= return $(element).getDimensions().width;=0A= },=0A= =0A= classNames: function(element) {=0A= return new Element.ClassNames(element);=0A= },=0A= =0A= hasClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= var elementClassName =3D element.className;=0A= if (elementClassName.length =3D=3D 0) return false;=0A= if (elementClassName =3D=3D className ||=0A= elementClassName.match(new RegExp("(^|\\s)" + className + = "(\\s|$)")))=0A= return true;=0A= return false;=0A= },=0A= =0A= addClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= Element.classNames(element).add(className);=0A= return element;=0A= },=0A= =0A= removeClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= Element.classNames(element).remove(className);=0A= return element;=0A= },=0A= =0A= toggleClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= Element.classNames(element)[element.hasClassName(className) ? = 'remove' : 'add'](className);=0A= return element;=0A= },=0A= =0A= observe: function() {=0A= Event.observe.apply(Event, arguments);=0A= return $A(arguments).first();=0A= },=0A= =0A= stopObserving: function() {=0A= Event.stopObserving.apply(Event, arguments);=0A= return $A(arguments).first();=0A= },=0A= =0A= // removes whitespace-only text node children=0A= cleanWhitespace: function(element) {=0A= element =3D $(element);=0A= var node =3D element.firstChild;=0A= while (node) {=0A= var nextNode =3D node.nextSibling;=0A= if (node.nodeType =3D=3D 3 && !/\S/.test(node.nodeValue))=0A= element.removeChild(node);=0A= node =3D nextNode;=0A= }=0A= return element;=0A= },=0A= =0A= empty: function(element) {=0A= return $(element).innerHTML.match(/^\s*$/);=0A= },=0A= =0A= descendantOf: function(element, ancestor) {=0A= element =3D $(element), ancestor =3D $(ancestor);=0A= while (element =3D element.parentNode)=0A= if (element =3D=3D ancestor) return true;=0A= return false;=0A= },=0A= =0A= scrollTo: function(element) {=0A= element =3D $(element);=0A= var pos =3D Position.cumulativeOffset(element);=0A= window.scrollTo(pos[0], pos[1]);=0A= return element;=0A= },=0A= =0A= getStyle: function(element, style) {=0A= element =3D $(element);=0A= if (['float','cssFloat'].include(style))=0A= style =3D (typeof element.style.styleFloat !=3D 'undefined' ? = 'styleFloat' : 'cssFloat');=0A= style =3D style.camelize();=0A= var value =3D element.style[style];=0A= if (!value) {=0A= if (document.defaultView && document.defaultView.getComputedStyle) = {=0A= var css =3D document.defaultView.getComputedStyle(element, null);=0A= value =3D css ? css[style] : null;=0A= } else if (element.currentStyle) {=0A= value =3D element.currentStyle[style];=0A= }=0A= }=0A= =0A= if((value =3D=3D 'auto') && ['width','height'].include(style) && = (element.getStyle('display') !=3D 'none'))=0A= value =3D element['offset'+style.capitalize()] + 'px';=0A= =0A= if (window.opera && ['left', 'top', 'right', = 'bottom'].include(style))=0A= if (Element.getStyle(element, 'position') =3D=3D 'static') value = =3D 'auto';=0A= if(style =3D=3D 'opacity') {=0A= if(value) return parseFloat(value);=0A= if(value =3D (element.getStyle('filter') || = '').match(/alpha\(opacity=3D(.*)\)/))=0A= if(value[1]) return parseFloat(value[1]) / 100;=0A= return 1.0;=0A= }=0A= return value =3D=3D 'auto' ? null : value;=0A= },=0A= =0A= setStyle: function(element, style) {=0A= element =3D $(element);=0A= for (var name in style) {=0A= var value =3D style[name];=0A= if(name =3D=3D 'opacity') {=0A= if (value =3D=3D 1) {=0A= value =3D (/Gecko/.test(navigator.userAgent) &&=0A= !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? = 0.999999 : 1.0;=0A= if(/MSIE/.test(navigator.userAgent) && !window.opera)=0A= element.style.filter =3D = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');=0A= } else if(value =3D=3D=3D '') {=0A= if(/MSIE/.test(navigator.userAgent) && !window.opera)=0A= element.style.filter =3D = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');=0A= } else {=0A= if(value < 0.00001) value =3D 0;=0A= if(/MSIE/.test(navigator.userAgent) && !window.opera)=0A= element.style.filter =3D = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +=0A= 'alpha(opacity=3D'+value*100+')';=0A= }=0A= } else if(['float','cssFloat'].include(name)) name =3D (typeof = element.style.styleFloat !=3D 'undefined') ? 'styleFloat' : 'cssFloat';=0A= element.style[name.camelize()] =3D value;=0A= }=0A= return element;=0A= },=0A= =0A= getDimensions: function(element) {=0A= element =3D $(element);=0A= var display =3D $(element).getStyle('display');=0A= if (display !=3D 'none' && display !=3D null) // Safari bug=0A= return {width: element.offsetWidth, height: element.offsetHeight};=0A= =0A= // All *Width and *Height properties give 0 on elements with display = none,=0A= // so enable the element temporarily=0A= var els =3D element.style;=0A= var originalVisibility =3D els.visibility;=0A= var originalPosition =3D els.position;=0A= var originalDisplay =3D els.display;=0A= els.visibility =3D 'hidden';=0A= els.position =3D 'absolute';=0A= els.display =3D 'block';=0A= var originalWidth =3D element.clientWidth;=0A= var originalHeight =3D element.clientHeight;=0A= els.display =3D originalDisplay;=0A= els.position =3D originalPosition;=0A= els.visibility =3D originalVisibility;=0A= return {width: originalWidth, height: originalHeight};=0A= },=0A= =0A= makePositioned: function(element) {=0A= element =3D $(element);=0A= var pos =3D Element.getStyle(element, 'position');=0A= if (pos =3D=3D 'static' || !pos) {=0A= element._madePositioned =3D true;=0A= element.style.position =3D 'relative';=0A= // Opera returns the offset relative to the positioning context, = when an=0A= // element is position relative but top and left have not been = defined=0A= if (window.opera) {=0A= element.style.top =3D 0;=0A= element.style.left =3D 0;=0A= }=0A= }=0A= return element;=0A= },=0A= =0A= undoPositioned: function(element) {=0A= element =3D $(element);=0A= if (element._madePositioned) {=0A= element._madePositioned =3D undefined;=0A= element.style.position =3D=0A= element.style.top =3D=0A= element.style.left =3D=0A= element.style.bottom =3D=0A= element.style.right =3D '';=0A= }=0A= return element;=0A= },=0A= =0A= makeClipping: function(element) {=0A= element =3D $(element);=0A= if (element._overflow) return element;=0A= element._overflow =3D element.style.overflow || 'auto';=0A= if ((Element.getStyle(element, 'overflow') || 'visible') !=3D = 'hidden')=0A= element.style.overflow =3D 'hidden';=0A= return element;=0A= },=0A= =0A= undoClipping: function(element) {=0A= element =3D $(element);=0A= if (!element._overflow) return element;=0A= element.style.overflow =3D element._overflow =3D=3D 'auto' ? '' : = element._overflow;=0A= element._overflow =3D null;=0A= return element;=0A= }=0A= };=0A= =0A= Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});=0A= =0A= Element._attributeTranslations =3D {};=0A= =0A= Element._attributeTranslations.names =3D {=0A= colspan: "colSpan",=0A= rowspan: "rowSpan",=0A= valign: "vAlign",=0A= datetime: "dateTime",=0A= accesskey: "accessKey",=0A= tabindex: "tabIndex",=0A= enctype: "encType",=0A= maxlength: "maxLength",=0A= readonly: "readOnly",=0A= longdesc: "longDesc"=0A= };=0A= =0A= Element._attributeTranslations.values =3D {=0A= _getAttr: function(element, attribute) {=0A= return element.getAttribute(attribute, 2);=0A= },=0A= =0A= _flag: function(element, attribute) {=0A= return $(element).hasAttribute(attribute) ? attribute : null;=0A= },=0A= =0A= style: function(element) {=0A= return element.style.cssText.toLowerCase();=0A= },=0A= =0A= title: function(element) {=0A= var node =3D element.getAttributeNode('title');=0A= return node.specified ? node.nodeValue : null;=0A= }=0A= };=0A= =0A= Object.extend(Element._attributeTranslations.values, {=0A= href: Element._attributeTranslations.values._getAttr,=0A= src: Element._attributeTranslations.values._getAttr,=0A= disabled: Element._attributeTranslations.values._flag,=0A= checked: Element._attributeTranslations.values._flag,=0A= readonly: Element._attributeTranslations.values._flag,=0A= multiple: Element._attributeTranslations.values._flag=0A= });=0A= =0A= Element.Methods.Simulated =3D {=0A= hasAttribute: function(element, attribute) {=0A= var t =3D Element._attributeTranslations;=0A= attribute =3D t.names[attribute] || attribute;=0A= return $(element).getAttributeNode(attribute).specified;=0A= }=0A= };=0A= =0A= // IE is missing .innerHTML support for TABLE-related elements=0A= if (document.all && !window.opera){=0A= Element.Methods.update =3D function(element, html) {=0A= element =3D $(element);=0A= html =3D typeof html =3D=3D 'undefined' ? '' : html.toString();=0A= var tagName =3D element.tagName.toUpperCase();=0A= if (['THEAD','TBODY','TR','TD'].include(tagName)) {=0A= var div =3D document.createElement('div');=0A= switch (tagName) {=0A= case 'THEAD':=0A= case 'TBODY':=0A= div.innerHTML =3D '' + html.stripScripts() + = '
    ';=0A= depth =3D 2;=0A= break;=0A= case 'TR':=0A= div.innerHTML =3D '' + html.stripScripts() = + '
    ';=0A= depth =3D 3;=0A= break;=0A= case 'TD':=0A= div.innerHTML =3D '
    ' + = html.stripScripts() + '
    ';=0A= depth =3D 4;=0A= }=0A= $A(element.childNodes).each(function(node){=0A= element.removeChild(node)=0A= });=0A= depth.times(function(){ div =3D div.firstChild });=0A= =0A= $A(div.childNodes).each(=0A= function(node){ element.appendChild(node) });=0A= } else {=0A= element.innerHTML =3D html.stripScripts();=0A= }=0A= setTimeout(function() {html.evalScripts()}, 10);=0A= return element;=0A= }=0A= };=0A= =0A= Object.extend(Element, Element.Methods);=0A= =0A= var _nativeExtensions =3D false;=0A= =0A= if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))=0A= ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {=0A= var className =3D 'HTML' + tag + 'Element';=0A= if(window[className]) return;=0A= var klass =3D window[className] =3D {};=0A= klass.prototype =3D document.createElement(tag ? tag.toLowerCase() : = 'div').__proto__;=0A= });=0A= =0A= Element.addMethods =3D function(methods) {=0A= Object.extend(Element.Methods, methods || {});=0A= =0A= function copy(methods, destination, onlyIfAbsent) {=0A= onlyIfAbsent =3D onlyIfAbsent || false;=0A= var cache =3D Element.extend.cache;=0A= for (var property in methods) {=0A= var value =3D methods[property];=0A= if (!onlyIfAbsent || !(property in destination))=0A= destination[property] =3D cache.findOrStore(value);=0A= }=0A= }=0A= =0A= if (typeof HTMLElement !=3D 'undefined') {=0A= copy(Element.Methods, HTMLElement.prototype);=0A= copy(Element.Methods.Simulated, HTMLElement.prototype, true);=0A= copy(Form.Methods, HTMLFormElement.prototype);=0A= [HTMLInputElement, HTMLTextAreaElement, = HTMLSelectElement].each(function(klass) {=0A= copy(Form.Element.Methods, klass.prototype);=0A= });=0A= _nativeExtensions =3D true;=0A= }=0A= }=0A= =0A= var Toggle =3D new Object();=0A= Toggle.display =3D Element.toggle;=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.Insertion =3D function(adjacency) {=0A= this.adjacency =3D adjacency;=0A= }=0A= =0A= Abstract.Insertion.prototype =3D {=0A= initialize: function(element, content) {=0A= this.element =3D $(element);=0A= this.content =3D content.stripScripts();=0A= =0A= if (this.adjacency && this.element.insertAdjacentHTML) {=0A= try {=0A= this.element.insertAdjacentHTML(this.adjacency, this.content);=0A= } catch (e) {=0A= var tagName =3D this.element.tagName.toUpperCase();=0A= if (['TBODY', 'TR'].include(tagName)) {=0A= this.insertContent(this.contentFromAnonymousTable());=0A= } else {=0A= throw e;=0A= }=0A= }=0A= } else {=0A= this.range =3D this.element.ownerDocument.createRange();=0A= if (this.initializeRange) this.initializeRange();=0A= = this.insertContent([this.range.createContextualFragment(this.content)]);=0A= }=0A= =0A= setTimeout(function() {content.evalScripts()}, 10);=0A= },=0A= =0A= contentFromAnonymousTable: function() {=0A= var div =3D document.createElement('div');=0A= div.innerHTML =3D '' + this.content + = '
    ';=0A= return $A(div.childNodes[0].childNodes[0].childNodes);=0A= }=0A= }=0A= =0A= var Insertion =3D new Object();=0A= =0A= Insertion.Before =3D Class.create();=0A= Insertion.Before.prototype =3D Object.extend(new = Abstract.Insertion('beforeBegin'), {=0A= initializeRange: function() {=0A= this.range.setStartBefore(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.parentNode.insertBefore(fragment, this.element);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.Top =3D Class.create();=0A= Insertion.Top.prototype =3D Object.extend(new = Abstract.Insertion('afterBegin'), {=0A= initializeRange: function() {=0A= this.range.selectNodeContents(this.element);=0A= this.range.collapse(true);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.reverse(false).each((function(fragment) {=0A= this.element.insertBefore(fragment, this.element.firstChild);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.Bottom =3D Class.create();=0A= Insertion.Bottom.prototype =3D Object.extend(new = Abstract.Insertion('beforeEnd'), {=0A= initializeRange: function() {=0A= this.range.selectNodeContents(this.element);=0A= this.range.collapse(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.appendChild(fragment);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= Insertion.After =3D Class.create();=0A= Insertion.After.prototype =3D Object.extend(new = Abstract.Insertion('afterEnd'), {=0A= initializeRange: function() {=0A= this.range.setStartAfter(this.element);=0A= },=0A= =0A= insertContent: function(fragments) {=0A= fragments.each((function(fragment) {=0A= this.element.parentNode.insertBefore(fragment,=0A= this.element.nextSibling);=0A= }).bind(this));=0A= }=0A= });=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Element.ClassNames =3D Class.create();=0A= Element.ClassNames.prototype =3D {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= },=0A= =0A= _each: function(iterator) {=0A= this.element.className.split(/\s+/).select(function(name) {=0A= return name.length > 0;=0A= })._each(iterator);=0A= },=0A= =0A= set: function(className) {=0A= this.element.className =3D className;=0A= },=0A= =0A= add: function(classNameToAdd) {=0A= if (this.include(classNameToAdd)) return;=0A= this.set($A(this).concat(classNameToAdd).join(' '));=0A= },=0A= =0A= remove: function(classNameToRemove) {=0A= if (!this.include(classNameToRemove)) return;=0A= this.set($A(this).without(classNameToRemove).join(' '));=0A= },=0A= =0A= toString: function() {=0A= return $A(this).join(' ');=0A= }=0A= };=0A= =0A= Object.extend(Element.ClassNames.prototype, Enumerable);=0A= var Selector =3D Class.create();=0A= Selector.prototype =3D {=0A= initialize: function(expression) {=0A= this.params =3D {classNames: []};=0A= this.expression =3D expression.toString().strip();=0A= this.parseExpression();=0A= this.compileMatcher();=0A= },=0A= =0A= parseExpression: function() {=0A= function abort(message) { throw 'Parse error in selector: ' + = message; }=0A= =0A= if (this.expression =3D=3D '') abort('empty expression');=0A= =0A= var params =3D this.params, expr =3D this.expression, match, = modifier, clause, rest;=0A= while (match =3D = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=3D)(?:"([^"]*)"|([^\]\s]*))= )?\]$/i)) {=0A= params.attributes =3D params.attributes || [];=0A= params.attributes.push({name: match[2], operator: match[3], value: = match[4] || match[5] || ''});=0A= expr =3D match[1];=0A= }=0A= =0A= if (expr =3D=3D '*') return this.params.wildcard =3D true;=0A= =0A= while (match =3D expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {=0A= modifier =3D match[1], clause =3D match[2], rest =3D match[3];=0A= switch (modifier) {=0A= case '#': params.id =3D clause; break;=0A= case '.': params.classNames.push(clause); break;=0A= case '':=0A= case undefined: params.tagName =3D clause.toUpperCase(); break;=0A= default: abort(expr.inspect());=0A= }=0A= expr =3D rest;=0A= }=0A= =0A= if (expr.length > 0) abort(expr.inspect());=0A= },=0A= =0A= buildMatchExpression: function() {=0A= var params =3D this.params, conditions =3D [], clause;=0A= =0A= if (params.wildcard)=0A= conditions.push('true');=0A= if (clause =3D params.id)=0A= conditions.push('element.readAttribute("id") =3D=3D ' + = clause.inspect());=0A= if (clause =3D params.tagName)=0A= conditions.push('element.tagName.toUpperCase() =3D=3D ' + = clause.inspect());=0A= if ((clause =3D params.classNames).length > 0)=0A= for (var i =3D 0, length =3D clause.length; i < length; i++)=0A= conditions.push('element.hasClassName(' + clause[i].inspect() + = ')');=0A= if (clause =3D params.attributes) {=0A= clause.each(function(attribute) {=0A= var value =3D 'element.readAttribute(' + = attribute.name.inspect() + ')';=0A= var splitValueBy =3D function(delimiter) {=0A= return value + ' && ' + value + '.split(' + = delimiter.inspect() + ')';=0A= }=0A= =0A= switch (attribute.operator) {=0A= case '=3D': conditions.push(value + ' =3D=3D ' + = attribute.value.inspect()); break;=0A= case '~=3D': conditions.push(splitValueBy(' ') + = '.include(' + attribute.value.inspect() + ')'); break;=0A= case '|=3D': conditions.push(=0A= splitValueBy('-') + '.first().toUpperCase() = =3D=3D ' + attribute.value.toUpperCase().inspect()=0A= ); break;=0A= case '!=3D': conditions.push(value + ' !=3D ' + = attribute.value.inspect()); break;=0A= case '':=0A= case undefined: conditions.push('element.hasAttribute(' + = attribute.name.inspect() + ')'); break;=0A= default: throw 'Unknown operator ' + attribute.operator = + ' in selector';=0A= }=0A= });=0A= }=0A= =0A= return conditions.join(' && ');=0A= },=0A= =0A= compileMatcher: function() {=0A= this.match =3D new Function('element', 'if (!element.tagName) return = false; \=0A= element =3D $(element); \=0A= return ' + this.buildMatchExpression());=0A= },=0A= =0A= findElements: function(scope) {=0A= var element;=0A= =0A= if (element =3D $(this.params.id))=0A= if (this.match(element))=0A= if (!scope || Element.childOf(element, scope))=0A= return [element];=0A= =0A= scope =3D (scope || = document).getElementsByTagName(this.params.tagName || '*');=0A= =0A= var results =3D [];=0A= for (var i =3D 0, length =3D scope.length; i < length; i++)=0A= if (this.match(element =3D scope[i]))=0A= results.push(Element.extend(element));=0A= =0A= return results;=0A= },=0A= =0A= toString: function() {=0A= return this.expression;=0A= }=0A= }=0A= =0A= Object.extend(Selector, {=0A= matchElements: function(elements, expression) {=0A= var selector =3D new Selector(expression);=0A= return = elements.select(selector.match.bind(selector)).map(Element.extend);=0A= },=0A= =0A= findElement: function(elements, expression, index) {=0A= if (typeof expression =3D=3D 'number') index =3D expression, = expression =3D false;=0A= return Selector.matchElements(elements, expression || '*')[index || = 0];=0A= },=0A= =0A= findChildElements: function(element, expressions) {=0A= return expressions.map(function(expression) {=0A= return = expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], = function(results, expr) {=0A= var selector =3D new Selector(expr);=0A= return results.inject([], function(elements, result) {=0A= return elements.concat(selector.findElements(result || = element));=0A= });=0A= });=0A= }).flatten();=0A= }=0A= });=0A= =0A= function $$() {=0A= return Selector.findChildElements(document, $A(arguments));=0A= }=0A= var Form =3D {=0A= reset: function(form) {=0A= $(form).reset();=0A= return form;=0A= },=0A= =0A= serializeElements: function(elements, getHash) {=0A= var data =3D elements.inject({}, function(result, element) {=0A= if (!element.disabled && element.name) {=0A= var key =3D element.name, value =3D $(element).getValue();=0A= if (value !=3D undefined) {=0A= if (result[key]) {=0A= if (result[key].constructor !=3D Array) result[key] =3D = [result[key]];=0A= result[key].push(value);=0A= }=0A= else result[key] =3D value;=0A= }=0A= }=0A= return result;=0A= });=0A= =0A= return getHash ? data : Hash.toQueryString(data);=0A= }=0A= };=0A= =0A= Form.Methods =3D {=0A= serialize: function(form, getHash) {=0A= return Form.serializeElements(Form.getElements(form), getHash);=0A= },=0A= =0A= getElements: function(form) {=0A= return $A($(form).getElementsByTagName('*')).inject([],=0A= function(elements, child) {=0A= if (Form.Element.Serializers[child.tagName.toLowerCase()])=0A= elements.push(Element.extend(child));=0A= return elements;=0A= }=0A= );=0A= },=0A= =0A= getInputs: function(form, typeName, name) {=0A= form =3D $(form);=0A= var inputs =3D form.getElementsByTagName('input');=0A= =0A= if (!typeName && !name) return $A(inputs).map(Element.extend);=0A= =0A= for (var i =3D 0, matchingInputs =3D [], length =3D inputs.length; i = < length; i++) {=0A= var input =3D inputs[i];=0A= if ((typeName && input.type !=3D typeName) || (name && input.name = !=3D name))=0A= continue;=0A= matchingInputs.push(Element.extend(input));=0A= }=0A= =0A= return matchingInputs;=0A= },=0A= =0A= disable: function(form) {=0A= form =3D $(form);=0A= form.getElements().each(function(element) {=0A= element.blur();=0A= element.disabled =3D 'true';=0A= });=0A= return form;=0A= },=0A= =0A= enable: function(form) {=0A= form =3D $(form);=0A= form.getElements().each(function(element) {=0A= element.disabled =3D '';=0A= });=0A= return form;=0A= },=0A= =0A= findFirstElement: function(form) {=0A= return $(form).getElements().find(function(element) {=0A= return element.type !=3D 'hidden' && !element.disabled &&=0A= ['input', 'select', = 'textarea'].include(element.tagName.toLowerCase());=0A= });=0A= },=0A= =0A= focusFirstElement: function(form) {=0A= form =3D $(form);=0A= form.findFirstElement().activate();=0A= return form;=0A= }=0A= }=0A= =0A= Object.extend(Form, Form.Methods);=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Form.Element =3D {=0A= focus: function(element) {=0A= $(element).focus();=0A= return element;=0A= },=0A= =0A= select: function(element) {=0A= $(element).select();=0A= return element;=0A= }=0A= }=0A= =0A= Form.Element.Methods =3D {=0A= serialize: function(element) {=0A= element =3D $(element);=0A= if (!element.disabled && element.name) {=0A= var value =3D element.getValue();=0A= if (value !=3D undefined) {=0A= var pair =3D {};=0A= pair[element.name] =3D value;=0A= return Hash.toQueryString(pair);=0A= }=0A= }=0A= return '';=0A= },=0A= =0A= getValue: function(element) {=0A= element =3D $(element);=0A= var method =3D element.tagName.toLowerCase();=0A= return Form.Element.Serializers[method](element);=0A= },=0A= =0A= clear: function(element) {=0A= $(element).value =3D '';=0A= return element;=0A= },=0A= =0A= present: function(element) {=0A= return $(element).value !=3D '';=0A= },=0A= =0A= activate: function(element) {=0A= element =3D $(element);=0A= element.focus();=0A= if (element.select && ( element.tagName.toLowerCase() !=3D 'input' ||=0A= !['button', 'reset', 'submit'].include(element.type) ) )=0A= element.select();=0A= return element;=0A= },=0A= =0A= disable: function(element) {=0A= element =3D $(element);=0A= element.disabled =3D true;=0A= return element;=0A= },=0A= =0A= enable: function(element) {=0A= element =3D $(element);=0A= element.blur();=0A= element.disabled =3D false;=0A= return element;=0A= }=0A= }=0A= =0A= Object.extend(Form.Element, Form.Element.Methods);=0A= var Field =3D Form.Element;=0A= var $F =3D Form.Element.getValue;=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Form.Element.Serializers =3D {=0A= input: function(element) {=0A= switch (element.type.toLowerCase()) {=0A= case 'checkbox':=0A= case 'radio':=0A= return Form.Element.Serializers.inputSelector(element);=0A= default:=0A= return Form.Element.Serializers.textarea(element);=0A= }=0A= },=0A= =0A= inputSelector: function(element) {=0A= return element.checked ? element.value : null;=0A= },=0A= =0A= textarea: function(element) {=0A= return element.value;=0A= },=0A= =0A= select: function(element) {=0A= return this[element.type =3D=3D 'select-one' ?=0A= 'selectOne' : 'selectMany'](element);=0A= },=0A= =0A= selectOne: function(element) {=0A= var index =3D element.selectedIndex;=0A= return index >=3D 0 ? this.optionValue(element.options[index]) : = null;=0A= },=0A= =0A= selectMany: function(element) {=0A= var values, length =3D element.length;=0A= if (!length) return null;=0A= =0A= for (var i =3D 0, values =3D []; i < length; i++) {=0A= var opt =3D element.options[i];=0A= if (opt.selected) values.push(this.optionValue(opt));=0A= }=0A= return values;=0A= },=0A= =0A= optionValue: function(opt) {=0A= // extend element because hasAttribute may not be native=0A= return Element.extend(opt).hasAttribute('value') ? opt.value : = opt.text;=0A= }=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.TimedObserver =3D function() {}=0A= Abstract.TimedObserver.prototype =3D {=0A= initialize: function(element, frequency, callback) {=0A= this.frequency =3D frequency;=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= =0A= this.lastValue =3D this.getValue();=0A= this.registerCallback();=0A= },=0A= =0A= registerCallback: function() {=0A= setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);=0A= },=0A= =0A= onTimerEvent: function() {=0A= var value =3D this.getValue();=0A= var changed =3D ('string' =3D=3D typeof this.lastValue && 'string' = =3D=3D typeof value=0A= ? this.lastValue !=3D value : String(this.lastValue) !=3D = String(value));=0A= if (changed) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= }=0A= }=0A= =0A= Form.Element.Observer =3D Class.create();=0A= Form.Element.Observer.prototype =3D Object.extend(new = Abstract.TimedObserver(), {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.Observer =3D Class.create();=0A= Form.Observer.prototype =3D Object.extend(new Abstract.TimedObserver(), {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.EventObserver =3D function() {}=0A= Abstract.EventObserver.prototype =3D {=0A= initialize: function(element, callback) {=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= =0A= this.lastValue =3D this.getValue();=0A= if (this.element.tagName.toLowerCase() =3D=3D 'form')=0A= this.registerFormCallbacks();=0A= else=0A= this.registerCallback(this.element);=0A= },=0A= =0A= onElementEvent: function() {=0A= var value =3D this.getValue();=0A= if (this.lastValue !=3D value) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= },=0A= =0A= registerFormCallbacks: function() {=0A= = Form.getElements(this.element).each(this.registerCallback.bind(this));=0A= },=0A= =0A= registerCallback: function(element) {=0A= if (element.type) {=0A= switch (element.type.toLowerCase()) {=0A= case 'checkbox':=0A= case 'radio':=0A= Event.observe(element, 'click', = this.onElementEvent.bind(this));=0A= break;=0A= default:=0A= Event.observe(element, 'change', = this.onElementEvent.bind(this));=0A= break;=0A= }=0A= }=0A= }=0A= }=0A= =0A= Form.Element.EventObserver =3D Class.create();=0A= Form.Element.EventObserver.prototype =3D Object.extend(new = Abstract.EventObserver(), {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.EventObserver =3D Class.create();=0A= Form.EventObserver.prototype =3D Object.extend(new = Abstract.EventObserver(), {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= if (!window.Event) {=0A= var Event =3D new Object();=0A= }=0A= =0A= Object.extend(Event, {=0A= KEY_BACKSPACE: 8,=0A= KEY_TAB: 9,=0A= KEY_RETURN: 13,=0A= KEY_ESC: 27,=0A= KEY_LEFT: 37,=0A= KEY_UP: 38,=0A= KEY_RIGHT: 39,=0A= KEY_DOWN: 40,=0A= KEY_DELETE: 46,=0A= KEY_HOME: 36,=0A= KEY_END: 35,=0A= KEY_PAGEUP: 33,=0A= KEY_PAGEDOWN: 34,=0A= =0A= element: function(event) {=0A= return event.target || event.srcElement;=0A= },=0A= =0A= isLeftClick: function(event) {=0A= return (((event.which) && (event.which =3D=3D 1)) ||=0A= ((event.button) && (event.button =3D=3D 1)));=0A= },=0A= =0A= pointerX: function(event) {=0A= return event.pageX || (event.clientX +=0A= (document.documentElement.scrollLeft || document.body.scrollLeft));=0A= },=0A= =0A= pointerY: function(event) {=0A= return event.pageY || (event.clientY +=0A= (document.documentElement.scrollTop || document.body.scrollTop));=0A= },=0A= =0A= stop: function(event) {=0A= if (event.preventDefault) {=0A= event.preventDefault();=0A= event.stopPropagation();=0A= } else {=0A= event.returnValue =3D false;=0A= event.cancelBubble =3D true;=0A= }=0A= },=0A= =0A= // find the first node with the given tagName, starting from the=0A= // node the event was triggered on; traverses the DOM upwards=0A= findElement: function(event, tagName) {=0A= var element =3D Event.element(event);=0A= while (element.parentNode && (!element.tagName ||=0A= (element.tagName.toUpperCase() !=3D tagName.toUpperCase())))=0A= element =3D element.parentNode;=0A= return element;=0A= },=0A= =0A= observers: false,=0A= =0A= _observeAndCache: function(element, name, observer, useCapture) {=0A= if (!this.observers) this.observers =3D [];=0A= if (element.addEventListener) {=0A= this.observers.push([element, name, observer, useCapture]);=0A= element.addEventListener(name, observer, useCapture);=0A= } else if (element.attachEvent) {=0A= this.observers.push([element, name, observer, useCapture]);=0A= element.attachEvent('on' + name, observer);=0A= }=0A= },=0A= =0A= unloadCache: function() {=0A= if (!Event.observers) return;=0A= for (var i =3D 0, length =3D Event.observers.length; i < length; = i++) {=0A= Event.stopObserving.apply(this, Event.observers[i]);=0A= Event.observers[i][0] =3D null;=0A= }=0A= Event.observers =3D false;=0A= },=0A= =0A= observe: function(element, name, observer, useCapture) {=0A= element =3D $(element);=0A= useCapture =3D useCapture || false;=0A= =0A= if (name =3D=3D 'keypress' &&=0A= (navigator.appVersion.match(/Konqueror|Safari|KHTML/)=0A= || element.attachEvent))=0A= name =3D 'keydown';=0A= =0A= Event._observeAndCache(element, name, observer, useCapture);=0A= },=0A= =0A= stopObserving: function(element, name, observer, useCapture) {=0A= element =3D $(element);=0A= useCapture =3D useCapture || false;=0A= =0A= if (name =3D=3D 'keypress' &&=0A= (navigator.appVersion.match(/Konqueror|Safari|KHTML/)=0A= || element.detachEvent))=0A= name =3D 'keydown';=0A= =0A= if (element.removeEventListener) {=0A= element.removeEventListener(name, observer, useCapture);=0A= } else if (element.detachEvent) {=0A= try {=0A= element.detachEvent('on' + name, observer);=0A= } catch (e) {}=0A= }=0A= }=0A= });=0A= =0A= /* prevent memory leaks in IE */=0A= if (navigator.appVersion.match(/\bMSIE\b/))=0A= Event.observe(window, 'unload', Event.unloadCache, false);=0A= var Position =3D {=0A= // set to true if needed, warning: firefox performance problems=0A= // NOT neeeded for page scrolling, only if draggable contained in=0A= // scrollable elements=0A= includeScrollOffsets: false,=0A= =0A= // must be called before calling withinIncludingScrolloffset, every = time the=0A= // page is scrolled=0A= prepare: function() {=0A= this.deltaX =3D window.pageXOffset=0A= || document.documentElement.scrollLeft=0A= || document.body.scrollLeft=0A= || 0;=0A= this.deltaY =3D window.pageYOffset=0A= || document.documentElement.scrollTop=0A= || document.body.scrollTop=0A= || 0;=0A= },=0A= =0A= realOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.scrollTop || 0;=0A= valueL +=3D element.scrollLeft || 0;=0A= element =3D element.parentNode;=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= cumulativeOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= positionedOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= if (element) {=0A= if(element.tagName=3D=3D'BODY') break;=0A= var p =3D Element.getStyle(element, 'position');=0A= if (p =3D=3D 'relative' || p =3D=3D 'absolute') break;=0A= }=0A= } while (element);=0A= return [valueL, valueT];=0A= },=0A= =0A= offsetParent: function(element) {=0A= if (element.offsetParent) return element.offsetParent;=0A= if (element =3D=3D document.body) return element;=0A= =0A= while ((element =3D element.parentNode) && element !=3D = document.body)=0A= if (Element.getStyle(element, 'position') !=3D 'static')=0A= return element;=0A= =0A= return document.body;=0A= },=0A= =0A= // caches x/y coordinate pair to use with overlap=0A= within: function(element, x, y) {=0A= if (this.includeScrollOffsets)=0A= return this.withinIncludingScrolloffsets(element, x, y);=0A= this.xcomp =3D x;=0A= this.ycomp =3D y;=0A= this.offset =3D this.cumulativeOffset(element);=0A= =0A= return (y >=3D this.offset[1] &&=0A= y < this.offset[1] + element.offsetHeight &&=0A= x >=3D this.offset[0] &&=0A= x < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= withinIncludingScrolloffsets: function(element, x, y) {=0A= var offsetcache =3D this.realOffset(element);=0A= =0A= this.xcomp =3D x + offsetcache[0] - this.deltaX;=0A= this.ycomp =3D y + offsetcache[1] - this.deltaY;=0A= this.offset =3D this.cumulativeOffset(element);=0A= =0A= return (this.ycomp >=3D this.offset[1] &&=0A= this.ycomp < this.offset[1] + element.offsetHeight &&=0A= this.xcomp >=3D this.offset[0] &&=0A= this.xcomp < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= // within must be called directly before=0A= overlap: function(mode, element) {=0A= if (!mode) return 0;=0A= if (mode =3D=3D 'vertical')=0A= return ((this.offset[1] + element.offsetHeight) - this.ycomp) /=0A= element.offsetHeight;=0A= if (mode =3D=3D 'horizontal')=0A= return ((this.offset[0] + element.offsetWidth) - this.xcomp) /=0A= element.offsetWidth;=0A= },=0A= =0A= page: function(forElement) {=0A= var valueT =3D 0, valueL =3D 0;=0A= =0A= var element =3D forElement;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= =0A= // Safari fix=0A= if (element.offsetParent=3D=3Ddocument.body)=0A= if (Element.getStyle(element,'position')=3D=3D'absolute') break;=0A= =0A= } while (element =3D element.offsetParent);=0A= =0A= element =3D forElement;=0A= do {=0A= if (!window.opera || element.tagName=3D=3D'BODY') {=0A= valueT -=3D element.scrollTop || 0;=0A= valueL -=3D element.scrollLeft || 0;=0A= }=0A= } while (element =3D element.parentNode);=0A= =0A= return [valueL, valueT];=0A= },=0A= =0A= clone: function(source, target) {=0A= var options =3D Object.extend({=0A= setLeft: true,=0A= setTop: true,=0A= setWidth: true,=0A= setHeight: true,=0A= offsetTop: 0,=0A= offsetLeft: 0=0A= }, arguments[2] || {})=0A= =0A= // find page position of source=0A= source =3D $(source);=0A= var p =3D Position.page(source);=0A= =0A= // find coordinate system to use=0A= target =3D $(target);=0A= var delta =3D [0, 0];=0A= var parent =3D null;=0A= // delta [0,0] will do fine with position: fixed elements,=0A= // position:absolute needs offsetParent deltas=0A= if (Element.getStyle(target,'position') =3D=3D 'absolute') {=0A= parent =3D Position.offsetParent(target);=0A= delta =3D Position.page(parent);=0A= }=0A= =0A= // correct by body offsets (fixes Safari)=0A= if (parent =3D=3D document.body) {=0A= delta[0] -=3D document.body.offsetLeft;=0A= delta[1] -=3D document.body.offsetTop;=0A= }=0A= =0A= // set position=0A= if(options.setLeft) target.style.left =3D (p[0] - delta[0] + = options.offsetLeft) + 'px';=0A= if(options.setTop) target.style.top =3D (p[1] - delta[1] + = options.offsetTop) + 'px';=0A= if(options.setWidth) target.style.width =3D source.offsetWidth + = 'px';=0A= if(options.setHeight) target.style.height =3D source.offsetHeight + = 'px';=0A= },=0A= =0A= absolutize: function(element) {=0A= element =3D $(element);=0A= if (element.style.position =3D=3D 'absolute') return;=0A= Position.prepare();=0A= =0A= var offsets =3D Position.positionedOffset(element);=0A= var top =3D offsets[1];=0A= var left =3D offsets[0];=0A= var width =3D element.clientWidth;=0A= var height =3D element.clientHeight;=0A= =0A= element._originalLeft =3D left - parseFloat(element.style.left || = 0);=0A= element._originalTop =3D top - parseFloat(element.style.top || = 0);=0A= element._originalWidth =3D element.style.width;=0A= element._originalHeight =3D element.style.height;=0A= =0A= element.style.position =3D 'absolute';=0A= element.style.top =3D top + 'px';=0A= element.style.left =3D left + 'px';=0A= element.style.width =3D width + 'px';=0A= element.style.height =3D height + 'px';=0A= },=0A= =0A= relativize: function(element) {=0A= element =3D $(element);=0A= if (element.style.position =3D=3D 'relative') return;=0A= Position.prepare();=0A= =0A= element.style.position =3D 'relative';=0A= var top =3D parseFloat(element.style.top || 0) - = (element._originalTop || 0);=0A= var left =3D parseFloat(element.style.left || 0) - = (element._originalLeft || 0);=0A= =0A= element.style.top =3D top + 'px';=0A= element.style.left =3D left + 'px';=0A= element.style.height =3D element._originalHeight;=0A= element.style.width =3D element._originalWidth;=0A= }=0A= }=0A= =0A= // Safari returns margins on body which is incorrect if the child is = absolutely=0A= // positioned. For performance reasons, redefine = Position.cumulativeOffset for=0A= // KHTML/WebKit only.=0A= if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {=0A= Position.cumulativeOffset =3D function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= if (element.offsetParent =3D=3D document.body)=0A= if (Element.getStyle(element, 'position') =3D=3D 'absolute') = break;=0A= =0A= element =3D element.offsetParent;=0A= } while (element);=0A= =0A= return [valueL, valueT];=0A= }=0A= }=0A= =0A= Element.addMethods(); ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/global.js?14 function toggleLayer(whichLayer) { if (document.getElementById) { // this is the way the standards work var style2 =3D document.getElementById(whichLayer).style; style2.display =3D style2.display? "":"block"; } else if (document.all) { // this is the way old msie versions work var style2 =3D document.all[whichLayer].style; style2.display =3D style2.display? "":"block"; } else if (document.layers) { // this is the way nn4 works var style2 =3D document.layers[whichLayer].style; style2.display =3D style2.display? "":"block"; } } function popUp(URL,WIDTH,HEIGHT) { day =3D new Date(); id =3D day.getTime(); eval("page" + id + " =3D window.open(URL, '" + id + "', = 'toolbar=3D0,scrollbars=3D1,location=3D0,statusbar=3D1,menubar=3D0,resiza= ble=3D1,width=3D" + WIDTH + ",height=3D" + HEIGHT + "');"); } function successNotification(ID) { new Effect.Highlight(ID, {duration: 1, startcolor: '#ffff99', endcolor: = '#e7fbe7', restorecolor: '#e7fbe7'}); } function failureNotification(ID) { new Effect.Highlight(ID, {duration: 1, startcolor: '#ff0000', endcolor: = '#cc0000', restorecolor: '#cc0000'}); } // used for the 'X Close' button on Add/Edit story success function slideClosed(ID) { new Effect.toggle(ID,'appear', {duration: 1}); } // used for the 'What does this page do?' tabs function tabSlide(ID) { new Effect.toggle(ID,'slide', {duration: .5}); } // first used for 'add batch tags' in new photo manager function fadeIt(ID) { new Effect.Appear(ID); } // change from one background color to another, permandently function highlightIt(ID,start,end) { new = Effect.Highlight(ID,{startcolor:start,endcolor:end,restorecolor:end}); } // This is used for content swapping. Originally setup by Matt C. function displayBlocks() { allNodes =3D document.getElementsByClassName("cp_ajax"); for(i =3D 0; i < allNodes.length; i++) { var url =3D allNodes[i].href; allNodes[i].style.display =3D 'none'; var myAjax =3D new Ajax.Request (url,{method: 'get', onComplete: = showResponse}); } } function showResponse(originalRequest) { for(i =3D 0; i < allNodes.length; i++) { $(allNodes[i].title).innerHTML =3D originalRequest.responseText; } } // Grabs html for tooltips. function getTooltipText(id) { lasttooltipevent =3D 'mouseover'; var tooltipLocation =3D '/other/tooltips/?q=3D' + id; //var tooltipLocation =3D 'media/sample.xml'; xmlhttp.open("GET",tooltipLocation,true); xmlhttp.onreadystatechange=3Dfunction() { if (xmlhttp.readyState=3D=3D4) { if (lasttooltipevent=3D=3D'mouseover') { var response =3D xmlhttp.responseText; overlib(response, STICKY, CAPTION,'just ignore this but keep = it',CLOSECLICK, ABOVE, RIGHT, OFFSETY, -15, OFFSETX, 19); } } } xmlhttp.send(null); } /*var lasttooltipevent =3D '';*/ /* We remember the last tool tip event (Mouseout, mouseover) when deciding = to open the bubble info. */ function closeToolTip(id) { lasttooltipevent =3D 'mouseout'; cClick(); } // Create Ajax Popup Login Box function popup(url,ie5url,width,height) { // if a "closeable" boolean is passed, track it. It is the 4th item on = the index of arguments. if (arguments.length =3D=3D 5) { closeable =3D arguments[4]; } else { closeable =3D 0; } if (closeable =3D=3D 1) { url =3D url + '&closeable=3D1'; } if ((navigator.userAgent.indexOf("MSIE")!=3D-1) && = (navigator.userAgent.indexOf("Mac")!=3D-1)) { document.location.href =3D ie5url; =20 } else { var win =3D new Dialog.alert({url: url, options: {method: 'get'}}, = {windowParameters: {className: "popup", width: width, height: height, = zindex: 1500}, okLabel: "x", buttonClass: "hideClose"}); // To prevent ugliness, we hide all object tags (flash movies) document.getElementsByTagName("object").className =3D "hide"; document.getElementsByTagName("embed").className =3D "hide"; } } // Create Ajax Popup Login Box function popup_new(url,ie5url,width,height) { /* // if a "closeable" boolean is passed, track it. It is the 4th item on = the index of arguments. if (arguments.length =3D=3D 5) { closeable =3D arguments[4]; }=20 else { closeable =3D 0; } if (closeable =3D=3D 1) { url =3D url + '&closeable=3D1'; } if ((navigator.userAgent.indexOf("MSIE")!=3D-1) && = (navigator.userAgent.indexOf("Mac")!=3D-1)) { document.location.href =3D ie5url; =20 }=20 else { // Windows with an URL as content // We want this to not be resizable or draggable so we set those to = false // The dialog2 is the name of the class prefix for use in the style = sheets // Title sets the title of the window (this can be blank for the login = window) y2mcp_win2 =3D new Window('y2mcp_regdialog2', { bottom:0, left:0, width:width, height:height,=20 resizable: false, closable: closeable, minimizable: false, = maximizable: false, draggable: false,=20 url: url, showEffectOptions: {duration:0}, hideEffectOptions: = {duration:0}}) y2mcp_win2.setDestroyOnClose(); // We now set the window to show center and set modal to true y2mcp_win2.showCenter(true); } */ } function getCurrentDateTime(theFormat){ // // returns a nice date/time string for the current timestamp, depending = on what format you request // INPUT: date format - REQUIREd // formats: // 1 - US short date (mm/dd/yyyy): 01/01/2006 // 2 - long date: Monday, January 1, 2006 // 3 - long date and time (12-hour): Monday, January 1, 2006 9:00 = AM // 4 - time (12-hour): 9:00 AM // OUTPUT: formatted date/time string // // NOTES/CAVEATS/WARNINGS: // This function works with a local time string (not GMT/UTC) // var theReturnVal =3D ""; var today =3D new Date(); =09 var arDays =3D new Array('Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday'); var arFullMonths =3D new Array('January','February','March','April', = 'May','June','July','August','September','October','November','December')= ; var Year =3D today.getFullYear(); var Month =3D leadingZero(today.getMonth()+1); var DayName =3D arDays[today.getDay()]; var MonthFullName =3D arFullMonths[today.getMonth()]; var Day =3D today.getDate(); var DayLeading =3D leadingZero(today.getDate()); var Hours =3D today.getHours(); var ampm =3D "AM"; =09 if (Hours =3D=3D 0) Hours =3D 12; if (Hours > 11) ampm =3D "PM"; if (Hours > 12) Hours -=3D 12; var HoursLeading =3D leadingZero(Hours); var Minutes =3D leadingZero(today.getMinutes()); var Seconds =3D leadingZero(today.getSeconds()); switch(theFormat){ case 1: theReturnVal =3D Month + '/' + Day + '/' + Year; break; case 2: theReturnVal =3D DayName + ', ' + MonthFullName + ' ' + Day + ', ' + = Year; break; case 3: theReturnVal =3D DayName + ', ' + MonthFullName + ' ' + Day + ', ' + = Year + ' ' + Hours + ':' + Minutes + ' ' + ampm; break; case 4: theReturnVal =3D Hours + ':' + Minutes + ' ' + ampm; break; default: theReturnVal =3D Month + '/' + Day + '/' + Year; } return theReturnVal; } function leadingZero(nr) { if (nr < 10){=20 nr =3D "0" + nr; } return nr; } function getCurrentIssue(theFormat) { // writes "Dayname Monthname DD, YYYY" // within div#cp_current_issue // // so if you're going to do some styling, use selectors as follows: // // #cp_current_issue .day {font-weight: bold;} // // formats: // 1 - US short date (mm/dd/yyyy): 01/01/2006 // spans: .day/.month/.year // 2 - long date: Monday January 1, 2006 // spans: .dayname .monthname .day, .year var openDiv =3D '
    '; var closeDiv =3D '
    '; var s =3D "/"; var n =3D " " function writeSpan(className,whichVar) { var spanWrap =3D '' + whichVar + = ''; return spanWrap; } switch(theFormat) { case 1:=20 thisIssue =3D writeSpan("day",currentissueday) + s + = writeSpan("month",currentissuemonth) + s + = writeSpan("year",currentissueyear); break; case 2: thisIssue =3D writeSpan("dayname",currentissuedayname) + n + = writeSpan("monthname",currentissuemonthname) + n + = writeSpan("day",currentissueday) + "," + n + = writeSpan("year",currentissueyear); break; default:=20 thisIssue =3D writeSpan("day",currentissueday) + s + = writeSpan("month",currentissuemonth) + s + = writeSpan("year",currentissueyear); } thisIssue =3D openDiv + thisIssue + closeDiv return thisIssue; } /* pullquote function by Roger Johansson, http://www.456bereastreet.com/ */ var cp_pullquote =3D { init : function() { // Check that the browser supports the methods used if (!document.getElementById || !document.createElement || = !document.appendChild) return false; var oElement, ocp_pullquote, ocp_pullquoteP, oQuoteContent, i, j; // Find all span elements with a class name of cp_pullquote var arrElements =3D document.getElementsByTagName('span'); var oRegExp =3D new RegExp("(^|\\s)cp_pullquote(\\s|$)"); for (i=3D0; i');=0A= },=0A= load: function() {=0A= if((typeof Prototype=3D=3D'undefined') || =0A= (typeof Element =3D=3D 'undefined') || =0A= (typeof Element.Methods=3D=3D'undefined') ||=0A= parseFloat(Prototype.Version.split(".")[0] + "." +=0A= Prototype.Version.split(".")[1]) < 1.5)=0A= throw("script.aculo.us requires the Prototype JavaScript = framework >=3D 1.5.0");=0A= =0A= $A(document.getElementsByTagName("script")).findAll( function(s) {=0A= return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))=0A= }).each( function(s) {=0A= var path =3D s.src.replace(/scriptaculous\.js(\?.*)?$/,'');=0A= var includes =3D s.src.match(/\?.*load=3D([a-z,]*)/);=0A= (includes ? includes[1] : = 'builder,effects,dragdrop,controls,slider').split(',').each(=0A= function(include) { Scriptaculous.require(path+include+'.js') });=0A= });=0A= }=0A= }=0A= =0A= Scriptaculous.load(); ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/window.js // Copyright (c) 2006 S=C3=A9bastien Gruhier (http://xilinus.com, = http://itseb.com)=0A= // =0A= // Permission is hereby granted, free of charge, to any person obtaining=0A= // a copy of this software and associated documentation files (the=0A= // "Software"), to deal in the Software without restriction, including=0A= // without limitation the rights to use, copy, modify, merge, publish,=0A= // distribute, sublicense, and/or sell copies of the Software, and to=0A= // permit persons to whom the Software is furnished to do so, subject to=0A= // the following conditions:=0A= // =0A= // The above copyright notice and this permission notice shall be=0A= // included in all copies or substantial portions of the Software.=0A= //=0A= // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,=0A= // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF=0A= // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND=0A= // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE=0A= // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION=0A= // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION=0A= // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.=0A= //=0A= // VERSION 0.96.2=0A= =0A= var Window =3D Class.create();=0A= Window.prototype =3D {=0A= // Constructor=0A= // Available parameters : className, title, minWidth, minHeight, = maxWidth, maxHeight, width, height, top, left, bottom, right, resizable, = zIndex, opacity, =0A= // hideEffect, showEffect, showEffectOptions, = hideEffectOptions, effectOptions, url, draggable, closable, minimizable, = maximizable, parent, onload=0A= initialize: function(id) {=0A= if ($(id))=0A= alert("Window " + id + " is already register is the DOM!!, be sure = to use setDestroyOnClose()")=0A= =0A= this.hasEffectLib =3D String.prototype.parseColor !=3D null;=0A= this.options =3D Object.extend({=0A= className: "dialog",=0A= minWidth: 100,=0A= minHeight: 20,=0A= resizable: true,=0A= closable: true,=0A= minimizable: true,=0A= maximizable: true,=0A= draggable: true,=0A= userData: null,=0A= showEffect: (this.hasEffectLib ? Effect.Appear : = Element.show),=0A= hideEffect: (this.hasEffectLib ? Effect.Fade : = Element.hide),=0A= showEffectOptions: {},=0A= hideEffectOptions: {},=0A= effectOptions: null,=0A= parent: document.getElementsByTagName("body").item(0),=0A= title: " ",=0A= url: null,=0A= onload: Prototype.emptyFunction,=0A= width: 200,=0A= height: 300,=0A= opacity: 1=0A= }, arguments[1] || {});=0A= =0A= if (this.options.effectOptions) {=0A= Object.extend(this.options.hideEffectOptions, = this.options.effectOptions);=0A= Object.extend(this.options.showEffectOptions, = this.options.effectOptions);=0A= }=0A= if (this.options.hideEffect =3D=3D Element.hide)=0A= this.options.hideEffect =3D function(){ Element.hide(this.element); = if (this.destroyOnClose) this.destroy(); }.bind(this)=0A= =0A= this.element =3D this._createWindow(id);=0A= =0A= // Bind event listener=0A= this.eventMouseDown =3D this._initDrag.bindAsEventListener(this);=0A= this.eventMouseUp =3D this._endDrag.bindAsEventListener(this);=0A= this.eventMouseMove =3D this._updateDrag.bindAsEventListener(this);=0A= this.eventKeyPress =3D this._keyPress.bindAsEventListener(this);=0A= this.eventOnLoad =3D = this._getWindowBorderSize.bindAsEventListener(this);=0A= this.eventMouseDownContent =3D = this.toFront.bindAsEventListener(this);=0A= this.eventResize =3D this._recenter.bindAsEventListener(this);=0A= =0A= this.topbar =3D $(this.element.id + "_top");=0A= this.bottombar =3D $(this.element.id + "_bottom");=0A= this.content =3D $(this.element.id + "_content");=0A= =0A= Event.observe(this.topbar, "mousedown", this.eventMouseDown);=0A= Event.observe(this.bottombar, "mousedown", this.eventMouseDown);=0A= Event.observe(this.content, "mousedown", this.eventMouseDownContent);=0A= Event.observe(window, "load", this.eventOnLoad);=0A= Event.observe(window, "resize", this.eventResize);=0A= Event.observe(window, "scroll", this.eventResize);=0A= =0A= if (this.options.draggable) {=0A= this.bottombar.addClassName("bottom_draggable");=0A= this.topbar.addClassName("top_draggable");=0A= } =0A= =0A= if (this.options.resizable) {=0A= this.sizer =3D $(this.element.id + "_sizer");=0A= Event.observe(this.sizer, "mousedown", this.eventMouseDown);=0A= } =0A= =0A= this.useLeft =3D null;=0A= this.useTop =3D null;=0A= if (arguments[1].left !=3D null) {=0A= this.element.setStyle({left: parseFloat(arguments[1].left) + 'px'});=0A= this.useLeft =3D true;=0A= }=0A= if (arguments[1].right !=3D null) {=0A= this.element.setStyle({right: parseFloat(arguments[1].right) + 'px'});=0A= this.useLeft =3D false;=0A= }=0A= if (this.useLeft =3D=3D null) {=0A= this.element.setStyle({left: "0px"});=0A= this.useLeft =3D true;=0A= }=0A= =0A= if (arguments[1].top !=3D null) {=0A= this.element.setStyle({top: parseFloat(arguments[1].top) + 'px'});=0A= this.useTop =3D true;=0A= }=0A= if (arguments[1].bottom !=3D null) {=0A= this.element.setStyle({bottom: parseFloat(arguments[1].bottom) + = 'px'}); =0A= this.useTop =3D false;=0A= }=0A= if (this.useTop =3D=3D null) {=0A= this.element.setStyle({top: "0px"});=0A= this.useTop =3D true;=0A= }=0A= =0A= this.storedLocation =3D null;=0A= =0A= this.setOpacity(this.options.opacity);=0A= if (this.options.zIndex)=0A= this.setZIndex(this.options.zIndex)=0A= =0A= this.destroyOnClose =3D false;=0A= =0A= this._getWindowBorderSize();=0A= this.width =3D this.options.width;=0A= this.height =3D this.options.height;=0A= =0A= if (this.width && this.height)=0A= this.setSize(this.options.width, this.options.height);=0A= this.setTitle(this.options.title)=0A= Windows.register(this); =0A= },=0A= =0A= // Destructor=0A= destroy: function() {=0A= Windows.notify("onDestroy", this);=0A= =0A= Event.stopObserving(this.topbar, "mousedown", this.eventMouseDown);=0A= Event.stopObserving(this.bottombar, "mousedown", this.eventMouseDown);=0A= Event.stopObserving(this.content, "mousedown", = this.eventMouseDownContent);=0A= =0A= Event.stopObserving(window, "load", this.eventOnLoad);=0A= Event.stopObserving(window, "resize", this.eventResize);=0A= Event.stopObserving(window, "scroll", this.eventResize);=0A= =0A= Event.stopObserving(this.content, "load", this.options.onload);=0A= =0A= if (this.sizer)=0A= Event.stopObserving(this.sizer, "mousedown", this.eventMouseDown);=0A= =0A= if (this.options.url)=0A= this.content.src =3D null=0A= =0A= if(this.iefix) =0A= Element.remove(this.iefix);=0A= =0A= Element.remove(this.element);=0A= Windows.unregister(this); =0A= },=0A= =0A= // Sets window deleagte, should have functions: "canClose(window)" =0A= setDelegate: function(delegate) {=0A= this.delegate =3D delegate=0A= },=0A= =0A= // Gets current window delegate=0A= getDelegate: function() {=0A= return this.delegate;=0A= },=0A= =0A= // Gets window content=0A= getContent: function () {=0A= return this.content;=0A= },=0A= =0A= // Sets the content with an element id=0A= setContent: function(id, autoresize, autoposition) {=0A= var d =3D null;=0A= var p =3D null;=0A= =0A= if (autoresize) =0A= d =3D Element.getDimensions(id);=0A= if (autoposition) =0A= p =3D Position.cumulativeOffset($(id));=0A= =0A= var content =3D this.getContent()=0A= content.appendChild($(id));=0A= $(id).show();=0A= if (autoresize) =0A= this.setSize(d.width, d.height);=0A= if (autoposition) =0A= this.setLocation(p[1] - this.heightN, p[0] - this.widthW); =0A= },=0A= =0A= setAjaxContent: function(url, options, showCentered, showModal) {=0A= this.showFunction =3D showCentered ? "showCenter" : "show";=0A= this.showModal =3D showModal || false;=0A= =0A= if (options =3D=3D null)=0A= options =3D {} =0A= this.onComplete =3D options.onComplete;=0A= options.onComplete =3D this._setAjaxContent.bind(this);=0A= =0A= new Ajax.Request(url, options);=0A= },=0A= =0A= _setAjaxContent: function(originalRequest) {=0A= this.getContent().innerHTML =3D originalRequest.responseText;=0A= if (this.onComplete)=0A= this.onComplete(originalRequest);=0A= this[this.showFunction](this.showModal)=0A= },=0A= =0A= // Stores position/size in a cookie, by default named with window id=0A= setCookie: function(name, expires, path, domain, secure) {=0A= name =3D name || this.element.id;=0A= this.cookie =3D [name, expires, path, domain, secure];=0A= =0A= // Get cookie=0A= var value =3D WindowUtilities.getCookie(name)=0A= // If exists=0A= if (value) {=0A= var values =3D value.split(',');=0A= var x =3D values[0].split(':');=0A= var y =3D values[1].split(':');=0A= =0A= var w =3D parseFloat(values[2]), h =3D parseFloat(values[3]);=0A= var mini =3D values[4];=0A= var maxi =3D values[5];=0A= =0A= this.setSize(w, h);=0A= if (mini =3D=3D "true")=0A= this.doMinimize =3D true; // Minimize will be done at onload = window event=0A= else if (maxi =3D=3D "true")=0A= this.doMaximize =3D true; // Maximize will be done at onload window = event=0A= =0A= this.useLeft =3D x[0] =3D=3D "l";=0A= this.useTop =3D y[0] =3D=3D "t";=0A= =0A= this.element.setStyle(this.useLeft ? {left: x[1]} : {right: x[1]});=0A= this.element.setStyle(this.useTop ? {top: y[1]} : {bottom: y[1]});=0A= }=0A= },=0A= =0A= // Gets window ID=0A= getId: function() {=0A= return this.element.id;=0A= },=0A= =0A= // Detroys itself when closing =0A= setDestroyOnClose: function() {=0A= Object.extend(this.options.hideEffectOptions, {afterFinish: = this.destroy.bind(this)});=0A= this.destroyOnClose =3D true;=0A= },=0A= =0A= // initDrag event=0A= _initDrag: function(event) {=0A= // Get pointer X,Y=0A= this.pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A= =0A= // Resize=0A= if (Event.element(event) =3D=3D this.sizer) {=0A= this.doResize =3D true;=0A= this.widthOrg =3D this.width;=0A= this.heightOrg =3D this.height;=0A= this.bottomOrg =3D parseFloat(this.element.getStyle('bottom'));=0A= this.rightOrg =3D parseFloat(this.element.getStyle('right'));=0A= Windows.notify("onStartResize", this);=0A= }=0A= else {=0A= this.doResize =3D false;=0A= =0A= // Check if click on close button, =0A= var closeButton =3D $(this.getId() + '_close');=0A= if (closeButton && Position.within(closeButton, this.pointer[0], = this.pointer[1])) =0A= return;=0A= =0A= this.toFront();=0A= =0A= if (! this.options.draggable) =0A= return;=0A= Windows.notify("onStartMove", this);=0A= } =0A= // Register global event to capture mouseUp and mouseMove=0A= Event.observe(document, "mouseup", this.eventMouseUp, false);=0A= Event.observe(document, "mousemove", this.eventMouseMove, false);=0A= =0A= // Add an invisible div to keep catching mouse event over iframes=0A= WindowUtilities.disableScreen('__invisible__', '__invisible__');=0A= =0A= // Stop selection while dragging=0A= document.body.ondrag =3D function () { return false; };=0A= document.body.onselectstart =3D function () { return false; };=0A= =0A= Event.stop(event);=0A= },=0A= =0A= // updateDrag event=0A= _updateDrag: function(event) {=0A= var pointer =3D [Event.pointerX(event), Event.pointerY(event)]; =0A= var dx =3D pointer[0] - this.pointer[0];=0A= var dy =3D pointer[1] - this.pointer[1];=0A= =0A= // Resize case, update width/height=0A= if (this.doResize) {=0A= this.setSize(this.widthOrg + dx , this.heightOrg + dy);=0A= =0A= dx =3D this.width - this.widthOrg=0A= dy =3D this.height - this.heightOrg=0A= =0A= // Check if it's a right position, update it to keep upper-left = corner at the same position=0A= if (! this.useLeft) =0A= this.element.setStyle({right: (this.rightOrg -dx) + 'px'});=0A= // Check if it's a bottom position, update it to keep upper-left = corner at the same position=0A= if (! this.useTop) =0A= this.element.setStyle({bottom: (this.bottomOrg -dy) + 'px'});=0A= }=0A= // Move case, update top/left=0A= else {=0A= this.pointer =3D pointer;=0A= =0A= if (this.useLeft) =0A= this.element.setStyle({left: = parseFloat(this.element.getStyle('left')) + dx + 'px'});=0A= else =0A= this.element.setStyle({right: = parseFloat(this.element.getStyle('right')) - dx + 'px'});=0A= =0A= if (this.useTop) =0A= this.element.setStyle({top: parseFloat(this.element.getStyle('top')) = + dy + 'px'});=0A= else =0A= this.element.setStyle({bottom: = parseFloat(this.element.getStyle('bottom')) - dy + 'px'});=0A= }=0A= if (this.iefix) =0A= this._fixIEOverlapping(); =0A= =0A= this._removeStoreLocation();=0A= Event.stop(event);=0A= },=0A= =0A= // endDrag callback=0A= _endDrag: function(event) {=0A= // Remove temporary div over iframes=0A= WindowUtilities.enableScreen('__invisible__');=0A= =0A= if (this.doResize)=0A= Windows.notify("onEndResize", this);=0A= else=0A= Windows.notify("onEndMove", this);=0A= =0A= // Release event observing=0A= Event.stopObserving(document, "mouseup", this.eventMouseUp,false);=0A= Event.stopObserving(document, "mousemove", this.eventMouseMove, = false);=0A= =0A= // Store new location/size if need be=0A= this._saveCookie()=0A= =0A= Event.stop(event);=0A= =0A= // Restore selection=0A= document.body.ondrag =3D null;=0A= document.body.onselectstart =3D null;=0A= },=0A= =0A= _keyPress: function(event) {=0A= //Dialog.cancelCallback();=0A= },=0A= =0A= // Creates HTML window code=0A= _createWindow: function(id) {=0A= var className =3D this.options.className;=0A= var win =3D document.createElement("div");=0A= win.setAttribute('id', id);=0A= win.className =3D "dialog";=0A= =0A= var content;=0A= if (this.options.url)=0A= content=3D "";=0A= else=0A= content =3D"
    ";=0A= =0A= var closeDiv =3D this.options.closable ? "
    " : "";=0A= var minDiv =3D this.options.minimizable ? "
    " : "";=0A= var maxDiv =3D this.options.maximizable ? "
    " : "";=0A= var seAttributes =3D this.options.resizable ? "class=3D'" + className = + "_sizer' id=3D'" + id + "_sizer'" : "class=3D'" + className + "_se'";=0A= =0A= win.innerHTML =3D closeDiv + minDiv + maxDiv + "\=0A= \=0A= \=0A= \=0A= \=0A= \=0A= \=0A=
     
    "+ this.options.title = +"
     
    \=0A= \=0A= \=0A= \=0A= \=0A= \=0A= \=0A=
    "+ content +"
    \=0A= \=0A= \=0A= \=0A= \=0A= \=0A= \=0A=
     
     
     
    \=0A= ";=0A= =0A= Element.hide(win);=0A= this.options.parent.insertBefore(win, this.options.parent.firstChild);=0A= Event.observe($(id + "_content"), "load", this.options.onload);=0A= return win;=0A= },=0A= =0A= // Sets window location=0A= setLocation: function(top, left) {=0A= if (top < 0)=0A= top =3D 0;=0A= if (left < 0)=0A= left=3D 0=0A= this.element.setStyle({top: top + 'px'});=0A= this.element.setStyle({left: left + 'px'});=0A= this.useLeft =3D true;=0A= this.useTop =3D true;=0A= },=0A= =0A= // Gets window size=0A= getSize: function() {=0A= return {width: this.width, height: this.height};=0A= },=0A= =0A= // Sets window size=0A= setSize: function(width, height) { =0A= width =3D parseFloat(width);=0A= height =3D parseFloat(height);=0A= =0A= // Check min and max size=0A= if (width < this.options.minWidth)=0A= width =3D this.options.minWidth;=0A= =0A= if (height < this.options.minHeight)=0A= height =3D this.options.minHeight;=0A= =0A= if (this.options. maxHeight && height > this.options. maxHeight)=0A= height =3D this.options. maxHeight;=0A= =0A= if (this.options. maxWidth && width > this.options. maxWidth)=0A= width =3D this.options. maxWidth;=0A= =0A= this.width =3D width;=0A= this.height =3D height;=0A= this.element.setStyle({width: width + this.widthW + this.widthE + = "px"})=0A= this.element.setStyle({height: height + this.heightN + this.heightS + = "px"})=0A= =0A= // Update content height=0A= var content =3D $(this.element.id + '_content')=0A= content.setStyle({height: height + 'px'});=0A= content.setStyle({width: width + 'px'});=0A= },=0A= =0A= updateHeight: function() {=0A= this.setSize(this.width, this.content.scrollHeight)=0A= },=0A= =0A= updateWidth: function() {=0A= this.setSize(this.content.scrollWidth, this.height)=0A= },=0A= =0A= // Brings window to front=0A= toFront: function() {=0A= this.setZIndex(Windows.maxZIndex + 20);=0A= Windows.notify("onFocus", this);=0A= },=0A= =0A= // Displays window modal state or not=0A= show: function(modal) {=0A= if (modal) {=0A= WindowUtilities.disableScreen(this.options.className, = 'overlay_modal', this.getId());=0A= this.modal =3D true; =0A= this.setZIndex(Windows.maxZIndex + 20);=0A= Windows.unsetOverflow(this);=0A= Event.observe(document, "keypress", this.eventKeyPress); =0A= }=0A= =0A= // To restore overflow if need be=0A= if (this.oldStyle)=0A= this.getContent().setStyle({overflow: this.oldStyle});=0A= =0A= if (! this.width || !this.height) {=0A= var size =3D WindowUtilities._computeSize(this.content.innerHTML, = this.content.id, this.width, this.height, 0)=0A= if (this.height)=0A= this.width =3D size + 5=0A= else=0A= this.height =3D size + 5=0A= }=0A= =0A= this.setSize(this.width, this.height);=0A= if (this.centered)=0A= this._center(this.centerTop, this.centerLeft); =0A= =0A= if (this.options.showEffect !=3D Element.show && = this.options.showEffectOptions )=0A= this.options.showEffect(this.element, = this.options.showEffectOptions); =0A= else=0A= this.options.showEffect(this.element); =0A= =0A= this._checkIEOverlapping();=0A= Windows.notify("onShow", this); =0A= },=0A= =0A= // Displays window modal state or not at the center of the page=0A= showCenter: function(modal, top, left) {=0A= this.centered =3D true;=0A= this.centerTop =3D top;=0A= this.centerLeft =3D left;=0A= =0A= this.show(modal);=0A= },=0A= =0A= isVisible: function() {=0A= return this.element.visible();=0A= },=0A= =0A= _center: function(top, left) {=0A= var windowScroll =3D WindowUtilities.getWindowScroll(); =0A= var pageSize =3D WindowUtilities.getPageSize(); =0A= =0A= if (!top)=0A= top =3D (pageSize.windowHeight - (this.height + this.heightN + = this.heightS))/2;=0A= top +=3D windowScroll.top=0A= =0A= if (!left)=0A= left =3D (pageSize.windowWidth - (this.width + this.widthW + = this.widthE))/2;=0A= left +=3D windowScroll.left =0A= =0A= this.setLocation(top, left);=0A= this.toFront();=0A= },=0A= =0A= _recenter: function(event) {=0A= if (this.modal) {=0A= var pageSize =3D WindowUtilities.getPageSize();=0A= // set height of Overlay to take up whole page and show=0A= if ($('overlay_modal')) {=0A= $('overlay_modal').style.height =3D (pageSize.pageHeight + 'px');=0A= $('overlay_modal').style.width =3D (pageSize.pageWidth + 'px');=0A= } =0A= if (this.centered)=0A= this._center(this.centerTop, this.centerLeft); =0A= }=0A= },=0A= =0A= // Hides window=0A= hide: function() {=0A= if (this.modal) {=0A= WindowUtilities.enableScreen();=0A= Windows.resetOverflow();=0A= Event.stopObserving(document, "keypress", this.eventKeyPress); =0A= }=0A= // To avoid bug on scrolling bar=0A= this.oldStyle =3D this.getContent().getStyle('overflow') || "auto"=0A= this.getContent().setStyle({overflow: "hidden"});=0A= =0A= this.options.hideEffect(this.element, this.options.hideEffectOptions); =0A= =0A= if(this.iefix) =0A= this.iefix.hide();=0A= Windows.notify("onHide", this);=0A= },=0A= =0A= minimize: function() {=0A= var r2 =3D $(this.getId() + "_row2");=0A= var dh =3D r2.getDimensions().height;=0A= =0A= if (r2.visible()) {=0A= var h =3D this.element.getHeight() - dh=0A= r2.hide()=0A= this.element.setStyle({height: h + "px"})=0A= if (! this.useTop) {=0A= var bottom =3D parseFloat(this.element.getStyle('bottom'));=0A= this.element.setStyle({bottom: (bottom + dh) + 'px'});=0A= }=0A= } =0A= else {=0A= var h =3D this.element.getHeight() + dh;=0A= this.element.setStyle({height: h + "px"})=0A= if (! this.useTop) {=0A= var bottom =3D parseFloat(this.element.getStyle('bottom'));=0A= this.element.setStyle({bottom: (bottom - dh) + 'px'});=0A= }=0A= r2.show();=0A= =0A= this.toFront();=0A= }=0A= Windows.notify("onMinimize", this);=0A= =0A= // Store new location/size if need be=0A= this._saveCookie()=0A= },=0A= =0A= maximize: function() {=0A= if (this.storedLocation !=3D null) {=0A= this._restoreLocation();=0A= if(this.iefix) =0A= this.iefix.hide();=0A= }=0A= else {=0A= this._storeLocation();=0A= Windows.unsetOverflow(this);=0A= =0A= var windowScroll =3D WindowUtilities.getWindowScroll();=0A= var pageSize =3D WindowUtilities.getPageSize(); =0A= =0A= this.element.setStyle(this.useLeft ? {left: windowScroll.left} : = {right: windowScroll.left});=0A= this.element.setStyle(this.useTop ? {top: windowScroll.top} : = {bottom: windowScroll.top});=0A= =0A= this.setSize(pageSize.windowWidth - this.widthW - this.widthE, = pageSize.windowHeight - this.heightN - this.heightS)=0A= this.toFront();=0A= if (this.iefix) =0A= this._fixIEOverlapping(); =0A= }=0A= Windows.notify("onMaximize", this);=0A= =0A= // Store new location/size if need be=0A= this._saveCookie()=0A= },=0A= =0A= isMinimized: function() {=0A= var r2 =3D $(this.getId() + "_row2");=0A= return !r2.visible();=0A= },=0A= =0A= isMaximized: function() {=0A= return (this.storedLocation !=3D null);=0A= },=0A= =0A= setOpacity: function(opacity) {=0A= if (Element.setOpacity)=0A= Element.setOpacity(this.element, opacity);=0A= },=0A= =0A= setZIndex: function(zindex) {=0A= this.element.setStyle({zIndex: zindex});=0A= Windows.updateZindex(zindex, this);=0A= },=0A= =0A= setTitle: function(newTitle) {=0A= if (!newTitle || newTitle =3D=3D "") =0A= newTitle =3D " ";=0A= =0A= Element.update(this.element.id + '_top', newTitle);=0A= },=0A= =0A= setStatusBar: function(element) {=0A= var statusBar =3D $(this.getId() + "_bottom");=0A= =0A= if (typeof(element) =3D=3D "object") {=0A= if (this.bottombar.firstChild)=0A= this.bottombar.replaceChild(element, this.bottombar.firstChild);=0A= else=0A= this.bottombar.appendChild(element);=0A= }=0A= else=0A= this.bottombar.innerHTML =3D element;=0A= },=0A= =0A= _checkIEOverlapping: function() {=0A= if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && = (navigator.userAgent.indexOf('Opera')<0) && = (this.element.getStyle('position')=3D=3D'absolute')) {=0A= new Insertion.After(this.element.id, '');=0A= this.iefix =3D $(this.element.id+'_iefix');=0A= }=0A= if(this.iefix) =0A= setTimeout(this._fixIEOverlapping.bind(this), 50);=0A= },=0A= =0A= _fixIEOverlapping: function() {=0A= Position.clone(this.element, this.iefix);=0A= this.iefix.style.zIndex =3D this.element.style.zIndex - 1;=0A= this.iefix.show();=0A= },=0A= =0A= _getWindowBorderSize: function(event) {=0A= // Hack to get real window border size!!=0A= var div =3D this._createHiddenDiv(this.options.className + "_n")=0A= this.heightN =3D Element.getDimensions(div).height; =0A= div.parentNode.removeChild(div)=0A= =0A= var div =3D this._createHiddenDiv(this.options.className + "_s")=0A= this.heightS =3D Element.getDimensions(div).height; =0A= div.parentNode.removeChild(div)=0A= =0A= var div =3D this._createHiddenDiv(this.options.className + "_e")=0A= this.widthE =3D Element.getDimensions(div).width; =0A= div.parentNode.removeChild(div)=0A= =0A= var div =3D this._createHiddenDiv(this.options.className + "_w")=0A= this.widthW =3D Element.getDimensions(div).width;=0A= div.parentNode.removeChild(div);=0A= // Safari size fix=0A= if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))=0A= this.setSize(this.width, this.height);=0A= if (this.doMaximize)=0A= this.maximize();=0A= if (this.doMinimize)=0A= this.minimize();=0A= },=0A= =0A= _createHiddenDiv: function(className) {=0A= var objBody =3D document.getElementsByTagName("body").item(0);=0A= var win =3D document.createElement("div");=0A= win.setAttribute('id', this.element.id+ "_tmp");=0A= win.className =3D className;=0A= win.style.display =3D 'none'=0A= win.innerHTML =3D ''=0A= objBody.insertBefore(win, objBody.firstChild) =0A= return win=0A= },=0A= =0A= _storeLocation: function() {=0A= if (this.storedLocation =3D=3D null) {=0A= this.storedLocation =3D {useTop: this.useTop, useLeft: = this.useLeft, =0A= top: this.element.getStyle('top'), bottom: = this.element.getStyle('bottom'),=0A= left: this.element.getStyle('left'), right: = this.element.getStyle('right'),=0A= width: this.width, height: this.height };=0A= }=0A= },=0A= =0A= _restoreLocation: function() {=0A= if (this.storedLocation !=3D null) {=0A= this.useLeft =3D this.storedLocation.useLeft;=0A= this.useTop =3D this.storedLocation.useTop;=0A= =0A= this.element.setStyle(this.useLeft ? {left: = this.storedLocation.left} : {right: this.storedLocation.right});=0A= this.element.setStyle(this.useTop ? {top: this.storedLocation.top} : = {bottom: this.storedLocation.bottom});=0A= this.setSize(this.storedLocation.width, this.storedLocation.height);=0A= =0A= Windows.resetOverflow();=0A= this._removeStoreLocation();=0A= }=0A= },=0A= =0A= _removeStoreLocation: function() {=0A= this.storedLocation =3D null;=0A= },=0A= =0A= _saveCookie: function() {=0A= if (this.cookie) {=0A= var value =3D "";=0A= if (this.useLeft)=0A= value +=3D "l:" + (this.storedLocation ? this.storedLocation.left = : this.element.getStyle('left'))=0A= else=0A= value +=3D "r:" + (this.storedLocation ? this.storedLocation.right = : this.element.getStyle('right'))=0A= if (this.useTop)=0A= value +=3D ",t:" + (this.storedLocation ? this.storedLocation.top : = this.element.getStyle('top'))=0A= else=0A= value +=3D ",b:" + (this.storedLocation ? = this.storedLocation.bottom :this.element.getStyle('bottom'))=0A= =0A= value +=3D "," + (this.storedLocation ? this.storedLocation.width : = this.width);=0A= value +=3D "," + (this.storedLocation ? this.storedLocation.height : = this.height);=0A= value +=3D "," + this.isMinimized();=0A= value +=3D "," + this.isMaximized();=0A= WindowUtilities.setCookie(value, this.cookie)=0A= }=0A= }=0A= };=0A= =0A= // Windows containers, register all page windows=0A= var Windows =3D {=0A= windows: [],=0A= observers: [],=0A= focusedWindow: null,=0A= maxZIndex: 0,=0A= =0A= addObserver: function(observer) {=0A= this.removeObserver(observer);=0A= this.observers.push(observer);=0A= },=0A= =0A= removeObserver: function(observer) { =0A= this.observers =3D this.observers.reject( function(o) { return = o=3D=3Dobserver });=0A= },=0A= =0A= notify: function(eventName, win) { // onStartResize(), = onEndResize(), onStartMove(), onEndMove(), onClose(), onDestroy(), = onMinimize(), onMaximize(), onHide(), onShow(), onFocus()=0A= this.observers.each( function(o) {if(o[eventName]) = o[eventName](eventName, win);});=0A= },=0A= =0A= // Gets window from its id=0A= getWindow: function(id) {=0A= return this.windows.detect(function(d) { return d.getId() =3D=3Did });=0A= },=0A= =0A= // Gets the last focused window=0A= getFocusedWindow: function() {=0A= return this.focusedWindow;=0A= },=0A= =0A= // Registers a new window (called by Windows constructor)=0A= register: function(win) {=0A= this.windows.push(win);=0A= },=0A= =0A= // Unregisters a window (called by Windows destructor)=0A= unregister: function(win) {=0A= this.windows =3D this.windows.reject(function(d) { return d=3D=3Dwin = });=0A= }, =0A= =0A= // Closes a window with its id=0A= close: function(id) {=0A= var win =3D this.getWindow(id);=0A= // Asks delegate if exists=0A= if (win) {=0A= if (win.getDelegate() && ! win.getDelegate().canClose(win)) =0A= return;=0A= if ($(id + "_close"))=0A= $(id + "_close").onclick =3D null;=0A= if ($(id + "_minimize"))=0A= $(id + "_minimize").onclick =3D null; =0A= if ($(id + "_maximize"))=0A= $(id + "_maximize").onclick =3D null; =0A= =0A= this.notify("onClose", win);=0A= win.hide();=0A= }=0A= },=0A= =0A= // Closes all windows=0A= closeAll: function() { =0A= this.windows.each( function(w) {Windows.close(w.getId())} );=0A= },=0A= =0A= // Minimizes a window with its id=0A= minimize: function(id) {=0A= var win =3D this.getWindow(id)=0A= if (win)=0A= win.minimize();=0A= },=0A= =0A= // Maximizes a window with its id=0A= maximize: function(id) {=0A= var win =3D this.getWindow(id)=0A= if (win)=0A= win.maximize();=0A= },=0A= =0A= unsetOverflow: function(except) { =0A= this.windows.each(function(d) { d.oldOverflow =3D = d.getContent().getStyle("overflow") || "auto" ; = d.getContent().setStyle({overflow: "hidden"}) });=0A= if (except && except.oldOverflow)=0A= except.getContent().setStyle({overflow: except.oldOverflow});=0A= },=0A= =0A= resetOverflow: function() {=0A= this.windows.each(function(d) { if (d.oldOverflow) = d.getContent().setStyle({overflow: d.oldOverflow}) });=0A= },=0A= =0A= updateZindex: function(zindex, win) {=0A= if (zindex > this.maxZIndex)=0A= this.maxZIndex =3D zindex;=0A= this.focusedWindow =3D win;=0A= }=0A= };=0A= =0A= var Dialog =3D {=0A= dialogId: null,=0A= win: null,=0A= onCompleteFunc: null,=0A= callFunc: null, =0A= parameters: null, =0A= =0A= confirm: function(content, parameters) {=0A= // Get Ajax return before=0A= if (typeof content !=3D "string") {=0A= Dialog._runAjaxRequest(content, parameters, Dialog.confirm);=0A= return =0A= }=0A= =0A= parameters =3D parameters || {};=0A= var okLabel =3D parameters.okLabel ? parameters.okLabel : "Ok";=0A= var cancelLabel =3D parameters.cancelLabel ? parameters.cancelLabel : = "Cancel";=0A= =0A= var windowParam =3D parameters.windowParameters || {};=0A= windowParam.className =3D windowParam.className || "alert";=0A= =0A= okButtonClass =3D "class =3D'" + (parameters.buttonClass ? = parameters.buttonClass + " " : "") + " ok_button'" =0A= cancelButtonClass =3D "class =3D'" + (parameters.buttonClass ? = parameters.buttonClass + " " : "") + " cancel_button'" =0A= var content =3D "\=0A=
    " + content + = "
    \=0A=
    \=0A= \=0A= \=0A=
    \=0A= ";=0A= this._openDialog(content, parameters)=0A= return this.win=0A= },=0A= =0A= alert: function(content, parameters) {=0A= // Get Ajax return before=0A= if (typeof content !=3D "string") {=0A= Dialog._runAjaxRequest(content, parameters, Dialog.alert);=0A= return =0A= }=0A= =0A= parameters =3D parameters || {};=0A= var okLabel =3D parameters.okLabel ? parameters.okLabel : "Ok";=0A= =0A= var windowParam =3D parameters.windowParameters || {};=0A= windowParam.className =3D windowParam.className || "alert";=0A= =0A= okButtonClass =3D "class =3D'" + (parameters.buttonClass ? = parameters.buttonClass + " " : "") + " ok_button'" =0A= var content =3D "\=0A=
    " + content + = "
    \=0A=
    \=0A= \=0A=
    ";=0A= return this._openDialog(content, parameters)=0A= },=0A= =0A= info: function(content, parameters) { =0A= // Get Ajax return before=0A= if (typeof content !=3D "string") {=0A= Dialog._runAjaxRequest(content, parameters, Dialog.info);=0A= return =0A= }=0A= =0A= parameters =3D parameters || {};=0A= parameters.windowParameters =3D parameters.windowParameters || {};=0A= =0A= var className =3D parameters.windowParameters.className || "alert";=0A= =0A= var content =3D "
    " + content + "
    ";=0A= if (parameters.showProgress)=0A= content +=3D "
    ";=0A= =0A= parameters.windowParameters.ok =3D null;=0A= parameters.windowParameters.cancel =3D null;=0A= parameters.windowParameters.className =3D className;=0A= =0A= return this._openDialog(content, parameters)=0A= },=0A= =0A= setInfoMessage: function(message) {=0A= $('modal_dialog_message').update(message);=0A= },=0A= =0A= closeInfo: function() {=0A= Windows.close(this.dialogId);=0A= },=0A= =0A= _openDialog: function(content, parameters) {=0A= // remove old dialog=0A= if (this.win) =0A= this.win.destroy();=0A= =0A= if (! parameters.windowParameters.height && ! = parameters.windowParameters.width) {=0A= parameters.windowParameters.width =3D = WindowUtilities.getPageSize().pageWidth / 2;=0A= }=0A= this.dialogId =3D parameters.id ? parameters.id : 'modal_dialog'=0A= =0A= // compute height or width if need be=0A= if (! parameters.windowParameters.height || ! = parameters.windowParameters.width) {=0A= var size =3D WindowUtilities._computeSize(content, this.dialogId, = parameters.windowParameters.width, parameters.windowParameters.height)=0A= if (parameters.windowParameters.height)=0A= parameters.windowParameters.width =3D size + 5=0A= else=0A= parameters.windowParameters.height =3D size + 5=0A= }=0A= var windowParam =3D parameters && parameters.windowParameters ? = parameters.windowParameters : {};=0A= windowParam.resizable =3D windowParam.resizable || false;=0A= =0A= windowParam.effectOptions =3D windowParam.effectOptions || {duration: = 1};=0A= windowParam.minimizable =3D false;=0A= windowParam.maximizable =3D false;=0A= windowParam.closable =3D false;=0A= this.win =3D new Window(this.dialogId, windowParam);=0A= this.win.getContent().innerHTML =3D content;=0A= this.win.showCenter(true, parameters.top, parameters.left); =0A= =0A= this.win.cancelCallback =3D parameters.cancel;=0A= this.win.okCallback =3D parameters.ok;=0A= =0A= return this.win; =0A= },=0A= =0A= _getAjaxContent: function(originalRequest) {=0A= Dialog.callFunc(originalRequest.responseText, Dialog.parameters)=0A= },=0A= =0A= _runAjaxRequest: function(message, parameters, callFunc) {=0A= if (message.options =3D=3D null)=0A= message.options =3D{} =0A= Dialog.onCompleteFunc =3D message.options.onComplete;=0A= Dialog.parameters =3D parameters;=0A= Dialog.callFunc =3D callFunc;=0A= =0A= message.options.onComplete =3D Dialog._getAjaxContent;=0A= new Ajax.Request(message.url, message.options);=0A= },=0A= =0A= okCallback: function() {=0A= if (!this.win.okCallback || this.win.okCallback(this.win))=0A= this.win.hide();=0A= },=0A= =0A= cancelCallback: function() {=0A= this.win.hide();=0A= if (this.win.cancelCallback)=0A= this.win.cancelCallback(this.win);=0A= }=0A= }=0A= /*=0A= Based on Lightbox JS: Fullsize Image Overlays =0A= by Lokesh Dhakar - http://www.huddletogether.com=0A= =0A= For more information on this script, visit:=0A= http://huddletogether.com/projects/lightbox/=0A= =0A= Licensed under the Creative Commons Attribution 2.5 License - = http://creativecommons.org/licenses/by/2.5/=0A= (basically, do anything you want, just leave my name and link)=0A= */=0A= =0A= var isIE =3D navigator.appVersion.match(/MSIE/) =3D=3D "MSIE";=0A= =0A= var WindowUtilities =3D {=0A= // From script.aculo.us=0A= getWindowScroll: function() {=0A= var w =3D window;=0A= var T, L, W, H;=0A= with (w.document) {=0A= if (w.document.documentElement && documentElement.scrollTop) {=0A= T =3D documentElement.scrollTop;=0A= L =3D documentElement.scrollLeft;=0A= } else if (w.document.body) {=0A= T =3D body.scrollTop;=0A= L =3D body.scrollLeft;=0A= }=0A= if (w.innerWidth) {=0A= W =3D w.innerWidth;=0A= H =3D w.innerHeight;=0A= } else if (w.document.documentElement && = documentElement.clientWidth) {=0A= W =3D documentElement.clientWidth;=0A= H =3D documentElement.clientHeight;=0A= } else {=0A= W =3D body.offsetWidth;=0A= H =3D body.offsetHeight=0A= }=0A= }=0A= return { top: T, left: L, width: W, height: H };=0A= =0A= }, =0A= //=0A= // getPageSize()=0A= // Returns array with page width, height and window width, height=0A= // Core code from - quirksmode.org=0A= // Edit for Firefox by pHaez=0A= //=0A= getPageSize: function(){=0A= var xScroll, yScroll;=0A= =0A= if (window.innerHeight && window.scrollMaxY) { =0A= xScroll =3D document.body.scrollWidth;=0A= yScroll =3D window.innerHeight + window.scrollMaxY;=0A= } else if (document.body.scrollHeight > document.body.offsetHeight){ = // all but Explorer Mac=0A= xScroll =3D document.body.scrollWidth;=0A= yScroll =3D document.body.scrollHeight;=0A= } else { // Explorer Mac...would also work in Explorer 6 Strict, = Mozilla and Safari=0A= xScroll =3D document.body.offsetWidth;=0A= yScroll =3D document.body.offsetHeight;=0A= }=0A= =0A= var windowWidth, windowHeight;=0A= =0A= if (self.innerHeight) { // all except Explorer=0A= windowWidth =3D self.innerWidth;=0A= windowHeight =3D self.innerHeight;=0A= } else if (document.documentElement && = document.documentElement.clientHeight) { // Explorer 6 Strict Mode=0A= windowWidth =3D document.documentElement.clientWidth;=0A= windowHeight =3D document.documentElement.clientHeight;=0A= } else if (document.body) { // other Explorers=0A= windowWidth =3D document.body.clientWidth;=0A= windowHeight =3D document.body.clientHeight;=0A= } =0A= var pageHeight, pageWidth;=0A= =0A= // for small pages with total height less then height of the viewport=0A= if(yScroll < windowHeight){=0A= pageHeight =3D windowHeight;=0A= } else { =0A= pageHeight =3D yScroll;=0A= }=0A= =0A= // for small pages with total width less then width of the viewport=0A= if(xScroll < windowWidth){ =0A= pageWidth =3D windowWidth;=0A= } else {=0A= pageWidth =3D xScroll;=0A= }=0A= =0A= return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: = windowWidth, windowHeight: windowHeight};=0A= },=0A= =0A= disableScreen: function(className, overlayId, contentId) {=0A= WindowUtilities.initLightbox(overlayId, className);=0A= var objBody =3D document.getElementsByTagName("body").item(0);=0A= =0A= // prep objects=0A= var objOverlay =3D $(overlayId);=0A= =0A= var pageSize =3D WindowUtilities.getPageSize();=0A= =0A= // Hide select boxes as they will 'peek' through the image in IE=0A= if (contentId && isIE) {=0A= $$('select').each(function(element) {element.style.visibility =3D = "hidden"});=0A= $$('#'+contentId+' select').each(function(element) = {element.style.visibility =3D "visible"});=0A= } =0A= =0A= // set height of Overlay to take up whole page and show=0A= objOverlay.style.height =3D (pageSize.pageHeight + 'px');=0A= objOverlay.style.width =3D (pageSize.windowWidth + 'px');=0A= objOverlay.style.display =3D 'block'; =0A= },=0A= =0A= enableScreen: function(id) {=0A= id =3D id || 'overlay_modal'=0A= var objOverlay =3D $(id);=0A= if (objOverlay) {=0A= // hide lightbox and overlay=0A= objOverlay.style.display =3D 'none';=0A= =0A= // make select boxes visible=0A= if (isIE) {=0A= $$('select').each(function(element) {element.style.visibility = =3D "visible"});=0A= }=0A= objOverlay.parentNode.removeChild(objOverlay);=0A= }=0A= },=0A= =0A= // initLightbox()=0A= // Function runs on window load, going through link tags looking for = rel=3D"lightbox".=0A= // These links receive onclick events that enable the lightbox display = for their targets.=0A= // The function also inserts html markup at the top of the page which = will be used as a=0A= // container for the overlay pattern and the inline image.=0A= initLightbox: function(id, className) {=0A= // Already done, just update zIndex=0A= if ($(id)) {=0A= Element.setStyle(id, {zIndex: Windows.maxZIndex + 10});=0A= }=0A= // create overlay div and hardcode some functional styles (aesthetic = styles are in CSS file)=0A= else {=0A= var objBody =3D document.getElementsByTagName("body").item(0);=0A= var objOverlay =3D document.createElement("div");=0A= objOverlay.setAttribute('id', id);=0A= objOverlay.className =3D "overlay_" + className=0A= objOverlay.style.display =3D 'none';=0A= objOverlay.style.position =3D 'absolute';=0A= objOverlay.style.top =3D '0';=0A= objOverlay.style.left =3D '0';=0A= objOverlay.style.zIndex =3D Windows.maxZIndex + 10;=0A= objOverlay.style.width =3D '100%';=0A= objBody.insertBefore(objOverlay, objBody.firstChild);=0A= }=0A= },=0A= =0A= setCookie: function(value, parameters) {=0A= document.cookie=3D parameters[0] + "=3D" + escape(value) +=0A= ((parameters[1]) ? "; expires=3D" + parameters[1].toGMTString() : = "") +=0A= ((parameters[2]) ? "; path=3D" + parameters[2] : "") +=0A= ((parameters[3]) ? "; domain=3D" + parameters[3] : "") +=0A= ((parameters[4]) ? "; secure" : "");=0A= },=0A= =0A= getCookie: function(name) {=0A= var dc =3D document.cookie;=0A= var prefix =3D name + "=3D";=0A= var begin =3D dc.indexOf("; " + prefix);=0A= if (begin =3D=3D -1) {=0A= begin =3D dc.indexOf(prefix);=0A= if (begin !=3D 0) return null;=0A= } else {=0A= begin +=3D 2;=0A= }=0A= var end =3D document.cookie.indexOf(";", begin);=0A= if (end =3D=3D -1) {=0A= end =3D dc.length;=0A= }=0A= return unescape(dc.substring(begin + prefix.length, end));=0A= },=0A= =0A= _computeSize: function(content, id, width, height, margin) {=0A= if (margin =3D=3D null)=0A= margin =3D 5;=0A= =0A= var objBody =3D document.getElementsByTagName("body").item(0);=0A= var tmpObj =3D document.createElement("div");=0A= tmpObj.setAttribute('id', id);=0A= =0A= if (height)=0A= tmpObj.style.height =3D height + "px"=0A= else=0A= tmpObj.style.width =3D width + "px"=0A= =0A= tmpObj.style.position =3D 'absolute';=0A= tmpObj.style.top =3D '0';=0A= tmpObj.style.left =3D '0';=0A= tmpObj.style.display =3D 'none';=0A= =0A= tmpObj.innerHTML =3D content;=0A= objBody.insertBefore(tmpObj, objBody.firstChild);=0A= =0A= var size;=0A= if (height)=0A= size =3D $(id).getDimensions().width + margin;=0A= else=0A= size =3D $(id).getDimensions().height + margin;=0A= objBody.removeChild(tmpObj);=0A= =0A= return size;=0A= } =0A= }=0A= =0A= =0A= ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: 7bit Content-Location: http://media.collegepublisher.com/media/scripts/youarehere.js YouAreHere = function(element) { var login = document.getElementById('cp_tab_login'); var verify = document.getElementById('cp_tab_verify'); var loginBox = document.getElementById('cp_box_login'); var verifyBox = document.getElementById('cp_box_verify'); var tabHeader = document.getElementById('cp_tab_header'); var emailBox = document.getElementById('email'); var usernameBox = document.getElementById('username'); if (element == 'cp_tab_login') { login.className = 'cp_active'; verify.className = ''; loginBox.className = 'cp_show'; verifyBox.className = 'cp_hide'; usernameBox.focus(); } if (element == 'cp_tab_verify') { verify.className = 'cp_active'; login.className = ''; loginBox.className = 'cp_hide'; verifyBox.className = 'cp_show'; emailBox.focus(); } } function greyoutbox(theformbutton) { theformbutton.disabled = 1; } ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/spry/xpath.js /* xpath.js - Revision: Spry Preview Release 1.3 */ // Copyright (c) 2005, Google Inc. // All rights reserved. //=20 // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions = are // met: // =20 // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. //=20 // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in = the // documentation and/or other materials provided with the // distribution. //=20 // * Neither the name of Google Inc. nor the names of its contributors // may be used to endorse or promote products derived from this // software without specific prior written permission. //=20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // An XPath parser and evaluator written in JavaScript. The // implementation is complete except for functions handling // namespaces. // // Reference: [XPATH] XPath Specification // . // // // The API of the parser has several parts: // // 1. The parser function xpathParse() that takes a string and returns // an expession object. // // 2. The expression object that has an evaluate() method to evaluate = the // XPath expression it represents. (It is actually a hierarchy of // objects that resembles the parse tree, but an application will call // evaluate() only on the top node of this hierarchy.) // // 3. The context object that is passed as an argument to the evaluate() // method, which represents the DOM context in which the expression is // evaluated. // // 4. The value object that is returned from evaluate() and represents // values of the different types that are defined by XPath (number, // string, boolean, and node-set), and allows to convert between them. // // These parts are near the top of the file, the functions and data // that are used internally follow after them. // // // TODO(mesch): add jsdoc comments. Use more coherent naming. // // // Author: Steffen Meschkat // The entry point for the parser. // // @param expr a string that contains an XPath expression. // @return an expression object that can be evaluated with an // expression context. function xpathParse(expr) { if (xpathdebug) { Log.write('XPath parse ' + expr); } xpathParseInit(); var cached =3D xpathCacheLookup(expr); if (cached) { if (xpathdebug) { Log.write(' ... cached'); } return cached; } // Optimize for a few common cases: simple attribute node tests // (@id), simple element node tests (page), variable references // ($address), numbers (4), multi-step path expressions where each // step is a plain element node test // (page/overlay/locations/location). =20 if (expr.match(/^(\$|@)?\w+$/i)) { var ret =3D makeSimpleExpr(expr); xpathParseCache[expr] =3D ret; if (xpathdebug) { Log.write(' ... simple'); } return ret; } if (expr.match(/^\w+(\/\w+)*$/i)) { var ret =3D makeSimpleExpr2(expr); xpathParseCache[expr] =3D ret; if (xpathdebug) { Log.write(' ... simple 2'); } return ret; } var cachekey =3D expr; // expr is modified during parse if (xpathdebug) { Timer.start('XPath parse', cachekey); } var stack =3D []; var ahead =3D null; var previous =3D null; var done =3D false; var parse_count =3D 0; var lexer_count =3D 0; var reduce_count =3D 0; =20 while (!done) { parse_count++; expr =3D expr.replace(/^\s*/, ''); previous =3D ahead; ahead =3D null; var rule =3D null; var match =3D ''; for (var i =3D 0; i < xpathTokenRules.length; ++i) { var result =3D xpathTokenRules[i].re.exec(expr); lexer_count++; if (result && result.length > 0 && result[0].length > = match.length) { rule =3D xpathTokenRules[i]; match =3D result[0]; break; } } // Special case: allow operator keywords to be element and // variable names. // NOTE(mesch): The parser resolves conflicts by looking ahead, // and this is the only case where we look back to // disambiguate. So this is indeed something different, and // looking back is usually done in the lexer (via states in the // general case, called "start conditions" in flex(1)). Also,the // conflict resolution in the parser is not as robust as it could // be, so I'd like to keep as much off the parser as possible (all // these precedence values should be computed from the grammar // rules and possibly associativity declarations, as in bison(1), // and not explicitly set. if (rule && (rule =3D=3D TOK_DIV ||=20 rule =3D=3D TOK_MOD || rule =3D=3D TOK_AND ||=20 rule =3D=3D TOK_OR) && (!previous ||=20 previous.tag =3D=3D TOK_AT ||=20 previous.tag =3D=3D TOK_DSLASH ||=20 previous.tag =3D=3D TOK_SLASH || previous.tag =3D=3D TOK_AXIS ||=20 previous.tag =3D=3D TOK_DOLLAR)) { rule =3D TOK_QNAME; } if (rule) { expr =3D expr.substr(match.length); if (xpathdebug) { Log.write('token: ' + match + ' -- ' + rule.label); } ahead =3D { tag: rule, match: match, prec: rule.prec ? rule.prec : 0, // || 0 is removed by the = compiler expr: makeTokenExpr(match) }; } else { if (xpathdebug) { Log.write('DONE'); } done =3D true; } while (xpathReduce(stack, ahead)) { reduce_count++; if (xpathdebug) { Log.write('stack: ' + stackToString(stack)); } } } if (xpathdebug) { Log.write(stackToString(stack)); } if (stack.length !=3D 1) { throw 'XPath parse error ' + cachekey + ':\n' + = stackToString(stack); } var result =3D stack[0].expr; xpathParseCache[cachekey] =3D result; if (xpathdebug) { Timer.end('XPath parse', cachekey); } if (xpathdebug) { Log.write('XPath parse: ' + parse_count + ' / ' +=20 lexer_count + ' / ' + reduce_count); } return result; } var xpathParseCache =3D {}; function xpathCacheLookup(expr) { return xpathParseCache[expr]; } function xpathReduce(stack, ahead) { var cand =3D null; if (stack.length > 0) { var top =3D stack[stack.length-1]; var ruleset =3D xpathRules[top.tag.key]; if (ruleset) { for (var i =3D 0; i < ruleset.length; ++i) { var rule =3D ruleset[i]; var match =3D xpathMatchStack(stack, rule[1]); if (match.length) { cand =3D { tag: rule[0], rule: rule, match: match }; cand.prec =3D xpathGrammarPrecedence(cand); break; } } } } var ret; if (cand && (!ahead || cand.prec > ahead.prec ||=20 (ahead.tag.left && cand.prec >=3D ahead.prec))) { for (var i =3D 0; i < cand.match.matchlength; ++i) { stack.pop(); } if (xpathdebug) { Log.write('reduce ' + cand.tag.label + ' ' + cand.prec + ' ahead ' + (ahead ? ahead.tag.label + ' ' + ahead.prec = +=20 (ahead.tag.left ? ' left' : '') : ' none ')); } var matchexpr =3D mapExpr(cand.match, function(m) { return m.expr; = }); cand.expr =3D cand.rule[3].apply(null, matchexpr); stack.push(cand); ret =3D true; } else { if (ahead) { if (xpathdebug) { Log.write('shift ' + ahead.tag.label + ' ' + ahead.prec +=20 (ahead.tag.left ? ' left' : '') + ' over ' + (cand ? cand.tag.label + ' ' +=20 cand.prec : ' none')); } stack.push(ahead); } ret =3D false; } return ret; } function xpathMatchStack(stack, pattern) { // NOTE(mesch): The stack matches for variable cardinality are // greedy but don't do backtracking. This would be an issue only // with rules of the form A* A, i.e. with an element with variable // cardinality followed by the same element. Since that doesn't // occur in the grammar at hand, all matches on the stack are // unambiguous. var S =3D stack.length; var P =3D pattern.length; var p, s; var match =3D []; match.matchlength =3D 0; var ds =3D 0; for (p =3D P - 1, s =3D S - 1; p >=3D 0 && s >=3D 0; --p, s -=3D ds) { ds =3D 0; var qmatch =3D []; if (pattern[p] =3D=3D Q_MM) { p -=3D 1; match.push(qmatch); while (s - ds >=3D 0 && stack[s - ds].tag =3D=3D pattern[p]) { qmatch.push(stack[s - ds]); ds +=3D 1; match.matchlength +=3D 1; } } else if (pattern[p] =3D=3D Q_01) { p -=3D 1; match.push(qmatch); while (s - ds >=3D 0 && ds < 2 && stack[s - ds].tag =3D=3D = pattern[p]) { qmatch.push(stack[s - ds]); ds +=3D 1; match.matchlength +=3D 1; } } else if (pattern[p] =3D=3D Q_1M) { p -=3D 1; match.push(qmatch); if (stack[s].tag =3D=3D pattern[p]) { while (s - ds >=3D 0 && stack[s - ds].tag =3D=3D pattern[p]) { qmatch.push(stack[s - ds]); ds +=3D 1; match.matchlength +=3D 1; } } else { return []; } } else if (stack[s].tag =3D=3D pattern[p]) { match.push(stack[s]); ds +=3D 1; match.matchlength +=3D 1; } else { return []; } reverseInplace(qmatch); qmatch.expr =3D mapExpr(qmatch, function(m) { return m.expr; }); } reverseInplace(match); if (p =3D=3D -1) { return match; } else { return []; } } function xpathTokenPrecedence(tag) { return tag.prec || 2; } function xpathGrammarPrecedence(frame) { var ret =3D 0; if (frame.rule) { /* normal reduce */ if (frame.rule.length >=3D 3 && frame.rule[2] >=3D 0) { ret =3D frame.rule[2]; } else { for (var i =3D 0; i < frame.rule[1].length; ++i) { var p =3D xpathTokenPrecedence(frame.rule[1][i]); ret =3D Math.max(ret, p); } } } else if (frame.tag) { /* TOKEN match */ ret =3D xpathTokenPrecedence(frame.tag); } else if (frame.length) { /* Q_ match */ for (var j =3D 0; j < frame.length; ++j) { var p =3D xpathGrammarPrecedence(frame[j]); ret =3D Math.max(ret, p); } } return ret; } function stackToString(stack) { var ret =3D ''; for (var i =3D 0; i < stack.length; ++i) { if (ret) { ret +=3D '\n'; } ret +=3D stack[i].tag.label; } return ret; } // XPath expression evaluation context. An XPath context consists of a // DOM node, a list of DOM nodes that contains this node, a number // that represents the position of the single node in the list, and a // current set of variable bindings. (See XPath spec.) // // The interface of the expression context: // // Constructor -- gets the node, its position, the node set it // belongs to, and a parent context as arguments. The parent context // is used to implement scoping rules for variables: if a variable // is not found in the current context, it is looked for in the // parent context, recursively. Except for node, all arguments have // default values: default position is 0, default node set is the // set that contains only the node, and the default parent is null. // // Notice that position starts at 0 at the outside interface; // inside XPath expressions this shows up as position()=3D1. // // clone() -- creates a new context with the current context as // parent. If passed as argument to clone(), the new context has a // different node, position, or node set. What is not passed is // inherited from the cloned context. // // setVariable(name, expr) -- binds given XPath expression to the // name. // // getVariable(name) -- what the name says. // // setNode(node, position) -- sets the context to the new node and // its corresponding position. Needed to implement scoping rules for // variables in XPath. (A variable is visible to all subsequent // siblings, not only to its children.) function ExprContext(node, position, nodelist, parent) { this.node =3D node; this.position =3D position || 0; this.nodelist =3D nodelist || [ node ]; this.variables =3D {}; this.parent =3D parent || null; this.root =3D parent ? parent.root : node.ownerDocument; } ExprContext.prototype.clone =3D function(node, position, nodelist) { return new ExprContext(node || this.node, typeof position !=3D 'undefined' ? position : = this.position, nodelist || this.nodelist, this); }; ExprContext.prototype.setVariable =3D function(name, value) { this.variables[name] =3D value; }; ExprContext.prototype.getVariable =3D function(name) { if (typeof this.variables[name] !=3D 'undefined') { return this.variables[name]; } else if (this.parent) { return this.parent.getVariable(name); } else { return null; } } ExprContext.prototype.setNode =3D function(node, position) { this.node =3D node; this.position =3D position; } // XPath expression values. They are what XPath expressions evaluate // to. Strangely, the different value types are not specified in the // XPath syntax, but only in the semantics, so they don't show up as // nonterminals in the grammar. Yet, some expressions are required to // evaluate to particular types, and not every type can be coerced // into every other type. Although the types of XPath values are // similar to the types present in JavaScript, the type coercion rules // are a bit peculiar, so we explicitly model XPath types instead of // mapping them onto JavaScript types. (See XPath spec.) // // The four types are: // // StringValue // // NumberValue // // BooleanValue // // NodeSetValue // // The common interface of the value classes consists of methods that // implement the XPath type coercion rules: // // stringValue() -- returns the value as a JavaScript String, // // numberValue() -- returns the value as a JavaScript Number, // // booleanValue() -- returns the value as a JavaScript Boolean, // // nodeSetValue() -- returns the value as a JavaScript Array of DOM // Node objects. // function StringValue(value) { this.value =3D value; this.type =3D 'string'; } StringValue.prototype.stringValue =3D function() { return this.value; } StringValue.prototype.booleanValue =3D function() { return this.value.length > 0; } StringValue.prototype.numberValue =3D function() { return this.value - 0; } StringValue.prototype.nodeSetValue =3D function() { throw this + ' ' + Error().stack; } function BooleanValue(value) { this.value =3D value; this.type =3D 'boolean'; } BooleanValue.prototype.stringValue =3D function() { return '' + this.value; } BooleanValue.prototype.booleanValue =3D function() { return this.value; } BooleanValue.prototype.numberValue =3D function() { return this.value ? 1 : 0; } BooleanValue.prototype.nodeSetValue =3D function() { throw this + ' ' + Error().stack; } function NumberValue(value) { this.value =3D value; this.type =3D 'number'; } NumberValue.prototype.stringValue =3D function() { return '' + this.value; } NumberValue.prototype.booleanValue =3D function() { return !!this.value; } NumberValue.prototype.numberValue =3D function() { return this.value - 0; } NumberValue.prototype.nodeSetValue =3D function() { throw this + ' ' + Error().stack; } function NodeSetValue(value) { this.value =3D value; this.type =3D 'node-set'; } NodeSetValue.prototype.stringValue =3D function() { if (this.value.length =3D=3D 0) { return ''; } else { return xmlValue(this.value[0]); } } NodeSetValue.prototype.booleanValue =3D function() { return this.value.length > 0; } NodeSetValue.prototype.numberValue =3D function() { return this.stringValue() - 0; } NodeSetValue.prototype.nodeSetValue =3D function() { return this.value; }; // XPath expressions. They are used as nodes in the parse tree and // possess an evaluate() method to compute an XPath value given an XPath // context. Expressions are returned from the parser. Teh set of // expression classes closely mirrors the set of non terminal symbols // in the grammar. Every non trivial nonterminal symbol has a // corresponding expression class. // // The common expression interface consists of the following methods: // // evaluate(context) -- evaluates the expression, returns a value. // // toString() -- returns the XPath text representation of the // expression (defined in xsltdebug.js). // // parseTree(indent) -- returns a parse tree representation of the // expression (defined in xsltdebug.js). function TokenExpr(m) { this.value =3D m; } TokenExpr.prototype.evaluate =3D function() { return new StringValue(this.value); }; function LocationExpr() { this.absolute =3D false; this.steps =3D []; } LocationExpr.prototype.appendStep =3D function(s) { this.steps.push(s); } LocationExpr.prototype.prependStep =3D function(s) { var steps0 =3D this.steps; this.steps =3D [ s ]; for (var i =3D 0; i < steps0.length; ++i) { this.steps.push(steps0[i]); } }; LocationExpr.prototype.evaluate =3D function(ctx) { var start; if (this.absolute) { start =3D ctx.root; } else { start =3D ctx.node; } var nodes =3D []; xPathStep(nodes, this.steps, 0, start, ctx); return new NodeSetValue(nodes); }; function xPathStep(nodes, steps, step, input, ctx) { var s =3D steps[step]; var ctx2 =3D ctx.clone(input); var nodelist =3D s.evaluate(ctx2).nodeSetValue(); for (var i =3D 0; i < nodelist.length; ++i) { if (step =3D=3D steps.length - 1) { nodes.push(nodelist[i]); } else { xPathStep(nodes, steps, step + 1, nodelist[i], ctx); } } } function StepExpr(axis, nodetest, predicate) { this.axis =3D axis; this.nodetest =3D nodetest; this.predicate =3D predicate || []; } StepExpr.prototype.appendPredicate =3D function(p) { this.predicate.push(p); } StepExpr.prototype.evaluate =3D function(ctx) { var input =3D ctx.node; var nodelist =3D []; // NOTE(mesch): When this was a switch() statement, it didn't work // in Safari/2.0. Not sure why though; it resulted in the JavaScript // console output "undefined" (without any line number or so). if (this.axis =3D=3D xpathAxis.ANCESTOR_OR_SELF) { nodelist.push(input); for (var n =3D input.parentNode; n; n =3D input.parentNode) { nodelist.push(n); } } else if (this.axis =3D=3D xpathAxis.ANCESTOR) { for (var n =3D input.parentNode; n; n =3D input.parentNode) { nodelist.push(n); } } else if (this.axis =3D=3D xpathAxis.ATTRIBUTE) { copyArray(nodelist, input.attributes); } else if (this.axis =3D=3D xpathAxis.CHILD) { copyArray(nodelist, input.childNodes); } else if (this.axis =3D=3D xpathAxis.DESCENDANT_OR_SELF) { nodelist.push(input); xpathCollectDescendants(nodelist, input); } else if (this.axis =3D=3D xpathAxis.DESCENDANT) { xpathCollectDescendants(nodelist, input); } else if (this.axis =3D=3D xpathAxis.FOLLOWING) { for (var n =3D input.parentNode; n; n =3D n.parentNode) { for (var nn =3D n.nextSibling; nn; nn =3D nn.nextSibling) { nodelist.push(nn); xpathCollectDescendants(nodelist, nn); } } } else if (this.axis =3D=3D xpathAxis.FOLLOWING_SIBLING) { for (var n =3D input.nextSibling; n; n =3D input.nextSibling) { nodelist.push(n); } } else if (this.axis =3D=3D xpathAxis.NAMESPACE) { alert('not implemented: axis namespace'); } else if (this.axis =3D=3D xpathAxis.PARENT) { if (input.parentNode) { nodelist.push(input.parentNode); } } else if (this.axis =3D=3D xpathAxis.PRECEDING) { for (var n =3D input.parentNode; n; n =3D n.parentNode) { for (var nn =3D n.previousSibling; nn; nn =3D nn.previousSibling) = { nodelist.push(nn); xpathCollectDescendantsReverse(nodelist, nn); } } } else if (this.axis =3D=3D xpathAxis.PRECEDING_SIBLING) { for (var n =3D input.previousSibling; n; n =3D = input.previousSibling) { nodelist.push(n); } } else if (this.axis =3D=3D xpathAxis.SELF) { nodelist.push(input); } else { throw 'ERROR -- NO SUCH AXIS: ' + this.axis; } // process node test var nodelist0 =3D nodelist; nodelist =3D []; for (var i =3D 0; i < nodelist0.length; ++i) { var n =3D nodelist0[i]; if (this.nodetest.evaluate(ctx.clone(n, i, = nodelist0)).booleanValue()) { nodelist.push(n); } } // process predicates for (var i =3D 0; i < this.predicate.length; ++i) { var nodelist0 =3D nodelist; nodelist =3D []; for (var ii =3D 0; ii < nodelist0.length; ++ii) { var n =3D nodelist0[ii]; if (this.predicate[i].evaluate(ctx.clone(n, ii, = nodelist0)).booleanValue()) { nodelist.push(n); } } } return new NodeSetValue(nodelist); }; function NodeTestAny() { this.value =3D new BooleanValue(true); } NodeTestAny.prototype.evaluate =3D function(ctx) { return this.value; }; function NodeTestElement() {} NodeTestElement.prototype.evaluate =3D function(ctx) { return new BooleanValue(ctx.node.nodeType =3D=3D DOM_ELEMENT_NODE); } function NodeTestText() {} NodeTestText.prototype.evaluate =3D function(ctx) { return new BooleanValue(ctx.node.nodeType =3D=3D DOM_TEXT_NODE); } function NodeTestComment() {} NodeTestComment.prototype.evaluate =3D function(ctx) { return new BooleanValue(ctx.node.nodeType =3D=3D DOM_COMMENT_NODE); } function NodeTestPI(target) { this.target =3D target; } NodeTestPI.prototype.evaluate =3D function(ctx) { return new BooleanValue(ctx.node.nodeType =3D=3D DOM_PROCESSING_INSTRUCTION_NODE = && (!this.target || ctx.node.nodeName =3D=3D this.target)); } function NodeTestNC(nsprefix) { this.regex =3D new RegExp("^" + nsprefix + ":"); this.nsprefix =3D nsprefix; } NodeTestNC.prototype.evaluate =3D function(ctx) { var n =3D ctx.node; return new BooleanValue(this.regex.match(n.nodeName)); } function NodeTestName(name) { this.name =3D name; } NodeTestName.prototype.evaluate =3D function(ctx) { var n =3D ctx.node; return new BooleanValue(n.nodeName =3D=3D this.name); } function PredicateExpr(expr) { this.expr =3D expr; } PredicateExpr.prototype.evaluate =3D function(ctx) { var v =3D this.expr.evaluate(ctx); if (v.type =3D=3D 'number') { // NOTE(mesch): Internally, position is represented starting with // 0, however in XPath position starts with 1. See functions // position() and last(). return new BooleanValue(ctx.position =3D=3D v.numberValue() - 1); } else { return new BooleanValue(v.booleanValue()); } }; function FunctionCallExpr(name) { this.name =3D name; this.args =3D []; } FunctionCallExpr.prototype.appendArg =3D function(arg) { this.args.push(arg); }; FunctionCallExpr.prototype.evaluate =3D function(ctx) { var fn =3D '' + this.name.value; var f =3D this.xpathfunctions[fn]; if (f) { return f.call(this, ctx); } else { Log.write('XPath NO SUCH FUNCTION ' + fn); return new BooleanValue(false); } }; FunctionCallExpr.prototype.xpathfunctions =3D { 'last': function(ctx) { assert(this.args.length =3D=3D 0); // NOTE(mesch): XPath position starts at 1. return new NumberValue(ctx.nodelist.length); }, 'position': function(ctx) { assert(this.args.length =3D=3D 0); // NOTE(mesch): XPath position starts at 1. return new NumberValue(ctx.position + 1); }, 'count': function(ctx) { assert(this.args.length =3D=3D 1); var v =3D this.args[0].evaluate(ctx); return new NumberValue(v.nodeSetValue().length); }, 'id': function(ctx) { assert(this.args.length =3D=3D 1); var e =3D this.args.evaluate(ctx); var ret =3D []; var ids; if (e.type =3D=3D 'node-set') { ids =3D []; for (var i =3D 0; i < e.length; ++i) { var v =3D xmlValue(e[i]).split(/\s+/); for (var ii =3D 0; ii < v.length; ++ii) { ids.push(v[ii]); } } } else { ids =3D e.split(/\s+/); } var d =3D ctx.node.ownerDocument; for (var i =3D 0; i < ids.length; ++i) { var n =3D d.getElementById(ids[i]); if (n) { ret.push(n); } } return new NodeSetValue(ret); }, 'local-name': function(ctx) { alert('not implmented yet: XPath function local-name()'); }, 'namespace-uri': function(ctx) { alert('not implmented yet: XPath function namespace-uri()'); }, 'name': function(ctx) { assert(this.args.length =3D=3D 1 || this.args.length =3D=3D 0); var n; if (this.args.length =3D=3D 0) { n =3D [ ctx.node ]; } else { n =3D this.args[0].evaluate(ctx).nodeSetValue(); } if (n.length =3D=3D 0) { return new StringValue(''); } else { return new StringValue(n[0].nodeName); } }, 'string': function(ctx) { assert(this.args.length =3D=3D 1 || this.args.length =3D=3D 0); if (this.args.length =3D=3D 0) { return new StringValue(new NodeSetValue([ ctx.node = ]).stringValue()); } else { return new StringValue(this.args[0].evaluate(ctx).stringValue()); } }, 'concat': function(ctx) { var ret =3D ''; for (var i =3D 0; i < this.args.length; ++i) { ret +=3D this.args[i].evaluate(ctx).stringValue(); } return new StringValue(ret); }, 'starts-with': function(ctx) { assert(this.args.length =3D=3D 2); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).stringValue(); return new BooleanValue(s0.indexOf(s1) =3D=3D 0); }, 'contains': function(ctx) { assert(this.args.length =3D=3D 2); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).stringValue(); return new BooleanValue(s0.indexOf(s1) !=3D -1); }, 'substring-before': function(ctx) { assert(this.args.length =3D=3D 2); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).stringValue(); var i =3D s0.indexOf(s1); var ret; if (i =3D=3D -1) { ret =3D ''; } else { ret =3D s0.substr(0,i); } return new StringValue(ret); }, 'substring-after': function(ctx) { assert(this.args.length =3D=3D 2); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).stringValue(); var i =3D s0.indexOf(s1); var ret; if (i =3D=3D -1) { ret =3D ''; } else { ret =3D s0.substr(i + s1.length); } return new StringValue(ret); }, 'substring': function(ctx) { // NOTE: XPath defines the position of the first character in a // string to be 1, in JavaScript this is 0 ([XPATH] Section 4.2). assert(this.args.length =3D=3D 2 || this.args.length =3D=3D 3); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).numberValue(); var ret; if (this.args.length =3D=3D 2) { var i1 =3D Math.max(0, Math.round(s1) - 1); ret =3D s0.substr(i1); } else { var s2 =3D this.args[2].evaluate(ctx).numberValue(); var i0 =3D Math.round(s1) - 1; var i1 =3D Math.max(0, i0); var i2 =3D Math.round(s2) - Math.max(0, -i0); ret =3D s0.substr(i1, i2); } return new StringValue(ret); }, 'string-length': function(ctx) { var s; if (this.args.length > 0) { s =3D this.args[0].evaluate(ctx).stringValue(); } else { s =3D new NodeSetValue([ ctx.node ]).stringValue(); } return new NumberValue(s.length); }, 'normalize-space': function(ctx) { var s; if (this.args.length > 0) { s =3D this.args[0].evaluate(ctx).stringValue(); } else { s =3D new NodeSetValue([ ctx.node ]).stringValue(); } s =3D s.replace(/^\s*/,'').replace(/\s*$/,'').replace(/\s+/g, ' '); return new StringValue(s); }, 'translate': function(ctx) { assert(this.args.length =3D=3D 3); var s0 =3D this.args[0].evaluate(ctx).stringValue(); var s1 =3D this.args[1].evaluate(ctx).stringValue(); var s2 =3D this.args[2].evaluate(ctx).stringValue(); for (var i =3D 0; i < s1.length; ++i) { s0 =3D s0.replace(new RegExp(s1.charAt(i), 'g'), s2.charAt(i)); } return new StringValue(s0); }, 'boolean': function(ctx) { assert(this.args.length =3D=3D 1); return new BooleanValue(this.args[0].evaluate(ctx).booleanValue()); }, 'not': function(ctx) { assert(this.args.length =3D=3D 1); var ret =3D !this.args[0].evaluate(ctx).booleanValue(); return new BooleanValue(ret); }, 'true': function(ctx) { assert(this.args.length =3D=3D 0); return new BooleanValue(true); }, 'false': function(ctx) { assert(this.args.length =3D=3D 0); return new BooleanValue(false); }, 'lang': function(ctx) { assert(this.args.length =3D=3D 1); var lang =3D this.args[0].evaluate(ctx).stringValue(); var xmllang; var n =3D ctx.node; while (n && n !=3D n.parentNode /* just in case ... */) { xmllang =3D n.getAttribute('xml:lang'); if (xmllang) { break; } n =3D n.parentNode; } if (!xmllang) { return new BooleanValue(false); } else { var re =3D new RegExp('^' + lang + '$', 'i'); return new BooleanValue(xmllang.match(re) || xmllang.replace(/_.*$/,'').match(re)); } }, 'number': function(ctx) { assert(this.args.length =3D=3D 1 || this.args.length =3D=3D 0); if (this.args.length =3D=3D 1) { return new NumberValue(this.args[0].evaluate(ctx).numberValue()); } else { return new NumberValue(new NodeSetValue([ ctx.node = ]).numberValue()); } }, 'sum': function(ctx) { assert(this.args.length =3D=3D 1); var n =3D this.args[0].evaluate(ctx).nodeSetValue(); var sum =3D 0; for (var i =3D 0; i < n.length; ++i) { sum +=3D xmlValue(n[i]) - 0; } return new NumberValue(sum); }, 'floor': function(ctx) { assert(this.args.length =3D=3D 1); var num =3D this.args[0].evaluate(ctx).numberValue(); return new NumberValue(Math.floor(num)); }, 'ceiling': function(ctx) { assert(this.args.length =3D=3D 1); var num =3D this.args[0].evaluate(ctx).numberValue(); return new NumberValue(Math.ceil(num)); }, 'round': function(ctx) { assert(this.args.length =3D=3D 1); var num =3D this.args[0].evaluate(ctx).numberValue(); return new NumberValue(Math.round(num)); }, // TODO(mesch): The following functions are custom. There is a // standard that defines how to add functions, which should be // applied here. 'ext-join': function(ctx) { assert(this.args.length =3D=3D 2); var nodes =3D this.args[0].evaluate(ctx).nodeSetValue(); var delim =3D this.args[1].evaluate(ctx).stringValue(); var ret =3D ''; for (var i =3D 0; i < nodes.length; ++i) { if (ret) { ret +=3D delim; } ret +=3D xmlValue(nodes[i]); } return new StringValue(ret); }, // ext-if() evaluates and returns its second argument, if the // boolean value of its first argument is true, otherwise it // evaluates and returns its third argument. 'ext-if': function(ctx) { assert(this.args.length =3D=3D 3); if (this.args[0].evaluate(ctx).booleanValue()) { return this.args[1].evaluate(ctx); } else { return this.args[2].evaluate(ctx); } }, 'ext-sprintf': function(ctx) { assert(this.args.length >=3D 1); var args =3D []; for (var i =3D 0; i < this.args.length; ++i) { args.push(this.args[i].evaluate(ctx).stringValue()); } return new StringValue(sprintf.apply(null, args)); }, // ext-cardinal() evaluates its single argument as a number, and // returns the current node that many times. It can be used in the // select attribute to iterate over an integer range. =20 'ext-cardinal': function(ctx) { assert(this.args.length >=3D 1); var c =3D this.args[0].evaluate(ctx).numberValue(); var ret =3D []; for (var i =3D 0; i < c; ++i) { ret.push(ctx.node); } return new NodeSetValue(ret); } }; function UnionExpr(expr1, expr2) { this.expr1 =3D expr1; this.expr2 =3D expr2; } UnionExpr.prototype.evaluate =3D function(ctx) { var nodes1 =3D this.expr1.evaluate(ctx).nodeSetValue(); var nodes2 =3D this.expr2.evaluate(ctx).nodeSetValue(); var I1 =3D nodes1.length; for (var i2 =3D 0; i2 < nodes2.length; ++i2) { for (var i1 =3D 0; i1 < I1; ++i1) { if (nodes1[i1] =3D=3D nodes2[i2]) { // break inner loop and continue outer loop, labels confuse // the js compiler, so we don't use them here. i1 =3D I1; } } nodes1.push(nodes2[i2]); } return new NodeSetValue(nodes2); }; function PathExpr(filter, rel) { this.filter =3D filter; this.rel =3D rel; } PathExpr.prototype.evaluate =3D function(ctx) { var nodes =3D this.filter.evaluate(ctx).nodeSetValue(); var nodes1 =3D []; for (var i =3D 0; i < nodes.length; ++i) { var nodes0 =3D this.rel.evaluate(ctx.clone(nodes[i], i, = nodes)).nodeSetValue(); for (var ii =3D 0; ii < nodes0.length; ++ii) { nodes1.push(nodes0[ii]); } } return new NodeSetValue(nodes1); }; function FilterExpr(expr, predicate) { this.expr =3D expr; this.predicate =3D predicate; } FilterExpr.prototype.evaluate =3D function(ctx) { var nodes =3D this.expr.evaluate(ctx).nodeSetValue(); for (var i =3D 0; i < this.predicate.length; ++i) { var nodes0 =3D nodes; nodes =3D []; for (var j =3D 0; j < nodes0.length; ++j) { var n =3D nodes0[j]; if (this.predicate[i].evaluate(ctx.clone(n, j, = nodes0)).booleanValue()) { nodes.push(n); } } } return new NodeSetValue(nodes); } function UnaryMinusExpr(expr) { this.expr =3D expr; } UnaryMinusExpr.prototype.evaluate =3D function(ctx) { return new NumberValue(-this.expr.evaluate(ctx).numberValue()); }; function BinaryExpr(expr1, op, expr2) { this.expr1 =3D expr1; this.expr2 =3D expr2; this.op =3D op; } BinaryExpr.prototype.evaluate =3D function(ctx) { var ret; switch (this.op.value) { case 'or': ret =3D new BooleanValue(this.expr1.evaluate(ctx).booleanValue() = || this.expr2.evaluate(ctx).booleanValue()); break; case 'and': ret =3D new BooleanValue(this.expr1.evaluate(ctx).booleanValue() = && this.expr2.evaluate(ctx).booleanValue()); break; case '+': ret =3D new NumberValue(this.expr1.evaluate(ctx).numberValue() + this.expr2.evaluate(ctx).numberValue()); break; case '-': ret =3D new NumberValue(this.expr1.evaluate(ctx).numberValue() - this.expr2.evaluate(ctx).numberValue()); break; case '*': ret =3D new NumberValue(this.expr1.evaluate(ctx).numberValue() * this.expr2.evaluate(ctx).numberValue()); break; case 'mod': ret =3D new NumberValue(this.expr1.evaluate(ctx).numberValue() % this.expr2.evaluate(ctx).numberValue()); break; case 'div': ret =3D new NumberValue(this.expr1.evaluate(ctx).numberValue() / this.expr2.evaluate(ctx).numberValue()); break; case '=3D': ret =3D this.compare(ctx, function(x1, x2) { return x1 =3D=3D x2; = }); break; case '!=3D': ret =3D this.compare(ctx, function(x1, x2) { return x1 !=3D x2; = }); break; case '<': ret =3D this.compare(ctx, function(x1, x2) { return x1 < x2; }); break; case '<=3D': ret =3D this.compare(ctx, function(x1, x2) { return x1 <=3D x2; = }); break; case '>': ret =3D this.compare(ctx, function(x1, x2) { return x1 > x2; }); break; case '>=3D': ret =3D this.compare(ctx, function(x1, x2) { return x1 >=3D x2; = }); break; default: alert('BinaryExpr.evaluate: ' + this.op.value); } return ret; }; BinaryExpr.prototype.compare =3D function(ctx, cmp) { var v1 =3D this.expr1.evaluate(ctx); var v2 =3D this.expr2.evaluate(ctx); var ret; if (v1.type =3D=3D 'node-set' && v2.type =3D=3D 'node-set') { var n1 =3D v1.nodeSetValue(); var n2 =3D v2.nodeSetValue(); ret =3D false; for (var i1 =3D 0; i1 < n1.length; ++i1) { for (var i2 =3D 0; i2 < n2.length; ++i2) { if (cmp(xmlValue(n1[i1]), xmlValue(n2[i2]))) { ret =3D true; // Break outer loop. Labels confuse the jscompiler and we // don't use them. i2 =3D n2.length; i1 =3D n1.length; } } } } else if (v1.type =3D=3D 'node-set' || v2.type =3D=3D 'node-set') { if (v1.type =3D=3D 'number') { var s =3D v1.numberValue(); var n =3D v2.nodeSetValue(); ret =3D false; for (var i =3D 0; i < n.length; ++i) { var nn =3D xmlValue(n[i]) - 0; if (cmp(s, nn)) { ret =3D true; break; } } } else if (v2.type =3D=3D 'number') { var n =3D v1.nodeSetValue(); var s =3D v2.numberValue(); ret =3D false; for (var i =3D 0; i < n.length; ++i) { var nn =3D xmlValue(n[i]) - 0; if (cmp(nn, s)) { ret =3D true; break; } } } else if (v1.type =3D=3D 'string') { var s =3D v1.stringValue(); var n =3D v2.nodeSetValue(); ret =3D false; for (var i =3D 0; i < n.length; ++i) { var nn =3D xmlValue(n[i]); if (cmp(s, nn)) { ret =3D true; break; } } } else if (v2.type =3D=3D 'string') { var n =3D v1.nodeSetValue(); var s =3D v2.stringValue(); ret =3D false; for (var i =3D 0; i < n.length; ++i) { var nn =3D xmlValue(n[i]); if (cmp(nn, s)) { ret =3D true; break; } } } else { ret =3D cmp(v1.booleanValue(), v2.booleanValue()); } } else if (v1.type =3D=3D 'boolean' || v2.type =3D=3D 'boolean') { ret =3D cmp(v1.booleanValue(), v2.booleanValue()); } else if (v1.type =3D=3D 'number' || v2.type =3D=3D 'number') { ret =3D cmp(v1.numberValue(), v2.numberValue()); } else { ret =3D cmp(v1.stringValue(), v2.stringValue()); } return new BooleanValue(ret); } function LiteralExpr(value) { this.value =3D value; } LiteralExpr.prototype.evaluate =3D function(ctx) { return new StringValue(this.value); }; function NumberExpr(value) { this.value =3D value; } NumberExpr.prototype.evaluate =3D function(ctx) { return new NumberValue(this.value); }; function VariableExpr(name) { this.name =3D name; } VariableExpr.prototype.evaluate =3D function(ctx) { return ctx.getVariable(this.name); } // Factory functions for semantic values (i.e. Expressions) of the // productions in the grammar. When a production is matched to reduce // the current parse state stack, the function is called with the // semantic values of the matched elements as arguments, and returns // another semantic value. The semantic value is a node of the parse // tree, an expression object with an evaluate() method that evaluates = the // expression in an actual context. These factory functions are used // in the specification of the grammar rules, below. function makeTokenExpr(m) { return new TokenExpr(m); } function passExpr(e) { return e; } function makeLocationExpr1(slash, rel) { rel.absolute =3D true; return rel; } function makeLocationExpr2(dslash, rel) { rel.absolute =3D true; rel.prependStep(makeAbbrevStep(dslash.value)); return rel; } function makeLocationExpr3(slash) { var ret =3D new LocationExpr(); ret.appendStep(makeAbbrevStep('.')); ret.absolute =3D true; return ret; } function makeLocationExpr4(dslash) { var ret =3D new LocationExpr(); ret.absolute =3D true; ret.appendStep(makeAbbrevStep(dslash.value)); return ret; } function makeLocationExpr5(step) { var ret =3D new LocationExpr(); ret.appendStep(step); return ret; } function makeLocationExpr6(rel, slash, step) { rel.appendStep(step); return rel; } function makeLocationExpr7(rel, dslash, step) { rel.appendStep(makeAbbrevStep(dslash.value)); return rel; } function makeStepExpr1(dot) { return makeAbbrevStep(dot.value); } function makeStepExpr2(ddot) { return makeAbbrevStep(ddot.value); } function makeStepExpr3(axisname, axis, nodetest) { return new StepExpr(axisname.value, nodetest); } function makeStepExpr4(at, nodetest) { return new StepExpr('attribute', nodetest); } function makeStepExpr5(nodetest) { return new StepExpr('child', nodetest); } function makeStepExpr6(step, predicate) { step.appendPredicate(predicate); return step; } function makeAbbrevStep(abbrev) { switch (abbrev) { case '//': return new StepExpr('descendant-or-self', new NodeTestAny); case '.': return new StepExpr('self', new NodeTestAny); case '..': return new StepExpr('parent', new NodeTestAny); } } function makeNodeTestExpr1(asterisk) { return new NodeTestElement; } function makeNodeTestExpr2(ncname, colon, asterisk) { return new NodeTestNC(ncname.value); } function makeNodeTestExpr3(qname) { return new NodeTestName(qname.value); } function makeNodeTestExpr4(typeo, parenc) { var type =3D typeo.value.replace(/\s*\($/, ''); switch(type) { case 'node': return new NodeTestAny; case 'text': return new NodeTestText; case 'comment': return new NodeTestComment; case 'processing-instruction': return new NodeTestPI; } } function makeNodeTestExpr5(typeo, target, parenc) { var type =3D typeo.replace(/\s*\($/, ''); if (type !=3D 'processing-instruction') { throw type + ' ' + Error().stack; } return new NodeTestPI(target.value); } function makePredicateExpr(pareno, expr, parenc) { return new PredicateExpr(expr); } function makePrimaryExpr(pareno, expr, parenc) { return expr; } function makeFunctionCallExpr1(name, pareno, parenc) { return new FunctionCallExpr(name); } function makeFunctionCallExpr2(name, pareno, arg1, args, parenc) { var ret =3D new FunctionCallExpr(name); ret.appendArg(arg1); for (var i =3D 0; i < args.length; ++i) { ret.appendArg(args[i]); } return ret; } function makeArgumentExpr(comma, expr) { return expr; } function makeUnionExpr(expr1, pipe, expr2) { return new UnionExpr(expr1, expr2); } function makePathExpr1(filter, slash, rel) { return new PathExpr(filter, rel); } function makePathExpr2(filter, dslash, rel) { rel.prependStep(makeAbbrevStep(dslash.value)); return new PathExpr(filter, rel); } function makeFilterExpr(expr, predicates) { if (predicates.length > 0) { return new FilterExpr(expr, predicates); } else { return expr; } } function makeUnaryMinusExpr(minus, expr) { return new UnaryMinusExpr(expr); } function makeBinaryExpr(expr1, op, expr2) { return new BinaryExpr(expr1, op, expr2); } function makeLiteralExpr(token) { // remove quotes from the parsed value: var value =3D token.value.substring(1, token.value.length - 1); return new LiteralExpr(value); } function makeNumberExpr(token) { return new NumberExpr(token.value); } function makeVariableReference(dollar, name) { return new VariableExpr(name.value); } // Used before parsing for optimization of common simple cases. See // the begin of xpathParse() for which they are. function makeSimpleExpr(expr) { if (expr.charAt(0) =3D=3D '$') { return new VariableExpr(expr.substr(1)); } else if (expr.charAt(0) =3D=3D '@') { var a =3D new NodeTestName(expr.substr(1)); var b =3D new StepExpr('attribute', a); var c =3D new LocationExpr(); c.appendStep(b); return c; } else if (expr.match(/^[0-9]+$/)) { return new NumberExpr(expr); } else { var a =3D new NodeTestName(expr); var b =3D new StepExpr('child', a); var c =3D new LocationExpr(); c.appendStep(b); return c; } } function makeSimpleExpr2(expr) { var steps =3D expr.split('/'); var c =3D new LocationExpr(); for (var i =3D 0; i < steps.length; i++) { var a =3D new NodeTestName(steps[i]); var b =3D new StepExpr('child', a); c.appendStep(b); } return c; } // The axes of XPath expressions. var xpathAxis =3D { ANCESTOR_OR_SELF: 'ancestor-or-self', ANCESTOR: 'ancestor', ATTRIBUTE: 'attribute', CHILD: 'child', DESCENDANT_OR_SELF: 'descendant-or-self', DESCENDANT: 'descendant', FOLLOWING_SIBLING: 'following-sibling', FOLLOWING: 'following', NAMESPACE: 'namespace', PARENT: 'parent', PRECEDING_SIBLING: 'preceding-sibling', PRECEDING: 'preceding', SELF: 'self' }; var xpathAxesRe =3D [ xpathAxis.ANCESTOR_OR_SELF, xpathAxis.ANCESTOR, xpathAxis.ATTRIBUTE, xpathAxis.CHILD, xpathAxis.DESCENDANT_OR_SELF, xpathAxis.DESCENDANT, xpathAxis.FOLLOWING_SIBLING, xpathAxis.FOLLOWING, xpathAxis.NAMESPACE, xpathAxis.PARENT, xpathAxis.PRECEDING_SIBLING, xpathAxis.PRECEDING, xpathAxis.SELF ].join('|'); // The tokens of the language. The label property is just used for // generating debug output. The prec property is the precedence used // for shift/reduce resolution. Default precedence is 0 as a lookahead // token and 2 on the stack. TODO(mesch): this is certainly not // necessary and too complicated. Simplify this! // NOTE: tabular formatting is the big exception, but here it should // be OK. var TOK_PIPE =3D { label: "|", prec: 17, re: new RegExp("^\\|") }; var TOK_DSLASH =3D { label: "//", prec: 19, re: new RegExp("^//") }; var TOK_SLASH =3D { label: "/", prec: 30, re: new RegExp("^/") }; var TOK_AXIS =3D { label: "::", prec: 20, re: new RegExp("^::") }; var TOK_COLON =3D { label: ":", prec: 1000, re: new RegExp("^:") }; var TOK_AXISNAME =3D { label: "[axis]", re: new RegExp('^(' + = xpathAxesRe + ')') }; var TOK_PARENO =3D { label: "(", prec: 34, re: new RegExp("^\\(") }; var TOK_PARENC =3D { label: ")", re: new RegExp("^\\)") }; var TOK_DDOT =3D { label: "..", prec: 34, re: new RegExp("^\\.\\.") = }; var TOK_DOT =3D { label: ".", prec: 34, re: new RegExp("^\\.") }; var TOK_AT =3D { label: "@", prec: 34, re: new RegExp("^@") }; var TOK_COMMA =3D { label: ",", re: new RegExp("^,") }; var TOK_OR =3D { label: "or", prec: 10, re: new RegExp("^or\\b") = }; var TOK_AND =3D { label: "and", prec: 11, re: new RegExp("^and\\b") = }; var TOK_EQ =3D { label: "=3D", prec: 12, re: new RegExp("^=3D") = }; var TOK_NEQ =3D { label: "!=3D", prec: 12, re: new RegExp("^!=3D") = }; var TOK_GE =3D { label: ">=3D", prec: 13, re: new RegExp("^>=3D") = }; var TOK_GT =3D { label: ">", prec: 13, re: new RegExp("^>") }; var TOK_LE =3D { label: "<=3D", prec: 13, re: new RegExp("^<=3D") = }; var TOK_LT =3D { label: "<", prec: 13, re: new RegExp("^<") }; var TOK_PLUS =3D { label: "+", prec: 14, re: new RegExp("^\\+"), = left: true }; var TOK_MINUS =3D { label: "-", prec: 14, re: new RegExp("^\\-"), = left: true }; var TOK_DIV =3D { label: "div", prec: 15, re: new = RegExp("^div\\b"), left: true }; var TOK_MOD =3D { label: "mod", prec: 15, re: new = RegExp("^mod\\b"), left: true }; var TOK_BRACKO =3D { label: "[", prec: 32, re: new RegExp("^\\[") }; var TOK_BRACKC =3D { label: "]", re: new RegExp("^\\]") }; var TOK_DOLLAR =3D { label: "$", re: new RegExp("^\\$") }; var TOK_NCNAME =3D { label: "[ncname]", re: new = RegExp('^[a-z][-\\w]*','i') }; var TOK_ASTERISK =3D { label: "*", prec: 15, re: new RegExp("^\\*"), = left: true }; var TOK_LITERALQ =3D { label: "[litq]", prec: 20, re: new = RegExp("^'[^\\']*'") }; var TOK_LITERALQQ =3D { label: "[litqq]", prec: 20, re: new RegExp('^"[^\\"]*"') }; var TOK_NUMBER =3D { label: "[number]", prec: 35, re: new RegExp('^\\d+(\\.\\d*)?') }; var TOK_QNAME =3D { label: "[qname]", re: new RegExp('^([a-z][-\\w]*:)?[a-z][-\\w]*','i') }; var TOK_NODEO =3D { label: "[nodetest-start]", re: new RegExp('^(processing-instruction|comment|text|node)\\(') }; // The table of the tokens of our grammar, used by the lexer: first // column the tag, second column a regexp to recognize it in the // input, third column the precedence of the token, fourth column a // factory function for the semantic value of the token. // // NOTE: order of this list is important, because the first match // counts. Cf. DDOT and DOT, and AXIS and COLON. var xpathTokenRules =3D [ TOK_DSLASH, TOK_SLASH, TOK_DDOT, TOK_DOT, TOK_AXIS, TOK_COLON, TOK_AXISNAME, TOK_NODEO, TOK_PARENO, TOK_PARENC, TOK_BRACKO, TOK_BRACKC, TOK_AT, TOK_COMMA, TOK_OR, TOK_AND, TOK_NEQ, TOK_EQ, TOK_GE, TOK_GT, TOK_LE, TOK_LT, TOK_PLUS, TOK_MINUS, TOK_ASTERISK, TOK_PIPE, TOK_MOD, TOK_DIV, TOK_LITERALQ, TOK_LITERALQQ, TOK_NUMBER, TOK_QNAME, TOK_NCNAME, TOK_DOLLAR ]; // All the nonterminals of the grammar. The nonterminal objects are // identified by object identity; the labels are used in the debug // output only. var XPathLocationPath =3D { label: "LocationPath" }; var XPathRelativeLocationPath =3D { label: "RelativeLocationPath" }; var XPathAbsoluteLocationPath =3D { label: "AbsoluteLocationPath" }; var XPathStep =3D { label: "Step" }; var XPathNodeTest =3D { label: "NodeTest" }; var XPathPredicate =3D { label: "Predicate" }; var XPathLiteral =3D { label: "Literal" }; var XPathExpr =3D { label: "Expr" }; var XPathPrimaryExpr =3D { label: "PrimaryExpr" }; var XPathVariableReference =3D { label: "Variablereference" }; var XPathNumber =3D { label: "Number" }; var XPathFunctionCall =3D { label: "FunctionCall" }; var XPathArgumentRemainder =3D { label: "ArgumentRemainder" }; var XPathPathExpr =3D { label: "PathExpr" }; var XPathUnionExpr =3D { label: "UnionExpr" }; var XPathFilterExpr =3D { label: "FilterExpr" }; var XPathDigits =3D { label: "Digits" }; var xpathNonTerminals =3D [ XPathLocationPath, XPathRelativeLocationPath, XPathAbsoluteLocationPath, XPathStep, XPathNodeTest, XPathPredicate, XPathLiteral, XPathExpr, XPathPrimaryExpr, XPathVariableReference, XPathNumber, XPathFunctionCall, XPathArgumentRemainder, XPathPathExpr, XPathUnionExpr, XPathFilterExpr, XPathDigits ]; // Quantifiers that are used in the productions of the grammar. var Q_01 =3D { label: "?" }; var Q_MM =3D { label: "*" }; var Q_1M =3D { label: "+" }; // Tag for left associativity (right assoc is implied by undefined). var ASSOC_LEFT =3D true; // The productions of the grammar. Columns of the table: // // - target nonterminal, // - pattern, // - precedence, // - semantic value factory // // The semantic value factory is a function that receives parse tree // nodes from the stack frames of the matched symbols as arguments and // returns an a node of the parse tree. The node is stored in the top // stack frame along with the target object of the rule. The node in // the parse tree is an expression object that has an evaluate() method // and thus evaluates XPath expressions. // // The precedence is used to decide between reducing and shifting by // comparing the precendence of the rule that is candidate for // reducing with the precedence of the look ahead token. Precedence of // -1 means that the precedence of the tokens in the pattern is used // instead. TODO: It shouldn't be necessary to explicitly assign // precedences to rules. var xpathGrammarRules =3D [ [ XPathLocationPath, [ XPathRelativeLocationPath ], 18, passExpr ], [ XPathLocationPath, [ XPathAbsoluteLocationPath ], 18, passExpr ], [ XPathAbsoluteLocationPath, [ TOK_SLASH, XPathRelativeLocationPath = ], 18,=20 makeLocationExpr1 ], [ XPathAbsoluteLocationPath, [ TOK_DSLASH, XPathRelativeLocationPath = ], 18, makeLocationExpr2 ], [ XPathAbsoluteLocationPath, [ TOK_SLASH ], 0, makeLocationExpr3 ], [ XPathAbsoluteLocationPath, [ TOK_DSLASH ], 0, makeLocationExpr4 ], [ XPathRelativeLocationPath, [ XPathStep ], 31, makeLocationExpr5 ], [ XPathRelativeLocationPath, [ XPathRelativeLocationPath, TOK_SLASH, XPathStep ], 31, makeLocationExpr6 ], [ XPathRelativeLocationPath, [ XPathRelativeLocationPath, TOK_DSLASH, XPathStep ], 31, makeLocationExpr7 ], [ XPathStep, [ TOK_DOT ], 33, makeStepExpr1 ], [ XPathStep, [ TOK_DDOT ], 33, makeStepExpr2 ], [ XPathStep, [ TOK_AXISNAME, TOK_AXIS, XPathNodeTest ], 33, makeStepExpr3 ], [ XPathStep, [ TOK_AT, XPathNodeTest ], 33, makeStepExpr4 ], [ XPathStep, [ XPathNodeTest ], 33, makeStepExpr5 ], [ XPathStep, [ XPathStep, XPathPredicate ], 33, makeStepExpr6 ], [ XPathNodeTest, [ TOK_ASTERISK ], 33, makeNodeTestExpr1 ], [ XPathNodeTest, [ TOK_NCNAME, TOK_COLON, TOK_ASTERISK ], 33, makeNodeTestExpr2 ], [ XPathNodeTest, [ TOK_QNAME ], 33, makeNodeTestExpr3 ], [ XPathNodeTest, [ TOK_NODEO, TOK_PARENC ], 33, makeNodeTestExpr4 ], [ XPathNodeTest, [ TOK_NODEO, XPathLiteral, TOK_PARENC ], 33, makeNodeTestExpr5 ], [ XPathPredicate, [ TOK_BRACKO, XPathExpr, TOK_BRACKC ], 33, makePredicateExpr ], [ XPathPrimaryExpr, [ XPathVariableReference ], 33, passExpr ], [ XPathPrimaryExpr, [ TOK_PARENO, XPathExpr, TOK_PARENC ], 33, makePrimaryExpr ], [ XPathPrimaryExpr, [ XPathLiteral ], 30, passExpr ], [ XPathPrimaryExpr, [ XPathNumber ], 30, passExpr ], [ XPathPrimaryExpr, [ XPathFunctionCall ], 30, passExpr ], [ XPathFunctionCall, [ TOK_QNAME, TOK_PARENO, TOK_PARENC ], -1, makeFunctionCallExpr1 ], [ XPathFunctionCall, [ TOK_QNAME, TOK_PARENO, XPathExpr, XPathArgumentRemainder, Q_MM, TOK_PARENC ], -1, makeFunctionCallExpr2 ], [ XPathArgumentRemainder, [ TOK_COMMA, XPathExpr ], -1, makeArgumentExpr ], [ XPathUnionExpr, [ XPathPathExpr ], 20, passExpr ], [ XPathUnionExpr, [ XPathUnionExpr, TOK_PIPE, XPathPathExpr ], 20, makeUnionExpr ], [ XPathPathExpr, [ XPathLocationPath ], 20,=20 passExpr ],=20 [ XPathPathExpr, [ XPathFilterExpr ], 19,=20 passExpr ],=20 [ XPathPathExpr,=20 [ XPathFilterExpr, TOK_SLASH, XPathRelativeLocationPath ], 20, makePathExpr1 ], [ XPathPathExpr, [ XPathFilterExpr, TOK_DSLASH, XPathRelativeLocationPath ], 20, makePathExpr2 ], [ XPathFilterExpr, [ XPathPrimaryExpr, XPathPredicate, Q_MM ], 20, makeFilterExpr ],=20 [ XPathExpr, [ XPathPrimaryExpr ], 16, passExpr ], [ XPathExpr, [ XPathUnionExpr ], 16, passExpr ], [ XPathExpr, [ TOK_MINUS, XPathExpr ], -1, makeUnaryMinusExpr ], [ XPathExpr, [ XPathExpr, TOK_OR, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_AND, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_EQ, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_NEQ, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_LT, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_LE, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_GT, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_GE, XPathExpr ], -1, makeBinaryExpr ], [ XPathExpr, [ XPathExpr, TOK_PLUS, XPathExpr ], -1, makeBinaryExpr, ASSOC_LEFT ], [ XPathExpr, [ XPathExpr, TOK_MINUS, XPathExpr ], -1, makeBinaryExpr, ASSOC_LEFT ], [ XPathExpr, [ XPathExpr, TOK_ASTERISK, XPathExpr ], -1, makeBinaryExpr, ASSOC_LEFT ], [ XPathExpr, [ XPathExpr, TOK_DIV, XPathExpr ], -1, makeBinaryExpr, ASSOC_LEFT ], [ XPathExpr, [ XPathExpr, TOK_MOD, XPathExpr ], -1, makeBinaryExpr, ASSOC_LEFT ], [ XPathLiteral, [ TOK_LITERALQ ], -1, makeLiteralExpr ], [ XPathLiteral, [ TOK_LITERALQQ ], -1, makeLiteralExpr ], [ XPathNumber, [ TOK_NUMBER ], -1, makeNumberExpr ], [ XPathVariableReference, [ TOK_DOLLAR, TOK_QNAME ], 200, makeVariableReference ] ]; // That function computes some optimizations of the above data // structures and will be called right here. It merely takes the // counter variables out of the global scope. var xpathRules =3D []; function xpathParseInit() { if (xpathRules.length) { return; } // Some simple optimizations for the xpath expression parser: sort // grammar rules descending by length, so that the longest match is // first found. xpathGrammarRules.sort(function(a,b) { var la =3D a[1].length; var lb =3D b[1].length; if (la < lb) { return 1; } else if (la > lb) { return -1; } else { return 0; } }); var k =3D 1; for (var i =3D 0; i < xpathNonTerminals.length; ++i) { xpathNonTerminals[i].key =3D k++; } for (i =3D 0; i < xpathTokenRules.length; ++i) { xpathTokenRules[i].key =3D k++; } if (xpathdebug) Log.write('XPath parse INIT: ' + k + ' rules'); // Another slight optimization: sort the rules into bins according // to the last element (observing quantifiers), so we can restrict // the match against the stack to the subest of rules that match the // top of the stack. // // TODO(mesch): What we actually want is to compute states as in // bison, so that we don't have to do any explicit and iterated // match against the stack. function push_(array, position, element) { if (!array[position]) { array[position] =3D []; } array[position].push(element); } for (i =3D 0; i < xpathGrammarRules.length; ++i) { var rule =3D xpathGrammarRules[i]; var pattern =3D rule[1]; for (var j =3D pattern.length - 1; j >=3D 0; --j) { if (pattern[j] =3D=3D Q_1M) { push_(xpathRules, pattern[j-1].key, rule); break; =20 } else if (pattern[j] =3D=3D Q_MM || pattern[j] =3D=3D Q_01) { push_(xpathRules, pattern[j-1].key, rule); --j; } else { push_(xpathRules, pattern[j].key, rule); break; } } } if (xpathdebug) Log.write('XPath parse INIT: ' + xpathRules.length + ' rule bins'); =20 var sum =3D 0; mapExec(xpathRules, function(i) { if (i) { sum +=3D i.length; } }); =20 if (xpathdebug) Log.write('XPath parse INIT: ' + (sum / xpathRules.length) + ' average = bin size'); } // Local utility functions that are used by the lexer or parser. function xpathCollectDescendants(nodelist, node) { for (var n =3D node.firstChild; n; n =3D n.nextSibling) { nodelist.push(n); arguments.callee(nodelist, n); } } function xpathCollectDescendantsReverse(nodelist, node) { for (var n =3D node.lastChild; n; n =3D n.previousSibling) { nodelist.push(n); arguments.callee(nodelist, n); } } // The entry point for the library: match an expression against a DOM // node. Returns an XPath value. function xpathDomEval(expr, node) { var expr1 =3D xpathParse(expr); var ret =3D expr1.evaluate(new ExprContext(node)); return ret; } // Utility function to sort a list of nodes. Used by xsltSort() and // nxslSelect(). function xpathSort(input, sort) { if (sort.length =3D=3D 0) { return; } var sortlist =3D []; for (var i =3D 0; i < input.nodelist.length; ++i) { var node =3D input.nodelist[i]; var sortitem =3D { node: node, key: [] }; var context =3D input.clone(node, 0, [ node ]); =20 for (var j =3D 0; j < sort.length; ++j) { var s =3D sort[j]; var value =3D s.expr.evaluate(context); var evalue; if (s.type =3D=3D 'text') { evalue =3D value.stringValue(); } else if (s.type =3D=3D 'number') { evalue =3D value.numberValue(); } sortitem.key.push({ value: evalue, order: s.order }); } // Make the sort stable by adding a lowest priority sort by // id. This is very convenient and furthermore required by the // spec ([XSLT] - Section 10 Sorting). sortitem.key.push({ value: i, order: 'ascending' }); sortlist.push(sortitem); } sortlist.sort(xpathSortByKey); var nodes =3D []; for (var i =3D 0; i < sortlist.length; ++i) { nodes.push(sortlist[i].node); } input.nodelist =3D nodes; input.setNode(nodes[0], 0); } // Sorts by all order criteria defined. According to the JavaScript // spec ([ECMA] Section 11.8.5), the compare operators compare strings // as strings and numbers as numbers. // // NOTE: In browsers which do not follow the spec, this breaks only in // the case that numbers should be sorted as strings, which is very // uncommon. function xpathSortByKey(v1, v2) { // NOTE: Sort key vectors of different length never occur in // xsltSort. for (var i =3D 0; i < v1.key.length; ++i) { var o =3D v1.key[i].order =3D=3D 'descending' ? -1 : 1; if (v1.key[i].value > v2.key[i].value) { return +1 * o; } else if (v1.key[i].value < v2.key[i].value) { return -1 * o; } } return 0; } // Copyright (c) 2005, Google Inc. // All rights reserved. //=20 // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions = are // met: // =20 // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. //=20 // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in = the // documentation and/or other materials provided with the // distribution. //=20 // * Neither the name of Google Inc. nor the names of its contributors // may be used to endorse or promote products derived from this // software without specific prior written permission. //=20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Miscellania that support the ajaxslt implementation. // // Author: Steffen Meschkat // function el(i) { return document.getElementById(i); } function px(x) { return x + 'px'; } // Split a string s at all occurrences of character c. This is like // the split() method of the string object, but IE omits empty // strings, which violates the invariant (s.split(x).join(x) =3D=3D s). function stringSplit(s, c) { var a =3D s.indexOf(c); if (a =3D=3D -1) { return [ s ]; } =20 var parts =3D []; parts.push(s.substr(0,a)); while (a !=3D -1) { var a1 =3D s.indexOf(c, a + 1); if (a1 !=3D -1) { parts.push(s.substr(a + 1, a1 - a - 1)); } else { parts.push(s.substr(a + 1)); }=20 a =3D a1; } return parts; } // Returns the text value if a node; for nodes without children this // is the nodeValue, for nodes with children this is the concatenation // of the value of all children. function xmlValue(node) { if (!node) { return ''; } var ret =3D ''; if (node.nodeType =3D=3D DOM_TEXT_NODE || node.nodeType =3D=3D DOM_CDATA_SECTION_NODE || node.nodeType =3D=3D DOM_ATTRIBUTE_NODE) { ret +=3D node.nodeValue; } else if (node.nodeType =3D=3D DOM_ELEMENT_NODE || node.nodeType =3D=3D DOM_DOCUMENT_NODE || node.nodeType =3D=3D DOM_DOCUMENT_FRAGMENT_NODE) { for (var i =3D 0; i < node.childNodes.length; ++i) { ret +=3D arguments.callee(node.childNodes[i]); } } return ret; } // Returns the representation of a node as XML text. function xmlText(node) { var ret =3D ''; if (node.nodeType =3D=3D DOM_TEXT_NODE) { ret +=3D xmlEscapeText(node.nodeValue); =20 } else if (node.nodeType =3D=3D DOM_ELEMENT_NODE) { ret +=3D '<' + node.nodeName; for (var i =3D 0; i < node.attributes.length; ++i) { var a =3D node.attributes[i]; if (a && a.nodeName && a.nodeValue) { ret +=3D ' ' + a.nodeName; ret +=3D '=3D"' + xmlEscapeAttr(a.nodeValue) + '"'; } } if (node.childNodes.length =3D=3D 0) { ret +=3D '/>'; } else { ret +=3D '>'; for (var i =3D 0; i < node.childNodes.length; ++i) { ret +=3D arguments.callee(node.childNodes[i]); } ret +=3D ''; } =20 } else if (node.nodeType =3D=3D DOM_DOCUMENT_NODE ||=20 node.nodeType =3D=3D DOM_DOCUMENT_FRAGMENT_NODE) { for (var i =3D 0; i < node.childNodes.length; ++i) { ret +=3D arguments.callee(node.childNodes[i]); } } =20 return ret; } // Applies the given function to each element of the array. function mapExec(array, func) { for (var i =3D 0; i < array.length; ++i) { func(array[i]); } } // Returns an array that contains the return value of the given // function applied to every element of the input array. function mapExpr(array, func) { var ret =3D []; for (var i =3D 0; i < array.length; ++i) { ret.push(func(array[i])); } return ret; }; // Reverses the given array in place. function reverseInplace(array) { for (var i =3D 0; i < array.length / 2; ++i) { var h =3D array[i]; var ii =3D array.length - i - 1; array[i] =3D array[ii]; array[ii] =3D h; } } // Shallow-copies an array. function copyArray(dst, src) {=20 for (var i =3D 0; i < src.length; ++i) { dst.push(src[i]); } } function assert(b) { if (!b) { throw 'assertion failed'; } } // Based on // = var DOM_ELEMENT_NODE =3D 1; var DOM_ATTRIBUTE_NODE =3D 2; var DOM_TEXT_NODE =3D 3; var DOM_CDATA_SECTION_NODE =3D 4; var DOM_ENTITY_REFERENCE_NODE =3D 5; var DOM_ENTITY_NODE =3D 6; var DOM_PROCESSING_INSTRUCTION_NODE =3D 7; var DOM_COMMENT_NODE =3D 8; var DOM_DOCUMENT_NODE =3D 9; var DOM_DOCUMENT_TYPE_NODE =3D 10; var DOM_DOCUMENT_FRAGMENT_NODE =3D 11; var DOM_NOTATION_NODE =3D 12; var xpathdebug =3D false; // trace xpath parsing var xsltdebug =3D false; // trace xslt processing // Escape XML special markup chracters: tag delimiter < > and entity // reference start delimiter &. The escaped string can be used in XML // text portions (i.e. between tags). function xmlEscapeText(s) { return s.replace(/&/g, '&').replace(//g, = '>'); } // Escape XML special markup characters: tag delimiter < > entity // reference start delimiter & and quotes ". The escaped string can be // used in double quoted XML attribute value portions (i.e. in // attributes within start tags). function xmlEscapeAttr(s) { return xmlEscapeText(s).replace(/\"/g, '"'); } // Escape markup in XML text, but don't touch entity references. The // escaped string can be used as XML text (i.e. between tags). function xmlEscapeTags(s) { return s.replace(//g, '>'); } // An implementation of the debug log.=20 var logging__ =3D true; function Log() {}; Log.lines =3D []; Log.write =3D function(s) { if (logging__) { this.lines.push(xmlEscapeText(s)); this.show(); } }; // Writes the given XML with every tag on a new line. Log.writeXML =3D function(xml) { if (logging__) { var s0 =3D xml.replace(/'); this.lines.push(s2); this.show(); } } // Writes without any escaping Log.writeRaw =3D function(s) { if (logging__) { this.lines.push(s); this.show(); } } Log.clear =3D function() { if (logging__) { var l =3D this.div(); l.innerHTML =3D ''; this.lines =3D []; } } Log.show =3D function() { var l =3D this.div(); l.innerHTML +=3D this.lines.join('
    ') + '
    '; this.lines =3D []; l.scrollTop =3D l.scrollHeight; } Log.div =3D function() { var l =3D document.getElementById('log'); if (!l) { l =3D document.createElement('div'); l.id =3D 'log'; l.style.position =3D 'absolute'; l.style.right =3D '5px'; l.style.top =3D '5px'; l.style.width =3D '250px'; l.style.height =3D '150px'; l.style.overflow =3D 'auto'; l.style.backgroundColor =3D '#f0f0f0'; l.style.border =3D '1px solid gray'; l.style.fontSize =3D '10px'; l.style.padding =3D '5px'; document.body.appendChild(l); } return l; } function Timer() {} Timer.start =3D function() {} Timer.end =3D function() {} ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/spry/SpryData.js /* SpryData.js - Revision: Spry Preview Release 1.3 */ // Copyright (c) 2006. Adobe Systems Incorporated. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions = are met: // // * Redistributions of source code must retain the above copyright = notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright = notice, // this list of conditions and the following disclaimer in the = documentation // and/or other materials provided with the distribution. // * Neither the name of Adobe Systems Incorporated nor the names of = its // contributors may be used to endorse or promote products derived = from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS = "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, = THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR = PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS = BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR = BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER = IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR = OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED = OF THE // POSSIBILITY OF SUCH DAMAGE. var Spry; if (!Spry) Spry =3D {}; ////////////////////////////////////////////////////////////////////// // // Spry.Utils // ////////////////////////////////////////////////////////////////////// if (!Spry.Utils) Spry.Utils =3D {}; Spry.Utils.msProgIDs =3D ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", = "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; Spry.Utils.createXMLHttpRequest =3D function() { var req =3D null; try { if (window.XMLHttpRequest) req =3D new XMLHttpRequest(); else if (window.ActiveXObject) { while (!req && Spry.Utils.msProgIDs.length) { try { req =3D new ActiveXObject(Spry.Utils.msProgIDs[0]); } catch = (e) { req =3D null; } if (!req) Spry.Utils.msProgIDs.splice(0, 1); } } } catch (e) { req =3D null; } if (!req) Spry.Debug.reportError("Failed to create an XMLHttpRequest object!" ); return req; }; Spry.Utils.loadURL =3D function(method, url, async, callback, opts) { var req =3D new Spry.Utils.loadURL.Request(); req.method =3D method; req.url =3D url; req.async =3D async; req.successCallback =3D callback; Spry.Utils.setOptions(req, opts); =09 try { req.xhRequest =3D Spry.Utils.createXMLHttpRequest(); if (!req.xhRequest) return null; if (req.async) req.xhRequest.onreadystatechange =3D function() { = Spry.Utils.loadURL.callback(req); }; req.xhRequest.open(req.method, req.url, req.async, req.username, = req.password); =09 if (req.headers) { for (var name in req.headers) req.xhRequest.setRequestHeader(name, req.headers[name]); } req.xhRequest.send(req.postData); if (!req.async) Spry.Utils.loadURL.callback(req); } catch(e) { req =3D null; Spry.Debug.reportError("Exception caught while = loading " + url + ": " + e.message); } return req; }; Spry.Utils.loadURL.callback =3D function(req) { if (!req || req.xhRequest.readyState !=3D 4) return; if (req.successCallback && (req.xhRequest.status =3D=3D 200 || = req.xhRequest.status =3D=3D 0)) req.successCallback(req); else if (req.errorCallback) req.errorCallback(req); }; Spry.Utils.loadURL.Request =3D function() { var props =3D Spry.Utils.loadURL.Request.props; var numProps =3D props.length; for (var i =3D 0; i < numProps; i++) this[props[i]] =3D null; this.method =3D "GET"; this.async =3D true; this.headers =3D {}; }; Spry.Utils.loadURL.Request.props =3D [ "method", "url", "async", = "username", "password", "postData", "successCallback", "errorCallback", = "headers", "userData", "xhRequest" ]; Spry.Utils.loadURL.Request.prototype.extractRequestOptions =3D = function(opts, undefineRequestProps) { if (!opts) return; var props =3D Spry.Utils.loadURL.Request.props; var numProps =3D props.length; for (var i =3D 0; i < numProps; i++) { var prop =3D props[i]; if (opts[prop] !=3D undefined) { this[prop] =3D opts[prop]; if (undefineRequestProps) opts[prop] =3D undefined; } } }; Spry.Utils.loadURL.Request.prototype.clone =3D function() { var props =3D Spry.Utils.loadURL.Request.props; var numProps =3D props.length; var req =3D new Spry.Utils.loadURL.Request; for (var i =3D 0; i < numProps; i++) req[props[i]] =3D this[props[i]]; if (this.headers) { req.headers =3D {}; Spry.Utils.setOptions(req.headers, this.headers); } return req; }; Spry.Utils.addEventListener =3D function(element, eventType, handler, = capture) { try { if (element.addEventListener) element.addEventListener(eventType, handler, capture); else if (element.attachEvent) element.attachEvent("on" + eventType, handler); } catch (e) {} }; Spry.Utils.removeEventListener =3D function(element, eventType, handler, = capture) { try { if (element.removeEventListener) element.removeEventListener(eventType, handler, capture); else if (element.detachEvent) element.detachEvent("on" + eventType, handler); } catch (e) {} }; Spry.Utils.addLoadListener =3D function(handler) { if (typeof window.addEventListener !=3D 'undefined') window.addEventListener('load', handler, false); else if (typeof document.addEventListener !=3D 'undefined') document.addEventListener('load', handler, false); else if (typeof window.attachEvent !=3D 'undefined') window.attachEvent('onload', handler); }; Spry.Utils.eval =3D function(str) { // Call this method from your JS function when // you don't want the JS expression to access or // interfere with any local variables in your JS // function. return eval(str); }; Spry.Utils.escapeQuotesAndLineBreaks =3D function(str) { if (str) { str =3D str.replace(/\\/g, "\\\\"); str =3D str.replace(/["']/g, "\\$&"); str =3D str.replace(/\n/g, "\\n"); str =3D str.replace(/\r/g, "\\r"); } return str; }; Spry.Utils.encodeEntities =3D function(str) { if (str && str.search(/[&<>"]/) !=3D -1) { str =3D str.replace(/&/g, "&"); str =3D str.replace(//g, ">"); str =3D str.replace(/"/g, """); } return str }; Spry.Utils.decodeEntities =3D function(str) { var d =3D Spry.Utils.decodeEntities.div; if (!d) { d =3D document.createElement('div'); Spry.Utils.decodeEntities.div =3D d; if (!d) return str; } d.innerHTML =3D str; if (d.childNodes.length =3D=3D 1 && d.firstChild.nodeType =3D=3D 3 /* = Node.TEXT_NODE */ && d.firstChild.nextSibling =3D=3D null) str =3D d.firstChild.data; else { // Hmmm, innerHTML processing of str produced content // we weren't expecting, so just replace entities we // expect folks will use in node attributes that contain // JavaScript. str =3D str.replace(/</, "<"); str =3D str.replace(/>/, ">"); str =3D str.replace(/"/, "\""); str =3D str.replace(/&/, "&"); } return str; }; Spry.Utils.fixupIETagAttributes =3D function(inStr) { var outStr =3D ""; // Break the tag string into 3 pieces. var tagStart =3D inStr.match(/^<[^\s>]+\s*/)[0]; var tagEnd =3D inStr.match(/\s*\/?>$/)[0]; var tagAttrs =3D inStr.replace(/^<[^\s>]+\s*|\s*\/?>/g, ""); // Write out the start of the tag. outStr +=3D tagStart; // If the tag has attributes, parse it out manually to avoid = accidentally fixing up // attributes that contain JavaScript expressions. if (tagAttrs) { var startIndex =3D 0; var endIndex =3D 0; while (startIndex < tagAttrs.length) { // Find the '=3D' char of the attribute. while (tagAttrs.charAt(endIndex) !=3D '=3D' && endIndex < = tagAttrs.length) ++endIndex; // If we are at the end of the string, just write out what we've // collected. if (endIndex >=3D tagAttrs.length) { outStr +=3D tagAttrs.substring(startIndex, endIndex); break; } // Step past the '=3D' character and write out what we've // collected so far. ++endIndex; outStr +=3D tagAttrs.substring(startIndex, endIndex); startIndex =3D endIndex; if (tagAttrs.charAt(endIndex) =3D=3D '"' || tagAttrs.charAt(endIndex) = =3D=3D "'") { // Attribute is quoted. Advance us past the quoted value! var savedIndex =3D endIndex++; while (endIndex < tagAttrs.length) { if (tagAttrs.charAt(endIndex) =3D=3D tagAttrs.charAt(savedIndex)) { endIndex++; break; } else if (tagAttrs.charAt(endIndex) =3D=3D "\\") endIndex++; endIndex++; } outStr +=3D tagAttrs.substring(startIndex, endIndex); startIndex =3D endIndex; } else { // This attribute value wasn't quoted! Wrap it with quotes and // write out everything till we hit a space, or the end of the // string. outStr +=3D "\""; =09 var sIndex =3D tagAttrs.slice(endIndex).search(/\s/); endIndex =3D (sIndex !=3D -1) ? (endIndex + sIndex) : = tagAttrs.length; outStr +=3D tagAttrs.slice(startIndex, endIndex); =09 outStr +=3D "\""; =09 startIndex =3D endIndex; } } } outStr +=3D tagEnd; // Write out the end of the tag. return outStr; } Spry.Utils.fixUpIEInnerHTML =3D function(inStr) { var outStr =3D ""; // Create a regular expression that will match: // // ]]> // ]]> // Yet another workaround for an IE innerHTML bug. // // The idea here is that we only want to fix up attribute values on = tags that // are not in any comments or CDATA. var regexp =3D new = RegExp("<\\!--|<\\!\\[CDATA\\[|<\\w+[^<>]*>|-->|\\]\\](>|\>)", "g"); var searchStartIndex =3D 0; var skipFixUp =3D 0; =09 while (inStr.length) { var results =3D regexp.exec(inStr); if (!results || !results[0]) { outStr +=3D inStr.substr(searchStartIndex, inStr.length - = searchStartIndex); break; } if (results.index !=3D searchStartIndex) { // We found a match but it's not at the start of the inStr. // Create a string token for everything that precedes the match. outStr +=3D inStr.substr(searchStartIndex, results.index - = searchStartIndex); } if (results[0] =3D=3D "" || results[0] =3D=3D "]]>" || = (skipFixUp && results[0] =3D=3D "]]>")) { --skipFixUp; outStr +=3D results[0]; } else if (!skipFixUp && results[0].charAt(0) =3D=3D '<') outStr +=3D Spry.Utils.fixupIETagAttributes(results[0]); else outStr +=3D results[0]; searchStartIndex =3D regexp.lastIndex; } =09 return outStr; }; Spry.Utils.getStyleProperty =3D function(element, property) { try { if (element.style[property]) return element.style[property]; else if (element.currentStyle) return element.currentStyle[property]; else if (document.defaultView && = document.defaultView.getComputedStyle) { var style =3D document.defaultView.getComputedStyle(element, null); return style.getPropertyValue(property); } } catch (e) {} return null; }; Spry.Utils.stringToXMLDoc =3D function(str) { var xmlDoc =3D null; try { // Attempt to parse the string using the IE method. var xmlDOMObj =3D new ActiveXObject("Microsoft.XMLDOM"); xmlDOMObj.async =3D false; xmlDOMObj.loadXML(str); xmlDoc =3D xmlDOMObj; } catch (e) { // The IE method didn't work. Try the Mozilla way. try { var domParser =3D new DOMParser; xmlDoc =3D domParser.parseFromString(str, 'text/xml'); } catch (e) { Spry.Debug.reportError("Caught exception in = Spry.Utils.stringToXMLDoc(): " + e + "\n"); xmlDoc =3D null; } } return xmlDoc; }; Spry.Utils.getNodesByFunc =3D function(root, func) { var nodeStack =3D new Array; var resultArr =3D new Array; var node =3D root; while (node) { if (func(node)) resultArr.push(node); if (node.hasChildNodes()) { nodeStack.push(node); node =3D node.firstChild; } else { if (node =3D=3D root) node =3D null; else try { node =3D node.nextSibling; } catch (e) { node =3D null; }; } =09 while (!node && nodeStack.length > 0) { node =3D nodeStack.pop(); if (node =3D=3D root) node =3D null; else try { node =3D node.nextSibling; } catch (e) { node =3D null; } } } =09 if (nodeStack && nodeStack.length > 0) Spry.Debug.trace("-- WARNING: Spry.Utils.getNodesByFunc() failed to = traverse all nodes!\n"); return resultArr; }; Spry.Utils.addClassName =3D function(ele, className) { if (!ele || !className || (ele.className && ele.className.search(new = RegExp("\\b" + className + "\\b")) !=3D -1)) return; ele.className +=3D (ele.className ? " " : "") + className; }; Spry.Utils.removeClassName =3D function(ele, className) { if (!ele || !className || (ele.className && ele.className.search(new = RegExp("\\b" + className + "\\b")) =3D=3D -1)) return; ele.className =3D ele.className.replace(new RegExp("\\s*\\b" + = className + "\\b", "g"), ""); }; Spry.Utils.removeAllChildren =3D function(node) { while (node && node.firstChild) node.removeChild(node.firstChild); }; Spry.Utils.getFirstChildWithNodeName =3D function(node, nodeName) { var child =3D node.firstChild; while (child) { if (child.nodeName =3D=3D nodeName) return child; child =3D child.nextSibling; }=20 return null; }; Spry.Utils.nodeContainsElementNode =3D function(node) { if (node) { node =3D node.firstChild; while (node) { if (node.nodeType =3D=3D 1 /* Node.ELEMENT_NODE */) return true; node =3D node.nextSibling; } } return false; }; Spry.Utils.getNodeText =3D function(node) { var txt =3D ""; =20 if (!node) return; try { var child =3D node.firstChild; =20 while (child) { try { if (child.nodeType =3D=3D 3 /* TEXT_NODE */) txt +=3D Spry.Utils.encodeEntities(child.data); else if (child.nodeType =3D=3D 4 /* CDATA_SECTION_NODE */) txt +=3D child.data; } catch (e) { Spry.Debug.reportError("Spry.Utils.getNodeText() = exception caught: " + e + "\n"); } child =3D child.nextSibling; } } catch (e) { Spry.Debug.reportError("Spry.Utils.getNodeText() exception = caught: " + e + "\n"); } =20 return txt; }; Spry.Utils.CreateObjectForNode =3D function(node) { if (!node) return null; var obj =3D null; var i =3D 0; var attr =3D null; try { for (i =3D 0; i < node.attributes.length; i++) { attr =3D node.attributes[i]; if (attr && attr.nodeType =3D=3D 2 /* Node.ATTRIBUTE_NODE */) { if (!obj) { obj =3D new Object(); if (!obj) { Spry.Debug.reportError("Spry.Utils.CreateObjectForNode(): Object = creation failed!"); return null; } } =09 obj["@" + attr.name] =3D attr.value; } } } catch (e) { Spry.Debug.reportError("Spry.Utils.CreateObjectForNode() caught = exception while accessing attributes: " + e + "\n"); } =20 var child =3D node.firstChild; =09 if (child && !child.nextSibling && child.nodeType !=3D 1 /* = Node.ELEMENT_NODE */) { // We have a single child and it's not an element. It must // be the text value for this node. Add it to the record set and // give it the column the same name as the node. if (!obj) { obj =3D new Object(); if (!obj) { Spry.Debug.reportError("Spry.Utils.CreateObjectForNode(): Object = creation failed!"); return null; } } obj[node.nodeName] =3D Spry.Utils.getNodeText(node); } =20 while (child) { // Add the text value for each child element. Note that // We skip elements that have element children (sub-elements) // because we don't handle multi-level data sets right now. =09 if (child.nodeType =3D=3D 1 /* Node.ELEMENT_NODE */) { if (!Spry.Utils.nodeContainsElementNode(child)) { var txt =3D Spry.Utils.getNodeText(child); if (!obj) { obj =3D new Object(); if (!obj) { Spry.Debug.reportError("Spry.Utils.CreateObjectForNode(): Object = creation failed!"); return null; } } =20 obj[child.nodeName] =3D txt; // Now add properties for any attributes on the child. The property // name will be of the form "/@". try { var namePrefix =3D child.nodeName + "/@"; =09 for (i =3D 0; i < child.attributes.length; i++) { attr =3D child.attributes[i]; if (attr && attr.nodeType =3D=3D 2 /* Node.ATTRIBUTE_NODE */) obj[namePrefix + attr.name] =3D attr.value; } } catch (e) { Spry.Debug.reportError("Spry.Utils.CreateObjectForNode() caught = exception while accessing attributes: " + e + "\n"); } =20 } // else Spry.Debug.trace("WARNING: Skipping '" + child.nodeName + "' = node! Multi-level data sets are not supported right now!\n"); } child =3D child.nextSibling; } =20 return obj; }; Spry.Utils.getRecordSetFromXMLDoc =3D function(xmlDoc, path) { if (!xmlDoc || !path) return null; var recordSet =3D new Object(); recordSet.xmlDoc =3D xmlDoc; recordSet.xmlPath =3D path; recordSet.dataHash =3D new Object; recordSet.data =3D new Array; recordSet.getData =3D function() { return this.data; }; // Use the XPath library to find the nodes that will // make up our data set. The result should be an array // of subtrees that we need to flatten. var ctx =3D new ExprContext(xmlDoc); var pathExpr =3D xpathParse(path); var e =3D pathExpr.evaluate(ctx); // XXX: Note that we should check the result type of the evaluation // just in case it's a boolean, string, or number value instead of // a node set. =20 var nodeArray =3D e.nodeSetValue(); var isDOMNodeArray =3D true; if (nodeArray && nodeArray.length > 0) isDOMNodeArray =3D nodeArray[0].nodeType !=3D 2 /* Node.ATTRIBUTE_NODE = */; var nextID =3D 0; // We now have the set of nodes that make up our data set // so process each one. for (var i =3D 0; i < nodeArray.length; i++) { var rowObj =3D null; =09 if (isDOMNodeArray) rowObj =3D Spry.Utils.CreateObjectForNode(nodeArray[i]); else // Must be a Node.ATTRIBUTE_NODE array. { rowObj =3D new Object; rowObj["@" + nodeArray[i].name] =3D nodeArray[i].value; } =09 if (rowObj) { // We want to make sure that every row has a unique ID and since we // we don't know which column, if any, in this recordSet is a unique // identifier, we generate a unique ID ourselves and store it under // the ds_RowID column in the row object. rowObj['ds_RowID'] =3D nextID++; recordSet.dataHash[rowObj['ds_RowID']] =3D rowObj; recordSet.data.push(rowObj); } } =20 return recordSet; }; Spry.Utils.setOptions =3D function(obj, optionsObj, = ignoreUndefinedProps) { if (!optionsObj) return; for (var optionName in optionsObj) { if (ignoreUndefinedProps && optionsObj[optionName] =3D=3D undefined) continue; obj[optionName] =3D optionsObj[optionName]; } }; Spry.Utils.SelectionManager =3D {}; Spry.Utils.SelectionManager.selectionGroups =3D new Object; Spry.Utils.SelectionManager.SelectionGroup =3D function() { this.selectedElements =3D new Array; }; Spry.Utils.SelectionManager.SelectionGroup.prototype.select =3D = function(element, className, multiSelect) { var selObj =3D null; if (!multiSelect) { // Multiple selection is not enabled, so clear any // selected elements from our list. this.clearSelection(); } else { // Multiple selection is enabled, so check to see if element // is already in the array. If it is, make sure the className // is the className that was passed in. for (var i =3D 0; i < this.selectedElements.length; i++) { selObj =3D this.selectedElements[i].element; if (selObj.element =3D=3D element) { if (selObj.className !=3D className) { Spry.Utils.removeClassName(element, selObj.className); Spry.Utils.addClassName(element, className); } return; } } } // Add the element to our list of selected elements. selObj =3D new Object; selObj.element =3D element; selObj.className =3D className; this.selectedElements.push(selObj); Spry.Utils.addClassName(element, className); }; Spry.Utils.SelectionManager.SelectionGroup.prototype.unSelect =3D = function(element) { for (var i =3D 0; i < this.selectedElements.length; i++) { var selObj =3D this.selectedElements[i].element; =09 if (selObj.element =3D=3D element) { Spry.Utils.removeClassName(selObj.element, selObj.className); return; } } }; Spry.Utils.SelectionManager.SelectionGroup.prototype.clearSelection =3D = function() { var selObj =3D null; do { selObj =3D this.selectedElements.shift(); if (selObj) Spry.Utils.removeClassName(selObj.element, selObj.className); } while (selObj); }; Spry.Utils.SelectionManager.getSelectionGroup =3D = function(selectionGroupName) { if (!selectionGroupName) return null; var groupObj =3D = Spry.Utils.SelectionManager.selectionGroups[selectionGroupName]; if (!groupObj) { groupObj =3D new Spry.Utils.SelectionManager.SelectionGroup(); Spry.Utils.SelectionManager.selectionGroups[selectionGroupName] =3D = groupObj; } return groupObj; }; Spry.Utils.SelectionManager.select =3D function(selectionGroupName, = element, className, multiSelect) { var groupObj =3D = Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName); if (!groupObj) return; groupObj.select(element, className, multiSelect); }; Spry.Utils.SelectionManager.unSelect =3D function(selectionGroupName, = element) { var groupObj =3D = Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName); if (!groupObj) return; groupObj.unSelect(element, className); }; Spry.Utils.SelectionManager.clearSelection =3D = function(selectionGroupName) { var groupObj =3D = Spry.Utils.SelectionManager.getSelectionGroup(selectionGroupName); if (!groupObj) return; groupObj.clearSelection(); }; ////////////////////////////////////////////////////////////////////// // // Define Prototype's $() convenience function. // ////////////////////////////////////////////////////////////////////// function $() { var elements =3D new Array(); =09 for (var i =3D 0; i < arguments.length; i++) { var element =3D arguments[i]; if (typeof element =3D=3D 'string') element =3D document.getElementById(element); =09 if (arguments.length =3D=3D 1) return element; =09 elements.push(element); } =09 return elements; } Spry.Utils.Notifier =3D function() { this.observers =3D []; this.suppressNotifications =3D 0; }; Spry.Utils.Notifier.prototype.addObserver =3D function(observer) { if (!observer) return; // Make sure the observer isn't already on the list. var len =3D this.observers.length; for (var i =3D 0; i < len; i++) { if (this.observers[i] =3D=3D observer) return; } this.observers[len] =3D observer; }; Spry.Utils.Notifier.prototype.removeObserver =3D function(observer) { if (!observer) return; for (var i =3D 0; i < this.observers.length; i++) { if (this.observers[i] =3D=3D observer) { this.observers.splice(i, 1); break; } } }; Spry.Utils.Notifier.prototype.notifyObservers =3D function(methodName, = data) { if (!methodName) return; if (!this.suppressNotifications) { var len =3D this.observers.length; for (var i =3D 0; i < len; i++) { var obs =3D this.observers[i]; if (obs) { if (typeof obs =3D=3D "function") obs(methodName, this, data); else if (obs[methodName]) obs[methodName](this, data); } } } }; Spry.Utils.Notifier.prototype.enableNotifications =3D function() { if (--this.suppressNotifications < 0) { this.suppressNotifications =3D 0; Spry.Debug.reportError("Unbalanced enableNotifications() call!\n"); } }; Spry.Utils.Notifier.prototype.disableNotifications =3D function() { ++this.suppressNotifications; }; ////////////////////////////////////////////////////////////////////// // // Spry.Debug // ////////////////////////////////////////////////////////////////////// Spry.Debug =3D {}; Spry.Debug.enableTrace =3D true; Spry.Debug.debugWindow =3D null; Spry.Debug.createDebugWindow =3D function() { if (!Spry.Debug.enableTrace || Spry.Debug.debugWindow) return; try { Spry.Debug.debugWindow =3D document.createElement("div"); var div =3D Spry.Debug.debugWindow; div.style.fontSize =3D "12px"; div.style.fontFamily =3D "console"; div.style.position =3D "absolute"; div.style.width =3D "400px"; div.style.height =3D "300px"; div.style.overflow =3D "auto"; div.style.border =3D "solid 1px black"; div.style.backgroundColor =3D "white"; div.style.color =3D "black"; div.style.bottom =3D "0px"; div.style.right =3D "0px"; // div.style.opacity =3D "0.5"; // div.style.filter =3D "alpha(opacity=3D50)"; div.setAttribute("id", "SpryDebugWindow"); document.body.appendChild(Spry.Debug.debugWindow); } catch (e) {} }; Spry.Debug.debugOut =3D function(str, bgColor) { if (!Spry.Debug.debugWindow) { Spry.Debug.createDebugWindow(); if (!Spry.Debug.debugWindow) return; } var d =3D document.createElement("div"); if (bgColor) d.style.backgroundColor =3D bgColor; d.innerHTML =3D str; Spry.Debug.debugWindow.appendChild(d);=09 }; Spry.Debug.trace =3D function(str) { Spry.Debug.debugOut(str); }; Spry.Debug.reportError =3D function(str) { Spry.Debug.debugOut(str, "red"); }; ////////////////////////////////////////////////////////////////////// // // Spry.Data // ////////////////////////////////////////////////////////////////////// Spry.Data =3D {}; Spry.Data.regionsArray =3D {}; Spry.Data.initRegions =3D function(rootNode) { if (!rootNode) rootNode =3D document.body; var regions =3D Spry.Utils.getNodesByFunc(rootNode, function(node) { try { if (node.nodeType !=3D 1 /* Node.ELEMENT_NODE */) return false; // Region elements must have an spryregion attribute with a // non-empty value. An id attribute is also required so we can // reference the region by name if necessary. var attrName =3D "spry:region"; var attr =3D node.attributes.getNamedItem(attrName); if (!attr) { attrName =3D "spry:detailregion"; attr =3D node.attributes.getNamedItem(attrName); } if (attr) { if (attr.value) { attr =3D node.attributes.getNamedItem("id"); if (!attr || !attr.value) { // The node is missing an id attribute so add one. node.setAttribute("id", "spryregion" + = (++Spry.Data.initRegions.nextUniqueRegionID)); } =09 return true; } else Spry.Debug.reportError(attrName + " attributes require one or more = data set names as values!"); } } catch(e) {} return false; }); var name, dataSets, i; =20 for (i =3D 0; i < regions.length; i++) { var rgn =3D regions[i]; var isDetailRegion =3D false; // Get the region name. name =3D rgn.attributes.getNamedItem("id").value; attr =3D rgn.attributes.getNamedItem("spry:region"); if (!attr) { attr =3D rgn.attributes.getNamedItem("spry:detailregion"); isDetailRegion =3D true; } if (!attr.value) { Spry.Debug.reportError("spry:region and spry:detailregion attributes = require one or more data set names as values!"); continue; } // Remove the spry:region or spry:detailregion attribute so it doesn't = appear in // the output generated by our processing of the dynamic region. rgn.attributes.removeNamedItem(attr.nodeName); // Remove the hiddenRegionCSS class from the rgn. Spry.Utils.removeClassName(rgn, = Spry.Data.Region.hiddenRegionClassName); // Get the DataSets that should be bound to the region. dataSets =3D Spry.Data.Region.strToDataSetsArray(attr.value); if (!dataSets.length) { Spry.Debug.reportError("spry:region or spry:detailregion attribute = has no data set!"); continue; } =09 var hasBehaviorAttributes =3D false; var hasSpryContent =3D false; var dataStr =3D ""; var parent =3D null; var regionStates =3D {}; // Find all of the processing instruction regions in the region. // Insert comments around the regions we find so we can identify them // easily when tokenizing the region html string. var piRegions =3D Spry.Utils.getNodesByFunc(rgn, function(node) { try { if (node.nodeType =3D=3D 1 /* ELEMENT_NODE */) { var attributes =3D node.attributes; var numPI =3D Spry.Data.Region.PI.orderedInstructions.length; var lastStartComment =3D null; var lastEndComment =3D null; for (var i =3D 0; i < numPI; i++) { var piName =3D Spry.Data.Region.PI.orderedInstructions[i]; var attr =3D attributes.getNamedItem(piName); if (!attr) continue; =09 var piDesc =3D Spry.Data.Region.PI.instructions[piName]; var childrenOnly =3D (node =3D=3D rgn) ? true : = piDesc.childrenOnly; var openTag =3D piDesc.getOpenTag(node, piName); var closeTag =3D piDesc.getCloseTag(node, piName); =09 if (childrenOnly) { var oComment =3D document.createComment(openTag); var cComment =3D document.createComment(closeTag) if (!lastStartComment) node.insertBefore(oComment, node.firstChild); else node.insertBefore(oComment, lastStartComment.nextSibling); lastStartComment =3D oComment; if (!lastEndComment) node.appendChild(cComment); else node.insertBefore(cComment, lastEndComment); lastEndComment =3D cComment; } else { var parent =3D node.parentNode; parent.insertBefore(document.createComment(openTag), node); parent.insertBefore(document.createComment(closeTag), = node.nextSibling); } // If this is a spry:state processing instruction, record the = state name // so we know that we should re-generate the region if we ever see = that state. if (piName =3D=3D "spry:state") regionStates[attr.value] =3D true; node.removeAttribute(piName); } if (!hasBehaviorAttributes && = Spry.Data.Region.enableBehaviorAttributes) { for (var behaviorAttrName in Spry.Data.Region.behaviorAttrs) { if (attributes.getNamedItem(behaviorAttrName)) { hasBehaviorAttributes =3D true; break; } } } } } catch(e) {} return false; }); =09 // Get the data in the region. dataStr =3D rgn.innerHTML; // Argh! IE has an innerHTML bug where it will remove the quotes = around any // attribute value that it thinks is a single word. This includes = removing quotes // around our data references which is problematic since a single data = reference // can be replaced with multiple words. If we are running in IE, we = have to call // fixUpIEInnerHTML to get around this problem. if (window.ActiveXObject && !Spry.Data.Region.disableIEInnerHTMLFixUp = && dataStr.search(/=3D\{/) !=3D -1) { if (Spry.Data.Region.debug) Spry.Debug.trace("
    Performing IE innerHTML fix up of Region: " = + name + "

    " + Spry.Utils.encodeEntities(dataStr)); dataStr =3D Spry.Utils.fixUpIEInnerHTML(dataStr); } if (Spry.Data.Region.debug) Spry.Debug.trace("
    Region template markup for '" + name + "':

    " + Spry.Utils.encodeEntities(dataStr)); if (!hasSpryContent) { // Clear the region. Spry.Utils.removeAllChildren(rgn); } // Create a Spry.Data.Region object for this region. var region =3D new Spry.Data.Region(rgn, name, isDetailRegion, = dataStr, dataSets, regionStates, hasBehaviorAttributes); Spry.Data.regionsArray[region.name] =3D region; } Spry.Data.updateAllRegions(); }; Spry.Data.initRegions.nextUniqueRegionID =3D 0; Spry.Data.updateRegion =3D function(regionName) { if (!regionName || !Spry.Data.regionsArray || = !Spry.Data.regionsArray[regionName]) return; try { Spry.Data.regionsArray[regionName].updateContent(); } catch(e) { Spry.Debug.reportError("Spry.Data.updateRegion(" + = regionName + ") caught an exception: " + e + "\n"); } }; Spry.Data.getRegion =3D function(regionName) { return Spry.Data.regionsArray[regionName]; }; Spry.Data.updateAllRegions =3D function() { if (!Spry.Data.regionsArray) return; for (var regionName in Spry.Data.regionsArray) Spry.Data.updateRegion(regionName); }; ////////////////////////////////////////////////////////////////////// // // Spry.Data.DataSet // ////////////////////////////////////////////////////////////////////// Spry.Data.DataSet =3D function() { Spry.Utils.Notifier.call(this); this.name =3D ""; this.internalID =3D Spry.Data.DataSet.nextDataSetID++; this.curRowID =3D 0; this.data =3D null; this.unfilteredData =3D null; this.dataHash =3D null; this.columnTypes =3D new Object; this.filterFunc =3D null; // non-destructive filter function this.filterDataFunc =3D null; // destructive filter function this.distinctOnLoad =3D false; this.sortOnLoad =3D null; this.sortOrderOnLoad =3D "ascending"; this.keepSorted =3D false; this.dataWasLoaded =3D false; this.pendingRequest =3D null; this.lastSortColumns =3D []; this.lastSortOrder =3D ""; this.loadIntervalID =3D 0; }; Spry.Data.DataSet.prototype =3D new Spry.Utils.Notifier(); Spry.Data.DataSet.prototype.constructor =3D Spry.Data.DataSet; Spry.Data.DataSet.prototype.getData =3D function() { return this.data; }; Spry.Data.DataSet.prototype.getUnfilteredData =3D function() { return this.unfilteredData ? this.unfilteredData : this.data; }; Spry.Data.DataSet.prototype.getLoadDataRequestIsPending =3D function() { return this.pendingRequest !=3D null; }; Spry.Data.DataSet.prototype.getDataWasLoaded =3D function() { return this.dataWasLoaded; }; Spry.Data.DataSet.prototype.loadData =3D function() { // The idea here is that folks using the base class DataSet directly // would change the data in the DataSet manually and then call = loadData() // to fire off an async notifications to say that it was ready for = consumption. // // Firing off data changed notificataions synchronously from this = method // can wreak havoc with complicated master/detail regions that use data = sets // that have master/detail relationships with other data sets. Our data = set // logic already handles async data loading nicely so we use a timer to = fire // off the data changed notification to insure that it happens after = this // function is finished and the JS stack unwinds. // // Other classes that derive from this class and load data = synchronously // inside their loadData() implementation should also fire off an async // notification in this same manner to avoid this same problem. var self =3D this; this.pendingRequest =3D new Object; this.dataWasLoaded =3D false; this.pendingRequest.timer =3D setTimeout(function() { self.pendingRequest =3D null; self.dataWasLoaded =3D true; if (self.filterDataFunc) self.filterData(self.filterDataFunc, true); if (self.distinctOnLoad) self.distinct(); if (self.keepSorted && self.getSortColumn()) self.sort(self.lastSortColumns, self.lastSortOrder) else if (self.sortOnLoad) self.sort(self.sortOnLoad, self.sortOrderOnLoad); =09 if (self.filterFunc) self.filter(self.filterFunc, true); =09 self.notifyObservers("onDataChanged"); }, 0); =20 }; Spry.Data.DataSet.prototype.cancelLoadData =3D function() { if (this.pendingRequest && this.pendingRequest.timer) clearTimeout(this.pendingRequest.timer); this.pendingRequest =3D null; }; Spry.Data.DataSet.prototype.getCurrentRow =3D function() { if (!this.data) return null; return this.dataHash[this.curRowID]; }; Spry.Data.DataSet.prototype.setCurrentRow =3D function(rowID) { if (this.curRowID =3D=3D rowID) return; var nData =3D { oldRowID: this.curRowID, newRowID: rowID }; this.curRowID =3D rowID; this.notifyObservers("onCurrentRowChanged", nData); }; Spry.Data.DataSet.prototype.getRowNumber =3D function(row) { if (row && this.data && this.data.length) { var numRows =3D this.data.length; for (var i =3D 0; i < numRows; i++) { if (this.data[i] =3D=3D row) return i; } } return 0; }; Spry.Data.DataSet.prototype.getCurrentRowNumber =3D function() { return this.getRowNumber(this.getCurrentRow()); }; Spry.Data.DataSet.prototype.setCurrentRowNumber =3D function(rowNumber) { if (!this.data || rowNumber >=3D this.data.length) { Spry.Debug.trace("Invalid row number: " + rowNumber + "\n"); return; } var rowID =3D this.data[rowNumber]["ds_RowID"]; if (rowID =3D=3D undefined || this.curRowID =3D=3D rowID) return; this.setCurrentRow(rowID); }; Spry.Data.DataSet.prototype.setColumnType =3D function(columnName, = columnType) { if (columnName) this.columnTypes[columnName] =3D columnType; }; Spry.Data.DataSet.prototype.getColumnType =3D function(columnName) { if (this.columnTypes[columnName]) return this.columnTypes[columnName]; return "string"; }; Spry.Data.DataSet.prototype.distinct =3D function() { if (this.data) { var oldData =3D this.data; this.data =3D []; this.dataHash =3D {}; var alreadySeenHash =3D {}; var i =3D 0; for (var i =3D 0; i < oldData.length; i++) { var rec =3D oldData[i]; var hashStr =3D ""; for (var recField in rec) { if (recField !=3D "ds_RowID") { if (hashStr) hashStr +=3D ","; hashStr +=3D recField + ":" + "\"" + rec[recField] + "\""; } } if (!alreadySeenHash[hashStr]) { this.data.push(rec); this.dataHash[rec['ds_RowID']] =3D rec; alreadySeenHash[hashStr] =3D true; } } } }; Spry.Data.DataSet.prototype.getSortColumn =3D function() { return (this.lastSortColumns && this.lastSortColumns.length > 0) ? = this.lastSortColumns[0] : ""; }; Spry.Data.DataSet.prototype.sort =3D function(columnNames, sortOrder) { // columnNames can be either the name of a column to // sort on, or an array of column names, but it can't be // null/undefined. if (!columnNames) return; // If only one column name was specified for sorting, do a // secondary sort on ds_RowID so we get a stable sort order. if (typeof columnNames =3D=3D "string") columnNames =3D [ columnNames, "ds_RowID" ]; else if (columnNames.length < 2 && columnNames[0] !=3D "ds_RowID") columnNames.push("ds_RowID"); if (sortOrder =3D=3D "toggle") { if (this.lastSortColumns.length > 0 && this.lastSortColumns[0] =3D=3D = columnNames[0] && this.lastSortOrder =3D=3D "ascending") sortOrder =3D "descending"; else sortOrder =3D "ascending"; } if (!sortOrder) sortOrder =3D "ascending"; if (sortOrder !=3D "ascending" && sortOrder !=3D "descending") { Spry.Debug.reportError("Invalid sort order type specified: " + = sortOrder + "\n"); return; } var nData =3D { oldSortColumns: this.lastSortColumns, oldSortOrder: this.lastSortOrder, newSortColumns: columnNames, newSortOrder: sortOrder }; this.notifyObservers("onPreSort", nData); var cname =3D columnNames[columnNames.length - 1]; var sortfunc =3D Spry.Data.DataSet.prototype.sort.getSortFunc(cname, = this.getColumnType(cname), sortOrder); for (var i =3D columnNames.length - 2; i >=3D 0; i--) { cname =3D columnNames[i]; sortfunc =3D = Spry.Data.DataSet.prototype.sort.buildSecondarySortFunc(Spry.Data.DataSet= .prototype.sort.getSortFunc(cname, this.getColumnType(cname), = sortOrder), sortfunc); } if (this.unfilteredData) { this.unfilteredData.sort(sortfunc); if (this.filterFunc) this.filter(this.filterFunc, true); } else this.data.sort(sortfunc); this.lastSortColumns =3D columnNames.slice(0); // Copy the array. this.lastSortOrder =3D sortOrder; this.notifyObservers("onPostSort", nData); }; Spry.Data.DataSet.prototype.sort.getSortFunc =3D function(prop, type, = order) { var sortfunc =3D null; if (type =3D=3D "number") { if (order =3D=3D "ascending") sortfunc =3D function(a, b){ return a[prop]-b[prop]; }; else // order =3D=3D "descending" sortfunc =3D function(a, b){ return b[prop]-a[prop]; }; } else if (type =3D=3D "date") { if (order =3D=3D "ascending") sortfunc =3D function(a, b) { var dA =3D a[prop]; var dB =3D b[prop]; =09 dA =3D dA ? (new Date(dA)) : 0; dB =3D dB ? (new Date(dB)) : 0; return dA - dB; }; else // order =3D=3D "descending" sortfunc =3D function(a, b) { var dA =3D a[prop]; var dB =3D b[prop]; =09 dA =3D dA ? (new Date(dA)) : 0; dB =3D dB ? (new Date(dB)) : 0; return dB - dA; }; } else // type =3D=3D "string" { if (order =3D=3D "ascending") sortfunc =3D function(a, b){ return (a[prop] < b[prop]) ? -1 : = ((a[prop] > b[prop]) ? 1 : 0) }; else // order =3D=3D "descending" sortfunc =3D function(a, b){ return (a[prop] > b[prop]) ? -1 : = ((a[prop] < b[prop]) ? 1 : 0) }; } return sortfunc; }; Spry.Data.DataSet.prototype.sort.buildSecondarySortFunc =3D = function(funcA, funcB) { return function(a, b) { var ret =3D funcA(a, b); if (ret =3D=3D 0) ret =3D funcB(a, b); return ret; }; }; Spry.Data.DataSet.prototype.filterData =3D function(filterFunc, = filterOnly) { // This is a destructive filter function. =09 var dataChanged =3D false; if (!filterFunc) { // Caller wants to remove the filter. this.filterDataFunc =3D null; dataChanged =3D true; } else { this.filterDataFunc =3D filterFunc; =09 if (this.dataWasLoaded && ((this.unfilteredData && = this.unfilteredData.length) || (this.data && this.data.length))) { if (this.unfilteredData) { this.data =3D this.unfilteredData; this.unfilteredData =3D null; } =09 var oldData =3D this.data; this.data =3D []; this.dataHash =3D {}; =09 for (var i =3D 0; i < oldData.length; i++) { var newRow =3D filterFunc(this, oldData[i], i); if (newRow) { this.data.push(newRow); this.dataHash[newRow["ds_RowID"]] =3D newRow; } } =09 dataChanged =3D true; } } if (dataChanged) { if (!filterOnly) { this.disableNotifications(); if (this.filterFunc) this.filter(this.filterFunc, true); this.enableNotifications(); } this.notifyObservers("onDataChanged"); } }; Spry.Data.DataSet.prototype.filter =3D function(filterFunc, filterOnly) { // This is a non-destructive filter function. var dataChanged =3D false; if (!filterFunc) { if (this.filterFunc && this.unfilteredData) { // Caller wants to remove the filter. Restore the unfiltered // data and trigger a data changed notification. =09 this.data =3D this.unfilteredData; this.unfilteredData =3D null; this.filterFunc =3D null; dataChanged =3D true; } } else { this.filterFunc =3D filterFunc; =09 if (this.dataWasLoaded && (this.unfilteredData || (this.data && = this.data.length))) { if (!this.unfilteredData) this.unfilteredData =3D this.data; =09 var udata =3D this.unfilteredData; this.data =3D []; =09 for (var i =3D 0; i < udata.length; i++) { var newRow =3D filterFunc(this, udata[i], i); =09 if (newRow) this.data.push(newRow); } =09 dataChanged =3D true; } } if (dataChanged) this.notifyObservers("onDataChanged"); }; Spry.Data.DataSet.prototype.startLoadInterval =3D function(interval) { this.stopLoadInterval(); if (interval > 0) { var self =3D this; this.loadInterval =3D interval; this.loadIntervalID =3D setInterval(function() { self.loadData(); }, = interval); } }; Spry.Data.DataSet.prototype.stopLoadInterval =3D function() { if (this.loadIntervalID) clearInterval(this.loadIntervalID); this.loadInterval =3D 0; this.loadIntervalID =3D null; }; Spry.Data.DataSet.nextDataSetID =3D 0; ////////////////////////////////////////////////////////////////////// // // Spry.Data.XMLDataSet // ////////////////////////////////////////////////////////////////////// Spry.Data.XMLDataSet =3D function(dataSetURL, dataSetPath, = dataSetOptions) { // Call the constructor for our DataSet base class so that // our base class properties get defined. We'll call setOptions // manually after we set up our XMLDataSet properties. Spry.Data.DataSet.call(this); =09 // XMLDataSet Properties: this.url =3D dataSetURL; this.xpath =3D dataSetPath; this.doc =3D null; this.dataSetsForDataRefStrings =3D new Array; this.hasDataRefStrings =3D false; this.useCache =3D true; // Create a loadURL request object to store any load options // the caller specified. We'll fill in the URL at the last minute // before we make the actual load request because our URL needs // to be processed at the last possible minute in case it contains // data references. this.requestInfo =3D new Spry.Utils.loadURL.Request(); this.requestInfo.extractRequestOptions(dataSetOptions, true); // If the caller wants to use "POST" to fetch the data, but didn't // provide the content type, default to x-www-form-urlencoded. if (this.requestInfo.method =3D=3D "POST") { if (!this.requestInfo.headers) this.requestInfo.headers =3D {}; if (!this.requestInfo.headers['Content-Type']) this.requestInfo.headers['Content-Type'] =3D = "application/x-www-form-urlencoded; charset=3DUTF-8"; } Spry.Utils.setOptions(this, dataSetOptions, true); =09 this.recalculateDataSetDependencies(); if (this.loadInterval > 0) this.startLoadInterval(this.loadInterval); }; // End of Spry.Data.XMLDataSet() constructor. Spry.Data.XMLDataSet.prototype =3D new Spry.Data.DataSet(); Spry.Data.XMLDataSet.prototype.constructor =3D Spry.Data.XMLDataSet; Spry.Data.XMLDataSet.prototype.recalculateDataSetDependencies =3D = function() { this.hasDataRefStrings =3D false; if (!this.url) return; // Clear all old callbacks that may have been registered. var i =3D 0; for (i =3D 0; i < this.dataSetsForDataRefStrings.length; i++) { var ds =3D this.dataSetsForDataRefStrings[i]; if (ds) ds.removeObserver(this); } // Now run through the strings that may contain data references and = figure // out what data sets they require. Note that the data references in = these // strings must be fully qualified with a data set name. (ex: = {dsDataSetName::columnName}) this.dataSetsForDataRefStrings =3D new Array(); var regionStrs =3D [ this.url, this.xpath, this.requestInfo.postData ]; // If postData exists, and is a string, we want to check it for data = refs. var postData =3D this.requestInfo.postData; if (postData && (typeof postData) =3D=3D "string") regionStrs.push(postData); var dsCount =3D 0; for (var n =3D 0; n < regionStrs.length; n++) { var tokens =3D Spry.Data.Region.getTokensFromStr(regionStrs[n]); for (i =3D 0; tokens && i < tokens.length; i++) { if (tokens[i].search(/{[^}:]+::[^}]+}/) !=3D -1) { var dsName =3D tokens[i].replace(/^\{|::.*\}/g, ""); var ds =3D null; if (!this.dataSetsForDataRefStrings[dsName]) { try { ds =3D eval(dsName); } catch (e) { ds =3D null; } =09 if (dsName && ds) { // The dataSetsForDataRefStrings array serves as both an // array of data sets and a hash lookup by name. this.dataSetsForDataRefStrings[dsName] =3D ds; this.dataSetsForDataRefStrings[dsCount++] =3D ds; this.hasDataRefStrings =3D true; } } } } } // Set up observers on any data sets our URL depends on. for (i =3D 0; i < this.dataSetsForDataRefStrings.length; i++) { var ds =3D this.dataSetsForDataRefStrings[i]; ds.addObserver(this); } }; Spry.Data.XMLDataSet.prototype.attemptLoadData =3D function() { // We only want to trigger a load when all of our data sets have data! for (var i =3D 0; i < this.dataSetsForDataRefStrings.length; i++) { var ds =3D this.dataSetsForDataRefStrings[i]; if (ds.getLoadDataRequestIsPending() || !ds.getDataWasLoaded()) return; } this.loadData(); }; Spry.Data.XMLDataSet.prototype.onCurrentRowChanged =3D function(ds, = data) { this.attemptLoadData(); }; Spry.Data.XMLDataSet.prototype.onPostSort =3D function(ds, data) { this.attemptLoadData(); }; =09 Spry.Data.XMLDataSet.prototype.onDataChanged =3D function(ds, data) { this.attemptLoadData(); }; =09 Spry.Data.XMLDataSet.prototype.loadData =3D function() { if (!this.url || !this.xpath) return; this.cancelLoadData(); var url =3D this.url; var postData =3D this.requestInfo.postData; if (this.hasDataRefStrings) { var allDataSetsReady =3D true; for (var i =3D 0; i < this.dataSetsForDataRefStrings.length; i++) { var ds =3D this.dataSetsForDataRefStrings[i]; if (ds.getLoadDataRequestIsPending()) allDataSetsReady =3D false; else if (!ds.getDataWasLoaded()) { // Kick off the load of this data set! ds.loadData(); allDataSetsReady =3D false; } } // If our data sets aren't ready, just return. We'll // get called back to load our data when they are all // done. if (!allDataSetsReady) return; url =3D Spry.Data.Region.processDataRefString(null, this.url, = this.dataSetsForDataRefStrings); if (!url) return; =09 if (postData && (typeof postData) =3D=3D "string") postData =3D Spry.Data.Region.processDataRefString(null, postData, = this.dataSetsForDataRefStrings); } this.notifyObservers("onPreLoad"); this.data =3D null; this.dataWasLoaded =3D false; this.unfilteredData =3D null; this.dataHash =3D null; this.curRowID =3D 0; // At this point the url should've been processed if it contained any // data references. Set the url of the requestInfo structure and pass = it // to LoadManager.loadData(). var req =3D this.requestInfo.clone(); req.url =3D url; req.postData =3D postData; this.pendingRequest =3D new Object; this.pendingRequest.data =3D = Spry.Data.XMLDataSet.LoadManager.loadData(req, this, this.useCache); }; Spry.Data.XMLDataSet.prototype.cancelLoadData =3D function() { if (this.pendingRequest) { = Spry.Data.XMLDataSet.LoadManager.cancelLoadData(this.pendingRequest.data,= this); this.pendingRequest =3D null; } }; Spry.Data.XMLDataSet.prototype.getURL =3D function() { return this.url; = }; Spry.Data.XMLDataSet.prototype.setURL =3D function(url, requestOptions) { if (this.url =3D=3D url) return; this.url =3D url; if (requestOptions) this.requestInfo.extractRequestOptions(requestOptions); this.cancelLoadData(); this.recalculateDataSetDependencies(); this.dataWasLoaded =3D false; }; Spry.Data.XMLDataSet.prototype.getDocument =3D function() { return = this.doc; }; Spry.Data.XMLDataSet.prototype.getXPath =3D function() { return = this.xpath; }; Spry.Data.XMLDataSet.prototype.setXPath =3D function(path) { if (this.xpath !=3D path) { this.xpath =3D path; if (this.dataWasLoaded && this.doc) this.setDataFromDoc(this.doc); } }; Spry.Data.XMLDataSet.prototype.setDataFromDoc =3D function(doc) { this.pendingRequest =3D null; var rs =3D null; rs =3D Spry.Utils.getRecordSetFromXMLDoc(doc, = Spry.Data.Region.processDataRefString(null, this.xpath, = this.dataSetsForDataRefStrings)); if (!rs) { Spry.Debug.reportError("Spry.Data.XMLDataSet.setDataFromDoc() failed = to create dataSet '" + this.name + "'for '" + this.xpath + "' - " + = this.url + "\n"); return; } this.doc =3D rs.xmlDoc; this.data =3D rs.data; this.dataHash =3D rs.dataHash; this.dataWasLoaded =3D (this.doc !=3D null); // If there is a data filter installed, run it. if (this.filterDataFunc) this.filterData(this.filterDataFunc, true); // If the distinct flag was set, run through all the records in the = recordset // and toss out any that are duplicates. if (this.distinctOnLoad) this.distinct(); // If sortOnLoad was set, sort the data based on the columns // specified in sortOnLoad. if (this.keepSorted && this.getSortColumn()) this.sort(this.lastSortColumns, this.lastSortOrder) else if (this.sortOnLoad) this.sort(this.sortOnLoad, this.sortOrderOnLoad); // If there is a view filter installed, run it. if (this.filterFunc) this.filter(this.filterFunc, true); // The default "current" row is the first row of the data set. if (this.data && this.data.length > 0) this.curRowID =3D this.data[0]['ds_RowID']; else this.curRowID =3D 0; this.notifyObservers("onPostLoad"); this.notifyObservers("onDataChanged"); }; Spry.Data.XMLDataSet.prototype.onRequestResponse =3D = function(cachedRequest, req) { this.setDataFromDoc(cachedRequest.doc); }; Spry.Data.XMLDataSet.prototype.onRequestError =3D = function(cachedRequest, req) { this.notifyObservers("onLoadError", req); // = Spry.Debug.reportError("Spry.Data.XMLDataSet.LoadManager.CachedRequest.lo= adDataCallback(" + req.xhRequest.status + ") failed to load: " + req.url = + "\n"); }; Spry.Data.XMLDataSet.LoadManager =3D {}; Spry.Data.XMLDataSet.LoadManager.cache =3D []; Spry.Data.XMLDataSet.LoadManager.CachedRequest =3D function(reqInfo) { Spry.Utils.Notifier.call(this); this.reqInfo =3D reqInfo; this.doc =3D null; this.timer =3D null; this.state =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.NOT_LOADED; }; Spry.Data.XMLDataSet.LoadManager.CachedRequest.prototype =3D new = Spry.Utils.Notifier(); Spry.Data.XMLDataSet.LoadManager.CachedRequest.prototype.constructor =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest; Spry.Data.XMLDataSet.LoadManager.CachedRequest.NOT_LOADED =3D 1; Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_REQUESTED =3D 2; Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_FAILED =3D 3; Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL =3D 4; Spry.Data.XMLDataSet.LoadManager.CachedRequest.prototype.loadDataCallback= =3D function(req) { if (req.xhRequest.readyState !=3D 4) return; var xmlDoc =3D req.xhRequest.responseXML; if (req.xhRequest.status !=3D 200) { if (req.xhRequest.status =3D=3D 0) { // The page that is attempting to load data was probably loaded with // a file:// url. Mozilla based browsers will actually provide the = complete DOM // tree for the data, but IE provides an empty document node so try = to parse // the xml text manually to create a dom tree we can use. if (req.xhRequest.responseText && (!xmlDoc || !xmlDoc.firstChild)) xmlDoc =3D Spry.Utils.stringToXMLDoc(req.xhRequest.responseText); } } if (!xmlDoc || !xmlDoc.firstChild || xmlDoc.firstChild.nodeName =3D=3D = "parsererror") { this.state =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_FAILED; this.notifyObservers("onRequestError", req); this.observers.length =3D 0; // Clear the observers list. return; } this.doc =3D xmlDoc; this.state =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL; // Notify all of the cached request's observers! this.notifyObservers("onRequestResponse", req); // Clear the observers list. this.observers.length =3D 0; }; Spry.Data.XMLDataSet.LoadManager.CachedRequest.prototype.loadData =3D = function() { // IE will synchronously fire our loadDataCallback() during the call // to an async Spry.Utils.loadURL() if the data for the url is already // in the browser's local cache. This can wreak havoc with complicated = master/detail // regions that use data sets that have master/detail relationships = with other // data sets. Our data set logic already handles async data loading = nicely so we // use a timer to fire off the async Spry.Utils.loadURL() call to = insure that any // data loading happens asynchronously after this function is finished. var self =3D this; this.cancelLoadData(); this.doc =3D null; this.state =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_REQUESTED; var reqInfo =3D this.reqInfo.clone(); reqInfo.successCallback =3D function(req) { self.loadDataCallback(req); = }; reqInfo.errorCallback =3D reqInfo.successCallback; this.timer =3D setTimeout(function() { self.timer =3D null; Spry.Utils.loadURL(reqInfo.method, reqInfo.url, reqInfo.async, = reqInfo.successCallback, reqInfo); }, 0); =20 }; Spry.Data.XMLDataSet.LoadManager.CachedRequest.prototype.cancelLoadData = =3D function() { if (this.state =3D=3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_REQUESTED) { if (this.timer) { this.timer.clearTimeout(); this.timer =3D null; } this.doc =3D null; this.state =3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.NOT_LOADED; } }; Spry.Data.XMLDataSet.LoadManager.getCacheKey =3D function(reqInfo) { return reqInfo.method + "::" + reqInfo.url + "::" + reqInfo.postData + = "::" + reqInfo.username; }; Spry.Data.XMLDataSet.LoadManager.loadData =3D function(reqInfo, ds, = useCache) { if (!reqInfo) return null; var cacheObj =3D null; var cacheKey =3D null; if (useCache) { cacheKey =3D Spry.Data.XMLDataSet.LoadManager.getCacheKey(reqInfo); cacheObj =3D Spry.Data.XMLDataSet.LoadManager.cache[cacheKey]; } if (cacheObj) { if (cacheObj.state =3D=3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_REQUESTED) { if (ds) cacheObj.addObserver(ds); return cacheObj; } else if (cacheObj.state =3D=3D = Spry.Data.XMLDataSet.LoadManager.CachedRequest.LOAD_SUCCESSFUL) { // Data is already cached so if we have a data set, trigger an async = call // that tells it to load its data. if (ds) setTimeout(function() { ds.setDataFromDoc(cacheObj.doc); }, 0); return cacheObj; } } // We're either loading this url for the first time, or an error = occurred when // we last tried to load it, or the caller requested a forced load. if (!cacheObj) { cacheObj =3D new = Spry.Data.XMLDataSet.LoadManager.CachedRequest(reqInfo); if (useCache) { Spry.Data.XMLDataSet.LoadManager.cache[cacheKey] =3D cacheObj; // Add an observer that will remove the cacheObj from the cache // if there is a load request failure. cacheObj.addObserver({ onRequestError: function() { = Spry.Data.XMLDataSet.LoadManager.cache[cacheKey] =3D undefined; }}); } } if (ds) cacheObj.addObserver(ds); cacheObj.loadData(); return cacheObj; }; Spry.Data.XMLDataSet.LoadManager.cancelLoadData =3D function(cacheObj, = ds) { if (cacheObj) { if (ds) cacheObj.removeObserver(ds); else cacheObj.cancelLoadData(); } }; ////////////////////////////////////////////////////////////////////// // // Spry.Data.Region // ////////////////////////////////////////////////////////////////////// =20 Spry.Data.Region =3D function(regionNode, name, isDetailRegion, data, = dataSets, regionStates, hasBehaviorAttributes) { this.regionNode =3D regionNode; this.name =3D name; this.isDetailRegion =3D isDetailRegion; this.data =3D data; this.dataSets =3D dataSets; this.hasBehaviorAttributes =3D hasBehaviorAttributes; this.tokens =3D null; this.currentState =3D null; this.states =3D { ready: true }; Spry.Utils.setOptions(this.states, regionStates); // Add the region as an observer to the dataSet! for (var i =3D 0; i < this.dataSets.length; i++) { var ds =3D this.dataSets[i]; try=20 { if (ds) ds.addObserver(this); } catch(e) { Spry.Debug.reportError("Failed to add '" + this.name + "' = as a dataSet observer!\n"); } } }; // End of Spry.Data.Region() constructor. Spry.Data.Region.hiddenRegionClassName =3D "SpryHiddenRegion"; Spry.Data.Region.evenRowClassName =3D "even"; Spry.Data.Region.oddRowClassName =3D "odd"; Spry.Data.Region.notifiers =3D {}; Spry.Data.Region.addObserver =3D function(regionID, observer) { var n =3D Spry.Data.Region.notifiers[regionID]; if (!n) { n =3D new Spry.Utils.Notifier(); Spry.Data.Region.notifiers[regionID] =3D n; } n.addObserver(observer); }; Spry.Data.Region.removeObserver =3D function(regionID, observer) { var n =3D Spry.Data.Region.notifiers[regionID]; if (n) n.removeObserver(observer); }; Spry.Data.Region.notifyObservers =3D function(methodName, regionID) { var n =3D Spry.Data.Region.notifiers[regionID]; if (n) n.notifyObservers(methodName, { regionID: regionID }); }; Spry.Data.Region.RS_Error =3D 0x01; Spry.Data.Region.RS_LoadingData =3D 0x02; Spry.Data.Region.RS_PreUpdate =3D 0x04; Spry.Data.Region.RS_PostUpdate =3D 0x08; Spry.Data.Region.prototype.getState =3D function() { return this.currentState; }; Spry.Data.Region.prototype.setState =3D function(stateName, = suppressNotfications) { this.currentState =3D stateName; // If the region has content that is specific to this // state, regenerate the region so that its markup is updated. if (this.states[stateName]) { if (!suppressNotfications) Spry.Data.Region.notifyObservers("onPreUpdate", this.name); =09 // Make the region transform the xml data. The result is // a string that we need to parse and insert into the document. var str =3D this.transform(); =09 // Clear out any previous transformed content. // this.clearContent(); =09 if (Spry.Data.Region.debug) Spry.Debug.trace("
    Generated region markup for '" + this.name + = "':

    " + Spry.Utils.encodeEntities(str)); // Now insert the new transformed content into the document. this.regionNode.innerHTML =3D str; =09 // Now run through the content looking for attributes // that tell us what behaviors to attach to each element. if (this.hasBehaviorAttributes) this.attachBehaviors(); =09 if (!suppressNotfications) Spry.Data.Region.notifyObservers("onPostUpdate", this.name); } }; Spry.Data.Region.prototype.getDataSets =3D function() { return this.dataSets; }; Spry.Data.Region.prototype.addDataSet =3D function(aDataSet) { if (!aDataSet) return; if (!this.dataSets) this.dataSets =3D new Array; // Check to see if the data set is already in our list. for (var i =3D 0; i < this.dataSets.length; i++) { if (this.dataSets[i] =3D=3D aDataSet) return; // It's already in our list! } this.dataSets.push(aDataSet); aDataSet.addObserver(this); }; Spry.Data.Region.prototype.removeDataSet =3D function(aDataSet) { if (!aDataSet || this.dataSets) return; for (var i =3D 0; i < this.dataSets.length; i++) { if (this.dataSets[i] =3D=3D aDataSet) { this.dataSets.splice(i, 1); aDataSet.removeObserver(this); return; } } }; Spry.Data.Region.prototype.onPreLoad =3D function(dataSet) { if (this.currentState !=3D "loading") this.setState("loading"); }; Spry.Data.Region.prototype.onLoadError =3D function(dataSet) { if (this.currentState !=3D "error") this.setState("error"); Spry.Data.Region.notifyObservers("onError", this.name); }; Spry.Data.Region.prototype.onCurrentRowChanged =3D function(dataSet, = data) { if (this.isDetailRegion) this.updateContent(); }; Spry.Data.Region.prototype.onPostSort =3D function(dataSet, data) { this.updateContent(); }; Spry.Data.Region.prototype.onDataChanged =3D function(dataSet, data) { this.updateContent(); }; Spry.Data.Region.enableBehaviorAttributes =3D true; Spry.Data.Region.behaviorAttrs =3D {}; Spry.Data.Region.behaviorAttrs["spry:select"] =3D { attach: function(node, value) { var selectGroupName =3D null; try { selectGroupName =3D = node.attributes.getNamedItem("spry:selectgroup").value; } catch (e) {} if (!selectGroupName) selectGroupName =3D "default"; Spry.Utils.addEventListener(node, "click", function(event) { = Spry.Utils.SelectionManager.select(selectGroupName, node, value); }, = false); =09 if (node.attributes.getNamedItem("spry:selected")) Spry.Utils.SelectionManager.select(selectGroupName, node, value); } }; Spry.Data.Region.behaviorAttrs["spry:hover"] =3D { attach: function(node, value) { Spry.Utils.addEventListener(node, "mouseover", function(event){ = Spry.Utils.addClassName(node, value); }, false); Spry.Utils.addEventListener(node, "mouseout", function(event){ = Spry.Utils.removeClassName(node, value); }, false); } }; Spry.Data.Region.prototype.attachBehaviors =3D function() { Spry.Utils.getNodesByFunc(this.regionNode, function(node) { if (!node) return false; try { var attrs =3D node.attributes; for (var i =3D 0; i < attrs.length; i++) { var attr =3D attrs[i]; var behavior =3D = Spry.Data.Region.behaviorAttrs[attr.nodeName.toLowerCase()]; if (behavior) behavior.attach(node, attr.value); } } catch(e) { } return false; }); }; Spry.Data.Region.prototype.updateContent =3D function() { var allDataSetsReady =3D true; var dsArray =3D this.getDataSets(); if (!dsArray || dsArray.length < 1) { Spry.Debug.reportError("updateContent(): Region '" + this.name + "' = has no data set!\n"); return; } for (var i =3D 0; i < dsArray.length; i++) { var ds =3D dsArray[i]; if (ds) { if (ds.getLoadDataRequestIsPending()) allDataSetsReady =3D false; else if (!ds.getDataWasLoaded()) { // Kick off the loading of the data if it hasn't happened yet. ds.loadData(); allDataSetsReady =3D false; } } } if (!allDataSetsReady) { Spry.Data.Region.notifyObservers("onLoadingData", this.name); // Just return, this method will get called again automatically // as each data set load completes! return; } this.setState("ready"); }; Spry.Data.Region.prototype.clearContent =3D function() { Spry.Utils.removeAllChildren(this.regionNode); }; Spry.Data.Region.processContentPI =3D function(inStr) { var outStr =3D ""; var regexp =3D //mg; var searchStartIndex =3D 0; var processingContentTag =3D 0; while (inStr.length) { var results =3D regexp.exec(inStr); if (!results || !results[0]) { outStr +=3D inStr.substr(searchStartIndex, inStr.length - = searchStartIndex); break; } if (!processingContentTag && results.index !=3D searchStartIndex) { // We found a match but it's not at the start of the inStr. // Create a string token for everything that precedes the match. outStr +=3D inStr.substr(searchStartIndex, results.index - = searchStartIndex); } if (results[0].search(/<\//) !=3D -1) { --processingContentTag; if (processingContentTag) Spry.Debug.reportError("Nested spry:content regions are not = allowed!\n"); } else { ++processingContentTag; var dataRefStr =3D results[0].replace(/.*\bdataref=3D"/, ""); outStr +=3D dataRefStr.replace(/".*$/, ""); } =09 searchStartIndex =3D regexp.lastIndex; } return outStr; } Spry.Data.Region.prototype.tokenizeData =3D function(dataStr) { // If there is no data, there's nothing to do. if (!dataStr) return null; var rootToken =3D new = Spry.Data.Region.Token(Spry.Data.Region.Token.LIST_TOKEN, null, null, = null); var tokenStack =3D new Array; var parseStr =3D Spry.Data.Region.processContentPI(dataStr); tokenStack.push(rootToken); // Create a regular expression that will match one of the following: // // // // {valueReference} var regexp =3D = /((){0,1})|((\{|%7[bB])[^\}\s%]+(\= }|%7[dD]))/mg; var searchStartIndex =3D 0; while(parseStr.length) { var results =3D regexp.exec(parseStr); var token =3D null; =09 if (!results || !results[0]) { // If we get here, the rest of the parseStr should be // just a plain string. Create a token for it and then // break out of the list. var str =3D parseStr.substr(searchStartIndex, parseStr.length - = searchStartIndex); token =3D new = Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN, null, str, = str); tokenStack[tokenStack.length - 1].addChild(token); break; } if (results.index !=3D searchStartIndex) { // We found a match but it's not at the start of the parseStr. // Create a string token for everything that precedes the match. var str =3D parseStr.substr(searchStartIndex, results.index - = searchStartIndex); token =3D new = Spry.Data.Region.Token(Spry.Data.Region.Token.STRING_TOKEN, null, str, = str); tokenStack[tokenStack.length - 1].addChild(token); } // We found a string that needs to be turned into a token. Create a = token // for it and then update parseStr for the next iteration. if (results[0].search(/^({|%7[bB])/) !=3D -1 /* results[0].charAt(0) = =3D=3D '{' */) { var valueName =3D results[0]; var regionStr =3D results[0]; =09 // Strip off brace and url encode brace chars inside the valueName. valueName =3D valueName.replace(/^({|%7[bB])/, ""); valueName =3D valueName.replace(/(}|%7[dD])$/, ""); // Check to see if our value begins with the name of a data set. // For example: {dataSet:tokenValue}. If it is, we need to save // the data set name so we know which data set to use to get the // value for the token during the region transform. var dataSetName =3D null; var splitArray =3D valueName.split(/::/); if (splitArray.length > 1) { dataSetName =3D splitArray[0]; valueName =3D splitArray[1]; } // Convert any url encoded braces to regular brace chars. regionStr =3D regionStr.replace(/^%7[bB]/, "{"); regionStr =3D regionStr.replace(/%7[dD]$/, "}"); // Now create a token for the placeholder. token =3D new = Spry.Data.Region.Token(Spry.Data.Region.Token.VALUE_TOKEN, dataSetName, = valueName, new String(regionStr)); tokenStack[tokenStack.length - 1].addChild(token); } else if (results[0].charAt(0) =3D=3D '<') { // Extract out the name of the processing instruction. var piName =3D results[0].replace(/^(){0,1}|\s.*$/, ""); =09 if (results[0].search(/<\//) !=3D -1 /* results[0].charAt(1) =3D=3D = '/' */) { // We found a processing instruction close tag. Pop the top of the // token stack! // // XXX: We need to make sure that the close tag name matches the one // on the top of the token stack! if (tokenStack[tokenStack.length - 1].tokenType !=3D = Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN) { Spry.Debug.reportError("Invalid processing instruction close tag: " = + piName + " -- " + results[0] + "\n"); return null; } tokenStack.pop(); } else { // Create the processing instruction token, add it as a child of the = token // at the top of the token stack, and then push it on the stack so = that it // becomes the parent of any tokens between it and its close tag. var piDesc =3D Spry.Data.Region.PI.instructions[piName]; if (piDesc) { var dataSet =3D null; var selectedDataSetName =3D ""; if (results[0].search(/^.*\bselect=3D\"/) !=3D -1) { selectedDataSetName =3D results[0].replace(/^.*\bselect=3D\"/, = ""); selectedDataSetName =3D selectedDataSetName.replace(/".*$/, ""); =09 if (selectedDataSetName) { try { dataSet =3D eval(selectedDataSetName); } catch (e) { Spry.Debug.reportError("Caught exception in tokenizeData() while = trying to retrieve data set (" + selectedDataSetName + "): " + e + = "\n"); dataSet =3D null; selectedDataSetName =3D ""; } } } // Check if the repeat has a test attribute. var jsExpr =3D null; if (results[0].search(/^.*\btest=3D\"/) !=3D -1) { jsExpr =3D results[0].replace(/^.*\btest=3D\"/, ""); jsExpr =3D jsExpr.replace(/".*$/, ""); jsExpr =3D Spry.Utils.decodeEntities(jsExpr); } // Check if the instruction has a state name specified. var regionState =3D null; if (results[0].search(/^.*\bname=3D\"/) !=3D -1) { regionState =3D results[0].replace(/^.*\bname=3D\"/, ""); regionState =3D regionState.replace(/".*$/, ""); regionState =3D Spry.Utils.decodeEntities(regionState); } var piData =3D new Spry.Data.Region.Token.PIData(piName, = selectedDataSetName, jsExpr, regionState); token =3D new = Spry.Data.Region.Token(Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKE= N, dataSet, piData, new String(results[0])); tokenStack[tokenStack.length - 1].addChild(token); tokenStack.push(token); } else { Spry.Debug.reportError("Unsupported region processing instruction: = " + results[0] + "\n"); return null; } } } else { Spry.Debug.reportError("Invalid region token: " + results[0] + "\n"); return null; } searchStartIndex =3D regexp.lastIndex; } return rootToken; }; Spry.Data.Region.prototype.processTokenChildren =3D function(token, = processContext) { // The use of an array to gather the strings returned from processing // the child tokens is actually a performance enhancement for IE. // The original code: // // for (var i =3D 0; i < token.children.length; i++) // outputStr +=3D this.processTokens(token.children[i], = processContext); // // seemed to cause an n-square problem in IE. Using an array with // a final join reduced one of our test cases (SelectExample.html) from = over // a minute to about 15 seconds. =09 var strArr =3D [ "" ]; var len =3D token.children.length; var children =3D token.children; =09 for (var i =3D 0; i < len; i++) strArr.push(this.processTokens(children[i], processContext)); return strArr.join(""); }; Spry.Data.Region.prototype.processTokens =3D function(token, = processContext) { if (!processContext) { processContext =3D new Spry.Data.Region.ProcessingContext(this); if (!processContext) return ""; } var outputStr =3D ""; var i =3D 0; switch(token.tokenType) { case Spry.Data.Region.Token.LIST_TOKEN: outputStr +=3D this.processTokenChildren(token, processContext); break; case Spry.Data.Region.Token.STRING_TOKEN: outputStr +=3D token.data; break; case Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN: if (token.data.name =3D=3D "spry:repeat") { var dataSet =3D null; if (token.dataSet) dataSet =3D token.dataSet; else dataSet =3D this.dataSets[0]; if (dataSet) { var dsContext =3D processContext.getDataSetContext(dataSet); if (!dsContext) { Spry.Debug.reportError("processTokens() failed to get a data set = context!\n"); break; } var numRows =3D dsContext.getNumRows(); var dataSetRows =3D dataSet.getData(); dsContext.pushState(); for (i =3D 0; i < numRows; i++) { dsContext.setRowIndex(i); var testVal =3D true; if (token.data.jsExpr) { var jsExpr =3D = Spry.Data.Region.processDataRefString(processContext, token.data.jsExpr, = null, true); try { testVal =3D Spry.Utils.eval(jsExpr); } catch(e) { Spry.Debug.trace("Caught exception in = Spry.Data.Region.prototype.processTokens while evaluating: " + jsExpr + = "\n Exception:" + e + "\n"); testVal =3D true; } } if (testVal) outputStr +=3D this.processTokenChildren(token, processContext); } dsContext.popState(); } } else if (token.data.name =3D=3D "spry:if") { var testVal =3D true; =09 if (token.data.jsExpr) { var jsExpr =3D = Spry.Data.Region.processDataRefString(processContext, token.data.jsExpr, = null, true); try { testVal =3D Spry.Utils.eval(jsExpr); } catch(e) { Spry.Debug.trace("Caught exception in = Spry.Data.Region.prototype.processTokens while evaluating: " + jsExpr + = "\n Exception:" + e + "\n"); testVal =3D true; } } =09 if (testVal) outputStr +=3D this.processTokenChildren(token, processContext); } else if (token.data.name =3D=3D "spry:choose") { var defaultChild =3D null; var childToProcess =3D null; var testVal =3D false; var j =3D 0; // All of the children of the spry:choose token should be of the = type spry:when or spry:default. // Run through all of the spry:when children and see if any of their = test expressions return true. // If one does, then process its children tokens. If none of the = test expressions return true, // process the spry:default token's children, if it exists. for (j =3D 0; j < token.children.length; j++) { var child =3D token.children[j]; if (child.tokenType =3D=3D = Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN) { if (child.data.name =3D=3D "spry:when") { if (child.data.jsExpr) { var jsExpr =3D = Spry.Data.Region.processDataRefString(processContext, child.data.jsExpr, = null, true); try { testVal =3D Spry.Utils.eval(jsExpr); } catch(e) { Spry.Debug.trace("Caught exception in = Spry.Data.Region.prototype.processTokens while evaluating: " + jsExpr + = "\n Exception:" + e + "\n"); testVal =3D false; } if (testVal) { childToProcess =3D child; break; } } } else if (child.data.name =3D=3D "spry:default") defaultChild =3D child; } } // If we didn't find a match, use the token for the default case. if (!childToProcess && defaultChild) childToProcess =3D defaultChild; if (childToProcess) outputStr +=3D this.processTokenChildren(childToProcess, = processContext); } else if (token.data.name =3D=3D "spry:state") { var testVal =3D true; =09 if (!token.data.regionState || token.data.regionState =3D=3D = this.currentState) outputStr +=3D this.processTokenChildren(token, processContext); } else { Spry.Debug.reportError("processTokens(): Unknown processing = instruction: " + token.data.name + "\n"); return ""; } break; case Spry.Data.Region.Token.VALUE_TOKEN: var dataSet =3D token.dataSet; if (!dataSet && this.dataSets && this.dataSets.length > 0 && = this.dataSets[0]) { // No dataSet was specified by the token, so use whatever the first // data set specified in the region. dataSet =3D this.dataSets[0]; } if (!dataSet) { Spry.Debug.reportError("processTokens(): Value reference has no data = set specified: " + token.regionStr + "\n"); return ""; } var dsContext =3D processContext.getDataSetContext(dataSet); if (!dsContext) { Spry.Debug.reportError("processTokens: Failed to get a data set = context!\n"); return ""; } var ds =3D dsContext.getDataSet(); if (token.data =3D=3D "ds_RowNumber") outputStr +=3D dsContext.getRowIndex(); else if (token.data =3D=3D "ds_RowNumberPlus1") outputStr +=3D (dsContext.getRowIndex() + 1); else if (token.data =3D=3D "ds_RowCount") outputStr +=3D dsContext.getNumRows(); else if (token.data =3D=3D "ds_UnfilteredRowCount") outputStr +=3D dsContext.getNumRows(true); else if (token.data =3D=3D "ds_CurrentRowNumber") outputStr +=3D ds.getRowNumber(ds.getCurrentRow()); else if (token.data =3D=3D "ds_CurrentRowID") outputStr +=3D ds.curRowID; else if (token.data =3D=3D "ds_EvenOddRow") outputStr +=3D (dsContext.getRowIndex() % 2) ? = Spry.Data.Region.evenRowClassName : Spry.Data.Region.oddRowClassName; else if (token.data =3D=3D "ds_SortOrder") outputStr +=3D (ds.lastSortOrder) ? ds.lastSortOrder : ""; else if (token.data =3D=3D "ds_SortColumn") outputStr +=3D ds.getSortColumn(); else { var curDataSetRow =3D dsContext.getCurrentRow(); if (curDataSetRow) outputStr +=3D curDataSetRow[token.data]; } break; default: Spry.Debug.reportError("processTokens(): Invalid token type: " + = token.regionStr + "\n"); break; } return outputStr; }; Spry.Data.Region.prototype.transform =3D function() { if (this.data && !this.tokens) this.tokens =3D this.tokenizeData(this.data); if (!this.tokens) return ""; return this.processTokens(this.tokens, null); }; Spry.Data.Region.PI =3D {}; Spry.Data.Region.PI.instructions =3D {}; Spry.Data.Region.PI.buildOpenTagForValueAttr =3D function(ele, piName, = attrName) { if (!ele || !piName) return ""; var jsExpr =3D ""; try { var testAttr =3D ele.attributes.getNamedItem(piName); if (testAttr && testAttr.value) jsExpr =3D Spry.Utils.encodeEntities(testAttr.value); } catch (e) { jsExpr =3D ""; } if (!jsExpr) { Spry.Debug.reportError(piName + " attribute requires a JavaScript = expression that returns true or false!\n"); return ""; } return "<" + Spry.Data.Region.PI.instructions[piName].tagName + " " + = attrName +"=3D\"" + jsExpr + "\">"; }; Spry.Data.Region.PI.buildOpenTagForTest =3D function(ele, piName) { return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele, piName, = "test"); }; Spry.Data.Region.PI.buildOpenTagForState =3D function(ele, piName) { return Spry.Data.Region.PI.buildOpenTagForValueAttr(ele, piName, = "name"); }; Spry.Data.Region.PI.buildOpenTagForRepeat =3D function(ele, piName) { if (!ele || !piName) return ""; var selectAttrStr =3D ""; try { var selectAttr =3D ele.attributes.getNamedItem(piName); if (selectAttr && selectAttr.value) { selectAttrStr =3D selectAttr.value; selectAttrStr =3D selectAttrStr.replace(/\s/g, ""); } } catch (e) { selectAttrStr =3D ""; } if (!selectAttrStr) { Spry.Debug.reportError(piName + " attribute requires a data set = name!\n"); return ""; } var testAttrStr =3D ""; try { var testAttr =3D ele.attributes.getNamedItem("spry:test"); if (testAttr) { if (testAttr.value) testAttrStr =3D " test=3D\"" + = Spry.Utils.encodeEntities(testAttr.value) + "\""; ele.attributes.removeNamedItem(testAttr.nodeName); } } catch (e) { testAttrStr =3D ""; } return "<" + Spry.Data.Region.PI.instructions[piName].tagName + " = select=3D\"" + selectAttrStr + "\"" + testAttrStr + ">"; }; Spry.Data.Region.PI.buildOpenTagForContent =3D function(ele, piName) { if (!ele || !piName) return ""; var dataRefStr =3D ""; try { var contentAttr =3D ele.attributes.getNamedItem(piName); if (contentAttr && contentAttr.value) dataRefStr =3D Spry.Utils.encodeEntities(contentAttr.value); } catch (e) { dataRefStr =3D ""; } if (!dataRefStr) { Spry.Debug.reportError(piName + " attribute requires a data = reference!\n"); return ""; } return "<" + Spry.Data.Region.PI.instructions[piName].tagName + " = dataref=3D\"" + dataRefStr + "\">"; }; Spry.Data.Region.PI.buildOpenTag =3D function(ele, piName) { return "<" + Spry.Data.Region.PI.instructions[piName].tagName + ">"; }; Spry.Data.Region.PI.buildCloseTag =3D function(ele, piName) { return ""; }; Spry.Data.Region.PI.instructions["spry:state"] =3D { tagName: = "spry:state", childrenOnly: false, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForState, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:if"] =3D { tagName: "spry:if", = childrenOnly: false, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForTest, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:repeat"] =3D { tagName: = "spry:repeat", childrenOnly: false, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForRepeat, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:repeatchildren"] =3D { tagName: = "spry:repeat", childrenOnly: true, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForRepeat, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:choose"] =3D { tagName: = "spry:choose", childrenOnly: true, getOpenTag: = Spry.Data.Region.PI.buildOpenTag, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:when"] =3D { tagName: = "spry:when", childrenOnly: false, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForTest, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:default"] =3D { tagName: = "spry:default", childrenOnly: false, getOpenTag: = Spry.Data.Region.PI.buildOpenTag, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.instructions["spry:content"] =3D { tagName: = "spry:content", childrenOnly: true, getOpenTag: = Spry.Data.Region.PI.buildOpenTagForContent, getCloseTag: = Spry.Data.Region.PI.buildCloseTag }; Spry.Data.Region.PI.orderedInstructions =3D [ "spry:state", "spry:if", = "spry:repeat", "spry:repeatchildren", "spry:choose", "spry:when", = "spry:default", "spry:content" ]; Spry.Data.Region.getTokensFromStr =3D function(str) { // XXX: This will need to be modified if we support // tokens that use javascript between the braces! if (!str) return null; return str.match(/{[^}]+}/g); }; Spry.Data.Region.processDataRefString =3D function(processingContext, = regionStr, dataSetsToUse, isJSExpr) { if (!regionStr) return ""; if (!processingContext && !dataSetsToUse) return regionStr; var resultStr =3D ""; var re =3D new RegExp("\\{([^\\}:]+::)?[^\\}]+\\}", "g"); var startSearchIndex =3D 0; while (startSearchIndex < regionStr.length) { var reArray =3D re.exec(regionStr); if (!reArray || !reArray[0]) { resultStr +=3D regionStr.substr(startSearchIndex, regionStr.length - = startSearchIndex); return resultStr; } if (reArray.index !=3D startSearchIndex) resultStr +=3D regionStr.substr(startSearchIndex, reArray.index - = startSearchIndex); var dsName =3D ""; if (reArray[0].search(/^\{[^}:]+::/) !=3D -1) dsName =3D reArray[0].replace(/^\{|::.*/g, ""); var fieldName =3D reArray[0].replace(/^\{|.*::|\}/g, ""); var row =3D null; if (processingContext) { var dsContext =3D processingContext.getDataSetContext(dsName); if (fieldName =3D=3D "ds_RowNumber") { resultStr +=3D dsContext.getRowIndex(); row =3D null; } else if (fieldName =3D=3D "ds_RowNumberPlus1") { resultStr +=3D (dsContext.getRowIndex() + 1); row =3D null; } else if (fieldName =3D=3D "ds_RowCount") { resultStr +=3D dsContext.getNumRows(); row =3D null; } else if (fieldName =3D=3D "ds_UnfilteredRowCount") { resultStr +=3D dsContext.getNumRows(true); row =3D null; } else if (fieldName =3D=3D "ds_CurrentRowNumber") { var ds =3D dsContext.getDataSet(); resultStr +=3D ds.getRowNumber(ds.getCurrentRow()); row =3D null; } else if (fieldName =3D=3D "ds_CurrentRowID") { var ds =3D dsContext.getDataSet(); resultStr +=3D "" + ds.curRowID; row =3D null; } else if (fieldName =3D=3D "ds_EvenOddRow") { resultStr +=3D (dsContext.getRowIndex() % 2) ? = Spry.Data.Region.evenRowClassName : Spry.Data.Region.oddRowClassName; row =3D null; } else if (fieldName =3D=3D "ds_SortOrder") { var sortOrder =3D dsContext.getDataSet().lastSortOrder; if (sortOrder) resultStr +=3D sortOrder; row =3D null; } else if (fieldName =3D=3D "ds_SortColumn") { resultStr +=3D dsContext.getDataSet().getSortColumn(); row =3D null; } else row =3D processingContext.getCurrentRowForDataSet(dsName); } else { var ds =3D dsName ? dataSetsToUse[dsName] : dataSetsToUse[0]; if (ds) row =3D ds.getCurrentRow(); } if (row) resultStr +=3D isJSExpr ? Spry.Utils.escapeQuotesAndLineBreaks("" + = row[fieldName]) : row[fieldName]; if (startSearchIndex =3D=3D re.lastIndex) { // On IE if there was a match near the end of the string, it = sometimes // leaves re.lastIndex pointing to the value it had before the last = time // we called re.exec. We check for this case to prevent an infinite = loop! // We need to write out any text in regionStr that comes after the = last // match. var leftOverIndex =3D reArray.index + reArray[0].length; if (leftOverIndex < regionStr.length) resultStr +=3D regionStr.substr(leftOverIndex); break; } startSearchIndex =3D re.lastIndex; } return resultStr; }; Spry.Data.Region.strToDataSetsArray =3D function(str, returnRegionNames) { var dataSetsArr =3D new Array; var foundHash =3D {}; if (!str) return dataSetsArr; str =3D str.replace(/\s+/g, " "); str =3D str.replace(/^\s|\s$/g, ""); var arr =3D str.split(/ /); for (var i =3D 0; i < arr.length; i++) { if (arr[i] && !Spry.Data.Region.PI.instructions[arr[i]]) { try { var dataSet =3D eval(arr[i]); if (!foundHash[arr[i]]) { if (returnRegionNames) dataSetsArr.push(arr[i]); else dataSetsArr.push(dataSet); foundHash[arr[i]] =3D true; } } catch (e) { /* Spry.Debug.trace("Caught exception: " + e + "\n"); */ = } } } return dataSetsArr; }; Spry.Data.Region.DSContext =3D function(dataSet) { var m_self =3D this; var m_dataSet =3D dataSet; var m_curRowIndexArray =3D [ -1 ]; // -1 means return whatever the = current row is inside the data set. // Private Methods: function getInternalRowIndex() { return = m_curRowIndexArray[m_curRowIndexArray.length - 1]; } // Public Methods: this.resetAll =3D function() { m_curRowIndexArray =3D [ = m_dataSet.getCurrentRow() ] }; this.getDataSet =3D function() { return m_dataSet; }; this.getNumRows =3D function(unfiltered) { var rows =3D unfiltered ? m_dataSet.getUnfilteredData() : = m_dataSet.getData(); return rows ? rows.length : 0; }; this.getCurrentRow =3D function() { if (m_curRowIndexArray.length < 2 || getInternalRowIndex() < 0) return m_dataSet.getCurrentRow(); =09 var data =3D m_dataSet.getData(); var curRowIndex =3D getInternalRowIndex(); =09 if (curRowIndex < 0 || curRowIndex > data.length) { Spry.Debug.reportError("Invalid index used in = Spry.Data.Region.DSContext.getCurrentRow()!\n"); return null; } =09 return data[curRowIndex]; }; this.getRowIndex =3D function() { var curRowIndex =3D getInternalRowIndex(); if (curRowIndex >=3D 0) return curRowIndex; return m_dataSet.getRowNumber(m_dataSet.getCurrentRow()); }; this.setRowIndex =3D function(rowIndex) { = m_curRowIndexArray[m_curRowIndexArray.length - 1] =3D rowIndex; }; this.pushState =3D function() { m_curRowIndexArray.push( = getInternalRowIndex()); }; this.popState =3D function() { if (m_curRowIndexArray.length < 2) { // Our array should always have at least one element in it! Spry.Debug.reportError("Stack underflow in = Spry.Data.Region.DSContext.popState()!\n"); return; } m_curRowIndexArray.pop(); }; }; Spry.Data.Region.ProcessingContext =3D function(region) { var m_self =3D this; var m_region =3D region; var m_dataSetContexts =3D []; =09 if (region && region.dataSets) { for (var i =3D 0; i < region.dataSets.length; i++) m_dataSetContexts.push(new = Spry.Data.Region.DSContext(region.dataSets[i])); } this.getDataSetContext =3D function(dataSet) { if (!dataSet) { // We were called without a specified data set or // data set name. Assume the caller wants the first // data set in the processing context. if (m_dataSetContexts.length > 0) return m_dataSetContexts[0]; return null; } if (typeof dataSet =3D=3D 'string') { try { dataSet =3D eval(dataSet); } catch (e) { dataSet =3D null; } if (!dataSet) return null; } =09 for (var i =3D 0; i < m_dataSetContexts.length; i++) { var dsc =3D m_dataSetContexts[i]; if (dsc.getDataSet() =3D=3D dataSet) return dsc; } =09 return null; }; this.getCurrentRowForDataSet =3D function(dataSet) { var dsc =3D m_self.getDataSetContext(dataSet); if (dsc) return dsc.getCurrentRow(); return null; }; }; Spry.Data.Region.Token =3D function(tokenType, dataSet, data, regionStr) { var self =3D this; this.tokenType =3D tokenType; this.dataSet =3D dataSet; this.data =3D data; this.regionStr =3D regionStr; this.parent =3D null; this.children =3D null; }; Spry.Data.Region.Token.prototype.addChild =3D function(child) { if (!child) return; =09 if (!this.children) this.children =3D new Array; =09 this.children.push(child); child.parent =3D this; }; Spry.Data.Region.Token.LIST_TOKEN =3D 0; Spry.Data.Region.Token.STRING_TOKEN =3D 1; Spry.Data.Region.Token.PROCESSING_INSTRUCTION_TOKEN =3D 2; Spry.Data.Region.Token.VALUE_TOKEN =3D 3; Spry.Data.Region.Token.PIData =3D function(piName, data, jsExpr, = regionState) { var self =3D this; this.name =3D piName; this.data =3D data; this.jsExpr =3D jsExpr; this.regionState =3D regionState; }; Spry.Utils.addLoadListener(function() { setTimeout(function() { = Spry.Data.initRegions(); }, 0); }); ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/contentslider.js?1 //** Featured Content Slider script- =C2=A9 Dynamic Drive DHTML code = library (http://www.dynamicdrive.com) //** Last updated: Oct 28th, 06 ////Ajax related settings var csbustcachevar=3D0 //bust potential caching of external pages after = initial Ajax request? (1=3Dyes, 0=3Dno) var csloadstatustext=3D" Requesting content..." //HTML to indicate Ajax = page is being fetched var csexternalfiles=3D[] //External .css or .js files to load to style = the external content(s), if any. Separate multiple files with comma ie: = ["cat.css", dog.js"] ////Section Names//////////////////////// /* var slidersection=3D new Array(4) slidersection[0]=3D"News"; slidersection[1]=3D"Features"; slidersection[2]=3D"Opinion"; slidersection[3]=3D"Sports"; */ ////NO NEED TO EDIT BELOW//////////////////////// var enablepersist=3Dtrue var slidernodes=3Dnew Object() //Object array to store references to = each content slider's DIV containers (
    ) var csloadedobjects=3D"" //Variable to store file names of .js/.css = files already loaded (if Ajax is used) function ContentSlider(sliderid, autorun){ var slider=3Ddocument.getElementById(sliderid) slidernodes[sliderid]=3D[] //Array to store references to this content = slider's DIV containers (
    ) ContentSlider.loadobjects(csexternalfiles) //Load external .js and .css = files, if any var alldivs=3Dslider.getElementsByTagName("div") for (var i=3D0; i0) //if autorun parameter = (int_miliseconds) is defined, fire auto run sequence window[sliderid+"timer"]=3DsetTimeout(function(){ContentSlider.autoturnpa= ge(sliderid, autorun)}, autorun) } ContentSlider.buildpagination=3Dfunction(sliderid){ var paginatediv=3Ddocument.getElementById("paginate-"+sliderid) = //reference corresponding pagination DIV for slider var pcontent=3D"" for (var i=3D0; i'+slidersection[i]+' ' pcontent+=3D'Next' paginatediv.innerHTML=3Dpcontent */paginatediv.onclick=3Dfunction(){ //cancel auto run sequence (if = defined) when user clicks on pagination DIV if (typeof window[sliderid+"timer"]!=3D"undefined") clearTimeout(window[sliderid+"timer"]) } } ContentSlider.turnpage=3Dfunction(sliderid, thepage){ /* Notify the page that this tab index was accessed. */ if (window.tabClickedListener) { window.tabClickedListener(thepage); } var = paginatelinks=3Ddocument.getElementById("paginate-"+sliderid).getElements= ByTagName("a") //gather pagination links for (var i=3D0; i=0A= Copyright 2005, 2006 Bobby van der Sluis=0A= This software is licensed under the CC-GNU LGPL = =0A= */=0A= =0A= var UFO =3D {=0A= req: ["movie", "width", "height", "majorversion", "build"],=0A= opt: ["play", "loop", "menu", "quality", "scale", "salign", "wmode", = "bgcolor", "base", "flashvars", "devicefont", "allowscriptaccess", = "seamlesstabbing", "allowfullscreen"],=0A= optAtt: ["id", "name", "align"],=0A= optExc: ["swliveconnect"],=0A= ximovie: "ufo.swf",=0A= xiwidth: "215",=0A= xiheight: "138",=0A= ua: navigator.userAgent.toLowerCase(),=0A= pluginType: "",=0A= fv: [0,0],=0A= foList: [],=0A= =0A= create: function(FO, id) {=0A= if (!UFO.uaHas("w3cdom") || UFO.uaHas("ieMac")) return;=0A= UFO.getFlashVersion();=0A= UFO.foList[id] =3D UFO.updateFO(FO);=0A= UFO.createCSS("#" + id, "visibility:hidden;");=0A= UFO.domLoad(id);=0A= },=0A= =0A= updateFO: function(FO) {=0A= if (typeof FO.xi !=3D "undefined" && FO.xi =3D=3D "true") {=0A= if (typeof FO.ximovie =3D=3D "undefined") FO.ximovie =3D UFO.ximovie;=0A= if (typeof FO.xiwidth =3D=3D "undefined") FO.xiwidth =3D UFO.xiwidth;=0A= if (typeof FO.xiheight =3D=3D "undefined") FO.xiheight =3D = UFO.xiheight;=0A= }=0A= FO.mainCalled =3D false;=0A= return FO;=0A= },=0A= =0A= domLoad: function(id) {=0A= var _t =3D setInterval(function() {=0A= if ((document.getElementsByTagName("body")[0] !=3D null || = document.body !=3D null) && document.getElementById(id) !=3D null) {=0A= UFO.main(id);=0A= clearInterval(_t);=0A= }=0A= }, 250);=0A= if (typeof document.addEventListener !=3D "undefined") {=0A= document.addEventListener("DOMContentLoaded", function() { = UFO.main(id); clearInterval(_t); } , null); // Gecko, Opera 9+=0A= }=0A= },=0A= =0A= main: function(id) {=0A= var _fo =3D UFO.foList[id];=0A= if (_fo.mainCalled) return;=0A= UFO.foList[id].mainCalled =3D true;=0A= document.getElementById(id).style.visibility =3D "hidden";=0A= if (UFO.hasRequired(id)) {=0A= if (UFO.hasFlashVersion(parseInt(_fo.majorversion, 10), = parseInt(_fo.build, 10))) {=0A= if (typeof _fo.setcontainercss !=3D "undefined" && = _fo.setcontainercss =3D=3D "true") UFO.setContainerCSS(id);=0A= UFO.writeSWF(id);=0A= }=0A= else if (_fo.xi =3D=3D "true" && UFO.hasFlashVersion(6, 65)) {=0A= UFO.createDialog(id);=0A= }=0A= }=0A= document.getElementById(id).style.visibility =3D "visible";=0A= },=0A= =0A= createCSS: function(selector, declaration) {=0A= var _h =3D document.getElementsByTagName("head")[0]; =0A= var _s =3D UFO.createElement("style");=0A= if (!UFO.uaHas("ieWin")) = _s.appendChild(document.createTextNode(selector + " {" + declaration + = "}")); // bugs in IE/Win=0A= _s.setAttribute("type", "text/css");=0A= _s.setAttribute("media", "screen"); =0A= _h.appendChild(_s);=0A= if (UFO.uaHas("ieWin") && document.styleSheets && = document.styleSheets.length > 0) {=0A= var _ls =3D document.styleSheets[document.styleSheets.length - 1];=0A= if (typeof _ls.addRule =3D=3D "object") _ls.addRule(selector, = declaration);=0A= }=0A= },=0A= =0A= setContainerCSS: function(id) {=0A= var _fo =3D UFO.foList[id];=0A= var _w =3D /%/.test(_fo.width) ? "" : "px";=0A= var _h =3D /%/.test(_fo.height) ? "" : "px";=0A= UFO.createCSS("#" + id, "width:" + _fo.width + _w +"; height:" + = _fo.height + _h +";");=0A= if (_fo.width =3D=3D "100%") {=0A= UFO.createCSS("body", "margin-left:0; margin-right:0; padding-left:0; = padding-right:0;");=0A= }=0A= if (_fo.height =3D=3D "100%") {=0A= UFO.createCSS("html", "height:100%; overflow:hidden;");=0A= UFO.createCSS("body", "margin-top:0; margin-bottom:0; padding-top:0; = padding-bottom:0; height:100%;");=0A= }=0A= },=0A= =0A= createElement: function(el) {=0A= return (UFO.uaHas("xml") && typeof document.createElementNS !=3D = "undefined") ? document.createElementNS("http://www.w3.org/1999/xhtml", = el) : document.createElement(el);=0A= },=0A= =0A= createObjParam: function(el, aName, aValue) {=0A= var _p =3D UFO.createElement("param");=0A= _p.setAttribute("name", aName); =0A= _p.setAttribute("value", aValue);=0A= el.appendChild(_p);=0A= },=0A= =0A= uaHas: function(ft) {=0A= var _u =3D UFO.ua;=0A= switch(ft) {=0A= case "w3cdom":=0A= return (typeof document.getElementById !=3D "undefined" && typeof = document.getElementsByTagName !=3D "undefined" && (typeof = document.createElement !=3D "undefined" || typeof = document.createElementNS !=3D "undefined"));=0A= case "xml":=0A= var _m =3D document.getElementsByTagName("meta");=0A= var _l =3D _m.length;=0A= for (var i =3D 0; i < _l; i++) {=0A= if (/content-type/i.test(_m[i].getAttribute("http-equiv")) && = /xml/i.test(_m[i].getAttribute("content"))) return true;=0A= }=0A= return false;=0A= case "ieMac":=0A= return /msie/.test(_u) && !/opera/.test(_u) && /mac/.test(_u);=0A= case "ieWin":=0A= return /msie/.test(_u) && !/opera/.test(_u) && /win/.test(_u);=0A= case "gecko":=0A= return /gecko/.test(_u) && !/applewebkit/.test(_u);=0A= case "opera":=0A= return /opera/.test(_u);=0A= case "safari":=0A= return /applewebkit/.test(_u);=0A= default:=0A= return false;=0A= }=0A= },=0A= =0A= getFlashVersion: function() {=0A= if (UFO.fv[0] !=3D 0) return; =0A= if (navigator.plugins && typeof navigator.plugins["Shockwave Flash"] = =3D=3D "object") {=0A= UFO.pluginType =3D "npapi";=0A= var _d =3D navigator.plugins["Shockwave Flash"].description;=0A= if (typeof _d !=3D "undefined") {=0A= _d =3D _d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");=0A= var _m =3D parseInt(_d.replace(/^(.*)\..*$/, "$1"), 10);=0A= var _r =3D /r/.test(_d) ? parseInt(_d.replace(/^.*r(.*)$/, "$1"), = 10) : 0;=0A= UFO.fv =3D [_m, _r];=0A= }=0A= }=0A= else if (window.ActiveXObject) {=0A= UFO.pluginType =3D "ax";=0A= try { // avoid fp 6 crashes=0A= var _a =3D new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");=0A= }=0A= catch(e) {=0A= try { =0A= var _a =3D new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");=0A= UFO.fv =3D [6, 0];=0A= _a.AllowScriptAccess =3D "always"; // throws if fp < 6.47 =0A= }=0A= catch(e) {=0A= if (UFO.fv[0] =3D=3D 6) return;=0A= }=0A= try {=0A= var _a =3D new ActiveXObject("ShockwaveFlash.ShockwaveFlash");=0A= }=0A= catch(e) {}=0A= }=0A= if (typeof _a =3D=3D "object") {=0A= var _d =3D _a.GetVariable("$version"); // bugs in fp 6.21/6.23=0A= if (typeof _d !=3D "undefined") {=0A= _d =3D _d.replace(/^\S+\s+(.*)$/, "$1").split(",");=0A= UFO.fv =3D [parseInt(_d[0], 10), parseInt(_d[2], 10)];=0A= }=0A= }=0A= }=0A= },=0A= =0A= hasRequired: function(id) {=0A= var _l =3D UFO.req.length;=0A= for (var i =3D 0; i < _l; i++) {=0A= if (typeof UFO.foList[id][UFO.req[i]] =3D=3D "undefined") return = false;=0A= }=0A= return true;=0A= },=0A= =0A= hasFlashVersion: function(major, release) {=0A= return (UFO.fv[0] > major || (UFO.fv[0] =3D=3D major && UFO.fv[1] >=3D = release)) ? true : false;=0A= },=0A= =0A= writeSWF: function(id) {=0A= var _fo =3D UFO.foList[id];=0A= var _e =3D document.getElementById(id);=0A= if (UFO.pluginType =3D=3D "npapi") {=0A= if (UFO.uaHas("gecko") || UFO.uaHas("xml")) {=0A= while(_e.hasChildNodes()) {=0A= _e.removeChild(_e.firstChild);=0A= }=0A= var _obj =3D UFO.createElement("object");=0A= _obj.setAttribute("type", "application/x-shockwave-flash");=0A= _obj.setAttribute("data", _fo.movie);=0A= _obj.setAttribute("width", _fo.width);=0A= _obj.setAttribute("height", _fo.height);=0A= var _l =3D UFO.optAtt.length;=0A= for (var i =3D 0; i < _l; i++) {=0A= if (typeof _fo[UFO.optAtt[i]] !=3D "undefined") = _obj.setAttribute(UFO.optAtt[i], _fo[UFO.optAtt[i]]);=0A= }=0A= var _o =3D UFO.opt.concat(UFO.optExc);=0A= var _l =3D _o.length;=0A= for (var i =3D 0; i < _l; i++) {=0A= if (typeof _fo[_o[i]] !=3D "undefined") UFO.createObjParam(_obj, = _o[i], _fo[_o[i]]);=0A= }=0A= _e.appendChild(_obj);=0A= }=0A= else {=0A= var _emb =3D "";=0A= var _o =3D UFO.opt.concat(UFO.optAtt).concat(UFO.optExc);=0A= var _l =3D _o.length;=0A= for (var i =3D 0; i < _l; i++) {=0A= if (typeof _fo[_o[i]] !=3D "undefined") _emb +=3D ' ' + _o[i] + = '=3D"' + _fo[_o[i]] + '"';=0A= }=0A= _e.innerHTML =3D '';=0A= }=0A= var _p =3D window.location.protocol =3D=3D "https:" ? "https:" : = "http:";=0A= _e.innerHTML =3D '' + _objPar + '';=0A= }=0A= },=0A= =0A= createDialog: function(id) {=0A= var _fo =3D UFO.foList[id];=0A= UFO.createCSS("html", "height:100%; overflow:hidden;");=0A= UFO.createCSS("body", "height:100%; overflow:hidden;");=0A= UFO.createCSS("#xi-con", "position:absolute; left:0; top:0; = z-index:1000; width:100%; height:100%; background-color:#fff; = filter:alpha(opacity:75); opacity:0.75;");=0A= UFO.createCSS("#xi-dia", "position:absolute; left:50%; top:50%; = margin-left: -" + Math.round(parseInt(_fo.xiwidth, 10) / 2) + "px; = margin-top: -" + Math.round(parseInt(_fo.xiheight, 10) / 2) + "px; = width:" + _fo.xiwidth + "px; height:" + _fo.xiheight + "px;");=0A= var _b =3D document.getElementsByTagName("body")[0];=0A= var _c =3D UFO.createElement("div");=0A= _c.setAttribute("id", "xi-con");=0A= var _d =3D UFO.createElement("div");=0A= _d.setAttribute("id", "xi-dia");=0A= _c.appendChild(_d);=0A= _b.appendChild(_c);=0A= var _mmu =3D window.location;=0A= if (UFO.uaHas("xml") && UFO.uaHas("safari")) {=0A= var _mmd =3D = document.getElementsByTagName("title")[0].firstChild.nodeValue =3D = document.getElementsByTagName("title")[0].firstChild.nodeValue.slice(0, = 47) + " - Flash Player Installation";=0A= }=0A= else {=0A= var _mmd =3D document.title =3D document.title.slice(0, 47) + " - = Flash Player Installation";=0A= }=0A= var _mmp =3D UFO.pluginType =3D=3D "ax" ? "ActiveX" : "PlugIn";=0A= var _uc =3D typeof _fo.xiurlcancel !=3D "undefined" ? = "&xiUrlCancel=3D" + _fo.xiurlcancel : "";=0A= var _uf =3D typeof _fo.xiurlfailed !=3D "undefined" ? = "&xiUrlFailed=3D" + _fo.xiurlfailed : "";=0A= UFO.foList["xi-dia"] =3D { movie:_fo.ximovie, width:_fo.xiwidth, = height:_fo.xiheight, majorversion:"6", build:"65", = flashvars:"MMredirectURL=3D" + _mmu + "&MMplayerType=3D" + _mmp + = "&MMdoctitle=3D" + _mmd + _uc + _uf };=0A= UFO.writeSWF("xi-dia");=0A= },=0A= =0A= expressInstallCallback: function() {=0A= var _b =3D document.getElementsByTagName("body")[0];=0A= var _c =3D document.getElementById("xi-con");=0A= _b.removeChild(_c);=0A= UFO.createCSS("body", "height:auto; overflow:auto;");=0A= UFO.createCSS("html", "height:auto; overflow:auto;");=0A= },=0A= =0A= cleanupIELeaks: function() {=0A= var _o =3D document.getElementsByTagName("object");=0A= var _l =3D _o.length=0A= for (var i =3D 0; i < _l; i++) {=0A= _o[i].style.display =3D "none";=0A= for (var x in _o[i]) {=0A= if (typeof _o[i][x] =3D=3D "function") {=0A= _o[i][x] =3D null;=0A= }=0A= }=0A= }=0A= }=0A= =0A= };=0A= =0A= if (typeof window.attachEvent !=3D "undefined" && UFO.uaHas("ieWin")) {=0A= window.attachEvent("onunload", UFO.cleanupIELeaks);=0A= }=0A= ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.google-analytics.com/urchin.js //-- Google Analytics Urchin Module=0A= //-- Copyright 2007 Google, All Rights Reserved.=0A= =0A= //-- Urchin On Demand Settings ONLY=0A= var _uacct=3D""; // set up the Urchin Account=0A= var _userv=3D1; // service mode (0=3Dlocal,1=3Dremote,2=3Dboth)=0A= =0A= //-- UTM User Settings=0A= var _ufsc=3D1; // set client info flag (1=3Don|0=3Doff)=0A= var _udn=3D"auto"; // (auto|none|domain) set the domain name for cookies=0A= var _uhash=3D"on"; // (on|off) unique domain hash for cookies=0A= var _utimeout=3D"1800"; // set the inactive session timeout in seconds=0A= var _ugifpath=3D"/__utm.gif"; // set the web path to the __utm.gif file=0A= var _utsp=3D"|"; // transaction field separator=0A= var _uflash=3D1; // set flash version detect option (1=3Don|0=3Doff)=0A= var _utitle=3D1; // set the document title detect option = (1=3Don|0=3Doff)=0A= var _ulink=3D0; // enable linker functionality (1=3Don|0=3Doff)=0A= var _uanchor=3D0; // enable use of anchors for campaign = (1=3Don|0=3Doff)=0A= var _utcp=3D"/"; // the cookie path for tracking=0A= var _usample=3D100; // The sampling % of visitors to track (1-100).=0A= =0A= //-- UTM Campaign Tracking Settings=0A= var _uctm=3D1; // set campaign tracking module (1=3Don|0=3Doff)=0A= var _ucto=3D"15768000"; // set timeout in seconds (6 month default)=0A= var _uccn=3D"utm_campaign"; // name=0A= var _ucmd=3D"utm_medium"; // medium (cpc|cpm|link|email|organic)=0A= var _ucsr=3D"utm_source"; // source=0A= var _uctr=3D"utm_term"; // term/keyword=0A= var _ucct=3D"utm_content"; // content=0A= var _ucid=3D"utm_id"; // id number=0A= var _ucno=3D"utm_nooverride"; // don't override=0A= =0A= //-- Auto/Organic Sources and Keywords=0A= var _uOsr=3Dnew Array();=0A= var _uOkw=3Dnew Array();=0A= _uOsr[0]=3D"google"; _uOkw[0]=3D"q";=0A= _uOsr[1]=3D"yahoo"; _uOkw[1]=3D"p";=0A= _uOsr[2]=3D"msn"; _uOkw[2]=3D"q";=0A= _uOsr[3]=3D"aol"; _uOkw[3]=3D"query";=0A= _uOsr[4]=3D"aol"; _uOkw[4]=3D"encquery";=0A= _uOsr[5]=3D"lycos"; _uOkw[5]=3D"query";=0A= _uOsr[6]=3D"ask"; _uOkw[6]=3D"q";=0A= _uOsr[7]=3D"altavista"; _uOkw[7]=3D"q";=0A= _uOsr[8]=3D"netscape"; _uOkw[8]=3D"query";=0A= _uOsr[9]=3D"cnn"; _uOkw[9]=3D"query";=0A= _uOsr[10]=3D"looksmart"; _uOkw[10]=3D"qt";=0A= _uOsr[11]=3D"about"; _uOkw[11]=3D"terms";=0A= _uOsr[12]=3D"mamma"; _uOkw[12]=3D"query";=0A= _uOsr[13]=3D"alltheweb"; _uOkw[13]=3D"q";=0A= _uOsr[14]=3D"gigablast"; _uOkw[14]=3D"q";=0A= _uOsr[15]=3D"voila"; _uOkw[15]=3D"rdata";=0A= _uOsr[16]=3D"virgilio"; _uOkw[16]=3D"qs";=0A= _uOsr[17]=3D"live"; _uOkw[17]=3D"q";=0A= _uOsr[18]=3D"baidu"; _uOkw[18]=3D"wd";=0A= _uOsr[19]=3D"alice"; _uOkw[19]=3D"qs";=0A= _uOsr[20]=3D"yandex"; _uOkw[20]=3D"text";=0A= _uOsr[21]=3D"najdi"; _uOkw[21]=3D"q";=0A= _uOsr[22]=3D"aol"; _uOkw[22]=3D"q";=0A= _uOsr[23]=3D"club-internet"; _uOkw[23]=3D"q";=0A= _uOsr[24]=3D"mama"; _uOkw[24]=3D"query";=0A= _uOsr[25]=3D"seznam"; _uOkw[25]=3D"q";=0A= _uOsr[26]=3D"search"; _uOkw[26]=3D"q";=0A= _uOsr[27]=3D"szukaj"; _uOkw[27]=3D"szukaj";=0A= _uOsr[28]=3D"szukaj"; _uOkw[28]=3D"qt";=0A= _uOsr[29]=3D"netsprint"; _uOkw[29]=3D"q";=0A= _uOsr[30]=3D"google.interia"; _uOkw[30]=3D"q";=0A= _uOsr[31]=3D"szukacz"; _uOkw[31]=3D"q";=0A= _uOsr[32]=3D"yam"; _uOkw[32]=3D"k";=0A= _uOsr[33]=3D"pchome"; _uOkw[33]=3D"q";=0A= =0A= =0A= //-- Auto/Organic Keywords to Ignore=0A= var _uOno=3Dnew Array();=0A= //_uOno[0]=3D"urchin";=0A= //_uOno[1]=3D"urchin.com";=0A= //_uOno[2]=3D"www.urchin.com";=0A= =0A= //-- Referral domains to Ignore=0A= var _uRno=3Dnew Array();=0A= //_uRno[0]=3D".urchin.com";=0A= =0A= //-- **** Don't modify below this point ***=0A= var = _uff,_udh,_udt,_ubl=3D0,_udo=3D"",_uu,_ufns=3D0,_uns=3D0,_ur=3D"-",_ufno=3D= 0,_ust=3D0,_ubd=3Ddocument,_udl=3D_ubd.location,_udlh=3D"",_uwv=3D"1";=0A= var _ugifpath2=3D"http://www.google-analytics.com/__utm.gif";=0A= if (_udl.hash) _udlh=3D_udl.href.substring(_udl.href.indexOf('#'));=0A= if (_udl.protocol=3D=3D"https:") = _ugifpath2=3D"https://ssl.google-analytics.com/__utm.gif";=0A= if (!_utcp || _utcp=3D=3D"") _utcp=3D"/";=0A= function urchinTracker(page) {=0A= if (_udl.protocol=3D=3D"file:") return;=0A= if (_uff && (!page || page=3D=3D"")) return;=0A= var a,b,c,xx,v,z,k,x=3D"",s=3D"",f=3D0;=0A= var nx=3D" expires=3D"+_uNx()+";";=0A= var dc=3D_ubd.cookie;=0A= _udh=3D_uDomain();=0A= if (!_uVG()) return;=0A= _uu=3DMath.round(Math.random()*2147483647);=0A= _udt=3Dnew Date();=0A= _ust=3DMath.round(_udt.getTime()/1000);=0A= a=3Ddc.indexOf("__utma=3D"+_udh);=0A= b=3Ddc.indexOf("__utmb=3D"+_udh);=0A= c=3Ddc.indexOf("__utmc=3D"+_udh);=0A= if (_udn && _udn!=3D"") { _udo=3D" domain=3D"+_udn+";"; }=0A= if (_utimeout && _utimeout!=3D"") {=0A= x=3Dnew Date(_udt.getTime()+(_utimeout*1000));=0A= x=3D" expires=3D"+x.toGMTString()+";";=0A= }=0A= if (_ulink) {=0A= if (_uanchor && _udlh && _udlh!=3D"") s=3D_udlh+"&";=0A= s+=3D_udl.search;=0A= if(s && s!=3D"" && s.indexOf("__utma=3D")>=3D0) {=0A= if (!(_uIN(a=3D_uGC(s,"__utma=3D","&")))) a=3D"-";=0A= if (!(_uIN(b=3D_uGC(s,"__utmb=3D","&")))) b=3D"-";=0A= if (!(_uIN(c=3D_uGC(s,"__utmc=3D","&")))) c=3D"-";=0A= v=3D_uGC(s,"__utmv=3D","&");=0A= z=3D_uGC(s,"__utmz=3D","&");=0A= k=3D_uGC(s,"__utmk=3D","&");=0A= xx=3D_uGC(s,"__utmx=3D","&");=0A= if ((k*1) !=3D ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) = {_ubl=3D1;a=3D"-";b=3D"-";c=3D"-";xx=3D"-";z=3D"-";v=3D"-";}=0A= if (a!=3D"-" && b!=3D"-" && c!=3D"-") f=3D1;=0A= else if(a!=3D"-") f=3D2;=0A= }=0A= }=0A= if(f=3D=3D1) {=0A= _ubd.cookie=3D"__utma=3D"+a+"; path=3D"+_utcp+";"+nx+_udo;=0A= _ubd.cookie=3D"__utmb=3D"+b+"; path=3D"+_utcp+";"+x+_udo;=0A= _ubd.cookie=3D"__utmc=3D"+c+"; path=3D"+_utcp+";"+_udo;=0A= } else if (f=3D=3D2) {=0A= a=3D_uFixA(s,"&",_ust);=0A= _ubd.cookie=3D"__utma=3D"+a+"; path=3D"+_utcp+";"+nx+_udo;=0A= _ubd.cookie=3D"__utmb=3D"+_udh+"; path=3D"+_utcp+";"+x+_udo;=0A= _ubd.cookie=3D"__utmc=3D"+_udh+"; path=3D"+_utcp+";"+_udo;=0A= _ufns=3D1;=0A= } else if (a>=3D0 && b>=3D0 && c>=3D0) {=0A= _ubd.cookie=3D"__utmb=3D"+_udh+"; path=3D"+_utcp+";"+x+_udo;=0A= } else {=0A= if (a>=3D0) a=3D_uFixA(_ubd.cookie,";",_ust);=0A= else a=3D_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1";=0A= _ubd.cookie=3D"__utma=3D"+a+"; path=3D"+_utcp+";"+nx+_udo;=0A= _ubd.cookie=3D"__utmb=3D"+_udh+"; path=3D"+_utcp+";"+x+_udo;=0A= _ubd.cookie=3D"__utmc=3D"+_udh+"; path=3D"+_utcp+";"+_udo;=0A= _ufns=3D1;=0A= }=0A= if (_ulink && xx && xx!=3D"" && xx!=3D"-") {=0A= xx=3D_uUES(xx);=0A= if (xx.indexOf(";")=3D=3D-1) _ubd.cookie=3D"__utmx=3D"+xx+"; = path=3D"+_utcp+";"+nx+_udo;=0A= }=0A= if (_ulink && v && v!=3D"" && v!=3D"-") {=0A= v=3D_uUES(v);=0A= if (v.indexOf(";")=3D=3D-1) _ubd.cookie=3D"__utmv=3D"+v+"; = path=3D"+_utcp+";"+nx+_udo;=0A= }=0A= _uInfo(page);=0A= _ufns=3D0;=0A= _ufno=3D0;=0A= if (!page || page=3D=3D"") _uff=3D1;=0A= }=0A= function _uInfo(page) {=0A= var p,s=3D"",dm=3D"",pg=3D_udl.pathname+_udl.search;=0A= if (page && page!=3D"") pg=3D_uES(page,1);=0A= _ur=3D_ubd.referrer;=0A= if (!_ur || _ur=3D=3D"") { _ur=3D"-"; }=0A= else {=0A= dm=3D_ubd.domain;=0A= if(_utcp && _utcp!=3D"/") dm+=3D_utcp;=0A= p=3D_ur.indexOf(dm);=0A= if ((p>=3D0) && (p<=3D8)) { _ur=3D"0"; }=0A= if (_ur.indexOf("[")=3D=3D0 && = _ur.lastIndexOf("]")=3D=3D(_ur.length-1)) { _ur=3D"-"; }=0A= }=0A= s+=3D"&utmn=3D"+_uu;=0A= if (_ufsc) s+=3D_uBInfo();=0A= if (_uctm) s+=3D_uCInfo();=0A= if (_utitle && _ubd.title && _ubd.title!=3D"") = s+=3D"&utmdt=3D"+_uES(_ubd.title);=0A= if (_udl.hostname && _udl.hostname!=3D"") = s+=3D"&utmhn=3D"+_uES(_udl.hostname);=0A= s+=3D"&utmr=3D"+_ur;=0A= s+=3D"&utmp=3D"+pg;=0A= if ((_userv=3D=3D0 || _userv=3D=3D2) && _uSP()) {=0A= var i=3Dnew Image(1,1);=0A= i.src=3D_ugifpath+"?"+"utmwv=3D"+_uwv+s;=0A= i.onload=3Dfunction() {_uVoid();}=0A= }=0A= if ((_userv=3D=3D1 || _userv=3D=3D2) && _uSP()) {=0A= var i2=3Dnew Image(1,1);=0A= = i2.src=3D_ugifpath2+"?"+"utmwv=3D"+_uwv+s+"&utmac=3D"+_uacct+"&utmcc=3D"+= _uGCS();=0A= i2.onload=3Dfunction() { _uVoid(); }=0A= }=0A= return;=0A= }=0A= function _uVoid() { return; }=0A= function _uCInfo() {=0A= if (!_ucto || _ucto=3D=3D"") { _ucto=3D"15768000"; }=0A= if (!_uVG()) return;=0A= var = c=3D"",t=3D"-",t2=3D"-",t3=3D"-",o=3D0,cs=3D0,cn=3D0,i=3D0,z=3D"-",s=3D""= ;=0A= if (_uanchor && _udlh && _udlh!=3D"") s=3D_udlh+"&";=0A= s+=3D_udl.search;=0A= var x=3Dnew Date(_udt.getTime()+(_ucto*1000));=0A= var dc=3D_ubd.cookie;=0A= x=3D" expires=3D"+x.toGMTString()+";";=0A= if (_ulink && !_ubl) {=0A= z=3D_uUES(_uGC(s,"__utmz=3D","&"));=0A= if (z!=3D"-" && z.indexOf(";")=3D=3D-1) { = _ubd.cookie=3D"__utmz=3D"+z+"; path=3D"+_utcp+";"+x+_udo; return ""; }=0A= }=0A= z=3Ddc.indexOf("__utmz=3D"+_udh);=0A= if (z>-1) { z=3D_uGC(dc,"__utmz=3D"+_udh,";"); }=0A= else { z=3D"-"; }=0A= t=3D_uGC(s,_ucid+"=3D","&");=0A= t2=3D_uGC(s,_ucsr+"=3D","&");=0A= t3=3D_uGC(s,"gclid=3D","&");=0A= if ((t!=3D"-" && t!=3D"") || (t2!=3D"-" && t2!=3D"") || (t3!=3D"-" && = t3!=3D"")) {=0A= if (t!=3D"-" && t!=3D"") c+=3D"utmcid=3D"+_uEC(t);=0A= if (t2!=3D"-" && t2!=3D"") { if (c !=3D "") c+=3D"|"; = c+=3D"utmcsr=3D"+_uEC(t2); }=0A= if (t3!=3D"-" && t3!=3D"") { if (c !=3D "") c+=3D"|"; = c+=3D"utmgclid=3D"+_uEC(t3); }=0A= t=3D_uGC(s,_uccn+"=3D","&");=0A= if (t!=3D"-" && t!=3D"") c+=3D"|utmccn=3D"+_uEC(t);=0A= else c+=3D"|utmccn=3D(not+set)";=0A= t=3D_uGC(s,_ucmd+"=3D","&");=0A= if (t!=3D"-" && t!=3D"") c+=3D"|utmcmd=3D"+_uEC(t);=0A= else c+=3D"|utmcmd=3D(not+set)";=0A= t=3D_uGC(s,_uctr+"=3D","&");=0A= if (t!=3D"-" && t!=3D"") c+=3D"|utmctr=3D"+_uEC(t);=0A= else { t=3D_uOrg(1); if (t!=3D"-" && t!=3D"") = c+=3D"|utmctr=3D"+_uEC(t); }=0A= t=3D_uGC(s,_ucct+"=3D","&");=0A= if (t!=3D"-" && t!=3D"") c+=3D"|utmcct=3D"+_uEC(t);=0A= t=3D_uGC(s,_ucno+"=3D","&");=0A= if (t=3D=3D"1") o=3D1;=0A= if (z!=3D"-" && o=3D=3D1) return "";=0A= }=0A= if (c=3D=3D"-" || c=3D=3D"") { c=3D_uOrg(); if (z!=3D"-" && = _ufno=3D=3D1) return ""; }=0A= if (c=3D=3D"-" || c=3D=3D"") { if (_ufns=3D=3D1) c=3D_uRef(); if = (z!=3D"-" && _ufno=3D=3D1) return ""; }=0A= if (c=3D=3D"-" || c=3D=3D"") {=0A= if (z=3D=3D"-" && _ufns=3D=3D1) { = c=3D"utmccn=3D(direct)|utmcsr=3D(direct)|utmcmd=3D(none)"; }=0A= if (c=3D=3D"-" || c=3D=3D"") return "";=0A= }=0A= if (z!=3D"-") {=0A= i=3Dz.indexOf(".");=0A= if (i>-1) i=3Dz.indexOf(".",i+1);=0A= if (i>-1) i=3Dz.indexOf(".",i+1);=0A= if (i>-1) i=3Dz.indexOf(".",i+1);=0A= t=3Dz.substring(i+1,z.length);=0A= if (t.toLowerCase()=3D=3Dc.toLowerCase()) cs=3D1;=0A= t=3Dz.substring(0,i);=0A= if ((i=3Dt.lastIndexOf(".")) > -1) {=0A= t=3Dt.substring(i+1,t.length);=0A= cn=3D(t*1);=0A= }=0A= }=0A= if (cs=3D=3D0 || _ufns=3D=3D1) {=0A= t=3D_uGC(dc,"__utma=3D"+_udh,";");=0A= if ((i=3Dt.lastIndexOf(".")) > 9) {=0A= _uns=3Dt.substring(i+1,t.length);=0A= _uns=3D(_uns*1);=0A= }=0A= cn++;=0A= if (_uns=3D=3D0) _uns=3D1;=0A= _ubd.cookie=3D"__utmz=3D"+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; = path=3D"+_utcp+"; "+x+_udo;=0A= }=0A= if (cs=3D=3D0 || _ufns=3D=3D1) return "&utmcn=3D1";=0A= else return "&utmcr=3D1";=0A= }=0A= function _uRef() {=0A= if (_ur=3D=3D"0" || _ur=3D=3D"" || _ur=3D=3D"-") return "";=0A= var i=3D0,h,k,n;=0A= if ((i=3D_ur.indexOf("://"))<0) return "";=0A= h=3D_ur.substring(i+3,_ur.length);=0A= if (h.indexOf("/") > -1) {=0A= k=3Dh.substring(h.indexOf("/"),h.length);=0A= if (k.indexOf("?") > -1) k=3Dk.substring(0,k.indexOf("?"));=0A= h=3Dh.substring(0,h.indexOf("/"));=0A= }=0A= h=3Dh.toLowerCase();=0A= n=3Dh;=0A= if ((i=3Dn.indexOf(":")) > -1) n=3Dn.substring(0,i);=0A= for (var ii=3D0;ii<_uRno.length;ii++) {=0A= if ((i=3Dn.indexOf(_uRno[ii].toLowerCase())) > -1 && = n.length=3D=3D(i+_uRno[ii].length)) { _ufno=3D1; break; }=0A= }=0A= if (h.indexOf("www.")=3D=3D0) h=3Dh.substring(4,h.length);=0A= return = "utmccn=3D(referral)|utmcsr=3D"+_uEC(h)+"|"+"utmcct=3D"+_uEC(k)+"|utmcmd=3D= referral";=0A= }=0A= function _uOrg(t) {=0A= if (_ur=3D=3D"0" || _ur=3D=3D"" || _ur=3D=3D"-") return "";=0A= var i=3D0,h,k;=0A= if ((i=3D_ur.indexOf("://")) < 0) return "";=0A= h=3D_ur.substring(i+3,_ur.length);=0A= if (h.indexOf("/") > -1) {=0A= h=3Dh.substring(0,h.indexOf("/"));=0A= }=0A= for (var ii=3D0;ii<_uOsr.length;ii++) {=0A= if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {=0A= if ((i=3D_ur.indexOf("?"+_uOkw[ii]+"=3D")) > -1 || = (i=3D_ur.indexOf("&"+_uOkw[ii]+"=3D")) > -1) {=0A= k=3D_ur.substring(i+_uOkw[ii].length+2,_ur.length);=0A= if ((i=3Dk.indexOf("&")) > -1) k=3Dk.substring(0,i);=0A= for (var yy=3D0;yy<_uOno.length;yy++) {=0A= if (_uOno[yy].toLowerCase()=3D=3Dk.toLowerCase()) { _ufno=3D1; = break; }=0A= }=0A= if (t) return _uEC(k);=0A= else return = "utmccn=3D(organic)|utmcsr=3D"+_uEC(_uOsr[ii])+"|"+"utmctr=3D"+_uEC(k)+"|= utmcmd=3Dorganic";=0A= }=0A= }=0A= }=0A= return "";=0A= }=0A= function _uBInfo() {=0A= var sr=3D"-",sc=3D"-",ul=3D"-",fl=3D"-",cs=3D"-",je=3D1;=0A= var n=3Dnavigator;=0A= if (self.screen) {=0A= sr=3Dscreen.width+"x"+screen.height;=0A= sc=3Dscreen.colorDepth+"-bit";=0A= } else if (self.java) {=0A= var j=3Djava.awt.Toolkit.getDefaultToolkit();=0A= var s=3Dj.getScreenSize();=0A= sr=3Ds.width+"x"+s.height;=0A= }=0A= if (n.language) { ul=3Dn.language.toLowerCase(); }=0A= else if (n.browserLanguage) { ul=3Dn.browserLanguage.toLowerCase(); }=0A= je=3Dn.javaEnabled()?1:0;=0A= if (_uflash) fl=3D_uFlash();=0A= if (_ubd.characterSet) cs=3D_uES(_ubd.characterSet);=0A= else if (_ubd.charset) cs=3D_uES(_ubd.charset);=0A= return = "&utmcs=3D"+cs+"&utmsr=3D"+sr+"&utmsc=3D"+sc+"&utmul=3D"+ul+"&utmje=3D"+j= e+"&utmfl=3D"+fl;=0A= }=0A= function __utmSetTrans() {=0A= var e;=0A= if (_ubd.getElementById) e=3D_ubd.getElementById("utmtrans");=0A= else if (_ubd.utmform && _ubd.utmform.utmtrans) = e=3D_ubd.utmform.utmtrans;=0A= if (!e) return;=0A= var l=3De.value.split("UTM:");=0A= var i,i2,c;=0A= if (_userv=3D=3D0 || _userv=3D=3D2) i=3Dnew Array();=0A= if (_userv=3D=3D1 || _userv=3D=3D2) { i2=3Dnew Array(); c=3D_uGCS(); }=0A= =0A= for (var ii=3D0;ii=3D2;ii--) {=0A= try {=0A= var fl=3Deval("new = ActiveXObject('ShockwaveFlash.ShockwaveFlash."+ii+"');");=0A= if (fl) { f=3Dii + '.0'; break; }=0A= }=0A= catch(e) {}=0A= }=0A= }=0A= return f;=0A= }=0A= function __utmLinker(l,h) {=0A= if (!_ulink) return;=0A= var p,k,a=3D"-",b=3D"-",c=3D"-",x=3D"-",z=3D"-",v=3D"-";=0A= var dc=3D_ubd.cookie;=0A= if (!l || l=3D=3D"") return;=0A= var iq =3D l.indexOf("?"); =0A= var ih =3D l.indexOf("#"); =0A= if (dc) {=0A= a=3D_uES(_uGC(dc,"__utma=3D"+_udh,";"));=0A= b=3D_uES(_uGC(dc,"__utmb=3D"+_udh,";"));=0A= c=3D_uES(_uGC(dc,"__utmc=3D"+_udh,";"));=0A= x=3D_uES(_uGC(dc,"__utmx=3D"+_udh,";"));=0A= z=3D_uES(_uGC(dc,"__utmz=3D"+_udh,";"));=0A= v=3D_uES(_uGC(dc,"__utmv=3D"+_udh,";"));=0A= k=3D(_uHash(a+b+c+x+z+v)*1)+(_udh*1);=0A= = p=3D"__utma=3D"+a+"&__utmb=3D"+b+"&__utmc=3D"+c+"&__utmx=3D"+x+"&__utmz=3D= "+z+"&__utmv=3D"+v+"&__utmk=3D"+k;=0A= }=0A= if (p) {=0A= if (h && ih>-1) return;=0A= if (h) { _udl.href=3Dl+"#"+p; }=0A= else {=0A= if (iq=3D=3D-1 && ih=3D=3D-1) _udl.href=3Dl+"?"+p;=0A= else if (ih=3D=3D-1) _udl.href=3Dl+"&"+p;=0A= else if (iq=3D=3D-1) = _udl.href=3Dl.substring(0,ih-1)+"?"+p+l.substring(ih);=0A= else _udl.href=3Dl.substring(0,ih-1)+"&"+p+l.substring(ih);=0A= }=0A= } else { _udl.href=3Dl; }=0A= }=0A= function __utmLinkPost(f,h) {=0A= if (!_ulink) return;=0A= var p,k,a=3D"-",b=3D"-",c=3D"-",x=3D"-",z=3D"-",v=3D"-";=0A= var dc=3D_ubd.cookie;=0A= if (!f || !f.action) return;=0A= var iq =3D f.action.indexOf("?"); =0A= var ih =3D f.action.indexOf("#"); =0A= if (dc) {=0A= a=3D_uES(_uGC(dc,"__utma=3D"+_udh,";"));=0A= b=3D_uES(_uGC(dc,"__utmb=3D"+_udh,";"));=0A= c=3D_uES(_uGC(dc,"__utmc=3D"+_udh,";"));=0A= x=3D_uES(_uGC(dc,"__utmx=3D"+_udh,";"));=0A= z=3D_uES(_uGC(dc,"__utmz=3D"+_udh,";"));=0A= v=3D_uES(_uGC(dc,"__utmv=3D"+_udh,";"));=0A= k=3D(_uHash(a+b+c+x+z+v)*1)+(_udh*1);=0A= = p=3D"__utma=3D"+a+"&__utmb=3D"+b+"&__utmc=3D"+c+"&__utmx=3D"+x+"&__utmz=3D= "+z+"&__utmv=3D"+v+"&__utmk=3D"+k;=0A= }=0A= if (p) {=0A= if (h && ih>-1) return;=0A= if (h) { f.action+=3D"#"+p; }=0A= else {=0A= if (iq=3D=3D-1 && ih=3D=3D-1) f.action+=3D"?"+p;=0A= else if (ih=3D=3D-1) f.action+=3D"&"+p;=0A= else if (iq=3D=3D-1) = f.action=3Df.action.substring(0,ih-1)+"?"+p+f.action.substring(ih);=0A= else = f.action=3Df.action.substring(0,ih-1)+"&"+p+f.action.substring(ih);=0A= }=0A= }=0A= return;=0A= }=0A= function __utmSetVar(v) {=0A= if (!v || v=3D=3D"") return;=0A= if (!_udo || _udo =3D=3D "") {=0A= _udh=3D_uDomain();=0A= if (_udn && _udn!=3D"") { _udo=3D" domain=3D"+_udn+";"; }=0A= }=0A= if (!_uVG()) return;=0A= var r=3DMath.round(Math.random() * 2147483647);=0A= _ubd.cookie=3D"__utmv=3D"+_udh+"."+_uES(v)+"; path=3D"+_utcp+"; = expires=3D"+_uNx()+";"+_udo;=0A= var s=3D"&utmt=3Dvar&utmn=3D"+r;=0A= if ((_userv=3D=3D0 || _userv=3D=3D2) && _uSP()) {=0A= var i=3Dnew Image(1,1);=0A= i.src=3D_ugifpath+"?"+"utmwv=3D"+_uwv+s;=0A= i.onload=3Dfunction() { _uVoid(); }=0A= }=0A= if ((_userv=3D=3D1 || _userv=3D=3D2) && _uSP()) {=0A= var i2=3Dnew Image(1,1);=0A= = i2.src=3D_ugifpath2+"?"+"utmwv=3D"+_uwv+s+"&utmac=3D"+_uacct+"&utmcc=3D"+= _uGCS();=0A= i2.onload=3Dfunction() { _uVoid(); }=0A= }=0A= }=0A= function _uGCS() {=0A= var t,c=3D"",dc=3D_ubd.cookie;=0A= if ((t=3D_uGC(dc,"__utma=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utma=3D"+t+";+");=0A= if ((t=3D_uGC(dc,"__utmb=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utmb=3D"+t+";+");=0A= if ((t=3D_uGC(dc,"__utmc=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utmc=3D"+t+";+");=0A= if ((t=3D_uGC(dc,"__utmx=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utmx=3D"+t+";+");=0A= if ((t=3D_uGC(dc,"__utmz=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utmz=3D"+t+";+");=0A= if ((t=3D_uGC(dc,"__utmv=3D"+_udh,";"))!=3D"-") = c+=3D_uES("__utmv=3D"+t+";");=0A= if (c.charAt(c.length-1)=3D=3D"+") c=3Dc.substring(0,c.length-1);=0A= return c;=0A= }=0A= function _uGC(l,n,s) {=0A= if (!l || l=3D=3D"" || !n || n=3D=3D"" || !s || s=3D=3D"") return "-";=0A= var i,i2,i3,c=3D"-";=0A= i=3Dl.indexOf(n);=0A= i3=3Dn.indexOf("=3D")+1;=0A= if (i > -1) {=0A= i2=3Dl.indexOf(s,i); if (i2 < 0) { i2=3Dl.length; }=0A= c=3Dl.substring((i+i3),i2);=0A= }=0A= return c;=0A= }=0A= function _uDomain() {=0A= if (!_udn || _udn=3D=3D"" || _udn=3D=3D"none") { _udn=3D""; return 1; }=0A= if (_udn=3D=3D"auto") {=0A= var d=3D_ubd.domain;=0A= if (d.substring(0,4)=3D=3D"www.") {=0A= d=3Dd.substring(4,d.length);=0A= }=0A= _udn=3Dd;=0A= }=0A= _udn =3D _udn.toLowerCase(); =0A= if (_uhash=3D=3D"off") return 1;=0A= return _uHash(_udn);=0A= }=0A= function _uHash(d) {=0A= if (!d || d=3D=3D"") return 1;=0A= var h=3D0,g=3D0;=0A= for (var i=3Dd.length-1;i>=3D0;i--) {=0A= var c=3DparseInt(d.charCodeAt(i));=0A= h=3D((h << 6) & 0xfffffff) + c + (c << 14);=0A= if ((g=3Dh & 0xfe00000)!=3D0) h=3D(h ^ (g >> 21));=0A= }=0A= return h;=0A= }=0A= function _uFixA(c,s,t) {=0A= if (!c || c=3D=3D"" || !s || s=3D=3D"" || !t || t=3D=3D"") return "-";=0A= var a=3D_uGC(c,"__utma=3D"+_udh,s);=0A= var lt=3D0,i=3D0;=0A= if ((i=3Da.lastIndexOf(".")) > 9) {=0A= _uns=3Da.substring(i+1,a.length);=0A= _uns=3D(_uns*1)+1;=0A= a=3Da.substring(0,i);=0A= if ((i=3Da.lastIndexOf(".")) > 7) {=0A= lt=3Da.substring(i+1,a.length);=0A= a=3Da.substring(0,i);=0A= }=0A= if ((i=3Da.lastIndexOf(".")) > 5) {=0A= a=3Da.substring(0,i);=0A= }=0A= a+=3D"."+lt+"."+t+"."+_uns;=0A= }=0A= return a;=0A= }=0A= function _uTrim(s) {=0A= if (!s || s=3D=3D"") return "";=0A= while ((s.charAt(0)=3D=3D' ') || (s.charAt(0)=3D=3D'\n') || = (s.charAt(0,1)=3D=3D'\r')) s=3Ds.substring(1,s.length);=0A= while ((s.charAt(s.length-1)=3D=3D' ') || = (s.charAt(s.length-1)=3D=3D'\n') || (s.charAt(s.length-1)=3D=3D'\r')) = s=3Ds.substring(0,s.length-1);=0A= return s;=0A= }=0A= function _uEC(s) {=0A= var n=3D"";=0A= if (!s || s=3D=3D"") return "";=0A= for (var i=3D0;i0) r=3Da.substring(i+1,i2); else return = ""; =0A= if ((i=3Da.indexOf(".",i2+1))>0) t=3Da.substring(i2+1,i); else return = ""; =0A= if (f) {=0A= return r;=0A= } else {=0A= var c=3Dnew = Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T'= ,'U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');=0A= return = c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r= &7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5= &m]+c[t&m];=0A= }=0A= }=0A= function _uIN(n) {=0A= if (!n) return false;=0A= for (var i=3D0;i"9") && (c!=3D".")) return false;=0A= }=0A= return true;=0A= }=0A= function _uES(s,u) {=0A= if (typeof(encodeURIComponent) =3D=3D 'function') {=0A= if (u) return encodeURI(s);=0A= else return encodeURIComponent(s);=0A= } else {=0A= return escape(s);=0A= }=0A= }=0A= function _uUES(s) {=0A= if (typeof(decodeURIComponent) =3D=3D 'function') {=0A= return decodeURIComponent(s);=0A= } else {=0A= return unescape(s);=0A= }=0A= }=0A= function _uVG() {=0A= if((_udn.indexOf("www.google.") =3D=3D 0 || _udn.indexOf(".google.") = =3D=3D 0 || _udn.indexOf("google.") =3D=3D 0) && _utcp=3D=3D'/' && = _udn.indexOf("google.org")=3D=3D-1) {=0A= return false;=0A= }=0A= return true;=0A= }=0A= function _uSP() {=0A= var s=3D100;=0A= if (_usample) s=3D_usample;=0A= if(s>=3D100 || s<=3D0) return true;=0A= return ((__utmVisitorCode(1)%10000)<(s*100));=0A= }=0A= function urchinPathCopy(p){=0A= var d=3Ddocument,nx,tx,sx,i,c,cs,t,h,o;=0A= cs=3Dnew Array("a","b","c","v","x","z");=0A= h=3D_uDomain(); if (_udn && _udn!=3D"") o=3D" domain=3D"+_udn+";";=0A= nx=3D_uNx()+";";=0A= tx=3Dnew Date(); tx.setTime(tx.getTime()+(_utimeout*1000));=0A= tx=3Dtx.toGMTString()+";";=0A= sx=3Dnew Date(); sx.setTime(sx.getTime()+(_ucto*1000));=0A= sx=3Dsx.toGMTString()+";";=0A= for (i=3D0;i<6;i++){=0A= t=3D" expires=3D";=0A= if (i=3D=3D1) t+=3Dtx; else if (i=3D=3D2) t=3D""; else if (i=3D=3D5) = t+=3Dsx; else t+=3Dnx;=0A= c=3D_uGC(d.cookie,"__utm"+cs[i]+"=3D"+h,";");=0A= if (c!=3D"-") d.cookie=3D"__utm"+cs[i]+"=3D"+c+"; path=3D"+p+";"+t+o;=0A= }=0A= }=0A= function _uCO() {=0A= if (!_utk || _utk=3D=3D"" || _utk.length<10) return;=0A= var d=3D'www.google.com';=0A= if (_utk.charAt(0)=3D=3D'!') d=3D'analytics.corp.google.com';=0A= _ubd.cookie=3D"GASO=3D"+_utk+"; path=3D"+_utcp+";"+_udo;=0A= var sc=3Ddocument.createElement('script');=0A= sc.type=3D'text/javascript';=0A= sc.id=3D"_gasojs";=0A= = sc.src=3D'https://'+d+'/analytics/reporting/overlay_js?gaso=3D'+_utk+'&'+= Math.random();=0A= document.getElementsByTagName('head')[0].appendChild(sc); =0A= }=0A= function _uGT() {=0A= var h=3Dlocation.hash, a;=0A= if (h && h!=3D"" && h.indexOf("#gaso=3D")=3D=3D0) {=0A= a=3D_uGC(h,"gaso=3D","&");=0A= } else {=0A= a=3D_uGC(_ubd.cookie,"GASO=3D",";");=0A= }=0A= return a;=0A= }=0A= var _utk=3D_uGT();=0A= if (_utk && _utk!=3D"" && _utk.length>10) {=0A= if (window.addEventListener) {=0A= window.addEventListener('load', _uCO, false); =0A= } else if (window.attachEvent) { =0A= window.attachEvent('onload', _uCO);=0A= }=0A= }=0A= =0A= function _uNx() {=0A= return (new Date((new Date()).getTime()+63072000000)).toGMTString();=0A= }=0A= ------=_NextPart_000_01DC_01C88672.F4A755A0 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://media.collegepublisher.com/media/scripts/yui/build/utilities/utilities.js /*=0A= Copyright (c) 2007, Yahoo! Inc. All rights reserved.=0A= Code licensed under the BSD License:=0A= http://developer.yahoo.net/yui/license.txt=0A= version: 2.2.0=0A= */=0A= =0A= if(typeof YAHOO=3D=3D"undefined"){var YAHOO=3D{};}=0A= YAHOO.namespace=3Dfunction(){var = a=3Darguments,o=3Dnull,i,j,d;for(i=3D0;i-1){return = true;}else{return = YAHOO.lang.isObject(obj)&&obj.constructor=3D=3DArray;}},isBoolean:functio= n(obj){return typeof = obj=3D=3D'boolean';},isFunction:function(obj){return typeof = obj=3D=3D'function';},isNull:function(obj){return = obj=3D=3D=3Dnull;},isNumber:function(obj){return typeof = obj=3D=3D'number'&&isFinite(obj);},isObject:function(obj){return typeof = obj=3D=3D'object'||YAHOO.lang.isFunction(obj);},isString:function(obj){re= turn typeof obj=3D=3D'string';},isUndefined:function(obj){return typeof = obj=3D=3D'undefined';},hasOwnProperty:function(obj,prop){if(Object.protot= ype.hasOwnProperty){return obj.hasOwnProperty(prop);}=0A= return!YAHOO.lang.isUndefined(obj[prop])&&obj.constructor.prototype[prop]= !=3D=3Dobj[prop];},extend:function(subc,superc,overrides){var = F=3Dfunction(){};F.prototype=3Dsuperc.prototype;subc.prototype=3Dnew = F();subc.prototype.constructor=3Dsubc;subc.superclass=3Dsuperc.prototype;= if(superc.prototype.constructor=3D=3DObject.prototype.constructor){superc= .prototype.constructor=3Dsuperc;}=0A= if(overrides){for(var i in = overrides){subc.prototype[i]=3Doverrides[i];}}},augment:function(r,s){var= = rp=3Dr.prototype,sp=3Ds.prototype,a=3Darguments,i,p;if(a[2]){for(i=3D2;i<= a.length;i=3Di+1){rp[a[i]]=3Dsp[a[i]];}}else{for(p in = sp){if(!rp[p]){rp[p]=3Dsp[p];}}}}};YAHOO.init();YAHOO.util.Lang=3DYAHOO.l= ang;YAHOO.augment=3DYAHOO.lang.augment;YAHOO.extend=3DYAHOO.lang.extend;Y= AHOO.register("yahoo",YAHOO,{version:"2.2.0",build:"127"});=0A= (function(){var = Y=3DYAHOO.util,getStyle,setStyle,id_counter=3D0,propertyCache=3D{};var = ua=3Dnavigator.userAgent.toLowerCase(),isOpera=3D(ua.indexOf('opera')>-1)= ,isSafari=3D(ua.indexOf('safari')>-1),isGecko=3D(!isOpera&&!isSafari&&ua.= indexOf('gecko')>-1),isIE=3D(!isOpera&&ua.indexOf('msie')>-1);var = patterns=3D{HYPHEN:/(-[a-z])/i};var = toCamel=3Dfunction(property){if(!patterns.HYPHEN.test(property)){return = property;}=0A= if(propertyCache[property]){return propertyCache[property];}=0A= while(patterns.HYPHEN.exec(property)){property=3Dproperty.replace(RegExp.= $1,RegExp.$1.substr(1).toUpperCase());}=0A= propertyCache[property]=3Dproperty;return = property;};if(document.defaultView&&document.defaultView.getComputedStyle= ){getStyle=3Dfunction(el,property){var value=3Dnull;var = computed=3Ddocument.defaultView.getComputedStyle(el,'');if(computed){valu= e=3Dcomputed[toCamel(property)];}=0A= return el.style[property]||value;};}else = if(document.documentElement.currentStyle&&isIE){getStyle=3Dfunction(el,pr= operty){switch(toCamel(property)){case'opacity':var = val=3D100;try{val=3Del.filters['DXImageTransform.Microsoft.Alpha'].opacit= y;}catch(e){try{val=3Del.filters('alpha').opacity;}catch(e){}}=0A= return val/100;break;default:var = value=3Del.currentStyle?el.currentStyle[property]:null;return(el.style[pr= operty]||value);}};}else{getStyle=3Dfunction(el,property){return = el.style[property];};}=0A= if(isIE){setStyle=3Dfunction(el,property,val){switch(property){case'opaci= ty':if(typeof = el.style.filter=3D=3D'string'){el.style.filter=3D'alpha(opacity=3D'+val*1= 00+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=3D1= ;}}=0A= break;default:el.style[property]=3Dval;}};}else{setStyle=3Dfunction(el,pr= operty,val){el.style[property]=3Dval;};}=0A= YAHOO.util.Dom=3D{get:function(el){if(!el){return null;}=0A= if(typeof el!=3D'string'&&!(el instanceof Array)){return el;}=0A= if(typeof el=3D=3D'string'){return document.getElementById(el);}=0A= else{var collection=3D[];for(var = i=3D0,len=3Del.length;i=3Dthis.le= ft&®ion.right<=3Dthis.right&®ion.top>=3Dthis.top&®ion.bottom<=3D= this.bottom);};YAHOO.util.Region.prototype.getArea=3Dfunction(){return((t= his.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototyp= e.intersect=3Dfunction(region){var t=3DMath.max(this.top,region.top);var = r=3DMath.min(this.right,region.right);var = b=3DMath.min(this.bottom,region.bottom);var = l=3DMath.max(this.left,region.left);if(b>=3Dt&&r>=3Dl){return new = YAHOO.util.Region(t,r,b,l);}else{return = null;}};YAHOO.util.Region.prototype.union=3Dfunction(region){var = t=3DMath.min(this.top,region.top);var = r=3DMath.max(this.right,region.right);var = b=3DMath.max(this.bottom,region.bottom);var = l=3DMath.min(this.left,region.left);return new = YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=3Dfunct= ion(){return("Region {"+"top: "+this.top+", right: "+this.right+", = bottom: "+this.bottom+", left: = "+this.left+"}");};YAHOO.util.Region.getRegion=3Dfunction(el){var = p=3DYAHOO.util.Dom.getXY(el);var t=3Dp[1];var = r=3Dp[0]+el.offsetWidth;var b=3Dp[1]+el.offsetHeight;var l=3Dp[0];return = new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=3Dfunction(x,y){if(x = instanceof Array){y=3Dx[1];x=3Dx[0];}=0A= this.x=3Dthis.right=3Dthis.left=3Dthis[0]=3Dx;this.y=3Dthis.top=3Dthis.bo= ttom=3Dthis[1]=3Dy;};YAHOO.util.Point.prototype=3Dnew = YAHOO.util.Region();YAHOO.register("dom",YAHOO.util.Dom,{version:"2.2.0",= build:"127"});=0A= if(!YAHOO.util.Event){YAHOO.util.Event=3Dfunction(){var = loadComplete=3Dfalse;var listeners=3D[];var unloadListeners=3D[];var = legacyEvents=3D[];var legacyHandlers=3D[];var retryCount=3D0;var = onAvailStack=3D[];var legacyMap=3D[];var counter=3D0;var = lastError=3Dnull;return{POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2= ,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/KHTML/gi).test(navigator.userAgent),w= ebkit:function(){var v=3Dnavigator.userAgent.match(/AppleWebKit\/([^ = ]*)/);if(v&&v[1]){return v[1];}=0A= return = null;}(),isIE:(!this.webkit&&!navigator.userAgent.match(/opera/gi)&&navig= ator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){i= f(!this._interval){var self=3Dthis;var = callback=3Dfunction(){self._tryPreloadAttach();};this._interval=3DsetInte= rval(callback,this.POLL_INTERVAL);}},onAvailable:function(p_id,p_fn,p_obj= ,p_override){onAvailStack.push({id:p_id,fn:p_fn,obj:p_obj,override:p_over= ride,checkReady:false});retryCount=3Dthis.POLL_RETRYS;this.startInterval(= );},onContentReady:function(p_id,p_fn,p_obj,p_override){onAvailStack.push= ({id:p_id,fn:p_fn,obj:p_obj,override:p_override,checkReady:true});retryCo= unt=3Dthis.POLL_RETRYS;this.startInterval();},addListener:function(el,sTy= pe,fn,obj,override){if(!fn||!fn.call){return false;}=0A= if(this._isValidCollection(el)){var ok=3Dtrue;for(var = i=3D0,len=3Del.length;i=3D0){cacheItem=3Dlisteners[index];}=0A= if(!el||!cacheItem){return false;}=0A= if(this.useLegacyEvent(el,sType)){var = legacyIndex=3Dthis.getLegacyIndex(el,sType);var = llist=3DlegacyHandlers[legacyIndex];if(llist){for(i=3D0,len=3Dllist.lengt= h;i0);}=0A= var notAvail=3D[];for(var i=3D0,len=3DonAvailStack.length;i0){for(var = i=3D0,len=3DsearchList.length;i0){j=3Dlisteners.le= ngth;while(j){index=3Dj-1;l=3Dlisteners[index];if(l){EU.removeListener(l[= EU.EL],l[EU.TYPE],l[EU.FN],index);}=0A= j=3Dj-1;}=0A= l=3Dnull;EU.clearCache();}=0A= for(i=3D0,len=3DlegacyEvents.length;i0){param=3Dargs[0];}=0A= ret=3Ds.fn.call(scope,param,s.obj);}else{ret=3Ds.fn.call(scope,this.type,= args,s.obj);}=0A= if(false=3D=3D=3Dret){if(!this.silent){}=0A= return false;}}}=0A= return true;},unsubscribeAll:function(){for(var = i=3D0,len=3Dthis.subscribers.length;i=3D200&&httpStatus<300){responseObject=3Dthis.createRespons= eObject(o,callback.argument);if(callback.success){if(!callback.scope){cal= lback.success(responseObject);}=0A= else{callback.success.apply(callback.scope,[responseObject]);}}}=0A= else{switch(httpStatus){case 12002:case 12029:case 12030:case 12031:case = 12152:case = 13030:responseObject=3Dthis.createExceptionObject(o.tId,callback.argument= ,(isAbort?isAbort:false));if(callback.failure){if(!callback.scope){callba= ck.failure(responseObject);}=0A= else{callback.failure.apply(callback.scope,[responseObject]);}}=0A= break;default:responseObject=3Dthis.createResponseObject(o,callback.argum= ent);if(callback.failure){if(!callback.scope){callback.failure(responseOb= ject);}=0A= else{callback.failure.apply(callback.scope,[responseObject]);}}}}=0A= this.releaseObject(o);responseObject=3Dnull;},createResponseObject:functi= on(o,callbackArg)=0A= {var obj=3D{};var headerObj=3D{};try=0A= {var headerStr=3Do.conn.getAllResponseHeaders();var = header=3DheaderStr.split('\n');for(var i=3D0;i');if(typeof = secureUri=3D=3D'boolean'){io.src=3D'javascript:false';}=0A= else if(typeof secureURI=3D=3D'string'){io.src=3DsecureUri;}}=0A= else{var = io=3Ddocument.createElement('iframe');io.id=3DframeId;io.name=3DframeId;}=0A= io.style.position=3D'absolute';io.style.top=3D'-1000px';io.style.left=3D'= -1000px';document.body.appendChild(io);},appendPostData:function(postData= )=0A= {var formElements=3D[];var postMessage=3DpostData.split('&');for(var = i=3D0;i0){for(var = i=3D0;i0)?val:0;}=0A= YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:functi= on(attr){var el=3Dthis.getEl();var = val=3DYAHOO.util.Dom.getStyle(el,attr);if(val!=3D=3D'auto'&&!this.pattern= s.offsetUnit.test(val)){return parseFloat(val);}=0A= var a=3Dthis.patterns.offsetAttribute.exec(attr)||[];var = pos=3D!!(a[3]);var = box=3D!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=3D=3D'abso= lute'&&pos)){val=3Del['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1= )];}else{val=3D0;}=0A= return = val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(att= r)){return'px';}=0A= return'';},setRuntimeAttribute:function(attr){var start;var end;var = attributes=3Dthis.attributes;this.runtimeAttributes[attr]=3D{};var = isset=3Dfunction(prop){return(typeof = prop!=3D=3D'undefined');};if(!isset(attributes[attr]['to'])&&!isset(attri= butes[attr]['by'])){return false;}=0A= start=3D(isset(attributes[attr]['from']))?attributes[attr]['from']:this.g= etAttribute(attr);if(isset(attributes[attr]['to'])){end=3Dattributes[attr= ]['to'];}else = if(isset(attributes[attr]['by'])){if(start.constructor=3D=3DArray){end=3D= [];for(var = i=3D0,len=3Dstart.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=3Dframes){tweak= =3Dframes-(frame+1);}=0A= tween.currentFrame+=3Dtweak;}};};YAHOO.util.Bezier=3Dnew = function(){this.getPosition=3Dfunction(points,t){var = n=3Dpoints.length;var tmp=3D[];for(var = i=3D0;i0&&!(control[0]instanceof = Array)){control=3D[control];}else{var = tmp=3D[];for(i=3D0,len=3Dcontrol.length;i0){this.runtimeA= ttributes[attr]=3Dthis.runtimeAttributes[attr].concat(control);}=0A= this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=3Dend;}=0A= else{superclass.setRuntimeAttribute.call(this,attr);}};var = translateValues=3Dfunction(val,start){var = pageXY=3DY.Dom.getXY(this.getEl());val=3D[val[0]-pageXY[0]+start[0],val[1= ]-pageXY[1]+start[1]];return val;};var = isset=3Dfunction(prop){return(typeof = prop!=3D=3D'undefined');};})();(function(){YAHOO.util.Scroll=3Dfunction(e= l,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constru= ctor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.= Scroll,YAHOO.util.ColorAnim);var Y=3DYAHOO.util;var = superclass=3DY.Scroll.superclass;var = proto=3DY.Scroll.prototype;proto.toString=3Dfunction(){var = el=3Dthis.getEl();var id=3Del.id||el.tagName;return("Scroll = "+id);};proto.doMethod=3Dfunction(attr,start,end){var = val=3Dnull;if(attr=3D=3D'scroll'){val=3D[this.method(this.currentFrame,st= art[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,st= art[1],end[1]-start[1],this.totalFrames)];}else{val=3Dsuperclass.doMethod= .call(this,attr,start,end);}=0A= return val;};proto.getAttribute=3Dfunction(attr){var val=3Dnull;var = el=3Dthis.getEl();if(attr=3D=3D'scroll'){val=3D[el.scrollLeft,el.scrollTo= p];}else{val=3Dsuperclass.getAttribute.call(this,attr);}=0A= return val;};proto.setAttribute=3Dfunction(attr,val,unit){var = el=3Dthis.getEl();if(attr=3D=3D'scroll'){el.scrollLeft=3Dval[0];el.scroll= Top=3Dval[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})= ();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.2.0",build:"127= "});=0A= if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=3Dfunction(){var = Event=3DYAHOO.util.Event;return{ids:{},handleIds:{},dragCurrent:null,drag= Overs:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,inita= lized:false,locked:false,init:function(){this.initialized=3Dtrue;},POINT:= 0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(sMethod,args)= {for(var i in this.ids){for(var j in this.ids[i]){var = oDD=3Dthis.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;}=0A= oDD[sMethod].apply(oDD,args);}}},_onLoad:function(){this.init();Event.on(= document,"mouseup",this.handleMouseUp,this,true);Event.on(document,"mouse= move",this.handleMouseMove,this,true);Event.on(window,"unload",this._onUn= load,this,true);Event.on(window,"resize",this._onResize,this,true);},_onR= esize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(= ){this.locked=3Dtrue;},unlock:function(){this.locked=3Dfalse;},isLocked:f= unction(){return = this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTime= Thresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDr= agDrop:function(oDD,sGroup){if(!this.initialized){this.init();}=0A= if(!this.ids[sGroup]){this.ids[sGroup]=3D{};}=0A= this.ids[sGroup][oDD.id]=3DoDD;},removeDDFromGroup:function(oDD,sGroup){i= f(!this.ids[sGroup]){this.ids[sGroup]=3D{};}=0A= var obj=3Dthis.ids[sGroup];if(obj&&obj[oDD.id]){delete = obj[oDD.id];}},_remove:function(oDD){for(var g in = oDD.groups){if(g&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}}=0A= delete = this.handleIds[oDD.id];},regHandle:function(sDDId,sHandleId){if(!this.han= dleIds[sDDId]){this.handleIds[sDDId]=3D{};}=0A= this.handleIds[sDDId][sHandleId]=3DsHandleId;},isDragDrop:function(id){re= turn(this.getDDById(id))?true:false;},getRelated:function(p_oDD,bTargetsO= nly){var oDDs=3D[];for(var i in p_oDD.groups){for(j in this.ids[i]){var = dd=3Dthis.ids[i][j];if(!this.isTypeOfDD(dd)){continue;}=0A= if(!bTargetsOnly||dd.isTarget){oDDs[oDDs.length]=3Ddd;}}}=0A= return oDDs;},isLegalTarget:function(oDD,oTargetDD){var = targets=3Dthis.getRelated(oDD,true);for(var = i=3D0,len=3Dtargets.length;ithis.= clickPixelThresh||diffY>this.clickPixelThresh){this.startDrag(this.startX= ,this.startY);}}=0A= if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag= (e);this.fireEvents(e,false);}=0A= this.stopEvent(e);return true;},fireEvents:function(e,isDrop){var = dc=3Dthis.dragCurrent;if(!dc||dc.isLocked()){return;}=0A= var x=3DYAHOO.util.Event.getPageX(e);var = y=3DYAHOO.util.Event.getPageY(e);var pt=3Dnew YAHOO.util.Point(x,y);var = oldOvers=3D[];var outEvts=3D[];var overEvts=3D[];var dropEvts=3D[];var = enterEvts=3D[];for(var i in this.dragOvers){var = ddo=3Dthis.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;}=0A= if(!this.isOverTarget(pt,ddo,this.mode)){outEvts.push(ddo);}=0A= oldOvers[i]=3Dtrue;delete this.dragOvers[i];}=0A= for(var sGroup in dc.groups){if("string"!=3Dtypeof sGroup){continue;}=0A= for(i in this.ids[sGroup]){var = oDD=3Dthis.ids[sGroup][i];if(!this.isTypeOfDD(oDD)){continue;}=0A= if(oDD.isTarget&&!oDD.isLocked()&&oDD!=3Ddc){if(this.isOverTarget(pt,oDD,= this.mode)){if(isDrop){dropEvts.push(oDD);}else{if(!oldOvers[oDD.id]){ent= erEvts.push(oDD);}else{overEvts.push(oDD);}=0A= this.dragOvers[oDD.id]=3DoDD;}}}}}=0A= if(this.mode){if(outEvts.length){dc.b4DragOut(e,outEvts);dc.onDragOut(e,o= utEvts);}=0A= if(enterEvts.length){dc.onDragEnter(e,enterEvts);}=0A= if(overEvts.length){dc.b4DragOver(e,overEvts);dc.onDragOver(e,overEvts);}=0A= if(dropEvts.length){dc.b4DragDrop(e,dropEvts);dc.onDragDrop(e,dropEvts);}= }else{var = len=3D0;for(i=3D0,len=3DoutEvts.length;i2000){}else{setTimeout(DDM._addListeners,10);if(docum= ent&&document.body){DDM._timeoutCount+=3D1;}}}},handleWasClicked:function= (node,id){if(this.isHandle(id,node.id)){return true;}else{var = p=3Dnode.parentNode;while(p){if(this.isHandle(id,p.id)){return = true;}else{p=3Dp.parentNode;}}}=0A= return = false;}};}();YAHOO.util.DDM=3DYAHOO.util.DragDropMgr;YAHOO.util.DDM._addL= isteners();}=0A= (function(){var Event=3DYAHOO.util.Event;var = Dom=3DYAHOO.util.Dom;YAHOO.util.DragDrop=3Dfunction(id,sGroup,config){if(= id){this.init(id,sGroup,config);}};YAHOO.util.DragDrop.prototype=3D{id:nu= ll,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,inva= lidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,gro= ups:null,locked:false,lock:function(){this.locked=3Dtrue;},unlock:functio= n(){this.locked=3Dfalse;},isTarget:true,padding:null,_domRef:null,__ygDra= gDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,= maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,avail= able:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:fu= nction(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:funct= ion(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOu= t:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDra= gDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){= },endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e)= {},onMouseUp:function(e){},onAvailable:function(){},getEl:function(){if(!= this._domRef){this._domRef=3DDom.get(this.id);}=0A= return this._domRef;},getDragEl:function(){return = Dom.get(this.dragElId);},init:function(id,sGroup,config){this.initTarget(= id,sGroup,config);Event.on(this.id,"mousedown",this.handleMouseDown,this,= true);},initTarget:function(id,sGroup,config){this.config=3Dconfig||{};th= is.DDM=3DYAHOO.util.DDM;this.groups=3D{};if(typeof = id!=3D=3D"string"){id=3DDom.generateId(id);}=0A= this.id=3Did;this.addToGroup((sGroup)?sGroup:"default");this.handleElId=3D= id;Event.onAvailable(id,this.handleOnAvailable,this,true);this.setDragElI= d(id);this.invalidHandleTypes=3D{A:"A"};this.invalidHandleIds=3D{};this.i= nvalidHandleClasses=3D[];this.applyConfig();},applyConfig:function(){this= .padding=3Dthis.config.padding||[0,0,0,0];this.isTarget=3D(this.config.is= Target!=3D=3Dfalse);this.maintainOffset=3D(this.config.maintainOffset);th= is.primaryButtonOnly=3D(this.config.primaryButtonOnly!=3D=3Dfalse);},hand= leOnAvailable:function(){this.available=3Dtrue;this.resetConstraints();th= is.onAvailable();},setPadding:function(iTop,iRight,iBot,iLeft){if(!iRight= &&0!=3D=3DiRight){this.padding=3D[iTop,iTop,iTop,iTop];}else = if(!iBot&&0!=3D=3DiBot){this.padding=3D[iTop,iRight,iTop,iRight];}else{th= is.padding=3D[iTop,iRight,iBot,iLeft];}},setInitPosition:function(diffX,d= iffY){var el=3Dthis.getEl();if(!this.DDM.verifyEl(el)){return;}=0A= var dx=3DdiffX||0;var dy=3DdiffY||0;var = p=3DDom.getXY(el);this.initPageX=3Dp[0]-dx;this.initPageY=3Dp[1]-dy;this.= lastPageX=3Dp[0];this.lastPageY=3Dp[1];this.setStartPosition(p);},setStar= tPosition:function(pos){var = p=3Dpos||Dom.getXY(this.getEl());this.deltaSetXY=3Dnull;this.startPageX=3D= p[0];this.startPageY=3Dp[1];},addToGroup:function(sGroup){this.groups[sGr= oup]=3Dtrue;this.DDM.regDragDrop(this,sGroup);},removeFromGroup:function(= sGroup){if(this.groups[sGroup]){delete this.groups[sGroup];}=0A= this.DDM.removeDDFromGroup(this,sGroup);},setDragElId:function(id){this.d= ragElId=3Did;},setHandleElId:function(id){if(typeof = id!=3D=3D"string"){id=3DDom.generateId(id);}=0A= this.handleElId=3Did;this.DDM.regHandle(this.id,id);},setOuterHandleElId:= function(id){if(typeof id!=3D=3D"string"){id=3DDom.generateId(id);}=0A= Event.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElI= d(id);this.hasOuterHandles=3Dtrue;},unreg:function(){Event.removeListener= (this.id,"mousedown",this.handleMouseDown);this._domRef=3Dnull;this.DDM._= remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locke= d);},handleMouseDown:function(e,oDD){var = button=3De.which||e.button;if(this.primaryButtonOnly&&button>1){return;}=0A= if(this.isLocked()){return;}=0A= this.b4MouseDown(e);this.onMouseDown(e);this.DDM.refreshCache(this.groups= );var pt=3Dnew = YAHOO.util.Point(Event.getPageX(e),Event.getPageY(e));if(!this.hasOuterHa= ndles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){= this.setStartPosition();this.DDM.handleMouseDown(e,this);this.DDM.stopEve= nt(e);}else{}}},clickValidator:function(e){var = target=3DEvent.getTarget(e);return(this.isValidHandleChild(target)&&(this= .id=3D=3Dthis.handleElId||this.DDM.handleWasClicked(target,this.id)));},a= ddInvalidHandleType:function(tagName){var = type=3DtagName.toUpperCase();this.invalidHandleTypes[type]=3Dtype;},addIn= validHandleId:function(id){if(typeof = id!=3D=3D"string"){id=3DDom.generateId(id);}=0A= this.invalidHandleIds[id]=3Did;},addInvalidHandleClass:function(cssClass)= {this.invalidHandleClasses.push(cssClass);},removeInvalidHandleType:funct= ion(tagName){var type=3DtagName.toUpperCase();delete = this.invalidHandleTypes[type];},removeInvalidHandleId:function(id){if(typ= eof id!=3D=3D"string"){id=3DDom.generateId(id);}=0A= delete = this.invalidHandleIds[id];},removeInvalidHandleClass:function(cssClass){f= or(var = i=3D0,len=3Dthis.invalidHandleClasses.length;i=3Dthis.minX;i=3Di-iTickSize){if(!tickMap[i]){this.x= Ticks[this.xTicks.length]=3Di;tickMap[i]=3Dtrue;}}=0A= for(i=3Dthis.initPageX;i<=3Dthis.maxX;i=3Di+iTickSize){if(!tickMap[i]){th= is.xTicks[this.xTicks.length]=3Di;tickMap[i]=3Dtrue;}}=0A= this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(iStartY,iTick= Size){this.yTicks=3D[];this.yTickSize=3DiTickSize;var = tickMap=3D{};for(var = i=3Dthis.initPageY;i>=3Dthis.minY;i=3Di-iTickSize){if(!tickMap[i]){this.y= Ticks[this.yTicks.length]=3Di;tickMap[i]=3Dtrue;}}=0A= for(i=3Dthis.initPageY;i<=3Dthis.maxY;i=3Di+iTickSize){if(!tickMap[i]){th= is.yTicks[this.yTicks.length]=3Di;tickMap[i]=3Dtrue;}}=0A= this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(iLeft,iR= ight,iTickSize){this.leftConstraint=3DparseInt(iLeft,10);this.rightConstr= aint=3DparseInt(iRight,10);this.minX=3Dthis.initPageX-this.leftConstraint= ;this.maxX=3Dthis.initPageX+this.rightConstraint;if(iTickSize){this.setXT= icks(this.initPageX,iTickSize);}=0A= this.constrainX=3Dtrue;},clearConstraints:function(){this.constrainX=3Dfa= lse;this.constrainY=3Dfalse;this.clearTicks();},clearTicks:function(){thi= s.xTicks=3Dnull;this.yTicks=3Dnull;this.xTickSize=3D0;this.yTickSize=3D0;= },setYConstraint:function(iUp,iDown,iTickSize){this.topConstraint=3Dparse= Int(iUp,10);this.bottomConstraint=3DparseInt(iDown,10);this.minY=3Dthis.i= nitPageY-this.topConstraint;this.maxY=3Dthis.initPageY+this.bottomConstra= int;if(iTickSize){this.setYTicks(this.initPageY,iTickSize);}=0A= this.constrainY=3Dtrue;},resetConstraints:function(){if(this.initPageX||t= his.initPageX=3D=3D=3D0){var = dx=3D(this.maintainOffset)?this.lastPageX-this.initPageX:0;var = dy=3D(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPo= sition(dx,dy);}else{this.setInitPosition();}=0A= if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightCon= straint,this.xTickSize);}=0A= if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomCon= straint,this.yTickSize);}},getTick:function(val,tickArray){if(!tickArray)= {return val;}else if(tickArray[0]>=3Dval){return = tickArray[0];}else{for(var i=3D0,len=3DtickArray.length;i=3Dval){var = diff1=3Dval-tickArray[i];var = diff2=3DtickArray[next]-val;return(diff2>diff1)?tickArray[i]:tickArray[ne= xt];}}=0A= return = tickArray[tickArray.length-1];}},toString:function(){return("DragDrop = "+this.id);}};})();YAHOO.util.DD=3Dfunction(id,sGroup,config){if(id){this= .init(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop= ,{scroll:true,autoOffset:function(iPageX,iPageY){var = x=3DiPageX-this.startPageX;var = y=3DiPageY-this.startPageY;this.setDelta(x,y);},setDelta:function(iDeltaX= ,iDeltaY){this.deltaX=3DiDeltaX;this.deltaY=3DiDeltaY;},setDragElPos:func= tion(iPageX,iPageY){var = el=3Dthis.getDragEl();this.alignElWithMouse(el,iPageX,iPageY);},alignElWi= thMouse:function(el,iPageX,iPageY){var = oCoord=3Dthis.getTargetCoord(iPageX,iPageY);if(!this.deltaSetXY){var = aCoord=3D[oCoord.x,oCoord.y];YAHOO.util.Dom.setXY(el,aCoord);var = newLeft=3DparseInt(YAHOO.util.Dom.getStyle(el,"left"),10);var = newTop=3DparseInt(YAHOO.util.Dom.getStyle(el,"top"),10);this.deltaSetXY=3D= [newLeft-oCoord.x,newTop-oCoord.y];}else{YAHOO.util.Dom.setStyle(el,"left= ",(oCoord.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(el,"top",(o= Coord.y+this.deltaSetXY[1])+"px");}=0A= this.cachePosition(oCoord.x,oCoord.y);this.autoScroll(oCoord.x,oCoord.y,e= l.offsetHeight,el.offsetWidth);},cachePosition:function(iPageX,iPageY){if= (iPageX){this.lastPageX=3DiPageX;this.lastPageY=3DiPageY;}else{var = aCoord=3DYAHOO.util.Dom.getXY(this.getEl());this.lastPageX=3DaCoord[0];th= is.lastPageY=3DaCoord[1];}},autoScroll:function(x,y,h,w){if(this.scroll){= var clientH=3Dthis.DDM.getClientHeight();var = clientW=3Dthis.DDM.getClientWidth();var st=3Dthis.DDM.getScrollTop();var = sl=3Dthis.DDM.getScrollLeft();var bot=3Dh+y;var right=3Dw+x;var = toBot=3D(clientH+st-y-this.deltaY);var = toRight=3D(clientW+sl-x-this.deltaX);var thresh=3D40;var = scrAmt=3D(document.all)?80:30;if(bot>clientH&&toBot0&&y-stclientW&&toRight0&&x-slthis.maxX){x=3Dthis.maxX;}}=0A= if(this.constrainY){if(ythis.maxY){y=3Dthis.maxY;}}=0A= x=3Dthis.getTick(x,this.xTicks);y=3Dthis.getTick(y,this.yTicks);return{x:= x,y:y};},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call= (this);this.scroll=3D(this.config.scroll!=3D=3Dfalse);},b4MouseDown:funct= ion(e){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(= e),YAHOO.util.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(Y= AHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},toString:func= tion(){return("DD = "+this.id);}});YAHOO.util.DDProxy=3Dfunction(id,sGroup,config){if(id){thi= s.init(id,sGroup,config);this.initFrame();}};YAHOO.util.DDProxy.dragElId=3D= "ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:tru= e,centerFrame:false,createFrame:function(){var self=3Dthis;var = body=3Ddocument.body;if(!body||!body.firstChild){setTimeout(function(){se= lf.createFrame();},50);return;}=0A= var = div=3Dthis.getDragEl();if(!div){div=3Ddocument.createElement("div");div.i= d=3Dthis.dragElId;var = s=3Ddiv.style;s.position=3D"absolute";s.visibility=3D"hidden";s.cursor=3D= "move";s.border=3D"2px solid = #aaa";s.zIndex=3D999;body.insertBefore(div,body.firstChild);}},initFrame:= function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy= .superclass.applyConfig.call(this);this.resizeFrame=3D(this.config.resize= Frame!=3D=3Dfalse);this.centerFrame=3D(this.config.centerFrame);this.setD= ragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:fu= nction(iPageX,iPageY){var el=3Dthis.getEl();var = dragEl=3Dthis.getDragEl();var = s=3DdragEl.style;this._resizeProxy();if(this.centerFrame){this.setDelta(M= ath.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));}=0A= this.setDragElPos(iPageX,iPageY);YAHOO.util.Dom.setStyle(dragEl,"visibili= ty","visible");},_resizeProxy:function(){if(this.resizeFrame){var = DOM=3DYAHOO.util.Dom;var el=3Dthis.getEl();var = dragEl=3Dthis.getDragEl();var = bt=3DparseInt(DOM.getStyle(dragEl,"borderTopWidth"),10);var = br=3DparseInt(DOM.getStyle(dragEl,"borderRightWidth"),10);var = bb=3DparseInt(DOM.getStyle(dragEl,"borderBottomWidth"),10);var = bl=3DparseInt(DOM.getStyle(dragEl,"borderLeftWidth"),10);if(isNaN(bt)){bt= =3D0;}=0A= if(isNaN(br)){br=3D0;}=0A= if(isNaN(bb)){bb=3D0;}=0A= if(isNaN(bl)){bl=3D0;}=0A= var newWidth=3DMath.max(0,el.offsetWidth-br-bl);var = newHeight=3DMath.max(0,el.offsetHeight-bt-bb);DOM.setStyle(dragEl,"width"= ,newWidth+"px");DOM.setStyle(dragEl,"height",newHeight+"px");}},b4MouseDo= wn:function(e){this.setStartPosition();var = x=3DYAHOO.util.Event.getPageX(e);var = y=3DYAHOO.util.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x= ,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(= e){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endD= rag:function(e){var DOM=3DYAHOO.util.Dom;var lel=3Dthis.getEl();var = del=3Dthis.getDragEl();DOM.setStyle(del,"visibility","");DOM.setStyle(lel= ,"visibility","hidden");YAHOO.util.DDM.moveToEl(lel,del);DOM.setStyle(del= ,"visibility","hidden");DOM.setStyle(lel,"visibility","");},toString:func= tion(){return("DDProxy = "+this.id);}});YAHOO.util.DDTarget=3Dfunction(id,sGroup,config){if(id){th= is.initTarget(id,sGroup,config);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO= .util.DragDrop,{toString:function(){return("DDTarget = "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:= "2.2.0",build:"127"});=0A= YAHOO.util.Attribute=3Dfunction(hash,owner){if(owner){this.owner=3Downer;= this.configure(hash,true);}};YAHOO.util.Attribute.prototype=3D{name:undef= ined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:= null,_written:false,method:null,validator:null,getValue:function(){return= this.value;},setValue:function(value,silent){var beforeRetVal;var = owner=3Dthis.owner;var name=3Dthis.name;var = event=3D{type:name,prevValue:this.getValue(),newValue:value};if(this.read= Only||(this.writeOnce&&this._written)){return false;}=0A= if(this.validator&&!this.validator.call(owner,value)){return false;}=0A= if(!silent){beforeRetVal=3Downer.fireBeforeChangeEvent(event);if(beforeRe= tVal=3D=3D=3Dfalse){return false;}}=0A= if(this.method){this.method.call(owner,value);}=0A= this.value=3Dvalue;this._written=3Dtrue;event.type=3Dname;if(!silent){thi= s.owner.fireChangeEvent(event);}=0A= return = true;},configure:function(map,init){map=3Dmap||{};this._written=3Dfalse;t= his._initialConfig=3Dthis._initialConfig||{};for(var key in = map){if(key&&YAHOO.lang.hasOwnProperty(map,key)){this[key]=3Dmap[key];if(= init){this._initialConfig[key]=3Dmap[key];}}}},resetValue:function(){retu= rn = this.setValue(this._initialConfig.value);},resetConfig:function(){this.co= nfigure(this._initialConfig);},refresh:function(silent){this.setValue(thi= s.value,silent);}};(function(){var = Lang=3DYAHOO.util.Lang;YAHOO.util.AttributeProvider=3Dfunction(){};YAHOO.= util.AttributeProvider.prototype=3D{_configs:null,get:function(key){var = configs=3Dthis._configs||{};var config=3Dconfigs[key];if(!config){return = undefined;}=0A= return config.value;},set:function(key,value,silent){var = configs=3Dthis._configs||{};var config=3Dconfigs[key];if(!config){return = false;}=0A= return config.setValue(value,silent);},getAttributeKeys:function(){var = configs=3Dthis._configs;var keys=3D[];var config;for(var key in = configs){config=3Dconfigs[key];if(Lang.hasOwnProperty(configs,key)&&!Lang= .isUndefined(config)){keys[keys.length]=3Dkey;}}=0A= return keys;},setAttributes:function(map,silent){for(var key in = map){if(Lang.hasOwnProperty(map,key)){this.set(key,map[key],silent);}}},r= esetValue:function(key,silent){var = configs=3Dthis._configs||{};if(configs[key]){this.set(key,configs[key]._i= nitialConfig.value,silent);return true;}=0A= return false;},refresh:function(key,silent){var = configs=3Dthis._configs;key=3D((Lang.isString(key))?[key]:key)||this.getA= ttributeKeys();for(var = i=3D0,len=3Dkey.length;iOR=0A= * @param {HTMLElement} el The element representing the Module=0A= * @param {Object} userConfig The configuration Object literal containing = the configuration that should be set for this module. See configuration = documentation for more details.=0A= */=0A= YAHOO.widget.Module =3D function(el, userConfig) {=0A= if (el) {=0A= this.init(el, userConfig);=0A= } else {=0A= }=0A= };=0A= =0A= /**=0A= * Constant representing the prefix path to use for non-secure images=0A= * @property YAHOO.widget.Module.IMG_ROOT=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.IMG_ROOT =3D null;=0A= =0A= /**=0A= * Constant representing the prefix path to use for securely served images=0A= * @property YAHOO.widget.Module.IMG_ROOT_SSL=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.IMG_ROOT_SSL =3D null;=0A= =0A= /**=0A= * Constant for the default CSS class name that represents a Module=0A= * @property YAHOO.widget.Module.CSS_MODULE=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.CSS_MODULE =3D "module";=0A= =0A= /**=0A= * Constant representing the module header=0A= * @property YAHOO.widget.Module.CSS_HEADER=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.CSS_HEADER =3D "hd";=0A= =0A= /**=0A= * Constant representing the module body=0A= * @property YAHOO.widget.Module.CSS_BODY=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.CSS_BODY =3D "bd";=0A= =0A= /**=0A= * Constant representing the module footer=0A= * @property YAHOO.widget.Module.CSS_FOOTER=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.CSS_FOOTER =3D "ft";=0A= =0A= /**=0A= * Constant representing the url for the "src" attribute of the iframe = used to monitor changes to the browser's base font size=0A= * @property YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL =3D "javascript:false;";=0A= =0A= /**=0A= * Singleton CustomEvent fired when the font size is changed in the = browser.=0A= * Opera's "zoom" functionality currently does not support text size = detection.=0A= * @event YAHOO.widget.Module.textResizeEvent=0A= */=0A= YAHOO.widget.Module.textResizeEvent =3D new = YAHOO.util.CustomEvent("textResize");=0A= =0A= YAHOO.widget.Module.prototype =3D {=0A= /**=0A= * The class's constructor function=0A= * @property contructor=0A= * @type Function=0A= */=0A= constructor : YAHOO.widget.Module,=0A= =0A= /**=0A= * The main module element that contains the header, body, and footer=0A= * @property element=0A= * @type HTMLElement=0A= */=0A= element : null,=0A= =0A= /**=0A= * The header element, denoted with CSS class "hd"=0A= * @property header=0A= * @type HTMLElement=0A= */=0A= header : null,=0A= =0A= /**=0A= * The body element, denoted with CSS class "bd"=0A= * @property body=0A= * @type HTMLElement=0A= */=0A= body : null,=0A= =0A= /**=0A= * The footer element, denoted with CSS class "ft"=0A= * @property footer=0A= * @type HTMLElement=0A= */=0A= footer : null,=0A= =0A= /**=0A= * The id of the element=0A= * @property id=0A= * @type String=0A= */=0A= id : null,=0A= =0A= /**=0A= * The String representing the image root=0A= * @property imageRoot=0A= * @type String=0A= */=0A= imageRoot : YAHOO.widget.Module.IMG_ROOT,=0A= =0A= /**=0A= * Initializes the custom events for Module which are fired = automatically at appropriate times by the Module class.=0A= * @method initEvents=0A= */=0A= initEvents : function() {=0A= =0A= /**=0A= * CustomEvent fired prior to class initalization.=0A= * @event beforeInitEvent=0A= * @param {class} classRef class reference of the initializing class, = such as this.beforeInitEvent.fire(YAHOO.widget.Module)=0A= */=0A= this.beforeInitEvent =3D new YAHOO.util.CustomEvent("beforeInit");=0A= =0A= /**=0A= * CustomEvent fired after class initalization.=0A= * @event initEvent=0A= * @param {class} classRef class reference of the initializing class, = such as this.beforeInitEvent.fire(YAHOO.widget.Module)=0A= */=0A= this.initEvent =3D new YAHOO.util.CustomEvent("init");=0A= =0A= /**=0A= * CustomEvent fired when the Module is appended to the DOM=0A= * @event appendEvent=0A= */=0A= this.appendEvent =3D new YAHOO.util.CustomEvent("append");=0A= =0A= /**=0A= * CustomEvent fired before the Module is rendered=0A= * @event beforeRenderEvent=0A= */=0A= this.beforeRenderEvent =3D new YAHOO.util.CustomEvent("beforeRender");=0A= =0A= /**=0A= * CustomEvent fired after the Module is rendered=0A= * @event renderEvent=0A= */=0A= this.renderEvent =3D new YAHOO.util.CustomEvent("render");=0A= =0A= /**=0A= * CustomEvent fired when the header content of the Module is modified=0A= * @event changeHeaderEvent=0A= * @param {String/HTMLElement} content String/element representing the = new header content=0A= */=0A= this.changeHeaderEvent =3D new YAHOO.util.CustomEvent("changeHeader");=0A= =0A= /**=0A= * CustomEvent fired when the body content of the Module is modified=0A= * @event changeBodyEvent=0A= * @param {String/HTMLElement} content String/element representing the = new body content=0A= */=0A= this.changeBodyEvent =3D new YAHOO.util.CustomEvent("changeBody");=0A= =0A= /**=0A= * CustomEvent fired when the footer content of the Module is modified=0A= * @event changeFooterEvent=0A= * @param {String/HTMLElement} content String/element representing the = new footer content=0A= */=0A= this.changeFooterEvent =3D new YAHOO.util.CustomEvent("changeFooter");=0A= =0A= /**=0A= * CustomEvent fired when the content of the Module is modified=0A= * @event changeContentEvent=0A= */=0A= this.changeContentEvent =3D new = YAHOO.util.CustomEvent("changeContent");=0A= =0A= /**=0A= * CustomEvent fired when the Module is destroyed=0A= * @event destroyEvent=0A= */=0A= this.destroyEvent =3D new YAHOO.util.CustomEvent("destroy");=0A= =0A= /**=0A= * CustomEvent fired before the Module is shown=0A= * @event beforeShowEvent=0A= */=0A= this.beforeShowEvent =3D new YAHOO.util.CustomEvent("beforeShow");=0A= =0A= /**=0A= * CustomEvent fired after the Module is shown=0A= * @event showEvent=0A= */=0A= this.showEvent =3D new YAHOO.util.CustomEvent("show");=0A= =0A= /**=0A= * CustomEvent fired before the Module is hidden=0A= * @event beforeHideEvent=0A= */=0A= this.beforeHideEvent =3D new YAHOO.util.CustomEvent("beforeHide");=0A= =0A= /**=0A= * CustomEvent fired after the Module is hidden=0A= * @event hideEvent=0A= */=0A= this.hideEvent =3D new YAHOO.util.CustomEvent("hide");=0A= },=0A= =0A= /**=0A= * String representing the current user-agent platform=0A= * @property platform=0A= * @type String=0A= */=0A= platform : function() {=0A= var ua =3D navigator.userAgent.toLowerCase();=0A= if (ua.indexOf("windows") !=3D -1 || ua.indexOf("win32") !=3D -1) {=0A= return "windows";=0A= } else if (ua.indexOf("macintosh") !=3D -1) {=0A= return "mac";=0A= } else {=0A= return false;=0A= }=0A= }(),=0A= =0A= /**=0A= * String representing the current user-agent browser=0A= * @property browser=0A= * @type String=0A= */=0A= browser : function() {=0A= var ua =3D navigator.userAgent.toLowerCase();=0A= if (ua.indexOf('opera')!=3D-1) { // Opera (check first in case of = spoof)=0A= return 'opera';=0A= } else if (ua.indexOf('msie 7')!=3D-1) { // IE7=0A= return 'ie7';=0A= } else if (ua.indexOf('msie') !=3D-1) { // IE=0A= return 'ie';=0A= } else if (ua.indexOf('safari')!=3D-1) { // Safari (check before = Gecko because it includes "like Gecko")=0A= return 'safari';=0A= } else if (ua.indexOf('gecko') !=3D -1) { // Gecko=0A= return 'gecko';=0A= } else {=0A= return false;=0A= }=0A= }(),=0A= =0A= /**=0A= * Boolean representing whether or not the current browsing context is = secure (https)=0A= * @property isSecure=0A= * @type Boolean=0A= */=0A= isSecure : function() {=0A= if (window.location.href.toLowerCase().indexOf("https") =3D=3D=3D 0) {=0A= return true;=0A= } else {=0A= return false;=0A= }=0A= }(),=0A= =0A= /**=0A= * Initializes the custom events for Module which are fired = automatically at appropriate times by the Module class.=0A= */=0A= initDefaultConfig : function() {=0A= // Add properties //=0A= =0A= /**=0A= * Specifies whether the Module is visible on the page.=0A= * @config visible=0A= * @type Boolean=0A= * @default true=0A= */=0A= this.cfg.addProperty("visible", { value:true, = handler:this.configVisible, validator:this.cfg.checkBoolean } );=0A= =0A= /**=0A= * Object or array of objects representing the ContainerEffect classes = that are active for animating the container.=0A= * @config effect=0A= * @type Object=0A= * @default null=0A= */=0A= this.cfg.addProperty("effect", { suppressEvent:true, = supercedes:["visible"] } );=0A= =0A= /**=0A= * Specifies whether to create a special proxy iframe to monitor for = user font resizing in the document=0A= * @config monitorresize=0A= * @type Boolean=0A= * @default true=0A= */=0A= this.cfg.addProperty("monitorresize", { value:true, = handler:this.configMonitorResize } );=0A= },=0A= =0A= /**=0A= * The Module class's initialization method, which is executed for = Module and all of its subclasses. This method is automatically called by = the constructor, and sets up all DOM references for pre-existing = markup, and creates required markup if it is not already present.=0A= * @method init=0A= * @param {String} el The element ID representing the Module OR=0A= * @param {HTMLElement} el The element representing the Module=0A= * @param {Object} userConfig The configuration Object literal = containing the configuration that should be set for this module. See = configuration documentation for more details.=0A= */=0A= init : function(el, userConfig) {=0A= =0A= this.initEvents();=0A= =0A= this.beforeInitEvent.fire(YAHOO.widget.Module);=0A= =0A= /**=0A= * The Module's Config object used for monitoring configuration = properties.=0A= * @property cfg=0A= * @type YAHOO.util.Config=0A= */=0A= this.cfg =3D new YAHOO.util.Config(this);=0A= =0A= if (this.isSecure) {=0A= this.imageRoot =3D YAHOO.widget.Module.IMG_ROOT_SSL;=0A= }=0A= =0A= if (typeof el =3D=3D "string") {=0A= var elId =3D el;=0A= =0A= el =3D document.getElementById(el);=0A= if (! el) {=0A= el =3D document.createElement("div");=0A= el.id =3D elId;=0A= }=0A= }=0A= =0A= this.element =3D el;=0A= =0A= if (el.id) {=0A= this.id =3D el.id;=0A= }=0A= =0A= var childNodes =3D this.element.childNodes;=0A= =0A= if (childNodes) {=0A= for (var i=3D0;iOR=0A= * @param {HTMLElement} headerContent The HTMLElement to append to the = header=0A= */=0A= setHeader : function(headerContent) {=0A= if (! this.header) {=0A= this.header =3D document.createElement("div");=0A= this.header.className =3D YAHOO.widget.Module.CSS_HEADER;=0A= }=0A= =0A= if (typeof headerContent =3D=3D "string") {=0A= this.header.innerHTML =3D headerContent;=0A= } else {=0A= this.header.innerHTML =3D "";=0A= this.header.appendChild(headerContent);=0A= }=0A= =0A= this.changeHeaderEvent.fire(headerContent);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Appends the passed element to the header. If no header is present, = one will be automatically created.=0A= * @method appendToHeader=0A= * @param {HTMLElement} element The element to append to the header=0A= */=0A= appendToHeader : function(element) {=0A= if (! this.header) {=0A= this.header =3D document.createElement("div");=0A= this.header.className =3D YAHOO.widget.Module.CSS_HEADER;=0A= }=0A= =0A= this.header.appendChild(element);=0A= this.changeHeaderEvent.fire(element);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Sets the Module's body content to the HTML specified, or appends the = passed element to the body. If no body is present, one will be = automatically created.=0A= * @method setBody=0A= * @param {String} bodyContent The HTML used to set the body OR=0A= * @param {HTMLElement} bodyContent The HTMLElement to append to the body=0A= */=0A= setBody : function(bodyContent) {=0A= if (! this.body) {=0A= this.body =3D document.createElement("div");=0A= this.body.className =3D YAHOO.widget.Module.CSS_BODY;=0A= }=0A= =0A= if (typeof bodyContent =3D=3D "string")=0A= {=0A= this.body.innerHTML =3D bodyContent;=0A= } else {=0A= this.body.innerHTML =3D "";=0A= this.body.appendChild(bodyContent);=0A= }=0A= =0A= this.changeBodyEvent.fire(bodyContent);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Appends the passed element to the body. If no body is present, one = will be automatically created.=0A= * @method appendToBody=0A= * @param {HTMLElement} element The element to append to the body=0A= */=0A= appendToBody : function(element) {=0A= if (! this.body) {=0A= this.body =3D document.createElement("div");=0A= this.body.className =3D YAHOO.widget.Module.CSS_BODY;=0A= }=0A= =0A= this.body.appendChild(element);=0A= this.changeBodyEvent.fire(element);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Sets the Module's footer content to the HTML specified, or appends = the passed element to the footer. If no footer is present, one will be = automatically created.=0A= * @method setFooter=0A= * @param {String} footerContent The HTML used to set the footer = OR=0A= * @param {HTMLElement} footerContent The HTMLElement to append to the = footer=0A= */=0A= setFooter : function(footerContent) {=0A= if (! this.footer) {=0A= this.footer =3D document.createElement("div");=0A= this.footer.className =3D YAHOO.widget.Module.CSS_FOOTER;=0A= }=0A= =0A= if (typeof footerContent =3D=3D "string") {=0A= this.footer.innerHTML =3D footerContent;=0A= } else {=0A= this.footer.innerHTML =3D "";=0A= this.footer.appendChild(footerContent);=0A= }=0A= =0A= this.changeFooterEvent.fire(footerContent);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Appends the passed element to the footer. If no footer is present, = one will be automatically created.=0A= * @method appendToFooter=0A= * @param {HTMLElement} element The element to append to the footer=0A= */=0A= appendToFooter : function(element) {=0A= if (! this.footer) {=0A= this.footer =3D document.createElement("div");=0A= this.footer.className =3D YAHOO.widget.Module.CSS_FOOTER;=0A= }=0A= =0A= this.footer.appendChild(element);=0A= this.changeFooterEvent.fire(element);=0A= this.changeContentEvent.fire();=0A= },=0A= =0A= /**=0A= * Renders the Module by inserting the elements that are not already in = the main Module into their correct places. Optionally appends the Module = to the specified node prior to the render's execution. NOTE: For Modules = without existing markup, the appendToNode argument is REQUIRED. If this = argument is ommitted and the current element is not present in the = document, the function will return false, indicating that the render was = a failure.=0A= * @method render=0A= * @param {String} appendToNode The element id to which the Module = should be appended to prior to rendering OR=0A= * @param {HTMLElement} appendToNode The element to which the Module = should be appended to prior to rendering=0A= * @param {HTMLElement} moduleElement OPTIONAL. The element that = represents the actual Standard Module container.=0A= * @return {Boolean} Success or failure of the render=0A= */=0A= render : function(appendToNode, moduleElement) {=0A= this.beforeRenderEvent.fire();=0A= =0A= if (! moduleElement) {=0A= moduleElement =3D this.element;=0A= }=0A= =0A= var me =3D this;=0A= var appendTo =3D function(element) {=0A= if (typeof element =3D=3D "string") {=0A= element =3D document.getElementById(element);=0A= }=0A= =0A= if (element) {=0A= element.appendChild(me.element);=0A= me.appendEvent.fire();=0A= }=0A= };=0A= =0A= if (appendToNode) {=0A= appendTo(appendToNode);=0A= } else { // No node was passed in. If the element is not pre-marked = up, this fails=0A= if (! YAHOO.util.Dom.inDocument(this.element)) {=0A= return false;=0A= }=0A= }=0A= =0A= // Need to get everything into the DOM if it isn't already=0A= =0A= if (this.header && ! YAHOO.util.Dom.inDocument(this.header)) {=0A= // There is a header, but it's not in the DOM yet... need to add it=0A= var firstChild =3D moduleElement.firstChild;=0A= if (firstChild) { // Insert before first child if exists=0A= moduleElement.insertBefore(this.header, firstChild);=0A= } else { // Append to empty body because there are no children=0A= moduleElement.appendChild(this.header);=0A= }=0A= }=0A= =0A= if (this.body && ! YAHOO.util.Dom.inDocument(this.body)) {=0A= // There is a body, but it's not in the DOM yet... need to add it=0A= if (this.footer && YAHOO.util.Dom.isAncestor(this.moduleElement, = this.footer)) { // Insert before footer if exists in DOM=0A= moduleElement.insertBefore(this.body, this.footer);=0A= } else { // Append to element because there is no footer=0A= moduleElement.appendChild(this.body);=0A= }=0A= }=0A= =0A= if (this.footer && ! YAHOO.util.Dom.inDocument(this.footer)) {=0A= // There is a footer, but it's not in the DOM yet... need to add it=0A= moduleElement.appendChild(this.footer);=0A= }=0A= =0A= this.renderEvent.fire();=0A= return true;=0A= },=0A= =0A= /**=0A= * Removes the Module element from the DOM and sets all child elements = to null.=0A= * @method destroy=0A= */=0A= destroy : function() {=0A= var parent;=0A= =0A= if (this.element) {=0A= YAHOO.util.Event.purgeElement(this.element, true);=0A= parent =3D this.element.parentNode;=0A= }=0A= if (parent) {=0A= parent.removeChild(this.element);=0A= }=0A= =0A= this.element =3D null;=0A= this.header =3D null;=0A= this.body =3D null;=0A= this.footer =3D null;=0A= =0A= for (var e in this) {=0A= if (e instanceof YAHOO.util.CustomEvent) {=0A= e.unsubscribeAll();=0A= }=0A= }=0A= =0A= YAHOO.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, = this);=0A= =0A= this.destroyEvent.fire();=0A= },=0A= =0A= /**=0A= * Shows the Module element by setting the visible configuration = property to true. Also fires two events: beforeShowEvent prior to the = visibility change, and showEvent after.=0A= * @method show=0A= */=0A= show : function() {=0A= this.cfg.setProperty("visible", true);=0A= },=0A= =0A= /**=0A= * Hides the Module element by setting the visible configuration = property to false. Also fires two events: beforeHideEvent prior to the = visibility change, and hideEvent after.=0A= * @method hide=0A= */=0A= hide : function() {=0A= this.cfg.setProperty("visible", false);=0A= },=0A= =0A= // BUILT-IN EVENT HANDLERS FOR MODULE //=0A= =0A= /**=0A= * Default event handler for changing the visibility property of a = Module. By default, this is achieved by switching the "display" style = between "block" and "none".=0A= * This method is responsible for firing showEvent and hideEvent.=0A= * @param {String} type The CustomEvent type (usually the property name)=0A= * @param {Object[]} args The CustomEvent arguments. For configuration = handlers, args[0] will equal the newly applied value for the property.=0A= * @param {Object} obj The scope object. For configuration handlers, = this will usually equal the owner.=0A= * @method configVisible=0A= */=0A= configVisible : function(type, args, obj) {=0A= var visible =3D args[0];=0A= if (visible) {=0A= this.beforeShowEvent.fire();=0A= YAHOO.util.Dom.setStyle(this.element, "display", "block");=0A= this.showEvent.fire();=0A= } else {=0A= this.beforeHideEvent.fire();=0A= YAHOO.util.Dom.setStyle(this.element, "display", "none");=0A= this.hideEvent.fire();=0A= }=0A= },=0A= =0A= /**=0A= * Default event handler for the "monitorresize" configuration property=0A= * @param {String} type The CustomEvent type (usually the property name)=0A= * @param {Object[]} args The CustomEvent arguments. For configuration = handlers, args[0] will equal the newly applied value for the property.=0A= * @param {Object} obj The scope object. For configuration handlers, = this will usually equal the owner.=0A= * @method configMonitorResize=0A= */=0A= configMonitorResize : function(type, args, obj) {=0A= var monitor =3D args[0];=0A= if (monitor) {=0A= this.initResizeMonitor();=0A= } else {=0A= YAHOO.widget.Module.textResizeEvent.unsubscribe(this.onDomResize, = this, true);=0A= this.resizeMonitor =3D null;=0A= }=0A= }=0A= };=0A= =0A= /**=0A= * Returns a String representation of the Object.=0A= * @method toString=0A= * @return {String} The string representation of the Module=0A= */=0A= YAHOO.widget.Module.prototype.toString =3D function() {=0A= return "Module " + this.id;=0A= };=0A= =0A= /**=0A= * Overlay is a Module that is absolutely positioned above the page flow. = It has convenience methods for positioning and sizing, as well as = options for controlling zIndex and constraining the Overlay's position = to the current visible viewport. Overlay also contains a dynamicly = generated IFRAME which is placed beneath it for Internet Explorer 6 and = 5.x so that it will be properly rendered above SELECT elements.=0A= * @namespace YAHOO.widget=0A= * @class Overlay=0A= * @extends YAHOO.widget.Module=0A= * @param {String} el The element ID representing the Overlay OR=0A= * @param {HTMLElement} el The element representing the Overlay=0A= * @param {Object} userConfig The configuration object literal containing = 10/23/2006the configuration that should be set for this Overlay. See = configuration documentation for more details.=0A= * @constructor=0A= */=0A= YAHOO.widget.Overlay =3D function(el, userConfig) {=0A= YAHOO.widget.Overlay.superclass.constructor.call(this, el, userConfig);=0A= };=0A= =0A= YAHOO.extend(YAHOO.widget.Overlay, YAHOO.widget.Module);=0A= =0A= /**=0A= * The URL that will be placed in the iframe=0A= * @property YAHOO.widget.Overlay.IFRAME_SRC=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.IFRAME_SRC =3D "javascript:false;";=0A= =0A= /**=0A= * Constant representing the top left corner of an element, used for = configuring the context element alignment=0A= * @property YAHOO.widget.Overlay.TOP_LEFT=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.TOP_LEFT =3D "tl";=0A= =0A= /**=0A= * Constant representing the top right corner of an element, used for = configuring the context element alignment=0A= * @property YAHOO.widget.Overlay.TOP_RIGHT=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.TOP_RIGHT =3D "tr";=0A= =0A= /**=0A= * Constant representing the top bottom left corner of an element, used = for configuring the context element alignment=0A= * @property YAHOO.widget.Overlay.BOTTOM_LEFT=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.BOTTOM_LEFT =3D "bl";=0A= =0A= /**=0A= * Constant representing the bottom right corner of an element, used for = configuring the context element alignment=0A= * @property YAHOO.widget.Overlay.BOTTOM_RIGHT=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.BOTTOM_RIGHT =3D "br";=0A= =0A= /**=0A= * Constant representing the default CSS class used for an Overlay=0A= * @property YAHOO.widget.Overlay.CSS_OVERLAY=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.Overlay.CSS_OVERLAY =3D "yui-overlay";=0A= =0A= /**=0A= * The Overlay initialization method, which is executed for Overlay and = all of its subclasses. This method is automatically called by the = constructor, and sets up all DOM references for pre-existing markup, = and creates required markup if it is not already present.=0A= * @method init=0A= * @param {String} el The element ID representing the Overlay OR=0A= * @param {HTMLElement} el The element representing the Overlay=0A= * @param {Object} userConfig The configuration object literal containing = the configuration that should be set for this Overlay. See configuration = documentation for more details.=0A= */=0A= YAHOO.widget.Overlay.prototype.init =3D function(el, userConfig) {=0A= YAHOO.widget.Overlay.superclass.init.call(this, el/*, userConfig*/); = // Note that we don't pass the user config in here yet because we only = want it executed once, at the lowest subclass level=0A= =0A= this.beforeInitEvent.fire(YAHOO.widget.Overlay);=0A= =0A= YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Overlay.CSS_OVERLAY);=0A= =0A= if (userConfig) {=0A= this.cfg.applyConfig(userConfig, true);=0A= }=0A= =0A= if (this.platform =3D=3D "mac" && this.browser =3D=3D "gecko") {=0A= if (! = YAHOO.util.Config.alreadySubscribed(this.showEvent,this.showMacGeckoScrol= lbars,this)) {=0A= this.showEvent.subscribe(this.showMacGeckoScrollbars,this,true);=0A= }=0A= if (! = YAHOO.util.Config.alreadySubscribed(this.hideEvent,this.hideMacGeckoScrol= lbars,this)) {=0A= this.hideEvent.subscribe(this.hideMacGeckoScrollbars,this,true);=0A= }=0A= }=0A= =0A= this.initEvent.fire(YAHOO.widget.Overlay);=0A= =0A= };=0A= =0A= /**=0A= * Initializes the custom events for Overlay which are fired = automatically at appropriate times by the Overlay class.=0A= * @method initEvents=0A= */=0A= YAHOO.widget.Overlay.prototype.initEvents =3D function() {=0A= YAHOO.widget.Overlay.superclass.initEvents.call(this);=0A= =0A= /**=0A= * CustomEvent fired before the Overlay is moved.=0A= * @event beforeMoveEvent=0A= * @param {Number} x x coordinate=0A= * @param {Number} y y coordinate=0A= */=0A= this.beforeMoveEvent =3D new YAHOO.util.CustomEvent("beforeMove", this);=0A= =0A= /**=0A= * CustomEvent fired after the Overlay is moved.=0A= * @event moveEvent=0A= * @param {Number} x x coordinate=0A= * @param {Number} y y coordinate=0A= */=0A= this.moveEvent =3D new YAHOO.util.CustomEvent("move", this);=0A= };=0A= =0A= /**=0A= * Initializes the class's configurable properties which can be changed = using the Overlay's Config object (cfg).=0A= * @method initDefaultConfig=0A= */=0A= YAHOO.widget.Overlay.prototype.initDefaultConfig =3D function() {=0A= YAHOO.widget.Overlay.superclass.initDefaultConfig.call(this);=0A= =0A= // Add overlay config properties //=0A= =0A= /**=0A= * The absolute x-coordinate position of the Overlay=0A= * @config x=0A= * @type Number=0A= * @default null=0A= */=0A= this.cfg.addProperty("x", { handler:this.configX, = validator:this.cfg.checkNumber, suppressEvent:true, = supercedes:["iframe"] } );=0A= =0A= /**=0A= * The absolute y-coordinate position of the Overlay=0A= * @config y=0A= * @type Number=0A= * @default null=0A= */=0A= this.cfg.addProperty("y", { handler:this.configY, = validator:this.cfg.checkNumber, suppressEvent:true, = supercedes:["iframe"] } );=0A= =0A= /**=0A= * An array with the absolute x and y positions of the Overlay=0A= * @config xy=0A= * @type Number[]=0A= * @default null=0A= */=0A= this.cfg.addProperty("xy",{ handler:this.configXY, suppressEvent:true, = supercedes:["iframe"] } );=0A= =0A= /**=0A= * The array of context arguments for context-sensitive positioning. The = format is: [id or element, element corner, context corner]. For example, = setting this property to ["img1", "tl", "bl"] would align the Overlay's = top left corner to the context element's bottom left corner.=0A= * @config context=0A= * @type Array=0A= * @default null=0A= */=0A= this.cfg.addProperty("context", { handler:this.configContext, = suppressEvent:true, supercedes:["iframe"] } );=0A= =0A= /**=0A= * True if the Overlay should be anchored to the center of the viewport.=0A= * @config fixedcenter=0A= * @type Boolean=0A= * @default false=0A= */=0A= this.cfg.addProperty("fixedcenter", { value:false, = handler:this.configFixedCenter, validator:this.cfg.checkBoolean, = supercedes:["iframe","visible"] } );=0A= =0A= /**=0A= * CSS width of the Overlay.=0A= * @config width=0A= * @type String=0A= * @default null=0A= */=0A= this.cfg.addProperty("width", { handler:this.configWidth, = suppressEvent:true, supercedes:["iframe"] } );=0A= =0A= /**=0A= * CSS height of the Overlay.=0A= * @config height=0A= * @type String=0A= * @default null=0A= */=0A= this.cfg.addProperty("height", { handler:this.configHeight, = suppressEvent:true, supercedes:["iframe"] } );=0A= =0A= /**=0A= * CSS z-index of the Overlay.=0A= * @config zIndex=0A= * @type Number=0A= * @default null=0A= */=0A= this.cfg.addProperty("zIndex", { value:null, handler:this.configzIndex = } );=0A= =0A= /**=0A= * True if the Overlay should be prevented from being positioned out of = the viewport.=0A= * @config constraintoviewport=0A= * @type Boolean=0A= * @default false=0A= */=0A= this.cfg.addProperty("constraintoviewport", { value:false, = handler:this.configConstrainToViewport, validator:this.cfg.checkBoolean, = supercedes:["iframe","x","y","xy"] } );=0A= =0A= /**=0A= * True if the Overlay should have an IFRAME shim (for correcting the = select z-index bug in IE6 and below).=0A= * @config iframe=0A= * @type Boolean=0A= * @default true for IE6 and below, false for all others=0A= */=0A= this.cfg.addProperty("iframe", { value:(this.browser =3D=3D "ie" ? true = : false), handler:this.configIframe, validator:this.cfg.checkBoolean, = supercedes:["zIndex"] } );=0A= };=0A= =0A= /**=0A= * Moves the Overlay to the specified position. This function is = identical to calling this.cfg.setProperty("xy", [x,y]);=0A= * @method moveTo=0A= * @param {Number} x The Overlay's new x position=0A= * @param {Number} y The Overlay's new y position=0A= */=0A= YAHOO.widget.Overlay.prototype.moveTo =3D function(x, y) {=0A= this.cfg.setProperty("xy",[x,y]);=0A= };=0A= =0A= /**=0A= * Adds a special CSS class to the Overlay when Mac/Gecko is in use, to = work around a Gecko bug where=0A= * scrollbars cannot be hidden. See = https://bugzilla.mozilla.org/show_bug.cgi?id=3D187435=0A= * @method hideMacGeckoScrollbars=0A= */=0A= YAHOO.widget.Overlay.prototype.hideMacGeckoScrollbars =3D function() {=0A= YAHOO.util.Dom.removeClass(this.element, "show-scrollbars");=0A= YAHOO.util.Dom.addClass(this.element, "hide-scrollbars");=0A= };=0A= =0A= /**=0A= * Removes a special CSS class from the Overlay when Mac/Gecko is in use, = to work around a Gecko bug where=0A= * scrollbars cannot be hidden. See = https://bugzilla.mozilla.org/show_bug.cgi?id=3D187435=0A= * @method showMacGeckoScrollbars=0A= */=0A= YAHOO.widget.Overlay.prototype.showMacGeckoScrollbars =3D function() {=0A= YAHOO.util.Dom.removeClass(this.element, "hide-scrollbars");=0A= YAHOO.util.Dom.addClass(this.element, "show-scrollbars");=0A= };=0A= =0A= // BEGIN BUILT-IN PROPERTY EVENT HANDLERS //=0A= =0A= /**=0A= * The default event handler fired when the "visible" property is = changed. This method is responsible for firing showEvent and hideEvent.=0A= * @method configVisible=0A= * @param {String} type The CustomEvent type (usually the property name)=0A= * @param {Object[]} args The CustomEvent arguments. For configuration = handlers, args[0] will equal the newly applied value for the property.=0A= * @param {Object} obj The scope object. For configuration handlers, this = will usually equal the owner.=0A= */=0A= YAHOO.widget.Overlay.prototype.configVisible =3D function(type, args, = obj) {=0A= var visible =3D args[0];=0A= var currentVis =3D YAHOO.util.Dom.getStyle(this.element, "visibility");=0A= =0A= if (currentVis =3D=3D "inherit") {=0A= var e =3D this.element.parentNode;=0A= while (e.nodeType !=3D 9 && e.nodeType !=3D 11) {=0A= currentVis =3D YAHOO.util.Dom.getStyle(e, "visibility");=0A= if (currentVis !=3D "inherit") { break; }=0A= e =3D e.parentNode;=0A= }=0A= if (currentVis =3D=3D "inherit") {=0A= currentVis =3D "visible";=0A= }=0A= }=0A= =0A= var effect =3D this.cfg.getProperty("effect");=0A= =0A= var effectInstances =3D [];=0A= if (effect) {=0A= if (effect instanceof Array) {=0A= for (var i=3D0;i rightConstraint) {=0A= x =3D rightConstraint;=0A= }=0A= =0A= if (y < topConstraint) {=0A= y =3D topConstraint;=0A= } else if (y > bottomConstraint) {=0A= y =3D bottomConstraint;=0A= }=0A= =0A= this.cfg.setProperty("x", x, true);=0A= this.cfg.setProperty("y", y, true);=0A= this.cfg.setProperty("xy", [x,y], true);=0A= };=0A= =0A= /**=0A= * Centers the container in the viewport.=0A= * @method center=0A= */=0A= YAHOO.widget.Overlay.prototype.center =3D function() {=0A= var scrollX =3D document.documentElement.scrollLeft || = document.body.scrollLeft;=0A= var scrollY =3D document.documentElement.scrollTop || = document.body.scrollTop;=0A= =0A= var viewPortWidth =3D YAHOO.util.Dom.getClientWidth();=0A= var viewPortHeight =3D YAHOO.util.Dom.getClientHeight();=0A= =0A= var elementWidth =3D this.element.offsetWidth;=0A= var elementHeight =3D this.element.offsetHeight;=0A= =0A= var x =3D (viewPortWidth / 2) - (elementWidth / 2) + scrollX;=0A= var y =3D (viewPortHeight / 2) - (elementHeight / 2) + scrollY;=0A= =0A= this.cfg.setProperty("xy", [parseInt(x, 10), parseInt(y, 10)]);=0A= =0A= this.cfg.refireEvent("iframe");=0A= };=0A= =0A= /**=0A= * Synchronizes the Panel's "xy", "x", and "y" properties with the = Panel's position in the DOM. This is primarily used to update position = information during drag & drop.=0A= * @method syncPosition=0A= */=0A= YAHOO.widget.Overlay.prototype.syncPosition =3D function() {=0A= var pos =3D YAHOO.util.Dom.getXY(this.element);=0A= this.cfg.setProperty("x", pos[0], true);=0A= this.cfg.setProperty("y", pos[1], true);=0A= this.cfg.setProperty("xy", pos, true);=0A= };=0A= =0A= /**=0A= * Event handler fired when the resize monitor element is resized.=0A= * @method onDomResize=0A= * @param {DOMEvent} e The resize DOM event=0A= * @param {Object} obj The scope object=0A= */=0A= YAHOO.widget.Overlay.prototype.onDomResize =3D function(e, obj) {=0A= YAHOO.widget.Overlay.superclass.onDomResize.call(this, e, obj);=0A= var me =3D this;=0A= setTimeout(function() {=0A= me.syncPosition();=0A= me.cfg.refireEvent("iframe");=0A= me.cfg.refireEvent("context");=0A= }, 0);=0A= };=0A= =0A= /**=0A= * Removes the Overlay element from the DOM and sets all child elements = to null.=0A= * @method destroy=0A= */=0A= YAHOO.widget.Overlay.prototype.destroy =3D function() {=0A= if (this.iframe) {=0A= this.iframe.parentNode.removeChild(this.iframe);=0A= }=0A= =0A= this.iframe =3D null;=0A= =0A= = YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.doCenterOnDOMEven= t, this);=0A= = YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEven= t, this);=0A= =0A= YAHOO.widget.Overlay.superclass.destroy.call(this);=0A= };=0A= =0A= /**=0A= * Returns a String representation of the object.=0A= * @method toString=0A= * @return {String} The string representation of the Overlay.=0A= */=0A= YAHOO.widget.Overlay.prototype.toString =3D function() {=0A= return "Overlay " + this.id;=0A= };=0A= =0A= /**=0A= * A singleton CustomEvent used for reacting to the DOM event for window = scroll=0A= * @event YAHOO.widget.Overlay.windowScrollEvent=0A= */=0A= YAHOO.widget.Overlay.windowScrollEvent =3D new = YAHOO.util.CustomEvent("windowScroll");=0A= =0A= /**=0A= * A singleton CustomEvent used for reacting to the DOM event for window = resize=0A= * @event YAHOO.widget.Overlay.windowResizeEvent=0A= */=0A= YAHOO.widget.Overlay.windowResizeEvent =3D new = YAHOO.util.CustomEvent("windowResize");=0A= =0A= /**=0A= * The DOM event handler used to fire the CustomEvent for window scroll=0A= * @method YAHOO.widget.Overlay.windowScrollHandler=0A= * @static=0A= * @param {DOMEvent} e The DOM scroll event=0A= */=0A= YAHOO.widget.Overlay.windowScrollHandler =3D function(e) {=0A= if (YAHOO.widget.Module.prototype.browser =3D=3D "ie" || = YAHOO.widget.Module.prototype.browser =3D=3D "ie7") {=0A= if (! window.scrollEnd) {=0A= window.scrollEnd =3D -1;=0A= }=0A= clearTimeout(window.scrollEnd);=0A= window.scrollEnd =3D setTimeout(function() { = YAHOO.widget.Overlay.windowScrollEvent.fire(); }, 1);=0A= } else {=0A= YAHOO.widget.Overlay.windowScrollEvent.fire();=0A= }=0A= };=0A= =0A= /**=0A= * The DOM event handler used to fire the CustomEvent for window resize=0A= * @method YAHOO.widget.Overlay.windowResizeHandler=0A= * @static=0A= * @param {DOMEvent} e The DOM resize event=0A= */=0A= YAHOO.widget.Overlay.windowResizeHandler =3D function(e) {=0A= if (YAHOO.widget.Module.prototype.browser =3D=3D "ie" || = YAHOO.widget.Module.prototype.browser =3D=3D "ie7") {=0A= if (! window.resizeEnd) {=0A= window.resizeEnd =3D -1;=0A= }=0A= clearTimeout(window.resizeEnd);=0A= window.resizeEnd =3D setTimeout(function() { = YAHOO.widget.Overlay.windowResizeEvent.fire(); }, 100);=0A= } else {=0A= YAHOO.widget.Overlay.windowResizeEvent.fire();=0A= }=0A= };=0A= =0A= /**=0A= * A boolean that indicated whether the window resize and scroll events = have already been subscribed to.=0A= * @property YAHOO.widget.Overlay._initialized=0A= * @private=0A= * @type Boolean=0A= */=0A= YAHOO.widget.Overlay._initialized =3D null;=0A= =0A= if (YAHOO.widget.Overlay._initialized =3D=3D=3D null) {=0A= YAHOO.util.Event.addListener(window, "scroll", = YAHOO.widget.Overlay.windowScrollHandler);=0A= YAHOO.util.Event.addListener(window, "resize", = YAHOO.widget.Overlay.windowResizeHandler);=0A= =0A= YAHOO.widget.Overlay._initialized =3D true;=0A= }=0A= =0A= /**=0A= * OverlayManager is used for maintaining the focus status of multiple = Overlays.* @namespace YAHOO.widget=0A= * @namespace YAHOO.widget=0A= * @class OverlayManager=0A= * @constructor=0A= * @param {Array} overlays Optional. A collection of Overlays to register = with the manager.=0A= * @param {Object} userConfig The object literal representing the user = configuration of the OverlayManager=0A= */=0A= YAHOO.widget.OverlayManager =3D function(userConfig) {=0A= this.init(userConfig);=0A= };=0A= =0A= /**=0A= * The CSS class representing a focused Overlay=0A= * @property YAHOO.widget.OverlayManager.CSS_FOCUSED=0A= * @static=0A= * @final=0A= * @type String=0A= */=0A= YAHOO.widget.OverlayManager.CSS_FOCUSED =3D "focused";=0A= =0A= YAHOO.widget.OverlayManager.prototype =3D {=0A= /**=0A= * The class's constructor function=0A= * @property contructor=0A= * @type Function=0A= */=0A= constructor : YAHOO.widget.OverlayManager,=0A= =0A= /**=0A= * The array of Overlays that are currently registered=0A= * @property overlays=0A= * @type YAHOO.widget.Overlay[]=0A= */=0A= overlays : null,=0A= =0A= /**=0A= * Initializes the default configuration of the OverlayManager=0A= * @method initDefaultConfig=0A= */=0A= initDefaultConfig : function() {=0A= /**=0A= * The collection of registered Overlays in use by the OverlayManager=0A= * @config overlays=0A= * @type YAHOO.widget.Overlay[]=0A= * @default null=0A= */=0A= this.cfg.addProperty("overlays", { suppressEvent:true } );=0A= =0A= /**=0A= * The default DOM event that should be used to focus an Overlay=0A= * @config focusevent=0A= * @type String=0A= * @default "mousedown"=0A= */=0A= this.cfg.addProperty("focusevent", { value:"mousedown" } );=0A= },=0A= =0A= /**=0A= * Initializes the OverlayManager=0A= * @method init=0A= * @param {YAHOO.widget.Overlay[]} overlays Optional. A collection of = Overlays to register with the manager.=0A= * @param {Object} userConfig The object literal representing the user = configuration of the OverlayManager=0A= */=0A= init : function(userConfig) {=0A= /**=0A= * The OverlayManager's Config object used for monitoring configuration = properties.=0A= * @property cfg=0A= * @type YAHOO.util.Config=0A= */=0A= this.cfg =3D new YAHOO.util.Config(this);=0A= =0A= this.initDefaultConfig();=0A= =0A= if (userConfig) {=0A= this.cfg.applyConfig(userConfig, true);=0A= }=0A= this.cfg.fireQueue();=0A= =0A= /**=0A= * The currently activated Overlay=0A= * @property activeOverlay=0A= * @private=0A= * @type YAHOO.widget.Overlay=0A= */=0A= var activeOverlay =3D null;=0A= =0A= /**=0A= * Returns the currently focused Overlay=0A= * @method getActive=0A= * @return {YAHOO.widget.Overlay} The currently focused Overlay=0A= */=0A= this.getActive =3D function() {=0A= return activeOverlay;=0A= };=0A= =0A= /**=0A= * Focuses the specified Overlay=0A= * @method focus=0A= * @param {YAHOO.widget.Overlay} overlay The Overlay to focus=0A= * @param {String} overlay The id of the Overlay to focus=0A= */=0A= this.focus =3D function(overlay) {=0A= var o =3D this.find(overlay);=0A= if (o) {=0A= this.blurAll();=0A= activeOverlay =3D o;=0A= YAHOO.util.Dom.addClass(activeOverlay.element, = YAHOO.widget.OverlayManager.CSS_FOCUSED);=0A= this.overlays.sort(this.compareZIndexDesc);=0A= var topZIndex =3D YAHOO.util.Dom.getStyle(this.overlays[0].element, = "zIndex");=0A= if (! isNaN(topZIndex) && this.overlays[0] !=3D overlay) {=0A= activeOverlay.cfg.setProperty("zIndex", (parseInt(topZIndex, 10) + = 2));=0A= }=0A= this.overlays.sort(this.compareZIndexDesc);=0A= }=0A= };=0A= =0A= /**=0A= * Removes the specified Overlay from the manager=0A= * @method remove=0A= * @param {YAHOO.widget.Overlay} overlay The Overlay to remove=0A= * @param {String} overlay The id of the Overlay to remove=0A= */=0A= this.remove =3D function(overlay) {=0A= var o =3D this.find(overlay);=0A= if (o) {=0A= var originalZ =3D YAHOO.util.Dom.getStyle(o.element, "zIndex");=0A= o.cfg.setProperty("zIndex", -1000, true);=0A= this.overlays.sort(this.compareZIndexDesc);=0A= this.overlays =3D this.overlays.slice(0, this.overlays.length-1);=0A= o.cfg.setProperty("zIndex", originalZ, true);=0A= =0A= o.cfg.setProperty("manager", null);=0A= o.focusEvent =3D null;=0A= o.blurEvent =3D null;=0A= o.focus =3D null;=0A= o.blur =3D null;=0A= }=0A= };=0A= =0A= /**=0A= * Removes focus from all registered Overlays in the manager=0A= * @method blurAll=0A= */=0A= this.blurAll =3D function() {=0A= activeOverlay =3D null;=0A= for (var o=3D0;o 0) {=0A= return true;=0A= }=0A= } else {=0A= return false;=0A= }=0A= },=0A= =0A= /**=0A= * Attempts to locate an Overlay by instance or ID.=0A= * @method find=0A= * @param {YAHOO.widget.Overlay} overlay An Overlay to locate within = the manager=0A= * @param {String} overlay An Overlay id to locate within the manager=0A= * @return {YAHOO.widget.Overlay} The requested Overlay, if found, or = null if it cannot be located.=0A= */=0A= find : function(overlay) {=0A= if (overlay instanceof YAHOO.widget.Overlay) {=0A= for (var o=3D0;o zIndex2) {=0A= return -1;=0A= } else if (zIndex1 < zIndex2) {=0A= return 1;=0A= } else {=0A= return 0;=0A= }=0A= },=0A= =0A= /**=0A= * Shows all Overlays in the manager.=0A= * @method showAll=0A= */=0A= showAll : function() {=0A= for (var o=3D0;oYAHOO.util.Easing =0A= * method.=0A= */=0A= this.cfg.addProperty("animationMethod", { =0A= value: YAHOO.util.Easing.easeOut,=0A= handler: function(type, args, carouselElem) {=0A= oThis.animationMethod =3D args[0];=0A= }=0A= } );=0A= =0A= /**=0A= * animationCompleteHandler property. =0A= * JavaScript function that is called when the Carousel finishes = animation =0A= * after a next or previous nagivation. =0A= * Only invoked if animationSpeed > 0. =0A= * Two parameters are passed: type (set to 'onAnimationComplete') and =0A= * args array (args[0] =3D direction [either: 'next' or 'previous']).=0A= */=0A= this.cfg.addProperty("animationCompleteHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.animationCompleteEvt) {=0A= = oThis.animationCompleteEvt.unsubscribe(oThis.animationCompleteHandler, = oThis);=0A= }=0A= oThis.animationCompleteHandler =3D args[0];=0A= if(oThis._isValidObj(oThis.animationCompleteHandler)) {=0A= oThis.animationCompleteEvt =3D new = YAHOO.util.CustomEvent("onAnimationComplete", oThis);=0A= = oThis.animationCompleteEvt.subscribe(oThis.animationCompleteHandler, = oThis);=0A= }=0A= }=0A= } );=0A= =0A= /**=0A= * autoPlay property. =0A= * Specifies how many milliseconds to periodically auto scroll the = content. =0A= * If set to 0 (default) then autoPlay is turned off. =0A= * If the user interacts by clicking left or right navigation, = autoPlay is turned off. =0A= * You can restart autoPlay by calling the startAutoPlay(). =0A= * If you externally control navigation (with your own event handlers) =0A= * then you may want to turn off the autoPlay by = callingstopAutoPlay()=0A= */=0A= this.cfg.addProperty("autoPlay", { =0A= value:0,=0A= handler: function(type, args, carouselElem) {=0A= oThis.autoPlay =3D args[0];=0A= if(oThis.autoPlay > 0)=0A= oThis.startAutoPlay();=0A= else=0A= oThis.stopAutoPlay();=0A= }=0A= } );=0A= =0A= /**=0A= * wrap property. =0A= * Specifies whether to wrap when at the end of scrolled content. When = the end is reached,=0A= * the carousel will scroll backwards to the item 1 (the = animationSpeed parameter is used to =0A= * determine how quickly it should animate back to the start.)=0A= * Ignored if the size attribute is not explicitly set =0A= * (i.e., value equals YAHOO.extension.Carousel.UNBOUNDED_SIZE)=0A= */=0A= this.cfg.addProperty("wrap", { =0A= value:false,=0A= handler: function(type, args, carouselElem) {=0A= oThis.wrap =3D args[0];=0A= },=0A= validator: oThis.cfg.checkBoolean=0A= } );=0A= =0A= /**=0A= * navMargin property. =0A= * The margin space for the navigation controls. This is only useful = for horizontal carousels =0A= * in which you have embedded navigation controls. =0A= * The navMargin allocates space between the left and right = margins =0A= * (each navMargin wide) giving space for the navigation controls.=0A= */=0A= this.cfg.addProperty("navMargin", { =0A= value:0,=0A= handler: function(type, args, carouselElem) {=0A= oThis.navMargin =3D args[0];=0A= },=0A= validator: oThis.cfg.checkNumber=0A= } );=0A= =0A= // For backward compatibility. Deprecated.=0A= this.cfg.addProperty("prevElementID", { =0A= value: null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.carouselPrev) {=0A= YAHOO.util.Event.removeListener(oThis.carouselPrev, "click", = oThis._scrollPrev);=0A= } =0A= oThis.prevElementID =3D args[0];=0A= if(oThis.prevElementID =3D=3D null) {=0A= oThis.carouselPrev =3D = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, =0A= "div", oThis.carouselElem)[0];=0A= } else {=0A= oThis.carouselPrev =3D YAHOO.util.Dom.get(oThis.prevElementID);=0A= }=0A= YAHOO.util.Event.addListener(oThis.carouselPrev, "click", = oThis._scrollPrev, oThis);=0A= }=0A= });=0A= =0A= /**=0A= * prevElement property. =0A= * An element or elements that will provide the previous navigation = control.=0A= * prevElement may be a single element or an array of elements. The = values may be strings denoting=0A= * the ID of the element or the object itself.=0A= * If supplied, then events are wired to this control to fire scroll = events to move the carousel to=0A= * the previous content. =0A= * You may want to provide your own interaction for controlling the = carousel. If=0A= * so leave this unset and provide your own event handling mechanism.=0A= */=0A= this.cfg.addProperty("prevElement", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.carouselPrev) {=0A= YAHOO.util.Event.removeListener(oThis.carouselPrev, "click", = oThis._scrollPrev);=0A= } =0A= oThis.prevElementID =3D args[0];=0A= if(oThis.prevElementID =3D=3D null) {=0A= oThis.carouselPrev =3D = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, =0A= "div", oThis.carouselElem)[0];=0A= } else {=0A= oThis.carouselPrev =3D YAHOO.util.Dom.get(oThis.prevElementID);=0A= }=0A= YAHOO.util.Event.addListener(oThis.carouselPrev, "click", = oThis._scrollPrev, oThis);=0A= }=0A= } );=0A= =0A= // For backward compatibility. Deprecated.=0A= this.cfg.addProperty("nextElementID", { =0A= value: null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.carouselNext) {=0A= YAHOO.util.Event.removeListener(oThis.carouselNext, "click", = oThis._scrollNext);=0A= } =0A= oThis.nextElementID =3D args[0];=0A= if(oThis.nextElementID =3D=3D null) {=0A= oThis.carouselNext =3D = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, =0A= "div", oThis.carouselElem);=0A= } else {=0A= oThis.carouselNext =3D YAHOO.util.Dom.get(oThis.nextElementID);=0A= }=0A= if(oThis.carouselNext) {=0A= YAHOO.util.Event.addListener(oThis.carouselNext, "click", = oThis._scrollNext, oThis);=0A= } =0A= }=0A= });=0A= =0A= /**=0A= * nextElement property. =0A= * An element or elements that will provide the next navigation = control.=0A= * nextElement may be a single element or an array of elements. The = values may be strings denoting=0A= * the ID of the element or the object itself.=0A= * If supplied, then events are wired to this control to fire scroll = events to move the carousel to=0A= * the next content. =0A= * You may want to provide your own interaction for controlling the = carousel. If=0A= * so leave this unset and provide your own event handling mechanism.=0A= */=0A= this.cfg.addProperty("nextElement", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.carouselNext) {=0A= YAHOO.util.Event.removeListener(oThis.carouselNext, "click", = oThis._scrollNext);=0A= } =0A= oThis.nextElementID =3D args[0];=0A= if(oThis.nextElementID =3D=3D null) {=0A= oThis.carouselNext =3D = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, =0A= "div", oThis.carouselElem);=0A= } else {=0A= oThis.carouselNext =3D YAHOO.util.Dom.get(oThis.nextElementID);=0A= }=0A= if(oThis.carouselNext) {=0A= YAHOO.util.Event.addListener(oThis.carouselNext, "click", = oThis._scrollNext, oThis);=0A= } =0A= }=0A= } );=0A= =0A= /**=0A= * loadInitHandler property. =0A= * JavaScript function that is called when the Carousel needs to load =0A= * the initial set of visible items. Two parameters are passed: =0A= * type (set to 'onLoadInit') and an argument array (args[0] =3D start = index, args[1] =3D last index).=0A= */=0A= this.cfg.addProperty("loadInitHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.loadInitHandlerEvt) {=0A= oThis.loadInitHandlerEvt.unsubscribe(oThis.loadInitHandler, oThis);=0A= }=0A= oThis.loadInitHandler =3D args[0];=0A= if(oThis.loadInitHandlerEvt) {=0A= oThis.loadInitHandlerEvt =3D new = YAHOO.util.CustomEvent("onLoadInit", oThis);=0A= oThis.loadInitHandlerEvt.subscribe(oThis.loadInitHandler, oThis);=0A= }=0A= }=0A= } );=0A= =0A= /**=0A= * loadNextHandler property. =0A= * JavaScript function that is called when the Carousel needs to load =0A= * the next set of items (in response to the user navigating to the = next set.) =0A= * Two parameters are passed: type (set to 'onLoadNext') and =0A= * args array (args[0] =3D start index, args[1] =3D last index).=0A= */=0A= this.cfg.addProperty("loadNextHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.loadNextHandlerEvt) {=0A= oThis.loadNextHandlerEvt.unsubscribe(oThis.loadNextHandler, oThis);=0A= }=0A= oThis.loadNextHandler =3D args[0];=0A= if(oThis.loadNextHandlerEvt) {=0A= oThis.loadNextHandlerEvt =3D new = YAHOO.util.CustomEvent("onLoadNext", oThis);=0A= oThis.loadNextHandlerEvt.subscribe(oThis.loadNextHandler, oThis);=0A= }=0A= }=0A= } );=0A= =0A= /**=0A= * loadPrevHandler property. =0A= * JavaScript function that is called when the Carousel needs to load =0A= * the previous set of items (in response to the user navigating to = the previous set.) =0A= * Two parameters are passed: type (set to 'onLoadPrev') and args = array =0A= * (args[0] =3D start index, args[1] =3D last index).=0A= */=0A= this.cfg.addProperty("loadPrevHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.loadPrevHandlerEvt) {=0A= oThis.loadPrevHandlerEvt.unsubscribe(oThis.loadPrevHandler, oThis);=0A= }=0A= oThis.loadPrevHandler =3D args[0];=0A= if(oThis.loadPrevHandlerEvt) {=0A= oThis.loadPrevHandlerEvt =3D new = YAHOO.util.CustomEvent("onLoadPrev", oThis);=0A= oThis.loadPrevHandlerEvt.subscribe(oThis.loadPrevHandler, oThis);=0A= }=0A= }=0A= } );=0A= =0A= /**=0A= * prevButtonStateHandler property. =0A= * JavaScript function that is called when the enabled state of the =0A= * 'previous' control is changing. The responsibility of =0A= * this method is to enable or disable the 'previous' control. =0A= * Two parameters are passed to this method: type =0A= * (which is set to "onPrevButtonStateChange") and args, =0A= * an array that contains two values. =0A= * The parameter args[0] is a flag denoting whether the 'previous' = control =0A= * is being enabled or disabled. The parameter args[1] is the element = object =0A= * derived from the prevElement parameter.=0A= * If you do not supply a prevElement then you will need to track=0A= * the elements that you would want to enable/disable while handling = the state change.=0A= */=0A= this.cfg.addProperty("prevButtonStateHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.prevButtonStateHandler) {=0A= = oThis.prevButtonStateHandlerEvt.unsubscribe(oThis.prevButtonStateHandler,= oThis);=0A= }=0A= oThis.prevButtonStateHandler =3D args[0];=0A= if(oThis.prevButtonStateHandler) {=0A= oThis.prevButtonStateHandlerEvt =3D new = YAHOO.util.CustomEvent("onPrevButtonStateChange", oThis);=0A= = oThis.prevButtonStateHandlerEvt.subscribe(oThis.prevButtonStateHandler, = oThis);=0A= }=0A= }=0A= } );=0A= =0A= /**=0A= * nextButtonStateHandler property. =0A= * JavaScript function that is called when the enabled state of the =0A= * 'next' control is changing. The responsibility of =0A= * this method is to enable or disable the 'next' control. =0A= * Two parameters are passed to this method: type =0A= * (which is set to "onNextButtonStateChange") and args, =0A= * an array that contains two values. =0A= * The parameter args[0] is a flag denoting whether the 'next' control =0A= * is being enabled or disabled. The parameter args[1] is the element = object =0A= * derived from the nextElement parameter.=0A= * If you do not supply a nextElement then you will need to track=0A= * the elements that you would want to enable/disable while handling = the state change.=0A= */=0A= this.cfg.addProperty("nextButtonStateHandler", { =0A= value:null,=0A= handler: function(type, args, carouselElem) {=0A= if(oThis.nextButtonStateHandler) {=0A= = oThis.nextButtonStateHandlerEvt.unsubscribe(oThis.nextButtonStateHandler,= oThis);=0A= }=0A= oThis.nextButtonStateHandler =3D args[0];=0A= if(oThis.nextButtonStateHandler) {=0A= oThis.nextButtonStateHandlerEvt =3D new = YAHOO.util.CustomEvent("onNextButtonStateChange", oThis);=0A= = oThis.nextButtonStateHandlerEvt.subscribe(oThis.nextButtonStateHandler, = oThis);=0A= }=0A= }=0A= } );=0A= =0A= =0A= if(carouselCfg) {=0A= this.cfg.applyConfig(carouselCfg);=0A= }=0A= =0A= this.scrollInc =3D this.cfg.getProperty("scrollInc");=0A= this.navMargin =3D this.cfg.getProperty("navMargin");=0A= this.loadInitHandler =3D this.cfg.getProperty("loadInitHandler");=0A= this.loadNextHandler =3D this.cfg.getProperty("loadNextHandler");=0A= this.loadPrevHandler =3D this.cfg.getProperty("loadPrevHandler");=0A= this.prevButtonStateHandler =3D = this.cfg.getProperty("prevButtonStateHandler");=0A= this.nextButtonStateHandler =3D = this.cfg.getProperty("nextButtonStateHandler");=0A= this.animationCompleteHandler =3D = this.cfg.getProperty("animationCompleteHandler");=0A= this.size =3D this.cfg.getProperty("size");=0A= this.wrap =3D this.cfg.getProperty("wrap");=0A= this.animationMethod =3D this.cfg.getProperty("animationMethod");=0A= this.orientation =3D this.cfg.getProperty("orientation");=0A= this.nextElementID =3D this.cfg.getProperty("nextElementID");=0A= if(!this.nextElementID) =0A= this.nextElementID =3D this.cfg.getProperty("nextElement");=0A= =0A= this.prevElementID =3D this.cfg.getProperty("prevElementID");=0A= if(!this.prevElementID) =0A= this.prevElementID =3D this.cfg.getProperty("prevElement");=0A= =0A= this.autoPlay =3D this.cfg.getProperty("autoPlay");=0A= this.autoPlayTimer =3D null;=0A= this.numVisible =3D this.cfg.getProperty("numVisible");=0A= this.firstVisible =3D this.cfg.getProperty("firstVisible");=0A= this.lastVisible =3D this.firstVisible;=0A= this.lastPrebuiltIdx =3D 0;=0A= this.currSize =3D 0;=0A= =0A= // prefetch elements=0A= this.carouselList =3D = YAHOO.util.Dom.getElementsByClassName(carouselListClass, =0A= "ul", this.carouselElem)[0];=0A= =0A= if(this.nextElementID =3D=3D null) {=0A= this.carouselNext =3D = YAHOO.util.Dom.getElementsByClassName(carouselNextClass, =0A= "div", this.carouselElem)[0];=0A= } else {=0A= this.carouselNext =3D YAHOO.util.Dom.get(this.nextElementID);=0A= }=0A= =0A= if(this.prevElementID =3D=3D null) {=0A= this.carouselPrev =3D = YAHOO.util.Dom.getElementsByClassName(carouselPrevClass, =0A= "div", this.carouselElem)[0];=0A= } else {=0A= this.carouselPrev =3D YAHOO.util.Dom.get(this.prevElementID);=0A= }=0A= =0A= this.clipReg =3D = YAHOO.util.Dom.getElementsByClassName(carouselClipRegionClass, =0A= "div", this.carouselElem)[0];=0A= =0A= // add a style class dynamically so that the correct styles get = applied for a vertical carousel=0A= if(this.isVertical()) {=0A= YAHOO.util.Dom.addClass(this.carouselList, "carousel-vertical");=0A= }=0A= =0A= // initialize the animation objects for next/previous=0A= this.scrollNextAnim =3D new YAHOO.util.Motion(this.carouselList, = this.scrollNextParams, =0A= this.cfg.getProperty("animationSpeed"), this.animationMethod);=0A= this.scrollPrevAnim =3D new YAHOO.util.Motion(this.carouselList, = this.scrollPrevParams, =0A= this.cfg.getProperty("animationSpeed"), this.animationMethod);=0A= =0A= // If they supplied a nextElementID then wire an event listener for = the click=0A= if(this.carouselNext) {=0A= YAHOO.util.Event.addListener(this.carouselNext, "click", = this._scrollNext, this);=0A= } =0A= =0A= // If they supplied a prevElementID then wire an event listener for = the click=0A= if(this.carouselPrev) {=0A= YAHOO.util.Event.addListener(this.carouselPrev, "click", = this._scrollPrev, this);=0A= }=0A= =0A= // Wire up the various event handlers that they might have supplied=0A= if(this.loadInitHandler) {=0A= this.loadInitHandlerEvt =3D new YAHOO.util.CustomEvent("onLoadInit", = this);=0A= this.loadInitHandlerEvt.subscribe(this.loadInitHandler, this);=0A= }=0A= if(this.loadNextHandler) {=0A= this.loadNextHandlerEvt =3D new YAHOO.util.CustomEvent("onLoadNext", = this);=0A= this.loadNextHandlerEvt.subscribe(this.loadNextHandler, this);=0A= }=0A= if(this.loadPrevHandler) {=0A= this.loadPrevHandlerEvt =3D new YAHOO.util.CustomEvent("onLoadPrev", = this);=0A= this.loadPrevHandlerEvt.subscribe(this.loadPrevHandler, this);=0A= }=0A= if(this.animationCompleteHandler) {=0A= this.animationCompleteEvt =3D new = YAHOO.util.CustomEvent("onAnimationComplete", this);=0A= this.animationCompleteEvt.subscribe(this.animationCompleteHandler, = this);=0A= }=0A= if(this.prevButtonStateHandler) {=0A= this.prevButtonStateHandlerEvt =3D new = YAHOO.util.CustomEvent("onPrevButtonStateChange", =0A= this);=0A= this.prevButtonStateHandlerEvt.subscribe(this.prevButtonStateHandler, = this);=0A= }=0A= if(this.nextButtonStateHandler) {=0A= this.nextButtonStateHandlerEvt =3D new = YAHOO.util.CustomEvent("onNextButtonStateChange", this);=0A= this.nextButtonStateHandlerEvt.subscribe(this.nextButtonStateHandler, = this);=0A= }=0A= =0A= // Since loading may take some time, wire up a listener to fire when = at least the first=0A= // element actually gets loaded=0A= YAHOO.util.Event.onAvailable(this.carouselElemID + "-item-1", = this._calculateSize, this);=0A= =0A= // Call the initial loading sequence=0A= this._loadInitial(); =0A= =0A= },=0A= =0A= // /////////////////// Public API = //////////////////////////////////////////=0A= =0A= /**=0A= * Clears all items from the list and resets to the carousel to its = original initial state.=0A= */=0A= clear: function() {=0A= this.moveTo(1);=0A= this._removeChildrenFromNode(this.carouselList);=0A= this.stopAutoPlay();=0A= this.firstVisible =3D 1;=0A= this.lastVisible =3D 1;=0A= this.lastPrebuiltIdx =3D 0;=0A= this.currSize =3D 0;=0A= this.size =3D this.cfg.getProperty("size");=0A= },=0A= =0A= /**=0A= * Clears all items from the list and calls the loadInitHandler to load = new items into the list. =0A= * The carousel size is reset to the original size set during creation.=0A= * @param {number} numVisible Optional parameter: numVisible. =0A= * If set, the carousel will resize on the reload to show numVisible = items.=0A= */=0A= reload: function(numVisible) {=0A= // this should be deprecated, not needed since can be set via property = change=0A= if(this._isValidObj(numVisible)) {=0A= this.numVisible =3D numVisible;=0A= }=0A= this.clear();=0A= YAHOO.util.Event.onAvailable(this.carouselElemID + "-item-1", = this._calculateSize, this); =0A= this._loadInitial();=0A= },=0A= =0A= load: function() {=0A= YAHOO.util.Event.onAvailable(this.carouselElemID + "-item-1", = this._calculateSize, this); =0A= this._loadInitial();=0A= },=0A= =0A= /**=0A= * Clears all items from the list and calls the loadInitHandler to load = new items into the list. =0A= * The carousel size is reset to the original size set during creation.=0A= * With patch from Dan Hobbs for handling unordered loading.=0A= * @param {number} idx which item in the list to potentially create. =0A= * If item already exists it will not create a new item.=0A= * @param {string} innerHTML The innerHTML string to use to create the = contents of an LI element.=0A= */=0A= addItem: function(idx, innerHTMLOrElem) {=0A= =0A= var liElem =3D this.getCarouselItem(idx);=0A= =0A= // Need to create the li=0A= if(!this._isValidObj(liElem)) {=0A= liElem =3D this._createItem(idx, innerHTMLOrElem);=0A= this.carouselList.appendChild(liElem);=0A= =0A= } else if(this._isValidObj(liElem.placeholder)) { =0A= var newLiElem =3D this._createItem(idx, innerHTMLOrElem);=0A= //var oldLiElem =3D this.carouselList.getElementsByTagName("li")[idx = - 1];=0A= this.carouselList.replaceChild(newLiElem, liElem);=0A= }=0A= if(this.isVertical()) {=0A= YAHOO.util.Dom.setStyle(liElem, "height", liElem.offsetHeight + "px");=0A= }=0A= =0A= return liElem;=0A= =0A= },=0A= =0A= /**=0A= * Inserts a new LI item before the index specified. Uses the innerHTML = to create the contents of the new LI item=0A= * @param {number} refIdx which item in the list to insert this item = before. =0A= * @param {string} innerHTML The innerHTML string to use to create the = contents of an LI element.=0A= */=0A= insertBefore: function(refIdx, innerHTML) {=0A= if(refIdx < 1) {=0A= refIdx =3D 1;=0A= }=0A= =0A= var insertionIdx =3D refIdx - 1;=0A= =0A= if(insertionIdx > this.lastPrebuiltIdx) {=0A= this._prebuildItems(this.lastPrebuiltIdx, refIdx); // is this right?=0A= }=0A= =0A= var liElem =3D this._insertBeforeItem(refIdx, innerHTML);=0A= =0A= // depends on recalculation of this.size above=0A= if(this.firstVisible > insertionIdx || this.lastVisible < this.size) {=0A= if(this.nextEnabled =3D=3D=3D false) {=0A= this._enableNext();=0A= }=0A= }=0A= =0A= return liElem;=0A= },=0A= =0A= /**=0A= * Inserts a new LI item after the index specified. Uses the innerHTML = to create the contents of the new LI item=0A= * @param {number} refIdx which item in the list to insert this item = after. =0A= * @param {string} innerHTML The innerHTML string to use to create the = contents of an LI element.=0A= */=0A= insertAfter: function(refIdx, innerHTML) {=0A= =0A= if(refIdx > this.size) {=0A= refIdx =3D this.size;=0A= }=0A= =0A= var insertionIdx =3D refIdx + 1; =0A= =0A= // if we are inserting this item past where we have prebuilt items, = then=0A= // prebuild up to this point.=0A= if(insertionIdx > this.lastPrebuiltIdx) {=0A= this._prebuildItems(this.lastPrebuiltIdx, insertionIdx+1);=0A= }=0A= =0A= var liElem =3D this._insertAfterItem(refIdx, innerHTML); =0A= =0A= if(insertionIdx > this.size) {=0A= this.size =3D insertionIdx;=0A= if(this.nextEnabled =3D=3D=3D false) {=0A= this._enableNext();=0A= }=0A= }=0A= =0A= // depends on recalculation of this.size above=0A= if(this.firstVisible > insertionIdx || this.lastVisible < this.size) {=0A= if(this.nextEnabled =3D=3D=3D false) {=0A= this._enableNext();=0A= }=0A= }=0A= =0A= return liElem;=0A= }, =0A= =0A= /**=0A= * Simulates a next button event. Causes the carousel to scroll the = next set of content into view.=0A= */=0A= scrollNext: function() {=0A= this._scrollNext(null, this);=0A= =0A= // we know the timer has expired.=0A= //if(this.autoPlayTimer) clearTimeout(this.autoPlayTimer);=0A= this.autoPlayTimer =3D null;=0A= if(this.autoPlay !=3D=3D 0) {=0A= this.autoPlayTimer =3D this.startAutoPlay();=0A= }=0A= },=0A= =0A= /**=0A= * Simulates a prev button event. Causes the carousel to scroll the = previous set of content into view.=0A= */=0A= scrollPrev: function() {=0A= this._scrollPrev(null, this);=0A= },=0A= =0A= /**=0A= * Scrolls the content to place itemNum as the start item in the view =0A= * (if size is specified, the last element will not scroll past the = end.). =0A= * Uses current animation speed & method.=0A= * @param {number} newStart The item to scroll to. =0A= */=0A= scrollTo: function(newStart) {=0A= this._position(newStart, true);=0A= },=0A= =0A= /**=0A= * Moves the content to place itemNum as the start item in the view =0A= * (if size is specified, the last element will not scroll past the = end.) =0A= * Ignores animation speed & method; moves directly to the item. =0A= * Note that you can also set the firstVisible property upon = initialization =0A= * to get the carousel to start at a position different than 1. =0A= * @param {number} newStart The item to move directly to. =0A= */=0A= moveTo: function(newStart) {=0A= this._position(newStart, false);=0A= },=0A= =0A= /**=0A= * Starts up autoplay. If autoPlay has been stopped (by calling = stopAutoPlay or by user interaction), =0A= * you can start it back up by using this method.=0A= * @param {number} interval optional parameter that sets the interval =0A= * for auto play the next time that autoplay fires. =0A= */=0A= startAutoPlay: function(interval) {=0A= // if interval is passed as arg, then set autoPlay to this interval.=0A= if(this._isValidObj(interval)) {=0A= this.autoPlay =3D interval;=0A= }=0A= =0A= // if we already are playing, then do nothing.=0A= if(this.autoPlayTimer !=3D=3D null) {=0A= return this.autoPlayTimer;=0A= }=0A= =0A= var oThis =3D this; =0A= var autoScroll =3D function() { oThis.scrollNext(); };=0A= this.autoPlayTimer =3D setTimeout( autoScroll, this.autoPlay );=0A= =0A= return this.autoPlayTimer;=0A= },=0A= =0A= /**=0A= * Stops autoplay. Useful for when you want to control what events will = stop the autoplay feature. =0A= * Call startAutoPlay() to restart autoplay.=0A= */=0A= stopAutoPlay: function() {=0A= if (this.autoPlayTimer !=3D=3D null) {=0A= clearTimeout(this.autoPlayTimer);=0A= this.autoPlayTimer =3D null;=0A= }=0A= },=0A= =0A= /**=0A= * Returns whether the carousel's orientation is set to vertical.=0A= */=0A= isVertical: function() {=0A= return (this.orientation !=3D "horizontal");=0A= },=0A= =0A= =0A= /**=0A= * Check to see if an element (by index) has been loaded or not. If the = item is simply pre-built, but not=0A= * loaded this will return false. If the item has not been pre-built it = will also return false.=0A= * @param {number} idx Index of the element to check load status for. =0A= */=0A= isItemLoaded: function(idx) {=0A= var liElem =3D this.getCarouselItem(idx);=0A= =0A= // if item exists and is not a placeholder, then it is already loaded.=0A= if(this._isValidObj(liElem) && !this._isValidObj(liElem.placeholder)) {=0A= return true;=0A= }=0A= =0A= return false;=0A= },=0A= =0A= /**=0A= * Lookup the element object for a carousel list item by index.=0A= * @param {number} idx Index of the element to lookup. =0A= */=0A= getCarouselItem: function(idx) {=0A= var elemName =3D this.carouselElemID + "-item-" + idx;=0A= var liElem =3D YAHOO.util.Dom.get(elemName);=0A= return liElem; =0A= },=0A= =0A= show: function() {=0A= YAHOO.util.Dom.setStyle(this.carouselElem, "display", "block");=0A= this.calculateSize();=0A= },=0A= =0A= hide: function() {=0A= YAHOO.util.Dom.setStyle(this.carouselElem, "display", "none");=0A= },=0A= =0A= calculateSize: function() {=0A= var ulKids =3D this.carouselList.childNodes;=0A= var li =3D null;=0A= for(var i=3D0; i 1 then this will adjust the scrolled = location=0A= var currY =3D YAHOO.util.Dom.getY(this.carouselList); =0A= YAHOO.util.Dom.setY(this.carouselList, =0A= currY - this.scrollAmountPerInc*(this.firstVisible-1));=0A= } else {=0A= YAHOO.util.Dom.removeClass(this.carouselList, "carousel-vertical");=0A= YAHOO.util.Dom.removeClass(this.carouselList, "carousel-horizontal");=0A= YAHOO.util.Dom.addClass(this.carouselList, "carousel-horizontal");=0A= liPaddingWidth =3D parseInt(YAHOO.util.Dom.getStyle(li, = "paddingLeft"),10) + =0A= parseInt(YAHOO.util.Dom.getStyle(li, "paddingRight"),10) + =0A= parseInt(YAHOO.util.Dom.getStyle(li, "marginLeft"),10) + =0A= parseInt(YAHOO.util.Dom.getStyle(li, "marginRight"),10);=0A= =0A= this.scrollAmountPerInc =3D (li.offsetWidth+liPaddingWidth);=0A= this.carouselElem.style.width =3D = ((this.scrollAmountPerInc*this.numVisible)+this.navMargin*2) + "px";=0A= this.clipReg.style.width =3D = (this.scrollAmountPerInc*this.numVisible)+"px";=0A= =0A= // if we set the initial start > 1 then this will adjust the scrolled = location=0A= var currX =3D YAHOO.util.Dom.getX(this.carouselList);=0A= YAHOO.util.Dom.setX(this.carouselList, =0A= currX - this.scrollAmountPerInc*(this.firstVisible-1));=0A= }=0A= },=0A= =0A= // /////////////////// PRIVATE API = //////////////////////////////////////////=0A= _calculateSize: function(me) {=0A= me.calculateSize();=0A= YAHOO.util.Dom.setStyle(me.carouselElem, "visibility", "visible");=0A= },=0A= =0A= // From Mike Chambers: = http://weblogs.macromedia.com/mesh/archives/2006/01/removing_html_e.html=0A= _removeChildrenFromNode: function(node)=0A= {=0A= if(!this._isValidObj(node))=0A= {=0A= return;=0A= }=0A= =0A= var len =3D node.childNodes.length;=0A= =0A= while (node.hasChildNodes())=0A= {=0A= node.removeChild(node.firstChild);=0A= }=0A= },=0A= =0A= _prebuildLiElem: function(idx) {=0A= var liElem =3D document.createElement("li");=0A= liElem.id =3D this.carouselElemID + "-item-" + idx;=0A= // this is default flag to know that we're not really loaded yet.=0A= liElem.placeholder =3D true; =0A= this.carouselList.appendChild(liElem);=0A= =0A= this.lastPrebuiltIdx =3D (idx > this.lastPrebuiltIdx) ? idx : = this.lastPrebuiltIdx;=0A= },=0A= =0A= _createItem: function(idx, innerHTMLOrElem) {=0A= var liElem =3D document.createElement("li");=0A= liElem.id =3D this.carouselElemID + "-item-" + idx;=0A= =0A= // if String then assume innerHTML, else an elem object=0A= if(typeof(innerHTMLOrElem) =3D=3D=3D "string") {=0A= liElem.innerHTML =3D innerHTMLOrElem;=0A= } else {=0A= liElem.appendChild(innerHTMLOrElem);=0A= }=0A= =0A= return liElem;=0A= },=0A= =0A= // idx is the location to insert after=0A= _insertAfterItem: function(refIdx, innerHTMLOrElem) {=0A= return this._insertBeforeItem(refIdx+1, innerHTMLOrElem);=0A= },=0A= =0A= =0A= _insertBeforeItem: function(refIdx, innerHTMLOrElem) {=0A= =0A= var refItem =3D this.getCarouselItem(refIdx);=0A= =0A= if(this.size !=3D this.UNBOUNDED_SIZE) {=0A= this.size +=3D 1;=0A= }=0A= =0A= for(var i=3Dthis.lastPrebuiltIdx; i>=3DrefIdx; i--) {=0A= var anItem =3D this.getCarouselItem(i);=0A= if(this._isValidObj(anItem)) {=0A= anItem.id =3D this.carouselElemID + "-item-" + (i+1);=0A= }=0A= }=0A= =0A= var liElem =3D this._createItem(refIdx, innerHTMLOrElem);=0A= =0A= var insertedItem =3D this.carouselList.insertBefore(liElem, refItem);=0A= this.lastPrebuiltIdx +=3D 1;=0A= =0A= return liElem;=0A= },=0A= =0A= // TEST THIS... think it has to do with prebuild=0A= insertAfterEnd: function(innerHTMLOrElem) {=0A= return this.insertAfter(this.size, innerHTMLOrElem);=0A= },=0A= =0A= _position: function(newStart, showAnimation) {=0A= // do we bypass the isAnimated check?=0A= if(newStart > this.firstVisible) {=0A= var inc =3D newStart - this.firstVisible;=0A= this._scrollNextInc(this, inc, showAnimation);=0A= } else {=0A= var dec =3D this.firstVisible - newStart;=0A= this._scrollPrevInc(this, dec, showAnimation);=0A= }=0A= },=0A= =0A= =0A= // event handler=0A= _scrollNext: function(e, carousel) {=0A= if(carousel.scrollNextAnim.isAnimated()) {=0A= return false; // might be better to set ourself waiting for animation = completion and=0A= // then just do this function. that will allow faster scroll = responses.=0A= }=0A= =0A= // if fired by an event and wrap is set and we are already at end then = wrap=0A= var currEnd =3D carousel.firstVisible + carousel.numVisible-1;=0A= if(carousel.wrap && currEnd =3D=3D carousel.size) {=0A= carousel.scrollTo(1);=0A= } else if(e !=3D=3D null) { // event fired this so disable autoplay=0A= carousel.stopAutoPlay();=0A= carousel._scrollNextInc(carousel, carousel.scrollInc, = (carousel.cfg.getProperty("animationSpeed") !=3D=3D 0));=0A= } else {=0A= carousel._scrollNextInc(carousel, carousel.scrollInc, = (carousel.cfg.getProperty("animationSpeed") !=3D=3D 0));=0A= }=0A= =0A= =0A= },=0A= =0A= // probably no longer need carousel passed in, this should be correct = now.=0A= _scrollNextInc: function(carousel, inc, showAnimation) {=0A= =0A= var currFirstVisible =3D carousel.firstVisible;=0A= =0A= var newEnd =3D carousel.firstVisible + inc + carousel.numVisible - 1;=0A= newEnd =3D (newEnd > carousel.size) ? carousel.size : newEnd;=0A= var newStart =3D newEnd - carousel.numVisible + 1;=0A= inc =3D newStart - carousel.firstVisible;=0A= carousel.firstVisible =3D newStart;=0A= =0A= // if the prev button is disabled and start is now past 1, then enable = it=0A= if((carousel.prevEnabled =3D=3D=3D false) && (carousel.firstVisible > = 1)) {=0A= carousel._enablePrev();=0A= }=0A= // if next is enabled && we are now at the end, then disable=0A= if((carousel.nextEnabled =3D=3D=3D true) && (newEnd =3D=3D = carousel.size)) {=0A= carousel._disableNext();=0A= }=0A= =0A= if(inc > 0) {=0A= if(carousel._isValidObj(carousel.loadNextHandler)) {=0A= carousel.lastVisible =3D carousel.firstVisible + carousel.numVisible = - 1;=0A= =0A= carousel.currSize =3D (carousel.lastVisible > carousel.currSize) ?=0A= carousel.lastVisible : carousel.currSize;=0A= =0A= var alreadyCached =3D carousel._areAllItemsLoaded(currFirstVisible, =0A= carousel.lastVisible);=0A= carousel.loadNextHandlerEvt.fire(carousel.firstVisible, = carousel.lastVisible, alreadyCached);=0A= }=0A= =0A= if(showAnimation) {=0A= var nextParams =3D { points: { by: = [-carousel.scrollAmountPerInc*inc, 0] } };=0A= if(carousel.isVertical()) {=0A= nextParams =3D { points: { by: [0, = -carousel.scrollAmountPerInc*inc] } };=0A= }=0A= =0A= carousel.scrollNextAnim =3D new = YAHOO.util.Motion(carousel.carouselList, =0A= nextParams, =0A= carousel.cfg.getProperty("animationSpeed"), = carousel.animationMethod);=0A= if(carousel._isValidObj(carousel.animationCompleteHandler)) {=0A= = carousel.scrollNextAnim.onComplete.subscribe(this._handleAnimationComplet= e, [carousel, "next"]);=0A= }=0A= carousel.scrollNextAnim.animate();=0A= } else {=0A= if(carousel.isVertical()) {=0A= var currY =3D YAHOO.util.Dom.getY(carousel.carouselList);=0A= =0A= YAHOO.util.Dom.setY(carousel.carouselList, =0A= currY - carousel.scrollAmountPerInc*inc);=0A= } else {=0A= var currX =3D YAHOO.util.Dom.getX(carousel.carouselList);=0A= YAHOO.util.Dom.setX(carousel.carouselList, =0A= currX - carousel.scrollAmountPerInc*inc);=0A= }=0A= }=0A= =0A= }=0A= =0A= return false;=0A= },=0A= =0A= _handleAnimationComplete: function(type, args, argList) {=0A= var carousel =3D argList[0];=0A= var direction =3D argList[1];=0A= =0A= carousel.animationCompleteEvt.fire(direction);=0A= =0A= =0A= },=0A= =0A= // If EVERY item is already loaded in the range then return true=0A= // Also prebuild whatever is not already created.=0A= _areAllItemsLoaded: function(first, last) {=0A= var itemsLoaded =3D true;=0A= for(var i=3Dfirst; i<=3Dlast; i++) {=0A= var liElem =3D this.getCarouselItem(i);=0A= =0A= // If the li elem does not exist, then prebuild it in the correct = order=0A= // but still flag as not loaded (just prebuilt the li item.=0A= if(!this._isValidObj(liElem)) {=0A= this._prebuildLiElem(i);=0A= itemsLoaded =3D false;=0A= // but if the item exists and is a placeholder, then=0A= // note that this item is not loaded (only a placeholder)=0A= } else if(this._isValidObj(liElem.placeholder)) {=0A= itemsLoaded =3D false;=0A= }=0A= }=0A= return itemsLoaded;=0A= }, =0A= =0A= _prebuildItems: function(first, last) {=0A= for(var i=3Dfirst; i<=3Dlast; i++) {=0A= var liElem =3D this.getCarouselItem(i);=0A= =0A= // If the li elem does not exist, then prebuild it in the correct = order=0A= // but still flag as not loaded (just prebuilt the li item.=0A= if(!this._isValidObj(liElem)) {=0A= this._prebuildLiElem(i);=0A= }=0A= }=0A= }, =0A= =0A= _scrollPrev: function(e, carousel) {=0A= if(carousel.scrollPrevAnim.isAnimated()) {=0A= return false;=0A= }=0A= carousel._scrollPrevInc(carousel, carousel.scrollInc, = (carousel.cfg.getProperty("animationSpeed") !=3D=3D 0));=0A= },=0A= =0A= _scrollPrevInc: function(carousel, dec, showAnimation) {=0A= =0A= var currLastVisible =3D carousel.lastVisible;=0A= var newStart =3D carousel.firstVisible - dec;=0A= newStart =3D (newStart <=3D 1) ? 1 : (newStart);=0A= var newDec =3D carousel.firstVisible - newStart;=0A= carousel.firstVisible =3D newStart;=0A= =0A= // if prev is enabled && we are now at position 1, then disable=0A= if((carousel.prevEnabled =3D=3D=3D true) && (carousel.firstVisible = =3D=3D 1)) {=0A= carousel._disablePrev();=0A= }=0A= // if the next button is disabled and end is < size, then enable it=0A= if((carousel.nextEnabled =3D=3D=3D false) && =0A= ((carousel.firstVisible + carousel.numVisible - 1) < = carousel.size)) {=0A= carousel._enableNext();=0A= }=0A= =0A= // if we are decrementing=0A= if(newDec > 0) { =0A= if(carousel._isValidObj(carousel.loadPrevHandler)) {=0A= carousel.lastVisible =3D carousel.firstVisible + carousel.numVisible = - 1;=0A= =0A= carousel.currSize =3D (carousel.lastVisible > carousel.currSize) ?=0A= carousel.lastVisible : carousel.currSize;=0A= =0A= var alreadyCached =3D = carousel._areAllItemsLoaded(carousel.firstVisible, =0A= currLastVisible);=0A= carousel.loadPrevHandlerEvt.fire(carousel.firstVisible, = carousel.lastVisible, alreadyCached);=0A= }=0A= =0A= if(showAnimation) {=0A= var prevParams =3D { points: { by: = [carousel.scrollAmountPerInc*newDec, 0] } };=0A= if(carousel.isVertical()) {=0A= prevParams =3D { points: { by: [0, = carousel.scrollAmountPerInc*newDec] } };=0A= }=0A= =0A= carousel.scrollPrevAnim =3D new = YAHOO.util.Motion(carousel.carouselList,=0A= prevParams, =0A= carousel.cfg.getProperty("animationSpeed"), = carousel.animationMethod);=0A= if(carousel._isValidObj(carousel.animationCompleteHandler)) {=0A= = carousel.scrollPrevAnim.onComplete.subscribe(this._handleAnimationComplet= e, [carousel, "prev"]);=0A= }=0A= carousel.scrollPrevAnim.animate();=0A= } else {=0A= if(carousel.isVertical()) {=0A= var currY =3D YAHOO.util.Dom.getY(carousel.carouselList);=0A= YAHOO.util.Dom.setY(carousel.carouselList, currY + =0A= carousel.scrollAmountPerInc*newDec); =0A= } else {=0A= var currX =3D YAHOO.util.Dom.getX(carousel.carouselList);=0A= YAHOO.util.Dom.setX(carousel.carouselList, currX + =0A= carousel.scrollAmountPerInc*newDec);=0A= }=0A= }=0A= }=0A= =0A= return false;=0A= },=0A= =0A= /**=0A= * _loadInitial looks at firstItemVisible for the start (not = necessarily 1)=0A= */=0A= _loadInitial: function() {=0A= this.lastVisible =3D this.firstVisible + this.numVisible - 1;=0A= =0A= this.currSize =3D (this.lastVisible > this.currSize) ?=0A= this.lastVisible : this.currSize;=0A= =0A= // Since firstItemVisible can be > 1 need to check for disabling either=0A= // previous or next controls=0A= if(this.firstVisible =3D=3D 1) {=0A= this._disablePrev();=0A= }=0A= if(this.lastVisible =3D=3D this.size) {=0A= this._disableNext();=0A= }=0A= =0A= // Load from 1 to the last visible=0A= // The _calculateSize method will adjust the scroll position=0A= // for starts > 1=0A= if(this._isValidObj(this.loadInitHandler)) {=0A= var alreadyCached =3D this._areAllItemsLoaded(1, this.lastVisible);=0A= this.loadInitHandlerEvt.fire(1, this.lastVisible, alreadyCached);=0A= }=0A= =0A= if(this.autoPlay !=3D=3D 0) {=0A= this.autoPlayTimer =3D this.startAutoPlay();=0A= } =0A= },=0A= =0A= _disablePrev: function() {=0A= this.prevEnabled =3D false;=0A= if(this._isValidObj(this.prevButtonStateHandlerEvt)) {=0A= this.prevButtonStateHandlerEvt.fire(false, this.carouselPrev);=0A= }=0A= if(this._isValidObj(this.carouselPrev)) {=0A= YAHOO.util.Event.removeListener(this.carouselPrev, "click", = this._scrollPrev);=0A= }=0A= },=0A= =0A= _enablePrev: function() {=0A= this.prevEnabled =3D true;=0A= if(this._isValidObj(this.prevButtonStateHandlerEvt)) {=0A= this.prevButtonStateHandlerEvt.fire(true, this.carouselPrev);=0A= }=0A= if(this._isValidObj(this.carouselPrev)) {=0A= YAHOO.util.Event.addListener(this.carouselPrev, "click", = this._scrollPrev, this);=0A= }=0A= },=0A= =0A= _disableNext: function() {=0A= if(this.wrap) {=0A= return;=0A= }=0A= =0A= this.nextEnabled =3D false;=0A= if(this._isValidObj(this.nextButtonStateHandlerEvt)) {=0A= this.nextButtonStateHandlerEvt.fire(false, this.carouselNext);=0A= }=0A= if(this._isValidObj(this.carouselNext)) {=0A= YAHOO.util.Event.removeListener(this.carouselNext, "click", = this._scrollNext);=0A= }=0A= },=0A= =0A= _enableNext: function() {=0A= this.nextEnabled =3D true;=0A= if(this._isValidObj(this.nextButtonStateHandlerEvt)) {=0A= this.nextButtonStateHandlerEvt.fire(true, this.carouselNext);=0A= }=0A= if(this._isValidObj(this.carouselNext)) {=0A= YAHOO.util.Event.addListener(this.carouselNext, "click", = this._scrollNext, this);=0A= }=0A= },=0A= =0A= _isValidObj: function(obj) {=0A= =0A= if (null =3D=3D obj) {=0A= return false;=0A= }=0A= if ("undefined" =3D=3D typeof(obj) ) {=0A= return false;=0A= }=0A= return true;=0A= }=0A= };=0A= ------=_NextPart_000_01DC_01C88672.F4A755A0--