From: <Saved by Windows Internet Explorer 7>
Subject: Sig Ep sponsors fundraiser - News
Date: Thu, 18 Dec 2008 14:17:19 -0500
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C9611B.563D02A0"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.www.dailycollegian.com/media/storage/paper874/news/2008/09/22/News/Sig-Ep.Sponsors.Fundraiser-3443816.shtml

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>Sig Ep =
sponsors fundraiser - News</TITLE>
<SCRIPT language=3DJavascript>=0A=
				var story_id =3D 3443816;=0A=
				</SCRIPT>

<META content=3D"Sig Ep sponsors fundraiser, " name=3Ddescription>
<META content=3D"Sig Ep sponsors fundraiser, " name=3Dkeywords>
<SCRIPT language=3DJAVASCRIPT>=0A=
				var sectionname =3D 'News';=0A=
				var sectioncategory =3D 'Campus News';=0A=
				var isectioncategoryid =3D '2,';=0A=
				</SCRIPT>

<META http-equiv=3Dcontent-type content=3D"text/html; charset=3Dutf-8">
<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 Daily Collegian');
	dispatcher.setAttribute('prop8','www.dailycollegian.com');
	dispatcher.setAttribute('prop9',story_id);
	dispatcher.setAttribute('prop10','874');
	dispatcher.setAttribute('prop11','home');
	dispatcher.setAttribute('prop12',GetCookie('refsourcekey'));
	dispatcher.setAttribute('prop13',reffeature);
	dispatcher.sendCall();
	//]]>
</SCRIPT>

<SCRIPT src=3D"http://edge.quantserve.com/quant.js" =
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>_qoptions =3D { labels:"Viacom =
Domestic,MTVN Digital,MTVN Music and Logo,MTVN Music Group,mtvU =
Online,CMN" }; _qacct=3D"p-94wNw88f65Rhk";quantserve();</SCRIPT>
<NOSCRIPT>
<META content=3D"MSHTML 6.00.6000.16762" name=3DGENERATOR></HEAD>
<BODY><A href=3D"http://www.quantcast.com/p-94wNw88f65Rhk" =
target=3D_blank><IMG=20
style=3D"DISPLAY: none" height=3D1 alt=3DQuantcast=20
src=3D"http://pixel.quantserve.com/pixel/p-94wNw88f65Rhk.gif?labels=3DVia=
com%20Domestic%2CMTVN%20Digital%2CMTVN%20Music%20and%20Logo%2CMTVN%20Musi=
c%20Group%2CmtvU%20Online%2CCMN"=20
width=3D1 border=3D0></A> </NOSCRIPT><LINK media=3Dscreen=20
href=3D"http://media.collegepublisher.com/media/css/global.css?v48" =
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.dailycollegian.com/media/paper874/styles.css?v13" =
type=3Dtext/css=20
rel=3Dstylesheet><LINK title=3D"RSS feed for The Daily Collegian"=20
href=3D"http://www.dailycollegian.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=20
src=3D"http://media.collegepublisher.com/media/scripts/network_channel.js=
?2"=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 Daily Collegian" name=3Dauthor>
<META content=3D"The Daily Collegian, a college media publication."=20
name=3Ddescription>
<META content=3D"The Daily Collegian, newspaper, college media, student =
media"=20
name=3Dkeywords>
<META content=3D"Copyright 2008 The Daily Collegian." name=3Dcopyright>
<SCRIPT type=3Dtext/javascript>
/* <![CDATA[ */
var currentissuedate=3D'12/12/08';
var currentissuedayname=3D'Friday';
var currentissuemonthname=3D'December';
var currentissueday=3D'12';
var currentissuemonth=3D'12';
var currentissueyear=3D'2008';
var basehref=3D'http://www.dailycollegian.com/';
var paper_id=3D'874';
var paperzip=3D'01003';
var paper_name=3D'The Daily Collegian';
var paper_domain=3D'www.dailycollegian.com';



var dart_paper_name =3D 'UniversityofMassachuset_874';

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.dailycollegian.com/home/index.cfm?event=3Ddis=
playSlideShow&islides=3D';

// from query.
var aSectionNames =3D new Array();
var aSectionLinks =3D new Array();
aSectionNames[0] =3D 'News';
aSectionLinks[0]=3D'/news/2008/12/12/News/';
aSectionNames[1] =3D 'Arts & Living';
aSectionLinks[1]=3D'/news/2008/12/12/ArtsLiving/';
aSectionNames[2] =3D 'Editorial / Opinion';
aSectionLinks[2]=3D'/news/2008/12/12/EditorialOpinion/';
aSectionNames[3] =3D 'Sports';
aSectionLinks[3]=3D'/news/2008/12/12/Sports/';
aSectionNames[4] =3D 'Features';
aSectionLinks[4]=3D'/news/2008/12/12/Features/';

/* ]]> */
</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.dailycollegian.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=3D874&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=3D874&random=3D" + pcrandom + '&isnewsession=3D1';
}


if (bAdmanagerClientAlive) {
	document.write('<SCR'+'IPT =
SRC=3D'+'http://localads.collegepublisher.com/jsc/874/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>

<DIV id=3Dnet_bar>
<DIV id=3Dnet_cp><A href=3D"http://www.collegemedianetwork.com/"=20
target=3D_blank>College Media Network</A> </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 tabIndex=3D1 name=3Dq> <INPUT =
type=3Dhidden=20
value=3Ddisplaysearchresults name=3Devent> <INPUT type=3Dhidden =
value=3D1=20
name=3DbuttonPushed> <INPUT type=3Dhidden value=3D1 name=3DtiOrderType>=20
<UL id=3Dnet_search_choose>
  <LI id=3Dnet_search_choose_submit><INPUT class=3Dnc_button =
id=3Dnet_search_paper tabIndex=3D2 type=3Dsubmit value=3DSearch>=20
  </LI>
  <LI id=3Dnet_submit_web><INPUT class=3Dnc_button =
id=3Dnet_search_google onclick=3Dlivesearch() tabIndex=3D3 type=3Dbutton =
value=3DWeb>=20
  </LI></UL></FIELDSET> </FORM></DIV>
<DIV id=3Dnet_channels>
<UL>
  <LI><A href=3D"http://woodies.mtvu.com/" target=3D_blank><IMG =
alt=3D"mtvU Logo"=20
  =
src=3D"http://www.dailycollegian.com/media/assets/images/ncbar_mtvu.gif" =

  align=3Dtop border=3D0> 2008 Woodie Awards</A> <!--<li><a =
href=3D"http://govoteabsentee.com/" target=3D"_blank"><img =
src=3D"/media/assets/images/ncbar_absentee.gif" border=3D"0" =
alt=3D"Absentee Logo" align=3D"top" /> Vote Absentee</a></li>--></LI>
  <LI><A href=3D"http://www.dailycollegian.com/channel/career/"=20
  target=3D_blank>Jobs</A> </LI>
  <LI><A =
href=3D"http://media.www.dailycollegian.com/channel/collegeheadlines/"=20
  target=3D_parent>Top College News</A> </LI></UL></DIV>
<DIV id=3Dnet_weather><A =
href=3D"http://www.dailycollegian.com/home/weather/"=20
target=3D_parent><IMG=20
src=3D"http://media.collegepublisher.com/media/weatherbug/weatherbugsforc=
hannelbar/01003.png"=20
border=3D0></A> </DIV><NOSCRIPT><IMG id=3Dflan_stat_img=20
src=3D"http://stats.broadbandpublisher.com/pageCounter.adp?iPaper_id=3D87=
4&amp;random=3D&amp;uid=3D"=20
border=3D0> </NOSCRIPT></DIV>
<DIV id=3Dflan_wrap>
<DIV id=3Dflan_header>
<DIV id=3Dflan_leader>
<SCRIPT language=3DJavascript>
				showNetworkBanner(11);
			</SCRIPT>
<NOSCRIPT><A=20
href=3D"http://admanager3.collegepublisher.com/runtime/noScriptClickThrou=
gh.cfm?iposition=3D11&amp;ipaper_id=3D874&amp;callingSite=3Dwww%2Ewww.dai=
lycollegian.com%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D11&amp;ipaper_id=3D874"=20
border=3D0> </A></NOSCRIPT></DIV>
<DIV id=3Dflan_header_main>
<DIV class=3Dgutter>
<H1 id=3Dflan_logo><A class=3Dflan_header_home_link title=3D"The Daily =
Collegian"=20
href=3D"http://www.dailycollegian.com/home/">The Daily =
Collegian</A></H1>
<DIV class=3Dflan_article_clear></DIV></DIV></DIV>
<DIV id=3Dflan_header_meta>
<DIV class=3Dgutter>
<UL>
  <LI><A href=3D"http://www.dailycollegian.com/">Front Page
  <SCRIPT type=3Dtext/JavaScript>
				<!--
				//   "aSectionNames[count]" =3D the name of the section =20
				//   "aSectionLinks[count]" =3D the link for the section           =20
				l =3D aSectionNames.length;
				for(count =3D 0 ; count < l ; count++ ) {
					if (!(aSectionNames[count] =3D=3D 'Hide Section')) {
						document.write('<li><a href=3D\"' + aSectionLinks[count] + '\">' + =
aSectionNames[count] + '</a></li>');
					}
				}
				//-->				=09
			</SCRIPT>
   </LI></UL></DIV></DIV></DIV>
<DIV id=3Dflan_body>
<DIV id=3Dflan_body_wrap>
<DIV id=3Dflan_content>
<DIV class=3Dgutter>
<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.dailycollegian.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=3Dcp_bn_wrap></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=3D874&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Edailycollegian%2Ecom"=20
target=3D_blank><IMG alt=3DAdvertisement=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3D5307nflb3p&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D874&amp;javascriptIncludeMode=3D0&amp;iPosition=3D1"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV id=3Dbreadcrumb><A title=3D"Go back to front page"=20
href=3D"http://www.dailycollegian.com/home/">Home</A> &gt; <A =
title=3DNews=20
href=3D"http://www.dailycollegian.com/news/2008/09/22/News/">News</A> =
</DIV>
<DIV id=3Darticle>
<H2>Sig Ep sponsors fundraiser</H2>
<H3></H3>
<H4>William McGuinness, Collegian Staff</A></H4>
<DIV id=3Dmeta><STRONG>Issue date:</STRONG> 9/22/08 =
<STRONG>Section:</STRONG> <A=20
title=3DNews=20
href=3D"http://www.dailycollegian.com/news/2008/09/22/News/">News</A></DI=
V>
<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.dailycollegian.com/home/index.cfm?event=3DdisplayArtic=
lePrinterFriendly&amp;uStory_id=3D5f801bbd-252d-4324-85cd-2f1ab8ada496">P=
rint</A>
  <LI id=3Dcp_article_email><A title=3D"Email this article"=20
  =
href=3D"http://www.dailycollegian.com/home/index.cfm?event=3DdisplayEmail=
ArticleForm&amp;uStory_id=3D5f801bbd-252d-4324-85cd-2f1ab8ada496">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>Members of the Sigma Phi Epsilon fraternity =
raised around=20
$900 for the Youth AIDS campaign through a basketball tournament this=20
weekend.<BR><BR>Organizers and fraternity brothers Mike Fox and Jeremy =
Rumeld=20
hosted 18 teams on Saturday afternoon that each paid between $15 and $25 =
to=20
participate. The teams vied for the top prize that included $100 in =
cash, a pair=20
of sneakers for each player from G-Force Athletics and two cases of =
Rockstar=20
energy drinks. <BR><BR>G-Force, Rockstar and Campuslive.com were top=20
sponsors.<BR><BR>Each team could match three players against another =
team's=20
three. Two substitutes were permitted per team.<BR><BR>The difference in =
funds=20
raised and those from entry fees came from spectators who wandered =
towards the=20
Southwest Residence Area basketball courts, drawn in by DJ Adam Gabel's =
sirenic=20
spinning.<BR><BR>Participants and spectators alike enjoyed =
characteristically=20
superb late summer weather.<BR><BR>In the end, the "Goons" won the top =
prize,=20
but Fox said, "We were just happy to organize a philanthropic event that =
so much=20
of the student body was able to enjoy."<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.dailycollegian.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.dailycollegian.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=3D3443816&cb=3D"+pcrandom;=0A=
</SCRIPT>
<NOSCRIPT><IMG height=3D1=20
src=3D"http://admanager2.broadbandpublisher.com/storyImage.adp?iStory_ID=3D=
3443816"=20
width=3D1> </NOSCRIPT></DIV>
<DIV id=3Drelated_stories>
<UL></UL></DIV>
<DIV id=3Dcommentpolicy><I>The Massachusetts Daily Collegian has an =
'open door'=20
policy with regards to reader comments. In the interest of facilitating =
an open=20
discourse, comments are not screened or edited for spelling, mechanics =
or=20
content. Comments on our website cannot be verified by The Collegian and =
in no=20
way represent the opinions of The Massachusetts Daily Collegian or its=20
staff.</I><BR></DIV>
<DIV id=3Dcomments>
<P></P>
<SCRIPT language=3DJavascript>=0A=
Effect.OpenUp =3D function(element) {=0A=
     element =3D $(element);=0A=
     new Effect.BlindDown(element, arguments[1] || {});=0A=
}=0A=
Effect.CloseDown =3D function(element) {=0A=
     element =3D $(element);=0A=
     new Effect.BlindUp(element, arguments[1] || {});=0A=
}=0A=
function toggleNotifyOption(ecb) {=0A=
	if (GetCookie('ISLOGGEDIN') =3D=3D 0 || GetCookie('ISLOGGEDIN') =3D=3D =
null) {=0A=
		if (!ecb.checked) {=0A=
			Effect.CloseDown('notloggedinlabel', {duration: .1});=0A=
		} else {=0A=
			Effect.OpenUp('notloggedinlabel', {duration: .1});=0A=
		}=0A=
	}=0A=
}=0A=
</SCRIPT>

<DIV id=3Dpostform name=3D"postform"></DIV>
<H2>Be the first to comment on this story</H2>
<FORM name=3DcommentForm onsubmit=3Dthis.submitbutton.disabled=3Dtrue;=20
action=3D/home/index.cfm?event=3DsaveArticleComment method=3Dpost>
<DIV class=3Dgraybox>
<DIV class=3Dpost_comment_text>
<DIV class=3Dcp_form>
<UL class=3Dcp_clear>
  <LI><LABEL>Name: (required) </LABEL><INPUT class=3Dcp_text_input =
maxLength=3D75=20
  name=3DvchReaderName>=20
  <LI><LABEL>Email: (required)</LABEL> <INPUT class=3Dcp_text_input =
maxLength=3D255=20
  name=3DvchReaderEmail>=20
  <LI style=3D"PADDING-LEFT: 135px; FONT-SIZE: 0.9em; COLOR: #666">NOTE: =
Email=20
  address will not be published=20
  <LI><LABEL>Website: </LABEL><INPUT class=3Dcp_text_input =
maxLength=3D255=20
  name=3DvchReaderWebsite> </LI></UL></DIV>
<P class=3Dcp_check><INPUT id=3DbNotify =
onclick=3DtoggleNotifyOption(this);=20
type=3Dcheckbox value=3D1 name=3DbNotify> <LABEL for=3DbNotify>Notify me =
of followup=20
comments via e-mail</LABEL></P>
<DIV class=3Dcp_alert id=3Dnotloggedinlabel style=3D"DISPLAY: none">
<DIV align=3Dcenter><IMG alt=3D"Email notify doesn't work unless you are =
logged in."=20
src=3D"http://www.dailycollegian.com/media/assets/icons/alert.gif"=20
align=3DabsMiddle> Email notify will not work because you are not =
currently logged=20
in.<BR><A style=3D"TEXT-DECORATION: underline"=20
href=3D"http://www.dailycollegian.com/user/index.cfm?event=3DdisplayLogin=
&amp;successURL=3D%252Fhome%252Findex%252Ecfm%253Fevent%253DdisplayArticl=
e%2526ustory%255Fid%253D5f801bbd%252D252d%252D4324%252D85cd%252D2f1ab8ada=
496%2523postform">Click=20
here to quickly login or create a free account.</A></DIV></DIV>
<P>Type your comment below (html not allowed)</P>
<P><TEXTAREA class=3Dliquid name=3Dmessage_body rows=3D10 =
wrap=3Dvirtual></TEXTAREA></P>
<P><INPUT id=3DbNoSpamPolicy type=3Dcheckbox value=3D1 =
name=3DbNoSpamPolicy> &nbsp;=20
<STRONG><LABEL for=3DbNoSpamPolicy>I am not posting =
spam.</LABEL></STRONG> I=20
understand posting spam or other comments that are unrelated to this =
article=20
will cause my comment to be flagged for deletion and possibly cause my =
IP=20
address to be permanently banned from this server.</P></DIV></DIV>
<DIV class=3Dpost_comment_button><INPUT type=3Dsubmit value=3DPost =
name=3Dsubmitbutton>=20
</DIV><INPUT type=3Dhidden value=3D1 name=3DbuttonPushed> <INPUT =
type=3Dhidden=20
value=3D5f801bbd-252d-4324-85cd-2f1ab8ada496 name=3Dustory_id> <INPUT =
type=3Dhidden=20
name=3Dparent_comment_id> <INPUT type=3Dhidden=20
value=3D/home/index.cfm?event=3DdisplayArticle&amp;ustory_id=3D5f801bbd-2=
52d-4324-85cd-2f1ab8ada496=20
name=3DstoryURL> </FORM></DIV>
<DIV id=3Dissuesummary>
<TABLE cellSpacing=3D0 cellPadding=3D4 width=3D"100%" border=3D0>
  <TBODY>
  <TR>
    <TD vAlign=3Dtop width=3D"50%">
      <H3><A class=3Dissuesummarysection=20
      =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/News/">News</A=
></H3>
      <UL>
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/News/Studio.Ar=
ts.Building.Hosts.Lecture.On.Artists.Business-3578542.shtml">Studio=20
        Arts Building hosts lecture on artists, business</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/News/What-Was.=
That-3578545.shtml">What=20
        was that?</A> </LI></UL><!-- This will visually split the =
results into two groups.. a left and right. -->
      <H3><A class=3Dissuesummarysection=20
      =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/ArtsLiving/">A=
rts=20
      &amp; Living</A></H3>
      <UL>
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/ArtsLiving/Eni=
gks.Set.Short.And.Bittersweet-3578409.shtml">Enigk's=20
        set short and bittersweet</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/ArtsLiving/ear=
th.Relates.To.All-3578412.shtml">'Earth'=20
        relates to all</A> </LI></UL><!-- This will visually split the =
results into two groups.. a left and right. --></TD>
    <TD vAlign=3Dtop width=3D"50%">
      <H3><A class=3Dissuesummarysection=20
      =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/EditorialOpini=
on/">Editorial=20
      / Opinion</A></H3>
      <UL>
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/EditorialOpini=
on/I.Love.You.You.Hurt.Me-3578470.shtml">I=20
        love you, you hurt me</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/EditorialOpini=
on/Scoring.Morals.By.Better.Role.Models-3578472.shtml">Scoring=20
        morals by better role models</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/EditorialOpini=
on/Back-Up.Your.Boycott.Against.Both.Bigots.And.Business-3578473.shtml">B=
ack=20
        up your boycott against both bigots and business</A> =
</LI></UL><!-- This will visually split the results into two groups.. a =
left and right. -->
      <H3><A class=3Dissuesummarysection=20
      =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/">Sport=
s</A></H3>
      <UL>
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/Umass.L=
ooks.For.Progress.Over.Break-3578550.shtml">UMass=20
        looks for progress over break</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/Track.R=
owing.Skiing.Teams.Almost.Set.To.Start.Seasons-3578552.shtml">Track,=20
        rowing, skiing teams almost set to start seasons</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/Next-Mo=
nths.Progress.Crucial.For.Umass-3578564.shtml">Next=20
        month's progress crucial for UMass</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/Meets.T=
o.Help.Prep.Swimmers.For.A10s-3578568.shtml">Meets=20
        to help prep swimmers for A-10s</A>=20
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Sports/Two-Guy=
s.One.Column-3578570.shtml">Two=20
        guys, one column</A> </LI></UL><!-- This will visually split the =
results into two groups.. a left and right. -->
      <H3><A class=3Dissuesummarysection=20
      =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Features/">Fea=
tures</A></H3>
      <UL>
        <LI><A class=3Dissuesummaryheadline=20
        =
href=3D"http://www.dailycollegian.com/home/news/2008/12/12/Features/Putti=
ng.Five.College.Libraries.To.The.Test-3578597.shtml">Putting=20
        Five College libraries to the test</A> </LI></UL><!-- This will =
visually split the results into two groups.. a left and right. =
--></TD></TR></TBODY></TABLE></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> | <A=20
href=3D"http://www.dailycollegian.com/user/privacypolicy/">Privacy =
Policy</A>=20
(8/15/07) | <A href=3D"http://www.dailycollegian.com/user/terms">Terms =
of Use</A>=20
(4/28/08)<BR><A href=3D"http://www.dailycollegian.com/user/submission"=20
target=3D_blank>Content Submission Agreement</A> (8/23/07) | <A=20
href=3D"http://www.dailycollegian.com/user/copyright" =
target=3D_blank>Copyright=20
Compliance Policy</A> (8/25/07) | <A=20
href=3D"http://www.dailycollegian.com/user/rssterms" target=3D_blank>RSS =
Terms of=20
Use</A> </DIV></DIV></DIV></DIV>
<DIV id=3Dflan_ads>
<DIV class=3Dgutters>
<DIV class=3Dcp_ad id=3Dbox_300_250_13>
<H4 class=3Dad_slug>Advertisement</H4>
<SCRIPT language=3DJavascript>
			showNetworkBanner(13);
		</SCRIPT>
</DIV>
<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=3D874&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Edailycollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3D5307nflb3p&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D874&amp;javascriptIncludeMode=3D0&amp;iPosition=3D2"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV class=3Dcontent>
<H4>Poll</H4>
<FORM name=3Dvoteform action=3D/poll/index.cfm?event=3DcastVote =
method=3Dpost>
<DIV class=3Dpollquestionstyle>How will you cope with finals?</DIV>
<DIV id=3Dpoll_answers>
<DIV><INPUT id=3Dpoll_answer_146254 type=3Dradio value=3D146254 =
name=3Dpoll_answer_id>=20
<LABEL for=3Dpoll_answer_146254>Finals!? But it's only...oh holy crap =
finals are=20
next week!</LABEL> </DIV>
<DIV class=3Dpoll_even><INPUT id=3Dpoll_answer_146255 type=3Dradio =
value=3D146255=20
name=3Dpoll_answer_id> <LABEL for=3Dpoll_answer_146255>Binge =
drinking</LABEL> </DIV>
<DIV><INPUT id=3Dpoll_answer_146256 type=3Dradio value=3D146256 =
name=3Dpoll_answer_id>=20
<LABEL for=3Dpoll_answer_146256>Denial</LABEL> </DIV>
<DIV class=3Dpoll_even><INPUT id=3Dpoll_answer_146257 type=3Dradio =
value=3D146257=20
name=3Dpoll_answer_id> <LABEL for=3Dpoll_answer_146257>Positive =
thinking, lots of=20
sleep and healthy studying</LABEL> </DIV>
<DIV><INPUT id=3Dpoll_answer_146258 type=3Dradio value=3D146258 =
name=3Dpoll_answer_id>=20
<LABEL for=3Dpoll_answer_146258>Caffeine, caffeine and more =
caffeine</LABEL>=20
</DIV>
<DIV class=3Dpoll_even><INPUT id=3Dpoll_answer_146259 type=3Dradio =
value=3D146259=20
name=3Dpoll_answer_id> <LABEL for=3Dpoll_answer_146259>Finals are a =
piece of cake=20
for me</LABEL> </DIV></DIV><A class=3Dfaux_button=20
href=3D"javascript:document.voteform.submit();">Submit Vote</A>=20
<P id=3Dview_results><A=20
href=3D"http://www.dailycollegian.com/poll/index.cfm?event=3DdisplayPollR=
esults">View=20
Results</A></P></FORM></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=3D874&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Edailycollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3D5307nflb3p&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D874&amp;javascriptIncludeMode=3D0&amp;iPosition=3D3"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT></DIV>
<DIV id=3Dsyndication_feeds>
<H2>24 Hour News</H2>
<UL></UL></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=3D874&amp;callingSite=3Dwww.dailycolle=
gian.com"=20
target=3Dnew><IMG=20
src=3D"http://admanager3.collegepublisher.com/runtime/noScriptAdImpDispla=
y.cfm?iposition=3D2&amp;ipaper_id=3D874"=20
border=3D0> </A></NOSCRIPT></DIV></DIV></DIV></DIV>
<DIV id=3Dflan_nav>
<DIV class=3Dgutter>
<H4>Interact</H4>
<UL>
  <LI><A title=3Dlogin =
href=3D"http://www.dailycollegian.com/login/">Login</A>=20
  <LI><A title=3DRegister =
href=3D"http://www.dailycollegian.com/register/">Email=20
  Edition</A>=20
  <LI><A title=3D"About Us" =
href=3D"http://www.dailycollegian.com/about">About=20
  Us</A>=20
  <LI><A title=3DForums =
href=3D"http://dailycollegian.com/messageboard/">Forums</A> <!--  <li><a =
href=3D"/calendar" title=3D"Events Calendar">Events Calendar</a></li>  =
-->
  <LI><A title=3DPodcasts=20
  href=3D"http://www.dailycollegian.com/podcasts">Podcasts</A>=20
  <LI class=3Drss><A title=3DSyndication=20
  href=3D"http://www.dailycollegian.com/syndication">Syndication</A>=20
  <LI><A title=3D"Letter to the Editor"=20
  href=3D"http://www.dailycollegian.com/lettertoeditor">Letter to the =
Editor</A>=20
  <LI><A title=3DClassifieds=20
  href=3D"http://dailycollegian.campusave.com/">Classifieds</A>=20
  <LI><A title=3D"Advertising Rates"=20
  href=3D"http://www.dailycollegian.com/advertising">Ad Rates</A>=20
  <LI><A title=3DArchives=20
  href=3D"http://www.dailycollegian.com/archives">Archives</A>=20
  <LI><A title=3DSearch =
href=3D"http://www.dailycollegian.com/search">Search</A>=20
  </LI></UL>
<H4>Special Issues</H4>
<UL>
  <LI><A =
href=3D"http://files.dailycollegian.com/Minute/Front%20Page.html">The=20
  Minute 2008 Online</A>=20
  <LI><A=20
  =
href=3D"http://dailycollegian.glexia.net/thescoreonline07/Final%20Templat=
e%20Score%20'07%20pg1.html">The=20
  Score 2007 Online</A>=20
  <LI><A=20
  =
href=3D"http://www.dailycollegian.com/media/storage/paper874/news/2008/03=
/27/Multimedia/Umass.Yakback-3287570.shtml">UMass=20
  YakBack</A> </LI></UL>
<H4>Blogs</H4>
<UL>
  <LI><A href=3D"http://dailycollegian.blogspot.com/">News Blog</A>=20
  <LI><A title=3D"Sports Blog"=20
  href=3D"http://blog.masslive.com/dailycollegiansports/">Sports =
Blog</A>=20
  <LI><A title=3D"Arts &amp; Living Blog"=20
  href=3D"http://allaccessarts.blogspot.com/">Arts &amp; Living Blog</A> =

  <LI><A href=3D"http://edopblog.blogspot.com/">Ed-Op Blog</A> =
</LI></UL>
<H4>Links</H4>
<UL>
  <LI><A href=3D"http://www.umass.edu/">UMass Amherst</A>=20
  <LI><A href=3D"http://www.amherstwire.com/">Amherst Wire</A>=20
  <LI><A href=3D"http://www.campuslive.com/umass">Campus LIVE</A>=20
  <LI><A=20
  =
href=3D"http://boston.alltop.com/%3EAlltop:%20Boston%20News%3C/a%3E%3C/li=
%3E%3Cli%3E%3Ca%20href=3D"=20
  boston.alltop.com http:>Alltop: Boston News</A>=20
  <LI><A href=3D"http://www.collegepublisher.com/">College Publisher</A> =
</LI></UL>
<H4>Print PDF</H4>
<UL class=3Dflan_pdf></UL>
<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=3D874&amp;javascriptIncludeMo=
de=3D0&amp;callingSite=3Dwww%2Edailycollegian%2Ecom"=20
target=3Dnew><IMG=20
src=3D"http://admanager2.broadbandpublisher.com/newspaperBanners/showAban=
ner.adp?vchSerialNumber=3D5307nflb3p&amp;iSection_Id=3D&amp;iStory_Id=3D&=
amp;iPaper_Id=3D874&amp;javascriptIncludeMode=3D0&amp;iPosition=3D4"=20
border=3D0></A></CFOUTPUT> </NOSCRIPT>
<H4>Collegian Partners</H4>
<UL>
  <LI><A=20
  =
href=3D"http://www.sovereignbank.com/personal/banking/checking/default.as=
p">Student=20
  Checking Account</A>=20
  <LI><A href=3D"http://www.bills.com/debt-consolidation/">Debt =
Consolidation</A>=20
  <LI><A href=3D"http://www.tracenumber.com/5xx.html">Reverse Phone =
Search</A>=20
  <LI><A href=3D"http://www.fastpaydaylending.co.uk/">Payday Loan</A>=20
  <LI><A href=3D"http://www.movingcompanies.tv/">Moving Companies</A>=20
  <LI><A href=3D"http://www.lisatener.com/">Writing Coach</A>=20
  <LI><A href=3D"http://www.dailycollegian.com/maritimelawyer">Maritime =
Lawyer</A>=20
  </LI></UL></DIV></DIV></DIV></DIV>
<DIV id=3Dflan_footer>
<P>=C2=A9
<SCRIPT type=3Dtext/javascript charset=3Dutf-8> var d =3D new Date();	=
document.write(d.getFullYear());</SCRIPT>
 <A title=3D"The Daily Collegian"=20
href=3D"http://www.dailycollegian.com/"><STRONG>The Daily=20
Collegian</STRONG></A></P>
<P>Powered by <A title=3D"Powered by College Publisher"=20
href=3D"http://collegepublisher.com/"><STRONG>College=20
Publisher</STRONG></A></STRONG></P></DIV></DIV><!--aftertable-->
<DIV id=3Dglobal_footer>College Publisher powered by <SPAN=20
id=3Dlogo_mtvu>mtvU</SPAN> and <SPAN id=3Dlogo_mtvn>MTV =
Networks</SPAN></DIV><!--cpbpeof--></BODY></HTML>

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://pixel.quantserve.com/pixel/p-94wNw88f65Rhk.gif?labels=Viacom%20Domestic%2CMTVN%20Digital%2CMTVN%20Music%20and%20Logo%2CMTVN%20Music%20Group%2CmtvU%20Online%2CCMN

R0lGODlhAQABAAAAACwAAAAAAQABAID///8AAAACAkQBADs=

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.dailycollegian.com/media/assets/images/ncbar_mtvu.gif

R0lGODlhEAAQANUAALC0sXl2df/EvfKPjf/9/05LSysnK///9O37/P7m5P7s9JWNjvL+/I11cv/2
/Pezus62sOjq2+vo6fzz7dVNVPqpq/iqufTy8S4WI/r//4GFgFs/Lf/6/vfWz/L98+ixtP/o3f/1
9CMZGef55/387fr/+hgVFvn6+UU2M//69tqQg///+xslJeSknCMfIAweIWNlT/LGxV1QZGhdWc/R
0G9lb6WamPr4/UNEQPrw1eq1r+H27+O9v+nw0fHy7Pj/5CH5BAAAAAAALAAAAAAQABAAAAblQMLl
JPFNJqnJbncZKTIcQsHkcs14CRxGxGpYHBmpyyBqJCAFDIalifAcnJrBJQqkQoU5qvETJG4dDSIm
GisXOGQNFAMCORwcC1UBGQwFIi4QFRQqPSUlGpInlSwuACQtDwcMDKAuAQQ3eS8AIQ8hDgQnC1QB
JR4FLBgABxYkK2EaJgY1Dgo4LywAKxUHHicEAAbKNTIYVDQHDyMMBAQSNS5UdAaFBx8HBLjmNgUb
GzAACCsRMSkcGSceJdChYkCFDikUQEiwAkyYeAlaFBzAw0KCCSVyZUCQIUwKEB06RAhxoBqHIAA7

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://media.collegepublisher.com/media/weatherbug/weatherbugsforchannelbar/01003.png

iVBORw0KGgoAAAANSUhEUgAAAIkAAAAgCAIAAACpVcy4AAAHv0lEQVR42u1Z2U9TWRz2WeOj8cX4
YIzRGGOM7z6Y+BdojP8BISzKyOIIYZGwCEWkFgYKDDItO5UCFkqhrIXu+0rpQikIoiOIM5k4T/O1
p1xrF3opuDC5X5qb37k992zf+W3nHFtm8LPiGLMEDDcMGG6ODnw+H8PND4Pa6BqctLUJTVyB8Xeh
aUBqU+qX9q03fD4/NTUVT5qf1dbWZmVlfdOJFRcXY0h6vR6ywWCIkIuKipJr9juMHFAZljjdhqxa
RTpLHvhVh56ZNfJnfJ1M49wHNyUlJZgwnjT7Tg3iUKbB4/EKCwuj33d1daELgUAAub+/P0Lu6OhI
rotDHHk8DExYH4CVIBMsnrFzdHFg0tkldtR2Gsn7DJa8c8RCixur1Zq6C8jfmZt4TUFL8P7p06eQ
KysrI2SiQ0l08a256R+3Ei1pGrC5/Vv/BvF5F2tvP/JHnKTCyyFTYm5ev36N4bJYLDwhU/+lpaUJ
hcKMjIzS0lKJRJKbm/vw4UOxWEzNsKysDHUKCgpkMhleejyetra2+/fv4xO0ZjabqZocDufRo0co
okE0gq+qq6upf+OtF8waatrtdjxRgZKJQYvZHZCdnY06OTk54+Pj0V0kPXI6gLHKCNqu0QXf5/iY
061mBqt1jph7xVbuK2OHyDyx4HC5vZHcsNlswgqekCO2m0KhIALZyJg59ZdWq5XL5RDy8/PxsrW1
FbJKpdJoNBCwslTN6elpqVSKYnp6OopLS0t0VJCYtefPn+NZV1dHycSgxeyOAIuLN3l5efH0JomR
J4TH6y1v02LFeaLFfxJheMYbckJh3qiEq55RLn7hxuv1ZmZmYr9AwFYiQsSU9hCIjA8h4NvwTYpi
9NJXVVWhWFFRYTKZEnJDdgNp3+FwEO2hDFrM7ubm5qANlJ7tbdP2NfKEQAyGJc5mKzc2t/5OhJ1P
f1XxTIVcbduQVTBuezloLmhUERc1Pu8IcTM7O5v6NbBT9ssNkYlOEGopCxMxQ2gMl8vFG6wgZTn3
WAISrYFRyPA34RFazO6gK3hpsVjC+w3vIumRJ4RQagM3DX3mnZ2dTzSw+X77zw8fUXl7e3tra2tt
fbNVaA2wW6c029wBbmBnMQLiRUQiEWQoeHLc1NfXQxgYGMC+xnK0tLTEnCHowRsoKykSi+p0Ovcw
a4jNICNOC4/QYnZHNABKSfolCx3exUFGHg8K/RIymF/rAxu/f8L5MVlsbW2zeAY0whcFhn0M+5ea
A9luxAQnwY3L5QKvxNVjd8O8RM+wpqYG/8JpUUEH/DDiAmJG4pk15DQRWU687ohNg1vCckMbKFdP
dZH0yONhdNb+gOQxCI6r5VLV8ocDYF7vQ1OlLRrmXOCg0FvcWcGUhdOjn1W77a61jbfv3u/iXRBT
U1NE2NzcfJ8IruV1tAYVDHCTyoA2orlBEIxtXsPTra6ubmxsbIbhzfo6bAM0cmJiAs/BwUHU30wE
i3MVDRY0qBi9OSjqewPuYXjasb6+vhEFo9EoCKKvrw+meIMGXk04wM0zvo7h5qBoFZqwlO3DljcR
WFtzu93QGMQyTU1NnZ2dkJELr62tvokPvXU554USZI/NORhuDooZpRPcZD1TSGRO77J/xe9fWfFD
8Cz73d4V6A0viO7uboSOCBT9fj+sn9PlE4zb3d5AZfKJy7Mili3mvVChNdYfOk8wmj8C3CDiunr1
KmKt0FZtbb158yb1L4fDuXXrVllZWShf20VEIyMjI5cuXSKHh2fPnr18+XJ7e3t0kX6DFJoERpLe
P25QPWnRlDRrHterMmsU0gUHfMzCwoJEIlGr1QjQMYWVlZUppTO/QVXcrEHKieeT5sAnOWwlifSq
2nX2Rc9Rur/BBrx9+zYEZMoXLlwg6Q7BiRMnYMqPHz9OLWXMFu7du9fY2AghJSWFz+drNJqTJ09G
F+k3SAFbvHvUCj5Cpy/BX0ol0ns7OThGRODz+ZCfICLgiyzkwI3Ta+gQWb6c2VTLi7nqfonV7fEe
sbs1uVx+7tw5CHfu3OFyuRFahW1eWlq6x1LqdDow+tX9ikp18eLFmEU6DUZjccmrMbrUYT+ny0uY
o87AukfNabtnaM0CI/SDqmywuDzeo3nveebMGaFQCAG7+9SpU1ho+NjY5+qxTBBSXXLsTeHu3bvl
5eXxigkbpAnKOhFUvNSGFIUl7xUnvos5GtwgfQM9xOBgj8/Pz58+fTreUkYeD3s8165do9wVueS9
fv16vGLCBumpkaep34jsJ/zl+Lzjl+dKqE42W6k3u/4n3MBwgxUIV65cAU/wOtAemkvJZrPD73NB
LZz/8PBwzOKhcCNTO+HeoRyDk7aIv0w2t2TeoTW56LRzBLgpKiqCmyFXPlhEGLTz58/39PTQXEo4
j/Drotzc3Lwgbty4EV08ODdDk7bMmpCHn1IELmMWFwNPrVZLjukQEdBsislvDvd4zRUihiXPqJGr
DAEaZDKZSCRSKBQzMzNQeoTUDDc/ADBWyGzIPSZSFngdBGlQFLFYDK/W0dGBjAcZKBW5Mdx8V8Dh
l3DV+b+pBqW2YCTihh1G5tsUBGSiQww3PwYej9fp+hIWQm/GxsbI4c3Q0BDcj9vtZrj5KQB/A3Uh
/kYqlTL+5ieCw+GAg0GwDm5QtNlsND/8D5pVOcnraO61AAAAAElFTkSuQmCC

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://stats.broadbandpublisher.com/pageCounter.adp?iPaper_id=874&random=&uid=

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=11&ipaper_id=874

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=5307nflb3p&iSection_Id=&iStory_Id=&iPaper_Id=874&javascriptIncludeMode=0&iPosition=1

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/storyImage.adp?iStory_ID=3443816

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.dailycollegian.com/media/assets/icons/alert.gif

R0lGODlhEAAQANUvAKh0IdqnKxgYGP/ghP/MM/7KM+yzL/vGMvO7MPa/MeWpLvfAMfrGMtydLNiX
K+etLt+hLfjCMu60MPC5MO61L/nEMvzGMtORKuCkLeesLumuL/G6MP7KMuaqLffCMe+3MOOmLfrF
MuOnLv3KM+uwLvzJM96fLf3JMvS+MeKlLvO8MdmaK/zIM9aVK9ubK////wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAC8ALAAAAAAQABAAAAZkwJdw
SCwahYHA8ZhcFgMDAsA5hEqpL+voMHVCBYJIlxkFJybj56AARkjS1SgL/CEp4NnBKQQ2ZFJwUAUW
HioUGiIQLmlQJRUoYB0YDQ5jUBwMCxsGDyAmKy0XXQEApaanplhGQQA7

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=5307nflb3p&iSection_Id=&iStory_Id=&iPaper_Id=874&javascriptIncludeMode=0&iPosition=2

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=5307nflb3p&iSection_Id=&iStory_Id=&iPaper_Id=874&javascriptIncludeMode=0&iPosition=3

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager3.collegepublisher.com/runtime/noScriptAdImpDisplay.cfm?iposition=2&ipaper_id=874

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://admanager2.broadbandpublisher.com/newspaperBanners/showAbanner.adp?vchSerialNumber=5307nflb3p&iSection_Id=&iStory_Id=&iPaper_Id=874&javascriptIncludeMode=0&iPosition=4

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/css/global.css?v48

BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
A {
	TEXT-DECORATION: none
}
STRONG {
	FONT-WEIGHT: bold
}
IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#cprightcol A {
	DISPLAY: block
}
#cpleftcol A {
	DISPLAY: block
}
#cprightcol H2 {
	DISPLAY: none
}
#cpleftcol H2 {
	DISPLAY: none
}
A.subnav:link {
	PADDING-LEFT: 1em; FONT-SIZE: 11px
}
A.subnav:visited {
	PADDING-LEFT: 1em; FONT-SIZE: 11px
}
BODY {
	MARGIN: 0px
}
BODY {
	FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333
}
P {
	FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333
}
TD {
	FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333
}
LI {
	FONT: 12px/14px Arial, Helvetica, sans-serif; COLOR: #333
}
H1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 0.2em; PADDING-TOP: 0px
}
H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 0.2em; PADDING-TOP: 0px
}
H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 4px; FONT: bold 18px/1.2em Arial, Helvetica, sans-serif; =
PADDING-TOP: 4px
}
H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 10px; PADDING-TOP: 0px
}
H5 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 10px; PADDING-TOP: 0px
}
P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 10px; PADDING-TOP: 0px
}
.smalltext {
	FONT-SIZE: 0.8em
}
.nobottommargin {
	MARGIN-TOP: 1em; MARGIN-BOTTOM: 0px
}
.graybox {
	PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px solid; PADDING-LEFT: 8px; =
BACKGROUND: #eee; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; =
BORDER-BOTTOM: #aaa 1px solid
}
.note {
	BORDER-RIGHT: #aaa 1px dashed; PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px =
dashed; PADDING-LEFT: 8px; BACKGROUND: #fff; PADDING-BOTTOM: 8px; =
MARGIN: 0px; BORDER-LEFT: #aaa 1px dashed; PADDING-TOP: 8px; =
BORDER-BOTTOM: #aaa 1px dashed
}
.smallnote {
	BORDER-RIGHT: #aaa 1px dashed; PADDING-RIGHT: 8px; BORDER-TOP: #aaa 1px =
dashed; PADDING-LEFT: 8px; FONT-SIZE: 0.8em; BACKGROUND: #fff; =
PADDING-BOTTOM: 8px; MARGIN: 0px; BORDER-LEFT: #aaa 1px dashed; =
PADDING-TOP: 8px; BORDER-BOTTOM: #aaa 1px dashed
}
A.button:link {
	BORDER-RIGHT: #eee 1px outset; PADDING-RIGHT: 8px; BORDER-TOP: #eee 1px =
outset; DISPLAY: inline; PADDING-LEFT: 8px; BACKGROUND: #eee; =
PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #eee 1px outset; =
PADDING-TOP: 4px; BORDER-BOTTOM: #eee 1px outset; TEXT-ALIGN: center; =
TEXT-DECORATION: none
}
A.button:visited {
	BORDER-RIGHT: #eee 1px outset; PADDING-RIGHT: 8px; BORDER-TOP: #eee 1px =
outset; DISPLAY: inline; PADDING-LEFT: 8px; BACKGROUND: #eee; =
PADDING-BOTTOM: 2px; MARGIN: 0px; BORDER-LEFT: #eee 1px outset; =
PADDING-TOP: 4px; BORDER-BOTTOM: #eee 1px outset; TEXT-ALIGN: center; =
TEXT-DECORATION: none
}
A.button:hover {
	BACKGROUND: #ccc
}
A.button:active {
	BORDER-RIGHT: #eee 1px inset; BORDER-TOP: #eee 1px inset; BACKGROUND: =
#eee; BORDER-LEFT: #eee 1px inset; BORDER-BOTTOM: #eee 1px inset
}
INPUT.liquid {
	WIDTH: 95%
}
TEXTAREA.liquid {
	WIDTH: 95%
}
FORM TABLE.form_table TD {
	PADDING-BOTTOM: 5px
}
.form_error {
	BORDER-RIGHT: #cc0000 1px dotted; PADDING-RIGHT: 5px; BORDER-TOP: =
#cc0000 1px dotted; PADDING-LEFT: 5px; FONT-SIZE: 15px; PADDING-BOTTOM: =
5px; MARGIN: 5px 5px 15px; BORDER-LEFT: #cc0000 1px dotted; COLOR: =
black; PADDING-TOP: 5px; BORDER-BOTTOM: #cc0000 1px dotted
}
.validation_error {
	COLOR: #cc0000
}
.validation_note {
	PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: #cc0000; =
MARGIN-BOTTOM: 4px; PADDING-BOTTOM: 2px; COLOR: #fff; PADDING-TOP: 2px
}
FORM {
	MARGIN-BOTTOM: 0px
}
.top_bar {
	BACKGROUND: #eeeeee; BORDER-BOTTOM: #999999 1px solid
}
.evenrow {
	PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #edf3fe; =
PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 1px solid
}
TR.evenrow {
	BORDER-TOP: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid
}
.oddrow {
	PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #fff; =
PADDING-BOTTOM: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 1px solid
}
.forumname {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 10px; COLOR: blue; PADDING-TOP: 0px
}
.adminbutton {
	FONT-SIZE: 12px; WIDTH: 85px; FONT-FAMILY: arial, verdana, sans-serif
}
#cp_pdf_results LI {
	PADDING-RIGHT: 10px; PADDING-LEFT: 30px; LIST-STYLE-POSITION: inside; =
FONT-SIZE: 1.1em; PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px; =
BORDER-BOTTOM: #666 1px solid; LIST-STYLE-TYPE: none
}
LI.pdf_oddrow {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/pdfimage.gif) =
#f5f5f5 no-repeat 5px 50%
}
LI.pdf_evenrow {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/pdfimage.gif) =
#edf3fe no-repeat 5px 50%
}
H4.cp_link_underline {
	FONT-SIZE: 11px; COLOR: #666; TEXT-ALIGN: right
}
H4.cp_link_underline A {
	COLOR: #666; TEXT-DECORATION: underline
}
#calendar_header {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px
}
.calendar_dark {
	BACKGROUND: #666666; COLOR: #c9c9c9
}
#calendar_border {
	BORDER-BOTTOM: #aaa 1px solid
}
#forum .graybox {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 8px; =
PADDING-TOP: 8px
}
#forum .originalmessage {
	PADDING-RIGHT: 8px; PADDING-LEFT: 8px; BACKGROUND: #eeeeee; =
PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; BORDER-BOTTOM: =
#999999 1px solid; TEXT-DECORATION: none
}
#forum .replymessage_even {
	PADDING-RIGHT: 8px; BORDER-TOP: black 1px solid; PADDING-LEFT: 8px; =
BACKGROUND: #eee; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; =
TEXT-DECORATION: none
}
#forum .replymessage_odd {
	PADDING-RIGHT: 8px; BORDER-TOP: black 1px solid; PADDING-LEFT: 8px; =
BACKGROUND: #fff; PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-TOP: 8px; =
TEXT-DECORATION: none
}
.recordSetBrowser TH {
	BACKGROUND: #eee; TEXT-ALIGN: left
}
.hilite_table {
	BORDER-RIGHT: #666 1px solid; BORDER-TOP: #666 1px solid; BACKGROUND: =
#f3f3f3; BORDER-LEFT: #666 1px solid; BORDER-BOTTOM: #666 1px solid
}
#searchResults H1 {
	MARGIN: -4px 0px 4px; FONT: bold 13px arial, verdana, sans-serif
}
#searchResults H2 {
	MARGIN: 0px 0px 4px; FONT: bold 11px arial, verdana, sans-serif
}
#searchResults {
	MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif
}
#searchResults P {
	MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif
}
#searchResults TD {
	MARGIN: 0px 0px 6px; FONT: 11px arial, verdana, sans-serif
}
#searchResults .oddrow {
	BACKGROUND: #edf3fe
}
#searchResults .evenrow {
	BACKGROUND: #eee
}
#searchResults TD {
	PADDING-RIGHT: 8px; PADDING-LEFT: 8px; PADDING-BOTTOM: 8px; =
PADDING-TOP: 8px
}
#searchResults TH {
	PADDING-LEFT: 7px; BACKGROUND: =
url(http://media.collegepublisher.com/media/images/search_header.gif) =
repeat-x 50% bottom; FONT: bold 11px arial, verdana, sans-serif; COLOR: =
#4b4b4b; HEIGHT: 18px; TEXT-ALIGN: left
}
#searchResults .scorebar {
	BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; BACKGROUND: =
#fff; BORDER-LEFT: #999 1px solid; WIDTH: 50px; BORDER-BOTTOM: #999 1px =
solid
}
#post_form {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px
}
#post_form TD {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px
}
#post_form_inner {
	BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BORDER-LEFT: =
#aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid
}
DL#post_form_inner {
	MARGIN: 0px 5px 5px
}
#post_form_inner DD {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px
}
#post_form_inner DT {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px
}
.graybox DL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
.graybox DT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
.graybox DD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; =
BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none
}
#search_directions_body {
	DISPLAY: none
}
.middletd {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px
}
.texttd {
	PADDING-RIGHT: 4px; BORDER-TOP: #fff 1px solid; PADDING-LEFT: 4px; =
FONT-SIZE: 11px; PADDING-BOTTOM: 4px; COLOR: #58595b; PADDING-TOP: 4px; =
FONT-FAMILY: Arial, Helvetica, sans-serif
}
.toptd {
	BORDER-RIGHT: #fff 1px solid; BORDER-TOP: #fff 1px solid; BORDER-LEFT: =
#fff 1px solid; BORDER-BOTTOM: #fff 1px solid; FONT-FAMILY: Arial, =
Helvetica, sans-serif
}
.buttons {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 3px
}
UL#address {
	MARGIN: 15px 0px
}
UL#address {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#address LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#login FIELDSET {
	BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666 1px =
solid; PADDING-LEFT: 10px; BACKGROUND: #ccc; PADDING-BOTTOM: 10px; =
BORDER-LEFT: #666 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #666 1px =
solid
}
#login DL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#login DT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#login DD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
.graybox DL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
.niceFont {
	FONT-SIZE: 10px; FONT-FAMILY: arial, helvetica, sans-serif
}
#fullcalendar {
	BORDER-RIGHT: #aaa 1px solid; BACKGROUND: #eee; BORDER-BOTTOM: #aaa 1px =
solid
}
#fullcalendar TD {
	BORDER-RIGHT: #aaa 1px; BORDER-TOP: #aaa 1px solid; FONT-SIZE: 10px; =
BORDER-LEFT: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px; FONT-FAMILY: =
arial, helvetica, sans-serif
}
#fullcalendar TD TD {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#cal_header {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: #666; =
PADDING-BOTTOM: 3px; COLOR: #ccc; PADDING-TOP: 3px
}
.dark_head {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: #666; =
PADDING-BOTTOM: 3px; COLOR: #ccc; PADDING-TOP: 3px
}
#cal_header STRONG {
	COLOR: #ccc
}
#cal_header A {
	COLOR: #fff
}
#loggedin_bar {
	BORDER-RIGHT: #eee 1px outset; BORDER-TOP: #eee 1px outset; BACKGROUND: =
#eee; BORDER-LEFT: #eee 1px outset; BORDER-BOTTOM: #eee 1px outset
}
#loggedin_bar IMG {
	PADDING-RIGHT: 4px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#loggedin_bar TD {
	PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 2px; =
PADDING-TOP: 2px
}
#ncbar {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px; BORDER-BOTTOM: #fff 2px ridge
}
#agent99 {
	BORDER-RIGHT: #6a6a6a 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#6a6a6a 1px; PADDING-LEFT: 14px; Z-INDEX: 99; RIGHT: 444px; LEFT: 158px; =
VISIBILITY: hidden; PADDING-BOTTOM: 0px; BORDER-LEFT: #6a6a6a 1px solid; =
WIDTH: 291px; LINE-HEIGHT: 1.4em; PADDING-TOP: 10px; BORDER-BOTTOM: =
#6a6a6a 1px solid; POSITION: absolute; TOP: 31px; BACKGROUND-COLOR: =
#f0f0f0
}
#agent99 TABLE {
	FONT: 12px/14px Arial, Helvetica, sans-serif
}
#agent99 A:link {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#agent99 A:hover {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#agent99 A:active {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#agent99 A:visited {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#formtext {
	WIDTH: 202px
}
#search {
	WIDTH: 54px
}
#cp_extras {
	PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; FONT: 11px =
Arial, Arial, Helvetica, sans-serif; PADDING-TOP: 6px
}
#cp_extras A:link {
	FONT-WEIGHT: bold; COLOR: #000
}
#cp_extras A:visited {
	FONT-WEIGHT: bold; COLOR: #000
}
#cp_extras A:active {
	FONT-WEIGHT: bold; COLOR: #000
}
#cp_extras A:hover {
	FONT-WEIGHT: bold; COLOR: #900
}
A#stafflogin {
	BORDER-RIGHT: #bbdff9 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: =
#bbdff9 1px solid; DISPLAY: block; PADDING-LEFT: 5px; FONT-SIZE: 16px; =
BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/over.jpg) #fff =
repeat-x left bottom; PADDING-BOTTOM: 5px; BORDER-LEFT: #bbdff9 1px =
solid; COLOR: #1a3787; LINE-HEIGHT: 24px; PADDING-TOP: 5px; =
BORDER-BOTTOM: #bbdff9 1px solid; TEXT-ALIGN: center; TEXT-DECORATION: =
none
}
A#stafflogin:hover {
	BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/click.jpg) =
#fff repeat-x left bottom; BORDER-LEFT: #aaa 1px solid; COLOR: #666; =
BORDER-BOTTOM: #aaa 1px solid
}
#log_left {
	FLOAT: left; WIDTH: 230px
}
#log_right {
	FLOAT: left; MARGIN: 0px 0px 0px 10px; WIDTH: 230px
}
#log_both {
	FLOAT: left; MARGIN: 0px 0px 25px
}
FORM#login {
	MARGIN: 0px
}
A.faux_button {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px =
solid; PADDING-LEFT: 4px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/vote.gif) #fff =
repeat-x left bottom; PADDING-BOTTOM: 5px; FONT: 12px/12px =
arial,sans-serif; BORDER-LEFT: #ccc 1px solid; WIDTH: 75px; COLOR: #666; =
PADDING-TOP: 5px; BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: center; =
TEXT-DECORATION: none
}
A.faux_button:hover {
	BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/click.jpg) =
#fff repeat-x left bottom; BORDER-LEFT: #aaa 1px solid; COLOR: #666; =
BORDER-BOTTOM: #aaa 1px solid
}
#poll A {
	MARGIN: 5px 5px 0px
}
.hidden {
	DISPLAY: none
}
#fplead {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 8px; MARGIN: 0px =
0px 8px; PADDING-TOP: 0px; BORDER-BOTTOM: gray 1px dashed
}
TD.fparticle {
	VERTICAL-ALIGN: top; TEXT-ALIGN: left
}
.lead_right .fparticle {
	PADDING-RIGHT: 8px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
.lead_center .fparticle {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 8px
}
.fpimage P {
	PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; MARGIN: =
0px; FONT: 10px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 4px
}
.fpimage IMG {
	DISPLAY: block
}
#cpcentercol {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 10px
}
#fpaio_3 #sidebar IMG {
	BORDER-RIGHT: #aaa 1px solid; BORDER-TOP: #aaa 1px solid; BORDER-LEFT: =
#aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid
}
#fp_feat_1 .fp_feat {
	CLEAR: left; FLOAT: left; MARGIN: 0px 0px 15px
}
#fp_feat_1 DL {
	BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px
}
#fp_feat_1 DD {
	BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px
}
#fp_feat_1 DT {
	BACKGROUND: #ddd; FLOAT: left; MARGIN: 0px 8px 0px 0px
}
#fp_feat_1 DD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#fp_feat_1 DT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#fptemplate2 #fplead {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; =
BORDER-RIGHT-WIDTH: 0px
}
#fptemplate2 #fpfeatured {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; =
BORDER-RIGHT-WIDTH: 0px
}
#fptemplate2 #fpfeatured {
	PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fptemplate2 #fpfeatured H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 4px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; =
PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid
}
#fptemplate2 H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 20px; BACKGROUND: =
url(images/digiarrow.gif) no-repeat 0px 5px; PADDING-BOTTOM: 2px; =
MARGIN: 0px; FONT: bold 14px/1.1em Arial, Helvetica, sans-serif; =
PADDING-TOP: 2px
}
#fptemplate3 #fplead {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; =
BORDER-RIGHT-WIDTH: 0px
}
#fptemplate3 #fpfeatured {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 8px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
VERTICAL-ALIGN: top; PADDING-TOP: 0px; TEXT-ALIGN: left; =
BORDER-RIGHT-WIDTH: 0px
}
#fptemplate3 #fpfeatured {
	PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fptemplate3 #fpfeatured H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 4px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; =
PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid
}
#fptemplate3 H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 20px; BACKGROUND: =
url(images/digiarrow.gif) no-repeat 0px 5px; PADDING-BOTTOM: 2px; =
MARGIN: 0px; FONT: bold 14px/1.1em Arial, Helvetica, sans-serif; =
PADDING-TOP: 2px
}
#fplead H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: =
0px; FONT: bold 18px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: =
0px
}
#fplead P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: =
0px; FONT: 11px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 0px
}
#fpfeatured H3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: =
0px; FONT: bold 16px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: =
0px
}
#fpfeatured P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: =
0px; FONT: 11px/1.1em Arial, Helvetica, sans-serif; PADDING-TOP: 0px
}
.article_byline {
	FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666
}
.article_byline A .image_byline {
	FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666
}
.image_byline A {
	FONT: 9px/1.1em Arial, Helvetica, sans-serif; COLOR: #666
}
#profile_button {
	PADDING-RIGHT: 3px; PADDING-LEFT: 3px; BACKGROUND: =
url(/media/assets/images/profile.gif) repeat-x; PADDING-BOTTOM: 3px; =
COLOR: white; PADDING-TOP: 3px
}
#fplead TD {
	PADDING-BOTTOM: 25px
}
.lead_left {
	MARGIN: 0px 0px 15px; TEXT-ALIGN: left
}
.lead_right {
	MARGIN: 0px 0px 15px; TEXT-ALIGN: left
}
.lead_center {
	MARGIN: 0px 0px 15px; TEXT-ALIGN: left
}
.lead_left TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 8px; PADDING-BOTTOM: 0px; WIDTH: =
100%; PADDING-TOP: 0px
}
.lead_right TD {
	PADDING-RIGHT: 8px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; WIDTH: =
100%; PADDING-TOP: 0px
}
.lead_center .summary {
	MARGIN: 0px 0px 25px
}
.lead_center .fpimage {
	MARGIN: 0px 0px 8px
}
#fp_feat H4 {
	MARGIN: 0px 0px 7px
}
#fp_feat H5 {
	MARGIN: 0px 0px 7px
}
#fp_feat .article_byline {
	MARGIN: 0px 0px 7px
}
.article {
	CLEAR: left; FLOAT: left; MARGIN: 0px 0px 25px; WIDTH: 100%
}
#fp_feat_1 .summary {
	MARGIN: 0px 0px 0px 83px
}
.float_thumbnail {
	FLOAT: left; MARGIN: 0px 8px 0px 0px; WIDTH: 75px
}
#fp_feat_2 TD {
	PADDING-BOTTOM: 25px; WIDTH: 50%
}
#fp_feat_2 TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fp_feat_3 TD {
	PADDING-BOTTOM: 25px; WIDTH: 33%
}
#fp_feat_3 TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#sidebar P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#sidebar H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#sidebar H5 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#sidebar H4 {
	MARGIN: 0px 0px 5px
}
#sidebar P {
	MARGIN: 0px 0px 5px
}
#sidebar H5 {
	MARGIN: 0px 0px 5px
}
#fpaio_3 TD {
	VERTICAL-ALIGN: top
}
#fpaio_3 TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fpaio_3 .fpimage {
	MARGIN: 0px 0px 15px
}
#fpaio_3 #sidebar UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 15px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#fpaio_3 #sidebar LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/images/digiarrow.gif) =
no-repeat left 3px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; =
LIST-STYLE-TYPE: none
}
#fpaio_3 .featured {
	MARGIN: 0px 0px 15px
}
#fpaio_2 TD {
	VERTICAL-ALIGN: top
}
#fpaio_2 TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fpaio_2 .fpimage {
	MARGIN: 0px 0px 15px
}
#fpaio_2 H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; =
PADDING-TOP: 0px; BORDER-BOTTOM: #aaa 1px solid
}
#fpaio_2 #sidebar UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 25px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#fpaio_2 #sidebar LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/images/digiarrow.gif) =
no-repeat left 3px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.5em; =
PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#fpaio_2 .featured {
	MARGIN: 0px 0px 15px
}
#fpaio_1 TD {
	VERTICAL-ALIGN: top
}
#fpaio_1 TD + TD {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#fpaio_1 .fpimage {
	MARGIN: 0px 0px 15px
}
#fpaio_1 .featured {
	MARGIN: 0px 0px 15px
}
#article H2 {
	MARGIN: 0px 0px 7px
}
#article H4 {
	MARGIN: 0px 0px 7px
}
#meta {
	MARGIN: 0px 0px 7px
}
#article H3 {
	MARGIN: 0px 0px 7px; COLOR: #666
}
TD.toptd {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
.toptd A {
	COLOR: #666
}
#poll {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ccc 1px =
solid; PADDING-LEFT: 5px; BACKGROUND: #eee; PADDING-BOTTOM: 5px; MARGIN: =
15px 5px 0px; BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 5px; =
BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: left
}
P#view_results {
	MARGIN: 5px 0px 0px
}
#cp_poll_chart TABLE {
	Z-INDEX: 200! important
}
#cp_poll_legend {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; =
PADDING-TOP: 4px
}
#cp_poll_legend TD {
	PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: white; =
PADDING-BOTTOM: 4px; VERTICAL-ALIGN: top; PADDING-TOP: 4px; TEXT-ALIGN: =
left
}
.cp_poll_color DIV {
	BORDER-RIGHT: #666 1px solid; BORDER-TOP: #666 1px solid; BORDER-LEFT: =
#666 1px solid; WIDTH: 1em; BORDER-BOTTOM: #666 1px solid; HEIGHT: 1em
}
#cp_poll_color_1 {
	BACKGROUND: #bc0303
}
#cp_poll_color_2 {
	BACKGROUND: #0064d1
}
#cp_poll_color_3 {
	BACKGROUND: #ff9800
}
#cp_poll_color_4 {
	BACKGROUND: #108b00
}
#cp_poll_color_5 {
	BACKGROUND: #6435b1
}
#cp_poll_color_6 {
	BACKGROUND: #0614ca
}
#cp_poll_color_7 {
	BACKGROUND: #36c947
}
#cp_poll_color_8 {
	BACKGROUND: #b23da8
}
#cp_poll_color_9 {
	BACKGROUND: #746137
}
#cp_poll_color_10 {
	BACKGROUND: #ec008c
}
#object9975 {
	TEXT-ALIGN: center
}
#object9974 {
	TEXT-ALIGN: center
}
#object9973 {
	TEXT-ALIGN: center
}
#banner_client_1 {
	TEXT-ALIGN: center
}
#banner_network_6 {
	TEXT-ALIGN: center
}
#weather {
	BORDER-RIGHT: #666 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #666 1px =
solid; PADDING-LEFT: 1px; BACKGROUND: #fff; PADDING-BOTTOM: 1px; MARGIN: =
0px auto; BORDER-LEFT: #666 1px solid; WIDTH: 120px; PADDING-TOP: 1px; =
BORDER-BOTTOM: #666 1px solid
}
#weatherblock {
	PADDING-RIGHT: 3px; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 3px; =
PADDING-BOTTOM: 3px; MARGIN: 1px 0px 0px; PADDING-TOP: 3px
}
.art {
	MARGIN: 0px 0px 15px
}
#breadcrumb {
	FONT-SIZE: 10px; MARGIN: 0px 0px 7px
}
#breadcrumb A {
	FONT-SIZE: 10px; MARGIN: 0px 0px 7px
}
#banner_network_1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 0px
}
#loggedin_controlbar {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 0px
}
#article {
	TEXT-ALIGN: left
}
#article H2 {
	LINE-HEIGHT: 1.2em
}
UL#user_art_list_but {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px =
0px 15px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
.user_art_list UL {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px =
solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 15px; =
BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #ccc 1px =
solid
}
.user_art_list STRONG {
	MARGIN: 0px 0px 5px
}
.user_art_list LI {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 3px; =
PADDING-TOP: 3px; LIST-STYLE-TYPE: none
}
.user_art_list LI.even {
	BACKGROUND: #f5f5f5
}
.arch_group A {
	COLOR: #333
}
.arch_group {
	BORDER-TOP: #aaa 1px solid; BORDER-BOTTOM: #aaa 1px solid; TEXT-ALIGN: =
left
}
.arch_group STRONG {
	DISPLAY: block
}
.arch_group .evenrow {
	CLEAR: left; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: =
0px; PADDING-TOP: 0px
}
.arch_group .oddrow {
	CLEAR: left; PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: =
0px; PADDING-TOP: 0px
}
H2 {
	LINE-HEIGHT: 1.2em; TEXT-ALIGN: left
}
H3 {
	LINE-HEIGHT: 1.2em; TEXT-ALIGN: left
}
#banner_loc_3 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
.textad-container .textad {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px =
solid; PADDING-LEFT: 4px; BACKGROUND: #eee; PADDING-BOTTOM: 4px; =
BORDER-LEFT: #ccc 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #ccc 1px =
solid; TEXT-ALIGN: left
}
.textad-container .textad H1 {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; =
PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, =
sans-serif; COLOR: #00f; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; =
TEXT-DECORATION: underline
}
.textad-container .textad H1 A {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; =
PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, =
sans-serif; COLOR: #00f; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; =
TEXT-DECORATION: underline
}
.textad-container .textad P {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; =
PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, =
sans-serif; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; =
TEXT-DECORATION: none
}
.textad-container .textad P A {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; DISPLAY: block; =
PADDING-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 0px; FONT: 12px/1.1em Arial, Helvetica, =
sans-serif; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px; =
TEXT-DECORATION: none
}
.textad-container .textad P.url {
	COLOR: #3f9f3f; TEXT-DECORATION: none
}
.textad-container .textad P.url A {
	COLOR: #3f9f3f; TEXT-DECORATION: none
}
.textad-container .caption A {
	FONT: 10px/1.1em Arial, Helvetica, sans-serif; COLOR: #999
}
#flan_article_top {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! =
important; BORDER-BOTTOM: #ccc 1px solid
}
#flan_article_top UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_article_tools UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_article_bottom UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_article_bottom {
	MARGIN: 15px 0px
}
#flan_article_top UL {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
#flan_article_top LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#flan_article_bottom LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#flan_story_bot_nav {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#flan_article_top LI A {
	COLOR: #333333! important
}
#flan_article_bottom LI A {
	COLOR: #333333! important
}
#flan_story_bot_nav A {
	COLOR: #333333! important
}
#flan_article_top LI A:hover {
	COLOR: #000000! important
}
#flan_article_bottom A:hover {
	COLOR: #000000! important
}
#flan_article_top_left {
	FLOAT: left; WIDTH: 230px
}
#flan_article_top_left LI {
	DISPLAY: inline; MARGIN: 0px 5px 0px 0px
}
#flan_article_top_right {
	FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right
}
#flan_article_bottom_right {
	FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right
}
LI#flan_article_discuss A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) =
no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#flan_article_print A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/print.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#flan_article_email A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/email.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#flan_article_more A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/down.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#flan_article_blog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) =
no-repeat left 50%
}
LI#flan_article_live A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)=
 no-repeat left 50%
}
LI#flan_article_digg A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/digg.gif) =
no-repeat left 50%
}
LI#flan_article_news A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) =
no-repeat left 50%
}
LI#flan_article_deli A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) =
no-repeat left 50%
}
LI#flan_article_yaho A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) =
no-repeat left 50%
}
LI#flan_article_goog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/google.gif) =
no-repeat left 0px
}
LI.flan_article_page DIV {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/page.gif) =
no-repeat left center; FLOAT: right; PADDING-BOTTOM: 0px; PADDING-TOP: =
0px
}
#flan_story_text {
	MARGIN: 0px 0px 15px
}
#flan_article_tools {
	BORDER-TOP: #ccc 1px solid; BACKGROUND: #f5f5f5; MARGIN: 0px 0px 25px
}
P.flan_article_more_tools {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
FONT-WEIGHT: bold! important; FONT-SIZE: 12px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
P.flan_article_tools_header {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
FONT-WEIGHT: bold! important; FONT-SIZE: 11px; PADDING-BOTTOM: 0px! =
important; MARGIN: 0px 0px 8px; PADDING-TOP: 0px! important
}
#flan_article_tools .flan_article_gutter {
	PADDING-RIGHT: 5px! important; PADDING-LEFT: 5px! important; =
PADDING-BOTTOM: 5px! important; PADDING-TOP: 5px! important
}
#flan_article_tools UL {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: =
0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important
}
#flan_article_tools LI {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: =
0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important
}
#flan_article_tools LI A {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 17px! important; FONT-SIZE: 10px! important; =
PADDING-BOTTOM: 3px! important; MARGIN: 0px 3px 0px 0px; PADDING-TOP: =
3px! important
}
#flan_article_tools LI A {
	DISPLAY: inline! important; FONT-SIZE: 10px! important
}
#flan_article_tools_book {
	MARGIN: 0px 0px 0px 85px; BORDER-LEFT: #fff 1px solid
}
#flan_article_tools_blog {
	FLOAT: left! important; WIDTH: 85px! important
}
#flan_article_tools_rss {
	FLOAT: right! important; BORDER-LEFT: #fff 1px solid; WIDTH: 150px! =
important
}
#flan_story_bot_nav {
	MARGIN: 0px 0px 15px; TEXT-ALIGN: right
}
#flan_continued {
	FONT-SIZE: 11px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 17px
}
* HTML #flan_article_tools {
	HEIGHT: 47px
}
#cp_article_top {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! =
important; BORDER-BOTTOM: #ccc 1px solid
}
#cp_article_top UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_tools UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_bottom UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_bottom {
	MARGIN: 15px 0px
}
#cp_article_top UL {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
#cp_article_top LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_article_bottom LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_story_bot_nav {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_article_top LI A {
	COLOR: #333333! important
}
#cp_article_bottom LI A {
	COLOR: #333333! important
}
#cp_story_bot_nav A {
	COLOR: #333333! important
}
#cp_article_top LI A:hover {
	COLOR: #000000! important
}
#cp_article_bottom A:hover {
	COLOR: #000000! important
}
#cp_article_top_left {
	FLOAT: left; WIDTH: 60%
}
#cp_article_top_left LI {
	DISPLAY: inline; MARGIN: 0px 5px 0px 0px
}
#cp_article_top_right {
	FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right
}
#cp_article_bottom_right {
	FLOAT: right; WIDTH: 190px; TEXT-ALIGN: right
}
LI#cp_article_discuss A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) =
no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_print A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/print.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_email A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/email.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_more A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/down.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
#cp_article_tools {
	MARGIN: 1em 0px 25px
}
#cp_article_tools H4 {
	MARGIN: 0px
}
#cp_article_tools H5 {
	FONT-SIZE: 11px; MARGIN: 0px
}
#cp_at_content {
	PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 0px; =
BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/article_bkg.gif=
) #f5f5f5 repeat-x right bottom; PADDING-BOTTOM: 7px; PADDING-TOP: 5px
}
#cp_at_share {
	PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: =
0px; WIDTH: 70%; PADDING-TOP: 0px
}
#cp_at_rss {
	PADDING-RIGHT: 0px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#cp_article_tools #cp_at_content UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_at_content LI {
	DISPLAY: inline; MARGIN: 0px 8px 0px 0px; LIST-STYLE-TYPE: none
}
#cp_at_content LI A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; FONT-SIZE: 10px; =
PADDING-BOTTOM: 3px; PADDING-TOP: 3px
}
LI#cp_at_blog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) =
no-repeat left 50%
}
LI#cp_at_facebook A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/facebook.gif) =
no-repeat left 50%
}
LI#cp_at_live A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)=
 no-repeat left 50%
}
LI#cp_at_digg A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/digg.gif) =
no-repeat left 50%
}
LI#cp_at_news A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) =
no-repeat left 50%
}
LI#cp_at_deli A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) =
no-repeat left 50%
}
LI#cp_at_yaho A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) =
no-repeat left 50%
}
LI#cp_at_goog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/google.gif) =
no-repeat left 0px
}
#net_bar * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px; TEXT-ALIGN: left
}
#net_bar A {
	outline: none
}
#net_bar A:active {
	outline: none
}
:focus {
	-moz-outline-style: none
}
#net_bar UL {
	LIST-STYLE-TYPE: none
}
#net_bar LI {
	LIST-STYLE-TYPE: none
}
#net_bar FIELDSET {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
.hide {
	DISPLAY: none
}
.show {
	DISPLAY: block
}
#net_bar {
	BACKGROUND: #e0e0e0; FONT: 12px/1em Trebuchet MS, arial, verdana, =
sans-serif; BORDER-BOTTOM: #7d87a2 1px solid; TOP: 0px; HEIGHT: 33px
}
#net_cp A {
	DISPLAY: block; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/cmnLogo.gif) =
no-repeat 0px 0px; WIDTH: 180px; TEXT-INDENT: -1000em; HEIGHT: 33px
}
#net_search {
	LEFT: 180px; VISIBILITY: visible; POSITION: absolute; TOP: 7px
}
#net_search LI {
	DISPLAY: block; FLOAT: left; LIST-STYLE-TYPE: none
}
#net_search UL {
	DISPLAY: block; FLOAT: left; LIST-STYLE-TYPE: none
}
#net_search_input {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; Z-INDEX: =
2; FLOAT: left; PADDING-BOTTOM: 0px! important; MARGIN: 0px; WIDTH: =
130px; PADDING-TOP: 0px! important
}
#net_search_choose_submit INPUT {
	BORDER-RIGHT: #8c94ad 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#8c94ad 1px solid; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: =
#e7e7e7; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 6px; BORDER-LEFT: =
#8c94ad 1px solid; COLOR: #313131; PADDING-TOP: 0px; BORDER-BOTTOM: =
#8c94ad 1px solid; TEXT-ALIGN: center
}
#net_submit_web INPUT {
	BORDER-RIGHT: #8c94ad 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#8c94ad 1px solid; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: =
#e7e7e7; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 6px; BORDER-LEFT: =
#8c94ad 1px solid; COLOR: #313131; PADDING-TOP: 0px; BORDER-BOTTOM: =
#8c94ad 1px solid; TEXT-ALIGN: center
}
#net_channels {
	RIGHT: 200px; WIDTH: 375px; POSITION: absolute; TOP: 12px
}
#net_channels {
	WIDTH: auto
}
#net_channels UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#net_channels LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: =
url(http://media.collegepublisher.com/media/images/nav_right_1.png) =
no-repeat right top; FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: 0px 0px =
0px 2px; PADDING-TOP: 0px
}
#net_channels A {
	PADDING-RIGHT: 4px; DISPLAY: block; PADDING-LEFT: 4px; BACKGROUND: =
url(http://media.collegepublisher.com/media/images/nav_left_1.png) =
no-repeat left top; FLOAT: left; PADDING-BOTTOM: 4px; FONT: 11px/1em =
Trebuchet MS, arial, verdana, sans-serif; COLOR: #303030; PADDING-TOP: =
4px; TEXT-DECORATION: none
}
#net_channels A {
	FLOAT: none
}
UL#net_cp_nav_list LI {
	MARGIN: 0px 0px -3px; HEIGHT: 1%
}
#net_weather {
	RIGHT: 0px; POSITION: absolute; TOP: 1px
}
#flan_pods H2 {
	MARGIN: 0px 0px 1em
}
#flan_pods .flan_pods_channels {
	MARGIN: 0px 0px 1em
}
#flan_pods .flan_pods_gutter {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; BACKGROUND: #f5f5f5; =
PADDING-BOTTOM: 10px; PADDING-TOP: 10px
}
#flan_pods UL {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
#flan_pods UL LI {
	LIST-STYLE-POSITION: outside; LIST-STYLE-TYPE: none
}
#flan_pods H3 {
	MARGIN: 0px 0px 0.5em
}
#flan_pods H5 {
	FONT-SIZE: 10px; MARGIN: 0px 0px 3px; TEXT-TRANSFORM: uppercase; COLOR: =
#999; BORDER-BOTTOM: #999 1px solid
}
#flan_pods IMG {
	BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; FLOAT: =
right; MARGIN: 0px 0em 1em 1em; BORDER-LEFT: #d8d8d8 1px solid; =
BORDER-BOTTOM: #d8d8d8 1px solid
}
.flan_pods_info {
	CLEAR: both; MARGIN: 0px 0px 1em
}
.flan_pods_tracklist {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
.flan_pods_list_even {
	BACKGROUND: #edf3fe
}
.flan_pods_list_odd {
	BACKGROUND: #fff
}
.flan_pods_list_odd:hover {
	BACKGROUND: #ffc
}
.flan_pods_list_even:hover {
	BACKGROUND: #ffc
}
.flan_pods_tracklist LI {
	PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; =
PADDING-BOTTOM: 8px; PADDING-TOP: 10px
}
.flan_pods_tracklist LI P.flan_pods_title {
	DISPLAY: inline; FLOAT: left; MARGIN: 0px; LINE-HEIGHT: 17px
}
.flan_pods_tracklist LI P.flan_pods_description {
	FONT-SIZE: 0.9em; MARGIN: 0.5em 0px 0px
}
A.flan_pods_listen {
	DISPLAY: block; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/podcast.gif) =
no-repeat left top; FLOAT: right; MARGIN: 0px; WIDTH: 37px; TEXT-INDENT: =
-1000em; HEIGHT: 17px
}
A.flan_pods_listen:hover {
	BACKGROUND-POSITION: left bottom
}
.flan_pods_channels .more {
	FONT-SIZE: 1.2em; MARGIN: 0.5em 0px 0px; TEXT-ALIGN: right
}
.flan_pods_channels .more A {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
LINE-HEIGHT: 1.2em; PADDING-TOP: 5px
}
.flan_pods_subscription_links {
	TEXT-ALIGN: right
}
.flan_pods_subscription_links LI {
	DISPLAY: inline; MARGIN: 0px 10px 0px 0px
}
.flan_pods_subscription_links LI A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
.flan_pods_rss A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) =
no-repeat left center
}
.flan_pods_m3u A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center
}
.flan_pods_rss_itunes A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/podcast_icon_ori=
ginal.png) no-repeat left center
}
.flan_pods_subscription_links LI.flan_pods_xspf {
	MARGIN: 0px
}
.flan_pods_xspf A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center
}
.flan_pods_all A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)=
 no-repeat left center
}
HTML > BODY .flan_pods_tracklist LI P.flan_pods_title {
	FLOAT: none
}
#flan_ads {
	FLOAT: right; WIDTH: 300px
}
.box {
	CLEAR: both; MARGIN: 0px 0px 10px; WIDTH: 300px
}
#flan_ads .cp_ad {
	CLEAR: both; MARGIN: 0px 0px 10px; WIDTH: 300px
}
#flan_ads .content .gutter {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px
}
#flan_ads .gutter P {
	MARGIN: 0px 0px 10px
}
#advertisements {
	MARGIN: 0px 0px 10px
}
#flan_ads .content {
	CLEAR: both; BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px =
solid; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, sans-serif; =
BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid
}
#advertisements {
	CLEAR: both; BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px =
solid; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, sans-serif; =
BORDER-LEFT: #d8d8d8 1px solid; BORDER-BOTTOM: #d8d8d8 1px solid
}
#flan_ads .content_300 {
	CLEAR: both; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, =
sans-serif
}
#advertisements {
	CLEAR: both; MARGIN: 0px 0px 10px; FONT: 90%/1.2em arial, verdana, =
sans-serif
}
#flan_ads .content H4 {
	PADDING-RIGHT: 3px; PADDING-LEFT: 7px; BACKGROUND: #f5f5f5; =
PADDING-BOTTOM: 3px; FONT: 14px/1em arial, verdana, sans-serif; =
TEXT-TRANSFORM: uppercase; COLOR: #333333; PADDING-TOP: 3px; =
BORDER-BOTTOM: #d8d8d8 1px solid
}
#advertisements H4 {
	PADDING-RIGHT: 3px; PADDING-LEFT: 7px; BACKGROUND: #f5f5f5; =
PADDING-BOTTOM: 3px; FONT: 14px/1em arial, verdana, sans-serif; =
TEXT-TRANSFORM: uppercase; COLOR: #333333; PADDING-TOP: 3px; =
BORDER-BOTTOM: #d8d8d8 1px solid
}
#flan_ads .content A {
	COLOR: #333; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none
}
#flan_ads .content A:hover {
	BACKGROUND: #ffc
}
#flan_ads .content OL {
	LIST-STYLE-POSITION: inside
}
#flan_ads .content OL LI {
	MARGIN: 0px 0px 5px; LINE-HEIGHT: 1.2em
}
#box_120_240 {
	BACKGROUND: #f5f5f5
}
#box_120_240 .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 120px
}
#box_120_600_loc .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 120px
}
#box_120_600 {
	BACKGROUND: #f5f5f5
}
#box_120_600 .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 120px
}
#box_120_600_loc .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 120px
}
#box_160_600 {
	BACKGROUND: #f5f5f5
}
#box_160_600 .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 160px
}
#box_160_600_loc .banner {
	BORDER-RIGHT: #fff 10px solid; FLOAT: left; MARGIN: 0px 10px 0px 0px; =
WIDTH: 160px
}
#advertisements * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#advertisements H4 {
	MARGIN: 0px 0px 10px
}
#advertisements {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
10px; WIDTH: 298px; PADDING-TOP: 0px
}
#advertisements .left {
	BORDER-RIGHT: #e1e1e1 1px solid; FLOAT: left; WIDTH: 150px; TEXT-ALIGN: =
center
}
#advertisements .right {
	TEXT-ALIGN: center
}
#flan_ads .content * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_nav .content * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_ads .content FORM {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: =
0px; PADDING-TOP: 10px
}
#flan_ads .content DIV {
	MARGIN: 0px 0px 5px
}
#flan_ads .pollquestionstyle {
	FONT: bold 13px/1.2em arial, verdana, sans-serif
}
#flan_ads .content_answers {
	FONT-SIZE: 11px; MARGIN: 7px 0px 0px
}
#flan_ads .content_answers DIV {
	MARGIN: 0px 0px 7px
}
#flan_ads .content A.faux_button {
	PADDING-RIGHT: 3px; DISPLAY: block; PADDING-LEFT: 3px; PADDING-BOTTOM: =
3px; MARGIN: 7px 0px 0px; PADDING-TOP: 3px
}
#flan_ads .content P#view_results {
	MARGIN: 7px 0px 0px
}
#flan_content UL {
	MARGIN: 1em
}
#dn_content UL {
	MARGIN: 1em
}
#flan_content OL {
	MARGIN: 1em
}
#dn_content OL {
	MARGIN: 1em
}
#flan_content P {
	MARGIN: 0px 0px 1em
}
#dn_content P {
	MARGIN: 0px 0px 1em
}
#flan_text_ads * {
	MARGIN: 0px
}
#flan_text_ads {
	BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #999999 1px solid; MARGIN: =
0px 0px 10px; BORDER-LEFT: #999999 1px solid; BORDER-BOTTOM: #999999 1px =
solid
}
.flan_text_ad {
	BORDER-BOTTOM: #d8d8d8 1px solid
}
.flan_text_ad_title {
	COLOR: blue; TEXT-DECORATION: underline
}
.flan_text_ad_action {
	COLOR: blue
}
.flan_text_ad A {
	PADDING-RIGHT: 5px! important; DISPLAY: block; PADDING-LEFT: 5px! =
important; BACKGROUND: #fff; PADDING-BOTTOM: 5px! important; =
PADDING-TOP: 5px! important
}
.flan_text_ad A:hover {
	BACKGROUND: #f5f5f5
}
.flan_text_ad_bar {
	PADDING-RIGHT: 3px! important; PADDING-LEFT: 3px! important; FONT-SIZE: =
0.9em! important; BACKGROUND: #d8d8d8; PADDING-BOTTOM: 3px! important; =
PADDING-TOP: 3px! important; TEXT-ALIGN: center! important
}
.flan_comment {
	BACKGROUND: #edf3fe; MARGIN: 0px 0px 0.5em; OVERFLOW: auto
}
.flan_comment_response {
	BACKGROUND: #f5f5f5; MARGIN: 0px 0px 0.5em
}
.flan_comment_response BLOCKQUOTE {
	BORDER-RIGHT: #ffcc33 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#ffcc33 1px solid; PADDING-LEFT: 10px; BACKGROUND: #ffff99; =
PADDING-BOTTOM: 10px; MARGIN: 0px 0px 1em; BORDER-LEFT: #ffcc33 1px =
solid; PADDING-TOP: 10px; BORDER-BOTTOM: #ffcc33 1px solid
}
.flan_comment_gutter {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px
}
.flan_comment_body {
	MARGIN: 0px 0px 1em
}
.flan_comment_reply {
	TEXT-ALIGN: right
}
.flan_comment_read {
	TEXT-ALIGN: right
}
.flan_comment_reply A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.flan_comment_post A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.flan_comment_article A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/page.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.flan_comment_all A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)=
 no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.flan_comment_read A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 12px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)=
 no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
UL.flan_comment_nav {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! =
important
}
#maincontent UL.flan_comment_nav {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! =
important
}
UL.flan_comment_nav LI.previous {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/minus.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
UL.flan_comment_nav LI.next {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center; LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; =
POSITION: relative; TEXT-ALIGN: right
}
.flan_comment_nav LI {
	DISPLAY: inline; MARGIN: 0px 1em 0px 0px
}
.flan_comment_valid_img {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; =
PADDING-TOP: 0px
}
.flan_comment_valid FIELDSET {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
.flan_comment_valid LABEL {
	DISPLAY: block; MARGIN: 0px 0px 0.5em
}
.flan_comment_valid INPUT {
	DISPLAY: block; MARGIN: 0px 0px 0.5em
}
.flan_disabled {
	COLOR: #999
}
.post_comment_button {
	MARGIN: 1.5em 0px; TEXT-ALIGN: center
}
.post_comment_no {
	PADDING-RIGHT: 4px; PADDING-LEFT: 4px; BACKGROUND: #cc0000; =
PADDING-BOTTOM: 2px; MARGIN: 0px 0px 1.5em; COLOR: #fff; PADDING-TOP: =
2px
}
.post_comment_no A {
	COLOR: #fff! important; TEXT-DECORATION: underline
}
.cpfooter {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 80%; PADDING-BOTTOM: =
2em; PADDING-TOP: 2em
}
UL.flan_breadcrumb {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! =
important; LIST-STYLE-TYPE: none
}
.flan_breadcrumb LI {
	DISPLAY: inline; FONT-SIZE: 0.9em; MARGIN: 0px 1px 0px 0px
}
.flan_breadcrumb LI.flan_breadcrumb_parent {
	DISPLAY: inline; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/arrow_right.gif)=
 no-repeat left center
}
.flan_breadcrumb LI {
	DISPLAY: inline; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/arrow_right_ligh=
t.gif) no-repeat left center
}
#flan_syndication_feeds LI {
	LIST-STYLE-TYPE: none
}
.flan_rss {
	PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.flan_article_clear {
	CLEAR: both
}
.flan_clear {
	CLEAR: both
}
.cp_clear {
	CLEAR: both
}
.cp_article_clear {
	CLEAR: both
}
.flan_clear_auto:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.cp_clear:unknown {
	CLEAR: both; DISPLAY: block; VISIBILITY: hidden; HEIGHT: 0px; content: =
"."
}
.flan_clear_auto {
	DISPLAY: inline-block
}
.cp_clear {
	DISPLAY: inline-block
}
.flan_clear_auto {
	DISPLAY: block
}
.cp_clear {
	DISPLAY: block
}
* HTML .flan_clear_auto {
	HEIGHT: 1%
}
* HTML .cp_clear {
	HEIGHT: 1%
}
.cp_light {
	COLOR: #999999
}
.cp_light P {
	COLOR: #999999
}
.cp_small {
	FONT-SIZE: 0.9em; LINE-HEIGHT: 1.4em
}
.cp_small P {
	FONT-SIZE: 0.9em; LINE-HEIGHT: 1.4em
}
.cp_medium {
	FONT-SIZE: 1em; LINE-HEIGHT: 1.4em
}
.cp_medium P {
	FONT-SIZE: 1em; LINE-HEIGHT: 1.4em
}
.cp_large {
	FONT-SIZE: 1.3em; LINE-HEIGHT: 1.4em
}
.cp_large P {
	FONT-SIZE: 1.3em; LINE-HEIGHT: 1.4em
}
.cp_rss {
	PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/rss11.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.cp_table {
	BORDER-RIGHT: #d8d8d8 1px solid; BORDER-TOP: #d8d8d8 1px solid; MARGIN: =
0px 0px 1em; BORDER-LEFT: #d8d8d8 1px solid; WIDTH: 100%; BORDER-BOTTOM: =
#d8d8d8 1px solid
}
.cp_table TH {
	PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #cccccc; =
PADDING-BOTTOM: 7px; PADDING-TOP: 7px; TEXT-ALIGN: left
}
.cp_table TD {
	PADDING-RIGHT: 7px; PADDING-LEFT: 7px; PADDING-BOTTOM: 7px; =
PADDING-TOP: 7px
}
.cp_table P {
	MARGIN: 0px 0px 0.5em
}
.cp_even {
	BACKGROUND: #f5f5f5
}
.cp_odd {
	BACKGROUND: #edf3fe
}
BLOCKQUOTE {
	BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#d8d8d8 1px solid; PADDING-LEFT: 10px; BACKGROUND: #ffffff; =
PADDING-BOTTOM: 10px; MARGIN: 0px 0px 1em; BORDER-LEFT: #d8d8d8 1px =
solid; PADDING-TOP: 10px; BORDER-BOTTOM: #d8d8d8 1px solid
}
BLOCKQUOTE EM {
	DISPLAY: block; FONT-WEIGHT: bold; MARGIN: 0px 0px 0.3em; =
BORDER-BOTTOM: #e9e9e9 1px solid
}
.cp_left_right {
	MARGIN: 0px 0px 1em
}
.cp_left {
	FLOAT: left
}
.cp_right {
	FLOAT: right
}
.callout_left {
	FLOAT: left; MARGIN: 0px 1em 1em 0px; WIDTH: 33%
}
.callout_right {
	FLOAT: right; MARGIN: 0px 0px 1em 1em; WIDTH: 33%
}
A.cp_reply {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/plus.gif) =
no-repeat left center; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.cp_warn {
	PADDING-RIGHT: 5px; PADDING-LEFT: 27px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/alert.gif) =
#ffff99 no-repeat 5px 4px; PADDING-BOTTOM: 5px; MARGIN: 0px 0px 1em; =
FONT: 1em/1.2em arial, verdana, sans-serif; PADDING-TOP: 5px
}
.cp_warn STRONG {
	COLOR: #af0000! important
}
.cp_warn P {
	MARGIN: 0px; COLOR: #000000! important
}
.cp_alert {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: #ffff99; =
PADDING-BOTTOM: 5px; MARGIN: 0px 0px 1em; FONT: 1em/1.2em arial, =
verdana, sans-serif; COLOR: #af0000; PADDING-TOP: 5px
}
.cp_hide {
	DISPLAY: none
}
.cp_forum_trail {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 1em; PADDING-TOP: 0px! =
important
}
.cp_forum_trail LI {
	DISPLAY: inline; FONT-SIZE: 1.2em
}
.cp_forum_trail LI.cp_forum_trail_parent {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
.cp_form FIELDSET {
	BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: =
#d8d8d8 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 0px =
0px 1em; BORDER-LEFT: #d8d8d8 1px solid; PADDING-TOP: 5px; =
BORDER-BOTTOM: #d8d8d8 1px solid
}
.cp_form LEGEND {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; FONT-WEIGHT: bold; =
PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 15px; COLOR: #000000; =
PADDING-TOP: 0px
}
.cp_form UL {
	LIST-STYLE-TYPE: none
}
.cp_form LI {
	CLEAR: left; PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: =
5px; MARGIN: 0px 0px 5px; PADDING-TOP: 5px
}
.cp_form LABEL {
	PADDING-RIGHT: 10px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; WIDTH: 120px; PADDING-TOP: 3px; TEXT-ALIGN: right
}
.cp_form INPUT {
	FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px
}
.cp_form SELECT {
	FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px
}
.cp_form TEXTAREA {
	FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px
}
.cp_small_form INPUT {
	MARGIN: 0px 3px; WIDTH: 500px
}
.cp_small_form SELECT {
	MARGIN: 0px 3px; WIDTH: 500px
}
.cp_form IMG {
	FLOAT: left; MARGIN: 1px 0px 0px 3px
}
.cp_form .cp_alert {
	CLEAR: both; MARGIN: 0px 0px 0px 130px; WIDTH: 240px
}
.cp_form .cp_radio {
	FLOAT: left; MARGIN: 0px 0px 3px; WIDTH: 250px; BORDER-TOP-STYLE: none; =
BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: =
none
}
.cp_form .cp_radio INPUT {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: =
0px; MARGIN: 0px; WIDTH: auto; PADDING-TOP: 0px
}
.cp_form .cp_check INPUT {
	FLOAT: none; MARGIN: 0px 5px 0px 0px; WIDTH: auto
}
.cp_form .cp_image_verify IMG {
	MARGIN: 0px 10px 0px 0px
}
.cp_form .cp_image_verify LI {
	LIST-STYLE-POSITION: outside
}
.cp_form .cp_image_verify INPUT {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FLOAT: =
none; PADDING-BOTTOM: 0px! important; MARGIN: 0px; WIDTH: 250px; =
PADDING-TOP: 0px! important; TEXT-ALIGN: left
}
.cp_form .cp_image_verify LABEL {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FLOAT: =
none; PADDING-BOTTOM: 0px! important; MARGIN: 0px; WIDTH: 250px; =
PADDING-TOP: 0px! important; TEXT-ALIGN: left
}
.cp_form .cp_submit {
	TEXT-ALIGN: center
}
.cp_form .cp_submit INPUT {
	FLOAT: none; WIDTH: auto
}
#cp_staff {
	BORDER-TOP: #ccc 1px solid
}
#cp_staff .staff_member {
	CLEAR: left; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; =
PADDING-BOTTOM: 1em; WIDTH: 100%; PADDING-TOP: 1em; BORDER-BOTTOM: #ccc =
1px solid
}
#cp_staff .staff_member IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; FLOAT: left; =
BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px 1em 0px 0px; WIDTH: 75px; =
BORDER-RIGHT-WIDTH: 0px
}
#cp_staff .staff_member .cp_staff_name {
	FLOAT: left; WIDTH: 50%
}
#cp_staff .staff_member .cp_staff_name DT {
	FONT-SIZE: 1.5em; MARGIN: 0px 0px 0.2em
}
#cp_staff .staff_member .cp_staff_name DD {
	FONT-SIZE: 1.2em
}
#cp_staff .staff_member .cp_staff_contact {
	FLOAT: left
}
#cp_staff .staff_member .cp_staff_contact DT {
	FONT-WEIGHT: bold
}
#cp_staff .staff_member .cp_staff_contact DD {
	MARGIN: 0px 0px 0.2em
}
IFRAME {
	BORDER-TOP-WIDTH: 0px! important; BORDER-LEFT-WIDTH: 0px! important; =
BORDER-BOTTOM-WIDTH: 0px! important; OVERFLOW: hidden! important; =
BORDER-RIGHT-WIDTH: 0px! important
}
#cp_bn_wrap {
	FONT: 1em/1.4em arial, sans-serif
}
#cp_bn_wrap * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_bn_wrap A {
	BORDER-RIGHT: #900000 5px solid; BORDER-TOP: #900000 5px solid; =
DISPLAY: block; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/breaking_news_b=
kg.jpg) #900000 repeat-x 0px 0px; MARGIN: 0px 0px 10px; BORDER-LEFT: =
#900000 5px solid; BORDER-BOTTOM: #900000 5px solid; TEXT-DECORATION: =
none
}
#cp_bn_wrap A:hover {
	BORDER-RIGHT: #de0000 5px solid; BORDER-TOP: #de0000 5px solid; =
BACKGROUND: #de0000; BORDER-LEFT: #de0000 5px solid; BORDER-BOTTOM: =
#de0000 5px solid
}
#cp_bn_wrap A .gutter {
	BORDER-RIGHT: #fff 1px solid; PADDING-RIGHT: 7px; BORDER-TOP: #fff 1px =
solid; PADDING-LEFT: 7px; BACKGROUND: none transparent scroll repeat 0% =
0%; PADDING-BOTTOM: 7px; MARGIN: 0px; BORDER-LEFT: #fff 1px solid; =
PADDING-TOP: 7px; BORDER-BOTTOM: #fff 1px solid; POSITION: relative
}
#cp_bn_wrap A H2 {
	COLOR: #fff
}
#cp_bn_wrap A H3 {
	COLOR: #fff
}
#cp_bn_wrap A H4 {
	COLOR: #fff
}
#cp_bn_wrap A P {
	COLOR: #fff
}
#cp_bn_wrap A H2 {
	FONT-SIZE: 18px; MARGIN: 0px 0px 0.5em; TEXT-TRANSFORM: uppercase; =
FONT-FAMILY: "Trebuchet MS", serif
}
#cp_bn_wrap A H3 {
	FONT-SIZE: 22px; MARGIN: 0px 0px 0.25em; FONT-STYLE: italic
}
#cp_bn_wrap A H4 {
	FONT-SIZE: 16px; MARGIN: 0px 0px 0.5em
}
#cp_bn_wrap A P {
	FONT-SIZE: 11px; MARGIN: 0px; LINE-HEIGHT: 13px
}
#cp_bn_wrap A .with_img {
	FLOAT: left; WIDTH: 65%
}
#cp_bn_wrap A IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; FLOAT: right; =
BORDER-BOTTOM-WIDTH: 0px; MARGIN: 0px; WIDTH: 32%; BORDER-RIGHT-WIDTH: =
0px
}
#cp_bn_article_header {
	FONT-SIZE: 20px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/breaking_news_b=
kg.jpg) #de0000 repeat-x 0px 0px; TEXT-TRANSFORM: uppercase; COLOR: =
#fff; TEXT-INDENT: 0.3em; LINE-HEIGHT: 40px; FONT-FAMILY: 'trebuchet =
ms', serif
}
BLOCKQUOTE.cp_pullquote {
	BORDER-TOP: #000 3px double; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM: =
#000 3px double; BORDER-RIGHT-WIDTH: 0px
}
BLOCKQUOTE.cp_pullquote P {
	MARGIN: 0px; FONT: 18px/22px georgia, serif
}
BLOCKQUOTE.cp_pullquote P:first-letter {
	TEXT-TRANSFORM: uppercase
}
#cp_article_top {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px 0px 15px; PADDING-TOP: 10px! =
important; BORDER-BOTTOM: #ccc 1px solid
}
#cp_article_top UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_tools UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_bottom UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_ads .cp_ad H4.ad_slug {
	DISPLAY: none; BACKGROUND: none transparent scroll repeat 0% 0%; FONT: =
10px/14px 'trebuchet ms', arial, sans-serif; TEXT-TRANSFORM: uppercase; =
COLOR: #aaa; TEXT-ALIGN: center
}
.cp_ad {
	OVERFLOW: hidden; WIDTH: 300px; HEIGHT: 250px
}
#cp_article_bottom {
	MARGIN: 15px 0px
}
#cp_article_top UL {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
#cp_article_top LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_article_bottom LI {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_story_bot_nav {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; FONT-SIZE: =
11px; PADDING-BOTTOM: 0px! important; MARGIN: 0px; LINE-HEIGHT: 17px; =
PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none
}
#cp_article_top LI A {
	COLOR: #333333! important
}
#cp_article_bottom LI A {
	COLOR: #333333! important
}
#cp_story_bot_nav A {
	COLOR: #333333! important
}
#cp_article_top LI A:hover {
	COLOR: #000000! important
}
#cp_article_bottom A:hover {
	COLOR: #000000! important
}
#cp_article_top_left {
	FLOAT: left
}
#cp_article_top_left LI {
	DISPLAY: inline; MARGIN: 0px 5px 0px 0px
}
#cp_article_top_right {
	FLOAT: right; TEXT-ALIGN: right
}
#cp_article_bottom_right {
	FLOAT: right; TEXT-ALIGN: right
}
LI#cp_article_discuss A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/discuss.gif) =
no-repeat left -1px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_print A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/print.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_email A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/email.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_more A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/down.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_answertips A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 14px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/answertips.gif) =
no-repeat left 50%; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
LI#cp_article_blog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/blogger.gif) =
no-repeat left 50%
}
LI#cp_article_facebook A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/facebook.gif) =
no-repeat left 50%
}
LI#cp_article_live A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/livejournal.gif)=
 no-repeat left 50%
}
LI#cp_article_digg A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/digg.gif) =
no-repeat left 50%
}
LI#cp_article_news A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/newsvine.gif) =
no-repeat left 50%
}
LI#cp_article_deli A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/delicious.gif) =
no-repeat left 50%
}
LI#cp_article_yaho A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/yahoo.gif) =
no-repeat left 50%
}
LI#cp_article_goog A {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/google.gif) =
no-repeat left 0px
}
LI.cp_article_page DIV {
	PADDING-RIGHT: 0px; PADDING-LEFT: 17px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/pageIcon.gif) =
no-repeat left center; FLOAT: right; PADDING-BOTTOM: 0px; PADDING-TOP: =
0px
}
#cp_story_text {
	MARGIN: 0px 0px 15px
}
#cp_article_tools {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px =
0px 25px; PADDING-TOP: 0px
}
P.cp_article_more_tools {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
FONT-WEIGHT: bold! important; FONT-SIZE: 12px! important; =
PADDING-BOTTOM: 0px! important; MARGIN: 0px; PADDING-TOP: 0px! important
}
P.cp_article_tools_header {
	PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; =
FONT-WEIGHT: bold! important; FONT-SIZE: 11px; PADDING-BOTTOM: 0px! =
important; MARGIN: 0px 0px 8px; PADDING-TOP: 0px! important
}
#cp_article_tools .cp_article_gutter {
	PADDING-RIGHT: 5px! important; PADDING-LEFT: 5px! important; =
PADDING-BOTTOM: 5px! important; PADDING-TOP: 5px! important
}
#cp_article_tools UL {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: =
0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important
}
#cp_article_tools LI {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 0px! important; PADDING-BOTTOM: 0px! important; MARGIN: =
0px; PADDING-TOP: 0px! important; LIST-STYLE-TYPE: none! important
}
#cp_article_tools LI A {
	PADDING-RIGHT: 0px! important; DISPLAY: inline! important; =
PADDING-LEFT: 17px! important; FONT-SIZE: 10px! important; =
PADDING-BOTTOM: 3px! important; MARGIN: 0px 3px 0px 0px; PADDING-TOP: =
3px! important
}
#cp_article_tools LI A {
	DISPLAY: inline! important; FONT-SIZE: 10px! important
}
#cp_article_tools_book {
	CLEAR: left; MARGIN: -12px 0px 0px 5px
}
HTML > BODY #cp_article_tools_book {
	LEFT: 5px; MARGIN: 27px 0px 0px; POSITION: relative; TOP: -5px
}
#cp_article_tools_blog {
	FLOAT: left! important; WIDTH: 0px! important
}
#cp_article_tools_rss {
	FLOAT: right! important; BORDER-LEFT: #fff 1px solid; WIDTH: 140px! =
important
}
HTML > BODY #cp_article_tools_rss {
	WIDTH: 160px! important
}
#cp_story_bot_nav {
	MARGIN: 0px 0px 15px; TEXT-ALIGN: right
}
#cp_continued {
	FONT-SIZE: 11px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 17px
}
* HTML #cp_article_tools {
	HEIGHT: 47px
}
.RSSItemListRow {
	PADDING-RIGHT: 6px; PADDING-LEFT: 6px; PADDING-BOTTOM: 4px; COLOR: =
#000; LINE-HEIGHT: 1.1em; PADDING-TOP: 4px
}
#slider2_wrap .slider2_hot {
	DISPLAY: block; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/lightning.pn=
g) no-repeat left center; FLOAT: left; WIDTH: 19px; TEXT-INDENT: =
-1000em; HEIGHT: 16px
}
.RSSItemListSchool {
	FONT-SIZE: 10px; COLOR: #666; LINE-HEIGHT: 1.3em
}
.FlippyEvenRow {
	BACKGROUND-COLOR: #eee
}
.ListBoxItemHover {
	CURSOR: pointer; COLOR: #000; BACKGROUND-COLOR: #ff9
}
.SelectedListBoxItem {
	BACKGROUND: #ff0; COLOR: #000
}
.RSSItemListFeedback {
	MARGIN: 75px auto auto; HEIGHT: 32px
}
.RSSItemListFeedback TD {
	FONT: 0.9em/1.4em trebuchet ms; COLOR: #666
}
.ClearAll {
	CLEAR: both; FONT-SIZE: 0px; LINE-HEIGHT: 0; HEIGHT: 0px
}
.SpryHiddenRegion {
	VISIBILITY: hidden
}
#slider2_wrap {
	CLEAR: left; MARGIN: 10px 0px; WIDTH: 300px
}
#slider2_wrap H3 A {
	PADDING-RIGHT: 20px; DISPLAY: block; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/bullet_go.pn=
g) no-repeat right center; COLOR: #333! important; BORDER-BOTTOM: #ccc =
1px dashed
}
#slider2_wrap H3 A:hover {
	BACKGROUND-COLOR: #ff9
}
#slider2_wrap .lead_wrap {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #ccc 1px; =
PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; BORDER-LEFT: #ccc 1px solid; =
PADDING-TOP: 0px; BORDER-BOTTOM: #ccc 1px solid
}
#slider2_wrap .contentslide {
	PADDING-RIGHT: 1px; PADDING-LEFT: 1px; BACKGROUND: #fff; =
PADDING-BOTTOM: 1px; PADDING-TOP: 1px; POSITION: relative; HEIGHT: 257px
}
#slider2_wrap .contentdiv_scroller {
	PADDING-RIGHT: 9px; PADDING-LEFT: 5px; BACKGROUND: #fff; =
PADDING-BOTTOM: 0px; OVERFLOW: auto; PADDING-TOP: 5px; POSITION: =
relative; HEIGHT: 230px
}
#slider2_wrap .linkbar {
	PADDING-RIGHT: 4px; BORDER-TOP: #ddd 1px solid; MARGIN-TOP: 1px; =
PADDING-LEFT: 4px; FONT-SIZE: 0.95em; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi=
f) #fff repeat-x; PADDING-BOTTOM: 0px; VERTICAL-ALIGN: middle; COLOR: =
#666; LINE-HEIGHT: 20px; PADDING-TOP: 0px; TEXT-ALIGN: right
}
#slider2_wrap .linkbar IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; VERTICAL-ALIGN: middle; BORDER-RIGHT-WIDTH: 0px
}
#slider2_wrap .linkbar A {
	COLOR: #fff
}
#slider2_wrap .linkbar A:hover {
	BACKGROUND: #ff9
}
#slider2_wrap .contentslide .contentdiv {
	DISPLAY: none
}
#slider2_wrap .contentslide A {
	COLOR: #000
}
#slider2_wrap .contentdiv_scroller A:hover * {
	DISPLAY: block; COLOR: #000; BACKGROUND-COLOR: #ff9
}
#slider2_wrap DIV.pagination_wrap {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 11px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/bottom_line.gif=
) #eee repeat-x left bottom; PADDING-BOTTOM: 0px; PADDING-TOP: 0px
}
#slider2_wrap .pagination {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; OVERFLOW: hidden; PADDING-TOP: 0px; TEXT-ALIGN: left
}
#slider2_wrap .pagination UL {
	DISPLAY: inline
}
#slider2_wrap .pagination LI {
	DISPLAY: inline
}
#slider2_wrap .pagination A {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px =
solid; DISPLAY: block; PADDING-LEFT: 4px; FLOAT: left; PADDING-BOTTOM: =
3px; FONT: 10px/20px "arial narrow", arial, helvetica, sans-serif; =
BORDER-LEFT: #ccc 1px solid; COLOR: #333; MARGIN-RIGHT: 3px; =
PADDING-TOP: 3px; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none
}
.ie6 #slider2_wrap .pagination A {
	LETTER-SPACING: -1px
}
#slider2_wrap .pagination A SPAN {
	DISPLAY: block; PADDING-LEFT: 20px; LINE-HEIGHT: 16px
}
#slider2_wrap .pagination A#tab_mp SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/newspaper_po=
p.png) no-repeat left top
}
#slider2_wrap .pagination A#tab_me SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/email_go.png=
) no-repeat left top
}
#slider2_wrap .pagination A#tab_mc SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/user_comment=
.png) no-repeat left top
}
#slider2_wrap .pagination A#tab_pc SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/ipod.png) =
no-repeat left top
}
#slider2_wrap .pagination A#tab_ce SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/date.png) =
no-repeat left top
}
#slider2_wrap .pagination A#tab_mb SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/comments.png=
) no-repeat left top
}
#slider2_wrap .pagination A#tab_ci SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/newspaper_ad=
d.png) no-repeat left top
}
#slider2_wrap .pagination A#tab_rc SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/transmit.png=
) no-repeat left top
}
#slider2_wrap .pagination A#tab_nc SPAN {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/transmit_blu=
e.png) no-repeat left top
}
#slider2_wrap .pagination A:hover {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi=
f) #fff repeat-x 0px 1px; BORDER-BOTTOM: #fff 1px solid
}
#slider2_wrap .pagination A.selected {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/box_gradient.gi=
f) #fff repeat-x 0px 1px; BORDER-BOTTOM: #fff 1px solid
}
#slider2_wrap .pagination A:hover {
	BORDER-RIGHT: #ccc 1px solid; BORDER-TOP: #ccc 1px solid; BORDER-LEFT: =
#ccc 1px solid; BORDER-BOTTOM: #ccc 1px solid
}
#slider2_wrap .pagination A.selected:hover {
	BORDER-BOTTOM: #fff 1px solid
}
#slider2_wrap .pagination A.pagination_next {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 0px; FONT: 16px/22px arial, =
helvetica, sans-serif; COLOR: #fff; BORDER-TOP-STYLE: none; PADDING-TOP: =
5px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; TEXT-DECORATION: =
none; BORDER-BOTTOM-STYLE: none
}
#slider2_wrap .pagination A.pagination_next:hover {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 0px; FONT: 16px/22px arial, =
helvetica, sans-serif; COLOR: #fff; BORDER-TOP-STYLE: none; PADDING-TOP: =
5px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; TEXT-DECORATION: =
none; BORDER-BOTTOM-STYLE: none
}
#slider2_wrap .pagination IMG {
	PADDING-BOTTOM: 2px; VERTICAL-ALIGN: middle; BORDER-TOP-STYLE: none; =
BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: =
none
}
.safari .box {
	FLOAT: none! important
}
.ie6 #slider2_wrap .pagination A {
	WIDTH: 16px; LINE-HEIGHT: 16px
}
.cp_local_ad {
	OVERFLOW: hidden
}
.cp_banner_client {
	OVERFLOW: hidden
}
.carousel-component {
	VISIBILITY: hidden; OVERFLOW: hidden; POSITION: relative
}
.carousel-component UL.carousel-list {
	Z-INDEX: 1; WIDTH: 10000000px; POSITION: relative
}
.carousel-component .carousel-list LI {
	FLOAT: left; OVERFLOW: hidden; LIST-STYLE-TYPE: none
}
.carousel-component .carousel-vertical LI {
	FLOAT: none; MARGIN-BOTTOM: 0px
}
.carousel-component UL.carousel-vertical {
	WIDTH: auto
}
.carousel-component .carousel-clip-region {
	MARGIN: 0px auto; OVERFLOW: hidden; POSITION: relative
}
#roo_component_wrapper {
	MARGIN: 0px; WIDTH: 300px
}
#roo_component_header {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #eee; =
PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: =
#c2c2c2 1px solid
}
#roo_component_header LI {
	PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; BACKGROUND: =
#eee; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px
}
#roo_component_header LI A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 4px; PADDING-BOTTOM: 0px; FONT: =
10px/23px arial, helvetica, sans-serif; COLOR: #609fdf; PADDING-TOP: 0px
}
#roo_component_header LI H5 {
	BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 6px; BORDER-TOP: =
#c2c2c2 1px solid; PADDING-LEFT: 26px; BACKGROUND: =
url(http://collegepublisher.com/media/assets/icons/fff/television.png) =
#fff no-repeat 6px 1px; FLOAT: left; PADDING-BOTTOM: 3px; MARGIN: 0px =
0px 0px 6px; FONT: bold 14px/1.2em Arial, Helvetica, sans-serif; =
BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 2px; BORDER-BOTTOM: #fff =
1px solid
}
.ie6 #roo_component_header LI H5 {
	MARGIN: 0px 0px 0px 3px
}
.safari #roo_component_header LI H5 {
	PADDING-RIGHT: 6px; PADDING-LEFT: 26px; PADDING-BOTTOM: 4px; =
PADDING-TOP: 2px; BORDER-BOTTOM: #fff 1px solid
}
#roo_component {
	BORDER-RIGHT: #c2c2c2 1px solid; BORDER-TOP: #c2c2c2 0px solid; =
BORDER-LEFT: #c2c2c2 1px solid; WIDTH: 298px; BORDER-BOTTOM: #c2c2c2 0px =
solid
}
.carousel-component {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BACKGROUND: #fff; BORDER-BOTTOM-WIDTH: 0px; =
PADDING-BOTTOM: 0px; MARGIN: 0px auto; COLOR: #618cbe; PADDING-TOP: 0px; =
BORDER-RIGHT-WIDTH: 0px; -moz-border-radius: 0px
}
.carousel-component UL.carousel-list {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
.carousel-component .carousel-prev {
	Z-INDEX: 3; LEFT: 0px; CURSOR: pointer; POSITION: absolute; TOP: 27px
}
.carousel-component .carousel-next {
	Z-INDEX: 3; RIGHT: 0px; CURSOR: pointer; POSITION: absolute; TOP: 27px
}
#roo_component .carousel-button {
	DISPLAY: block; WIDTH: 16px; TEXT-INDENT: -1000em; HEIGHT: 16px
}
#roo_component #prev-arrow {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_star=
t_blue.png)
}
#roo_component #next-arrow {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_end_=
blue.png)
}
.carousel-component .carousel-list LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: 4px =
0px 0px; FONT: 9px verdana,arial,sans-serif; WIDTH: 130px; COLOR: #666; =
PADDING-TOP: 0px; TEXT-ALIGN: center
}
.carousel-component .carousel-vertical LI {
=09
}
.carousel-component UL.carousel-vertical {
=09
}
.carousel-component .carousel-list LI A {
	BORDER-RIGHT: #fff 2px solid; BORDER-TOP: #fff 2px solid; DISPLAY: =
block; BORDER-LEFT: #fff 2px solid; COLOR: #000; BORDER-BOTTOM: #fff 2px =
solid; HEIGHT: 55px; TEXT-DECORATION: none! important; outline: none; =
-moz-outline: none
}
.carousel-component .carousel-list LI A:hover {
	BORDER-RIGHT: #fffccc 2px solid; BORDER-TOP: #fffccc 2px solid; =
BACKGROUND: #fffccc; BORDER-LEFT: #fffccc 2px solid; COLOR: #000; =
BORDER-BOTTOM: #fffccc 2px solid; TEXT-DECORATION: none! important
}
.carousel-component .carousel-list LI.active A {
	BORDER-RIGHT: #708fc7 2px solid; BORDER-TOP: #708fc7 2px solid; =
BORDER-LEFT: #708fc7 2px solid; BORDER-BOTTOM: #708fc7 2px solid
}
.carousel-component .carousel-list LI STRONG {
	DISPLAY: block
}
.carousel-component .carousel-list LI {
	POSITION: relative
}
.carousel-component .carousel-list LI IMG {
	BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; DISPLAY: =
block; LEFT: 2px; BORDER-LEFT: #999 1px solid; WIDTH: 50px; =
BORDER-BOTTOM: #999 1px solid; POSITION: absolute; TOP: 2px; HEIGHT: =
50px
}
.carousel-component .carousel-list LI DIV.roo_module_title {
	Z-INDEX: 4; RIGHT: 0px; OVERFLOW: hidden; WIDTH: 70px; COLOR: black; =
LINE-HEIGHT: 1em; POSITION: absolute; TOP: 2px; TEXT-ALIGN: left; =
TEXT-DECORATION: none
}
.carousel-component .carousel-list LI SPAN.roo_module_play {
	DISPLAY: block; TEXT-TRANSFORM: uppercase; COLOR: #609fdf! important; =
TEXT-DECORATION: none
}
.carousel-component .carousel-list LI A:hover SPAN.roo_module_play {
	TEXT-DECORATION: underline
}
#video_carousel {
	WIDTH: 300px
}
#video_carousel H5 {
	BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#c2c2c2 1px; PADDING-LEFT: 0px; BACKGROUND: #eeeeee; PADDING-BOTTOM: =
3px; MARGIN: 0px 0px 10px; FONT: 12px arial, verdana, sans-serif; =
BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #c2c2c2 =
1px solid; TEXT-ALIGN: center
}
#video_carousel H5 A {
	PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 18px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_play=
_blue.png) no-repeat left center; PADDING-BOTTOM: 0px; MARGIN: 0px 0px =
0px 2px; COLOR: #609fdf; PADDING-TOP: 0px
}
#cp_video {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #e1e1e1; =
PADDING-BOTTOM: 1em; MARGIN: 0px; FONT: 16px/18px "trebuchet ms", =
helvetica, arial, sans-serif; COLOR: #000; PADDING-TOP: 0px; TEXT-ALIGN: =
center
}
#cp_video #cp_video_wrap {
	BORDER-RIGHT: #888 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #888 1px =
solid; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: 0px; MARGIN: =
0px auto; BORDER-LEFT: #888 1px solid; WIDTH: 987px; PADDING-TOP: 0px; =
BORDER-BOTTOM: #888 1px solid; TEXT-ALIGN: left
}
#cp_video .leaderboard {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: #eee; =
PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; TEXT-ALIGN: center
}
#cp_video .leaderboard IMG {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px
}
#cp_video #header {
	MARGIN: 0px 0px 1.5em; WIDTH: 100%
}
#cp_video #header H1 {
	FONT: bold 1.8em/1.8em georgia, "times new roman", serif; WIDTH: 100%; =
TEXT-INDENT: -1000em
}
#cp_video #header H1 A {
	DISPLAY: block; HEIGHT: 107px
}
#cp_video #top_bar {
	FONT-SIZE: 80%; BACKGROUND: #2b004d; MARGIN: 10px 10px 0px; OVERFLOW: =
hidden; WIDTH: 967px
}
#cp_video #top_bar A {
	COLOR: #fff; TEXT-DECORATION: underline
}
#cp_video #top_bar A:visited {
	COLOR: #fff; TEXT-DECORATION: underline
}
#cp_video #top_bar H3 {
	PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 10px; =
PADDING-BOTTOM: 0px; FONT: 1.1em/27px arial, helvetica, sans-serif; =
COLOR: #fff; PADDING-TOP: 0px
}
#cp_video #video_iframe {
	PADDING-RIGHT: 0px; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px 0px 1em; PADDING-TOP: 0px
}
#cp_video #roo_frame {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: =
0px; MARGIN: 0px; OVERFLOW: hidden; BORDER-TOP-STYLE: none; PADDING-TOP: =
0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; =
BORDER-BOTTOM-STYLE: none
}
#cp_video #video_feed {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/feed_gradient.g=
if) #fff repeat-y left top; FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: =
0px; OVERFLOW: hidden; WIDTH: 200px; PADDING-TOP: 0px; HEIGHT: 920px
}
#cp_video #video_feed H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0.5em; BACKGROUND: #e7e7e7; =
PADDING-BOTTOM: 0px; FONT: bold 12px/1.6em arial, helvetica, sans-serif; =
WIDTH: 100%; COLOR: #666; PADDING-TOP: 0px
}
#cp_video #video_feed UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 13px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_video #video_feed LI {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: =
5px; MARGIN: 0px; PADDING-TOP: 5px; BORDER-BOTTOM: #c2c2c2 1px solid; =
LIST-STYLE-TYPE: none
}
#cp_video #video_feed LI:hover {
	BACKGROUND: #fffccc
}
#cp_video #video_feed IMG {
	BORDER-RIGHT: #c2c2c2 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#c2c2c2 1px solid; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: 0px; =
MARGIN: 0px 5px 0px 0px; BORDER-LEFT: #c2c2c2 1px solid; PADDING-TOP: =
0px; BORDER-BOTTOM: #c2c2c2 1px solid
}
#cp_video #video_feed LI H3 {
	FLOAT: left; FONT: bold 1em/1.2em arial, helvetica, sans-serif; =
TEXT-TRANSFORM: none; WIDTH: 45%; COLOR: #666
}
#cp_video #video_feed LI H3 SPAN {
	DISPLAY: block; TEXT-TRANSFORM: uppercase; COLOR: #609fdf
}
#cp_video #video_feed LI A:hover SPAN {
	TEXT-DECORATION: underline
}
#cp_video .cp_clear {
	CLEAR: both
}
#cp_video #footer {
	BORDER-TOP: #2b004d 4px solid; BACKGROUND: #fff; WIDTH: 100%; =
TEXT-ALIGN: left
}
#cp_video #footer P {
	PADDING-RIGHT: 0.5em; PADDING-LEFT: 0.5em; FONT-SIZE: 11px; =
PADDING-BOTTOM: 0.5em; COLOR: #666; PADDING-TOP: 0.5em
}
#cp_video #footer P A {
	FONT-WEIGHT: bold; COLOR: #2b004d; TEXT-DECORATION: none
}
#cp_article_photos * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#cp_article_photos A {
	COLOR: #666
}
#cp_article_photos A:hover {
	COLOR: #000; BACKGROUND-COLOR: #ff9
}
#cp_photo_wrapper {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; FONT: =
11px/1em Arial, Helvetica, sans-serif; WIDTH: 250px; PADDING-TOP: 0px
}
#cp_photo {
	BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: =
#dadada 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: =
#dadada 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #dadada 1px solid
}
#cp_photo * {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
MARGIN: 0px; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
#cp_photo LI {
	DISPLAY: block
}
#cp_photo UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
LI.cp_photo_block {
	LIST-STYLE-TYPE: none; TEXT-ALIGN: center
}
.cp_photo_container {
	BACKGROUND: #dadada; WIDTH: 240px
}
A .cp_photo_instructions {
	FONT-WEIGHT: bold; FONT-SIZE: 0.9em; TEXT-TRANSFORM: uppercase; COLOR: =
#bbb! important
}
A:hover .cp_photo_instructions {
	BACKGROUND: #ff9; COLOR: black! important
}
LI.cp_photo_credit {
	FONT-SIZE: 0.9em; MARGIN-BOTTOM: 0.5em! important; LIST-STYLE-TYPE: =
none; TEXT-ALIGN: right
}
.cp_photo_caption {
	MARGIN-BOTTOM: 1em! important; TEXT-ALIGN: left
}
.cp_slideshow_controls {
	PADDING-RIGHT: 1em! important; PADDING-LEFT: 1em! important; =
BACKGROUND: url(images/fade_up.gif) no-repeat center top; =
PADDING-BOTTOM: 1em! important; PADDING-TOP: 1em! important; TEXT-ALIGN: =
center
}
.cp_slideshow_controls A {
	COLOR: gray! important
}
.cp_slideshow_controls A:hover {
	COLOR: black! important
}
A#cp_photo_prev {
	PADDING-RIGHT: 0px; PADDING-LEFT: 18px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_star=
t.png) no-repeat left center; PADDING-BOTTOM: 1px; PADDING-TOP: 1px
}
A#cp_photo_next {
	PADDING-RIGHT: 18px; PADDING-LEFT: 0px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_end.=
png) no-repeat right center; PADDING-BOTTOM: 1px; MARGIN-LEFT: 1em; =
PADDING-TOP: 1px
}
#cp_gallery_wrapper {
	PADDING-BOTTOM: 5px; FONT: 11px/1em Arial, Helvetica, sans-serif; =
WIDTH: 250px
}
#cp_gallery {
	BORDER-RIGHT: #dadada 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: =
#dadada 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: =
#dadada 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: #dadada 1px solid
}
#cp_gallery * {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; =
MARGIN: 0px; COLOR: #000; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
.cp_gallery_loop LI {
	DISPLAY: block; FLOAT: left; WIDTH: 80px; HEIGHT: 80px
}
.cp_gallery_loop LI A {
	WIDTH: 75px; HEIGHT: 75px
}
.cp_gallery_loop LI A:hover IMG {
	BORDER-RIGHT: #ff9 2px solid; BORDER-TOP: #ff9 2px solid; BORDER-LEFT: =
#ff9 2px solid; BORDER-BOTTOM: #ff9 2px solid
}
.cp_gallery_loop LI IMG {
	BORDER-RIGHT: white 2px solid; BORDER-TOP: white 2px solid; MARGIN: 1px =
0px 0px 1px; BORDER-LEFT: white 2px solid; WIDTH: 75px; BORDER-BOTTOM: =
white 2px solid; HEIGHT: 75px
}
UL.cp_gallery_instructions {
	CLEAR: left; DISPLAY: block
}
UL.cp_gallery_instructions LI {
	DISPLAY: block; FONT-WEIGHT: bold; FONT-SIZE: 0.9em; TEXT-TRANSFORM: =
uppercase; COLOR: #bbb! important; PADDING-TOP: 5px! important; =
TEXT-ALIGN: center
}
#cp_lgphoto_wrapper {
	PADDING-BOTTOM: 15px; FONT: 11px/1em Arial, Helvetica, sans-serif
}
.cp_lgphoto_loop UL {
	DISPLAY: block
}
.cp_lgphoto_loop LI {
	DISPLAY: block
}
#cp_lgphoto_wrapper IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
#cp_photo LI {
	DISPLAY: block
}
#cp_lgphoto_wrapper .cp_photo_container {
	BACKGROUND: #dadada; OVERFLOW: hidden; WIDTH: 100%; TEXT-ALIGN: center
}
.cp_slideshow_controls {
	PADDING-RIGHT: 1em! important; PADDING-LEFT: 1em! important; =
BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/fade_up.gif) =
no-repeat center top; PADDING-BOTTOM: 1em! important; PADDING-TOP: 1em! =
important; TEXT-ALIGN: center
}
.cp_slideshow_controls A {
	COLOR: gray! important
}
.cp_slideshow_controls A:hover {
	COLOR: black! important
}
A#cp_photo_prev {
	PADDING-RIGHT: 0px; PADDING-LEFT: 18px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_star=
t.png) no-repeat left center; PADDING-BOTTOM: 1px; PADDING-TOP: 1px
}
A#cp_photo_next {
	PADDING-RIGHT: 18px; PADDING-LEFT: 0px; BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/icons/fff/control_end.=
png) no-repeat right center; PADDING-BOTTOM: 1px; MARGIN-LEFT: 1em; =
PADDING-TOP: 1px
}
.cp_slideshow_controls {
	DISPLAY: none! important
}
.cp_photo_loop {
	DISPLAY: none! important
}
#cp_photo_wrapper {
	DISPLAY: none! important
}
#cp_gallery_wrapper {
	DISPLAY: none! important
}
#cp_lgphoto_wrapper {
	DISPLAY: none! important
}
.layout_r #cp_photo_wrapper {
	DISPLAY: block! important
}
.layout_r .cp_photo_loop {
	DISPLAY: block! important
}
.layout_l #cp_photo_wrapper {
	DISPLAY: block! important
}
.layout_l .cp_photo_loop {
	DISPLAY: block! important
}
.layout_rs #cp_photo_wrapper {
	DISPLAY: block! important
}
.layout_ls #cp_photo_wrapper {
	DISPLAY: block! important
}
.layout_rs .cp_photo_first {
	DISPLAY: block! important
}
.layout_ls .cp_photo_first {
	DISPLAY: block! important
}
.layout_rs .cp_slideshow_controls {
	DISPLAY: block! important
}
.layout_ls .cp_slideshow_controls {
	DISPLAY: block! important
}
.layout_7 .cp_slideshow_controls {
	DISPLAY: block! important
}
.layout_7 .cp_slideshow_controls {
	DISPLAY: block! important
}
.layout_rg #cp_gallery_wrapper {
	DISPLAY: block! important
}
.layout_lg #cp_gallery_wrapper {
	DISPLAY: block! important
}
.layout_l {
	FLOAT: left! important; MARGIN-RIGHT: 0.5em! important
}
.layout_ls {
	FLOAT: left! important; MARGIN-RIGHT: 0.5em! important
}
.layout_lg {
	FLOAT: left! important; MARGIN-RIGHT: 0.5em! important
}
.layout_r {
	FLOAT: right! important; MARGIN-LEFT: 0.5em! important
}
.layout_rs {
	FLOAT: right! important; MARGIN-LEFT: 0.5em! important
}
.layout_rg {
	FLOAT: right! important; MARGIN-LEFT: 0.5em! important
}
.layout_7 #cp_lgphoto_wrapper {
	DISPLAY: block! important
}
.layout_7 #cp_at_wrapper {
	FLOAT: right! important; MARGIN-LEFT: 0.5em! important
}
#related_stories {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/rl_bkg.gif) =
no-repeat left bottom; FONT: 11px/18px Arial, Helvetica, sans-serif; =
WIDTH: 491px
}
#related_stories * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#related_stories H4 {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/assets/images/rl_top.gif) =
no-repeat left top; TEXT-INDENT: -1000em
}
#related_stories UL {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; LIST-STYLE-POSITION: inside; =
PADDING-BOTTOM: 5px; PADDING-TOP: 5px; LIST-STYLE-TYPE: none
}
#related_stories UL LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 18px; FONT-SIZE: 1.1em; BACKGROUND: =
url(http://collegepublisher.com/media/assets/icons/fff/link.png) =
no-repeat left center; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 8px; =
PADDING-TOP: 0px; BORDER-BOTTOM: #eee 1px dotted
}
#related_stories UL LI A {
	TEXT-DECORATION: none
}
#global_footer {
	CLEAR: left; PADDING-RIGHT: 0px; BORDER-TOP: #eee 2px solid; =
PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: #e0e0e0; PADDING-BOTTOM: =
10px; WIDTH: 100%; COLOR: #303030; LINE-HEIGHT: 16px; PADDING-TOP: 10px; =
POSITION: relative; TOP: 30px; TEXT-ALIGN: center
}
#global_footer #logo_mtvu {
	DISPLAY: inline-block; FONT-SIZE: 0px; BACKGROUND: =
url(/media/assets/images/logo_mtvu.gif) no-repeat left top; =
VERTICAL-ALIGN: bottom; OVERFLOW: hidden; WIDTH: 31px; TEXT-INDENT: =
-9999em; LINE-HEIGHT: 16px; HEIGHT: 16px
}
#global_footer #logo_mtvn {
	DISPLAY: inline-block; FONT-SIZE: 0px; BACKGROUND: =
url(/media/assets/images/logo_mtvn.gif) no-repeat left top; =
VERTICAL-ALIGN: bottom; OVERFLOW: hidden; WIDTH: 85px; TEXT-INDENT: =
-9999em; LINE-HEIGHT: 16px; HEIGHT: 16px
}

------=_NextPart_000_0000_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.dailycollegian.com/media/paper874/styles.css?v13

A {
	COLOR: #660000
}
A:hover {
	COLOR: #666666
}
#flan_header_meta {
	BORDER-TOP: #7b0c26 1px solid; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/collegian_meta.gif) #b4271f repeat-x 0px 0px; BORDER-BOTTOM: #7b0c26 =
1px solid
}
#flan_header_meta * {
	COLOR: #ffffff
}
#flan_nav H4 {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/collegian_fade.gif) #a62827 repeat-x left top; COLOR: #ffffff
}
#flan_nav LI A {
	COLOR: #fff; BORDER-BOTTOM: #b4271f 1px solid
}
#flan_nav LI.rss A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 23px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/rss_icon_14x14.gif) no-repeat 7px center; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#flan_nav LI A:hover {
	BACKGROUND-COLOR: #5a0803
}
#flan_nav LI.rss A:hover {
	BACKGROUND-COLOR: #5a0803
}
* {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
BODY {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/bg.gif) repeat-y; FONT: 12px/16px arial, verdana, sans-serif
}
#flan_wrap {
	WIDTH: 1000px
}
#flan_header * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px
}
#flan_header {
	FLOAT: left; POSITION: relative
}
#flan_header_main {
	BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/WebsiteMast.jpg) no-repeat left bottom; POSITION: relative; HEIGHT: =
90px
}
#flan_header_meta {
	FLOAT: left; OVERFLOW: hidden; WIDTH: 1000px; HEIGHT: 29px
}
#flan_header_meta * {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: =
12px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; text-shadow: =
2px 2px 1px #000
}
#flan_header_meta .gutter {
	MARGIN: 0px 7px
}
#flan_header_meta UL {
	LIST-STYLE-TYPE: none
}
#flan_header_meta LI {
	FLOAT: left
}
#flan_header_meta LI A {
	PADDING-RIGHT: 10px; FONT-WEIGHT: normal; FONT-SIZE: 15px; FLOAT: left; =
LINE-HEIGHT: 29px
}
#flan_meta_right FIELDSET {
	BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: =
none; BORDER-BOTTOM-STYLE: none
}
#flan_meta_right INPUT {
	FONT-SIZE: 10px; COLOR: #000000! important
}
H1#flan_logo {
	WIDTH: 1000px; TEXT-INDENT: 0px; LINE-HEIGHT: 90px; HEIGHT: 90px
}
H1#flan_logo A {
	DISPLAY: block; WIDTH: 650px; TEXT-INDENT: -1000px; LINE-HEIGHT: 90px; =
HEIGHT: 90px
}
#flan_body {
	FLOAT: left
}
#flan_nav {
	BACKGROUND: #870c05; FLOAT: left; WIDTH: 180px
}
#flan_body_wrap {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; OVERFLOW: hidden; WIDTH: 820px; PADDING-TOP: 10px
}
#flan_leader {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; =
PADDING-TOP: 5px; TEXT-ALIGN: center
}
#flan_content {
	FLOAT: left; WIDTH: 520px
}
#flan_content .gutter {
	MARGIN: 0px 10px 10px
}
.flan_lead {
	MARGIN: 0px 0px 20px
}
.flan_lead H2 {
	TEXT-TRANSFORM: uppercase
}
.flan_lead IMG {
	FLOAT: left; MARGIN: 0px 10px 10px 0px
}
.flan_fp_section {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 20px; PADDING-TOP: 0px; BORDER-BOTTOM: #d8d8d8 1px solid
}
.flan_fp_section IMG {
	FLOAT: left; MARGIN: 0px 5px 5px 0px
}
.flan_fp_section H4 {
	FONT-SIZE: 1.5em; MARGIN: 0px; LINE-HEIGHT: 1.4em
}
.flan_fp_section H3 {
	PADDING-RIGHT: 0px; BORDER-TOP: #d8d8d8 1px solid; PADDING-LEFT: 5px; =
FONT-SIZE: 1.2em; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/section_bg.jpg) #ececec repeat-x left top; PADDING-BOTTOM: 0px; =
MARGIN: 0px 0px 10px; TEXT-TRANSFORM: uppercase; LINE-HEIGHT: 1.8em; =
PADDING-TOP: 0px; BORDER-BOTTOM: #d8d8d8 1px solid
}
.flan_section_lead {
	FLOAT: left; WIDTH: 300px
}
.flan_section_lead IMG {
	BORDER-RIGHT: #d8d8d8 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: =
#d8d8d8 1px solid; PADDING-LEFT: 3px; FLOAT: left! important; =
PADDING-BOTTOM: 3px; MARGIN: 0px 5px 0px 0px; BORDER-LEFT: #d8d8d8 1px =
solid; PADDING-TOP: 3px; BORDER-BOTTOM: #d8d8d8 1px solid
}
.flan_fp_section UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: right; PADDING-BOTTOM: =
0px; MARGIN: 0px; WIDTH: 155px; PADDING-TOP: 0px
}
.flan_fp_section LI {
	LIST-STYLE-POSITION: inside; FONT-SIZE: 14px; MARGIN: 0px 0px 5px; =
LIST-STYLE-TYPE: disc
}
.flan_section_more {
	TEXT-ALIGN: right
}
.flan_clear {
	CLEAR: both
}
.flan_section {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 15px; MARGIN: =
0px 0px 15px; PADDING-TOP: 0px; BORDER-BOTTOM: #999 1px dotted
}
.flan_section_title {
	FONT-SIZE: 22px; MARGIN: 0px 0px 15px; LINE-HEIGHT: 1.2em; =
BORDER-BOTTOM: #666 1px solid
}
.flan_section H2 {
	FONT-SIZE: 18px; MARGIN: 0px 0px 2px; LINE-HEIGHT: 1.2em
}
.flan_section H3 {
	FONT-WEIGHT: normal; FONT-SIZE: 14px; MARGIN: 0px 0px 5px; LINE-HEIGHT: =
1.2em
}
.flan_section H5 {
	MARGIN: 0px 0px 5px; FONT: 14px/1.2em Georgia, Times New Roman, serif
}
.flan_section P {
	MARGIN: 0px
}
.flan_author {
	TEXT-TRANSFORM: uppercase
}
#flan_footer {
	CLEAR: both; PADDING-RIGHT: 10px; BORDER-TOP: #dddddd 4px solid; =
PADDING-LEFT: 10px; BACKGROUND: #e5e5e5; PADDING-BOTTOM: 10px; FONT: =
11px/15px arial, verdana, sans-serif; PADDING-TOP: 10px; POSITION: =
relative; TOP: 33px
}
#flan_footer A {
	COLOR: #000
}
#flan_footer A:hover {
	COLOR: #000; TEXT-DECORATION: underline
}
#flan_nav H4 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 7px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 13px/25px arial, verdana, sans-serif; TEXT-TRANSFORM: =
uppercase; PADDING-TOP: 0px; text-shadow: 2px 2px 1px #000000
}
#flan_nav LI {
	DISPLAY: inline; LIST-STYLE-TYPE: none
}
#flan_nav LI A {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 7px; PADDING-BOTTOM: =
0px; FONT: 13px/25px arial, verdana, sans-serif; PADDING-TOP: 0px; =
TEXT-DECORATION: none
}
#flan_nav LI UL A {
	PADDING-RIGHT: 0px; PADDING-LEFT: 14px; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
#flan_nav LI UL A:unknown {
	content: "- "
}
#banner_client_1 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; =
PADDING-TOP: 10px; TEXT-ALIGN: center
}
#issuedate {
	FONT-SIZE: 11px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/collegian_fade.gif) #a62827 repeat-x left top; COLOR: #fff; =
LINE-HEIGHT: 20px; TEXT-ALIGN: center
}
.slider_wrap P.flan_section_more {
	MARGIN: 0px
}
.slider_wrap {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 1px; BORDER-TOP: #ccc 1px =
solid; PADDING-LEFT: 1px; PADDING-BOTTOM: 0px; BORDER-LEFT: #ccc 1px =
solid; PADDING-TOP: 1px; BORDER-BOTTOM: #ccc 1px
}
#flan_content .contentslide {
	PADDING-RIGHT: 9px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; OVERFLOW: =
hidden; PADDING-TOP: 5px; POSITION: relative; HEIGHT: 420px
}
.contentslide .contentdiv {
	DISPLAY: none
}
DIV.pagination_wrapper {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/collegian_fade.gif) #a62827 repeat-x left top; PADDING-BOTTOM: 0px; =
MARGIN: 0px 0px 10px; PADDING-TOP: 0px
}
DIV.pagination_wrapper .pagination_slider {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper874/template/templatemed=
ia/collegian_fade.gif) #a62827 repeat-x left top; PADDING-BOTTOM: 0px; =
MARGIN: 0px; PADDING-TOP: 0px; POSITION: relative; TEXT-ALIGN: left
}
.pagination_slider A {
	PADDING-RIGHT: 5px; PADDING-LEFT: 5px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 2px; FONT: bold 1em/20px trebuchet =
ms, verdana, sans-serif; COLOR: #fff! important; PADDING-TOP: 3px; =
TEXT-DECORATION: none
}
.pagination_slider A.selected {
	BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: #ccc 1px; =
PADDING-LEFT: 4px; BACKGROUND: =
url(http://media.collegepublisher.com/media/paper689/template/templatemed=
ia/tab_bkg.gif) #fff repeat-x right bottom; PADDING-BOTTOM: 3px; FONT: =
bold 1em/20px trebuchet ms, verdana, sans-serif; BORDER-LEFT: #ccc 1px =
solid; COLOR: #a62827! important; PADDING-TOP: 3px; BORDER-BOTTOM: #ccc =
1px solid
}
.pagination_slider A:hover {
	TEXT-DECORATION: underline
}
.pagination_wrapper A.pagination_next:hover {
	PADDING-RIGHT: 4px; PADDING-LEFT: 5px; BACKGROUND: none transparent =
scroll repeat 0% 0%; PADDING-BOTTOM: 3px; BORDER-TOP-STYLE: none; =
PADDING-TOP: 3px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; =
BORDER-BOTTOM-STYLE: none
}
.pagination_wrapper A.pagination_next IMG {
	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; POSITION: absolute; TOP: 2px; =
BORDER-BOTTOM-STYLE: none
}

------=_NextPart_000_0000_01C9611B.563D02A0
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_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://edge.quantserve.com/quant.js

function _qcdst(){if(_qctzoff(0)!=3D_qctzoff(6))return 1;return 0;}=0A=
function _qctzoff(m){=0A=
var d1=3Dnew Date(2000,m,1,0,0,0,0);=0A=
var t=3Dd1.toGMTString();=0A=
var d3=3Dnew Date(t.substring(0,t.lastIndexOf(" ")-1));=0A=
return d1-d3;=0A=
}=0A=
function _qceuc(s){=0A=
if(typeof(encodeURIComponent)=3D=3D'function'){return =
encodeURIComponent(s);}=0A=
else{return escape(s);}=0A=
}=0A=
function _qcrnd(){return Math.round(Math.random()*2147483647);}=0A=
function _qvoid(){return;}=0A=
function _qcgc(n){=0A=
 var v=3D'';=0A=
 var c=3Ddocument.cookie;if(!c)return v;=0A=
 var i=3Dc.indexOf(n+"=3D");=0A=
 var len=3Di+n.length+1;=0A=
 if(i>-1){=0A=
  var end=3Dc.indexOf(";", len);=0A=
  if(end<0)end=3Dc.length;=0A=
  v=3Dc.substring(len,end);=0A=
 }=0A=
 return v;=0A=
}=0A=
function _qcdomain(){=0A=
 var d=3Ddocument.domain;=0A=
 if(d.substring(0,4)=3D=3D"www.")d=3Dd.substring(4,d.length);=0A=
 var a=3Dd.split(".");var len=3Da.length;=0A=
 if(len<3)return d;=0A=
 var e=3Da[len-1];=0A=
 if(e.length<3)return d;=0A=
 d=3Da[len-2]+"."+a[len-1];=0A=
 return d;=0A=
}=0A=
function _qcsc(dc){=0A=
 var s=3D"",u=3Ddocument;var d=3D_qcdomain();var a=3D_qcgc("__qca");=0A=
 if(a.length>0){s+=3D";fpan=3D0;fpa=3D"+a;}=0A=
 else{=0A=
  u.cookie=3D"__qca=3D"+dc+"; expires=3DSun, 18 Jan 2038 00:00:00 GMT; =
path=3D/; domain=3D"+d;=0A=
  a=3D_qcgc("__qca");=0A=
  if(a.length>0){s+=3D";fpan=3D1;fpa=3D"+dc;}=0A=
  else{s+=3D";fpan=3Du;fpa=3D";}=0A=
 }=0A=
 var b=3D_qcgc("__qcb");=0A=
 if(b.length>0){s+=3D";fpbn=3D0;fpb=3D"+b;}=0A=
 else{b=3D_qcrnd();=0A=
  u.cookie=3D"__qcb=3D"+b+"; path=3D/; domain=3D"+d;=0A=
  b=3D_qcgc("__qcb");=0A=
  if(b.length>0){s+=3D";fpbn=3D1;fpb=3D"+b;}=0A=
  else{s+=3D";fpbn=3Du;fpb=3D";}=0A=
 }=0A=
 return s;=0A=
}=0A=
function quantserve(){=0A=
 var r=3D_qcrnd();=0A=
 var =
sr=3D'',qo=3D'',qm=3D'',url=3D'',ref=3D'',je=3D'u',ns=3D'1',media=3D'webp=
age',event=3D'load';=0A=
 if(typeof _qoptions !=3D"undefined" && _qoptions!=3Dnull){=0A=
  for(var k in _qoptions){=0A=
   if(typeof(_qoptions[k])!=3D'string'){continue;}=0A=
   if(k=3D=3D'qacct'){_qacct=3D_qoptions[k];}=0A=
   else{qo+=3D';'+k+'=3D'+_qceuc(_qoptions[k]);}=0A=
   if(k=3D=3D'media'){media=3D_qoptions[k];}=0A=
   if(k=3D=3D'event'){event=3D_qoptions[k];}=0A=
  }=0A=
  _qoptions=3Dnull;=0A=
 }=0A=
 if((typeof _qacct =3D=3D"undefined")||(_qacct.length=3D=3D0))return;=0A=
 if(media=3D=3D'webpage' && event=3D=3D'load'){=0A=
  if((typeof _qpixelsent =
!=3D"undefined")&&(_qpixelsent=3D=3D_qacct))return;=0A=
  _qpixelsent=3D_qacct;}=0A=
 var ce=3D(navigator.cookieEnabled)?"1":"0";=0A=
 if(typeof navigator.javaEnabled =
!=3D'undefined')je=3D(navigator.javaEnabled())?"1":"0";=0A=
 if(typeof _qmeta !=3D"undefined" && =
_qmeta!=3Dnull){qm=3D';m=3D'+_qceuc(_qmeta);_qmeta=3Dnull;}=0A=
 =
if(self.screen){sr=3Dscreen.width+"x"+screen.height+"x"+screen.colorDepth=
;}=0A=
 var d=3Dnew Date();=0A=
 var dst=3D_qcdst();=0A=
=0A=
=0A=
=0A=
 var dc=3D"1221517241-685587-13352089";=0A=
 var qs=3D"http://pixel.quantserve.com";=0A=
 var fp=3D_qcsc(dc);=0A=
 if(window.location && =
window.location.href)url=3D_qceuc(window.location.href);=0A=
 if(window.document && =
window.document.referrer)ref=3D_qceuc(window.document.referrer);=0A=
 if(self=3D=3Dtop)ns=3D'0';=0A=
 var img=3Dnew Image(1,1);=0A=
 img.alt=3D"";=0A=
 =
img.src=3Dqs+'/pixel'+';r=3D'+r+fp+';ns=3D'+ns+';url=3D'+url+';ref=3D'+re=
f+';ce=3D'+ce+';je=3D'+je+';sr=3D'+sr+';dc=3D'+dc+';dst=3D'+dst+';et=3D'+=
d.getTime()+';tzo=3D'+d.getTimezoneOffset()+';a=3D'+_qacct+qo+qm;=0A=
 img.onload=3Dfunction() {_qvoid();}=0A=
}=0A=
quantserve();=0A=

------=_NextPart_000_0000_01C9611B.563D02A0
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_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/global.js?14

//test

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;
		};
	};
};

// Allows for link to prompt user, and then generate a YahooIM with a =
clickthrough
//=20
// Matt Smith
// October 2007
//=20

function YahooIM() {
	// check to see if a URL was passed into the function
	if (YahooIM.arguments.length=3D=3D1)
	{
		// it was, so use it
		var url =3D YahooIM.arguments[0];
	} else {
		// it wasn't, so use the document location
			var url =3D this.document.location;
	}
	// request the recipient's Yahoo IM screenname
	var YahooBuddy =3D prompt('Please enter your friend\'s Yahoo IM =
screenname', '');
	// if left blank, return
	if ( (YahooBuddy=3D=3D'') || (YahooBuddy=3D=3Dnull))=20
	{
		return
	}
	// create the message
	var message =3D 'ymsgr:sendIM?' + YahooBuddy + '&m=3D' + url;
	// request the url
	document.location =3D message;
}
------=_NextPart_000_0000_01C9611B.563D02A0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://media.collegepublisher.com/media/scripts/network_channel.js?2

// Search Engine Submit

function livesearch() {
		x =3D document.getElementById('net_search_input').value;	=09
		document.location=3D'http://search.live.com/results.aspx?q=3D' + x + =
'&go=3D&form=3DQBLH&scope=3Dweb';
}
------=_NextPart_000_0000_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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_01C9611B.563D02A0
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=
		UF
