From: <Saved by Windows Internet Explorer 7>
Subject: Four Kenyon students win Goldwater scholarships - Features
Date: Mon, 3 Sep 2007 17:34:01 -0400
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C7EE50.9DCC8850"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3138

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: text/html;
	charset="Windows-1252"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.www.kenyoncollegian.com/media/storage/paper821/news/2007/04/12/Features/Four-Kenyon.Students.Win.Goldwater.Scholarships-2838429.shtml

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>Four Kenyon =
students win Goldwater scholarships - Features</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dwindows-1252">
<SCRIPT language=3DJavascript>=0A=
				var story_id =3D 2838429;=0A=
				</SCRIPT>

<META content=3D"Four Kenyon students win Goldwater scholarships, "=20
name=3Ddescription>
<META content=3D"Four Kenyon students win Goldwater scholarships, " =
name=3Dkeywords>
<SCRIPT language=3DJAVASCRIPT>=0A=
				var sectionname =3D 'Features';=0A=
				var sectioncategory =3D 'Features/Campus Life';=0A=
				var isectioncategoryid =3D '4,';=0A=
				</SCRIPT>

<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */
var admanagerIsAvailable=3D0;
var clientBannersAvailable=3D0;
var bAdmanagerClientAlive=3D0;
var bAdmanagerNetworkAlive=3D0;
var bAdVariantBanners =3D 0;
var origserver =3D  window.document.location.host.toString();
if (typeof sectioncategory=3D=3D"undefined"){
var sectioncategory =3D '';}
if (typeof story_id=3D=3D"undefined"){
var story_id =3D '';
}
/* ]]> */
</SCRIPT>

<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */
document.write('<SCR'+'IPT =
SRC=3D'+'http://media.collegepublisher.com/media/scripts/commonFunctions.=
js?2>'+'</SCR'+'IPT>');
/* ]]> */
</SCRIPT>

<SCRIPT=20
src=3D"http://media.collegepublisher.com/media/scripts/coda/mtvi_reportin=
g.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>
//<![CDATA[
	function getPageName(){
		var defaultPageName =3D "index.cfm"
		return (location.pathname=3D=3D"" || =
location.pathname=3D=3D"/")?"/"+defaultPageName:location.pathname;
 	}
	function getHierarchy(argPageName){
		return =
(argPageName.charAt(0)=3D=3D"/")?argPageName.substring(1):argPageName;
	}
	var qString =3D com.mtvi.util.queryStringToHash(location.search);
	var refsource =3D =
(com.mtvi.util.isDefined(qString))?qString["refsource"]:"";
	var reffeature =3D =
(com.mtvi.util.isDefined(qString))?qString["reffeature"]:"";
	if(refsource !=3D null && refsource.length > 0) {
		SetCookie('refsourcekey', refsource);
	}
	// Reporting Account Config
	com.mtvi.reporting.Account=3D{
		name:"viay2m",
		filters: "javascript:,y2m.com"
	};
	var dispatcher=3Dcom.mtvi.reporting.Dispatcher;
	dispatcher.setAttribute('pageName',getPageName());
	dispatcher.setAttribute('hier1',getHierarchy(getPageName()));=20
	dispatcher.setAttribute('prop1','splitPage');
	dispatcher.setAttribute('prop2',sectioncategory);
	=
dispatcher.setAttribute('prop3','event=3DsplitPage&objectDisplayMode=3D2'=
);
	dispatcher.setAttribute('prop4',refsource);
	=
dispatcher.setAttribute('prop5',window.document.location.pathname.toStrin=
g() + window.document.location.search.toString());
	dispatcher.setAttribute('prop6',origserver);
	dispatcher.setAttribute('prop7','The Kenyon Collegian');
	dispatcher.setAttribute('prop8','www.kenyoncollegian.com');
	dispatcher.setAttribute('prop9',story_id);
	dispatcher.setAttribute('prop10','821');
	dispatcher.setAttribute('prop11','home');
	dispatcher.setAttribute('prop12',GetCookie('refsourcekey'));
	dispatcher.setAttribute('prop13',reffeature);
	dispatcher.sendCall();
	//]]>
</SCRIPT>
<LINK media=3Dscreen=20
href=3D"http://www.kenyoncollegian.com/media/css/global.css?v43" =
type=3Dtext/css=20
rel=3Dstylesheet><LINK title=3D"1024 x 768"=20
href=3D"http://media.collegepublisher.com/media/css/features_1024.css?v1"=
=20
type=3Dtext/css rel=3D"alternate stylesheet"><LINK media=3Dscreen=20
href=3D"http://media.collegepublisher.com/media/css/popup_new.css?v12"=20
type=3Dtext/css rel=3Dstylesheet><LINK media=3Dprint=20
href=3D"http://media.collegepublisher.com/media/css/print.css?v1" =
type=3Dtext/css=20
rel=3Dstylesheet><LINK media=3Dscreen=20
href=3D"http://www.kenyoncollegian.com/media/paper821/styles.css?v13"=20
type=3Dtext/css rel=3Dstylesheet><LINK title=3D"RSS feed for The Kenyon =
Collegian"=20
href=3D"http://www.kenyoncollegian.com/articles.rss" =
type=3Dapplication/rss+xml=20
rel=3Dalternate><!-- Some "Web 2.0" Resources. -->
<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/prototype.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/global.js?14"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/network_channel.js=
"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/event_listener.js"=
=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/resolution.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/scriptaculous.js" =

type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/window.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/youarehere.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/spry/xpath.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/spry/SpryData.js" =

type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/contentslider.js?1=
"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://media.collegepublisher.com/media/scripts/ufo.js?1" =

type=3Dtext/javascript></SCRIPT>

<META http-equiv=3Dpragma content=3Dno-cache>
<META http-equiv=3Dexpires content=3D-1>
<META content=3Dall name=3Drobots>
<META content=3D"7 Days" name=3Drevisit-after>
<META content=3Dtrue name=3DMSSmartTagsPreventParsing>
<META content=3D"The Staff of The Kenyon Collegian" name=3Dauthor>
<META content=3D"The Kenyon Collegian, a college media publication."=20
name=3Ddescription>
<META content=3D"The Kenyon Collegian, newspaper, college media, student =
media"=20
name=3Dkeywords>
<META content=3D"Copyright 2007 The Kenyon Collegian." name=3Dcopyright>
<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */
var currentissuedate=3D'05/03/07';
var currentissuedayname=3D'Thursday';
var currentissuemonthname=3D'May';
var currentissueday=3D'3';
var currentissuemonth=3D'5';
var currentissueyear=3D'2007';
var basehref=3D'http://www.kenyoncollegian.com/';
var paper_id=3D'821';
var paperzip=3D'43022';
var paper_name=3D'The Kenyon Collegian';
var paper_domain=3D'www.kenyoncollegian.com';



var dart_paper_name =3D 'KenyonCollege_821';

var dart_primary_section =3D sectioncategory =3D=3D''? 'home' : =
sectioncategory.toLowerCase();

var dart_ord =3D Math.random() * 10000000000000000;
var dart_tileNumber =3D 1;
dart_primary_section =3D =
dart_primary_section.replace(/^(\d.+?)$/,"_$1");
dart_primary_section =3D dart_primary_section.replace(/\s{1,}/g,"");
dart_primary_section =3D dart_primary_section.replace(/\/{1,}/g,"");


var =
slideshowpath=3D'http://www.kenyoncollegian.com/home/index.cfm?event=3Ddi=
splaySlideShow&islides=3D';

// from query.
var aSectionNames =3D new Array();
var aSectionLinks =3D new Array();
aSectionNames[0] =3D 'News';
aSectionLinks[0]=3D'/news/2007/05/03/News/';
aSectionNames[1] =3D 'Features';
aSectionLinks[1]=3D'/news/2007/05/03/Features/';
aSectionNames[2] =3D 'Opinion';
aSectionLinks[2]=3D'/news/2007/05/03/Opinion/';
aSectionNames[3] =3D 'A&E';
aSectionLinks[3]=3D'/news/2007/05/03/Ae/';
aSectionNames[4] =3D 'Sports';
aSectionLinks[4]=3D'/news/2007/05/03/Sports/';

/* ]]> */
</SCRIPT>

<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */
pcdateobject=3Dnew Date();
pcrandom=3Dpcdateobject.getTime();
var section_id =3D '';
if (typeof section_name=3D=3D"undefined"){
var section_name =3D '';}
if (typeof isectioncategoryid=3D=3D"undefined"){
var isectioncategoryid =3D ',';}
if (section_name !=3D '') {
  for (i=3D0;i<aSectionNames.length;i++) {
    if (aSectionNames[i].toLowerCase() =3D=3D section_name) {
      section_id =3D aSectionLinks[i].replace(/^sections\/(\d+)\.html$/, =
'$1')
    }
  }
}

var result =3D document.location.href.match(/mkey(=3D|\/|%3D)(-9+)/);
if (result && result[1]) {
	var mkey =3D result[1];
	var nextyear=3Dnew Date();
	nextyear.setFullYear(nextyear.getFullYear() + 20);
	var cookieDomain=3D'www.kenyoncollegian.com';
	cookieDomain =3D cookieDomain.replace(/^www\./,"");
	cookieDomain =3D cookieDomain.replace(/^media.www\./,"");
	SetCookie('HASREGISTEREDORLOGGEDIN', mkey, nextyear, '/', =
cookieDomain);
}
document.write('<SCR'+'IPT =
SRC=3D'+'http://media.collegepublisher.com/media/admanagerStatus/isAdmana=
gerAlive.js?1>'+'</SCR'+'IPT>');
/* ]]> */
</SCRIPT>

<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */

var loggedIn=3D0;


var cpbppriv=3D0;

if (cpbppriv < 2) {
	if (document.cookie.indexOf("HASREGISTEREDORLOGGEDIN=3D") > -1) {
	  uid=3DGetCookie('HASREGISTEREDORLOGGEDIN');
	} else {
	  uid=3D'';
	}
	var myimageobject =3D new Image();
	=
myimageobject.src=3D"http://stats.broadbandpublisher.com/pageCounter.adp?=
iPaper_id=3D821&random=3D" + pcrandom + "&uid=3D" + uid;
}


if (GetCookie('activeSession') =3D=3D null) {
	SetCookie('activeSession', '1');
	var myimageobject2=3Dnew Image();
	=
myimageobject2.src=3D"http://stats.broadbandpublisher.com/pageCounter.adp=
?iPaper_id=3D821&random=3D" + pcrandom + '&isnewsession=3D1';
}


if (bAdmanagerClientAlive) {
	document.write('<SCR'+'IPT =
SRC=3D'+'http://localads.collegepublisher.com/jsc/821/local.js>'+'</SCR'+=
'IPT>');
=09
}




	document.write('<SCR'+'IPT =
SRC=3D'+'http://admanager3.collegepublisher.com/runtime/javascript/DART_n=
ational.js>'+'</SCR'+'IPT>');




	=09



/* ]]> */
</SCRIPT>

<META content=3D"MSHTML 6.00.6000.16525" name=3DGENERATOR></HEAD>
<BODY leftMargin=3D0 topMargin=3D0 marginwidth=3D"0" marginheight=3D"0">
<DIV id=3Dnet_bar>
<DIV id=3Dnet_cp>
<UL id=3Dnet_cp_nav>
  <LI id=3Dnet_cp_a><A title=3D"College Publisher Network"=20
  href=3D"javascript:showhide_links();">College Publisher Network</A> =
</LI></UL>
<UL class=3Dhide id=3Dnet_cp_nav_list>
  <LI><A title=3D"Join the College Publisher Network"=20
  href=3D"http://cpsite.collegepublisher.com/join/index.html" =
target=3D_parent>Join=20
  the College Publisher Network</A> </LI>
  <LI><A title=3D"Advertise Across the Network"=20
  href=3D"http://www.mtvu.com/about/advertising/" =
target=3D_parent>Advertise Across=20
  the Network</A> </LI>
  <LI><A title=3D"View the entire list of College Publisher Network =
Affiliates"=20
  href=3D"http://www.kenyoncollegian.com/channel/network" =
target=3D_parent>View=20
  Network Affiliates</A> </LI></UL></DIV>
<DIV id=3Dnet_search>
<FORM id=3Dcpsearch name=3Dcpsearch action=3D/home/index.cfm =
method=3Dget=20
target=3D_parent>
<FIELDSET><INPUT id=3Dnet_search_input name=3Dq> <INPUT id=3Dev =
type=3Dhidden=20
value=3DdisplaySearchResults name=3Devent> <INPUT id=3Dbp type=3Dhidden =
value=3D1=20
name=3DbuttonPushed> <INPUT id=3Dclient type=3Dhidden =
value=3Dtesting-testing=20
name=3Dclient> <INPUT id=3Dforid type=3Dhidden value=3D1 name=3Dforid> =
<INPUT id=3Die=20
type=3Dhidden value=3DISO-8859-1 name=3Die> <INPUT id=3Doe type=3Dhidden =
value=3DISO-8859-1=20
name=3Doe> <INPUT id=3Dcof type=3Dhidden=20
value=3DGALT:#008000;GL:1;DIV:#666666;VLC:663399;AH:center;BGC:FFFFFF;LBG=
C:FFFFFF;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;LH:37;LW:3=
10;FORID:1;=20
name=3Dcof> <INPUT id=3Dhl type=3Dhidden value=3Den name=3Dhl>=20
<DIV id=3Dnet_search_choose>
<UL id=3Dnet_search_choose>
  <LI id=3Dnet_search_choose_link><A title=3D"Select your search method" =

  href=3D"javascript:showhide_search();">Select your search method</A> =
</LI>
  <LI id=3Dnet_search_choose_submit><A title=3DSearch=20
  href=3D"javascript:sesubmit();">Search</A> </LI></UL>
<UL class=3Dhide id=3Dnet_search_choose_options>
  <LI><INPUT id=3Dnet_search_paper onclick=3Dchange_search_this() =
tabIndex=3D2=20
  type=3Dradio CHECKED value=3Dpaper name=3Dcp1> <LABEL =
for=3Dnet_search_paper>Search=20
  This Paper</LABEL>=20
  <LI><INPUT id=3Dnet_search_google onclick=3Dchange_search_google() =
tabIndex=3D3=20
  type=3Dradio value=3Dweb name=3Dcp1> <LABEL =
for=3Dnet_search_google>Search=20
  Google</LABEL> </LI></UL></DIV><INPUT id=3Dfrombar type=3Dhidden =
value=3D1=20
name=3Dfrombar> </FIELDSET> </FORM></DIV>
<DIV id=3Dnet_channels>
<UL>
  <LI><A href=3D"http://www.kenyoncollegian.com/channel/music/"=20
  target=3D_parent>Music</A> </LI>
  <LI><A =
href=3D"http://media.www.kenyoncollegian.com/channel/collegeheadlines/"=20
  target=3D_parent>Top National College News</A> </LI>
  <LI><A href=3D"http://www.kenyoncollegian.com/channel/money/"=20
  target=3D_parent>Money</A> </LI>
  <LI><A href=3D"http://www.kenyoncollegian.com/books/" =
target=3D_parent>Books</A>=20
  </LI></UL></DIV>
<DIV id=3Dnet_weather><A =
href=3D"http://www.kenyoncollegian.com/home/weather/"=20
target=3D_parent><IMG=20
src=3D"http://media.collegepublisher.com/media/weatherbug/weatherbugsforc=
hannelbar/43022.png"=20
border=3D0></A> </DIV><NOSCRIPT><IMG id=3Dflan_stat_img=20
src=3D"http://stats.broadbandpublisher.com/pageCounter.adp?iPaper_id=3D82=
1&amp;random=3D&amp;uid=3D"=20
border=3D0> </NOSCRIPT></DIV>
<DIV id=3Dflan_wrapper>
<DIV class=3Dgutter>
<DIV id=3DbigCol1>
<DIV id=3Dflan_nav>
<DIV id=3DnavWrap><!-- #navWrap opener -->
<H4>Sections</H4>
<UL>
  <LI><A =
href=3D"http://www.kenyoncollegian.com/news/2007/05/03/News/"><SPAN=20
  class=3Dsect_lev_0>News</SPAN></A>=20
  <UL></UL>
  <LI><A =
href=3D"http://www.kenyoncollegian.com/news/2007/05/03/Features/"><SPAN=20
  class=3Dsect_lev_0>Features</SPAN></A>=20
  <UL></UL>
  <LI><A =
href=3D"http://www.kenyoncollegian.com/news/2007/05/03/Opinion/"><SPAN=20
  class=3Dsect_lev_0>Opinion</SPAN></A>=20
  <UL></UL>
  <LI><A =
href=3D"http://www.kenyoncollegian.com/news/2007/05/03/Ae/"><SPAN=20
  class=3Dsect_lev_0>A&amp;E</SPAN></A>=20
  <UL></UL>
  <LI><A =
href=3D"http://www.kenyoncollegian.com/news/2007/05/03/Sports/"><SPAN=20
  class=3Dsect_lev_0>Sports</SPAN></A>=20
  <UL></UL></LI></UL>
<H4>Options</H4>
<UL>
  <LI><A href=3D"http://www.kenyoncollegian.com/lettertoeditor">Letter =
to the=20
  Editor</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/login">Login / =
Register</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/generalinfo">About =
Us</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/forums">Message =
Board</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/calendar">Events =
Calendar</A>=20
  <LI><A =
href=3D"http://www.kenyoncollegian.com/classifieds">Classifieds</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/archives">Back =
Issues</A>=20
  <LI><A href=3D"http://www.kenyoncollegian.com/search">Search</A> =
</LI></UL>
<H4>Channels</H4>
<UL>
  <LI><A class=3Dchannelsstyle=20
  =
href=3D"http://www.kenyoncollegian.com/channel/index.cfm?event=3Dpresswir=
e">Press=20
  Releases</A> </LI></UL>
<DIV id=3DPrintEditionThumbnail>
<H4>PDF</H4>
<UL>
  <LI><A id=3Dprintpreview=20
  href=3D"http://media.collegepublisher.com/media/paper821/documents/"=20
  target=3D_blank>View print edition pdf </A></LI></UL></DIV>
<DIV id=3Dnav_customlinks>
<H4>Links</H4>
<UL>
  <LI><A href=3D"http://www.kenyoncollegian.com/printads" =
target=3D_blank>Advertise=20
  in the Collegian!</A>=20
  <LI><A href=3D"http://collegianalumni.blogspot.com/" =
target=3D_blank>Collegian=20
  Alumni Group</A>=20
  <LI><A href=3D"http://www.kenyon.edu/" target=3D_blank>Kenyon =
College</A>=20
  <LI><A href=3D"http://www1.kenyon.edu/directories/" =
target=3D_blank>Kenyon=20
  Directory</A> </LI></UL></DIV></DIV><!-- #navWrap closer -->
<DIV class=3Dcp_banner_client id=3Dbanner_client_4>
<SCRIPT language=3DJAVASCRIPT>
	if (clientBannersAvailable =3D=3D 1) {
		showClientBanner(4);
	}
	</SCRIPT>
<NOSCRIPT><CFOUTPUT><A=20
href=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/clientC=
lickThrough.adp?iPosition=3D4&amp;iPaper_id=3D821&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Ekenyoncollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3Db1qcd15lzf&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D821&amp;javascriptIncludeMode=3D0&amp;iPosition=3D4"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV class=3Dcp_banner_client id=3Dbanner_client_5>
<SCRIPT language=3DJAVASCRIPT>
	if (clientBannersAvailable =3D=3D 1) {
		showClientBanner(5);
	}
	</SCRIPT>
<NOSCRIPT><CFOUTPUT><A=20
href=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/clientC=
lickThrough.adp?iPosition=3D5&amp;iPaper_id=3D821&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Ekenyoncollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3Db1qcd15lzf&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D821&amp;javascriptIncludeMode=3D0&amp;iPosition=3D5"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV></DIV></DIV>
<DIV id=3DbigCol2>
<DIV class=3Dgutter>
<DIV id=3Dflan_header>
<DIV id=3DadvertBox_mast>
<SCRIPT language=3DJavascript>
	showNetworkBanner(11);
</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D11&amp;ipaper_id=3D821&amp;callingSite=3Dwww.kenyoncol=
legian.com"><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D11&amp;ipaper_id=3D821"=20
border=3D0> </A></NOSCRIPT></DIV>
<DIV id=3Dmasthead>
<H1><A href=3D"http://www.kenyoncollegian.com/">Kenyon =
Collegian</A></H1></DIV>
<DIV id=3DissueDate>
<H2>Current Issue:
<SCRIPT language=3DJAVASCRIPT>document.write(currentissuemonthname + ' ' =
+ currentissueday + ', ' + currentissueyear);</SCRIPT>
 </H2></DIV></DIV>
<DIV id=3Dflan_content_wrapper>
<DIV id=3Dflan_content>
<SCRIPT language=3DJAVASCRIPT>
  if (GetCookie('CANSEELOGINBAR') =3D=3D 1) {
	document.write('<div id=3Dloggedin_controlbar><table width=3D100% =
cellspacing=3D0 cellpadding=3D0 border=3D0 id=3Dloggedin_bar>');
	document.write('<tr>');
	document.write('<td valign=3Dmiddle align=3Dleft>');
	document.write('<img src=3D/home/images/face.gif>');
	document.write('Welcome to www.kenyoncollegian.com</td>');
	document.write('<td align=3Dright valign=3Dmiddle>');
	document.write('<strong><a =
href=3D/user/index.cfm?event=3DeditUserPreferencesForm>MY ACCOUNT</a>'); =
=09
	document.write('&nbsp;&nbsp;&nbsp;&nbsp;<a =
href=3D/user/index.cfm?event=3DprocessLogout>LOG =
OUT</a></strong></td>');
	document.write('</tr>');
	document.write('</table></div>');
 }
</SCRIPT>

<DIV id=3Dbreadcrumb><A title=3D"Go back to front page"=20
href=3D"http://www.kenyoncollegian.com/home/">Home</A> &gt; <A =
title=3DFeatures=20
href=3D"http://www.kenyoncollegian.com/news/2007/04/12/Features/">Feature=
s</A>=20
</DIV>
<DIV id=3Darticle>
<H2>Four Kenyon students win Goldwater scholarships</H2>
<H3></H3>
<H4>Maia Raber and Mara Alperin</A></H4>
<DIV id=3Dmeta><STRONG>Issue date:</STRONG> 4/12/07 =
<STRONG>Section:</STRONG> <A=20
title=3DFeatures=20
href=3D"http://www.kenyoncollegian.com/news/2007/04/12/Features/">Feature=
s</A></DIV>
<DIV class=3Dgoner id=3Dcp_article_top>
<UL id=3Dcp_article_top_left>
  <LI id=3Dcp_article_print><A title=3D"Print this article"=20
  =
href=3D"http://www.kenyoncollegian.com/home/index.cfm?event=3DdisplayArti=
clePrinterFriendly&amp;uStory_id=3D71fc3f1a-afe4-4c66-8317-21fe182ba7d7">=
Print</A>
  <LI id=3Dcp_article_email><A title=3D"Email this article"=20
  =
href=3D"http://www.kenyoncollegian.com/home/index.cfm?event=3DdisplayEmai=
lArticleForm&amp;uStory_id=3D71fc3f1a-afe4-4c66-8317-21fe182ba7d7">Email<=
/A>
  <SCRIPT language=3DJavascript>=0A=
document.write('<li id=3D"cp_article_more"><a href=3D"' + =
document.location.toString() + '#cp_article_tools">Article =
Tools</a></li>')=0A=
</SCRIPT>
   </LI></UL>
<UL id=3Dcp_article_top_right>
  <LI class=3Dcp_article_page>
  <DIV>Page <STRONG>1</STRONG> of 1 </DIV></LI></UL>
<DIV class=3Dcp_article_clear></DIV></DIV>
<SCRIPT language=3DJavascript>=0A=
		function goPage(newindex) {=0A=
			currentLocation =3D getThisPage();=0A=
			cleanedLocation =3D '';=0A=
			// If this is an SHTML request.=0A=
			if (currentLocation.indexOf(".shtml") > -1) {=0A=
				// Detect if this is a request that already has a page specification.=0A=
				if (currentLocation.indexOf("-page") > -1) {=0A=
					cleanedLocation =3D currentLocation.substring(0, =
currentLocation.indexOf("-page")) + '.shtml';=0A=
				} else {=0A=
					cleanedLocation =3D currentLocation;=0A=
				}=0A=
				// Only add the "-pageX" suffix when the page index is higher than 1.=0A=
				if (newindex !=3D 1) {=0A=
					cleanedLocation =3D cleanedLocation.substring(0, =
cleanedLocation.indexOf(".shtml")) + '-page' + newindex + '.shtml';=0A=
				}=0A=
			} else {=0A=
				// Only add the "-pageX" suffix when the page index is higher than 1.=0A=
				if (newindex !=3D 1) {=0A=
					cleanedLocation =3D currentLocation + '&page=3D' + newindex;=0A=
				} else {=0A=
					cleanedLocation =3D currentLocation;=0A=
				}=0A=
			}=0A=
			document.location =3D cleanedLocation;=0A=
		}=0A=
		function getThisPage() {=0A=
			currentURL =3D '' + window.document.location;=0A=
			thispageresult =3D '';=0A=
			if (currentURL.indexOf("?page=3D") > -1) {=0A=
				currentURL =3D currentURL.substring(0, =
currentURL.indexOf('?page=3D'));=0A=
				thispageresult =3D currentURL;=0A=
			} else if (currentURL.indexOf("&page=3D") > -1) {=0A=
				currentURL =3D currentURL.substring(0, =
currentURL.indexOf('&page=3D'));=0A=
				thispageresult =3D currentURL;=0A=
			} else {=0A=
				thispageresult =3D currentURL;=0A=
			}=0A=
			// Make sure the URL generated by this fuctnion is compatible with =
mirror image.=0A=
			thispageresult =3D thispageresult.substring(7, thispageresult.length);=0A=
			thispageresult =3D =
thispageresult.substring(thispageresult.indexOf('/')+1, =
thispageresult.length);=0A=
			thispageresult =3D basehref + thispageresult;=0A=
			if (thispageresult.indexOf('sourcedomain') > -1) {=0A=
				thispageresult =3D thispageresult.substring(0, =
thispageresult.indexOf('?'));=0A=
			}=0A=
			return thispageresult;=0A=
		}=0A=
		</SCRIPT>

<DIV id=3Dcp_story_text>
<TABLE align=3Dright border=3D0>
  <TBODY>
  <TR>
    <TD align=3Dmiddle>
      <TABLE cellSpacing=3D0 cellPadding=3D6 width=3D10 border=3D0>
        <TBODY>
        <TR>
          <TD align=3Dmiddle><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/5doxut56.=
jpg"=20
            target=3Dnew><IMG alt=3DLavrentovich=20
            =
src=3D"http://media.collegepublisher.com/media/paper821/thumbs/t_5doxut56=
.jpg"=20
            border=3D0 name=3Dpictureposition1 target=3D"new"></A>
            <DIV class=3Dcaption>Lavrentovich</DIV><FONT face=3Dverdana =
size=3D1><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/5doxut56.=
jpg"=20
            target=3Dnew>[Click to=20
  enlarge]</A></FONT><BR></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD align=3Dmiddle>
      <TABLE cellSpacing=3D0 cellPadding=3D6 width=3D10 border=3D0>
        <TBODY>
        <TR>
          <TD align=3Dmiddle><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/l2vuqbr8.=
jpg"=20
            target=3Dnew><IMG alt=3DStanton=20
            =
src=3D"http://media.collegepublisher.com/media/paper821/thumbs/t_l2vuqbr8=
.jpg"=20
            border=3D0 name=3Dpictureposition2 target=3D"new"></A>
            <DIV class=3Dcaption>Stanton</DIV><FONT face=3Dverdana =
size=3D1><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/l2vuqbr8.=
jpg"=20
            target=3Dnew>[Click to=20
  enlarge]</A></FONT><BR></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD align=3Dmiddle>
      <TABLE cellSpacing=3D0 cellPadding=3D6 width=3D10 border=3D0>
        <TBODY>
        <TR>
          <TD align=3Dmiddle><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/yqrm3zwo.=
jpg"=20
            target=3Dnew><IMG alt=3DErickson=20
            =
src=3D"http://media.collegepublisher.com/media/paper821/thumbs/t_yqrm3zwo=
.jpg"=20
            border=3D0 name=3Dpictureposition3 target=3D"new"></A>
            <DIV class=3Dcaption>Erickson</DIV><FONT face=3Dverdana =
size=3D1><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/yqrm3zwo.=
jpg"=20
            target=3Dnew>[Click to=20
  enlarge]</A></FONT><BR></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD align=3Dmiddle>
      <TABLE cellSpacing=3D0 cellPadding=3D6 width=3D10 border=3D0>
        <TBODY>
        <TR>
          <TD align=3Dmiddle><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/1c6lvhp4.=
jpg"=20
            target=3Dnew><IMG alt=3DBeckett=20
            =
src=3D"http://media.collegepublisher.com/media/paper821/thumbs/t_1c6lvhp4=
.jpg"=20
            border=3D0 name=3Dpictureposition4 target=3D"new"></A>
            <DIV class=3Dcaption>Beckett</DIV><FONT face=3Dverdana =
size=3D1><A=20
            =
href=3D"http://media.collegepublisher.com/media/paper821/stills/1c6lvhp4.=
jpg"=20
            target=3Dnew>[Click to=20
  =
enlarge]</A></FONT><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABL=
E>Four=20
Kenyon students-Joel Beckett '08, Priscilla Erickson '09, Max =
Lavrentovich '08=20
and Will Stanton '08-were among the 317 sophomores and juniors in the =
country=20
who received scholarships from the more than 1,100 students who applied. =
The=20
Goldwater Foundation, founded in 1986 by Congress, awards scholarships =
that=20
cover undergraduate tuition and fees to outstanding math, science and=20
engineering students.<BR><BR>"Virtually every academician in mathematics =
and=20
science knows about this honor," said Associate Professor of Mathematics =
Judy=20
Holdener. "Students who have won the Goldwater have shown, at the =
undergraduate=20
level, that they are capable of meaningful, cutting-edge research. =
=E2=80=A6 The=20
awards show that the collaborations between students and faculty at =
Kenyon are=20
deep and meaningful. Kenyon is being recognized for what it does=20
best."<BR><BR>Each fall, a school can nominate up to four candidates. =
These=20
students must then complete an application, including an essay outlining =
a=20
specific scientific or mathematical problem they hope to solve and their =
planned=20
approach to solving it.<BR>"To give you a sense of how competitive [the=20
scholarship] is, I think Oberlin had one winner, Denison two, and Yale =
had three=20
=E2=80=A6 very few schools had four," said Dean of Academic Advising =
Jane Martindell.=20
"Kenyon, Harvard, Stanford, Princeton and a few others. It is a very =
elite=20
group. =E2=80=A6 It is just extraordinary for a college of our size to =
have four=20
winners."<BR><BR>Associate Professor of Biology Robert Mauck, the =
faculty=20
liaison for the Goldwater, said he was also very impressed with the =
student=20
winners. "As I read [the students'] essays, reviewed their academic =
records and=20
talked to them, I was struck by the thought that if these folks don't =
win this=20
award, who can?" he said.<BR><BR>The four Kenyon students who won the=20
scholarships have very different areas of research. Beckett is =
interested in=20
species of butterflies and ants in Australia that form a symbiotic =
relationship.=20
According to Beckett, the butterflies lay their eggs in a plant, knowing =
the=20
ants will tend to and protect the egg.<BR><BR>"My goal was to figure out =
how the=20
butterfly finds the right plant," he said. Beckett is currently =
experimenting=20
with creating different variations of the volatile compounds that were=20
identified in the ants. <BR><BR>After he graduates, Beckett said that he =
plans=20
to get his Ph.D. in molecular pharmacology. "I've always been interested =
in=20
disease-how it works, how we can treat it and how we can make chemicals =
look a=20
certain way, which coincides with making drugs," said Beckett. "It may =
not seem=20
like it's related to insects, but in the end, the rational and =
scientific=20
approach is all the same."<BR><BR>According to Beckett, graduating from =
Kenyon=20
with a B.A., rather than a B.S., is an advantage. "It's an integrated =
approach=20
to science-different disciplines of science working together to find a =
bigger=20
point," said Beckett. "I like the approach-it's more open-minded and =
promotes=20
critical thinking, which makes Kenyon good in the Goldwaters. Also, our =
letters=20
of recommendation are good because the department is so =
small."<BR><BR>Erickson=20
said she has been interested in her topic for a while.<BR><BR>"Both my =
parents=20
are scientists, so I have always been around science," said Erickson. =
She added=20
that she worked in labs two summers before coming to Kenyon. "I actually =
read=20
about the NSF grant Dr. Mauck got for his research on the Kenyon website =
when I=20
was a prospective student. I thought it was fascinating, and I talked to =
him=20
when I arrived my freshman year. The project didn't really get started =
until the=20
beginning of this year, but so far I am really enjoying =
it."<BR><BR>Erickson is=20
conducting her current research on a type of long-lived sea bird, called =
the=20
Leach's Storm Petrel, with Mauck, along with Visiting Assistant =
Professor of=20
Biology Mark Haussmann.<BR><BR>"Basically we are studying how telomere =
length=20
[the protective caps on the ends of your chromosomes] changes over time, =
how=20
length relates to longevity and how environmental factors affect changes =
in=20
telomeres," said Erickson.<BR><BR>She said that she was pleased with her =
award=20
and wants to continue her research after Kenyon. "I will probably go to =
grad=20
school to do research as a career. I might pursue an MD-PhD program so =
that I=20
can do clinical research, but I'm not sure."<BR><BR>Lavrentovich has =
been=20
working with Associate Professor of Physics Timothy Sullivan and Dr. =
Peter=20
Palffy-Muhoray at Kent State University for about two years on a project =

involving partial differential equations. <BR><BR>He explained these =
equations,=20
saying "The physical world (and the world of biology, too) is governed =
by=20
mathematical relationships that can be expressed in equation form. =
Usually these=20
fundamental equations involve the rates of change of some quantities in =
space=20
and time. Partial differential equations (PDEs) are a broad class of =
these=20
equations."<BR><BR>In the past, the equations have been difficult to =
work with,=20
but Lavrentovich's research is making them easier to solve.<BR><BR>"They =
are=20
traditionally impossible to solve 'with pen and paper,' and numerical =
methods=20
are frequently used," he said. "In my work, I've helped develop a =
general method=20
for solving PDEs numerically using a partitioning of space that does not =
depend=20
on symmetry or regularity."<BR><BR>Lavrentovich said he was surprised to =
receive=20
the scholarship.<BR><BR>"I was very nervous when I went to the website =
to see if=20
my name was on the list," he said. "I scrolled down to Ohio, and there =
we were.=20
I was somewhat shocked, because I was not expecting to receive the =
scholarship.=20
I know that the competition for these things is fierce." =
<BR><BR>According to=20
Stanton, the problem that motivated his research-the search for "an odd =
perfect=20
number"-has been an open problem for over 2,500 years.<BR><BR>The sum of =
the=20
factors of a perfect number add up to the number itself. For instance, =
Stanton=20
said, the number six is perfect, because its factors, one, two and =
three, add up=20
to six.<BR><BR>According to Holdener, Stanton's advisor, there are only =
44 known=20
perfect numbers, all of which are even.<BR><BR>"Nobody's ever found [an =
odd=20
perfect number], but they've never been able to prove there aren't any," =
said=20
Stanton.<BR>"Winning the Goldwater scholarship was a big surprise," he =
said.=20
"It's a very competitive scholarship. I was very excited when I found =
out. I'm=20
still excited now, a couple weeks later."<BR><BR>Stanton said that both =
of the=20
professors who wrote his recommendations, Holdener and Associate =
Professor of=20
Mathematics Carol Schumacher, "know me pretty well, which helps a lot on =
the=20
recommendations. They know I work best in certain conditions and I like =
certain=20
problems, so they can say a lot of stuff about me."<BR><BR>"This really=20
recognizes the good work of our students and faculty in the sciences, as =
well as=20
the strength of our summer science scholars program which allows =
undergraduate=20
students to get a real head start on their research skills and =
interests," said=20
Martindell.<BR><BR>Mauck also commented on the diversity of the winners. =
"It=20
also occurred to me that though they had such achievements in common, =
they came=20
from very different backgrounds. Somehow, they all ended up at=20
Kenyon."<BR><BR><I>-Photos by Allie Wigley and Hannah Jones</I><BR>
<DIV class=3Dcp_article_clear></DIV></DIV>
<DIV id=3Dcp_continued></DIV>
<DIV id=3Dcp_story_bot_nav>Page <STRONG>1</STRONG> of 1 </DIV>
<DIV id=3Dcp_article_tools>
<H4>Article Tools</H4>
<DIV id=3Dcp_at_content>
<DIV id=3Dcp_at_share>
<H5>Share:</H5>
<UL>
  <LI id=3Dcp_at_facebook><A=20
  onmouseover=3D"window.status=3D'Post to Facebook'; return true;"=20
  href=3D"javascript:var =
d=3Ddocument,f=3D'http://www.facebook.com/share',l=3Dd.location,e=3Dencod=
eURIComponent,p=3D'.php?src=3Dbm&amp;v=3D4&amp;i=3D1162578701&amp;u=3D'+e=
(l.href+'&amp;sourcedomain=3D'+paper_domain+'&amp;facebook')+'&amp;t=3D'+=
e(d.title);try{if(!/^(.*\.)?facebook\.[^.]*$/.test(l.host))throw(0);share=
_internal_bookmarklet(p)}catch(z){a=3Dfunction(){if(!window.open(f+'r'+p,=
'sharer','toolbar=3D0,status=3D0,resizable=3D0,width=3D626,height=3D436')=
)l.href=3Df+p};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);els=
e{a()}}void(0)">Facebook</A>=20

  <LI id=3Dcp_at_blog><A=20
  onmouseover=3D"window.status=3D'Post to Blogger'; return true;"=20
  =
href=3D"javascript:popw=3D'';Q=3D'';x=3Ddocument;y=3Dwindow;if(x.selectio=
n)%20{Q=3Dx.selection.createRange().text;}%20else%20if%20(y.getSelection)=
%20{Q=3Dy.getSelection();}%20else%20if%20(x.getSelection)%20{Q=3Dx.getSel=
ection();}popw%20=3D%20y.open('http://www.blogger.com/blog_this.pyra?t=3D=
'%20+%20escape(Q)%20+%20'&amp;u=3D'%20+%20escape(location.href)%20+%20'&a=
mp;n=3D'%20+%20escape(document.title),'bloggerForm','scrollbars=3Dno,widt=
h=3D475,height=3D300,top=3D175,left=3D75,status=3Dyes,resizable=3Dyes');i=
f%20(!document.all)%20T%20=3D%20setTimeout('popw.focus()',50);void(0);">B=
logger</A>=20

  <LI id=3Dcp_at_deli><A=20
  onmouseover=3D"window.status=3D'Post to del.icio.us'; return true;"=20
  =
href=3D"javascript:window.document.location=3D'http://del.icio.us/post?ur=
l=3D'+escape(document.location.toString());">del.icio.us</A>=20

  <LI id=3Dcp_at_digg><A onmouseover=3D"window.status=3D'Post to digg'; =
return true;"=20
  =
href=3D"javascript:window.document.location=3D'http://digg.com/submit?pha=
se=3D2&amp;url=3D'+escape(document.location.toString());">digg</A>=20

  <LI id=3Dcp_at_news><A=20
  onmouseover=3D"window.status=3D'Seed to newsvine'; return true;"=20
  =
href=3D"javascript:window.document.location=3D'http://www.newsvine.com/_t=
ools/seed&amp;save?u=3D'+escape(document.location.toString());">newsvine<=
/A>=20
  </LI></UL></DIV>
<DIV id=3Dcp_at_rss>
<H5>Subscribe:</H5>
<UL>
  <LI id=3Dcp_at_yaho><A=20
  onmouseover=3D"window.status=3D'Post to My Yahoo'; return true;"=20
  =
href=3D"javascript:window.document.location=3D'http://add.my.yahoo.com/rs=
s?url=3Dhttp://www.kenyoncollegian.com/articles.rss';"=20
  target=3D_blank>My Yahoo!</A>=20
  <LI id=3Dcp_at_goog><A=20
  onmouseover=3D"window.status=3D'Post to Google Home Page'; return =
true;"=20
  =
href=3D"javascript:window.document.location=3D'http://fusion.google.com/a=
dd?feedurl=3Dhttp://www.kenyoncollegian.com/articles.rss';"=20
  target=3D_blank>Google</A> </LI></UL></DIV></DIV></DIV>
<SCRIPT language=3DJavascript>=0A=
strycountimg =3D new Image();=0A=
strycountimg.src=3D"http://admanager2.broadbandpublisher.com/storyImage.a=
dp?iStory_ID=3D2838429&cb=3D"+pcrandom;=0A=
</SCRIPT>
<NOSCRIPT><IMG height=3D1=20
src=3D"http://admanager2.broadbandpublisher.com/storyImage.adp?iStory_ID=3D=
2838429"=20
width=3D1> </NOSCRIPT></DIV>
<DIV id=3Drelated_stories>
<UL></UL></DIV>
<DIV id=3Dcomments></DIV>
<DIV class=3Dcp_banner_client id=3Dbanner_client_1>
<SCRIPT language=3DJAVASCRIPT>
	if (clientBannersAvailable =3D=3D 1) {
		showClientBanner(1);
	}
	</SCRIPT>
<NOSCRIPT><CFOUTPUT><A=20
href=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/clientC=
lickThrough.adp?iPosition=3D1&amp;iPaper_id=3D821&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Ekenyoncollegian%2Ecom"=20
target=3D_blank><IMG alt=3DAdvertisement=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3Db1qcd15lzf&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D821&amp;javascriptIncludeMode=3D0&amp;iPosition=3D1"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV id=3Dobject2971>
<DIV class=3Dcpfooter align=3Dcenter><A=20
href=3D"http://www.mtvu.com/about/advertising/" target=3D_blank>National =
College=20
Advertising and Marketing</A><BR><A=20
href=3D"http://www.kenyoncollegian.com/user/privacypolicy/">Privacy =
Policy</A>=20
&nbsp; &nbsp; <A =
href=3D"http://www.kenyoncollegian.com/syndication">Article=20
Syndication</A> &nbsp; &nbsp; <A=20
href=3D"http://www.kenyoncollegian.com/user/rssterms" =
target=3D_blank>RSS Terms of=20
Use</A> </DIV></DIV></DIV>
<DIV id=3Dflan_ads>
<DIV class=3Dcp_ad id=3Dbox_300_250_13>
<H4 class=3Dad_slug>Advertisement</H4>
<SCRIPT language=3DJavascript>
			showNetworkBanner(13);
		</SCRIPT>
</DIV>
<SCRIPT=20
src=3D"http://media.collegepublisher.com/media/scripts/yui/build/utilitie=
s/utilities.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT=20
src=3D"http://media.collegepublisher.com/media/scripts/yui/build/containe=
r/container_core.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT =
src=3D"http://media.collegepublisher.com/media/scripts/carousel.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT language=3DJavascript type=3Dtext/javascript>
	//document.write('<scr'+'ipt =
src=3Dhttp://media.collegepublisher.com/media/paper' + paper_id + =
'/template/betapopularstories.js><\/scr'+'ipt>');
	document.write('<scr'+'ipt =
src=3Dhttp://media.collegepublisher.com/media/paper' + paper_id + =
'/template/videoplayerbox.js><\/scr'+'ipt>');
</SCRIPT>

<SCRIPT language=3DJavascript type=3Dtext/javascript>
	document.write('<scr'+'ipt =
src=3Dhttp://media.collegepublisher.com/media/paper' + paper_id + =
'/template/betapopularstories.js?'+currentissuedate+'><\/scr'+'ipt>');
</SCRIPT>

<DIV class=3Dcp_banner_client id=3Dbanner_client_2>
<SCRIPT language=3DJAVASCRIPT>
	if (clientBannersAvailable =3D=3D 1) {
		showClientBanner(2);
	}
	</SCRIPT>
<NOSCRIPT><CFOUTPUT><A=20
href=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/clientC=
lickThrough.adp?iPosition=3D2&amp;iPaper_id=3D821&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Ekenyoncollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3Db1qcd15lzf&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D821&amp;javascriptIncludeMode=3D0&amp;iPosition=3D2"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV class=3Dcp_banner_client id=3Dbanner_client_3>
<SCRIPT language=3DJAVASCRIPT>
	if (clientBannersAvailable =3D=3D 1) {
		showClientBanner(3);
	}
	</SCRIPT>
<NOSCRIPT><CFOUTPUT><A=20
href=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/clientC=
lickThrough.adp?iPosition=3D3&amp;iPaper_id=3D821&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Ekenyoncollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3Db1qcd15lzf&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D821&amp;javascriptIncludeMode=3D0&amp;iPosition=3D3"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV class=3Dcp_ad id=3Dbox_300_250_9>
<H4 class=3Dad_slug>Advertisement</H4>
<SCRIPT language=3DJavascript>
				showNetworkBanner(9);
			</SCRIPT>
</DIV>
<DIV class=3Dcontent_300>
<SCRIPT language=3DJavascript>
		showNetworkBanner(12);
	</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D2&amp;ipaper_id=3D821&amp;callingSite=3Dwww.kenyoncoll=
egian.com"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D2&amp;ipaper_id=3D821"=20
border=3D0> </A></NOSCRIPT></DIV>
<DIV id=3Dobject9973>
<DIV id=3Dbanner_network_3>
<SCRIPT language=3DJavascript>
		showNetworkBanner(3);
	</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D3&amp;ipaper_id=3D821&amp;callingSite=3Dwww%2Ekenyonco=
llegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D3&amp;ipaper_id=3D821"=20
border=3D0> </A></NOSCRIPT></DIV>
<DIV id=3Dbanner_network_4>
<SCRIPT language=3DJavascript>
		showNetworkBanner(4);
	</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D4&amp;ipaper_id=3D821&amp;callingSite=3Dwww%2Ekenyonco=
llegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D4&amp;ipaper_id=3D821"=20
border=3D0> </A></NOSCRIPT></DIV>
<DIV id=3Dbanner_network_5>
<SCRIPT language=3DJavascript>
		showNetworkBanner(5);
	</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D5&amp;ipaper_id=3D821&amp;callingSite=3Dwww%2Ekenyonco=
llegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D5&amp;ipaper_id=3D821"=20
border=3D0> </A></NOSCRIPT></DIV></DIV></DIV></DIV></DIV></DIV>
<DIV id=3Dflan_footer>
<DIV class=3Dgutter>=A9
<SCRIPT language=3DJAVASCRIPT>document.write(currentissueyear);</SCRIPT>
 <A class=3Dpurple href=3D"http://www.kenyoncollegian.com/">Kenyon =
Collegian</A>=20
<BR>Site Powered by CollegePublisher =
</DIV></DIV></DIV></DIV><!--aftertable--><!--cpbpeof--></BODY></HTML>

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/weatherbug/weatherbugsforchannelbar/43022.png

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
OW8AAAAASUVORK5CYII=

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://stats.broadbandpublisher.com/pageCounter.adp?iPaper_id=821&random=&uid=

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=b1qcd15lzf&iSection_Id=&iStory_Id=&iPaper_Id=821&javascriptIncludeMode=0&iPosition=4

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=b1qcd15lzf&iSection_Id=&iStory_Id=&iPaper_Id=821&javascriptIncludeMode=0&iPosition=5

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=11&ipaper_id=821

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/paper821/thumbs/t_5doxut56.jpg

/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEIAMgDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwC1kM2c
NnHAFRspdgDnOcc1Kp34wB6e9IQRgk5HpXlHONdTnA/IUojDKc5HPSkwe3U+9PRGBOc5NMBuyQ42
n5fYVIbZjwRjPXmkClSSnUehpwRm5kJGKdhEXkpu27yD0PPFDFlfaBx0PpStHuB+bHpiporV2A3t
tX6ZzQo32KUW9iLdI4K4IH0qeOGTGdvHvxVgIiqdg+Udz3qpJHeTPtjUqhPJBx+tbKl3N40O7LCQ
KG2vJgn0qxHYwEHdLgY5qr5ctshWEAH++7ZJ/Oj96Yh5k5JPJ2j/AAq1TRqqUQuY7W2ywd2A7AVT
h1C1aQr86IP4jjFRXdt8xZGlJ77mNZktvJKSPlJA4AIyKfs4h7OPY6I3drtJWYEfTFA2SJmMhh6g
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

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/paper821/thumbs/t_l2vuqbr8.jpg

/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEIAMgDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDpJYpg
WL4kK+h5pqKWcHOAeDnPFNiMjTtskLHHQjmppIpXBLAB0wcYwT715+/QwGOSHKqSVJ6pUTcOQchu
2ak8yQExrhjnINSExTKVlWTzscnPGaAsQRsynvzUiFFVjvO4HI4oDKjApJ7cjpTv3hY7AGUUCDzD
s3bvmPHSli85sCPLDuO1MZi2QyLkk/WpYxLHjywAOp560dRoZKs5chhgj2pxRgincTn3p0pkVsbe
veoJZjGCsahmxn2ppXZcYOT0JN5GCqMNvU5p5nByyIY/cN+dUUvJSh3EHIyQOlOeZfLJZhg9s1ag
bKh3FfUGQ7Ul3Y6k1Kb4FAJFGSOCKylSFpE+UIh+YM3SiWZVUbeVyRnP5U+RFulG1jYjnP8ACcg9
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
AAlVWDBTzxwOKKKKBn//2Q==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/paper821/thumbs/t_yqrm3zwo.jpg

/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEIAMgDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1A5ye
T1oBPqaQ9/rRn3qQHZPqTRk/5NJRQAv50Z9/1oo60wFB9zRn/OaSj8aAFyfU/nRk+/50nSmSSpGC
zMFA7mgCTJPrTTIB3zWDqHiSCAFIgXb68VgTeJLqU5aRwvoq1m6qRag2d35y/wB4/Wq1xqEdsuWk
4+tcXHrjFs/aHDD1qtc6q91LgnIHcd6TqDUDs49et2/5afoRV+G9huF/dyg/jXm7XjA/eP4VJDfy
RsGSQgjpng1Kqu+o/Zo9KB9zmlzj1/Ouc0vxGsu2K6IVugft+NdAG3LkHj2NbRkpbGbTRJn3P50Z
9zTQRS1Qhcn1P50Z4zk0naj8qBC5Pqfzoz7mm0ZoAkT7w5NFNX7w+vrRTAZ1J+tFJ1PPrS5NQMOa
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
VqZH/9k=

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/paper821/thumbs/t_1c6lvhp4.jpg

/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEIAMgDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDuh4b8
P2Vo7Pay3cmSwkmkJIqrJY2Wmx/bUsVkjyHCp1UY71j7tbCvFJqCKsYztkT5h7Vo2lxq9xA1sot3
tOjSHIB455p3KswTV7XVJSli81im0tMUYnIxjGPWte18UXOm2Ue+3iks1wEUNiWRexxWAdROj6eb
y101VjR1ik2NkSAnnj196vadLf2sKS2uhzTLdplpZnXPXIxzxQI6YeL7SV4o5YZ7Ys4B81CMfj0r
YeVpLl4oiudoYP3ANcS3iK8vWm06PQGl3L8+58qrfUVnRXOuaRPcyWt9aogCsYXVmKp3C59KNhHo
VzZPK5EbKrYDeYBg5HuK5LxGssVxL9vvgImjIVN4yPwNNWe28RanAg1q92EgOpcRg8cgAV01p4Y0
SOV5lsY3kJwHlJc/rmi4HCeEvG6aNY3MOpyzTRKw8lyMnA7GujTxs17ibTtPnmh6mR2CLk/WmeJ5
9Lis5tOWGNlYhn2jofr61xF1qiwoIFyI0GAo5P8AhSKUbmr4i1H+0jDHcRWsbRjg27l2H1OB3+tP
g8b6pa2kdsskbRxjbucbmI9zXJPfzyjOxIl9W5J/wqjc3qAMGlOf9hc0tSuVG3qWpJfupnDBVJIC
9OeSK3PD3jg6NAYGjE0PGN0nTHGBxXAQPHu3zTPIp6DO0inQyxiVvmwCMpuOSKdg07Ht1j450q/g
AadIJicFJG4x656Vdu7+K6sIRZskqmQK/OQEJwea8GF2I2jlEjPlv4Rjmuk0nxi+khmL5WT/AJZ9
iexqkiGuxz3xStpE8Z3kvzEREYyfurgYH0rqvhlq0YtZIPJd2mAXK9QR/IVmatKPEqz3E6L9pkAy
2fvADjNRfC2/Gi+LXs79hGjoyjPQHtioe9x20LnjLXr2O81LQ7hY5A0qSNN34UcfrXHs4ReMc9/S
t/WtPubpNQ8QMuLWW9MMQY849q5102KSSM+tTLVjiaPh+/Ona1Bckk7M5P14Fe2aPLOum6e+zZEm
CS2dxz6/nXinh8JJq1r5kZdRIGcAdQOTXvouUm0vMIYcAkqvuOM1UNhSsW9Zm8jRrl1PzeWVXnue
B/OoVurHRLCCKaQIQg+UnLe9crquqTa9qn9kaYzxrE4NxIwzgqe1dIsFpDEsMK+fdOCPNlGScdSS
elUQY7a1Z654gNuIpLq0hTKxqmQ7+v4UVsR2lx9ti+yCG3iiXBIGSc0UwPLNRH2m9cncq4+YFskn
3q7c6qm+MIjLaxqC0YbGcDrXPSSTfPFKCXIBUIfvfU1u6NAlyQLzawjUFEHQf5zWaNixFcPd20rT
MuD/AKmFRwn+0fc1s2/2q/tpUuZQsMI+5F0Y9gT3pzQ2lmnlpse2EozxyPrUUVx9luS9jIiwv80k
E3BHuBVpEnWaQIYdMBRFjXHpjJrEhurae7knuIgsMUjK4IyZPQD1qC5162jsGlguYg6/KYgeVJqv
4fhEEtzPuSQPEGUyvnB7kD1oJM7VdFnuXm1WJUsIo32pGOGPv7VFeeMbqCxgtBMHmRdu5Byaz/En
iV5t1rbKSSTkZ4z6muXmn+ywlfvXD/ec9vYUmWkXL3WJWb7xaQnv2rMmuS3zTTlQf4UHJqoZXZyq
Zdj1anybICNy+ZKe3pQMgutVIwqxlVA4Lck1V37380ySKT/d6mrDBPvyEFj1x0X2FVZIzPgL8qjv
7elIBv212k2Rpu7eYetDS7Tt3EsSMetPMGxABnn04FRSJGkZZWBY85H8qdwL8l5CypEhCsxwCP1p
YpXaVkyCFHzZ9KwoJo5blFc4fd8pFW5ZWttSMic7gCR60yUb7yz2zJPCxeMD5lB7VaurOHU40u7d
itxGM5BxkelZyTtAA3DIRuGOq1PBMbeTdGSFYb19M9xSZSNjXIZYdBsXF60sUnzCADCxvjmuamJZ
VBI+XrXV3+oLqfhq3toIVzFKZGI68jBFckcs20LjnkVnISVjd8JSldfhKR54IwfQ9a9Y8R6nLe2S
6No5UmRkhluFPyxk9h715BoNvdXOrJDal/nBDFOu3+L9K90ksLa1uNFsbWNURXMpAHUKuMn8SKqG
xEiz4f8AD9toFiIYj5kzcyzN95zUFzcTt4iaKEq0aQbSjcDJOTz9MfnU+pX9xJI9lpyK8w/1sj/c
iHv6n2rN0+2WPN7qU0jKm4hyuA2Tyxx+ntWiRJLqfibTvDulGaRi8jHCoBje1FeL+O9eOsa3K9oT
9kjJSIE5B9/xoqXKw7EunXdtKw3zbHJwSw611fh97IJMt2WDniMr0xXLGyTzGhktDgDkqOV96eYb
mzjkEb+ZCD9xjyP8alF3OiuWd7l7WOYlI2yMfxEV1un2jLLtu1VZZYj9ce9cFo+uWi34+0RGMeVs
zjkEdx710p1RLzUrO6uZVjt2Xy5ADyT61SYmV9StYX1D7PDAjv8ANuk9Pasy8jttNEkVs3zBcNIW
7GutvoLazspZ0jO2QERv1wBXmmsXe2Dbu+9IS3vTHEzLq523Dug9cms15gctM+M9s8mq1xevJuEX
OT1/rWeZ1VyS28jq2elIq5tm5AjOwY9gKotcSEEjv+Zqmb7zBtU4zTjOQNqsAMdaCbjpJZkwzAA+
nXFMjuJpMlFPA6mnIS65zwPWmSz/AC7EJPuKQxRBcXT/ADynHt0qaW3SMYBJAHU022YLhST/AI06
4ZpJfLAwuO1AyrZxK1wWI+RTnPvVxh526TuHAH0qOBMIw7sf0qy2xINw6ZwPei4KJKGZH3KcoBwM
9xWnazRS74gMFRyo96yrdhLcMcYjXHX1qysTQXskqjgj88UXCxr2g2yMFbaSO1UL1BH+/RcPuIYd
s1YjnBMcyD5SdjfjU5jaeCRUUbmBBHuKloo0Ph7fi28VI8xVYzDIu7PGdtei6Feat4h1CS/g8mG3
RPs6TNyVGedo7mvINNVY72PIIBOCBxXoeieI7SzKWl7eNbafENu2MfeYnkk9QKcTKSO3+ywsy6bZ
PII1O65mHJb23eprC+JXiBNL0UaTbH/SLlcHB+7GP8elbJ8WeGtMs/3F7D5YBZVj5yf8a8V12/vP
EmuNKFZ7m4fbHGvUdgtNuwoq5d8FeEpvEd411KfLsoJFDNj7zZHFFa2lJ430PTW0m3t4rdIZA8jN
gkbj1J/KimkxM5myk1m6lKwmPe33mc7Rj3zVp31qf7VCYIJzEQrSowCn6VAjXtyQsKrCnTcxyTWv
pfh37XdvDcThyuN5LYA9sDrUopmBPqEjv5N3EitHwrbslT9RSjVZrFomJlaNHB5U4JxXS22mRXWq
pZwWTyQrJgQwkZJHUseorrLbR7S11JrabTA0L23mFJDuPXr+FNRFc4w+NJtSsLgSHbGiEqin5V/C
vPrrVWuJEXJIAySa9C+IL2NloMRtIIonuWfmNQOB0HFePrLIyyEjtxRaxSLd1eHawjO3PJI9PSqg
clORgGomDFI1wScbiPep47WWbgg4+lFx8rZF5hL7U596nSUBioG5hyfSnvZpAhZ+D2HrSW9q8p5B
VT1pXHyMeryStjr7CrccLBcMNop+yK0UBSN/XA5xTI1nvZQqhkjHVmouXyFu0hQNx8zevpUrbMNj
GanYRWVttTJZhySOtZTTHcFXLOT0FTcpxsh0SOXCrnnirogcIWKE7BxWpo2lM2JbgADrjHat5dLH
2Rn8vgjjIqXIuNLS7OIWTaAndmrYe4URxttzn+fSsvUrSS1vR8h68VYtpGZNrADEZI5700yHGzsT
QSFPMizweQa2IHMUwkz8pGW/KsZVDrGwP3gD+laULBo1PX1Hsaokiu1EMspGQQN61u+Fby61Gzut
Is9IivL24GfOl5EKevNYt2yySqm3kJjNep+ErjTPC/gX+0cK4Kl5ZQOWbsv9KIrUymec+KPD7eFb
6G1kvVuHMQd1VcBD6Vu/Dezto5LvXrt4ma3Hl28TMCd571zV3dXfinxAzrh7i6l4A52jt+Qr02D4
S6VFbkx3t9HMyj5g/AP0xTSu7kvax2P9lwTWbJOcyT8yOD1NFcTb3WteB57aLWpTeaU0mBdLyYj0
G70HNFWScPZwvHdAyDyvlLqJflBxVn+2JhqNw1q6O+MhwuMVz+pa9caxexz4WJVGASecd60NEmi/
tSJwkkscT+Y5jXLYHQn2zWaZVzsfC0h0uzuLt5c6hcHPklMuCTya3tRusalFbMWR7i1ESopywy3O
awbO+hvfFkE6XcbGckSSPH0PoPeuontLYeNEmM3yWVp5j5POc8A1aYjz/wCMFskOjWc1rFiCGQxZ
HdiM/wBK8l02xNzKkbHG4/NXu3xEitrnwJOfOjNw0glijzknnk/lmvEbC5W2uLYE/MzjP50SNIHX
W3ghHPmP93GMVeXwxDGu1VrrbRPMt0PsOtWxagD7tS0dcUeWX/haU3OFDFB0GKsweHiIQmwg+4r0
prSMjlRSi2iAxtFSy1FHn0PhSIMrGPP4Vv2PhuFYsFACfaujEEeOg4qaAKOwqSkkctc+BY7oFhLh
vUjpUdn8P4LNgzSb29hXdJtx7GpQqkYoKsupzEXh9EwD93pj2rSXTI2AU/d9K1vJUjimMjKelTYr
Q4zxToKyxxtDHk5wcCvLLiZ7LU2hcbducivfZQGBDD8K8g+I+jva6gl/En7qQYbjoacTCtHS6Mmx
ufMtVOcbT/WtCKbbFMecgACub05yq7fUitKFnl3AdeTj8a0OU1tRcxMrqfmXjn3q7rGtm+soLWIs
sKRqJEHCs474rGvXZ9Qw7ZiQABffFXdB0x9f1WGwXcEzukYDO1R1pXIfc6f4a6ZLaaomqT2U7RH/
AFL7flPqa9og1izuJDEsqiVTgoeorkZLt9DNvp1nHIIYxttzJwCp4K/XvW3Boguistw4Mg5BAGVr
VRstTO9yz4hhh1fw/e2Kp5vnRlAMcA+v4UVrR7UUJjGOMGijQD5S8yETx+WokRF+bccbj61uaNqT
adJPc20EgdlKkqRwD6+1YVlYurbSDuXjP1rrNAey0+6d7q3M42YCA9W7ZrK+o7M6DRbxNPtZNTuk
T7QB+6gK5O4/xewpYLnUZr1lyu/UFDOznhV9T7e1Yqf2jqN7Pcs2fMXD84wB0FdFolg+ta7b27v+
6iiAkCHGVXtmrvqFjpINHg8QwzXE6R/Z0ieGMkY3uRgsfavm2+t3tdditW/1kUwRsdyGwa988aa9
N4e1e3sbVFWzEILxj1yefrivHLqza98bxEKCJp1YfTNHMnob+xlGKn3PUF1qx0jTx9olHnYGEHWs
lvHlsGO4jFUfGNnB5q5TlVwTmuBvGgXJCds5zSb6Giulc9TtvGVjcN/rlHsTWlDrUE7DZIDn0NeD
faIQ3yFlPqDWzpOqTwSJtlJ9QaljhUPa1vFzywxQmoRxkk8CsTRjJfxLgk8VFrUF3bRMAD04NSdC
Na78V6fZ8STAN6Csq5+INmvEMmT6mvPLy3kLs80rZ71mSSiLJ8sbffmgzk2tz0j/AIT6YvmMFl74
Fa+m+PWkYLPbOV/vYryzT9UhfCeaFOcfc4rqdOvyjKGCOhOAyHIpPQcLS2Z6jFdQ3sXmw5wfUVzX
jmy+1eHLgYyV+YVqaXdF4lHG3HarerWv2jSbhMZ3RnrSTLa0seDaeiLGxbsfyra8O2b6rqwt4jhc
ZLf3RVA2RiujAB8zdFHc9K7Xw14dmstIuZpCUmkXa2OoHpWjdjmpU+aVmU/EHhiLToxc2l8l3Hu2
yY6xsfXFdT8PIE03TLq+3qkssmzdjOBj/Guf062byr+2ClleLoOfm3DFeieHtKS0nurPKx2sOCzO
QG5HSik+Z3DGUVSlyotatbSavZxpYskk8bCRZHO1dwq7oL3NwWaeTypnzujHQHvg/hVqzvLd4Bba
bCZVAILKuAD9TUNncSRXtwsNuqlsNgSDhjwc49xXRujhNFLXZdznBkG9MKx6e9FM0+SUardpeKqT
EKUAbII6UVAzwK3j327Zwu7jcat2MGCDI2duDkCnvOLaJYpERU68jFQQ3Iu5DAoEcbAkPng47Vkk
a3Oud4LrTbuW0tZdsSDdN0Byea6Lwglvb67MiKcC3jAPuRmuOsdReHwzLZxtGwmlVNufmPOa6Twa
l1J4iv8Ae6qRHmRVOVPpVogofEWxkk8QxP8AeSSMAH9K5ays4T43s2TBVQRj0IFeseI9NW40uO4Y
fvImDjI6DpxXlejW8q+IjI33oy2c9qmStK6PQpyVSik+hq+I9Ia/k4JwRg1x1z4citGZSN5YYJJ5
/WvUJD5jHjg1h32hfamLEsKb7oSjdWZ5XJ4YhWQkysR6bRQNEbzQUYBegGK9D/4RxUPQn61LFoqK
+dozS9Q9nFbGl4GtGTTV837w4ra163WW38tV5qXRLYW9oq7eTzVyeLzGyaiRvFaHlOp6AgQkko57
4rGTSI1iaJ+Qe7CvYLnTopU2yICDWW/h+Anhcj3pIHC+5wGleGNPiuFmVsuGyATx+VddaeGLRx5q
gB25JAxWlBoEEbghMGtm3shEoAobbBQUdilY6eLYBTz71pTJutmXsRin+WFxTZSFGOxqUNo8dkVY
/ETSbN5iZsL75rv9G1VL4G3eIIXXGB604+GLCJrm6JJmlbdk9BmqOmWLQ6l5wH7qNsZ9aJbl0Ixs
V4ZU0q9ikeJpWkuFAjT7zAHoPxxXoWnWKXXiG+m1GHZMyo6xAnABHfsTxXnVncm/8e2SLgpFcBV9
OOv616e8u3xxEquMSWx3D6H/AOvW1NWR5uLqc9S5vxRiGPaoVVHTAxxXN29peJ4klmVDHZKuQCud
5Jz+ldQXUcd/aoniEiEPlVPJ5rRM5TFkvLc61PHJMinyV2uxACnJormvElz4a0/WJjqcnmBYVEcU
Tc7s98d6Kq6A8o3y+RtdhIO+Txiq0FzHbLiNfmLcZHQ1TUNIwRWLtnoDgD2rSKJBGivEpbqfYVzv
Qs0LV2ZQM7SG3AqORXUaDq81pfzpYOAZgoy45b2ri4rwSPFFBGW3NtwTium0a+Oj3VyojhaZMKrO
N236VUWG56VqclzcIYpYCFWPGfNHJI5rmdQtFj8h4REGjH7xsctV3Q/tmpWN3fzagFMhOIlTdj6V
W8R6XqFmFe3iEkLLkhnAZT3z7Vb1RrQlyuzCIhgCTge9WWeIKBmueN8UgRmOPlBP1qvJq2FPPNQ3
Y7oq5tXl3BCCciqekXUmp3rbYv8AR4+reprkdS1Ka4JQE8+laVj4mj0rTYLVV24Hzn1Pc1Kd3qDP
QrWVdxXjI9KsyDC561w1p4liMgYv161p3HjO1tk+c8etKT1NFsal5dy2qGQx7kHX1FR2+oQXQDow
rNfxHb6zp8sdsjFmXAO3Fcq0tzp9yGUsEJ5BqCj0lZE68VKsikcYrkLPWfNQZJB9q0Yr7GBup3Gj
bZvmGDUc3zBQOtVY7kNznNWky6k0iKmxUvYXnVIo2C85bPeoteuINJ8PmcModF2oPVyMCsifxXbQ
apeW7AkwttPFchr+vXGt3ARDtgQnag9fU00jOdVRjZEOhXv2XWLW6lb7kwZnz+terrqsDalYaiZQ
Y3LqH9VPevIbRLdLq3+1f6gSAyKf7tbt3fz+JtRh0/RLb7Hp6uI1kOdo56/X2rWD0POlqz0q58f6
Jo1rIZbk3E4OFji5J9vasVJfFvji4Ckvo+lMu7cAdzj09zVzwt8NLLSbn7ZesuoXIbgyj5VPqBXo
MYZRtKKqjoFq0Zs47RfA+j6PrxcRyXUggDh7khsNk5I4orod0v8AwkZyFCG2GPX71FAj55ie3gMj
KoBxkHGOajeMybJN3yv/ABHpTJI7YPvaQNztAHQmqr3cqSYkUukbcKOn4VmzRs2IGtoon3QAythV
Ofu+9XdNZ7a6eTy0kLjC5HA/xrItro3EwPlqGxjb7VvaRZXF5rENm7bFdhgZxj3NJXGmjf0a+1GC
OZLaVAJByAmSM+ldLLBLPZTSyKbm7WJldpednH5CqaWVrCgt9M2yRrhLm4ZsHr/D6101xYounTsb
11j8o7ioGDxWyVkQ2eQzSu1qjHGRkfrWYxd2xg81pwgSWUgySyyHt2P/AOqhYFzuHOKxkd9Kb5Si
to5IOOaluNLE9sVZQQRzS6jqC2cW/b0HT1rKg8XtdErbxZC8H5elCaK1ZTa1ubafag3KOxre0yz+
1yBriNSR2HSqia5IrDzbYHvytaVpqs7km3s2IHJKpUtamsYu251un2KxRgLGqj0FR6npiuh+XrWa
dQ1+JlEdodrLuGQORWRfeObqCWOC5tH8xzwAM5pDfqXYbFlYqvBHTNXoopGTkHeKht7r7bGJEUo+
ehrdRAigsOSKhgmyvalzgGugtiEQ5PQZrDiG2U4rSkm8rTbmXusTN+QojuTN3R5HeT5up5GILzSs
7fiaz5rgQJuA+boD61O8S+duY5LEt+B6VUurdQVPOM/hWtzgepb8OWh1rX7LT5A7RyygOAeSK9x1
3TLXStPsY7a1jiihmX5IhjjpzXm3wvsRJ4wt3UDckbON49q9Z8XSTJ4emBiAbcpyO2CK0hsZS3Oh
gXCrgbV2jipqqae8s1rDLIAu5BwD7VaPSqJKDhf7eizjP2dsf99UUkgH/CQW5PX7O+B+IooEfJwv
XWZstkdB6CnC8LfKsuQfvc1Sj8plyZFUH1ojKRysm0Nn9azYHSaNcwQFnuMFFHyknHNTXGu3k+oL
IJWiYgBT321gtBJhAp2qecHkV0i7Lq2jnaEL5ONzfpkUlYEd/oAeey33qmNcxgMBhiM812V6iXRN
pEjCIDcwz1HpWQlvHceGNKukmKI7op/Pmup06ELYvInJbPJ6mtkM8jjgJmu40TABYkfQ1HbyAHBr
Z0+Myaxc7/lJZtwArH1izfTb9lGTG3zKfUVm9zqovQZcWCzOGxlfSqR0WK2leW2Cxs/X5eK17OTz
ocGmXQO3GPxqUdSa6leF7qKVmlsYp0OMGMjP61qWuuXNvBIsOlBJHzjcRt5rmWurq2kJQnFTw6ne
SEBiQDScjZUqUjqkutUvBEZCkWwEEJ70+DRbaJhKyCSQdGbmqemFzguxPsTXQJucYxgVNxvlWkUZ
IsxFcnaOOtXywwAT0FOmjCNnr3qsT1JqWZNjkAL9eKXWbjyPDeoSr/DEQPx4/rTFfkKvU1H4mXy/
CN4o7quf++hTiZyd0zyD7U8Ds5QOzevapLKfzUYScjPA9KjnyybTGOO/eiCN42JVMZq2cZ6n8Kli
/wCEkk8wgOLc+X78jNemeKGj/wCEbvlbBxESB715T8MtSs7LWGlvuGZPLhbBPzE16b4kg8zS77OW
UQnNaU1dGUtzS0abzdDs5SMZhXj8Kfc3RTKdDjOa53wpqayaBaxFvunbzV/U7tVmVVYMCME56VpG
JLZFcX4/4SSyy4AWF92fTIorB1VobrVYMSkDyJCxB9KKqwz5z+ZsFosRj0p5aMjcAOOmamnZY4XC
N24HesgMzMAx4BwfeudaiNu0nYSLKDuK9jzXW6fFLPaXQkX5pVztA6HrXFW0gVwCAp9TXR6fqc29
47eQiQ4G7dgCpejGjrNF12Z7O108u7osm5Yx2r1bQ7yRdEG8fOrNhT6dq8m+GFv5/iX95+8dFZie
wr2mRY442bgAAk01VaLUOY860FpLzWLyVkwzMzMPTJq7r2lSXFk7eS2EBYNjpU/g+ItrF9K2NrFi
PzrrNREX9mXIcgL5TA/lU813c2i+VWPILD5ZShwPWtg2YmTArDut0UvmLwQeRVuz1pAOW5HarN4s
ttoIkByBTIfDoEnWrcWsBj8oBXvV2HUlLjOM+lJpG6H2umCFcYH4VpCPYnPBqsb+NU3MwB9M1Sn1
dWzh8ioY20Szyc81Qln3MVXr7VUuL7ecLzU1lEWIZ6kybuaVhb/NubrUviC0N34euYVKqTjBY4HU
VNAoAHHNS6hD5+jXkfrESB7jkfypx3CS908d1HTrrT5CtxEU6EHqGHqD3qJ+FQBCCehrsPDy/wDC
VeHb2xk+eeEloC3VWxwP6Vxzb1l8uRSJI22lT2NbThbVHCt7HUeELRbrxHZxlsKG3flXs19AJLC5
jZyQ8ZBHrxXh+hTXNnqIvLcZMWD9c13jeM7gW7iS1BJUjIaslJpl8ierLvgeCGbSXEnLJKR1rqHs
bZuTHz9a848M+IRpsU6G3kfzG3DA6VvP4y2MNtpJt75p8zQlBMdrtvbWWoxNHGEQ20pOPpRWHr2s
S63PHHHbvEojZd31oqk33KseLrNH5Lbo97YODWb5DSRnACnOTxXoa+BI1TadRXHslSR+ArEZ8zU5
c4/hSpU0jnszzwWtyzYK7mA4DcYrpNCtrxi22zic+rHp711MXg3SIDue7uppOwKcGt23trW3RV8k
4HHCgUnUQ+Ub4W02XRHF3HdQLKw+YZ9a6G91SW7jaOfUYEjYYKp1xWbHPZqwUWshx3IAp7Xloq/8
eeT7tU80exSbXUlsri1sNxh1EgdPlFTz6rFOjJLdXEiMMFQnBrNfVU3YjtIwB1BNA1yNcKbVBn8a
amtrD5/My9RjBkfaPlJyM9cVzV7bSREyRnA68V2Wqopu3IAz0IHY+lUhbLNAysBW1u50RelzlLfV
3tiN3J71aPiB9wK8e9Q6lpm1yUFZ0NjKzgHNQ9DRN9DXfWp5ztRiB3JNXrTz5gBy1M0zRlyC9dXa
WMcagKBxUMaTKNrZMCGfk1sQqFA44oKheKfGMEDvmkUkW4TnFO1O7S002VmPVcVGJFhTcxAAqJLf
+0JVluARChysf94+pq4RcmKpOMUUfA+iHR9OmnfIlupTLj+6vYf1rkfiRbjR9egvEgH2a+OSV/hk
HUfj1r1JTj/61ef/ABSvIDplraOA0rS71/2cd67uRctjy5Sbdyt4aaSWyla3VGG7kGtjyb4DHkR4
zmvP/DesvptxsL/unOG/xr0RJppUDruZSOD6ivPqxlGWmxopuwL/AGgAQI0A9qR11NsYA/CnZlB5
De3NPUPv++cfWseZj5irGNUYk4ZcHCk96Kvb2GPmbOaKLyC5AbeZMkQs3ocU8W9yACYcA/hWq5jT
5fM+bOeDSsSY88+tAcpmCKbd/qT09aU2k7/N5QGO5NXweMAPkc8LQJl3Hajk49KLsFHuU1s7lh82
wfU07+yJTksUGKuLM8hAaLPvT/Pcnb5W8j0NFx8qKKaQu77yN64qVdIhjdGbZgsOvfnpVW/8QWem
ZM5VXx9wHJrlLPxk/iLx1pmn2ystrG7SOM/eIU/pnFbUqcpST6EycUjdvONQuUJ6vvHuCP8AEVXL
hEYA1a11fKuYrgepVsdwaoyfMODkV11Y2ka0Zc0TMmkDuQ1PtLdWbIA4qK6iJJwTmmWclwjlSOKw
kdMWbcTbGwDWrbzEKMmsaAFjkmtFWVF/rUWLTLwcN14FI06oeBlvQVntcl+E/OrFuu3k8t3NaQpO
W5lUrKOi3NCGLzGDzc+i9hWgh/CqELVdRuB0rrjFR2OGc3J3ZJNMsMTSO21VGSTXhPijW21vXZrg
E+SvyRj/AGRXc/EXxH9jsRptu+Jph85HZf8A69eUgmiT0sSW43wwOa9D8G+JUymn3ZTaeI3ft7V5
qG55qeGZo3DKSCDWUoqSsxp2Z75LKgAISM+4FRiaLB/dAn/drzzQ/GEgCQXcjbQMK3p9a6yC/wDP
jEkUisPUGuKdNwNPamyl0neI9e65orI+0zZysgGaKzuL2poDU7aU7nhUMeozg06a7Xyv3agjpjfW
AZArnIJ/Gmm5SNDvjQD3NF29iFVZrHUvJcgAgd/mzTBq5z8gIOecmucn12zty2cS+gHasO88RzS7
li/dqfStoUJyF7SR2t54jhtRukl2n+6pyTXK6h4vvblytqxhQ9weT+Nc40jzNuckn61HdXAtLYuc
ZIworrhQhHV6i5n1Kms6m0SMhfdK/wB5yckVt/B+zNz4nvL1hkW9sQD6FjgfoDXn9zK9xOTnJJr2
H4QWQttN1Ccj5pXVSfUAf/XrSGsxS+E67VofPt3Q81z1rI2wwv8AfjODnuOxrrLgfOeOtc9qFi0U
vnxjkZ3AfxLWlaN0XRnyspzKrA561AkYBzUkh3Dcpz9KZBDNctiJeB1Y9BXHy3O3mS1ZcikVRjHP
oKsfNIRkYHpSwWawjgl37satJBzz1rWNG25hOvfSJHHGTwPyq7EuAKFiAPvUqcCtbGF77ksfB6VH
qGpxaZZSTysAFUnmiSdYULGvM/HOuNcyCxjY46vz2oEcxqmoS6pqM13KSTI3Gew7VXHFMU9vSgE1
k3djHg89eKeCM1EG45HNOBGaEBKzlVyKvWGt3NmwKSHaOxNZch+Qc96aGx1pvzA9H0zxPDdlVmYR
t0ziivPIpSpyDRWToQeorHb3GvlWYp36ZrFu9XuLhjukOPQVlyTk1EGJNaxhCOyJsXDMX7mnZAqG
LmnSuCwROT3rS4ydX53E8AdfSuf1W8aeQ8/KOBWpezCG22A/e61hxRG5nyRxUTfQaJNPsXnlHykk
mvdfA9l9g0BEIwzZY15voVg+5dqjPHNew2MfkafEnTCitaUbakTY66mit4nlncJGoySa4zV9du2d
ZI57ewtgflSZDJLL/wABHSq2reIYtQ1KQtcNHp9s5RPL5aVu+B/WmRT3LfvbOxt9PjPW5vPnkb35
rRu4th9hc3d3MvnWLeQ7AeYV2cZ68muw+zpEojRQFXpXnl7c6c8hN54gubiTriLhR+Vd3peoRapp
VveRMSrrg565HB/lUKyKu2tScRgdAKcBilPFID1pDAmm+YADk0McCqF1NsBwaLXGUdd1VbS0lkZh
tUZ59a8lnuHurqSeQnc7Zrc8Vasbu8+zI2Yoz8xB6mueGQfWs5voCHdMHpS5pmcjpQp521Ax/fNF
JS+lCAH+4M+tNzSv932qMNxTAkU85opgbmigCZpDnNSIemarr2qZTyBn600IsGXamF6n9KWM45PW
od2X69KZNLtQ46nihsCpeStPPtHc/pWnpdqu5eOc1SsoDKfMI+8eK6fS7XEq5FEVdg9jpdHhWPy1
C8kjtW54q1kaT4ZuJg2JCuxPqRUGnQoPLPHBFch8Tr8zXFtpsbcIN7AeprdvliZ7so+GpZRaQi0s
/tF4w3bmHyx57n3rXu7G3H73xBrAd+v2eJuB+Fc/a6gdPaLTbq4fTomUFnEeS1bC3XhexfEdvNfz
9Szgkn86zT0KauV21rRrNCNO0hrjaM5KZ/HJzW58PvED6nJqFpJCsI3CaNF6ejf0rm9a8T3kmnTQ
2ukrZwSDaZHGDj2FYng6/m0rxHZ3YLtHv2SccbW4NRzalWPeAhxikIx2qY46ggjrn1qGVgAa1Woi
tO+ATXJeKNYGn2R2EedJ8qe3vW/qN3HbQvLI4VFGSTXk2tam2qag85/1YG1Aew9aJOyEtTPJLEsx
yTyaQHkUlB6Vg9WWB4o6nI4o7UfyoAXdxyaa1xGmdzDimyRiQYJII9KjWFB/CPrSAf8Aakk+RQxz
3pwPHSmhQp4Ap9AB36UUmcmincCU9KcDwfTFFFNAAboKr3THsc44FFFIDf0iz/cJx0HpXW6fYnjC
n8qKK2giWzfgjaDacHAPpXnupWz6vJr+pvk/Z0yg9ywH8smiirn2Jjuc9dtd6xdRSxo0rwoGIx2H
/wCqu6ljj1vQ7fW9OULe2YG9F4JA6iiisFsW9zGe1XxBq/miZ3hKBhE38B7j3rfHhqNIMImCB2oo
q4JWFJnW6NdvLpcSSZMkQ8tvw6fpTrmUpknoBRRWiEeb+MNVeeVbZSRH97b0z9a5Miiisaj1KQDp
R0ooqBh3xRg96KKEAnO7IFKwz8wHPpRRQAwd6BxRRQAncUUUUAf/2Q==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/storyImage.adp?iStory_ID=2838429

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=b1qcd15lzf&iSection_Id=&iStory_Id=&iPaper_Id=821&javascriptIncludeMode=0&iPosition=1

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=b1qcd15lzf&iSection_Id=&iStory_Id=&iPaper_Id=821&javascriptIncludeMode=0&iPosition=2

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=b1qcd15lzf&iSection_Id=&iStory_Id=&iPaper_Id=821&javascriptIncludeMode=0&iPosition=3

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=2&ipaper_id=821

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=3&ipaper_id=821

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=4&ipaper_id=821

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=5&ipaper_id=821

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kenyoncollegian.com/media/css/global.css?v43

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_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_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/page.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: 6px; 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: 11px/20px arial, helvetica, sans-serif; BORDER-LEFT: #ccc 1px =
solid; WIDTH: 16px; COLOR: #333; MARGIN-RIGHT: 3px; PADDING-TOP: 3px; =
BORDER-BOTTOM: #ccc 1px solid; HEIGHT: 16px; TEXT-DECORATION: none
}
#slider2_wrap .pagination A SPAN {
	DISPLAY: block; TEXT-INDENT: -1000em
}
#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 0px 10px; 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 1px =
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
}
#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_at_wrapper {
	BACKGROUND: url(images/at_bg.gif) no-repeat left bottom; FONT: =
11px/18px Arial, Helvetica, sans-serif; WIDTH: 250px
}
#cp_at_wrapper * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_at {
	PADDING-RIGHT: 8px; PADDING-LEFT: 8px; PADDING-BOTTOM: 4px; MARGIN: =
0px; PADDING-TOP: 4px
}
#cp_at LI {
	FONT-WEIGHT: bold
}
#cp_at A {
	DISPLAY: block; FONT-WEIGHT: normal; OVERFLOW: hidden; COLOR: #666; =
TEXT-DECORATION: none
}
#cp_at LI LI {
	DISPLAY: block; FONT-WEIGHT: normal; OVERFLOW: hidden; COLOR: #666; =
TEXT-DECORATION: none
}
#cp_at A:hover {
	COLOR: #000; TEXT-DECORATION: underline
}
#cp_at LI {
	CLEAR: both; DISPLAY: block; PADDING-BOTTOM: 3px
}
#cp_at LI LI {
	CLEAR: none; FLOAT: left; WIDTH: 32%
}
#cp_at_wrapper H4 {
	BACKGROUND: url(images/at_top.gif) no-repeat left top; TEXT-INDENT: =
-1000em
}
#cp_at_share {
	BACKGROUND: url(images/fade_down.gif) no-repeat center top
}
#cp_at_subscribe {
	BACKGROUND: url(images/fade_up.gif) no-repeat left top
}
#cp_at_im SPAN {
	FLOAT: left; WIDTH: 20px; HEIGHT: 20px
}
#cp_at_wrapper A#cp_at_aim {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; BACKGROUND: =
url(images/aim.gif) no-repeat center center; FLOAT: left; =
PADDING-BOTTOM: 0px; WIDTH: 20px; TEXT-INDENT: -1000em; PADDING-TOP: =
0px; HEIGHT: 20px
}
#cp_at_wrapper A#cp_at_yim {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; BACKGROUND: =
url(images/yim.gif) no-repeat center center; FLOAT: left; =
PADDING-BOTTOM: 0px; WIDTH: 20px; TEXT-INDENT: -1000em; PADDING-TOP: =
0px; HEIGHT: 20px
}
#cp_at A {
	PADDING-LEFT: 19px
}
#cp_at_print A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/print.gif) =
no-repeat left center
}
#cp_at_email A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/email.gif) =
no-repeat left center
}
#cp_at_face A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/facebook.gif) =
no-repeat 1px center
}
#cp_at_deli A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) =
no-repeat left center
}
#cp_at_digg A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/digg.gif) =
no-repeat left center
}
#cp_at_blog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) =
no-repeat left center
}
#cp_at_news A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) =
no-repeat left center
}
#cp_at_perm A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/world_link.p=
ng) no-repeat left center
}
#cp_at_deli A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) =
no-repeat left center
}
#cp_at_yaho A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) =
no-repeat left center
}
#cp_at_goog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/google.gif) =
no-repeat 1px center
}
#cp_at_msn A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/iconMSN.gif) =
no-repeat left center
}
#cp_photo_wrapper {
	PADDING-BOTTOM: 5px; FONT: 11px/1em Arial, Helvetica, sans-serif; =
WIDTH: 250px
}
#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_block {
	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
}
.cp_photo_credit {
	FONT-SIZE: 0.9em; MARGIN-BOTTOM: 0.5em! important; 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(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
}

------=_NextPart_000_0000_01C7EE50.9DCC8850
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_0000_01C7EE50.9DCC8850
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_0000_01C7EE50.9DCC8850
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_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.kenyoncollegian.com/media/paper821/styles.css?v13

#navWrap LI A {
	COLOR: #000000! important
}
#navWrap LI A:hover {
	TEXT-DECORATION: underline
}
#flan_content_wrapper A {
	COLOR: #660099
}
#flan_content_wrapper H2 {
	COLOR: #000000
}
#flan_content_wrapper A:hover {
	TEXT-DECORATION: underline
}
#flan_nav H4 {
	COLOR: #660099; text-shadow: 2px 2px 1px #000000
}
#domainBar {
	COLOR: #660099! important
}
#domainBar A {
	COLOR: #660099! important
}
#flan_footer A.purple {
	COLOR: #660099
}
* {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper821/template/templatemed=
ia/shadowBkgBlank.gif) repeat-y; PADDING-BOTTOM: 0px; MARGIN: 0px; =
LINE-HEIGHT: 16px; PADDING-TOP: 0px; FONT-FAMILY: arial, verdana, =
helvetica, arial, sans-serif
}
#flan_wrapper {
	FLOAT: left; WIDTH: 1000px
}
#bigCol1 {
	CLEAR: left; MARGIN-TOP: 200px; FLOAT: left; WIDTH: 135px
}
#bigCol2 {
	FLOAT: left; WIDTH: 822px
}
#bigCol2 .gutter {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#flan_header {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper821/template/templatemed=
ia/PurpleBG4IE.gif) repeat-y; FLOAT: left; MARGIN-LEFT: -145px; WIDTH: =
1000px; POSITION: relative
}
#flan_content_wrapper {
	FLOAT: left; MARGIN: 10px 0px 0px; WIDTH: 832px
}
#flan_content {
	FLOAT: left; WIDTH: 522px
}
#flan_content #sidebar {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#flan_nav * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#navWrap {
	BORDER-RIGHT: #660099 1px dashed; PADDING-RIGHT: 0px! important; =
PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: =
10px 0px 0px; PADDING-TOP: 0px! important; BORDER-BOTTOM: #660099 1px =
dashed
}
#flan_nav UL {
	LIST-STYLE-TYPE: none
}
#flan_nav A {
	PADDING-RIGHT: 5px; DISPLAY: block; PADDING-LEFT: 0px; FONT-SIZE: 10px; =
PADDING-BOTTOM: 0px; MARGIN-LEFT: 10px; PADDING-TOP: 0px; TEXT-ALIGN: =
left; TEXT-DECORATION: none
}
#flan_nav LI A:hover {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
HTML > BODY #flan_nav A {
	LINE-HEIGHT: 1.6em
}
#flan_nav H4 {
	PADDING-RIGHT: 5px; PADDING-LEFT: 0px; FONT-SIZE: 0.9em; =
PADDING-BOTTOM: 0px; MARGIN-LEFT: 6px; TEXT-TRANSFORM: uppercase; =
PADDING-TOP: 0px; FONT-STYLE: italic; TEXT-ALIGN: left
}
#masthead H1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; TEXT-INDENT: -1000px; PADDING-TOP: 0px
}
#masthead H1 A {
	DISPLAY: block; WIDTH: 100%; TEXT-INDENT: -1000px; HEIGHT: 72px
}
#issueDate {
	FONT-WEIGHT: bold; COLOR: #ffffff; BORDER-BOTTOM: black 4px solid; =
TEXT-ALIGN: right
}
#issueDate H2 {
	FONT-SIZE: 1em; MARGIN-BOTTOM: 0px; MARGIN-RIGHT: 2px; TEXT-ALIGN: =
right
}
#advertBox_mast {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: #eee; =
PADDING-BOTTOM: 5px; PADDING-TOP: 5px; TEXT-ALIGN: center
}
.summary H3 {
	FONT-SIZE: 30px
}
.featured H3 {
	FONT-SIZE: 20px; MARGIN-BOTTOM: 0.5em
}
.featured A {
=09
}
.featured P {
	FONT-SIZE: 12px; MARGIN-BOTTOM: 1em; LINE-HEIGHT: 16px
}
.fpleadsummarystyle {
	FONT-SIZE: 12px; MARGIN-BOTTOM: 1em; LINE-HEIGHT: 16px
}
.summary {
	MARGIN: 0px
}
.article_byline {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 11px! important; =
PADDING-BOTTOM: 5px; PADDING-TOP: 5px
}
.article_byline2 {
	FONT-SIZE: 11px! important
}
#flan_content UL {
	MARGIN: 1em
}
#flan_content LI {
	LIST-STYLE-TYPE: none
}
#flan_content_bodyCol_sections {
	FLOAT: left; WIDTH: 230px
}
#flan_content_bodyCol_sections * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_content_bodyCol_sections H3 {
	LEFT: -20px; WIDTH: 100%; LINE-HEIGHT: 1.4em; BORDER-BOTTOM: black 1px =
solid; POSITION: relative
}
#flan_content_bodyCol_sections H4 {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; LINE-HEIGHT: 20px
}
#flan_content_bodyCol_sections UL {
	PADDING-RIGHT: 40px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
1em 0px; LINE-HEIGHT: 1.6em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#flan_content_bodyCol_sections LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 20px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper821/template/templatemed=
ia/bullet.gif) no-repeat 0px 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
#flan_content_bodyCol_sections A {
	TEXT-DECORATION: none
}
#flan_content_bodyCol_sections A:hover {
	TEXT-DECORATION: underline
}
#flan_content_bodyCol .gutter {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#flan_issue_summary {
	CLEAR: both; PADDING-RIGHT: 0px; BORDER-TOP: #d8d8d8 1px solid; =
PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 15px
}
#flan_issue_summary H2 {
	FONT-WEIGHT: normal; FONT-SIZE: 15px; COLOR: #000
}
#flan_issue_summary H3 {
	FONT-WEIGHT: normal; FONT-SIZE: 13px
}
#flan_issue_summary UL LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px; MARGIN: 0px; LINE-HEIGHT: 15px; PADDING-TOP: =
0px
}
#flan_footer {
	BORDER-TOP: #d8d8d8 1px solid; FONT-SIZE: 0.8em; BACKGROUND: #f5f5f5; =
FLOAT: left; MARGIN: 15px 0px 0px; WIDTH: 1000px; LINE-HEIGHT: 1.4em; =
TEXT-ALIGN: left
}
#flan_footer .gutter {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px
}
#footer A {
	PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 0em; =
PADDING-TOP: 0em
}
#advertisements .left * {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 0; =
PADDING-TOP: 0px! important
}
#advertisements .right * {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 0; =
PADDING-TOP: 0px! important
}
#tempnotice {
	BORDER-RIGHT: black 2px solid; BORDER-TOP: black 2px solid; =
MARGIN-BOTTOM: 10px; BORDER-LEFT: black 2px solid; COLOR: #ffffff; =
BORDER-BOTTOM: black 2px solid; BACKGROUND-COLOR: #660099
}
#tempbottom {
	BACKGROUND-COLOR: #cc66cc
}
#tempbottom A {
	COLOR: #000000
}
#tempbottomborder {
=09
}
* HTML #flan_nav LI {
	HEIGHT: 1%
}
#cp_video {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper821/template/templatemed=
ia/shadowBkgBlank.gif) #fff repeat-y
}
#cp_video #header H1 {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper821/template/templatemed=
ia/PurpleBG4IE.gif) repeat-y; MARGIN: 0px; WIDTH: 100%; TEXT-INDENT: =
-1000em; HEIGHT: 72px
}
#cp_video #top_bar {
	PADDING-RIGHT: 0px; BORDER-TOP: #000 1px solid; PADDING-LEFT: 0px; =
BACKGROUND: #fff; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 987px; =
PADDING-TOP: 0px; BORDER-BOTTOM: #000 1px solid
}
#cp_video #header #top_bar H3 A {
	COLOR: #660099
}
#cp_video #footer {
	PADDING-RIGHT: 0px; BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 0px; =
BACKGROUND: #f5f5f5; PADDING-BOTTOM: 10px; PADDING-TOP: 10px
}
#cp_video #footer P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; COLOR: =
#666; PADDING-TOP: 0px
}
#cp_video #footer P A {
	COLOR: #660099
}

------=_NextPart_000_0000_01C7EE50.9DCC8850
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<elems.length;i++){if(name.test(elems[i].className)){nodes.push(el=
ems[i])};}=0A=
return nodes;};}=0A=
Math.getRnd=3Dfunction(a_numA,a_numB){if(!com.mtvi.utils.isDefined(a_numA=
)||isNaN(a_numA)||parseInt(a_numA)<0){a_numA=3D1;}=0A=
if(!com.mtvi.utils.isDefined(a_numB)||isNaN(a_numB)||parseInt(a_numB)<0){=
a_numB=3D0;}=0A=
if(a_numA<a_numB){var tempNum=3Da_numA;a_numA=3Da_numB;a_numB=3DtempNum;}=0A=
return(parseInt(Math.random()*(a_numA-a_numB+1)+a_numB));};com.mtvi.util=3D=
{isDefined:function(v){if(typeof =
v=3D=3D=3D'undefined'||v=3D=3D=3Dnull||v=3D=3D=3D''||v=3D=3D=3D'undefined=
'){return false}else{return =
true};},queryStringToHash:function(str){try{var qs=3D[];var =
a=3Dstr.split("?")[1].split("&");for(var x=3D0;x<a.length;x++){var =
b=3Da[x].split("=3D");qs[b[0]]=3Db[1];}=0A=
return =
qs;}catch(e){}},addOnloadEvent:function(func){try{if(window.attachEvent){=
window.attachEvent("onload",func);}=0A=
if(window.addEventListener){window.addEventListener("load",func,false);}=0A=
return this;}catch(e){}},setProperties:function(o){try{for(var i in =
o.properties){if(typeof o[i]!=3D"object"){var =
name=3Di.ucFirst();eval("o.get"+name+"=3Dfunction(){return =
this.properties['"+i+"'];}");eval("o.set"+name+"=3Dfunction(v){this.prope=
rties['"+i+"']=3Dthis.isDefined(v)?v:'';}");}}}catch(e){try{com.mtvi.logg=
er.JsError(e);}catch(e){}}},debug:function(msg){try{var =
c=3Ddocument.getElementById("debug");if(!c){c=3Ddocument.createElement("d=
iv");c.setAttribute("id","debug");document.getElementsByTagName("body")[0=
].appendChild(c);}=0A=
c.innerHTML=3Dc.innerHTML+msg+"<br>";}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+'</div>');}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<e))e=3Db;if(e<0||(c>=3D0&&c<e))e=
=3Dc;if(e>=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<e){c=3Df=
.substring(s,s+1);if(c=3D=3D',')=0A=
a+=3D'","';else if(("\n\r\t ").indexOf(c)<0)a+=3Dc;s++}return =
a?'"'+a+'"':a}function s_c2f(cc){cc=3D''+cc;var fc=3D'var f=3Dnew =
Function(',s=3Dcc.indexOf(';',cc.indexOf('{')),e=3Dcc.lastIndexOf('}'),o,=
a,d,q,c,f,h,x=0A=
fc+=3Ds_c2fa(cc)+',"var s=3Dnew =
Object;';c=3Dcc.substring(s+1,e);s=3Dc.indexOf('function');while(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;p<x.length;p++)if(('0123456789').indexOf(x.substring(p,p+1"=0A=
+"))<0)return 0;return 1};s.rep=3Dfunction(x,o,n){var =
i=3Dx.indexOf(o),l=3D"=0A=
+"n.length>0?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<x.leng"=0A=
+"th?t:''}return ''};s.isf=3Dfunction(t,a){var =
c=3Da.indexOf(':');if(c>=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<l.length&&n"=0A=
+"<0;i++){if(l[i].o=3D=3Do&&l[i].e=3D=3De)n=3Di}if(n<0){n=3Di;l[n]=3Dnew =
Object}x=3Dl"=0A=
+"[n];x.o=3Do;x.e=3De;f=3Dr?x.b:f;if(r||f){x.b=3Dr?0:o[e];x.o[e]=3Df}if(x=
.b){x."=0A=
+"o[b]=3Dx.b;return b}return 0};s.cet=3Dfunction(f,a,t,o,b){var =
s=3Dthis,r;"=0A=
+"if(s.isie&&a.apv>=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('<div><im'+'g =
name=3D\"'+imn+"=0A=
+"'\" height=3D1 width=3D1 border=3D0 =
alt=3D\"\"></div>');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 '<im'+'g sr'+'c=3D"=0A=
+"\"'+rs+'\" width=3D1 height=3D1 border=3D0 =
alt=3D\"\">'};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<s=
.d"=0A=
+".links.length;i++){o=3Ds.d.links[i];oc=3Do.onclick?\"\"+o.onclick:\"\";=
"=0A=
+"if((oc.indexOf(\"s_gs(\")<0||oc.indexOf(\".s_oc(\")>=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<s.pl.length&&pn<30){ps=3Ds.fl(s.p"=0A=
+"l[pn].name,100)+';';if(p.indexOf(ps)<0)p+=3Dps;pn++}s.q=3D(x?'&s=3D'+s.=
ap"=0A=
+"e(x):'')+(c?'&c=3D'+s.ape(c):'')+(j?'&j=3D'+j:'')+(v?'&v=3D'+v:'')+(k?'=
&k"=0A=
+"=3D'+k:'')+(bw?'&bw=3D'+bw:'')+(bh?'&bh=3D'+bh:'')+(ct?'&ct=3D'+s.ape(c=
t):'"=0A=
+"')+(hp?'&hp=3D'+hp:'')+(p?'&p=3D'+s.ape(p):'')}if(s.usePlugins)s.doPlug=
"=0A=
+"ins(s);var =
l=3Ds.wd.location,r=3Dtfs.document.referrer;if(!s.pageURL)s."=0A=
+"pageURL=3Ds.fl(l?l:'',255);if(!s.referrer)s.referrer=3Ds.fl(r?r:'',255)=
"=0A=
+";if(s.lnk||s.eo){var o=3Ds.eo?s.eo:s.lnk;if(!o)return '';var =
p=3Ds.gv('"=0A=
+"pageName'),w=3D1,t=3Ds.ot(o),n=3Ds.oid(o),x=3Do.s_oidt,h,l,i,oc;if(s.eo=
&&o=3D"=0A=
+"=3Ds.eo){while(o&&!n&&t!=3D'BODY'){o=3Do.parentElement?o.parentElement:=
o."=0A=
+"parentNode;if(!o)return =
'';t=3Ds.ot(o);n=3Ds.oid(o);x=3Do.s_oidt}oc=3Do.onc"=0A=
+"lick?''+o.onclick:'';if((oc.indexOf(\"s_gs(\")>=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;i<l.length;i++){s=3Dl=
[i];s.uns();if(s.un=3D=3Dun)return s;else =
if(s.pt(s.un,',','isf',un)){s=3Ds.co(s);s.un=3Dun;s.uns();return =
s}}if(e>0){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_0000_01C7EE50.9DCC8850
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: '(?:<script.*?>)((\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 '#<Enumerable:' + this.toArray().inspect() + '>';=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 '#<Hash:{' + this.map(function(pair) {=0A=
      return pair.map(Object.inspect).join(': ');=0A=
    }).join(', ') + '}>';=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 '<table><tbody>' +  html.stripScripts() + =
'</tbody></table>';=0A=
          depth =3D 2;=0A=
          break;=0A=
        case 'TR':=0A=
          div.innerHTML =3D '<table><tbody><tr>' +  html.stripScripts() =
+ '</tr></tbody></table>';=0A=
          depth =3D 3;=0A=
          break;=0A=
        case 'TD':=0A=
          div.innerHTML =3D '<table><tbody><tr><td>' +  =
html.stripScripts() + '</td></tr></tbody></table>';=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 '<table><tbody>' + this.content + =
'</tbody></table>';=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_0000_01C7EE50.9DCC8850
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 '<div id=3D"cp_current_issue">';
	var closeDiv =3D '</div>';
	var s =3D "/";
	var n =3D "&nbsp;"

	function writeSpan(className,whichVar) {
		var spanWrap =3D '<span class=3D"' + className + '">' + whichVar + =
'</span>';
		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<arrElements.length; i++) {
	// Save the current element
			oElement =3D arrElements[i];
			if (oRegExp.test(oElement.className)) {
	// Create the blockquote and p elements
				ocp_pullquote =3D document.createElement('blockquote');
				ocp_pullquote.className =3D oElement.className
				ocp_pullquoteP =3D document.createElement('p');
	// Insert the cp_pullquote text
				for(j=3D0;j<oElement.childNodes.length;j++) {
					ocp_pullquoteP.appendChild(oElement.childNodes[j].cloneNode(true));
				}
				ocp_pullquote.appendChild(ocp_pullquoteP);
	// Insert the blockquote element before the span elements parent =
element
				=
oElement.parentNode.parentNode.insertBefore(ocp_pullquote,oElement.parent=
Node);
			}
		}
	}
};

// addEvent function from =
http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
function addEvent(obj, type, fn) {
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] =3D fn;
		obj[type+fn] =3D function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}
addEvent(window, 'load', cp_pullquote.init);

// CSS Browser Selector   v0.2.5
// Documentation:         http://rafael.adm.br/css_browser_selector
// License:               http://creativecommons.org/licenses/by/2.5/
// Author:                Rafael Lima (http://rafael.adm.br)
// Contributors:          =
http://rafael.adm.br/css_browser_selector#contributors
var css_browser_selector =3D function() {
	var=20
		ua=3Dnavigator.userAgent.toLowerCase(),
		is=3Dfunction(t){ return ua.indexOf(t) !=3D -1; },
		h=3Ddocument.getElementsByTagName('html')[0],
		b=3D(!(/opera|webtv/i.test(ua))&&/msie (\d)/.test(ua))?('ie =
ie'+RegExp.$1):is('gecko/')? 'gecko':is('opera/9')?'opera opera9':/opera =
(\d)/.test(ua)?'opera =
opera'+RegExp.$1:is('konqueror')?'konqueror':is('applewebkit/')?'webkit =
safari':is('mozilla/')?'gecko':'',
		os=3D(is('x11')||is('linux'))?' linux':is('mac')?' mac':is('win')?' =
win':'';
	var c=3Db+os+' js';
	h.className +=3D h.className?' '+c:c;
}();

// Add event to page load =
http://simonwillison.net/2004/May/26/addLoadEvent/
function addLoadEvent(func) {
  var oldonload =3D window.onload;
  if (typeof window.onload !=3D 'function') {
    window.onload =3D func;
  } else {
    window.onload =3D function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function addClass(elem,name) {
	return elem.addClassName(name);
}

function disableSubmitOnClick() {
	var xyz =3D $('submit');
	xyz.onclick =3D buildADiv;
}

function buildADiv() {
	var width =3D $('cp_form').getWidth();
	var height =3D $('cp_form').getHeight();
	var div =3D document.createElement('div');
	div.className =3D "disabledBox";
	div.style.width =3D width;
	div.style.height =3D height;
	$('cp_form').appendChild(div);
}

// Sets other text field input values with the class whatClass to be the =
same as that of elemWithValue=20
function =
setAllElementsValues(elemWithText,elemWithValue,whatTextClass,whatValueCl=
ass) {
	var textField =3D $(elemWithText).value;
	var hiddenID =3D $(elemWithValue).value;
	var fieldGroup =3D document.getElementsByTagName("input");=20
	for (var i=3D0; i < fieldGroup.length; i++) {
		if (fieldGroup[i].hasClassName(whatTextClass)) {
			fieldGroup[i].value =3D textField;
		};
		if (fieldGroup[i].hasClassName(whatValueClass)) {
			fieldGroup[i].value =3D hiddenID;
		};
	};
};
------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/network_channel.js

// Search Engine Submit
function sesubmit() {
	a =3D document.cpsearch;				=09

	document.cpsearch.submit();
=09
}

function showhide_search(){
		=09
		var cptoggle =3D =
document.getElementById('net_search_choose_options').className;

		if (cptoggle =3D=3D 'show'){
			=
document.getElementById('net_search_choose_options').className=3D"hide";
			=
document.getElementById('net_search_choose_link').className=3D"unselected=
";
		}
		else{
			=
document.getElementById('net_search_choose_options').className=3D"show";
			=
document.getElementById('net_search_choose_link').className=3D"selected";=

			document.getElementById('net_cp_nav_list').className=3D"hide";
			document.getElementById('net_cp_a').className=3D"unselected";
		}
}

function showhide_links(){
		var cptoggle =3D document.getElementById('net_cp_nav_list').className;

		if (cptoggle =3D=3D 'show'){
			document.getElementById('net_cp_nav_list').className=3D"hide";
			document.getElementById('net_cp_a').className=3D"unselected";
		}
		else{
			document.getElementById('net_cp_nav_list').className=3D"show";
			document.getElementById('net_cp_a').className=3D"selected";
			=
document.getElementById('net_search_choose_options').className=3D"hide";
			=
document.getElementById('net_search_choose_link').className=3D"unselected=
";
		}
}

function change_search_this() {

		var a =3D document.cpsearch;=09
	=09
		=
document.getElementById('net_search_choose_options').className=3D"hide";
		=
document.getElementById('net_search_choose_link').className=3D"unselected=
";
	=09
		a.action=3D'/home/index.cfm';
}

function change_search_google() {
=09
		var a =3D document.cpsearch;
	=09
		=
document.getElementById('net_search_choose_options').className=3D"hide";
		=
document.getElementById('net_search_choose_link').className=3D"unselected=
";
	=09
		a.action=3D'http://www.google.com/custom';
}
------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: 7bit
Content-Location: http://media.collegepublisher.com/media/scripts/event_listener.js

function addLoadListener(fn)
{
	if (typeof window.addEventListener != 'undefined')
	{
		window.addEventListener('load', fn, false);
	}
	else if (typeof document.addEventListener != 'undefined')
	{
		document.addEventListener('load', fn, false);
	}
	else if (typeof window.attachEvent != 'undefined')
	{
		window.attachEvent('onload', fn);
	}
	else
	{
		return false;
	}
	
	return true;
};




function attachEventListener(target, eventType, functionRef, capture)
{
    if (typeof target.addEventListener != "undefined")
    {
        target.addEventListener(eventType, functionRef, capture);
    }
    else if (typeof target.attachEvent != "undefined")
    {
        target.attachEvent("on" + eventType, functionRef);
    }
    else
    {
        return false;
    }

    return true;
};
------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/resolution.js

checkBrowserWidth();

attachEventListener(window, "resize", checkBrowserWidth, false);




function checkBrowserWidth()
{
	var theWidth =3D getBrowserWidth();
=09
	if (theWidth =3D=3D 0)
	{
		var resolutionCookie =3D =
document.cookie.match(/(^|;)tmib_res_layout[^;]*(;|$)/);

		if (resolutionCookie !=3D null)
		{
			setStylesheet(unescape(resolutionCookie[0].split("=3D")[1]));
		}
	=09
		addLoadListener(checkBrowserWidth);
	=09
		return false;
	}

	if (theWidth < 990)
	{
		setStylesheet("1024 x 768");
		document.cookie =3D "tmib_res_layout=3D" + escape("1024 x 768");
	}
	else
	{
		setStylesheet("");
		document.cookie =3D "tmib_res_layout=3D";
	}
=09
	return true;
};




function getBrowserWidth()
{
	if (window.innerWidth)
	{
		return window.innerWidth;
	}
	else if (document.documentElement && =
document.documentElement.clientWidth !=3D 0)
	{
		return document.documentElement.clientWidth;
	}
	else if (document.body)
	{
		return document.body.clientWidth;
	}
=09
	return 0;
};




function setStylesheet(styleTitle)
{
	var currTag;

	if (document.getElementsByTagName)
	{
		for (var i =3D 0; (currTag =3D =
document.getElementsByTagName("link")[i]); i++)
		{
			if (currTag.getAttribute("rel").indexOf("style") !=3D -1 && =
currTag.getAttribute("title"))
			{
				currTag.disabled =3D true;

				if(currTag.getAttribute("title") =3D=3D styleTitle)
				{
					currTag.disabled =3D false;
				}
			}
		}
	}
=09
	return true;
};
------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/scriptaculous.js

// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007=0A=
=0A=
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, =
http://mir.aculo.us)=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=
// For details, see the script.aculo.us web site: http://script.aculo.us/=0A=
=0A=
var Scriptaculous =3D {=0A=
  Version: '1.7.0',=0A=
  require: function(libraryName) {=0A=
    // inserting via DOM fails in Safari 2.0, so brute force approach=0A=
    document.write('<script type=3D"text/javascript" =
src=3D"'+libraryName+'"></script>');=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_0000_01C7EE50.9DCC8850
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:             "&nbsp;",=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 "<iframe name=3D\"" + id + "_content\"  id=3D\"" + id + =
"_content\" src=3D\"" + this.options.url + "\" scrolling=3D\"no\" =
frameborder=3D\"0\"> </iframe>";=0A=
		else=0A=
			content =3D"<div id=3D\"" + id + "_content\" class=3D\"" +className + =
"_content\"> </div>";=0A=
			=0A=
		var closeDiv =3D this.options.closable ? "<div class=3D'"+ className =
+"_close' id=3D'"+ id +"_close' onmouseup=3D'Windows.close(\""+ id =
+"\")'> </div>" : "";=0A=
		var minDiv =3D this.options.minimizable ? "<div class=3D'"+ className =
+ "_minimize' id=3D'"+ id +"_minimize' =
onmouseup=3D'Windows.minimize(\""+ id +"\")'> </div>" : "";=0A=
		var maxDiv =3D this.options.maximizable ? "<div class=3D'"+ className =
+ "_maximize' id=3D'"+ id +"_maximize' =
onmouseup=3D'Windows.maximize(\""+ id +"\")'> </div>" : "";=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=
      <table id=3D'"+ id +"_row1' class=3D\"top table_window\">\=0A=
        <tr>\=0A=
          <td class=3D'"+ className +"_nw'>&nbsp;</td>\=0A=
          <td class=3D'"+ className +"_n'><div id=3D'"+ id +"_top' =
class=3D'"+ className +"_title title_window'>"+ this.options.title =
+"</div></td>\=0A=
          <td class=3D'"+ className +"_ne'>&nbsp;</td>\=0A=
        </tr>\=0A=
      </table>\=0A=
      <table id=3D'"+ id +"_row2' class=3D\"mid table_window\">\=0A=
        <tr>\=0A=
          <td class=3D'"+ className +"_w'></td>\=0A=
            <td id=3D'"+ id +"_table_content' class=3D'"+ className =
+"_content' valign=3D'top'>"+ content +"</td>\=0A=
          <td class=3D'"+ className +"_e'></td>\=0A=
        </tr>\=0A=
      </table>\=0A=
        <table id=3D'"+ id +"_row3' class=3D\"bot table_window\">\=0A=
        <tr>\=0A=
          <td class=3D'"+ className +"_sw'>&nbsp;</td>\=0A=
            <td class=3D'"+ className +"_s'><div id=3D'"+ id +"_bottom' =
class=3D'status_bar'>&nbsp;</div></td>\=0A=
            <td " + seAttributes + ">&nbsp;</td>\=0A=
        </tr>\=0A=
      </table>\=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 "&nbsp;";=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, '<iframe id=3D"' + =
this.element.id + '_iefix" '+ =
'style=3D"display:none;position:absolute;filter:progid:DXImageTransform.M=
icrosoft.Alpha(opacity=3D0);" ' + 'src=3D"javascript:false;" =
scrolling=3D"no" frameborder=3D"0" ></iframe>');=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=
			<div class=3D'" + windowParam.className + "_message'>" + content  + =
"</div>\=0A=
				<div class=3D'" + windowParam.className + "_buttons'>\=0A=
					<input type=3D'button' value=3D'" + okLabel + "' =
onclick=3D'Dialog.okCallback()'" + okButtonClass + "/>\=0A=
					<input type=3D'button' value=3D'" + cancelLabel + "' =
onclick=3D'Dialog.cancelCallback()' " + cancelButtonClass + "/>\=0A=
				</div>\=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=
			<div class=3D'" + windowParam.className + "_message'>" + content  + =
"</div>\=0A=
				<div class=3D'" + windowParam.className + "_buttons'>\=0A=
					<input type=3D'button' value=3D'" + okLabel + "' =
onclick=3D'Dialog.okCallback()'" + okButtonClass + "/>\=0A=
				</div>";=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 "<div id=3D'modal_dialog_message' class=3D'" + =
className + "_message'>" + content  + "</div>";=0A=
		if (parameters.showProgress)=0A=
		  content +=3D "<div id=3D'modal_dialog_progress' class=3D'" + =
className + "_progress'>	</div>";=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_0000_01C7EE50.9DCC8850
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_0000_01C7EE50.9DCC8850
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
// <http://www.w3.org/TR/1999/REC-xpath-19991116>.
//
//
// 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 <mesch@google.com>


// 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 <mesch@google.com>
//

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 '</' + node.nodeName + '>';
    }
   =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
// =
<http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-195=
0641247>
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, '&amp;').replace(/</g, '&lt;').replace(/>/g, =
'&gt;');
}

// 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, '&quot;');
}

// 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, '&lt;').replace(/>/g, '&gt;');
}

// 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(/</g, '\n<');
    var s1 =3D xmlEscapeText(s0);
    var s2 =3D s1.replace(/\s*\n(\s|\n)*/g, '<br/>');
    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('<br/>') + '<br/>';
  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_0000_01C7EE50.9DCC8850
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, "&amp;");
		str =3D str.replace(/</g, "&lt;");
		str =3D str.replace(/>/g, "&gt;");
		str =3D str.replace(/"/g, "&quot;");
	}
	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(/&lt;/, "<");
		str =3D str.replace(/&gt;/, ">");
		str =3D str.replace(/&quot;/, "\"");
		str =3D str.replace(/&amp;/, "&");
	}
	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:
	//     <!--
	//     <![CDATA[
	//     <tag>
	//     -->
	//     ]]>
	//     ]]&gt;   // 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+[^<>]*>|-->|\\]\\](>|\&gt;)", "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 "<![CDATA[")
		{
			++skipFixUp;
			outStr +=3D results[0];
		}
		else if (results[0] =3D=3D "-->" || results[0] =3D=3D "]]>" || =
(skipFixUp && results[0] =3D=3D "]]&gt;"))
		{
			--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 "<child.nodeName>/@<attr.name>".
				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("<hr />Performing IE innerHTML fix up of Region: " =
+ name + "<br /><br />" + Spry.Utils.encodeEntities(dataStr));

			dataStr =3D Spry.Utils.fixUpIEInnerHTML(dataStr);
		}

		if (Spry.Data.Region.debug)
			Spry.Debug.trace("<hr />Region template markup for '" + name + "':<br =
/><br />" + 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("<hr />Generated region markup for '" + this.name + =
"':<br /><br />" + 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 /<!--\s*<\/?spry:content\s*[^>]*>\s*-->/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:
	//
	//   <spry:repeat select=3D"regionName" test=3D"true">
	//   </spry:repeat>
	//   {valueReference}
	var regexp =3D =
/((<!--\s*){0,1}<\/{0,1}spry:[^>]+>(\s*-->){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(/^(<!--\s*){0,1}<\/?/, "");
			piName =3D piName.replace(/>(\s*-->){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[piName].tagName + ">";
};

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_0000_01C7EE50.9DCC8850
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"<img =
src=3D'http://media.collegepublisher.com/media/paper960/template/template=
media/loading.gif' /> 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 (<div class=3D"contentdiv">)
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 (<div class=3D"contentdiv">)
ContentSlider.loadobjects(csexternalfiles) //Load external .js and .css =
files, if any
var alldivs=3Dslider.getElementsByTagName("div")
for (var i=3D0; i<alldivs.length; i++){
if (alldivs[i].className=3D=3D"contentdiv"){
slidernodes[sliderid].push(alldivs[i]) //add this DIV reference to array
if (typeof alldivs[i].getAttribute("rel")=3D=3D"string") //If get this =
DIV's content via Ajax (rel attr contains path to external page)
ContentSlider.ajaxpage(alldivs[i].getAttribute("rel"), alldivs[i])
}
}
ContentSlider.buildpagination(sliderid)
var loadfirstcontent=3Dtrue
if (enablepersist && getCookie(sliderid)!=3D""){ //if enablepersist is =
true and cookie contains corresponding value for slider
var cookieval=3DgetCookie(sliderid).split(":") //process cookie value =
([sliderid, int_pagenumber (div content to jump to)]
if (document.getElementById(cookieval[0])!=3Dnull && typeof =
slidernodes[sliderid][cookieval[1]]!=3D"undefined"){ //check cookie =
value for validity
ContentSlider.turnpage(cookieval[0], parseInt(cookieval[1])) //restore =
content slider's last shown DIV
loadfirstcontent=3Dfalse
}
}
if (loadfirstcontent=3D=3Dtrue) //if enablepersist is false, or cookie =
value doesn't contain valid value for some reason (ie: user modified the =
structure of the HTML)
ContentSlider.turnpage(sliderid, 0) //Display first DIV within slider
if (typeof autorun=3D=3D"number" && autorun>0) //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<slidernodes[sliderid].length; i++) //For each DIV =
within slider, generate a pagination link
/*pcontent+=3D'<a href=3D"#" =
onClick=3D\"ContentSlider.turnpage(\''+sliderid+'\', '+i+'); return =
false\">'+slidersection[i]+'</a> '
pcontent+=3D'<a href=3D"#" style=3D"font-weight: bold;" =
onClick=3D\"ContentSlider.turnpage(\''+sliderid+'\', =
parseInt(this.getAttribute(\'rel\'))); return false\">Next</a>'
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<slidernodes[sliderid].length; i++){ //For each DIV =
within slider
paginatelinks[i].className=3D"" //empty corresponding pagination link's =
class name
slidernodes[sliderid][i].style.display=3D"none" //hide DIV
}
paginatelinks[thepage].className=3D"selected" //for selected DIV, set =
corresponding pagination link's class name
slidernodes[sliderid][thepage].style.display=3D"block" //show selected =
DIV
//Set "Next" pagination link's (last link within pagination DIV) "rel" =
attribute to the next DIV number to show
paginatelinks[paginatelinks.length-1].setAttribute("rel", =
thenextpage=3D(thepage<paginatelinks.length-2)? thepage+1 : 0)
if (enablepersist)
setCookie(sliderid, sliderid+":"+thepage)
}

ContentSlider.autoturnpage=3Dfunction(sliderid, autorunperiod){
var =
paginatelinks=3Ddocument.getElementById("paginate-"+sliderid).getElements=
ByTagName("a") //Get pagination links
var =
nextpagenumber=3DparseInt(paginatelinks[paginatelinks.length-1].getAttrib=
ute("rel")) //Get page number of next DIV to show
ContentSlider.turnpage(sliderid, nextpagenumber) //Show that DIV
window[sliderid+"timer"]=3DsetTimeout(function(){ContentSlider.autoturnpa=
ge(sliderid, autorunperiod)}, autorunperiod)
}

function getCookie(Name){=20
var re=3Dnew RegExp(Name+"=3D[^;]+", "i"); //construct RE to search for =
target name/value pair
if (document.cookie.match(re)) //if cookie found
return document.cookie.match(re)[0].split("=3D")[1] //return its value
return ""
}

function setCookie(name, value){
document.cookie =3D name+"=3D"+value
}

////////////////Ajax Related functions =
//////////////////////////////////

ContentSlider.ajaxpage=3Dfunction(url, thediv){
var page_request =3D false
var bustcacheparameter=3D""
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request =3D new XMLHttpRequest()
else if (window.ActiveXObject){ // if IE
try {
page_request =3D new ActiveXObject("Msxml2.XMLHTTP")
}=20
catch (e){
try{
page_request =3D new ActiveXObject("Microsoft.XMLHTTP")
}
catch (e){}
}
}
else
return false
thediv.innerHTML=3Dcsloadstatustext
page_request.onreadystatechange=3Dfunction(){
ContentSlider.loadpage(page_request, thediv)
}
if (csbustcachevar) //if bust caching of external page
bustcacheparameter=3D(url.indexOf("?")!=3D-1)? "&"+new Date().getTime() =
: "?"+new Date().getTime()
page_request.open('GET', url+bustcacheparameter, true)
page_request.send(null)
}

ContentSlider.loadpage=3Dfunction(page_request, thediv){
if (page_request.readyState =3D=3D 4 && (page_request.status=3D=3D200 || =
window.location.href.indexOf("http")=3D=3D-1))
thediv.innerHTML=3Dpage_request.responseText
}

ContentSlider.loadobjects=3Dfunction(externalfiles){ //function to load =
external .js and .css files. Parameter accepts a list of external files =
to load (array)
for (var i=3D0; i<externalfiles.length; i++){
var file=3Dexternalfiles[i]
var fileref=3D""
if (csloadedobjects.indexOf(file)=3D=3D-1){ //Check to see if this =
object has not already been added to page before proceeding
if (file.indexOf(".js")!=3D-1){ //If object is a js file
fileref=3Ddocument.createElement('script')
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src", file);
}
else if (file.indexOf(".css")!=3D-1){ //If object is a css file
fileref=3Ddocument.createElement("link")
fileref.setAttribute("rel", "stylesheet");
fileref.setAttribute("type", "text/css");
fileref.setAttribute("href", file);
}
}
if (fileref!=3D""){
document.getElementsByTagName("head").item(0).appendChild(fileref)
csloadedobjects+=3Dfile+" " //Remember this object as being already =
added to page
}
}
}

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/ufo.js?1

/*	Unobtrusive Flash Objects (UFO) v3.21 =
<http://www.bobbyvandersluis.com/ufo/>=0A=
	Copyright 2005, 2006 Bobby van der Sluis=0A=
	This software is licensed under the CC-GNU LGPL =
<http://creativecommons.org/licenses/LGPL/2.1/>=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 '<embed type=3D"application/x-shockwave-flash" =
src=3D"' + _fo.movie + '" width=3D"' + _fo.width + '" height=3D"' + =
_fo.height + '" =
pluginspage=3D"http://www.macromedia.com/go/getflashplayer"' + _emb + =
'></embed>';=0A=
			}=0A=
		}=0A=
		else if (UFO.pluginType =3D=3D "ax") {=0A=
			var _objAtt =3D "";=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") _objAtt +=3D ' ' + =
UFO.optAtt[i] + '=3D"' + _fo[UFO.optAtt[i]] + '"';=0A=
			}=0A=
			var _objPar =3D "";=0A=
			var _l =3D UFO.opt.length;=0A=
			for (var i =3D 0; i < _l; i++) {=0A=
				if (typeof _fo[UFO.opt[i]] !=3D "undefined") _objPar +=3D '<param =
name=3D"' + UFO.opt[i] + '" value=3D"' + _fo[UFO.opt[i]] + '" />';=0A=
			}=0A=
			var _p =3D window.location.protocol =3D=3D "https:" ? "https:" : =
"http:";=0A=
			_e.innerHTML =3D '<object =
classid=3D"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + _objAtt + ' =
width=3D"' + _fo.width + '" height=3D"' + _fo.height + '" codebase=3D"' =
+ _p + =
'//download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=3D=
' + _fo.majorversion + ',0,' + _fo.build + ',0"><param name=3D"movie" =
value=3D"' + _fo.movie + '" />' + _objPar + '</object>';=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_0000_01C7EE50.9DCC8850
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<a.length;i=3Di+1){d=3Da[i].split=
(".");o=3DYAHOO;for(j=3D(d[0]=3D=3D"YAHOO")?1:0;j<d.length;j=3Dj+1){o[d[j=
]]=3Do[d[j]]||{};o=3Do[d[j]];}}=0A=
return o;};YAHOO.log=3Dfunction(msg,cat,src){var =
l=3DYAHOO.widget.Logger;if(l&&l.log){return =
l.log(msg,cat,src);}else{return =
false;}};YAHOO.init=3Dfunction(){this.namespace("util","widget","example"=
);if(typeof YAHOO_config!=3D"undefined"){var =
l=3DYAHOO_config.listener,ls=3DYAHOO.env.listeners,unique=3Dtrue,i;if(l){=
for(i=3D0;i<ls.length;i=3Di+1){if(ls[i]=3D=3Dl){unique=3Dfalse;break;}}=0A=
if(unique){ls.push(l);}}}};YAHOO.register=3Dfunction(name,mainClass,data)=
{var =
mods=3DYAHOO.env.modules;if(!mods[name]){mods[name]=3D{versions:[],builds=
:[]};}=0A=
var =
m=3Dmods[name],v=3Ddata.version,b=3Ddata.build,ls=3DYAHOO.env.listeners;m=
.name=3Dname;m.version=3Dv;m.build=3Db;m.versions.push(v);m.builds.push(b=
);m.mainClass=3DmainClass;for(var i=3D0;i<ls.length;i=3Di+1){ls[i](m);}=0A=
if(mainClass){mainClass.VERSION=3Dv;mainClass.BUILD=3Db;}else{YAHOO.log("=
mainClass is undefined for module =
"+name,"warn");}};YAHOO.env=3DYAHOO.env||{modules:[],listeners:[],getVers=
ion:function(name){return =
YAHOO.env.modules[name]||null;}};YAHOO.lang=3D{isArray:function(obj){if(o=
bj.constructor&&obj.constructor.toString().indexOf('Array')>-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<len;++i){collection[collection.length]=3DY.Dom.ge=
t(el[i]);}=0A=
return collection;}=0A=
return =
null;},getStyle:function(el,property){property=3DtoCamel(property);var =
f=3Dfunction(element){return getStyle(element,property);};return =
Y.Dom.batch(el,f,Y.Dom,true);},setStyle:function(el,property,val){propert=
y=3DtoCamel(property);var =
f=3Dfunction(element){setStyle(element,property,val);};Y.Dom.batch(el,f,Y=
.Dom,true);},getXY:function(el){var =
f=3Dfunction(el){if(el.parentNode=3D=3D=3Dnull||el.offsetParent=3D=3D=3Dn=
ull||this.getStyle(el,'display')=3D=3D'none'){return false;}=0A=
var parentNode=3Dnull;var pos=3D[];var =
box;if(el.getBoundingClientRect){box=3Del.getBoundingClientRect();var =
doc=3Ddocument;if(!this.inDocument(el)&&parent.document!=3Ddocument){doc=3D=
parent.document;if(!this.isAncestor(doc.documentElement,el)){return =
false;}}=0A=
var =
scrollTop=3DMath.max(doc.documentElement.scrollTop,doc.body.scrollTop);va=
r =
scrollLeft=3DMath.max(doc.documentElement.scrollLeft,doc.body.scrollLeft)=
;return[box.left+scrollLeft,box.top+scrollTop];}=0A=
else{pos=3D[el.offsetLeft,el.offsetTop];parentNode=3Del.offsetParent;if(p=
arentNode!=3Del){while(parentNode){pos[0]+=3DparentNode.offsetLeft;pos[1]=
+=3DparentNode.offsetTop;parentNode=3DparentNode.offsetParent;}}=0A=
if(isSafari&&this.getStyle(el,'position')=3D=3D'absolute'){pos[0]-=3Ddocu=
ment.body.offsetLeft;pos[1]-=3Ddocument.body.offsetTop;}}=0A=
if(el.parentNode){parentNode=3Del.parentNode;}=0A=
else{parentNode=3Dnull;}=0A=
while(parentNode&&parentNode.tagName.toUpperCase()!=3D'BODY'&&parentNode.=
tagName.toUpperCase()!=3D'HTML')=0A=
{if(Y.Dom.getStyle(parentNode,'display')!=3D'inline'){pos[0]-=3DparentNod=
e.scrollLeft;pos[1]-=3DparentNode.scrollTop;}=0A=
if(parentNode.parentNode){parentNode=3DparentNode.parentNode;}else{parent=
Node=3Dnull;}}=0A=
return pos;};return Y.Dom.batch(el,f,Y.Dom,true);},getX:function(el){var =
f=3Dfunction(el){return Y.Dom.getXY(el)[0];};return =
Y.Dom.batch(el,f,Y.Dom,true);},getY:function(el){var =
f=3Dfunction(el){return Y.Dom.getXY(el)[1];};return =
Y.Dom.batch(el,f,Y.Dom,true);},setXY:function(el,pos,noRetry){var =
f=3Dfunction(el){var =
style_pos=3Dthis.getStyle(el,'position');if(style_pos=3D=3D'static'){this=
.setStyle(el,'position','relative');style_pos=3D'relative';}=0A=
var pageXY=3Dthis.getXY(el);if(pageXY=3D=3D=3Dfalse){return false;}=0A=
var =
delta=3D[parseInt(this.getStyle(el,'left'),10),parseInt(this.getStyle(el,=
'top'),10)];if(isNaN(delta[0])){delta[0]=3D(style_pos=3D=3D'relative')?0:=
el.offsetLeft;}=0A=
if(isNaN(delta[1])){delta[1]=3D(style_pos=3D=3D'relative')?0:el.offsetTop=
;}=0A=
if(pos[0]!=3D=3Dnull){el.style.left=3Dpos[0]-pageXY[0]+delta[0]+'px';}=0A=
if(pos[1]!=3D=3Dnull){el.style.top=3Dpos[1]-pageXY[1]+delta[1]+'px';}=0A=
if(!noRetry){var =
newXY=3Dthis.getXY(el);if((pos[0]!=3D=3Dnull&&newXY[0]!=3Dpos[0])||(pos[1=
]!=3D=3Dnull&&newXY[1]!=3Dpos[1])){this.setXY(el,pos,true);}}};Y.Dom.batc=
h(el,f,Y.Dom,true);},setX:function(el,x){Y.Dom.setXY(el,[x,null]);},setY:=
function(el,y){Y.Dom.setXY(el,[null,y]);},getRegion:function(el){var =
f=3Dfunction(el){var region=3Dnew Y.Region.getRegion(el);return =
region;};return =
Y.Dom.batch(el,f,Y.Dom,true);},getClientWidth:function(){return =
Y.Dom.getViewportWidth();},getClientHeight:function(){return =
Y.Dom.getViewportHeight();},getElementsByClassName:function(className,tag=
,root){var method=3Dfunction(el){return =
Y.Dom.hasClass(el,className);};return =
Y.Dom.getElementsBy(method,tag,root);},hasClass:function(el,className){va=
r re=3Dnew RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)');var =
f=3Dfunction(el){return re.test(el['className']);};return =
Y.Dom.batch(el,f,Y.Dom,true);},addClass:function(el,className){var =
f=3Dfunction(el){if(this.hasClass(el,className)){return;}=0A=
el['className']=3D[el['className'],className].join(' =
');};Y.Dom.batch(el,f,Y.Dom,true);},removeClass:function(el,className){va=
r re=3Dnew RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)','g');var =
f=3Dfunction(el){if(!this.hasClass(el,className)){return;}=0A=
var c=3Del['className'];el['className']=3Dc.replace(re,' =
');if(this.hasClass(el,className)){this.removeClass(el,className);}};Y.Do=
m.batch(el,f,Y.Dom,true);},replaceClass:function(el,oldClassName,newClass=
Name){if(oldClassName=3D=3D=3DnewClassName){return false;}=0A=
var re=3Dnew RegExp('(?:^|\\s+)'+oldClassName+'(?:\\s+|$)','g');var =
f=3Dfunction(el){if(!this.hasClass(el,oldClassName)){this.addClass(el,new=
ClassName);return;}=0A=
el['className']=3Del['className'].replace(re,' '+newClassName+' =
');if(this.hasClass(el,oldClassName)){this.replaceClass(el,oldClassName,n=
ewClassName);}};Y.Dom.batch(el,f,Y.Dom,true);},generateId:function(el,pre=
fix){prefix=3Dprefix||'yui-gen';el=3Del||{};var =
f=3Dfunction(el){if(el){el=3DY.Dom.get(el);}else{el=3D{};}=0A=
if(!el.id){el.id=3Dprefix+id_counter++;}=0A=
return el.id;};return =
Y.Dom.batch(el,f,Y.Dom,true);},isAncestor:function(haystack,needle){hayst=
ack=3DY.Dom.get(haystack);if(!haystack||!needle){return false;}=0A=
var f=3Dfunction(needle){if(haystack.contains&&!isSafari){return =
haystack.contains(needle);}=0A=
else =
if(haystack.compareDocumentPosition){return!!(haystack.compareDocumentPos=
ition(needle)&16);}=0A=
else{var =
parent=3Dneedle.parentNode;while(parent){if(parent=3D=3Dhaystack){return =
true;}=0A=
else =
if(!parent.tagName||parent.tagName.toUpperCase()=3D=3D'HTML'){return =
false;}=0A=
parent=3Dparent.parentNode;}=0A=
return false;}};return =
Y.Dom.batch(needle,f,Y.Dom,true);},inDocument:function(el){var =
f=3Dfunction(el){return =
this.isAncestor(document.documentElement,el);};return =
Y.Dom.batch(el,f,Y.Dom,true);},getElementsBy:function(method,tag,root){ta=
g=3Dtag||'*';var =
nodes=3D[];if(root){root=3DY.Dom.get(root);if(!root){return =
nodes;}}else{root=3Ddocument;}=0A=
var =
elements=3Droot.getElementsByTagName(tag);if(!elements.length&&(tag=3D=3D=
'*'&&root.all)){elements=3Droot.all;}=0A=
for(var =
i=3D0,len=3Delements.length;i<len;++i){if(method(elements[i])){nodes[node=
s.length]=3Delements[i];}}=0A=
return nodes;},batch:function(el,method,o,override){var =
id=3Del;el=3DY.Dom.get(el);var =
scope=3D(override)?o:window;if(!el||el.tagName||!el.length){if(!el){retur=
n false;}=0A=
return method.call(scope,el,o);}=0A=
var collection=3D[];for(var =
i=3D0,len=3Del.length;i<len;++i){if(!el[i]){id=3Del[i];}=0A=
collection[collection.length]=3Dmethod.call(scope,el[i],o);}=0A=
return collection;},getDocumentHeight:function(){var =
scrollHeight=3D(document.compatMode!=3D'CSS1Compat')?document.body.scroll=
Height:document.documentElement.scrollHeight;var =
h=3DMath.max(scrollHeight,Y.Dom.getViewportHeight());return =
h;},getDocumentWidth:function(){var =
scrollWidth=3D(document.compatMode!=3D'CSS1Compat')?document.body.scrollW=
idth:document.documentElement.scrollWidth;var =
w=3DMath.max(scrollWidth,Y.Dom.getViewportWidth());return =
w;},getViewportHeight:function(){var height=3Dself.innerHeight;var =
mode=3Ddocument.compatMode;if((mode||isIE)&&!isOpera){height=3D(mode=3D=3D=
'CSS1Compat')?document.documentElement.clientHeight:document.body.clientH=
eight;}=0A=
return height;},getViewportWidth:function(){var =
width=3Dself.innerWidth;var =
mode=3Ddocument.compatMode;if(mode||isIE){width=3D(mode=3D=3D'CSS1Compat'=
)?document.documentElement.clientWidth:document.body.clientWidth;}=0A=
return =
width;}};})();YAHOO.util.Region=3Dfunction(t,r,b,l){this.top=3Dt;this[1]=3D=
t;this.right=3Dr;this.bottom=3Db;this.left=3Dl;this[0]=3Dl;};YAHOO.util.R=
egion.prototype.contains=3Dfunction(region){return(region.left>=3Dthis.le=
ft&&region.right<=3Dthis.right&&region.top>=3Dthis.top&&region.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<len;++i){ok=3Dthis.on(el[i],sType,fn,obj,override=
)&&ok;}=0A=
return ok;}else if(typeof el=3D=3D"string"){var =
oEl=3Dthis.getEl(el);if(oEl){el=3DoEl;}else{this.onAvailable(el,function(=
){YAHOO.util.Event.on(el,sType,fn,obj,override);});return true;}}=0A=
if(!el){return false;}=0A=
if("unload"=3D=3DsType&&obj!=3D=3Dthis){unloadListeners[unloadListeners.l=
ength]=3D[el,sType,fn,obj,override];return true;}=0A=
var =
scope=3Del;if(override){if(override=3D=3D=3Dtrue){scope=3Dobj;}else{scope=
=3Doverride;}}=0A=
var wrappedFn=3Dfunction(e){return =
fn.call(scope,YAHOO.util.Event.getEvent(e),obj);};var =
li=3D[el,sType,fn,wrappedFn,scope];var =
index=3Dlisteners.length;listeners[index]=3Dli;if(this.useLegacyEvent(el,=
sType)){var =
legacyIndex=3Dthis.getLegacyIndex(el,sType);if(legacyIndex=3D=3D-1||el!=3D=
legacyEvents[legacyIndex][0]){legacyIndex=3DlegacyEvents.length;legacyMap=
[el.id+sType]=3DlegacyIndex;legacyEvents[legacyIndex]=3D[el,sType,el["on"=
+sType]];legacyHandlers[legacyIndex]=3D[];el["on"+sType]=3Dfunction(e){YA=
HOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e),legacyIndex);=
};}=0A=
legacyHandlers[legacyIndex].push(li);}else{try{this._simpleAdd(el,sType,w=
rappedFn,false);}catch(ex){this.lastError=3Dex;this.removeListener(el,sTy=
pe,fn);return false;}}=0A=
return true;},fireLegacyEvent:function(e,legacyIndex){var =
ok=3Dtrue,le,lh,li,scope,ret;lh=3DlegacyHandlers[legacyIndex];for(var =
i=3D0,len=3Dlh.length;i<len;++i){li=3Dlh[i];if(li&&li[this.WFN]){scope=3D=
li[this.ADJ_SCOPE];ret=3Dli[this.WFN].call(scope,e);ok=3D(ok&&ret);}}=0A=
le=3DlegacyEvents[legacyIndex];if(le&&le[2]){le[2](e);}=0A=
return ok;},getLegacyIndex:function(el,sType){var =
key=3Dthis.generateId(el)+sType;if(typeof =
legacyMap[key]=3D=3D"undefined"){return-1;}else{return =
legacyMap[key];}},useLegacyEvent:function(el,sType){if(this.webkit&&("cli=
ck"=3D=3DsType||"dblclick"=3D=3DsType)){var =
v=3DparseInt(this.webkit,10);if(!isNaN(v)&&v<418){return true;}}=0A=
return false;},removeListener:function(el,sType,fn){var i,len;if(typeof =
el=3D=3D"string"){el=3Dthis.getEl(el);}else =
if(this._isValidCollection(el)){var =
ok=3Dtrue;for(i=3D0,len=3Del.length;i<len;++i){ok=3D(this.removeListener(=
el[i],sType,fn)&&ok);}=0A=
return ok;}=0A=
if(!fn||!fn.call){return this.purgeElement(el,false,sType);}=0A=
if("unload"=3D=3DsType){for(i=3D0,len=3DunloadListeners.length;i<len;i++)=
{var =
li=3DunloadListeners[i];if(li&&li[0]=3D=3Del&&li[1]=3D=3DsType&&li[2]=3D=3D=
fn){unloadListeners.splice(i,1);return true;}}=0A=
return false;}=0A=
var cacheItem=3Dnull;var index=3Darguments[3];if("undefined"=3D=3Dtypeof =
index){index=3Dthis._getCacheIndex(el,sType,fn);}=0A=
if(index>=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;i<len;++i){li=3Dllist[i];if(li&&li[this.EL]=3D=3Del&&li[this.TYPE]=3D=3D=
sType&&li[this.FN]=3D=3Dfn){llist.splice(i,1);break;}}}}else{try{this._si=
mpleRemove(el,sType,cacheItem[this.WFN],false);}catch(ex){this.lastError=3D=
ex;return false;}}=0A=
delete listeners[index][this.WFN];delete =
listeners[index][this.FN];listeners.splice(index,1);return =
true;},getTarget:function(ev,resolveTextNode){var =
t=3Dev.target||ev.srcElement;return =
this.resolveTextNode(t);},resolveTextNode:function(node){if(node&&3=3D=3D=
node.nodeType){return node.parentNode;}else{return =
node;}},getPageX:function(ev){var =
x=3Dev.pageX;if(!x&&0!=3D=3Dx){x=3Dev.clientX||0;if(this.isIE){x+=3Dthis.=
_getScrollLeft();}}=0A=
return x;},getPageY:function(ev){var =
y=3Dev.pageY;if(!y&&0!=3D=3Dy){y=3Dev.clientY||0;if(this.isIE){y+=3Dthis.=
_getScrollTop();}}=0A=
return =
y;},getXY:function(ev){return[this.getPageX(ev),this.getPageY(ev)];},getR=
elatedTarget:function(ev){var =
t=3Dev.relatedTarget;if(!t){if(ev.type=3D=3D"mouseout"){t=3Dev.toElement;=
}else if(ev.type=3D=3D"mouseover"){t=3Dev.fromElement;}}=0A=
return this.resolveTextNode(t);},getTime:function(ev){if(!ev.time){var =
t=3Dnew =
Date().getTime();try{ev.time=3Dt;}catch(ex){this.lastError=3Dex;return =
t;}}=0A=
return =
ev.time;},stopEvent:function(ev){this.stopPropagation(ev);this.preventDef=
ault(ev);},stopPropagation:function(ev){if(ev.stopPropagation){ev.stopPro=
pagation();}else{ev.cancelBubble=3Dtrue;}},preventDefault:function(ev){if=
(ev.preventDefault){ev.preventDefault();}else{ev.returnValue=3Dfalse;}},g=
etEvent:function(e){var ev=3De||window.event;if(!ev){var =
c=3Dthis.getEvent.caller;while(c){ev=3Dc.arguments[0];if(ev&&Event=3D=3De=
v.constructor){break;}=0A=
c=3Dc.caller;}}=0A=
return ev;},getCharCode:function(ev){return =
ev.charCode||ev.keyCode||0;},_getCacheIndex:function(el,sType,fn){for(var=
 i=3D0,len=3Dlisteners.length;i<len;++i){var =
li=3Dlisteners[i];if(li&&li[this.FN]=3D=3Dfn&&li[this.EL]=3D=3Del&&li[thi=
s.TYPE]=3D=3DsType){return i;}}=0A=
return-1;},generateId:function(el){var =
id=3Del.id;if(!id){id=3D"yuievtautoid-"+counter;++counter;el.id=3Did;}=0A=
return id;},_isValidCollection:function(o){return(o&&o.length&&typeof =
o!=3D"string"&&!o.tagName&&!o.alert&&typeof =
o[0]!=3D"undefined");},elCache:{},getEl:function(id){return =
document.getElementById(id);},clearCache:function(){},_load:function(e){l=
oadComplete=3Dtrue;var =
EU=3DYAHOO.util.Event;if(this.isIE){EU._simpleRemove(window,"load",EU._lo=
ad);}},_tryPreloadAttach:function(){if(this.locked){return false;}=0A=
this.locked=3Dtrue;var =
tryAgain=3D!loadComplete;if(!tryAgain){tryAgain=3D(retryCount>0);}=0A=
var notAvail=3D[];for(var i=3D0,len=3DonAvailStack.length;i<len;++i){var =
item=3DonAvailStack[i];if(item){var =
el=3Dthis.getEl(item.id);if(el){if(!item.checkReady||loadComplete||el.nex=
tSibling||(document&&document.body)){var =
scope=3Del;if(item.override){if(item.override=3D=3D=3Dtrue){scope=3Ditem.=
obj;}else{scope=3Ditem.override;}}=0A=
item.fn.call(scope,item.obj);onAvailStack[i]=3Dnull;}}else{notAvail.push(=
item);}}}=0A=
retryCount=3D(notAvail.length=3D=3D=3D0)?0:retryCount-1;if(tryAgain){this=
.startInterval();}else{clearInterval(this._interval);this._interval=3Dnul=
l;}=0A=
this.locked=3Dfalse;return =
true;},purgeElement:function(el,recurse,sType){var =
elListeners=3Dthis.getListeners(el,sType);if(elListeners){for(var =
i=3D0,len=3DelListeners.length;i<len;++i){var =
l=3DelListeners[i];this.removeListener(el,l.type,l.fn);}}=0A=
if(recurse&&el&&el.childNodes){for(i=3D0,len=3Del.childNodes.length;i<len=
;++i){this.purgeElement(el.childNodes[i],recurse,sType);}}},getListeners:=
function(el,sType){var =
results=3D[],searchLists;if(!sType){searchLists=3D[listeners,unloadListen=
ers];}else =
if(sType=3D=3D"unload"){searchLists=3D[unloadListeners];}else{searchLists=
=3D[listeners];}=0A=
for(var j=3D0;j<searchLists.length;++j){var =
searchList=3DsearchLists[j];if(searchList&&searchList.length>0){for(var =
i=3D0,len=3DsearchList.length;i<len;++i){var =
l=3DsearchList[i];if(l&&l[this.EL]=3D=3D=3Del&&(!sType||sType=3D=3D=3Dl[t=
his.TYPE])){results.push({type:l[this.TYPE],fn:l[this.FN],obj:l[this.OBJ]=
,adjust:l[this.ADJ_SCOPE],index:i});}}}}=0A=
return(results.length)?results:null;},_unload:function(e){var =
EU=3DYAHOO.util.Event,i,j,l,len,index;for(i=3D0,len=3DunloadListeners.len=
gth;i<len;++i){l=3DunloadListeners[i];if(l){var =
scope=3Dwindow;if(l[EU.ADJ_SCOPE]){if(l[EU.ADJ_SCOPE]=3D=3D=3Dtrue){scope=
=3Dl[EU.OBJ];}else{scope=3Dl[EU.ADJ_SCOPE];}}=0A=
l[EU.FN].call(scope,EU.getEvent(e),l[EU.OBJ]);unloadListeners[i]=3Dnull;l=
=3Dnull;scope=3Dnull;}}=0A=
unloadListeners=3Dnull;if(listeners&&listeners.length>0){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;i<len;++i){legacyEvents[i][0]=3Dnull;=
legacyEvents[i]=3Dnull;}=0A=
legacyEvents=3Dnull;EU._simpleRemove(window,"unload",EU._unload);},_getSc=
rollLeft:function(){return =
this._getScroll()[1];},_getScrollTop:function(){return =
this._getScroll()[0];},_getScroll:function(){var =
dd=3Ddocument.documentElement,db=3Ddocument.body;if(dd&&(dd.scrollTop||dd=
.scrollLeft)){return[dd.scrollTop,dd.scrollLeft];}else =
if(db){return[db.scrollTop,db.scrollLeft];}else{return[0,0];}},regCE:func=
tion(){},_simpleAdd:function(){if(window.addEventListener){return =
function(el,sType,fn,capture){el.addEventListener(sType,fn,(capture));};}=
else if(window.attachEvent){return =
function(el,sType,fn,capture){el.attachEvent("on"+sType,fn);};}else{retur=
n =
function(){};}}(),_simpleRemove:function(){if(window.removeEventListener)=
{return =
function(el,sType,fn,capture){el.removeEventListener(sType,fn,(capture));=
};}else if(window.detachEvent){return =
function(el,sType,fn){el.detachEvent("on"+sType,fn);};}else{return =
function(){};}}()};}();(function(){var =
EU=3DYAHOO.util.Event;EU.on=3DEU.addListener;if(document&&document.body){=
EU._load();}else{EU._simpleAdd(window,"load",EU._load);}=0A=
EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}=0A=
YAHOO.util.CustomEvent=3Dfunction(type,oScope,silent,signature){this.type=
=3Dtype;this.scope=3DoScope||window;this.silent=3Dsilent;this.signature=3D=
signature||YAHOO.util.CustomEvent.LIST;this.subscribers=3D[];if(!this.sil=
ent){}=0A=
var =
onsubscribeType=3D"_YUICEOnSubscribe";if(type!=3D=3DonsubscribeType){this=
.subscribeEvent=3Dnew =
YAHOO.util.CustomEvent(onsubscribeType,this,true);}};YAHOO.util.CustomEve=
nt.LIST=3D0;YAHOO.util.CustomEvent.FLAT=3D1;YAHOO.util.CustomEvent.protot=
ype=3D{subscribe:function(fn,obj,override){if(this.subscribeEvent){this.s=
ubscribeEvent.fire(fn,obj,override);}=0A=
this.subscribers.push(new =
YAHOO.util.Subscriber(fn,obj,override));},unsubscribe:function(fn,obj){if=
(!fn){return this.unsubscribeAll();}=0A=
var found=3Dfalse;for(var =
i=3D0,len=3Dthis.subscribers.length;i<len;++i){var =
s=3Dthis.subscribers[i];if(s&&s.contains(fn,obj)){this._delete(i);found=3D=
true;}}=0A=
return found;},fire:function(){var =
len=3Dthis.subscribers.length;if(!len&&this.silent){return true;}=0A=
var =
args=3D[],ret=3Dtrue,i;for(i=3D0;i<arguments.length;++i){args.push(argume=
nts[i]);}=0A=
var argslength=3Dargs.length;if(!this.silent){}=0A=
for(i=3D0;i<len;++i){var s=3Dthis.subscribers[i];if(s){if(!this.silent){}=0A=
var =
scope=3Ds.getScope(this.scope);if(this.signature=3D=3DYAHOO.util.CustomEv=
ent.FLAT){var param=3Dnull;if(args.length>0){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<len;++i){this._delete(len-1-i);}=0A=
return i;},_delete:function(index){var =
s=3Dthis.subscribers[index];if(s){delete s.fn;delete s.obj;}=0A=
this.subscribers.splice(index,1);},toString:function(){return"CustomEvent=
: "+"'"+this.type+"', "+"scope: =
"+this.scope;}};YAHOO.util.Subscriber=3Dfunction(fn,obj,override){this.fn=
=3Dfn;this.obj=3Dobj||null;this.override=3Doverride;};YAHOO.util.Subscrib=
er.prototype.getScope=3Dfunction(defaultScope){if(this.override){if(this.=
override=3D=3D=3Dtrue){return this.obj;}else{return this.override;}}=0A=
return =
defaultScope;};YAHOO.util.Subscriber.prototype.contains=3Dfunction(fn,obj=
){if(obj){return(this.fn=3D=3Dfn&&this.obj=3D=3Dobj);}else{return(this.fn=
=3D=3Dfn);}};YAHOO.util.Subscriber.prototype.toString=3Dfunction(){return=
"Subscriber { obj: "+(this.obj||"")+", override: =
"+(this.override||"no")+" =
}";};YAHOO.util.EventProvider=3Dfunction(){};YAHOO.util.EventProvider.pro=
totype=3D{__yui_events:null,__yui_subscribers:null,subscribe:function(p_t=
ype,p_fn,p_obj,p_override){this.__yui_events=3Dthis.__yui_events||{};var =
ce=3Dthis.__yui_events[p_type];if(ce){ce.subscribe(p_fn,p_obj,p_override)=
;}else{this.__yui_subscribers=3Dthis.__yui_subscribers||{};var =
subs=3Dthis.__yui_subscribers;if(!subs[p_type]){subs[p_type]=3D[];}=0A=
subs[p_type].push({fn:p_fn,obj:p_obj,override:p_override});}},unsubscribe=
:function(p_type,p_fn,p_obj){this.__yui_events=3Dthis.__yui_events||{};va=
r ce=3Dthis.__yui_events[p_type];if(ce){return =
ce.unsubscribe(p_fn,p_obj);}else{return =
false;}},unsubscribeAll:function(p_type){return =
this.unsubscribe(p_type);},createEvent:function(p_type,p_config){this.__y=
ui_events=3Dthis.__yui_events||{};var opts=3Dp_config||{};var =
events=3Dthis.__yui_events;if(events[p_type]){}else{var =
scope=3Dopts.scope||this;var silent=3Dopts.silent||null;var ce=3Dnew =
YAHOO.util.CustomEvent(p_type,scope,silent,YAHOO.util.CustomEvent.FLAT);e=
vents[p_type]=3Dce;if(opts.onSubscribeCallback){ce.subscribeEvent.subscri=
be(opts.onSubscribeCallback);}=0A=
this.__yui_subscribers=3Dthis.__yui_subscribers||{};var =
qs=3Dthis.__yui_subscribers[p_type];if(qs){for(var =
i=3D0;i<qs.length;++i){ce.subscribe(qs[i].fn,qs[i].obj,qs[i].override);}}=
}=0A=
return =
events[p_type];},fireEvent:function(p_type,arg1,arg2,etc){this.__yui_even=
ts=3Dthis.__yui_events||{};var ce=3Dthis.__yui_events[p_type];if(ce){var =
args=3D[];for(var i=3D1;i<arguments.length;++i){args.push(arguments[i]);}=0A=
return ce.fire.apply(ce,args);}else{return =
null;}},hasEvent:function(type){if(this.__yui_events){if(this.__yui_event=
s[type]){return true;}}=0A=
return =
false;}};YAHOO.util.KeyListener=3Dfunction(attachTo,keyData,handler,event=
){if(!attachTo){}else if(!keyData){}else if(!handler){}=0A=
if(!event){event=3DYAHOO.util.KeyListener.KEYDOWN;}=0A=
var keyEvent=3Dnew =
YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=3Dnew =
YAHOO.util.CustomEvent("enabled");this.disabledEvent=3Dnew =
YAHOO.util.CustomEvent("disabled");if(typeof =
attachTo=3D=3D'string'){attachTo=3Ddocument.getElementById(attachTo);}=0A=
if(typeof =
handler=3D=3D'function'){keyEvent.subscribe(handler);}else{keyEvent.subsc=
ribe(handler.fn,handler.scope,handler.correctScope);}=0A=
function handleKeyPress(e,obj){if(!keyData.shift){keyData.shift=3Dfalse;}=0A=
if(!keyData.alt){keyData.alt=3Dfalse;}=0A=
if(!keyData.ctrl){keyData.ctrl=3Dfalse;}=0A=
if(e.shiftKey=3D=3DkeyData.shift&&e.altKey=3D=3DkeyData.alt&&e.ctrlKey=3D=
=3DkeyData.ctrl){var dataItem;var keyPressed;if(keyData.keys instanceof =
Array){for(var =
i=3D0;i<keyData.keys.length;i++){dataItem=3DkeyData.keys[i];if(dataItem=3D=
=3De.charCode){keyEvent.fire(e.charCode,e);break;}else =
if(dataItem=3D=3De.keyCode){keyEvent.fire(e.keyCode,e);break;}}}else{data=
Item=3DkeyData.keys;if(dataItem=3D=3De.charCode){keyEvent.fire(e.charCode=
,e);}else if(dataItem=3D=3De.keyCode){keyEvent.fire(e.keyCode,e);}}}}=0A=
this.enable=3Dfunction(){if(!this.enabled){YAHOO.util.Event.addListener(a=
ttachTo,event,handleKeyPress);this.enabledEvent.fire(keyData);}=0A=
this.enabled=3Dtrue;};this.disable=3Dfunction(){if(this.enabled){YAHOO.ut=
il.Event.removeListener(attachTo,event,handleKeyPress);this.disabledEvent=
.fire(keyData);}=0A=
this.enabled=3Dfalse;};this.toString=3Dfunction(){return"KeyListener =
["+keyData.keys+"] "+attachTo.tagName+=0A=
(attachTo.id?"["+attachTo.id+"]":"");};};YAHOO.util.KeyListener.KEYDOWN=3D=
"keydown";YAHOO.util.KeyListener.KEYUP=3D"keyup";YAHOO.register("event",Y=
AHOO.util.Event,{version:"2.2.0",build:"127"});YAHOO.util.Connect=3D{_msx=
ml_progid:['MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],_ht=
tp_headers:{},_has_http_headers:false,_use_default_post_header:true,_defa=
ult_post_header:'application/x-www-form-urlencoded',_use_default_xhr_head=
er:true,_default_xhr_header:'XMLHttpRequest',_has_default_headers:true,_d=
efault_headers:{},_isFormSubmit:false,_isFileUpload:false,_formNode:null,=
_sFormData:null,_poll:{},_timeOut:{},_polling_interval:50,_transaction_id=
:0,setProgId:function(id)=0A=
{this._msxml_progid.unshift(id);},setDefaultPostHeader:function(b)=0A=
{this._use_default_post_header=3Db;},setDefaultXhrHeader:function(b)=0A=
{this._use_default_xhr_header=3Db;},setPollingInterval:function(i)=0A=
{if(typeof =
i=3D=3D'number'&&isFinite(i)){this._polling_interval=3Di;}},createXhrObje=
ct:function(transactionId)=0A=
{var obj,http;try=0A=
{http=3Dnew XMLHttpRequest();obj=3D{conn:http,tId:transactionId};}=0A=
catch(e)=0A=
{for(var i=3D0;i<this._msxml_progid.length;++i){try=0A=
{http=3Dnew =
ActiveXObject(this._msxml_progid[i]);obj=3D{conn:http,tId:transactionId};=
break;}=0A=
catch(e){}}}=0A=
finally=0A=
{return obj;}},getConnectionObject:function()=0A=
{var o;var tId=3Dthis._transaction_id;try=0A=
{o=3Dthis.createXhrObject(tId);if(o){this._transaction_id++;}}=0A=
catch(e){}=0A=
finally=0A=
{return o;}},asyncRequest:function(method,uri,callback,postData)=0A=
{var o=3Dthis.getConnectionObject();if(!o){return null;}=0A=
else{if(this._isFormSubmit){if(this._isFileUpload){this.uploadFile(o.tId,=
callback,uri,postData);this.releaseObject(o);return;}=0A=
if(method.toUpperCase()=3D=3D'GET'){if(this._sFormData.length!=3D0){uri+=3D=
((uri.indexOf('?')=3D=3D-1)?'?':'&')+this._sFormData;}=0A=
else{uri+=3D"?"+this._sFormData;}}=0A=
else =
if(method.toUpperCase()=3D=3D'POST'){postData=3DpostData?this._sFormData+=
"&"+postData:this._sFormData;}}=0A=
o.conn.open(method,uri,true);if(this._use_default_xhr_header){if(!this._d=
efault_headers['X-Requested-With']){this.initHeader('X-Requested-With',th=
is._default_xhr_header,true);}}=0A=
if(this._isFormSubmit||(postData&&this._use_default_post_header)){this.in=
itHeader('Content-Type',this._default_post_header);if(this._isFormSubmit)=
{this.resetFormState();}}=0A=
if(this._has_default_headers||this._has_http_headers){this.setHeader(o);}=0A=
this.handleReadyState(o,callback);o.conn.send(postData||null);return =
o;}},handleReadyState:function(o,callback)=0A=
{var =
oConn=3Dthis;if(callback&&callback.timeout){this._timeOut[o.tId]=3Dwindow=
.setTimeout(function(){oConn.abort(o,callback,true);},callback.timeout);}=0A=
this._poll[o.tId]=3Dwindow.setInterval(function(){if(o.conn&&o.conn.ready=
State=3D=3D4){window.clearInterval(oConn._poll[o.tId]);delete =
oConn._poll[o.tId];if(callback&&callback.timeout){delete =
oConn._timeOut[o.tId];}=0A=
oConn.handleTransactionResponse(o,callback);}},this._polling_interval);},=
handleTransactionResponse:function(o,callback,isAbort)=0A=
{if(!callback){this.releaseObject(o);return;}=0A=
var httpStatus,responseObject;try=0A=
{if(o.conn.status!=3D=3Dundefined&&o.conn.status!=3D0){httpStatus=3Do.con=
n.status;}=0A=
else{httpStatus=3D13030;}}=0A=
catch(e){httpStatus=3D13030;}=0A=
if(httpStatus>=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<header.length;i++){var =
delimitPos=3Dheader[i].indexOf(':');if(delimitPos!=3D-1){headerObj[header=
[i].substring(0,delimitPos)]=3Dheader[i].substring(delimitPos+2);}}}=0A=
catch(e){}=0A=
obj.tId=3Do.tId;obj.status=3Do.conn.status;obj.statusText=3Do.conn.status=
Text;obj.getResponseHeader=3DheaderObj;obj.getAllResponseHeaders=3Dheader=
Str;obj.responseText=3Do.conn.responseText;obj.responseXML=3Do.conn.respo=
nseXML;if(typeof =
callbackArg!=3D=3Dundefined){obj.argument=3DcallbackArg;}=0A=
return obj;},createExceptionObject:function(tId,callbackArg,isAbort)=0A=
{var COMM_CODE=3D0;var COMM_ERROR=3D'communication failure';var =
ABORT_CODE=3D-1;var ABORT_ERROR=3D'transaction aborted';var =
obj=3D{};obj.tId=3DtId;if(isAbort){obj.status=3DABORT_CODE;obj.statusText=
=3DABORT_ERROR;}=0A=
else{obj.status=3DCOMM_CODE;obj.statusText=3DCOMM_ERROR;}=0A=
if(callbackArg){obj.argument=3DcallbackArg;}=0A=
return obj;},initHeader:function(label,value,isDefault)=0A=
{var =
headerObj=3D(isDefault)?this._default_headers:this._http_headers;if(heade=
rObj[label]=3D=3D=3Dundefined){headerObj[label]=3Dvalue;}=0A=
else{headerObj[label]=3Dvalue+","+headerObj[label];}=0A=
if(isDefault){this._has_default_headers=3Dtrue;}=0A=
else{this._has_http_headers=3Dtrue;}},setHeader:function(o)=0A=
{if(this._has_default_headers){for(var prop in =
this._default_headers){if(YAHOO.lang.hasOwnProperty(this._default_headers=
,prop)){o.conn.setRequestHeader(prop,this._default_headers[prop]);}}}=0A=
if(this._has_http_headers){for(var prop in =
this._http_headers){if(YAHOO.lang.hasOwnProperty(this._http_headers,prop)=
){o.conn.setRequestHeader(prop,this._http_headers[prop]);}}=0A=
delete =
this._http_headers;this._http_headers=3D{};this._has_http_headers=3Dfalse=
;}},resetDefaultHeaders:function(){delete this._default_headers=0A=
this._default_headers=3D{};this._has_default_headers=3Dfalse;},setForm:fu=
nction(formId,isUpload,secureUri)=0A=
{this.resetFormState();var oForm;if(typeof =
formId=3D=3D'string'){oForm=3D(document.getElementById(formId)||document.=
forms[formId]);}=0A=
else if(typeof formId=3D=3D'object'){oForm=3DformId;}=0A=
else{return;}=0A=
if(isUpload){this.createFrame(secureUri?secureUri:null);this._isFormSubmi=
t=3Dtrue;this._isFileUpload=3Dtrue;this._formNode=3DoForm;return;}=0A=
var oElement,oName,oValue,oDisabled;var hasSubmit=3Dfalse;for(var =
i=3D0;i<oForm.elements.length;i++){oElement=3DoForm.elements[i];oDisabled=
=3DoForm.elements[i].disabled;oName=3DoForm.elements[i].name;oValue=3DoFo=
rm.elements[i].value;if(!oDisabled&&oName)=0A=
{switch(oElement.type)=0A=
{case'select-one':case'select-multiple':for(var =
j=3D0;j<oElement.options.length;j++){if(oElement.options[j].selected){if(=
window.ActiveXObject){this._sFormData+=3DencodeURIComponent(oName)+'=3D'+=
encodeURIComponent(oElement.options[j].attributes['value'].specified?oEle=
ment.options[j].value:oElement.options[j].text)+'&';}=0A=
else{this._sFormData+=3DencodeURIComponent(oName)+'=3D'+encodeURIComponen=
t(oElement.options[j].hasAttribute('value')?oElement.options[j].value:oEl=
ement.options[j].text)+'&';}}}=0A=
break;case'radio':case'checkbox':if(oElement.checked){this._sFormData+=3D=
encodeURIComponent(oName)+'=3D'+encodeURIComponent(oValue)+'&';}=0A=
break;case'file':case =
undefined:case'reset':case'button':break;case'submit':if(hasSubmit=3D=3Df=
alse){this._sFormData+=3DencodeURIComponent(oName)+'=3D'+encodeURICompone=
nt(oValue)+'&';hasSubmit=3Dtrue;}=0A=
break;default:this._sFormData+=3DencodeURIComponent(oName)+'=3D'+encodeUR=
IComponent(oValue)+'&';break;}}}=0A=
this._isFormSubmit=3Dtrue;this._sFormData=3Dthis._sFormData.substr(0,this=
._sFormData.length-1);return =
this._sFormData;},resetFormState:function(){this._isFormSubmit=3Dfalse;th=
is._isFileUpload=3Dfalse;this._formNode=3Dnull;this._sFormData=3D"";},cre=
ateFrame:function(secureUri){var =
frameId=3D'yuiIO'+this._transaction_id;if(window.ActiveXObject){var =
io=3Ddocument.createElement('<iframe id=3D"'+frameId+'" =
name=3D"'+frameId+'" />');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;i<postMessage.length;i++){var =
delimitPos=3DpostMessage[i].indexOf('=3D');if(delimitPos!=3D-1){formEleme=
nts[i]=3Ddocument.createElement('input');formElements[i].type=3D'hidden';=
formElements[i].name=3DpostMessage[i].substring(0,delimitPos);formElement=
s[i].value=3DpostMessage[i].substring(delimitPos+1);this._formNode.append=
Child(formElements[i]);}}=0A=
return formElements;},uploadFile:function(id,callback,uri,postData){var =
frameId=3D'yuiIO'+id;var uploadEncoding=3D'multipart/form-data';var =
io=3Ddocument.getElementById(frameId);this._formNode.action=3Duri;this._f=
ormNode.method=3D'POST';this._formNode.target=3DframeId;if(this._formNode=
.encoding){this._formNode.encoding=3DuploadEncoding;}=0A=
else{this._formNode.enctype=3DuploadEncoding;}=0A=
if(postData){var oElements=3Dthis.appendPostData(postData);}=0A=
this._formNode.submit();if(oElements&&oElements.length>0){for(var =
i=3D0;i<oElements.length;i++){this._formNode.removeChild(oElements[i]);}}=0A=
this.resetFormState();var uploadCallback=3Dfunction()=0A=
{var obj=3D{};obj.tId=3Did;obj.argument=3Dcallback.argument;try=0A=
{obj.responseText=3Dio.contentWindow.document.body?io.contentWindow.docum=
ent.body.innerHTML:null;obj.responseXML=3Dio.contentWindow.document.XMLDo=
cument?io.contentWindow.document.XMLDocument:io.contentWindow.document;}=0A=
catch(e){}=0A=
if(callback&&callback.upload){if(!callback.scope){callback.upload(obj);}=0A=
else{callback.upload.apply(callback.scope,[obj]);}}=0A=
if(YAHOO.util.Event){YAHOO.util.Event.removeListener(io,"load",uploadCall=
back);}=0A=
else if(window.detachEvent){io.detachEvent('onload',uploadCallback);}=0A=
else{io.removeEventListener('load',uploadCallback,false);}=0A=
setTimeout(function(){document.body.removeChild(io);},100);};if(YAHOO.uti=
l.Event){YAHOO.util.Event.addListener(io,"load",uploadCallback);}=0A=
else if(window.attachEvent){io.attachEvent('onload',uploadCallback);}=0A=
else{io.addEventListener('load',uploadCallback,false);}},abort:function(o=
,callback,isTimeout)=0A=
{if(this.isCallInProgress(o)){o.conn.abort();window.clearInterval(this._p=
oll[o.tId]);delete this._poll[o.tId];if(isTimeout){delete =
this._timeOut[o.tId];}=0A=
this.handleTransactionResponse(o,callback,true);return true;}=0A=
else{return false;}},isCallInProgress:function(o)=0A=
{if(o.conn){return o.conn.readyState!=3D4&&o.conn.readyState!=3D0;}=0A=
else{return false;}},releaseObject:function(o)=0A=
{o.conn=3Dnull;o=3Dnull;}};=0A=
YAHOO.register("connection", YAHOO.widget.Module, {version: "2.2.0", =
build: "127"});=0A=
YAHOO.util.Anim=3Dfunction(el,attributes,duration,method){if(el){this.ini=
t(el,attributes,duration,method);}};YAHOO.util.Anim.prototype=3D{toString=
:function(){var el=3Dthis.getEl();var =
id=3Del.id||el.tagName;return("Anim =
"+id);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttri=
bute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|botto=
m$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod=
:function(attr,start,end){return =
this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttr=
ibute:function(attr,val,unit){if(this.patterns.noNegatives.test(attr)){va=
l=3D(val>0)?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;i<len;++i){end[i]=3Dstart[i]+attributes[attr]['b=
y'][i];}}else{end=3Dstart+attributes[attr]['by'];}}=0A=
this.runtimeAttributes[attr].start=3Dstart;this.runtimeAttributes[attr].e=
nd=3Dend;this.runtimeAttributes[attr].unit=3D(isset(attributes[attr].unit=
))?attributes[attr]['unit']:this.getDefaultUnit(attr);},init:function(el,=
attributes,duration,method){var isAnimated=3Dfalse;var =
startTime=3Dnull;var =
actualFrames=3D0;el=3DYAHOO.util.Dom.get(el);this.attributes=3Dattributes=
||{};this.duration=3Dduration||1;this.method=3Dmethod||YAHOO.util.Easing.=
easeNone;this.useSeconds=3Dtrue;this.currentFrame=3D0;this.totalFrames=3D=
YAHOO.util.AnimMgr.fps;this.getEl=3Dfunction(){return =
el;};this.isAnimated=3Dfunction(){return =
isAnimated;};this.getStartTime=3Dfunction(){return =
startTime;};this.runtimeAttributes=3D{};this.animate=3Dfunction(){if(this=
.isAnimated()){return false;}=0A=
this.currentFrame=3D0;this.totalFrames=3D(this.useSeconds)?Math.ceil(YAHO=
O.util.AnimMgr.fps*this.duration):this.duration;YAHOO.util.AnimMgr.regist=
erElement(this);};this.stop=3Dfunction(finish){if(finish){this.currentFra=
me=3Dthis.totalFrames;this._onTween.fire();}=0A=
YAHOO.util.AnimMgr.stop(this);};var =
onStart=3Dfunction(){this.onStart.fire();this.runtimeAttributes=3D{};for(=
var attr in this.attributes){this.setRuntimeAttribute(attr);}=0A=
isAnimated=3Dtrue;actualFrames=3D0;startTime=3Dnew Date();};var =
onTween=3Dfunction(){var data=3D{duration:new =
Date()-this.getStartTime(),currentFrame:this.currentFrame};data.toString=3D=
function(){return('duration: '+data.duration+', currentFrame: =
'+data.currentFrame);};this.onTween.fire(data);var =
runtimeAttributes=3Dthis.runtimeAttributes;for(var attr in =
runtimeAttributes){this.setAttribute(attr,this.doMethod(attr,runtimeAttri=
butes[attr].start,runtimeAttributes[attr].end),runtimeAttributes[attr].un=
it);}=0A=
actualFrames+=3D1;};var onComplete=3Dfunction(){var =
actual_duration=3D(new Date()-startTime)/1000;var =
data=3D{duration:actual_duration,frames:actualFrames,fps:actualFrames/act=
ual_duration};data.toString=3Dfunction(){return('duration: =
'+data.duration+', frames: '+data.frames+', fps: =
'+data.fps);};isAnimated=3Dfalse;actualFrames=3D0;this.onComplete.fire(da=
ta);};this._onStart=3Dnew =
YAHOO.util.CustomEvent('_start',this,true);this.onStart=3Dnew =
YAHOO.util.CustomEvent('start',this);this.onTween=3Dnew =
YAHOO.util.CustomEvent('tween',this);this._onTween=3Dnew =
YAHOO.util.CustomEvent('_tween',this,true);this.onComplete=3Dnew =
YAHOO.util.CustomEvent('complete',this);this._onComplete=3Dnew =
YAHOO.util.CustomEvent('_complete',this,true);this._onStart.subscribe(onS=
tart);this._onTween.subscribe(onTween);this._onComplete.subscribe(onCompl=
ete);}};YAHOO.util.AnimMgr=3Dnew function(){var thread=3Dnull;var =
queue=3D[];var =
tweenCount=3D0;this.fps=3D1000;this.delay=3D1;this.registerElement=3Dfunc=
tion(tween){queue[queue.length]=3Dtween;tweenCount+=3D1;tween._onStart.fi=
re();this.start();};this.unRegister=3Dfunction(tween,index){tween._onComp=
lete.fire();index=3Dindex||getIndex(tween);if(index!=3D-1){queue.splice(i=
ndex,1);}=0A=
tweenCount-=3D1;if(tweenCount<=3D0){this.stop();}};this.start=3Dfunction(=
){if(thread=3D=3D=3Dnull){thread=3DsetInterval(this.run,this.delay);}};th=
is.stop=3Dfunction(tween){if(!tween){clearInterval(thread);for(var =
i=3D0,len=3Dqueue.length;i<len;++i){if(queue[0].isAnimated()){this.unRegi=
ster(queue[0],0);}}=0A=
queue=3D[];thread=3Dnull;tweenCount=3D0;}=0A=
else{this.unRegister(tween);}};this.run=3Dfunction(){for(var =
i=3D0,len=3Dqueue.length;i<len;++i){var =
tween=3Dqueue[i];if(!tween||!tween.isAnimated()){continue;}=0A=
if(tween.currentFrame<tween.totalFrames||tween.totalFrames=3D=3D=3Dnull)=0A=
{tween.currentFrame+=3D1;if(tween.useSeconds){correctFrame(tween);}=0A=
tween._onTween.fire();}=0A=
else{YAHOO.util.AnimMgr.stop(tween,i);}}};var =
getIndex=3Dfunction(anim){for(var =
i=3D0,len=3Dqueue.length;i<len;++i){if(queue[i]=3D=3Danim){return i;}}=0A=
return-1;};var correctFrame=3Dfunction(tween){var =
frames=3Dtween.totalFrames;var frame=3Dtween.currentFrame;var =
expected=3D(tween.currentFrame*tween.duration*1000/tween.totalFrames);var=
 elapsed=3D(new Date()-tween.getStartTime());var =
tweak=3D0;if(elapsed<tween.duration*1000){tweak=3DMath.round((elapsed/exp=
ected-1)*tween.currentFrame);}else{tweak=3Dframes-(frame+1);}=0A=
if(tweak>0&&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;i<n;++i){tmp[i]=3D[points[i][0],points[i][1]];}=0A=
for(var =
j=3D1;j<n;++j){for(i=3D0;i<n-j;++i){tmp[i][0]=3D(1-t)*tmp[i][0]+t*tmp[par=
seInt(i+1,10)][0];tmp[i][1]=3D(1-t)*tmp[i][1]+t*tmp[parseInt(i+1,10)][1];=
}}=0A=
return[tmp[0][0],tmp[0][1]];};};(function(){YAHOO.util.ColorAnim=3Dfuncti=
on(el,attributes,duration,method){YAHOO.util.ColorAnim.superclass.constru=
ctor.call(this,el,attributes,duration,method);};YAHOO.extend(YAHOO.util.C=
olorAnim,YAHOO.util.Anim);var Y=3DYAHOO.util;var =
superclass=3DY.ColorAnim.superclass;var =
proto=3DY.ColorAnim.prototype;proto.toString=3Dfunction(){var =
el=3Dthis.getEl();var id=3Del.id||el.tagName;return("ColorAnim =
"+id);};proto.patterns.color=3D/color$/i;proto.patterns.rgb=3D/^rgb\(([0-=
9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;proto.patterns.hex=3D/^#?([0-9A-F=
]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;proto.patterns.hex3=3D/^#?([0-9A-F]{1}=
)([0-9A-F]{1})([0-9A-F]{1})$/i;proto.patterns.transparent=3D/^transparent=
|rgba\(0, 0, 0, =
0\)$/;proto.parseColor=3Dfunction(s){if(s.length=3D=3D3){return s;}=0A=
var =
c=3Dthis.patterns.hex.exec(s);if(c&&c.length=3D=3D4){return[parseInt(c[1]=
,16),parseInt(c[2],16),parseInt(c[3],16)];}=0A=
c=3Dthis.patterns.rgb.exec(s);if(c&&c.length=3D=3D4){return[parseInt(c[1]=
,10),parseInt(c[2],10),parseInt(c[3],10)];}=0A=
c=3Dthis.patterns.hex3.exec(s);if(c&&c.length=3D=3D4){return[parseInt(c[1=
]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];}=0A=
return null;};proto.getAttribute=3Dfunction(attr){var =
el=3Dthis.getEl();if(this.patterns.color.test(attr)){var =
val=3DYAHOO.util.Dom.getStyle(el,attr);if(this.patterns.transparent.test(=
val)){var =
parent=3Del.parentNode;val=3DY.Dom.getStyle(parent,attr);while(parent&&th=
is.patterns.transparent.test(val)){parent=3Dparent.parentNode;val=3DY.Dom=
.getStyle(parent,attr);if(parent.tagName.toUpperCase()=3D=3D'HTML'){val=3D=
'#fff';}}}}else{val=3Dsuperclass.getAttribute.call(this,attr);}=0A=
return val;};proto.doMethod=3Dfunction(attr,start,end){var =
val;if(this.patterns.color.test(attr)){val=3D[];for(var =
i=3D0,len=3Dstart.length;i<len;++i){val[i]=3Dsuperclass.doMethod.call(thi=
s,attr,start[i],end[i]);}=0A=
val=3D'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val=
[2])+')';}=0A=
else{val=3Dsuperclass.doMethod.call(this,attr,start,end);}=0A=
return =
val;};proto.setRuntimeAttribute=3Dfunction(attr){superclass.setRuntimeAtt=
ribute.call(this,attr);if(this.patterns.color.test(attr)){var =
attributes=3Dthis.attributes;var =
start=3Dthis.parseColor(this.runtimeAttributes[attr].start);var =
end=3Dthis.parseColor(this.runtimeAttributes[attr].end);if(typeof =
attributes[attr]['to']=3D=3D=3D'undefined'&&typeof =
attributes[attr]['by']!=3D=3D'undefined'){end=3Dthis.parseColor(attribute=
s[attr].by);for(var =
i=3D0,len=3Dstart.length;i<len;++i){end[i]=3Dstart[i]+end[i];}}=0A=
this.runtimeAttributes[attr].start=3Dstart;this.runtimeAttributes[attr].e=
nd=3Dend;}};})();YAHOO.util.Easing=3D{easeNone:function(t,b,c,d){return =
c*t/d+b;},easeIn:function(t,b,c,d){return =
c*(t/=3Dd)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=3Dd)*(t-2)+b;},ea=
seBoth:function(t,b,c,d){if((t/=3Dd/2)<1){return c/2*t*t+b;}=0A=
return-c/2*((--t)*(t-2)-1)+b;},easeInStrong:function(t,b,c,d){return =
c*(t/=3Dd)*t*t*t+b;},easeOutStrong:function(t,b,c,d){return-c*((t=3Dt/d-1=
)*t*t*t-1)+b;},easeBothStrong:function(t,b,c,d){if((t/=3Dd/2)<1){return =
c/2*t*t*t*t+b;}=0A=
return-c/2*((t-=3D2)*t*t*t-2)+b;},elasticIn:function(t,b,c,d,a,p){if(t=3D=
=3D0){return b;}=0A=
if((t/=3Dd)=3D=3D1){return b+c;}=0A=
if(!p){p=3Dd*.3;}=0A=
if(!a||a<Math.abs(c)){a=3Dc;var s=3Dp/4;}=0A=
else{var s=3Dp/(2*Math.PI)*Math.asin(c/a);}=0A=
return-(a*Math.pow(2,10*(t-=3D1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;},el=
asticOut:function(t,b,c,d,a,p){if(t=3D=3D0){return b;}=0A=
if((t/=3Dd)=3D=3D1){return b+c;}=0A=
if(!p){p=3Dd*.3;}=0A=
if(!a||a<Math.abs(c)){a=3Dc;var s=3Dp/4;}=0A=
else{var s=3Dp/(2*Math.PI)*Math.asin(c/a);}=0A=
return =
a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b;},elasticBoth:fun=
ction(t,b,c,d,a,p){if(t=3D=3D0){return b;}=0A=
if((t/=3Dd/2)=3D=3D2){return b+c;}=0A=
if(!p){p=3Dd*(.3*1.5);}=0A=
if(!a||a<Math.abs(c)){a=3Dc;var s=3Dp/4;}=0A=
else{var s=3Dp/(2*Math.PI)*Math.asin(c/a);}=0A=
if(t<1){return-.5*(a*Math.pow(2,10*(t-=3D1))*Math.sin((t*d-s)*(2*Math.PI)=
/p))+b;}=0A=
return =
a*Math.pow(2,-10*(t-=3D1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b;},backI=
n:function(t,b,c,d,s){if(typeof s=3D=3D'undefined'){s=3D1.70158;}=0A=
return =
c*(t/=3Dd)*t*((s+1)*t-s)+b;},backOut:function(t,b,c,d,s){if(typeof =
s=3D=3D'undefined'){s=3D1.70158;}=0A=
return =
c*((t=3Dt/d-1)*t*((s+1)*t+s)+1)+b;},backBoth:function(t,b,c,d,s){if(typeo=
f s=3D=3D'undefined'){s=3D1.70158;}=0A=
if((t/=3Dd/2)<1){return c/2*(t*t*(((s*=3D(1.525))+1)*t-s))+b;}=0A=
return =
c/2*((t-=3D2)*t*(((s*=3D(1.525))+1)*t+s)+2)+b;},bounceIn:function(t,b,c,d=
){return =
c-YAHOO.util.Easing.bounceOut(d-t,0,c,d)+b;},bounceOut:function(t,b,c,d){=
if((t/=3Dd)<(1/2.75)){return c*(7.5625*t*t)+b;}else =
if(t<(2/2.75)){return c*(7.5625*(t-=3D(1.5/2.75))*t+.75)+b;}else =
if(t<(2.5/2.75)){return c*(7.5625*(t-=3D(2.25/2.75))*t+.9375)+b;}=0A=
return =
c*(7.5625*(t-=3D(2.625/2.75))*t+.984375)+b;},bounceBoth:function(t,b,c,d)=
{if(t<d/2){return YAHOO.util.Easing.bounceIn(t*2,0,c,d)*.5+b;}=0A=
return =
YAHOO.util.Easing.bounceOut(t*2-d,0,c,d)*.5+c*.5+b;}};(function(){YAHOO.u=
til.Motion=3Dfunction(el,attributes,duration,method){if(el){YAHOO.util.Mo=
tion.superclass.constructor.call(this,el,attributes,duration,method);}};Y=
AHOO.extend(YAHOO.util.Motion,YAHOO.util.ColorAnim);var =
Y=3DYAHOO.util;var superclass=3DY.Motion.superclass;var =
proto=3DY.Motion.prototype;proto.toString=3Dfunction(){var =
el=3Dthis.getEl();var id=3Del.id||el.tagName;return("Motion =
"+id);};proto.patterns.points=3D/^points$/i;proto.setAttribute=3Dfunction=
(attr,val,unit){if(this.patterns.points.test(attr)){unit=3Dunit||'px';sup=
erclass.setAttribute.call(this,'left',val[0],unit);superclass.setAttribut=
e.call(this,'top',val[1],unit);}else{superclass.setAttribute.call(this,at=
tr,val,unit);}};proto.getAttribute=3Dfunction(attr){if(this.patterns.poin=
ts.test(attr)){var =
val=3D[superclass.getAttribute.call(this,'left'),superclass.getAttribute.=
call(this,'top')];}else{val=3Dsuperclass.getAttribute.call(this,attr);}=0A=
return val;};proto.doMethod=3Dfunction(attr,start,end){var =
val=3Dnull;if(this.patterns.points.test(attr)){var =
t=3Dthis.method(this.currentFrame,0,100,this.totalFrames)/100;val=3DY.Bez=
ier.getPosition(this.runtimeAttributes[attr],t);}else{val=3Dsuperclass.do=
Method.call(this,attr,start,end);}=0A=
return =
val;};proto.setRuntimeAttribute=3Dfunction(attr){if(this.patterns.points.=
test(attr)){var el=3Dthis.getEl();var attributes=3Dthis.attributes;var =
start;var control=3Dattributes['points']['control']||[];var end;var =
i,len;if(control.length>0&&!(control[0]instanceof =
Array)){control=3D[control];}else{var =
tmp=3D[];for(i=3D0,len=3Dcontrol.length;i<len;++i){tmp[i]=3Dcontrol[i];}=0A=
control=3Dtmp;}=0A=
if(Y.Dom.getStyle(el,'position')=3D=3D'static'){Y.Dom.setStyle(el,'positi=
on','relative');}=0A=
if(isset(attributes['points']['from'])){Y.Dom.setXY(el,attributes['points=
']['from']);}=0A=
else{Y.Dom.setXY(el,Y.Dom.getXY(el));}=0A=
start=3Dthis.getAttribute('points');if(isset(attributes['points']['to']))=
{end=3DtranslateValues.call(this,attributes['points']['to'],start);var =
pageXY=3DY.Dom.getXY(this.getEl());for(i=3D0,len=3Dcontrol.length;i<len;+=
+i){control[i]=3DtranslateValues.call(this,control[i],start);}}else =
if(isset(attributes['points']['by'])){end=3D[start[0]+attributes['points'=
]['by'][0],start[1]+attributes['points']['by'][1]];for(i=3D0,len=3Dcontro=
l.length;i<len;++i){control[i]=3D[start[0]+control[i][0],start[1]+control=
[i][1]];}}=0A=
this.runtimeAttributes[attr]=3D[start];if(control.length>0){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;i<len;++i){if(targets[i].id=3D=3DoTargetDD.id)=
{return true;}}=0A=
return =
false;},isTypeOfDD:function(oDD){return(oDD&&oDD.__ygDragDrop);},isHandle=
:function(sDDId,sHandleId){return(this.handleIds[sDDId]&&this.handleIds[s=
DDId][sHandleId]);},getDDById:function(id){for(var i in =
this.ids){if(this.ids[i][id]){return this.ids[i][id];}}=0A=
return =
null;},handleMouseDown:function(e,oDD){this.currentTarget=3DYAHOO.util.Ev=
ent.getTarget(e);this.dragCurrent=3DoDD;var =
el=3DoDD.getEl();this.startX=3DYAHOO.util.Event.getPageX(e);this.startY=3D=
YAHOO.util.Event.getPageY(e);this.deltaX=3Dthis.startX-el.offsetLeft;this=
.deltaY=3Dthis.startY-el.offsetTop;this.dragThreshMet=3Dfalse;this.clickT=
imeout=3DsetTimeout(function(){var =
DDM=3DYAHOO.util.DDM;DDM.startDrag(DDM.startX,DDM.startY);},this.clickTim=
eThresh);},startDrag:function(x,y){clearTimeout(this.clickTimeout);if(thi=
s.dragCurrent){this.dragCurrent.b4StartDrag(x,y);this.dragCurrent.startDr=
ag(x,y);}=0A=
this.dragThreshMet=3Dtrue;},handleMouseUp:function(e){if(!this.dragCurren=
t){return;}=0A=
clearTimeout(this.clickTimeout);if(this.dragThreshMet){this.fireEvents(e,=
true);}else{}=0A=
this.stopDrag(e);this.stopEvent(e);},stopEvent:function(e){if(this.stopPr=
opagation){YAHOO.util.Event.stopPropagation(e);}=0A=
if(this.preventDefault){YAHOO.util.Event.preventDefault(e);}},stopDrag:fu=
nction(e){if(this.dragCurrent){if(this.dragThreshMet){this.dragCurrent.b4=
EndDrag(e);this.dragCurrent.endDrag(e);}=0A=
this.dragCurrent.onMouseUp(e);}=0A=
this.dragCurrent=3Dnull;this.dragOvers=3D{};},handleMouseMove:function(e)=
{if(!this.dragCurrent){return true;}=0A=
if(YAHOO.util.Event.isIE&&!e.button){this.stopEvent(e);return =
this.handleMouseUp(e);}=0A=
if(!this.dragThreshMet){var =
diffX=3DMath.abs(this.startX-YAHOO.util.Event.getPageX(e));var =
diffY=3DMath.abs(this.startY-YAHOO.util.Event.getPageY(e));if(diffX>this.=
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;i<len;++i){dc.b4DragOut(e,outEvts[=
i].id);dc.onDragOut(e,outEvts[i].id);}=0A=
for(i=3D0,len=3DenterEvts.length;i<len;++i){dc.onDragEnter(e,enterEvts[i]=
.id);}=0A=
for(i=3D0,len=3DoverEvts.length;i<len;++i){dc.b4DragOver(e,overEvts[i].id=
);dc.onDragOver(e,overEvts[i].id);}=0A=
for(i=3D0,len=3DdropEvts.length;i<len;++i){dc.b4DragDrop(e,dropEvts[i].id=
);dc.onDragDrop(e,dropEvts[i].id);}}=0A=
if(isDrop&&!dropEvts.length){dc.onInvalidDrop(e);}},getBestMatch:function=
(dds){var winner=3Dnull;var =
len=3Ddds.length;if(len=3D=3D1){winner=3Ddds[0];}else{for(var =
i=3D0;i<len;++i){var =
dd=3Ddds[i];if(this.mode=3D=3Dthis.INTERSECT&&dd.cursorIsOver){winner=3Dd=
d;break;}else{if(!winner||!winner.overlap||(dd.overlap&&winner.overlap.ge=
tArea()<dd.overlap.getArea())){winner=3Ddd;}}}}=0A=
return winner;},refreshCache:function(groups){var =
g=3Dgroups||this.ids;for(var sGroup in g){if("string"!=3Dtypeof =
sGroup){continue;}=0A=
for(var i in this.ids[sGroup]){var =
oDD=3Dthis.ids[sGroup][i];if(this.isTypeOfDD(oDD)){var =
loc=3Dthis.getLocation(oDD);if(loc){this.locationCache[oDD.id]=3Dloc;}els=
e{delete =
this.locationCache[oDD.id];}}}}},verifyEl:function(el){try{if(el){var =
parent=3Del.offsetParent;if(parent){return true;}}}catch(e){}=0A=
return =
false;},getLocation:function(oDD){if(!this.isTypeOfDD(oDD)){return null;}=0A=
var =
el=3DoDD.getEl(),pos,x1,x2,y1,y2,t,r,b,l;try{pos=3DYAHOO.util.Dom.getXY(e=
l);}catch(e){}=0A=
if(!pos){return null;}=0A=
x1=3Dpos[0];x2=3Dx1+el.offsetWidth;y1=3Dpos[1];y2=3Dy1+el.offsetHeight;t=3D=
y1-oDD.padding[0];r=3Dx2+oDD.padding[1];b=3Dy2+oDD.padding[2];l=3Dx1-oDD.=
padding[3];return new =
YAHOO.util.Region(t,r,b,l);},isOverTarget:function(pt,oTarget,intersect){=
var =
loc=3Dthis.locationCache[oTarget.id];if(!loc||!this.useCache){loc=3Dthis.=
getLocation(oTarget);this.locationCache[oTarget.id]=3Dloc;}=0A=
if(!loc){return false;}=0A=
oTarget.cursorIsOver=3Dloc.contains(pt);var =
dc=3Dthis.dragCurrent;if(!dc||!dc.getTargetCoord||(!intersect&&!dc.constr=
ainX&&!dc.constrainY)){return oTarget.cursorIsOver;}=0A=
oTarget.overlap=3Dnull;var pos=3Ddc.getTargetCoord(pt.x,pt.y);var =
el=3Ddc.getDragEl();var curRegion=3Dnew =
YAHOO.util.Region(pos.y,pos.x+el.offsetWidth,pos.y+el.offsetHeight,pos.x)=
;var =
overlap=3DcurRegion.intersect(loc);if(overlap){oTarget.overlap=3Doverlap;=
return(intersect)?true:oTarget.cursorIsOver;}else{return =
false;}},_onUnload:function(e,me){this.unregAll();},unregAll:function(){i=
f(this.dragCurrent){this.stopDrag();this.dragCurrent=3Dnull;}=0A=
this._execOnAll("unreg",[]);for(i in this.elementCache){delete =
this.elementCache[i];}=0A=
this.elementCache=3D{};this.ids=3D{};},elementCache:{},getElWrapper:funct=
ion(id){var =
oWrapper=3Dthis.elementCache[id];if(!oWrapper||!oWrapper.el){oWrapper=3Dt=
his.elementCache[id]=3Dnew this.ElementWrapper(YAHOO.util.Dom.get(id));}=0A=
return oWrapper;},getElement:function(id){return =
YAHOO.util.Dom.get(id);},getCss:function(id){var =
el=3DYAHOO.util.Dom.get(id);return(el)?el.style:null;},ElementWrapper:fun=
ction(el){this.el=3Del||null;this.id=3Dthis.el&&el.id;this.css=3Dthis.el&=
&el.style;},getPosX:function(el){return =
YAHOO.util.Dom.getX(el);},getPosY:function(el){return =
YAHOO.util.Dom.getY(el);},swapNode:function(n1,n2){if(n1.swapNode){n1.swa=
pNode(n2);}else{var p=3Dn2.parentNode;var =
s=3Dn2.nextSibling;if(s=3D=3Dn1){p.insertBefore(n1,n2);}else =
if(n2=3D=3Dn1.nextSibling){p.insertBefore(n2,n1);}else{n1.parentNode.repl=
aceChild(n2,n1);p.insertBefore(n1,s);}}},getScroll:function(){var =
t,l,dde=3Ddocument.documentElement,db=3Ddocument.body;if(dde&&(dde.scroll=
Top||dde.scrollLeft)){t=3Ddde.scrollTop;l=3Ddde.scrollLeft;}else =
if(db){t=3Ddb.scrollTop;l=3Ddb.scrollLeft;}else{}=0A=
return{top:t,left:l};},getStyle:function(el,styleProp){return =
YAHOO.util.Dom.getStyle(el,styleProp);},getScrollTop:function(){return =
this.getScroll().top;},getScrollLeft:function(){return =
this.getScroll().left;},moveToEl:function(moveEl,targetEl){var =
aCoord=3DYAHOO.util.Dom.getXY(targetEl);YAHOO.util.Dom.setXY(moveEl,aCoor=
d);},getClientHeight:function(){return =
YAHOO.util.Dom.getViewportHeight();},getClientWidth:function(){return =
YAHOO.util.Dom.getViewportWidth();},numericSort:function(a,b){return(a-b)=
;},_timeoutCount:0,_addListeners:function(){var =
DDM=3DYAHOO.util.DDM;if(YAHOO.util.Event&&document){DDM._onLoad();}else{i=
f(DDM._timeoutCount>2000){}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<len;++i){if(this.invalidHa=
ndleClasses[i]=3D=3DcssClass){delete =
this.invalidHandleClasses[i];}}},isValidHandleChild:function(node){var =
valid=3Dtrue;var =
nodeName;try{nodeName=3Dnode.nodeName.toUpperCase();}catch(e){nodeName=3D=
node.nodeName;}=0A=
valid=3Dvalid&&!this.invalidHandleTypes[nodeName];valid=3Dvalid&&!this.in=
validHandleIds[node.id];for(var =
i=3D0,len=3Dthis.invalidHandleClasses.length;valid&&i<len;++i){valid=3D!D=
om.hasClass(node,this.invalidHandleClasses[i]);}=0A=
return =
valid;},setXTicks:function(iStartX,iTickSize){this.xTicks=3D[];this.xTick=
Size=3DiTickSize;var tickMap=3D{};for(var =
i=3Dthis.initPageX;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<len;++i){var =
next=3Di+1;if(tickArray[next]&&tickArray[next]>=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&&toBot<thresh){window.scroll=
To(sl,st+scrAmt);}=0A=
if(y<st&&st>0&&y-st<thresh){window.scrollTo(sl,st-scrAmt);}=0A=
if(right>clientW&&toRight<thresh){window.scrollTo(sl+scrAmt,st);}=0A=
if(x<sl&&sl>0&&x-sl<thresh){window.scrollTo(sl-scrAmt,st);}}},getTargetCo=
ord:function(iPageX,iPageY){var x=3DiPageX-this.deltaX;var =
y=3DiPageY-this.deltaY;if(this.constrainX){if(x<this.minX){x=3Dthis.minX;=
}=0A=
if(x>this.maxX){x=3Dthis.maxX;}}=0A=
if(this.constrainY){if(y<this.minY){y=3Dthis.minY;}=0A=
if(y>this.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;i<len;++i){if(configs[key[i]]&&!Lang.isUndefined(c=
onfigs[key[i]].value)&&!Lang.isNull(configs[key[i]].value)){configs[key[i=
]].refresh(silent);}}},register:function(key,map){this.setAttributeConfig=
(key,map);},getAttributeConfig:function(key){var =
configs=3Dthis._configs||{};var config=3Dconfigs[key]||{};var =
map=3D{};for(key in =
config){if(Lang.hasOwnProperty(config,key)){map[key]=3Dconfig[key];}}=0A=
return map;},setAttributeConfig:function(key,map,init){var =
configs=3Dthis._configs||{};map=3Dmap||{};if(!configs[key]){map.name=3Dke=
y;configs[key]=3Dnew =
YAHOO.util.Attribute(map,this);}else{configs[key].configure(map,init);}},=
configureAttribute:function(key,map,init){this.setAttributeConfig(key,map=
,init);},resetAttributeConfig:function(key){var =
configs=3Dthis._configs||{};configs[key].resetConfig();},fireBeforeChange=
Event:function(e){var =
type=3D'before';type+=3De.type.charAt(0).toUpperCase()+e.type.substr(1)+'=
Change';e.type=3Dtype;return =
this.fireEvent(e.type,e);},fireChangeEvent:function(e){e.type+=3D'Change'=
;return =
this.fireEvent(e.type,e);}};YAHOO.augment(YAHOO.util.AttributeProvider,YA=
HOO.util.EventProvider);})();(function(){var =
Dom=3DYAHOO.util.Dom,EventPublisher=3DYAHOO.util.EventPublisher,Attribute=
Provider=3DYAHOO.util.AttributeProvider;YAHOO.util.Element=3Dfunction(el,=
map){if(arguments.length){this.init(el,map);}};YAHOO.util.Element.prototy=
pe=3D{DOM_EVENTS:null,appendChild:function(child){child=3Dchild.get?child=
.get('element'):child;this.get('element').appendChild(child);},getElement=
sByTagName:function(tag){return =
this.get('element').getElementsByTagName(tag);},hasChildNodes:function(){=
return =
this.get('element').hasChildNodes();},insertBefore:function(element,befor=
e){element=3Delement.get?element.get('element'):element;before=3D(before&=
&before.get)?before.get('element'):before;this.get('element').insertBefor=
e(element,before);},removeChild:function(child){child=3Dchild.get?child.g=
et('element'):child;this.get('element').removeChild(child);return =
true;},replaceChild:function(newNode,oldNode){newNode=3DnewNode.get?newNo=
de.get('element'):newNode;oldNode=3DoldNode.get?oldNode.get('element'):ol=
dNode;return =
this.get('element').replaceChild(newNode,oldNode);},initAttributes:functi=
on(map){map=3Dmap||{};var =
element=3DDom.get(map.element)||null;this.setAttributeConfig('element',{v=
alue:element,readOnly:true});},addListener:function(type,fn,obj,scope){va=
r el=3Dthis.get('element');var =
scope=3Dscope||this;el=3Dthis.get('id')||el;if(!this._events[type]){if(th=
is.DOM_EVENTS[type]){YAHOO.util.Event.addListener(el,type,function(e){if(=
e.srcElement&&!e.target){e.target=3De.srcElement;}=0A=
this.fireEvent(type,e);},obj,scope);}=0A=
this.createEvent(type,this);this._events[type]=3Dtrue;}=0A=
this.subscribe.apply(this,arguments);},on:function(){this.addListener.app=
ly(this,arguments);},removeListener:function(type,fn){this.unsubscribe.ap=
ply(this,arguments);},addClass:function(className){Dom.addClass(this.get(=
'element'),className);},getElementsByClassName:function(className,tag){re=
turn =
Dom.getElementsByClassName(className,tag,this.get('element'));},hasClass:=
function(className){return =
Dom.hasClass(this.get('element'),className);},removeClass:function(classN=
ame){return =
Dom.removeClass(this.get('element'),className);},replaceClass:function(ol=
dClassName,newClassName){return =
Dom.replaceClass(this.get('element'),oldClassName,newClassName);},setStyl=
e:function(property,value){var =
el=3Dthis.get('element');if(!el){this._queue[this._queue.length]=3D['setS=
tyle',arguments];return false;}=0A=
return =
Dom.setStyle(this.get('element'),property,value);},getStyle:function(prop=
erty){return =
Dom.getStyle(this.get('element'),property);},fireQueue:function(){var =
queue=3Dthis._queue;for(var =
i=3D0,len=3Dqueue.length;i<len;++i){this[queue[i][0]].apply(this,queue[i]=
[1]);}},appendTo:function(parent,before){parent=3D(parent.get)?parent.get=
('element'):Dom.get(parent);this.fireEvent('beforeAppendTo',{type:'before=
AppendTo',target:parent});before=3D(before&&before.get)?before.get('eleme=
nt'):Dom.get(before);var =
element=3Dthis.get('element');if(!element){return false;}=0A=
if(!parent){return false;}=0A=
if(element.parent!=3Dparent){if(before){parent.insertBefore(element,befor=
e);}else{parent.appendChild(element);}}=0A=
this.fireEvent('appendTo',{type:'appendTo',target:parent});},get:function=
(key){var configs=3Dthis._configs||{};var =
el=3Dconfigs.element;if(el&&!configs[key]&&!YAHOO.lang.isUndefined(el.val=
ue[key])){return el.value[key];}=0A=
return =
AttributeProvider.prototype.get.call(this,key);},set:function(key,value,s=
ilent){var =
el=3Dthis.get('element');if(!el){this._queue[this._queue.length]=3D['set'=
,arguments];if(this._configs[key]){this._configs[key].value=3Dvalue;}=0A=
return;}=0A=
if(!this._configs[key]&&!YAHOO.lang.isUndefined(el[key])){_registerHTMLAt=
tr.call(this,key);}=0A=
return =
AttributeProvider.prototype.set.apply(this,arguments);},setAttributeConfi=
g:function(key,map,init){var =
el=3Dthis.get('element');if(el&&!this._configs[key]&&!YAHOO.lang.isUndefi=
ned(el[key])){_registerHTMLAttr.call(this,key,map);}else{AttributeProvide=
r.prototype.setAttributeConfig.apply(this,arguments);}},getAttributeKeys:=
function(){var el=3Dthis.get('element');var =
keys=3DAttributeProvider.prototype.getAttributeKeys.call(this);for(var =
key in el){if(!this._configs[key]){keys[key]=3Dkeys[key]||el[key];}}=0A=
return =
keys;},init:function(el,attr){this._queue=3Dthis._queue||[];this._events=3D=
this._events||{};this._configs=3Dthis._configs||{};attr=3Dattr||{};attr.e=
lement=3Dattr.element||el||null;this.DOM_EVENTS=3D{'click':true,'keydown'=
:true,'keypress':true,'keyup':true,'mousedown':true,'mousemove':true,'mou=
seout':true,'mouseover':true,'mouseup':true};var =
readyHandler=3Dfunction(){this.initAttributes(attr);this.setAttributes(at=
tr,true);this.fireQueue();this.fireEvent('contentReady',{type:'contentRea=
dy',target:attr.element});};if(YAHOO.lang.isString(el)){_registerHTMLAttr=
.call(this,'id',{value:el});YAHOO.util.Event.onAvailable(el,function(){at=
tr.element=3DDom.get(el);this.fireEvent('available',{type:'available',tar=
get:attr.element});},this,true);YAHOO.util.Event.onContentReady(el,functi=
on(){readyHandler.call(this);},this,true);}else{readyHandler.call(this);}=
}};var _registerHTMLAttr=3Dfunction(key,map){var =
el=3Dthis.get('element');map=3Dmap||{};map.name=3Dkey;map.method=3Dmap.me=
thod||function(value){el[key]=3Dvalue;};map.value=3Dmap.value||el[key];th=
is._configs[key]=3Dnew =
YAHOO.util.Attribute(map,this);};YAHOO.augment(YAHOO.util.Element,Attribu=
teProvider);})();YAHOO.register("element",YAHOO.util.Element,{version:"2.=
2.0",build:"127"});
------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/yui/build/container/container_core.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=
* Config is a utility used within an Object to allow the implementer to =
maintain a list of local configuration properties and listen for changes =
to those properties dynamically using CustomEvent. The initial values =
are also maintained so that the configuration can be reset at any given =
point to its initial state.=0A=
* @namespace YAHOO.util=0A=
* @class Config=0A=
* @constructor=0A=
* @param {Object}	owner	The owner Object to which this Config Object =
belongs=0A=
*/=0A=
YAHOO.util.Config =3D function(owner) {=0A=
	if (owner) {=0A=
		this.init(owner);=0A=
	}=0A=
};=0A=
=0A=
YAHOO.util.Config.prototype =3D {=0A=
	=0A=
	/**=0A=
	* Object reference to the owner of this Config Object=0A=
	* @property owner=0A=
	* @type Object=0A=
	*/=0A=
	owner : null,=0A=
=0A=
	/**=0A=
	* Boolean flag that specifies whether a queue is currently being =
executed=0A=
	* @property queueInProgress=0A=
	* @type Boolean=0A=
	*/=0A=
	queueInProgress : false,=0A=
=0A=
=0A=
	/**=0A=
	* Validates that the value passed in is a Boolean.=0A=
	* @method checkBoolean=0A=
	* @param	{Object}	val	The value to validate=0A=
	* @return	{Boolean}	true, if the value is valid=0A=
	*/	=0A=
	checkBoolean: function(val) {=0A=
		if (typeof val =3D=3D 'boolean') {=0A=
			return true;=0A=
		} else {=0A=
			return false;=0A=
		}=0A=
	},=0A=
=0A=
	/**=0A=
	* Validates that the value passed in is a number.=0A=
	* @method checkNumber=0A=
	* @param	{Object}	val	The value to validate=0A=
	* @return	{Boolean}	true, if the value is valid=0A=
	*/=0A=
	checkNumber: function(val) {=0A=
		if (isNaN(val)) {=0A=
			return false;=0A=
		} else {=0A=
			return true;=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
=0A=
/**=0A=
* Initializes the configuration Object and all of its local members.=0A=
* @method init=0A=
* @param {Object}	owner	The owner Object to which this Config Object =
belongs=0A=
*/=0A=
YAHOO.util.Config.prototype.init =3D function(owner) {=0A=
=0A=
	this.owner =3D owner;=0A=
=0A=
	/**=0A=
	* Object reference to the owner of this Config Object=0A=
	* @event configChangedEvent=0A=
	*/=0A=
	this.configChangedEvent =3D new YAHOO.util.CustomEvent("configChanged");=0A=
	this.queueInProgress =3D false;=0A=
=0A=
	/* Private Members */=0A=
=0A=
	/**=0A=
	* Maintains the local collection of configuration property objects and =
their specified values=0A=
	* @property config=0A=
	* @private=0A=
	* @type Object=0A=
	*/ =0A=
	var config =3D {};=0A=
=0A=
	/**=0A=
	* Maintains the local collection of configuration property objects as =
they were initially applied.=0A=
	* This object is used when resetting a property.=0A=
	* @property initialConfig=0A=
	* @private=0A=
	* @type Object=0A=
	*/ =0A=
	var initialConfig =3D {};=0A=
=0A=
	/**=0A=
	* Maintains the local, normalized CustomEvent queue=0A=
	* @property eventQueue=0A=
	* @private=0A=
	* @type Object=0A=
	*/ =0A=
	var eventQueue =3D [];=0A=
=0A=
	/**=0A=
	* Fires a configuration property event using the specified value. =0A=
	* @method fireEvent=0A=
	* @private=0A=
	* @param {String}	key			The configuration property's name=0A=
	* @param {value}	Object		The value of the correct type for the property=0A=
	*/ =0A=
	var fireEvent =3D function( key, value ) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			property.event.fire(value);=0A=
		}	=0A=
	};=0A=
	/* End Private Members */=0A=
=0A=
	/**=0A=
	* Adds a property to the Config Object's private config hash.=0A=
	* @method addProperty=0A=
	* @param {String}	key	The configuration property's name=0A=
	* @param {Object}	propertyObject	The Object containing all of this =
property's arguments=0A=
	*/=0A=
	this.addProperty =3D function( key, propertyObject ) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		config[key] =3D propertyObject;=0A=
=0A=
		propertyObject.event =3D new YAHOO.util.CustomEvent(key);=0A=
		propertyObject.key =3D key;=0A=
=0A=
		if (propertyObject.handler) {=0A=
			propertyObject.event.subscribe(propertyObject.handler, this.owner, =
true);=0A=
		}=0A=
=0A=
		this.setProperty(key, propertyObject.value, true);=0A=
		=0A=
		if (! propertyObject.suppressEvent) {=0A=
			this.queueProperty(key, propertyObject.value);=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Returns a key-value configuration map of the values currently set in =
the Config Object.=0A=
	* @method getConfig=0A=
	* @return {Object} The current config, represented in a key-value map=0A=
	*/=0A=
	this.getConfig =3D function() {=0A=
		var cfg =3D {};=0A=
			=0A=
		for (var prop in config) {=0A=
			var property =3D config[prop];=0A=
			if (typeof property !=3D 'undefined' && property.event) {=0A=
				cfg[prop] =3D property.value;=0A=
			}=0A=
		}=0A=
		=0A=
		return cfg;=0A=
	};=0A=
=0A=
	/**=0A=
	* Returns the value of specified property.=0A=
	* @method getProperty=0A=
	* @param {String} key	The name of the property=0A=
	* @return {Object}		The value of the specified property=0A=
	*/=0A=
	this.getProperty =3D function(key) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			return property.value;=0A=
		} else {=0A=
			return undefined;=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Resets the specified property's value to its initial value.=0A=
	* @method resetProperty=0A=
	* @param {String} key	The name of the property=0A=
	* @return {Boolean} True is the property was reset, false if not=0A=
	*/=0A=
	this.resetProperty =3D function(key) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			if (initialConfig[key] && initialConfig[key] !=3D 'undefined')	{=0A=
				this.setProperty(key, initialConfig[key]);=0A=
			}=0A=
			return true;=0A=
		} else {=0A=
			return false;=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Sets the value of a property. If the silent property is passed as =
true, the property's event will not be fired.=0A=
	* @method setProperty=0A=
	* @param {String} key		The name of the property=0A=
	* @param {String} value		The value to set the property to=0A=
	* @param {Boolean} silent	Whether the value should be set silently, =
without firing the property event.=0A=
	* @return {Boolean}			True, if the set was successful, false if it =
failed.=0A=
	*/=0A=
	this.setProperty =3D function(key, value, silent) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		if (this.queueInProgress && ! silent) {=0A=
			this.queueProperty(key,value); // Currently running through a =
queue... =0A=
			return true;=0A=
		} else {=0A=
			var property =3D config[key];=0A=
			if (typeof property !=3D 'undefined' && property.event) {=0A=
				if (property.validator && ! property.validator(value)) { // validator=0A=
					return false;=0A=
				} else {=0A=
					property.value =3D value;=0A=
					if (! silent) {=0A=
						fireEvent(key, value);=0A=
						this.configChangedEvent.fire([key, value]);=0A=
					}=0A=
					return true;=0A=
				}=0A=
			} else {=0A=
				return false;=0A=
			}=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Sets the value of a property and queues its event to execute. If the =
event is already scheduled to execute, it is=0A=
	* moved from its current position to the end of the queue.=0A=
	* @method queueProperty=0A=
	* @param {String} key	The name of the property=0A=
	* @param {String} value	The value to set the property to=0A=
	* @return {Boolean}		true, if the set was successful, false if it =
failed.=0A=
	*/	=0A=
	this.queueProperty =3D function(key, value) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
							=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			if (typeof value !=3D 'undefined' && property.validator && ! =
property.validator(value)) { // validator=0A=
				return false;=0A=
			} else {=0A=
=0A=
				if (typeof value !=3D 'undefined') {=0A=
					property.value =3D value;=0A=
				} else {=0A=
					value =3D property.value;=0A=
				}=0A=
=0A=
				var foundDuplicate =3D false;=0A=
=0A=
				for (var i=3D0;i<eventQueue.length;i++) {=0A=
					var queueItem =3D eventQueue[i];=0A=
=0A=
					if (queueItem) {=0A=
						var queueItemKey =3D queueItem[0];=0A=
						var queueItemValue =3D queueItem[1];=0A=
						=0A=
						if (queueItemKey.toLowerCase() =3D=3D key) {=0A=
							// found a dupe... push to end of queue, null current item, and =
break=0A=
							eventQueue[i] =3D null;=0A=
							eventQueue.push([key, (typeof value !=3D 'undefined' ? value : =
queueItemValue)]);=0A=
							foundDuplicate =3D true;=0A=
							break;=0A=
						}=0A=
					}=0A=
				}=0A=
				=0A=
				if (! foundDuplicate && typeof value !=3D 'undefined') { // this is =
a refire, or a new property in the queue=0A=
					eventQueue.push([key, value]);=0A=
				}=0A=
			}=0A=
=0A=
			if (property.supercedes) {=0A=
				for (var s=3D0;s<property.supercedes.length;s++) {=0A=
					var supercedesCheck =3D property.supercedes[s];=0A=
=0A=
					for (var q=3D0;q<eventQueue.length;q++) {=0A=
						var queueItemCheck =3D eventQueue[q];=0A=
=0A=
						if (queueItemCheck) {=0A=
							var queueItemCheckKey =3D queueItemCheck[0];=0A=
							var queueItemCheckValue =3D queueItemCheck[1];=0A=
							=0A=
							if ( queueItemCheckKey.toLowerCase() =3D=3D =
supercedesCheck.toLowerCase() ) {=0A=
								eventQueue.push([queueItemCheckKey, queueItemCheckValue]);=0A=
								eventQueue[q] =3D null;=0A=
								break;=0A=
							}=0A=
						}=0A=
					}=0A=
				}=0A=
			}=0A=
=0A=
			return true;=0A=
		} else {=0A=
			return false;=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Fires the event for a property using the property's current value.=0A=
	* @method refireEvent=0A=
	* @param {String} key	The name of the property=0A=
	*/=0A=
	this.refireEvent =3D function(key) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
		if (typeof property !=3D 'undefined' && property.event && typeof =
property.value !=3D 'undefined') {=0A=
			if (this.queueInProgress) {=0A=
				this.queueProperty(key);=0A=
			} else {=0A=
				fireEvent(key, property.value);=0A=
			}=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Applies a key-value Object literal to the configuration, replacing =
any existing values, and queueing the property events.=0A=
	* Although the values will be set, fireQueue() must be called for their =
associated events to execute.=0A=
	* @method applyConfig=0A=
	* @param {Object}	userConfig	The configuration Object literal=0A=
	* @param {Boolean}	init		When set to true, the initialConfig will be =
set to the userConfig passed in, so that calling a reset will reset the =
properties to the passed values.=0A=
	*/=0A=
	this.applyConfig =3D function(userConfig, init) {=0A=
		if (init) {=0A=
			initialConfig =3D userConfig;=0A=
		}=0A=
		for (var prop in userConfig) {=0A=
			this.queueProperty(prop, userConfig[prop]);=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Refires the events for all configuration properties using their =
current values.=0A=
	* @method refresh=0A=
	*/=0A=
	this.refresh =3D function() {=0A=
		for (var prop in config) {=0A=
			this.refireEvent(prop);=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Fires the normalized list of queued property change events=0A=
	* @method fireQueue=0A=
	*/=0A=
	this.fireQueue =3D function() {=0A=
		this.queueInProgress =3D true;=0A=
		for (var i=3D0;i<eventQueue.length;i++) {=0A=
			var queueItem =3D eventQueue[i];=0A=
			if (queueItem) {=0A=
				var key =3D queueItem[0];=0A=
				var value =3D queueItem[1];=0A=
				=0A=
				var property =3D config[key];=0A=
				property.value =3D value;=0A=
=0A=
				fireEvent(key,value);=0A=
			}=0A=
		}=0A=
		=0A=
		this.queueInProgress =3D false;=0A=
		eventQueue =3D [];=0A=
	};=0A=
=0A=
	/**=0A=
	* Subscribes an external handler to the change event for any given =
property. =0A=
	* @method subscribeToConfigEvent=0A=
	* @param {String}	key			The property name=0A=
	* @param {Function}	handler		The handler function to use subscribe to =
the property's event=0A=
	* @param {Object}	obj			The Object to use for scoping the event handler =
(see CustomEvent documentation)=0A=
	* @param {Boolean}	override	Optional. If true, will override "this" =
within the handler to map to the scope Object passed into the method.=0A=
	* @return {Boolean}				True, if the subscription was successful, =
otherwise false.=0A=
	*/	=0A=
	this.subscribeToConfigEvent =3D function(key, handler, obj, override) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			if (! YAHOO.util.Config.alreadySubscribed(property.event, handler, =
obj)) {=0A=
				property.event.subscribe(handler, obj, override);=0A=
			}=0A=
			return true;=0A=
		} else {=0A=
			return false;=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Unsubscribes an external handler from the change event for any given =
property. =0A=
	* @method unsubscribeFromConfigEvent=0A=
	* @param {String}	key			The property name=0A=
	* @param {Function}	handler		The handler function to use subscribe to =
the property's event=0A=
	* @param {Object}	obj			The Object to use for scoping the event handler =
(see CustomEvent documentation)=0A=
	* @return {Boolean}				True, if the unsubscription was successful, =
otherwise false.=0A=
	*/=0A=
	this.unsubscribeFromConfigEvent =3D function(key, handler, obj) {=0A=
		key =3D key.toLowerCase();=0A=
=0A=
		var property =3D config[key];=0A=
		if (typeof property !=3D 'undefined' && property.event) {=0A=
			return property.event.unsubscribe(handler, obj);=0A=
		} else {=0A=
			return false;=0A=
		}=0A=
	};=0A=
=0A=
	/**=0A=
	* Returns a string representation of the Config object=0A=
	* @method toString=0A=
	* @return {String}	The Config object in string format.=0A=
	*/=0A=
	this.toString =3D function() {=0A=
		var output =3D "Config";=0A=
		if (this.owner) {=0A=
			output +=3D " [" + this.owner.toString() + "]";=0A=
		}=0A=
		return output;=0A=
	};=0A=
=0A=
	/**=0A=
	* Returns a string representation of the Config object's current =
CustomEvent queue=0A=
	* @method outputEventQueue=0A=
	* @return {String}	The string list of CustomEvents currently queued for =
execution=0A=
	*/=0A=
	this.outputEventQueue =3D function() {=0A=
		var output =3D "";=0A=
		for (var q=3D0;q<eventQueue.length;q++) {=0A=
			var queueItem =3D eventQueue[q];=0A=
			if (queueItem) {=0A=
				output +=3D queueItem[0] + "=3D" + queueItem[1] + ", ";=0A=
			}=0A=
		}=0A=
		return output;=0A=
	};=0A=
};=0A=
=0A=
/**=0A=
* Checks to determine if a particular function/Object pair are already =
subscribed to the specified CustomEvent=0A=
* @method YAHOO.util.Config.alreadySubscribed=0A=
* @static=0A=
* @param {YAHOO.util.CustomEvent} evt	The CustomEvent for which to check =
the subscriptions=0A=
* @param {Function}	fn	The function to look for in the subscribers list=0A=
* @param {Object}	obj	The execution scope Object for the subscription=0A=
* @return {Boolean}	true, if the function/Object pair is already =
subscribed to the CustomEvent passed in=0A=
*/=0A=
YAHOO.util.Config.alreadySubscribed =3D function(evt, fn, obj) {=0A=
	for (var e=3D0;e<evt.subscribers.length;e++) {=0A=
		var subsc =3D evt.subscribers[e];=0A=
		if (subsc && subsc.obj =3D=3D obj && subsc.fn =3D=3D fn) {=0A=
			return true;=0A=
		}=0A=
	}=0A=
	return false;=0A=
};=0A=
=0A=
/**=0A=
*  The Container family of components is designed to enable developers =
to create different kinds of content-containing modules on the web. =
Module and Overlay are the most basic containers, and they can be used =
directly or extended to build custom containers. Also part of the =
Container family are four UI controls that extend Module and Overlay: =
Tooltip, Panel, Dialog, and SimpleDialog.=0A=
* @module container=0A=
* @title Container=0A=
* @requires yahoo,dom,event,dragdrop,animation=0A=
*/=0A=
=0A=
/**=0A=
* Module is a JavaScript representation of the Standard Module Format. =
Standard Module Format is a simple standard for markup containers where =
child nodes representing the header, body, and footer of the content are =
denoted using the CSS classes "hd", "bd", and "ft" respectively. Module =
is the base class for all other classes in the YUI Container package.=0A=
* @namespace YAHOO.widget=0A=
* @class Module=0A=
* @constructor=0A=
* @param {String} el			The element ID representing the Module <em>OR</em>=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 <em>OR</em>=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;i<childNodes.length;i++) {=0A=
				var child =3D childNodes[i];=0A=
				switch (child.className) {=0A=
					case YAHOO.widget.Module.CSS_HEADER:=0A=
						this.header =3D child;=0A=
						break;=0A=
					case YAHOO.widget.Module.CSS_BODY:=0A=
						this.body =3D child;=0A=
						break;=0A=
					case YAHOO.widget.Module.CSS_FOOTER:=0A=
						this.footer =3D child;=0A=
						break;=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		this.initDefaultConfig();=0A=
=0A=
		YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Module.CSS_MODULE);=0A=
=0A=
		if (userConfig) {=0A=
			this.cfg.applyConfig(userConfig, true);=0A=
		}=0A=
=0A=
		// Subscribe to the fireQueue() method of Config so that any queued =
configuration changes are=0A=
		// excecuted upon render of the Module=0A=
		if (! YAHOO.util.Config.alreadySubscribed(this.renderEvent, =
this.cfg.fireQueue, this.cfg)) {=0A=
			this.renderEvent.subscribe(this.cfg.fireQueue, this.cfg, true);=0A=
		}=0A=
=0A=
		this.initEvent.fire(YAHOO.widget.Module);=0A=
	},=0A=
=0A=
	/**=0A=
	* Initialized an empty IFRAME that is placed out of the visible area =
that can be used to detect text resize.=0A=
	* @method initResizeMonitor=0A=
	*/=0A=
	initResizeMonitor : function() {=0A=
=0A=
        if(this.browser !=3D "opera") {=0A=
=0A=
            var resizeMonitor =3D =
document.getElementById("_yuiResizeMonitor");=0A=
=0A=
            if (! resizeMonitor) {=0A=
=0A=
                resizeMonitor =3D document.createElement("iframe");=0A=
=0A=
                var bIE =3D (this.browser.indexOf("ie") =3D=3D=3D 0);=0A=
=0A=
                if(this.isSecure && =
YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL && bIE) {=0A=
                   resizeMonitor.src =3D =
YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL;=0A=
                }=0A=
=0A=
                resizeMonitor.id =3D "_yuiResizeMonitor";=0A=
                resizeMonitor.style.visibility =3D "hidden";=0A=
=0A=
                document.body.appendChild(resizeMonitor);=0A=
=0A=
                resizeMonitor.style.width =3D "10em";=0A=
                resizeMonitor.style.height =3D "10em";=0A=
                resizeMonitor.style.position =3D "absolute";=0A=
=0A=
                var nLeft =3D -1 * resizeMonitor.offsetWidth;=0A=
                var nTop =3D -1 * resizeMonitor.offsetHeight;=0A=
=0A=
                resizeMonitor.style.top =3D nTop + "px";=0A=
                resizeMonitor.style.left =3D nLeft + "px";=0A=
                resizeMonitor.style.borderStyle =3D "none";=0A=
                resizeMonitor.style.borderWidth =3D "0";=0A=
                YAHOO.util.Dom.setStyle(resizeMonitor, "opacity", "0");=0A=
=0A=
                resizeMonitor.style.visibility =3D "visible";=0A=
=0A=
                if(!bIE) {=0A=
=0A=
                    var doc =3D resizeMonitor.contentWindow.document;=0A=
=0A=
                    doc.open();=0A=
                    doc.close();=0A=
=0A=
                }=0A=
            }=0A=
=0A=
			var fireTextResize =3D function() {=0A=
				YAHOO.widget.Module.textResizeEvent.fire();=0A=
			};=0A=
=0A=
            if(resizeMonitor && resizeMonitor.contentWindow) {=0A=
                this.resizeMonitor =3D resizeMonitor;=0A=
=0A=
				YAHOO.widget.Module.textResizeEvent.subscribe(this.onDomResize, =
this, true);=0A=
=0A=
				if (! YAHOO.widget.Module.textResizeInitialized) {=0A=
					if (! =
YAHOO.util.Event.addListener(this.resizeMonitor.contentWindow, "resize", =
fireTextResize)) {=0A=
						// This will fail in IE if document.domain has changed, so we must =
change the listener to=0A=
						// use the resizeMonitor element instead=0A=
						YAHOO.util.Event.addListener(this.resizeMonitor, "resize", =
fireTextResize);=0A=
					}=0A=
					YAHOO.widget.Module.textResizeInitialized =3D true;=0A=
				}=0A=
            }=0A=
=0A=
        }=0A=
=0A=
	},=0A=
=0A=
	/**=0A=
	* Event handler fired when the resize monitor element is resized.=0A=
	* @method onDomResize=0A=
	* @param {DOMEvent} e	The DOM resize event=0A=
	* @param {Object} obj	The scope object passed to the handler=0A=
	*/=0A=
	onDomResize : function(e, obj) {=0A=
=0A=
        var nLeft =3D -1 * this.resizeMonitor.offsetWidth,=0A=
            nTop =3D -1 * this.resizeMonitor.offsetHeight;=0A=
=0A=
        this.resizeMonitor.style.top =3D nTop + "px";=0A=
        this.resizeMonitor.style.left =3D  nLeft + "px";=0A=
=0A=
	},=0A=
=0A=
	/**=0A=
	* Sets the Module's header content to the HTML specified, or appends =
the passed element to the header. If no header is present, one will be =
automatically created.=0A=
	* @method setHeader=0A=
	* @param {String}	headerContent	The HTML used to set the header =
<em>OR</em>=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 <em>OR</em>=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 =
<em>OR</em>=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 <em>OR</em>=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 <em>OR</em>=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 <em>OR</em>=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<effect.length;i++) {=0A=
				var eff =3D effect[i];=0A=
				effectInstances[effectInstances.length] =3D eff.effect(this, =
eff.duration);=0A=
			}=0A=
		} else {=0A=
			effectInstances[effectInstances.length] =3D effect.effect(this, =
effect.duration);=0A=
		}=0A=
	}=0A=
=0A=
	var isMacGecko =3D (this.platform =3D=3D "mac" && this.browser =3D=3D =
"gecko");=0A=
=0A=
	if (visible) { // Show=0A=
		if (isMacGecko) {=0A=
			this.showMacGeckoScrollbars();=0A=
		}=0A=
=0A=
		if (effect) { // Animate in=0A=
			if (visible) { // Animate in if not showing=0A=
				if (currentVis !=3D "visible" || currentVis =3D=3D=3D "") {=0A=
					this.beforeShowEvent.fire();=0A=
					for (var j=3D0;j<effectInstances.length;j++) {=0A=
						var ei =3D effectInstances[j];=0A=
						if (j =3D=3D=3D 0 && ! =
YAHOO.util.Config.alreadySubscribed(ei.animateInCompleteEvent,this.showEv=
ent.fire,this.showEvent)) {=0A=
							=
ei.animateInCompleteEvent.subscribe(this.showEvent.fire,this.showEvent,tr=
ue); // Delegate showEvent until end of animateInComplete=0A=
						}=0A=
						ei.animateIn();=0A=
					}=0A=
				}=0A=
			}=0A=
		} else { // Show=0A=
			if (currentVis !=3D "visible" || currentVis =3D=3D=3D "") {=0A=
				this.beforeShowEvent.fire();=0A=
				YAHOO.util.Dom.setStyle(this.element, "visibility", "visible");=0A=
				this.cfg.refireEvent("iframe");=0A=
				this.showEvent.fire();=0A=
			}=0A=
		}=0A=
=0A=
	} else { // Hide=0A=
		if (isMacGecko) {=0A=
			this.hideMacGeckoScrollbars();=0A=
		}=0A=
=0A=
		if (effect) { // Animate out if showing=0A=
			if (currentVis =3D=3D "visible") {=0A=
				this.beforeHideEvent.fire();=0A=
				for (var k=3D0;k<effectInstances.length;k++) {=0A=
					var h =3D effectInstances[k];=0A=
					if (k =3D=3D=3D 0 && ! =
YAHOO.util.Config.alreadySubscribed(h.animateOutCompleteEvent,this.hideEv=
ent.fire,this.hideEvent)) {=0A=
						=
h.animateOutCompleteEvent.subscribe(this.hideEvent.fire,this.hideEvent,tr=
ue); // Delegate hideEvent until end of animateOutComplete=0A=
					}=0A=
					h.animateOut();=0A=
				}=0A=
			} else if (currentVis =3D=3D=3D "") {=0A=
				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");=0A=
			}=0A=
		} else { // Simple hide=0A=
			if (currentVis =3D=3D "visible" || currentVis =3D=3D=3D "") {=0A=
				this.beforeHideEvent.fire();=0A=
				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");=0A=
				this.cfg.refireEvent("iframe");=0A=
				this.hideEvent.fire();=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* Center event handler used for centering on scroll/resize, but only if =
the Overlay is visible=0A=
* @method doCenterOnDOMEvent=0A=
*/=0A=
YAHOO.widget.Overlay.prototype.doCenterOnDOMEvent =3D function() {=0A=
	if (this.cfg.getProperty("visible")) {=0A=
		this.center();=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "fixedcenter" property is =
changed.=0A=
* @method configFixedCenter=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.configFixedCenter =3D function(type, =
args, obj) {=0A=
	var val =3D args[0];=0A=
=0A=
	if (val) {=0A=
		this.center();=0A=
=0A=
		if (! YAHOO.util.Config.alreadySubscribed(this.beforeShowEvent, =
this.center, this)) {=0A=
			this.beforeShowEvent.subscribe(this.center, this, true);=0A=
		}=0A=
=0A=
		if (! =
YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowResizeEven=
t, this.doCenterOnDOMEvent, this)) {=0A=
			=
YAHOO.widget.Overlay.windowResizeEvent.subscribe(this.doCenterOnDOMEvent,=
 this, true);=0A=
		}=0A=
=0A=
		if (! =
YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowScrollEven=
t, this.doCenterOnDOMEvent, this)) {=0A=
			YAHOO.widget.Overlay.windowScrollEvent.subscribe( =
this.doCenterOnDOMEvent, this, true);=0A=
		}=0A=
	} else {=0A=
		=
YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.doCenterOnDOMEven=
t, this);=0A=
		=
YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEven=
t, this);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "height" property is changed.=0A=
* @method configHeight=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.configHeight =3D function(type, args, =
obj) {=0A=
	var height =3D args[0];=0A=
	var el =3D this.element;=0A=
	YAHOO.util.Dom.setStyle(el, "height", height);=0A=
	this.cfg.refireEvent("iframe");=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "width" property is changed.=0A=
* @method configWidth=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.configWidth =3D function(type, args, obj) =
{=0A=
	var width =3D args[0];=0A=
	var el =3D this.element;=0A=
	YAHOO.util.Dom.setStyle(el, "width", width);=0A=
	this.cfg.refireEvent("iframe");=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "zIndex" property is changed.=0A=
* @method configzIndex=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.configzIndex =3D function(type, args, =
obj) {=0A=
	var zIndex =3D args[0];=0A=
=0A=
	var el =3D this.element;=0A=
=0A=
	if (! zIndex) {=0A=
		zIndex =3D YAHOO.util.Dom.getStyle(el, "zIndex");=0A=
		if (! zIndex || isNaN(zIndex)) {=0A=
			zIndex =3D 0;=0A=
		}=0A=
	}=0A=
=0A=
	if (this.iframe) {=0A=
		if (zIndex <=3D 0) {=0A=
			zIndex =3D 1;=0A=
		}=0A=
		YAHOO.util.Dom.setStyle(this.iframe, "zIndex", (zIndex-1));=0A=
	}=0A=
=0A=
	YAHOO.util.Dom.setStyle(el, "zIndex", zIndex);=0A=
	this.cfg.setProperty("zIndex", zIndex, true);=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "xy" property is changed.=0A=
* @method configXY=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.configXY =3D function(type, args, obj) {=0A=
	var pos =3D args[0];=0A=
	var x =3D pos[0];=0A=
	var y =3D pos[1];=0A=
=0A=
	this.cfg.setProperty("x", x);=0A=
	this.cfg.setProperty("y", y);=0A=
=0A=
	this.beforeMoveEvent.fire([x,y]);=0A=
=0A=
	x =3D this.cfg.getProperty("x");=0A=
	y =3D this.cfg.getProperty("y");=0A=
=0A=
=0A=
	this.cfg.refireEvent("iframe");=0A=
	this.moveEvent.fire([x,y]);=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "x" property is changed.=0A=
* @method configX=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.configX =3D function(type, args, obj) {=0A=
	var x =3D args[0];=0A=
	var y =3D this.cfg.getProperty("y");=0A=
=0A=
	this.cfg.setProperty("x", x, true);=0A=
	this.cfg.setProperty("y", y, true);=0A=
=0A=
	this.beforeMoveEvent.fire([x,y]);=0A=
=0A=
	x =3D this.cfg.getProperty("x");=0A=
	y =3D this.cfg.getProperty("y");=0A=
=0A=
	YAHOO.util.Dom.setX(this.element, x, true);=0A=
=0A=
	this.cfg.setProperty("xy", [x, y], true);=0A=
=0A=
	this.cfg.refireEvent("iframe");=0A=
	this.moveEvent.fire([x, y]);=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "y" property is changed.=0A=
* @method configY=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.configY =3D function(type, args, obj) {=0A=
	var x =3D this.cfg.getProperty("x");=0A=
	var y =3D args[0];=0A=
=0A=
	this.cfg.setProperty("x", x, true);=0A=
	this.cfg.setProperty("y", y, true);=0A=
=0A=
	this.beforeMoveEvent.fire([x,y]);=0A=
=0A=
	x =3D this.cfg.getProperty("x");=0A=
	y =3D this.cfg.getProperty("y");=0A=
=0A=
	YAHOO.util.Dom.setY(this.element, y, true);=0A=
=0A=
	this.cfg.setProperty("xy", [x, y], true);=0A=
=0A=
	this.cfg.refireEvent("iframe");=0A=
	this.moveEvent.fire([x, y]);=0A=
};=0A=
=0A=
/**=0A=
* Shows the iframe shim, if it has been enabled=0A=
* @method showIframe=0A=
*/=0A=
YAHOO.widget.Overlay.prototype.showIframe =3D function() {=0A=
	if (this.iframe) {=0A=
		this.iframe.style.display =3D "block";=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* Hides the iframe shim, if it has been enabled=0A=
* @method hideIframe=0A=
*/=0A=
YAHOO.widget.Overlay.prototype.hideIframe =3D function() {=0A=
	if (this.iframe) {=0A=
		this.iframe.style.display =3D "none";=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "iframe" property is changed.=0A=
* @method configIframe=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.configIframe =3D function(type, args, =
obj) {=0A=
=0A=
	var val =3D args[0];=0A=
=0A=
	if (val) { // IFRAME shim is enabled=0A=
=0A=
		if (! YAHOO.util.Config.alreadySubscribed(this.showEvent, =
this.showIframe, this)) {=0A=
			this.showEvent.subscribe(this.showIframe, this, true);=0A=
		}=0A=
		if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent, =
this.hideIframe, this)) {=0A=
			this.hideEvent.subscribe(this.hideIframe, this, true);=0A=
		}=0A=
=0A=
		var x =3D this.cfg.getProperty("x");=0A=
		var y =3D this.cfg.getProperty("y");=0A=
=0A=
		if (! x || ! y) {=0A=
			this.syncPosition();=0A=
			x =3D this.cfg.getProperty("x");=0A=
			y =3D this.cfg.getProperty("y");=0A=
		}=0A=
=0A=
=0A=
		if (! isNaN(x) && ! isNaN(y)) {=0A=
			if (! this.iframe) {=0A=
				this.iframe =3D document.createElement("iframe");=0A=
				if (this.isSecure) {=0A=
					this.iframe.src =3D YAHOO.widget.Overlay.IFRAME_SRC;=0A=
				}=0A=
=0A=
				var parent =3D this.element.parentNode;=0A=
				if (parent) {=0A=
					parent.appendChild(this.iframe);=0A=
				} else {=0A=
					document.body.appendChild(this.iframe);=0A=
				}=0A=
=0A=
				YAHOO.util.Dom.setStyle(this.iframe, "position", "absolute");=0A=
				YAHOO.util.Dom.setStyle(this.iframe, "border", "none");=0A=
				YAHOO.util.Dom.setStyle(this.iframe, "margin", "0");=0A=
				YAHOO.util.Dom.setStyle(this.iframe, "padding", "0");=0A=
				YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");=0A=
				if (this.cfg.getProperty("visible")) {=0A=
					this.showIframe();=0A=
				} else {=0A=
					this.hideIframe();=0A=
				}=0A=
			}=0A=
=0A=
			var iframeDisplay =3D YAHOO.util.Dom.getStyle(this.iframe, "display");=0A=
=0A=
			if (iframeDisplay =3D=3D "none") {=0A=
				this.iframe.style.display =3D "block";=0A=
			}=0A=
=0A=
			YAHOO.util.Dom.setXY(this.iframe, [x,y]);=0A=
=0A=
			var width =3D this.element.clientWidth;=0A=
			var height =3D this.element.clientHeight;=0A=
=0A=
			YAHOO.util.Dom.setStyle(this.iframe, "width", (width+2) + "px");=0A=
			YAHOO.util.Dom.setStyle(this.iframe, "height", (height+2) + "px");=0A=
=0A=
			if (iframeDisplay =3D=3D "none") {=0A=
				this.iframe.style.display =3D "none";=0A=
			}=0A=
		}=0A=
	} else {=0A=
		if (this.iframe) {=0A=
			this.iframe.style.display =3D "none";=0A=
		}=0A=
		this.showEvent.unsubscribe(this.showIframe, this);=0A=
		this.hideEvent.unsubscribe(this.hideIframe, this);=0A=
	}=0A=
};=0A=
=0A=
=0A=
/**=0A=
* The default event handler fired when the "constraintoviewport" =
property is changed.=0A=
* @method configConstrainToViewport=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.configConstrainToViewport =3D =
function(type, args, obj) {=0A=
	var val =3D args[0];=0A=
	if (val) {=0A=
		if (! YAHOO.util.Config.alreadySubscribed(this.beforeMoveEvent, =
this.enforceConstraints, this)) {=0A=
			this.beforeMoveEvent.subscribe(this.enforceConstraints, this, true);=0A=
		}=0A=
	} else {=0A=
		this.beforeMoveEvent.unsubscribe(this.enforceConstraints, this);=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* The default event handler fired when the "context" property is changed.=0A=
* @method configContext=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.configContext =3D function(type, args, =
obj) {=0A=
	var contextArgs =3D args[0];=0A=
=0A=
	if (contextArgs) {=0A=
		var contextEl =3D contextArgs[0];=0A=
		var elementMagnetCorner =3D contextArgs[1];=0A=
		var contextMagnetCorner =3D contextArgs[2];=0A=
=0A=
		if (contextEl) {=0A=
			if (typeof contextEl =3D=3D "string") {=0A=
				this.cfg.setProperty("context", =
[document.getElementById(contextEl),elementMagnetCorner,contextMagnetCorn=
er], true);=0A=
			}=0A=
=0A=
			if (elementMagnetCorner && contextMagnetCorner) {=0A=
				this.align(elementMagnetCorner, contextMagnetCorner);=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
=0A=
// END BUILT-IN PROPERTY EVENT HANDLERS //=0A=
=0A=
/**=0A=
* Aligns the Overlay to its context element using the specified corner =
points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, =
and BOTTOM_RIGHT.=0A=
* @method align=0A=
* @param {String} elementAlign		The String representing the corner of =
the Overlay that should be aligned to the context element=0A=
* @param {String} contextAlign		The corner of the context element that =
the elementAlign corner should stick to.=0A=
*/=0A=
YAHOO.widget.Overlay.prototype.align =3D function(elementAlign, =
contextAlign) {=0A=
	var contextArgs =3D this.cfg.getProperty("context");=0A=
	if (contextArgs) {=0A=
		var context =3D contextArgs[0];=0A=
=0A=
		var element =3D this.element;=0A=
		var me =3D this;=0A=
=0A=
		if (! elementAlign) {=0A=
			elementAlign =3D contextArgs[1];=0A=
		}=0A=
=0A=
		if (! contextAlign) {=0A=
			contextAlign =3D contextArgs[2];=0A=
		}=0A=
=0A=
		if (element && context) {=0A=
			var contextRegion =3D YAHOO.util.Dom.getRegion(context);=0A=
=0A=
			var doAlign =3D function(v,h) {=0A=
				switch (elementAlign) {=0A=
					case YAHOO.widget.Overlay.TOP_LEFT:=0A=
						me.moveTo(h,v);=0A=
						break;=0A=
					case YAHOO.widget.Overlay.TOP_RIGHT:=0A=
						me.moveTo(h-element.offsetWidth,v);=0A=
						break;=0A=
					case YAHOO.widget.Overlay.BOTTOM_LEFT:=0A=
						me.moveTo(h,v-element.offsetHeight);=0A=
						break;=0A=
					case YAHOO.widget.Overlay.BOTTOM_RIGHT:=0A=
						me.moveTo(h-element.offsetWidth,v-element.offsetHeight);=0A=
						break;=0A=
				}=0A=
			};=0A=
=0A=
			switch (contextAlign) {=0A=
				case YAHOO.widget.Overlay.TOP_LEFT:=0A=
					doAlign(contextRegion.top, contextRegion.left);=0A=
					break;=0A=
				case YAHOO.widget.Overlay.TOP_RIGHT:=0A=
					doAlign(contextRegion.top, contextRegion.right);=0A=
					break;=0A=
				case YAHOO.widget.Overlay.BOTTOM_LEFT:=0A=
					doAlign(contextRegion.bottom, contextRegion.left);=0A=
					break;=0A=
				case YAHOO.widget.Overlay.BOTTOM_RIGHT:=0A=
					doAlign(contextRegion.bottom, contextRegion.right);=0A=
					break;=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
/**=0A=
* The default event handler executed when the moveEvent is fired, if the =
"constraintoviewport" is set to true.=0A=
* @method enforceConstraints=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.enforceConstraints =3D function(type, =
args, obj) {=0A=
	var pos =3D args[0];=0A=
=0A=
	var x =3D pos[0];=0A=
	var y =3D pos[1];=0A=
=0A=
	var offsetHeight =3D this.element.offsetHeight;=0A=
	var offsetWidth =3D this.element.offsetWidth;=0A=
=0A=
	var viewPortWidth =3D YAHOO.util.Dom.getViewportWidth();=0A=
	var viewPortHeight =3D YAHOO.util.Dom.getViewportHeight();=0A=
=0A=
	var scrollX =3D document.documentElement.scrollLeft || =
document.body.scrollLeft;=0A=
	var scrollY =3D document.documentElement.scrollTop || =
document.body.scrollTop;=0A=
=0A=
	var topConstraint =3D scrollY + 10;=0A=
	var leftConstraint =3D scrollX + 10;=0A=
	var bottomConstraint =3D scrollY + viewPortHeight - offsetHeight - 10;=0A=
	var rightConstraint =3D scrollX + viewPortWidth - offsetWidth - 10;=0A=
=0A=
	if (x < leftConstraint) {=0A=
		x =3D leftConstraint;=0A=
	} else if (x > 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<this.overlays.length;o++) {=0A=
				YAHOO.util.Dom.removeClass(this.overlays[o].element, =
YAHOO.widget.OverlayManager.CSS_FOCUSED);=0A=
			}=0A=
		};=0A=
=0A=
		var overlays =3D this.cfg.getProperty("overlays");=0A=
=0A=
		if (! this.overlays) {=0A=
			this.overlays =3D [];=0A=
		}=0A=
=0A=
		if (overlays) {=0A=
			this.register(overlays);=0A=
			this.overlays.sort(this.compareZIndexDesc);=0A=
		}=0A=
	},=0A=
=0A=
	/**=0A=
	* Registers an Overlay or an array of Overlays with the manager. Upon =
registration, the Overlay receives functions for focus and blur, along =
with CustomEvents for each.=0A=
	* @method register=0A=
	* @param {YAHOO.widget.Overlay}	overlay		An Overlay to register with =
the manager.=0A=
	* @param {YAHOO.widget.Overlay[]}	overlay		An array of Overlays to =
register with the manager.=0A=
	* @return	{Boolean}	True if any Overlays are registered.=0A=
	*/=0A=
	register : function(overlay) {=0A=
		if (overlay instanceof YAHOO.widget.Overlay) {=0A=
			overlay.cfg.addProperty("manager", { value:this } );=0A=
=0A=
			overlay.focusEvent =3D new YAHOO.util.CustomEvent("focus");=0A=
			overlay.blurEvent =3D new YAHOO.util.CustomEvent("blur");=0A=
=0A=
			var mgr=3Dthis;=0A=
=0A=
			overlay.focus =3D function() {=0A=
				mgr.focus(this);=0A=
				this.focusEvent.fire();=0A=
			};=0A=
=0A=
			overlay.blur =3D function() {=0A=
				mgr.blurAll();=0A=
				this.blurEvent.fire();=0A=
			};=0A=
=0A=
			var focusOnDomEvent =3D function(e,obj) {=0A=
				overlay.focus();=0A=
			};=0A=
=0A=
			var focusevent =3D this.cfg.getProperty("focusevent");=0A=
			=
YAHOO.util.Event.addListener(overlay.element,focusevent,focusOnDomEvent,t=
his,true);=0A=
=0A=
			var zIndex =3D YAHOO.util.Dom.getStyle(overlay.element, "zIndex");=0A=
			if (! isNaN(zIndex)) {=0A=
				overlay.cfg.setProperty("zIndex", parseInt(zIndex, 10));=0A=
			} else {=0A=
				overlay.cfg.setProperty("zIndex", 0);=0A=
			}=0A=
=0A=
			this.overlays.push(overlay);=0A=
			return true;=0A=
		} else if (overlay instanceof Array) {=0A=
			var regcount =3D 0;=0A=
			for (var i=3D0;i<overlay.length;i++) {=0A=
				if (this.register(overlay[i])) {=0A=
					regcount++;=0A=
				}=0A=
			}=0A=
			if (regcount > 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<this.overlays.length;o++) {=0A=
				if (this.overlays[o] =3D=3D overlay) {=0A=
					return this.overlays[o];=0A=
				}=0A=
			}=0A=
		} else if (typeof overlay =3D=3D "string") {=0A=
			for (var p=3D0;p<this.overlays.length;p++) {=0A=
				if (this.overlays[p].id =3D=3D overlay) {=0A=
					return this.overlays[p];=0A=
				}=0A=
			}=0A=
		}=0A=
		return null;=0A=
	},=0A=
=0A=
	/**=0A=
	* Used for sorting the manager's Overlays by z-index.=0A=
	* @method compareZIndexDesc=0A=
	* @private=0A=
	* @return {Number}	0, 1, or -1, depending on where the Overlay should =
fall in the stacking order.=0A=
	*/=0A=
	compareZIndexDesc : function(o1, o2) {=0A=
		var zIndex1 =3D o1.cfg.getProperty("zIndex");=0A=
		var zIndex2 =3D o2.cfg.getProperty("zIndex");=0A=
=0A=
		if (zIndex1 > 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;o<this.overlays.length;o++) {=0A=
			this.overlays[o].show();=0A=
		}=0A=
	},=0A=
=0A=
	/**=0A=
	* Hides all Overlays in the manager.=0A=
	* @method hideAll=0A=
	*/=0A=
	hideAll : function() {=0A=
		for (var o=3D0;o<this.overlays.length;o++) {=0A=
			this.overlays[o].hide();=0A=
		}=0A=
	},=0A=
=0A=
	/**=0A=
	* Returns a string representation of the object.=0A=
	* @method toString=0A=
	* @return {String}	The string representation of the OverlayManager=0A=
	*/=0A=
	toString : function() {=0A=
		return "OverlayManager";=0A=
	}=0A=
=0A=
};=0A=
=0A=
/**=0A=
* KeyListener is a utility that provides an easy interface for listening =
for keydown/keyup events fired against DOM elements.=0A=
* @namespace YAHOO.util=0A=
* @class KeyListener=0A=
* @constructor=0A=
* @param {HTMLElement}	attachTo	The element or element ID to which the =
key event should be attached=0A=
* @param {String}	attachTo	The element or element ID to which the key =
event should be attached=0A=
* @param {Object}	keyData		The object literal representing the key(s) to =
detect. Possible attributes are shift(boolean), alt(boolean), =
ctrl(boolean) and keys(either an int or an array of ints representing =
keycodes).=0A=
* @param {Function}	handler		The CustomEvent handler to fire when the =
key event is detected=0A=
* @param {Object}	handler		An object literal representing the handler.=0A=
* @param {String}	event		Optional. The event (keydown or keyup) to =
listen for. Defaults automatically to keydown.=0A=
*/=0A=
YAHOO.util.KeyListener =3D function(attachTo, keyData, handler, event) {=0A=
	if (! attachTo) {=0A=
	}=0A=
	if (! keyData) {=0A=
	}=0A=
	if (! handler) {=0A=
	}=0A=
=0A=
	if (! event) {=0A=
		event =3D YAHOO.util.KeyListener.KEYDOWN;=0A=
	}=0A=
=0A=
	/**=0A=
	* The CustomEvent fired internally when a key is pressed=0A=
	* @event keyEvent=0A=
	* @private=0A=
	* @param {Object}	keyData		The object literal representing the key(s) =
to detect. Possible attributes are shift(boolean), alt(boolean), =
ctrl(boolean) and keys(either an int or an array of ints representing =
keycodes).=0A=
	*/=0A=
	var keyEvent =3D new YAHOO.util.CustomEvent("keyPressed");=0A=
=0A=
	/**=0A=
	* The CustomEvent fired when the KeyListener is enabled via the =
enable() function=0A=
	* @event enabledEvent=0A=
	* @param {Object}	keyData		The object literal representing the key(s) =
to detect. Possible attributes are shift(boolean), alt(boolean), =
ctrl(boolean) and keys(either an int or an array of ints representing =
keycodes).=0A=
	*/=0A=
	this.enabledEvent =3D new YAHOO.util.CustomEvent("enabled");=0A=
=0A=
	/**=0A=
	* The CustomEvent fired when the KeyListener is disabled via the =
disable() function=0A=
	* @event disabledEvent=0A=
	* @param {Object}	keyData		The object literal representing the key(s) =
to detect. Possible attributes are shift(boolean), alt(boolean), =
ctrl(boolean) and keys(either an int or an array of ints representing =
keycodes).=0A=
	*/=0A=
	this.disabledEvent =3D new YAHOO.util.CustomEvent("disabled");=0A=
=0A=
	if (typeof attachTo =3D=3D 'string') {=0A=
		attachTo =3D document.getElementById(attachTo);=0A=
	}=0A=
=0A=
	if (typeof handler =3D=3D 'function') {=0A=
		keyEvent.subscribe(handler);=0A=
	} else {=0A=
		keyEvent.subscribe(handler.fn, handler.scope, handler.correctScope);=0A=
	}=0A=
=0A=
	/**=0A=
	* Handles the key event when a key is pressed.=0A=
	* @method handleKeyPress=0A=
	* @param {DOMEvent} e	The keypress DOM event=0A=
	* @param {Object}	obj	The DOM event scope object=0A=
	* @private=0A=
	*/=0A=
	function handleKeyPress(e, obj) {=0A=
		if (! keyData.shift) {=0A=
			keyData.shift =3D false;=0A=
		}=0A=
		if (! keyData.alt) {=0A=
			keyData.alt =3D false;=0A=
		}=0A=
		if (! keyData.ctrl) {=0A=
			keyData.ctrl =3D false;=0A=
		}=0A=
=0A=
		// check held down modifying keys first=0A=
		if (e.shiftKey =3D=3D keyData.shift &&=0A=
			e.altKey   =3D=3D keyData.alt &&=0A=
			e.ctrlKey  =3D=3D keyData.ctrl) { // if we pass this, all modifiers =
match=0A=
=0A=
			var dataItem;=0A=
			var keyPressed;=0A=
=0A=
			if (keyData.keys instanceof Array) {=0A=
				for (var i=3D0;i<keyData.keys.length;i++) {=0A=
					dataItem =3D keyData.keys[i];=0A=
=0A=
					if (dataItem =3D=3D e.charCode ) {=0A=
						keyEvent.fire(e.charCode, e);=0A=
						break;=0A=
					} else if (dataItem =3D=3D e.keyCode) {=0A=
						keyEvent.fire(e.keyCode, e);=0A=
						break;=0A=
					}=0A=
				}=0A=
			} else {=0A=
				dataItem =3D keyData.keys;=0A=
				if (dataItem =3D=3D e.charCode ) {=0A=
					keyEvent.fire(e.charCode, e);=0A=
				} else if (dataItem =3D=3D e.keyCode) {=0A=
					keyEvent.fire(e.keyCode, e);=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	/**=0A=
	* Enables the KeyListener by attaching the DOM event listeners to the =
target DOM element=0A=
	* @method enable=0A=
	*/=0A=
	this.enable =3D function() {=0A=
		if (! this.enabled) {=0A=
			YAHOO.util.Event.addListener(attachTo, event, handleKeyPress);=0A=
			this.enabledEvent.fire(keyData);=0A=
		}=0A=
		/**=0A=
		* Boolean indicating the enabled/disabled state of the Tooltip=0A=
		* @property enabled=0A=
		* @type Boolean=0A=
		*/=0A=
		this.enabled =3D true;=0A=
	};=0A=
=0A=
	/**=0A=
	* Disables the KeyListener by removing the DOM event listeners from the =
target DOM element=0A=
	* @method disable=0A=
	*/=0A=
	this.disable =3D function() {=0A=
		if (this.enabled) {=0A=
			YAHOO.util.Event.removeListener(attachTo, event, handleKeyPress);=0A=
			this.disabledEvent.fire(keyData);=0A=
		}=0A=
		this.enabled =3D false;=0A=
	};=0A=
=0A=
	/**=0A=
	* Returns a String representation of the object.=0A=
	* @method toString=0A=
	* @return {String}	The string representation of the KeyListener=0A=
	*/=0A=
	this.toString =3D function() {=0A=
		return "KeyListener [" + keyData.keys + "] " + attachTo.tagName + =
(attachTo.id ? "[" + attachTo.id + "]" : "");=0A=
	};=0A=
=0A=
};=0A=
=0A=
/**=0A=
* Constant representing the DOM "keydown" event.=0A=
* @property YAHOO.util.KeyListener.KEYDOWN=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYDOWN =3D "keydown";=0A=
=0A=
/**=0A=
* Constant representing the DOM "keyup" event.=0A=
* @property YAHOO.util.KeyListener.KEYUP=0A=
* @static=0A=
* @final=0A=
* @type String=0A=
*/=0A=
YAHOO.util.KeyListener.KEYUP =3D "keyup";=0A=
=0A=
/**=0A=
* ContainerEffect encapsulates animation transitions that are executed =
when an Overlay is shown or hidden.=0A=
* @namespace YAHOO.widget=0A=
* @class ContainerEffect=0A=
* @constructor=0A=
* @param {YAHOO.widget.Overlay}	overlay		The Overlay that the animation =
should be associated with=0A=
* @param {Object}	attrIn		The object literal representing the animation =
arguments to be used for the animate-in transition. The arguments for =
this literal are: attributes(object, see YAHOO.util.Anim for =
description), duration(Number), and method(i.e. =
YAHOO.util.Easing.easeIn).=0A=
* @param {Object}	attrOut		The object literal representing the animation =
arguments to be used for the animate-out transition. The arguments for =
this literal are: attributes(object, see YAHOO.util.Anim for =
description), duration(Number), and method(i.e. =
YAHOO.util.Easing.easeIn).=0A=
* @param {HTMLElement}	targetElement	Optional. The target element that =
should be animated during the transition. Defaults to overlay.element.=0A=
* @param {class}	Optional. The animation class to instantiate. Defaults =
to YAHOO.util.Anim. Other options include YAHOO.util.Motion.=0A=
*/=0A=
YAHOO.widget.ContainerEffect =3D function(overlay, attrIn, attrOut, =
targetElement, animClass) {=0A=
	if (! animClass) {=0A=
		animClass =3D YAHOO.util.Anim;=0A=
	}=0A=
=0A=
	/**=0A=
	* The overlay to animate=0A=
	* @property overlay=0A=
	* @type YAHOO.widget.Overlay=0A=
	*/=0A=
	this.overlay =3D overlay;=0A=
	/**=0A=
	* The animation attributes to use when transitioning into view=0A=
	* @property attrIn=0A=
	* @type Object=0A=
	*/=0A=
	this.attrIn =3D attrIn;=0A=
	/**=0A=
	* The animation attributes to use when transitioning out of view=0A=
	* @property attrOut=0A=
	* @type Object=0A=
	*/=0A=
	this.attrOut =3D attrOut;=0A=
	/**=0A=
	* The target element to be animated=0A=
	* @property targetElement=0A=
	* @type HTMLElement=0A=
	*/=0A=
	this.targetElement =3D targetElement || overlay.element;=0A=
	/**=0A=
	* The animation class to use for animating the overlay=0A=
	* @property animClass=0A=
	* @type class=0A=
	*/=0A=
	this.animClass =3D animClass;=0A=
};=0A=
=0A=
/**=0A=
* Initializes the animation classes and events.=0A=
* @method init=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.init =3D function() {=0A=
	this.beforeAnimateInEvent =3D new =
YAHOO.util.CustomEvent("beforeAnimateIn");=0A=
	this.beforeAnimateOutEvent =3D new =
YAHOO.util.CustomEvent("beforeAnimateOut");=0A=
=0A=
	this.animateInCompleteEvent =3D new =
YAHOO.util.CustomEvent("animateInComplete");=0A=
	this.animateOutCompleteEvent =3D new =
YAHOO.util.CustomEvent("animateOutComplete");=0A=
=0A=
	this.animIn =3D new this.animClass(this.targetElement, =
this.attrIn.attributes, this.attrIn.duration, this.attrIn.method);=0A=
	this.animIn.onStart.subscribe(this.handleStartAnimateIn, this);=0A=
	this.animIn.onTween.subscribe(this.handleTweenAnimateIn, this);=0A=
	this.animIn.onComplete.subscribe(this.handleCompleteAnimateIn, this);=0A=
=0A=
	this.animOut =3D new this.animClass(this.targetElement, =
this.attrOut.attributes, this.attrOut.duration, this.attrOut.method);=0A=
	this.animOut.onStart.subscribe(this.handleStartAnimateOut, this);=0A=
	this.animOut.onTween.subscribe(this.handleTweenAnimateOut, this);=0A=
	this.animOut.onComplete.subscribe(this.handleCompleteAnimateOut, this);=0A=
};=0A=
=0A=
/**=0A=
* Triggers the in-animation.=0A=
* @method animateIn=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.animateIn =3D function() {=0A=
	this.beforeAnimateInEvent.fire();=0A=
	this.animIn.animate();=0A=
};=0A=
=0A=
/**=0A=
* Triggers the out-animation.=0A=
* @method animateOut=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.animateOut =3D function() {=0A=
	this.beforeAnimateOutEvent.fire();=0A=
	this.animOut.animate();=0A=
};=0A=
=0A=
/**=0A=
* The default onStart handler for the in-animation.=0A=
* @method handleStartAnimateIn=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleStartAnimateIn =3D =
function(type, args, obj) { };=0A=
/**=0A=
* The default onTween handler for the in-animation.=0A=
* @method handleTweenAnimateIn=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateIn =3D =
function(type, args, obj) { };=0A=
/**=0A=
* The default onComplete handler for the in-animation.=0A=
* @method handleCompleteAnimateIn=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateIn =3D =
function(type, args, obj) { };=0A=
=0A=
/**=0A=
* The default onStart handler for the out-animation.=0A=
* @method handleStartAnimateOut=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleStartAnimateOut =3D =
function(type, args, obj) { };=0A=
/**=0A=
* The default onTween handler for the out-animation.=0A=
* @method handleTweenAnimateOut=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateOut =3D =
function(type, args, obj) { };=0A=
/**=0A=
* The default onComplete handler for the out-animation.=0A=
* @method handleCompleteAnimateOut=0A=
* @param {String} type	The CustomEvent type=0A=
* @param {Object[]}	args	The CustomEvent arguments=0A=
* @param {Object} obj	The scope object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateOut =3D =
function(type, args, obj) { };=0A=
=0A=
/**=0A=
* Returns a string representation of the object.=0A=
* @method toString=0A=
* @return {String}	The string representation of the ContainerEffect=0A=
*/=0A=
YAHOO.widget.ContainerEffect.prototype.toString =3D function() {=0A=
	var output =3D "ContainerEffect";=0A=
	if (this.overlay) {=0A=
		output +=3D " [" + this.overlay.toString() + "]";=0A=
	}=0A=
	return output;=0A=
};=0A=
=0A=
/**=0A=
* A pre-configured ContainerEffect instance that can be used for fading =
an overlay in and out.=0A=
* @method FADE=0A=
* @static=0A=
* @param {Overlay}	overlay	The Overlay object to animate=0A=
* @param {Number}	dur	The duration of the animation=0A=
* @return {ContainerEffect}	The configured ContainerEffect object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.FADE =3D function(overlay, dur) {=0A=
	var fade =3D new YAHOO.widget.ContainerEffect(overlay, { =
attributes:{opacity: {from:0, to:1}}, duration:dur, =
method:YAHOO.util.Easing.easeIn }, { attributes:{opacity: {to:0}}, =
duration:dur, method:YAHOO.util.Easing.easeOut}, overlay.element );=0A=
=0A=
	fade.handleStartAnimateIn =3D function(type,args,obj) {=0A=
		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");=0A=
=0A=
		if (! obj.overlay.underlay) {=0A=
			obj.overlay.cfg.refireEvent("underlay");=0A=
		}=0A=
=0A=
		if (obj.overlay.underlay) {=0A=
			obj.initialUnderlayOpacity =3D =
YAHOO.util.Dom.getStyle(obj.overlay.underlay, "opacity");=0A=
			obj.overlay.underlay.style.filter =3D null;=0A=
		}=0A=
=0A=
		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");=0A=
		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 0);=0A=
	};=0A=
=0A=
	fade.handleCompleteAnimateIn =3D function(type,args,obj) {=0A=
		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");=0A=
=0A=
		if (obj.overlay.element.style.filter) {=0A=
			obj.overlay.element.style.filter =3D null;=0A=
		}=0A=
=0A=
		if (obj.overlay.underlay) {=0A=
			YAHOO.util.Dom.setStyle(obj.overlay.underlay, "opacity", =
obj.initialUnderlayOpacity);=0A=
		}=0A=
=0A=
		obj.overlay.cfg.refireEvent("iframe");=0A=
		obj.animateInCompleteEvent.fire();=0A=
	};=0A=
=0A=
	fade.handleStartAnimateOut =3D function(type, args, obj) {=0A=
		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");=0A=
=0A=
		if (obj.overlay.underlay) {=0A=
			obj.overlay.underlay.style.filter =3D null;=0A=
		}=0A=
	};=0A=
=0A=
	fade.handleCompleteAnimateOut =3D  function(type, args, obj) {=0A=
		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");=0A=
		if (obj.overlay.element.style.filter) {=0A=
			obj.overlay.element.style.filter =3D null;=0A=
		}=0A=
		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");=0A=
		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 1);=0A=
=0A=
		obj.overlay.cfg.refireEvent("iframe");=0A=
=0A=
		obj.animateOutCompleteEvent.fire();=0A=
	};=0A=
=0A=
	fade.init();=0A=
	return fade;=0A=
};=0A=
=0A=
=0A=
/**=0A=
* A pre-configured ContainerEffect instance that can be used for sliding =
an overlay in and out.=0A=
* @method SLIDE=0A=
* @static=0A=
* @param {Overlay}	overlay	The Overlay object to animate=0A=
* @param {Number}	dur	The duration of the animation=0A=
* @return {ContainerEffect}	The configured ContainerEffect object=0A=
*/=0A=
YAHOO.widget.ContainerEffect.SLIDE =3D function(overlay, dur) {=0A=
	var x =3D overlay.cfg.getProperty("x") || =
YAHOO.util.Dom.getX(overlay.element);=0A=
	var y =3D overlay.cfg.getProperty("y") || =
YAHOO.util.Dom.getY(overlay.element);=0A=
=0A=
	var clientWidth =3D YAHOO.util.Dom.getClientWidth();=0A=
	var offsetWidth =3D overlay.element.offsetWidth;=0A=
=0A=
	var slide =3D new YAHOO.widget.ContainerEffect(overlay, {=0A=
															attributes:{ points: { to:[x, y] } },=0A=
															duration:dur,=0A=
															method:YAHOO.util.Easing.easeIn=0A=
														},=0A=
														{=0A=
															attributes:{ points: { to:[(clientWidth+25), y] } },=0A=
															duration:dur,=0A=
															method:YAHOO.util.Easing.easeOut=0A=
														},=0A=
														overlay.element,=0A=
														YAHOO.util.Motion);=0A=
=0A=
=0A=
	slide.handleStartAnimateIn =3D function(type,args,obj) {=0A=
		obj.overlay.element.style.left =3D (-25-offsetWidth) + "px";=0A=
		obj.overlay.element.style.top  =3D y + "px";=0A=
	};=0A=
=0A=
	slide.handleTweenAnimateIn =3D function(type, args, obj) {=0A=
=0A=
=0A=
		var pos =3D YAHOO.util.Dom.getXY(obj.overlay.element);=0A=
=0A=
		var currentX =3D pos[0];=0A=
		var currentY =3D pos[1];=0A=
=0A=
		if (YAHOO.util.Dom.getStyle(obj.overlay.element, "visibility") =3D=3D =
"hidden" && currentX < x) {=0A=
			YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");=0A=
		}=0A=
=0A=
		obj.overlay.cfg.setProperty("xy", [currentX,currentY], true);=0A=
		obj.overlay.cfg.refireEvent("iframe");=0A=
	};=0A=
=0A=
	slide.handleCompleteAnimateIn =3D function(type, args, obj) {=0A=
		obj.overlay.cfg.setProperty("xy", [x,y], true);=0A=
		obj.startX =3D x;=0A=
		obj.startY =3D y;=0A=
		obj.overlay.cfg.refireEvent("iframe");=0A=
		obj.animateInCompleteEvent.fire();=0A=
	};=0A=
=0A=
	slide.handleStartAnimateOut =3D function(type, args, obj) {=0A=
		var vw =3D YAHOO.util.Dom.getViewportWidth();=0A=
=0A=
		var pos =3D YAHOO.util.Dom.getXY(obj.overlay.element);=0A=
=0A=
		var yso =3D pos[1];=0A=
=0A=
		var currentTo =3D obj.animOut.attributes.points.to;=0A=
		obj.animOut.attributes.points.to =3D [(vw+25), yso];=0A=
	};=0A=
=0A=
	slide.handleTweenAnimateOut =3D function(type, args, obj) {=0A=
		var pos =3D YAHOO.util.Dom.getXY(obj.overlay.element);=0A=
=0A=
		var xto =3D pos[0];=0A=
		var yto =3D pos[1];=0A=
=0A=
		obj.overlay.cfg.setProperty("xy", [xto,yto], true);=0A=
		obj.overlay.cfg.refireEvent("iframe");=0A=
	};=0A=
=0A=
	slide.handleCompleteAnimateOut =3D function(type, args, obj) {=0A=
		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");=0A=
=0A=
		obj.overlay.cfg.setProperty("xy", [x,y]);=0A=
		obj.animateOutCompleteEvent.fire();=0A=
	};=0A=
=0A=
	slide.init();=0A=
	return slide;=0A=
};=0A=
=0A=
YAHOO.register("container_core", YAHOO.widget.Module, {version: "2.2.0", =
build: "127"});=0A=

------=_NextPart_000_0000_01C7EE50.9DCC8850
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/carousel.js

/**=0A=
 * Copyright (c) 2006, Bill W. Scott=0A=
 * All rights reserved.=0A=
 *=0A=
 * This work is licensed under the Creative Commons Attribution 2.5 =
License. To view a copy =0A=
 * of this license, visit http://creativecommons.org/licenses/by/2.5/ or =
send a letter to =0A=
 * Creative Commons, 543 Howard Street, 5th Floor, San Francisco, =
California, 94105, USA.=0A=
 *=0A=
 * This work was created by Bill Scott (billwscott.com, =
looksgoodworkswell.com).=0A=
 * =0A=
 * The only attribution I require is to keep this notice of copyright & =
license =0A=
 * in this original source file.=0A=
 *=0A=
 * Version 0.4.0 - 01.29.2007=0A=
 *=0A=
 */=0A=
YAHOO.namespace("extension");=0A=
=0A=
/**=0A=
* @class =0A=
* The carousel class manages a content list (a set of LI elements within =
an UL list)  that can be displayed horizontally or vertically. The =
content can be scrolled back and forth  with or without animation. The =
content can reference static HTML content or the list items can  be =
created dynamically on-the-fly (with or without Ajax). The navigation =
and event handling  can be externalized from the class.=0A=
* @param {object|string} carouselElementID The element ID (id name or id =
object) of the DIV that will become a carousel=0A=
* @param {object} carouselCfg The configuration object literal =
containing the configuration that should be set for this module. See =
configuration documentation for more details.=0A=
* @constructor=0A=
*/=0A=
YAHOO.extension.Carousel =3D function(carouselElementID, carouselCfg) {=0A=
 		this.init(carouselElementID, carouselCfg);=0A=
	};=0A=
=0A=
YAHOO.extension.Carousel.prototype =3D {=0A=
=0A=
=0A=
	/**=0A=
	 * Constant denoting that the carousel size is unbounded (no limits set =
on scrolling)=0A=
	 * @type number=0A=
	 */=0A=
	UNBOUNDED_SIZE: 1000000,=0A=
	=0A=
	/**=0A=
	 * Initializes the carousel object and all of its local members.=0A=
     * @param {object|string} carouselElementID The element ID (id name =
or id object) =0A=
     * of the DIV that will become a carousel=0A=
     * @param {object} carouselCfg The configuration object literal =
containing the =0A=
     * configuration that should be set for this module. See =
configuration documentation for more details.=0A=
	 */=0A=
	init: function(carouselElementID, carouselCfg) {=0A=
=0A=
		var oThis =3D this;=0A=
=0A=
		// CSS style classes=0A=
		var carouselListClass =3D "carousel-list";=0A=
		var carouselClipRegionClass =3D "carousel-clip-region";=0A=
		var carouselNextClass =3D "carousel-next";=0A=
		var carouselPrevClass =3D "carousel-prev";=0A=
=0A=
 		this.carouselElemID =3D carouselElementID;=0A=
 		this.carouselElem =3D YAHOO.util.Dom.get(carouselElementID);=0A=
=0A=
 		this.prevEnabled =3D true;=0A=
 		this.nextEnabled =3D true;=0A=
 		=0A=
 		// Create the config object=0A=
 		this.cfg =3D new YAHOO.util.Config(this);=0A=
=0A=
		/**=0A=
		 * orientation property. =0A=
		 * Either "horizontal" or "vertical". Changes carousel from a =0A=
		 * left/right style carousel to a up/down style carousel.=0A=
		 */=0A=
		this.cfg.addProperty("orientation", { =0A=
				value:"horizontal", =0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.orientation =3D args[0];=0A=
					oThis.reload();=0A=
				},=0A=
				validator: function(orientation) {=0A=
				    if(typeof orientation =3D=3D "string") {=0A=
				        return =
("horizontal,vertical".indexOf(orientation.toLowerCase()) !=3D -1);=0A=
				    } else {=0A=
						return false;=0A=
					}=0A=
				}=0A=
		} );		=0A=
=0A=
		/**=0A=
		 * size property. =0A=
		 * The upper hand for scrolling in the 'next' set of content. =0A=
		 * Set to a large value by default (this means unlimited scrolling.) =0A=
		 */=0A=
		this.cfg.addProperty("size", { =0A=
				value:this.UNBOUNDED_SIZE,=0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.size =3D args[0];=0A=
					oThis.reload();=0A=
				},=0A=
				validator: oThis.cfg.checkNumber=0A=
		} );=0A=
=0A=
		/**=0A=
		 * numVisible property. =0A=
		 * The number of items that will be visible.=0A=
		 */=0A=
		this.cfg.addProperty("numVisible", { =0A=
				value:3,=0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.numVisible =3D args[0];=0A=
					oThis.load();=0A=
				},=0A=
				validator: oThis.cfg.checkNumber=0A=
		} );=0A=
=0A=
		/**=0A=
		 * firstVisible property. =0A=
		 * Sets which item should be the first visible item in the carousel. =
Use to set which item will=0A=
		 * display as the first element when the carousel is first displayed. =
After the carousel is created,=0A=
		 * you can manipulate which item is the first visible by using the =
moveTo() or scrollTo() convenience=0A=
		 * methods.=0A=
		 */=0A=
		this.cfg.addProperty("firstVisible", { =0A=
				value:1,=0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.moveTo(args[0]);=0A=
				},=0A=
				validator: oThis.cfg.checkNumber=0A=
		} );=0A=
=0A=
		/**=0A=
		 * scrollInc property. =0A=
		 * The number of items to scroll by. Think of this as the page =
increment.=0A=
		 */=0A=
		this.cfg.addProperty("scrollInc", { =0A=
				value:3,=0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.scrollInc =3D args[0];=0A=
				},=0A=
				validator: oThis.cfg.checkNumber=0A=
		} );=0A=
		=0A=
		/**=0A=
		 * animationSpeed property. =0A=
		 * The time (in seconds) it takes to complete the scroll animation. =0A=
		 * If set to 0, animated transitions are turned off and the new page =
of content is =0A=
		 * moved immdediately into place.=0A=
		 */=0A=
		this.cfg.addProperty("animationSpeed", { =0A=
				value:0.25,=0A=
				handler: function(type, args, carouselElem) {=0A=
					oThis.animationSpeed =3D args[0];=0A=
				},=0A=
				validator: oThis.cfg.checkNumber=0A=
		} );=0A=
=0A=
		/**=0A=
		 * animationMethod property. =0A=
		 * The <a =
href=3D"http://developer.yahoo.com/yui/docs/animation/YAHOO.util.Easing.h=
tml">YAHOO.util.Easing</a> =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 <em>startAutoPlay()</em>. =0A=
		 * If you externally control navigation (with your own event handlers) =0A=
		 * then you may want to turn off the autoPlay by =
calling<em>stopAutoPlay()</em>=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 <em>size</em> 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 <em>navMargin</em> 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: <em>type</em> =0A=
		 * (which is set to "onPrevButtonStateChange") and <em>args</em>, =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 <em>prevElement</em> 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: <em>type</em> =0A=
		 * (which is set to "onNextButtonStateChange") and <em>args</em>, =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 <em>nextElement</em> 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 <em>firstVisible</em> 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 <em>startAutoPlay()</em> 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<ulKids.length; i++) {=0A=
		=0A=
			li =3D ulKids[i];=0A=
			if(li.tagName =3D=3D "LI" || li.tagName =3D=3D "li") {=0A=
				break;=0A=
			}=0A=
		}=0A=
		var liPaddingWidth;=0A=
		if(this.isVertical()) {=0A=
			YAHOO.util.Dom.removeClass(this.carouselList, "carousel-horizontal");=0A=
			YAHOO.util.Dom.removeClass(this.carouselList, "carousel-vertical");=0A=
			YAHOO.util.Dom.addClass(this.carouselList, "carousel-vertical");=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=
			var liPaddingHeight =3D parseInt(YAHOO.util.Dom.getStyle(li, =
"paddingTop"),10) + =0A=
						parseInt(YAHOO.util.Dom.getStyle(li, "paddingBottom"),10) + =0A=
						parseInt(YAHOO.util.Dom.getStyle(li, "marginTop"),10) + =0A=
						parseInt(YAHOO.util.Dom.getStyle(li, "marginBottom"),10);=0A=
			=0A=
			this.scrollAmountPerInc =3D (li.offsetHeight+liPaddingHeight);=0A=
			this.clipReg.style.width =3D (li.offsetWidth + liPaddingWidth) + "px";=0A=
			this.clipReg.style.height =3D =
(this.scrollAmountPerInc*this.numVisible) + "px";=0A=
			this.carouselElem.style.width =3D (li.offsetWidth + liPaddingWidth*2) =
+ "px";			=0A=
=0A=
			// if we set the initial start > 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_0000_01C7EE50.9DCC8850--
