From: <Salvato da Windows Internet Explorer 8>
Subject: ScienceDirect - Search Results: VOL-ISSUE("Volume 69") AND VOL-ISSUE("Issue 2") AND PAGES(148) AND AUTHORS(borella p)
Date: Wed, 26 Jan 2011 15:06:14 +0100
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0071_01CBBD6A.9374CEC0"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3664

This is a multi-part message in MIME format.

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science?_ob=ArticleListURL&_method=list&_ArticleListID=1620511430&_sort=r&_st=13&view=c&_acct=C000031478&_version=1&_urlVersion=0&_userid=606302&md5=c29eb5da46bf7113e448bc47117083c2&searchtype=a

=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><HEAD><TITLE>ScienceDirect - Search Results: VOL-ISSUE("Volume =
69") AND VOL-ISSUE("Issue 2") AND PAGES(148) AND AUTHORS(borella =
p)</TITLE>
<META content=3D"text/html; charset=3DUTF-8" =
http-equiv=3DContent-Type><!-- TRANSKEY: 01/26/2011 09:06:12 =
EST#1842_002#169414#155.185.26.49 -->
<META name=3Drobots content=3DNOINDEX,NOFOLLOW,NOARCHIVE><LINK =
rel=3D"shortcut icon"=20
type=3Dimage/x-icon href=3D"/scidirimg/faviconSD.ico">
<STYLE type=3Dtext/css>.nojs {
	DISPLAY: none
}
</STYLE>

<SCRIPT type=3Dtext/javascript>=0A=
=0A=
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){=0A=
document.styleSheets[0].rules[0].style["display"] =3D "";=0A=
} else{=0A=
document.styleSheets[0].cssRules[0].style["display"] =3D "";=0A=
}=0A=
=0A=
</SCRIPT>
<LINK title=3D"Default Styles" rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.sciencedirect.com/science/page/static/stylesheets/css_=
gen_v01.css"><!--[if  IE 7]>=0A=
<link rel=3D"stylesheet" Title=3D"Default Styles" =
href=3D"/science/page/static/stylesheets/css_gen_ie7_v01.css" =
type=3D"text/css">=0A=
<![endif]--><!--[if lte IE 6]>=0A=
<link rel=3D"stylesheet" Title=3D"Default Styles" =
href=3D"/science/page/static/stylesheets/css_gen_ie6_v01.css" =
type=3D"text/css">=0A=
<![endif]--><!-- if not logged in -->
<META content=3D"BROWSER_SUPPORTS_COOKIES=3D1; path=3D/" =
http-equiv=3DSet-Cookie><!-- searchResultFasttmpl -->
<SCRIPT language=3DJavascript type=3Dtext/javascript>=0A=
<!--=0A=
var scopusAccess =3D '';=0A=
var htmlPath =3D "http://www.sciencedirect.com/science/page/javascript";=0A=
var sciverse =3D =
decodeURIComponent('{%22contextInfo%22%3A{%20%22manageApps%22%3A%22false%=
22,%20%22gadgetUtilsURL%22%3A%22http%3A%2F%2Fwww.sciencedirect.com%2Fgadg=
etcontext%2Fgadgets%22,%20%22secureAuthtoken%22%3A%22sat_8B6150C7D723855F=
06C39A7FAD5ABBC867C5619A7175BBF1859C3A4D5928CB2D090405C5F9A8AC6259FAF302D=
6E92337E20EC17406E1CC1DC4E3F9F831268413E43BB2D268BD2A1F948EE132009EF557B7=
FCB512D3CC233244B6B6656197A7F49F3F6C79E19E42D2623F2B2EF249595B235F12CE381=
D6CAAEFF26FCC1AB700C1AB50504980E4198E659293762C532B5F8EC25C19D1710B6EB7FA=
548E53FBF64A26259BFF709C04038B8CE3323E405D12%22,%20%22pageContentDivTagNa=
me%22%3A%22sciverseCanvasArea%22,%20%22searchTerms%22%3A%22borella%20p%22=
,%20%22searchNonNormTerms%22%3A%22borella%20p%22,%20%22au1Init1%22%3A%22%=
22,%20%22au1Sur_N%20%22%3A%22%22,%20%22au1Sur%20%22%3A%22%22,%22docTitle%=
22%3A%22%22,%20%22docTitle_N%22%3A%22%20%22,%20%22doi%22%3A%22%22,%20%22e=
id%22%3A%22%22,%20%22entitlement%22%3A%22%22,%20%22ePage%22%3A%22%22,%20%=
22sPage%22%3A%22%22,%20%22issn%22%3A%22%22,%20%22isbn%22%3A%22%20%22,%20%=
22partTitle%22%3A%22%22,%20%22partValue%22%3A%22%22,%20%22pii%22%3A%22%22=
,%20%22srcTitle%22%3A%22%22,%20%22volume%22%3A%22%22,%20%22year%22%3A%22%=
20%22,%20%22issue%22%3A%22%20%22,%20%22timestamp%22%3A%2201%2F26%2F2011%2=
009%3A06%3A13%22,%20%22accountId%22%3A%22C000031478%22,%20%22searchQuery%=
22%3A%22VOL-ISSUE(\\%22Volume%2069\\%22)%20AND%20VOL-ISSUE(\\%22Issue%202=
\\%22)%20AND%20PAGES(148)%20AND%20AUTHORS(borella%20p)%22},%20%22gadgetIn=
fo%22%3A[{%20%22gadgetcontentTypeCode%22%3A%22%20%22,%20%22gadgetKeyName%=
22%3A%22%22,%20%22gadgetId%22%3A%22292644%22,%20%22gadgetUpdateDate%22%3A=
%2201%2F05%2F2011%2013%3A42%3A34%22,%20%22gadgetPromoted%22%3A%22Y%22,%20=
%22gadgetName%22%3A%22Most%20Cited%22,%20%22gadgetDescription%22%3A%22Qui=
ckly%20find%20the%20most%20authoritative%20articles%20in%20your%20search%=
20results%20with%20the%20MostCited%20application.%20Powered%20by%20Scopus=
.%22,%20%22gadgetContactEmail%22%3A%22ElsevierAppQuestion%40elsevier.com%=
22,%20%22gadgetIcon%22%3A%22http%3A%2F%2Fae-content.elsevier.com%2Fsvapp%=
2F292644%2Fprod%2Ficon.png%22,%20%22url%22%3A%22http%3A%2F%2Fae-content.e=
lsevier.com%2Fsvapp%2F292644%2Fprod%2Fprivate%2Fspec.xml%22,%20%22gadgetP=
aidApp%22%3A%22N%22,%20%22gadgetTargetContent%22%3A%22N%22,%20%22gadgetSu=
bjectAreas%22%3A%22%22,%20%22location%22%3A%22SD_SR1%22,%20%22closed%22%3=
Afalse}],%20%22smapiVars%22%3A{%20%22serverBaseURL%22%3A%22http%3A%2F%2Fs=
civerse-shindig.elsevier.com%2Fgadgets%22,%20%22gadgetLoadTimeout%22%3A%2=
230000%22,%20%22gadgetStateURL%22%3A%22http%3A%2F%2Fwww.sciencedirect.com=
%2Fscience%2FSciVerseBrowserStateChangeURL%22,%20%22keyEventURL%22%3A%22h=
ttp%3A%2F%2Fwww.sciencedirect.com%2Fscience%2FSciVerseBrowserStateChangeU=
RL%22,%20%22gadgetAddURL%22%3A%22http%3A%2F%2Fwww.applications.sciverse.c=
om%2Faction%2Fgallery%22,%20%22gadgetManagePage%22%3A%22http%3A%2F%2Fwww.=
applications.sciverse.com%2Faction%2Fcustomer%2Fprofile%22,%20%22searchQu=
eryURL%22%3A%22http%3A%2F%2Fwww.hub.sciverse.com%2Faction%2Fsearch%2Fresu=
lts%22,%20%22gadgetDetailPage%22%3A%22http%3A%2F%2Fwww.applications.scive=
rse.com%2Faction%2FappDetail%22,%20%22metadataService%22%3A%22http%3A%2F%=
2Fwww.sciencedirect.com%2Fgadgetcontext%2Fmetadata%22}}');=0A=
var resultListdecode =3D =
decodeURIComponent('[{%20%22au1Init1%22%3A%22P.%20Borella,%20A.%20Bargell=
ini,%20I.%20Marchesi,%20S.%20Rovesti,%20G.%20Stancanelli,%20S.%20Scaltrit=
i,%20M.%20Moro,%20M.T.%20Montagna,%20D.%20Tato,%20C.%20Napoli,%20M.%20Tri=
assi,%20S.%20Montegrosso,%20F.%20Pennino,%20C.M.%20Zotti,%20S.%20Ditommas=
o,%20M.%20Giacomuzzi%22,%20%22au1Sur_N%22%3A%22%20A.,%20Bargellini%20|%20=
I.,%20Marchesi%20|%20S.,%20Rovesti%20|%20G.,%20Stancanelli%20|%20S.,%20Sc=
altriti%20|%20M.,%20Moro%20|%20M.T.,%20Montagna%20|%20D.,%20Tat=C3=B2%20|=
%20C.,%20Napoli%20|%20M.,%20Triassi%20|%20S.,%20Montegrosso%20|%20F.,%20P=
ennino%20|%20C.M.,%20Zotti%20|%20S.,%20Ditommaso%20|%20M.,%20Giacomuzzi%2=
2,%20%22doi%22%3A%2210.1016%2Fj.jhin.2008.03.004%22,%20%22smi%22%3A%22688=
4%22,%20%22authorKeywords%22%3A%22Legionella%20|%20Occupational%20exposur=
e%20|%20Hospital%20staff%20|%20Anti-Legionella%20antibodies%20|%20Risk%20=
factors%20|%20Seroprevalence%22,%20%22sPage%22%3A%22148%3C%2FHT%3E%22,%20=
%22ePage%22%3A%22155%22,%22docTitle_N%22%3A%22Prevalence%20of%20anti-legi=
onella%20antibodies%20among%20Italian%20hospital%20workers%22,%20%22eid%2=
2%3A%221-s1.0-4SD1-KH70-TW19-V0K3-00000-00%22,%20%22pubDate%22%3A%22%22,%=
20%22issn%22%3A%2201956701%22,%22isbn%22%3A%22%22,%20%22issue%22%3A%222%2=
2,%20%22markers%22%3A%22%20%22,%20%22srcType%22%3A%22JOURNAL%22,%20%22pii=
%22%3A%22S0195670108001060%22,%22volume%22%3A%2269%22,%20%22year%22%3A%22=
2008%22,%20%22pg%22%3A%22Pages%3CHT%3E%20148%3C%2FHT%3E-155%22,%20%22docT=
itle%22%3A%22%22,%20%22au1Sur%22%3A%22Borella%20P%22,%20%22srcTitle%22%3A=
%22Journal%20of%20Hospital%20Infection%22,%20%22entitlement%22%3A%22subsc=
ribed%22,%20%22partTitle%22%3A%22%22,%20%22partValue%22%3A%22%22}]');=0A=
//-->=0A=
</SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/jquery-1.4.2.=
js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/gadgetcontext/gadgets/js/jquery-outsi=
de.js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://sciverse-shindig.elsevier.com/gadgets/js/shindig-container:=
rpc.js?c=3D1&amp;debug=3D1"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/gadgetcontext/gadgets/js/SciverseShin=
digService.js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/gadgetcontext/gadgets/js/SciverseShin=
digContainer.js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.hub.sciverse.com/gadgetcontext/gadgets/js/HUBShindigSer=
vice.js"></SCRIPT>
<LINK title=3D"Default Styles" rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.sciencedirect.com/gadgetcontext/gadgets/css/toolbar.cs=
s">
<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/gadgetcontext/gadgets/js/GadgetToolBa=
r.js"></SCRIPT>

<SCRIPT language=3DJavascript type=3Dtext/javascript>=0A=
var resultList =3D gadgets.json.parse(resultListdecode);=0A=
</SCRIPT>
<LINK title=3D"Default Styles" rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.sciencedirect.com/science/page/static/stylesheets/css_=
srch_result_v01.css">
<META name=3DGENERATOR content=3D"MSHTML 8.00.6001.18928"></HEAD>
<BODY onload=3D'displayGadgets("toolbar", "horizontal", sciverse);'=20
bgColor=3D#ffffff text=3D#000000>
<SCRIPT language=3Djavascript type=3Dtext/javascript>=0A=
<!--=0A=
function TagFormReplace(obName,methName,theMD5){=0A=
  document.Tag._ob.value=3D obName;=0A=
  document.Tag._method.value =3D methName;=0A=
  document.Tag.md5.value=3DtheMD5;=0A=
}=0A=
//-->=0A=
</SCRIPT>

<SCRIPT language=3Djavascript type=3Dtext/javascript>=0A=
<!--=0A=
=0A=
function checkReturn(formField, e) {=0A=
  var keycode;=0A=
  if (window.event) { keycode =3D window.event.keyCode; }=0A=
  else if (e) { keycode =3D e.which; }=0A=
  else { return true; }=0A=
=0A=
  if(keycode=3D=3D13) {=0A=
      formField.form.sisr_search.value =3D "1";=0A=
      formField.form.submit();=0A=
      return false;=0A=
  }=0A=
  else { return true; }=0A=
}=0A=
//-->=0A=
</SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/previewWindow=
.js"></SCRIPT>

<SCRIPT language=3Djavascript type=3Dtext/javascript>=0A=
<!--=0A=
=0A=
function navMore(elemID, controlID) {=0A=
  var navItems =3D document.getElementById(elemID);=0A=
  navItems.style.display =3D '';=0A=
  var expControl =3D document.getElementById(controlID);=0A=
  expControl.innerHTML =3D '<a =
href=3D"javascript:navLess(\''+elemID+'\',\''+controlID+'\')">view =
less&nbsp;<img src=3D"/scidirimg/login_collapse.gif" border=3D"0" =
style=3D"vertical-align:middle;">';=0A=
}=0A=
=0A=
function navLess(elemID, controlID) {=0A=
  var navItems =3D document.getElementById(elemID);=0A=
  navItems.style.display =3D 'none';=0A=
  var expControl =3D document.getElementById(controlID);=0A=
  expControl.innerHTML =3D '<a =
href=3D"javascript:navMore(\''+elemID+'\',\''+controlID+'\')">view =
more&nbsp;<img src=3D"/scidirimg/login_expand.gif" border=3D"0" =
style=3D"vertical-align:middle;">';=0A=
}=0A=
=0A=
function toggleYears() {=0A=
  var togVal =3D false;=0A=
  if(document.Tag.navYear[20].checked) { togVal =3D true; }=0A=
  for(var i=3D0; i<20; i++) {=0A=
      document.Tag.navYear[i].disabled =3D togVal;=0A=
  }  =0A=
}=0A=
=0A=
//-->=0A=
</SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/fontSizeChang=
er.js"></SCRIPT>

<DIV id=3Dheader class=3DouterWrapper>
<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/prototype.js"=
></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/effects.js"><=
/SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/controls_mod.=
js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/openWindow.js=
"></SCRIPT>

<SCRIPT language=3DJavascript type=3Dtext/javascript><!--=0A=
=0A=
function flip(e){=0A=
  var menustyle =3D eval(getStyleObj(e))=0A=
    if (menustyle.display=3D=3D"none"){=0A=
      menustyle.display=3D'';=0A=
         if (e =3D=3D "alertSettings") {=0A=
            document.getElementById("registrationOptional").innerHTML =
=3D "Hide alert & other settings. <img =
src=3D\"/scidirimg/sign_minus.gif\"/>";=0A=
            document.getElementById("textRow").style.background =3D =
'#f7f7f7';=0A=
         }=0A=
    }=0A=
    else{=0A=
      menustyle.display=3D"none"=0A=
         if (e =3D=3D "alertSettings") {=0A=
             document.getElementById("registrationOptional").innerHTML =
=3D "Show alert & other settings. <img =
src=3D\"/scidirimg/sign_plus.gif\"/>";=0A=
             document.getElementById("textRow").style.background =3D =
'#efefef';=0A=
         }=0A=
    }=0A=
}=0A=
=0A=
function getStyleObj(elem,parent) {=0A=
   if (document.layers) {=0A=
   if (parent) {=0A=
      return "document."+parent+".document."+elem;=0A=
   } else {=0A=
      return "document."+elem + ".style";=0A=
   }=0A=
   } else if (document.all) {=0A=
     return "document.all."+elem + ".style";=0A=
   } else if (document.getElementById) {=0A=
     return "document.getElementById('"+elem+"').style";=0A=
   }=0A=
}=0A=
function flipLogin(e,button){=0A=
  var t =3D eval(getStyleObj(e));=0A=
  var u =3D $('loginPlus');=0A=
  var v =3D $('userPlus');=0A=
  var userbox =3D $('userBox');=0A=
  var j =3D $('loginPlusScript');=0A=
  if(button =3D=3D null){=0A=
    if (t.display=3D=3D"none"){=0A=
      t.display =3D 'block';=0A=
      j.removeClassName('plus');=0A=
      j.addClassName('minus');=0A=
    }=0A=
    else{=0A=
      t.display =3D 'none';=0A=
      j.removeClassName('minus');=0A=
      j.addClassName('plus');=0A=
    }=0A=
  }=0A=
  else if (button =3D=3D "userPlus" ) {=0A=
    if (t.display=3D=3D"none" ){=0A=
      t.display =3D 'block';=0A=
      v.removeClassName('userPlus');=0A=
      v.addClassName('userMinus');=0A=
    }=0A=
    else{=0A=
      t.display =3D 'none';=0A=
      v.removeClassName('userMinus');=0A=
      v.addClassName('userPlus');=0A=
    }=0A=
  }=0A=
  else{=0A=
    if (t.display=3D=3D"none" ){=0A=
      t.display =3D 'block';=0A=
      userbox.style.display =3D'none';=0A=
      v.removeClassName('userMinus');=0A=
      v.addClassName('userPlus');=0A=
    }=0A=
    else{=0A=
      t.display =3D 'none';=0A=
    }=0A=
  }=0A=
}=0A=
=0A=
=0A=
//--></SCRIPT>

<DIV style=3D"Z-INDEX: 2; POSITION: relative; BACKGROUND-COLOR: #ffffff" =

class=3DouterWrapper>
<DIV id=3Dmasthead><!-- INSERTS THE TEMPLATE VARIABLES POPULATED FROM DB =
for SCIVERSE and PRODUCT labels -->
<DIV id=3DlogoSciVerse><A=20
href=3D"http://www.sciencedirect.com/science?_ob=3DRedirectURL&amp;_metho=
d=3DoutwardLink&amp;_activity=3DSciVerse&amp;_origin=3Drslt_list&amp;_zon=
e=3Dlogo&amp;_targetURL=3Dhttp%3A%2F%2Fhub.sciverse.com&amp;_acct=3DC0000=
31478&amp;_version=3D1&amp;_userid=3D606302&amp;md5=3Dd1e7941aed712c0b3df=
1c8749af1bfbc"><IMG=20
title=3D"SciVerse - Elsevier's product suite for search and discovery" =
border=3D0=20
alt=3D"SciVerse Home"=20
src=3D"http://www.sciencedirect.com/scidirimg/logo_SciVerse.gif"> =
</A></DIV>
<DIV id=3DlogoScienceDirect><A =
href=3D"http://www.sciencedirect.com/science"><IMG=20
title=3D"ScienceDirect -The world's leading full-text scientific =
database"=20
border=3D0 alt=3D"ScienceDirect=C2=AE Home"=20
src=3D"http://www.sciencedirect.com/scidirimg/logo_ScienceDirect.gif"></A=
></DIV></DIV>
<DIV id=3Dsuites class=3Dclearfix>
<UL class=3Dsuites>
  <LI><A title=3D"Hub - SciVerse's integrated search"=20
  href=3D"http://www.hub.sciverse.com/action/home">Hub</A></LI>
  <LI><A class=3Dselected=20
  title=3D"ScienceDirect - the world's leading full-text scientific =
database">ScienceDirect</A></LI>
  <LI><A=20
  title=3D"Scopus - the largest abstract and citation database of =
research literature and quality web sources"=20
  href=3D"http://www.scopus.com/">Scopus</A></LI>
  <LI><A=20
  title=3D"SciTopics - Distilled, authoritative and up-to-date =
information for researchers on scientific technical and medical topic"=20
  href=3D"http://www.scitopics.com/">SciTopics</A></LI>
  <LI><A class=3Dlast title=3D" Applications - SciVerse Applications"=20
  =
href=3D"http://www.applications.sciverse.com/action/userhome">Application=
s</A></LI></UL></DIV>
<DIV><!-- if not logged in -->
<DIV id=3Dlogin class=3Dclearfix>
<UL>
  <LI><A=20
  title=3D"Register a ScienceDirect username and password for using =
alerts and other personal features"=20
  =
href=3D"https://www.sciencedirect.com/science?_ob=3DRegistrationURL&amp;_=
method=3Ddisplay&amp;_type=3Dip&amp;_returnURL=3Dhttp%3A%2F%2Fwww.science=
direct.com%2Fscience%3F_ob%3DArticleListURL%26_method%3Dlist%26_ArticleLi=
stID%3D1620511430%26_sort%3Dr%26_st%3D13%26view%3Dc%26_acct%3DC000031478%=
26_version%3D1%26_urlVersion%3D0%26_userid%3D606302%26md5%3Dc29eb5da46bf7=
113e448bc47117083c2%26searchtype%3Da&amp;_acct=3DC000031478&amp;_version=3D=
1&amp;_userid=3D606302&amp;md5=3D356c54d7af0c3e3e1e0d49cf09bd809d"=20
  target=3D_top>Register</A> </LI><!--top right widget-->
  <LI id=3DloginPlus class=3D"login "><A id=3DloginPlusScript=20
  class=3D"novisit plus nojs" title=3D"Login to ScienceDirect"=20
  href=3D"javascript:flipLogin('loginBox',null);">Login</A><NOSCRIPT><A=20
  id=3DloginPlusNoScript class=3Dplus title=3D"Open the Login Box"=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DHomePageURL&amp;_metho=
d=3DuserHomePage&amp;_fl=3Dy&amp;_acct=3DC000031478&amp;_version=3D1&amp;=
_urlVersion=3D0&amp;_userid=3D606302&amp;md5=3D0eebb3f2b321c262103bdd9ca3=
b3c4e2">Login</A></NOSCRIPT>=20
  </LI>
  <LI class=3Dlast><A title=3D"Go to SciVal Suite" =
href=3D"http://www.scival.com/">Go=20
  to SciVal Suite</A></LI></UL></DIV>
<DIV style=3D"DISPLAY: none" id=3DloginBox>
<DIV style=3D"PADDING-TOP: 10px" class=3Dpadding>
<FORM style=3D"MARGIN: 0px" id=3Dlogin-box-form method=3Dpost =
name=3DsdLogin=20
action=3Dhttps://www.sciencedirect.com/science/login><INPUT =
value=3Dlogin=20
type=3Dhidden name=3Dlogin>=20
<DIV><LABEL for=3Dusername><SPAN style=3D"TEXT-ALIGN: =
right">Username:</SPAN> <INPUT=20
id=3Dusername title=3D"Please enter your user name here" type=3Dtext=20
name=3Duserid></LABEL> </DIV>
<DIV style=3D"MARGIN-TOP: 2px"><LABEL for=3Dpassword><SPAN=20
style=3D"TEXT-ALIGN: right">Password:</SPAN> <INPUT id=3Dpassword=20
title=3D"Please enter your password here"=20
onkeypress=3D"if(13=3D=3Devent.keyCode)this.form.submit();if =
(13=3D=3Devent.keyCode)return false;"=20
maxLength=3D20 type=3Dpassword name=3Dpassword></LABEL> </DIV>
<DIV class=3Dremember><INPUT id=3DrememberMe class=3D"allCheck top2fix"=20
title=3D"Checking this option will log you in automatically next time =
you visit ScienceDirect"=20
value=3DY CHECKED type=3Dcheckbox name=3Drememberid> <LABEL=20
title=3D"Checking this option will log you in automatically next time =
you visit ScienceDirect"=20
for=3DrememberMe>Remember me</LABEL> </DIV><INPUT value=3DMiamiLogonURL =
type=3Dhidden=20
name=3D_ob> <INPUT=20
value=3Dhttp://www.sciencedirect.com/science?_ob=3DArticleListURL&amp;_me=
thod=3Dlist&amp;_ArticleListID=3D1620511430&amp;_sort=3Dr&amp;_st=3D13&am=
p;view=3Dc&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&am=
p;_userid=3D606302&amp;md5=3Dc29eb5da46bf7113e448bc47117083c2&amp;searcht=
ype=3Da=20
type=3Dhidden name=3DtargetURL> <INPUT=20
value=3Dhttp://www.sciencedirect.com/science?_ob=3DArticleListURL&amp;_me=
thod=3Dlist&amp;_ArticleListID=3D1620511430&amp;_sort=3Dr&amp;_st=3D13&am=
p;view=3Dc&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&am=
p;_userid=3D606302&amp;md5=3Dc29eb5da46bf7113e448bc47117083c2&amp;searcht=
ype=3Da=20
type=3Dhidden name=3DreturnURL>=20
<DIV class=3Dsubmit>
<DIV style=3D"PADDING-LEFT: 0px; FLOAT: left"><INPUT class=3Dbutton =
title=3D"Login to ScienceDirect" value=3DLogin alt=3D"Login to =
ScienceDirect" type=3Dsubmit name=3Darrow></DIV>
<DIV class=3DnotRegistered><SPAN class=3DastPad>| </SPAN><SPAN><A =
title=3D""=20
href=3D"https://www.sciencedirect.com/science?_ob=3DRegistrationURL&amp;_=
method=3Ddisplay&amp;_type=3Dip&amp;_returnURL=3Dhttp%3A%2F%2Fwww.science=
direct.com%2Fscience%3F_ob%3DArticleListURL%26_method%3Dlist%26_ArticleLi=
stID%3D1620511430%26_sort%3Dr%26_st%3D13%26view%3Dc%26_acct%3DC000031478%=
26_version%3D1%26_urlVersion%3D0%26_userid%3D606302%26md5%3Dc29eb5da46bf7=
113e448bc47117083c2%26searchtype%3Da&amp;_acct=3DC000031478&amp;_version=3D=
1&amp;_userid=3D606302&amp;md5=3D356c54d7af0c3e3e1e0d49cf09bd809d"=20
target=3D_top>Not Registered?</A></SPAN></DIV></DIV>
<DIV style=3D"CLEAR: both"></DIV></FORM>
<DIV class=3Dforgotpass><A=20
title=3D"Click here for help in recovering your ScienceDirect access"=20
onclick=3D"var =
remindWin;remindWin=3Dwindow.open('','passwd','scrollbars=3Dyes,resizable=
=3Dyes,directories=3Dno,toolbar=3Dn,menubar=3Dno,status=3Dno,width=3D650,=
height=3D300');"=20
href=3D"http://www.sciencedirect.com/science?_ob=3DReminderURL&amp;_metho=
d=3Ddisplay&amp;_acct=3DC000031478&amp;_version=3D1&amp;_userid=3D606302&=
amp;md5=3Dfee2c92e475a3ba69a4747b4272b9aa6"=20
target=3Dpasswd>Forgotten your username or password?</A> </DIV></DIV>
<DIV class=3Dinstitutiontext><A title=3D"Go to Athens/ Institution =
login"=20
href=3D"http://www.sciencedirect.com/science?_ob=3DFederationURL&amp;_met=
hod=3Ddisplay&amp;_type=3Df&amp;_acct=3DC000031478&amp;_version=3D1&amp;_=
userid=3D606302&amp;md5=3Dca79ccbbe329c90628424c7b4dfe6957">Go=20
to Athens / Institution login</A> </DIV></DIV><!-- logged in -->
<DIV id=3Dbanner-top></DIV></DIV></DIV>
<DIV id=3DnavigationTop class=3Dclearfix>
<UL class=3D"nav main">
  <LI class=3Dlast><A title=3DHome=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DHomePageURL&amp;_metho=
d=3DuserHomePage&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drslt_li=
st&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_useri=
d=3D606302&amp;md5=3Db153c78b0d18b2c5dd1d0c28bb65844b"=20
  name=3DHome target=3D_top>Home</A></LI>
  <LI><A title=3DBrowse=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DBrowseListURL&amp;_typ=
e=3Dall&amp;_auth=3Dy&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drs=
lt_list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_=
userid=3D606302&amp;md5=3D484f73fc5416adf3d93c514172a8c1f0"=20
  name=3DBrowse target=3D_top>Browse</A> </LI>
  <LI><A title=3DSearch=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSearchURL&amp;_me=
thod=3DrequestForm&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drslt_=
list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D1&amp;_use=
rid=3D606302&amp;md5=3D5390457454b175c3eaa73048b936e1af"=20
  name=3DSearch target=3D_top>Search</A></LI>
  <LI><A title=3D"My settings"=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DUserSubscriptionURL&am=
p;_method=3Dbegin&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drslt_l=
ist&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D1&amp;_user=
id=3D606302&amp;md5=3D2bad8e7e7d285b7e749151c4e70897b1"=20
  name=3Daccount target=3D_top>My settings</A></LI>
  <LI><A title=3DAlerts=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSDIURL&amp;_metho=
d=3DlistAlerts&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drslt_list=
&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D=
606302&amp;md5=3D1aa4c90c6fde7e324fb6675be5b092df"=20
  name=3Dalert target=3D_top>My alerts</A></LI></UL>
<UL class=3D"nav misc">
  <LI class=3Dlast><A title=3D"Help (Opens new window)"=20
  onclick=3D"var helpWin; =
helpWin=3Dwindow.open('/science?_ob=3DHelpURL&amp;_file=3Dsearch_results_=
list.htm&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drslt_list&amp;_=
acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D6063=
02&amp;md5=3D5d7ef2280d62ecd1c6a278c18896767e','sdhelp','scrollbars=3Dyes=
,resizable=3Dyes,directories=3Dno,toolbar=3Dno,menubar=3Dno,status=3Dno,w=
idth=3D760,height=3D570'); helpWin.focus(); return false"=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DHelpURL&amp;_file=3Dse=
arch_results_list.htm&amp;_btn=3DY&amp;_zone=3DTopNavBar&amp;_origin=3Drs=
lt_list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_=
userid=3D606302&amp;md5=3D5d7ef2280d62ecd1c6a278c18896767e"=20
  target=3Dsdhelp>Help</A></LI></UL></DIV></DIV>
<TABLE id=3DsdQuickSearch class=3DouterWrapper border=3D0 =
cellSpacing=3D0 cellPadding=3D0=20
width=3D"100%">
  <TBODY>
  <TR>
    <TD><A name=3D"Skip Buttons"></A>
      <SCRIPT language=3Djavascript type=3Dtext/javascript>=0A=
<!--=0A=
function getElementsByClassName(oElm, strTagName, strClassName){=0A=
  var arrElements =3D (strTagName =3D=3D "*" && oElm.all)? oElm.all : =
oElm.getElementsByTagName(strTagName);=0A=
  var arrReturnElements =3D new Array();=0A=
  strClassName =3D strClassName.replace(/\-/g, "\\-");=0A=
  var oRegExp =3D new RegExp("(^|\\s)" + strClassName + "(\\s|$)");=0A=
  var oElement;=0A=
  for(var i=3D0; i<arrElements.length; i++){=0A=
   oElement =3D arrElements[i];=0A=
   if(oRegExp.test(oElement.className)){=0A=
    arrReturnElements.push(oElement);=0A=
   }=0A=
  }=0A=
  return (arrReturnElements);=0A=
}=0A=
function clearQSForm() {=0A=
    document.qkSrch.qs_tak.value=3D"";=0A=
    document.qkSrch.qs_author.value=3D"";=0A=
    document.qkSrch.qs_title.value=3D"";=0A=
    document.qkSrch.qs_vol.value=3D"";=0A=
    document.qkSrch.qs_issue.value=3D"";=0A=
    document.qkSrch.qs_pages.value=3D"";=0A=
}=0A=
function changeFields(field) {=0A=
    var quckSrch =3D getElementsByClassName(document, 'td', =
'toggleQukSrch');=0A=
    if(field =3D=3D "i") {=0A=
        for (i=3D0; i<quckSrch.length; i++) {=0A=
            quckSrch[i].style.display =3D 'none';=0A=
            i++;=0A=
        }=0A=
        document.getElementById("fieldLabel").innerHTML =3D =
"&nbsp;&nbsp;&nbsp;&nbsp;Images";=0A=
        document.getElementById("qs_all").title =3D "e.g. figures, =
tables, videos etc";=0A=
        if (document.getElementById("qs_all").value =3D=3D "")        =0A=
        {=0A=
           document.getElementById("qs_all").value =3D "e.g. figures, =
tables, videos etc";=0A=
           document.getElementById("qs_all").style.color =3D"#9b9b9b";=0A=
        }=0A=
        document.getElementById("volField").style.display =3D "none";=0A=
        document.getElementById("qs_vol").style.display =3D "none";=0A=
        document.getElementById("issueField").style.display =3D "none";=0A=
        document.getElementById("qs_issue").style.display =3D "none";=0A=
        document.getElementById("pageField").style.display =3D "none";=0A=
        document.getElementById("qs_pages").style.display =3D "none";=0A=
        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){=0A=
           document.getElementById("submit_search").style.marginLeft =3D =
"7px";=0A=
        }=0A=
    } else {=0A=
        for (i=3D0; i<quckSrch.length; i++) {=0A=
            quckSrch[i].style.display =3D '';=0A=
            i++;=0A=
        } =0A=
        document.getElementById("fieldLabel").innerHTML =3D =
"&nbsp;&nbsp;&nbsp;&nbsp;All Fields";=0A=
        document.getElementById("qs_all").title =3D "For Example. Heart =
Attack and Behaviour";=0A=
        if (document.getElementById("qs_all").value =3D=3D "e.g. =
figures, tables, videos etc")=0A=
        {=0A=
            document.getElementById("qs_all").value =3D ""; =0A=
            document.getElementById("qs_all").style.color =3D"#000000";=0A=
        }=0A=
        document.getElementById("volField").style.display =3D "";=0A=
        document.getElementById("qs_vol").style.display =3D "";=0A=
        document.getElementById("issueField").style.display =3D "";=0A=
        document.getElementById("qs_issue").style.display =3D "";=0A=
        document.getElementById("pageField").style.display =3D "";=0A=
        document.getElementById("qs_pages").style.display =3D "";=0A=
        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){=0A=
           document.getElementById("submit_search").style.marginLeft =3D =
"14px";=0A=
        }=0A=
=0A=
    }=0A=
}=0A=
=0A=
function clearValues() {=0A=
    if (document.getElementById("Images").checked =3D=3D  true) {=0A=
        if (document.getElementById("qs_all").value =3D=3D "e.g. =
figures, tables, videos etc") {=0A=
            document.getElementById("qs_all").value =3D "";=0A=
            document.getElementById("qs_all").style.color =3D"#000000";=0A=
        }=0A=
    }=0A=
}=0A=
=0A=
function setValues() {=0A=
    if (document.getElementById("Images").checked =3D=3D  true) { =0A=
        if (document.getElementById("qs_all").value =3D=3D "") {=0A=
            document.getElementById("qs_all").value =3D "e.g. figures, =
tables, videos etc";=0A=
            document.getElementById("qs_all").style.color =3D"#9b9b9b";=0A=
        }=0A=
    }=0A=
}=0A=
//-->=0A=
</SCRIPT>

      <DIV>
      <FORM style=3D"MARGIN: 0px" method=3Dget name=3DqkSrch =
action=3D/science=20
      target=3D_top><INPUT value=3DQuickSearchURL type=3Dhidden =
name=3D_ob> <INPUT=20
      value=3DsubmitForm type=3Dhidden name=3D_method> <INPUT =
value=3DC000031478=20
      type=3Dhidden name=3D_acct> <INPUT value=3Drslt_list type=3Dhidden =
name=3D_origin>=20
      <INPUT value=3DqSearch type=3Dhidden name=3D_zone> <INPUT=20
      value=3D6cdd2cded82b51abc8499c36824f6ddd type=3Dhidden name=3Dmd5> =

      <TABLE style=3D"MARGIN: 0px" border=3D0 cellSpacing=3D0 =
cellPadding=3D0=20
      width=3D"100%">
        <TBODY>
        <TR vAlign=3Dcenter><!-- JS enabled. Code for Articles -->
          <TD noWrap align=3Dmiddle><LABEL=20
            style=3D"PADDING-RIGHT: 0px; MARGIN-LEFT: 2px; CURSOR: =
pointer"=20
            class=3Dnojs for=3DArticles>Articles</LABEL> <INPUT =
id=3DArticles=20
            class=3D"nojs artRadio" onclick=3DchangeFields(this.value); =
value=3Da=20
            CHECKED type=3Dradio name=3Dsearchtype> <NOSCRIPT><!-- JS =
disabled. Code for Articles --><SPAN=20
            style=3D"MARGIN-LEFT: 13px">Articles</SPAN> =
</NOSCRIPT></TD><!-- Code related for toggling labels -->
          <TD align=3Dright><LABEL id=3DfieldLabel=20
            for=3Dqs_all>&nbsp;&nbsp;&nbsp;&nbsp;All fields</LABEL></TD>
          <TD align=3Dleft><INPUT onblur=3DsetValues(); id=3Dqs_all=20
            class=3D"textbox qsinput xpstyle" onfocus=3DclearValues();=20
            title=3D"For example: heart attack AND behavior?" =
tabIndex=3D1=20
            maxLength=3D450 size=3D30 type=3Dtext name=3Dqs_all></TD>
          <TD align=3Dright><LABEL=20
            for=3Dqs_author>&nbsp;&nbsp;&nbsp;&nbsp;Author</LABEL></TD>
          <TD colSpan=3D5 align=3Dleft><INPUT style=3D"_width: 100%" =
id=3Dqs_author=20
            class=3D"textbox qsinput xpstyle"=20
            title=3D"e.g. J S Smith or John Smith or Smith JS" =
tabIndex=3D2=20
            value=3D"borella p" maxLength=3D450 size=3D33 type=3Dtext =
name=3Dqs_author></TD>
          <TD noWrap></TD>
          <TD></TD>
          <TD></TD>
          <TD vAlign=3Dcenter width=3D"90%" noWrap align=3Dright><A=20
            style=3D"FONT-SIZE: 0.92em; VERTICAL-ALIGN: bottom"=20
            =
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSearchURL&amp;_me=
thod=3DrequestForm&amp;_btn=3DY&amp;_acct=3DC000031478&amp;_version=3D1&a=
mp;_urlVersion=3D1&amp;_userid=3D606302&amp;md5=3D05fd59cda856bf780ef30cd=
ab780a855">Advanced=20
            search</A> </TD></TR>
        <TR><!-- JS enabled. Code for images -->
          <TD noWrap align=3Dmiddle><LABEL=20
            style=3D"PADDING-RIGHT: 0px; CURSOR: pointer" class=3Dnojs=20
            for=3DImages>Images</LABEL> <INPUT id=3DImages class=3D"nojs =
artImages"=20
            onclick=3DchangeFields(this.value); value=3Di type=3Dradio=20
            name=3Dsearchtype>=20
            <NOSCRIPT><!-- JS disabled. Code for Images --><SPAN=20
            style=3D"MARGIN-LEFT: 13px"><A=20
            =
href=3D"http://www.sciencedirect.com/science?_ob=3DArticleListURL&amp;_me=
thod=3Dlist&amp;_ArticleListID=3D1620511430&amp;_sort=3Dr&amp;_st=3D13&am=
p;view=3Dc&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&am=
p;_userid=3D606302&amp;md5=3Dc29eb5da46bf7113e448bc47117083c2&amp;searcht=
ype=3Da&amp;imgSel=3DY">Images</A></SPAN>=20
            </NOSCRIPT></TD>
          <TD align=3Dright><LABEL=20
            =
for=3Dqs_title>&nbsp;&nbsp;&nbsp;&nbsp;Journal/Book&nbsp;title</LABEL></T=
D>
          <TD align=3Dleft>
            <DIV id=3DqsPub_autoComp class=3D"auto_complete =
nojs"></DIV><INPUT=20
            id=3Dqs_title class=3D"textbox qsinput xpstyle"=20
            title=3D"For example: journal of molecular biology" =
tabIndex=3D3=20
            maxLength=3D450 size=3D30 type=3Dtext name=3Dqs_title></TD>
          <TD class=3DtoggleQukSrch align=3Dright><LABEL id=3DvolField=20
            for=3Dqs_vol>&nbsp;&nbsp;&nbsp;&nbsp;Volume</LABEL></TD>
          <TD class=3DtoggleQukSrch align=3Dleft><INPUT style=3D"WIDTH: =
30px"=20
            id=3Dqs_vol class=3D"textbox qsinput xpstyle" tabIndex=3D4 =
value=3D69=20
            maxLength=3D10 size=3D3 type=3Dtext name=3Dqs_vol></TD>
          <TD class=3DtoggleQukSrch align=3Dright><LABEL id=3DissueField =

            for=3Dqs_issue>&nbsp;&nbsp;Issue</LABEL></TD>
          <TD class=3DtoggleQukSrch align=3Dleft><INPUT style=3D"WIDTH: =
30px"=20
            id=3Dqs_issue class=3D"textbox qsinput xpstyle" tabIndex=3D5 =
value=3D2=20
            maxLength=3D10 size=3D3 type=3Dtext name=3Dqs_issue></TD>
          <TD class=3DtoggleQukSrch align=3Dright><LABEL id=3DpageField=20
            for=3Dqs_pages>&nbsp;&nbsp;Page</LABEL></TD>
          <TD class=3DtoggleQukSrch align=3Dright><INPUT style=3D"WIDTH: =
30px"=20
            id=3Dqs_pages class=3D"textbox qsinput xpstyle"=20
            title=3D"For example: 14-27" tabIndex=3D6 value=3D148 =
maxLength=3D10 size=3D3=20
            type=3Dtext name=3Dqs_pages></TD>
          <TD noWrap align=3Dright><INPUT id=3Dsubmit_search =
class=3Dbutton title=3D"Submit Quick Search" tabIndex=3D8 =
value=3D"Search ScienceDirect" alt=3D"Submit Quick Search" type=3Dsubmit =
name=3DsdSearch>=20
          </TD>
          <TD vAlign=3Dbottom colSpan=3D8 noWrap align=3Dright><A=20
            style=3D"PADDING-RIGHT: 0px; FONT-SIZE: 0.92em"=20
            class=3Dicon_qmarkHelpsci_dir=20
            onmouseover=3D"window.status=3D'Help is Available';return =
true"=20
            tabIndex=3D9 onmouseout=3D"window.status=3D'';return true"=20
            onclick=3D"var =
helpWin;helpWin=3Dwindow.open('/science?_ob=3DHelpURL&amp;_file=3Dqs_tips=
.htm&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_use=
rid=3D606302&amp;md5=3D30d1754d1343e521e1adb9672efa2afc','sdhelp','scroll=
bars=3Dyes,resizable=3Dyes,directories=3Dno,toolbar=3Dno,menubar=3Dno,sta=
tus=3Dno,width=3D760,height=3D570');helpWin.focus();return false"=20
            =
href=3D"http://www.sciencedirect.com/science?_ob=3DHelpURL&amp;_file=3Dqs=
_tips.htm&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp=
;_userid=3D606302&amp;md5=3D30d1754d1343e521e1adb9672efa2afc"=20
            target=3Dsdhelp>Search tips</A>
            <SCRIPT type=3Dtext/javascript>=0A=
//<![CDATA[=0A=
function sdAutoComplete(inputField, outputField, serviceURL) {=0A=
    var qsPub_autoComp =3D new =
Ajax.Autocompleter(inputField,outputField,serviceURL,{ minChars:2, =
frequency: 0.15 })=0A=
}=0A=
//]]>=0A=
function ccAutoComplete(inputField, outputField, validCostCodes) {=0A=
    var costcode_list =3D new =
Autocompleter.Local(inputField,outputField,validCostCodes,{ minChars:2, =
partialSearch:false }) }=0A=
//]]>=0A=
</SCRIPT>

            <SCRIPT type=3Dtext/javascript>=0A=
//<![CDATA[=0A=
    sdAutoComplete('qs_title','qsPub_autoComp','/science/jfind/auto');=0A=
//]]>=0A=
</SCRIPT>
             =
</TD></TR></TBODY></TABLE></FORM></DIV></TD></TR></TBODY></TABLE>
<DIV id=3DsdHeader class=3DouterWrapper>
<DIV style=3D"WIDTH: 100%" id=3DsciverseCanvasArea>
<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.sciencedirect.com/science/page/javascript/dragdrop.js">=
</SCRIPT>

<DIV id=3DsdBody class=3DpageText>
<TABLE border=3D0 cellSpacing=3D0 cellPadding=3D0 width=3D"100%">
  <TBODY>
  <TR>
    <TD vAlign=3Dcenter align=3Dright></TD></TR>
  <TR>
    <TD></TD></TR></TBODY></TABLE>
<TABLE border=3D0 cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR style=3D"DISPLAY: none">
    <TD></TD></TR></TBODY></TABLE>
<DIV style=3D"MARGIN: 0px" class=3DamtResults>
<DIV class=3DiconLinks><STRONG>1</STRONG> articles found for: =
VOL-ISSUE(<B>"Volume=20
69"</B>) AND VOL-ISSUE(<B>"Issue 2"</B>) AND PAGES(<B>148</B>) AND=20
AUTHORS(<B>borella p</B>) </DIV>
<DIV class=3DsaveSrchLinks><A class=3Dicon_saveSrchsci_dir=20
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSearchURL&amp;_me=
thod=3DsaveSearch&amp;_ArticleListID=3D1620511430&amp;_orig_alid=3D&amp;_=
sort=3Dr&amp;_subId=3D&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVe=
rsion=3D1&amp;_userid=3D606302&amp;md5=3D6dc1f3875c477409c87915a14d66394d=
&amp;searchtype=3Da&amp;originPage=3Drslt_list&amp;zone=3Dtop">Save=20
this search</A> |&nbsp;&nbsp;<A class=3Dicon_saveascitationalertsci_dir=20
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSDIURL&amp;_metho=
d=3DsaveAlertPage&amp;_alid=3D1620511430&amp;_saveSearchUrl=3D%2Fscience%=
3F_ob%3DMiamiSearchURL%26_method%3DsaveSearch%26_ArticleListID%3D16205114=
30%26_orig_alid%3D%26_sort%3Dr%26_subId%3D%26_acct%3DC000031478%26_versio=
n%3D1%26_urlVersion%3D1%26_userid%3D606302%26md5%3D6dc1f3875c477409c87915=
a14d66394d%26searchtype%3Da&amp;_sort=3Dr&amp;_acct=3DC000031478&amp;_ver=
sion=3D1&amp;_urlVersion=3D0&amp;_userid=3D606302&amp;md5=3Dfe16d74f6a2f8=
9161cd6e0582a2f10b8">Save=20
as search alert</A> |&nbsp;&nbsp;<A class=3Dicon_rsscite=20
onclick=3D"openNS('/science?_ob=3DRSSURL&amp;_method=3Dsetup&amp;_alid=3D=
1620511430&amp;_acct=3DC000031478&amp;_version=3D1&amp;_userid=3D606302&a=
mp;md5=3D8c0cffeb38fd02fd9fa4777a91db5ea1', 700, 500); return false;"=20
href=3D"http://www.sciencedirect.com/science?_ob=3DRSSURL&amp;_method=3Ds=
etup&amp;_alid=3D1620511430&amp;_acct=3DC000031478&amp;_version=3D1&amp;_=
userid=3D606302&amp;md5=3D8c0cffeb38fd02fd9fa4777a91db5ea1"=20
target=3D_blank>RSS Feed</A> </DIV>
<DIV class=3Dclear></DIV></DIV>
<FORM=20
style=3D"PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px"=20
method=3Dget name=3DTag action=3D/science target=3D""><INPUT =
value=3DArticleListURL=20
type=3Dhidden name=3D_ob> <INPUT value=3Dtag type=3Dhidden =
name=3D_method> <INPUT value=3Da=20
type=3Dhidden name=3Dsearchtype> <INPUT value=3Dsearch type=3Dhidden =
name=3DrefSource>=20
<INPUT value=3Dr type=3Dhidden name=3DpdfDownloadSort> <INPUT value=3D20 =
type=3Dhidden=20
name=3DPDF_DDM_MAX> <INPUT value=3D13 type=3Dhidden name=3D_st> <INPUT =
value=3D1=20
type=3Dhidden name=3Dcount> <INPUT value=3Dr type=3Dhidden name=3Dsort> =
<INPUT value=3D0=20
type=3Dhidden name=3D_chunk> <INPUT value=3Dc type=3Dhidden name=3Dview> =
<INPUT=20
value=3D4937599409fce0c701117af19e113f98 type=3Dhidden name=3Dmd5> =
<INPUT=20
value=3D1620511430 type=3Dhidden name=3D_ArticleListID> <INPUT =
type=3Dhidden=20
name=3Dsisr_search>=20
<DIV>
<TABLE style=3D"MARGIN-TOP: 4px" class=3DfontSizer cellSpacing=3D0 =
cellPadding=3D0=20
width=3D"100%">
  <TBODY>
  <TR>
    <TD=20
    style=3D"PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 7px"=20
    noWrap align=3Dleft></TD>
    <TD class=3Dnojs vAlign=3Dbottom align=3Dright><SPAN>Font =
Size:&nbsp;<A=20
      href=3D"javascript:fontSizeMinus('bodyMainResults', =
'science');"><IMG=20
      onmouseover=3D"this.src=3D'/scidirimg/sci_dir/minus_b.gif'"=20
      title=3D"Decrease Font Size"=20
      onmouseout=3D"this.src=3D'/scidirimg/sci_dir/reduce_font.gif'" =
border=3D0=20
      alt=3D"Decrease Font Size"=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/reduce_font.gif"></=
A>&nbsp;&nbsp;<A=20
      href=3D"javascript:fontSizeAdd('bodyMainResults', =
'science');"><IMG=20
      onmouseover=3D"this.src=3D'/scidirimg/sci_dir/plus_b.gif'"=20
      title=3D"Increase Font Size"=20
      onmouseout=3D"this.src=3D'/scidirimg/sci_dir/increase_font.gif'" =
border=3D0=20
      alt=3D"Increase Font Size"=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/increase_font.gif">=
</A></SPAN></TD></TR></TBODY></TABLE>
<DIV style=3D"MARGIN-TOP: 12px; MARGIN-BOTTOM: 9px" =
class=3DpageText>&nbsp;<IMG=20
style=3D"VERTICAL-ALIGN: top" border=3D0 alt=3D""=20
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/jrn_sub.gif"> =3D =
Full-text=20
available&nbsp;&nbsp;&nbsp;<IMG style=3D"VERTICAL-ALIGN: top" border=3D0 =
alt=3D""=20
src=3D"http://www.sciencedirect.com/scidirimg/jrn_nsub.gif"> =3D =
Abstract=20
only&nbsp;&nbsp;&nbsp;</DIV></DIV>
<DIV>
<DIV id=3DrsLeftCol>
<DIV style=3D"MARGIN-BOTTOM: 13px"><!-- CORNERS -->
<DIV class=3DcontentMain>
<DIV class=3DcontentShadow>
<DIV class=3DcontentBorders>
<DIV id=3DsisrBox>
<DIV><B>Search within results</B></DIV><INPUT=20
style=3D"MARGIN: 12px 9px 0px 0px; WIDTH: 114px" =
onfocus=3D"this.value=3D'';"=20
onkeypress=3D"return checkReturn(this,event)" maxLength=3D450 =
type=3Dtext=20
name=3Dsisrterm><INPUT class=3Dbutton =
onclick=3D"this.form.sisr_search.value=3D'1'" value=3DSearch =
type=3Dsubmit name=3DSISRSearch>=20
</DIV></DIV></DIV><!-- CORNERS --></DIV></DIV>
<DIV id=3Dnavigators><!-- CORNERS -->
<DIV class=3DcontentMain>
<DIV class=3DcontentShadow>
<DIV class=3DcontentBorders>
<DIV class=3DrefineBox>
<DIV><B>Refine results</B></DIV><INPUT style=3D"MARGIN: 12px 9px 0px =
0px" class=3Dbutton =
onclick=3D"TagFormReplace('ClusteringURL','submitForm','42d5196b307d106e6=
3d8f04d55e669bf')" value=3D"Limit to" type=3Dsubmit =
name=3DnavLimit><INPUT class=3Dbutton =
onclick=3D"TagFormReplace('ClusteringURL','submitForm','42d5196b307d106e6=
3d8f04d55e669bf')" value=3DExclude type=3Dsubmit name=3DnavExclude>=20
</DIV>
<DIV>
<DIV id=3DnavBox>
<DIV id=3Dnav_contenttype>
<DIV class=3DsecTitles>Content Type</DIV>
<DIV>
<TABLE>
  <TBODY>
  <TR>
    <TD vAlign=3Dtop width=3D"2%"><INPUT id=3DnavJournal value=3Djrl =
type=3Dcheckbox=20
      name=3DnavCon></TD>
    <TD style=3D"FONT-SIZE: 0.95em"><LABEL=20
      =
for=3DnavJournal>Journal&nbsp;(1)</LABEL></TD></TR></TBODY></TABLE></DIV>=
</DIV>
<DIV id=3Dnav_srctitle>
<DIV class=3DsecTitles>Journal/Book Title</DIV>
<DIV>
<TABLE>
  <TBODY>
  <TR>
    <TD vAlign=3Dtop width=3D"2%"><INPUT id=3Dnavs6884 value=3D6884 =
type=3Dcheckbox=20
      name=3DnavSrc></TD>
    <TD style=3D"FONT-SIZE: 0.95em"><LABEL for=3Dnavs6884>Journal of =
Hospital=20
      Infection&nbsp;(1)</LABEL></TD></TR></TBODY></TABLE></DIV></DIV>
<DIV id=3Dnav_topics>
<DIV class=3DsecTitles>Topic</DIV>
<DIV>
<TABLE>
  <TBODY>
  <TR>
    <TD vAlign=3Dtop width=3D"2%"><INPUT id=3Dnavtantibody value=3D"anti =
body"=20
      type=3Dcheckbox name=3DnavTopic></TD>
    <TD style=3D"FONT-SIZE: 0.95em"><LABEL for=3Dnavtantibody>anti=20
      body&nbsp;(1)</LABEL></TD></TR></TBODY></TABLE></DIV></DIV>
<DIV id=3Dnav_pubyear>
<DIV class=3DsecTitles>Year</DIV>
<DIV>
<TABLE>
  <TBODY>
  <TR>
    <TD vAlign=3Dtop width=3D"2%"><INPUT id=3Dnavy2008 value=3D2008 =
type=3Dcheckbox=20
      name=3DnavYear></TD>
    <TD style=3D"FONT-SIZE: 0.95em"><LABEL=20
  =
for=3Dnavy2008>2008&nbsp;(1)</LABEL></TD></TR></TBODY></TABLE></DIV></DIV=
></DIV></DIV>
<DIV style=3D"CLEAR: both"></DIV>
<DIV style=3D"HEIGHT: 19px; BORDER-TOP: #9b9b9b 1px solid" =
class=3DrefineBox><INPUT style=3D"MARGIN: 0px 9px 0px 0px" =
class=3Dbutton =
onclick=3D"TagFormReplace('ClusteringURL','submitForm','42d5196b307d106e6=
3d8f04d55e669bf')" value=3D"Limit to" type=3Dsubmit =
name=3DnavLimit><INPUT class=3Dbutton =
onclick=3D"TagFormReplace('ClusteringURL','submitForm','42d5196b307d106e6=
3d8f04d55e669bf')" value=3DExclude type=3Dsubmit name=3DnavExclude>=20
</DIV></DIV></DIV><!-- CORNERS --></DIV></DIV>
<DIV style=3D"MARGIN-TOP: 13px; WIDTH: 214px" id=3Dtoolbar></DIV></DIV>
<DIV id=3DrsRightCol class=3DnoskyScraper>
<DIV class=3DcontentMain>
<DIV class=3DcontentShadow>
<DIV class=3DcontentBorders>
<DIV style=3D"_margin-right: -5px" id=3DresultListHeader>
<TABLE style=3D"WIDTH: 100%" border=3D0 cellSpacing=3D0 cellPadding=3D0>
  <TBODY>
  <TR>
    <TD class=3DpageText vAlign=3Dcenter><IMG style=3D"VERTICAL-ALIGN: =
bottom"=20
      title=3D"" alt=3D""=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/icon_arrow.gif"></TD>
    <TD class=3DpageText vAlign=3Dcenter align=3Dleft><INPUT=20
      style=3D"VERTICAL-ALIGN: middle" id=3DemfrIcon=20
      =
onmouseover=3D"this.src=3D'/scidirimg/sci_dir/emailarticle_b.gif';documen=
t.getElementById('emfrBtn').style.textDecoration=3D'underline';"=20
      title=3D""=20
      =
onmouseout=3D"this.src=3D'/scidirimg/sci_dir/emailarticle_a.gif';document=
.getElementById('emfrBtn').style.textDecoration=3D'none';"=20
      alt=3D""=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/emailarticle_a.gif"=
=20
      type=3Dimage name=3Demfr> <INPUT style=3D"DISPLAY: inline-block; =
TEXT-DECORATION: none" id=3DemfrBtn class=3DlistAction =
onmouseover=3D"document.getElementById('emfrIcon').src=3D'/scidirimg/sci_=
dir/emailarticle_b.gif';this.style.textDecoration=3D'underline';" =
onmouseout=3D"document.getElementById('emfrIcon').src=3D'/scidirimg/sci_d=
ir/emailarticle_a.gif';this.style.textDecoration=3D'none';" =
value=3D"E-mail articles" type=3Dsubmit name=3Demfr>|=20
      <INPUT style=3D"VERTICAL-ALIGN: middle" id=3DexportIcon=20
      =
onmouseover=3D"this.src=3D'/scidirimg/sci_dir/exportarticle_b.gif';docume=
nt.getElementById('exportBtn').style.textDecoration=3D'underline';"=20
      title=3D""=20
      =
onmouseout=3D"this.src=3D'/scidirimg/sci_dir/exportarticle_a.gif';documen=
t.getElementById('exportBtn').style.textDecoration=3D'none';"=20
      alt=3D""=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/exportarticle_a.gif=
"=20
      type=3Dimage name=3Dexport> <INPUT style=3D"DISPLAY: inline-block; =
TEXT-DECORATION: none" id=3DexportBtn class=3DlistAction =
onmouseover=3D"document.getElementById('exportIcon').src=3D'/scidirimg/sc=
i_dir/exportarticle_b.gif';this.style.textDecoration=3D'underline';" =
onmouseout=3D"document.getElementById('exportIcon').src=3D'/scidirimg/sci=
_dir/exportarticle_a.gif';this.style.textDecoration=3D'none';" =
value=3D"Export citations" type=3Dsubmit name=3Dexport>|
      <SCRIPT type=3Dtext/javascript=20
      =
src=3D"http://www.sciencedirect.com/science/page/javascript/pdfDownload.j=
s"></SCRIPT>

      <SCRIPT language=3DJavascript type=3Dtext/javascript>=0A=
teststring =3D '';=0A=
for(j in navigator) teststring +=3D j + ' ' + navigator[j] + =
unescape('%0a');=0A=
//if (teststring.indexOf ('Windows NT 5.1') !=3D -1)=0A=
if (teststring.indexOf ('Windows NT 5.1') > 0 || teststring.indexOf =
('Windows NT 6.0') > 0 || teststring.indexOf ('Windows NT 6.1') > 0) =0A=
document.write ('<input type=3D"image" =
onClick=3D"validatePdfDownload(this.form, \'search\'); return false;" =
src=3D"/scidirimg/icon_pdf.gif" alt=3D"Opens in new window" =
title=3D"Opens in new window" border=3D"0" name=3D"pdfDownloadButton" =
style=3D"vertical-align:middle" =
onmouseover=3D"document.getElementById(\'pdfdownBtn\').style.textDecorati=
on=3D\'underline\';" =
onmouseout=3D"document.getElementById(\'pdfdownBtn\').style.textDecoratio=
n=3D\'none\';">');=0A=
document.write ('<input onClick=3D"validatePdfDownload(this.form, =
\'search\'); return false;" value=3D"Download multiple PDFs" =
name=3D"pdfDownloadButton" class=3D"listAction"  type=3D"submit" =
style=3D"text-decoration: none;display:inline-block;" id=3D"pdfdownBtn" =
onmouseover=3D"this.style.textDecoration=3D\'underline\';" =
onmouseout=3D"this.style.textDecoration=3D\'none\';">');=0A=
</SCRIPT>
       <INPUT type=3Dhidden name=3DpdfDownload>| <A class=3D"noul =
listAction"=20
      =
onmouseover=3D"document.images['allPreviews'].src=3D'/scidirimg/preview_o=
n_b.gif'"=20
      =
onmouseout=3D"document.images['allPreviews'].src=3D'/scidirimg/preview_on=
.gif'"=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DArticleListURL&amp;_me=
thod=3Dlist&amp;_ArticleListID=3D1620511430&amp;_sort=3Dr&amp;_st=3D13&am=
p;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D6=
06302&amp;md5=3Dc29eb5da46bf7113e448bc47117083c2&amp;searchtype=3Da&amp;v=
iew=3Df"><IMG=20
      style=3D"VERTICAL-ALIGN: middle" border=3D0 name=3DallPreviews =
alt=3D""=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/preview_on.gif">&nbsp;Open =
all=20
      previews</A>=20
    <TD=20
    style=3D"FONT-FAMILY: arial, verdana, hevetica, sans-serif; =
FONT-SIZE: 0.9em"=20
    align=3Dright>Sort by: <B>Relevance</B><SPAN class=3DtxtHidden> -=20
      selected</SPAN>&nbsp;|&nbsp;<A=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DArticleListURL&amp;_me=
thod=3Dtag&amp;sort=3Dd&amp;sisrterm=3D&amp;_ArticleListID=3D1620511430&a=
mp;view=3Dc&amp;_chunk=3D0&amp;count=3D1&amp;_st=3D&amp;refsource=3D&amp;=
_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D606=
302&amp;md5=3Dc20cfb99535159b1a06be0f2d377521d&amp;searchtype=3Da&amp;ori=
ginPage=3Drslt_list">Date</A>=20
    </TD></TR></TBODY></TABLE></DIV>
<DIV style=3D"_margin-right: -5px" id=3DsearchResults>
<DIV id=3DbodyMainResults class=3Dfont3>
<TABLE class=3DresultRow border=3D0 cellSpacing=3D0 cellPadding=3D10>
  <TBODY>
  <TR>
    <TD=20
    style=3D"PADDING-BOTTOM: 10px; PADDING-LEFT: 20px; PADDING-RIGHT: =
0pt; PADDING-TOP: 10px"=20
    vAlign=3Dtop width=3D"5%" align=3Dleft>
      <TABLE border=3D0 cellSpacing=3D0 cellPadding=3D0 width=3D"100%">
        <TBODY>
        <TR>
          <TD width=3D"20%" align=3Dright>1</TD>
          <TD width=3D"80%" align=3Dleft><INPUT style=3D"PADDING-LEFT: =
6px"=20
            value=3DB6WJP4SD1KH92 type=3Dcheckbox name=3Dart></TD>
          <TD style=3D"PADDING-LEFT: 6px" width=3D"5%"><IMG=20
            title=3D"You are entitled to access the full text of this =
document"=20
            border=3D0=20
            alt=3D"You are entitled to access the full text of this =
document"=20
            =
src=3D"http://www.sciencedirect.com/scidirimg/sci_dir/jrn_sub.gif"=20
            width=3D16 height=3D16></TD></TR></TBODY></TABLE></TD>
    <TD width=3D"95%" colSpan=3D2 align=3Dleft><A=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DArticleURL&amp;_udi=3D=
B6WJP-4SD1KH9-2&amp;_user=3D606302&amp;_coverDate=3D06%2F30%2F2008&amp;_a=
lid=3D1620511430&amp;_rdoc=3D1&amp;_fmt=3Dhigh&amp;_orig=3Dsearch&amp;_or=
igin=3Dsearch&amp;_zone=3Drslt_list_item&amp;_cdi=3D6884&amp;_sort=3Dr&am=
p;_st=3D13&amp;_docanchor=3D&amp;view=3Dc&amp;_ct=3D1&amp;_acct=3DC000031=
478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D606302&amp;md5=3D3=
6b847d3a5908f5785eb5387473cdab5&amp;searchtype=3Da"><SPAN=20
      style=3D"FONT-WEIGHT: bold">Prevalence of anti-legionella =
antibodies among=20
      Italian hospital workers</SPAN></A>&nbsp;&nbsp;<SPAN=20
      style=3D"WHITE-SPACE: nowrap; COLOR: #7e7e7e; FONT-SIZE: =
0.92em">Original=20
      Research Article</SPAN><BR><I>Journal of Hospital Infection</I>, =
<I><SPAN=20
      class=3Dhit>Volume 69, Issue 2</SPAN></I>, <I>June 2008</I>, =
<I>Pages<SPAN=20
      class=3Dhit> 148</SPAN>-155</I><BR><SPAN =
class=3Dhit>P</SPAN>.<SPAN class=3Dhit>=20
      Borella</SPAN>, A. Bargellini, I. Marchesi, S. Rovesti, G. =
Stancanelli, S.=20
      Scaltriti, M. Moro, M.T. Montagna, D. Tat=C3=B2, C. Napoli, M. =
Triassi, S.=20
      Montegrosso, F. Pennino, C.M. Zotti, S. Ditommaso, M. =
Giacomuzzi<BR>
      <DIV class=3Dtxt>
      <DIV style=3D"FONT-SIZE: 11px"><SPAN class=3Dnojs><A=20
      =
href=3D"javascript:openPreview('B6WJP-4SD1KH9-2','http://www.sciencedirec=
t.com/science/preview/abstract?_udi=3DB6WJP-4SD1KH9-2&amp;_user=3D606302&=
amp;_coverDate=3D06%2F30%2F2008&amp;_alid=3D1620511430&amp;_rdoc=3D1&amp;=
_orig=3Dsearch&amp;_origin=3Dsearch&amp;_zone=3Drslt_list_item&amp;_cdi=3D=
6884&amp;_sort=3Dr&amp;_st=3D13&amp;_docanchor=3D&amp;view=3Dc&amp;_ct=3D=
1&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=
=3D606302&amp;searchtype=3Da&amp;_fmt=3Dfull&amp;_pii=3DS0195670108001060=
&amp;_issn=3D01956701&amp;md5=3D7097b566384720254b0ea5c5cfba95c7','B6WJP-=
4SD1KH9-2-abs','B6WJP-4SD1KH9-2-figs','B6WJP-4SD1KH9-2-refs','B6WJP-4SD1K=
H9-2-img','/scidirimg/preview_on.gif','/scidirimg/preview_off.gif','B6WJP=
-4SD1KH9-2-label')"><IMG=20
      id=3DB6WJP-4SD1KH9-2-img=20
      =
onmouseover=3D"javascript:this.src=3D'/scidirimg/preview_on_b.gif';"=20
      title=3DOpen =
onmouseout=3D"javascript:this.src=3D'/scidirimg/preview_on.gif';"=20
      border=3D0 name=3DimgB6WJP-4SD1KH9-2 alt=3DOpen=20
      =
src=3D"http://www.sciencedirect.com/scidirimg/preview_on.gif">&nbsp;<SPAN=
=20
      id=3DB6WJP-4SD1KH9-2-label>Show=20
      preview</SPAN></A>&nbsp;&nbsp;</SPAN>|&nbsp;&nbsp;<A=20
      onclick=3D"var newWidth=3D((document.body.clientWidth*90)/100); =
var newHeight=3Ddocument.body.clientHeight; var pdfWin; =
pdfWin=3Dwindow.open('','newPdfWin','width=3D'+newWidth+',height=3D'+newH=
eight+',resizable=3Dyes, left=3D50, top=3D50');pdfWin.focus()"=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DMImg&amp;_imagekey=3DB=
6WJP-4SD1KH9-2-1&amp;_cdi=3D6884&amp;_user=3D606302&amp;_pii=3DS019567010=
8001060&amp;_origin=3Dsearch&amp;_zone=3Drslt_list_item&amp;_coverDate=3D=
06%2F30%2F2008&amp;_sk=3D999309997&amp;wchp=3DdGLbVlz-zSkzV&amp;md5=3D713=
e8c21d819e4e2aafa695f9f8fb485&amp;ie=3D/sdarticle.pdf"=20
      target=3DnewPdfWin><IMG style=3D"VERTICAL-ALIGN: middle" =
class=3DpdfImageLink=20
      border=3D0 name=3Dpdf alt=3D""=20
      src=3D"http://www.sciencedirect.com/scidirimg/icon_pdf.gif"> PDF =
(162 K)</A>=20
      &nbsp;&nbsp;|&nbsp;&nbsp; <A=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DRelatedArtURL&amp;_udi=
=3DB6WJP-4SD1KH9-2&amp;_orig=3Dsearch&amp;_origin=3Drslt_list&amp;_zone=3D=
rslt_list_item&amp;_mlktType=3DNoRefwork&amp;_isSubscribed=3DN&amp;_acct=3D=
C000031478&amp;_version=3D1&amp;_userid=3D606302&amp;md5=3Dc5996bf6cda272=
adf9ee185144ca06e9">Related=20
      articles</A>&nbsp;&nbsp;|&nbsp;&nbsp;<A=20
      =
href=3D"http://www.sciencedirect.com/science?_ob=3DRelatedArtURL&amp;_udi=
=3DB6WJP-4SD1KH9-2&amp;_orig=3Dsearch&amp;_origin=3Drslt_list&amp;_zone=3D=
rslt_list_item&amp;_mlktType=3DRefwork&amp;_isSubscribed=3DN&amp;_acct=3D=
C000031478&amp;_version=3D1&amp;_userid=3D606302&amp;md5=3D1501beb3721b82=
b8d91585e53cea9397">Related=20
      reference work articles</A>&nbsp;&nbsp;&nbsp;&nbsp;
      <DIV id=3DB6WJP-4SD1KH9-2=20
class=3DpreviewBox></DIV></DIV></DIV></TD></TR></TBODY></TABLE>
<DIV=20
id=3DresultsView_1></DIV></DIV></DIV></DIV></DIV><!-- CORNERS =
--></DIV></DIV></DIV>
<DIV style=3D"CLEAR: both"></DIV>
<TABLE style=3D"MARGIN-TOP: 19px; BORDER-TOP: #e8e8e8 4px solid" =
border=3D0=20
cellSpacing=3D0 cellPadding=3D0 width=3D"100%">
  <TBODY>
  <TR vAlign=3Dtop>
    <TD noWrap align=3Dleft>&nbsp;</TD></TR></TBODY></TABLE>
<DIV style=3D"MARGIN: 0px" class=3DamtResults>
<DIV class=3DiconLinks><STRONG>1</STRONG> articles found for: =
VOL-ISSUE(<B>"Volume=20
69"</B>) AND VOL-ISSUE(<B>"Issue 2"</B>) AND PAGES(<B>148</B>) AND=20
AUTHORS(<B>borella p</B>)</DIV>
<DIV class=3DsaveSrchLinks><A class=3Dicon_saveSrchsci_dir=20
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSearchURL&amp;_me=
thod=3DsaveSearch&amp;_ArticleListID=3D1620511430&amp;_orig_alid=3D&amp;_=
sort=3Dr&amp;_subId=3D&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVe=
rsion=3D1&amp;_userid=3D606302&amp;md5=3D6dc1f3875c477409c87915a14d66394d=
&amp;searchtype=3Da&amp;originPage=3Drslt_list&amp;zone=3Dbottom">Save=20
this search</A> |&nbsp;&nbsp;<A class=3Dicon_saveascitationalertsci_dir=20
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSDIURL&amp;_metho=
d=3DsaveAlertPage&amp;_alid=3D1620511430&amp;_saveSearchUrl=3D%2Fscience%=
3F_ob%3DMiamiSearchURL%26_method%3DsaveSearch%26_ArticleListID%3D16205114=
30%26_orig_alid%3D%26_sort%3Dr%26_subId%3D%26_acct%3DC000031478%26_versio=
n%3D1%26_urlVersion%3D1%26_userid%3D606302%26md5%3D6dc1f3875c477409c87915=
a14d66394d%26searchtype%3Da&amp;_sort=3Dr&amp;_acct=3DC000031478&amp;_ver=
sion=3D1&amp;_urlVersion=3D0&amp;_userid=3D606302&amp;md5=3Dfe16d74f6a2f8=
9161cd6e0582a2f10b8">Save=20
as search alert</A> |&nbsp;&nbsp;<A class=3Dicon_rsscite=20
onclick=3D"openNS('/science?_ob=3DRSSURL&amp;_method=3Dsetup&amp;_alid=3D=
1620511430&amp;_acct=3DC000031478&amp;_version=3D1&amp;_userid=3D606302&a=
mp;md5=3D8c0cffeb38fd02fd9fa4777a91db5ea1', 700, 500); return false;"=20
href=3D"http://www.sciencedirect.com/science?_ob=3DRSSURL&amp;_method=3Ds=
etup&amp;_alid=3D1620511430&amp;_acct=3DC000031478&amp;_version=3D1&amp;_=
userid=3D606302&amp;md5=3D8c0cffeb38fd02fd9fa4777a91db5ea1"=20
target=3D_blank>RSS Feed</A> </DIV>
<DIV class=3Dclear></DIV></DIV></FORM></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
document.write("<\/div>");=0A=
</SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
document.write("<\/div>");=0A=
</SCRIPT>
</DIV>
<DIV id=3Dfooter class=3DouterWrapper>
<DIV id=3DnavigationBottom class=3Dclearfix>
<UL class=3D"nav main">
  <LI class=3Dlast><A title=3DHome=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DHomePageURL&amp;_metho=
d=3DuserHomePage&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drslt_li=
st&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_useri=
d=3D606302&amp;md5=3D1aa81aebc80af81301c8af826c8762ab"=20
  name=3DHome target=3D_top>Home</A></LI>
  <LI><A title=3DBrowse=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DBrowseListURL&amp;_typ=
e=3Dall&amp;_auth=3Dy&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drs=
lt_list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_=
userid=3D606302&amp;md5=3D5cb8e3f9b6e7ab5c082ff7048cce82aa"=20
  name=3DBrowse target=3D_top>Browse</A> </LI>
  <LI><A title=3DSearch=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSearchURL&amp;_me=
thod=3DrequestForm&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drslt_=
list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D1&amp;_use=
rid=3D606302&amp;md5=3De6933b6cec7af984425b98fb24566cb4"=20
  name=3DSearch target=3D_top>Search</A></LI>
  <LI><A title=3D"My settings"=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DUserSubscriptionURL&am=
p;_method=3Dbegin&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drslt_l=
ist&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D1&amp;_user=
id=3D606302&amp;md5=3D95ef22c6cfddcd84122be4c957e8210a"=20
  name=3Daccount target=3D_top>My settings</A></LI>
  <LI><A title=3DAlerts=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DMiamiSDIURL&amp;_metho=
d=3DlistAlerts&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drslt_list=
&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D=
606302&amp;md5=3D875bdf7c1cd912342340dec4d8a2faee"=20
  name=3Dalert target=3D_top>My alerts</A></LI></UL>
<UL class=3D"nav misc">
  <LI class=3Dlast><A title=3D"Help (Opens new window)"=20
  onclick=3D"var helpWin; =
helpWin=3Dwindow.open('/science?_ob=3DHelpURL&amp;_file=3Dsearch_results_=
list.htm&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drslt_list&amp;_=
acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_userid=3D6063=
02&amp;md5=3Db215c204d63c04913338cfe0cc30b012','sdhelp','scrollbars=3Dyes=
,resizable=3Dyes,directories=3Dno,toolbar=3Dno,menubar=3Dno,status=3Dno,w=
idth=3D760,height=3D570'); helpWin.focus(); return false"=20
  =
href=3D"http://www.sciencedirect.com/science?_ob=3DHelpURL&amp;_file=3Dse=
arch_results_list.htm&amp;_btn=3DY&amp;_zone=3DBotNavBar&amp;_origin=3Drs=
lt_list&amp;_acct=3DC000031478&amp;_version=3D1&amp;_urlVersion=3D0&amp;_=
userid=3D606302&amp;md5=3Db215c204d63c04913338cfe0cc30b012"=20
  target=3Dsdhelp>Help</A></LI></UL></DIV>
<DIV class=3Dpadding>
<DIV id=3DlinkArea>
<DIV class=3Dpadding>
<DIV style=3D"WIDTH: 0px; FLOAT: left; HEIGHT: 1px"></DIV>
<DIV id=3Dbanner-bottom><A href=3D"http://www.elsevier.com/" =
target=3D_blank><IMG=20
title=3D"Elsevier homepage (opens in a new window)"=20
alt=3D"Elsevier homepage (opens in a new window)"=20
src=3D"http://www.sciencedirect.com/scidirimg/logo_Elsevier.gif" =
width=3D65=20
height=3D71></A> </DIV>
<UL class=3Dcol1>
  <LI><STRONG>About ScienceDirect</STRONG></LI>
  <LI>
  <UL class=3DtxtSmaller>
    <LI><A href=3D"http://www.info.sciverse.com/sciencedirect">What is=20
    ScienceDirect</A></LI>
    <LI><A =
href=3D"http://www.info.sciencedirect.com/content/journals">Content=20
    details</A></LI>
    <LI><A =
href=3D"http://www.info.sciencedirect.com/implementation/quicktips">Set=20
    up</A></LI>
    <LI><A=20
    =
href=3D"http://www.info.sciencedirect.com/using/Make-ScienceDirect-yours"=
>How=20
    to use</A></LI>
    <LI><A=20
    =
href=3D"http://www.info.sciencedirect.com/buying/primary_license_options"=
>Subscriptions</A></LI>
    <LI><A=20
href=3D"http://www.developer.sciverse.com/">Developers</A></LI></UL></LI>=
</UL>
<UL class=3Dcol2>
  <LI><STRONG>Contact and Support</STRONG></LI>
  <LI>
  <UL class=3DtxtSmaller>
    <LI><A =
href=3D"http://www.sciencedirect.com/science/contactus">Contact and=20
    Support</A></LI></UL></LI></UL>
<UL class=3Dcol3>
  <LI><STRONG>About Elsevier</STRONG></LI>
  <LI>
  <UL class=3DtxtSmaller>
    <LI><A href=3D"http://www.elsevier.com/">About Elsevier</A></LI>
    <LI><A href=3D"http://info.sciverse.com/">About SciVerse</A></LI>
    <LI><A href=3D"http://www.scival.com/">About SciVal</A></LI>
    <LI><A =
href=3D"http://www.sciencedirect.com/science/termsandcond">Terms and=20
    Conditions</A></LI>
    <LI><A href=3D"http://www.sciencedirect.com/science/privacy">Privacy =

    policy</A></LI>
    <LI><A =
href=3D"http://www.elsevierscitech.com/forms/sd/form.html">Information=20
    for advertisers</A></LI></UL></LI></UL>
<DIV class=3Dclear></DIV><!-- CSAS will be providing the =
links--></DIV></DIV>
<DIV id=3DcopyrightArea>
<DIV style=3D"PADDING-BOTTOM: 4px; FONT-SIZE: 11px; PADDING-TOP: 8px"=20
class=3Dpadding>Copyright =C2=A9 2011 <A =
href=3D"http://www.elsevier.com/"=20
target=3D_blank>Elsevier B.V.</A> All rights reserved. SciVerse=C2=AE is =
a registered=20
trademark of Elsevier Properties S.A., used under license. =
ScienceDirect=C2=AE is a=20
registered trademark of Elsevier B.V. </DIV></DIV></DIV></DIV><!-- =
footer div will be closed on copyright.tmpl --></DIV></BODY></HTML>

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/logo_SciVerse.gif

R0lGODlhagBYAOZwADeZRgpoNpfJPMnLLJmZmRGZSf///2mydPL4883l0J+fn5vMovn5+b3ELJu+
M0OfURycR7TYuZmyLrOzs5ilgYK/i0OrRGS3QDKlRVClXZe3Xo7GPJick1SxQjSVRRp6PJfGQRV0
OhVuNeby55irdr3HLW2yOsDfxdnZ2QxrN4S4NiaGQJfDR7+/vxmcSCGfR4GlL5ifjdnr3GmZMZix
aiF0NIbDPXW9P5e9U1ysaFarPjqoRCuMQiCAPszMzObm5pioeyifRTGSRJiih4+7NUqoP1GNMpfA
TaysrLm5uRJxOTmAM47Flo2sL0WGMqW4LX3APqfSrg9uOC6PQ226QD+lQdPT0y16NCiJQabBMfPz
85e0ZOzs7KamprG+LXWfMFy0Qd/f37LEL3i1OHW4fyODP8bGxl2TMUuuQxh3OyqiRjOiQ5iucJe6
WWGuPB19Pf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAAHAALAAAAABqAFgAAAf/gHCCg4SCYQSIJAKLAhcFj2slA5MDXk4BmJmYUm88AJ+goaKgQmUh
mpo1EpSTbo8FFowCbYgELYW4uYVcComyjo86rANfIqgBKR9To8zNpGVSxwFnDawqr7GMGrUout6E
DEiIQ7+vJqwNl6gpPR7O7+8r0ag1T6xZEI/Zi1u1XN/fkiCKAYIRsAIqWD2pcawdvIfx5mmCcS8f
LFkkEClgADAXilpHGN14lZASDGOaQgiByNKZhx7HjFTUxwjEEERJOhbS0ovAFkZQXDxywwrGujIt
kzqbogSVTEr4Hl1gdIQDIis6B01ARIHRBjXBiqJSskyp2VEePqC6Um3StUdQ/xj1I7Ax6yECHFgw
sgBJbEp3ZwOLKuOUlYlHLzYwooDoVkcGXRD9XETlEQQxlJqg+iC4s6gVhSlVebSDEQurBH509DHO
q9ACRCg9QYmJs+fbn0Br+kKphEUqjGggmgCQQU8cjHYMpdSAYSbbuHHrzrRqEpFHLhQLABEDUTdv
rAkAEWlZ0iR1mEJEXw9gegARbQcUeYRGG6Iu3owj0rsILMLMmkgBGHu4qZWJE71ZZAMj3RHwHS5W
IDLeIsBUwRxtAZRFIG4eNJVJE5QcdtEi2xBAXC6REYDcIi884gAlRmiC1IbrTZFCJjXEF8QjCy7S
4D+F3EUOhY9YOIkEKdFIIP9MmcxAyVv7CGcLLgIRoAEjGLhIyRKaaKhkdB6+pyOPi7CgEUeDMIAI
BwUJAEVfR2oC3ZfR8aCJk5OI2AEjQHhHyEcEKLIIGo+UNAB6KQxIZ3SnYALfJCUgZh8BOQ1SZRuM
CAUBJV5o8saiBNqZCW+T6PDIDYuAUAshPTFSWQHCTHKGJiuByl6jAdRAyXUjCtAnAWEI8oOEez0S
2yTOBZCGrQS6Z88k+bwwqRmChDeZAC1uOskTmmDBLIE3YnIGJaYWEJcAZhKAhCBbERCSADY8UgQl
s2KSwrcEGpjrk4+AwSAiHLVKZAFjUHLFc/iyh4UmXkwiBml8IvKDFlwxQmj/AS8O0EC3gj3AxAEJ
g+LBRJTs6EJwVw0bKJaPAJiJogAsIIMBBiRQwTsR0HzACAhkEMoDMiCQw5e4PiXfI9rh0Fh4NDAC
5wAzZCKFKDPTbDXIzeRsQAU0RxEK1wYs8OUbmVwR4qllDhfeihvISwl6y4IC9ggLRIBAz854fMAD
CBgwQigJ0Oyzkgtnsmu/jGjU7oojFXDOJFxi0gPgNJPRzAERJHDCzRmcwAQAWlsOQAY0J/BJBSck
EAHWoJ/Q+QkPeJxAAkw8AArmmt8MiqiYNDyAA4/s6eNwiLTZ+OMDaLIC5QbIwLrcVne9AM0A5EBz
BJ9MvzXo0W9/AM19G0BG/9Xg2w621diDokl1kRZQ2iKMmYgIIx1oOYkmnoDCRPQIRDD496UbgQEi
oL1PzAwBthMgAmJ2vQUEzgAHAKAB+qc9GQgQggBMQN1oJrZPaAJEk3gEBhZTi/kton4Ym8TGMpE/
UEShe9s7wQSHBoC9FRAAYKuA9Qzgtb51EACBO0EGbac92x3gczI0XfYmCIow4WkAIiRhCelnPyRl
olahyIDMrLbAronihnyrmdYyAEAZzC4BFwQg1jLQNwREYXA0G8EZq4Y1XD0xiouQUi2omMIBWBET
78hB+AD4wyUaABRa65vpJNg95+kMFBnQGg8BAEPwDc6OlMCjAPRoQgGgMP9jfwwAPOgoQBl8kXqf
2CHNOLfKUOxNjaCw3QO0VwEBpi+VgwMAJkNYgBHmsYQE4CMoaRWK/W3uANpb4AsNIEQmJIAMN/zE
BRFowAku4AC1HCAsAfDCZ5KBg8tcHRkC97dP7BKKvUTZFE9ovxViooUAkCEMPxfG6J0gmgDY3wBv
V8lrPjKeMNxb+KKnRAA4MZPphB/xgsnOPiaPhaHIgTzBp7vqPdBvOTgAAk7ws6DlEgBkuKDfbvaA
EYzAdgB4gCQRoLscXBQBC0ApAD6IUF8KIH7tMt4jkKc8ZkSQhqIg40dbktGhjuIBERwFGYGqPupA
CmIKlZ+KFnG8LWViciH/Ww/vAvAs4BVAeAJokBkQsaJ4FWBe58lE3LKKm8Jh4nAF8NciNMI0pxVg
DZSI2ibYGh0mBcBseUIbuoajMjawrAAuwwTM+HqWolFiPgXokdJsQTECdGURfClAFlTIMcZ2hmST
MJk6fQAHgTXiEQWbxMFq41nBuDUAvnuY+yKWGji0611mResA6oWM1gZGX7pyC+KGRwCOWIsR2ZJN
Z32blHBNg1xwSZu6hEUszBqLEsmaE3Mf4ixKRGtag9gjZcIiK2JuFyK4Cu4AeLWPXwVLEJfKVAG0
VQlNYPW879gqqQZQLuAsAjV/8oV1/wO5TCQKv+/A1aMG0D5pLYIWlALH/5ra9KYCGMmPnkJwM7Zq
tDEEj7YPgi8irrSILDk0cpjAooabyLCSkWk7ZwpSawZ24VCqZ8WgIEyT+NUrKTmmEClaEbbsN4AY
ZWJGKxaCcxc8gB1F9l8EAFIhwiOo01r4Qgb2En7DFAAQDsDDvSrRunKhHwLwZ8iwocQXNKGExfpW
XwFYQoJeHFY/6YLK5ClAEMxzKE2sdbvuYXK56kOi+3yjzEJWTgGIosJkBUC7nnVPlynh1exAOcS5
CM9lBbCB12RsALORE3Ml/cQSONm/m0TEmA/dExJbGQJ8NoqoIx2aSUD2fehCjWo6Aig2JedpA5C1
Wt3MLEnLmRJgtnRUK/+lk3ZNiNMtgpVfMqEEFTMrLWuJD68KgKpC00ULWYEDTyQDlNekdhLCttfy
vsUUVCwhPlGJq2lQg5VwwyFCeHmXAF5FYHQfIw3WVpJfM2G0AcR7HwK4iYnsbamBtMnK/QY1hpDh
EMJJZFQzmS0jMkIXNDEcMhUzCEnQgWIDV1yruMqECKoziXirQTsCKFFtGT4IXgh4YNJmRTGOkYI3
BNwsHoCGNJwQnwGowCIvnxQB6k3zQQBqZSIvEp8rUXI290DLEBHCCtIgjVx5ObD6gHlVGtN0XDzd
sAZ5TRA+fSRHryMEPcACD9w8BR704AMXR4UIZlD0EoyGJlRBzYnKXoj/sd7cTdF23DCCvdquO/7x
Kuf7MIhgkQJMJfCq9jjhCdGCWlSZ04rWM9uPZGTIm75sFBmGGCBbgBecy9vq0vzmOV8LIDxcAGB4
zVkxM4wGwMAJEz992b7gO1aUwASV3wHMBTCX2M/eG08fgr7hZeJg8H7xEviCExrv+BosYQZNKHpv
kP+KF6B6Oxw3keyfXwgU9IQDrqZM4mE1+sU3QAL4zz/+n7V4SoiB/K/QAct3BAo3JewHEDYnIbfn
SbqnZ2Nwff0XgRFYAirAevrQI3KBGkt3gDrBAO2CF5giCxsABvOnZ25ABFMngYvnAGPwd6/gAhaA
gWUSP3QhZRzYEfjG/xVn5iqh9wp6VgQmoAIOUH9ZMIQmoAMu6INqAAbLtx2clATrd4PfwAXi4Hk7
uAgbcAE96INc2IVeqAZo8HqyoAEaqADvJYUMZwU9kQhXKBIdgAEN6IVdCIYXIIM1oQEN0hhRiIYd
2HklRAJCJguMYAM3AAYd8IYYkIiJiAaHeANiKIjowgYaaCK7xoeEpwV+WAsxwAbTB4me+ImCCAIa
UICEZYkHiIlrOBBs0AYLCIqgiAM0QIqlaIo3yAAoUIXANAQkQAM40ImeyAI4sAVsQIMl1AVmAG60
aIlaYAa4CEy1MAQUEI3SSAGT6IwK0AJnmIzJqAUo0AIp4ozgCI4KMB4BVmCD2niOafIDPmAGE9CM
ztgFE5AEPhAG5niOgQAAOw==

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/logo_ScienceDirect.gif

R0lGODlhUQBQANUAAP////n5+fX48vPz8+zy5ezs7OPs2Obm5trmy9/f39HgvtnZ2dPT08fasczM
zL7UpMbGxrXOmL+/v6zHi7m5uaPBfrOzs5m7caysrJC1ZKampoevV5+fn5mZmX6pSpaZkpOZjJCZ
hY2af4qaeIiacoWaa3WjPYKbZX+bXnybWHecS3qbUXScRHGcPmydMW6cNwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAAAALAAAAABRAFAAAAb/QIBw
SCwaj8VCwgGxOJ8WiGNxQFqv2Gw20ex4v+CwFwNJBLTo9FbCEbvfX8rirK6jA442fA/nSAZ2gUcD
Em8fIicrKi6MjYwvKiklInB/goJ4emAhJyyOn6COKyUgbhJ0l2gJGmEfJZ6hsbIrI2IcDKlZAYVg
HycvssHBLSRiFoC5RwWsX77AwtCyxGEcCclFC5odIy3R3sEqpWAO10IMvSnf6rIvJWES17xeId3r
9qErH2DwqfIdJM/uCXTEIsS+Sw7AkBjI8NMLg1/41VmgsKHFRg/BQKhToOLFjxm/LEgTgNm/jyhd
vBDXgUMBNBS+hAiY0iILfWO0JGhWr+bH/xTjsmha4bNmsS8vrYAZUbTmyi8WrvBsWnMFGGtHNJ2g
6pOSFw1IvoCgyfWiCjAji2hKV7am1w5RizQj29biWaRyvZSo6xNiB4kANPXk+/MLByIyCTu9OuQL
CsU1a3nZGPgLLMgfUXwBC0As5pQswAD6wvQzSpwdVn3Zavrj24RfFrW+eCIOmMGzB2r2YgFMbrNv
Gm1ooKBCqAkZLnpQgABBBA+MHkBXN8EEo7thQDDyIABA9+SfHky4mAGAAQLeN5hAsGEdgPEuQosR
waj8BRcZrHt4gGA8chcmTIDAA9Zl8EAEDdznwn79MVKBAtLhB0ByGwhggAvS7VdBAwvyB/9fgAOa
0IB507lB34LmVWCdCd11t0FzLiAAAHoGmBABEfm1CMAGD8zonQflgddjkOUBgACLPj4Qo3fvKTBj
ifMJ14AAAlQwAQD3QdfcBgA0YCAAFdzoAZcRXJmlC+ZlcGUEQToIwI0ZlOffexnIWJ6S073ZiBva
OWKCAQbc6EhzRQ4xgaBoRoAoikSwOWF0E07Y5o1EXAkeI3q6gF0HJjESoAkmEGDAleMltyUAeCrg
AaJvXmlccgAoAGADG7SZgQAIEPmopfgpwCWH6iV6HRi9eVFfpaEO4QGMMgohwKoAYBoBkkLsN4QA
cRIhQK2SPkqtkUsKYVymmxbbASwZKAr/XoARGFcBeIdW58IG8EXQno3tOqgodKsq+hwjz63aCL7G
MRKvdf+6UNtXEMT2W0Pu8HaOF6w9LNBbEBxAmsUDgYFLMxzfI58XVWBgWcjr7OaFEA1TjLI6fsW1
kxd9vgxNCx4PocllNsuicgfIACDPQj0HwxIGRGjsxQd0Fc2IVSIVYVLFTjvyFgeoCEHR0k33vClg
Oq9WtSN+AX3ExF7g1vPPYBNh0olOv4AaB0EbMbMXjzn9VgfkXGHuuUX/zNkVA2gyls2bdlDFFpt0
3dpNQaHhD9EWP/UF0iSZ/AXluYXkBdZ1lLSU43yxwFJLSXGkzUytqYCaF6nbUYA2H8gGe9nPXqR1
yexhUN3WC5IZtnguAWguk+1cpfA66uUAEEBMYZCgNkoq7D1G3eWgrdD0DFXvBmXNE1GA8UuxxdAL
KJy+2fDhF5GHGx9wrg4KwYsBQdZo8KG/Gzx7s/D+AAygADuQN3Usb4AITKAXiLIOBTpQgUyzR/0e
GIYgAAA7

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/sci_dir/reduce_font.gif

R0lGODlhEAAQAOZFAMvXvGydMTVqKlWHLuPm3yNZJ16QL1uCXuTm4aa6otfc1pCueNPcyKa5p1CC
M4Wna3GXYkJxP1mKM1eCTpCqjmSQSt3i27TIrPL28H+kaunp56S3pTFlLrTHoW2Pb26bQ5aulT5v
O77Pqdne2WCLUD9zK46yY7jNqHCfP7bGsNXdyrbEuEB0LZSskrTCtsPNxMfTumaYMISsVKi8oLPF
pIehiuPl4bvOpdXdzHSXbeDj3+Ll36O/gUJyQISiftrh0l2LQoaginGaUr/KwXeiR+vr6wAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAAEUALAAAAAAQABAAAAdvgEWCg4MEAIeHDISLBDIBjwE3i4s7QgMDNJOTOhMJmp+TKiI/oIMa
JgE8pYI4KDFECKsdBh8GMKsPEicDC6UWDhkYFUA2oDMlEBckLCmgOQLQ0D6fChEhLSAUHD0jmhsF
HoMHBQ2aKzUvg0NBLpqBADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/sci_dir/increase_font.gif

R0lGODlhEAAQAOZJADFmKTdsKl+RL7jFukV5LFmLLj5yKytgKCFXJzVqKrvIumydMVOFLkx/LWSW
MCVbJ2maMdTb09PcyJKqlcvXvP///1WHLr3NsNHY0uPm342tddng05y6dzFjM9vh1I6wak56TIWj
f97i37LHmdLZ0l2MOn2mUkByNoanepKvh4Onbn6fc6O3orfHr3+dfbrNpa+/rj1tP0l2S3SiPZ64
lXObVavBmK3Eoo+ve7nNsF6NOpmxls/Yx6G9iUJzNfT38tfd02yOcKK5l1WFOMjSxuLl34yrdF6I
TsTPxuvr6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAAEkALAAAAAAQABAAAAeRgEmCSRIUFIOEMxyISRkLjx6CPDoWFhqILxCaI0kRJwmgCSGDHw6m
JoyMRQKsrBupgxcFBT2zNrCCRgwMPyUMNbhJQw0qFTgNDUCwLQQENxU5zUKwKwYGKDQp1kewPgHf
4N8RjEQA5ufnO4wuBwcsCvAw7SCMMQ8djDIPDySICAhBGE34NwHRgAEYGIk4iARRIAA7

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/sci_dir/jrn_sub.gif

R0lGODlhEAAQANUAAP///5S7m2maMbjFuk+CLSFXJ6vEjmWWMGCSLyduMyBaKSJfK1uNL1WHLrvO
pVd/WGOKWiNjLkh8LCVpMIquYDtvKnugXX+lXil0NSpfKFqCWWyTW4erX4OoXsTPxjVqKlR8WGeO
Wit6OEJ1Ky9kKSVbJ16GWnacXXGYXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAQABAAAAZ6QIdh
SCwWHRSBcslkUjiHqHQ65XQQ2KxW27kwvoCwWPy9WBrogHq9RltOhLh8Pj+hJKKxHiCSoDYjGGyD
ARgjGyEVCYuMjYsVIRAfE3tjEx8QJiQRhGwRJCYaGQukpaakGRoPJQqtrq+tJQ8gBbW2t7cgHgO8
vb6+HkEAOw==

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/jrn_nsub.gif

R0lGODlhEAAQAOZGAP///8TExE5RTVFRUR0gG5KTkTk7OCotKdPT05mamUdIR3Jzcs3OzcrKydHR
0SEkHzQ2Mz4/PuTk5Obm5S8xLktMS9zc3CUoJE9PTkNEQ5CRj5SVlJ6enszNzJeYlpeXl7u7ur6/
vrm6uaOjo5ydm4iJh52dnISFg8jJyJubm8PDw4qMisLCwpGRkbi5uKGhoYaHhZydnI2OjM/Pz9DQ
0OHh4Y+Qj56fnsvLy6WlpbKysdLS0sfIx5mZmb2+vcDAwLy8vLe4t5SWlNjY2MTEw8HBwevr6wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5
BAEAAEYALAAAAAAQABAAAAeagEMBg4SFhTUcA4qLjIwBJhg6CJOUlS0YASkVOwCdnp85FSo9Cg6d
Dgqpqg4jCiwfGTSdFgu1thYvGUUbETOfvwA3ET8FBgwMBsnKyQwkBiE2EB0TCdXW1dQQPjIUOMCf
HhRAKwcNDQfo6egNQgcgJRcoEgX09fTzFyIwDzzfnhoPXJwgQLCgQYNBYghYyLBhQyJGIkqcSNFI
IAA7

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/icon_arrow.gif

R0lGODlhEAAQANU8AEVOQkNMQP///ysxKS81LJ+knvX19czOy/Dw8CgtJff39/Ly8iEmHyQpIjpC
N+zs7EBJPT1FOjM6MDY+NPb29nV8c/n5+dHT0PT09IGHf+3t7fr6+h4iHOjp6K6yrUlORjI2MPLz
8vPz80hMR8XHxPHy8Z2gnX6AfcrLycfJx1lfV/7+/mtvafv7+6Onofz8/JOWkvHx8WVnY2NoYdTV
1OTl5JqcmUNKQXJ5cCktJz9EPhsfGevr6wAAAAAAAAAAACH5BAEAADwALAAAAAAQABAAAAaOQJ6Q
p7hkKpWMy3PpCBTDBQlArVoFww0uwO16sUIBZAwpmM8FaDjCjggM8LhmKHDYHeDhEIFY3SaAAnwP
egsHhyoSiocHIYRCGzMEk5STHwuPPAs1A52enSgYekQwCaanLBajPBovOg2wDSAlCKs8GCkMugwm
FLZCFjIcHCMtmasIMTk7NCK/QxQ2J2qrQQA7

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/preview_on.gif

R0lGODlhEAAQANU9AP///2ydMUJ1KztvKo+zZTVqKipfKC9kKbnHupexlODj32CSL1uNL1WHLnuh
YmmaMWWWMN/i34OoXnGYYHugXUp2TIywZFaBUXCRcX+lXkl3RHKgPoClYtLZ0oSqY4erX9Thy7XJ
r2yTW7jLr2iPX4quYIitY9/j39fky3qbeZSvk8vYyYahiVeCToWtWFJ9ULPHr5SwgFyGTtjly0h8
LGyTX0+CLdbiy97n13adYYyxYN7i3yVbJ+vr6wAAAAAAACH5BAEAAD0ALAAAAAAQABAAAAaEwIBw
SBzqer3HhsBsNl2PEhJiAViv1xnkg1yYsGDUQoJkeMDYGyODbHDQV1CDgrQ54FacI4ak5fBXSD0C
EwAjAoiJigIiAzVWIQOSk5MyCgUkVzAFnJ0FLQo9BxoJCSsACQeqqhcnSAawBipWKbEvEYIIuggd
ghg8FbiCw8QsO8TIyYJBADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/icon_pdf.gif

R0lGODlhEwATANU/AOvY2Y2Mkf8vNN7d3EA/P9XV1OWQlfkEBu3u7K2truvr8ebm5eVZWt7e4MC9
yeZ+e4oCBB4eHr+9xcvNzL29vP9ESeqqqtlRTv0WGP95ef/+/v5oZXR1d+Li4cbFxeZJR8TFyOLi
5Pn2+fb2+O/u8Kenq7a2tqysqubn6Obn4tuChvf5+O///+7j6eG5u6cDBN/u8dbU2dfV1dHLz/1T
VuJwctNlaL2/xvX794CAf+Lk49waIeQABN47PP4NEP///yH5BAEAAD8ALAAAAAATABMAAAbMwJ9w
SCwaj8hiIcE8MZmdJAUkuUlMpUDjNChmNrSKWEDe5TSNUoOYIft8hzjvxdGgE6jhRoDBwOUQARwc
OQEFQzsQiouLCxMeFJBGDgUzEw0XDQMyMSAyJpMNMg0jFzoIKQMTIQlGNyEDCAA9BiIKKAULrUUO
Cx0rDwoGFiMLAym7RBIkCgAfFhYfHwwqJCeTCCQMLgAkLDAuNrquLQy1CAsLmpfXvDU1CCEhDQX1
FEtGFBo4COgdA/U8FGhHhAKBCAgTJiQAKolDIUEAADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/logo_Elsevier.gif

R0lGODlhQQBIAPcAAOuaNO7KmXh4eO7x8dzc3N/f3+zs7Obm5m5ubk1NTfB0AIWFhe9qANra2u+9
gisrK1FRUfHq4mhoaOrq6np6eu2EC15eXnZ2duTk5PGbSHJycu3NoO/l0WVlZWxsbPDk1GpqauyM
Gu7x6+/ZvO7p3XR0dGRkZO3hxfGVO/Do2T09Pe/izkhISHx8fPFZAO3SrPBuAO9wAEFBQfF6A+/h
ye/XumFhYWBgYPDt5e3o2e65ee7Aiu9jAO+dQ+7DjvHFmeyUKe7cwe/Flu3aufG7hFhYWOzo1fHm
2zExMe22cVtbW+yhQ/FjAO/x7SMjI+/WtVxcXO+NIkVFRfG1efDUtO2kTO3TpzU1NfHJouupU+3G
kVZWVu6qWvDx7PHPq1RUVPCJIO6JFu21bOiyXuqgPBoaGu/s4e9+Be7exe2xYjk5Oe19AOuuWuuy
Ze7q3/GYPu2vYu3Jle94APF+Cu3dv/DJnu/CkOu0Z+uvXvCBCpKSkoGBgcbGxqSkpHBwcNfX1/Dx
8aGhoaWlpYuLi4+Pj6ioqJycnJSUlLW1tbm5uZubm5eXl5qamqysrJWVlZOTk4eHh4aGhpGRkZaW
ltbW1oqKipmZmZ+fn6+vr6urq729vdPT05iYmL+/v4ODg52dnaampre3t4mJiZCQkNDQ0KKion9/
f+jo6KOjo9LS0sHBwdjY2I6Ojp6enoKCgr6+vtnZ2ampqfDw8KCgoNHR0dXV1aenp8rKyrCwsMPD
w7S0tM/Pz8vLy8LCws3Nzbi4uI2NjdTU1Ly8vLa2toCAgODg4MjIyK2treLi4oiIiM7Ozru7u8zM
zLq6usTExH5+foyMjLOzs7GxsbKysqqqquHh4XFxccnJycXFxa6uru/v78DAwO7u7unp6cfHx+Pj
4+/v6O3Zt+y8e/CJG++kU+24dezs2vCRK+zjyPDx8OisTO7Bhe7x5/HYvuuqWPDAj+2qXuyuXet7
AO3kzu/GlevdwO/awO7fyPHu6u+FF+2xZvCUNfG3gOuwYvG8ivHx8SH5BAAAAAAALAAAAABBAEgA
AAj/AP8JHNhtoMF/2TR1IpVr079Cif4tI/WH2L9imwIJxDUL0j9elP61SoTskgFWfLCh+meg0MBd
fw4alIXpn6OQ2FgWoIBIQisPDSzpuYWrVSFFgUxs47MKCh8+Fkz8Q9WJQrZGt/T4wvXvwCIQg/7J
kvSPgoFAkZzJ/HdKpKU9xv5J6IaI1T9Y2wZdSATqVBFRpRZ1OFRAkaBFhW4IuCvJkq5Qt0y0aKTk
XyNfnyYJukTp0T9vlfpkGraNGaoDAgUMg1zpkKJty6T929OAgIYWpPpAeaaHACQNqxb8Q4QkmKoi
174Zs1TI1rRBFhpNO3bIkIFLpkKVYEbMlCBGowwp/7kVTJDBVnsglUBQoBMrP4IGQeMzqdOwSsuc
6RFZjVaRUIvYsIAwFoRyDCUEqOJBI6UUMYgs/1wAyi8a6LGKHgaQEkkviADDgiaB6IFaV6Zw0skj
vvxDCDPZ6EIIJn6gMo0EeoDCyi+lWOCBNK38cQgyxuxySR+z9PIPLpUU8ZE3tATiDDWr9GELKKMg
sAcqvUQzTR+MLCMML4YIhExEIf4TyDGDJDNKH3xIU8Bd0ljwiiq66EEIMswc8s8fEvwjCC2GMHLJ
HoxYAooAtlygyC+NyDKIHqH0kYono0RTSgtFXJJKB5b0IRA3/3BDwD+pWIILMX90oEkfoeziCTZV
Qv/ixzL/+DIJJ5H8UwArjEggACGI2PJHL8cs8g82lmCyiAkI8OGIJAi4Uow3F/ghgFoCZONJMAJV
Qg0pnBBQRCr/IGDAAQLoQUovQqVXEyEUsFLJLZtwcoAih6RSyiSNLGNJNalYIIw0yvxjZyP/2KKM
J8RgMoofiDQyyT+x8EtQK6Ac4kkmgrxiHijKeDYLH78ko8ki27QCzCAChHKNBJ3kkowBkqjyR54C
CLMKIpG4IgofnyAwCSGtLMKHBgsMk40qBPzhhx7GJMKHQKtIoAQtuLACTQd6WCLIHqJoAs0yek6z
jCQt8KJHIMb08UVHhuzhygV6dBLMHoZQoAcfAkT/sosgGkQySiOQTLBHJgLs8U8yErDSSSMxnYJA
KaSUW80ezfQCSRG4bHLMHgscgAw1SkCECi+w3ILJBcYowsjUonhwSiIu4aLHNK4gEs0ngvABgiXJ
NCAALY6E0osom7jiiEyJIPAPASVQcIwtekDwTy+7LHtIMoaMBqMrn+wySyyJILIHLN548E8iFPAB
SibZLALJAozsgU0qoBDyiCTAJDPLI4QYxDUY8Q9tGMQU/xCAIEqRgER4IBvAIIQeNOANbMTCGH5w
WSVsIABY/OMVCHhGMEpBAV9dghWkWMAgAuG8f0AiFIHARS1QgYoW2MIGjzCAn1yliE4ZRBuxAIYp
/1CRCWE0IhKM8EDFEpAJAvBBFxL4RTS4sYdX/OMRfECALmjBiEdQgBflCQQjupGKQkjDEKmAxKMI
QABUWOMYBjAGJ/rgmj5Y8R+YiMU/FJEAlhRCAoS4xT8usYhI8AIaB4AFAqwhC0RQIBf/kEQiSvGI
T7QgF5A4wCGuoQRf3GIWpyBANG4QCAv0QRmDsYQzHiEBbRDAD4NIRSWaIZt/NIMCtiAELLCzDFoo
QwO8MNgeMOGISljiFYeAxjZgUYRPAMMP1ugEJRDAiQLE4hRbiIQhivAFV3ijG6LARC4YsY11NawX
gbgAIQ4RimrgAhsaGNE/jjEKGRAAGRKM4gVoZf8BW90tb7YIhCho0SdO7EEaelBFAvZwjUpIQBYe
2QUnEuGHZkTiFJkwgSFqoQtBxMIXC4jELbCxBRPEZSCRAEUfhqEHSvDxE6UohadcUQo9DMNMGugE
JwwhjdY0Qxd9oEZpKsGHK0yNF7rQBCoo8gtHLKAFoGjFWyhQxX90gAL/6IQ2R6GJWnmCAMXowyOI
YQtTGEIAFHiFIpQRC7k5oxCE8EAwjvEFaXjAALTYxn5+gQwByGAavECEK0IhDAGJwhfVKAAwnqGI
URSiEbtIRAsOMaQ9SCAR3zAIJApxC08IAhObEIYocAEMCfBhF3wQRSUaAQwNMEgDfLgAIjrhgT//
YEIZICiGKlyBAFbsQQMI0MMisEGKaByiBdBIWjewIQDoSGIYz4ilcAQSiFEYwBPIsAEoOIGKAuBq
aNAQgC8UYQhHCMADHSiF4hYgAEp4gBKU8QMhPOEHCNjiH3xY4QJMYAtiCGMB0FDGLFRRDOX1Qg+H
cAQi+KBDlgikFahAhHwR4Q1GDCIslViMJtArCFAkYBCvIMssisCJWGhgDzJIhga28Q9QvGIXoiBE
TPzwj1DkIkeGQM0CiCGIXxSCN205CCX+YIxJHKAEzhiFBhyBgG/IQhSWEIUqRiQJPUgCGhexASou
QQELLGATT+SFKiJxAAiEhBMT+wUhJuEIY+Bi/w+X2MVDEiHAg6SCD9UwRU0EEI1ixIIPBHxFNDTx
h0TsoRDGEsgoSvAHShDqAlfcJS2m2AphFIMAkSCAIiohElWoRRKbyARXVIQBISeAGIU4AK+uAQtU
iGI4nLDAP2S9jT6xYDH/CGomkJGVY/gCBLYggB4QgAxNZOMzCJAALVLRiILQ+CB5lkklEaEaZrjC
FLbgRjUY24kLCEMYmmDGLGziBIFg49iKEAZMWQmh5Z0aFtXoSa4fwAyBjOogEJIJLhIgqExIgBot
CJM2OlAIQzRUAEVwyuecEJJ/EIMaXOrAFlrRCxuYQNbU2MMz/KSLTkChBZ5Zi8ht6QcbWHwTqP9Q
3isC4QgW3iABlqjFISCJDBVk4h+ryJU2NPALCRx7Ac3yQwsEAglLHMAQq0iAFK4xcpksohMCMYYM
glyMUDTDAKFQhFQocAFNPGISlgBBNATyjU+0wiEyCAQmCqACVQCj1NqwgC4G4YECKAMJz266QDoh
gFXgAhaLIMunBiKJXgi+ERKQBCuMMQo+KOIftLAAK3ZRAAGFghoHaEYZ1MKIWQTDBjCbtaz1ruhE
MIIAwehDkBuRgAWA4h/dEMAnIPDqfxhiFoIggCG+gYA+jEIYLZCEID7xDwx8AhELSEAvJDCIzhAi
FQaAwAXurfcJXMAUmuBFMxbhKSWlYhCv/0f/CQJBAQ38IxeXyAQCKqGKPQgAFELsxAFEoQQl/YMT
jriCBfQwi2+o5RkX8EikJxBKAA2QkAnNkAieMF5fYADFMAjZwAufUAzK8CulUAgX4AuIsAjRwDcd
owzb1wGNgAmk4Al64AeXgCydAAz/IAXJsAhqMYCWQQgtACHJcHNGAnmswAnTsAgygAgGMAm7EAqQ
MA2QgADB8Ay6gAj/4AEskACykAwg0AF7QAEmAgLTcEUeAA164BIyKBCuIADVQAx3ZBDfcAsP8A/S
8AUSIQlOMA2bYANbQAGJEBIm8AxB1gERgQm1QAqQcAqLoASSgAoJ0CcyeAuFwAkJ4Aeesham/wAC
3GABi+AQESEQN2ADv6AIo/IFEyMTCGABiKAEGkAI0BAJHiAVA8gLHnAJC1AE+bYWt1AGZfCKB/EK
iYALr0AKEKACv5AWA/EMgfAFfJBhgSABlyAALaR3iuAEC2AB1qN31QAqIpeFi2AKpbAAzaAJEJAI
i6EIxKAKkIAMyWQKjuAJX4BreqcLy1MLFkAuXygTrDAMOTMKsZALkxAKflJqwOABxGcLn3AIIOAB
yUZ6BhALfUIAF+BB73gQqFEKCKAK1mABnnAMzqALAmEJSDAJueAHEgAMfcAJ1iAAtLgWpyABkLaQ
TTcaniABy6ABo+AIvGBA2vAHhGZyvyAKi/8wCAggjSjZkwJxAJBkA6YwC45wAZJgDRohEJtQXmn3
D8FgNT4ZlQLxegWAcC3gPDs3IrgQCH0AFv9gCokjlSKXCcVQbzJhQAnzD8gABQnADcMwC8NQBDHx
D5FQDAjgDLI2CZOAjmIpELUgAZ9gA15oEKdgAxMQC/tRLpWxJ2o5EFuAARdwCmqgAewkAUEmloKw
AB1gLa4gCNxiEBOwDLqRmH6QjAZRC+ZhPX1gDXuQJH35lR0gAdaAAI+wCiM3CLPAgrnmB4aQbKhR
EKvgEiyAGn5QBEpgiGJZCwkADcngB9lgA60wct7gCYLUhEpACJ8ASQgwAbb1D2loMDZgAZz/loM+
qQnGgAoU0Ap9kAA24Aq1IBMGQC7HoAnH0A0lAAHUQD20MAh9QAnDYABXIBCzqQS6wAhjZxAE4I4D
aAGgSAECkAk3wJAaoQyKcAmT4GXWVAhSYAHEQAE2oAisUACn8Acy8DwdkABb4AmGoFoDIQEJEAkI
wISkNw0ggABPZQGvWAAEUB0UUAg39w9hgQnNIBBX8ISHIAkdoALXAAl9YgwS4AF6AAkCgAq5EAue
8Agy8Al+wAlmuRbI8A+bIAgFsDkl8AidcAqqMAuX4AT7wQcpKhC5cAqTsAqXgAQ69AixqQFFYAP/
4AoW0AyFBQEeMJslEAmwkAyssAxTUw16/yQT12AAoKAJn4AJrGANX2ABgaABKoAEEucJZIcEqvAP
u6AHWHoRCPAFmkAAoqABpvCjfrAHKuANyVAEe2oDRWACEFACm0kJjsAHudBgz/MMDWABhSALgpCQ
syYBmDALmhALySAAo3AMBcMNXfUKN4ersmEBHWAKopBSnkABSqAjjNBHfWABe+ABz0ABHRAVDOoH
fsACpYCKlmF+/+BQ2vAKoyAQFFAL2tByO6ULf0AA1CAN0UANhRCqv8AIrkAM6AGmB8AMvnIBEPAM
rFAM/8AMLNACjCAJHnABFrBIEvCxfGqbDVAGD3AFSKAGKuAEDyADTlAGKqACZSADKvAAKf97BZt6
BVKQADXLshBwBU6ABCqAskKLszIgtEiws2XAsg+wqUjAAi07tAnwAB0wELJgM5RACqSwCbAQDBRR
C7tQC3/gC5uwCpSwCZtACrRAC55EEX+wCSDRAG9LCcumDLRQC7WwCn+wCqTADGJLAKsgtqsQDLBQ
C5QQuL7wJq+5uIzbuI77uJD7DzRwDyJgDzVwuSnwD+EADisQBAcBCDrgAG4guRwADiNwuSOAA3SA
AylwAgLRBXSQAnQQBJxLAykQBCKABpdbAx+guW7gBk/wBDkACAaRAkvAA0ngAA6gAwoACFbAA+dg
BAaRDnLwAkMAAzowAFEQA8rrAG1QAeH/wAPjwA4CAQg+wADm8AJMAAQkAA7wwAT6sAOhGwMRYAQK
kAdUsA5ykAfEOxArwAADMBD1wAH/oAAbcBBLkAYC4QZk8A9E0LwDUQf/wAUQLBD0oAUCAQNYIBBN
wAMGwQFP8A8o8AblywRZYBD2AAMBLBA48A+AoAABcBBVoAAr3A7/MAUV7ML/MAA8IMECEQIDAQM/
IBA5wACv2MIivA8CMQBn0MADMQIxcA8fcARiIAQurABx8LkxAAPhMBBTIAcksAJHkAUEDAj7UAHE
+wLuEMRD/A85AAO8ewQ6QAQCsQ8Z4MJe4AKuOxBBoAB4EA93sAZecMVZfBADEAYusAQB/8wPctAG
bNAP8oDENOACBAwESPwPQkzECuAOeBDI7yAQGTAOYgAGQNAEBzECKszBVkDIIpcEiQwIODwQ6LAC
5bsG5DAAAGAQmezGDDAQgODDKIACgBAGZyATKWzKvvzCMTwQ83DAAqEDTAAID9y/AmEGFqwAZNC7
bEzEDEACBoEPIkzCAxADZ0DN//C/KywQbFDAziwQYwAA6VDNHuwPOQwOY1C+MQAG5qzBAiECHmwQ
6vAPb4ACS8wDPTAQJAAHcyAOQrADWhAGXnACedADAWAHO7AGKbABZzAEaDAOTzAAPZAPPmAHFo3R
AwEHISwQ6bABc1AFbiACSTAD5dDQ9BYQBTsgAmAQBeggEBwAA/0QuUD9DwEBADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/sci_dir/emailarticle_a.gif

R0lGODlhEAAQANUyAP///y9lKSheKPr6+lmCXThsKmydMUB0K2GTMEl9LFqML1KFLWiZMJy8fpi3
faG/fo6ue5OzfPf394ioe+7u7oOjeqPCf9fky9Xg1tTgyp+5lfLy8qjClvPz86zArsnXyezs7Jey
lMvYyZu1lO/v7+3z5bDJl63Ii/b58qzFl8/cytHeyqS+ldnly5Ouk7PMl9biy83ayuvr6wAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADIALAAAAAAQABAAAAaBQJlw
SCzKKCQJYMlsSiigEsBiqFqvJwDq9QA8GOAwuPtomRANQAPBbqfXl5RC4QA45vP6XQHjLP4RABGA
gn8LGSwJigkQABCNEIsJKxoHlpYTSxOXliojBaChFRWhoTEhAamqq6siLgKwsbKyHx4Et7i5uRgd
A76/wMAbRsTFxkJBADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.sciencedirect.com/scidirimg/sci_dir/exportarticle_a.gif

R0lGODlhEAAQANU8AP///02ALT1xK1yOLy5jKfX19SddKGydMWiZMJCrk/Pz8/r6+kV5LGOUMFWH
Lvb29jVqKqzArmiPX4ClYmKMU4WqY2KKX/L28oqvZFuGUl2GXpG2ZY6zZPP28qK8lW6VYKO6ofT0
9HSbYZe5cZe0iWCPO+Dq2G2bPVyKRvn5+eLr2Ozs7Jm5fePs2Pb58vH18rrQpPDw8FiIOlWAUXqg
YmiSVPL18t/o2PLy8pW0faC4oWaVPOvr6wAAAAAAAAAAACH5BAEAADwALAAAAAAQABAAAAaTQJ5w
SCzyFoCkMrnAFTeHqDS6WaRiQw5iy91yXKPWQ4hpNJaABgbWOKnGlYF8Lq8AWIOd6TFxoAEOE0k5
DiU3NAGJiouLMiIMfwwoHh4kDAw1HwKbnJsfAB0UAhQdEhB/EBIXGRAZFwoWBLKzshYgBDM2Cjwa
Br6/vhoLOi+7PBEJycrJEQohK0MKBdPU08ZG2NhBADs=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/static/stylesheets/css_gen_v01.css

BODY {
	MARGIN: 0px
}
DIV {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
HTML {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
IMG {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
INPUT {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
SELECT {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
TABLE {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
TD {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
LI {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
.pageText {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
.alertMsg {
	COLOR: #ff0000; FONT-WEIGHT: bold
}
.errMsg {
	COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.refMsg {
	DISPLAY: none
}
DIV.msgBox {
	BORDER-BOTTOM: #dedede 1px solid; BORDER-LEFT: #dedede 1px solid; =
PADDING-BOTTOM: 6px; PADDING-LEFT: 5px; WIDTH: 80%; PADDING-RIGHT: 5px; =
BORDER-TOP: #dedede 1px solid; BORDER-RIGHT: #dedede 1px solid; =
PADDING-TOP: 6px
}
DIV.msgBoxExcerpt {
	BORDER-BOTTOM: #dedede 1px solid; BORDER-LEFT: #dedede 1px solid; =
PADDING-BOTTOM: 6px; PADDING-LEFT: 5px; WIDTH: 70%; PADDING-RIGHT: 5px; =
BORDER-TOP: #dedede 1px solid; BORDER-RIGHT: #dedede 1px solid; =
PADDING-TOP: 6px
}
DIV.imgIcon {
	PADDING-RIGHT: 5px; FLOAT: left; COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.imgIcon H3 {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; FONT-SIZE: 1em; PADDING-TOP: 0px
}
DIV.errMsgText {
	PADDING-LEFT: 26px; COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.alertMsgText {
	PADDING-LEFT: 26px; COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.confirmMsgText {
	COLOR: #000000; FONT-WEIGHT: bold
}
DIV.infoMsgText {
	PADDING-LEFT: 26px; COLOR: #000000; FONT-WEIGHT: bold
}
DIV.msgText {
	PADDING-LEFT: 50px; COLOR: #000000; FONT-WEIGHT: normal
}
DIV.errMsgText A {
	COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.alertMsgText A {
	COLOR: #ff0000; FONT-WEIGHT: bold
}
DIV.confirmMsgText A {
	COLOR: #000000; FONT-WEIGHT: bold
}
DIV.infoMsgText A {
	COLOR: #000000; FONT-WEIGHT: bold
}
DIV.msgText A {
	FONT-WEIGHT: normal
}
.textZone {
	BORDER-BOTTOM: #9c9c9c 1px solid; BORDER-LEFT: #9c9c9c 1px solid; =
PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #efefef; MARGIN-TOP: 10px; =
PADDING-LEFT: 10px; WIDTH: 582px; PADDING-RIGHT: 10px; MARGIN-BOTTOM: =
10px; BORDER-TOP: #9c9c9c 1px solid; BORDER-RIGHT: #9c9c9c 1px solid; =
PADDING-TOP: 10px
}
.OriginalArticle {
	COLOR: #7e7e7e; FONT-SIZE: 0.92em
}
.pageHeading {
	MARGIN: 5px 0px; FONT-FAMILY: arial, verdana, helvetica, sans-serif; =
COLOR: #000000; FONT-SIZE: 150%; FONT-WEIGHT: bold
}
.pageHeadingBlack {
	MARGIN: 5px 0px 0px 5px; FONT-FAMILY: arial, helvetica, sans-serif; =
COLOR: #000000; FONT-SIZE: 150%; FONT-WEIGHT: bold
}
.pageContent {
	MARGIN: 10px 5px 5px 0px
}
#sdLoginBox {
	PADDING-BOTTOM: 0.1em; BACKGROUND-COLOR: #dddddd; PADDING-LEFT: 0.1em; =
WIDTH: 29.5em; PADDING-RIGHT: 0.1em; BACKGROUND-REPEAT: repeat-x; =
BACKGROUND-POSITION: left bottom; HEIGHT: 6.7em; FONT-SIZE: 0.8em; =
OVERFLOW: hidden; PADDING-TOP: 0.1em
}
#sdLoginBox INPUT {
	FONT-SIZE: 0.9em
}
#sdLoginBox DIV {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox HTML {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox IMG {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox INPUT {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox SELECT {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox TABLE {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBox TD {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em
}
#sdLoginBoxFold {
	TEXT-ALIGN: right; OVERFLOW: hidden
}
#qsTitle {
	PADDING-LEFT: 12px
}
#sdQuickSearch {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; BACKGROUND: url(/scidirimg/bg_QuickSearch.gif) repeat-x; HEIGHT: =
54px; FONT-SIZE: 75%; PADDING-TOP: 0px
}
#sdQuickSearch TABLE {
	FONT-SIZE: 1em
}
#sdQuickSearch LABEL {
	PADDING-RIGHT: 5px
}
#sdQuickSearch INPUT.textbox {
	BORDER-BOTTOM: #b2b2b2 1px solid; BORDER-LEFT: #b2b2b2 1px solid; =
MARGIN: 1px 0px; FONT-SIZE: 1em; BORDER-TOP: #b2b2b2 1px solid; =
BORDER-RIGHT: #b2b2b2 1px solid
}
#sdQuickSearch INPUT.button {
	FONT-FAMILY: Arial, verdana, helvetica, sans-serif; COLOR: #000000; =
MARGIN-LEFT: 14px; FONT-SIZE: 1em; FONT-WEIGHT: bold
}
#sdQuickSearch TD {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif
}
#sdBody {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 75%
}
A.ActionButton {
	TEXT-DECORATION: none
}
A.ActionButton:hover {
	TEXT-DECORATION: underline
}
A.ActionButton:hover:visited {
	TEXT-DECORATION: underline
}
#a:link .Active.ActionButton {
	TEXT-DECORATION: underline
}
A:visited .Active.ActionButton {
	TEXT-DECORATION: underline
}
.ActionButtonDisabled {
	COLOR: #9b9b9b; TEXT-DECORATION: none
}
A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
A:link {
	COLOR: #0156aa; TEXT-DECORATION: none
}
A:visited {
	COLOR: #840084
}
A:active {
	COLOR: #333333; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #0156aa; TEXT-DECORATION: underline
}
A:focus {
	COLOR: #0156aa; TEXT-DECORATION: underline
}
A.linkclosed:hover {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
A.linkopen {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
A.linkopen:link {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
A.linkopen:visited {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
A.linkopen:active {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
SPAN.linkopen {
	BACKGROUND-COLOR: #777777; COLOR: white; TEXT-DECORATION: none
}
.linknoborder IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: =
medium none; BORDER-RIGHT: medium none
}
.linkdisabled {
	COLOR: #9b9b9b
}
INPUT.xpstyle {
	BORDER-BOTTOM: #b2b2b2 1px solid; BORDER-LEFT: #b2b2b2 1px solid; =
BORDER-TOP: #b2b2b2 1px solid; BORDER-RIGHT: #b2b2b2 1px solid
}
INPUT.qsinput {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
FONT-FAMILY: arial, verdana, helvetica, sans-serif; HEIGHT: 1.6em; =
PADDING-TOP: 0px
}
TABLE.sdMainNav {
	BORDER-BOTTOM: black 0.1em solid; MARGIN-TOP: 0.2em; WIDTH: 100%; =
BACKGROUND-REPEAT: repeat-x; BACKGROUND-POSITION: left top; HEIGHT: 2em; =
FONT-SIZE: 1em
}
TD.sdMainNav {
	BACKGROUND-REPEAT: repeat-x; BACKGROUND-POSITION: left top
}
.sci_dirNav {
	BACKGROUND-COLOR: #6c9d31
}
.sci_dirNavActive {
=09
}
.blueNav {
	BACKGROUND-COLOR: #0000aa
}
.blueNavActive {
	BACKGROUND-COLOR: #bad3f3; COLOR: #0000aa
}
.redNav {
	BACKGROUND-COLOR: #990000
}
.redNavActive {
	BACKGROUND-COLOR: #f7cece; COLOR: #990000
}
.greyNav {
	BACKGROUND-COLOR: #7f7f7f
}
.greyNavActive {
	BACKGROUND-COLOR: #e6e6e6; COLOR: #7f7f7f
}
.greenNav {
	BACKGROUND-COLOR: #007703
}
.greenNavActive {
	BACKGROUND-COLOR: #c2edc0; COLOR: #007703
}
.orangeNav {
	BACKGROUND-COLOR: #cc5200
}
.orangeNavActive {
	BACKGROUND-COLOR: #ffdfca; COLOR: #cc5200
}
TABLE.sdMainNav A:hover {
	TEXT-DECORATION: none
}
TABLE.sdMainNavCenter TD {
	BORDER-LEFT: white 0.01em solid; HEIGHT: 1.82em; FONT-SIZE: 1em
}
TABLE.sdMainNavCenter TBODY {
	FONT-SIZE: 1em
}
TD {
	FONT-SIZE: 1em
}
TR {
	FONT-SIZE: 1em
}
DIV {
	FONT-SIZE: 1em
}
TABLE.sdMainNavCenter {
	HEIGHT: 1.82em; BORDER-RIGHT: white 0.01em solid
}
TABLE.sdMainNav A {
	PADDING-BOTTOM: 0.33em; HEIGHT: 1.82em; COLOR: white; VERTICAL-ALIGN: =
middle; FONT-WEIGHT: normal; TEXT-DECORATION: none; PADDING-TOP: 0.19em
}
TABLE.sdMainNav A:link {
	PADDING-BOTTOM: 0.33em; HEIGHT: 1.82em; COLOR: white; VERTICAL-ALIGN: =
middle; FONT-WEIGHT: normal; TEXT-DECORATION: none; PADDING-TOP: 0.19em
}
TABLE.sdMainNav A:visited {
	PADDING-BOTTOM: 0.33em; HEIGHT: 1.82em; COLOR: white; VERTICAL-ALIGN: =
middle; FONT-WEIGHT: normal; TEXT-DECORATION: none; PADDING-TOP: 0.19em
}
DIV.sdMainNavPadding {
	PADDING-LEFT: 1em; PADDING-RIGHT: 1em
}
.alphaDivider {
	POSITION: relative; PADDING-BOTTOM: 4px; PADDING-LEFT: 4px; WIDTH: 0px; =
PADDING-RIGHT: 4px; DISPLAY: inline; HEIGHT: 0px; PADDING-TOP: 4px
}
.alphaSelect {
	POSITION: absolute; BACKGROUND-COLOR: #777777; HEIGHT: 11px; TOP: 6px; =
LEFT: 4px
}
.libBannerText {
	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: smaller
}
.sci_dirBtn {
	BACKGROUND-COLOR: #7aa544
}
.sci_dirBtnHov {
	BACKGROUND-COLOR: #1d6b2f; COLOR: #ffffff
}
.blueBtn {
	BACKGROUND-COLOR: #0000aa
}
.blueBtnHov {
	BACKGROUND-COLOR: #bad3f3; COLOR: #0000aa
}
.greenBtn {
	BACKGROUND-COLOR: #007703
}
.greenBtnHov {
	BACKGROUND-COLOR: #c2edc0; COLOR: #007703
}
.greyBtn {
	BACKGROUND-COLOR: #7f7f7f
}
.greyBtnHov {
	BACKGROUND-COLOR: #e6e6e6; COLOR: #7f7f7f
}
.redBtn {
	BACKGROUND-COLOR: #990000
}
.redBtnHov {
	BACKGROUND-COLOR: #f7cece; COLOR: #990000
}
.orangeBtn {
	BACKGROUND-COLOR: #cc5200
}
.orangeBtnHov {
	BACKGROUND-COLOR: #ffdfca; COLOR: #cc5200
}
INPUT.btn {
	BORDER-BOTTOM: #666666 1px solid; BORDER-LEFT: #666666 1px solid; =
PADDING-BOTTOM: 0px; MARGIN: 0px 1px 0px 0px; PADDING-LEFT: 1px; WIDTH: =
auto; PADDING-RIGHT: 1px; COLOR: #ffffff; FONT-SIZE: 12px; =
VERTICAL-ALIGN: middle; OVERFLOW: visible; BORDER-TOP: #666666 1px =
solid; CURSOR: pointer; FONT-WEIGHT: bold; BORDER-RIGHT: #666666 1px =
solid; TEXT-DECORATION: none; PADDING-TOP: 0px
}
INPUT.btnhov {
	BORDER-BOTTOM: #666666 1px solid; BORDER-LEFT: #666666 1px solid; =
PADDING-BOTTOM: 0px; MARGIN: 0px 1px 0px 0px; PADDING-LEFT: 1px; WIDTH: =
auto; PADDING-RIGHT: 1px; FONT-SIZE: 12px; VERTICAL-ALIGN: middle; =
OVERFLOW: visible; BORDER-TOP: #666666 1px solid; CURSOR: pointer; =
FONT-WEIGHT: bold; BORDER-RIGHT: #666666 1px solid; TEXT-DECORATION: =
none; PADDING-TOP: 0px
}
A.articleBtn {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; BACKGROUND-COLOR: #999999; MARGIN: 0px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 20px; COLOR: #ffffff; FONT-SIZE: 12px; BORDER-TOP: medium =
none; CURSOR: pointer; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.articleBtn:hover {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; BACKGROUND-COLOR: #999999; MARGIN: 0px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 20px; COLOR: #ffffff; FONT-SIZE: 12px; BORDER-TOP: medium =
none; CURSOR: pointer; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.articleBtnActive {
	BACKGROUND-COLOR: #7aa544; CURSOR: default; TEXT-DECORATION: none
}
A.articleBtnActive:hover {
	BACKGROUND-COLOR: #7aa544; CURSOR: default; TEXT-DECORATION: none
}
A.articleBtn:hover {
	BACKGROUND-COLOR: #7aa544
}
A.btn {
	BORDER-BOTTOM: #666666 1px solid; BORDER-LEFT: #666666 1px solid; =
PADDING-BOTTOM: 1px; MARGIN: 0px 1px 0px 0px; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; FONT-FAMILY: arial, verdana, helvetica, sans-serif; =
HEIGHT: 1.17em; COLOR: #ffffff; FONT-SIZE: 12px; VERTICAL-ALIGN: middle; =
BORDER-TOP: #666666 1px solid; FONT-WEIGHT: bold; BORDER-RIGHT: #666666 =
1px solid; TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.btn:hover {
	BORDER-BOTTOM: #666666 1px solid; BORDER-LEFT: #666666 1px solid; =
PADDING-BOTTOM: 1px; MARGIN: 0px 1px 0px 0px; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; FONT-FAMILY: arial, verdana, helvetica, sans-serif; =
HEIGHT: 1.17em; COLOR: #ffffff; FONT-SIZE: 12px; VERTICAL-ALIGN: middle; =
BORDER-TOP: #666666 1px solid; FONT-WEIGHT: bold; BORDER-RIGHT: #666666 =
1px solid; TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.sci_dirBtn {
	BACKGROUND-COLOR: #7aa544
}
A.sci_dirBtn:hover {
	BACKGROUND-COLOR: #1d6b2f; COLOR: #ffffff
}
A.blueBtn {
	BACKGROUND-COLOR: #0000aa
}
A.blueBtn:hover {
	BACKGROUND-COLOR: #bad3f3; COLOR: #0000aa
}
A.greenBtn {
	BACKGROUND-COLOR: #007703
}
A.greenBtn:hover {
	BACKGROUND-COLOR: #c2edc0; COLOR: #007703
}
A.greyBtn {
	BACKGROUND-COLOR: #7f7f7f
}
A.greyBtn:hover {
	BACKGROUND-COLOR: #e6e6e6; COLOR: #7f7f7f
}
A.redBtn {
	BACKGROUND-COLOR: #990000
}
A.redBtn:hover {
	BACKGROUND-COLOR: #f7cece; COLOR: #990000
}
A.orangeBtn {
	BACKGROUND-COLOR: #cc5200
}
A.orangeBtn:hover {
	BACKGROUND-COLOR: #ffdfca; COLOR: #cc5200
}
.tableFmBgGray {
	BORDER-BOTTOM: #9c9c9c 1px solid; BORDER-LEFT: #9c9c9c 1px solid; =
BACKGROUND-COLOR: #efefef; FONT-FAMILY: arial, helvetica, sans-serif; =
FONT-SIZE: 1em; BORDER-TOP: #9c9c9c 1px solid; BORDER-RIGHT: #9c9c9c 1px =
solid
}
.tableFmBgGray2 {
	BORDER-BOTTOM: #9c9c9c 1px solid; PADDING-BOTTOM: 8px; =
BACKGROUND-COLOR: #efefef; PADDING-LEFT: 8px; PADDING-RIGHT: 8px; =
FONT-FAMILY: arial, helvetica, sans-serif; FONT-SIZE: 1em; PADDING-TOP: =
8px
}
.tableFmBgGrayNoCell {
	BORDER-BOTTOM: #9c9c9c 1px solid; BORDER-LEFT: #9c9c9c 1px solid; =
PADDING-BOTTOM: 8px; BACKGROUND-COLOR: #efefef; PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; FONT-FAMILY: arial, helvetica, sans-serif; =
FONT-SIZE: 1em; BORDER-TOP: #9c9c9c 1px solid; BORDER-RIGHT: #9c9c9c 1px =
solid; PADDING-TOP: 8px
}
.tableFmBgPad {
	PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #efefef; MARGIN-TOP: 5px; =
MARGIN-BOTTOM: 5px; PADDING-TOP: 5px
}
.tableFmCell {
	TEXT-ALIGN: right; PADDING-BOTTOM: 3px; PADDING-LEFT: 10px; =
MARGIN-LEFT: 10px; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; PADDING-TOP: =
3px
}
.tableFmCellTop {
	TEXT-ALIGN: right; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; PADDING-TOP: =
0px
}
.tableFmCellAbove {
	TEXT-ALIGN: left; PADDING-BOTTOM: 5px; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; FONT-WEIGHT: bold; PADDING-TOP: 5px
}
.tableFmCellL {
	TEXT-ALIGN: left; PADDING-BOTTOM: 3px; PADDING-LEFT: 10px; MARGIN-LEFT: =
10px; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; PADDING-TOP: 3px
}
.tableFmDivider {
	PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #9b9b9b; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; HEIGHT: 2px; =
PADDING-TOP: 0px
}
.redtableFmDivider {
	PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #990000; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; HEIGHT: 2px; =
PADDING-TOP: 0px
}
.SDtxtLarger {
	FONT-FAMILY: arial, helvetica, sans-serif; FONT-SIZE: larger; =
FONT-WEIGHT: bold
}
.SDtxtSmall {
	FONT-FAMILY: arial, helvetica, sans-serif; COLOR: #000000; FONT-SIZE: =
xx-small
}
.SDtxtSmallBold {
	FONT-SIZE: 0.9em; FONT-WEIGHT: bold
}
.SDtxtNote {
	FONT-FAMILY: arial, helvetica, sans-serif; COLOR: #000000; FONT-SIZE: =
1em; FONT-WEIGHT: normal
}
.SDtxtNoteSmall {
	FONT-FAMILY: arial, helvetica, sans-serif; COLOR: #000000; FONT-SIZE: =
10px; FONT-WEIGHT: normal
}
.SDtxtPgTitleBlack {
	FONT-FAMILY: arial, helvetica, sans-serif; COLOR: #000000; FONT-SIZE: =
150%; FONT-WEIGHT: bold
}
A.errMsg {
	COLOR: #ff0000; TEXT-DECORATION: none
}
A.errMsg:hover {
	TEXT-DECORATION: underline
}
.boldText {
	FONT-WEIGHT: bold
}
.tablePlainWhite {
	PADDING-BOTTOM: 0px; BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
.tablePlainWhite TD {
	BORDER-BOTTOM: #9c9c9c 1px solid
}
.inputBox {
	BORDER-BOTTOM: #b2b2b2 1px solid; BORDER-LEFT: #b2b2b2 1px solid; =
BACKGROUND-COLOR: #ffffff; FONT-SIZE: 1em; VERTICAL-ALIGN: top; =
BORDER-TOP: #b2b2b2 1px solid; BORDER-RIGHT: #b2b2b2 1px solid
}
.textBoxMultipleRow {
	BACKGROUND-COLOR: #ffffff; FONT-FAMILY: Arial, Helvetica, sans-serif; =
FONT-SIZE: 1em
}
A.nextPrev {
	MARGIN: 0px 10px; WIDTH: 1%; COLOR: #ffffff; FONT-SIZE: 1em; =
TEXT-DECORATION: none
}
A.nextPrev:hover {
	MARGIN: 0px 10px; WIDTH: 1%; COLOR: #ffffff; FONT-SIZE: 1em; =
TEXT-DECORATION: underline
}
INPUT.nextPrev {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
0px; BACKGROUND-COLOR: transparent; MARGIN: 0px 0px 2px; PADDING-LEFT: =
1px; WIDTH: auto; PADDING-RIGHT: 1px; COLOR: #0156aa; FONT-SIZE: 1em; =
VERTICAL-ALIGN: middle; OVERFLOW: visible; BORDER-TOP: medium none; =
BORDER-RIGHT: medium none; TEXT-DECORATION: none; PADDING-TOP: 0px
}
INPUT.nextPrevHov {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
0px; BACKGROUND-COLOR: transparent; MARGIN: 0px 0px 2px; PADDING-LEFT: =
0px; WIDTH: auto; PADDING-RIGHT: 0px; COLOR: #0156aa; FONT-SIZE: 1em; =
VERTICAL-ALIGN: middle; OVERFLOW: visible; BORDER-TOP: medium none; =
CURSOR: pointer; BORDER-RIGHT: medium none; TEXT-DECORATION: underline; =
PADDING-TOP: 0px
}
INPUT.listAction {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
0px; BACKGROUND-COLOR: transparent; MARGIN: 0px 7px 0px 5px; =
PADDING-LEFT: 0px; WIDTH: auto; PADDING-RIGHT: 0px; COLOR: #0156aa; =
FONT-SIZE: 0.95em; VERTICAL-ALIGN: middle; OVERFLOW: visible; =
BORDER-TOP: medium none; CURSOR: pointer; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 0px
}
INPUT.listAction:hover {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
0px; BACKGROUND-COLOR: transparent; MARGIN: 0px 7px 0px 5px; =
PADDING-LEFT: 0px; WIDTH: auto; PADDING-RIGHT: 0px; COLOR: #0156aa; =
FONT-SIZE: 0.95em; VERTICAL-ALIGN: middle; OVERFLOW: visible; =
BORDER-TOP: medium none; CURSOR: pointer; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 0px
}
INPUT.listAction:hover {
	TEXT-DECORATION: underline
}
.smCaps {
	FONT-VARIANT: small-caps
}
.nowrap {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; WHITE-SPACE: nowrap; PADDING-TOP: 0px
}
SPAN.hit {
	BACKGROUND-COLOR: #ffff99; MARGIN: 0px 2px
}
SPAN.bf {
	FONT-WEIGHT: bold
}
SPAN.it {
	FONT-STYLE: italic
}
SPAN.monospace {
	FONT-FAMILY: courier
}
SPAN.sans-serif {
	FONT-FAMILY: sans-serif
}
SPAN.underline {
	TEXT-DECORATION: underline
}
SPAN.pit {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; COLOR: #737373; =
FONT-SIZE: 0.9em
}
.charImg {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; VERTICAL-ALIGN: =
baseline; BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
SPAN.cross-out {
	TEXT-DECORATION: line-through
}
.h1 {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 2em; =
FONT-WEIGHT: bold
}
.h2 {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1.3em; =
FONT-WEIGHT: bold
}
.h3 {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1.2em; =
FONT-WEIGHT: bold
}
.h4 {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1.1em; =
FONT-WEIGHT: bold
}
.h5 {
	FONT-FAMILY: arial, verdana, helvetica, sans-serif; FONT-SIZE: 1em; =
FONT-WEIGHT: bold
}
.ImageScroller {
	WIDTH: 100%; OVERFLOW: auto
}
.ImageScrollerPurchHist {
	OVERFLOW: auto
}
.ImageScrollerPurchCurr {
	OVERFLOW: auto
}
DIV.auto_complete {
	Z-INDEX: 99 !important; BORDER-BOTTOM: #888 1px solid; POSITION: =
absolute; BORDER-LEFT: #888 1px solid; PADDING-BOTTOM: 0px; =
BACKGROUND-COLOR: white; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 250px; =
PADDING-RIGHT: 0px; BORDER-TOP: #888 1px solid; BORDER-RIGHT: #888 1px =
solid; PADDING-TOP: 0px
}
DIV.auto_complete UL {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
DIV.auto_complete UL LI.selected {
	BACKGROUND-COLOR: blue; COLOR: white
}
DIV.auto_complete UL LI {
	PADDING-BOTTOM: 2px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
2px; PADDING-RIGHT: 2px; DISPLAY: block; CURSOR: pointer; PADDING-TOP: =
2px
}
.previewBox {
	BORDER-BOTTOM: #9b9b9b 1px solid; BORDER-LEFT: #9b9b9b 1px solid; =
PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #efefef; PADDING-LEFT: 10px; =
WIDTH: 95%; PADDING-RIGHT: 10px; ZOOM: 1; DISPLAY: none; FONT-SIZE: =
12px; BORDER-TOP: #9b9b9b 1px solid; BORDER-RIGHT: #9b9b9b 1px solid; =
PADDING-TOP: 10px
}
.previewBar1 {
	PADDING-BOTTOM: 0.5em; BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 0.5em; =
PADDING-RIGHT: 0.5em; DISPLAY: block; FLOAT: none; CLEAR: both; =
PADDING-TOP: 0.5em
}
.previewBar2 {
	BORDER-BOTTOM: #cccccc 1px solid; WIDTH: 100%; DISPLAY: block; =
FONT-WEIGHT: bold
}
.previewContent {
	PADDING-BOTTOM: 0.5em; BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 0.5em; =
PADDING-RIGHT: 0.5em; HEIGHT: 280px; OVERFLOW: auto; PADDING-TOP: 0.5em
}
.txtHidden {
	POSITION: absolute; WIDTH: 1px; HEIGHT: 1px; OVERFLOW: hidden; TOP: =
-500px; LEFT: 0px
}
.font1 {
	FONT-SIZE: 0.8em
}
.font2 {
	FONT-SIZE: 0.9em
}
.font3 {
	FONT-SIZE: 1em
}
.font4 {
	FONT-SIZE: 1.1em
}
.font5 {
	FONT-SIZE: 1.2em
}
.resultRow {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: =
0px; BORDER-TOP: #9b9b9b 1px solid; PADDING-TOP: 0px
}
.resultRow TD DIV.txt {
	FONT-SIZE: 11px; PADDING-TOP: 5px
}
.resultRow TD DIV.txt IMG {
	VERTICAL-ALIGN: middle
}
.resultRow TD DIV.txt IMG.mmcIcon {
	VERTICAL-ALIGN: top
}
A.blackLink {
	FONT-SIZE: 0.95em
}
.issueBanner {
	POSITION: relative; PADDING-BOTTOM: 7px; BACKGROUND-COLOR: #7aa544; =
PADDING-LEFT: 4px; PADDING-RIGHT: 4px; COLOR: #ffffff; PADDING-TOP: 7px
}
A.issueBannerLink {
	COLOR: #ffffff; TEXT-DECORATION: underline
}
.txtSmall {
	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: xx-small
}
.modalWindow {
	Z-INDEX: 100; BORDER-BOTTOM: 0px; POSITION: absolute; FILTER: =
alpha(opacity=3D80); BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; BACKGROUND: #cccccc =
0px 0px; HEIGHT: 100%; COLOR: #cccccc; BORDER-TOP: 0px; TOP: 0%; =
BORDER-RIGHT: 0px; PADDING-TOP: 0px; LEFT: 0%; opacity: 0.8
}
.modalWindowMsgBox {
	Z-INDEX: 999; BORDER-BOTTOM: #999999 1px solid; POSITION: absolute; =
BORDER-LEFT: #999999 1px solid; PADDING-BOTTOM: 8px; BACKGROUND-COLOR: =
#ffffff; PADDING-LEFT: 8px; WIDTH: 500px; PADDING-RIGHT: 8px; =
FONT-FAMILY: Arial, Verdana, Helvetica, Sans-serif; HEIGHT: auto; =
FONT-SIZE: 1em; BORDER-TOP: #999999 1px solid; TOP: 40%; BORDER-RIGHT: =
#999999 1px solid; PADDING-TOP: 8px; LEFT: 250px
}
#header {
	HEIGHT: 137px; FONT-SIZE: 0.8em
}
#content-container {
	MARGIN-LEFT: 8px; FONT-SIZE: 0.8em; MARGIN-RIGHT: 8px
}
.content {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
PADDING-TOP: 10px
}
#footer {
	FONT-SIZE: 0.8em
}
#footer .padding {
	PADDING-BOTTOM: 11px; PADDING-LEFT: 12px; PADDING-RIGHT: 12px; =
FONT-SIZE: 0.95em; PADDING-TOP: 7px
}
#linkArea {
	BORDER-BOTTOM: #d9d9d9 1px solid; BORDER-LEFT: #d9d9d9 1px solid; =
MARGIN: 0px 0px 1px; WHITE-SPACE: nowrap; BACKGROUND: #f1f1f1; COLOR: =
#707070; FONT-SIZE: 0.92em; BORDER-TOP: #d9d9d9 1px solid; BORDER-RIGHT: =
#d9d9d9 1px solid
}
#linkArea .padding {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 16px; PADDING-RIGHT: 16px; =
PADDING-TOP: 9px
}
#linkArea UL {
	PADDING-BOTTOM: 0px; MARGIN: 0px 63px 0px 0px; PADDING-LEFT: 0px; =
WIDTH: 157px; PADDING-RIGHT: 0px; FLOAT: left; PADDING-TOP: 0px
}
#linkArea UL LI UL {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#linkArea UL LI {
	LIST-STYLE-POSITION: outside; LIST-STYLE-TYPE: none; MARGIN: 0px
}
#linkArea A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
#copyrightArea A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
#linkArea A:hover {
	TEXT-DECORATION: underline
}
#copyrightArea A:hover {
	TEXT-DECORATION: underline
}
#linkArea A:visited {
	COLOR: #840084
}
#copyrightArea A:visited {
	COLOR: #840084
}
#linkArea IMG {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: =
0px
}
#linkArea .col3 {
	MARGIN: 0px 80px 0px 0px
}
#linkArea .col4 {
	MARGIN: 1px 0px 0px; WIDTH: 70px
}
#copyrightArea {
	BORDER-BOTTOM: #d9d9d9 1px solid; BORDER-LEFT: #d9d9d9 1px solid; =
BACKGROUND: #f1f1f1; COLOR: #707070; FONT-SIZE: 0.92em; BORDER-TOP: =
#d9d9d9 1px solid; BORDER-RIGHT: #d9d9d9 1px solid
}
#copyrightArea .padding {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 16px; PADDING-RIGHT: 16px; =
PADDING-TOP: 11px
}
#copyrightArea P {
	MARGIN: 0px
}
#masthead {
	POSITION: relative; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: =
0px; WIDTH: 179px; PADDING-RIGHT: 0px; HEIGHT: 102px; PADDING-TOP: 0px; =
LEFT: 13px
}
#logoSciVerse {
	BORDER-BOTTOM: 0px; POSITION: relative; BORDER-LEFT: 0px; MARGIN: 0px; =
WIDTH: 106px; DISPLAY: block; HEIGHT: 88px; BORDER-TOP: 0px; =
BORDER-RIGHT: 0px
}
#logoScienceDirect {
	BORDER-BOTTOM: 0px; POSITION: absolute; BORDER-LEFT: 0px; MARGIN: 0px; =
WIDTH: 81px; DISPLAY: block; HEIGHT: 80px; BORDER-TOP: 0px; TOP: 26px; =
BORDER-RIGHT: 0px; LEFT: 100px
}
#logoSD {
	BORDER-BOTTOM: 0px; POSITION: absolute; BORDER-LEFT: 0px; MARGIN-TOP: =
12px; DISPLAY: block; BORDER-TOP: 0px; BORDER-RIGHT: 0px
}
#masthead IMG {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: =
0px
}
#suites {
	POSITION: absolute; FONT-SIZE: 1.05em; TOP: 12px; LEFT: 200px
}
#suites UL.suites {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#suites UL.suites LI {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; FLOAT: left; LIST-STYLE-IMAGE: none; =
PADDING-TOP: 0px
}
#suites UL.suites LI A {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; COLOR: #000000; BORDER-RIGHT: #d8d8d8 1px =
solid; TEXT-DECORATION: none; PADDING-TOP: 0px
}
#suites UL.suites LI A.selected {
	FONT-WEIGHT: bold
}
#suites UL.suites LI A:hover {
	TEXT-DECORATION: underline
}
#suites UL.suites LI A.last {
	BORDER-RIGHT: medium none
}
#login {
	Z-INDEX: 5; POSITION: absolute; BACKGROUND: #fff; FONT-SIZE: 12px; TOP: =
12px; RIGHT: 3px
}
#login UL {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#login UL LI {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; FLOAT: left; LIST-STYLE-IMAGE: none; =
BORDER-RIGHT: #000000 1px solid; PADDING-TOP: 0px
}
#login UL LI A {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; PADDING-TOP: 0px
}
#login UL LI.selected {
	FONT-WEIGHT: bold
}
#login UL LI.last {
	BORDER-RIGHT: medium none
}
#login UL LI.login {
	MARGIN-LEFT: 1px
}
#login UL LI A.plus {
	BORDER-BOTTOM: 0px; POSITION: relative; BORDER-LEFT: 0px; =
PADDING-BOTTOM: 6px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; =
PADDING-LEFT: 12px; OUTLINE-WIDTH: medium; PADDING-RIGHT: 28px; =
BACKGROUND: url(/scidirimg/login_expand.gif) no-repeat 50px 50%; =
BORDER-TOP: 0px; RIGHT: 1px; BORDER-RIGHT: 0px; PADDING-TOP: 6px
}
#login UL LI A.minus {
	Z-INDEX: 2; POSITION: relative; BORDER-LEFT: #ccd1d6 1px solid; =
PADDING-BOTTOM: 4px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; =
PADDING-LEFT: 10px; OUTLINE-WIDTH: medium; PADDING-RIGHT: 28px; =
BACKGROUND: url(/scidirimg/login_collapse.gif) #e5f3cc no-repeat 50px =
50%; BORDER-TOP: #ccd1d6 1px solid; RIGHT: 1px; BORDER-RIGHT: #ccd1d6 =
1px solid; PADDING-TOP: 4px
}
#logout {
	Z-INDEX: 5; POSITION: absolute; BACKGROUND: #fff; FONT-SIZE: 12px; TOP: =
12px; RIGHT: 3px
}
#logout UL {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#logout UL LI {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; FLOAT: left; LIST-STYLE-IMAGE: none; =
BORDER-RIGHT: #000000 1px solid; PADDING-TOP: 0px
}
#logout UL LI A {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; PADDING-TOP: 0px
}
#logout UL LI.selected {
	FONT-WEIGHT: bold
}
#logout UL LI.last {
	BORDER-RIGHT: medium none
}
#logout UL LI.logout {
	BACKGROUND: url(/scidirimg/divider_login1.gif) no-repeat 99% 50%
}
#logout UL LI.details A.logoutPlus {
	BORDER-BOTTOM: 0px; POSITION: relative; BORDER-LEFT: 0px; =
PADDING-BOTTOM: 5px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; =
PADDING-LEFT: 10px; OUTLINE-WIDTH: medium; PADDING-RIGHT: 10px; =
BACKGROUND: url(/scidirimg/login_expand.gif) no-repeat 40% 50%; =
BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 4px; LEFT: 0px
}
#logout UL LI A.logoutMinus {
	POSITION: relative; BORDER-LEFT: #ccd1d6 1px solid; PADDING-BOTTOM: =
3px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; PADDING-LEFT: 9px; =
OUTLINE-WIDTH: medium; PADDING-RIGHT: 9px; BACKGROUND: =
url(/scidirimg/login_collapse.gif) #e5f3cc no-repeat 50% 50%; =
BORDER-TOP: #ccd1d6 1px solid; BORDER-RIGHT: #ccd1d6 1px solid; =
PADDING-TOP: 3px; LEFT: 0px
}
#logout UL LI SPAN {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 0px
}
#logout UL LI SPAN SPAN {
	MARGIN-LEFT: 4px
}
#logout UL LI SPAN A.userPlus {
	BORDER-BOTTOM: 0px; POSITION: relative; BORDER-LEFT: 0px; =
PADDING-BOTTOM: 5px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; =
PADDING-LEFT: 10px; OUTLINE-WIDTH: medium; PADDING-RIGHT: 10px; =
BACKGROUND: url(/scidirimg/login_expand.gif) no-repeat 40% 50%; =
BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 4px; LEFT: 0px
}
#logout UL LI SPAN A.userMinus {
	POSITION: relative; BORDER-LEFT: #ccd1d6 1px solid; PADDING-BOTTOM: =
3px; OUTLINE-STYLE: none; OUTLINE-COLOR: invert; PADDING-LEFT: 9px; =
OUTLINE-WIDTH: medium; PADDING-RIGHT: 9px; BACKGROUND: =
url(/scidirimg/login_collapse.gif) #e5f3cc no-repeat 50% 50%; =
BORDER-TOP: #ccd1d6 1px solid; BORDER-RIGHT: #ccd1d6 1px solid; =
TEXT-DECORATION: none; PADDING-TOP: 3px; LEFT: 0px
}
#loginBox {
	Z-INDEX: 3; BORDER-BOTTOM: #ccd1d6 1px solid; POSITION: absolute; =
BORDER-LEFT: #ccd1d6 1px solid; WIDTH: 258px; BACKGROUND: #e5f3cc; =
FONT-SIZE: 12px; BORDER-TOP: #ccd1d6 1px solid; TOP: 30px; RIGHT: 126px; =
BORDER-RIGHT: #ccd1d6 1px solid
}
#loginBox .padding {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 14px; PADDING-RIGHT: 0px; =
PADDING-TOP: 14px
}
#loginBox A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
#loginBox A:hover {
	TEXT-DECORATION: underline
}
#login-box-form {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#login-box-form P {
	MARGIN: 0px 0px 2px
}
#login-box-form LABEL {
	TEXT-ALIGN: right
}
#login-box-form LABEL SPAN {
	MARGIN: 0px; WIDTH: 64px; DISPLAY: inline-block; CURSOR: default
}
#login-box-form LABEL INPUT {
	WIDTH: 128px
}
#login-box-form DIV.remember {
	PADDING-BOTTOM: 0px; MARGIN: 10px 0px 0px 64px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
#login-box-form DIV.remember INPUT {
	MARGIN: 0px 0px 0px 4px; FONT-SIZE: 1em; FONT-WEIGHT: bold
}
#login-box-form DIV.remember LABEL {
	MARGIN: 0px
}
#login-box-form DIV.submit {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 0; MARGIN: 16px 0px 0px 64px; =
PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
#login-box-form DIV.submit INPUT.button {
	MARGIN: 0px; FONT-SIZE: 1em; FONT-WEIGHT: bold
}
#loginBox DIV.forgotpass {
	MARGIN: 10px 0px
}
#loginBox DIV.institutiontext {
	PADDING-BOTTOM: 14px; MARGIN: 0px; PADDING-LEFT: 14px; PADDING-RIGHT: =
0px; BORDER-TOP: #9b9b9b 1px solid; PADDING-TOP: 10px
}
.notRegistered {
	MARGIN-TOP: 10px; FLOAT: left
}
#userBox {
	Z-INDEX: 3; BORDER-BOTTOM: #ccd1d6 1px solid; POSITION: absolute; =
BORDER-LEFT: #ccd1d6 1px solid; WIDTH: 250px; BACKGROUND: #e5f3cc; =
BORDER-TOP: #ccd1d6 1px solid; TOP: 29px; RIGHT: 66px; BORDER-RIGHT: =
#ccd1d6 1px solid
}
#userBox .padding {
	PADDING-BOTTOM: 14px; PADDING-LEFT: 14px; PADDING-RIGHT: 14px; =
PADDING-TOP: 14px
}
#userBox A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
#userBox A:hover {
	TEXT-DECORATION: underline
}
#banner-top {
	POSITION: absolute; TEXT-ALIGN: center; WIDTH: 234px; PADDING-RIGHT: =
3px; HEIGHT: 60px; COLOR: #000000; OVERFLOW: hidden; TOP: 34px; RIGHT: =
12px
}
#banner-bottom {
	MARGIN-TOP: 2px; FLOAT: right
}
.floatR {
	FLOAT: right
}
#navigationTop {
	BORDER-BOTTOM: #d7d7d7 2px solid; WIDTH: 100%; BACKGROUND: #6c9d31; =
COLOR: #fff; FONT-SIZE: 1.14em; BORDER-TOP: #999999 4px solid
}
#navigationBottom {
	BORDER-BOTTOM: #d7d7d7 2px solid; WIDTH: 100%; BACKGROUND: #6c9d31; =
COLOR: #fff; FONT-SIZE: 1.14em; BORDER-TOP: #999999 4px solid
}
UL.main {
	FLOAT: left; HEIGHT: 29px
}
UL.misc {
	FLOAT: right; HEIGHT: 29px
}
UL.nav {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
UL.nav LI {
	PADDING-BOTTOM: 8px; LINE-HEIGHT: 13px; LIST-STYLE-TYPE: none; MARGIN: =
0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BACKGROUND: =
url(/scidirimg/divider_nav.gif) no-repeat left center; FLOAT: left; =
LIST-STYLE-IMAGE: none; PADDING-TOP: 8px
}
UL.nav LI A {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; COLOR: #ffffff !important; FONT-SIZE: 14px; =
TEXT-DECORATION: none; PADDING-TOP: 0px
}
UL.nav LI A:hover {
	COLOR: #ffffff; TEXT-DECORATION: underline
}
UL.nav LI A.selected {
	FONT-WEIGHT: bold
}
UL.nav LI.last {
	BACKGROUND: none transparent scroll repeat 0% 0%
}
.clearfix:after {
	DISPLAY: block; HEIGHT: 0px; VISIBILITY: hidden; CLEAR: both; CONTENT: =
"."
}
.clear {
	CLEAR: both
}
.logonBox {
	BORDER-BOTTOM: #9c9c9c 1px solid; BORDER-LEFT: #9c9c9c 1px solid; =
PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #efefef; PADDING-LEFT: 10px; =
WIDTH: 600px; PADDING-RIGHT: 10px; BORDER-TOP: #9c9c9c 1px solid; =
BORDER-RIGHT: #9c9c9c 1px solid; PADDING-TOP: 10px
}
#sdHeader {
	PADDING-BOTTOM: 18px; PADDING-LEFT: 14px; PADDING-RIGHT: 14px; =
PADDING-TOP: 18px
}
.amtResults {
	PADDING-BOTTOM: 9px; BACKGROUND-COLOR: #e5f3cc; PADDING-LEFT: 9px; =
PADDING-RIGHT: 9px; MARGIN-BOTTOM: 9px; PADDING-TOP: 9px
}
.googleAd {
	PADDING-BOTTOM: 0px; MARGIN: 0px 0px -10px; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; PADDING-TOP: 0px
}
.button {
	FONT-FAMILY: Arial, verdana, Helvetica, sans-serif; COLOR: #000000; =
FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.orgName {
	TEXT-ALIGN: left; PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; =
PADDING-RIGHT: 10px; FONT-FAMILY: Arial, verdana, Helvetica, sans-serif; =
FONT-SIZE: 12px; FONT-WEIGHT: bold; PADDING-TOP: 10px
}
.changeOrg {
	TEXT-ALIGN: left; MARGIN-TOP: 5px; FONT-FAMILY: Arial, verdana, =
Helvetica, sans-serif; FONT-SIZE: 11px; FONT-WEIGHT: normal; =
TEXT-DECORATION: none
}
.outerWrapper {
	MIN-WIDTH: 960px
}
.fontSizer {
	BORDER-BOTTOM: #e8e8e8 4px solid; BORDER-LEFT: 0px; PADDING-BOTTOM: =
0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; HEIGHT: 37px; BORDER-TOP: =
0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px
}
.fontSizer TD {
	PADDING-BOTTOM: 7px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
.contentMain {
	BORDER-BOTTOM: #fcfcfc 1px solid; POSITION: relative; BORDER-LEFT: =
#fcfcfc 1px solid; BACKGROUND-COLOR: #f6f6f6; BORDER-TOP: #fcfcfc 1px =
solid; BORDER-RIGHT: #fcfcfc 1px solid
}
.contentMain .contentShadow {
	BORDER-BOTTOM: #ededed 1px solid; POSITION: relative; BORDER-LEFT: =
#ededed 1px solid; BACKGROUND-COLOR: #e1e1e1; BORDER-TOP: #ededed 1px =
solid; TOP: -1px; BORDER-RIGHT: #ededed 1px solid; LEFT: -1px
}
.contentMain .contentBorders {
	BORDER-BOTTOM: #9b9b9b 1px solid; POSITION: relative; BORDER-LEFT: =
#9b9b9b 1px solid; ZOOM: 1; BACKGROUND: #fff; BORDER-TOP: #9b9b9b 1px =
solid; TOP: -1px; BORDER-RIGHT: #9b9b9b 1px solid; LEFT: -1px
}
.contentMain .contentPadding {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 8px; PADDING-RIGHT: 8px; =
PADDING-TOP: 8px
}
A.tabActive {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; MARGIN: 0px 2px 0px 0px; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; =
COLOR: #ffffff; FONT-SIZE: 1em; BORDER-TOP: medium none; FONT-WEIGHT: =
bold; BORDER-RIGHT: medium none; TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.tabActive:hover {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; MARGIN: 0px 2px 0px 0px; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; =
COLOR: #ffffff; FONT-SIZE: 1em; BORDER-TOP: medium none; FONT-WEIGHT: =
bold; BORDER-RIGHT: medium none; TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.tab {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; BACKGROUND-COLOR: #999999; MARGIN: 0px 2px 0px 0px; PADDING-LEFT: =
20px; PADDING-RIGHT: 20px; COLOR: #ffffff; FONT-SIZE: 1em; BORDER-TOP: =
medium none; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.tab:hover {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
1px; BACKGROUND-COLOR: #999999; MARGIN: 0px 2px 0px 0px; PADDING-LEFT: =
20px; PADDING-RIGHT: 20px; COLOR: #ffffff; FONT-SIZE: 1em; BORDER-TOP: =
medium none; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 1px
}
A.sci_dirTabActive {
	BACKGROUND-COLOR: #7aa544; CURSOR: default; TEXT-DECORATION: none
}
A.sci_dirTabActive:hover {
	BACKGROUND-COLOR: #7aa544; CURSOR: default; TEXT-DECORATION: none
}
A.sci_dirTab:hover {
	BACKGROUND-COLOR: #7aa544
}
.cartSubIcons {
	MARGIN-TOP: 10px; MARGIN-BOTTOM: 10px; FLOAT: left; MARGIN-LEFT: 15px
}
.cartViewPur {
	MARGIN-TOP: 10px; MARGIN-BOTTOM: 10px; FLOAT: right; MARGIN-RIGHT: 5px
}
.cartHeader {
	BORDER-BOTTOM: #c8c8c8 1px solid; PADDING-BOTTOM: 10px; PADDING-TOP: =
10px
}
.cartRemPad {
	PADDING-LEFT: 70px
}
.cartContMain {
	MARGIN-TOP: 8px
}
.cartNoItem {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 15px; PADDING-TOP: 10px
}
.cartTermsPad {
	PADDING-LEFT: 25px
}
#shoppingCartFlow {
	POSITION: relative; CURSOR: default
}
#shoppingCartFlow UL {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
#shoppingCartFlow UL LI {
	POSITION: relative; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-TOP: 0px
}
#shoppingCartFlow UL LI#twoBilling {
	POSITION: relative; TOP: -3px; LEFT: -2px
}
#shoppingCartFlow UL LI#threePayment {
	POSITION: relative; TOP: -3px; LEFT: -4px
}
#shoppingCartFlow UL LI#fourConfirm {
	POSITION: relative; TOP: -3px; LEFT: -6px
}
#shoppingCartFlow UL LI#fiveReceipt {
	POSITION: relative; TOP: -3px; LEFT: -8px
}
.purHistTable {
	BORDER-BOTTOM: #c8c8c8 1px solid; TEXT-ALIGN: left; BORDER-LEFT: =
#c8c8c8 1px solid; BORDER-TOP: #c8c8c8 1px solid; BORDER-RIGHT: #c8c8c8 =
1px solid
}
.purHistTable TR TD.header {
	BORDER-BOTTOM: #c8c8c8 1px solid; PADDING-BOTTOM: 0px; =
BACKGROUND-COLOR: #efefef; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
HEIGHT: 25px; PADDING-TOP: 0px
}
.purHistTable TR TD.contentText {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
PADDING-TOP: 10px
}
.searchAlertFm {
	BORDER-BOTTOM: #9c9c9c 1px solid; BORDER-LEFT: #9c9c9c 1px solid; =
BORDER-TOP: #9c9c9c 1px solid; BORDER-RIGHT: #9c9c9c 1px solid
}
.alertListHeader TR TH {
	BORDER-BOTTOM: #9b9b9b 1px solid; PADDING-BOTTOM: 0px; =
BACKGROUND-COLOR: #e8e8e8; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
HEIGHT: 36px; VERTICAL-ALIGN: middle; BORDER-TOP: #9b9b9b 1px solid; =
PADDING-TOP: 0px
}
.alertListHeader TR TD {
	BORDER-BOTTOM: #9b9b9b 1px solid; PADDING-BOTTOM: 4px; =
BACKGROUND-COLOR: #ffffff; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
VERTICAL-ALIGN: middle; PADDING-TOP: 4px
}
.tableLastRow {
	PADDING-BOTTOM: 0px !important; BACKGROUND-COLOR: #efefef !important; =
PADDING-LEFT: 0px !important; PADDING-RIGHT: 0px !important; HEIGHT: =
24px; PADDING-TOP: 0px !important
}
.noAlertMsgBox {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
PADDING-TOP: 10px
}
.information {
	BACKGROUND-IMAGE: url(/scidirimg/infoIcon.gif); BORDER-BOTTOM: #dedede =
1px solid; BORDER-LEFT: #dedede 1px solid; PADDING-BOTTOM: 6px; MARGIN: =
1em 0px; PADDING-LEFT: 30px; WIDTH: 580px; PADDING-RIGHT: 5px; =
BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: arial, verdana, sans-serif; =
BACKGROUND-POSITION: 4px 5px; COLOR: black; FONT-SIZE: 1em; BORDER-TOP: =
#dedede 1px solid; BORDER-RIGHT: #dedede 1px solid; PADDING-TOP: 6px
}
.sci_diriconAddFav {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 18px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/icon_favorites_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.sci_diriconAddFav:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 18px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/icon_favorites_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinksci_dir {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/addQuickLink_off.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinksci_dir:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/addQuickLink_on.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.sdiconSearchEdit {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/sci_dir/btn_edit1.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.sdiconSearchEdit:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/sci_dir/btn_edit2.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconSearchEditsci_dir {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/sci_dir/btn_edit1.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconSearchEditsci_dir:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/sci_dir/btn_edit2.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.sdiconSearchDel {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/delete_a.gif) no-repeat 0px 0px; =
MARGIN-LEFT: 5px; PADDING-TOP: 2px
}
.sdiconSearchDel:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/delete_b.gif) no-repeat 0px 0px; =
MARGIN-LEFT: 5px; PADDING-TOP: 2px
}
.iconQlinkblue {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/blue/addQuickLink_off.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinkblue:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/blue/addQuickLink_on.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconQlinkgreen {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/green/addQuickLink_off.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinkgreen:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/green/addQuickLink_on.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinkgrey {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/grey/addQuickLink_off.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinkgrey:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/grey/addQuickLink_on.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconQlinkred {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/red/addQuickLink_off.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconQlinkred:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/red/addQuickLink_on.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.iconQlinkorange {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/orange/addQuickLink_off.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.iconQlinkorange:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/orange/addQuickLink_on.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.rediconAddFav {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/btn_edit1.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.rediconAddFav:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/btn_edit1.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
A.iconSearchEdit {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/btn_edit1.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
A.iconSearchEdit:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/btn_edit2.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
A.iconSearchDel {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/delete_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
A.iconSearchDel:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/delete_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_pdf {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/icon_pdf.gif) no-repeat 0px 50%; PADDING-TOP: =
2px
}
.icon_rsscite {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/rsscite.gif) no-repeat 0px 0px; PADDING-TOP: =
2px
}
.icon_orderdocsci_dir {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocsci_dir:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlesci_dir {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/exportarticle_a.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_exportarticlesci_dir:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/exportarticle_b.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_emailarticlesci_dir {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/emailarticle_a.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_emailarticlesci_dir:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/emailarticle_b.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_saveascitationalertsci_dir {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 18px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/icon_saveascitationalert_a.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_saveascitationalertsci_dir:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 18px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: =
url(/scidirimg/sci_dir/icon_saveascitationalert_b.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_citedbysci_dir {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbysci_dir:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveSrchsci_dir {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/save_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveSrchsci_dir:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/sci_dir/save_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_qmarkHelpsci_dir {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/qmark_gray_a.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_qmarkHelpsci_dir:hover {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 20px; PADDING-LEFT: 20px; =
PADDING-RIGHT: 7px; BACKGROUND: url(/scidirimg/qmark_gray_b.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_orderdocblue {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocblue:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticleblue {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/exportarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticleblue:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/exportarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticleblue {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/emailarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticleblue:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/emailarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveascitationalertblue {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/icon_saveascitationalert_a.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_saveascitationalertblue:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/icon_saveascitationalert_b.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_citedbyblue {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbyblue:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/blue/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocgreen {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocgreen:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlegreen {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/exportarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlegreen:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/exportarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlegreen {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/emailarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlegreen:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/emailarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveascitationalertgreen {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/icon_saveascitationalert_a.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_saveascitationalertgreen:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/icon_saveascitationalert_b.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_citedbygreen {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbygreen:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/green/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocgrey {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocgrey:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlegrey {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/exportarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlegrey:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/exportarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlegrey {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/emailarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlegrey:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/emailarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveascitationalertgrey {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/icon_saveascitationalert_a.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_saveascitationalertgrey:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/icon_saveascitationalert_b.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_citedbygrey {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbygrey:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/grey/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocorange {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocorange:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticleorange {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/exportarticle_a.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_exportarticleorange:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/exportarticle_b.gif) no-repeat 0px =
0px; PADDING-TOP: 2px
}
.icon_emailarticleorange {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/emailarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticleorange:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/emailarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveascitationalertorange {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/icon_saveascitationalert_a.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_saveascitationalertorange:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/icon_saveascitationalert_b.gif) =
no-repeat 0px 0px; PADDING-TOP: 2px
}
.icon_citedbyorange {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbyorange:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/orange/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocred {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/orderdoc_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_orderdocred:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/orderdoc_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlered {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/exportarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_exportarticlered:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/exportarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlered {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/emailarticle_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_emailarticlered:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/emailarticle_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_saveascitationalertred {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/icon_saveascitationalert_a.gif) no-repeat =
0px 0px; PADDING-TOP: 2px
}
.icon_saveascitationalertred:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/icon_saveascitationalert_b.gif) no-repeat =
0px 0px; PADDING-TOP: 2px
}
.icon_citedbyred {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/citedby_a.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.icon_citedbyred:hover {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 20px; PADDING-RIGHT: 7px; =
BACKGROUND: url(/scidirimg/red/citedby_b.gif) no-repeat 0px 0px; =
PADDING-TOP: 2px
}
.pageSubHead {
	MARGIN: 10px 0px; WIDTH: 80%; FONT-SIZE: 0.95em
}
.divTableRow {
	WIDTH: 100%
}
.divTableColF {
	TEXT-ALIGN: right; PADDING-BOTTOM: 2px; PADDING-LEFT: 10px; WIDTH: 18%; =
PADDING-RIGHT: 0px; FLOAT: left; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; =
PADDING-TOP: 2px
}
.divTableColS {
	TEXT-ALIGN: left; PADDING-BOTTOM: 2px; PADDING-LEFT: 10px; WIDTH: 72%; =
PADDING-RIGHT: 0px; FLOAT: left; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; =
PADDING-TOP: 2px
}
.astPad {
	TEXT-ALIGN: left; PADDING-LEFT: 5px
}
.divSectDivider {
	BORDER-BOTTOM: #9b9b9b 1px solid; LINE-HEIGHT: 1px; MARGIN-TOP: 5px; =
WIDTH: 100%; MARGIN-BOTTOM: 5px; _width: 102%
}
.divTextRow {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 10px; PADDING-RIGHT: 0px; =
PADDING-TOP: 2px
}
.divBtnHolder {
	PADDING-BOTTOM: 2px; LINE-HEIGHT: 16px; MARGIN-TOP: 10px; PADDING-LEFT: =
10px; WIDTH: 100%; PADDING-RIGHT: 0px; MARGIN-BOTTOM: 15px; PADDING-TOP: =
2px
}
.divContactColF {
	TEXT-ALIGN: right; PADDING-BOTTOM: 2px; PADDING-LEFT: 10px; WIDTH: 20%; =
PADDING-RIGHT: 0px; FLOAT: left; VERTICAL-ALIGN: top; FONT-WEIGHT: bold; =
PADDING-TOP: 2px
}
#alphaLinks {
	PADDING-RIGHT: 10px; MAX-WIDTH: 215px; FONT-SIZE: 0.9em; FONT-WEIGHT: =
normal
}
#alphaLinks SPAN SPAN {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; =
PADDING-TOP: 0px
}
#skyscraper DIV {
	WIDTH: 120px
}
.wrap {
	WORD-WRAP: break-word; WHITE-SPACE: pre-wrap
}
.iconLinks {
	MAX-WIDTH: 44%; FLOAT: left
}
.chooseOrgExpand {
	MARGIN: 0px; BORDER-TOP: #9b9b9b 1px solid
}
.divRegTableColF {
	TEXT-ALIGN: right; PADDING-BOTTOM: 5px; PADDING-LEFT: 26px; WIDTH: 16%; =
PADDING-RIGHT: 0px; FLOAT: left; FONT-SIZE: 1em; VERTICAL-ALIGN: top; =
PADDING-TOP: 8px
}
.divRegTableColS {
	TEXT-ALIGN: left; PADDING-BOTTOM: 5px; PADDING-LEFT: 8px; WIDTH: 74%; =
PADDING-RIGHT: 0px; FLOAT: left; FONT-SIZE: 1em; VERTICAL-ALIGN: top; =
PADDING-TOP: 5px
}
.divRegTextRow {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 26px; WIDTH: 100%; PADDING-RIGHT: =
0px; FONT-SIZE: 1em; PADDING-TOP: 5px
}
.divRegBtnHolder {
	PADDING-BOTTOM: 5px; LINE-HEIGHT: 16px; MARGIN-TOP: 10px; PADDING-LEFT: =
10px; WIDTH: 100%; PADDING-RIGHT: 0px; MARGIN-BOTTOM: 15px; PADDING-TOP: =
2px
}
.astRegPad {
	PADDING-LEFT: 3px; FONT-SIZE: 1.5em; font-color: #ff0000
}
.divRegSectDivider {
	BORDER-BOTTOM: #9b9b9b 1px solid; LINE-HEIGHT: 1px; MARGIN-TOP: 15px; =
WIDTH: 100%; MARGIN-BOTTOM: 15px; _width: 102%
}
.elsevierProd {
	BORDER-BOTTOM: #0156aa 1px dashed; COLOR: #0156aa; FONT-SIZE: 1em
}
.elsevierProd:hover {
	BORDER-BOTTOM: medium none
}
.privacyPolicy {
	FONT-SIZE: 0.92em; TEXT-DECORATION: none; font-color: #0156aa
}
.inputRegBox {
	BORDER-BOTTOM: #b2b2b2 1px solid; BORDER-LEFT: #b2b2b2 1px solid; =
BACKGROUND-COLOR: #ffffff; WIDTH: 240px; HEIGHT: 21px; FONT-SIZE: 1em; =
VERTICAL-ALIGN: top; BORDER-TOP: #b2b2b2 1px solid; BORDER-RIGHT: =
#b2b2b2 1px solid
}
DIV.errMsgRegText {
	PADDING-LEFT: 26px; COLOR: #ae0123; FONT-SIZE: 0.92em
}
.tooltip3link {
	Z-INDEX: 24; BORDER-BOTTOM: #0156aa 1px dashed; POSITION: relative; =
OUTLINE-STYLE: none; OUTLINE-COLOR: invert; OUTLINE-WIDTH: medium; =
TEXT-DECORATION: none; font-color: #0156aa; -moz-outline-style: none
}
A.tooltip3link:hover {
	Z-INDEX: 25; BORDER-BOTTOM: medium none; POSITION: relative; =
OUTLINE-STYLE: none; OUTLINE-COLOR: invert; OUTLINE-WIDTH: medium; =
TEXT-DECORATION: none; -moz-outline-style: none
}
.ElseProdContainer {
	POSITION: absolute; DISPLAY: none; TOP: 200px; LEFT: 360px
}
.hoverBox1 {
	Z-INDEX: 98; POSITION: relative; WIDTH: 31px; BACKGROUND: =
url(/scidirimg/explanation_arrow.gif) no-repeat; HEIGHT: 21px; =
MARGIN-LEFT: 15px
}
.ElseProd {
	BORDER-BOTTOM: #9b9b9b 1px solid; BORDER-LEFT: #9b9b9b 1px solid; =
PADDING-BOTTOM: 3px; MARGIN-TOP: -5px; PADDING-LEFT: 3px; PADDING-RIGHT: =
3px; DISPLAY: block; BACKGROUND: #efefef; BORDER-TOP: #9b9b9b 1px solid; =
BORDER-RIGHT: #9b9b9b 1px solid; PADDING-TOP: 3px
}
#dImageGrid {
	BACKGROUND-COLOR: #ffffff
}
#dImageGrid UL {
	POSITION: relative; PADDING-BOTTOM: 0em; LIST-STYLE-TYPE: none; MARGIN: =
0em; PADDING-LEFT: 10px; PADDING-RIGHT: 0em; FLOAT: left; =
LIST-STYLE-IMAGE: none; PADDING-TOP: 10px
}
#dImageGrid UL LI {
	BORDER-BOTTOM: #e8e8e8 1px solid; BORDER-LEFT: #e8e8e8 1px solid; =
PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: 235px; PADDING-RIGHT: =
0px; MARGIN-BOTTOM: 10px; FLOAT: left; BORDER-TOP: #e8e8e8 1px solid; =
CURSOR: default; MARGIN-RIGHT: 10px; BORDER-RIGHT: #e8e8e8 1px solid; =
PADDING-TOP: 0px
}
#dImageGrid UL LI .innerMedia IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; MAX-WIDTH: 175px; =
MAX-HEIGHT: 90px; FONT-SIZE: 12px; BORDER-TOP: medium none; TOP: 50%; =
CURSOR: pointer; BORDER-RIGHT: medium none; PADDING-TOP: 2px; LEFT: 50%
}
#dImageGrid UL LI DIV {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; =
PADDING-TOP: 0px
}
#dImageGrid UL LI .innerHead {
	PADDING-BOTTOM: 2px; PADDING-LEFT: 1px; PADDING-TOP: 2px
}
#dImageGrid UL LI .innerMedia {
	TEXT-ALIGN: center; WIDTH: 213px; DISPLAY: table-cell; HEIGHT: 100px; =
VERTICAL-ALIGN: middle; OVERFLOW: hidden
}
#dImageGrid UL LI .innerCaption {
	BORDER-BOTTOM: #e8e8e8 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: =
2px; PADDING-RIGHT: 2px; FONT-FAMILY: Arial; OVERFLOW: hidden; =
PADDING-TOP: 2px
}
#dImageGrid UL LI .innerBottom {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 6px; PADDING-RIGHT: 6px; FONT-SIZE: =
12px; PADDING-TOP: 5px
}
#dImageGrid .innerBottom IMG {
	PADDING-RIGHT: 1px; BACKGROUND: white 0px 0px; VERTICAL-ALIGN: middle
}
.dImageGridMlkt UL {
	POSITION: relative; PADDING-BOTTOM: 0em; LIST-STYLE-TYPE: none; MARGIN: =
0em; PADDING-LEFT: 10px; PADDING-RIGHT: 0em; FLOAT: left; =
LIST-STYLE-IMAGE: none; PADDING-TOP: 10px
}
.dImageGridMlkt UL LI {
	BORDER-BOTTOM: #e8e8e8 1px solid; BORDER-LEFT: #e8e8e8 1px solid; =
PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: 235px; PADDING-RIGHT: =
0px; MARGIN-BOTTOM: 10px; FLOAT: left; HEIGHT: 200px; BORDER-TOP: =
#e8e8e8 1px solid; CURSOR: default; MARGIN-RIGHT: 10px; BORDER-RIGHT: =
#e8e8e8 1px solid; PADDING-TOP: 0px
}
.dImageGridMlkt UL LI .innerMedia IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
2px; PADDING-LEFT: 2px; PADDING-RIGHT: 2px; MAX-WIDTH: 175px; =
MAX-HEIGHT: 90px; BORDER-TOP: medium none; TOP: 50%; CURSOR: pointer; =
BORDER-RIGHT: medium none; PADDING-TOP: 2px; LEFT: 50%
}
.dImageGridMlkt UL LI DIV {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; =
PADDING-TOP: 0px
}
.dImageGridMlkt UL LI .innerHead {
	PADDING-TOP: 5px
}
.dImageGridMlkt UL LI .innerMedia {
	TEXT-ALIGN: center; PADDING-BOTTOM: 4px; WIDTH: 213px; DISPLAY: =
table-cell; HEIGHT: 100px; VERTICAL-ALIGN: middle; OVERFLOW: hidden; =
PADDING-TOP: 5px
}
.dImageGridMlkt UL LI .innerCaption {
	BORDER-BOTTOM: #d0d0d0 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: =
2px; PADDING-RIGHT: 2px; FONT-FAMILY: Arial; HEIGHT: 50px; OVERFLOW: =
hidden; PADDING-TOP: 2px
}
.dImageGridMlkt UL LI .innerBottom {
	PADDING-LEFT: 6px; PADDING-RIGHT: 6px; FONT-SIZE: 12px; PADDING-TOP: =
5px
}
.dImageGridMlkt .clearFloat {
	CLEAR: both
}
.dImageGrid .clearFloat {
	CLEAR: both
}
.dImageGridMlkt .innerBottom IMG {
	PADDING-RIGHT: 1px; BACKGROUND: white 0px 0px; VERTICAL-ALIGN: middle
}
#dhtmltooltip {
	Z-INDEX: 9999; POSITION: absolute; BACKGROUND-COLOR: #ffffff; WIDTH: =
150px; VISIBILITY: hidden; COLOR: #000000
}
#dhtmltooltip UL LI {
	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
}
.captionTop {
	MAX-HEIGHT: 135px
}
.captionBot {
	COLOR: #9b9b9b
}
.height1 {
	HEIGHT: 216px
}
.height2 {
	HEIGHT: 220px
}
.height3 {
	HEIGHT: 225px
}
.height4 {
	HEIGHT: 230px
}
.height5 {
	HEIGHT: 244px
}
.heightCapt1 {
	HEIGHT: 41px
}
.heightCapt2 {
	HEIGHT: 44px
}
.heightCapt3 {
	HEIGHT: 48px
}
.heightCapt4 {
	HEIGHT: 53px
}
.heightCapt5 {
	HEIGHT: 67px
}
.artRadio {
	POSITION: relative; MARGIN-TOP: 0px; MARGIN-LEFT: 1px; VERTICAL-ALIGN: =
inherit; TOP: 0px
}
.artImages {
	POSITION: relative; MARGIN-TOP: 0px; MARGIN-LEFT: 0px; VERTICAL-ALIGN: =
inherit; TOP: 0px
}
#navigationTopSoc {
	WIDTH: 100%; COLOR: #fff
}
#navigationBottomSoc {
	WIDTH: 100%; COLOR: #fff
}
UL.mainSoc {
	FLOAT: left; HEIGHT: 29px
}
UL.miscSoc {
	FLOAT: right; HEIGHT: 29px
}
UL.navSoc {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
UL.navSoc LI {
	PADDING-BOTTOM: 8px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: =
0px; PADDING-RIGHT: 0px; BACKGROUND: url(/scidirimg/divider_nav.gif) =
no-repeat left center; FLOAT: left; LIST-STYLE-IMAGE: none; PADDING-TOP: =
7px
}
UL.navSoc LI A {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; COLOR: #ffffff !important; FONT-SIZE: 14px; =
TEXT-DECORATION: none; PADDING-TOP: 0px
}
UL.navSoc LI A:hover {
	COLOR: #ffffff; TEXT-DECORATION: underline
}
UL.navSoc LI A.selected {
	FONT-WEIGHT: bold
}
UL.navSoc LI.last {
	BACKGROUND: none transparent scroll repeat 0% 0%
}
.pdfImageLink {
	BACKGROUND: white
}
.chooseOrgCheck {
	MARGIN-TOP: 4px; FLOAT: left
}
.rememberOrg {
	MARGIN-LEFT: 10px; VERTICAL-ALIGN: middle
}
.emailLabel {
	POSITION: relative; TOP: -2px
}
.emailRadio {
	MARGIN-TOP: 2px
}
.expRadio {
	MARGIN-LEFT: 5px
}
.downBtn {
	LINE-HEIGHT: 16px; MARGIN-BOTTOM: 10px; MARGIN-LEFT: 125px
}
A.novisit {
	COLOR: #0156aa; TEXT-DECORATION: none
}
A.novisit:hover {
	TEXT-DECORATION: underline
}
A.novisit:visited {
	COLOR: #0156aa !important
}
#activator {
	COLOR: #0156aa
}
#suites UL.suites LI SPAN {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 12px; PADDING-RIGHT: =
12px; WHITE-SPACE: nowrap; COLOR: #000000; FONT-WEIGHT: bold; =
BORDER-RIGHT: #d8d8d8 1px solid; TEXT-DECORATION: none; PADDING-TOP: 0px
}
activator {
	COLOR: #0156aa
}
.allRadio {
	POSITION: relative; MARGIN: 0px; VERTICAL-ALIGN: inherit; TOP: 2px
}
.allCheck {
	POSITION: relative; MARGIN: 0px; VERTICAL-ALIGN: inherit; TOP: 0px
}
.top2fix {
	TOP: 2px
}
.emailGatherBtn {
	LINE-HEIGHT: 16px; MARGIN-LEFT: 140px; PADDING-TOP: 10px
}
#newFeedPub A:visited {
	COLOR: #0156aa
}
.chooseOrgfooterHide {
	Z-INDEX: 100; BORDER-BOTTOM: 0px; POSITION: absolute; FILTER: =
alpha(opacity=3D0); BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; BACKGROUND: #cccccc =
0px 0px; HEIGHT: 146px; COLOR: #cccccc; BORDER-TOP: 0px; BORDER-RIGHT: =
0px; PADDING-TOP: 0px; opacity: 0
}
.chooseOrgheaderHide {
	Z-INDEX: 100; BORDER-BOTTOM: 0px; POSITION: absolute; FILTER: =
alpha(opacity=3D0); BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; BACKGROUND: #cccccc =
0px 0px; HEIGHT: 102px; COLOR: #cccccc; BORDER-TOP: 0px; BORDER-RIGHT: =
0px; PADDING-TOP: 0px; opacity: 0
}
.curveBoxRight {
	MARGIN-RIGHT: 3px !important
}
#canvas {
	Z-INDEX: 100; POSITION: absolute; TEXT-ALIGN: center; PADDING-BOTTOM: =
25px; BACKGROUND-COLOR: #ffffff; MARGIN-TOP: 5px; PADDING-LEFT: 4px; =
WIDTH: 100% !important; HEIGHT: 99%; TOP: 190px !important; LEFT: 0px
}

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/gadgetcontext/gadgets/css/toolbar.css

Controlsbody {
	MARGIN: 0px; FONT-FAMILY: Arial, verdana, helvetica, sans-serif; =
FONT-SIZE: 75%
}
H1 {
	MARGIN: 0px
}
H2 {
	MARGIN: 0px
}
H3 {
	MARGIN: 0px
}
H4 {
	MARGIN: 0px
}
P {
	MARGIN: 0px
}
A {
	COLOR: #0156aa; TEXT-DECORATION: none
}
A:link {
	COLOR: #0156aa; TEXT-DECORATION: none
}
A:visited {
	COLOR: #840084
}
A:hover {
	COLOR: #0156aa; TEXT-DECORATION: underline
}
A:focus {
	COLOR: #0156aa; TEXT-DECORATION: underline
}
A:active {
	COLOR: #333333; TEXT-DECORATION: underline
}
A.disabled {
	COLOR: #9b9b9b
}
A.diabled:link {
	COLOR: #9b9b9b
}
.disabled {
	COLOR: #9b9b9b
}
A.disabled:visited {
	COLOR: #9b9b9b
}
A.disabled:hover {
	COLOR: #9b9b9b
}
A.disabled:focus {
	COLOR: #9b9b9b
}
A.disabled:active {
	COLOR: #9b9b9b
}
IMG {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: =
0px
}
.boxYellow {
	BORDER-BOTTOM: #fec76c 1px solid; BORDER-LEFT: #fec76c 1px solid; =
BACKGROUND-COLOR: #feffbb; BORDER-TOP: #fec76c 1px solid; BORDER-RIGHT: =
#fec76c 1px solid; -moz-border-radius: 2px 2px 2px 2px
}
.boxGrey {
	BORDER-BOTTOM: #cdcdcb 1px solid; BORDER-LEFT: #cdcdcb 1px solid; =
BACKGROUND-COLOR: #f7f7f7; BORDER-TOP: #cdcdcb 1px solid; BORDER-RIGHT: =
#cdcdcb 1px solid; -moz-border-radius: 2px 2px 2px 2px
}
.toolbarHead {
	WIDTH: 100%; FLOAT: left
}
.toolbarBody {
	BORDER-BOTTOM: #bababa 1px solid; BORDER-LEFT: #bababa 1px solid; =
PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; =
BACKGROUND: white; FLOAT: left; BORDER-TOP: #bababa 1px solid; =
BORDER-RIGHT: #bababa 1px solid; PADDING-TOP: 0px
}
.toolbarHoriShowHide {
	BORDER-BOTTOM: rgb(186,186,186) 1px solid; TEXT-ALIGN: center; =
BORDER-LEFT: rgb(186,186,186) 1px solid; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; BACKGROUND: =
#ebebeb; HEIGHT: 18px; COLOR: rgb(1,86,170); CLEAR: both; FONT-SIZE: =
12px; BORDER-TOP: rgb(186,186,186) 1px solid; CURSOR: pointer; =
FONT-WEIGHT: normal; BORDER-RIGHT: rgb(186,186,186) 1px solid; =
TEXT-DECORATION: none; PADDING-TOP: 0px
}
#toolbar {
	POSITION: relative
}
.toolbarfoot {
	POSITION: relative; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 100%; =
FLOAT: left
}
.toggleImg {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; WIDTH: 15px; PADDING-RIGHT: =
0px; BACKGROUND: repeat-y 0px 0px; FLOAT: left; CURSOR: pointer; =
PADDING-TOP: 0px; _margin-left: -3px
}
.toolbarHead H2 {
	BORDER-BOTTOM: #bababa 1px solid; PADDING-BOTTOM: 3px; PADDING-LEFT: =
6px; PADDING-RIGHT: 0px; BACKGROUND: #ebebeb; FONT-SIZE: 1.17em; =
PADDING-TOP: 3px
}
.toolbarHead A {
	FONT-SIZE: 1em
}
.containerAddManage {
	BORDER-BOTTOM: #9b9b9b 1px solid; WIDTH: 100%; BACKGROUND: #ebebeb
}
.toolbarHeadFull {
	WIDTH: 100%; FLOAT: left
}
.toolbarfootFull {
	PADDING-BOTTOM: 0px; MARGIN: 0px 0px 5px; WIDTH: 100%; FLOAT: left
}
.toolbarBodyFull {
	BORDER-BOTTOM: #bababa 1px solid; BORDER-LEFT: #bababa 1px solid; =
PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; =
FLOAT: left; BORDER-TOP: #bababa 1px solid; BORDER-RIGHT: #bababa 1px =
solid; PADDING-TOP: 0px
}
.toolbarHeadFull H2 {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 6px; PADDING-RIGHT: 0px; BACKGROUND: =
#ebebeb; FONT-SIZE: 1.17em; PADDING-TOP: 6px
}
.toolbarHeadFull A {
	FONT-SIZE: 1em
}
.containerAddManageFull {
	BORDER-BOTTOM: #9b9b9b 1px solid; WIDTH: 100%; FLOAT: left
}
.containerApplOver {
	PADDING-BOTTOM: 0px; MARGIN: 5px 0px 0px; PADDING-LEFT: 2px; =
PADDING-RIGHT: 2px; PADDING-TOP: 0px
}
.containerApplOver IMG.heading {
	MARGIN: 2px 0px 0px 4px; WIDTH: 20px; FLOAT: left; HEIGHT: 20px
}
.col1 {
	WIDTH: 33.3%; FLOAT: left
}
.col2 {
	WIDTH: 33.3%; FLOAT: left
}
.col3 {
	WIDTH: 33.3%; FLOAT: left
}
.addManage {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; BACKGROUND: =
#ebebeb; FLOAT: left; PADDING-TOP: 8px
}
A.iconadd {
	PADDING-BOTTOM: 0px; MARGIN: 0px 0px 0px 5px; PADDING-LEFT: 15px; =
PADDING-RIGHT: 0px; BACKGROUND: no-repeat 0px 1px; PADDING-TOP: 0px
}
.help {
	MARGIN: 6px 2px 5px 0px; FLOAT: right
}
.help_horizontal {
	MARGIN: 6px 2px 5px 0px; FLOAT: right
}
.addManageHome {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 1px; PADDING-RIGHT: 0px; BACKGROUND: =
#ebebeb; FLOAT: right; MARGIN-RIGHT: 6px; PADDING-TOP: 7px
}
.helpHome {
	MARGIN: 6px 2px 5px 0px; FLOAT: right
}
.containerAppl {
	PADDING-BOTTOM: 0px; MARGIN: 5px 0px 0px; PADDING-LEFT: 4px; WIDTH: =
240px; PADDING-RIGHT: 0px; FLOAT: left; PADDING-TOP: 0px
}
.containerAppl:hover {
	CURSOR: move
}
.containerAppl IMG.heading {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 0px; FLOAT: =
left; PADDING-TOP: 0px
}
H3.elsevierTimeL {
	TEXT-ALIGN: left; PADDING-BOTTOM: 3px; MARGIN: 4px 0px 0px 5px; =
PADDING-LEFT: 0px; WIDTH: 54%; PADDING-RIGHT: 0px; FLOAT: left; =
FONT-SIZE: 12px; FONT-WEIGHT: normal; PADDING-TOP: 2px
}
H3.elsevierTimeLOver {
	TEXT-ALIGN: left; PADDING-BOTTOM: 3px; MARGIN: 3px 2px 0px 5px; =
PADDING-LEFT: 0px; WIDTH: 54%; PADDING-RIGHT: 0px; FLOAT: left; =
FONT-SIZE: 12px; FONT-WEIGHT: bold; PADDING-TOP: 2px
}
.Controls {
	Z-INDEX: 1; POSITION: relative; MARGIN-TOP: 0px; WIDTH: 60px; FLOAT: =
right
}
.Controls UL {
	Z-INDEX: 1; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 5px
}
.Controls UL LI {
	Z-INDEX: 1; LIST-STYLE-TYPE: none; MARGIN: 0px 5px 0px 0px; FLOAT: left
}
.containerAppDetails {
	BORDER-BOTTOM: #fec76d 1px solid; BORDER-LEFT: #fec76d 1px solid; =
BORDER-TOP: #fec76d 0px solid; BORDER-RIGHT: #fec76d 1px solid
}
.containerAppDetails P {
	MARGIN: 4px 0px 0px
}
.containerAppDetailsCanvas {
	BORDER-BOTTOM: #fec76c 1px solid; BORDER-LEFT: #fec76c 1px solid; =
PADDING-BOTTOM: 3px; WIDTH: 99.8%; MARGIN-BOTTOM: 5px; BORDER-TOP: =
#fec76c 0px solid; BORDER-RIGHT: #fec76c 1px solid
}
.curveBoxleftCanvas {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 0px; HEIGHT: =
25px; PADDING-TOP: 0px
}
.Controls UL .submenu {
	Z-INDEX: 2; BORDER-BOTTOM: #cccccc 1px solid; POSITION: absolute; =
TEXT-ALIGN: left; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 2px; =
PADDING-LEFT: 0px; WIDTH: 100px; PADDING-RIGHT: 0px; DISPLAY: none; =
BACKGROUND: #f9f9f9; CLEAR: both; BORDER-TOP: #cccccc 1px solid; TOP: =
10px; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 2px; LEFT: -105px
}
.Controls UL .submenu LI {
	Z-INDEX: 1000; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; LINE-HEIGHT: =
normal; MARGIN: 0px 2px 2px; DISPLAY: block; BACKGROUND: #f9f9f9; FLOAT: =
none; HEIGHT: 18px; BORDER-TOP: 0px; BORDER-RIGHT: 0px; _margin: 0 2px =
0px 2px
}
.Controls .submenu LI A {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 3px; LINE-HEIGHT: =
normal; MARGIN: 0px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; DISPLAY: =
block; BACKGROUND: #f9f9f9; FLOAT: none; HEIGHT: auto; COLOR: #105cbe; =
BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 3px
}
.Controls .submenu LI A:hover {
	BACKGROUND: #e3edef
}
IFRAME.selectOverlap {
	Z-INDEX: -1; BORDER-BOTTOM: 0px; POSITION: absolute; FILTER: =
progid:DXImageTransform.Microsoft.Alpha(style=3D0,opacity=3D0); =
BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; OVERFLOW: hidden; BORDER-TOP: 0px; TOP: 0px; =
BORDER-RIGHT: 0px; PADDING-TOP: 0px; LEFT: 0px
}
.curveBoxleft {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; WIDTH: 92%; PADDING-RIGHT: 0px; =
HEIGHT: 25px; PADDING-TOP: 0px
}
.curveBoxBody {
	HEIGHT: 25px
}
.curveBoxRight {
	HEIGHT: 25px
}
.curveBoxRight IMG.heading {
	MARGIN: 2px 0px 0px 4px; WIDTH: 20px; FLOAT: left; HEIGHT: 20px
}
.CanvasControls {
	Z-INDEX: 1; POSITION: relative; MARGIN-TOP: 2px; WIDTH: 65px; FLOAT: =
right
}
.CanvasControls UL {
	Z-INDEX: 1; LIST-STYLE-TYPE: none; MARGIN: 0px
}
.CanvasControls UL LI {
	Z-INDEX: 1; LIST-STYLE-TYPE: none; MARGIN: 4px 0px 0px
}
.CanvasControls UL .submenu {
	Z-INDEX: 2; BORDER-BOTTOM: #cccccc 1px solid; POSITION: absolute; =
BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 2px; PADDING-LEFT: 0px; =
WIDTH: 140px; PADDING-RIGHT: 0px; DISPLAY: none; BACKGROUND: #f9f9f9; =
CLEAR: both; BORDER-TOP: #cccccc 1px solid; TOP: 10px; BORDER-RIGHT: =
#cccccc 1px solid; PADDING-TOP: 2px; LEFT: -145px
}
.CanvasControls UL .submenu LI {
	Z-INDEX: 1000; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; LINE-HEIGHT: =
normal; MARGIN: 0px 2px 2px; DISPLAY: block; BACKGROUND: #f9f9f9; FLOAT: =
none; HEIGHT: 18px; BORDER-TOP: 0px; BORDER-RIGHT: 0px; _margin: 0 2px =
0px 2px
}
.CanvasControls .submenu LI A {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 3px; LINE-HEIGHT: =
normal; MARGIN: 0px; PADDING-LEFT: 3px; PADDING-RIGHT: 3px; DISPLAY: =
block; BACKGROUND: #f9f9f9; FLOAT: none; HEIGHT: auto; COLOR: #105cbe; =
BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 3px
}
.CanvasControls .submenu LI A:hover {
	BACKGROUND: #e3edef
}
.containerAppDetailsRes {
	BORDER-BOTTOM: #e2cda2 0px solid; BORDER-LEFT: #e2cda2 0px solid; =
WIDTH: 99%; FLOAT: left; BORDER-TOP: #e2cda2 0px solid; BORDER-RIGHT: =
#e2cda2 0px solid
}
.curveBoxleftOver {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 99%; =
PADDING-RIGHT: 0px; HEIGHT: 25px; PADDING-TOP: 0px
}
.curveBoxBodyOver {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; HEIGHT: 25px; PADDING-TOP: 0px
}
.curveBoxRightOver {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; HEIGHT: 25px; PADDING-TOP: 0px
}
.space {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 5px
}
.curveBoxleftNormal {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; HEIGHT: 25px; PADDING-TOP: 0px
}
.curveBoxBodyNormal {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; HEIGHT: 25px; PADDING-TOP: 0px
}
.curveBoxRightNormal {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; HEIGHT: 25px; PADDING-TOP: 0px
}
#canvas {
	Z-INDEX: 100; POSITION: absolute; TEXT-ALIGN: center; PADDING-BOTTOM: =
25px; BACKGROUND-COLOR: #ffffff; MARGIN-TOP: 5px; PADDING-LEFT: 4px; =
WIDTH: 99.7%; HEIGHT: 99%; TOP: 178px; LEFT: 0px
}
.truncateTitle {
	WIDTH: 58%; OVERFLOW: hidden
}

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/static/stylesheets/css_srch_result_v01.css

.buttonInput {
	BORDER-BOTTOM: #333333 1px solid; BORDER-LEFT: #333333 1px solid; =
WIDTH: 50px; HEIGHT: 19px; COLOR: #000000; FONT-SIZE: 11px; BORDER-TOP: =
#333333 1px solid; BORDER-RIGHT: #333333 1px solid
}
#rsRightCol {
	MARGIN-LEFT: 227px
}
#rsLeftCol {
	WIDTH: 220px; FLOAT: left
}
#searchResults {
	PADDING-BOTTOM: 9px
}
#mlktResults {
	PADDING-BOTTOM: 9px
}
.skyScraper {
	MARGIN-RIGHT: 133px
}
.noskyScraper {
	MARGIN-RIGHT: 15px
}
#embedSRBModule {
	WIDTH: 214px; PADDING-TOP: 13px
}
#embedSRAModule {
	PADDING-BOTTOM: 25px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px
}
#resultListHeader {
	PADDING-BOTTOM: 7px; BACKGROUND-COLOR: #e8e8e8; PADDING-LEFT: 30px; =
PADDING-RIGHT: 12px; HEIGHT: 19px; VERTICAL-ALIGN: bottom; PADDING-TOP: =
10px
}
#sisrBox {
	PADDING-BOTTOM: 11px; BACKGROUND-COLOR: #e8e8e8; PADDING-LEFT: 7px; =
PADDING-RIGHT: 9px; PADDING-TOP: 11px
}
.refineBox {
	PADDING-BOTTOM: 11px; BACKGROUND-COLOR: #e8e8e8; PADDING-LEFT: 9px; =
PADDING-RIGHT: 9px; PADDING-TOP: 11px
}
.saveSrchLinks {
	WHITE-SPACE: nowrap; FLOAT: left; MARGIN-LEFT: 47px
}
#navigators {
=09
}
#navBox {
=09
}
#navBox INPUT {
	CURSOR: auto
}
.secTitles {
	BORDER-BOTTOM: #9b9b9b 1px solid; PADDING-BOTTOM: 4px; =
BACKGROUND-COLOR: #efefef; PADDING-LEFT: 9px; PADDING-RIGHT: 9px; =
VERTICAL-ALIGN: middle; BORDER-TOP: #9b9b9b 1px solid; FONT-WEIGHT: =
bold; PADDING-TOP: 4px
}
#resultListHeader INPUT {
	PADDING-LEFT: 7px; WHITE-SPACE: nowrap
}
#resultListHeader .listAction {
	PADDING-BOTTOM: 0px; MARGIN: 0px 7px 0px 5px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; FONT-SIZE: 0.95em; PADDING-TOP: 0px
}

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/jquery-1.4.2.js

/*!=0A=
 * jQuery JavaScript Library v1.4.2=0A=
 * http://jquery.com/=0A=
 *=0A=
 * Copyright 2010, John Resig=0A=
 * Dual licensed under the MIT or GPL Version 2 licenses.=0A=
 * http://jquery.org/license=0A=
 *=0A=
 * Includes Sizzle.js=0A=
 * http://sizzlejs.com/=0A=
 * Copyright 2010, The Dojo Foundation=0A=
 * Released under the MIT, BSD, and GPL Licenses.=0A=
 *=0A=
 * Date: Sat Feb 13 22:33:48 2010 -0500=0A=
 */=0A=
(function( window, undefined ) {=0A=
=0A=
// Define a local copy of jQuery=0A=
var jQuery =3D function( selector, context ) {=0A=
		// The jQuery object is actually just the init constructor 'enhanced'=0A=
		return new jQuery.fn.init( selector, context );=0A=
	},=0A=
=0A=
	// Map over jQuery in case of overwrite=0A=
	_jQuery =3D window.jQuery,=0A=
=0A=
	// Map over the $ in case of overwrite=0A=
	//_$ =3D window.$,=0A=
=0A=
	// Use the correct document accordingly with window argument (sandbox)=0A=
	document =3D window.document,=0A=
=0A=
	// A central reference to the root jQuery(document)=0A=
	rootjQuery,=0A=
=0A=
	// A simple way to check for HTML strings or ID strings=0A=
	// (both of which we optimize for)=0A=
	quickExpr =3D /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,=0A=
=0A=
	// Is it a simple selector=0A=
	isSimple =3D /^.[^:#\[\.,]*$/,=0A=
=0A=
	// Check if a string has a non-whitespace character in it=0A=
	rnotwhite =3D /\S/,=0A=
=0A=
	// Used for trimming whitespace=0A=
	rtrim =3D /^(\s|\u00A0)+|(\s|\u00A0)+$/g,=0A=
=0A=
	// Match a standalone tag=0A=
	rsingleTag =3D /^<(\w+)\s*\/?>(?:<\/\1>)?$/,=0A=
=0A=
	// Keep a UserAgent string for use with jQuery.browser=0A=
	userAgent =3D navigator.userAgent,=0A=
=0A=
	// For matching the engine and version of the browser=0A=
	browserMatch,=0A=
	=0A=
	// Has the ready events already been bound?=0A=
	readyBound =3D false,=0A=
	=0A=
	// The functions to execute on DOM ready=0A=
	readyList =3D [],=0A=
=0A=
	// The ready event handler=0A=
	DOMContentLoaded,=0A=
=0A=
	// Save a reference to some core methods=0A=
	toString =3D Object.prototype.toString,=0A=
	hasOwnProperty =3D Object.prototype.hasOwnProperty,=0A=
	push =3D Array.prototype.push,=0A=
	slice =3D Array.prototype.slice,=0A=
	indexOf =3D Array.prototype.indexOf;=0A=
=0A=
jQuery.fn =3D jQuery.prototype =3D {=0A=
	init: function( selector, context ) {=0A=
		var match, elem, ret, doc;=0A=
=0A=
		// Handle $(""), $(null), or $(undefined)=0A=
		if ( !selector ) {=0A=
			return this;=0A=
		}=0A=
=0A=
		// Handle $(DOMElement)=0A=
		if ( selector.nodeType ) {=0A=
			this.context =3D this[0] =3D selector;=0A=
			this.length =3D 1;=0A=
			return this;=0A=
		}=0A=
		=0A=
		// The body element only exists once, optimize finding it=0A=
		if ( selector =3D=3D=3D "body" && !context ) {=0A=
			this.context =3D document;=0A=
			this[0] =3D document.body;=0A=
			this.selector =3D "body";=0A=
			this.length =3D 1;=0A=
			return this;=0A=
		}=0A=
=0A=
		// Handle HTML strings=0A=
		if ( typeof selector =3D=3D=3D "string" ) {=0A=
			// Are we dealing with HTML string or an ID?=0A=
			match =3D quickExpr.exec( selector );=0A=
=0A=
			// Verify a match, and that no context was specified for #id=0A=
			if ( match && (match[1] || !context) ) {=0A=
=0A=
				// HANDLE: $(html) -> $(array)=0A=
				if ( match[1] ) {=0A=
					doc =3D (context ? context.ownerDocument || context : document);=0A=
=0A=
					// If a single string is passed in and it's a single tag=0A=
					// just do a createElement and skip the rest=0A=
					ret =3D rsingleTag.exec( selector );=0A=
=0A=
					if ( ret ) {=0A=
						if ( jQuery.isPlainObject( context ) ) {=0A=
							selector =3D [ document.createElement( ret[1] ) ];=0A=
							jQuery.fn.attr.call( selector, context, true );=0A=
=0A=
						} else {=0A=
							selector =3D [ doc.createElement( ret[1] ) ];=0A=
						}=0A=
=0A=
					} else {=0A=
						ret =3D buildFragment( [ match[1] ], [ doc ] );=0A=
						selector =3D (ret.cacheable ? ret.fragment.cloneNode(true) : =
ret.fragment).childNodes;=0A=
					}=0A=
					=0A=
					return jQuery.merge( this, selector );=0A=
					=0A=
				// HANDLE: $("#id")=0A=
				} else {=0A=
					elem =3D document.getElementById( match[2] );=0A=
=0A=
					if ( elem ) {=0A=
						// Handle the case where IE and Opera return items=0A=
						// by name instead of ID=0A=
						if ( elem.id !=3D=3D match[2] ) {=0A=
							return rootjQuery.find( selector );=0A=
						}=0A=
=0A=
						// Otherwise, we inject the element directly into the jQuery object=0A=
						this.length =3D 1;=0A=
						this[0] =3D elem;=0A=
					}=0A=
=0A=
					this.context =3D document;=0A=
					this.selector =3D selector;=0A=
					return this;=0A=
				}=0A=
=0A=
			// HANDLE: $("TAG")=0A=
			} else if ( !context && /^\w+$/.test( selector ) ) {=0A=
				this.selector =3D selector;=0A=
				this.context =3D document;=0A=
				selector =3D document.getElementsByTagName( selector );=0A=
				return jQuery.merge( this, selector );=0A=
=0A=
			// HANDLE: $(expr, $(...))=0A=
			} else if ( !context || context.jquery ) {=0A=
				return (context || rootjQuery).find( selector );=0A=
=0A=
			// HANDLE: $(expr, context)=0A=
			// (which is just equivalent to: $(context).find(expr)=0A=
			} else {=0A=
				return jQuery( context ).find( selector );=0A=
			}=0A=
=0A=
		// HANDLE: $(function)=0A=
		// Shortcut for document ready=0A=
		} else if ( jQuery.isFunction( selector ) ) {=0A=
			return rootjQuery.ready( selector );=0A=
		}=0A=
=0A=
		if (selector.selector !=3D=3D undefined) {=0A=
			this.selector =3D selector.selector;=0A=
			this.context =3D selector.context;=0A=
		}=0A=
=0A=
		return jQuery.makeArray( selector, this );=0A=
	},=0A=
=0A=
	// Start with an empty selector=0A=
	selector: "",=0A=
=0A=
	// The current version of jQuery being used=0A=
	jquery: "1.4.2",=0A=
=0A=
	// The default length of a jQuery object is 0=0A=
	length: 0,=0A=
=0A=
	// The number of elements contained in the matched element set=0A=
	size: function() {=0A=
		return this.length;=0A=
	},=0A=
=0A=
	toArray: function() {=0A=
		return slice.call( this, 0 );=0A=
	},=0A=
=0A=
	// Get the Nth element in the matched element set OR=0A=
	// Get the whole matched element set as a clean array=0A=
	get: function( num ) {=0A=
		return num =3D=3D null ?=0A=
=0A=
			// Return a 'clean' array=0A=
			this.toArray() :=0A=
=0A=
			// Return just the object=0A=
			( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );=0A=
	},=0A=
=0A=
	// Take an array of elements and push it onto the stack=0A=
	// (returning the new matched element set)=0A=
	pushStack: function( elems, name, selector ) {=0A=
		// Build a new jQuery matched element set=0A=
		var ret =3D jQuery();=0A=
=0A=
		if ( jQuery.isArray( elems ) ) {=0A=
			push.apply( ret, elems );=0A=
		=0A=
		} else {=0A=
			jQuery.merge( ret, elems );=0A=
		}=0A=
=0A=
		// Add the old object onto the stack (as a reference)=0A=
		ret.prevObject =3D this;=0A=
=0A=
		ret.context =3D this.context;=0A=
=0A=
		if ( name =3D=3D=3D "find" ) {=0A=
			ret.selector =3D this.selector + (this.selector ? " " : "") + =
selector;=0A=
		} else if ( name ) {=0A=
			ret.selector =3D this.selector + "." + name + "(" + selector + ")";=0A=
		}=0A=
=0A=
		// Return the newly-formed element set=0A=
		return ret;=0A=
	},=0A=
=0A=
	// Execute a callback for every element in the matched set.=0A=
	// (You can seed the arguments with an array of args, but this is=0A=
	// only used internally.)=0A=
	each: function( callback, args ) {=0A=
		return jQuery.each( this, callback, args );=0A=
	},=0A=
	=0A=
	ready: function( fn ) {=0A=
		// Attach the listeners=0A=
		jQuery.bindReady();=0A=
=0A=
		// If the DOM is already ready=0A=
		if ( jQuery.isReady ) {=0A=
			// Execute the function immediately=0A=
			fn.call( document, jQuery );=0A=
=0A=
		// Otherwise, remember the function for later=0A=
		} else if ( readyList ) {=0A=
			// Add the function to the wait list=0A=
			readyList.push( fn );=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
	=0A=
	eq: function( i ) {=0A=
		return i =3D=3D=3D -1 ?=0A=
			this.slice( i ) :=0A=
			this.slice( i, +i + 1 );=0A=
	},=0A=
=0A=
	first: function() {=0A=
		return this.eq( 0 );=0A=
	},=0A=
=0A=
	last: function() {=0A=
		return this.eq( -1 );=0A=
	},=0A=
=0A=
	slice: function() {=0A=
		return this.pushStack( slice.apply( this, arguments ),=0A=
			"slice", slice.call(arguments).join(",") );=0A=
	},=0A=
=0A=
	map: function( callback ) {=0A=
		return this.pushStack( jQuery.map(this, function( elem, i ) {=0A=
			return callback.call( elem, i, elem );=0A=
		}));=0A=
	},=0A=
	=0A=
	end: function() {=0A=
		return this.prevObject || jQuery(null);=0A=
	},=0A=
=0A=
	// For internal use only.=0A=
	// Behaves like an Array's method, not like a jQuery method.=0A=
	push: push,=0A=
	sort: [].sort,=0A=
	splice: [].splice=0A=
};=0A=
=0A=
// Give the init function the jQuery prototype for later instantiation=0A=
jQuery.fn.init.prototype =3D jQuery.fn;=0A=
=0A=
jQuery.extend =3D jQuery.fn.extend =3D function() {=0A=
	// copy reference to target object=0A=
	var target =3D arguments[0] || {}, i =3D 1, length =3D =
arguments.length, deep =3D false, options, name, src, copy;=0A=
=0A=
	// Handle a deep copy situation=0A=
	if ( typeof target =3D=3D=3D "boolean" ) {=0A=
		deep =3D target;=0A=
		target =3D arguments[1] || {};=0A=
		// skip the boolean and the target=0A=
		i =3D 2;=0A=
	}=0A=
=0A=
	// Handle case when target is a string or something (possible in deep =
copy)=0A=
	if ( typeof target !=3D=3D "object" && !jQuery.isFunction(target) ) {=0A=
		target =3D {};=0A=
	}=0A=
=0A=
	// extend jQuery itself if only one argument is passed=0A=
	if ( length =3D=3D=3D i ) {=0A=
		target =3D this;=0A=
		--i;=0A=
	}=0A=
=0A=
	for ( ; i < length; i++ ) {=0A=
		// Only deal with non-null/undefined values=0A=
		if ( (options =3D arguments[ i ]) !=3D null ) {=0A=
			// Extend the base object=0A=
			for ( name in options ) {=0A=
				src =3D target[ name ];=0A=
				copy =3D options[ name ];=0A=
=0A=
				// Prevent never-ending loop=0A=
				if ( target =3D=3D=3D copy ) {=0A=
					continue;=0A=
				}=0A=
=0A=
				// Recurse if we're merging object literal values or arrays=0A=
				if ( deep && copy && ( jQuery.isPlainObject(copy) || =
jQuery.isArray(copy) ) ) {=0A=
					var clone =3D src && ( jQuery.isPlainObject(src) || =
jQuery.isArray(src) ) ? src=0A=
						: jQuery.isArray(copy) ? [] : {};=0A=
=0A=
					// Never move original objects, clone them=0A=
					target[ name ] =3D jQuery.extend( deep, clone, copy );=0A=
=0A=
				// Don't bring in undefined values=0A=
				} else if ( copy !=3D=3D undefined ) {=0A=
					target[ name ] =3D copy;=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	// Return the modified object=0A=
	return target;=0A=
};=0A=
=0A=
jQuery.extend({=0A=
	noConflict: function( deep ) {=0A=
		//window.$ =3D _$;=0A=
=0A=
		if ( deep ) {=0A=
			window.jQuery =3D _jQuery;=0A=
		}=0A=
=0A=
		return jQuery;=0A=
	},=0A=
	=0A=
	// Is the DOM ready to be used? Set to true once it occurs.=0A=
	isReady: false,=0A=
	=0A=
	// Handle when the DOM is ready=0A=
	ready: function() {=0A=
		// Make sure that the DOM is not already loaded=0A=
		if ( !jQuery.isReady ) {=0A=
			// Make sure body exists, at least, in case IE gets a little =
overzealous (ticket #5443).=0A=
			if ( !document.body ) {=0A=
				return setTimeout( jQuery.ready, 13 );=0A=
			}=0A=
=0A=
			// Remember that the DOM is ready=0A=
			jQuery.isReady =3D true;=0A=
=0A=
			// If there are functions bound, to execute=0A=
			if ( readyList ) {=0A=
				// Execute all of them=0A=
				var fn, i =3D 0;=0A=
				while ( (fn =3D readyList[ i++ ]) ) {=0A=
					fn.call( document, jQuery );=0A=
				}=0A=
=0A=
				// Reset the list of functions=0A=
				readyList =3D null;=0A=
			}=0A=
=0A=
			// Trigger any bound ready events=0A=
			if ( jQuery.fn.triggerHandler ) {=0A=
				jQuery( document ).triggerHandler( "ready" );=0A=
			}=0A=
		}=0A=
	},=0A=
	=0A=
	bindReady: function() {=0A=
		if ( readyBound ) {=0A=
			return;=0A=
		}=0A=
=0A=
		readyBound =3D true;=0A=
=0A=
		// Catch cases where $(document).ready() is called after the=0A=
		// browser event has already occurred.=0A=
		if ( document.readyState =3D=3D=3D "complete" ) {=0A=
			return jQuery.ready();=0A=
		}=0A=
=0A=
		// Mozilla, Opera and webkit nightlies currently support this event=0A=
		if ( document.addEventListener ) {=0A=
			// Use the handy event callback=0A=
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, =
false );=0A=
			=0A=
			// A fallback to window.onload, that will always work=0A=
			window.addEventListener( "load", jQuery.ready, false );=0A=
=0A=
		// If IE event model is used=0A=
		} else if ( document.attachEvent ) {=0A=
			// ensure firing before onload,=0A=
			// maybe late but safe also for iframes=0A=
			document.attachEvent("onreadystatechange", DOMContentLoaded);=0A=
			=0A=
			// A fallback to window.onload, that will always work=0A=
			window.attachEvent( "onload", jQuery.ready );=0A=
=0A=
			// If IE and not a frame=0A=
			// continually check to see if the document is ready=0A=
			var toplevel =3D false;=0A=
=0A=
			try {=0A=
				toplevel =3D window.frameElement =3D=3D null;=0A=
			} catch(e) {}=0A=
=0A=
			if ( document.documentElement.doScroll && toplevel ) {=0A=
				doScrollCheck();=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
	// See test/unit/core.js for details concerning isFunction.=0A=
	// Since version 1.3, DOM methods and functions like alert=0A=
	// aren't supported. They return false on IE (#2968).=0A=
	isFunction: function( obj ) {=0A=
		return toString.call(obj) =3D=3D=3D "[object Function]";=0A=
	},=0A=
=0A=
	isArray: function( obj ) {=0A=
		return toString.call(obj) =3D=3D=3D "[object Array]";=0A=
	},=0A=
=0A=
	isPlainObject: function( obj ) {=0A=
		// Must be an Object.=0A=
		// Because of IE, we also have to check the presence of the =
constructor property.=0A=
		// Make sure that DOM nodes and window objects don't pass through, as =
well=0A=
		if ( !obj || toString.call(obj) !=3D=3D "[object Object]" || =
obj.nodeType || obj.setInterval ) {=0A=
			return false;=0A=
		}=0A=
		=0A=
		// Not own constructor property must be Object=0A=
		if ( obj.constructor=0A=
			&& !hasOwnProperty.call(obj, "constructor")=0A=
			&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) =
{=0A=
			return false;=0A=
		}=0A=
		=0A=
		// Own properties are enumerated firstly, so to speed up,=0A=
		// if last one is own, then all properties are own.=0A=
	=0A=
		var key;=0A=
		for ( key in obj ) {}=0A=
		=0A=
		return key =3D=3D=3D undefined || hasOwnProperty.call( obj, key );=0A=
	},=0A=
=0A=
	isEmptyObject: function( obj ) {=0A=
		for ( var name in obj ) {=0A=
			return false;=0A=
		}=0A=
		return true;=0A=
	},=0A=
	=0A=
	error: function( msg ) {=0A=
		throw msg;=0A=
	},=0A=
	=0A=
	parseJSON: function( data ) {=0A=
		if ( typeof data !=3D=3D "string" || !data ) {=0A=
			return null;=0A=
		}=0A=
=0A=
		// Make sure leading/trailing whitespace is removed (IE can't handle =
it)=0A=
		data =3D jQuery.trim( data );=0A=
		=0A=
		// Make sure the incoming data is actual JSON=0A=
		// Logic borrowed from http://json.org/json2.js=0A=
		if ( =
/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, =
"@")=0A=
			=
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?=
/g, "]")=0A=
			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {=0A=
=0A=
			// Try to use the native JSON parser first=0A=
			return window.JSON && window.JSON.parse ?=0A=
				window.JSON.parse( data ) :=0A=
				(new Function("return " + data))();=0A=
=0A=
		} else {=0A=
			jQuery.error( "Invalid JSON: " + data );=0A=
		}=0A=
	},=0A=
=0A=
	noop: function() {},=0A=
=0A=
	// Evalulates a script in a global context=0A=
	globalEval: function( data ) {=0A=
		if ( data && rnotwhite.test(data) ) {=0A=
			// Inspired by code by Andrea Giammarchi=0A=
			// =
http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom=
.html=0A=
			var head =3D document.getElementsByTagName("head")[0] || =
document.documentElement,=0A=
				script =3D document.createElement("script");=0A=
=0A=
			script.type =3D "text/javascript";=0A=
=0A=
			if ( jQuery.support.scriptEval ) {=0A=
				script.appendChild( document.createTextNode( data ) );=0A=
			} else {=0A=
				script.text =3D data;=0A=
			}=0A=
=0A=
			// Use insertBefore instead of appendChild to circumvent an IE6 bug.=0A=
			// This arises when a base node is used (#2709).=0A=
			head.insertBefore( script, head.firstChild );=0A=
			head.removeChild( script );=0A=
		}=0A=
	},=0A=
=0A=
	nodeName: function( elem, name ) {=0A=
		return elem.nodeName && elem.nodeName.toUpperCase() =3D=3D=3D =
name.toUpperCase();=0A=
	},=0A=
=0A=
	// args is for internal usage only=0A=
	each: function( object, callback, args ) {=0A=
		var name, i =3D 0,=0A=
			length =3D object.length,=0A=
			isObj =3D length =3D=3D=3D undefined || jQuery.isFunction(object);=0A=
=0A=
		if ( args ) {=0A=
			if ( isObj ) {=0A=
				for ( name in object ) {=0A=
					if ( callback.apply( object[ name ], args ) =3D=3D=3D false ) {=0A=
						break;=0A=
					}=0A=
				}=0A=
			} else {=0A=
				for ( ; i < length; ) {=0A=
					if ( callback.apply( object[ i++ ], args ) =3D=3D=3D false ) {=0A=
						break;=0A=
					}=0A=
				}=0A=
			}=0A=
=0A=
		// A special, fast, case for the most common use of each=0A=
		} else {=0A=
			if ( isObj ) {=0A=
				for ( name in object ) {=0A=
					if ( callback.call( object[ name ], name, object[ name ] ) =
=3D=3D=3D false ) {=0A=
						break;=0A=
					}=0A=
				}=0A=
			} else {=0A=
				for ( var value =3D object[0];=0A=
					i < length && callback.call( value, i, value ) !=3D=3D false; value =
=3D object[++i] ) {}=0A=
			}=0A=
		}=0A=
=0A=
		return object;=0A=
	},=0A=
=0A=
	trim: function( text ) {=0A=
		return (text || "").replace( rtrim, "" );=0A=
	},=0A=
=0A=
	// results is for internal usage only=0A=
	makeArray: function( array, results ) {=0A=
		var ret =3D results || [];=0A=
=0A=
		if ( array !=3D null ) {=0A=
			// The window, strings (and functions) also have 'length'=0A=
			// The extra typeof function check is to prevent crashes=0A=
			// in Safari 2 (See: #3039)=0A=
			if ( array.length =3D=3D null || typeof array =3D=3D=3D "string" || =
jQuery.isFunction(array) || (typeof array !=3D=3D "function" && =
array.setInterval) ) {=0A=
				push.call( ret, array );=0A=
			} else {=0A=
				jQuery.merge( ret, array );=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	inArray: function( elem, array ) {=0A=
		if ( array.indexOf ) {=0A=
			return array.indexOf( elem );=0A=
		}=0A=
=0A=
		for ( var i =3D 0, length =3D array.length; i < length; i++ ) {=0A=
			if ( array[ i ] =3D=3D=3D elem ) {=0A=
				return i;=0A=
			}=0A=
		}=0A=
=0A=
		return -1;=0A=
	},=0A=
=0A=
	merge: function( first, second ) {=0A=
		var i =3D first.length, j =3D 0;=0A=
=0A=
		if ( typeof second.length =3D=3D=3D "number" ) {=0A=
			for ( var l =3D second.length; j < l; j++ ) {=0A=
				first[ i++ ] =3D second[ j ];=0A=
			}=0A=
		=0A=
		} else {=0A=
			while ( second[j] !=3D=3D undefined ) {=0A=
				first[ i++ ] =3D second[ j++ ];=0A=
			}=0A=
		}=0A=
=0A=
		first.length =3D i;=0A=
=0A=
		return first;=0A=
	},=0A=
=0A=
	grep: function( elems, callback, inv ) {=0A=
		var ret =3D [];=0A=
=0A=
		// Go through the array, only saving the items=0A=
		// that pass the validator function=0A=
		for ( var i =3D 0, length =3D elems.length; i < length; i++ ) {=0A=
			if ( !inv !=3D=3D !callback( elems[ i ], i ) ) {=0A=
				ret.push( elems[ i ] );=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	// arg is for internal usage only=0A=
	map: function( elems, callback, arg ) {=0A=
		var ret =3D [], value;=0A=
=0A=
		// Go through the array, translating each of the items to their=0A=
		// new value (or values).=0A=
		for ( var i =3D 0, length =3D elems.length; i < length; i++ ) {=0A=
			value =3D callback( elems[ i ], i, arg );=0A=
=0A=
			if ( value !=3D null ) {=0A=
				ret[ ret.length ] =3D value;=0A=
			}=0A=
		}=0A=
=0A=
		return ret.concat.apply( [], ret );=0A=
	},=0A=
=0A=
	// A global GUID counter for objects=0A=
	guid: 1,=0A=
=0A=
	proxy: function( fn, proxy, thisObject ) {=0A=
		if ( arguments.length =3D=3D=3D 2 ) {=0A=
			if ( typeof proxy =3D=3D=3D "string" ) {=0A=
				thisObject =3D fn;=0A=
				fn =3D thisObject[ proxy ];=0A=
				proxy =3D undefined;=0A=
=0A=
			} else if ( proxy && !jQuery.isFunction( proxy ) ) {=0A=
				thisObject =3D proxy;=0A=
				proxy =3D undefined;=0A=
			}=0A=
		}=0A=
=0A=
		if ( !proxy && fn ) {=0A=
			proxy =3D function() {=0A=
				return fn.apply( thisObject || this, arguments );=0A=
			};=0A=
		}=0A=
=0A=
		// Set the guid of unique handler to the same of original handler, so =
it can be removed=0A=
		if ( fn ) {=0A=
			proxy.guid =3D fn.guid =3D fn.guid || proxy.guid || jQuery.guid++;=0A=
		}=0A=
=0A=
		// So proxy can be declared as an argument=0A=
		return proxy;=0A=
	},=0A=
=0A=
	// Use of jQuery.browser is frowned upon.=0A=
	// More details: http://docs.jquery.com/Utilities/jQuery.browser=0A=
	uaMatch: function( ua ) {=0A=
		ua =3D ua.toLowerCase();=0A=
=0A=
		var match =3D /(webkit)[ \/]([\w.]+)/.exec( ua ) ||=0A=
			/(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||=0A=
			/(msie) ([\w.]+)/.exec( ua ) ||=0A=
			!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua =
) ||=0A=
		  	[];=0A=
=0A=
		return { browser: match[1] || "", version: match[2] || "0" };=0A=
	},=0A=
=0A=
	browser: {}=0A=
});=0A=
=0A=
browserMatch =3D jQuery.uaMatch( userAgent );=0A=
if ( browserMatch.browser ) {=0A=
	jQuery.browser[ browserMatch.browser ] =3D true;=0A=
	jQuery.browser.version =3D browserMatch.version;=0A=
}=0A=
=0A=
// Deprecated, use jQuery.browser.webkit instead=0A=
if ( jQuery.browser.webkit ) {=0A=
	jQuery.browser.safari =3D true;=0A=
}=0A=
=0A=
if ( indexOf ) {=0A=
	jQuery.inArray =3D function( elem, array ) {=0A=
		return indexOf.call( array, elem );=0A=
	};=0A=
}=0A=
=0A=
// All jQuery objects should point back to these=0A=
rootjQuery =3D jQuery(document);=0A=
=0A=
// Cleanup functions for the document ready method=0A=
if ( document.addEventListener ) {=0A=
	DOMContentLoaded =3D function() {=0A=
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, =
false );=0A=
		jQuery.ready();=0A=
	};=0A=
=0A=
} else if ( document.attachEvent ) {=0A=
	DOMContentLoaded =3D function() {=0A=
		// Make sure body exists, at least, in case IE gets a little =
overzealous (ticket #5443).=0A=
		if ( document.readyState =3D=3D=3D "complete" ) {=0A=
			document.detachEvent( "onreadystatechange", DOMContentLoaded );=0A=
			jQuery.ready();=0A=
		}=0A=
	};=0A=
}=0A=
=0A=
// The DOM ready check for Internet Explorer=0A=
function doScrollCheck() {=0A=
	if ( jQuery.isReady ) {=0A=
		return;=0A=
	}=0A=
=0A=
	try {=0A=
		// If IE is used, use the trick by Diego Perini=0A=
		// http://javascript.nwbox.com/IEContentLoaded/=0A=
		document.documentElement.doScroll("left");=0A=
	} catch( error ) {=0A=
		setTimeout( doScrollCheck, 1 );=0A=
		return;=0A=
	}=0A=
=0A=
	// and execute any waiting functions=0A=
	jQuery.ready();=0A=
}=0A=
=0A=
function evalScript( i, elem ) {=0A=
	if ( elem.src ) {=0A=
		jQuery.ajax({=0A=
			url: elem.src,=0A=
			async: false,=0A=
			dataType: "script"=0A=
		});=0A=
	} else {=0A=
		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || =
"" );=0A=
	}=0A=
=0A=
	if ( elem.parentNode ) {=0A=
		elem.parentNode.removeChild( elem );=0A=
	}=0A=
}=0A=
=0A=
// Mutifunctional method to get and set values to a collection=0A=
// The value/s can be optionally by executed if its a function=0A=
function access( elems, key, value, exec, fn, pass ) {=0A=
	var length =3D elems.length;=0A=
	=0A=
	// Setting many attributes=0A=
	if ( typeof key =3D=3D=3D "object" ) {=0A=
		for ( var k in key ) {=0A=
			access( elems, k, key[k], exec, fn, value );=0A=
		}=0A=
		return elems;=0A=
	}=0A=
	=0A=
	// Setting one attribute=0A=
	if ( value !=3D=3D undefined ) {=0A=
		// Optionally, function values get executed if exec is true=0A=
		exec =3D !pass && exec && jQuery.isFunction(value);=0A=
		=0A=
		for ( var i =3D 0; i < length; i++ ) {=0A=
			fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key =
) ) : value, pass );=0A=
		}=0A=
		=0A=
		return elems;=0A=
	}=0A=
	=0A=
	// Getting an attribute=0A=
	return length ? fn( elems[0], key ) : undefined;=0A=
}=0A=
=0A=
function now() {=0A=
	return (new Date).getTime();=0A=
}=0A=
(function() {=0A=
=0A=
	jQuery.support =3D {};=0A=
=0A=
	var root =3D document.documentElement,=0A=
		script =3D document.createElement("script"),=0A=
		div =3D document.createElement("div"),=0A=
		id =3D "script" + now();=0A=
=0A=
	div.style.display =3D "none";=0A=
	div.innerHTML =3D "   <link/><table></table><a href=3D'/a' =
style=3D'color:red;float:left;opacity:.55;'>a</a><input =
type=3D'checkbox'/>";=0A=
=0A=
	var all =3D div.getElementsByTagName("*"),=0A=
		a =3D div.getElementsByTagName("a")[0];=0A=
=0A=
	// Can't get basic test support=0A=
	if ( !all || !all.length || !a ) {=0A=
		return;=0A=
	}=0A=
=0A=
	jQuery.support =3D {=0A=
		// IE strips leading whitespace when .innerHTML is used=0A=
		leadingWhitespace: div.firstChild.nodeType =3D=3D=3D 3,=0A=
=0A=
		// Make sure that tbody elements aren't automatically inserted=0A=
		// IE will insert them into empty tables=0A=
		tbody: !div.getElementsByTagName("tbody").length,=0A=
=0A=
		// Make sure that link elements get serialized correctly by innerHTML=0A=
		// This requires a wrapper element in IE=0A=
		htmlSerialize: !!div.getElementsByTagName("link").length,=0A=
=0A=
		// Get the style information from getAttribute=0A=
		// (IE uses .cssText insted)=0A=
		style: /red/.test( a.getAttribute("style") ),=0A=
=0A=
		// Make sure that URLs aren't manipulated=0A=
		// (IE normalizes it by default)=0A=
		hrefNormalized: a.getAttribute("href") =3D=3D=3D "/a",=0A=
=0A=
		// Make sure that element opacity exists=0A=
		// (IE uses filter instead)=0A=
		// Use a regex to work around a WebKit issue. See #5145=0A=
		opacity: /^0.55$/.test( a.style.opacity ),=0A=
=0A=
		// Verify style float existence=0A=
		// (IE uses styleFloat instead of cssFloat)=0A=
		cssFloat: !!a.style.cssFloat,=0A=
=0A=
		// Make sure that if no value is specified for a checkbox=0A=
		// that it defaults to "on".=0A=
		// (WebKit defaults to "" instead)=0A=
		checkOn: div.getElementsByTagName("input")[0].value =3D=3D=3D "on",=0A=
=0A=
		// Make sure that a selected-by-default option has a working selected =
property.=0A=
		// (WebKit defaults to false instead of true, IE too, if it's in an =
optgroup)=0A=
		optSelected: document.createElement("select").appendChild( =
document.createElement("option") ).selected,=0A=
=0A=
		parentNode: div.removeChild( div.appendChild( =
document.createElement("div") ) ).parentNode =3D=3D=3D null,=0A=
=0A=
		// Will be defined later=0A=
		deleteExpando: true,=0A=
		checkClone: false,=0A=
		scriptEval: false,=0A=
		noCloneEvent: true,=0A=
		boxModel: null=0A=
	};=0A=
=0A=
	script.type =3D "text/javascript";=0A=
	try {=0A=
		script.appendChild( document.createTextNode( "window." + id + "=3D1;" =
) );=0A=
	} catch(e) {}=0A=
=0A=
	root.insertBefore( script, root.firstChild );=0A=
=0A=
	// Make sure that the execution of code works by injecting a script=0A=
	// tag with appendChild/createTextNode=0A=
	// (IE doesn't support this, fails, and uses .text instead)=0A=
	if ( window[ id ] ) {=0A=
		jQuery.support.scriptEval =3D true;=0A=
		delete window[ id ];=0A=
	}=0A=
=0A=
	// Test to see if it's possible to delete an expando from an element=0A=
	// Fails in Internet Explorer=0A=
	try {=0A=
		delete script.test;=0A=
	=0A=
	} catch(e) {=0A=
		jQuery.support.deleteExpando =3D false;=0A=
	}=0A=
=0A=
	root.removeChild( script );=0A=
=0A=
	if ( div.attachEvent && div.fireEvent ) {=0A=
		div.attachEvent("onclick", function click() {=0A=
			// Cloning a node shouldn't copy over any=0A=
			// bound event handlers (IE does this)=0A=
			jQuery.support.noCloneEvent =3D false;=0A=
			div.detachEvent("onclick", click);=0A=
		});=0A=
		div.cloneNode(true).fireEvent("onclick");=0A=
	}=0A=
=0A=
	div =3D document.createElement("div");=0A=
	div.innerHTML =3D "<input type=3D'radio' name=3D'radiotest' =
checked=3D'checked'/>";=0A=
=0A=
	var fragment =3D document.createDocumentFragment();=0A=
	fragment.appendChild( div.firstChild );=0A=
=0A=
	// WebKit doesn't clone checked state correctly in fragments=0A=
	jQuery.support.checkClone =3D =
fragment.cloneNode(true).cloneNode(true).lastChild.checked;=0A=
=0A=
	// Figure out if the W3C box model works as expected=0A=
	// document.body must exist before we can do this=0A=
	jQuery(function() {=0A=
		var div =3D document.createElement("div");=0A=
		div.style.width =3D div.style.paddingLeft =3D "1px";=0A=
=0A=
		document.body.appendChild( div );=0A=
		jQuery.boxModel =3D jQuery.support.boxModel =3D div.offsetWidth =
=3D=3D=3D 2;=0A=
		document.body.removeChild( div ).style.display =3D 'none';=0A=
=0A=
		div =3D null;=0A=
	});=0A=
=0A=
	// Technique from Juriy Zaytsev=0A=
	// =
http://thinkweb2.com/projects/prototype/detecting-event-support-without-b=
rowser-sniffing/=0A=
	var eventSupported =3D function( eventName ) { =0A=
		var el =3D document.createElement("div"); =0A=
		eventName =3D "on" + eventName; =0A=
=0A=
		var isSupported =3D (eventName in el); =0A=
		if ( !isSupported ) { =0A=
			el.setAttribute(eventName, "return;"); =0A=
			isSupported =3D typeof el[eventName] =3D=3D=3D "function"; =0A=
		} =0A=
		el =3D null; =0A=
=0A=
		return isSupported; =0A=
	};=0A=
	=0A=
	jQuery.support.submitBubbles =3D eventSupported("submit");=0A=
	jQuery.support.changeBubbles =3D eventSupported("change");=0A=
=0A=
	// release memory in IE=0A=
	root =3D script =3D div =3D all =3D a =3D null;=0A=
})();=0A=
=0A=
jQuery.props =3D {=0A=
	"for": "htmlFor",=0A=
	"class": "className",=0A=
	readonly: "readOnly",=0A=
	maxlength: "maxLength",=0A=
	cellspacing: "cellSpacing",=0A=
	rowspan: "rowSpan",=0A=
	colspan: "colSpan",=0A=
	tabindex: "tabIndex",=0A=
	usemap: "useMap",=0A=
	frameborder: "frameBorder"=0A=
};=0A=
var expando =3D "jQuery" + now(), uuid =3D 0, windowData =3D {};=0A=
=0A=
jQuery.extend({=0A=
	cache: {},=0A=
	=0A=
	expando:expando,=0A=
=0A=
	// The following elements throw uncatchable exceptions if you=0A=
	// attempt to add expando properties to them.=0A=
	noData: {=0A=
		"embed": true,=0A=
		"object": true,=0A=
		"applet": true=0A=
	},=0A=
=0A=
	data: function( elem, name, data ) {=0A=
		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {=0A=
			return;=0A=
		}=0A=
=0A=
		elem =3D elem =3D=3D window ?=0A=
			windowData :=0A=
			elem;=0A=
=0A=
		var id =3D elem[ expando ], cache =3D jQuery.cache, thisCache;=0A=
=0A=
		if ( !id && typeof name =3D=3D=3D "string" && data =3D=3D=3D undefined =
) {=0A=
			return null;=0A=
		}=0A=
=0A=
		// Compute a unique ID for the element=0A=
		if ( !id ) { =0A=
			id =3D ++uuid;=0A=
		}=0A=
=0A=
		// Avoid generating a new cache unless none exists and we=0A=
		// want to manipulate it.=0A=
		if ( typeof name =3D=3D=3D "object" ) {=0A=
			elem[ expando ] =3D id;=0A=
			thisCache =3D cache[ id ] =3D jQuery.extend(true, {}, name);=0A=
=0A=
		} else if ( !cache[ id ] ) {=0A=
			elem[ expando ] =3D id;=0A=
			cache[ id ] =3D {};=0A=
		}=0A=
=0A=
		thisCache =3D cache[ id ];=0A=
=0A=
		// Prevent overriding the named cache with undefined values=0A=
		if ( data !=3D=3D undefined ) {=0A=
			thisCache[ name ] =3D data;=0A=
		}=0A=
=0A=
		return typeof name =3D=3D=3D "string" ? thisCache[ name ] : thisCache;=0A=
	},=0A=
=0A=
	removeData: function( elem, name ) {=0A=
		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {=0A=
			return;=0A=
		}=0A=
=0A=
		elem =3D elem =3D=3D window ?=0A=
			windowData :=0A=
			elem;=0A=
=0A=
		var id =3D elem[ expando ], cache =3D jQuery.cache, thisCache =3D =
cache[ id ];=0A=
=0A=
		// If we want to remove a specific section of the element's data=0A=
		if ( name ) {=0A=
			if ( thisCache ) {=0A=
				// Remove the section of cache data=0A=
				delete thisCache[ name ];=0A=
=0A=
				// If we've removed all the data, remove the element's cache=0A=
				if ( jQuery.isEmptyObject(thisCache) ) {=0A=
					jQuery.removeData( elem );=0A=
				}=0A=
			}=0A=
=0A=
		// Otherwise, we want to remove all of the element's data=0A=
		} else {=0A=
			if ( jQuery.support.deleteExpando ) {=0A=
				delete elem[ jQuery.expando ];=0A=
=0A=
			} else if ( elem.removeAttribute ) {=0A=
				elem.removeAttribute( jQuery.expando );=0A=
			}=0A=
=0A=
			// Completely remove the data cache=0A=
			delete cache[ id ];=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
jQuery.fn.extend({=0A=
	data: function( key, value ) {=0A=
		if ( typeof key =3D=3D=3D "undefined" && this.length ) {=0A=
			return jQuery.data( this[0] );=0A=
=0A=
		} else if ( typeof key =3D=3D=3D "object" ) {=0A=
			return this.each(function() {=0A=
				jQuery.data( this, key );=0A=
			});=0A=
		}=0A=
=0A=
		var parts =3D key.split(".");=0A=
		parts[1] =3D parts[1] ? "." + parts[1] : "";=0A=
=0A=
		if ( value =3D=3D=3D undefined ) {=0A=
			var data =3D this.triggerHandler("getData" + parts[1] + "!", =
[parts[0]]);=0A=
=0A=
			if ( data =3D=3D=3D undefined && this.length ) {=0A=
				data =3D jQuery.data( this[0], key );=0A=
			}=0A=
			return data =3D=3D=3D undefined && parts[1] ?=0A=
				this.data( parts[0] ) :=0A=
				data;=0A=
		} else {=0A=
			return this.trigger("setData" + parts[1] + "!", [parts[0], =
value]).each(function() {=0A=
				jQuery.data( this, key, value );=0A=
			});=0A=
		}=0A=
	},=0A=
=0A=
	removeData: function( key ) {=0A=
		return this.each(function() {=0A=
			jQuery.removeData( this, key );=0A=
		});=0A=
	}=0A=
});=0A=
jQuery.extend({=0A=
	queue: function( elem, type, data ) {=0A=
		if ( !elem ) {=0A=
			return;=0A=
		}=0A=
=0A=
		type =3D (type || "fx") + "queue";=0A=
		var q =3D jQuery.data( elem, type );=0A=
=0A=
		// Speed up dequeue by getting out quickly if this is just a lookup=0A=
		if ( !data ) {=0A=
			return q || [];=0A=
		}=0A=
=0A=
		if ( !q || jQuery.isArray(data) ) {=0A=
			q =3D jQuery.data( elem, type, jQuery.makeArray(data) );=0A=
=0A=
		} else {=0A=
			q.push( data );=0A=
		}=0A=
=0A=
		return q;=0A=
	},=0A=
=0A=
	dequeue: function( elem, type ) {=0A=
		type =3D type || "fx";=0A=
=0A=
		var queue =3D jQuery.queue( elem, type ), fn =3D queue.shift();=0A=
=0A=
		// If the fx queue is dequeued, always remove the progress sentinel=0A=
		if ( fn =3D=3D=3D "inprogress" ) {=0A=
			fn =3D queue.shift();=0A=
		}=0A=
=0A=
		if ( fn ) {=0A=
			// Add a progress sentinel to prevent the fx queue from being=0A=
			// automatically dequeued=0A=
			if ( type =3D=3D=3D "fx" ) {=0A=
				queue.unshift("inprogress");=0A=
			}=0A=
=0A=
			fn.call(elem, function() {=0A=
				jQuery.dequeue(elem, type);=0A=
			});=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
jQuery.fn.extend({=0A=
	queue: function( type, data ) {=0A=
		if ( typeof type !=3D=3D "string" ) {=0A=
			data =3D type;=0A=
			type =3D "fx";=0A=
		}=0A=
=0A=
		if ( data =3D=3D=3D undefined ) {=0A=
			return jQuery.queue( this[0], type );=0A=
		}=0A=
		return this.each(function( i, elem ) {=0A=
			var queue =3D jQuery.queue( this, type, data );=0A=
=0A=
			if ( type =3D=3D=3D "fx" && queue[0] !=3D=3D "inprogress" ) {=0A=
				jQuery.dequeue( this, type );=0A=
			}=0A=
		});=0A=
	},=0A=
	dequeue: function( type ) {=0A=
		return this.each(function() {=0A=
			jQuery.dequeue( this, type );=0A=
		});=0A=
	},=0A=
=0A=
	// Based off of the plugin by Clint Helfers, with permission.=0A=
	// http://blindsignals.com/index.php/2009/07/jquery-delay/=0A=
	delay: function( time, type ) {=0A=
		time =3D jQuery.fx ? jQuery.fx.speeds[time] || time : time;=0A=
		type =3D type || "fx";=0A=
=0A=
		return this.queue( type, function() {=0A=
			var elem =3D this;=0A=
			setTimeout(function() {=0A=
				jQuery.dequeue( elem, type );=0A=
			}, time );=0A=
		});=0A=
	},=0A=
=0A=
	clearQueue: function( type ) {=0A=
		return this.queue( type || "fx", [] );=0A=
	}=0A=
});=0A=
var rclass =3D /[\n\t]/g,=0A=
	rspace =3D /\s+/,=0A=
	rreturn =3D /\r/g,=0A=
	rspecialurl =3D /href|src|style/,=0A=
	rtype =3D /(button|input)/i,=0A=
	rfocusable =3D /(button|input|object|select|textarea)/i,=0A=
	rclickable =3D /^(a|area)$/i,=0A=
	rradiocheck =3D /radio|checkbox/;=0A=
=0A=
jQuery.fn.extend({=0A=
	attr: function( name, value ) {=0A=
		return access( this, name, value, true, jQuery.attr );=0A=
	},=0A=
=0A=
	removeAttr: function( name, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.attr( this, name, "" );=0A=
			if ( this.nodeType =3D=3D=3D 1 ) {=0A=
				this.removeAttribute( name );=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	addClass: function( value ) {=0A=
		if ( jQuery.isFunction(value) ) {=0A=
			return this.each(function(i) {=0A=
				var self =3D jQuery(this);=0A=
				self.addClass( value.call(this, i, self.attr("class")) );=0A=
			});=0A=
		}=0A=
=0A=
		if ( value && typeof value =3D=3D=3D "string" ) {=0A=
			var classNames =3D (value || "").split( rspace );=0A=
=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				var elem =3D this[i];=0A=
=0A=
				if ( elem.nodeType =3D=3D=3D 1 ) {=0A=
					if ( !elem.className ) {=0A=
						elem.className =3D value;=0A=
=0A=
					} else {=0A=
						var className =3D " " + elem.className + " ", setClass =3D =
elem.className;=0A=
						for ( var c =3D 0, cl =3D classNames.length; c < cl; c++ ) {=0A=
							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {=0A=
								setClass +=3D " " + classNames[c];=0A=
							}=0A=
						}=0A=
						elem.className =3D jQuery.trim( setClass );=0A=
					}=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	removeClass: function( value ) {=0A=
		if ( jQuery.isFunction(value) ) {=0A=
			return this.each(function(i) {=0A=
				var self =3D jQuery(this);=0A=
				self.removeClass( value.call(this, i, self.attr("class")) );=0A=
			});=0A=
		}=0A=
=0A=
		if ( (value && typeof value =3D=3D=3D "string") || value =3D=3D=3D =
undefined ) {=0A=
			var classNames =3D (value || "").split(rspace);=0A=
=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				var elem =3D this[i];=0A=
=0A=
				if ( elem.nodeType =3D=3D=3D 1 && elem.className ) {=0A=
					if ( value ) {=0A=
						var className =3D (" " + elem.className + " ").replace(rclass, " =
");=0A=
						for ( var c =3D 0, cl =3D classNames.length; c < cl; c++ ) {=0A=
							className =3D className.replace(" " + classNames[c] + " ", " ");=0A=
						}=0A=
						elem.className =3D jQuery.trim( className );=0A=
=0A=
					} else {=0A=
						elem.className =3D "";=0A=
					}=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	toggleClass: function( value, stateVal ) {=0A=
		var type =3D typeof value, isBool =3D typeof stateVal =3D=3D=3D =
"boolean";=0A=
=0A=
		if ( jQuery.isFunction( value ) ) {=0A=
			return this.each(function(i) {=0A=
				var self =3D jQuery(this);=0A=
				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), =
stateVal );=0A=
			});=0A=
		}=0A=
=0A=
		return this.each(function() {=0A=
			if ( type =3D=3D=3D "string" ) {=0A=
				// toggle individual class names=0A=
				var className, i =3D 0, self =3D jQuery(this),=0A=
					state =3D stateVal,=0A=
					classNames =3D value.split( rspace );=0A=
=0A=
				while ( (className =3D classNames[ i++ ]) ) {=0A=
					// check each className given, space seperated list=0A=
					state =3D isBool ? state : !self.hasClass( className );=0A=
					self[ state ? "addClass" : "removeClass" ]( className );=0A=
				}=0A=
=0A=
			} else if ( type =3D=3D=3D "undefined" || type =3D=3D=3D "boolean" ) {=0A=
				if ( this.className ) {=0A=
					// store className if set=0A=
					jQuery.data( this, "__className__", this.className );=0A=
				}=0A=
=0A=
				// toggle whole className=0A=
				this.className =3D this.className || value =3D=3D=3D false ? "" : =
jQuery.data( this, "__className__" ) || "";=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	hasClass: function( selector ) {=0A=
		var className =3D " " + selector + " ";=0A=
		for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( =
className ) > -1 ) {=0A=
				return true;=0A=
			}=0A=
		}=0A=
=0A=
		return false;=0A=
	},=0A=
=0A=
	val: function( value ) {=0A=
		if ( value =3D=3D=3D undefined ) {=0A=
			var elem =3D this[0];=0A=
=0A=
			if ( elem ) {=0A=
				if ( jQuery.nodeName( elem, "option" ) ) {=0A=
					return (elem.attributes.value || {}).specified ? elem.value : =
elem.text;=0A=
				}=0A=
=0A=
				// We need to handle select boxes special=0A=
				if ( jQuery.nodeName( elem, "select" ) ) {=0A=
					var index =3D elem.selectedIndex,=0A=
						values =3D [],=0A=
						options =3D elem.options,=0A=
						one =3D elem.type =3D=3D=3D "select-one";=0A=
=0A=
					// Nothing was selected=0A=
					if ( index < 0 ) {=0A=
						return null;=0A=
					}=0A=
=0A=
					// Loop through all the selected options=0A=
					for ( var i =3D one ? index : 0, max =3D one ? index + 1 : =
options.length; i < max; i++ ) {=0A=
						var option =3D options[ i ];=0A=
=0A=
						if ( option.selected ) {=0A=
							// Get the specifc value for the option=0A=
							value =3D jQuery(option).val();=0A=
=0A=
							// We don't need an array for one selects=0A=
							if ( one ) {=0A=
								return value;=0A=
							}=0A=
=0A=
							// Multi-Selects return an array=0A=
							values.push( value );=0A=
						}=0A=
					}=0A=
=0A=
					return values;=0A=
				}=0A=
=0A=
				// Handle the case where in Webkit "" is returned instead of "on" if =
a value isn't specified=0A=
				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {=0A=
					return elem.getAttribute("value") =3D=3D=3D null ? "on" : =
elem.value;=0A=
				}=0A=
				=0A=
=0A=
				// Everything else, we just grab the value=0A=
				return (elem.value || "").replace(rreturn, "");=0A=
=0A=
			}=0A=
=0A=
			return undefined;=0A=
		}=0A=
=0A=
		var isFunction =3D jQuery.isFunction(value);=0A=
=0A=
		return this.each(function(i) {=0A=
			var self =3D jQuery(this), val =3D value;=0A=
=0A=
			if ( this.nodeType !=3D=3D 1 ) {=0A=
				return;=0A=
			}=0A=
=0A=
			if ( isFunction ) {=0A=
				val =3D value.call(this, i, self.val());=0A=
			}=0A=
=0A=
			// Typecast each time if the value is a Function and the appended=0A=
			// value is therefore different each time.=0A=
			if ( typeof val =3D=3D=3D "number" ) {=0A=
				val +=3D "";=0A=
			}=0A=
=0A=
			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {=0A=
				this.checked =3D jQuery.inArray( self.val(), val ) >=3D 0;=0A=
=0A=
			} else if ( jQuery.nodeName( this, "select" ) ) {=0A=
				var values =3D jQuery.makeArray(val);=0A=
=0A=
				jQuery( "option", this ).each(function() {=0A=
					this.selected =3D jQuery.inArray( jQuery(this).val(), values ) >=3D =
0;=0A=
				});=0A=
=0A=
				if ( !values.length ) {=0A=
					this.selectedIndex =3D -1;=0A=
				}=0A=
=0A=
			} else {=0A=
				this.value =3D val;=0A=
			}=0A=
		});=0A=
	}=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	attrFn: {=0A=
		val: true,=0A=
		css: true,=0A=
		html: true,=0A=
		text: true,=0A=
		data: true,=0A=
		width: true,=0A=
		height: true,=0A=
		offset: true=0A=
	},=0A=
		=0A=
	attr: function( elem, name, value, pass ) {=0A=
		// don't set attributes on text and comment nodes=0A=
		if ( !elem || elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 8 ) =
{=0A=
			return undefined;=0A=
		}=0A=
=0A=
		if ( pass && name in jQuery.attrFn ) {=0A=
			return jQuery(elem)[name](value);=0A=
		}=0A=
=0A=
		var notxml =3D elem.nodeType !=3D=3D 1 || !jQuery.isXMLDoc( elem ),=0A=
			// Whether we are setting (or getting)=0A=
			set =3D value !=3D=3D undefined;=0A=
=0A=
		// Try to normalize/fix the name=0A=
		name =3D notxml && jQuery.props[ name ] || name;=0A=
=0A=
		// Only do all the following if this is a node (faster for style)=0A=
		if ( elem.nodeType =3D=3D=3D 1 ) {=0A=
			// These attributes require special treatment=0A=
			var special =3D rspecialurl.test( name );=0A=
=0A=
			// Safari mis-reports the default selected property of an option=0A=
			// Accessing the parent's selectedIndex property fixes it=0A=
			if ( name =3D=3D=3D "selected" && !jQuery.support.optSelected ) {=0A=
				var parent =3D elem.parentNode;=0A=
				if ( parent ) {=0A=
					parent.selectedIndex;=0A=
	=0A=
					// Make sure that it also works with optgroups, see #5701=0A=
					if ( parent.parentNode ) {=0A=
						parent.parentNode.selectedIndex;=0A=
					}=0A=
				}=0A=
			}=0A=
=0A=
			// If applicable, access the attribute via the DOM 0 way=0A=
			if ( name in elem && notxml && !special ) {=0A=
				if ( set ) {=0A=
					// We can't allow the type property to be changed (since it causes =
problems in IE)=0A=
					if ( name =3D=3D=3D "type" && rtype.test( elem.nodeName ) && =
elem.parentNode ) {=0A=
						jQuery.error( "type property can't be changed" );=0A=
					}=0A=
=0A=
					elem[ name ] =3D value;=0A=
				}=0A=
=0A=
				// browsers index elements by id/name on forms, give priority to =
attributes.=0A=
				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) =
) {=0A=
					return elem.getAttributeNode( name ).nodeValue;=0A=
				}=0A=
=0A=
				// elem.tabIndex doesn't always return the correct value when it =
hasn't been explicitly set=0A=
				// =
http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabi=
ndex-values-with-javascript/=0A=
				if ( name =3D=3D=3D "tabIndex" ) {=0A=
					var attributeNode =3D elem.getAttributeNode( "tabIndex" );=0A=
=0A=
					return attributeNode && attributeNode.specified ?=0A=
						attributeNode.value :=0A=
						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName =
) && elem.href ?=0A=
							0 :=0A=
							undefined;=0A=
				}=0A=
=0A=
				return elem[ name ];=0A=
			}=0A=
=0A=
			if ( !jQuery.support.style && notxml && name =3D=3D=3D "style" ) {=0A=
				if ( set ) {=0A=
					elem.style.cssText =3D "" + value;=0A=
				}=0A=
=0A=
				return elem.style.cssText;=0A=
			}=0A=
=0A=
			if ( set ) {=0A=
				// convert the value to a string (all browsers do this but IE) see =
#1070=0A=
				elem.setAttribute( name, "" + value );=0A=
			}=0A=
=0A=
			var attr =3D !jQuery.support.hrefNormalized && notxml && special ?=0A=
					// Some attributes require a special call on IE=0A=
					elem.getAttribute( name, 2 ) :=0A=
					elem.getAttribute( name );=0A=
=0A=
			// Non-existent attributes return null, we normalize to undefined=0A=
			return attr =3D=3D=3D null ? undefined : attr;=0A=
		}=0A=
=0A=
		// elem is actually elem.style ... set the style=0A=
		// Using attr for specific style information is now deprecated. Use =
style instead.=0A=
		return jQuery.style( elem, name, value );=0A=
	}=0A=
});=0A=
var rnamespaces =3D /\.(.*)$/,=0A=
	fcleanup =3D function( nm ) {=0A=
		return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {=0A=
			return "\\" + ch;=0A=
		});=0A=
	};=0A=
=0A=
/*=0A=
 * A number of helper functions used for managing events.=0A=
 * Many of the ideas behind this code originated from=0A=
 * Dean Edwards' addEvent library.=0A=
 */=0A=
jQuery.event =3D {=0A=
=0A=
	// Bind an event to an element=0A=
	// Original by Dean Edwards=0A=
	add: function( elem, types, handler, data ) {=0A=
		if ( elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 8 ) {=0A=
			return;=0A=
		}=0A=
=0A=
		// For whatever reason, IE has trouble passing the window object=0A=
		// around, causing it to be cloned in the process=0A=
		if ( elem.setInterval && ( elem !=3D=3D window && !elem.frameElement ) =
) {=0A=
			elem =3D window;=0A=
		}=0A=
=0A=
		var handleObjIn, handleObj;=0A=
=0A=
		if ( handler.handler ) {=0A=
			handleObjIn =3D handler;=0A=
			handler =3D handleObjIn.handler;=0A=
		}=0A=
=0A=
		// Make sure that the function being executed has a unique ID=0A=
		if ( !handler.guid ) {=0A=
			handler.guid =3D jQuery.guid++;=0A=
		}=0A=
=0A=
		// Init the element's event structure=0A=
		var elemData =3D jQuery.data( elem );=0A=
=0A=
		// If no elemData is found then we must be trying to bind to one of the=0A=
		// banned noData elements=0A=
		if ( !elemData ) {=0A=
			return;=0A=
		}=0A=
=0A=
		var events =3D elemData.events =3D elemData.events || {},=0A=
			eventHandle =3D elemData.handle, eventHandle;=0A=
=0A=
		if ( !eventHandle ) {=0A=
			elemData.handle =3D eventHandle =3D function() {=0A=
				// Handle the second event of a trigger and when=0A=
				// an event is called after a page has unloaded=0A=
				return typeof jQuery !=3D=3D "undefined" && !jQuery.event.triggered ?=0A=
					jQuery.event.handle.apply( eventHandle.elem, arguments ) :=0A=
					undefined;=0A=
			};=0A=
		}=0A=
=0A=
		// Add elem as a property of the handle function=0A=
		// This is to prevent a memory leak with non-native events in IE.=0A=
		eventHandle.elem =3D elem;=0A=
=0A=
		// Handle multiple events separated by a space=0A=
		// jQuery(...).bind("mouseover mouseout", fn);=0A=
		types =3D types.split(" ");=0A=
=0A=
		var type, i =3D 0, namespaces;=0A=
=0A=
		while ( (type =3D types[ i++ ]) ) {=0A=
			handleObj =3D handleObjIn ?=0A=
				jQuery.extend({}, handleObjIn) :=0A=
				{ handler: handler, data: data };=0A=
=0A=
			// Namespaced event handlers=0A=
			if ( type.indexOf(".") > -1 ) {=0A=
				namespaces =3D type.split(".");=0A=
				type =3D namespaces.shift();=0A=
				handleObj.namespace =3D namespaces.slice(0).sort().join(".");=0A=
=0A=
			} else {=0A=
				namespaces =3D [];=0A=
				handleObj.namespace =3D "";=0A=
			}=0A=
=0A=
			handleObj.type =3D type;=0A=
			handleObj.guid =3D handler.guid;=0A=
=0A=
			// Get the current list of functions bound to this event=0A=
			var handlers =3D events[ type ],=0A=
				special =3D jQuery.event.special[ type ] || {};=0A=
=0A=
			// Init the event handler queue=0A=
			if ( !handlers ) {=0A=
				handlers =3D events[ type ] =3D [];=0A=
=0A=
				// Check for a special event handler=0A=
				// Only use addEventListener/attachEvent if the special=0A=
				// events handler returns false=0A=
				if ( !special.setup || special.setup.call( elem, data, namespaces, =
eventHandle ) =3D=3D=3D false ) {=0A=
					// Bind the global event handler to the element=0A=
					if ( elem.addEventListener ) {=0A=
						elem.addEventListener( type, eventHandle, false );=0A=
=0A=
					} else if ( elem.attachEvent ) {=0A=
						elem.attachEvent( "on" + type, eventHandle );=0A=
					}=0A=
				}=0A=
			}=0A=
			=0A=
			if ( special.add ) { =0A=
				special.add.call( elem, handleObj ); =0A=
=0A=
				if ( !handleObj.handler.guid ) {=0A=
					handleObj.handler.guid =3D handler.guid;=0A=
				}=0A=
			}=0A=
=0A=
			// Add the function to the element's handler list=0A=
			handlers.push( handleObj );=0A=
=0A=
			// Keep track of which events have been used, for global triggering=0A=
			jQuery.event.global[ type ] =3D true;=0A=
		}=0A=
=0A=
		// Nullify elem to prevent memory leaks in IE=0A=
		elem =3D null;=0A=
	},=0A=
=0A=
	global: {},=0A=
=0A=
	// Detach an event or set of events from an element=0A=
	remove: function( elem, types, handler, pos ) {=0A=
		// don't do events on text and comment nodes=0A=
		if ( elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 8 ) {=0A=
			return;=0A=
		}=0A=
=0A=
		var ret, type, fn, i =3D 0, all, namespaces, namespace, special, =
eventType, handleObj, origType,=0A=
			elemData =3D jQuery.data( elem ),=0A=
			events =3D elemData && elemData.events;=0A=
=0A=
		if ( !elemData || !events ) {=0A=
			return;=0A=
		}=0A=
=0A=
		// types is actually an event object here=0A=
		if ( types && types.type ) {=0A=
			handler =3D types.handler;=0A=
			types =3D types.type;=0A=
		}=0A=
=0A=
		// Unbind all events for the element=0A=
		if ( !types || typeof types =3D=3D=3D "string" && types.charAt(0) =
=3D=3D=3D "." ) {=0A=
			types =3D types || "";=0A=
=0A=
			for ( type in events ) {=0A=
				jQuery.event.remove( elem, type + types );=0A=
			}=0A=
=0A=
			return;=0A=
		}=0A=
=0A=
		// Handle multiple events separated by a space=0A=
		// jQuery(...).unbind("mouseover mouseout", fn);=0A=
		types =3D types.split(" ");=0A=
=0A=
		while ( (type =3D types[ i++ ]) ) {=0A=
			origType =3D type;=0A=
			handleObj =3D null;=0A=
			all =3D type.indexOf(".") < 0;=0A=
			namespaces =3D [];=0A=
=0A=
			if ( !all ) {=0A=
				// Namespaced event handlers=0A=
				namespaces =3D type.split(".");=0A=
				type =3D namespaces.shift();=0A=
=0A=
				namespace =3D new RegExp("(^|\\.)" + =0A=
					jQuery.map( namespaces.slice(0).sort(), fcleanup =
).join("\\.(?:.*\\.)?") + "(\\.|$)")=0A=
			}=0A=
=0A=
			eventType =3D events[ type ];=0A=
=0A=
			if ( !eventType ) {=0A=
				continue;=0A=
			}=0A=
=0A=
			if ( !handler ) {=0A=
				for ( var j =3D 0; j < eventType.length; j++ ) {=0A=
					handleObj =3D eventType[ j ];=0A=
=0A=
					if ( all || namespace.test( handleObj.namespace ) ) {=0A=
						jQuery.event.remove( elem, origType, handleObj.handler, j );=0A=
						eventType.splice( j--, 1 );=0A=
					}=0A=
				}=0A=
=0A=
				continue;=0A=
			}=0A=
=0A=
			special =3D jQuery.event.special[ type ] || {};=0A=
=0A=
			for ( var j =3D pos || 0; j < eventType.length; j++ ) {=0A=
				handleObj =3D eventType[ j ];=0A=
=0A=
				if ( handler.guid =3D=3D=3D handleObj.guid ) {=0A=
					// remove the given handler for the given type=0A=
					if ( all || namespace.test( handleObj.namespace ) ) {=0A=
						if ( pos =3D=3D null ) {=0A=
							eventType.splice( j--, 1 );=0A=
						}=0A=
=0A=
						if ( special.remove ) {=0A=
							special.remove.call( elem, handleObj );=0A=
						}=0A=
					}=0A=
=0A=
					if ( pos !=3D null ) {=0A=
						break;=0A=
					}=0A=
				}=0A=
			}=0A=
=0A=
			// remove generic event handler if no more handlers exist=0A=
			if ( eventType.length =3D=3D=3D 0 || pos !=3D null && =
eventType.length =3D=3D=3D 1 ) {=0A=
				if ( !special.teardown || special.teardown.call( elem, namespaces ) =
=3D=3D=3D false ) {=0A=
					removeEvent( elem, type, elemData.handle );=0A=
				}=0A=
=0A=
				ret =3D null;=0A=
				delete events[ type ];=0A=
			}=0A=
		}=0A=
=0A=
		// Remove the expando if it's no longer used=0A=
		if ( jQuery.isEmptyObject( events ) ) {=0A=
			var handle =3D elemData.handle;=0A=
			if ( handle ) {=0A=
				handle.elem =3D null;=0A=
			}=0A=
=0A=
			delete elemData.events;=0A=
			delete elemData.handle;=0A=
=0A=
			if ( jQuery.isEmptyObject( elemData ) ) {=0A=
				jQuery.removeData( elem );=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
	// bubbling is internal=0A=
	trigger: function( event, data, elem /*, bubbling */ ) {=0A=
		// Event object or event type=0A=
		var type =3D event.type || event,=0A=
			bubbling =3D arguments[3];=0A=
=0A=
		if ( !bubbling ) {=0A=
			event =3D typeof event =3D=3D=3D "object" ?=0A=
				// jQuery.Event object=0A=
				event[expando] ? event :=0A=
				// Object literal=0A=
				jQuery.extend( jQuery.Event(type), event ) :=0A=
				// Just the event type (string)=0A=
				jQuery.Event(type);=0A=
=0A=
			if ( type.indexOf("!") >=3D 0 ) {=0A=
				event.type =3D type =3D type.slice(0, -1);=0A=
				event.exclusive =3D true;=0A=
			}=0A=
=0A=
			// Handle a global trigger=0A=
			if ( !elem ) {=0A=
				// Don't bubble custom events when global (to avoid too much =
overhead)=0A=
				event.stopPropagation();=0A=
=0A=
				// Only trigger if we've ever bound an event for it=0A=
				if ( jQuery.event.global[ type ] ) {=0A=
					jQuery.each( jQuery.cache, function() {=0A=
						if ( this.events && this.events[type] ) {=0A=
							jQuery.event.trigger( event, data, this.handle.elem );=0A=
						}=0A=
					});=0A=
				}=0A=
			}=0A=
=0A=
			// Handle triggering a single element=0A=
=0A=
			// don't do events on text and comment nodes=0A=
			if ( !elem || elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 8 =
) {=0A=
				return undefined;=0A=
			}=0A=
=0A=
			// Clean up in case it is reused=0A=
			event.result =3D undefined;=0A=
			event.target =3D elem;=0A=
=0A=
			// Clone the incoming data, if any=0A=
			data =3D jQuery.makeArray( data );=0A=
			data.unshift( event );=0A=
		}=0A=
=0A=
		event.currentTarget =3D elem;=0A=
=0A=
		// Trigger the event, it is assumed that "handle" is a function=0A=
		var handle =3D jQuery.data( elem, "handle" );=0A=
		if ( handle ) {=0A=
			handle.apply( elem, data );=0A=
		}=0A=
=0A=
		var parent =3D elem.parentNode || elem.ownerDocument;=0A=
=0A=
		// Trigger an inline bound script=0A=
		try {=0A=
			if ( !(elem && elem.nodeName && =
jQuery.noData[elem.nodeName.toLowerCase()]) ) {=0A=
				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) =
=3D=3D=3D false ) {=0A=
					event.result =3D false;=0A=
				}=0A=
			}=0A=
=0A=
		// prevent IE from throwing an error for some elements with some event =
types, see #3533=0A=
		} catch (e) {}=0A=
=0A=
		if ( !event.isPropagationStopped() && parent ) {=0A=
			jQuery.event.trigger( event, data, parent, true );=0A=
=0A=
		} else if ( !event.isDefaultPrevented() ) {=0A=
			var target =3D event.target, old,=0A=
				isClick =3D jQuery.nodeName(target, "a") && type =3D=3D=3D "click",=0A=
				special =3D jQuery.event.special[ type ] || {};=0A=
=0A=
			if ( (!special._default || special._default.call( elem, event ) =
=3D=3D=3D false) && =0A=
				!isClick && !(target && target.nodeName && =
jQuery.noData[target.nodeName.toLowerCase()]) ) {=0A=
=0A=
				try {=0A=
					if ( target[ type ] ) {=0A=
						// Make sure that we don't accidentally re-trigger the onFOO events=0A=
						old =3D target[ "on" + type ];=0A=
=0A=
						if ( old ) {=0A=
							target[ "on" + type ] =3D null;=0A=
						}=0A=
=0A=
						jQuery.event.triggered =3D true;=0A=
						target[ type ]();=0A=
					}=0A=
=0A=
				// prevent IE from throwing an error for some elements with some =
event types, see #3533=0A=
				} catch (e) {}=0A=
=0A=
				if ( old ) {=0A=
					target[ "on" + type ] =3D old;=0A=
				}=0A=
=0A=
				jQuery.event.triggered =3D false;=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
	handle: function( event ) {=0A=
		var all, handlers, namespaces, namespace, events;=0A=
=0A=
		event =3D arguments[0] =3D jQuery.event.fix( event || window.event );=0A=
		event.currentTarget =3D this;=0A=
=0A=
		// Namespaced event handlers=0A=
		all =3D event.type.indexOf(".") < 0 && !event.exclusive;=0A=
=0A=
		if ( !all ) {=0A=
			namespaces =3D event.type.split(".");=0A=
			event.type =3D namespaces.shift();=0A=
			namespace =3D new RegExp("(^|\\.)" + =
namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");=0A=
		}=0A=
=0A=
		var events =3D jQuery.data(this, "events"), handlers =3D events[ =
event.type ];=0A=
=0A=
		if ( events && handlers ) {=0A=
			// Clone the handlers to prevent manipulation=0A=
			handlers =3D handlers.slice(0);=0A=
=0A=
			for ( var j =3D 0, l =3D handlers.length; j < l; j++ ) {=0A=
				var handleObj =3D handlers[ j ];=0A=
=0A=
				// Filter the functions by class=0A=
				if ( all || namespace.test( handleObj.namespace ) ) {=0A=
					// Pass in a reference to the handler function itself=0A=
					// So that we can later remove it=0A=
					event.handler =3D handleObj.handler;=0A=
					event.data =3D handleObj.data;=0A=
					event.handleObj =3D handleObj;=0A=
	=0A=
					var ret =3D handleObj.handler.apply( this, arguments );=0A=
=0A=
					if ( ret !=3D=3D undefined ) {=0A=
						event.result =3D ret;=0A=
						if ( ret =3D=3D=3D false ) {=0A=
							event.preventDefault();=0A=
							event.stopPropagation();=0A=
						}=0A=
					}=0A=
=0A=
					if ( event.isImmediatePropagationStopped() ) {=0A=
						break;=0A=
					}=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return event.result;=0A=
	},=0A=
=0A=
	props: "altKey attrChange attrName bubbles button cancelable charCode =
clientX clientY ctrlKey currentTarget data detail eventPhase fromElement =
handler keyCode layerX layerY metaKey newValue offsetX offsetY =
originalTarget pageX pageY prevValue relatedNode relatedTarget screenX =
screenY shiftKey srcElement target toElement view wheelDelta =
which".split(" "),=0A=
=0A=
	fix: function( event ) {=0A=
		if ( event[ expando ] ) {=0A=
			return event;=0A=
		}=0A=
=0A=
		// store a copy of the original event object=0A=
		// and "clone" to set read-only properties=0A=
		var originalEvent =3D event;=0A=
		event =3D jQuery.Event( originalEvent );=0A=
=0A=
		for ( var i =3D this.props.length, prop; i; ) {=0A=
			prop =3D this.props[ --i ];=0A=
			event[ prop ] =3D originalEvent[ prop ];=0A=
		}=0A=
=0A=
		// Fix target property, if necessary=0A=
		if ( !event.target ) {=0A=
			event.target =3D event.srcElement || document; // Fixes #1925 where =
srcElement might not be defined either=0A=
		}=0A=
=0A=
		// check if target is a textnode (safari)=0A=
		if ( event.target.nodeType =3D=3D=3D 3 ) {=0A=
			event.target =3D event.target.parentNode;=0A=
		}=0A=
=0A=
		// Add relatedTarget, if necessary=0A=
		if ( !event.relatedTarget && event.fromElement ) {=0A=
			event.relatedTarget =3D event.fromElement =3D=3D=3D event.target ? =
event.toElement : event.fromElement;=0A=
		}=0A=
=0A=
		// Calculate pageX/Y if missing and clientX/Y available=0A=
		if ( event.pageX =3D=3D null && event.clientX !=3D null ) {=0A=
			var doc =3D document.documentElement, body =3D document.body;=0A=
			event.pageX =3D event.clientX + (doc && doc.scrollLeft || body && =
body.scrollLeft || 0) - (doc && doc.clientLeft || body && =
body.clientLeft || 0);=0A=
			event.pageY =3D event.clientY + (doc && doc.scrollTop  || body && =
body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop =
 || 0);=0A=
		}=0A=
=0A=
		// Add which for key events=0A=
		if ( !event.which && ((event.charCode || event.charCode =3D=3D=3D 0) ? =
event.charCode : event.keyCode) ) {=0A=
			event.which =3D event.charCode || event.keyCode;=0A=
		}=0A=
=0A=
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for =
Macs)=0A=
		if ( !event.metaKey && event.ctrlKey ) {=0A=
			event.metaKey =3D event.ctrlKey;=0A=
		}=0A=
=0A=
		// Add which for click: 1 =3D=3D=3D left; 2 =3D=3D=3D middle; 3 =
=3D=3D=3D right=0A=
		// Note: button is not normalized, so don't use it=0A=
		if ( !event.which && event.button !=3D=3D undefined ) {=0A=
			event.which =3D (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( =
event.button & 4 ? 2 : 0 ) ));=0A=
		}=0A=
=0A=
		return event;=0A=
	},=0A=
=0A=
	// Deprecated, use jQuery.guid instead=0A=
	guid: 1E8,=0A=
=0A=
	// Deprecated, use jQuery.proxy instead=0A=
	proxy: jQuery.proxy,=0A=
=0A=
	special: {=0A=
		ready: {=0A=
			// Make sure the ready event is setup=0A=
			setup: jQuery.bindReady,=0A=
			teardown: jQuery.noop=0A=
		},=0A=
=0A=
		live: {=0A=
			add: function( handleObj ) {=0A=
				jQuery.event.add( this, handleObj.origType, jQuery.extend({}, =
handleObj, {handler: liveHandler}) ); =0A=
			},=0A=
=0A=
			remove: function( handleObj ) {=0A=
				var remove =3D true,=0A=
					type =3D handleObj.origType.replace(rnamespaces, "");=0A=
				=0A=
				jQuery.each( jQuery.data(this, "events").live || [], function() {=0A=
					if ( type =3D=3D=3D this.origType.replace(rnamespaces, "") ) {=0A=
						remove =3D false;=0A=
						return false;=0A=
					}=0A=
				});=0A=
=0A=
				if ( remove ) {=0A=
					jQuery.event.remove( this, handleObj.origType, liveHandler );=0A=
				}=0A=
			}=0A=
=0A=
		},=0A=
=0A=
		beforeunload: {=0A=
			setup: function( data, namespaces, eventHandle ) {=0A=
				// We only want to do this special case on windows=0A=
				if ( this.setInterval ) {=0A=
					this.onbeforeunload =3D eventHandle;=0A=
				}=0A=
=0A=
				return false;=0A=
			},=0A=
			teardown: function( namespaces, eventHandle ) {=0A=
				if ( this.onbeforeunload =3D=3D=3D eventHandle ) {=0A=
					this.onbeforeunload =3D null;=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
var removeEvent =3D document.removeEventListener ?=0A=
	function( elem, type, handle ) {=0A=
		elem.removeEventListener( type, handle, false );=0A=
	} : =0A=
	function( elem, type, handle ) {=0A=
		elem.detachEvent( "on" + type, handle );=0A=
	};=0A=
=0A=
jQuery.Event =3D function( src ) {=0A=
	// Allow instantiation without the 'new' keyword=0A=
	if ( !this.preventDefault ) {=0A=
		return new jQuery.Event( src );=0A=
	}=0A=
=0A=
	// Event object=0A=
	if ( src && src.type ) {=0A=
		this.originalEvent =3D src;=0A=
		this.type =3D src.type;=0A=
	// Event type=0A=
	} else {=0A=
		this.type =3D src;=0A=
	}=0A=
=0A=
	// timeStamp is buggy for some events on Firefox(#3843)=0A=
	// So we won't rely on the native value=0A=
	this.timeStamp =3D now();=0A=
=0A=
	// Mark it as fixed=0A=
	this[ expando ] =3D true;=0A=
};=0A=
=0A=
function returnFalse() {=0A=
	return false;=0A=
}=0A=
function returnTrue() {=0A=
	return true;=0A=
}=0A=
=0A=
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript =
Language Binding=0A=
// =
http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-bind=
ing.html=0A=
jQuery.Event.prototype =3D {=0A=
	preventDefault: function() {=0A=
		this.isDefaultPrevented =3D returnTrue;=0A=
=0A=
		var e =3D this.originalEvent;=0A=
		if ( !e ) {=0A=
			return;=0A=
		}=0A=
		=0A=
		// if preventDefault exists run it on the original event=0A=
		if ( e.preventDefault ) {=0A=
			e.preventDefault();=0A=
		}=0A=
		// otherwise set the returnValue property of the original event to =
false (IE)=0A=
		e.returnValue =3D false;=0A=
	},=0A=
	stopPropagation: function() {=0A=
		this.isPropagationStopped =3D returnTrue;=0A=
=0A=
		var e =3D this.originalEvent;=0A=
		if ( !e ) {=0A=
			return;=0A=
		}=0A=
		// if stopPropagation exists run it on the original event=0A=
		if ( e.stopPropagation ) {=0A=
			e.stopPropagation();=0A=
		}=0A=
		// otherwise set the cancelBubble property of the original event to =
true (IE)=0A=
		e.cancelBubble =3D true;=0A=
	},=0A=
	stopImmediatePropagation: function() {=0A=
		this.isImmediatePropagationStopped =3D returnTrue;=0A=
		this.stopPropagation();=0A=
	},=0A=
	isDefaultPrevented: returnFalse,=0A=
	isPropagationStopped: returnFalse,=0A=
	isImmediatePropagationStopped: returnFalse=0A=
};=0A=
=0A=
// Checks if an event happened on an element within another element=0A=
// Used in jQuery.event.special.mouseenter and mouseleave handlers=0A=
var withinElement =3D function( event ) {=0A=
	// Check if mouse(over|out) are still within the same parent element=0A=
	var parent =3D event.relatedTarget;=0A=
=0A=
	// Firefox sometimes assigns relatedTarget a XUL element=0A=
	// which we cannot access the parentNode property of=0A=
	try {=0A=
		// Traverse up the tree=0A=
		while ( parent && parent !=3D=3D this ) {=0A=
			parent =3D parent.parentNode;=0A=
		}=0A=
=0A=
		if ( parent !=3D=3D this ) {=0A=
			// set the correct event type=0A=
			event.type =3D event.data;=0A=
=0A=
			// handle event if we actually just moused on to a non sub-element=0A=
			jQuery.event.handle.apply( this, arguments );=0A=
		}=0A=
=0A=
	// assuming we've left the element since we most likely mousedover a =
xul element=0A=
	} catch(e) { }=0A=
},=0A=
=0A=
// In case of event delegation, we only need to rename the event.type,=0A=
// liveHandler will take care of the rest.=0A=
delegate =3D function( event ) {=0A=
	event.type =3D event.data;=0A=
	jQuery.event.handle.apply( this, arguments );=0A=
};=0A=
=0A=
// Create mouseenter and mouseleave events=0A=
jQuery.each({=0A=
	mouseenter: "mouseover",=0A=
	mouseleave: "mouseout"=0A=
}, function( orig, fix ) {=0A=
	jQuery.event.special[ orig ] =3D {=0A=
		setup: function( data ) {=0A=
			jQuery.event.add( this, fix, data && data.selector ? delegate : =
withinElement, orig );=0A=
		},=0A=
		teardown: function( data ) {=0A=
			jQuery.event.remove( this, fix, data && data.selector ? delegate : =
withinElement );=0A=
		}=0A=
	};=0A=
});=0A=
=0A=
// submit delegation=0A=
if ( !jQuery.support.submitBubbles ) {=0A=
=0A=
	jQuery.event.special.submit =3D {=0A=
		setup: function( data, namespaces ) {=0A=
			if ( this.nodeName.toLowerCase() !=3D=3D "form" ) {=0A=
				jQuery.event.add(this, "click.specialSubmit", function( e ) {=0A=
					var elem =3D e.target, type =3D elem.type;=0A=
=0A=
					if ( (type =3D=3D=3D "submit" || type =3D=3D=3D "image") && jQuery( =
elem ).closest("form").length ) {=0A=
						return trigger( "submit", this, arguments );=0A=
					}=0A=
				});=0A=
	 =0A=
				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {=0A=
					var elem =3D e.target, type =3D elem.type;=0A=
=0A=
					if ( (type =3D=3D=3D "text" || type =3D=3D=3D "password") && =
jQuery( elem ).closest("form").length && e.keyCode =3D=3D=3D 13 ) {=0A=
						return trigger( "submit", this, arguments );=0A=
					}=0A=
				});=0A=
=0A=
			} else {=0A=
				return false;=0A=
			}=0A=
		},=0A=
=0A=
		teardown: function( namespaces ) {=0A=
			jQuery.event.remove( this, ".specialSubmit" );=0A=
		}=0A=
	};=0A=
=0A=
}=0A=
=0A=
// change delegation, happens here so we have bind.=0A=
if ( !jQuery.support.changeBubbles ) {=0A=
=0A=
	var formElems =3D /textarea|input|select/i,=0A=
=0A=
	changeFilters,=0A=
=0A=
	getVal =3D function( elem ) {=0A=
		var type =3D elem.type, val =3D elem.value;=0A=
=0A=
		if ( type =3D=3D=3D "radio" || type =3D=3D=3D "checkbox" ) {=0A=
			val =3D elem.checked;=0A=
=0A=
		} else if ( type =3D=3D=3D "select-multiple" ) {=0A=
			val =3D elem.selectedIndex > -1 ?=0A=
				jQuery.map( elem.options, function( elem ) {=0A=
					return elem.selected;=0A=
				}).join("-") :=0A=
				"";=0A=
=0A=
		} else if ( elem.nodeName.toLowerCase() =3D=3D=3D "select" ) {=0A=
			val =3D elem.selectedIndex;=0A=
		}=0A=
=0A=
		return val;=0A=
	},=0A=
=0A=
	testChange =3D function testChange( e ) {=0A=
		var elem =3D e.target, data, val;=0A=
=0A=
		if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {=0A=
			return;=0A=
		}=0A=
=0A=
		data =3D jQuery.data( elem, "_change_data" );=0A=
		val =3D getVal(elem);=0A=
=0A=
		// the current data will be also retrieved by beforeactivate=0A=
		if ( e.type !=3D=3D "focusout" || elem.type !=3D=3D "radio" ) {=0A=
			jQuery.data( elem, "_change_data", val );=0A=
		}=0A=
		=0A=
		if ( data =3D=3D=3D undefined || val =3D=3D=3D data ) {=0A=
			return;=0A=
		}=0A=
=0A=
		if ( data !=3D null || val ) {=0A=
			e.type =3D "change";=0A=
			return jQuery.event.trigger( e, arguments[1], elem );=0A=
		}=0A=
	};=0A=
=0A=
	jQuery.event.special.change =3D {=0A=
		filters: {=0A=
			focusout: testChange, =0A=
=0A=
			click: function( e ) {=0A=
				var elem =3D e.target, type =3D elem.type;=0A=
=0A=
				if ( type =3D=3D=3D "radio" || type =3D=3D=3D "checkbox" || =
elem.nodeName.toLowerCase() =3D=3D=3D "select" ) {=0A=
					return testChange.call( this, e );=0A=
				}=0A=
			},=0A=
=0A=
			// Change has to be called before submit=0A=
			// Keydown will be called before keypress, which is used in =
submit-event delegation=0A=
			keydown: function( e ) {=0A=
				var elem =3D e.target, type =3D elem.type;=0A=
=0A=
				if ( (e.keyCode =3D=3D=3D 13 && elem.nodeName.toLowerCase() !=3D=3D =
"textarea") ||=0A=
					(e.keyCode =3D=3D=3D 32 && (type =3D=3D=3D "checkbox" || type =
=3D=3D=3D "radio")) ||=0A=
					type =3D=3D=3D "select-multiple" ) {=0A=
					return testChange.call( this, e );=0A=
				}=0A=
			},=0A=
=0A=
			// Beforeactivate happens also before the previous element is blurred=0A=
			// with this event you can't trigger a change event, but you can store=0A=
			// information/focus[in] is not needed anymore=0A=
			beforeactivate: function( e ) {=0A=
				var elem =3D e.target;=0A=
				jQuery.data( elem, "_change_data", getVal(elem) );=0A=
			}=0A=
		},=0A=
=0A=
		setup: function( data, namespaces ) {=0A=
			if ( this.type =3D=3D=3D "file" ) {=0A=
				return false;=0A=
			}=0A=
=0A=
			for ( var type in changeFilters ) {=0A=
				jQuery.event.add( this, type + ".specialChange", changeFilters[type] =
);=0A=
			}=0A=
=0A=
			return formElems.test( this.nodeName );=0A=
		},=0A=
=0A=
		teardown: function( namespaces ) {=0A=
			jQuery.event.remove( this, ".specialChange" );=0A=
=0A=
			return formElems.test( this.nodeName );=0A=
		}=0A=
	};=0A=
=0A=
	changeFilters =3D jQuery.event.special.change.filters;=0A=
}=0A=
=0A=
function trigger( type, elem, args ) {=0A=
	args[0].type =3D type;=0A=
	return jQuery.event.handle.apply( elem, args );=0A=
}=0A=
=0A=
// Create "bubbling" focus and blur events=0A=
if ( document.addEventListener ) {=0A=
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix =
) {=0A=
		jQuery.event.special[ fix ] =3D {=0A=
			setup: function() {=0A=
				this.addEventListener( orig, handler, true );=0A=
			}, =0A=
			teardown: function() { =0A=
				this.removeEventListener( orig, handler, true );=0A=
			}=0A=
		};=0A=
=0A=
		function handler( e ) { =0A=
			e =3D jQuery.event.fix( e );=0A=
			e.type =3D fix;=0A=
			return jQuery.event.handle.call( this, e );=0A=
		}=0A=
	});=0A=
}=0A=
=0A=
jQuery.each(["bind", "one"], function( i, name ) {=0A=
	jQuery.fn[ name ] =3D function( type, data, fn ) {=0A=
		// Handle object literals=0A=
		if ( typeof type =3D=3D=3D "object" ) {=0A=
			for ( var key in type ) {=0A=
				this[ name ](key, data, type[key], fn);=0A=
			}=0A=
			return this;=0A=
		}=0A=
		=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			fn =3D data;=0A=
			data =3D undefined;=0A=
		}=0A=
=0A=
		var handler =3D name =3D=3D=3D "one" ? jQuery.proxy( fn, function( =
event ) {=0A=
			jQuery( this ).unbind( event, handler );=0A=
			return fn.apply( this, arguments );=0A=
		}) : fn;=0A=
=0A=
		if ( type =3D=3D=3D "unload" && name !=3D=3D "one" ) {=0A=
			this.one( type, data, fn );=0A=
=0A=
		} else {=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				jQuery.event.add( this[i], type, handler, data );=0A=
			}=0A=
		}=0A=
=0A=
		return this;=0A=
	};=0A=
});=0A=
=0A=
jQuery.fn.extend({=0A=
	unbind: function( type, fn ) {=0A=
		// Handle object literals=0A=
		if ( typeof type =3D=3D=3D "object" && !type.preventDefault ) {=0A=
			for ( var key in type ) {=0A=
				this.unbind(key, type[key]);=0A=
			}=0A=
=0A=
		} else {=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				jQuery.event.remove( this[i], type, fn );=0A=
			}=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
	=0A=
	delegate: function( selector, types, data, fn ) {=0A=
		return this.live( types, data, fn, selector );=0A=
	},=0A=
	=0A=
	undelegate: function( selector, types, fn ) {=0A=
		if ( arguments.length =3D=3D=3D 0 ) {=0A=
				return this.unbind( "live" );=0A=
		=0A=
		} else {=0A=
			return this.die( types, null, fn, selector );=0A=
		}=0A=
	},=0A=
	=0A=
	trigger: function( type, data ) {=0A=
		return this.each(function() {=0A=
			jQuery.event.trigger( type, data, this );=0A=
		});=0A=
	},=0A=
=0A=
	triggerHandler: function( type, data ) {=0A=
		if ( this[0] ) {=0A=
			var event =3D jQuery.Event( type );=0A=
			event.preventDefault();=0A=
			event.stopPropagation();=0A=
			jQuery.event.trigger( event, data, this[0] );=0A=
			return event.result;=0A=
		}=0A=
	},=0A=
=0A=
	toggle: function( fn ) {=0A=
		// Save reference to arguments for access in closure=0A=
		var args =3D arguments, i =3D 1;=0A=
=0A=
		// link all the functions, so any of them can unbind this click handler=0A=
		while ( i < args.length ) {=0A=
			jQuery.proxy( fn, args[ i++ ] );=0A=
		}=0A=
=0A=
		return this.click( jQuery.proxy( fn, function( event ) {=0A=
			// Figure out which function to execute=0A=
			var lastToggle =3D ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 =
) % i;=0A=
			jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );=0A=
=0A=
			// Make sure that clicks stop=0A=
			event.preventDefault();=0A=
=0A=
			// and execute the function=0A=
			return args[ lastToggle ].apply( this, arguments ) || false;=0A=
		}));=0A=
	},=0A=
=0A=
	hover: function( fnOver, fnOut ) {=0A=
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );=0A=
	}=0A=
});=0A=
=0A=
var liveMap =3D {=0A=
	focus: "focusin",=0A=
	blur: "focusout",=0A=
	mouseenter: "mouseover",=0A=
	mouseleave: "mouseout"=0A=
};=0A=
=0A=
jQuery.each(["live", "die"], function( i, name ) {=0A=
	jQuery.fn[ name ] =3D function( types, data, fn, origSelector /* =
Internal Use Only */ ) {=0A=
		var type, i =3D 0, match, namespaces, preType,=0A=
			selector =3D origSelector || this.selector,=0A=
			context =3D origSelector ? this : jQuery( this.context );=0A=
=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			fn =3D data;=0A=
			data =3D undefined;=0A=
		}=0A=
=0A=
		types =3D (types || "").split(" ");=0A=
=0A=
		while ( (type =3D types[ i++ ]) !=3D null ) {=0A=
			match =3D rnamespaces.exec( type );=0A=
			namespaces =3D "";=0A=
=0A=
			if ( match )  {=0A=
				namespaces =3D match[0];=0A=
				type =3D type.replace( rnamespaces, "" );=0A=
			}=0A=
=0A=
			if ( type =3D=3D=3D "hover" ) {=0A=
				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );=0A=
				continue;=0A=
			}=0A=
=0A=
			preType =3D type;=0A=
=0A=
			if ( type =3D=3D=3D "focus" || type =3D=3D=3D "blur" ) {=0A=
				types.push( liveMap[ type ] + namespaces );=0A=
				type =3D type + namespaces;=0A=
=0A=
			} else {=0A=
				type =3D (liveMap[ type ] || type) + namespaces;=0A=
			}=0A=
=0A=
			if ( name =3D=3D=3D "live" ) {=0A=
				// bind live handler=0A=
				context.each(function(){=0A=
					jQuery.event.add( this, liveConvert( type, selector ),=0A=
						{ data: data, selector: selector, handler: fn, origType: type, =
origHandler: fn, preType: preType } );=0A=
				});=0A=
=0A=
			} else {=0A=
				// unbind live handler=0A=
				context.unbind( liveConvert( type, selector ), fn );=0A=
			}=0A=
		}=0A=
		=0A=
		return this;=0A=
	}=0A=
});=0A=
=0A=
function liveHandler( event ) {=0A=
	var stop, elems =3D [], selectors =3D [], args =3D arguments,=0A=
		related, match, handleObj, elem, j, i, l, data,=0A=
		events =3D jQuery.data( this, "events" );=0A=
=0A=
	// Make sure we avoid non-left-click bubbling in Firefox (#3861)=0A=
	if ( event.liveFired =3D=3D=3D this || !events || !events.live || =
event.button && event.type =3D=3D=3D "click" ) {=0A=
		return;=0A=
	}=0A=
=0A=
	event.liveFired =3D this;=0A=
=0A=
	var live =3D events.live.slice(0);=0A=
=0A=
	for ( j =3D 0; j < live.length; j++ ) {=0A=
		handleObj =3D live[j];=0A=
=0A=
		if ( handleObj.origType.replace( rnamespaces, "" ) =3D=3D=3D =
event.type ) {=0A=
			selectors.push( handleObj.selector );=0A=
=0A=
		} else {=0A=
			live.splice( j--, 1 );=0A=
		}=0A=
	}=0A=
=0A=
	match =3D jQuery( event.target ).closest( selectors, =
event.currentTarget );=0A=
=0A=
	for ( i =3D 0, l =3D match.length; i < l; i++ ) {=0A=
		for ( j =3D 0; j < live.length; j++ ) {=0A=
			handleObj =3D live[j];=0A=
=0A=
			if ( match[i].selector =3D=3D=3D handleObj.selector ) {=0A=
				elem =3D match[i].elem;=0A=
				related =3D null;=0A=
=0A=
				// Those two events require additional checking=0A=
				if ( handleObj.preType =3D=3D=3D "mouseenter" || handleObj.preType =
=3D=3D=3D "mouseleave" ) {=0A=
					related =3D jQuery( event.relatedTarget ).closest( =
handleObj.selector )[0];=0A=
				}=0A=
=0A=
				if ( !related || related !=3D=3D elem ) {=0A=
					elems.push({ elem: elem, handleObj: handleObj });=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	for ( i =3D 0, l =3D elems.length; i < l; i++ ) {=0A=
		match =3D elems[i];=0A=
		event.currentTarget =3D match.elem;=0A=
		event.data =3D match.handleObj.data;=0A=
		event.handleObj =3D match.handleObj;=0A=
=0A=
		if ( match.handleObj.origHandler.apply( match.elem, args ) =3D=3D=3D =
false ) {=0A=
			stop =3D false;=0A=
			break;=0A=
		}=0A=
	}=0A=
=0A=
	return stop;=0A=
}=0A=
=0A=
function liveConvert( type, selector ) {=0A=
	return "live." + (type && type !=3D=3D "*" ? type + "." : "") + =
selector.replace(/\./g, "`").replace(/ /g, "&");=0A=
}=0A=
=0A=
jQuery.each( ("blur focus focusin focusout load resize scroll unload =
click dblclick " +=0A=
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " =
+=0A=
	"change select submit keydown keypress keyup error").split(" "), =
function( i, name ) {=0A=
=0A=
	// Handle event binding=0A=
	jQuery.fn[ name ] =3D function( fn ) {=0A=
		return fn ? this.bind( name, fn ) : this.trigger( name );=0A=
	};=0A=
=0A=
	if ( jQuery.attrFn ) {=0A=
		jQuery.attrFn[ name ] =3D true;=0A=
	}=0A=
});=0A=
=0A=
// Prevent memory leaks in IE=0A=
// Window isn't included so as not to unbind existing unload events=0A=
// More info:=0A=
//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/=0A=
if ( window.attachEvent && !window.addEventListener ) {=0A=
	window.attachEvent("onunload", function() {=0A=
		for ( var id in jQuery.cache ) {=0A=
			if ( jQuery.cache[ id ].handle ) {=0A=
				// Try/Catch is to handle iframes being unloaded, see #4280=0A=
				try {=0A=
					jQuery.event.remove( jQuery.cache[ id ].handle.elem );=0A=
				} catch(e) {}=0A=
			}=0A=
		}=0A=
	});=0A=
}=0A=
/*!=0A=
 * Sizzle CSS Selector Engine - v1.0=0A=
 *  Copyright 2009, The Dojo Foundation=0A=
 *  Released under the MIT, BSD, and GPL Licenses.=0A=
 *  More information: http://sizzlejs.com/=0A=
 */=0A=
(function(){=0A=
=0A=
var chunker =3D =
/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+=
)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,=0A=
	done =3D 0,=0A=
	toString =3D Object.prototype.toString,=0A=
	hasDuplicate =3D false,=0A=
	baseHasDuplicate =3D true;=0A=
=0A=
// Here we check if the JavaScript engine is using some sort of=0A=
// optimization where it does not always call our comparision=0A=
// function. If that is the case, discard the hasDuplicate value.=0A=
//   Thus far that includes Google Chrome.=0A=
[0, 0].sort(function(){=0A=
	baseHasDuplicate =3D false;=0A=
	return 0;=0A=
});=0A=
=0A=
var Sizzle =3D function(selector, context, results, seed) {=0A=
	results =3D results || [];=0A=
	var origContext =3D context =3D context || document;=0A=
=0A=
	if ( context.nodeType !=3D=3D 1 && context.nodeType !=3D=3D 9 ) {=0A=
		return [];=0A=
	}=0A=
	=0A=
	if ( !selector || typeof selector !=3D=3D "string" ) {=0A=
		return results;=0A=
	}=0A=
=0A=
	var parts =3D [], m, set, checkSet, extra, prune =3D true, contextXML =
=3D isXML(context),=0A=
		soFar =3D selector;=0A=
	=0A=
	// Reset the position of the chunker regexp (start from head)=0A=
	while ( (chunker.exec(""), m =3D chunker.exec(soFar)) !=3D=3D null ) {=0A=
		soFar =3D m[3];=0A=
		=0A=
		parts.push( m[1] );=0A=
		=0A=
		if ( m[2] ) {=0A=
			extra =3D m[3];=0A=
			break;=0A=
		}=0A=
	}=0A=
=0A=
	if ( parts.length > 1 && origPOS.exec( selector ) ) {=0A=
		if ( parts.length =3D=3D=3D 2 && Expr.relative[ parts[0] ] ) {=0A=
			set =3D posProcess( parts[0] + parts[1], context );=0A=
		} else {=0A=
			set =3D Expr.relative[ parts[0] ] ?=0A=
				[ context ] :=0A=
				Sizzle( parts.shift(), context );=0A=
=0A=
			while ( parts.length ) {=0A=
				selector =3D parts.shift();=0A=
=0A=
				if ( Expr.relative[ selector ] ) {=0A=
					selector +=3D parts.shift();=0A=
				}=0A=
				=0A=
				set =3D posProcess( selector, set );=0A=
			}=0A=
		}=0A=
	} else {=0A=
		// Take a shortcut and set the context if the root selector is an ID=0A=
		// (but not if it'll be faster if the inner selector is an ID)=0A=
		if ( !seed && parts.length > 1 && context.nodeType =3D=3D=3D 9 && =
!contextXML &&=0A=
				Expr.match.ID.test(parts[0]) && =
!Expr.match.ID.test(parts[parts.length - 1]) ) {=0A=
			var ret =3D Sizzle.find( parts.shift(), context, contextXML );=0A=
			context =3D ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : =
ret.set[0];=0A=
		}=0A=
=0A=
		if ( context ) {=0A=
			var ret =3D seed ?=0A=
				{ expr: parts.pop(), set: makeArray(seed) } :=0A=
				Sizzle.find( parts.pop(), parts.length =3D=3D=3D 1 && (parts[0] =
=3D=3D=3D "~" || parts[0] =3D=3D=3D "+") && context.parentNode ? =
context.parentNode : context, contextXML );=0A=
			set =3D ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;=0A=
=0A=
			if ( parts.length > 0 ) {=0A=
				checkSet =3D makeArray(set);=0A=
			} else {=0A=
				prune =3D false;=0A=
			}=0A=
=0A=
			while ( parts.length ) {=0A=
				var cur =3D parts.pop(), pop =3D cur;=0A=
=0A=
				if ( !Expr.relative[ cur ] ) {=0A=
					cur =3D "";=0A=
				} else {=0A=
					pop =3D parts.pop();=0A=
				}=0A=
=0A=
				if ( pop =3D=3D null ) {=0A=
					pop =3D context;=0A=
				}=0A=
=0A=
				Expr.relative[ cur ]( checkSet, pop, contextXML );=0A=
			}=0A=
		} else {=0A=
			checkSet =3D parts =3D [];=0A=
		}=0A=
	}=0A=
=0A=
	if ( !checkSet ) {=0A=
		checkSet =3D set;=0A=
	}=0A=
=0A=
	if ( !checkSet ) {=0A=
		Sizzle.error( cur || selector );=0A=
	}=0A=
=0A=
	if ( toString.call(checkSet) =3D=3D=3D "[object Array]" ) {=0A=
		if ( !prune ) {=0A=
			results.push.apply( results, checkSet );=0A=
		} else if ( context && context.nodeType =3D=3D=3D 1 ) {=0A=
			for ( var i =3D 0; checkSet[i] !=3D null; i++ ) {=0A=
				if ( checkSet[i] && (checkSet[i] =3D=3D=3D true || =
checkSet[i].nodeType =3D=3D=3D 1 && contains(context, checkSet[i])) ) {=0A=
					results.push( set[i] );=0A=
				}=0A=
			}=0A=
		} else {=0A=
			for ( var i =3D 0; checkSet[i] !=3D null; i++ ) {=0A=
				if ( checkSet[i] && checkSet[i].nodeType =3D=3D=3D 1 ) {=0A=
					results.push( set[i] );=0A=
				}=0A=
			}=0A=
		}=0A=
	} else {=0A=
		makeArray( checkSet, results );=0A=
	}=0A=
=0A=
	if ( extra ) {=0A=
		Sizzle( extra, origContext, results, seed );=0A=
		Sizzle.uniqueSort( results );=0A=
	}=0A=
=0A=
	return results;=0A=
};=0A=
=0A=
Sizzle.uniqueSort =3D function(results){=0A=
	if ( sortOrder ) {=0A=
		hasDuplicate =3D baseHasDuplicate;=0A=
		results.sort(sortOrder);=0A=
=0A=
		if ( hasDuplicate ) {=0A=
			for ( var i =3D 1; i < results.length; i++ ) {=0A=
				if ( results[i] =3D=3D=3D results[i-1] ) {=0A=
					results.splice(i--, 1);=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	return results;=0A=
};=0A=
=0A=
Sizzle.matches =3D function(expr, set){=0A=
	return Sizzle(expr, null, null, set);=0A=
};=0A=
=0A=
Sizzle.find =3D function(expr, context, isXML){=0A=
	var set, match;=0A=
=0A=
	if ( !expr ) {=0A=
		return [];=0A=
	}=0A=
=0A=
	for ( var i =3D 0, l =3D Expr.order.length; i < l; i++ ) {=0A=
		var type =3D Expr.order[i], match;=0A=
		=0A=
		if ( (match =3D Expr.leftMatch[ type ].exec( expr )) ) {=0A=
			var left =3D match[1];=0A=
			match.splice(1,1);=0A=
=0A=
			if ( left.substr( left.length - 1 ) !=3D=3D "\\" ) {=0A=
				match[1] =3D (match[1] || "").replace(/\\/g, "");=0A=
				set =3D Expr.find[ type ]( match, context, isXML );=0A=
				if ( set !=3D null ) {=0A=
					expr =3D expr.replace( Expr.match[ type ], "" );=0A=
					break;=0A=
				}=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	if ( !set ) {=0A=
		set =3D context.getElementsByTagName("*");=0A=
	}=0A=
=0A=
	return {set: set, expr: expr};=0A=
};=0A=
=0A=
Sizzle.filter =3D function(expr, set, inplace, not){=0A=
	var old =3D expr, result =3D [], curLoop =3D set, match, anyFound,=0A=
		isXMLFilter =3D set && set[0] && isXML(set[0]);=0A=
=0A=
	while ( expr && set.length ) {=0A=
		for ( var type in Expr.filter ) {=0A=
			if ( (match =3D Expr.leftMatch[ type ].exec( expr )) !=3D null && =
match[2] ) {=0A=
				var filter =3D Expr.filter[ type ], found, item, left =3D match[1];=0A=
				anyFound =3D false;=0A=
=0A=
				match.splice(1,1);=0A=
=0A=
				if ( left.substr( left.length - 1 ) =3D=3D=3D "\\" ) {=0A=
					continue;=0A=
				}=0A=
=0A=
				if ( curLoop =3D=3D=3D result ) {=0A=
					result =3D [];=0A=
				}=0A=
=0A=
				if ( Expr.preFilter[ type ] ) {=0A=
					match =3D Expr.preFilter[ type ]( match, curLoop, inplace, result, =
not, isXMLFilter );=0A=
=0A=
					if ( !match ) {=0A=
						anyFound =3D found =3D true;=0A=
					} else if ( match =3D=3D=3D true ) {=0A=
						continue;=0A=
					}=0A=
				}=0A=
=0A=
				if ( match ) {=0A=
					for ( var i =3D 0; (item =3D curLoop[i]) !=3D null; i++ ) {=0A=
						if ( item ) {=0A=
							found =3D filter( item, match, i, curLoop );=0A=
							var pass =3D not ^ !!found;=0A=
=0A=
							if ( inplace && found !=3D null ) {=0A=
								if ( pass ) {=0A=
									anyFound =3D true;=0A=
								} else {=0A=
									curLoop[i] =3D false;=0A=
								}=0A=
							} else if ( pass ) {=0A=
								result.push( item );=0A=
								anyFound =3D true;=0A=
							}=0A=
						}=0A=
					}=0A=
				}=0A=
=0A=
				if ( found !=3D=3D undefined ) {=0A=
					if ( !inplace ) {=0A=
						curLoop =3D result;=0A=
					}=0A=
=0A=
					expr =3D expr.replace( Expr.match[ type ], "" );=0A=
=0A=
					if ( !anyFound ) {=0A=
						return [];=0A=
					}=0A=
=0A=
					break;=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		// Improper expression=0A=
		if ( expr =3D=3D=3D old ) {=0A=
			if ( anyFound =3D=3D null ) {=0A=
				Sizzle.error( expr );=0A=
			} else {=0A=
				break;=0A=
			}=0A=
		}=0A=
=0A=
		old =3D expr;=0A=
	}=0A=
=0A=
	return curLoop;=0A=
};=0A=
=0A=
Sizzle.error =3D function( msg ) {=0A=
	throw "Syntax error, unrecognized expression: " + msg;=0A=
};=0A=
=0A=
var Expr =3D Sizzle.selectors =3D {=0A=
	order: [ "ID", "NAME", "TAG" ],=0A=
	match: {=0A=
		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,=0A=
		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,=0A=
		NAME: /\[name=3D['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,=0A=
		ATTR: =
/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=3D)\s*(['"]*)(.*?)\3|)\s*\]=
/,=0A=
		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,=0A=
		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,=0A=
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=3D[^-]|$)/,=0A=
		PSEUDO: =
/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\)=
)?/=0A=
	},=0A=
	leftMatch: {},=0A=
	attrMap: {=0A=
		"class": "className",=0A=
		"for": "htmlFor"=0A=
	},=0A=
	attrHandle: {=0A=
		href: function(elem){=0A=
			return elem.getAttribute("href");=0A=
		}=0A=
	},=0A=
	relative: {=0A=
		"+": function(checkSet, part){=0A=
			var isPartStr =3D typeof part =3D=3D=3D "string",=0A=
				isTag =3D isPartStr && !/\W/.test(part),=0A=
				isPartStrNotTag =3D isPartStr && !isTag;=0A=
=0A=
			if ( isTag ) {=0A=
				part =3D part.toLowerCase();=0A=
			}=0A=
=0A=
			for ( var i =3D 0, l =3D checkSet.length, elem; i < l; i++ ) {=0A=
				if ( (elem =3D checkSet[i]) ) {=0A=
					while ( (elem =3D elem.previousSibling) && elem.nodeType !=3D=3D 1 =
) {}=0A=
=0A=
					checkSet[i] =3D isPartStrNotTag || elem && =
elem.nodeName.toLowerCase() =3D=3D=3D part ?=0A=
						elem || false :=0A=
						elem =3D=3D=3D part;=0A=
				}=0A=
			}=0A=
=0A=
			if ( isPartStrNotTag ) {=0A=
				Sizzle.filter( part, checkSet, true );=0A=
			}=0A=
		},=0A=
		">": function(checkSet, part){=0A=
			var isPartStr =3D typeof part =3D=3D=3D "string";=0A=
=0A=
			if ( isPartStr && !/\W/.test(part) ) {=0A=
				part =3D part.toLowerCase();=0A=
=0A=
				for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A=
					var elem =3D checkSet[i];=0A=
					if ( elem ) {=0A=
						var parent =3D elem.parentNode;=0A=
						checkSet[i] =3D parent.nodeName.toLowerCase() =3D=3D=3D part ? =
parent : false;=0A=
					}=0A=
				}=0A=
			} else {=0A=
				for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A=
					var elem =3D checkSet[i];=0A=
					if ( elem ) {=0A=
						checkSet[i] =3D isPartStr ?=0A=
							elem.parentNode :=0A=
							elem.parentNode =3D=3D=3D part;=0A=
					}=0A=
				}=0A=
=0A=
				if ( isPartStr ) {=0A=
					Sizzle.filter( part, checkSet, true );=0A=
				}=0A=
			}=0A=
		},=0A=
		"": function(checkSet, part, isXML){=0A=
			var doneName =3D done++, checkFn =3D dirCheck;=0A=
=0A=
			if ( typeof part =3D=3D=3D "string" && !/\W/.test(part) ) {=0A=
				var nodeCheck =3D part =3D part.toLowerCase();=0A=
				checkFn =3D dirNodeCheck;=0A=
			}=0A=
=0A=
			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);=0A=
		},=0A=
		"~": function(checkSet, part, isXML){=0A=
			var doneName =3D done++, checkFn =3D dirCheck;=0A=
=0A=
			if ( typeof part =3D=3D=3D "string" && !/\W/.test(part) ) {=0A=
				var nodeCheck =3D part =3D part.toLowerCase();=0A=
				checkFn =3D dirNodeCheck;=0A=
			}=0A=
=0A=
			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, =
isXML);=0A=
		}=0A=
	},=0A=
	find: {=0A=
		ID: function(match, context, isXML){=0A=
			if ( typeof context.getElementById !=3D=3D "undefined" && !isXML ) {=0A=
				var m =3D context.getElementById(match[1]);=0A=
				return m ? [m] : [];=0A=
			}=0A=
		},=0A=
		NAME: function(match, context){=0A=
			if ( typeof context.getElementsByName !=3D=3D "undefined" ) {=0A=
				var ret =3D [], results =3D context.getElementsByName(match[1]);=0A=
=0A=
				for ( var i =3D 0, l =3D results.length; i < l; i++ ) {=0A=
					if ( results[i].getAttribute("name") =3D=3D=3D match[1] ) {=0A=
						ret.push( results[i] );=0A=
					}=0A=
				}=0A=
=0A=
				return ret.length =3D=3D=3D 0 ? null : ret;=0A=
			}=0A=
		},=0A=
		TAG: function(match, context){=0A=
			return context.getElementsByTagName(match[1]);=0A=
		}=0A=
	},=0A=
	preFilter: {=0A=
		CLASS: function(match, curLoop, inplace, result, not, isXML){=0A=
			match =3D " " + match[1].replace(/\\/g, "") + " ";=0A=
=0A=
			if ( isXML ) {=0A=
				return match;=0A=
			}=0A=
=0A=
			for ( var i =3D 0, elem; (elem =3D curLoop[i]) !=3D null; i++ ) {=0A=
				if ( elem ) {=0A=
					if ( not ^ (elem.className && (" " + elem.className + " =
").replace(/[\t\n]/g, " ").indexOf(match) >=3D 0) ) {=0A=
						if ( !inplace ) {=0A=
							result.push( elem );=0A=
						}=0A=
					} else if ( inplace ) {=0A=
						curLoop[i] =3D false;=0A=
					}=0A=
				}=0A=
			}=0A=
=0A=
			return false;=0A=
		},=0A=
		ID: function(match){=0A=
			return match[1].replace(/\\/g, "");=0A=
		},=0A=
		TAG: function(match, curLoop){=0A=
			return match[1].toLowerCase();=0A=
		},=0A=
		CHILD: function(match){=0A=
			if ( match[1] =3D=3D=3D "nth" ) {=0A=
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', =
'-n+6'=0A=
				var test =3D /(-?)(\d*)n((?:\+|-)?\d*)/.exec(=0A=
					match[2] =3D=3D=3D "even" && "2n" || match[2] =3D=3D=3D "odd" && =
"2n+1" ||=0A=
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);=0A=
=0A=
				// calculate the numbers (first)n+(last) including if they are =
negative=0A=
				match[2] =3D (test[1] + (test[2] || 1)) - 0;=0A=
				match[3] =3D test[3] - 0;=0A=
			}=0A=
=0A=
			// TODO: Move to normal caching system=0A=
			match[0] =3D done++;=0A=
=0A=
			return match;=0A=
		},=0A=
		ATTR: function(match, curLoop, inplace, result, not, isXML){=0A=
			var name =3D match[1].replace(/\\/g, "");=0A=
			=0A=
			if ( !isXML && Expr.attrMap[name] ) {=0A=
				match[1] =3D Expr.attrMap[name];=0A=
			}=0A=
=0A=
			if ( match[2] =3D=3D=3D "~=3D" ) {=0A=
				match[4] =3D " " + match[4] + " ";=0A=
			}=0A=
=0A=
			return match;=0A=
		},=0A=
		PSEUDO: function(match, curLoop, inplace, result, not){=0A=
			if ( match[1] =3D=3D=3D "not" ) {=0A=
				// If we're dealing with a complex expression, or a simple one=0A=
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || =
/^\w/.test(match[3]) ) {=0A=
					match[3] =3D Sizzle(match[3], null, null, curLoop);=0A=
				} else {=0A=
					var ret =3D Sizzle.filter(match[3], curLoop, inplace, true ^ not);=0A=
					if ( !inplace ) {=0A=
						result.push.apply( result, ret );=0A=
					}=0A=
					return false;=0A=
				}=0A=
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( =
match[0] ) ) {=0A=
				return true;=0A=
			}=0A=
			=0A=
			return match;=0A=
		},=0A=
		POS: function(match){=0A=
			match.unshift( true );=0A=
			return match;=0A=
		}=0A=
	},=0A=
	filters: {=0A=
		enabled: function(elem){=0A=
			return elem.disabled =3D=3D=3D false && elem.type !=3D=3D "hidden";=0A=
		},=0A=
		disabled: function(elem){=0A=
			return elem.disabled =3D=3D=3D true;=0A=
		},=0A=
		checked: function(elem){=0A=
			return elem.checked =3D=3D=3D true;=0A=
		},=0A=
		selected: function(elem){=0A=
			// Accessing this property makes selected-by-default=0A=
			// options in Safari work properly=0A=
			elem.parentNode.selectedIndex;=0A=
			return elem.selected =3D=3D=3D true;=0A=
		},=0A=
		parent: function(elem){=0A=
			return !!elem.firstChild;=0A=
		},=0A=
		empty: function(elem){=0A=
			return !elem.firstChild;=0A=
		},=0A=
		has: function(elem, i, match){=0A=
			return !!Sizzle( match[3], elem ).length;=0A=
		},=0A=
		header: function(elem){=0A=
			return /h\d/i.test( elem.nodeName );=0A=
		},=0A=
		text: function(elem){=0A=
			return "text" =3D=3D=3D elem.type;=0A=
		},=0A=
		radio: function(elem){=0A=
			return "radio" =3D=3D=3D elem.type;=0A=
		},=0A=
		checkbox: function(elem){=0A=
			return "checkbox" =3D=3D=3D elem.type;=0A=
		},=0A=
		file: function(elem){=0A=
			return "file" =3D=3D=3D elem.type;=0A=
		},=0A=
		password: function(elem){=0A=
			return "password" =3D=3D=3D elem.type;=0A=
		},=0A=
		submit: function(elem){=0A=
			return "submit" =3D=3D=3D elem.type;=0A=
		},=0A=
		image: function(elem){=0A=
			return "image" =3D=3D=3D elem.type;=0A=
		},=0A=
		reset: function(elem){=0A=
			return "reset" =3D=3D=3D elem.type;=0A=
		},=0A=
		button: function(elem){=0A=
			return "button" =3D=3D=3D elem.type || elem.nodeName.toLowerCase() =
=3D=3D=3D "button";=0A=
		},=0A=
		input: function(elem){=0A=
			return /input|select|textarea|button/i.test(elem.nodeName);=0A=
		}=0A=
	},=0A=
	setFilters: {=0A=
		first: function(elem, i){=0A=
			return i =3D=3D=3D 0;=0A=
		},=0A=
		last: function(elem, i, match, array){=0A=
			return i =3D=3D=3D array.length - 1;=0A=
		},=0A=
		even: function(elem, i){=0A=
			return i % 2 =3D=3D=3D 0;=0A=
		},=0A=
		odd: function(elem, i){=0A=
			return i % 2 =3D=3D=3D 1;=0A=
		},=0A=
		lt: function(elem, i, match){=0A=
			return i < match[3] - 0;=0A=
		},=0A=
		gt: function(elem, i, match){=0A=
			return i > match[3] - 0;=0A=
		},=0A=
		nth: function(elem, i, match){=0A=
			return match[3] - 0 =3D=3D=3D i;=0A=
		},=0A=
		eq: function(elem, i, match){=0A=
			return match[3] - 0 =3D=3D=3D i;=0A=
		}=0A=
	},=0A=
	filter: {=0A=
		PSEUDO: function(elem, match, i, array){=0A=
			var name =3D match[1], filter =3D Expr.filters[ name ];=0A=
=0A=
			if ( filter ) {=0A=
				return filter( elem, i, match, array );=0A=
			} else if ( name =3D=3D=3D "contains" ) {=0A=
				return (elem.textContent || elem.innerText || getText([ elem ]) || =
"").indexOf(match[3]) >=3D 0;=0A=
			} else if ( name =3D=3D=3D "not" ) {=0A=
				var not =3D match[3];=0A=
=0A=
				for ( var i =3D 0, l =3D not.length; i < l; i++ ) {=0A=
					if ( not[i] =3D=3D=3D elem ) {=0A=
						return false;=0A=
					}=0A=
				}=0A=
=0A=
				return true;=0A=
			} else {=0A=
				Sizzle.error( "Syntax error, unrecognized expression: " + name );=0A=
			}=0A=
		},=0A=
		CHILD: function(elem, match){=0A=
			var type =3D match[1], node =3D elem;=0A=
			switch (type) {=0A=
				case 'only':=0A=
				case 'first':=0A=
					while ( (node =3D node.previousSibling) )	 {=0A=
						if ( node.nodeType =3D=3D=3D 1 ) { =0A=
							return false; =0A=
						}=0A=
					}=0A=
					if ( type =3D=3D=3D "first" ) { =0A=
						return true; =0A=
					}=0A=
					node =3D elem;=0A=
				case 'last':=0A=
					while ( (node =3D node.nextSibling) )	 {=0A=
						if ( node.nodeType =3D=3D=3D 1 ) { =0A=
							return false; =0A=
						}=0A=
					}=0A=
					return true;=0A=
				case 'nth':=0A=
					var first =3D match[2], last =3D match[3];=0A=
=0A=
					if ( first =3D=3D=3D 1 && last =3D=3D=3D 0 ) {=0A=
						return true;=0A=
					}=0A=
					=0A=
					var doneName =3D match[0],=0A=
						parent =3D elem.parentNode;=0A=
	=0A=
					if ( parent && (parent.sizcache !=3D=3D doneName || =
!elem.nodeIndex) ) {=0A=
						var count =3D 0;=0A=
						for ( node =3D parent.firstChild; node; node =3D node.nextSibling =
) {=0A=
							if ( node.nodeType =3D=3D=3D 1 ) {=0A=
								node.nodeIndex =3D ++count;=0A=
							}=0A=
						} =0A=
						parent.sizcache =3D doneName;=0A=
					}=0A=
					=0A=
					var diff =3D elem.nodeIndex - last;=0A=
					if ( first =3D=3D=3D 0 ) {=0A=
						return diff =3D=3D=3D 0;=0A=
					} else {=0A=
						return ( diff % first =3D=3D=3D 0 && diff / first >=3D 0 );=0A=
					}=0A=
			}=0A=
		},=0A=
		ID: function(elem, match){=0A=
			return elem.nodeType =3D=3D=3D 1 && elem.getAttribute("id") =3D=3D=3D =
match;=0A=
		},=0A=
		TAG: function(elem, match){=0A=
			return (match =3D=3D=3D "*" && elem.nodeType =3D=3D=3D 1) || =
elem.nodeName.toLowerCase() =3D=3D=3D match;=0A=
		},=0A=
		CLASS: function(elem, match){=0A=
			return (" " + (elem.className || elem.getAttribute("class")) + " ")=0A=
				.indexOf( match ) > -1;=0A=
		},=0A=
		ATTR: function(elem, match){=0A=
			var name =3D match[1],=0A=
				result =3D Expr.attrHandle[ name ] ?=0A=
					Expr.attrHandle[ name ]( elem ) :=0A=
					elem[ name ] !=3D null ?=0A=
						elem[ name ] :=0A=
						elem.getAttribute( name ),=0A=
				value =3D result + "",=0A=
				type =3D match[2],=0A=
				check =3D match[4];=0A=
=0A=
			return result =3D=3D null ?=0A=
				type =3D=3D=3D "!=3D" :=0A=
				type =3D=3D=3D "=3D" ?=0A=
				value =3D=3D=3D check :=0A=
				type =3D=3D=3D "*=3D" ?=0A=
				value.indexOf(check) >=3D 0 :=0A=
				type =3D=3D=3D "~=3D" ?=0A=
				(" " + value + " ").indexOf(check) >=3D 0 :=0A=
				!check ?=0A=
				value && result !=3D=3D false :=0A=
				type =3D=3D=3D "!=3D" ?=0A=
				value !=3D=3D check :=0A=
				type =3D=3D=3D "^=3D" ?=0A=
				value.indexOf(check) =3D=3D=3D 0 :=0A=
				type =3D=3D=3D "$=3D" ?=0A=
				value.substr(value.length - check.length) =3D=3D=3D check :=0A=
				type =3D=3D=3D "|=3D" ?=0A=
				value =3D=3D=3D check || value.substr(0, check.length + 1) =3D=3D=3D =
check + "-" :=0A=
				false;=0A=
		},=0A=
		POS: function(elem, match, i, array){=0A=
			var name =3D match[2], filter =3D Expr.setFilters[ name ];=0A=
=0A=
			if ( filter ) {=0A=
				return filter( elem, i, match, array );=0A=
			}=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
var origPOS =3D Expr.match.POS;=0A=
=0A=
for ( var type in Expr.match ) {=0A=
	Expr.match[ type ] =3D new RegExp( Expr.match[ type ].source + =
/(?![^\[]*\])(?![^\(]*\))/.source );=0A=
	Expr.leftMatch[ type ] =3D new RegExp( /(^(?:.|\r|\n)*?)/.source + =
Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){=0A=
		return "\\" + (num - 0 + 1);=0A=
	}));=0A=
}=0A=
=0A=
var makeArray =3D function(array, results) {=0A=
	array =3D Array.prototype.slice.call( array, 0 );=0A=
=0A=
	if ( results ) {=0A=
		results.push.apply( results, array );=0A=
		return results;=0A=
	}=0A=
	=0A=
	return array;=0A=
};=0A=
=0A=
// Perform a simple check to determine if the browser is capable of=0A=
// converting a NodeList to an array using builtin methods.=0A=
// Also verifies that the returned array holds DOM nodes=0A=
// (which is not the case in the Blackberry browser)=0A=
try {=0A=
	Array.prototype.slice.call( document.documentElement.childNodes, 0 =
)[0].nodeType;=0A=
=0A=
// Provide a fallback method if it does not work=0A=
} catch(e){=0A=
	makeArray =3D function(array, results) {=0A=
		var ret =3D results || [];=0A=
=0A=
		if ( toString.call(array) =3D=3D=3D "[object Array]" ) {=0A=
			Array.prototype.push.apply( ret, array );=0A=
		} else {=0A=
			if ( typeof array.length =3D=3D=3D "number" ) {=0A=
				for ( var i =3D 0, l =3D array.length; i < l; i++ ) {=0A=
					ret.push( array[i] );=0A=
				}=0A=
			} else {=0A=
				for ( var i =3D 0; array[i]; i++ ) {=0A=
					ret.push( array[i] );=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	};=0A=
}=0A=
=0A=
var sortOrder;=0A=
=0A=
if ( document.documentElement.compareDocumentPosition ) {=0A=
	sortOrder =3D function( a, b ) {=0A=
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {=0A=
			if ( a =3D=3D b ) {=0A=
				hasDuplicate =3D true;=0A=
			}=0A=
			return a.compareDocumentPosition ? -1 : 1;=0A=
		}=0A=
=0A=
		var ret =3D a.compareDocumentPosition(b) & 4 ? -1 : a =3D=3D=3D b ? 0 =
: 1;=0A=
		if ( ret =3D=3D=3D 0 ) {=0A=
			hasDuplicate =3D true;=0A=
		}=0A=
		return ret;=0A=
	};=0A=
} else if ( "sourceIndex" in document.documentElement ) {=0A=
	sortOrder =3D function( a, b ) {=0A=
		if ( !a.sourceIndex || !b.sourceIndex ) {=0A=
			if ( a =3D=3D b ) {=0A=
				hasDuplicate =3D true;=0A=
			}=0A=
			return a.sourceIndex ? -1 : 1;=0A=
		}=0A=
=0A=
		var ret =3D a.sourceIndex - b.sourceIndex;=0A=
		if ( ret =3D=3D=3D 0 ) {=0A=
			hasDuplicate =3D true;=0A=
		}=0A=
		return ret;=0A=
	};=0A=
} else if ( document.createRange ) {=0A=
	sortOrder =3D function( a, b ) {=0A=
		if ( !a.ownerDocument || !b.ownerDocument ) {=0A=
			if ( a =3D=3D b ) {=0A=
				hasDuplicate =3D true;=0A=
			}=0A=
			return a.ownerDocument ? -1 : 1;=0A=
		}=0A=
=0A=
		var aRange =3D a.ownerDocument.createRange(), bRange =3D =
b.ownerDocument.createRange();=0A=
		aRange.setStart(a, 0);=0A=
		aRange.setEnd(a, 0);=0A=
		bRange.setStart(b, 0);=0A=
		bRange.setEnd(b, 0);=0A=
		var ret =3D aRange.compareBoundaryPoints(Range.START_TO_END, bRange);=0A=
		if ( ret =3D=3D=3D 0 ) {=0A=
			hasDuplicate =3D true;=0A=
		}=0A=
		return ret;=0A=
	};=0A=
}=0A=
=0A=
// Utility function for retreiving the text value of an array of DOM =
nodes=0A=
function getText( elems ) {=0A=
	var ret =3D "", elem;=0A=
=0A=
	for ( var i =3D 0; elems[i]; i++ ) {=0A=
		elem =3D elems[i];=0A=
=0A=
		// Get the text from text nodes and CDATA nodes=0A=
		if ( elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 4 ) {=0A=
			ret +=3D elem.nodeValue;=0A=
=0A=
		// Traverse everything else, except comment nodes=0A=
		} else if ( elem.nodeType !=3D=3D 8 ) {=0A=
			ret +=3D getText( elem.childNodes );=0A=
		}=0A=
	}=0A=
=0A=
	return ret;=0A=
}=0A=
=0A=
// Check to see if the browser returns elements by name when=0A=
// querying by getElementById (and provide a workaround)=0A=
(function(){=0A=
	// We're going to inject a fake input element with a specified name=0A=
	var form =3D document.createElement("div"),=0A=
		id =3D "script" + (new Date).getTime();=0A=
	form.innerHTML =3D "<a name=3D'" + id + "'/>";=0A=
=0A=
	// Inject it into the root element, check its status, and remove it =
quickly=0A=
	var root =3D document.documentElement;=0A=
	root.insertBefore( form, root.firstChild );=0A=
=0A=
	// The workaround has to do additional checks after a getElementById=0A=
	// Which slows things down for other browsers (hence the branching)=0A=
	if ( document.getElementById( id ) ) {=0A=
		Expr.find.ID =3D function(match, context, isXML){=0A=
			if ( typeof context.getElementById !=3D=3D "undefined" && !isXML ) {=0A=
				var m =3D context.getElementById(match[1]);=0A=
				return m ? m.id =3D=3D=3D match[1] || typeof m.getAttributeNode =
!=3D=3D "undefined" && m.getAttributeNode("id").nodeValue =3D=3D=3D =
match[1] ? [m] : undefined : [];=0A=
			}=0A=
		};=0A=
=0A=
		Expr.filter.ID =3D function(elem, match){=0A=
			var node =3D typeof elem.getAttributeNode !=3D=3D "undefined" && =
elem.getAttributeNode("id");=0A=
			return elem.nodeType =3D=3D=3D 1 && node && node.nodeValue =3D=3D=3D =
match;=0A=
		};=0A=
	}=0A=
=0A=
	root.removeChild( form );=0A=
	root =3D form =3D null; // release memory in IE=0A=
})();=0A=
=0A=
(function(){=0A=
	// Check to see if the browser returns only elements=0A=
	// when doing getElementsByTagName("*")=0A=
=0A=
	// Create a fake element=0A=
	var div =3D document.createElement("div");=0A=
	div.appendChild( document.createComment("") );=0A=
=0A=
	// Make sure no comments are found=0A=
	if ( div.getElementsByTagName("*").length > 0 ) {=0A=
		Expr.find.TAG =3D function(match, context){=0A=
			var results =3D context.getElementsByTagName(match[1]);=0A=
=0A=
			// Filter out possible comments=0A=
			if ( match[1] =3D=3D=3D "*" ) {=0A=
				var tmp =3D [];=0A=
=0A=
				for ( var i =3D 0; results[i]; i++ ) {=0A=
					if ( results[i].nodeType =3D=3D=3D 1 ) {=0A=
						tmp.push( results[i] );=0A=
					}=0A=
				}=0A=
=0A=
				results =3D tmp;=0A=
			}=0A=
=0A=
			return results;=0A=
		};=0A=
	}=0A=
=0A=
	// Check to see if an attribute returns normalized href attributes=0A=
	div.innerHTML =3D "<a href=3D'#'></a>";=0A=
	if ( div.firstChild && typeof div.firstChild.getAttribute !=3D=3D =
"undefined" &&=0A=
			div.firstChild.getAttribute("href") !=3D=3D "#" ) {=0A=
		Expr.attrHandle.href =3D function(elem){=0A=
			return elem.getAttribute("href", 2);=0A=
		};=0A=
	}=0A=
=0A=
	div =3D null; // release memory in IE=0A=
})();=0A=
=0A=
if ( document.querySelectorAll ) {=0A=
	(function(){=0A=
		var oldSizzle =3D Sizzle, div =3D document.createElement("div");=0A=
		div.innerHTML =3D "<p class=3D'TEST'></p>";=0A=
=0A=
		// Safari can't handle uppercase or unicode characters when=0A=
		// in quirks mode.=0A=
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length =
=3D=3D=3D 0 ) {=0A=
			return;=0A=
		}=0A=
	=0A=
		Sizzle =3D function(query, context, extra, seed){=0A=
			context =3D context || document;=0A=
=0A=
			// Only use querySelectorAll on non-XML documents=0A=
			// (ID selectors don't work in non-HTML documents)=0A=
			if ( !seed && context.nodeType =3D=3D=3D 9 && !isXML(context) ) {=0A=
				try {=0A=
					return makeArray( context.querySelectorAll(query), extra );=0A=
				} catch(e){}=0A=
			}=0A=
		=0A=
			return oldSizzle(query, context, extra, seed);=0A=
		};=0A=
=0A=
		for ( var prop in oldSizzle ) {=0A=
			Sizzle[ prop ] =3D oldSizzle[ prop ];=0A=
		}=0A=
=0A=
		div =3D null; // release memory in IE=0A=
	})();=0A=
}=0A=
=0A=
(function(){=0A=
	var div =3D document.createElement("div");=0A=
=0A=
	div.innerHTML =3D "<div class=3D'test e'></div><div =
class=3D'test'></div>";=0A=
=0A=
	// Opera can't find a second classname (in 9.6)=0A=
	// Also, make sure that getElementsByClassName actually exists=0A=
	if ( !div.getElementsByClassName || =
div.getElementsByClassName("e").length =3D=3D=3D 0 ) {=0A=
		return;=0A=
	}=0A=
=0A=
	// Safari caches class attributes, doesn't catch changes (in 3.2)=0A=
	div.lastChild.className =3D "e";=0A=
=0A=
	if ( div.getElementsByClassName("e").length =3D=3D=3D 1 ) {=0A=
		return;=0A=
	}=0A=
	=0A=
	Expr.order.splice(1, 0, "CLASS");=0A=
	Expr.find.CLASS =3D function(match, context, isXML) {=0A=
		if ( typeof context.getElementsByClassName !=3D=3D "undefined" && =
!isXML ) {=0A=
			return context.getElementsByClassName(match[1]);=0A=
		}=0A=
	};=0A=
=0A=
	div =3D null; // release memory in IE=0A=
})();=0A=
=0A=
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {=0A=
	for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A=
		var elem =3D checkSet[i];=0A=
		if ( elem ) {=0A=
			elem =3D elem[dir];=0A=
			var match =3D false;=0A=
=0A=
			while ( elem ) {=0A=
				if ( elem.sizcache =3D=3D=3D doneName ) {=0A=
					match =3D checkSet[elem.sizset];=0A=
					break;=0A=
				}=0A=
=0A=
				if ( elem.nodeType =3D=3D=3D 1 && !isXML ){=0A=
					elem.sizcache =3D doneName;=0A=
					elem.sizset =3D i;=0A=
				}=0A=
=0A=
				if ( elem.nodeName.toLowerCase() =3D=3D=3D cur ) {=0A=
					match =3D elem;=0A=
					break;=0A=
				}=0A=
=0A=
				elem =3D elem[dir];=0A=
			}=0A=
=0A=
			checkSet[i] =3D match;=0A=
		}=0A=
	}=0A=
}=0A=
=0A=
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {=0A=
	for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A=
		var elem =3D checkSet[i];=0A=
		if ( elem ) {=0A=
			elem =3D elem[dir];=0A=
			var match =3D false;=0A=
=0A=
			while ( elem ) {=0A=
				if ( elem.sizcache =3D=3D=3D doneName ) {=0A=
					match =3D checkSet[elem.sizset];=0A=
					break;=0A=
				}=0A=
=0A=
				if ( elem.nodeType =3D=3D=3D 1 ) {=0A=
					if ( !isXML ) {=0A=
						elem.sizcache =3D doneName;=0A=
						elem.sizset =3D i;=0A=
					}=0A=
					if ( typeof cur !=3D=3D "string" ) {=0A=
						if ( elem =3D=3D=3D cur ) {=0A=
							match =3D true;=0A=
							break;=0A=
						}=0A=
=0A=
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {=0A=
						match =3D elem;=0A=
						break;=0A=
					}=0A=
				}=0A=
=0A=
				elem =3D elem[dir];=0A=
			}=0A=
=0A=
			checkSet[i] =3D match;=0A=
		}=0A=
	}=0A=
}=0A=
=0A=
var contains =3D document.compareDocumentPosition ? function(a, b){=0A=
	return !!(a.compareDocumentPosition(b) & 16);=0A=
} : function(a, b){=0A=
	return a !=3D=3D b && (a.contains ? a.contains(b) : true);=0A=
};=0A=
=0A=
var isXML =3D function(elem){=0A=
	// documentElement is verified for cases where it doesn't yet exist=0A=
	// (such as loading iframes in IE - #4833) =0A=
	var documentElement =3D (elem ? elem.ownerDocument || elem : =
0).documentElement;=0A=
	return documentElement ? documentElement.nodeName !=3D=3D "HTML" : =
false;=0A=
};=0A=
=0A=
var posProcess =3D function(selector, context){=0A=
	var tmpSet =3D [], later =3D "", match,=0A=
		root =3D context.nodeType ? [context] : context;=0A=
=0A=
	// Position selectors must be done after the filter=0A=
	// And so must :not(positional) so we move all PSEUDOs to the end=0A=
	while ( (match =3D Expr.match.PSEUDO.exec( selector )) ) {=0A=
		later +=3D match[0];=0A=
		selector =3D selector.replace( Expr.match.PSEUDO, "" );=0A=
	}=0A=
=0A=
	selector =3D Expr.relative[selector] ? selector + "*" : selector;=0A=
=0A=
	for ( var i =3D 0, l =3D root.length; i < l; i++ ) {=0A=
		Sizzle( selector, root[i], tmpSet );=0A=
	}=0A=
=0A=
	return Sizzle.filter( later, tmpSet );=0A=
};=0A=
=0A=
// EXPOSE=0A=
jQuery.find =3D Sizzle;=0A=
jQuery.expr =3D Sizzle.selectors;=0A=
jQuery.expr[":"] =3D jQuery.expr.filters;=0A=
jQuery.unique =3D Sizzle.uniqueSort;=0A=
jQuery.text =3D getText;=0A=
jQuery.isXMLDoc =3D isXML;=0A=
jQuery.contains =3D contains;=0A=
=0A=
return;=0A=
=0A=
window.Sizzle =3D Sizzle;=0A=
=0A=
})();=0A=
var runtil =3D /Until$/,=0A=
	rparentsprev =3D /^(?:parents|prevUntil|prevAll)/,=0A=
	// Note: This RegExp should be improved, or likely pulled from Sizzle=0A=
	rmultiselector =3D /,/,=0A=
	slice =3D Array.prototype.slice;=0A=
=0A=
// Implement the identical functionality for filter and not=0A=
var winnow =3D function( elements, qualifier, keep ) {=0A=
	if ( jQuery.isFunction( qualifier ) ) {=0A=
		return jQuery.grep(elements, function( elem, i ) {=0A=
			return !!qualifier.call( elem, i, elem ) =3D=3D=3D keep;=0A=
		});=0A=
=0A=
	} else if ( qualifier.nodeType ) {=0A=
		return jQuery.grep(elements, function( elem, i ) {=0A=
			return (elem =3D=3D=3D qualifier) =3D=3D=3D keep;=0A=
		});=0A=
=0A=
	} else if ( typeof qualifier =3D=3D=3D "string" ) {=0A=
		var filtered =3D jQuery.grep(elements, function( elem ) {=0A=
			return elem.nodeType =3D=3D=3D 1;=0A=
		});=0A=
=0A=
		if ( isSimple.test( qualifier ) ) {=0A=
			return jQuery.filter(qualifier, filtered, !keep);=0A=
		} else {=0A=
			qualifier =3D jQuery.filter( qualifier, filtered );=0A=
		}=0A=
	}=0A=
=0A=
	return jQuery.grep(elements, function( elem, i ) {=0A=
		return (jQuery.inArray( elem, qualifier ) >=3D 0) =3D=3D=3D keep;=0A=
	});=0A=
};=0A=
=0A=
jQuery.fn.extend({=0A=
	find: function( selector ) {=0A=
		var ret =3D this.pushStack( "", "find", selector ), length =3D 0;=0A=
=0A=
		for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
			length =3D ret.length;=0A=
			jQuery.find( selector, this[i], ret );=0A=
=0A=
			if ( i > 0 ) {=0A=
				// Make sure that the results are unique=0A=
				for ( var n =3D length; n < ret.length; n++ ) {=0A=
					for ( var r =3D 0; r < length; r++ ) {=0A=
						if ( ret[r] =3D=3D=3D ret[n] ) {=0A=
							ret.splice(n--, 1);=0A=
							break;=0A=
						}=0A=
					}=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	has: function( target ) {=0A=
		var targets =3D jQuery( target );=0A=
		return this.filter(function() {=0A=
			for ( var i =3D 0, l =3D targets.length; i < l; i++ ) {=0A=
				if ( jQuery.contains( this, targets[i] ) ) {=0A=
					return true;=0A=
				}=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	not: function( selector ) {=0A=
		return this.pushStack( winnow(this, selector, false), "not", selector);=0A=
	},=0A=
=0A=
	filter: function( selector ) {=0A=
		return this.pushStack( winnow(this, selector, true), "filter", =
selector );=0A=
	},=0A=
	=0A=
	is: function( selector ) {=0A=
		return !!selector && jQuery.filter( selector, this ).length > 0;=0A=
	},=0A=
=0A=
	closest: function( selectors, context ) {=0A=
		if ( jQuery.isArray( selectors ) ) {=0A=
			var ret =3D [], cur =3D this[0], match, matches =3D {}, selector;=0A=
=0A=
			if ( cur && selectors.length ) {=0A=
				for ( var i =3D 0, l =3D selectors.length; i < l; i++ ) {=0A=
					selector =3D selectors[i];=0A=
=0A=
					if ( !matches[selector] ) {=0A=
						matches[selector] =3D jQuery.expr.match.POS.test( selector ) ? =0A=
							jQuery( selector, context || this.context ) :=0A=
							selector;=0A=
					}=0A=
				}=0A=
=0A=
				while ( cur && cur.ownerDocument && cur !=3D=3D context ) {=0A=
					for ( selector in matches ) {=0A=
						match =3D matches[selector];=0A=
=0A=
						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) =
) {=0A=
							ret.push({ selector: selector, elem: cur });=0A=
							delete matches[selector];=0A=
						}=0A=
					}=0A=
					cur =3D cur.parentNode;=0A=
				}=0A=
			}=0A=
=0A=
			return ret;=0A=
		}=0A=
=0A=
		var pos =3D jQuery.expr.match.POS.test( selectors ) ? =0A=
			jQuery( selectors, context || this.context ) : null;=0A=
=0A=
		return this.map(function( i, cur ) {=0A=
			while ( cur && cur.ownerDocument && cur !=3D=3D context ) {=0A=
				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {=0A=
					return cur;=0A=
				}=0A=
				cur =3D cur.parentNode;=0A=
			}=0A=
			return null;=0A=
		});=0A=
	},=0A=
	=0A=
	// Determine the position of an element within=0A=
	// the matched set of elements=0A=
	index: function( elem ) {=0A=
		if ( !elem || typeof elem =3D=3D=3D "string" ) {=0A=
			return jQuery.inArray( this[0],=0A=
				// If it receives a string, the selector is used=0A=
				// If it receives nothing, the siblings are used=0A=
				elem ? jQuery( elem ) : this.parent().children() );=0A=
		}=0A=
		// Locate the position of the desired element=0A=
		return jQuery.inArray(=0A=
			// If it receives a jQuery object, the first element is used=0A=
			elem.jquery ? elem[0] : elem, this );=0A=
	},=0A=
=0A=
	add: function( selector, context ) {=0A=
		var set =3D typeof selector =3D=3D=3D "string" ?=0A=
				jQuery( selector, context || this.context ) :=0A=
				jQuery.makeArray( selector ),=0A=
			all =3D jQuery.merge( this.get(), set );=0A=
=0A=
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( =
all[0] ) ?=0A=
			all :=0A=
			jQuery.unique( all ) );=0A=
	},=0A=
=0A=
	andSelf: function() {=0A=
		return this.add( this.prevObject );=0A=
	}=0A=
});=0A=
=0A=
// A painfully simple check to see if an element is disconnected=0A=
// from a document (should be improved, where feasible).=0A=
function isDisconnected( node ) {=0A=
	return !node || !node.parentNode || node.parentNode.nodeType =3D=3D=3D =
11;=0A=
}=0A=
=0A=
jQuery.each({=0A=
	parent: function( elem ) {=0A=
		var parent =3D elem.parentNode;=0A=
		return parent && parent.nodeType !=3D=3D 11 ? parent : null;=0A=
	},=0A=
	parents: function( elem ) {=0A=
		return jQuery.dir( elem, "parentNode" );=0A=
	},=0A=
	parentsUntil: function( elem, i, until ) {=0A=
		return jQuery.dir( elem, "parentNode", until );=0A=
	},=0A=
	next: function( elem ) {=0A=
		return jQuery.nth( elem, 2, "nextSibling" );=0A=
	},=0A=
	prev: function( elem ) {=0A=
		return jQuery.nth( elem, 2, "previousSibling" );=0A=
	},=0A=
	nextAll: function( elem ) {=0A=
		return jQuery.dir( elem, "nextSibling" );=0A=
	},=0A=
	prevAll: function( elem ) {=0A=
		return jQuery.dir( elem, "previousSibling" );=0A=
	},=0A=
	nextUntil: function( elem, i, until ) {=0A=
		return jQuery.dir( elem, "nextSibling", until );=0A=
	},=0A=
	prevUntil: function( elem, i, until ) {=0A=
		return jQuery.dir( elem, "previousSibling", until );=0A=
	},=0A=
	siblings: function( elem ) {=0A=
		return jQuery.sibling( elem.parentNode.firstChild, elem );=0A=
	},=0A=
	children: function( elem ) {=0A=
		return jQuery.sibling( elem.firstChild );=0A=
	},=0A=
	contents: function( elem ) {=0A=
		return jQuery.nodeName( elem, "iframe" ) ?=0A=
			elem.contentDocument || elem.contentWindow.document :=0A=
			jQuery.makeArray( elem.childNodes );=0A=
	}=0A=
}, function( name, fn ) {=0A=
	jQuery.fn[ name ] =3D function( until, selector ) {=0A=
		var ret =3D jQuery.map( this, fn, until );=0A=
		=0A=
		if ( !runtil.test( name ) ) {=0A=
			selector =3D until;=0A=
		}=0A=
=0A=
		if ( selector && typeof selector =3D=3D=3D "string" ) {=0A=
			ret =3D jQuery.filter( selector, ret );=0A=
		}=0A=
=0A=
		ret =3D this.length > 1 ? jQuery.unique( ret ) : ret;=0A=
=0A=
		if ( (this.length > 1 || rmultiselector.test( selector )) && =
rparentsprev.test( name ) ) {=0A=
			ret =3D ret.reverse();=0A=
		}=0A=
=0A=
		return this.pushStack( ret, name, slice.call(arguments).join(",") );=0A=
	};=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	filter: function( expr, elems, not ) {=0A=
		if ( not ) {=0A=
			expr =3D ":not(" + expr + ")";=0A=
		}=0A=
=0A=
		return jQuery.find.matches(expr, elems);=0A=
	},=0A=
	=0A=
	dir: function( elem, dir, until ) {=0A=
		var matched =3D [], cur =3D elem[dir];=0A=
		while ( cur && cur.nodeType !=3D=3D 9 && (until =3D=3D=3D undefined || =
cur.nodeType !=3D=3D 1 || !jQuery( cur ).is( until )) ) {=0A=
			if ( cur.nodeType =3D=3D=3D 1 ) {=0A=
				matched.push( cur );=0A=
			}=0A=
			cur =3D cur[dir];=0A=
		}=0A=
		return matched;=0A=
	},=0A=
=0A=
	nth: function( cur, result, dir, elem ) {=0A=
		result =3D result || 1;=0A=
		var num =3D 0;=0A=
=0A=
		for ( ; cur; cur =3D cur[dir] ) {=0A=
			if ( cur.nodeType =3D=3D=3D 1 && ++num =3D=3D=3D result ) {=0A=
				break;=0A=
			}=0A=
		}=0A=
=0A=
		return cur;=0A=
	},=0A=
=0A=
	sibling: function( n, elem ) {=0A=
		var r =3D [];=0A=
=0A=
		for ( ; n; n =3D n.nextSibling ) {=0A=
			if ( n.nodeType =3D=3D=3D 1 && n !=3D=3D elem ) {=0A=
				r.push( n );=0A=
			}=0A=
		}=0A=
=0A=
		return r;=0A=
	}=0A=
});=0A=
var rinlinejQuery =3D / jQuery\d+=3D"(?:\d+|null)"/g,=0A=
	rleadingWhitespace =3D /^\s+/,=0A=
	rxhtmlTag =3D /(<([\w:]+)[^>]*?)\/>/g,=0A=
	rselfClosing =3D =
/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,=0A=
	rtagName =3D /<([\w:]+)/,=0A=
	rtbody =3D /<tbody/i,=0A=
	rhtml =3D /<|&#?\w+;/,=0A=
	rnocache =3D /<script|<object|<embed|<option|<style/i,=0A=
	rchecked =3D /checked\s*(?:[^=3D]|=3D\s*.checked.)/i,  // =
checked=3D"checked" or checked (html5)=0A=
	fcloseTag =3D function( all, front, tag ) {=0A=
		return rselfClosing.test( tag ) ?=0A=
			all :=0A=
			front + "></" + tag + ">";=0A=
	},=0A=
	wrapMap =3D {=0A=
		option: [ 1, "<select multiple=3D'multiple'>", "</select>" ],=0A=
		legend: [ 1, "<fieldset>", "</fieldset>" ],=0A=
		thead: [ 1, "<table>", "</table>" ],=0A=
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],=0A=
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],=0A=
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],=0A=
		area: [ 1, "<map>", "</map>" ],=0A=
		_default: [ 0, "", "" ]=0A=
	};=0A=
=0A=
wrapMap.optgroup =3D wrapMap.option;=0A=
wrapMap.tbody =3D wrapMap.tfoot =3D wrapMap.colgroup =3D wrapMap.caption =
=3D wrapMap.thead;=0A=
wrapMap.th =3D wrapMap.td;=0A=
=0A=
// IE can't serialize <link> and <script> tags normally=0A=
if ( !jQuery.support.htmlSerialize ) {=0A=
	wrapMap._default =3D [ 1, "div<div>", "</div>" ];=0A=
}=0A=
=0A=
jQuery.fn.extend({=0A=
	text: function( text ) {=0A=
		if ( jQuery.isFunction(text) ) {=0A=
			return this.each(function(i) {=0A=
				var self =3D jQuery(this);=0A=
				self.text( text.call(this, i, self.text()) );=0A=
			});=0A=
		}=0A=
=0A=
		if ( typeof text !=3D=3D "object" && text !=3D=3D undefined ) {=0A=
			return this.empty().append( (this[0] && this[0].ownerDocument || =
document).createTextNode( text ) );=0A=
		}=0A=
=0A=
		return jQuery.text( this );=0A=
	},=0A=
=0A=
	wrapAll: function( html ) {=0A=
		if ( jQuery.isFunction( html ) ) {=0A=
			return this.each(function(i) {=0A=
				jQuery(this).wrapAll( html.call(this, i) );=0A=
			});=0A=
		}=0A=
=0A=
		if ( this[0] ) {=0A=
			// The elements to wrap the target around=0A=
			var wrap =3D jQuery( html, this[0].ownerDocument ).eq(0).clone(true);=0A=
=0A=
			if ( this[0].parentNode ) {=0A=
				wrap.insertBefore( this[0] );=0A=
			}=0A=
=0A=
			wrap.map(function() {=0A=
				var elem =3D this;=0A=
=0A=
				while ( elem.firstChild && elem.firstChild.nodeType =3D=3D=3D 1 ) {=0A=
					elem =3D elem.firstChild;=0A=
				}=0A=
=0A=
				return elem;=0A=
			}).append(this);=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	wrapInner: function( html ) {=0A=
		if ( jQuery.isFunction( html ) ) {=0A=
			return this.each(function(i) {=0A=
				jQuery(this).wrapInner( html.call(this, i) );=0A=
			});=0A=
		}=0A=
=0A=
		return this.each(function() {=0A=
			var self =3D jQuery( this ), contents =3D self.contents();=0A=
=0A=
			if ( contents.length ) {=0A=
				contents.wrapAll( html );=0A=
=0A=
			} else {=0A=
				self.append( html );=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	wrap: function( html ) {=0A=
		return this.each(function() {=0A=
			jQuery( this ).wrapAll( html );=0A=
		});=0A=
	},=0A=
=0A=
	unwrap: function() {=0A=
		return this.parent().each(function() {=0A=
			if ( !jQuery.nodeName( this, "body" ) ) {=0A=
				jQuery( this ).replaceWith( this.childNodes );=0A=
			}=0A=
		}).end();=0A=
	},=0A=
=0A=
	append: function() {=0A=
		return this.domManip(arguments, true, function( elem ) {=0A=
			if ( this.nodeType =3D=3D=3D 1 ) {=0A=
				this.appendChild( elem );=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	prepend: function() {=0A=
		return this.domManip(arguments, true, function( elem ) {=0A=
			if ( this.nodeType =3D=3D=3D 1 ) {=0A=
				this.insertBefore( elem, this.firstChild );=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	before: function() {=0A=
		if ( this[0] && this[0].parentNode ) {=0A=
			return this.domManip(arguments, false, function( elem ) {=0A=
				this.parentNode.insertBefore( elem, this );=0A=
			});=0A=
		} else if ( arguments.length ) {=0A=
			var set =3D jQuery(arguments[0]);=0A=
			set.push.apply( set, this.toArray() );=0A=
			return this.pushStack( set, "before", arguments );=0A=
		}=0A=
	},=0A=
=0A=
	after: function() {=0A=
		if ( this[0] && this[0].parentNode ) {=0A=
			return this.domManip(arguments, false, function( elem ) {=0A=
				this.parentNode.insertBefore( elem, this.nextSibling );=0A=
			});=0A=
		} else if ( arguments.length ) {=0A=
			var set =3D this.pushStack( this, "after", arguments );=0A=
			set.push.apply( set, jQuery(arguments[0]).toArray() );=0A=
			return set;=0A=
		}=0A=
	},=0A=
	=0A=
	// keepData is for internal use only--do not document=0A=
	remove: function( selector, keepData ) {=0A=
		for ( var i =3D 0, elem; (elem =3D this[i]) !=3D null; i++ ) {=0A=
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {=0A=
				if ( !keepData && elem.nodeType =3D=3D=3D 1 ) {=0A=
					jQuery.cleanData( elem.getElementsByTagName("*") );=0A=
					jQuery.cleanData( [ elem ] );=0A=
				}=0A=
=0A=
				if ( elem.parentNode ) {=0A=
					 elem.parentNode.removeChild( elem );=0A=
				}=0A=
			}=0A=
		}=0A=
		=0A=
		return this;=0A=
	},=0A=
=0A=
	empty: function() {=0A=
		for ( var i =3D 0, elem; (elem =3D this[i]) !=3D null; i++ ) {=0A=
			// Remove element nodes and prevent memory leaks=0A=
			if ( elem.nodeType =3D=3D=3D 1 ) {=0A=
				jQuery.cleanData( elem.getElementsByTagName("*") );=0A=
			}=0A=
=0A=
			// Remove any remaining nodes=0A=
			while ( elem.firstChild ) {=0A=
				elem.removeChild( elem.firstChild );=0A=
			}=0A=
		}=0A=
		=0A=
		return this;=0A=
	},=0A=
=0A=
	clone: function( events ) {=0A=
		// Do the clone=0A=
		var ret =3D this.map(function() {=0A=
			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {=0A=
				// IE copies events bound via attachEvent when=0A=
				// using cloneNode. Calling detachEvent on the=0A=
				// clone will also remove the events from the orignal=0A=
				// In order to get around this, we use innerHTML.=0A=
				// Unfortunately, this means some modifications to=0A=
				// attributes in IE that are actually only stored=0A=
				// as properties will not be copied (such as the=0A=
				// the name attribute on an input).=0A=
				var html =3D this.outerHTML, ownerDocument =3D this.ownerDocument;=0A=
				if ( !html ) {=0A=
					var div =3D ownerDocument.createElement("div");=0A=
					div.appendChild( this.cloneNode(true) );=0A=
					html =3D div.innerHTML;=0A=
				}=0A=
=0A=
				return jQuery.clean([html.replace(rinlinejQuery, "")=0A=
					// Handle the case in IE 8 where action=3D/test/> self-closes a tag=0A=
					.replace(/=3D([^=3D"'>\s]+\/)>/g, '=3D"$1">')=0A=
					.replace(rleadingWhitespace, "")], ownerDocument)[0];=0A=
			} else {=0A=
				return this.cloneNode(true);=0A=
			}=0A=
		});=0A=
=0A=
		// Copy the events from the original to the clone=0A=
		if ( events =3D=3D=3D true ) {=0A=
			cloneCopyEvent( this, ret );=0A=
			cloneCopyEvent( this.find("*"), ret.find("*") );=0A=
		}=0A=
=0A=
		// Return the cloned set=0A=
		return ret;=0A=
	},=0A=
=0A=
	html: function( value ) {=0A=
		if ( value =3D=3D=3D undefined ) {=0A=
			return this[0] && this[0].nodeType =3D=3D=3D 1 ?=0A=
				this[0].innerHTML.replace(rinlinejQuery, "") :=0A=
				null;=0A=
=0A=
		// See if we can take a shortcut and just use innerHTML=0A=
		} else if ( typeof value =3D=3D=3D "string" && !rnocache.test( value ) =
&&=0A=
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value =
)) &&=0A=
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {=0A=
=0A=
			value =3D value.replace(rxhtmlTag, fcloseTag);=0A=
=0A=
			try {=0A=
				for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
					// Remove element nodes and prevent memory leaks=0A=
					if ( this[i].nodeType =3D=3D=3D 1 ) {=0A=
						jQuery.cleanData( this[i].getElementsByTagName("*") );=0A=
						this[i].innerHTML =3D value;=0A=
					}=0A=
				}=0A=
=0A=
			// If using innerHTML throws an exception, use the fallback method=0A=
			} catch(e) {=0A=
				this.empty().append( value );=0A=
			}=0A=
=0A=
		} else if ( jQuery.isFunction( value ) ) {=0A=
			this.each(function(i){=0A=
				var self =3D jQuery(this), old =3D self.html();=0A=
				self.empty().append(function(){=0A=
					return value.call( this, i, old );=0A=
				});=0A=
			});=0A=
=0A=
		} else {=0A=
			this.empty().append( value );=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	replaceWith: function( value ) {=0A=
		if ( this[0] && this[0].parentNode ) {=0A=
			// Make sure that the elements are removed from the DOM before they =
are inserted=0A=
			// this can help fix replacing a parent with child elements=0A=
			if ( jQuery.isFunction( value ) ) {=0A=
				return this.each(function(i) {=0A=
					var self =3D jQuery(this), old =3D self.html();=0A=
					self.replaceWith( value.call( this, i, old ) );=0A=
				});=0A=
			}=0A=
=0A=
			if ( typeof value !=3D=3D "string" ) {=0A=
				value =3D jQuery(value).detach();=0A=
			}=0A=
=0A=
			return this.each(function() {=0A=
				var next =3D this.nextSibling, parent =3D this.parentNode;=0A=
=0A=
				jQuery(this).remove();=0A=
=0A=
				if ( next ) {=0A=
					jQuery(next).before( value );=0A=
				} else {=0A=
					jQuery(parent).append( value );=0A=
				}=0A=
			});=0A=
		} else {=0A=
			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : =
value), "replaceWith", value );=0A=
		}=0A=
	},=0A=
=0A=
	detach: function( selector ) {=0A=
		return this.remove( selector, true );=0A=
	},=0A=
=0A=
	domManip: function( args, table, callback ) {=0A=
		var results, first, value =3D args[0], scripts =3D [], fragment, =
parent;=0A=
=0A=
		// We can't cloneNode fragments that contain checked, in WebKit=0A=
		if ( !jQuery.support.checkClone && arguments.length =3D=3D=3D 3 && =
typeof value =3D=3D=3D "string" && rchecked.test( value ) ) {=0A=
			return this.each(function() {=0A=
				jQuery(this).domManip( args, table, callback, true );=0A=
			});=0A=
		}=0A=
=0A=
		if ( jQuery.isFunction(value) ) {=0A=
			return this.each(function(i) {=0A=
				var self =3D jQuery(this);=0A=
				args[0] =3D value.call(this, i, table ? self.html() : undefined);=0A=
				self.domManip( args, table, callback );=0A=
			});=0A=
		}=0A=
=0A=
		if ( this[0] ) {=0A=
			parent =3D value && value.parentNode;=0A=
=0A=
			// If we're in a fragment, just use that instead of building a new one=0A=
			if ( jQuery.support.parentNode && parent && parent.nodeType =3D=3D=3D =
11 && parent.childNodes.length =3D=3D=3D this.length ) {=0A=
				results =3D { fragment: parent };=0A=
=0A=
			} else {=0A=
				results =3D buildFragment( args, this, scripts );=0A=
			}=0A=
			=0A=
			fragment =3D results.fragment;=0A=
			=0A=
			if ( fragment.childNodes.length =3D=3D=3D 1 ) {=0A=
				first =3D fragment =3D fragment.firstChild;=0A=
			} else {=0A=
				first =3D fragment.firstChild;=0A=
			}=0A=
=0A=
			if ( first ) {=0A=
				table =3D table && jQuery.nodeName( first, "tr" );=0A=
=0A=
				for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
					callback.call(=0A=
						table ?=0A=
							root(this[i], first) :=0A=
							this[i],=0A=
						i > 0 || results.cacheable || this.length > 1  ?=0A=
							fragment.cloneNode(true) :=0A=
							fragment=0A=
					);=0A=
				}=0A=
			}=0A=
=0A=
			if ( scripts.length ) {=0A=
				jQuery.each( scripts, evalScript );=0A=
			}=0A=
		}=0A=
=0A=
		return this;=0A=
=0A=
		function root( elem, cur ) {=0A=
			return jQuery.nodeName(elem, "table") ?=0A=
				(elem.getElementsByTagName("tbody")[0] ||=0A=
				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :=0A=
				elem;=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
function cloneCopyEvent(orig, ret) {=0A=
	var i =3D 0;=0A=
=0A=
	ret.each(function() {=0A=
		if ( this.nodeName !=3D=3D (orig[i] && orig[i].nodeName) ) {=0A=
			return;=0A=
		}=0A=
=0A=
		var oldData =3D jQuery.data( orig[i++] ), curData =3D jQuery.data( =
this, oldData ), events =3D oldData && oldData.events;=0A=
=0A=
		if ( events ) {=0A=
			delete curData.handle;=0A=
			curData.events =3D {};=0A=
=0A=
			for ( var type in events ) {=0A=
				for ( var handler in events[ type ] ) {=0A=
					jQuery.event.add( this, type, events[ type ][ handler ], events[ =
type ][ handler ].data );=0A=
				}=0A=
			}=0A=
		}=0A=
	});=0A=
}=0A=
=0A=
function buildFragment( args, nodes, scripts ) {=0A=
	var fragment, cacheable, cacheresults,=0A=
		doc =3D (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : =
document);=0A=
=0A=
	// Only cache "small" (1/2 KB) strings that are associated with the =
main document=0A=
	// Cloning options loses the selected state, so don't cache them=0A=
	// IE 6 doesn't like it when you put <object> or <embed> elements in a =
fragment=0A=
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so =
don't cache=0A=
	if ( args.length =3D=3D=3D 1 && typeof args[0] =3D=3D=3D "string" && =
args[0].length < 512 && doc =3D=3D=3D document &&=0A=
		!rnocache.test( args[0] ) && (jQuery.support.checkClone || =
!rchecked.test( args[0] )) ) {=0A=
=0A=
		cacheable =3D true;=0A=
		cacheresults =3D jQuery.fragments[ args[0] ];=0A=
		if ( cacheresults ) {=0A=
			if ( cacheresults !=3D=3D 1 ) {=0A=
				fragment =3D cacheresults;=0A=
			}=0A=
		}=0A=
	}=0A=
=0A=
	if ( !fragment ) {=0A=
		fragment =3D doc.createDocumentFragment();=0A=
		jQuery.clean( args, doc, fragment, scripts );=0A=
	}=0A=
=0A=
	if ( cacheable ) {=0A=
		jQuery.fragments[ args[0] ] =3D cacheresults ? fragment : 1;=0A=
	}=0A=
=0A=
	return { fragment: fragment, cacheable: cacheable };=0A=
}=0A=
=0A=
jQuery.fragments =3D {};=0A=
=0A=
jQuery.each({=0A=
	appendTo: "append",=0A=
	prependTo: "prepend",=0A=
	insertBefore: "before",=0A=
	insertAfter: "after",=0A=
	replaceAll: "replaceWith"=0A=
}, function( name, original ) {=0A=
	jQuery.fn[ name ] =3D function( selector ) {=0A=
		var ret =3D [], insert =3D jQuery( selector ),=0A=
			parent =3D this.length =3D=3D=3D 1 && this[0].parentNode;=0A=
		=0A=
		if ( parent && parent.nodeType =3D=3D=3D 11 && =
parent.childNodes.length =3D=3D=3D 1 && insert.length =3D=3D=3D 1 ) {=0A=
			insert[ original ]( this[0] );=0A=
			return this;=0A=
			=0A=
		} else {=0A=
			for ( var i =3D 0, l =3D insert.length; i < l; i++ ) {=0A=
				var elems =3D (i > 0 ? this.clone(true) : this).get();=0A=
				jQuery.fn[ original ].apply( jQuery(insert[i]), elems );=0A=
				ret =3D ret.concat( elems );=0A=
			}=0A=
		=0A=
			return this.pushStack( ret, name, insert.selector );=0A=
		}=0A=
	};=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	clean: function( elems, context, fragment, scripts ) {=0A=
		context =3D context || document;=0A=
=0A=
		// !context.createElement fails in IE with an error but returns typeof =
'object'=0A=
		if ( typeof context.createElement =3D=3D=3D "undefined" ) {=0A=
			context =3D context.ownerDocument || context[0] && =
context[0].ownerDocument || document;=0A=
		}=0A=
=0A=
		var ret =3D [];=0A=
=0A=
		for ( var i =3D 0, elem; (elem =3D elems[i]) !=3D null; i++ ) {=0A=
			if ( typeof elem =3D=3D=3D "number" ) {=0A=
				elem +=3D "";=0A=
			}=0A=
=0A=
			if ( !elem ) {=0A=
				continue;=0A=
			}=0A=
=0A=
			// Convert html string into DOM nodes=0A=
			if ( typeof elem =3D=3D=3D "string" && !rhtml.test( elem ) ) {=0A=
				elem =3D context.createTextNode( elem );=0A=
=0A=
			} else if ( typeof elem =3D=3D=3D "string" ) {=0A=
				// Fix "XHTML"-style tags in all browsers=0A=
				elem =3D elem.replace(rxhtmlTag, fcloseTag);=0A=
=0A=
				// Trim whitespace, otherwise indexOf won't work as expected=0A=
				var tag =3D (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),=0A=
					wrap =3D wrapMap[ tag ] || wrapMap._default,=0A=
					depth =3D wrap[0],=0A=
					div =3D context.createElement("div");=0A=
=0A=
				// Go to html and back, then peel off extra wrappers=0A=
				div.innerHTML =3D wrap[1] + elem + wrap[2];=0A=
=0A=
				// Move to the right depth=0A=
				while ( depth-- ) {=0A=
					div =3D div.lastChild;=0A=
				}=0A=
=0A=
				// Remove IE's autoinserted <tbody> from table fragments=0A=
				if ( !jQuery.support.tbody ) {=0A=
=0A=
					// String was a <table>, *may* have spurious <tbody>=0A=
					var hasBody =3D rtbody.test(elem),=0A=
						tbody =3D tag =3D=3D=3D "table" && !hasBody ?=0A=
							div.firstChild && div.firstChild.childNodes :=0A=
=0A=
							// String was a bare <thead> or <tfoot>=0A=
							wrap[1] =3D=3D=3D "<table>" && !hasBody ?=0A=
								div.childNodes :=0A=
								[];=0A=
=0A=
					for ( var j =3D tbody.length - 1; j >=3D 0 ; --j ) {=0A=
						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j =
].childNodes.length ) {=0A=
							tbody[ j ].parentNode.removeChild( tbody[ j ] );=0A=
						}=0A=
					}=0A=
=0A=
				}=0A=
=0A=
				// IE completely kills leading whitespace when innerHTML is used=0A=
				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( =
elem ) ) {=0A=
					div.insertBefore( context.createTextNode( =
rleadingWhitespace.exec(elem)[0] ), div.firstChild );=0A=
				}=0A=
=0A=
				elem =3D div.childNodes;=0A=
			}=0A=
=0A=
			if ( elem.nodeType ) {=0A=
				ret.push( elem );=0A=
			} else {=0A=
				ret =3D jQuery.merge( ret, elem );=0A=
			}=0A=
		}=0A=
=0A=
		if ( fragment ) {=0A=
			for ( var i =3D 0; ret[i]; i++ ) {=0A=
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type =
|| ret[i].type.toLowerCase() =3D=3D=3D "text/javascript") ) {=0A=
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( =
ret[i] ) : ret[i] );=0A=
				=0A=
				} else {=0A=
					if ( ret[i].nodeType =3D=3D=3D 1 ) {=0A=
						ret.splice.apply( ret, [i + 1, =
0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );=0A=
					}=0A=
					fragment.appendChild( ret[i] );=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
	=0A=
	cleanData: function( elems ) {=0A=
		var data, id, cache =3D jQuery.cache,=0A=
			special =3D jQuery.event.special,=0A=
			deleteExpando =3D jQuery.support.deleteExpando;=0A=
		=0A=
		for ( var i =3D 0, elem; (elem =3D elems[i]) !=3D null; i++ ) {=0A=
			id =3D elem[ jQuery.expando ];=0A=
			=0A=
			if ( id ) {=0A=
				data =3D cache[ id ];=0A=
				=0A=
				if ( data.events ) {=0A=
					for ( var type in data.events ) {=0A=
						if ( special[ type ] ) {=0A=
							jQuery.event.remove( elem, type );=0A=
=0A=
						} else {=0A=
							removeEvent( elem, type, data.handle );=0A=
						}=0A=
					}=0A=
				}=0A=
				=0A=
				if ( deleteExpando ) {=0A=
					delete elem[ jQuery.expando ];=0A=
=0A=
				} else if ( elem.removeAttribute ) {=0A=
					elem.removeAttribute( jQuery.expando );=0A=
				}=0A=
				=0A=
				delete cache[ id ];=0A=
			}=0A=
		}=0A=
	}=0A=
});=0A=
// exclude the following css properties to add px=0A=
var rexclude =3D /z-?index|font-?weight|opacity|zoom|line-?height/i,=0A=
	ralpha =3D /alpha\([^)]*\)/,=0A=
	ropacity =3D /opacity=3D([^)]*)/,=0A=
	rfloat =3D /float/i,=0A=
	rdashAlpha =3D /-([a-z])/ig,=0A=
	rupper =3D /([A-Z])/g,=0A=
	rnumpx =3D /^-?\d+(?:px)?$/i,=0A=
	rnum =3D /^-?\d/,=0A=
=0A=
	cssShow =3D { position: "absolute", visibility: "hidden", =
display:"block" },=0A=
	cssWidth =3D [ "Left", "Right" ],=0A=
	cssHeight =3D [ "Top", "Bottom" ],=0A=
=0A=
	// cache check for defaultView.getComputedStyle=0A=
	getComputedStyle =3D document.defaultView && =
document.defaultView.getComputedStyle,=0A=
	// normalize float css property=0A=
	styleFloat =3D jQuery.support.cssFloat ? "cssFloat" : "styleFloat",=0A=
	fcamelCase =3D function( all, letter ) {=0A=
		return letter.toUpperCase();=0A=
	};=0A=
=0A=
jQuery.fn.css =3D function( name, value ) {=0A=
	return access( this, name, value, true, function( elem, name, value ) {=0A=
		if ( value =3D=3D=3D undefined ) {=0A=
			return jQuery.curCSS( elem, name );=0A=
		}=0A=
		=0A=
		if ( typeof value =3D=3D=3D "number" && !rexclude.test(name) ) {=0A=
			value +=3D "px";=0A=
		}=0A=
=0A=
		jQuery.style( elem, name, value );=0A=
	});=0A=
};=0A=
=0A=
jQuery.extend({=0A=
	style: function( elem, name, value ) {=0A=
		// don't set styles on text and comment nodes=0A=
		if ( !elem || elem.nodeType =3D=3D=3D 3 || elem.nodeType =3D=3D=3D 8 ) =
{=0A=
			return undefined;=0A=
		}=0A=
=0A=
		// ignore negative width and height values #1599=0A=
		if ( (name =3D=3D=3D "width" || name =3D=3D=3D "height") && =
parseFloat(value) < 0 ) {=0A=
			value =3D undefined;=0A=
		}=0A=
=0A=
		var style =3D elem.style || elem, set =3D value !=3D=3D undefined;=0A=
=0A=
		// IE uses filters for opacity=0A=
		if ( !jQuery.support.opacity && name =3D=3D=3D "opacity" ) {=0A=
			if ( set ) {=0A=
				// IE has trouble with opacity if it does not have layout=0A=
				// Force it by setting the zoom level=0A=
				style.zoom =3D 1;=0A=
=0A=
				// Set the alpha filter to set the opacity=0A=
				var opacity =3D parseInt( value, 10 ) + "" =3D=3D=3D "NaN" ? "" : =
"alpha(opacity=3D" + value * 100 + ")";=0A=
				var filter =3D style.filter || jQuery.curCSS( elem, "filter" ) || "";=0A=
				style.filter =3D ralpha.test(filter) ? filter.replace(ralpha, =
opacity) : opacity;=0A=
			}=0A=
=0A=
			return style.filter && style.filter.indexOf("opacity=3D") >=3D 0 ?=0A=
				(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":=0A=
				"";=0A=
		}=0A=
=0A=
		// Make sure we're using the right name for getting the float value=0A=
		if ( rfloat.test( name ) ) {=0A=
			name =3D styleFloat;=0A=
		}=0A=
=0A=
		name =3D name.replace(rdashAlpha, fcamelCase);=0A=
=0A=
		if ( set ) {=0A=
			style[ name ] =3D value;=0A=
		}=0A=
=0A=
		return style[ name ];=0A=
	},=0A=
=0A=
	css: function( elem, name, force, extra ) {=0A=
		if ( name =3D=3D=3D "width" || name =3D=3D=3D "height" ) {=0A=
			var val, props =3D cssShow, which =3D name =3D=3D=3D "width" ? =
cssWidth : cssHeight;=0A=
=0A=
			function getWH() {=0A=
				val =3D name =3D=3D=3D "width" ? elem.offsetWidth : =
elem.offsetHeight;=0A=
=0A=
				if ( extra =3D=3D=3D "border" ) {=0A=
					return;=0A=
				}=0A=
=0A=
				jQuery.each( which, function() {=0A=
					if ( !extra ) {=0A=
						val -=3D parseFloat(jQuery.curCSS( elem, "padding" + this, true)) =
|| 0;=0A=
					}=0A=
=0A=
					if ( extra =3D=3D=3D "margin" ) {=0A=
						val +=3D parseFloat(jQuery.curCSS( elem, "margin" + this, true)) =
|| 0;=0A=
					} else {=0A=
						val -=3D parseFloat(jQuery.curCSS( elem, "border" + this + =
"Width", true)) || 0;=0A=
					}=0A=
				});=0A=
			}=0A=
=0A=
			if ( elem.offsetWidth !=3D=3D 0 ) {=0A=
				getWH();=0A=
			} else {=0A=
				jQuery.swap( elem, props, getWH );=0A=
			}=0A=
=0A=
			return Math.max(0, Math.round(val));=0A=
		}=0A=
=0A=
		return jQuery.curCSS( elem, name, force );=0A=
	},=0A=
=0A=
	curCSS: function( elem, name, force ) {=0A=
		var ret, style =3D elem.style, filter;=0A=
=0A=
		// IE uses filters for opacity=0A=
		if ( !jQuery.support.opacity && name =3D=3D=3D "opacity" && =
elem.currentStyle ) {=0A=
			ret =3D ropacity.test(elem.currentStyle.filter || "") ?=0A=
				(parseFloat(RegExp.$1) / 100) + "" :=0A=
				"";=0A=
=0A=
			return ret =3D=3D=3D "" ?=0A=
				"1" :=0A=
				ret;=0A=
		}=0A=
=0A=
		// Make sure we're using the right name for getting the float value=0A=
		if ( rfloat.test( name ) ) {=0A=
			name =3D styleFloat;=0A=
		}=0A=
=0A=
		if ( !force && style && style[ name ] ) {=0A=
			ret =3D style[ name ];=0A=
=0A=
		} else if ( getComputedStyle ) {=0A=
=0A=
			// Only "float" is needed here=0A=
			if ( rfloat.test( name ) ) {=0A=
				name =3D "float";=0A=
			}=0A=
=0A=
			name =3D name.replace( rupper, "-$1" ).toLowerCase();=0A=
=0A=
			var defaultView =3D elem.ownerDocument.defaultView;=0A=
=0A=
			if ( !defaultView ) {=0A=
				return null;=0A=
			}=0A=
=0A=
			var computedStyle =3D defaultView.getComputedStyle( elem, null );=0A=
=0A=
			if ( computedStyle ) {=0A=
				ret =3D computedStyle.getPropertyValue( name );=0A=
			}=0A=
=0A=
			// We should always get a number back from opacity=0A=
			if ( name =3D=3D=3D "opacity" && ret =3D=3D=3D "" ) {=0A=
				ret =3D "1";=0A=
			}=0A=
=0A=
		} else if ( elem.currentStyle ) {=0A=
			var camelCase =3D name.replace(rdashAlpha, fcamelCase);=0A=
=0A=
			ret =3D elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];=0A=
=0A=
			// From the awesome hack by Dean Edwards=0A=
			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291=0A=
=0A=
			// If we're not dealing with a regular pixel number=0A=
			// but a number that has a weird ending, we need to convert it to =
pixels=0A=
			if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {=0A=
				// Remember the original values=0A=
				var left =3D style.left, rsLeft =3D elem.runtimeStyle.left;=0A=
=0A=
				// Put in the new values to get a computed value out=0A=
				elem.runtimeStyle.left =3D elem.currentStyle.left;=0A=
				style.left =3D camelCase =3D=3D=3D "fontSize" ? "1em" : (ret || 0);=0A=
				ret =3D style.pixelLeft + "px";=0A=
=0A=
				// Revert the changed values=0A=
				style.left =3D left;=0A=
				elem.runtimeStyle.left =3D rsLeft;=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
=0A=
	// A method for quickly swapping in/out CSS properties to get correct =
calculations=0A=
	swap: function( elem, options, callback ) {=0A=
		var old =3D {};=0A=
=0A=
		// Remember the old values, and insert the new ones=0A=
		for ( var name in options ) {=0A=
			old[ name ] =3D elem.style[ name ];=0A=
			elem.style[ name ] =3D options[ name ];=0A=
		}=0A=
=0A=
		callback.call( elem );=0A=
=0A=
		// Revert the old values=0A=
		for ( var name in options ) {=0A=
			elem.style[ name ] =3D old[ name ];=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
if ( jQuery.expr && jQuery.expr.filters ) {=0A=
	jQuery.expr.filters.hidden =3D function( elem ) {=0A=
		var width =3D elem.offsetWidth, height =3D elem.offsetHeight,=0A=
			skip =3D elem.nodeName.toLowerCase() =3D=3D=3D "tr";=0A=
=0A=
		return width =3D=3D=3D 0 && height =3D=3D=3D 0 && !skip ?=0A=
			true :=0A=
			width > 0 && height > 0 && !skip ?=0A=
				false :=0A=
				jQuery.curCSS(elem, "display") =3D=3D=3D "none";=0A=
	};=0A=
=0A=
	jQuery.expr.filters.visible =3D function( elem ) {=0A=
		return !jQuery.expr.filters.hidden( elem );=0A=
	};=0A=
}=0A=
var jsc =3D now(),=0A=
	rscript =3D /<script(.|\s)*?\/script>/gi,=0A=
	rselectTextarea =3D /select|textarea/i,=0A=
	rinput =3D =
/color|date|datetime|email|hidden|month|number|password|range|search|tel|=
text|time|url|week/i,=0A=
	jsre =3D /=3D\?(&|$)/,=0A=
	rquery =3D /\?/,=0A=
	rts =3D /(\?|&)_=3D.*?(&|$)/,=0A=
	rurl =3D /^(\w+:)?\/\/([^\/?#]+)/,=0A=
	r20 =3D /%20/g,=0A=
=0A=
	// Keep a copy of the old load method=0A=
	_load =3D jQuery.fn.load;=0A=
=0A=
jQuery.fn.extend({=0A=
	load: function( url, params, callback ) {=0A=
		if ( typeof url !=3D=3D "string" ) {=0A=
			return _load.call( this, url );=0A=
=0A=
		// Don't do a request if no elements are being requested=0A=
		} else if ( !this.length ) {=0A=
			return this;=0A=
		}=0A=
=0A=
		var off =3D url.indexOf(" ");=0A=
		if ( off >=3D 0 ) {=0A=
			var selector =3D url.slice(off, url.length);=0A=
			url =3D url.slice(0, off);=0A=
		}=0A=
=0A=
		// Default to a GET request=0A=
		var type =3D "GET";=0A=
=0A=
		// If the second parameter was provided=0A=
		if ( params ) {=0A=
			// If it's a function=0A=
			if ( jQuery.isFunction( params ) ) {=0A=
				// We assume that it's the callback=0A=
				callback =3D params;=0A=
				params =3D null;=0A=
=0A=
			// Otherwise, build a param string=0A=
			} else if ( typeof params =3D=3D=3D "object" ) {=0A=
				params =3D jQuery.param( params, jQuery.ajaxSettings.traditional );=0A=
				type =3D "POST";=0A=
			}=0A=
		}=0A=
=0A=
		var self =3D this;=0A=
=0A=
		// Request the remote document=0A=
		jQuery.ajax({=0A=
			url: url,=0A=
			type: type,=0A=
			dataType: "html",=0A=
			data: params,=0A=
			complete: function( res, status ) {=0A=
				// If successful, inject the HTML into all the matched elements=0A=
				if ( status =3D=3D=3D "success" || status =3D=3D=3D "notmodified" ) {=0A=
					// See if a selector was specified=0A=
					self.html( selector ?=0A=
						// Create a dummy div to hold the results=0A=
						jQuery("<div />")=0A=
							// inject the contents of the document in, removing the scripts=0A=
							// to avoid any 'Permission Denied' errors in IE=0A=
							.append(res.responseText.replace(rscript, ""))=0A=
=0A=
							// Locate the specified elements=0A=
							.find(selector) :=0A=
=0A=
						// If not, just inject the full result=0A=
						res.responseText );=0A=
				}=0A=
=0A=
				if ( callback ) {=0A=
					self.each( callback, [res.responseText, status, res] );=0A=
				}=0A=
			}=0A=
		});=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	serialize: function() {=0A=
		return jQuery.param(this.serializeArray());=0A=
	},=0A=
	serializeArray: function() {=0A=
		return this.map(function() {=0A=
			return this.elements ? jQuery.makeArray(this.elements) : this;=0A=
		})=0A=
		.filter(function() {=0A=
			return this.name && !this.disabled &&=0A=
				(this.checked || rselectTextarea.test(this.nodeName) ||=0A=
					rinput.test(this.type));=0A=
		})=0A=
		.map(function( i, elem ) {=0A=
			var val =3D jQuery(this).val();=0A=
=0A=
			return val =3D=3D null ?=0A=
				null :=0A=
				jQuery.isArray(val) ?=0A=
					jQuery.map( val, function( val, i ) {=0A=
						return { name: elem.name, value: val };=0A=
					}) :=0A=
					{ name: elem.name, value: val };=0A=
		}).get();=0A=
	}=0A=
});=0A=
=0A=
// Attach a bunch of functions for handling common AJAX events=0A=
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess =
ajaxSend".split(" "), function( i, o ) {=0A=
	jQuery.fn[o] =3D function( f ) {=0A=
		return this.bind(o, f);=0A=
	};=0A=
});=0A=
=0A=
jQuery.extend({=0A=
=0A=
	get: function( url, data, callback, type ) {=0A=
		// shift arguments if data argument was omited=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			type =3D type || callback;=0A=
			callback =3D data;=0A=
			data =3D null;=0A=
		}=0A=
=0A=
		return jQuery.ajax({=0A=
			type: "GET",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	getScript: function( url, callback ) {=0A=
		return jQuery.get(url, null, callback, "script");=0A=
	},=0A=
=0A=
	getJSON: function( url, data, callback ) {=0A=
		return jQuery.get(url, data, callback, "json");=0A=
	},=0A=
=0A=
	post: function( url, data, callback, type ) {=0A=
		// shift arguments if data argument was omited=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			type =3D type || callback;=0A=
			callback =3D data;=0A=
			data =3D {};=0A=
		}=0A=
=0A=
		return jQuery.ajax({=0A=
			type: "POST",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	ajaxSetup: function( settings ) {=0A=
		jQuery.extend( jQuery.ajaxSettings, settings );=0A=
	},=0A=
=0A=
	ajaxSettings: {=0A=
		url: location.href,=0A=
		global: true,=0A=
		type: "GET",=0A=
		contentType: "application/x-www-form-urlencoded",=0A=
		processData: true,=0A=
		async: true,=0A=
		/*=0A=
		timeout: 0,=0A=
		data: null,=0A=
		username: null,=0A=
		password: null,=0A=
		traditional: false,=0A=
		*/=0A=
		// Create the request object; Microsoft failed to properly=0A=
		// implement the XMLHttpRequest in IE7 (can't request local files),=0A=
		// so we use the ActiveXObject when it is available=0A=
		// This function can be overriden by calling jQuery.ajaxSetup=0A=
		xhr: window.XMLHttpRequest && (window.location.protocol !=3D=3D =
"file:" || !window.ActiveXObject) ?=0A=
			function() {=0A=
				return new window.XMLHttpRequest();=0A=
			} :=0A=
			function() {=0A=
				try {=0A=
					return new window.ActiveXObject("Microsoft.XMLHTTP");=0A=
				} catch(e) {}=0A=
			},=0A=
		accepts: {=0A=
			xml: "application/xml, text/xml",=0A=
			html: "text/html",=0A=
			script: "text/javascript, application/javascript",=0A=
			json: "application/json, text/javascript",=0A=
			text: "text/plain",=0A=
			_default: "*/*"=0A=
		}=0A=
	},=0A=
=0A=
	// Last-Modified header cache for next request=0A=
	lastModified: {},=0A=
	etag: {},=0A=
=0A=
	ajax: function( origSettings ) {=0A=
		var s =3D jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);=0A=
		=0A=
		var jsonp, status, data,=0A=
			callbackContext =3D origSettings && origSettings.context || s,=0A=
			type =3D s.type.toUpperCase();=0A=
=0A=
		// convert data if not already a string=0A=
		if ( s.data && s.processData && typeof s.data !=3D=3D "string" ) {=0A=
			s.data =3D jQuery.param( s.data, s.traditional );=0A=
		}=0A=
=0A=
		// Handle JSONP Parameter Callbacks=0A=
		if ( s.dataType =3D=3D=3D "jsonp" ) {=0A=
			if ( type =3D=3D=3D "GET" ) {=0A=
				if ( !jsre.test( s.url ) ) {=0A=
					s.url +=3D (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || =
"callback") + "=3D?";=0A=
				}=0A=
			} else if ( !s.data || !jsre.test(s.data) ) {=0A=
				s.data =3D (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + =
"=3D?";=0A=
			}=0A=
			s.dataType =3D "json";=0A=
		}=0A=
=0A=
		// Build temporary JSONP function=0A=
		if ( s.dataType =3D=3D=3D "json" && (s.data && jsre.test(s.data) || =
jsre.test(s.url)) ) {=0A=
			jsonp =3D s.jsonpCallback || ("jsonp" + jsc++);=0A=
=0A=
			// Replace the =3D? sequence both in the query string and the data=0A=
			if ( s.data ) {=0A=
				s.data =3D (s.data + "").replace(jsre, "=3D" + jsonp + "$1");=0A=
			}=0A=
=0A=
			s.url =3D s.url.replace(jsre, "=3D" + jsonp + "$1");=0A=
=0A=
			// We need to make sure=0A=
			// that a JSONP style response is executed properly=0A=
			s.dataType =3D "script";=0A=
=0A=
			// Handle JSONP-style loading=0A=
			window[ jsonp ] =3D window[ jsonp ] || function( tmp ) {=0A=
				data =3D tmp;=0A=
				success();=0A=
				complete();=0A=
				// Garbage collect=0A=
				window[ jsonp ] =3D undefined;=0A=
=0A=
				try {=0A=
					delete window[ jsonp ];=0A=
				} catch(e) {}=0A=
=0A=
				if ( head ) {=0A=
					head.removeChild( script );=0A=
				}=0A=
			};=0A=
		}=0A=
=0A=
		if ( s.dataType =3D=3D=3D "script" && s.cache =3D=3D=3D null ) {=0A=
			s.cache =3D false;=0A=
		}=0A=
=0A=
		if ( s.cache =3D=3D=3D false && type =3D=3D=3D "GET" ) {=0A=
			var ts =3D now();=0A=
=0A=
			// try replacing _=3D if it is there=0A=
			var ret =3D s.url.replace(rts, "$1_=3D" + ts + "$2");=0A=
=0A=
			// if nothing was replaced, add timestamp to the end=0A=
			s.url =3D ret + ((ret =3D=3D=3D s.url) ? (rquery.test(s.url) ? "&" : =
"?") + "_=3D" + ts : "");=0A=
		}=0A=
=0A=
		// If data is available, append data to url for get requests=0A=
		if ( s.data && type =3D=3D=3D "GET" ) {=0A=
			s.url +=3D (rquery.test(s.url) ? "&" : "?") + s.data;=0A=
		}=0A=
=0A=
		// Watch for a new set of requests=0A=
		if ( s.global && ! jQuery.active++ ) {=0A=
			jQuery.event.trigger( "ajaxStart" );=0A=
		}=0A=
=0A=
		// Matches an absolute URL, and saves the domain=0A=
		var parts =3D rurl.exec( s.url ),=0A=
			remote =3D parts && (parts[1] && parts[1] !=3D=3D location.protocol =
|| parts[2] !=3D=3D location.host);=0A=
=0A=
		// If we're requesting a remote document=0A=
		// and trying to load JSON or Script with a GET=0A=
		if ( s.dataType =3D=3D=3D "script" && type =3D=3D=3D "GET" && remote ) =
{=0A=
			var head =3D document.getElementsByTagName("head")[0] || =
document.documentElement;=0A=
			var script =3D document.createElement("script");=0A=
			script.src =3D s.url;=0A=
			if ( s.scriptCharset ) {=0A=
				script.charset =3D s.scriptCharset;=0A=
			}=0A=
=0A=
			// Handle Script loading=0A=
			if ( !jsonp ) {=0A=
				var done =3D false;=0A=
=0A=
				// Attach handlers for all browsers=0A=
				script.onload =3D script.onreadystatechange =3D function() {=0A=
					if ( !done && (!this.readyState ||=0A=
							this.readyState =3D=3D=3D "loaded" || this.readyState =3D=3D=3D =
"complete") ) {=0A=
						done =3D true;=0A=
						success();=0A=
						complete();=0A=
=0A=
						// Handle memory leak in IE=0A=
						script.onload =3D script.onreadystatechange =3D null;=0A=
						if ( head && script.parentNode ) {=0A=
							head.removeChild( script );=0A=
						}=0A=
					}=0A=
				};=0A=
			}=0A=
=0A=
			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.=0A=
			// This arises when a base node is used (#2709 and #4378).=0A=
			head.insertBefore( script, head.firstChild );=0A=
=0A=
			// We handle everything using the script element injection=0A=
			return undefined;=0A=
		}=0A=
=0A=
		var requestDone =3D false;=0A=
=0A=
		// Create the request object=0A=
		var xhr =3D s.xhr();=0A=
=0A=
		if ( !xhr ) {=0A=
			return;=0A=
		}=0A=
=0A=
		// Open the socket=0A=
		// Passing null username, generates a login popup on Opera (#2865)=0A=
		if ( s.username ) {=0A=
			xhr.open(type, s.url, s.async, s.username, s.password);=0A=
		} else {=0A=
			xhr.open(type, s.url, s.async);=0A=
		}=0A=
=0A=
		// Need an extra try/catch for cross domain requests in Firefox 3=0A=
		try {=0A=
			// Set the correct header, if data is being sent=0A=
			if ( s.data || origSettings && origSettings.contentType ) {=0A=
				xhr.setRequestHeader("Content-Type", s.contentType);=0A=
			}=0A=
=0A=
			// Set the If-Modified-Since and/or If-None-Match header, if in =
ifModified mode.=0A=
			if ( s.ifModified ) {=0A=
				if ( jQuery.lastModified[s.url] ) {=0A=
					xhr.setRequestHeader("If-Modified-Since", =
jQuery.lastModified[s.url]);=0A=
				}=0A=
=0A=
				if ( jQuery.etag[s.url] ) {=0A=
					xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);=0A=
				}=0A=
			}=0A=
=0A=
			// Set header so the called script knows that it's an XMLHttpRequest=0A=
			// Only send the header if it's not a remote XHR=0A=
			if ( !remote ) {=0A=
				xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");=0A=
			}=0A=
=0A=
			// Set the Accepts header for the server, depending on the dataType=0A=
			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?=0A=
				s.accepts[ s.dataType ] + ", */*" :=0A=
				s.accepts._default );=0A=
		} catch(e) {}=0A=
=0A=
		// Allow custom headers/mimetypes and early abort=0A=
		if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) =
=3D=3D=3D false ) {=0A=
			// Handle the global AJAX counter=0A=
			if ( s.global && ! --jQuery.active ) {=0A=
				jQuery.event.trigger( "ajaxStop" );=0A=
			}=0A=
=0A=
			// close opended socket=0A=
			xhr.abort();=0A=
			return false;=0A=
		}=0A=
=0A=
		if ( s.global ) {=0A=
			trigger("ajaxSend", [xhr, s]);=0A=
		}=0A=
=0A=
		// Wait for a response to come back=0A=
		var onreadystatechange =3D xhr.onreadystatechange =3D function( =
isTimeout ) {=0A=
			// The request was aborted=0A=
			if ( !xhr || xhr.readyState =3D=3D=3D 0 || isTimeout =3D=3D=3D =
"abort" ) {=0A=
				// Opera doesn't call onreadystatechange before this point=0A=
				// so we simulate the call=0A=
				if ( !requestDone ) {=0A=
					complete();=0A=
				}=0A=
=0A=
				requestDone =3D true;=0A=
				if ( xhr ) {=0A=
					xhr.onreadystatechange =3D jQuery.noop;=0A=
				}=0A=
=0A=
			// The transfer is complete and the data is available, or the request =
timed out=0A=
			} else if ( !requestDone && xhr && (xhr.readyState =3D=3D=3D 4 || =
isTimeout =3D=3D=3D "timeout") ) {=0A=
				requestDone =3D true;=0A=
				xhr.onreadystatechange =3D jQuery.noop;=0A=
=0A=
				status =3D isTimeout =3D=3D=3D "timeout" ?=0A=
					"timeout" :=0A=
					!jQuery.httpSuccess( xhr ) ?=0A=
						"error" :=0A=
						s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?=0A=
							"notmodified" :=0A=
							"success";=0A=
=0A=
				var errMsg;=0A=
=0A=
				if ( status =3D=3D=3D "success" ) {=0A=
					// Watch for, and catch, XML document parse errors=0A=
					try {=0A=
						// process the data (runs the xml through httpData regardless of =
callback)=0A=
						data =3D jQuery.httpData( xhr, s.dataType, s );=0A=
					} catch(err) {=0A=
						status =3D "parsererror";=0A=
						errMsg =3D err;=0A=
					}=0A=
				}=0A=
=0A=
				// Make sure that the request was successful or notmodified=0A=
				if ( status =3D=3D=3D "success" || status =3D=3D=3D "notmodified" ) {=0A=
					// JSONP handles its own success callback=0A=
					if ( !jsonp ) {=0A=
						success();=0A=
					}=0A=
				} else {=0A=
					jQuery.handleError(s, xhr, status, errMsg);=0A=
				}=0A=
=0A=
				// Fire the complete handlers=0A=
				complete();=0A=
=0A=
				if ( isTimeout =3D=3D=3D "timeout" ) {=0A=
					xhr.abort();=0A=
				}=0A=
=0A=
				// Stop memory leaks=0A=
				if ( s.async ) {=0A=
					xhr =3D null;=0A=
				}=0A=
			}=0A=
		};=0A=
=0A=
		// Override the abort handler, if we can (IE doesn't allow it, but =
that's OK)=0A=
		// Opera doesn't fire onreadystatechange at all on abort=0A=
		try {=0A=
			var oldAbort =3D xhr.abort;=0A=
			xhr.abort =3D function() {=0A=
				if ( xhr ) {=0A=
					oldAbort.call( xhr );=0A=
				}=0A=
=0A=
				onreadystatechange( "abort" );=0A=
			};=0A=
		} catch(e) { }=0A=
=0A=
		// Timeout checker=0A=
		if ( s.async && s.timeout > 0 ) {=0A=
			setTimeout(function() {=0A=
				// Check to see if the request is still happening=0A=
				if ( xhr && !requestDone ) {=0A=
					onreadystatechange( "timeout" );=0A=
				}=0A=
			}, s.timeout);=0A=
		}=0A=
=0A=
		// Send the data=0A=
		try {=0A=
			xhr.send( type =3D=3D=3D "POST" || type =3D=3D=3D "PUT" || type =
=3D=3D=3D "DELETE" ? s.data : null );=0A=
		} catch(e) {=0A=
			jQuery.handleError(s, xhr, null, e);=0A=
			// Fire the complete handlers=0A=
			complete();=0A=
		}=0A=
=0A=
		// firefox 1.5 doesn't fire statechange for sync requests=0A=
		if ( !s.async ) {=0A=
			onreadystatechange();=0A=
		}=0A=
=0A=
		function success() {=0A=
			// If a local callback was specified, fire it and pass it the data=0A=
			if ( s.success ) {=0A=
				s.success.call( callbackContext, data, status, xhr );=0A=
			}=0A=
=0A=
			// Fire the global callback=0A=
			if ( s.global ) {=0A=
				trigger( "ajaxSuccess", [xhr, s] );=0A=
			}=0A=
		}=0A=
=0A=
		function complete() {=0A=
			// Process result=0A=
			if ( s.complete ) {=0A=
				s.complete.call( callbackContext, xhr, status);=0A=
			}=0A=
=0A=
			// The request was completed=0A=
			if ( s.global ) {=0A=
				trigger( "ajaxComplete", [xhr, s] );=0A=
			}=0A=
=0A=
			// Handle the global AJAX counter=0A=
			if ( s.global && ! --jQuery.active ) {=0A=
				jQuery.event.trigger( "ajaxStop" );=0A=
			}=0A=
		}=0A=
		=0A=
		function trigger(type, args) {=0A=
			(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);=0A=
		}=0A=
=0A=
		// return XMLHttpRequest to allow aborting the request etc.=0A=
		return xhr;=0A=
	},=0A=
=0A=
	handleError: function( s, xhr, status, e ) {=0A=
		// If a local callback was specified, fire it=0A=
		if ( s.error ) {=0A=
			s.error.call( s.context || s, xhr, status, e );=0A=
		}=0A=
=0A=
		// Fire the global callback=0A=
		if ( s.global ) {=0A=
			(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", =
[xhr, s, e] );=0A=
		}=0A=
	},=0A=
=0A=
	// Counter for holding the number of active queries=0A=
	active: 0,=0A=
=0A=
	// Determines if an XMLHttpRequest was successful or not=0A=
	httpSuccess: function( xhr ) {=0A=
		try {=0A=
			// IE error sometimes returns 1223 when it should be 204 so treat it =
as success, see #1450=0A=
			return !xhr.status && location.protocol =3D=3D=3D "file:" ||=0A=
				// Opera returns 0 when status is 304=0A=
				( xhr.status >=3D 200 && xhr.status < 300 ) ||=0A=
				xhr.status =3D=3D=3D 304 || xhr.status =3D=3D=3D 1223 || xhr.status =
=3D=3D=3D 0;=0A=
		} catch(e) {}=0A=
=0A=
		return false;=0A=
	},=0A=
=0A=
	// Determines if an XMLHttpRequest returns NotModified=0A=
	httpNotModified: function( xhr, url ) {=0A=
		var lastModified =3D xhr.getResponseHeader("Last-Modified"),=0A=
			etag =3D xhr.getResponseHeader("Etag");=0A=
=0A=
		if ( lastModified ) {=0A=
			jQuery.lastModified[url] =3D lastModified;=0A=
		}=0A=
=0A=
		if ( etag ) {=0A=
			jQuery.etag[url] =3D etag;=0A=
		}=0A=
=0A=
		// Opera returns 0 when status is 304=0A=
		return xhr.status =3D=3D=3D 304 || xhr.status =3D=3D=3D 0;=0A=
	},=0A=
=0A=
	httpData: function( xhr, type, s ) {=0A=
		var ct =3D xhr.getResponseHeader("content-type") || "",=0A=
			xml =3D type =3D=3D=3D "xml" || !type && ct.indexOf("xml") >=3D 0,=0A=
			data =3D xml ? xhr.responseXML : xhr.responseText;=0A=
=0A=
		if ( xml && data.documentElement.nodeName =3D=3D=3D "parsererror" ) {=0A=
			jQuery.error( "parsererror" );=0A=
		}=0A=
=0A=
		// Allow a pre-filtering function to sanitize the response=0A=
		// s is checked to keep backwards compatibility=0A=
		if ( s && s.dataFilter ) {=0A=
			data =3D s.dataFilter( data, type );=0A=
		}=0A=
=0A=
		// The filter can actually parse the response=0A=
		if ( typeof data =3D=3D=3D "string" ) {=0A=
			// Get the JavaScript object, if JSON is used.=0A=
			if ( type =3D=3D=3D "json" || !type && ct.indexOf("json") >=3D 0 ) {=0A=
				data =3D jQuery.parseJSON( data );=0A=
=0A=
			// If the type is "script", eval it in global context=0A=
			} else if ( type =3D=3D=3D "script" || !type && =
ct.indexOf("javascript") >=3D 0 ) {=0A=
				jQuery.globalEval( data );=0A=
			}=0A=
		}=0A=
=0A=
		return data;=0A=
	},=0A=
=0A=
	// Serialize an array of form elements or a set of=0A=
	// key/values into a query string=0A=
	param: function( a, traditional ) {=0A=
		var s =3D [];=0A=
		=0A=
		// Set traditional to true for jQuery <=3D 1.3.2 behavior.=0A=
		if ( traditional =3D=3D=3D undefined ) {=0A=
			traditional =3D jQuery.ajaxSettings.traditional;=0A=
		}=0A=
		=0A=
		// If an array was passed in, assume that it is an array of form =
elements.=0A=
		if ( jQuery.isArray(a) || a.jquery ) {=0A=
			// Serialize the form elements=0A=
			jQuery.each( a, function() {=0A=
				add( this.name, this.value );=0A=
			});=0A=
			=0A=
		} else {=0A=
			// If traditional, encode the "old" way (the way 1.3.2 or older=0A=
			// did it), otherwise encode params recursively.=0A=
			for ( var prefix in a ) {=0A=
				buildParams( prefix, a[prefix] );=0A=
			}=0A=
		}=0A=
=0A=
		// Return the resulting serialization=0A=
		return s.join("&").replace(r20, "+");=0A=
=0A=
		function buildParams( prefix, obj ) {=0A=
			if ( jQuery.isArray(obj) ) {=0A=
				// Serialize array item.=0A=
				jQuery.each( obj, function( i, v ) {=0A=
					if ( traditional || /\[\]$/.test( prefix ) ) {=0A=
						// Treat each array item as a scalar.=0A=
						add( prefix, v );=0A=
					} else {=0A=
						// If array item is non-scalar (array or object), encode its=0A=
						// numeric index to resolve deserialization ambiguity issues.=0A=
						// Note that rack (as of 1.0.0) can't currently deserialize=0A=
						// nested arrays properly, and attempting to do so may cause=0A=
						// a server error. Possible fixes are to modify rack's=0A=
						// deserialization algorithm or to provide an option or flag=0A=
						// to force array serialization to be shallow.=0A=
						buildParams( prefix + "[" + ( typeof v =3D=3D=3D "object" || =
jQuery.isArray(v) ? i : "" ) + "]", v );=0A=
					}=0A=
				});=0A=
					=0A=
			} else if ( !traditional && obj !=3D null && typeof obj =3D=3D=3D =
"object" ) {=0A=
				// Serialize object item.=0A=
				jQuery.each( obj, function( k, v ) {=0A=
					buildParams( prefix + "[" + k + "]", v );=0A=
				});=0A=
					=0A=
			} else {=0A=
				// Serialize scalar item.=0A=
				add( prefix, obj );=0A=
			}=0A=
		}=0A=
=0A=
		function add( key, value ) {=0A=
			// If value is a function, invoke it and return its value=0A=
			value =3D jQuery.isFunction(value) ? value() : value;=0A=
			s[ s.length ] =3D encodeURIComponent(key) + "=3D" + =
encodeURIComponent(value);=0A=
		}=0A=
	}=0A=
});=0A=
var elemdisplay =3D {},=0A=
	rfxtypes =3D /toggle|show|hide/,=0A=
	rfxnum =3D /^([+-]=3D)?([\d+-.]+)(.*)$/,=0A=
	timerId,=0A=
	fxAttrs =3D [=0A=
		// height animations=0A=
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" =
],=0A=
		// width animations=0A=
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" =
],=0A=
		// opacity animations=0A=
		[ "opacity" ]=0A=
	];=0A=
=0A=
jQuery.fn.extend({=0A=
	show: function( speed, callback ) {=0A=
		if ( speed || speed =3D=3D=3D 0) {=0A=
			return this.animate( genFx("show", 3), speed, callback);=0A=
=0A=
		} else {=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				var old =3D jQuery.data(this[i], "olddisplay");=0A=
=0A=
				this[i].style.display =3D old || "";=0A=
=0A=
				if ( jQuery.css(this[i], "display") =3D=3D=3D "none" ) {=0A=
					var nodeName =3D this[i].nodeName, display;=0A=
=0A=
					if ( elemdisplay[ nodeName ] ) {=0A=
						display =3D elemdisplay[ nodeName ];=0A=
=0A=
					} else {=0A=
						var elem =3D jQuery("<" + nodeName + " />").appendTo("body");=0A=
=0A=
						display =3D elem.css("display");=0A=
=0A=
						if ( display =3D=3D=3D "none" ) {=0A=
							display =3D "block";=0A=
						}=0A=
=0A=
						elem.remove();=0A=
=0A=
						elemdisplay[ nodeName ] =3D display;=0A=
					}=0A=
=0A=
					jQuery.data(this[i], "olddisplay", display);=0A=
				}=0A=
			}=0A=
=0A=
			// Set the display of the elements in a second loop=0A=
			// to avoid the constant reflow=0A=
			for ( var j =3D 0, k =3D this.length; j < k; j++ ) {=0A=
				this[j].style.display =3D jQuery.data(this[j], "olddisplay") || "";=0A=
			}=0A=
=0A=
			return this;=0A=
		}=0A=
	},=0A=
=0A=
	hide: function( speed, callback ) {=0A=
		if ( speed || speed =3D=3D=3D 0 ) {=0A=
			return this.animate( genFx("hide", 3), speed, callback);=0A=
=0A=
		} else {=0A=
			for ( var i =3D 0, l =3D this.length; i < l; i++ ) {=0A=
				var old =3D jQuery.data(this[i], "olddisplay");=0A=
				if ( !old && old !=3D=3D "none" ) {=0A=
					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));=0A=
				}=0A=
			}=0A=
=0A=
			// Set the display of the elements in a second loop=0A=
			// to avoid the constant reflow=0A=
			for ( var j =3D 0, k =3D this.length; j < k; j++ ) {=0A=
				this[j].style.display =3D "none";=0A=
			}=0A=
=0A=
			return this;=0A=
		}=0A=
	},=0A=
=0A=
	// Save the old toggle function=0A=
	_toggle: jQuery.fn.toggle,=0A=
=0A=
	toggle: function( fn, fn2 ) {=0A=
		var bool =3D typeof fn =3D=3D=3D "boolean";=0A=
=0A=
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {=0A=
			this._toggle.apply( this, arguments );=0A=
=0A=
		} else if ( fn =3D=3D null || bool ) {=0A=
			this.each(function() {=0A=
				var state =3D bool ? fn : jQuery(this).is(":hidden");=0A=
				jQuery(this)[ state ? "show" : "hide" ]();=0A=
			});=0A=
=0A=
		} else {=0A=
			this.animate(genFx("toggle", 3), fn, fn2);=0A=
		}=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	fadeTo: function( speed, to, callback ) {=0A=
		return this.filter(":hidden").css("opacity", 0).show().end()=0A=
					.animate({opacity: to}, speed, callback);=0A=
	},=0A=
=0A=
	animate: function( prop, speed, easing, callback ) {=0A=
		var optall =3D jQuery.speed(speed, easing, callback);=0A=
=0A=
		if ( jQuery.isEmptyObject( prop ) ) {=0A=
			return this.each( optall.complete );=0A=
		}=0A=
=0A=
		return this[ optall.queue =3D=3D=3D false ? "each" : "queue" =
](function() {=0A=
			var opt =3D jQuery.extend({}, optall), p,=0A=
				hidden =3D this.nodeType =3D=3D=3D 1 && jQuery(this).is(":hidden"),=0A=
				self =3D this;=0A=
=0A=
			for ( p in prop ) {=0A=
				var name =3D p.replace(rdashAlpha, fcamelCase);=0A=
=0A=
				if ( p !=3D=3D name ) {=0A=
					prop[ name ] =3D prop[ p ];=0A=
					delete prop[ p ];=0A=
					p =3D name;=0A=
				}=0A=
=0A=
				if ( prop[p] =3D=3D=3D "hide" && hidden || prop[p] =3D=3D=3D "show" =
&& !hidden ) {=0A=
					return opt.complete.call(this);=0A=
				}=0A=
=0A=
				if ( ( p =3D=3D=3D "height" || p =3D=3D=3D "width" ) && this.style ) =
{=0A=
					// Store display property=0A=
					opt.display =3D jQuery.css(this, "display");=0A=
=0A=
					// Make sure that nothing sneaks out=0A=
					opt.overflow =3D this.style.overflow;=0A=
				}=0A=
=0A=
				if ( jQuery.isArray( prop[p] ) ) {=0A=
					// Create (if needed) and add to specialEasing=0A=
					(opt.specialEasing =3D opt.specialEasing || {})[p] =3D prop[p][1];=0A=
					prop[p] =3D prop[p][0];=0A=
				}=0A=
			}=0A=
=0A=
			if ( opt.overflow !=3D null ) {=0A=
				this.style.overflow =3D "hidden";=0A=
			}=0A=
=0A=
			opt.curAnim =3D jQuery.extend({}, prop);=0A=
=0A=
			jQuery.each( prop, function( name, val ) {=0A=
				var e =3D new jQuery.fx( self, opt, name );=0A=
=0A=
				if ( rfxtypes.test(val) ) {=0A=
					e[ val =3D=3D=3D "toggle" ? hidden ? "show" : "hide" : val ]( prop =
);=0A=
=0A=
				} else {=0A=
					var parts =3D rfxnum.exec(val),=0A=
						start =3D e.cur(true) || 0;=0A=
=0A=
					if ( parts ) {=0A=
						var end =3D parseFloat( parts[2] ),=0A=
							unit =3D parts[3] || "px";=0A=
=0A=
						// We need to compute starting value=0A=
						if ( unit !=3D=3D "px" ) {=0A=
							self.style[ name ] =3D (end || 1) + unit;=0A=
							start =3D ((end || 1) / e.cur(true)) * start;=0A=
							self.style[ name ] =3D start + unit;=0A=
						}=0A=
=0A=
						// If a +=3D/-=3D token was provided, we're doing a relative =
animation=0A=
						if ( parts[1] ) {=0A=
							end =3D ((parts[1] =3D=3D=3D "-=3D" ? -1 : 1) * end) + start;=0A=
						}=0A=
=0A=
						e.custom( start, end, unit );=0A=
=0A=
					} else {=0A=
						e.custom( start, val, "" );=0A=
					}=0A=
				}=0A=
			});=0A=
=0A=
			// For JS strict compliance=0A=
			return true;=0A=
		});=0A=
	},=0A=
=0A=
	stop: function( clearQueue, gotoEnd ) {=0A=
		var timers =3D jQuery.timers;=0A=
=0A=
		if ( clearQueue ) {=0A=
			this.queue([]);=0A=
		}=0A=
=0A=
		this.each(function() {=0A=
			// go in reverse order so anything added to the queue during the loop =
is ignored=0A=
			for ( var i =3D timers.length - 1; i >=3D 0; i-- ) {=0A=
				if ( timers[i].elem =3D=3D=3D this ) {=0A=
					if (gotoEnd) {=0A=
						// force the next step to be the last=0A=
						timers[i](true);=0A=
					}=0A=
=0A=
					timers.splice(i, 1);=0A=
				}=0A=
			}=0A=
		});=0A=
=0A=
		// start the next in the queue if the last step wasn't forced=0A=
		if ( !gotoEnd ) {=0A=
			this.dequeue();=0A=
		}=0A=
=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
// Generate shortcuts for custom animations=0A=
jQuery.each({=0A=
	slideDown: genFx("show", 1),=0A=
	slideUp: genFx("hide", 1),=0A=
	slideToggle: genFx("toggle", 1),=0A=
	fadeIn: { opacity: "show" },=0A=
	fadeOut: { opacity: "hide" }=0A=
}, function( name, props ) {=0A=
	jQuery.fn[ name ] =3D function( speed, callback ) {=0A=
		return this.animate( props, speed, callback );=0A=
	};=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	speed: function( speed, easing, fn ) {=0A=
		var opt =3D speed && typeof speed =3D=3D=3D "object" ? speed : {=0A=
			complete: fn || !fn && easing ||=0A=
				jQuery.isFunction( speed ) && speed,=0A=
			duration: speed,=0A=
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing=0A=
		};=0A=
=0A=
		opt.duration =3D jQuery.fx.off ? 0 : typeof opt.duration =3D=3D=3D =
"number" ? opt.duration :=0A=
			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;=0A=
=0A=
		// Queueing=0A=
		opt.old =3D opt.complete;=0A=
		opt.complete =3D function() {=0A=
			if ( opt.queue !=3D=3D false ) {=0A=
				jQuery(this).dequeue();=0A=
			}=0A=
			if ( jQuery.isFunction( opt.old ) ) {=0A=
				opt.old.call( this );=0A=
			}=0A=
		};=0A=
=0A=
		return opt;=0A=
	},=0A=
=0A=
	easing: {=0A=
		linear: function( p, n, firstNum, diff ) {=0A=
			return firstNum + diff * p;=0A=
		},=0A=
		swing: function( p, n, firstNum, diff ) {=0A=
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;=0A=
		}=0A=
	},=0A=
=0A=
	timers: [],=0A=
=0A=
	fx: function( elem, options, prop ) {=0A=
		this.options =3D options;=0A=
		this.elem =3D elem;=0A=
		this.prop =3D prop;=0A=
=0A=
		if ( !options.orig ) {=0A=
			options.orig =3D {};=0A=
		}=0A=
	}=0A=
=0A=
});=0A=
=0A=
jQuery.fx.prototype =3D {=0A=
	// Simple function for setting a style value=0A=
	update: function() {=0A=
		if ( this.options.step ) {=0A=
			this.options.step.call( this.elem, this.now, this );=0A=
		}=0A=
=0A=
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );=0A=
=0A=
		// Set display property to block for height/width animations=0A=
		if ( ( this.prop =3D=3D=3D "height" || this.prop =3D=3D=3D "width" ) =
&& this.elem.style ) {=0A=
			this.elem.style.display =3D "block";=0A=
		}=0A=
	},=0A=
=0A=
	// Get the current size=0A=
	cur: function( force ) {=0A=
		if ( this.elem[this.prop] !=3D null && (!this.elem.style || =
this.elem.style[this.prop] =3D=3D null) ) {=0A=
			return this.elem[ this.prop ];=0A=
		}=0A=
=0A=
		var r =3D parseFloat(jQuery.css(this.elem, this.prop, force));=0A=
		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, =
this.prop)) || 0;=0A=
	},=0A=
=0A=
	// Start an animation from one number to another=0A=
	custom: function( from, to, unit ) {=0A=
		this.startTime =3D now();=0A=
		this.start =3D from;=0A=
		this.end =3D to;=0A=
		this.unit =3D unit || this.unit || "px";=0A=
		this.now =3D this.start;=0A=
		this.pos =3D this.state =3D 0;=0A=
=0A=
		var self =3D this;=0A=
		function t( gotoEnd ) {=0A=
			return self.step(gotoEnd);=0A=
		}=0A=
=0A=
		t.elem =3D this.elem;=0A=
=0A=
		if ( t() && jQuery.timers.push(t) && !timerId ) {=0A=
			timerId =3D setInterval(jQuery.fx.tick, 13);=0A=
		}=0A=
	},=0A=
=0A=
	// Simple 'show' function=0A=
	show: function() {=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.style( this.elem, this.prop );=0A=
		this.options.show =3D true;=0A=
=0A=
		// Begin the animation=0A=
		// Make sure that we start at a small width/height to avoid any=0A=
		// flash of content=0A=
		this.custom(this.prop =3D=3D=3D "width" || this.prop =3D=3D=3D =
"height" ? 1 : 0, this.cur());=0A=
=0A=
		// Start by showing the element=0A=
		jQuery( this.elem ).show();=0A=
	},=0A=
=0A=
	// Simple 'hide' function=0A=
	hide: function() {=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.style( this.elem, this.prop );=0A=
		this.options.hide =3D true;=0A=
=0A=
		// Begin the animation=0A=
		this.custom(this.cur(), 0);=0A=
	},=0A=
=0A=
	// Each step of an animation=0A=
	step: function( gotoEnd ) {=0A=
		var t =3D now(), done =3D true;=0A=
=0A=
		if ( gotoEnd || t >=3D this.options.duration + this.startTime ) {=0A=
			this.now =3D this.end;=0A=
			this.pos =3D this.state =3D 1;=0A=
			this.update();=0A=
=0A=
			this.options.curAnim[ this.prop ] =3D true;=0A=
=0A=
			for ( var i in this.options.curAnim ) {=0A=
				if ( this.options.curAnim[i] !=3D=3D true ) {=0A=
					done =3D false;=0A=
				}=0A=
			}=0A=
=0A=
			if ( done ) {=0A=
				if ( this.options.display !=3D null ) {=0A=
					// Reset the overflow=0A=
					this.elem.style.overflow =3D this.options.overflow;=0A=
=0A=
					// Reset the display=0A=
					var old =3D jQuery.data(this.elem, "olddisplay");=0A=
					this.elem.style.display =3D old ? old : this.options.display;=0A=
=0A=
					if ( jQuery.css(this.elem, "display") =3D=3D=3D "none" ) {=0A=
						this.elem.style.display =3D "block";=0A=
					}=0A=
				}=0A=
=0A=
				// Hide the element if the "hide" operation was done=0A=
				if ( this.options.hide ) {=0A=
					jQuery(this.elem).hide();=0A=
				}=0A=
=0A=
				// Reset the properties, if the item has been hidden or shown=0A=
				if ( this.options.hide || this.options.show ) {=0A=
					for ( var p in this.options.curAnim ) {=0A=
						jQuery.style(this.elem, p, this.options.orig[p]);=0A=
					}=0A=
				}=0A=
=0A=
				// Execute the complete function=0A=
				this.options.complete.call( this.elem );=0A=
			}=0A=
=0A=
			return false;=0A=
=0A=
		} else {=0A=
			var n =3D t - this.startTime;=0A=
			this.state =3D n / this.options.duration;=0A=
=0A=
			// Perform the easing function, defaults to swing=0A=
			var specialEasing =3D this.options.specialEasing && =
this.options.specialEasing[this.prop];=0A=
			var defaultEasing =3D this.options.easing || (jQuery.easing.swing ? =
"swing" : "linear");=0A=
			this.pos =3D jQuery.easing[specialEasing || =
defaultEasing](this.state, n, 0, 1, this.options.duration);=0A=
			this.now =3D this.start + ((this.end - this.start) * this.pos);=0A=
=0A=
			// Perform the next step of the animation=0A=
			this.update();=0A=
		}=0A=
=0A=
		return true;=0A=
	}=0A=
};=0A=
=0A=
jQuery.extend( jQuery.fx, {=0A=
	tick: function() {=0A=
		var timers =3D jQuery.timers;=0A=
=0A=
		for ( var i =3D 0; i < timers.length; i++ ) {=0A=
			if ( !timers[i]() ) {=0A=
				timers.splice(i--, 1);=0A=
			}=0A=
		}=0A=
=0A=
		if ( !timers.length ) {=0A=
			jQuery.fx.stop();=0A=
		}=0A=
	},=0A=
		=0A=
	stop: function() {=0A=
		clearInterval( timerId );=0A=
		timerId =3D null;=0A=
	},=0A=
	=0A=
	speeds: {=0A=
		slow: 600,=0A=
 		fast: 200,=0A=
 		// Default speed=0A=
 		_default: 400=0A=
	},=0A=
=0A=
	step: {=0A=
		opacity: function( fx ) {=0A=
			jQuery.style(fx.elem, "opacity", fx.now);=0A=
		},=0A=
=0A=
		_default: function( fx ) {=0A=
			if ( fx.elem.style && fx.elem.style[ fx.prop ] !=3D null ) {=0A=
				fx.elem.style[ fx.prop ] =3D (fx.prop =3D=3D=3D "width" || fx.prop =
=3D=3D=3D "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;=0A=
			} else {=0A=
				fx.elem[ fx.prop ] =3D fx.now;=0A=
			}=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
if ( jQuery.expr && jQuery.expr.filters ) {=0A=
	jQuery.expr.filters.animated =3D function( elem ) {=0A=
		return jQuery.grep(jQuery.timers, function( fn ) {=0A=
			return elem =3D=3D=3D fn.elem;=0A=
		}).length;=0A=
	};=0A=
}=0A=
=0A=
function genFx( type, num ) {=0A=
	var obj =3D {};=0A=
=0A=
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() =
{=0A=
		obj[ this ] =3D type;=0A=
	});=0A=
=0A=
	return obj;=0A=
}=0A=
if ( "getBoundingClientRect" in document.documentElement ) {=0A=
	jQuery.fn.offset =3D function( options ) {=0A=
		var elem =3D this[0];=0A=
=0A=
		if ( options ) { =0A=
			return this.each(function( i ) {=0A=
				jQuery.offset.setOffset( this, options, i );=0A=
			});=0A=
		}=0A=
=0A=
		if ( !elem || !elem.ownerDocument ) {=0A=
			return null;=0A=
		}=0A=
=0A=
		if ( elem =3D=3D=3D elem.ownerDocument.body ) {=0A=
			return jQuery.offset.bodyOffset( elem );=0A=
		}=0A=
=0A=
		var box =3D elem.getBoundingClientRect(), doc =3D elem.ownerDocument, =
body =3D doc.body, docElem =3D doc.documentElement,=0A=
			clientTop =3D docElem.clientTop || body.clientTop || 0, clientLeft =
=3D docElem.clientLeft || body.clientLeft || 0,=0A=
			top  =3D box.top  + (self.pageYOffset || jQuery.support.boxModel && =
docElem.scrollTop  || body.scrollTop ) - clientTop,=0A=
			left =3D box.left + (self.pageXOffset || jQuery.support.boxModel && =
docElem.scrollLeft || body.scrollLeft) - clientLeft;=0A=
=0A=
		return { top: top, left: left };=0A=
	};=0A=
=0A=
} else {=0A=
	jQuery.fn.offset =3D function( options ) {=0A=
		var elem =3D this[0];=0A=
=0A=
		if ( options ) { =0A=
			return this.each(function( i ) {=0A=
				jQuery.offset.setOffset( this, options, i );=0A=
			});=0A=
		}=0A=
=0A=
		if ( !elem || !elem.ownerDocument ) {=0A=
			return null;=0A=
		}=0A=
=0A=
		if ( elem =3D=3D=3D elem.ownerDocument.body ) {=0A=
			return jQuery.offset.bodyOffset( elem );=0A=
		}=0A=
=0A=
		jQuery.offset.initialize();=0A=
=0A=
		var offsetParent =3D elem.offsetParent, prevOffsetParent =3D elem,=0A=
			doc =3D elem.ownerDocument, computedStyle, docElem =3D =
doc.documentElement,=0A=
			body =3D doc.body, defaultView =3D doc.defaultView,=0A=
			prevComputedStyle =3D defaultView ? defaultView.getComputedStyle( =
elem, null ) : elem.currentStyle,=0A=
			top =3D elem.offsetTop, left =3D elem.offsetLeft;=0A=
=0A=
		while ( (elem =3D elem.parentNode) && elem !=3D=3D body && elem =
!=3D=3D docElem ) {=0A=
			if ( jQuery.offset.supportsFixedPosition && =
prevComputedStyle.position =3D=3D=3D "fixed" ) {=0A=
				break;=0A=
			}=0A=
=0A=
			computedStyle =3D defaultView ? defaultView.getComputedStyle(elem, =
null) : elem.currentStyle;=0A=
			top  -=3D elem.scrollTop;=0A=
			left -=3D elem.scrollLeft;=0A=
=0A=
			if ( elem =3D=3D=3D offsetParent ) {=0A=
				top  +=3D elem.offsetTop;=0A=
				left +=3D elem.offsetLeft;=0A=
=0A=
				if ( jQuery.offset.doesNotAddBorder && =
!(jQuery.offset.doesAddBorderForTableAndCells && =
/^t(able|d|h)$/i.test(elem.nodeName)) ) {=0A=
					top  +=3D parseFloat( computedStyle.borderTopWidth  ) || 0;=0A=
					left +=3D parseFloat( computedStyle.borderLeftWidth ) || 0;=0A=
				}=0A=
=0A=
				prevOffsetParent =3D offsetParent, offsetParent =3D =
elem.offsetParent;=0A=
			}=0A=
=0A=
			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && =
computedStyle.overflow !=3D=3D "visible" ) {=0A=
				top  +=3D parseFloat( computedStyle.borderTopWidth  ) || 0;=0A=
				left +=3D parseFloat( computedStyle.borderLeftWidth ) || 0;=0A=
			}=0A=
=0A=
			prevComputedStyle =3D computedStyle;=0A=
		}=0A=
=0A=
		if ( prevComputedStyle.position =3D=3D=3D "relative" || =
prevComputedStyle.position =3D=3D=3D "static" ) {=0A=
			top  +=3D body.offsetTop;=0A=
			left +=3D body.offsetLeft;=0A=
		}=0A=
=0A=
		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position =
=3D=3D=3D "fixed" ) {=0A=
			top  +=3D Math.max( docElem.scrollTop, body.scrollTop );=0A=
			left +=3D Math.max( docElem.scrollLeft, body.scrollLeft );=0A=
		}=0A=
=0A=
		return { top: top, left: left };=0A=
	};=0A=
}=0A=
=0A=
jQuery.offset =3D {=0A=
	initialize: function() {=0A=
		var body =3D document.body, container =3D =
document.createElement("div"), innerDiv, checkDiv, table, td, =
bodyMarginTop =3D parseFloat( jQuery.curCSS(body, "marginTop", true) ) =
|| 0,=0A=
			html =3D "<div =
style=3D'position:absolute;top:0;left:0;margin:0;border:5px solid =
#000;padding:0;width:1px;height:1px;'><div></div></div><table =
style=3D'position:absolute;top:0;left:0;margin:0;border:5px solid =
#000;padding:0;width:1px;height:1px;' cellpadding=3D'0' =
cellspacing=3D'0'><tr><td></td></tr></table>";=0A=
=0A=
		jQuery.extend( container.style, { position: "absolute", top: 0, left: =
0, margin: 0, border: 0, width: "1px", height: "1px", visibility: =
"hidden" } );=0A=
=0A=
		container.innerHTML =3D html;=0A=
		body.insertBefore( container, body.firstChild );=0A=
		innerDiv =3D container.firstChild;=0A=
		checkDiv =3D innerDiv.firstChild;=0A=
		td =3D innerDiv.nextSibling.firstChild.firstChild;=0A=
=0A=
		this.doesNotAddBorder =3D (checkDiv.offsetTop !=3D=3D 5);=0A=
		this.doesAddBorderForTableAndCells =3D (td.offsetTop =3D=3D=3D 5);=0A=
=0A=
		checkDiv.style.position =3D "fixed", checkDiv.style.top =3D "20px";=0A=
		// safari subtracts parent border width here which is 5px=0A=
		this.supportsFixedPosition =3D (checkDiv.offsetTop =3D=3D=3D 20 || =
checkDiv.offsetTop =3D=3D=3D 15);=0A=
		checkDiv.style.position =3D checkDiv.style.top =3D "";=0A=
=0A=
		innerDiv.style.overflow =3D "hidden", innerDiv.style.position =3D =
"relative";=0A=
		this.subtractsBorderForOverflowNotVisible =3D (checkDiv.offsetTop =
=3D=3D=3D -5);=0A=
=0A=
		this.doesNotIncludeMarginInBodyOffset =3D (body.offsetTop !=3D=3D =
bodyMarginTop);=0A=
=0A=
		body.removeChild( container );=0A=
		body =3D container =3D innerDiv =3D checkDiv =3D table =3D td =3D null;=0A=
		jQuery.offset.initialize =3D jQuery.noop;=0A=
	},=0A=
=0A=
	bodyOffset: function( body ) {=0A=
		var top =3D body.offsetTop, left =3D body.offsetLeft;=0A=
=0A=
		jQuery.offset.initialize();=0A=
=0A=
		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {=0A=
			top  +=3D parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;=0A=
			left +=3D parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;=0A=
		}=0A=
=0A=
		return { top: top, left: left };=0A=
	},=0A=
	=0A=
	setOffset: function( elem, options, i ) {=0A=
		// set position first, in-case top/left are set even on static elem=0A=
		if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {=0A=
			elem.style.position =3D "relative";=0A=
		}=0A=
		var curElem   =3D jQuery( elem ),=0A=
			curOffset =3D curElem.offset(),=0A=
			curTop    =3D parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || =
0,=0A=
			curLeft   =3D parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || =
0;=0A=
=0A=
		if ( jQuery.isFunction( options ) ) {=0A=
			options =3D options.call( elem, i, curOffset );=0A=
		}=0A=
=0A=
		var props =3D {=0A=
			top:  (options.top  - curOffset.top)  + curTop,=0A=
			left: (options.left - curOffset.left) + curLeft=0A=
		};=0A=
		=0A=
		if ( "using" in options ) {=0A=
			options.using.call( elem, props );=0A=
		} else {=0A=
			curElem.css( props );=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
=0A=
jQuery.fn.extend({=0A=
	position: function() {=0A=
		if ( !this[0] ) {=0A=
			return null;=0A=
		}=0A=
=0A=
		var elem =3D this[0],=0A=
=0A=
		// Get *real* offsetParent=0A=
		offsetParent =3D this.offsetParent(),=0A=
=0A=
		// Get correct offsets=0A=
		offset       =3D this.offset(),=0A=
		parentOffset =3D /^body|html$/i.test(offsetParent[0].nodeName) ? { =
top: 0, left: 0 } : offsetParent.offset();=0A=
=0A=
		// Subtract element margins=0A=
		// note: when an element has margin: auto the offsetLeft and marginLeft=0A=
		// are the same in Safari causing offset.left to incorrectly be 0=0A=
		offset.top  -=3D parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) =
|| 0;=0A=
		offset.left -=3D parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) =
|| 0;=0A=
=0A=
		// Add offsetParent borders=0A=
		parentOffset.top  +=3D parseFloat( jQuery.curCSS(offsetParent[0], =
"borderTopWidth",  true) ) || 0;=0A=
		parentOffset.left +=3D parseFloat( jQuery.curCSS(offsetParent[0], =
"borderLeftWidth", true) ) || 0;=0A=
=0A=
		// Subtract the two offsets=0A=
		return {=0A=
			top:  offset.top  - parentOffset.top,=0A=
			left: offset.left - parentOffset.left=0A=
		};=0A=
	},=0A=
=0A=
	offsetParent: function() {=0A=
		return this.map(function() {=0A=
			var offsetParent =3D this.offsetParent || document.body;=0A=
			while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) =
&& jQuery.css(offsetParent, "position") =3D=3D=3D "static") ) {=0A=
				offsetParent =3D offsetParent.offsetParent;=0A=
			}=0A=
			return offsetParent;=0A=
		});=0A=
	}=0A=
});=0A=
=0A=
=0A=
// Create scrollLeft and scrollTop methods=0A=
jQuery.each( ["Left", "Top"], function( i, name ) {=0A=
	var method =3D "scroll" + name;=0A=
=0A=
	jQuery.fn[ method ] =3D function(val) {=0A=
		var elem =3D this[0], win;=0A=
		=0A=
		if ( !elem ) {=0A=
			return null;=0A=
		}=0A=
=0A=
		if ( val !=3D=3D undefined ) {=0A=
			// Set the scroll offset=0A=
			return this.each(function() {=0A=
				win =3D getWindow( this );=0A=
=0A=
				if ( win ) {=0A=
					win.scrollTo(=0A=
						!i ? val : jQuery(win).scrollLeft(),=0A=
						 i ? val : jQuery(win).scrollTop()=0A=
					);=0A=
=0A=
				} else {=0A=
					this[ method ] =3D val;=0A=
				}=0A=
			});=0A=
		} else {=0A=
			win =3D getWindow( elem );=0A=
=0A=
			// Return the scroll offset=0A=
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : =
"pageXOffset" ] :=0A=
				jQuery.support.boxModel && win.document.documentElement[ method ] ||=0A=
					win.document.body[ method ] :=0A=
				elem[ method ];=0A=
		}=0A=
	};=0A=
});=0A=
=0A=
function getWindow( elem ) {=0A=
	return ("scrollTo" in elem && elem.document) ?=0A=
		elem :=0A=
		elem.nodeType =3D=3D=3D 9 ?=0A=
			elem.defaultView || elem.parentWindow :=0A=
			false;=0A=
}=0A=
// Create innerHeight, innerWidth, outerHeight and outerWidth methods=0A=
jQuery.each([ "Height", "Width" ], function( i, name ) {=0A=
=0A=
	var type =3D name.toLowerCase();=0A=
=0A=
	// innerHeight and innerWidth=0A=
	jQuery.fn["inner" + name] =3D function() {=0A=
		return this[0] ?=0A=
			jQuery.css( this[0], type, false, "padding" ) :=0A=
			null;=0A=
	};=0A=
=0A=
	// outerHeight and outerWidth=0A=
	jQuery.fn["outer" + name] =3D function( margin ) {=0A=
		return this[0] ?=0A=
			jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :=0A=
			null;=0A=
	};=0A=
=0A=
	jQuery.fn[ type ] =3D function( size ) {=0A=
		// Get window width or height=0A=
		var elem =3D this[0];=0A=
		if ( !elem ) {=0A=
			return size =3D=3D null ? null : this;=0A=
		}=0A=
		=0A=
		if ( jQuery.isFunction( size ) ) {=0A=
			return this.each(function( i ) {=0A=
				var self =3D jQuery( this );=0A=
				self[ type ]( size.call( this, i, self[ type ]() ) );=0A=
			});=0A=
		}=0A=
=0A=
		return ("scrollTo" in elem && elem.document) ? // does it walk and =
quack like a window?=0A=
			// Everyone else use document.documentElement or document.body =
depending on Quirks vs Standards mode=0A=
			elem.document.compatMode =3D=3D=3D "CSS1Compat" && =
elem.document.documentElement[ "client" + name ] ||=0A=
			elem.document.body[ "client" + name ] :=0A=
=0A=
			// Get document width or height=0A=
			(elem.nodeType =3D=3D=3D 9) ? // is it a document=0A=
				// Either scroll[Width/Height] or offset[Width/Height], whichever is =
greater=0A=
				Math.max(=0A=
					elem.documentElement["client" + name],=0A=
					elem.body["scroll" + name], elem.documentElement["scroll" + name],=0A=
					elem.body["offset" + name], elem.documentElement["offset" + name]=0A=
				) :=0A=
=0A=
				// Get or set width or height on the element=0A=
				size =3D=3D=3D undefined ?=0A=
					// Get width or height on the element=0A=
					jQuery.css( elem, type ) :=0A=
=0A=
					// Set the width or height on the element (default to pixels if =
value is unitless)=0A=
					this.css( type, typeof size =3D=3D=3D "string" ? size : size + "px" =
);=0A=
	};=0A=
=0A=
});=0A=
// Expose jQuery to the global object=0A=
window.jQuery =3D window.$ =3D jQuery;=0A=
=0A=
})(window);=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/gadgetcontext/gadgets/js/jquery-outside.js

/*!=0A=
* jQuery outside events - v1.1 - 3/16/2010=0A=
* http://benalman.com/projects/jquery-outside-events-plugin/=0A=
*=0A=
* Copyright (c) 2010 "Cowboy" Ben Alman=0A=
* Dual licensed under the MIT and GPL licenses.=0A=
* http://benalman.com/about/license/=0A=
*/=0A=
=0A=
// Script: jQuery outside events=0A=
//=0A=
// *Version: 1.1, Last updated: 3/16/2010*=0A=
//=0A=
// Project Home - =
http://benalman.com/projects/jquery-outside-events-plugin/=0A=
// GitHub - http://github.com/cowboy/jquery-outside-events/=0A=
// Source - =
http://github.com/cowboy/jquery-outside-events/raw/master/jquery.ba-outsi=
de-events.js=0A=
// (Minified) - =
http://github.com/cowboy/jquery-outside-events/raw/master/jquery.ba-outsi=
de-events.min.js (0.9kb)=0A=
//=0A=
// About: License=0A=
//=0A=
// Copyright (c) 2010 "Cowboy" Ben Alman,=0A=
// Dual licensed under the MIT and GPL licenses.=0A=
// http://benalman.com/about/license/=0A=
//=0A=
// About: Examples=0A=
//=0A=
// These working examples, complete with fully commented code, =
illustrate a few=0A=
// ways in which this plugin can be used.=0A=
//=0A=
// clickoutside - =
http://benalman.com/code/projects/jquery-outside-events/examples/clickout=
side/=0A=
// dblclickoutside - =
http://benalman.com/code/projects/jquery-outside-events/examples/dblclick=
outside/=0A=
// mouseoveroutside - =
http://benalman.com/code/projects/jquery-outside-events/examples/mouseove=
routside/=0A=
// focusoutside - =
http://benalman.com/code/projects/jquery-outside-events/examples/focusout=
side/=0A=
//=0A=
// About: Support and Testing=0A=
//=0A=
// Information about what version or versions of jQuery this plugin has =
been=0A=
// tested with, what browsers it has been tested in, and where the unit =
tests=0A=
// reside (so you can test it yourself).=0A=
//=0A=
// jQuery Versions - 1.4.2=0A=
// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, =
Chrome, Opera 9.6-10.1.=0A=
// Unit Tests - =
http://benalman.com/code/projects/jquery-outside-events/unit/=0A=
//=0A=
// About: Release History=0A=
//=0A=
// 1.1 - (3/16/2010) Made "clickoutside" plugin more general, resulting =
in a=0A=
// whole new plugin with more than a dozen default "outside" events and=0A=
// a method that can be used to add new ones.=0A=
// 1.0 - (2/27/2010) Initial release=0A=
//=0A=
// Topic: Default "outside" events=0A=
//=0A=
// Note that each "outside" event is powered by an "originating" event. =
Only=0A=
// when the originating event is triggered on an element outside the =
element=0A=
// to which that outside event is bound will the bound event be =
triggered.=0A=
//=0A=
// Because each outside event is powered by a separate originating event,=0A=
// stopping propagation of that originating event will prevent its =
related=0A=
// outside event from triggering.=0A=
//=0A=
// OUTSIDE EVENT - ORIGINATING EVENT=0A=
// clickoutside - click=0A=
// dblclickoutside - dblclick=0A=
// focusoutside - focusin=0A=
// bluroutside - focusout=0A=
// mousemoveoutside - mousemove=0A=
// mousedownoutside - mousedown=0A=
// mouseupoutside - mouseup=0A=
// mouseoveroutside - mouseover=0A=
// mouseoutoutside - mouseout=0A=
// keydownoutside - keydown=0A=
// keypressoutside - keypress=0A=
// keyupoutside - keyup=0A=
// changeoutside - change=0A=
// selectoutside - select=0A=
// submitoutside - submit=0A=
=0A=
(function($,doc,outside){=0A=
  '$:nomunge'; // Used by YUI compressor.=0A=
  =0A=
  $.map(=0A=
    // All these events will get an "outside" event counterpart by =
default.=0A=
    'click dblclick mousemove mousedown mouseup mouseover mouseout =
change select submit keydown keypress keyup'.split(' '),=0A=
    function( event_name ) { jq_addOutsideEvent( event_name ); }=0A=
  );=0A=
  =0A=
  // The focus and blur events are really focusin and focusout when it =
comes=0A=
  // to delegation, so they are a special case.=0A=
  jq_addOutsideEvent( 'focusin', 'focus' + outside );=0A=
  jq_addOutsideEvent( 'focusout', 'blur' + outside );=0A=
  =0A=
  // Method: jQuery.addOutsideEvent=0A=
  //=0A=
  // Register a new "outside" event to be with this method. Adding an =
outside=0A=
  // event that already exists will probably blow things up, so check the=0A=
  // <Default "outside" events> list before trying to add a new one.=0A=
  //=0A=
  // Usage:=0A=
  //=0A=
  // > jQuery.addOutsideEvent( event_name [, outside_event_name ] );=0A=
  //=0A=
  // Arguments:=0A=
  //=0A=
  // event_name - (String) The name of the originating event that the new=0A=
  // "outside" event will be powered by. This event can be a native or=0A=
  // custom event, as long as it bubbles up the DOM tree.=0A=
  // outside_event_name - (String) An optional name for the new "outside"=0A=
  // event. If omitted, the outside event will be named whatever the=0A=
  // value of `event_name` is plus the "outside" suffix.=0A=
  //=0A=
  // Returns:=0A=
  //=0A=
  // Nothing.=0A=
  =0A=
  $.addOutsideEvent =3D jq_addOutsideEvent;=0A=
  =0A=
  function jq_addOutsideEvent( event_name, outside_event_name ) {=0A=
    =0A=
    // The "outside" event name.=0A=
    outside_event_name =3D outside_event_name || event_name + outside;=0A=
    =0A=
    // A jQuery object containing all elements to which the "outside" =
event is=0A=
    // bound.=0A=
    var elems =3D $(),=0A=
      =0A=
      // The "originating" event, namespaced for easy unbinding.=0A=
      event_namespaced =3D event_name + '.' + outside_event_name + =
'-special-event';=0A=
    =0A=
    // Event: outside events=0A=
    //=0A=
    // An "outside" event is triggered on an element when its =
corresponding=0A=
    // "originating" event is triggered on an element outside the =
element in=0A=
    // question. See the <Default "outside" events> list for more =
information.=0A=
    //=0A=
    // Usage:=0A=
    //=0A=
    // > jQuery('selector').bind( 'clickoutside', function(event) {=0A=
    // > var clicked_elem =3D $(event.target);=0A=
    // > ...=0A=
    // > });=0A=
    //=0A=
    // > jQuery('selector').bind( 'dblclickoutside', function(event) {=0A=
    // > var double_clicked_elem =3D $(event.target);=0A=
    // > ...=0A=
    // > });=0A=
    //=0A=
    // > jQuery('selector').bind( 'mouseoveroutside', function(event) {=0A=
    // > var moused_over_elem =3D $(event.target);=0A=
    // > ...=0A=
    // > });=0A=
    //=0A=
    // > jQuery('selector').bind( 'focusoutside', function(event) {=0A=
    // > var focused_elem =3D $(event.target);=0A=
    // > ...=0A=
    // > });=0A=
    //=0A=
    // You get the idea, right?=0A=
    =0A=
    $.event.special[ outside_event_name ] =3D {=0A=
      =0A=
      // Called only when the first "outside" event callback is bound per=0A=
      // element.=0A=
      setup: function(){=0A=
        =0A=
        // Add this element to the list of elements to which this =
"outside"=0A=
        // event is bound.=0A=
        elems =3D elems.add( this );=0A=
        =0A=
        // If this is the first element getting the event bound, bind a =
handler=0A=
        // to document to catch all corresponding "originating" events.=0A=
        if ( elems.length =3D=3D=3D 1 ) {=0A=
          $(doc).bind( event_namespaced, handle_event );=0A=
        }=0A=
      },=0A=
      =0A=
      // Called only when the last "outside" event callback is unbound =
per=0A=
      // element.=0A=
      teardown: function(){=0A=
        =0A=
        // Remove this element from the list of elements to which this=0A=
        // "outside" event is bound.=0A=
        elems =3D elems.not( this );=0A=
        =0A=
        // If this is the last element removed, remove the "originating" =
event=0A=
        // handler on document that powers this "outside" event.=0A=
        if ( elems.length =3D=3D=3D 0 ) {=0A=
          $(doc).unbind( event_namespaced );=0A=
        }=0A=
      },=0A=
      =0A=
      // Called every time a "outside" event callback is bound to an =
element.=0A=
      add: function( handleObj ) {=0A=
        var old_handler =3D handleObj.handler;=0A=
        =0A=
        // This function is executed every time the event is triggered. =
This is=0A=
        // used to override the default event.target reference with one =
that is=0A=
        // more useful.=0A=
        handleObj.handler =3D function( event, elem ) {=0A=
          =0A=
          // Set the event object's .target property to the element that =
the=0A=
          // user interacted with, not the element that the "outside" =
event was=0A=
          // was triggered on.=0A=
          event.target =3D elem;=0A=
          =0A=
          // Execute the actual bound handler.=0A=
          old_handler.apply( this, arguments );=0A=
        };=0A=
      }=0A=
    };=0A=
    =0A=
    // When the "originating" event is triggered..=0A=
    function handle_event( event ) {=0A=
      =0A=
      // Iterate over all elements to which this "outside" event is =
bound.=0A=
      $(elems).each(function(){=0A=
        var elem =3D $(this);=0A=
        =0A=
        // If this element isn't the element on which the event was =
triggered,=0A=
        // and this element doesn't contain said element, then said =
element is=0A=
        // considered to be outside, and the "outside" event will be =
triggered!=0A=
        if ( this !=3D=3D event.target && !elem.has(event.target).length =
) {=0A=
          =0A=
          // Use triggerHandler instead of trigger so that the "outside" =
event=0A=
          // doesn't bubble. Pass in the "originating" event's .target =
so that=0A=
          // the "outside" event.target can be overridden with something =
more=0A=
          // meaningful.=0A=
          elem.triggerHandler( outside_event_name, [ event.target ] );=0A=
        }=0A=
      });=0A=
    };=0A=
    =0A=
  };=0A=
  =0A=
})(jQuery,document,"outside");=0A=
=0A=
(function($) {=0A=
	$.fn.ellipsis =3D function(enableUpdating){=0A=
		var s =3D document.documentElement.style;=0A=
		if (!('textOverflow' in s || 'OTextOverflow' in s)) {=0A=
			return this.each(function(){=0A=
				var el =3D $(this);=0A=
				if(el.css("overflow") =3D=3D "hidden"){=0A=
					var originalText =3D el.html();=0A=
					var w =3D el.width();=0A=
					=0A=
					var t =3D $(this.cloneNode(true)).hide().css({=0A=
                        'position': 'absolute',=0A=
                        'width': 'auto',=0A=
                        'overflow': 'visible',=0A=
                        'max-width': 'inherit'=0A=
                    });=0A=
					el.after(t);=0A=
					=0A=
					var text =3D originalText;=0A=
					while(text.length > 0 && t.width() > el.width()){=0A=
						text =3D text.substr(0, text.length - 1);=0A=
						t.html(text + "...");=0A=
					}=0A=
					el.html(t.html());=0A=
					=0A=
					t.remove();=0A=
					=0A=
					if(enableUpdating =3D=3D true){=0A=
						var oldW =3D el.width();=0A=
						setInterval(function(){=0A=
							if(el.width() !=3D oldW){=0A=
								oldW =3D el.width();=0A=
								el.html(originalText);=0A=
								el.ellipsis();=0A=
							}=0A=
						}, 200);=0A=
					}=0A=
				}=0A=
			});=0A=
		} else return this;=0A=
	};=0A=
})(jQuery);
------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://sciverse-shindig.elsevier.com/gadgets/js/shindig-container:rpc.js?c=1&debug=1

/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @namespace The global gadgets namespace=0A=
 * @type {Object} =0A=
 */=0A=
var gadgets =3D gadgets || {}; =0A=
=0A=
/** =0A=
 * @namespace The global shindig namespace, used for shindig specific =
extensions and data=0A=
 * @type {Object} =0A=
 */=0A=
var shindig =3D shindig || {};=0A=
=0A=
/** =0A=
 * @namespace The global osapi namespace, used for opensocial API =
specific extensions=0A=
 * @type {Object} =0A=
 */=0A=
var osapi =3D osapi || {};=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Provides unified configuration for all features.=0A=
 *=0A=
 *=0A=
 * <p>This is a custom shindig library that has not yet been submitted =
for=0A=
 * standardization. It is designed to make developing of features for the=0A=
 * opensocial / gadgets platforms easier and is intended as a =
supplemental=0A=
 * tool to Shindig's standardized feature loading mechanism.=0A=
 *=0A=
 * <p>Usage:=0A=
 * First, you must register a component that needs configuration:=0A=
 * <pre>=0A=
 *   var config =3D {=0A=
 *     name : gadgets.config.NonEmptyStringValidator,=0A=
 *     url : new gadgets.config.RegExValidator(/.+%mySpecialValue%.+/)=0A=
 *   };=0A=
 *   gadgets.config.register("my-feature", config, myCallback);=0A=
 * </pre>=0A=
 *=0A=
 * <p>This will register a component named "my-feature" that expects =
input config=0A=
 * containing a "name" field with a value that is a non-empty string, =
and a=0A=
 * "url" field with a value that matches the given regular expression.=0A=
 *=0A=
 * <p>When gadgets.config.init is invoked by the container, it will =
automatically=0A=
 * validate your registered configuration and will throw an exception if=0A=
 * the provided configuration does not match what was required.=0A=
 *=0A=
 * <p>Your callback will be invoked by passing all configuration data =
passed to=0A=
 * gadgets.config.init, which allows you to optionally inspect =
configuration=0A=
 * from other features, if present.=0A=
 *=0A=
 * <p>Note that the container may optionally bypass configuration =
validation for=0A=
 * performance reasons. This does not mean that you should duplicate =
validation=0A=
 * code, it simply means that validation will likely only be performed =
in debug=0A=
 * builds, and you should assume that production builds always have valid=0A=
 * configuration.=0A=
 */=0A=
=0A=
/** @namespace */=0A=
gadgets.config =3D function() {=0A=
  var components =3D {};=0A=
  var configuration;=0A=
=0A=
  return {=0A=
    'register':=0A=
    /**=0A=
     * Registers a configurable component and its configuration =
parameters.=0A=
     * Multiple callbacks may be registered for a single component if =
needed.=0A=
     *=0A=
     * @param {string} component The name of the component to register. =
Should=0A=
     *     be the same as the fully qualified name of the <Require> =
feature or=0A=
     *     the name of a fully qualified javascript object reference=0A=
     *     (e.g. "gadgets.io").=0A=
     * @param {Object=3D} opt_validators Mapping of option name to =
validation=0A=
     *     functions that take the form function(data) {return =
isValid(data);}=0A=
     * @param {function(Object)=3D} opt_callback A function to be =
invoked when a=0A=
     *     configuration is registered. If passed, this function will be =
invoked=0A=
     *     immediately after a call to init has been made. Do not assume =
that=0A=
     *     dependent libraries have been configured until after init is=0A=
     *     complete. If you rely on this, it is better to defer calling=0A=
     *     dependent libraries until you can be sure that configuration =
is=0A=
     *     complete. Takes the form function(config), where config will =
be=0A=
     *     all registered config data for all components. This allows =
your=0A=
     *     component to read configuration from other components.=0A=
     * @member gadgets.config=0A=
     * @name register=0A=
     * @function=0A=
     */=0A=
    function(component, opt_validators, opt_callback) {=0A=
      var registered =3D components[component];=0A=
      if (!registered) {=0A=
        registered =3D [];=0A=
        components[component] =3D registered;=0A=
      }=0A=
=0A=
      registered.push({=0A=
        validators: opt_validators || {},=0A=
        callback: opt_callback=0A=
      });=0A=
    },=0A=
=0A=
    'get':=0A=
    /**=0A=
     * Retrieves configuration data on demand.=0A=
     *=0A=
     * @param {string=3D} opt_component The component to fetch. If not =
provided=0A=
     *     all configuration will be returned.=0A=
     * @return {Object} The requested configuration, or an empty object =
if no=0A=
     *     configuration has been registered for that component.=0A=
     * @member gadgets.config=0A=
     * @name get=0A=
     * @function=0A=
     */=0A=
    function(opt_component) {=0A=
      if (opt_component) {=0A=
        return configuration[opt_component] || {};=0A=
      }=0A=
      return configuration;=0A=
    },=0A=
=0A=
    /**=0A=
     * Initializes the configuration.=0A=
     *=0A=
     * @param {Object} config The full set of configuration data.=0A=
     * @param {boolean=3D} opt_noValidation True if you want to skip =
validation.=0A=
     * @throws {Error} If there is a configuration error.=0A=
     * @member gadgets.config=0A=
     * @name init =0A=
     * @function=0A=
     */=0A=
    'init': function(config, opt_noValidation) {=0A=
      configuration =3D config;=0A=
      for (var name in components) {=0A=
        if (components.hasOwnProperty(name)) {=0A=
          var componentList =3D components[name],=0A=
              conf =3D config[name];=0A=
=0A=
          for (var i =3D 0, j =3D componentList.length; i < j; ++i) {=0A=
            var component =3D componentList[i];=0A=
            if (conf && !opt_noValidation) {=0A=
              var validators =3D component.validators;=0A=
              for (var v in validators) {=0A=
                if (validators.hasOwnProperty(v)) {=0A=
                  if (!validators[v](conf[v])) {=0A=
                    throw new Error('Invalid config value "' + conf[v] +=0A=
                        '" for parameter "' + v + '" in component "' +=0A=
                        name + '"');=0A=
                  }=0A=
                }=0A=
              }=0A=
            }=0A=
=0A=
            if (component.callback) {=0A=
              component.callback(config);=0A=
            }=0A=
          }=0A=
        }=0A=
      }=0A=
    },=0A=
=0A=
    // Standard validators go here.=0A=
=0A=
    /**=0A=
     * Ensures that data is one of a fixed set of items.=0A=
     * Also supports argument sytax: EnumValidator("Dog", "Cat", "Fish");=0A=
     *=0A=
     * @param {Array.<string>} list The list of valid values.=0A=
     *=0A=
     * @member gadgets.config=0A=
     * @name  EnumValidator=0A=
     * @function=0A=
     */=0A=
    'EnumValidator': function(list) {=0A=
      var listItems =3D [];=0A=
      if (arguments.length > 1) {=0A=
        for (var i =3D 0, arg; (arg =3D arguments[i]); ++i) {=0A=
          listItems.push(arg);=0A=
        }=0A=
      } else {=0A=
        listItems =3D list;=0A=
      }=0A=
      return function(data) {=0A=
        for (var i =3D 0, test; (test =3D listItems[i]); ++i) {=0A=
          if (data =3D=3D=3D listItems[i]) {=0A=
            return true;=0A=
          }=0A=
        }=0A=
      };=0A=
    },=0A=
=0A=
    /**=0A=
     * Tests the value against a regular expression.=0A=
     * @member gadgets.config=0A=
     * @name RegexValidator=0A=
     * @function=0A=
     */=0A=
    'RegExValidator': function(re) {=0A=
      return function(data) {=0A=
        return re.test(data);=0A=
      };=0A=
    },=0A=
=0A=
    /**=0A=
     * Validates that a value was provided.=0A=
     * @param {*} data=0A=
     * @member gadgets.config=0A=
     * @name ExistsValidator=0A=
     * @function=0A=
     */=0A=
    'ExistsValidator': function(data) {=0A=
      return typeof data !=3D=3D "undefined";=0A=
    },=0A=
=0A=
    /**=0A=
     * Validates that a value is a non-empty string.=0A=
     * @param {*} data=0A=
     * @member gadgets.config=0A=
     * @name NonEmptyStringValidator=0A=
     * @function=0A=
     */=0A=
    'NonEmptyStringValidator': function(data) {=0A=
      return typeof data =3D=3D=3D "string" && data.length > 0;=0A=
    },=0A=
=0A=
    /**=0A=
     * Validates that the value is a boolean.=0A=
     * @param {*} data=0A=
     * @member gadgets.config=0A=
     * @name BooleanValidator=0A=
     * @function=0A=
     */=0A=
    'BooleanValidator': function(data) {=0A=
      return typeof data =3D=3D=3D "boolean";=0A=
    },=0A=
=0A=
    /**=0A=
     * Similar to the ECMAScript 4 virtual typing system, ensures that=0A=
     * whatever object was passed in is "like" the existing object.=0A=
     * Doesn't actually do type validation though, but instead relies=0A=
     * on other validators.=0A=
     *=0A=
     * This can be used recursively as well to validate sub-objects.=0A=
     *=0A=
     * @example=0A=
     *=0A=
     *  var validator =3D new gadgets.config.LikeValidator(=0A=
     *    "booleanField" : gadgets.config.BooleanValidator,=0A=
     *    "regexField" : new gadgets.config.RegExValidator(/foo.+/);=0A=
     *  );=0A=
     *=0A=
     *=0A=
     * @param {Object} test The object to test against.=0A=
     * @member gadgets.config=0A=
     * @name BooleanValidator=0A=
     * @function=0A=
     */=0A=
    'LikeValidator' : function(test) {=0A=
      return function(data) {=0A=
        for (var member in test) {=0A=
          if (test.hasOwnProperty(member)) {=0A=
            var t =3D test[member];=0A=
            if (!t(data[member])) {=0A=
              return false;=0A=
            }=0A=
          }=0A=
        }=0A=
        return true;=0A=
      };=0A=
    }=0A=
  };=0A=
}();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Provides gadget/container configuration flags.=0A=
 */=0A=
=0A=
/** @type {boolean} */=0A=
gadgets.config.isGadget =3D false;=0A=
/** @type {boolean} */=0A=
gadgets.config.isContainer =3D true;=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview General purpose utilities that gadgets can use.=0A=
 */=0A=
=0A=
/**=0A=
 * @static=0A=
 * @class Provides general-purpose utility functions.=0A=
 * @name gadgets.util=0A=
 */=0A=
=0A=
gadgets['util'] =3D function() {=0A=
  /**=0A=
   * Parses URL parameters into an object.=0A=
   * @param {string} url - the url parameters to parse=0A=
   * @return {Array.<string>} The parameters as an array=0A=
   */=0A=
  function parseUrlParams(url) {=0A=
    // Get settings from url, 'hash' takes precedence over 'search' =
component=0A=
    // don't use document.location.hash due to browser differences.=0A=
    var query;=0A=
    var queryIdx =3D url.indexOf("?");=0A=
    var hashIdx =3D url.indexOf("#");=0A=
    if (hashIdx =3D=3D=3D -1) {=0A=
      query =3D url.substr(queryIdx + 1);=0A=
    } else {=0A=
      // essentially replaces "#" with "&"=0A=
      query =3D [url.substr(queryIdx + 1, hashIdx - queryIdx - 1), "&",=0A=
               url.substr(hashIdx + 1)].join("");=0A=
    }=0A=
    return query.split("&");=0A=
  }=0A=
=0A=
  var parameters =3D null;=0A=
  var features =3D {};=0A=
  var services =3D {};=0A=
  var onLoadHandlers =3D [];=0A=
=0A=
  /**=0A=
   * @enum {boolean}=0A=
   * @const=0A=
   * @private=0A=
   * Maps code points to the value to replace them with.=0A=
   * If the value is "false", the character is removed entirely, =
otherwise=0A=
   * it will be replaced with an html entity.=0A=
   */=0A=
  =0A=
  var escapeCodePoints =3D {=0A=
   // nul; most browsers truncate because they use c strings under the =
covers.=0A=
   0 : false,=0A=
   // new line=0A=
   10 : true,=0A=
   // carriage return=0A=
   13 : true,=0A=
   // double quote=0A=
   34 : true,=0A=
   // single quote=0A=
   39 : true,=0A=
   // less than=0A=
   60 : true,=0A=
   // greater than=0A=
   62 : true,=0A=
   // Backslash=0A=
   92 : true,=0A=
   // line separator=0A=
   8232 : true,=0A=
   // paragraph separator=0A=
   8233 : true=0A=
  };=0A=
=0A=
  /**=0A=
   * Regular expression callback that returns strings from unicode code =
points.=0A=
   *=0A=
   * @param {Array} match Ignored=0A=
   * @param {number} value The codepoint value to convert=0A=
   * @return {string} The character corresponding to value.=0A=
   */=0A=
  function unescapeEntity(match, value) {=0A=
    return String.fromCharCode(value);=0A=
  }=0A=
=0A=
  /**=0A=
   * Initializes feature parameters.=0A=
   */=0A=
  function init(config) {=0A=
    features =3D config["core.util"] || {};=0A=
  }=0A=
  if (gadgets.config) {=0A=
    gadgets.config.register("core.util", null, init);=0A=
  }=0A=
=0A=
  return /** @scope gadgets.util */ {=0A=
=0A=
    /**=0A=
     * Gets the URL parameters.=0A=
     *=0A=
     * @param {string=3D} opt_url Optional URL whose parameters to parse.=0A=
     *                         Defaults to window's current URL.=0A=
     * @return {Object} Parameters passed into the query string=0A=
     * @member gadgets.util=0A=
     * @private Implementation detail.=0A=
     */=0A=
    'getUrlParameters' : function (opt_url) {=0A=
      if (parameters !=3D=3D null && typeof opt_url =3D=3D=3D =
"undefined") {=0A=
        // "parameters" is a cache of current window params only.=0A=
        return parameters;=0A=
      }=0A=
      var parsed =3D {};=0A=
      parameters =3D {};=0A=
      var pairs =3D parseUrlParams(opt_url || document.location.href);=0A=
      var unesc =3D window.decodeURIComponent ? decodeURIComponent : =
unescape;=0A=
      for (var i =3D 0, j =3D pairs.length; i < j; ++i) {=0A=
        var pos =3D pairs[i].indexOf('=3D');=0A=
        if (pos =3D=3D=3D -1) {=0A=
          continue;=0A=
        }=0A=
        var argName =3D pairs[i].substring(0, pos);=0A=
        var value =3D pairs[i].substring(pos + 1);=0A=
        // difference to IG_Prefs, is that args doesn't replace spaces in=0A=
        // argname. Unclear on if it should do:=0A=
        // argname =3D argname.replace(/\+/g, " ");=0A=
        value =3D value.replace(/\+/g, " ");=0A=
        parsed[argName] =3D unesc(value);=0A=
      }=0A=
      if (typeof opt_url =3D=3D=3D "undefined") {=0A=
        // Cache current-window params in parameters var.=0A=
        parameters =3D parsed;=0A=
      }=0A=
      return parsed;=0A=
    },=0A=
=0A=
    /**=0A=
     * Creates a closure that is suitable for passing as a callback.=0A=
     * Any number of arguments=0A=
     * may be passed to the callback;=0A=
     * they will be received in the order they are passed in.=0A=
     *=0A=
     * @param {Object} scope The execution scope; may be null if there =
is no=0A=
     *     need to associate a specific instance of an object with this=0A=
     *     callback=0A=
     * @param {function(Object,Object)} callback The callback to invoke =
when this is run;=0A=
     *     any arguments passed in will be passed after your initial =
arguments=0A=
     * @param {Object} var_args Initial arguments to be passed to the =
callback=0A=
     *=0A=
     * @member gadgets.util=0A=
     * @private Implementation detail.=0A=
     */=0A=
    'makeClosure' : function (scope, callback, var_args) {=0A=
      // arguments isn't a real array, so we copy it into one.=0A=
      var baseArgs =3D [];=0A=
      for (var i =3D 2, j =3D arguments.length; i < j; ++i) {=0A=
       baseArgs.push(arguments[i]);=0A=
      }=0A=
      return function() {=0A=
        // append new arguments.=0A=
        var tmpArgs =3D baseArgs.slice();=0A=
        for (var i =3D 0, j =3D arguments.length; i < j; ++i) {=0A=
          tmpArgs.push(arguments[i]);=0A=
        }=0A=
        return callback.apply(scope, tmpArgs);=0A=
      };=0A=
    },=0A=
=0A=
    /**=0A=
     * Utility function for generating an "enum" from an array.=0A=
     *=0A=
     * @param {Array.<string>} values The values to generate.=0A=
     * @return {Object.<string,string>} An object with member fields to =
handle=0A=
     *   the enum.=0A=
     *=0A=
     * @private Implementation detail.=0A=
     */=0A=
    'makeEnum' : function (values) {=0A=
      var obj =3D {};=0A=
      for (var i =3D 0, v; (v =3D values[i]); ++i) {=0A=
        obj[v] =3D v;=0A=
      }=0A=
      return obj;=0A=
    },=0A=
=0A=
    /**=0A=
     * Gets the feature parameters.=0A=
     *=0A=
     * @param {string} feature The feature to get parameters for=0A=
     * @return {Object} The parameters for the given feature, or null=0A=
     *=0A=
     * @member gadgets.util=0A=
     */=0A=
    'getFeatureParameters' : function (feature) {=0A=
      return typeof features[feature] =3D=3D=3D "undefined" ? null : =
features[feature];=0A=
    },=0A=
=0A=
    /**=0A=
     * Returns whether the current feature is supported.=0A=
     *=0A=
     * @param {string} feature The feature to test for=0A=
     * @return {boolean} True if the feature is supported=0A=
     *=0A=
     * @member gadgets.util=0A=
     */=0A=
    'hasFeature' : function (feature) {=0A=
      return typeof features[feature] !=3D=3D "undefined";=0A=
    },=0A=
    =0A=
    /**=0A=
     * Returns the list of services supported by the server=0A=
     * serving this gadget.=0A=
     *=0A=
     * @return {Object} List of Services that enumerate their methods=0A=
     *=0A=
     * @member gadgets.util=0A=
     */=0A=
    'getServices' : function () {=0A=
      return services;=0A=
    },=0A=
=0A=
    /**=0A=
     * Registers an onload handler.=0A=
     * @param {function()} callback The handler to run=0A=
     *=0A=
     * @member gadgets.util=0A=
     */=0A=
    'registerOnLoadHandler' : function (callback) {=0A=
      onLoadHandlers.push(callback);=0A=
    },=0A=
=0A=
    /**=0A=
     * Runs all functions registered via registerOnLoadHandler.=0A=
     * @private Only to be used by the container, not gadgets.=0A=
     */=0A=
    'runOnLoadHandlers' : function () {=0A=
      for (var i =3D 0, j =3D onLoadHandlers.length; i < j; ++i) {=0A=
        onLoadHandlers[i]();=0A=
      }=0A=
    },=0A=
=0A=
    /**=0A=
     * Escapes the input using html entities to make it safer.=0A=
     *=0A=
     * If the input is a string, uses gadgets.util.escapeString.=0A=
     * If it is an array, calls escape on each of the array elements=0A=
     * if it is an object, will only escape all the mapped keys and =
values if=0A=
     * the opt_escapeObjects flag is set. This operation involves =
creating an=0A=
     * entirely new object so only set the flag when the input is a =
simple=0A=
     * string to string map.=0A=
     * Otherwise, does not attempt to modify the input.=0A=
     *=0A=
     * @param {Object} input The object to escape=0A=
     * @param {boolean=3D} opt_escapeObjects Whether to escape objects.=0A=
     * @return {Object} The escaped object=0A=
     * @private Only to be used by the container, not gadgets.=0A=
     */=0A=
    'escape' : function(input, opt_escapeObjects) {=0A=
      if (!input) {=0A=
        return input;=0A=
      } else if (typeof input =3D=3D=3D "string") {=0A=
        return gadgets.util.escapeString(input);=0A=
      } else if (typeof input =3D=3D=3D "array") {=0A=
        for (var i =3D 0, j =3D input.length; i < j; ++i) {=0A=
          input[i] =3D gadgets.util.escape(input[i]);=0A=
        }=0A=
      } else if (typeof input =3D=3D=3D "object" && opt_escapeObjects) {=0A=
        var newObject =3D {};=0A=
        for (var field in input) {=0A=
          if (input.hasOwnProperty(field)) {=0A=
            newObject[gadgets.util.escapeString(field)] =3D =
gadgets.util.escape(input[field], true);=0A=
          }=0A=
        }=0A=
        return newObject;=0A=
      }=0A=
      return input;=0A=
    },=0A=
=0A=
    /**=0A=
     * Escapes the input using html entities to make it safer.=0A=
     *=0A=
     * Currently not in the spec -- future proposals may change=0A=
     * how this is handled.=0A=
     *=0A=
     * TODO: Parsing the string would probably be more accurate and =
faster than=0A=
     * a bunch of regular expressions.=0A=
     *=0A=
     * @param {string} str The string to escape=0A=
     * @return {string} The escaped string=0A=
     */=0A=
    'escapeString' : function(str) {=0A=
      if (!str) return str;=0A=
      var out =3D [], ch, shouldEscape;=0A=
      for (var i =3D 0, j =3D str.length; i < j; ++i) {=0A=
        ch =3D str.charCodeAt(i);=0A=
        shouldEscape =3D escapeCodePoints[ch];=0A=
        if (shouldEscape =3D=3D=3D true) {=0A=
          out.push("&#", ch, ";");=0A=
        } else if (shouldEscape !=3D=3D false) {=0A=
          // undefined or null are OK.=0A=
          out.push(str.charAt(i));=0A=
        }=0A=
      }=0A=
      return out.join("");=0A=
    },=0A=
=0A=
    /**=0A=
     * Reverses escapeString=0A=
     *=0A=
     * @param {string} str The string to unescape.=0A=
     * @return {string}=0A=
     */=0A=
    'unescapeString' : function(str) {=0A=
      if (!str) return str;=0A=
      return str.replace(/&#([0-9]+);/g, unescapeEntity);=0A=
    }=0A=
  };=0A=
}();=0A=
// Initialize url parameters so that hash data is pulled in before it =
can be=0A=
// altered by a click.=0A=
gadgets['util'].getUrlParameters();=0A=
=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @class=0A=
 * Tame and expose core gadgets.* API to cajoled gadgets=0A=
 */=0A=
var tamings___ =3D tamings___ || [];=0A=
tamings___.push(function(imports) {=0A=
  caja___.whitelistFuncs([=0A=
    [gadgets.util, 'escapeString'],=0A=
    [gadgets.util, 'getFeatureParameters'],=0A=
    [gadgets.util, 'getUrlParameters'],=0A=
    [gadgets.util, 'hasFeature'],=0A=
    [gadgets.util, 'registerOnLoadHandler'],=0A=
    [gadgets.util, 'unescapeString']=0A=
  ]);=0A=
});=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Support for basic logging capability for gadgets.=0A=
 *=0A=
 * This functionality replaces alert(msg) and window.console.log(msg).=0A=
 *=0A=
 * <p>Currently only works on browsers with a console (WebKit based =
browsers,=0A=
 * Firefox with Firebug extension, or Opera).=0A=
 *=0A=
 * <p>API is designed to be equivalent to existing console.log | warn | =
error=0A=
 * logging APIs supported by Firebug and WebKit based browsers. The only=0A=
 * addition is the ability to call gadgets.setLogLevel().=0A=
 */=0A=
=0A=
/**=0A=
 * @static=0A=
 * @namespace Support for basic logging capability for gadgets.=0A=
 * @name gadgets.log=0A=
 */=0A=
=0A=
gadgets['log'] =3D (function() {=0A=
   /** @const */=0A=
   var info_=3D1;=0A=
   /** @const */=0A=
   var warning_=3D2;=0A=
   /** @const */=0A=
   var error_=3D3;=0A=
   /** @const */=0A=
   var none_=3D4;=0A=
=0A=
/**=0A=
 * Log an informational message=0A=
 * @param {Object} message - the message to log=0A=
 * @member gadgets=0A=
 * @name log=0A=
 * @function=0A=
 */=0A=
var log =3D function(message) {=0A=
  logAtLevel(info_, message);=0A=
};=0A=
 =0A=
/**=0A=
 * Log a warning=0A=
 * @param {Object} message - the message to log=0A=
 * @static =0A=
 */=0A=
gadgets.warn =3D function(message) {=0A=
  logAtLevel(warning_, message);=0A=
};=0A=
=0A=
/**=0A=
 * Log an error=0A=
 * @param {Object} message - The message to log=0A=
 * @static =0A=
 */=0A=
gadgets.error =3D function(message) {=0A=
  logAtLevel(error_, message);=0A=
};=0A=
=0A=
/**=0A=
 * Sets the log level threshold.=0A=
 * @param {number} logLevel - New log level threshold.=0A=
 * @static=0A=
 * @member gadgets.log=0A=
 * @name setLogLevel=0A=
 */=0A=
gadgets['setLogLevel'] =3D function(logLevel) {=0A=
  logLevelThreshold_ =3D logLevel;=0A=
};=0A=
=0A=
/**=0A=
 * Logs a log message if output console is available, and log threshold =
is met.=0A=
 * @param {number} level - the level to log with. Optional, defaults to =
gadgets.log.INFO.=0A=
 * @param {Object} message - The message to log=0A=
 * @private=0A=
 */=0A=
 function logAtLevel(level, message) {=0A=
  if (level < logLevelThreshold_ || !_console) {=0A=
    return;=0A=
  }=0A=
=0A=
  if (level =3D=3D=3D warning_ && _console.warn) {=0A=
    _console.warn(message);=0A=
  } else if (level =3D=3D=3D error_ && _console.error) {=0A=
    _console.error(message);=0A=
  } else if (_console.log) {=0A=
    _console.log(message);=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Log level for informational logging.=0A=
 * @static=0A=
 * @const=0A=
 * @member gadgets.log=0A=
 * @name INFO=0A=
 */=0A=
log['INFO'] =3D info_;=0A=
=0A=
/**=0A=
 * Log level for warning logging.=0A=
 * @static=0A=
 * @const=0A=
 * @member gadgets.log=0A=
 * @name WARNING=0A=
 */=0A=
log['WARNING'] =3D warning_;=0A=
=0A=
/**=0A=
 * Log level for no logging=0A=
 * @static=0A=
 * @const=0A=
 * @member gadgets.log=0A=
 * @name NONE=0A=
 */=0A=
log['NONE'] =3D none_;=0A=
=0A=
/**=0A=
 * Current log level threshold.=0A=
 * @type {number}=0A=
 * @private=0A=
 */=0A=
var logLevelThreshold_ =3D info_;=0A=
=0A=
=0A=
=0A=
/**=0A=
 * Console to log to=0A=
 * @private=0A=
 * @static=0A=
 */=0A=
var _console =3D window.console ? window.console :=0A=
                       window.opera   ? window.opera.postError : =
undefined;=0A=
=0A=
   return log; =0A=
})();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @class=0A=
 * Tame and expose core gadgets.* API to cajoled gadgets=0A=
 */=0A=
var tamings___ =3D tamings___ || [];=0A=
tamings___.push(function(imports) {=0A=
  ___.grantRead(gadgets.log, 'INFO');=0A=
  ___.grantRead(gadgets.log, 'WARNING');=0A=
  ___.grantRead(gadgets.log, 'ERROR');=0A=
  ___.grantRead(gadgets.log, 'NONE');=0A=
  caja___.whitelistFuncs([=0A=
    [gadgets, 'log'],=0A=
    [gadgets, 'warn'],=0A=
    [gadgets, 'error'],=0A=
    [gadgets, 'setLogLevel']=0A=
  ]);=0A=
});=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview=0A=
 * The global object gadgets.json contains two methods.=0A=
 *=0A=
 * gadgets.json.stringify(value) takes a JavaScript value and produces a =
JSON=0A=
 * text. The value must not be cyclical.=0A=
 *=0A=
 * gadgets.json.parse(text) takes a JSON text and produces a JavaScript =
value.=0A=
 * It will return false if there is an error.=0A=
 */=0A=
=0A=
/**=0A=
 * @static=0A=
 * @class Provides operations for translating objects to and from JSON.=0A=
 * @name gadgets.json=0A=
 */=0A=
=0A=
/**=0A=
 * Port of the public domain JSON library by Douglas Crockford.=0A=
 * See: http://www.json.org/json2.js=0A=
 */=0A=
if (window.JSON && window.JSON.parse && window.JSON.stringify) {=0A=
  // HTML5 implementation, or already defined.=0A=
  // Not a direct alias as the opensocial specification disagrees with =
the HTML5 JSON spec.=0A=
  // JSON says to throw on parse errors and to support filtering =
functions. OS does not.=0A=
  gadgets['json'] =3D (function() {=0A=
    var endsWith___ =3D /___$/;=0A=
    return {=0A=
      /* documented below */=0A=
      'parse': function(str) {=0A=
        try {=0A=
          return window.JSON.parse(str);=0A=
        } catch (e) {=0A=
          return false;=0A=
        }=0A=
      },=0A=
      /* documented below */=0A=
      'stringify': function(obj) {=0A=
        try {=0A=
          return window.JSON.stringify(obj, function(k,v) {=0A=
            return !endsWith___.test(k) ? v : null;=0A=
          });=0A=
        } catch (e) {=0A=
          return null;=0A=
        }=0A=
      }=0A=
    };=0A=
  })();=0A=
} else {=0A=
/**=0A=
 * Port of the public domain JSON library by Douglas Crockford.=0A=
 * See: http://www.json.org/json2.js=0A=
 */=0A=
  gadgets['json'] =3D function () {=0A=
  =0A=
    /**=0A=
     * Formats integers to 2 digits.=0A=
     * @param {number} n=0A=
     * @private=0A=
     */=0A=
    function f(n) {=0A=
      return n < 10 ? '0' + n : n;=0A=
    }=0A=
  =0A=
    Date.prototype.toJSON =3D function () {=0A=
      return [this.getUTCFullYear(), '-',=0A=
             f(this.getUTCMonth() + 1), '-',=0A=
             f(this.getUTCDate()), 'T',=0A=
             f(this.getUTCHours()), ':',=0A=
             f(this.getUTCMinutes()), ':',=0A=
             f(this.getUTCSeconds()), 'Z'].join("");=0A=
    };=0A=
  =0A=
    // table of character substitutions=0A=
    /**=0A=
     * @const=0A=
     * @enum {string}=0A=
     */=0A=
    var m =3D {=0A=
      '\b': '\\b',=0A=
      '\t': '\\t',=0A=
      '\n': '\\n',=0A=
      '\f': '\\f',=0A=
      '\r': '\\r',=0A=
      '"' : '\\"',=0A=
      '\\': '\\\\'=0A=
    };=0A=
  =0A=
    /**=0A=
     * Converts a json object into a string.=0A=
     * @param {*} value=0A=
     * @return {string}=0A=
     * @member gadgets.json=0A=
     */=0A=
    function stringify(value) {=0A=
      var a,          // The array holding the partial texts.=0A=
          i,          // The loop counter.=0A=
          k,          // The member key.=0A=
          l,          // Length.=0A=
          r =3D /["\\\x00-\x1f\x7f-\x9f]/g,=0A=
          v;          // The member value.=0A=
  =0A=
      switch (typeof value) {=0A=
      case 'string':=0A=
      // If the string contains no control characters, no quote =
characters, and no=0A=
      // backslash characters, then we can safely slap some quotes =
around it.=0A=
      // Otherwise we must also replace the offending characters with =
safe ones.=0A=
        return r.test(value) ?=0A=
            '"' + value.replace(r, function (a) {=0A=
              var c =3D m[a];=0A=
              if (c) {=0A=
                return c;=0A=
              }=0A=
              c =3D a.charCodeAt();=0A=
              return '\\u00' + Math.floor(c / 16).toString(16) +=0A=
                  (c % 16).toString(16);=0A=
              }) + '"' : '"' + value + '"';=0A=
      case 'number':=0A=
      // JSON numbers must be finite. Encode non-finite numbers as null.=0A=
        return isFinite(value) ? String(value) : 'null';=0A=
      case 'boolean':=0A=
      case 'null':=0A=
        return String(value);=0A=
      case 'object':=0A=
      // Due to a specification blunder in ECMAScript,=0A=
      // typeof null is 'object', so watch out for that case.=0A=
        if (!value) {=0A=
          return 'null';=0A=
        }=0A=
        // toJSON check removed; re-implement when it doesn't break =
other libs.=0A=
        a =3D [];=0A=
        if (typeof value.length =3D=3D=3D 'number' &&=0A=
            !value.propertyIsEnumerable('length')) {=0A=
          // The object is an array. Stringify every element. Use null =
as a=0A=
          // placeholder for non-JSON values.=0A=
          l =3D value.length;=0A=
          for (i =3D 0; i < l; i +=3D 1) {=0A=
            a.push(stringify(value[i]) || 'null');=0A=
          }=0A=
          // Join all of the elements together and wrap them in brackets.=0A=
          return '[' + a.join(',') + ']';=0A=
        }=0A=
        // Otherwise, iterate through all of the keys in the object.=0A=
        for (k in value) {=0A=
          if (k.match('___$'))=0A=
            continue;=0A=
          if (value.hasOwnProperty(k)) {=0A=
            if (typeof k =3D=3D=3D 'string') {=0A=
              v =3D stringify(value[k]);=0A=
              if (v) {=0A=
                a.push(stringify(k) + ':' + v);=0A=
              }=0A=
            }=0A=
          }=0A=
        }=0A=
        // Join all of the member texts together and wrap them in braces.=0A=
        return '{' + a.join(',') + '}';=0A=
      }=0A=
    }=0A=
  =0A=
    return {=0A=
      'stringify': stringify,=0A=
      'parse': function (text) {=0A=
      // Parsing happens in three stages. In the first stage, we run the =
text against=0A=
      // regular expressions that look for non-JSON patterns. We are =
especially=0A=
      // concerned with '()' and 'new' because they can cause =
invocation, and '=3D'=0A=
      // because it can cause mutation. But just to be safe, we want to =
reject all=0A=
      // unexpected forms.=0A=
      =0A=
      // We split the first stage into 4 regexp operations in order to =
work around=0A=
      // crippling inefficiencies in IE's and Safari's regexp engines. =
First we=0A=
      // replace all backslash pairs with '@' (a non-JSON character). =
Second, we=0A=
      // replace all simple value tokens with ']' characters. Third, we =
delete all=0A=
      // open brackets that follow a colon or comma or that begin the =
text. Finally,=0A=
      // we look to see that the remaining characters are only =
whitespace or ']' or=0A=
      // ',' or ':' or '{' or '}'. If that is so, then the text is safe =
for eval.=0A=
  =0A=
        if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/b-u]/g, '@').=0A=
            =
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/=
g, ']').=0A=
            replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {=0A=
          return eval('(' + text + ')');=0A=
        }=0A=
        // If the text is not JSON parseable, then return false.=0A=
  =0A=
        return false;=0A=
      }=0A=
    };=0A=
  }();=0A=
}=0A=
/**=0A=
 * Flatten an object to a stringified values. Useful for dealing with=0A=
 * json->querystring transformations. =0A=
 * =0A=
 * @param obj {Object}=0A=
 * @return {Object} object with only string values=0A=
 * @private not in official specification yet=0A=
 */=0A=
=0A=
gadgets['json'].flatten =3D function(obj) {=0A=
  var flat =3D {};=0A=
=0A=
  if (obj =3D=3D=3D null || obj =3D=3D=3D undefined) return flat;=0A=
=0A=
  for (var k in obj) {=0A=
    if (obj.hasOwnProperty(k)) {=0A=
      var value =3D obj[k];=0A=
      if (null =3D=3D=3D value || undefined =3D=3D=3D value) {=0A=
        continue;=0A=
      }=0A=
      flat[k] =3D (typeof value =3D=3D=3D 'string') ? value : =
gadgets.json.stringify(value);=0A=
    }=0A=
  }=0A=
  return flat;=0A=
}=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @class=0A=
 * Tame and expose core gadgets.* API to cajoled gadgets=0A=
 */=0A=
var tamings___ =3D tamings___ || [];=0A=
tamings___.push(function(imports) {=0A=
    ___.tamesTo(gadgets.json.stringify, safeJSON.stringify);=0A=
    ___.tamesTo(gadgets.json.parse, safeJSON.parse);=0A=
});=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/*global gadgets */=0A=
=0A=
/**=0A=
 * @fileoverview=0A=
 *=0A=
 * Manages the gadget security token AKA the gadget auth token AKA the=0A=
 * social token.  Also provides an API for the container server to=0A=
 * efficiently pass authenticated data to the gadget at render time.=0A=
 *=0A=
 * The shindig.auth package is not part of the opensocial or gadgets =
spec,=0A=
 * and gadget authors should never use these functions or the security =
token=0A=
 * directly.  These APIs are an implementation detail and are for shindig=0A=
 * internal use only.=0A=
 *=0A=
 * Passing authenticated data into the gadget at render time:=0A=
 *=0A=
 * The gadget auth token is the only way for the container to allow the=0A=
 * gadget access to authenticated data.  gadgets.io.makeRequest for =
SIGNED=0A=
 * or OAUTH requests relies on the authentication token.  Access to =
social data=0A=
 * also relies on the authentication token.=0A=
 *=0A=
 * The authentication token is normally passed into the gadget on the URL=0A=
 * fragment (after the #), and so is not visible to the gadget rendering=0A=
 * server.  This keeps the token from being leaked in referer headers, =
but at=0A=
 * the same time limits the amount of authenticated data the gadget can =
view=0A=
 * quickly: fetching authenticated data requires an extra round trip.=0A=
 *=0A=
 * If the authentication token is passed to the gadget as a query =
parameter,=0A=
 * the gadget rendering server gets an opportunity to view the token =
during=0A=
 * the rendering process.  This allows the rendering server to quickly =
inject=0A=
 * authenticated data into the gadget, at the price of potentially =
leaking=0A=
 * the authentication token in referer headers.  That risk can be =
mitigated=0A=
 * by using a short-lived authentication token on the query string, which=0A=
 * the gadget server can swap for a longer lived token at render time.=0A=
 *=0A=
 * If the rendering server injects authenticated data into the gadget in =
the=0A=
 * form of a JSON string, the resulting javascript object can be =
accessed via=0A=
 * shindig.auth.getTrustedData.=0A=
 *=0A=
 * To access the security token:=0A=
 *   var st =3D shindig.auth.getSecurityToken();=0A=
 *=0A=
 * To update the security token with new data from the gadget server:=0A=
 *   shindig.auth.updateSecurityToken(newToken);=0A=
 *=0A=
 * To quickly access a javascript object that has been authenticated by =
the=0A=
 * container and the rendering server:=0A=
 *   var trusted =3D shindig.auth.getTrustedData();=0A=
 *   doSomething(trusted.foo.bar);=0A=
 */=0A=
=0A=
/**=0A=
 * Class used to mange the gadget auth token.  Singleton initialized from=0A=
 * auth-init.js.=0A=
 *=0A=
 * @constructor=0A=
 */=0A=
shindig.Auth =3D function() {=0A=
  /**=0A=
   * The authentication token.=0A=
   */=0A=
  var authToken =3D null;=0A=
=0A=
  /**=0A=
   * Trusted object from container.=0A=
   */=0A=
  var trusted =3D null;=0A=
=0A=
  /**=0A=
   * Copy URL parameters into the auth token=0A=
   *=0A=
   * The initial auth token can look like this:=0A=
   *    t=3Dabcd&url=3D$&foo=3D=0A=
   *=0A=
   * If any of the values in the token are '$', a matching parameter=0A=
   * from the URL will be inserted, for example:=0A=
   *    t=3Dabcd&url=3Dhttp%3A%2F%2Fsome.gadget.com&foo=3D=0A=
   *=0A=
   * Why do this at all?  The only currently known use case for this is=0A=
   * efficiently including the gadget URL in the auth token.  If you =
embed=0A=
   * the entire URL in the security token, you effectively double the =
size=0A=
   * of the URL passed on the gadget rendering request:=0A=
   *   /gadgets/ifr?url=3D<gadget-url>#st=3D<encrypted-gadget-url>=0A=
   *=0A=
   * This can push the gadget render URL beyond the max length supported=0A=
   * by browsers, and then things break.  To work around this, the=0A=
   * security token can include only a (much shorter) hash of the =
gadget-url:=0A=
   *  /gadgets/ifr?url=3D<gadget-url>#st=3D<xyz>=0A=
   *=0A=
   * However, we still want the proxy that handles gadgets.io.makeRequest=0A=
   * to be able to look up the gadget URL efficiently, without requring=0A=
   * a database hit.  To do that, we modify the auth token here to fill=0A=
   * in any blank values.  The auth token then becomes:=0A=
   *    t=3D<xyz>&url=3D<gadget-url>=0A=
   *=0A=
   * We send the expanded auth token in the body of post requests, so we=0A=
   * don't run into problems with length there.  (But people who put=0A=
   * several hundred characters in their gadget URLs are still lame.)=0A=
   * @param {Object} urlParams=0A=
   */=0A=
  function addParamsToToken(urlParams) {=0A=
    var args =3D authToken.split('&');=0A=
    for (var i =3D 0; i < args.length; i++) {=0A=
      var nameAndValue =3D args[i].split('=3D');=0A=
      if (nameAndValue.length =3D=3D=3D 2) {=0A=
        var name =3D nameAndValue[0];=0A=
        var value =3D nameAndValue[1];=0A=
        if (value =3D=3D=3D '$') {=0A=
          value =3D encodeURIComponent(urlParams[name]);=0A=
          args[i] =3D name + '=3D' + value;=0A=
        }=0A=
      }=0A=
    }=0A=
    authToken =3D args.join('&');=0A=
  }=0A=
=0A=
  function init (configuration) {=0A=
    var urlParams =3D gadgets.util.getUrlParameters();=0A=
    var config =3D configuration["shindig.auth"] || {};=0A=
=0A=
    // Auth token - might be injected into the gadget directly, or might=0A=
    // be on the URL (hopefully on the fragment).=0A=
    if (config.authToken) {=0A=
      authToken =3D config.authToken;=0A=
    } else if (urlParams.st) {=0A=
      authToken =3D urlParams.st;=0A=
    }=0A=
    if (authToken !=3D=3D null) {=0A=
      addParamsToToken(urlParams);=0A=
    }=0A=
=0A=
    // Trusted JSON.  We use eval directly because this was injected by =
the=0A=
    // container server and json parsing is slow in IE.=0A=
    if (config.trustedJson) {=0A=
      trusted =3D eval("(" + config.trustedJson + ")");=0A=
    }=0A=
  }=0A=
=0A=
  gadgets.config.register("shindig.auth", null, init);=0A=
=0A=
  return /** @scope shindig.auth */ {=0A=
=0A=
    /**=0A=
     * Gets the auth token.=0A=
     *=0A=
     * @return {string} the gadget authentication token=0A=
     *=0A=
     * @member shindig.auth=0A=
     */=0A=
    getSecurityToken : function() {=0A=
      return authToken;=0A=
    },=0A=
=0A=
    /**=0A=
     * Updates the security token with new data from the gadget server.=0A=
     *=0A=
     * @param {string} newToken the new auth token data.=0A=
     *=0A=
     * @member shindig.auth=0A=
     */=0A=
    updateSecurityToken : function(newToken) {=0A=
      authToken =3D newToken;=0A=
    },=0A=
=0A=
    /**=0A=
     * Quickly retrieves data that is known to have been injected by=0A=
     * a trusted container server.=0A=
     * @return {Object}=0A=
     */=0A=
    getTrustedData : function() {=0A=
      return trusted;=0A=
    }=0A=
  };=0A=
};=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview=0A=
 *=0A=
 * Bootstraps auth.js.=0A=
 */=0A=
=0A=
shindig.auth =3D new shindig.Auth();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
gadgets.rpctx =3D gadgets.rpctx || {};=0A=
=0A=
/**=0A=
 * Transport for browsers that support native messaging (various =
implementations=0A=
 * of the HTML5 postMessage method). Officially defined at=0A=
 * =
http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html.=0A=
 *=0A=
 * postMessage is a native implementation of XDC. A page registers that=0A=
 * it would like to receive messages by listening the the "message" event=0A=
 * on the window (document in DPM) object. In turn, another page can=0A=
 * raise that event by calling window.postMessage (document.postMessage=0A=
 * in DPM) with a string representing the message and a string=0A=
 * indicating on which domain the receiving page must be to receive=0A=
 * the message. The target page will then have its "message" event raised=0A=
 * if the domain matches and can, in turn, check the origin of the =
message=0A=
 * and process the data contained within.=0A=
 *=0A=
 *   wpm: postMessage on the window object.=0A=
 *      - Internet Explorer 8+=0A=
 *      - Safari 4+=0A=
 *      - Chrome 2+=0A=
 *      - Webkit nightlies=0A=
 *      - Firefox 3+=0A=
 *      - Opera 9+=0A=
 */=0A=
if (!gadgets.rpctx.wpm) {  // make lib resilient to double-inclusion=0A=
=0A=
gadgets.rpctx.wpm =3D function() {=0A=
  var ready;=0A=
=0A=
  return {=0A=
    getCode: function() {=0A=
      return 'wpm';=0A=
    },=0A=
=0A=
    isParentVerifiable: function() {=0A=
      return true;=0A=
    },=0A=
=0A=
    init: function(processFn, readyFn) {=0A=
      ready =3D readyFn;=0A=
      var onmessage =3D function(packet) {=0A=
        // TODO validate packet.domain for security reasons=0A=
        processFn(gadgets.json.parse(packet.data));=0A=
      };=0A=
 =0A=
      // Set up native postMessage handler.=0A=
      if (typeof window.addEventListener !=3D 'undefined') { =0A=
          window.addEventListener('message', onmessage, false); =0A=
      } else if (typeof window.attachEvent !=3D 'undefined') { =0A=
          window.attachEvent('onmessage', onmessage); =0A=
      } else {=0A=
          gadgets.warn("wpm init failure");=0A=
      }=0A=
=0A=
      ready('..', true);  // Immediately ready to send to parent.=0A=
      return true;=0A=
    },=0A=
=0A=
    setup: function(receiverId, token) {=0A=
      // If we're a gadget, send an ACK message to indicate to container=0A=
      // that we're ready to receive messages.=0A=
      if (receiverId =3D=3D=3D '..') {=0A=
        gadgets.rpc.call(receiverId, gadgets.rpc.ACK);=0A=
      }=0A=
      return true;=0A=
    },=0A=
=0A=
    call: function(targetId, from, rpc) {=0A=
      var targetWin =3D gadgets.rpc._getTargetWin(targetId);=0A=
      // targetOrigin =3D canonicalized relay URL=0A=
      var origRelay =3D gadgets.rpc.getRelayUrl(targetId) ||=0A=
                      gadgets.util.getUrlParameters()["parent"];=0A=
      var origin =3D gadgets.rpc.getOrigin(origRelay);=0A=
      if (origin) {=0A=
        targetWin.postMessage(gadgets.json.stringify(rpc), origin);=0A=
      } else {=0A=
        gadgets.error("No relay set (used as window.postMessage =
targetOrigin)" +=0A=
            ", cannot send cross-domain message");=0A=
      }=0A=
      return true;=0A=
    }=0A=
  };=0A=
}();=0A=
=0A=
} // !end of double-inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
gadgets.rpctx =3D gadgets.rpctx || {};=0A=
=0A=
/*=0A=
 * For Gecko-based browsers, the security model allows a child to call a=0A=
 * function on the frameElement of the iframe, even if the child is in=0A=
 * a different domain. This method is dubbed "frameElement" (fe).=0A=
 *=0A=
 * The ability to add and call such functions on the frameElement allows=0A=
 * a bidirectional channel to be setup via the adding of simple function=0A=
 * references on the frameElement object itself. In this implementation,=0A=
 * when the container sets up the authentication information for that =
gadget=0A=
 * (by calling setAuth(...)) it as well adds a special function on the=0A=
 * gadget's iframe. This function can then be used by the gadget to send=0A=
 * messages to the container. In turn, when the gadget tries to send a=0A=
 * message, it checks to see if this function has its own function stored=0A=
 * that can be used by the container to call the gadget. If not, the=0A=
 * function is created and subsequently used by the container.=0A=
 * Note that as a result, FE can only be used by a container to call a=0A=
 * particular gadget *after* that gadget has called the container at=0A=
 * least once via FE.=0A=
 *=0A=
 *   fe: Gecko-specific frameElement trick.=0A=
 *      - Firefox 1+=0A=
 */=0A=
if (!gadgets.rpctx.frameElement) {  // make lib resilient to =
double-inclusion=0A=
=0A=
gadgets.rpctx.frameElement =3D function() {=0A=
  // Consts for FrameElement.=0A=
  var FE_G2C_CHANNEL =3D '__g2c_rpc';=0A=
  var FE_C2G_CHANNEL =3D '__c2g_rpc';=0A=
  var process;=0A=
  var ready;=0A=
=0A=
  function callFrameElement(targetId, from, rpc) {=0A=
    try {=0A=
      if (from !=3D=3D '..') {=0A=
        // Call from gadget to the container.=0A=
        var fe =3D window.frameElement;=0A=
=0A=
        if (typeof fe[FE_G2C_CHANNEL] =3D=3D=3D 'function') {=0A=
          // Complete the setup of the FE channel if need be.=0A=
          if (typeof fe[FE_G2C_CHANNEL][FE_C2G_CHANNEL] !=3D=3D =
'function') {=0A=
            fe[FE_G2C_CHANNEL][FE_C2G_CHANNEL] =3D function(args) {=0A=
              process(gadgets.json.parse(args));=0A=
            };=0A=
          }=0A=
=0A=
          // Conduct the RPC call.=0A=
          fe[FE_G2C_CHANNEL](gadgets.json.stringify(rpc));=0A=
          return;=0A=
        }=0A=
      } else {=0A=
        // Call from container to gadget[targetId].=0A=
        var frame =3D document.getElementById(targetId);=0A=
=0A=
        if (typeof frame[FE_G2C_CHANNEL] =3D=3D=3D 'function' &&=0A=
            typeof frame[FE_G2C_CHANNEL][FE_C2G_CHANNEL] =3D=3D=3D =
'function') {=0A=
=0A=
          // Conduct the RPC call.=0A=
          =
frame[FE_G2C_CHANNEL][FE_C2G_CHANNEL](gadgets.json.stringify(rpc));=0A=
          return;=0A=
        }=0A=
      }=0A=
    } catch (e) {=0A=
    }=0A=
    return true;=0A=
  }=0A=
=0A=
  return {=0A=
    getCode: function() {=0A=
      return 'fe';=0A=
    },=0A=
=0A=
    isParentVerifiable: function() {=0A=
      return false;=0A=
    },=0A=
  =0A=
    init: function(processFn, readyFn) {=0A=
      // No global setup.=0A=
      process =3D processFn;=0A=
      ready =3D readyFn;=0A=
      return true;=0A=
    },=0A=
=0A=
    setup: function(receiverId, token) {=0A=
      // Indicate OK to call to container. This will be true=0A=
      // by the end of this method.=0A=
      if (receiverId !=3D=3D '..') {=0A=
        try {=0A=
          var frame =3D document.getElementById(receiverId);=0A=
          frame[FE_G2C_CHANNEL] =3D function(args) {=0A=
            process(gadgets.json.parse(args));=0A=
          };=0A=
        } catch (e) {=0A=
          return false;=0A=
        }=0A=
      }=0A=
      if (receiverId =3D=3D=3D '..') {=0A=
        ready('..', true);=0A=
        var ackFn =3D function() {=0A=
          window.setTimeout(function() {=0A=
            gadgets.rpc.call(receiverId, gadgets.rpc.ACK);=0A=
          }, 500);=0A=
        };=0A=
        // Setup to container always happens before onload.=0A=
        // If it didn't, the correct fix would be in gadgets.util.=0A=
        gadgets.util.registerOnLoadHandler(ackFn);=0A=
      }=0A=
      return true;=0A=
    },=0A=
=0A=
    call: function(targetId, from, rpc) {=0A=
      callFrameElement(targetId, from, rpc);=0A=
    } =0A=
=0A=
  };=0A=
}();=0A=
=0A=
} // !end of double-inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
gadgets.rpctx =3D gadgets.rpctx || {};=0A=
=0A=
/**=0A=
 * For Internet Explorer before version 8, the security model allows =
anyone=0A=
 * parent to set the value of the "opener" property on another window,=0A=
 * with only the receiving window able to read it.=0A=
 * This method is dubbed "Native IE XDC" (NIX).=0A=
 *=0A=
 * This method works by placing a handler object in the "opener" property=0A=
 * of a gadget when the container sets up the authentication information=0A=
 * for that gadget (by calling setAuthToken(...)). At that point, a NIX=0A=
 * wrapper is created and placed into the gadget by calling=0A=
 * theframe.contentWindow.opener =3D wrapper. Note that as a result, NIX =
can=0A=
 * only be used by a container to call a particular gadget *after* that=0A=
 * gadget has called the container at least once via NIX.=0A=
 *=0A=
 * The NIX wrappers in this RPC implementation are instances of a =
VBScript=0A=
 * class that is created when this implementation loads. The reason for=0A=
 * using a VBScript class stems from the fact that any object can be =
passed=0A=
 * into the opener property.=0A=
 * While this is a good thing, as it lets us pass functions and setup a =
true=0A=
 * bidirectional channel via callbacks, it opens a potential security =
hole=0A=
 * by which the other page can get ahold of the "window" or "document"=0A=
 * objects in the parent page and in turn wreak havok. This is due to the=0A=
 * fact that any JS object useful for establishing such a bidirectional=0A=
 * channel (such as a function) can be used to access a function=0A=
 * (eg. obj.toString, or a function itself) created in a specific =
context,=0A=
 * in particular the global context of the sender. Suppose container=0A=
 * domain C passes object obj to gadget on domain G. Then the gadget can=0A=
 * access C's global context using:=0A=
 * var parentWindow =3D (new obj.toString.constructor("return =
window;"))();=0A=
 * Nulling out all of obj's properties doesn't fix this, since IE =
helpfully=0A=
 * restores them to their original values if you do something like:=0A=
 * delete obj.toString; delete obj.toString;=0A=
 * Thus, we wrap the necessary functions and information inside a =
VBScript=0A=
 * object. VBScript objects in IE, like DOM objects, are in fact COM=0A=
 * wrappers when used in JavaScript, so we can safely pass them around=0A=
 * without worrying about a breach of context while at the same time=0A=
 * allowing them to act as a pass-through mechanism for information=0A=
 * and function calls. The implementation details of this VBScript =
wrapper=0A=
 * can be found in the setupChannel() method below.=0A=
 *=0A=
 *   nix: Internet Explorer-specific window.opener trick.=0A=
 *     - Internet Explorer 6=0A=
 *     - Internet Explorer 7=0A=
 */=0A=
if (!gadgets.rpctx.nix) {  // make lib resilient to double-inclusion=0A=
=0A=
gadgets.rpctx.nix =3D function() {=0A=
  // Consts for NIX. VBScript doesn't=0A=
  // allow items to start with _ for some reason,=0A=
  // so we need to make these names quite unique, as=0A=
  // they will go into the global namespace.=0A=
  var NIX_WRAPPER =3D 'GRPC____NIXVBS_wrapper';=0A=
  var NIX_GET_WRAPPER =3D 'GRPC____NIXVBS_get_wrapper';=0A=
  var NIX_HANDLE_MESSAGE =3D 'GRPC____NIXVBS_handle_message';=0A=
  var NIX_CREATE_CHANNEL =3D 'GRPC____NIXVBS_create_channel';=0A=
  var MAX_NIX_SEARCHES =3D 10;=0A=
  var NIX_SEARCH_PERIOD =3D 500;=0A=
=0A=
  // JavaScript reference to the NIX VBScript wrappers.=0A=
  // Gadgets will have but a single channel under=0A=
  // nix_channels['..'] while containers will have a channel=0A=
  // per gadget stored under the gadget's ID.=0A=
  var nix_channels =3D {};=0A=
=0A=
  // Store the ready signal method for use on handshake complete.=0A=
  var ready;=0A=
  var numHandlerSearches =3D 0;=0A=
=0A=
  // Search for NIX handler to parent. Tries MAX_NIX_SEARCHES times every=0A=
  // NIX_SEARCH_PERIOD milliseconds.=0A=
  function conductHandlerSearch() {=0A=
    // Call from gadget to the container.=0A=
    var handler =3D nix_channels['..'];=0A=
    if (handler) {=0A=
      return;=0A=
    }=0A=
=0A=
    if (++numHandlerSearches > MAX_NIX_SEARCHES) {=0A=
      // Handshake failed. Will fall back.=0A=
      gadgets.warn('Nix transport setup failed, falling back...');=0A=
      ready('..', false);=0A=
      return;=0A=
    }=0A=
=0A=
    // If the gadget has yet to retrieve a reference to=0A=
    // the NIX handler, try to do so now. We don't do a=0A=
    // typeof(window.opener.GetAuthToken) check here=0A=
    // because it means accessing that field on the COM object, which,=0A=
    // being an internal function reference, is not allowed.=0A=
    // "in" works because it merely checks for the prescence of=0A=
    // the key, rather than actually accessing the object's property.=0A=
    // This is just a sanity check, not a validity check.=0A=
    if (!handler && window.opener && "GetAuthToken" in window.opener) {=0A=
      handler =3D window.opener;=0A=
=0A=
      // Create the channel to the parent/container.=0A=
      // First verify that it knows our auth token to ensure it's not=0A=
      // an impostor.=0A=
      if (handler.GetAuthToken() =3D=3D gadgets.rpc.getAuthToken('..')) {=0A=
        // Auth match - pass it back along with our wrapper to finish.=0A=
        // own wrapper and our authentication token for co-verification.=0A=
        var token =3D gadgets.rpc.getAuthToken('..');=0A=
        handler.CreateChannel(window[NIX_GET_WRAPPER]('..', token),=0A=
                              token);=0A=
        // Set channel handler=0A=
        nix_channels['..'] =3D handler;=0A=
        window.opener =3D null;=0A=
=0A=
        // Signal success and readiness to send to parent.=0A=
        // Container-to-gadget bit flipped in CreateChannel.=0A=
        ready('..', true);=0A=
        return;=0A=
      }=0A=
    }=0A=
=0A=
    // Try again.=0A=
    window.setTimeout(function() { conductHandlerSearch(); },=0A=
                      NIX_SEARCH_PERIOD);=0A=
  }=0A=
=0A=
  return {=0A=
    getCode: function() {=0A=
      return 'nix';=0A=
    },=0A=
=0A=
    isParentVerifiable: function() {=0A=
      return false;=0A=
    },=0A=
=0A=
    init: function(processFn, readyFn) {=0A=
      ready =3D readyFn;=0A=
=0A=
      // Ensure VBScript wrapper code is in the page and that the=0A=
      // global Javascript handlers have been set.=0A=
      // VBScript methods return a type of 'unknown' when=0A=
      // checked via the typeof operator in IE. Fortunately=0A=
      // for us, this only applies to COM objects, so we=0A=
      // won't see this for a real Javascript object.=0A=
      if (typeof window[NIX_GET_WRAPPER] !=3D=3D 'unknown') {=0A=
        window[NIX_HANDLE_MESSAGE] =3D function(data) {=0A=
          window.setTimeout(=0A=
              function() { processFn(gadgets.json.parse(data)); }, 0);=0A=
        };=0A=
=0A=
        window[NIX_CREATE_CHANNEL] =3D function(name, channel, token) {=0A=
          // Verify the authentication token of the gadget trying=0A=
          // to create a channel for us.=0A=
          if (gadgets.rpc.getAuthToken(name) =3D=3D=3D token) {=0A=
            nix_channels[name] =3D channel;=0A=
            ready(name, true);=0A=
          }=0A=
        };=0A=
=0A=
        // Inject the VBScript code needed.=0A=
        var vbscript =3D=0A=
          // We create a class to act as a wrapper for=0A=
          // a Javascript call, to prevent a break in of=0A=
          // the context.=0A=
          'Class ' + NIX_WRAPPER + '\n '=0A=
=0A=
          // An internal member for keeping track of the=0A=
          // name of the document (container or gadget)=0A=
          // for which this wrapper is intended. For=0A=
          // those wrappers created by gadgets, this is not=0A=
          // used (although it is set to "..")=0A=
          + 'Private m_Intended\n'=0A=
=0A=
          // Stores the auth token used to communicate with=0A=
          // the gadget. The GetChannelCreator method returns=0A=
          // an object that returns this auth token. Upon matching=0A=
          // that with its own, the gadget uses the object=0A=
          // to actually establish the communication channel.=0A=
          + 'Private m_Auth\n'=0A=
=0A=
          // Method for internally setting the value=0A=
          // of the m_Intended property.=0A=
          + 'Public Sub SetIntendedName(name)\n '=0A=
          + 'If isEmpty(m_Intended) Then\n'=0A=
          + 'm_Intended =3D name\n'=0A=
          + 'End If\n'=0A=
          + 'End Sub\n'=0A=
=0A=
          // Method for internally setting the value of the m_Auth =
property.=0A=
          + 'Public Sub SetAuth(auth)\n '=0A=
          + 'If isEmpty(m_Auth) Then\n'=0A=
          + 'm_Auth =3D auth\n'=0A=
          + 'End If\n'=0A=
          + 'End Sub\n'=0A=
=0A=
          // A wrapper method which actually causes a=0A=
          // message to be sent to the other context.=0A=
          + 'Public Sub SendMessage(data)\n '=0A=
          + NIX_HANDLE_MESSAGE + '(data)\n'=0A=
          + 'End Sub\n'=0A=
=0A=
          // Returns the auth token to the gadget, so it can=0A=
          // confirm a match before initiating the connection=0A=
          + 'Public Function GetAuthToken()\n '=0A=
          + 'GetAuthToken =3D m_Auth\n'=0A=
          + 'End Function\n'=0A=
=0A=
          // Method for setting up the container->gadget=0A=
          // channel. Not strictly needed in the gadget's=0A=
          // wrapper, but no reason to get rid of it. Note here=0A=
          // that we pass the intended name to the NIX_CREATE_CHANNEL=0A=
          // method so that it can save the channel in the proper place=0A=
          // *and* verify the channel via the authentication token passed=0A=
          // here.=0A=
          + 'Public Sub CreateChannel(channel, auth)\n '=0A=
          + 'Call ' + NIX_CREATE_CHANNEL + '(m_Intended, channel, =
auth)\n'=0A=
          + 'End Sub\n'=0A=
          + 'End Class\n'=0A=
=0A=
          // Function to get a reference to the wrapper.=0A=
          + 'Function ' + NIX_GET_WRAPPER + '(name, auth)\n'=0A=
          + 'Dim wrap\n'=0A=
          + 'Set wrap =3D New ' + NIX_WRAPPER + '\n'=0A=
          + 'wrap.SetIntendedName name\n'=0A=
          + 'wrap.SetAuth auth\n'=0A=
          + 'Set ' + NIX_GET_WRAPPER + ' =3D wrap\n'=0A=
          + 'End Function';=0A=
=0A=
        try {=0A=
          window.execScript(vbscript, 'vbscript');=0A=
        } catch (e) {=0A=
          return false;=0A=
        }=0A=
      }=0A=
      return true;=0A=
    },=0A=
=0A=
    setup: function(receiverId, token) {=0A=
      if (receiverId =3D=3D=3D '..') {=0A=
        conductHandlerSearch();=0A=
        return true;=0A=
      }=0A=
      try {=0A=
        var frame =3D document.getElementById(receiverId);=0A=
        var wrapper =3D window[NIX_GET_WRAPPER](receiverId, token);=0A=
        frame.contentWindow.opener =3D wrapper;=0A=
      } catch (e) {=0A=
        return false;=0A=
      }=0A=
      return true;=0A=
    },=0A=
=0A=
    call: function(targetId, from, rpc) {=0A=
      try {=0A=
        // If we have a handler, call it.=0A=
        if (nix_channels[targetId]) {=0A=
          =
nix_channels[targetId].SendMessage(gadgets.json.stringify(rpc));=0A=
        }=0A=
      } catch (e) {=0A=
        return false;=0A=
      }=0A=
      return true;=0A=
    }=0A=
  };=0A=
}();=0A=
=0A=
} // !end of double-inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
gadgets.rpctx =3D gadgets.rpctx || {};=0A=
=0A=
/*=0A=
 * For older WebKit-based browsers, the security model does not allow =
for any=0A=
 * known "native" hacks for conducting cross browser communication. =
However,=0A=
 * a variation of the IFPC (see below) can be used, entitled "RMR". RMR =
is=0A=
 * a technique that uses the resize event of the iframe to indicate that =
a=0A=
 * message was sent (instead of the much slower/performance heavy polling=0A=
 * technique used when a defined relay page is not avaliable). Simply =
put,=0A=
 * RMR uses the same "pass the message by the URL hash" trick that IFPC=0A=
 * uses to send a message, but instead of having an active relay page =
that=0A=
 * runs a piece of code when it is loaded, RMR merely changes the URL=0A=
 * of the relay page (which does not even have to exist on the domain)=0A=
 * and then notifies the other party by resizing the relay iframe. RMR=0A=
 * exploits the fact that iframes in the dom of page A can be resized=0A=
 * by page A while the onresize event will be fired in the DOM of page B,=0A=
 * thus providing a single bit channel indicating "message sent to you".=0A=
 * This method has the added benefit that the relay need not be active,=0A=
 * nor even exist: a 404 suffices just as well.=0A=
 *=0A=
 *   rmr: WebKit-specific resizing trick.=0A=
 *      - Safari 2+=0A=
 *      - Chrome 1=0A=
 */=0A=
if (!gadgets.rpctx.rmr) {  // make lib resilient to double-inclusion=0A=
=0A=
gadgets.rpctx.rmr =3D function() {=0A=
  // Consts for RMR, including time in ms RMR uses to poll for=0A=
  // its relay frame to be created, and the max # of polls it does.=0A=
  var RMR_SEARCH_TIMEOUT =3D 500;=0A=
  var RMR_MAX_POLLS =3D 10;=0A=
=0A=
  // JavaScript references to the channel objects used by RMR.=0A=
  // Gadgets will have but a single channel under=0A=
  // rmr_channels['..'] while containers will have a channel=0A=
  // per gadget stored under the gadget's ID.=0A=
  var rmr_channels =3D {};=0A=
  =0A=
  var process;=0A=
  var ready;=0A=
=0A=
  /**=0A=
   * Append an RMR relay frame to the document. This allows the receiver=0A=
   * to start receiving messages.=0A=
   *=0A=
   * @param {Node} channelFrame Relay frame to add to the DOM body.=0A=
   * @param {string} relayUri Base URI for the frame.=0A=
   * @param {string} data to pass along to the frame.=0A=
   * @param {string=3D} opt_frameId ID of frame for which relay is being =
appended (optional).=0A=
   */=0A=
  function appendRmrFrame(channelFrame, relayUri, data, opt_frameId) {=0A=
    var appendFn =3D function() {=0A=
      // Append the iframe.=0A=
      document.body.appendChild(channelFrame);=0A=
=0A=
      // Set the src of the iframe to 'about:blank' first and then set it=0A=
      // to the relay URI. This prevents the iframe from maintaining a =
src=0A=
      // to the 'old' relay URI if the page is returned to from another.=0A=
      // In other words, this fixes the bfcache issue that causes the =
iframe's=0A=
      // src property to not be updated despite us assigning it a new =
value here.=0A=
      channelFrame.src =3D 'about:blank';=0A=
      if (opt_frameId) {=0A=
        // Process the initial sent payload (typically sent by container =
to=0A=
        // child/gadget) only when the relay frame has finished loading. =
We=0A=
        // do this to ensure that, in processRmrData(...), the ACK sent =
due=0A=
        // to processing can actually be sent. Before this time, the =
frame's=0A=
        // contentWindow is null, making it impossible to do so.=0A=
        channelFrame.onload =3D function() {=0A=
          processRmrData(opt_frameId);=0A=
        };=0A=
      }=0A=
      channelFrame.src =3D relayUri + '#' + data;=0A=
    };=0A=
=0A=
    if (document.body) {=0A=
      appendFn();=0A=
    } else {=0A=
      // Common gadget case: attaching header during in-gadget handshake,=0A=
      // when we may still be in script in head. Attach onload.=0A=
      gadgets.util.registerOnLoadHandler(function() { appendFn(); });=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Sets up the RMR transport frame for the given frameId. For gadgets=0A=
   * calling containers, the frameId should be '..'.=0A=
   *=0A=
   * @param {string} frameId The ID of the frame.=0A=
   */=0A=
  function setupRmr(frameId) {=0A=
    if (typeof rmr_channels[frameId] =3D=3D=3D "object") {=0A=
      // Sanity check. Already done.=0A=
      return;=0A=
    }=0A=
=0A=
    var channelFrame =3D document.createElement('iframe');=0A=
    var frameStyle =3D channelFrame.style;=0A=
    frameStyle.position =3D 'absolute';=0A=
    frameStyle.top =3D '0px';=0A=
    frameStyle.border =3D '0';=0A=
    frameStyle.opacity =3D '0';=0A=
=0A=
    // The width here is important as RMR=0A=
    // makes use of the resize handler for the frame.=0A=
    // Do not modify unless you test thoroughly!=0A=
    frameStyle.width =3D '10px';=0A=
    frameStyle.height =3D '1px';=0A=
    channelFrame.id =3D 'rmrtransport-' + frameId;=0A=
    channelFrame.name =3D channelFrame.id;=0A=
=0A=
    // Use the explicitly set relay, if one exists. Otherwise,=0A=
    // Construct one using the parent parameter plus robots.txt=0A=
    // as a synthetic relay. This works since browsers using RMR=0A=
    // treat 404s as legitimate for the purposes of cross domain=0A=
    // communication.=0A=
    var relayUri =3D gadgets.rpc.getRelayUrl(frameId);=0A=
    if (!relayUri) {=0A=
      relayUri =3D=0A=
          =
gadgets.rpc.getOrigin(gadgets.util.getUrlParameters()["parent"]) +=0A=
          '/robots.txt';=0A=
    }=0A=
=0A=
    rmr_channels[frameId] =3D {=0A=
      frame: channelFrame,=0A=
      receiveWindow: null,=0A=
      relayUri: relayUri,=0A=
      searchCounter : 0,=0A=
      width: 10,=0A=
=0A=
      // Waiting means "waiting for acknowledgement to be received."=0A=
      // Acknowledgement always comes as a special ACK=0A=
      // message having been received. This message is received=0A=
      // during handshake in different ways by the container and=0A=
      // gadget, and by normal RMR message passing once the handshake=0A=
      // is complete.=0A=
      waiting: true,=0A=
      queue: [],=0A=
=0A=
      // Number of non-ACK messages that have been sent to the recipient=0A=
      // and have been acknowledged.=0A=
      sendId: 0,=0A=
=0A=
      // Number of messages received and processed from the sender.=0A=
      // This is the number that accompanies every ACK to tell the=0A=
      // sender to clear its queue.=0A=
      recvId: 0=0A=
    };=0A=
=0A=
    if (frameId !=3D=3D '..') {=0A=
      // Container always appends a relay to the gadget, before=0A=
      // the gadget appends its own relay back to container. The=0A=
      // gadget, in the meantime, refuses to attach the container=0A=
      // relay until it finds this one. Thus, the container knows=0A=
      // for certain that gadget to container communication is set=0A=
      // up by the time it finds its own relay. In addition to=0A=
      // establishing a reliable handshake protocol, this also=0A=
      // makes it possible for the gadget to send an initial batch=0A=
      // of messages to the container ASAP.=0A=
      appendRmrFrame(channelFrame, relayUri, getRmrData(frameId));=0A=
    }=0A=
     =0A=
    // Start searching for our own frame on the other page.=0A=
    conductRmrSearch(frameId);=0A=
  }=0A=
=0A=
  /**=0A=
   * Searches for a relay frame, created by the sender referenced by=0A=
   * frameId, with which this context receives messages. Once=0A=
   * found with proper permissions, attaches a resize handler which=0A=
   * signals messages to be sent.=0A=
   *=0A=
   * @param {string} frameId Frame ID of the prospective sender.=0A=
   */=0A=
  function conductRmrSearch(frameId) {=0A=
    var channelWindow =3D null;=0A=
=0A=
    // Increment the search counter.=0A=
    rmr_channels[frameId].searchCounter++;=0A=
=0A=
    try {=0A=
      var targetWin =3D gadgets.rpc._getTargetWin(frameId);=0A=
      if (frameId =3D=3D=3D '..') {=0A=
        // We are a gadget.=0A=
        channelWindow =3D targetWin.frames['rmrtransport-' + =
gadgets.rpc.RPC_ID];=0A=
      } else {=0A=
        // We are a container.=0A=
        channelWindow =3D targetWin.frames['rmrtransport-..'];=0A=
      }=0A=
    } catch (e) {=0A=
      // Just in case; may happen when relay is set to about:blank or =
unset.=0A=
      // Catching exceptions here ensures that the timeout to continue =
the=0A=
      // search below continues to work.=0A=
    }=0A=
=0A=
    var status =3D false;=0A=
=0A=
    if (channelWindow) {=0A=
      // We have a valid reference to "our" RMR transport frame.=0A=
      // Register the proper event handlers.=0A=
      status =3D registerRmrChannel(frameId, channelWindow);=0A=
    }=0A=
=0A=
    if (!status) {=0A=
      // Not found yet. Continue searching, but only if the counter=0A=
      // has not reached the threshold.=0A=
      if (rmr_channels[frameId].searchCounter > RMR_MAX_POLLS) {=0A=
        // If we reach this point, then RMR has failed and we=0A=
        // fall back to IFPC.=0A=
        return;=0A=
      }=0A=
=0A=
      window.setTimeout(function() {=0A=
        conductRmrSearch(frameId);=0A=
      }, RMR_SEARCH_TIMEOUT);=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Attempts to conduct an RPC call to the specified=0A=
   * target with the specified data via the RMR=0A=
   * method. If this method fails, the system attempts again=0A=
   * using the known default of IFPC.=0A=
   *=0A=
   * @param {string} targetId Module Id of the RPC service provider.=0A=
   * @param {string} serviceName Name of the service to call.=0A=
   * @param {string} from Module Id of the calling provider.=0A=
   * @param {Object} rpc The RPC data for this call.=0A=
   */=0A=
  function callRmr(targetId, serviceName, from, rpc) {=0A=
    var handler =3D null;=0A=
=0A=
    if (from !=3D=3D '..') {=0A=
      // Call from gadget to the container.=0A=
      handler =3D rmr_channels['..'];=0A=
    } else {=0A=
      // Call from container to the gadget.=0A=
      handler =3D rmr_channels[targetId];=0A=
    }=0A=
=0A=
    if (handler) {=0A=
      // Queue the current message if not ACK.=0A=
      // ACK is always sent through getRmrData(...).=0A=
      if (serviceName !=3D=3D gadgets.rpc.ACK) {=0A=
        handler.queue.push(rpc);=0A=
      }=0A=
=0A=
      if (handler.waiting ||=0A=
          (handler.queue.length =3D=3D=3D 0 &&=0A=
           !(serviceName =3D=3D=3D gadgets.rpc.ACK && rpc && =
rpc.ackAlone =3D=3D=3D true))) {=0A=
        // If we are awaiting a response from any previously-sent =
messages,=0A=
        // or if we don't have anything new to send, just return.=0A=
        // Note that we don't short-return if we're ACKing just-received=0A=
        // messages.=0A=
        return true;=0A=
      }=0A=
=0A=
      if (handler.queue.length > 0) {=0A=
        handler.waiting =3D true;=0A=
      }=0A=
=0A=
      var url =3D handler.relayUri + "#" + getRmrData(targetId);=0A=
=0A=
      try {=0A=
        // Update the URL with the message.=0A=
        handler.frame.contentWindow.location =3D url;=0A=
=0A=
        // Resize the frame.=0A=
        var newWidth =3D handler.width =3D=3D 10 ? 20 : 10;=0A=
        handler.frame.style.width =3D newWidth + 'px';=0A=
        handler.width =3D newWidth;=0A=
=0A=
        // Done!=0A=
      } catch (e) {=0A=
        // Something about location-setting or resizing failed.=0A=
        // This should never happen, but if it does, fall back to=0A=
        // the default transport.=0A=
        return false;=0A=
      }=0A=
    }=0A=
=0A=
    return true;=0A=
  }=0A=
=0A=
  /**=0A=
   * Returns as a string the data to be appended to an RMR relay frame,=0A=
   * constructed from the current request queue plus an ACK message =
indicating=0A=
   * the currently latest-processed message ID.=0A=
   *=0A=
   * @param {string} toFrameId Frame whose sendable queued data to =
retrieve.=0A=
   */=0A=
  function getRmrData(toFrameId) {=0A=
    var channel =3D rmr_channels[toFrameId];=0A=
    var rmrData =3D {id: channel.sendId};=0A=
    if (channel) {=0A=
      rmrData.d =3D Array.prototype.slice.call(channel.queue, 0);=0A=
      rmrData.d.push({s:gadgets.rpc.ACK, id:channel.recvId});=0A=
    }=0A=
    return gadgets.json.stringify(rmrData);=0A=
  }=0A=
=0A=
  /**=0A=
   * Retrieve data from the channel keyed by the given frameId,=0A=
   * processing it as a batch. All processed data is assumed to have been=0A=
   * generated by getRmrData(...), pairing that method with this.=0A=
   *=0A=
   * @param {string} fromFrameId Frame from which data is being =
retrieved.=0A=
   */=0A=
  function processRmrData(fromFrameId) {=0A=
    var channel =3D rmr_channels[fromFrameId];=0A=
    var data =3D channel.receiveWindow.location.hash.substring(1);=0A=
=0A=
    // Decode the RPC object array.=0A=
    var rpcObj =3D gadgets.json.parse(decodeURIComponent(data)) || {};=0A=
    var rpcArray =3D rpcObj.d || [];=0A=
=0A=
    var nonAckReceived =3D false;=0A=
    var noLongerWaiting =3D false;=0A=
=0A=
    var numBypassed =3D 0;=0A=
    var numToBypass =3D (channel.recvId - rpcObj.id);=0A=
    for (var i =3D 0; i < rpcArray.length; ++i) {=0A=
      var rpc =3D rpcArray[i];=0A=
=0A=
      // If we receive an ACK message, then mark the current=0A=
      // handler as no longer waiting and send out the next=0A=
      // queued message.=0A=
      if (rpc.s =3D=3D=3D gadgets.rpc.ACK) {=0A=
        // ACK received - whether this came from a handshake or=0A=
        // an active call, in either case it indicates readiness to=0A=
        // send messages to the from frame.=0A=
        ready(fromFrameId, true);=0A=
=0A=
        if (channel.waiting) {=0A=
          noLongerWaiting =3D true;=0A=
        }=0A=
=0A=
        channel.waiting =3D false;=0A=
        var newlyAcked =3D Math.max(0, rpc.id - channel.sendId);=0A=
        channel.queue.splice(0, newlyAcked);=0A=
        channel.sendId =3D Math.max(channel.sendId, rpc.id || 0);=0A=
        continue;=0A=
      }=0A=
=0A=
      // If we get here, we've received > 0 non-ACK messages to=0A=
      // process. Indicate this bit for later.=0A=
      nonAckReceived =3D true;=0A=
=0A=
      // Bypass any messages already received.=0A=
      if (++numBypassed <=3D numToBypass) {=0A=
        continue;=0A=
      }=0A=
=0A=
      ++channel.recvId;=0A=
      process(rpc);  // actually dispatch the message=0A=
    }=0A=
=0A=
    // Send an ACK indicating that we got/processed the message(s).=0A=
    // Do so if we've received a message to process or if we were waiting=0A=
    // before but a received ACK has cleared our waiting bit, and we have=0A=
    // more messages to send. Performing this operation causes additional=0A=
    // messages to be sent.=0A=
    if (nonAckReceived ||=0A=
        (noLongerWaiting && channel.queue.length > 0)) {=0A=
      var from =3D (fromFrameId =3D=3D=3D '..') ? gadgets.rpc.RPC_ID : =
'..';=0A=
      callRmr(fromFrameId, gadgets.rpc.ACK, from, {ackAlone: =
nonAckReceived});=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Registers the RMR channel handler for the given frameId and =
associated=0A=
   * channel window.=0A=
   *=0A=
   * @param {string} frameId The ID of the frame for which this channel =
is being=0A=
   *   registered.=0A=
   * @param {Object} channelWindow The window of the receive frame for =
this=0A=
   *   channel, if any.=0A=
   *=0A=
   * @return {boolean} True if the frame was setup successfully, false=0A=
   *   otherwise.=0A=
   */=0A=
  function registerRmrChannel(frameId, channelWindow) {=0A=
    var channel =3D rmr_channels[frameId];=0A=
=0A=
    // Verify that the channel is ready for receiving.=0A=
    try {=0A=
      var canAccess =3D false;=0A=
=0A=
      // Check to see if the document is in the window. For Chrome, this=0A=
      // will return 'false' if the channelWindow is inaccessible by this=0A=
      // piece of JavaScript code, meaning that the URL of the =
channelWindow's=0A=
      // parent iframe has not yet changed from 'about:blank'. We do this=0A=
      // check this way because any true *access* on the channelWindow =
object=0A=
      // will raise a security exception, which, despite the try-catch, =
still=0A=
      // gets reported to the debugger (it does not break execution, the =
try=0A=
      // handles that problem, but it is still reported, which is bad =
form).=0A=
      // This check always succeeds in Safari 3.1 regardless of the =
state of=0A=
      // the window.=0A=
      canAccess =3D 'document' in channelWindow;=0A=
=0A=
      if (!canAccess) {=0A=
        return false;=0A=
      }=0A=
=0A=
      // Check to see if the document is an object. For Safari 3.1, this =
will=0A=
      // return undefined if the page is still inaccessible. =
Unfortunately, this=0A=
      // *will* raise a security issue in the debugger.=0A=
      // TODO Find a way around this problem.=0A=
      canAccess =3D typeof channelWindow['document'] =3D=3D 'object';=0A=
=0A=
      if (!canAccess) {=0A=
        return false;=0A=
      }=0A=
=0A=
      // Once we get here, we know we can access the document (and =
anything else)=0A=
      // on the window object. Therefore, we check to see if the =
location is=0A=
      // still about:blank (this takes care of the Safari 3.2 case).=0A=
      var loc =3D channelWindow.location.href;=0A=
=0A=
      // Check if this is about:blank for Safari.=0A=
      if (loc =3D=3D=3D 'about:blank') {=0A=
        return false;=0A=
      }=0A=
    } catch (ex) {=0A=
      // For some reason, the iframe still points to about:blank. We try=0A=
      // again in a bit.=0A=
      return false;=0A=
    }=0A=
=0A=
    // Save a reference to the receive window.=0A=
    channel.receiveWindow =3D channelWindow;=0A=
=0A=
    // Register the onresize handler.=0A=
    function onresize() {=0A=
      processRmrData(frameId);=0A=
    };=0A=
=0A=
    if (typeof channelWindow.attachEvent =3D=3D=3D "undefined") {=0A=
      channelWindow.onresize =3D onresize;=0A=
    } else {=0A=
      channelWindow.attachEvent("onresize", onresize);=0A=
    }=0A=
=0A=
    if (frameId =3D=3D=3D '..') {=0A=
      // Gadget to container. Signal to the container that the gadget=0A=
      // is ready to receive messages by attaching the g -> c relay.=0A=
      // As a nice optimization, pass along any gadget to container=0A=
      // queued messages that have backed up since then. ACK is enqueued =
in=0A=
      // getRmrData to ensure that the container's waiting flag is set =
to false=0A=
      // (this happens in the below code run on the container side).=0A=
      appendRmrFrame(channel.frame, channel.relayUri, =
getRmrData(frameId), frameId);=0A=
    } else {=0A=
      // Process messages that the gadget sent in its initial relay =
payload.=0A=
      // We can do this immediately because the container has already =
appended=0A=
      // and loaded a relay frame that can be used to ACK the messages =
the gadget=0A=
      // sent. In the preceding if-block, however, the =
processRmrData(...) call=0A=
      // must wait. That's because appendRmrFrame may not actually =
append the=0A=
      // frame - in the context of a gadget, this code may be running in =
the=0A=
      // head element, so it cannot be appended to body. As a result, the=0A=
      // gadget cannot ACK the container for messages it received.=0A=
      processRmrData(frameId);=0A=
    }=0A=
=0A=
    return true;=0A=
  }=0A=
=0A=
  return {=0A=
    getCode: function() {=0A=
      return 'rmr';=0A=
    },=0A=
=0A=
    isParentVerifiable: function() {=0A=
      return true;=0A=
    },=0A=
=0A=
    init: function(processFn, readyFn) {=0A=
      // No global setup.=0A=
      process =3D processFn;=0A=
      ready =3D readyFn;=0A=
      return true;=0A=
    },=0A=
=0A=
    setup: function(receiverId, token) {=0A=
      try {=0A=
        setupRmr(receiverId);=0A=
      } catch (e) {=0A=
        gadgets.warn('Caught exception setting up RMR: ' + e);=0A=
        return false;=0A=
      }=0A=
      return true;=0A=
    },=0A=
=0A=
    call: function(targetId, from, rpc) {=0A=
      return callRmr(targetId, rpc.s, from, rpc);=0A=
    }=0A=
  };=0A=
}();=0A=
=0A=
} // !end of double-inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
gadgets.rpctx =3D gadgets.rpctx || {};=0A=
=0A=
/*=0A=
 * For all others, we have a fallback mechanism known as "ifpc". IFPC=0A=
 * exploits the fact that while same-origin policy prohibits a frame from=0A=
 * accessing members on a window not in the same domain, that frame can,=0A=
 * however, navigate the window heirarchy (via parent). This is =
exploited by=0A=
 * having a page on domain A that wants to talk to domain B create an =
iframe=0A=
 * on domain B pointing to a special relay file and with a message =
encoded=0A=
 * after the hash (#). This relay, in turn, finds the page on domain B, =
and=0A=
 * can call a receipt function with the message given to it. The relay =
URL=0A=
 * used by each caller is set via the gadgets.rpc.setRelayUrl(..) and=0A=
 * *must* be called before the call method is used.=0A=
 *=0A=
 *   ifpc: Iframe-based method, utilizing a relay page, to send a =
message.=0A=
 *      - No known major browsers still use this method, but it remains=0A=
 *        useful as a catch-all fallback for the time being.=0A=
 */=0A=
if (!gadgets.rpctx.ifpc) {  // make lib resilient to double-inclusion=0A=
=0A=
gadgets.rpctx.ifpc =3D function() {=0A=
  var iframePool =3D [];=0A=
  var callId =3D 0;=0A=
  var ready;=0A=
=0A=
  /**=0A=
   * Encodes arguments for the legacy IFPC wire format.=0A=
   *=0A=
   * @param {Object} args=0A=
   * @return {string} the encoded args=0A=
   */=0A=
  function encodeLegacyData(args) {=0A=
    var argsEscaped =3D [];=0A=
    for(var i =3D 0, j =3D args.length; i < j; ++i) {=0A=
      =
argsEscaped.push(encodeURIComponent(gadgets.json.stringify(args[i])));=0A=
    }=0A=
    return argsEscaped.join('&');=0A=
  }=0A=
=0A=
  /**=0A=
   * Helper function to emit an invisible IFrame.=0A=
   * @param {string} src SRC attribute of the IFrame to emit.=0A=
   * @private=0A=
   */=0A=
  function emitInvisibleIframe(src) {=0A=
    var iframe;=0A=
    // Recycle IFrames=0A=
    for (var i =3D iframePool.length - 1; i >=3D0; --i) {=0A=
      var ifr =3D iframePool[i];=0A=
      try {=0A=
        if (ifr && (ifr.recyclable || ifr.readyState =3D=3D=3D =
'complete')) {=0A=
          ifr.parentNode.removeChild(ifr);=0A=
          if (window.ActiveXObject) {=0A=
            // For MSIE, delete any iframes that are no longer being =
used. MSIE=0A=
            // cannot reuse the IFRAME because a navigational click =
sound will=0A=
            // be triggered when we set the SRC attribute.=0A=
            // Other browsers scan the pool for a free iframe to reuse.=0A=
            iframePool[i] =3D ifr =3D null;=0A=
            iframePool.splice(i, 1);=0A=
          } else {=0A=
            ifr.recyclable =3D false;=0A=
            iframe =3D ifr;=0A=
            break;=0A=
          }=0A=
        }=0A=
      } catch (e) {=0A=
        // Ignore; IE7 throws an exception when trying to read =
readyState and=0A=
        // readyState isn't set.=0A=
      }=0A=
    }=0A=
    // Create IFrame if necessary=0A=
    if (!iframe) {=0A=
      iframe =3D document.createElement('iframe');=0A=
      iframe.style.border =3D iframe.style.width =3D iframe.style.height =
=3D '0px';=0A=
      iframe.style.visibility =3D 'hidden';=0A=
      iframe.style.position =3D 'absolute';=0A=
      iframe.onload =3D function() { this.recyclable =3D true; };=0A=
      iframePool.push(iframe);=0A=
    }=0A=
    iframe.src =3D src;=0A=
    window.setTimeout(function() { document.body.appendChild(iframe); }, =
0);=0A=
  }=0A=
=0A=
  return {=0A=
    getCode: function() {=0A=
      return 'ifpc';=0A=
    },=0A=
=0A=
    isParentVerifiable: function() {=0A=
      return true;=0A=
    },=0A=
=0A=
    init: function(processFn, readyFn) {=0A=
      // No global setup.=0A=
      ready =3D readyFn;=0A=
      ready('..', true);  // Ready immediately.=0A=
      return true;=0A=
    },=0A=
=0A=
    setup: function(receiverId, token) {=0A=
      // Indicate readiness to send to receiver.=0A=
      ready(receiverId, true);=0A=
      return true;=0A=
    },=0A=
=0A=
    call: function(targetId, from, rpc) {=0A=
      // Retrieve the relay file used by IFPC. Note that=0A=
      // this must be set before the call, and so we conduct=0A=
      // an extra check to ensure it is not blank.=0A=
      var relay =3D gadgets.rpc.getRelayUrl(targetId);=0A=
      ++callId;=0A=
=0A=
      if (!relay) {=0A=
        gadgets.warn('No relay file assigned for IFPC');=0A=
        return;=0A=
      }=0A=
=0A=
      // The RPC mechanism supports two formats for IFPC (legacy and =
current).=0A=
      var src =3D null;=0A=
      if (rpc.l) {=0A=
        // Use legacy protocol.=0A=
        // Format: #iframe_id&callId&num_packets&packet_num&block_of_data=0A=
        var callArgs =3D rpc.a;=0A=
        src =3D [relay, '#', encodeLegacyData([from, callId, 1, 0,=0A=
               encodeLegacyData([from, rpc.s, '', '', from].concat(=0A=
                 callArgs))])].join('');=0A=
      } else {=0A=
        // Format: #targetId & sourceId@callId & packetNum & packetId & =
packetData=0A=
        src =3D [relay, '#', targetId, '&', from, '@', callId,=0A=
               '&1&0&', =
encodeURIComponent(gadgets.json.stringify(rpc))].join('');=0A=
      }=0A=
=0A=
      // Conduct the IFPC call by creating the Iframe with=0A=
      // the relay URL and appended message.=0A=
      emitInvisibleIframe(src);=0A=
      return true;=0A=
    }=0A=
  };=0A=
}();=0A=
=0A=
} // !end of double inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Remote procedure call library for gadget-to-container,=0A=
 * container-to-gadget, and gadget-to-gadget (thru container) =
communication.=0A=
 */=0A=
=0A=
/**=0A=
 * gadgets.rpc Transports=0A=
 *=0A=
 * All transports are stored in object gadgets.rpctx, and are provided=0A=
 * to the core gadgets.rpc library by various build rules.=0A=
 * =0A=
 * Transports used by core gadgets.rpc code to actually pass messages.=0A=
 * each transport implements the same interface exposing hooks that=0A=
 * the core library calls at strategic points to set up and use=0A=
 * the transport.=0A=
 *=0A=
 * The methods each transport must implement are:=0A=
 * + getCode(): returns a string identifying the transport. For =
debugging.=0A=
 * + isParentVerifiable(): indicates (via boolean) whether the method=0A=
 *     has the property that its relay URL verifies for certain the=0A=
 *     receiver's protocol://host:port.=0A=
 * + init(processFn, readyFn): Performs any global initialization =
needed. Called=0A=
 *     before any other gadgets.rpc methods are invoked. processFn is=0A=
 *     the function in gadgets.rpc used to process an rpc packet. =
readyFn is=0A=
 *     a function that must be called when the transport is ready to send=0A=
 *     and receive messages bidirectionally. Returns=0A=
 *     true if successful, false otherwise.=0A=
 * + setup(receiverId, token): Performs per-receiver initialization, if =
any.=0A=
 *     receiverId will be '..' for gadget-to-container. Returns true if=0A=
 *     successful, false otherwise.=0A=
 * + call(targetId, from, rpc): Invoked to send an actual=0A=
 *     message to the given targetId, with the given serviceName, from=0A=
 *     the sender identified by 'from'. Payload is an rpc packet. Returns=0A=
 *     true if successful, false otherwise.=0A=
 */=0A=
=0A=
if (!gadgets.rpc) { // make lib resilient to double-inclusion=0A=
=0A=
/**=0A=
 * @static=0A=
 * @namespace Provides operations for making rpc calls.=0A=
 * @name gadgets.rpc=0A=
 */=0A=
=0A=
gadgets.rpc =3D function() {=0A=
  /** =0A=
   * @const=0A=
   * @private=0A=
   */=0A=
  var CALLBACK_NAME =3D '__cb';=0A=
=0A=
  /** =0A=
   * @const=0A=
   * @private=0A=
   */=0A=
  var DEFAULT_NAME =3D '';=0A=
=0A=
  /** Exported constant, for use by transports only.=0A=
   * @const=0A=
   * @type {string}=0A=
   * @member gadgets.rpc=0A=
   */=0A=
  var ACK =3D '__ack';=0A=
=0A=
  /** =0A=
   * Timeout and number of attempts made to setup a transport receiver.=0A=
   * @const=0A=
   * @private=0A=
   */=0A=
  var SETUP_FRAME_TIMEOUT =3D 500;=0A=
=0A=
  /** =0A=
   * @const=0A=
   * @private=0A=
   */=0A=
  var SETUP_FRAME_MAX_TRIES =3D 10;=0A=
=0A=
  var services =3D {};=0A=
  var relayUrl =3D {};=0A=
  var useLegacyProtocol =3D {};=0A=
  var authToken =3D {};=0A=
  var callId =3D 0;=0A=
  var callbacks =3D {};=0A=
  var setup =3D {};=0A=
  var sameDomain =3D {};=0A=
  var params =3D {};=0A=
  var receiverTx =3D {};=0A=
  var earlyRpcQueue =3D {};=0A=
=0A=
  // isGadget =3D~ isChild for the purposes of rpc (used only in setup).=0A=
  var isChild =3D (window.top !=3D=3D window.self);=0A=
=0A=
  // Set the current rpc ID from window.name immediately, to prevent=0A=
  // shadowing of window.name by a "var name" declaration, or similar.=0A=
  var rpcId =3D window.name;=0A=
=0A=
  // Fallback transport is simply a dummy impl that emits no errors=0A=
  // and logs info on calls it receives, to avoid undesired side-effects=0A=
  // from falling back to IFPC or some other transport.=0A=
  var fallbackTransport =3D (function() {=0A=
    function logFn(name) {=0A=
      return function() {=0A=
        gadgets.log("gadgets.rpc." + name + "(" +=0A=
                    =
gadgets.json.stringify(Array.prototype.slice.call(arguments)) +=0A=
                    "): call ignored. [caller: " + document.location +=0A=
                    ", isChild: " + isChild + "]");=0A=
      };=0A=
    }=0A=
    return {=0A=
      getCode: function() {=0A=
        return "noop";=0A=
      },=0A=
      isParentVerifiable: function() {=0A=
        return true;  // Not really, but prevents transport assignment =
to IFPC.=0A=
      },=0A=
      init: logFn("init"),=0A=
      setup: logFn("setup"),=0A=
      call: logFn("call")=0A=
    };=0A=
  })();=0A=
=0A=
  // Load the authentication token for speaking to the container=0A=
  // from the gadget's parameters, or default to '0' if not found.=0A=
  if (gadgets.util) {=0A=
    params =3D gadgets.util.getUrlParameters();=0A=
  }=0A=
=0A=
  // Indicates whether to support early-message queueing, which is =
designed=0A=
  // to ensure that all messages sent by gadgets.rpc.call, irrespective=0A=
  // when they were made (before/after setupReceiver, before/after =
transport=0A=
  // setup complete), are sent. Hiding behind a query param to allow =
opt-in=0A=
  // for a time while this technique is proven.=0A=
  var useEarlyQueueing =3D (params['rpc_earlyq'] =3D=3D=3D "1");=0A=
=0A=
  /**=0A=
   * Return a transport representing the best available cross-domain=0A=
   * message-passing mechanism available to the browser.=0A=
   *=0A=
   * <p>Transports are selected on a cascading basis determined by =
browser=0A=
   * capability and other checks. The order of preference is:=0A=
   * <ol>=0A=
   * <li> wpm: Uses window.postMessage standard.=0A=
   * <li> dpm: Uses document.postMessage, similar to wpm but =
pre-standard.=0A=
   * <li> nix: Uses IE-specific browser hacks.=0A=
   * <li> rmr: Signals message passing using relay file's onresize =
handler.=0A=
   * <li> fe: Uses FF2-specific window.frameElement hack.=0A=
   * <li> ifpc: Sends messages via active load of a relay file.=0A=
   * </ol>=0A=
   * <p>See each transport's commentary/documentation for details.=0A=
   * @return {Object}=0A=
   * @member gadgets.rpc=0A=
   */=0A=
  function getTransport() {=0A=
    return typeof window.postMessage =3D=3D=3D 'function' ? =
gadgets.rpctx.wpm :=0A=
           typeof window.postMessage =3D=3D=3D 'object' ? =
gadgets.rpctx.wpm :=0A=
           window.ActiveXObject ? gadgets.rpctx.nix :=0A=
           navigator.userAgent.indexOf('WebKit') > 0 ? gadgets.rpctx.rmr =
:=0A=
           navigator.product =3D=3D=3D 'Gecko' ? =
gadgets.rpctx.frameElement :=0A=
           gadgets.rpctx.ifpc;=0A=
  }=0A=
=0A=
  /**=0A=
   * Function passed to, and called by, a transport indicating it's =
ready to=0A=
   * send and receive messages.=0A=
   */=0A=
  function transportReady(receiverId, readySuccess) {=0A=
    var tx =3D transport;=0A=
    if (!readySuccess) {=0A=
      tx =3D fallbackTransport;=0A=
    }=0A=
    receiverTx[receiverId] =3D tx;=0A=
=0A=
    // If there are any early-queued messages, send them now directly =
through=0A=
    // the needed transport. This queue will only have contents if=0A=
    // useEarlyQueueing =3D=3D=3D true (see call method).=0A=
    var earlyQueue =3D earlyRpcQueue[receiverId] || [];=0A=
    for (var i =3D 0; i < earlyQueue.length; ++i) {=0A=
      var rpc =3D earlyQueue[i];=0A=
      // There was no auth/rpc token set before, so set it now.=0A=
      rpc.t =3D getAuthToken(receiverId);=0A=
      tx.call(receiverId, rpc.f, rpc);=0A=
    }=0A=
=0A=
    // Clear the queue so it won't be sent again.=0A=
    earlyRpcQueue[receiverId] =3D [];=0A=
  }=0A=
=0A=
  /**=0A=
   * Helper function to process an RPC request=0A=
   * @param {Object} rpc RPC request object=0A=
   * @private=0A=
   */=0A=
  function process(rpc) {=0A=
    //=0A=
    // RPC object contents:=0A=
    //   s: Service Name=0A=
    //   f: From=0A=
    //   c: The callback ID or 0 if none.=0A=
    //   a: The arguments for this RPC call.=0A=
    //   t: The authentication token.=0A=
    //=0A=
    if (rpc && typeof rpc.s =3D=3D=3D 'string' && typeof rpc.f =3D=3D=3D =
'string' &&=0A=
        rpc.a instanceof Array) {=0A=
=0A=
      // Validate auth token.=0A=
      if (authToken[rpc.f]) {=0A=
        // We don't do type coercion here because all entries in the =
authToken=0A=
        // object are strings, as are all url params. See =
setupReceiver(...).=0A=
        if (authToken[rpc.f] !=3D=3D rpc.t) {=0A=
          throw new Error("Invalid auth token. " +=0A=
              authToken[rpc.f] + " vs " + rpc.t);=0A=
        }=0A=
      }=0A=
=0A=
      if (rpc.s =3D=3D=3D ACK) {=0A=
        // Acknowledgement API, used to indicate a receiver is ready.=0A=
        window.setTimeout(function() { transportReady(rpc.f, true); }, =
0);=0A=
        return;=0A=
      }=0A=
=0A=
      // If there is a callback for this service, attach a callback =
function=0A=
      // to the rpc context object for asynchronous rpc services.=0A=
      //=0A=
      // Synchronous rpc request handlers should simply ignore it and =
return a=0A=
      // value as usual.=0A=
      // Asynchronous rpc request handlers, on the other hand, should =
pass its=0A=
      // result to this callback function and not return a value on exit.=0A=
      //=0A=
      // For example, the following rpc handler passes the first =
parameter back=0A=
      // to its rpc client with a one-second delay.=0A=
      //=0A=
      // function asyncRpcHandler(param) {=0A=
      //   var me =3D this;=0A=
      //   setTimeout(function() {=0A=
      //     me.callback(param);=0A=
      //   }, 1000);=0A=
      // }=0A=
      if (rpc.c) {=0A=
        rpc.callback =3D function(result) {=0A=
          gadgets.rpc.call(rpc.f, CALLBACK_NAME, null, rpc.c, result);=0A=
        };=0A=
      }=0A=
=0A=
      // Call the requested RPC service.=0A=
      var result =3D (services[rpc.s] ||=0A=
                    services[DEFAULT_NAME]).apply(rpc, rpc.a);=0A=
=0A=
      // If the rpc request handler returns a value, immediately pass it =
back=0A=
      // to the callback. Otherwise, do nothing, assuming that the rpc =
handler=0A=
      // will make an asynchronous call later.=0A=
      if (rpc.c && typeof result !=3D=3D 'undefined') {=0A=
        gadgets.rpc.call(rpc.f, CALLBACK_NAME, null, rpc.c, result);=0A=
      }=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Helper method returning a canonicalized protocol://host[:port] for=0A=
   * a given input URL, provided as a string. Used to compute convenient=0A=
   * relay URLs and to determine whether a call is coming from the same=0A=
   * domain as its receiver (bypassing the try/catch capability detection=0A=
   * flow, thereby obviating Firebug and other tools reporting an =
exception).=0A=
   *=0A=
   * @param {string} url Base URL to canonicalize.=0A=
   * @memberOf gadgets.rpc=0A=
   */=0A=
=0A=
  function getOrigin(url) {=0A=
    if (!url) {=0A=
      return "";=0A=
    }=0A=
    url =3D url.toLowerCase();=0A=
    if (url.indexOf("//") =3D=3D 0) {=0A=
      url =3D window.location.protocol + url;=0A=
    }=0A=
    if (url.indexOf("://") =3D=3D -1) {=0A=
      // Assumed to be schemaless. Default to current protocol.=0A=
      url =3D window.location.protocol + "//" + url;=0A=
    }=0A=
    // At this point we guarantee that "://" is in the URL and defines=0A=
    // current protocol. Skip past this to search for host:port.=0A=
    var host =3D url.substring(url.indexOf("://") + 3);=0A=
=0A=
    // Find the first slash char, delimiting the host:port.=0A=
    var slashPos =3D host.indexOf("/");=0A=
    if (slashPos !=3D -1) {=0A=
      host =3D host.substring(0, slashPos);=0A=
    }=0A=
=0A=
    var protocol =3D url.substring(0, url.indexOf("://"));=0A=
=0A=
    // Use port only if it's not default for the protocol.=0A=
    var portStr =3D "";=0A=
    var portPos =3D host.indexOf(":");=0A=
    if (portPos !=3D -1) {=0A=
      var port =3D host.substring(portPos + 1);=0A=
      host =3D host.substring(0, portPos);=0A=
      if ((protocol =3D=3D=3D "http" && port !=3D=3D "80") ||=0A=
          (protocol =3D=3D=3D "https" && port !=3D=3D "443")) {=0A=
        portStr =3D ":" + port;=0A=
      }=0A=
    }=0A=
=0A=
    // Return <protocol>://<host>[<port>]=0A=
    return protocol + "://" + host + portStr;=0A=
  }=0A=
=0A=
  function getTargetWin(id) {=0A=
    if (typeof id =3D=3D=3D "undefined" ||=0A=
        id =3D=3D=3D "..") {=0A=
      return window.parent;=0A=
    }=0A=
=0A=
    // Cast to a String to avoid an index lookup.=0A=
    id =3D String(id);=0A=
    =0A=
    // Try window.frames first=0A=
    var target =3D window.frames[id];=0A=
    if (target) {=0A=
      return target;=0A=
    }=0A=
    =0A=
    // Fall back to getElementById()=0A=
    target =3D document.getElementById(id);=0A=
    if (target && target.contentWindow) {=0A=
      return target.contentWindow;=0A=
    }=0A=
=0A=
    return null;=0A=
  }=0A=
=0A=
  // Pick the most efficient RPC relay mechanism.=0A=
  var transport =3D getTransport();=0A=
=0A=
  // Create the Default RPC handler.=0A=
  services[DEFAULT_NAME] =3D function() {=0A=
    gadgets.warn('Unknown RPC service: ' + this.s);=0A=
  };=0A=
=0A=
  // Create a Special RPC handler for callbacks.=0A=
  services[CALLBACK_NAME] =3D function(callbackId, result) {=0A=
    var callback =3D callbacks[callbackId];=0A=
    if (callback) {=0A=
      delete callbacks[callbackId];=0A=
      callback(result);=0A=
    }=0A=
  };=0A=
=0A=
  /**=0A=
   * Conducts any frame-specific work necessary to setup=0A=
   * the channel type chosen. This method is called when=0A=
   * the container page first registers the gadget in the=0A=
   * RPC mechanism. Gadgets, in turn, will complete the setup=0A=
   * of the channel once they send their first messages.=0A=
   */=0A=
  function setupFrame(frameId, token) {=0A=
    if (setup[frameId] =3D=3D=3D true) {=0A=
      return;=0A=
    }=0A=
=0A=
    if (typeof setup[frameId] =3D=3D=3D 'undefined') {=0A=
      setup[frameId] =3D 0;=0A=
    }=0A=
=0A=
    var tgtFrame =3D document.getElementById(frameId);=0A=
    if (frameId =3D=3D=3D '..' || tgtFrame !=3D null) {=0A=
      if (transport.setup(frameId, token) =3D=3D=3D true) {=0A=
        setup[frameId] =3D true;=0A=
        return;=0A=
      }=0A=
    }=0A=
=0A=
    if (setup[frameId] !=3D=3D true && setup[frameId]++ < =
SETUP_FRAME_MAX_TRIES) {=0A=
      // Try again in a bit, assuming that frame will soon exist.=0A=
      window.setTimeout(function() { setupFrame(frameId, token) },=0A=
                        SETUP_FRAME_TIMEOUT);=0A=
    } else {=0A=
      // Fail: fall back for this gadget.=0A=
      receiverTx[frameId] =3D fallbackTransport;=0A=
      setup[frameId] =3D true;=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Attempts to make an rpc by calling the target's receive method =
directly.=0A=
   * This works when gadgets are rendered on the same domain as their =
container,=0A=
   * a potentially useful optimization for trusted content which keeps=0A=
   * RPC behind a consistent interface.=0A=
   *=0A=
   * @param {string} target Module id of the rpc service provider=0A=
   * @param {Object} rpc RPC data=0A=
   * @return {boolean}=0A=
   */=0A=
  function callSameDomain(target, rpc) {=0A=
    if (typeof sameDomain[target] =3D=3D=3D 'undefined') {=0A=
      // Seed with a negative, typed value to avoid=0A=
      // hitting this code path repeatedly.=0A=
      sameDomain[target] =3D false;=0A=
      var targetRelay =3D gadgets.rpc.getRelayUrl(target);=0A=
      if (getOrigin(targetRelay) !=3D=3D =
getOrigin(window.location.href)) {=0A=
        // Not worth trying -- avoid the error and just return.=0A=
        return false;=0A=
      }=0A=
=0A=
      var targetEl =3D getTargetWin(target);=0A=
      try {=0A=
        // If this succeeds, then same-domain policy applied=0A=
        sameDomain[target] =3D targetEl.gadgets.rpc.receiveSameDomain;=0A=
      } catch (e) {=0A=
        // Shouldn't happen due to origin check. Caught to emit=0A=
        // more meaningful error to the caller.=0A=
        gadgets.error("Same domain call failed: parent=3D incorrectly =
set.");=0A=
      }=0A=
    }=0A=
=0A=
    if (typeof sameDomain[target] =3D=3D=3D 'function') {=0A=
      // Call target's receive method=0A=
      sameDomain[target](rpc);=0A=
      return true;=0A=
    }=0A=
=0A=
    return false;=0A=
  }=0A=
=0A=
  /**=0A=
   * Sets the relay URL of a target frame.=0A=
   * @param {string} targetId Name of the target frame.=0A=
   * @param {string} url Full relay URL of the target frame.=0A=
   * @param {boolean=3D} opt_useLegacy True if this relay needs the =
legacy IFPC=0A=
   *     wire format.=0A=
   *=0A=
   * @member gadgets.rpc=0A=
   * @deprecated=0A=
   */=0A=
  function setRelayUrl(targetId, url, opt_useLegacy) {=0A=
    relayUrl[targetId] =3D url;=0A=
    useLegacyProtocol[targetId] =3D !!opt_useLegacy;=0A=
  }=0A=
=0A=
  /**=0A=
   * Helper method to retrieve the authToken for a given gadget.=0A=
   * Not to be used directly.=0A=
   * @member gadgets.rpc=0A=
   * @return {string}=0A=
   */=0A=
  function getAuthToken(targetId) {=0A=
    return authToken[targetId];=0A=
  }=0A=
=0A=
  /**=0A=
   * Sets the auth token of a target frame.=0A=
   * @param {string} targetId Name of the target frame.=0A=
   * @param {string} token The authentication token to use for all=0A=
   *     calls to or from this target id.=0A=
   *=0A=
   * @member gadgets.rpc=0A=
   * @deprecated=0A=
   */=0A=
  function setAuthToken(targetId, token) {=0A=
    token =3D token || "";=0A=
=0A=
    // Coerce token to a String, ensuring that all authToken values=0A=
    // are strings. This ensures correct comparison with URL params=0A=
    // in the process(rpc) method.=0A=
    authToken[targetId] =3D String(token);=0A=
=0A=
    setupFrame(targetId, token);=0A=
  }=0A=
=0A=
  function setupContainerGadgetContext(rpctoken) {=0A=
    /**=0A=
     * Initializes gadget to container RPC params from the provided =
configuration.=0A=
     */=0A=
    function init(config) {=0A=
      var configRpc =3D config ? config.rpc : {};=0A=
      var parentRelayUrl =3D configRpc.parentRelayUrl;=0A=
=0A=
      // Allow for wild card parent relay files as long as it's from a=0A=
      // white listed domain. This is enforced by the rendering servlet.=0A=
      if (parentRelayUrl.substring(0, 7) !=3D=3D 'http://' &&=0A=
          parentRelayUrl.substring(0, 8) !=3D=3D 'https://' &&=0A=
          parentRelayUrl.substring(0, 2) !=3D=3D '//') {=0A=
        // Relative path: we append to the parent.=0A=
        // We're relying on the server validating the parent parameter =
in this=0A=
        // case. Because of this, parent may only be passed in the =
query, not fragment.=0A=
        if (typeof params.parent =3D=3D=3D "string" && params.parent =
!=3D=3D "") {=0A=
          // Otherwise, relayUrl['..'] will be null, signaling transport=0A=
          // code to ignore rpc calls since they cannot work without a=0A=
          // relay URL with host qualification.=0A=
          if (parentRelayUrl.substring(0, 1) !=3D=3D '/') {=0A=
            // Path-relative. Trust that parent is passed in =
appropriately.=0A=
            var lastSlash =3D params.parent.lastIndexOf('/');=0A=
            parentRelayUrl =3D params.parent.substring(0, lastSlash + 1) =
+ parentRelayUrl;=0A=
          } else {=0A=
            // Host-relative.=0A=
            parentRelayUrl =3D getOrigin(params.parent) + parentRelayUrl;=0A=
          }=0A=
        }=0A=
      }=0A=
=0A=
      var useLegacy =3D !!configRpc.useLegacyProtocol;=0A=
      setRelayUrl('..', parentRelayUrl, useLegacy);=0A=
=0A=
      if (useLegacy) {=0A=
        transport =3D gadgets.rpctx.ifpc;=0A=
        transport.init(process, transportReady);=0A=
      }=0A=
=0A=
      // Sets the auth token and signals transport to setup connection =
to container.=0A=
      setAuthToken('..', rpctoken);=0A=
    }=0A=
=0A=
    var requiredConfig =3D {=0A=
      parentRelayUrl : gadgets.config.NonEmptyStringValidator=0A=
    };=0A=
    gadgets.config.register("rpc", requiredConfig, init);=0A=
  }=0A=
=0A=
  function setupContainerGenericIframe(rpctoken, opt_parent) {=0A=
    // Generic child IFRAME setting up connection w/ its container.=0A=
    // Use the opt_parent param if provided, or the "parent" query param=0A=
    // if found -- otherwise, do nothing since this call might be =
initiated=0A=
    // automatically at first, then actively later in IFRAME code.=0A=
    var parent =3D opt_parent || params.parent;=0A=
    if (parent) {=0A=
      setRelayUrl('..', parent);=0A=
      setAuthToken('..', rpctoken);=0A=
    }=0A=
  }=0A=
=0A=
  function setupChildIframe(gadgetId, opt_frameurl, opt_authtoken) {=0A=
    if (!gadgets.util) {=0A=
      return;=0A=
    }=0A=
    var childIframe =3D document.getElementById(gadgetId);=0A=
    if (!childIframe) {=0A=
      throw new Error("Cannot set up gadgets.rpc receiver with ID: " + =
gadgetId +=0A=
          ", element not found.");=0A=
    }=0A=
=0A=
    // The "relay URL" can either be explicitly specified or is set as=0A=
    // the child IFRAME URL verbatim.=0A=
    var relayUrl =3D opt_frameurl || childIframe.src;=0A=
    setRelayUrl(gadgetId, relayUrl);=0A=
=0A=
    // The auth token is parsed from child params (rpctoken) or =
overridden.=0A=
    var childParams =3D gadgets.util.getUrlParameters(childIframe.src);=0A=
    var rpctoken =3D opt_authtoken || childParams.rpctoken;=0A=
    setAuthToken(gadgetId, rpctoken);=0A=
  }=0A=
=0A=
  /**=0A=
   * Sets up the gadgets.rpc library to communicate with the receiver.=0A=
   * <p>This method replaces setRelayUrl(...) and setAuthToken(...)=0A=
   *=0A=
   * <p>Simplified instructions - highly recommended:=0A=
   * <ol>=0A=
   * <li> Generate &lt;iframe id=3D"&lt;ID&gt;" =
src=3D"...#parent=3D&lt;PARENTURL&gt;&rpctoken=3D&lt;RANDOM&gt;"/&gt;=0A=
   *      and add to DOM.=0A=
   * <li> Call gadgets.rpc.setupReceiver("&lt;ID>");=0A=
   *      <p>All parent/child communication initializes automatically =
from here.=0A=
   *         Naturally, both sides need to include the library.=0A=
   * </ol>=0A=
   *=0A=
   * <p>Detailed container/parent instructions:=0A=
   * <ol>=0A=
   * <li> Create the target IFRAME (eg. gadget) with a given &lt;ID> and =
params=0A=
   *    rpctoken=3D<token> (eg. #rpctoken=3D1234), which is a =
random/unguessbable=0A=
   *    string, and parent=3D&lt;url>, where &lt;url> is the URL of the =
container.=0A=
   * <li> Append IFRAME to the document.=0A=
   * <li> Call gadgets.rpc.setupReceiver(&lt;ID>)=0A=
   * <p>[Optional]. Strictly speaking, you may omit rpctoken and parent. =
This=0A=
   *             practice earns little but is occasionally useful for =
testing.=0A=
   *             If you omit parent, you MUST pass your container URL as =
the 2nd=0A=
   *             parameter to this method.=0A=
   * </ol>=0A=
   *=0A=
   * <p>Detailed gadget/child IFRAME instructions:=0A=
   * <ol>=0A=
   * <li> If your container/parent passed parent and rpctoken params =
(query string=0A=
   *    or fragment are both OK), you needn't do anything. The library =
will self-=0A=
   *    initialize.=0A=
   * <li> If "parent" is omitted, you MUST call this method with =
targetId '..'=0A=
   *    and the second param set to the parent URL.=0A=
   * <li> If "rpctoken" is omitted, but the container set an authToken =
manually=0A=
   *    for this frame, you MUST pass that ID (however acquired) as the =
2nd param=0A=
   *    to this method.=0A=
   * </ol>=0A=
   *=0A=
   * @member gadgets.rpc=0A=
   * @param {string} targetId=0A=
   * @param {string=3D} opt_receiverurl=0A=
   * @param {string=3D} opt_authtoken=0A=
   */=0A=
  function setupReceiver(targetId, opt_receiverurl, opt_authtoken) {=0A=
    if (targetId =3D=3D=3D '..') {=0A=
      // Gadget/IFRAME to container.=0A=
      var rpctoken =3D opt_authtoken || params.rpctoken || =
params.ifpctok || "";=0A=
      if (window['__isgadget'] =3D=3D=3D true) {=0A=
        setupContainerGadgetContext(rpctoken);=0A=
      } else {=0A=
        setupContainerGenericIframe(rpctoken, opt_receiverurl);=0A=
      }=0A=
    } else {=0A=
      // Container to child.=0A=
      setupChildIframe(targetId, opt_receiverurl, opt_authtoken);=0A=
    }=0A=
  }=0A=
=0A=
  return /** @scope gadgets.rpc */ {=0A=
    /**=0A=
     * Registers an RPC service.=0A=
     * @param {string} serviceName Service name to register.=0A=
     * @param {function(Object,Object)} handler Service handler.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    register: function(serviceName, handler) {=0A=
      if (serviceName =3D=3D=3D CALLBACK_NAME || serviceName =3D=3D=3D =
ACK) {=0A=
        throw new Error("Cannot overwrite callback/ack service");=0A=
      }=0A=
=0A=
      if (serviceName =3D=3D=3D DEFAULT_NAME) {=0A=
        throw new Error("Cannot overwrite default service:"=0A=
                        + " use registerDefault");=0A=
      }=0A=
=0A=
      services[serviceName] =3D handler;=0A=
    },=0A=
=0A=
    /**=0A=
     * Unregisters an RPC service.=0A=
     * @param {string} serviceName Service name to unregister.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    unregister: function(serviceName) {=0A=
      if (serviceName =3D=3D=3D CALLBACK_NAME || serviceName =3D=3D=3D =
ACK) {=0A=
        throw new Error("Cannot delete callback/ack service");=0A=
      }=0A=
=0A=
      if (serviceName =3D=3D=3D DEFAULT_NAME) {=0A=
        throw new Error("Cannot delete default service:"=0A=
                        + " use unregisterDefault");=0A=
      }=0A=
=0A=
      delete services[serviceName];=0A=
    },=0A=
=0A=
    /**=0A=
     * Registers a default service handler to processes all unknown=0A=
     * RPC calls which raise an exception by default.=0A=
     * @param {function(Object,Object)} handler Service handler.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    registerDefault: function(handler) {=0A=
      services[DEFAULT_NAME] =3D handler;=0A=
    },=0A=
=0A=
    /**=0A=
     * Unregisters the default service handler. Future unknown RPC=0A=
     * calls will fail silently.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    unregisterDefault: function() {=0A=
      delete services[DEFAULT_NAME];=0A=
    },=0A=
=0A=
    /**=0A=
     * Forces all subsequent calls to be made by a transport=0A=
     * method that allows the caller to verify the message receiver=0A=
     * (by way of the parent parameter, through getRelayUrl(...)).=0A=
     * At present this means IFPC or WPM.=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    forceParentVerifiable: function() {=0A=
      if (!transport.isParentVerifiable()) {=0A=
        transport =3D gadgets.rpctx.ifpc;=0A=
      }=0A=
    },=0A=
=0A=
    /**=0A=
     * Calls an RPC service.=0A=
     * @param {string} targetId Module Id of the RPC service provider.=0A=
     *                          Empty if calling the parent container.=0A=
     * @param {string} serviceName Service name to call.=0A=
     * @param {function()|null} callback Callback function (if any) to =
process=0A=
     *                                 the return value of the RPC =
request.=0A=
     * @param {*} var_args Parameters for the RPC request.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    call: function(targetId, serviceName, callback, var_args) {=0A=
      targetId =3D targetId || '..';=0A=
      // Default to the container calling.=0A=
      var from =3D '..';=0A=
=0A=
      if (targetId =3D=3D=3D '..') {=0A=
        from =3D rpcId;=0A=
      }=0A=
=0A=
      ++callId;=0A=
      if (callback) {=0A=
        callbacks[callId] =3D callback;=0A=
      }=0A=
=0A=
      var rpc =3D {=0A=
        s: serviceName,=0A=
        f: from,=0A=
        c: callback ? callId : 0,=0A=
        a: Array.prototype.slice.call(arguments, 3),=0A=
        t: authToken[targetId],=0A=
        l: useLegacyProtocol[targetId]=0A=
      };=0A=
=0A=
      if (targetId !=3D=3D '..' && !document.getElementById(targetId)) {=0A=
        // The target has been removed from the DOM. Don't even try.=0A=
        gadgets.log("WARNING: attempted send to nonexistent frame: " + =
targetId);=0A=
        return;=0A=
      }=0A=
=0A=
      // If target is on the same domain, call method directly=0A=
      if (callSameDomain(targetId, rpc)) {=0A=
        return;=0A=
      }=0A=
=0A=
      // Attempt to make call via a cross-domain transport.=0A=
      // Retrieve the transport for the given target - if one=0A=
      // target is misconfigured, it won't affect the others.=0A=
      var channel =3D receiverTx[targetId] ? receiverTx[targetId] : =
transport;=0A=
=0A=
      if (!channel) {=0A=
        // Not set up yet. Enqueue the rpc for such time as it is.=0A=
        if (!earlyRpcQueue[targetId]) {=0A=
          earlyRpcQueue[targetId] =3D [ rpc ];=0A=
        } else {=0A=
          earlyRpcQueue[targetId].push(rpc);=0A=
        }=0A=
        return;=0A=
      }=0A=
=0A=
      // If we are told to use the legacy format, then we must=0A=
      // default to IFPC.=0A=
      if (useLegacyProtocol[targetId]) {=0A=
        channel =3D gadgets.rpctx.ifpc;=0A=
      }=0A=
=0A=
      if (channel.call(targetId, from, rpc) =3D=3D=3D false) {=0A=
        // Fall back to IFPC. This behavior may be removed as IFPC is as =
well.=0A=
        receiverTx[targetId] =3D fallbackTransport;=0A=
        transport.call(targetId, from, rpc);=0A=
      }=0A=
    },=0A=
=0A=
    /**=0A=
     * Gets the relay URL of a target frame.=0A=
     * @param {string} targetId Name of the target frame.=0A=
     * @return {string|undefined} Relay URL of the target frame.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    getRelayUrl: function(targetId) {=0A=
      var url =3D relayUrl[targetId];=0A=
      // Some RPC methods (wpm, for one) are unhappy with schemeless =
URLs.=0A=
      if (url && url.indexOf('//') =3D=3D 0) {=0A=
        url =3D document.location.protocol + url;=0A=
      }=0A=
      =0A=
      return url;=0A=
    },=0A=
=0A=
    setRelayUrl: setRelayUrl,=0A=
    setAuthToken: setAuthToken,=0A=
    setupReceiver: setupReceiver,=0A=
    getAuthToken: getAuthToken,=0A=
=0A=
    /**=0A=
     * Gets the RPC relay mechanism.=0A=
     * @return {string} RPC relay mechanism. See above for=0A=
     *   a list of supported types.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    getRelayChannel: function() {=0A=
      return transport.getCode();=0A=
    },=0A=
=0A=
    /**=0A=
     * Receives and processes an RPC request. (Not to be used directly.)=0A=
     * Only used by IFPC.=0A=
     * @param {Array.<string>} fragment An RPC request fragment encoded =
as=0A=
     *        an array. The first 4 elements are target id, source id & =
call id,=0A=
     *        total packet number, packet id. The last element stores =
the actual=0A=
     *        JSON-encoded and URI escaped packet data.=0A=
     *=0A=
     * @member gadgets.rpc=0A=
     * @deprecated=0A=
     */=0A=
    receive: function(fragment) {=0A=
      if (fragment.length > 4) {=0A=
        process(gadgets.json.parse(=0A=
            decodeURIComponent(fragment[fragment.length - 1])));=0A=
      }=0A=
    },=0A=
=0A=
    /**=0A=
     * Receives and processes an RPC request sent via the same domain.=0A=
     * (Not to be used directly). Converts the inbound rpc object's=0A=
     * Array into a local Array to pass the process() Array test.=0A=
     * @param {Object} rpc RPC object containing all request params=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    receiveSameDomain: function(rpc) {=0A=
      // Pass through to local process method but converting to a local =
Array=0A=
      rpc.a =3D Array.prototype.slice.call(rpc.a);=0A=
      window.setTimeout(function() { process(rpc); }, 0);=0A=
    },=0A=
=0A=
    // Helper method to get the protocol://host:port of an input URL.=0A=
    // see docs above=0A=
    getOrigin: getOrigin,=0A=
=0A=
    /**=0A=
     * Internal-only method used to initialize gadgets.rpc.=0A=
     * @member gadgets.rpc=0A=
     */=0A=
    init: function() {=0A=
      // Conduct any global setup necessary for the chosen transport.=0A=
      // Do so after gadgets.rpc definition to allow transport to access=0A=
      // gadgets.rpc methods.=0A=
      if (transport.init(process, transportReady) =3D=3D=3D false) {=0A=
        transport =3D fallbackTransport;=0A=
      }=0A=
      if (isChild) {=0A=
        setupReceiver('..');=0A=
      }=0A=
    },=0A=
=0A=
    /** Returns the window keyed by the ID. null/".." for parent, else =
child */=0A=
    _getTargetWin: getTargetWin,=0A=
=0A=
    ACK: ACK,=0A=
=0A=
    RPC_ID: rpcId=0A=
  };=0A=
}();=0A=
=0A=
// Initialize library/transport.=0A=
gadgets.rpc.init();=0A=
=0A=
} // !end of double-inclusion guard=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/*global ActiveXObject, DOMParser */=0A=
/*global shindig */=0A=
=0A=
/**=0A=
 * @fileoverview Provides remote content retrieval facilities.=0A=
 *     Available to every gadget.=0A=
 */=0A=
=0A=
/**=0A=
 * @static=0A=
 * @class Provides remote content retrieval functions.=0A=
 * @name gadgets.io=0A=
 */=0A=
=0A=
gadgets.io =3D function() {=0A=
  /**=0A=
   * Holds configuration-related data such as proxy urls.=0A=
   */=0A=
  var config =3D {};=0A=
=0A=
  /**=0A=
   * Holds state for OAuth.=0A=
   */=0A=
  var oauthState;=0A=
=0A=
  /**=0A=
   * Internal facility to create an xhr request.=0A=
   */=0A=
  function makeXhr() {=0A=
    var x; =0A=
    if (typeof shindig !=3D 'undefined' &&=0A=
        shindig.xhrwrapper &&=0A=
        shindig.xhrwrapper.createXHR) {=0A=
      return shindig.xhrwrapper.createXHR();=0A=
    } else if (window.ActiveXObject) {=0A=
      x =3D new ActiveXObject("Msxml2.XMLHTTP");=0A=
      if (!x) {=0A=
        x =3D new ActiveXObject("Microsoft.XMLHTTP");=0A=
      }=0A=
      return x;=0A=
    }=0A=
    else if (window.XMLHttpRequest) {=0A=
      return new window.XMLHttpRequest();=0A=
    }=0A=
  }=0A=
=0A=
  /**=0A=
   * Checks the xobj for errors, may call the callback with an error =
response=0A=
   * if the error is fatal.=0A=
   *=0A=
   * @param {Object} xobj The XHR object to check=0A=
   * @param {function(Object)} callback The callback to call if the =
error is fatal=0A=
   * @return {boolean} true if the xobj is not ready to be processed=0A=
   */=0A=
  function hadError(xobj, callback) {=0A=
    if (xobj.readyState !=3D=3D 4) {=0A=
      return true;=0A=
    }=0A=
    try {=0A=
      if (xobj.status !=3D=3D 200) {=0A=
      	var error =3D ("" + xobj.status);=0A=
      	if(xobj.responseText) {=0A=
      	  error =3D error + " " + xobj.responseText;=0A=
      	}=0A=
        callback({=0A=
          errors : [error],=0A=
          rc : xobj.status,=0A=
          text : xobj.responseText=0A=
          });=0A=
        return true;=0A=
      }=0A=
    } catch(e) {=0A=
      callback({=0A=
         errors : [e.number + " Error not specified"],=0A=
          rc : e.number,=0A=
          text : e.description=0A=
      });=0A=
      return true;=0A=
    }=0A=
    return false;=0A=
  }=0A=
=0A=
  /**=0A=
   * Handles non-proxied XHR callback processing.=0A=
   *=0A=
   * @param {string} url=0A=
   * @param {function(Object)} callback=0A=
   * @param {Object} params=0A=
   * @param {Object} xobj=0A=
   */=0A=
  function processNonProxiedResponse(url, callback, params, xobj) {=0A=
    if (hadError(xobj, callback)) {=0A=
      return;=0A=
    }=0A=
    var data =3D {=0A=
      body: xobj.responseText=0A=
    };=0A=
    callback(transformResponseData(params, data));=0A=
  }=0A=
=0A=
  var UNPARSEABLE_CRUFT =3D "throw 1; < don't be evil' >";=0A=
=0A=
  /**=0A=
   * Handles XHR callback processing.=0A=
   *=0A=
   * @param {string} url=0A=
   * @param {function(Object)} callback=0A=
   * @param {Object} params=0A=
   * @param {Object} xobj=0A=
   */ =0A=
  function processResponse(url, callback, params, xobj) {=0A=
    if (hadError(xobj, callback)) {=0A=
      return;=0A=
    }=0A=
    var txt =3D xobj.responseText;=0A=
    =0A=
    // remove unparseable cruft used to prevent cross-site script =
inclusion=0A=
    var offset =3D txt.indexOf(UNPARSEABLE_CRUFT) + =
UNPARSEABLE_CRUFT.length;=0A=
=0A=
    // If no cruft then just return without a callback - avoid JS errors=0A=
    // TODO craft an error response?=0A=
    if (offset < UNPARSEABLE_CRUFT.length) return;=0A=
    txt =3D txt.substr(offset)=0A=
=0A=
    // We are using eval directly here  because the outer response comes =
from a=0A=
    // trusted source, and json parsing is slow in IE.=0A=
    var data =3D eval("(" + txt + ")");=0A=
    data =3D data[url];=0A=
    // Save off any transient OAuth state the server wants back later.=0A=
    if (data.oauthState) {=0A=
      oauthState =3D data.oauthState;=0A=
    }=0A=
    // Update the security token if the server sent us a new one=0A=
    if (data.st) {=0A=
      shindig.auth.updateSecurityToken(data.st);=0A=
    }=0A=
    callback(transformResponseData(params, data));=0A=
  }=0A=
=0A=
  /**=0A=
   * @param {Object} params=0A=
   * @param {Object} data=0A=
   * @return {Object}=0A=
   */=0A=
=0A=
  function transformResponseData(params, data) {=0A=
    // Sometimes rc is not present, generally when used=0A=
    // by jsonrpccontainer, so assume 200 in its absence.=0A=
    var resp =3D {=0A=
     text: data.body,=0A=
     rc: data.rc || 200,=0A=
     headers: data.headers,=0A=
     oauthApprovalUrl: data.oauthApprovalUrl,=0A=
     oauthError: data.oauthError,=0A=
     oauthErrorText: data.oauthErrorText,=0A=
     errors: []=0A=
    };=0A=
=0A=
    if (resp.rc < 200 || resp.rc >=3D 400){=0A=
    	resp.errors =3D [resp.rc + " Error"];=0A=
    } else if (resp.text) {=0A=
      if (resp.rc >=3D 300 && resp.rc < 400) {=0A=
        // Redirect pages will usually contain arbitrary=0A=
        // HTML which will fail during parsing, inadvertently=0A=
        // causing a 500 response. Thus we treat as text.=0A=
        params.CONTENT_TYPE =3D "TEXT";=0A=
      }=0A=
      switch (params.CONTENT_TYPE) {=0A=
        case "JSON":=0A=
        case "FEED":=0A=
          resp.data =3D gadgets.json.parse(resp.text);=0A=
          if (!resp.data) {=0A=
            resp.errors.push("500 Failed to parse JSON");=0A=
            resp.rc =3D 500;=0A=
            resp.data =3D null;=0A=
          }=0A=
          break;=0A=
        case "DOM":=0A=
          var dom;=0A=
          if (window.ActiveXObject) {=0A=
            dom =3D new ActiveXObject("Microsoft.XMLDOM");=0A=
            dom.async =3D false;=0A=
            dom.validateOnParse =3D false;=0A=
            dom.resolveExternals =3D false;=0A=
            if (!dom.loadXML(resp.text)) {=0A=
              resp.errors.push("500 Failed to parse XML");=0A=
              resp.rc =3D 500;=0A=
            } else {=0A=
              resp.data =3D dom;=0A=
            }=0A=
          } else {=0A=
            var parser =3D new DOMParser();=0A=
            dom =3D parser.parseFromString(resp.text, "text/xml");=0A=
            if ("parsererror" =3D=3D=3D dom.documentElement.nodeName) {=0A=
              resp.errors.push("500 Failed to parse XML");=0A=
              resp.rc =3D 500;=0A=
            } else {=0A=
              resp.data =3D dom;=0A=
            }=0A=
          }=0A=
          break;=0A=
        default:=0A=
          resp.data =3D resp.text;=0A=
          break;=0A=
      }=0A=
  }=0A=
    return resp;=0A=
  }=0A=
=0A=
  /**=0A=
   * Sends an XHR post or get request=0A=
   *=0A=
   * @param {string} realUrl The url to fetch data from that was =
requested by the gadget=0A=
   * @param {string} proxyUrl The url to proxy through=0A=
   * @param {function()} callback The function to call once the data is =
fetched=0A=
   * @param {Object} paramData The params to use when processing the =
response=0A=
   * @param {function(string,function(Object),Object,Object)} =0A=
   *     processResponseFunction The function that should process the=0A=
   *     response from the sever before calling the callback=0A=
   * @param {string=3D} opt_contentType - Optional content type defaults =
to=0A=
   *     'application/x-www-form-urlencoded'=0A=
   */=0A=
  function makeXhrRequest(realUrl, proxyUrl, callback, paramData, method,=0A=
      params, processResponseFunction, opt_contentType) {=0A=
    var xhr =3D makeXhr();=0A=
=0A=
    if (proxyUrl.indexOf('//') =3D=3D 0) {=0A=
      proxyUrl =3D document.location.protocol + proxyUrl;=0A=
    }=0A=
    =0A=
    xhr.open(method, proxyUrl, true);=0A=
    if (callback) {=0A=
      xhr.onreadystatechange =3D gadgets.util.makeClosure(=0A=
          null, processResponseFunction, realUrl, callback, params, xhr);=0A=
    }=0A=
    if (paramData !=3D=3D null) {=0A=
      xhr.setRequestHeader('Content-Type', opt_contentType || =
'application/x-www-form-urlencoded');=0A=
      xhr.send(paramData);=0A=
    } else {=0A=
      xhr.send(null);=0A=
    }=0A=
  }=0A=
=0A=
=0A=
=0A=
  /**=0A=
   * Satisfy a request with data that is prefetched as per the gadget =
Preload=0A=
   * directive. The preloader will only satisfy a request for a specific =
piece=0A=
   * of content once.=0A=
   *=0A=
   * @param {Object} postData The definition of the request to be =
executed by the proxy=0A=
   * @param {Object} params The params to use when processing the =
response=0A=
   * @param {function(Object)} callback The function to call once the =
data is fetched=0A=
   * @return {boolean} true if the request can be satisfied by the =
preloaded =0A=
   *         content false otherwise=0A=
   */=0A=
  function respondWithPreload(postData, params, callback) {=0A=
    if (gadgets.io.preloaded_ && postData.httpMethod =3D=3D=3D "GET") {=0A=
      for (var i =3D 0; i < gadgets.io.preloaded_.length; i++) {=0A=
        var preload =3D gadgets.io.preloaded_[i];=0A=
        if (preload && (preload.id =3D=3D=3D postData.url)) {=0A=
          // Only satisfy once=0A=
          delete gadgets.io.preloaded_[i];=0A=
=0A=
          if (preload.rc !=3D=3D 200) {=0A=
            callback({rc: preload.rc, errors : [preload.rc + " Error"]});=0A=
          } else {=0A=
            if (preload.oauthState) {=0A=
              oauthState =3D preload.oauthState;=0A=
            }=0A=
            var resp =3D {=0A=
              body: preload.body,=0A=
              rc: preload.rc,=0A=
              headers: preload.headers,=0A=
              oauthApprovalUrl: preload.oauthApprovalUrl,=0A=
              oauthError: preload.oauthError,=0A=
              oauthErrorText: preload.oauthErrorText,=0A=
              errors: []=0A=
            };=0A=
            callback(transformResponseData(params, resp));=0A=
          }=0A=
          return true;=0A=
        }=0A=
      }=0A=
    }=0A=
    return false;=0A=
  }=0A=
=0A=
  /**=0A=
   * @param {Object} configuration Configuration settings=0A=
   * @private=0A=
   */=0A=
  function init (configuration) {=0A=
    config =3D configuration["core.io"] || {};=0A=
  }=0A=
=0A=
  var requiredConfig =3D {=0A=
    proxyUrl: new gadgets.config.RegExValidator(/.*%(raw)?url%.*/),=0A=
    jsonProxyUrl: gadgets.config.NonEmptyStringValidator=0A=
  };=0A=
  gadgets.config.register("core.io", requiredConfig, init);=0A=
=0A=
  return /** @scope gadgets.io */ {=0A=
    /**=0A=
     * Fetches content from the provided URL and feeds that content into =
the=0A=
     * callback function.=0A=
     *=0A=
     * Example:=0A=
     * <pre>=0A=
     * gadgets.io.makeRequest(url, fn,=0A=
     *    {contentType: gadgets.io.ContentType.FEED});=0A=
     * </pre>=0A=
     *=0A=
     * @param {string} url The URL where the content is located=0A=
     * @param {function(Object)} callback The function to call with the =
data from=0A=
     *     the URL once it is fetched=0A=
     * @param {Object.<gadgets.io.RequestParameters, Object>=3D} =
opt_params=0A=
     *     Additional=0A=
     *     <a href=3D"gadgets.io.RequestParameters.html">parameters</a>=0A=
     *     to pass to the request=0A=
     *=0A=
     * @member gadgets.io=0A=
     */=0A=
    makeRequest : function (url, callback, opt_params) {=0A=
      // TODO: This method also needs to respect all members of=0A=
      // gadgets.io.RequestParameters, and validate them.=0A=
=0A=
      var params =3D opt_params || {};=0A=
=0A=
      var httpMethod =3D params.METHOD || "GET";=0A=
      var refreshInterval =3D params.REFRESH_INTERVAL;=0A=
=0A=
      // Check if authorization is requested=0A=
      var auth, st;=0A=
      if (params.AUTHORIZATION && params.AUTHORIZATION !=3D=3D "NONE") {=0A=
        auth =3D params.AUTHORIZATION.toLowerCase();=0A=
        st =3D shindig.auth.getSecurityToken();=0A=
      } else {=0A=
        // Unauthenticated GET requests are cacheable=0A=
        if (httpMethod =3D=3D=3D "GET" && refreshInterval =3D=3D=3D =
undefined) {=0A=
          refreshInterval =3D 3600;=0A=
        }=0A=
      }=0A=
=0A=
      // Include owner information?=0A=
      var signOwner =3D true;=0A=
      if (typeof params.OWNER_SIGNED !=3D=3D "undefined") {=0A=
        signOwner =3D params.OWNER_SIGNED;=0A=
      }=0A=
=0A=
      // Include viewer information?=0A=
      var signViewer =3D true;=0A=
      if (typeof params.VIEWER_SIGNED !=3D=3D "undefined") {=0A=
        signViewer =3D params.VIEWER_SIGNED;=0A=
      }=0A=
=0A=
      var headers =3D params.HEADERS || {};=0A=
      if (httpMethod =3D=3D=3D "POST" && !headers["Content-Type"]) {=0A=
        headers["Content-Type"] =3D "application/x-www-form-urlencoded";=0A=
      }=0A=
=0A=
      var urlParams =3D gadgets.util.getUrlParameters();=0A=
=0A=
      var paramData =3D {=0A=
        url: url,=0A=
        httpMethod : httpMethod,=0A=
        headers: gadgets.io.encodeValues(headers, false),=0A=
        postData : params.POST_DATA || "",=0A=
        authz : auth || "",=0A=
        st : st || "",=0A=
        contentType : params.CONTENT_TYPE || "TEXT",=0A=
        numEntries : params.NUM_ENTRIES || "3",=0A=
        getSummaries : !!params.GET_SUMMARIES,=0A=
        signOwner : signOwner,=0A=
        signViewer : signViewer,=0A=
        gadget : urlParams.url,=0A=
        container : urlParams.container || urlParams.synd || "default",=0A=
        // should we bypass gadget spec cache (e.g. to read OAuth =
provider URLs)=0A=
        bypassSpecCache : gadgets.util.getUrlParameters().nocache || "",=0A=
        getFullHeaders : !!params.GET_FULL_HEADERS=0A=
      };=0A=
=0A=
      // OAuth goodies=0A=
      if (auth =3D=3D=3D "oauth" || auth =3D=3D=3D "signed") {=0A=
        if (gadgets.io.oauthReceivedCallbackUrl_) {=0A=
          paramData.OAUTH_RECEIVED_CALLBACK =3D =
gadgets.io.oauthReceivedCallbackUrl_;=0A=
          gadgets.io.oauthReceivedCallbackUrl_ =3D null;=0A=
        }=0A=
        paramData.oauthState =3D oauthState || "";=0A=
        // Just copy the OAuth parameters into the req to the server=0A=
        for (var opt in params) {=0A=
          if (params.hasOwnProperty(opt)) {=0A=
            if (opt.indexOf("OAUTH_") =3D=3D=3D 0) {=0A=
              paramData[opt] =3D params[opt];=0A=
            }=0A=
          }=0A=
        }=0A=
      }=0A=
=0A=
      var proxyUrl =3D config.jsonProxyUrl.replace("%host%", =
document.location.host);=0A=
=0A=
      // FIXME -- processResponse is not used in call=0A=
      if (!respondWithPreload(paramData, params, callback, =
processResponse)) {=0A=
        if (httpMethod =3D=3D=3D "GET" && refreshInterval > 0) {=0A=
          // this content should be cached=0A=
          // Add paramData to the URL=0A=
          var extraparams =3D "?refresh=3D" + refreshInterval + '&'=0A=
              + gadgets.io.encodeValues(paramData);=0A=
=0A=
          makeXhrRequest(url, proxyUrl + extraparams, callback,=0A=
              null, "GET", params, processResponse);=0A=
=0A=
        } else {=0A=
          makeXhrRequest(url, proxyUrl, callback,=0A=
              gadgets.io.encodeValues(paramData), "POST", params,=0A=
              processResponse);=0A=
        }=0A=
      }=0A=
    },=0A=
=0A=
    /**=0A=
     * @private=0A=
     */=0A=
    makeNonProxiedRequest : function (relativeUrl, callback, opt_params, =
opt_contentType) {=0A=
      var params =3D opt_params || {};=0A=
      makeXhrRequest(relativeUrl, relativeUrl, callback, =
params.POST_DATA,=0A=
          params.METHOD, params, processNonProxiedResponse, =
opt_contentType);=0A=
    },=0A=
=0A=
    /**=0A=
     * Used to clear out the oauthState, for testing only.=0A=
     *=0A=
     * @private=0A=
     */=0A=
    clearOAuthState : function () {=0A=
      oauthState =3D undefined;=0A=
    },=0A=
=0A=
    /**=0A=
     * Converts an input object into a URL-encoded data string.=0A=
     * (key=3Dvalue&amp;...)=0A=
     *=0A=
     * @param {Object} fields The post fields you wish to encode=0A=
     * @param {boolean=3D} opt_noEscaping An optional parameter =
specifying whether=0A=
     *     to turn off escaping of the parameters. Defaults to false.=0A=
     * @return {string} The processed post data in www-form-urlencoded =
format.=0A=
     *=0A=
     * @member gadgets.io=0A=
     */=0A=
    encodeValues : function (fields, opt_noEscaping) {=0A=
      var escape =3D !opt_noEscaping;=0A=
=0A=
      var buf =3D [];=0A=
      var first =3D false;=0A=
      for (var i in fields) {=0A=
        if (fields.hasOwnProperty(i) && !/___$/.test(i)) {=0A=
          if (!first) {=0A=
            first =3D true;=0A=
          } else {=0A=
            buf.push("&");=0A=
          }=0A=
          buf.push(escape ? encodeURIComponent(i) : i);=0A=
          buf.push("=3D");=0A=
          buf.push(escape ? encodeURIComponent(fields[i]) : fields[i]);=0A=
        }=0A=
      }=0A=
      return buf.join("");=0A=
    },=0A=
=0A=
    /**=0A=
     * Gets the proxy version of the passed-in URL.=0A=
     *=0A=
     * @param {string} url The URL to get the proxy URL for=0A=
     * @param {Object.<gadgets.io.RequestParameters, Object>=3D} =
opt_params Optional Parameter Object.=0A=
     *     The following properties are supported:=0A=
     *       .REFRESH_INTERVAL The number of seconds that this=0A=
     *           content should be cached.  Defaults to 3600.=0A=
     *=0A=
     * @return {string} The proxied version of the URL=0A=
     * @member gadgets.io=0A=
     */=0A=
    getProxyUrl : function (url, opt_params) {=0A=
      var params =3D opt_params || {};=0A=
      var refresh =3D params.REFRESH_INTERVAL;=0A=
      if (refresh =3D=3D=3D undefined) {=0A=
        refresh =3D "3600";=0A=
      }=0A=
=0A=
      var urlParams =3D gadgets.util.getUrlParameters();=0A=
=0A=
      var rewriteMimeParam =3D=0A=
          params.rewriteMime ? "&rewriteMime=3D" + =
encodeURIComponent(params.rewriteMime) : "";=0A=
      var ret =3D config.proxyUrl.replace("%url%", =
encodeURIComponent(url)).=0A=
          replace("%host%", document.location.host).=0A=
          replace("%rawurl%", url).=0A=
          replace("%refresh%", encodeURIComponent(refresh)).=0A=
          replace("%gadget%", encodeURIComponent(urlParams.url)).=0A=
          replace("%container%", encodeURIComponent(urlParams.container =
|| urlParams.synd || "default")).=0A=
          replace("%rewriteMime%", rewriteMimeParam);=0A=
      if (ret.indexOf('//') =3D=3D 0) {=0A=
        ret =3D window.location.protocol + ret;=0A=
      }=0A=
      return ret;=0A=
    }=0A=
  };=0A=
}();=0A=
=0A=
gadgets.io.RequestParameters =3D gadgets.util.makeEnum([=0A=
  "METHOD",=0A=
  "CONTENT_TYPE",=0A=
  "POST_DATA",=0A=
  "HEADERS",=0A=
  "AUTHORIZATION",=0A=
  "NUM_ENTRIES",=0A=
  "GET_SUMMARIES",=0A=
  "GET_FULL_HEADERS",=0A=
  "REFRESH_INTERVAL",=0A=
  "OAUTH_SERVICE_NAME",=0A=
  "OAUTH_USE_TOKEN",=0A=
  "OAUTH_TOKEN_NAME",=0A=
  "OAUTH_REQUEST_TOKEN",=0A=
  "OAUTH_REQUEST_TOKEN_SECRET",=0A=
  "OAUTH_RECEIVED_CALLBACK"=0A=
]);=0A=
=0A=
/**=0A=
 * @const=0A=
 */=0A=
gadgets.io.MethodType =3D gadgets.util.makeEnum([=0A=
  "GET", "POST", "PUT", "DELETE", "HEAD"=0A=
]);=0A=
=0A=
/**=0A=
 * @const=0A=
 */=0A=
gadgets.io.ContentType =3D gadgets.util.makeEnum([=0A=
  "TEXT", "DOM", "JSON", "FEED"=0A=
]);=0A=
=0A=
/**=0A=
 * @const=0A=
 */=0A=
gadgets.io.AuthorizationType =3D gadgets.util.makeEnum([=0A=
  "NONE", "SIGNED", "OAUTH"=0A=
]);=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @class=0A=
 * Tame and expose core gadgets.io.* API to cajoled gadgets=0A=
 */=0A=
var tamings___ =3D tamings___ || [];=0A=
tamings___.push(function(imports) {=0A=
  caja___.whitelistFuncs([=0A=
    [gadgets.io, 'encodeValues'],=0A=
    [gadgets.io, 'getProxyUrl'],=0A=
    [gadgets.io, 'makeRequest']=0A=
  ]);=0A=
});=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
(function() {=0A=
  /**=0A=
   * Called by the transports for each service method that they expose=0A=
   * @param {string} method  The method to expose e.g. "people.get"=0A=
   * @param {Object.<string,Object>} transport The transport used to =
execute a call for the method=0A=
   */=0A=
  osapi._registerMethod =3D function (method, transport) {=0A=
=0A=
    // Skip registration of local newBatch implementation.=0A=
    if (method =3D=3D "newBatch") {=0A=
        return;=0A=
    }=0A=
=0A=
    // Lookup last method value.=0A=
    var parts =3D method.split(".");=0A=
    var last =3D osapi;=0A=
    for (var i =3D 0; i < parts.length - 1; i++) {=0A=
      last[parts[i]] =3D last[parts[i]] || {};=0A=
      last =3D last[parts[i]];=0A=
    }=0A=
=0A=
    // Use the batch as the actual executor of calls.=0A=
    var apiMethod =3D function(rpc) {=0A=
      var batch =3D osapi.newBatch();=0A=
      var boundCall =3D {};=0A=
      boundCall.execute =3D function(callback) {=0A=
        var feralCallback =3D window.___ ? ___.untame(callback) : =
callback;=0A=
        var that =3D window.___ ? ___.USELESS : this;=0A=
        batch.add(method, this);=0A=
        batch.execute(function(batchResult) {=0A=
          if (batchResult.error) {=0A=
            feralCallback.call(that, batchResult.error);=0A=
          } else {=0A=
            feralCallback.call(that, batchResult[method]);=0A=
          }=0A=
        });=0A=
      }=0A=
      if (window.___) {=0A=
          ___.markInnocent(boundCall.execute, 'execute');=0A=
      }=0A=
      // TODO: This shouldnt really be necessary. The spec should be =
clear enough about=0A=
      // defaults that we dont have to populate this.=0A=
      rpc =3D rpc || {};=0A=
      rpc.userId =3D rpc.userId || "@viewer";=0A=
      rpc.groupId =3D rpc.groupId || "@self";=0A=
=0A=
      // Decorate the execute method with the information necessary for =
batching=0A=
      boundCall.method =3D method;=0A=
      boundCall.transport =3D transport;=0A=
      boundCall.rpc =3D rpc;=0A=
=0A=
      return boundCall;=0A=
    };=0A=
    if (window.___ && window.___.markInnocent) {=0A=
      ___.markInnocent(apiMethod, method);=0A=
    }=0A=
=0A=
    if (last[parts[parts.length - 1]]) {=0A=
      gadgets.warn("Skipping duplicate osapi method definition " + =
method + " on transport " + transport.name);=0A=
    } else {=0A=
      last[parts[parts.length - 1]] =3D apiMethod;=0A=
    }=0A=
  };=0A=
})();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
(function() {=0A=
=0A=
  /**=0A=
   * It is common to batch requests together to make them more efficient.=0A=
   *=0A=
   * Note: the container config specified endpoints at which services =
are to be found.=0A=
   * When creating a batch, the calls are split out into separate =
requests based on the=0A=
   * transport, as it may get sent to a different server on the backend.=0A=
   */=0A=
  var newBatch =3D function() {=0A=
    var that =3D {};=0A=
=0A=
    // An array of requests where each request is=0A=
    // { key : <key>=0A=
    //   request : {=0A=
    //     method : <service-method>=0A=
    //     rpc  : <request params>=0A=
    //     transport : <rpc dispatcher>=0A=
    //  }=0A=
    // }=0A=
=0A=
    /** @type {Array.<Object>} */=0A=
    var keyedRequests =3D [];=0A=
=0A=
    /**=0A=
     * Create a new request in the batch=0A=
     * @param {string} key id for the request=0A=
     * @param {Object} request the opensocial request object which is of =
the form=0A=
     * { method : <service-method>=0A=
     *   rpc  : <request>=0A=
     *   transport : <rpc dispatcher>=0A=
     * }=0A=
     */=0A=
    var add =3D function(key, request) {=0A=
      if (request && key) {=0A=
        keyedRequests.push({"key" : key, "request" : request});=0A=
        return that;=0A=
      }=0A=
    };=0A=
=0A=
    /**=0A=
     * Convert our internal request format into a JSON-RPC=0A=
     * @param {Object} request=0A=
     */=0A=
    var toJsonRpc =3D function(request) {=0A=
      var jsonRpc =3D {method : request.request.method, id : =
request.key};=0A=
      if (request.request.rpc) {=0A=
        jsonRpc.params =3D request.request.rpc;=0A=
      }=0A=
      return jsonRpc;=0A=
    };=0A=
=0A=
    /**=0A=
     * Call to make a batch execute its requests. Batch will distribute =
calls over their=0A=
     * bound transports and then merge them before calling the =
userCallback. If the result=0A=
     * of an rpc is another rpc request then it will be chained and =
executed.=0A=
     *=0A=
     * @param {function(Object)} userCallback the callback to the gadget =
where results are passed.=0A=
     */=0A=
    var execute =3D  function(userCallback) {=0A=
      var batchResult =3D {};=0A=
=0A=
      var perTransportBatch =3D {};=0A=
=0A=
      // Break requests into their per-transport batches in call order=0A=
      /** @type {number} */=0A=
      var latchCount =3D 0;=0A=
      var transports =3D [];=0A=
      for (var i =3D 0; i < keyedRequests.length; i++) {=0A=
        // Batch requests per-transport=0A=
        var transport =3D keyedRequests[i].request.transport;=0A=
        if (!perTransportBatch[transport.name]) {=0A=
          transports.push(transport);=0A=
          latchCount++;=0A=
        }=0A=
        perTransportBatch[transport.name] =3D =
perTransportBatch[transport.name] || [];=0A=
=0A=
        // Transform the request into JSON-RPC form before sending to =
the transport=0A=
        =
perTransportBatch[transport.name].push(toJsonRpc(keyedRequests[i]));=0A=
      }=0A=
=0A=
      // Define callback for transports=0A=
      var transportCallback =3D function(transportBatchResult) {=0A=
        if (transportBatchResult.error) {=0A=
          batchResult.error =3D transportBatchResult.error;=0A=
        }=0A=
        // Merge transport results into overall result and hoist data.=0A=
        // All transport results are required to be of the format=0A=
        // { <key> : <JSON-RPC response>, ...}=0A=
        for (var i =3D 0; i < keyedRequests.length; i++) {=0A=
          var key =3D keyedRequests[i].key;=0A=
          var response =3D transportBatchResult[key];=0A=
          if (response) {=0A=
            if (response.error) {=0A=
              // No need to hoist error responses=0A=
              batchResult[key] =3D response;=0A=
            } else {=0A=
              // Handle both compliant and non-compliant JSON-RPC data =
responses.=0A=
              batchResult[key] =3D response.data || response.result;=0A=
            }=0A=
          }=0A=
        }=0A=
=0A=
        // Latch on no. of transports before calling user callback=0A=
        latchCount--;=0A=
        if (latchCount =3D=3D=3D 0) {=0A=
          userCallback(batchResult);=0A=
        }=0A=
      };=0A=
=0A=
      // For each transport execute its local batch of requests=0A=
      for (var j =3D 0; j < transports.length; j++) {=0A=
        transports[j].execute(perTransportBatch[transports[j].name], =
transportCallback);=0A=
      }=0A=
=0A=
      // Force the callback to occur asynchronously even if there were =
no actual calls=0A=
      if (latchCount =3D=3D 0) {=0A=
        window.setTimeout(function(){userCallback(batchResult)}, 0);=0A=
      }=0A=
    };=0A=
=0A=
    that.execute =3D execute;=0A=
    that.add =3D add;=0A=
    return that;=0A=
  };=0A=
=0A=
  osapi.newBatch =3D newBatch;=0A=
})();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * Provide a transport of osapi requests over JSON-RPC. Exposed JSON-RPC =
endpoints and=0A=
 * their associated methods are available from config in the =
"osapi.services" field.=0A=
 */=0A=
(function() {=0A=
=0A=
  /**=0A=
   * Called by a batch to execute all requests=0A=
   * @param {Object} requests=0A=
   * @param {function(Object)} callback=0A=
   */=0A=
  function execute(requests, callback) {=0A=
=0A=
    function processResponse(response) {=0A=
      // Convert an XHR failure to a JSON-RPC error=0A=
      if (response.errors[0]) {=0A=
        callback({=0A=
          error : {=0A=
            code : response.rc,=0A=
            message : response.text=0A=
          }=0A=
        });=0A=
      } else {=0A=
        var jsonResponse =3D response.result || response.data;=0A=
        if (jsonResponse.error) {=0A=
          callback(jsonResponse);=0A=
        } else {=0A=
          var responseMap =3D {};=0A=
          for (var i =3D 0; i < jsonResponse.length; i++) {=0A=
            responseMap[jsonResponse[i].id] =3D jsonResponse[i];=0A=
          }=0A=
          callback(responseMap);=0A=
        }=0A=
      }=0A=
    }=0A=
=0A=
    var request =3D {=0A=
      "POST_DATA" : gadgets.json.stringify(requests),=0A=
      "CONTENT_TYPE" : "JSON",=0A=
      "METHOD" : "POST",=0A=
      "AUTHORIZATION" : "SIGNED"=0A=
    };=0A=
=0A=
    var url =3D this.name;=0A=
    var token =3D shindig.auth.getSecurityToken();=0A=
    if (token) {=0A=
      url +=3D "?st=3D";=0A=
      url +=3D encodeURIComponent(token);=0A=
    }=0A=
    gadgets.io.makeNonProxiedRequest(url, processResponse, request, =
"application/json");=0A=
  }=0A=
=0A=
  function init(config) {=0A=
    var services =3D config["osapi.services"];=0A=
    if (services) {=0A=
      // Iterate over the defined services, extract the http endpoints =
and=0A=
      // create a transport per-endpoint=0A=
      for (var endpointName in services) if =
(services.hasOwnProperty(endpointName)) {=0A=
        if (endpointName.indexOf("http") =3D=3D 0 ||=0A=
            endpointName.indexOf("//") =3D=3D 0) {=0A=
          // Expand the host & append the security token=0A=
          var endpointUrl =3D endpointName.replace("%host%", =
document.location.host);=0A=
          var transport =3D { name : endpointUrl, "execute" : execute };=0A=
          var methods =3D services[endpointName];=0A=
          for (var i=3D0; i < methods.length; i++) {=0A=
            osapi._registerMethod(methods[i], transport);=0A=
          }=0A=
        }=0A=
      }=0A=
    }=0A=
  }=0A=
=0A=
  // We do run this in the container mode in the new common container=0A=
  if (gadgets.config) {=0A=
    gadgets.config.register("osapi.services", null, init);=0A=
  }=0A=
=0A=
})();=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * A transport for osapi based on gadgets.rpc. Allows osapi to expose =
APIs requiring container=0A=
 * and user UI mediation in addition to allowing data oriented APIs to =
be implemented using=0A=
 * gadgets.rpc instead of XHR/JSON-RPC/REST etc..=0A=
 */=0A=
if (gadgets && gadgets.rpc) { //Dont bind if gadgets.rpc not defined=0A=
  (function() {=0A=
=0A=
    /**=0A=
     * Execute the JSON-RPC batch of gadgets.rpc. The container is =
expected to implement=0A=
     * the method osapi._handleGadgetRpcMethod(<JSON-RPC batch>)=0A=
     *=0A=
     * @param {Object} requests the opensocial JSON-RPC request batch=0A=
     * @param {function(Object)} callback to the osapi batch with either =
an error response or=0A=
     * a JSON-RPC batch result=0A=
     * @private=0A=
     */=0A=
    function execute(requests, callback) {=0A=
        var rpcCallback =3D function(response) {=0A=
        if (!response) {=0A=
          callback({ code : 500, message : 'Container refused the =
request' });=0A=
        } else if (response.error) {=0A=
          callback(response);=0A=
        } else {=0A=
          var responseMap =3D {};=0A=
          for (var i =3D 0; i < response.length; i++) {=0A=
            responseMap[response[i].id] =3D response[i];=0A=
          }=0A=
          callback(responseMap);=0A=
        }=0A=
      };=0A=
      gadgets.rpc.call('..', 'osapi._handleGadgetRpcMethod', =
rpcCallback, requests);=0A=
      // TODO - Timeout handling if rpc silently fails?=0A=
    }=0A=
=0A=
    function init(config) {=0A=
      var transport =3D { name : "gadgets.rpc", "execute" : execute };=0A=
      var services =3D config["osapi.services"];=0A=
      if (services) {=0A=
        // Iterate over the defined services, extract the gadget.rpc =
endpoint and=0A=
        // bind to it=0A=
        for (var endpointName in services) if =
(services.hasOwnProperty(endpointName)) {=0A=
          if (endpointName =3D=3D=3D "gadgets.rpc") {=0A=
            var methods =3D services[endpointName];=0A=
            for (var i=3D0; i < methods.length; i++) {=0A=
              osapi._registerMethod(methods[i], transport);=0A=
            }=0A=
          }=0A=
        }=0A=
      }=0A=
=0A=
      // Check if the container.listMethods is bound? If it is then use =
it to=0A=
      // introspect the container services for available methods and =
bind them=0A=
      // Because the call is asynchronous we delay the execution of the =
gadget onLoad=0A=
      // handler until the callback has completed. Containers wishing to =
avoid this=0A=
      // behavior should not specify a binding for container.listMethods =
in their=0A=
      // container config but rather list out all the container methods =
they want to=0A=
      // expose directly which is the preferred option for production =
environments=0A=
      if (osapi.container && osapi.container.listMethods) {=0A=
=0A=
        // Swap out the onload handler with a latch so that it is not =
called=0A=
        // until two of the three following events occur=0A=
        // 1 - gadgets.util.runOnLoadHandlers called at end of gadget =
content=0A=
        // 2 - callback from container.listMethods=0A=
        // 3 - callback from window.setTimeout=0A=
        var originalRunOnLoadHandlers =3D gadgets.util.runOnLoadHandlers;=0A=
        var count =3D 2;=0A=
        var newRunOnLoadHandlers =3D function() {=0A=
          count--;=0A=
          if (count =3D=3D 0) {=0A=
            originalRunOnLoadHandlers();=0A=
          }=0A=
        };=0A=
        gadgets.util.runOnLoadHandlers =3D newRunOnLoadHandlers;=0A=
=0A=
        // Call for the container methods and bind them to osapi.=0A=
        osapi.container.listMethods({}).execute(function(response) {=0A=
          if (!response.error) {=0A=
            for (var i =3D 0; i < response.length; i++) {=0A=
              // do not rebind container.listMethods implementation=0A=
              if (response[i] !=3D "container.listMethods") {=0A=
                osapi._registerMethod(response[i], transport);=0A=
              }=0A=
            }=0A=
          }=0A=
          // Notify completion=0A=
          newRunOnLoadHandlers();=0A=
        });=0A=
=0A=
        // Wait 500ms for the rpc. This should be a reasonable upper =
bound=0A=
        // even for slow transports while still allowing for reasonable =
testing=0A=
        // in a development environment=0A=
        window.setTimeout(newRunOnLoadHandlers, 500);=0A=
      }=0A=
    }=0A=
=0A=
    // Do not run this in container mode.=0A=
    if (gadgets.config && gadgets.config.isGadget) {=0A=
      gadgets.config.register("osapi.services", null, init);=0A=
    }=0A=
  })();=0A=
}=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * Service to retrieve People via JSON RPC opensocial calls.=0A=
 * Called in onLoad handler as osapi.people.get could be defined by=0A=
 * the container over the gadgets.rpc transport.=0A=
 */=0A=
gadgets.util.registerOnLoadHandler(function() {=0A=
=0A=
  // No point defining these if osapi.people.get doesn't exist=0A=
  if (osapi && osapi.people && osapi.people.get) {=0A=
    /**=0A=
    * Helper functions to get People.=0A=
    * Options specifies parameters to the call as outlined in the=0A=
    * JSON RPC Opensocial Spec=0A=
    * =
http://www.opensocial.org/Technical-Resources/opensocial-spec-v081/rpc-pr=
otocol=0A=
    * @param {object.<JSON>} The JSON object of parameters for the =
specific request=0A=
    */=0A=
       /**=0A=
      * Function to get Viewer profile.=0A=
      * Options specifies parameters to the call as outlined in the=0A=
      * JSON RPC Opensocial Spec=0A=
      * =
http://www.opensocial.org/Technical-Resources/opensocial-spec-v081/rpc-pr=
otocol=0A=
      * @param {object.<JSON>} The JSON object of parameters for the =
specific request=0A=
      */=0A=
      osapi.people.getViewer =3D function(options) {=0A=
        options =3D options || {};=0A=
        options.userId =3D "@viewer";=0A=
        options.groupId =3D "@self";=0A=
        return osapi.people.get(options);=0A=
      };=0A=
=0A=
      /**=0A=
      * Function to get Viewer's friends'  profiles.=0A=
      * Options specifies parameters to the call as outlined in the=0A=
      * JSON RPC Opensocial Spec=0A=
      * =
http://www.opensocial.org/Technical-Resources/opensocial-spec-v081/rpc-pr=
otocol=0A=
      * @param {object.<JSON>} The JSON object of parameters for the =
specific request=0A=
      */=0A=
      osapi.people.getViewerFriends =3D function(options) {=0A=
        options =3D options || {};=0A=
        options.userId =3D "@viewer";=0A=
        options.groupId =3D "@friends";=0A=
        return osapi.people.get(options);=0A=
      };=0A=
=0A=
      /**=0A=
      * Function to get Owner profile.=0A=
      * Options specifies parameters to the call as outlined in the=0A=
      * JSON RPC Opensocial Spec=0A=
      * =
http://www.opensocial.org/Technical-Resources/opensocial-spec-v081/rpc-pr=
otocol=0A=
      * @param {object.<JSON>} The JSON object of parameters for the =
specific request=0A=
      */=0A=
      osapi.people.getOwner =3D function(options) {=0A=
        options =3D options || {};=0A=
        options.userId =3D "@owner";=0A=
        options.groupId =3D "@self";=0A=
        return osapi.people.get(options);=0A=
      };=0A=
=0A=
      /**=0A=
      * Function to get Owner's friends' profiles.=0A=
      * Options specifies parameters to the call as outlined in the=0A=
      * JSON RPC Opensocial Spec=0A=
      * =
http://www.opensocial.org/Technical-Resources/opensocial-spec-v081/rpc-pr=
otocol=0A=
      * @param {object.<JSON>} The JSON object of parameters for the =
specific request=0A=
      */=0A=
      osapi.people.getOwnerFriends =3D function(options) {=0A=
        options =3D options || {};=0A=
        options.userId =3D "@owner";=0A=
        options.groupId =3D "@friends";=0A=
        return osapi.people.get(options);=0A=
      };=0A=
  }=0A=
});=0A=
;=0A=
/*=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements.  See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership.  The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License.  You may obtain a copy of the License at=0A=
 *=0A=
 *     http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied.  See the License for the=0A=
 * specific language governing permissions and limitations=0A=
 * under the License.=0A=
 */=0A=
=0A=
/**=0A=
 * @class=0A=
 * Tame and expose core osapi.* API to cajoled gadgets=0A=
 */=0A=
var tamings___ =3D tamings___ || [];=0A=
tamings___.push(function(imports) {=0A=
=0A=
  ___.tamesTo(osapi.newBatch, ___.markFuncFreeze(function () {=0A=
    var result =3D osapi.newBatch();=0A=
    ___.markInnocent(result['add'], 'add');=0A=
    ___.markInnocent(result['execute'], 'execute');=0A=
    return ___.tame(result);=0A=
  }));=0A=
=0A=
  // OSAPI functions are marked as simple funcs as they are registered=0A=
  imports.outers.osapi =3D ___.tame(osapi);=0A=
  ___.grantRead(imports.outers, 'osapi');=0A=
=0A=
  // Forced to tame in an onload handler because peoplehelpers does=0A=
  // not define some functions till runOnLoadHandlers runs=0A=
  var savedImports =3D imports;=0A=
  gadgets.util.registerOnLoadHandler(function() {=0A=
    if (osapi && osapi.people && osapi.people.get) {=0A=
      caja___.whitelistFuncs([=0A=
        [osapi.people, 'getViewer'],=0A=
        [osapi.people, 'getViewerFriends'],=0A=
        [osapi.people, 'getOwner'],=0A=
        [osapi.people, 'getOwnerFriends']=0A=
      ]);=0A=
      // Careful not to clobber osapi.people which already has tamed =
functions on it=0A=
      savedImports.outers.osapi.people.getViewer =3D =
___.tame(osapi.people.getViewer);=0A=
      savedImports.outers.osapi.people.getViewerFriends =3D =
___.tame(osapi.people.getViewerFriends);=0A=
      savedImports.outers.osapi.people.getOwner =3D =
___.tame(osapi.people.getOwner);=0A=
      savedImports.outers.osapi.people.getOwnerFriends =3D =
___.tame(osapi.people.getOwnerFriends);=0A=
    }=0A=
  });=0A=
=0A=
});=0A=
;=0A=
/**=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Utility functions for the Open Gadget Container=0A=
 */=0A=
=0A=
Function.prototype.inherits =3D function(parentCtor) {=0A=
  function tempCtor() {};=0A=
  tempCtor.prototype =3D parentCtor.prototype;=0A=
  this.superClass_ =3D parentCtor.prototype;=0A=
  this.prototype =3D new tempCtor();=0A=
  this.prototype.constructor =3D this;=0A=
};;=0A=
/**=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Functions for setting, getting and deleting cookies=0A=
 */=0A=
=0A=
/**=0A=
 * Namespace for cookie functions=0A=
 */=0A=
=0A=
// TODO: find the official solution for a cookies library=0A=
shindig.cookies =3D {};=0A=
=0A=
=0A=
shindig.cookies.JsType_ =3D {=0A=
  UNDEFINED: 'undefined'=0A=
};=0A=
=0A=
shindig.cookies.isDef =3D function(val) {=0A=
  return typeof val !=3D shindig.cookies.JsType_.UNDEFINED;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Sets a cookie.=0A=
 * The max_age can be -1 to set a session cookie. To remove and expire =
cookies,=0A=
 * use remove() instead.=0A=
 *=0A=
 * @param {string} name The cookie name.=0A=
 * @param {string} value The cookie value.=0A=
 * @param {number} opt_maxAge The max age in seconds (from now). Use -1 =
to set=0A=
 *                            a session cookie. If not provided, the =
default is=0A=
 *                            -1 (i.e. set a session cookie).=0A=
 * @param {string} opt_path The path of the cookie, or null to not =
specify a=0A=
 *                          path attribute (browser will use the full =
request=0A=
 *                          path). If not provided, the default is '/' =
(i.e.=0A=
 *                          path=3D/).=0A=
 * @param {string} opt_domain The domain of the cookie, or null to not =
specify=0A=
 *                            a domain attribute (browser will use the =
full=0A=
 *                            request host name). If not provided, the =
default=0A=
 *                            is null (i.e. let browser use full request =
host=0A=
 *                            name).=0A=
 */=0A=
shindig.cookies.set =3D function(name, value, opt_maxAge, opt_path, =
opt_domain) {=0A=
  // we do not allow '=3D' or ';' in the name=0A=
  if (/;=3D/g.test(name)) {=0A=
    throw new Error('Invalid cookie name "' + name + '"');=0A=
  }=0A=
  // we do not allow ';' in value=0A=
  if (/;/g.test(value)) {=0A=
    throw new Error('Invalid cookie value "' + value + '"');=0A=
  }=0A=
=0A=
  if (!shindig.cookies.isDef(opt_maxAge)) {=0A=
    opt_maxAge =3D -1;=0A=
  }=0A=
=0A=
  var domainStr =3D opt_domain ? ';domain=3D' + opt_domain : '';=0A=
  var pathStr =3D opt_path ? ';path=3D' + opt_path : '';=0A=
=0A=
  var expiresStr;=0A=
=0A=
  // Case 1: Set a session cookie.=0A=
  if (opt_maxAge < 0) {=0A=
    expiresStr =3D '';=0A=
=0A=
  // Case 2: Expire the cookie.=0A=
  // Note: We don't tell people about this option in the function doc =
because=0A=
  // we prefer people to use ExpireCookie() to expire cookies.=0A=
  } else if (opt_maxAge =3D=3D=3D 0) {=0A=
    // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to =
convert=0A=
    // it to local time, and if the local time is before Jan 1, 1970, =
then the=0A=
    // browser will ignore the Expires attribute altogether.=0A=
    var pastDate =3D new Date(1970, 1 /*Feb*/, 1);  // Feb 1, 1970=0A=
    expiresStr =3D ';expires=3D' + pastDate.toUTCString();=0A=
=0A=
  // Case 3: Set a persistent cookie.=0A=
  } else {=0A=
    var futureDate =3D new Date((new Date).getTime() + opt_maxAge * =
1000);=0A=
    expiresStr =3D ';expires=3D' + futureDate.toUTCString();=0A=
  }=0A=
=0A=
  document.cookie =3D name + '=3D' + value + domainStr + pathStr + =
expiresStr;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Returns the value for the first cookie with the given name=0A=
 * @param {string} name The name of the cookie to get=0A=
 * @param {string} opt_default If not found this is returned instead.=0A=
 * @return {string|undefined} The value of the cookie. If no cookie is =
set this=0A=
 *                            returns opt_default or undefined if =
opt_default is=0A=
 *                            not provided.=0A=
 */=0A=
shindig.cookies.get =3D function(name, opt_default) {=0A=
  var nameEq =3D name + "=3D";=0A=
  var cookie =3D String(document.cookie);=0A=
  for (var pos =3D -1; (pos =3D cookie.indexOf(nameEq, pos + 1)) >=3D =
0;) {=0A=
    var i =3D pos;=0A=
    // walk back along string skipping whitespace and looking for a ; =
before=0A=
    // the name to make sure that we don't match cookies whose name =
contains=0A=
    // the given name as a suffix.=0A=
    while (--i >=3D 0) {=0A=
      var ch =3D cookie.charAt(i);=0A=
      if (ch =3D=3D ';') {=0A=
        i =3D -1;  // indicate success=0A=
        break;=0A=
      }=0A=
    }=0A=
    if (i =3D=3D -1) {  // first cookie in the string or we found a ;=0A=
      var end =3D cookie.indexOf(';', pos);=0A=
      if (end < 0) {=0A=
        end =3D cookie.length;=0A=
      }=0A=
      return cookie.substring(pos + nameEq.length, end);=0A=
    }=0A=
  }=0A=
  return opt_default;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Removes and expires a cookie.=0A=
 *=0A=
 * @param {string} name The cookie name.=0A=
 * @param {string} opt_path The path of the cookie, or null to expire a =
cookie=0A=
 *                          set at the full request path. If not =
provided, the=0A=
 *                          default is '/' (i.e. path=3D/).=0A=
 * @param {string} opt_domain The domain of the cookie, or null to =
expire a=0A=
 *                            cookie set at the full request host name. =
If not=0A=
 *                            provided, the default is null (i.e. cookie =
at=0A=
 *                            full request host name).=0A=
 */=0A=
shindig.cookies.remove =3D function(name, opt_path, opt_domain) {=0A=
  var rv =3D shindig.cookies.containsKey(name);=0A=
  shindig.cookies.set(name, '', 0, opt_path, opt_domain);=0A=
  return rv;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Gets the names and values for all the cookies=0A=
 * @private=0A=
 * @return {Object} An object with keys and values=0A=
 */=0A=
shindig.cookies.getKeyValues_ =3D function() {=0A=
  var cookie =3D String(document.cookie);=0A=
  var parts =3D cookie.split(/\s*;\s*/);=0A=
  var keys =3D [], values =3D [], index, part;=0A=
  for (var i =3D 0; part =3D parts[i]; i++) {=0A=
    index =3D part.indexOf('=3D');=0A=
=0A=
    if (index =3D=3D -1) { // empty name=0A=
      keys.push('');=0A=
      values.push(part);=0A=
    } else {=0A=
      keys.push(part.substring(0, index));=0A=
      values.push(part.substring(index + 1));=0A=
    }=0A=
  }=0A=
  return {keys: keys, values: values};=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Gets the names for all the cookies=0A=
 * @return {Array} An array with the names of the cookies=0A=
 */=0A=
shindig.cookies.getKeys =3D function() {=0A=
  return shindig.cookies.getKeyValues_().keys;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Gets the values for all the cookies=0A=
 * @return {Array} An array with the values of the cookies=0A=
 */=0A=
shindig.cookies.getValues =3D function() {=0A=
  return shindig.cookies.getKeyValues_().values;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Whether there are any cookies for this document=0A=
 * @return {boolean}=0A=
 */=0A=
shindig.cookies.isEmpty =3D function() {=0A=
  return document.cookie =3D=3D=3D '';=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Returns the number of cookies for this document=0A=
 * @return {number}=0A=
 */=0A=
shindig.cookies.getCount =3D function() {=0A=
  var cookie =3D String(document.cookie);=0A=
  if (cookie =3D=3D=3D '') {=0A=
    return 0;=0A=
  }=0A=
  var parts =3D cookie.split(/\s*;\s*/);=0A=
  return parts.length;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Returns whether there is a cookie with the given name=0A=
 * @param {string} key The name of the cookie to test for=0A=
 * @return {boolean}=0A=
 */=0A=
shindig.cookies.containsKey =3D function(key) {=0A=
  var sentinel =3D {};=0A=
  // if get does not find the key it returns the default value. We =
therefore=0A=
  // compare the result with an object to ensure we do not get any false=0A=
  // positives.=0A=
  return shindig.cookies.get(key, sentinel) !=3D=3D sentinel;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Returns whether there is a cookie with the given value. (This is an =
O(n)=0A=
 * operation.)=0A=
 * @param {string} value The value to check for=0A=
 * @return {boolean}=0A=
 */=0A=
shindig.cookies.containsValue =3D function(value) {=0A=
  // this O(n) in any case so lets do the trivial thing.=0A=
  var values =3D shindig.cookies.getKeyValues_().values;=0A=
  for (var i =3D 0; i < values.length; i++) {=0A=
    if (values[i] =3D=3D value) {=0A=
      return true;=0A=
    }=0A=
  }=0A=
  return false;=0A=
};=0A=
=0A=
=0A=
/**=0A=
 * Removes all cookies for this document=0A=
 */=0A=
shindig.cookies.clear =3D function() {=0A=
  var keys =3D shindig.cookies.getKeyValues_().keys;=0A=
  for (var i =3D keys.length - 1; i >=3D 0; i--) {=0A=
    shindig.cookies.remove(keys[i]);=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Static constant for the size of cookies. Per the spec, there's a 4K =
limit=0A=
 * to the size of a cookie. To make sure users can't break this limit, we=0A=
 * should truncate long cookies at 3950 bytes, to be extra careful with =
dumb=0A=
 * browsers/proxies that interpret 4K as 4000 rather than 4096=0A=
 * @type number=0A=
 */=0A=
shindig.cookies.MAX_COOKIE_LENGTH =3D 3950;=0A=
;=0A=
/**=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Open Gadget Container=0A=
 */=0A=
=0A=
shindig.errors =3D {};=0A=
shindig.errors.SUBCLASS_RESPONSIBILITY =3D 'subclass responsibility';=0A=
shindig.errors.TO_BE_DONE =3D 'to be done';=0A=
=0A=
/**=0A=
 * Calls an array of asynchronous functions and calls the continuation=0A=
 * function when all are done.=0A=
 * @param {Array} functions Array of asynchronous functions, each taking=0A=
 *     one argument that is the continuation function that handles the =
result=0A=
 *     That is, each function is something like the following:=0A=
 *     function(continuation) {=0A=
 *       // compute result asynchronously=0A=
 *       continuation(result);=0A=
 *     }=0A=
 * @param {Function} continuation Function to call when all results are =
in.  It=0A=
 *     is pass an array of all results of all functions=0A=
 * @param {Object} opt_this Optional object used as "this" when calling =
each=0A=
 *     function=0A=
 */=0A=
shindig.callAsyncAndJoin =3D function(functions, continuation, opt_this) =
{=0A=
  var pending =3D functions.length;=0A=
  var results =3D [];=0A=
  for (var i =3D 0; i < functions.length; i++) {=0A=
    // we need a wrapper here because i changes and we need one index=0A=
    // variable per closure=0A=
    var wrapper =3D function(index) {=0A=
      functions[index].call(opt_this, function(result) {=0A=
        results[index] =3D result;=0A=
        if (--pending =3D=3D=3D 0) {=0A=
          continuation(results);=0A=
        }=0A=
      });=0A=
    };=0A=
    wrapper(i);=0A=
  }=0A=
};=0A=
=0A=
=0A=
// ----------=0A=
// Extensible=0A=
=0A=
shindig.Extensible =3D function() {=0A=
};=0A=
=0A=
/**=0A=
 * Sets the dependencies.=0A=
 * @param {Object} dependencies Object whose properties are set on this=0A=
 *     container as dependencies=0A=
 */=0A=
shindig.Extensible.prototype.setDependencies =3D function(dependencies) {=0A=
  for (var p in dependencies) {=0A=
    this[p] =3D dependencies[p];=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Returns a dependency given its name.=0A=
 * @param {String} name Name of dependency=0A=
 * @return {Object} Dependency with that name or undefined if not found=0A=
 */=0A=
shindig.Extensible.prototype.getDependencies =3D function(name) {=0A=
  return this[name];=0A=
};=0A=
=0A=
=0A=
=0A=
// -------------=0A=
// UserPrefStore=0A=
=0A=
/**=0A=
 * User preference store interface.=0A=
 * @constructor=0A=
 */=0A=
shindig.UserPrefStore =3D function() {=0A=
};=0A=
=0A=
/**=0A=
 * Gets all user preferences of a gadget.=0A=
 * @param {Object} gadget Gadget object=0A=
 * @return {Object} All user preference of given gadget=0A=
 */=0A=
shindig.UserPrefStore.prototype.getPrefs =3D function(gadget) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
/**=0A=
 * Saves user preferences of a gadget in the store.=0A=
 * @param {Object} gadget Gadget object=0A=
 * @param {Object} prefs User preferences=0A=
 */=0A=
shindig.UserPrefStore.prototype.savePrefs =3D function(gadget) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
=0A=
// -------------=0A=
// DefaultUserPrefStore=0A=
=0A=
/**=0A=
 * User preference store implementation.=0A=
 * TODO: Turn this into a real implementation that is production safe=0A=
 * @constructor=0A=
 */=0A=
shindig.DefaultUserPrefStore =3D function() {=0A=
  shindig.UserPrefStore.call(this);=0A=
};=0A=
shindig.DefaultUserPrefStore.inherits(shindig.UserPrefStore);=0A=
=0A=
shindig.DefaultUserPrefStore.prototype.getPrefs =3D function(gadget) { };=0A=
=0A=
shindig.DefaultUserPrefStore.prototype.savePrefs =3D function(gadget) { =
};=0A=
=0A=
=0A=
// -------------=0A=
// GadgetService=0A=
=0A=
/**=0A=
 * Interface of service provided to gadgets for resizing gadgets,=0A=
 * setting title, etc.=0A=
 * @constructor=0A=
 */=0A=
shindig.GadgetService =3D function() {=0A=
};=0A=
=0A=
shindig.GadgetService.prototype.setHeight =3D function(elementId, =
height) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
shindig.GadgetService.prototype.setTitle =3D function(gadget, title) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
shindig.GadgetService.prototype.setUserPref =3D function(id) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
=0A=
// ----------------=0A=
// IfrGadgetService=0A=
=0A=
/**=0A=
 * Base implementation of GadgetService.=0A=
 * @constructor=0A=
 */=0A=
shindig.IfrGadgetService =3D function() {=0A=
  shindig.GadgetService.call(this);=0A=
  gadgets.rpc.register('resize_iframe', this.setHeight);=0A=
  gadgets.rpc.register('set_pref', this.setUserPref);=0A=
  gadgets.rpc.register('set_title', this.setTitle);=0A=
  gadgets.rpc.register('requestNavigateTo', this.requestNavigateTo);=0A=
  gadgets.rpc.register('requestSendMessage', this.requestSendMessage);=0A=
};=0A=
=0A=
shindig.IfrGadgetService.inherits(shindig.GadgetService);=0A=
=0A=
shindig.IfrGadgetService.prototype.setHeight =3D function(height) {=0A=
  if (height > shindig.container.maxheight_) {=0A=
    height =3D shindig.container.maxheight_;=0A=
  }=0A=
=0A=
  var element =3D document.getElementById(this.f);=0A=
  if (element) {=0A=
    element.style.height =3D height + 'px';=0A=
  }=0A=
};=0A=
=0A=
shindig.IfrGadgetService.prototype.setTitle =3D function(title) {=0A=
  var element =3D document.getElementById(this.f + '_title');=0A=
  if (element) {=0A=
    element.innerHTML =3D title.replace(/&/g, '&amp;').replace(/</g, =
'&lt;');=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Sets one or more user preferences=0A=
 * @param {String} editToken=0A=
 * @param {String} name Name of user preference=0A=
 * @param {String} value Value of user preference=0A=
 * More names and values may follow=0A=
 */=0A=
shindig.IfrGadgetService.prototype.setUserPref =3D function(editToken, =
name,=0A=
    value) {=0A=
  var id =3D =
shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);=0A=
  var gadget =3D shindig.container.getGadget(id);=0A=
  for (var i =3D 1, j =3D arguments.length; i < j; i +=3D 2) {=0A=
    this.userPrefs[arguments[i]].value =3D arguments[i + 1];=0A=
  }=0A=
  gadget.saveUserPrefs();=0A=
};=0A=
=0A=
/**=0A=
 * Requests the container to send a specific message to the specified =
users.=0A=
 * @param {Array.<String>, String} recipients An ID, array of IDs, or a =
group reference;=0A=
 * the supported keys are VIEWER, OWNER, VIEWER_FRIENDS, OWNER_FRIENDS, =
or a=0A=
 * single ID within one of those groups=0A=
 * @param {opensocial.Message} message The message to send to the =
specified users=0A=
 * @param {Function} opt_callback The function to call once the request =
has been=0A=
 * processed; either this callback will be called or the gadget will be =
reloaded=0A=
 * from scratch=0A=
 * @param {opensocial.NavigationParameters} opt_params The optional =
parameters=0A=
 * indicating where to send a user when a request is made, or when a =
request=0A=
 * is accepted; options are of type  NavigationParameters.DestinationType=0A=
 */=0A=
shindig.IfrGadgetService.prototype.requestSendMessage =3D =
function(recipients,=0A=
    message, opt_callback, opt_params) {=0A=
    if (opt_callback) {=0A=
      window.setTimeout(function() {=0A=
        opt_callback(new opensocial.ResponseItem(=0A=
            null, null, opensocial.ResponseItem.Error.NOT_IMPLEMENTED, =
null));=0A=
      }, 0);=0A=
    }=0A=
};=0A=
=0A=
/**=0A=
 * Navigates the page to a new url based on a gadgets requested view and=0A=
 * parameters.=0A=
 */=0A=
shindig.IfrGadgetService.prototype.requestNavigateTo =3D function(view,=0A=
    opt_params) {=0A=
  var id =3D =
shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);=0A=
  var url =3D shindig.container.gadgetService.getUrlForView(view);=0A=
=0A=
  if (opt_params) {=0A=
    var paramStr =3D gadgets.json.stringify(opt_params);=0A=
    if (paramStr.length > 0) {=0A=
      url +=3D '&appParams=3D' + encodeURIComponent(paramStr);=0A=
    }=0A=
  }=0A=
=0A=
  if (url && document.location.href.indexOf(url) =3D=3D -1) {=0A=
    document.location.href =3D url;=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * This is a silly implementation that will need to be overriden by =
almost all=0A=
 * real containers.=0A=
 * TODO: Find a better default for this function=0A=
 *=0A=
 * @param view The view name to get the url for=0A=
 */=0A=
shindig.IfrGadgetService.prototype.getUrlForView =3D function(=0A=
    view) {=0A=
  if (view =3D=3D=3D 'canvas') {=0A=
    return '/canvas';=0A=
  } else if (view =3D=3D=3D 'profile') {=0A=
    return '/profile';=0A=
  } else {=0A=
    return null;=0A=
  }=0A=
};=0A=
=0A=
shindig.IfrGadgetService.prototype.getGadgetIdFromModuleId =3D function(=0A=
    moduleId) {=0A=
  // Quick hack to extract the gadget id from module id=0A=
  return parseInt(moduleId.match(/_([0-9]+)$/)[1], 10);=0A=
};=0A=
=0A=
=0A=
// -------------=0A=
// LayoutManager=0A=
=0A=
/**=0A=
 * Layout manager interface.=0A=
 * @constructor=0A=
 */=0A=
shindig.LayoutManager =3D function() {=0A=
};=0A=
=0A=
/**=0A=
 * Gets the HTML element that is the chrome of a gadget into which the =
content=0A=
 * of the gadget can be rendered.=0A=
 * @param {Object} gadget Gadget instance=0A=
 * @return {Object} HTML element that is the chrome for the given gadget=0A=
 */=0A=
shindig.LayoutManager.prototype.getGadgetChrome =3D function(gadget) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
// -------------------=0A=
// StaticLayoutManager=0A=
=0A=
/**=0A=
 * Static layout manager where gadget ids have a 1:1 mapping to chrome =
ids.=0A=
 * @constructor=0A=
 */=0A=
shindig.StaticLayoutManager =3D function() {=0A=
  shindig.LayoutManager.call(this);=0A=
};=0A=
=0A=
shindig.StaticLayoutManager.inherits(shindig.LayoutManager);=0A=
=0A=
/**=0A=
 * Sets chrome ids, whose indexes are gadget instance ids (starting from =
0).=0A=
 * @param {Array} gadgetChromeIds Gadget id to chrome id map=0A=
 */=0A=
shindig.StaticLayoutManager.prototype.setGadgetChromeIds =3D=0A=
    function(gadgetChromeIds) {=0A=
  this.gadgetChromeIds_ =3D gadgetChromeIds;=0A=
};=0A=
=0A=
shindig.StaticLayoutManager.prototype.getGadgetChrome =3D =
function(gadget) {=0A=
  var chromeId =3D this.gadgetChromeIds_[gadget.id];=0A=
  return chromeId ? document.getElementById(chromeId) : null;=0A=
};=0A=
=0A=
=0A=
// ----------------------=0A=
// FloatLeftLayoutManager=0A=
=0A=
/**=0A=
 * FloatLeft layout manager where gadget ids have a 1:1 mapping to =
chrome ids.=0A=
 * @constructor=0A=
 * @param {String} layoutRootId Id of the element that is the parent of =
all=0A=
 *     gadgets.=0A=
 */=0A=
shindig.FloatLeftLayoutManager =3D function(layoutRootId) {=0A=
  shindig.LayoutManager.call(this);=0A=
  this.layoutRootId_ =3D layoutRootId;=0A=
};=0A=
=0A=
shindig.FloatLeftLayoutManager.inherits(shindig.LayoutManager);=0A=
=0A=
shindig.FloatLeftLayoutManager.prototype.getGadgetChrome =3D=0A=
    function(gadget) {=0A=
  var layoutRoot =3D document.getElementById(this.layoutRootId_);=0A=
  if (layoutRoot) {=0A=
    var chrome =3D document.createElement('div');=0A=
    chrome.className =3D 'gadgets-gadget-chrome';=0A=
    chrome.style.cssFloat =3D 'left';=0A=
    layoutRoot.appendChild(chrome);=0A=
    return chrome;=0A=
  } else {=0A=
    return null;=0A=
  }=0A=
};=0A=
=0A=
=0A=
// ------=0A=
// Gadget=0A=
=0A=
/**=0A=
 * Creates a new instance of gadget.  Optional parameters are set as =
instance=0A=
 * variables.=0A=
 * @constructor=0A=
 * @param {Object} params Parameters to set on gadget.  Common =
parameters:=0A=
 *    "specUrl": URL to gadget specification=0A=
 *    "private": Whether gadget spec is accessible only privately, which =
means=0A=
 *        browser can load it but not gadget server=0A=
 *    "spec": Gadget Specification in XML=0A=
 *    "userPrefs": a javascript object containing attribute value pairs =
of user=0A=
 *        preferences for this gadget with the value being a preference =
object=0A=
 *    "viewParams": a javascript object containing attribute value pairs=0A=
 *        for this gadgets=0A=
 *    "secureToken": an encoded token that is passed on the URL hash=0A=
 *    "hashData": Query-string like data that will be added to the=0A=
 *        hash portion of the URL.=0A=
 *    "specVersion": a hash value used to add a v=3D param to allow for =
better caching=0A=
 *    "title": the default title to use for the title bar.=0A=
 *    "height": height of the gadget=0A=
 *    "width": width of the gadget=0A=
 *    "debug": send debug=3D1 to the gadget server, gets us uncompressed=0A=
 *        javascript=0A=
 */=0A=
shindig.Gadget =3D function(params) {=0A=
  this.userPrefs =3D {};=0A=
=0A=
  if (params) {=0A=
    for (var name in params)  if (params.hasOwnProperty(name)) {=0A=
      this[name] =3D params[name];=0A=
    }=0A=
  }=0A=
  if (!this.secureToken) {=0A=
    // Assume that the default security token implementation is=0A=
    // in use on the server.=0A=
    this.secureToken =3D 'john.doe:john.doe:appid:cont:url:0:default';=0A=
  }=0A=
};=0A=
=0A=
shindig.Gadget.prototype.getUserPrefs =3D function() {=0A=
  return this.userPrefs;=0A=
};=0A=
=0A=
shindig.Gadget.prototype.saveUserPrefs =3D function() {=0A=
  shindig.container.userPrefStore.savePrefs(this);=0A=
};=0A=
=0A=
shindig.Gadget.prototype.getUserPrefValue =3D function(name) {=0A=
  var pref =3D this.userPrefs[name];=0A=
  return typeof(pref.value) !=3D 'undefined' && pref.value !=3D null ?=0A=
      pref.value : pref['default'];=0A=
};=0A=
=0A=
shindig.Gadget.prototype.render =3D function(chrome) {=0A=
  if (chrome) {=0A=
    var gadget =3D this;=0A=
    this.getContent(function(content) {=0A=
      chrome.innerHTML =3D content;=0A=
      window.frames[gadget.getIframeId()].location =3D =
gadget.getIframeUrl();=0A=
    });=0A=
  }=0A=
};=0A=
=0A=
shindig.Gadget.prototype.getContent =3D function(continuation) {=0A=
  shindig.callAsyncAndJoin([=0A=
      this.getTitleBarContent, this.getUserPrefsDialogContent,=0A=
      this.getMainContent], function(results) {=0A=
        continuation(results.join(''));=0A=
      }, this);=0A=
};=0A=
=0A=
/**=0A=
 * Gets title bar content asynchronously or synchronously.=0A=
 * @param {Function} continuation Function that handles title bar =
content as=0A=
 *     the one and only argument=0A=
 */=0A=
shindig.Gadget.prototype.getTitleBarContent =3D function(continuation) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
/**=0A=
 * Gets user preferences dialog content asynchronously or synchronously.=0A=
 * @param {Function} continuation Function that handles user preferences=0A=
 *     content as the one and only argument=0A=
 */=0A=
shindig.Gadget.prototype.getUserPrefsDialogContent =3D =
function(continuation) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
/**=0A=
 * Gets gadget content asynchronously or synchronously.=0A=
 * @param {Function} continuation Function that handles gadget content as=0A=
 *     the one and only argument=0A=
 */=0A=
shindig.Gadget.prototype.getMainContent =3D function(continuation) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
/*=0A=
 * Gets additional parameters to append to the iframe url=0A=
 * Override this method if you need any custom params.=0A=
 */=0A=
shindig.Gadget.prototype.getAdditionalParams =3D function() {=0A=
  return '';=0A=
};=0A=
=0A=
=0A=
// ---------=0A=
// IfrGadget=0A=
=0A=
shindig.IfrGadget =3D function(opt_params) {=0A=
  shindig.Gadget.call(this, opt_params);=0A=
  this.serverBase_ =3D '/gadgets/'; // default gadget server=0A=
};=0A=
=0A=
shindig.IfrGadget.inherits(shindig.Gadget);=0A=
=0A=
shindig.IfrGadget.prototype.GADGET_IFRAME_PREFIX_ =3D 'remote_iframe_';=0A=
=0A=
shindig.IfrGadget.prototype.CONTAINER =3D 'default';=0A=
=0A=
shindig.IfrGadget.prototype.cssClassGadget =3D 'gadgets-gadget';=0A=
shindig.IfrGadget.prototype.cssClassTitleBar =3D =
'gadgets-gadget-title-bar';=0A=
shindig.IfrGadget.prototype.cssClassTitle =3D 'gadgets-gadget-title';=0A=
shindig.IfrGadget.prototype.cssClassTitleButtonBar =3D=0A=
    'gadgets-gadget-title-button-bar';=0A=
shindig.IfrGadget.prototype.cssClassGadgetUserPrefsDialog =3D=0A=
    'gadgets-gadget-user-prefs-dialog';=0A=
shindig.IfrGadget.prototype.cssClassGadgetUserPrefsDialogActionBar =3D=0A=
    'gadgets-gadget-user-prefs-dialog-action-bar';=0A=
shindig.IfrGadget.prototype.cssClassTitleButton =3D =
'gadgets-gadget-title-button';=0A=
shindig.IfrGadget.prototype.cssClassGadgetContent =3D =
'gadgets-gadget-content';=0A=
shindig.IfrGadget.prototype.rpcToken =3D (0x7FFFFFFF * Math.random()) | =
0;=0A=
shindig.IfrGadget.prototype.rpcRelay =3D '../container/rpc_relay.html';=0A=
=0A=
shindig.IfrGadget.prototype.getTitleBarContent =3D =
function(continuation) {=0A=
  var settingsButton =3D this.hasViewablePrefs_() ?=0A=
      '<a href=3D"#" onclick=3D"shindig.container.getGadget(' + this.id +=0A=
          ').handleOpenUserPrefsDialog();return false;" class=3D"' + =
this.cssClassTitleButton +=0A=
          '">settings</a> '=0A=
      : '';=0A=
  continuation('<div id=3D"' + this.cssClassTitleBar + '-' + this.id +=0A=
      '" class=3D"' + this.cssClassTitleBar + '"><span id=3D"' +=0A=
      this.getIframeId() + '_title" class=3D"' +=0A=
      this.cssClassTitle + '">' + (this.title ? this.title : 'Title') + =
'</span> | <span class=3D"' +=0A=
      this.cssClassTitleButtonBar + '">' + settingsButton +=0A=
      '<a href=3D"#" onclick=3D"shindig.container.getGadget(' + this.id +=0A=
      ').handleToggle();return false;" class=3D"' + =
this.cssClassTitleButton +=0A=
      '">toggle</a></span></div>');=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getUserPrefsDialogContent =3D =
function(continuation) {=0A=
  continuation('<div id=3D"' + this.getUserPrefsDialogId() + '" =
class=3D"' +=0A=
      this.cssClassGadgetUserPrefsDialog + '"></div>');=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.setServerBase =3D function(url) {=0A=
  this.serverBase_ =3D url;=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getServerBase =3D function() {=0A=
  return this.serverBase_;=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getMainContent =3D function(continuation) {=0A=
  var iframeId =3D this.getIframeId();=0A=
  gadgets.rpc.setRelayUrl(iframeId, this.serverBase_ + this.rpcRelay);=0A=
  gadgets.rpc.setAuthToken(iframeId, this.rpcToken);=0A=
  continuation('<div class=3D"' + this.cssClassGadgetContent + =
'"><iframe id=3D"' +=0A=
      iframeId + '" name=3D"' + iframeId + '" class=3D"' + =
this.cssClassGadget +=0A=
      '" src=3D"about:blank' +=0A=
      '" frameborder=3D"no" scrolling=3D"no"' +=0A=
      (this.height ? ' height=3D"' + this.height + '"' : '') +=0A=
      (this.width ? ' width=3D"' + this.width + '"' : '') +=0A=
      '></iframe></div>');=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getIframeId =3D function() {=0A=
  return this.GADGET_IFRAME_PREFIX_ + this.id;=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getUserPrefsDialogId =3D function() {=0A=
  return this.getIframeId() + '_userPrefsDialog';=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getIframeUrl =3D function() {=0A=
  return this.serverBase_ + 'ifr?' +=0A=
      'container=3D' + this.CONTAINER +=0A=
      '&mid=3D' +  this.id +=0A=
      '&nocache=3D' + shindig.container.nocache_ +=0A=
      '&country=3D' + shindig.container.country_ +=0A=
      '&lang=3D' + shindig.container.language_ +=0A=
      '&view=3D' + shindig.container.view_ +=0A=
      (this.specVersion ? '&v=3D' + this.specVersion : '') +=0A=
      (shindig.container.parentUrl_ ? '&parent=3D' + =
encodeURIComponent(shindig.container.parentUrl_) : '') +=0A=
      (this.debug ? '&debug=3D1' : '') +=0A=
      this.getAdditionalParams() +=0A=
      this.getUserPrefsParams() +=0A=
      (this.secureToken ? '&st=3D' + this.secureToken : '') +=0A=
      '&url=3D' + encodeURIComponent(this.specUrl) +=0A=
      '#rpctoken=3D' + this.rpcToken +=0A=
      (this.viewParams ?=0A=
          '&view-params=3D' +  =
encodeURIComponent(gadgets.json.stringify(this.viewParams)) : '') +=0A=
      (this.hashData ? '&' + this.hashData : '');=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.getUserPrefsParams =3D function() {=0A=
  var params =3D '';=0A=
  for(var name in this.getUserPrefs()) {=0A=
    params +=3D '&up_' + encodeURIComponent(name) + '=3D' +=0A=
        encodeURIComponent(this.getUserPrefValue(name));=0A=
  }=0A=
  return params;=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.handleToggle =3D function() {=0A=
  var gadgetIframe =3D document.getElementById(this.getIframeId());=0A=
  if (gadgetIframe) {=0A=
    var gadgetContent =3D gadgetIframe.parentNode;=0A=
    var display =3D gadgetContent.style.display;=0A=
    gadgetContent.style.display =3D display ? '' : 'none';=0A=
  }=0A=
};=0A=
=0A=
=0A=
shindig.IfrGadget.prototype.hasViewablePrefs_ =3D function() {=0A=
  for(var name in this.getUserPrefs()) {=0A=
    var pref =3D this.userPrefs[name];=0A=
    if (pref.type !=3D 'hidden') {=0A=
      return true;=0A=
    }=0A=
  }=0A=
  return false;=0A=
};=0A=
=0A=
=0A=
shindig.IfrGadget.prototype.handleOpenUserPrefsDialog =3D function() {=0A=
  if (this.userPrefsDialogContentLoaded) {=0A=
    this.showUserPrefsDialog();=0A=
  } else {=0A=
    var gadget =3D this;=0A=
    var igCallbackName =3D 'ig_callback_' + this.id;=0A=
    window[igCallbackName] =3D function(userPrefsDialogContent) {=0A=
      gadget.userPrefsDialogContentLoaded =3D true;=0A=
      gadget.buildUserPrefsDialog(userPrefsDialogContent);=0A=
      gadget.showUserPrefsDialog();=0A=
    };=0A=
=0A=
    var script =3D document.createElement('script');=0A=
    script.src =3D 'http://www.gmodules.com/ig/gadgetsettings?mid=3D' + =
this.id +=0A=
        '&output=3Djs' + this.getUserPrefsParams() +  '&url=3D' + =
this.specUrl;=0A=
    document.body.appendChild(script);=0A=
  }=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.buildUserPrefsDialog =3D function(content) {=0A=
  var userPrefsDialog =3D =
document.getElementById(this.getUserPrefsDialogId());=0A=
  userPrefsDialog.innerHTML =3D content +=0A=
      '<div class=3D"' + this.cssClassGadgetUserPrefsDialogActionBar +=0A=
      '"><input type=3D"button" value=3D"Save" =
onclick=3D"shindig.container.getGadget(' +=0A=
      this.id +').handleSaveUserPrefs()"> <input type=3D"button" =
value=3D"Cancel" onclick=3D"shindig.container.getGadget(' +=0A=
      this.id +').handleCancelUserPrefs()"></div>';=0A=
  userPrefsDialog.childNodes[0].style.display =3D '';=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.showUserPrefsDialog =3D function(opt_show) {=0A=
  var userPrefsDialog =3D =
document.getElementById(this.getUserPrefsDialogId());=0A=
  userPrefsDialog.style.display =3D (opt_show || opt_show =3D=3D=3D =
undefined)=0A=
      ? '' : 'none';=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.hideUserPrefsDialog =3D function() {=0A=
  this.showUserPrefsDialog(false);=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.handleSaveUserPrefs =3D function() {=0A=
  this.hideUserPrefsDialog();=0A=
=0A=
  var numFields =3D document.getElementById('m_' + this.id +=0A=
      '_numfields').value;=0A=
  for (var i =3D 0; i < numFields; i++) {=0A=
    var input =3D document.getElementById('m_' + this.id + '_' + i);=0A=
    var userPrefNamePrefix =3D 'm_' + this.id + '_up_';=0A=
    var userPrefName =3D input.name.substring(userPrefNamePrefix.length);=0A=
    var userPrefValue =3D input.value;=0A=
    this.userPrefs[userPrefName].value =3D userPrefValue;=0A=
  }=0A=
=0A=
  this.saveUserPrefs();=0A=
  this.refresh();=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.handleCancelUserPrefs =3D function() {=0A=
  this.hideUserPrefsDialog();=0A=
};=0A=
=0A=
shindig.IfrGadget.prototype.refresh =3D function() {=0A=
  var iframeId =3D this.getIframeId();=0A=
  document.getElementById(iframeId).src =3D this.getIframeUrl();=0A=
};=0A=
=0A=
=0A=
// ---------=0A=
// Container=0A=
=0A=
/**=0A=
 * Container interface.=0A=
 * @constructor=0A=
 */=0A=
shindig.Container =3D function() {=0A=
  this.gadgets_ =3D {};=0A=
  this.parentUrl_ =3D 'http://' + document.location.host;=0A=
  this.country_ =3D 'ALL';=0A=
  this.language_ =3D 'ALL';=0A=
  this.view_ =3D 'default';=0A=
  this.nocache_ =3D 1;=0A=
=0A=
  // signed max int=0A=
  this.maxheight_ =3D 0x7FFFFFFF;=0A=
};=0A=
=0A=
shindig.Container.inherits(shindig.Extensible);=0A=
=0A=
/**=0A=
 * Known dependencies:=0A=
 *     gadgetClass: constructor to create a new gadget instance=0A=
 *     userPrefStore: instance of a subclass of shindig.UserPrefStore=0A=
 *     gadgetService: instance of a subclass of shindig.GadgetService=0A=
 *     layoutManager: instance of a subclass of shindig.LayoutManager=0A=
 */=0A=
=0A=
shindig.Container.prototype.gadgetClass =3D shindig.Gadget;=0A=
=0A=
shindig.Container.prototype.userPrefStore =3D new =
shindig.DefaultUserPrefStore();=0A=
=0A=
shindig.Container.prototype.gadgetService =3D new =
shindig.GadgetService();=0A=
=0A=
shindig.Container.prototype.layoutManager =3D=0A=
    new shindig.StaticLayoutManager();=0A=
=0A=
shindig.Container.prototype.setParentUrl =3D function(url) {=0A=
  this.parentUrl_ =3D url;=0A=
};=0A=
=0A=
shindig.Container.prototype.setCountry =3D function(country) {=0A=
  this.country_ =3D country;=0A=
};=0A=
=0A=
shindig.Container.prototype.setNoCache =3D function(nocache) {=0A=
  this.nocache_ =3D nocache;=0A=
};=0A=
=0A=
shindig.Container.prototype.setLanguage =3D function(language) {=0A=
  this.language_ =3D language;=0A=
};=0A=
=0A=
shindig.Container.prototype.setView =3D function(view) {=0A=
  this.view_ =3D view;=0A=
};=0A=
=0A=
shindig.Container.prototype.setMaxHeight =3D function(maxheight) {=0A=
  this.maxheight_ =3D maxheight;=0A=
};=0A=
=0A=
shindig.Container.prototype.getGadgetKey_ =3D function(instanceId) {=0A=
  return 'gadget_' + instanceId;=0A=
};=0A=
=0A=
shindig.Container.prototype.getGadget =3D function(instanceId) {=0A=
  return this.gadgets_[this.getGadgetKey_(instanceId)];=0A=
};=0A=
=0A=
shindig.Container.prototype.createGadget =3D function(opt_params) {=0A=
  return new this.gadgetClass(opt_params);=0A=
};=0A=
=0A=
shindig.Container.prototype.addGadget =3D function(gadget) {=0A=
  gadget.id =3D this.getNextGadgetInstanceId();=0A=
  this.gadgets_[this.getGadgetKey_(gadget.id)] =3D gadget;=0A=
};=0A=
=0A=
shindig.Container.prototype.addGadgets =3D function(gadgets) {=0A=
  for (var i =3D 0; i < gadgets.length; i++) {=0A=
    this.addGadget(gadgets[i]);=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Renders all gadgets in the container.=0A=
 */=0A=
shindig.Container.prototype.renderGadgets =3D function() {=0A=
  for (var key in this.gadgets_) {=0A=
    this.renderGadget(this.gadgets_[key]);=0A=
  }=0A=
};=0A=
=0A=
/**=0A=
 * Renders a gadget.  Gadgets are rendered inside their chrome element.=0A=
 * @param {Object} gadget Gadget object=0A=
 */=0A=
shindig.Container.prototype.renderGadget =3D function(gadget) {=0A=
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);=0A=
};=0A=
=0A=
shindig.Container.prototype.nextGadgetInstanceId_ =3D 0;=0A=
=0A=
shindig.Container.prototype.getNextGadgetInstanceId =3D function() {=0A=
  return this.nextGadgetInstanceId_++;=0A=
};=0A=
=0A=
/**=0A=
 * Refresh all the gadgets in the container.=0A=
 */=0A=
shindig.Container.prototype.refreshGadgets =3D function() {=0A=
  for (var key in this.gadgets_) {=0A=
    this.gadgets_[key].refresh();=0A=
  }=0A=
};=0A=
=0A=
=0A=
// ------------=0A=
// IfrContainer=0A=
=0A=
/**=0A=
 * Container that renders gadget using ifr.=0A=
 * @constructor=0A=
 */=0A=
shindig.IfrContainer =3D function() {=0A=
  shindig.Container.call(this);=0A=
};=0A=
=0A=
shindig.IfrContainer.inherits(shindig.Container);=0A=
=0A=
shindig.IfrContainer.prototype.gadgetClass =3D shindig.IfrGadget;=0A=
=0A=
shindig.IfrContainer.prototype.gadgetService =3D new =
shindig.IfrGadgetService();=0A=
=0A=
shindig.IfrContainer.prototype.setParentUrl =3D function(url) {=0A=
  if (!url.match(/^http[s]?:\/\//)) {=0A=
    url =3D document.location.href.match(/^[^?#]+\//)[0] + url;=0A=
  }=0A=
=0A=
  this.parentUrl_ =3D url;=0A=
};=0A=
=0A=
/**=0A=
 * Renders a gadget using ifr.=0A=
 * @param {Object} gadget Gadget object=0A=
 */=0A=
shindig.IfrContainer.prototype.renderGadget =3D function(gadget) {=0A=
  var chrome =3D this.layoutManager.getGadgetChrome(gadget);=0A=
  gadget.render(chrome);=0A=
};=0A=
=0A=
/**=0A=
 * Default container.=0A=
 */=0A=
shindig.container =3D new shindig.IfrContainer();=0A=
;=0A=
/**=0A=
 * Licensed to the Apache Software Foundation (ASF) under one=0A=
 * or more contributor license agreements. See the NOTICE file=0A=
 * distributed with this work for additional information=0A=
 * regarding copyright ownership. The ASF licenses this file=0A=
 * to you under the Apache License, Version 2.0 (the=0A=
 * "License"); you may not use this file except in compliance=0A=
 * with the License. You may obtain a copy of the License at=0A=
 *=0A=
 * http://www.apache.org/licenses/LICENSE-2.0=0A=
 *=0A=
 * Unless required by applicable law or agreed to in writing,=0A=
 * software distributed under the License is distributed on an=0A=
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY=0A=
 * KIND, either express or implied. See the License for the=0A=
 * specific language governing permissions and limitations under the =
License.=0A=
 */=0A=
=0A=
/**=0A=
 * @fileoverview Base OSAPI binding=0A=
 */=0A=
=0A=
/**=0A=
 * Container-side binding for the gadgetsrpctransport used by osapi. =
Containers=0A=
 * add services to the client-side osapi implementation by defining them =
in the osapi=0A=
 * namespace=0A=
 */=0A=
if (gadgets && gadgets.rpc) { //Only define if gadgets rpc exists=0A=
=0A=
  /**=0A=
   * Dispatch a JSON-RPC batch request to services defined in the osapi =
namespace=0A=
   * @param callbackId=0A=
   * @param requests=0A=
   */=0A=
  osapi._handleGadgetRpcMethod =3D function(requests) {=0A=
    var responses =3D new Array(requests.length);=0A=
    var callCount =3D 0;=0A=
    var callback =3D this.callback;=0A=
    var dummy =3D function(params, apiCallback) {=0A=
      apiCallback({});=0A=
    };=0A=
    for (var i =3D 0; i < requests.length; i++) {=0A=
      // Don't allow underscores in any part of the method name as a =
convention=0A=
      // for restricted methods=0A=
      var current =3D osapi;=0A=
      if (requests[i].method.indexOf("_") =3D=3D -1) {=0A=
        var path =3D requests[i].method.split(".");=0A=
        for (var j =3D 0; j < path.length; j++) {=0A=
          if (current.hasOwnProperty(path[j])) {=0A=
            current =3D current[path[j]];=0A=
          } else {=0A=
            // No matching api=0A=
            current =3D dummy;=0A=
            break;=0A=
          }=0A=
        }=0A=
      } else {=0A=
        current =3D dummy;=0A=
      }=0A=
=0A=
      // Execute the call and latch the rpc callback until all=0A=
      // complete=0A=
      current(requests[i].params, function(i) {=0A=
        return function(response) {=0A=
          // Put back in json-rpc format=0A=
          responses[i] =3D { id : requests[i].id, data : response};=0A=
          callCount++;=0A=
          if (callCount =3D=3D requests.length) {=0A=
            callback(responses);=0A=
          }=0A=
        };=0A=
      }(i));=0A=
    }=0A=
  };=0A=
=0A=
  /**=0A=
   * Basic implementation of system.listMethods which can be used to =
introspect=0A=
   * available services=0A=
   * @param request=0A=
   * @param callback=0A=
   */=0A=
  osapi.container =3D {};=0A=
  osapi.container["listMethods"] =3D function(request, callback) {=0A=
    var names =3D [];=0A=
    recurseNames(osapi, "", 5, names)=0A=
    callback(names);=0A=
  };=0A=
=0A=
  /**=0A=
   * Recurse the object paths to a limited depth=0A=
   */=0A=
  function recurseNames(base, path, depth, accumulated) {=0A=
    if (depth =3D=3D 0) return;=0A=
    for (var prop in base) if (base.hasOwnProperty(prop)) {=0A=
      if (prop.indexOf("_") =3D=3D -1) {=0A=
        var type =3D typeof(base[prop]);=0A=
        if (type =3D=3D "function") {=0A=
          accumulated.push(path + prop);=0A=
        } else if (type =3D=3D "object") {=0A=
          recurseNames(base[prop], path + prop + ".", depth - 1, =
accumulated);=0A=
        }=0A=
      }=0A=
    }=0A=
  }=0A=
=0A=
  // Register the osapi RPC dispatcher.=0A=
  gadgets.rpc.register("osapi._handleGadgetRpcMethod", =
osapi._handleGadgetRpcMethod);=0A=
}=0A=
;=0A=
gadgets.config.init({"shindig.auth":{"authToken":"-1:-1:*::*:0:default"},=
"osapi":{"endPoints":["http://%host%/rpc"]},"osapi.services":{"gadgets.rp=
c":["container.listMethods"],"http://%host%/rpc":["samplecontainer.update=
","activities.delete","gadgets.metadata","activities.update","activities.=
supportedFields","activities.get","http.put","activitystreams.create","me=
ssages.modify","appdata.get","messages.get","system.listMethods","samplec=
ontainer.get","cache.invalidate","people.supportedFields","http.head","ht=
tp.delete","messages.create","people.get","activitystreams.get","activity=
streams.update","messages.delete","appdata.update","gadgets.tokenSupporte=
dFields","http.post","activities.create","samplecontainer.create","http.g=
et","appdata.delete","gadgets.token","appdata.create","activitystreams.de=
lete","gadgets.supportedFields","activitystreams.supportedFields"]},"rpc"=
:{"parentRelayUrl":"/container/rpc_relay.html","useLegacyProtocol":false}=
,"core.io":{"proxyUrl":"//%host%/gadgets/proxy?container=3Ddefault&refres=
h=3D%refresh%&url=3D%url%%rewriteMime%","jsonProxyUrl":"//%host%/gadgets/=
makeRequest"}});=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/gadgetcontext/gadgets/js/SciverseShindigService.js

/************************************************************************=
*******
This JavaScript File contains the Sciverse APIs . Gadgets can interact =
with the=20
container through these APIs and request information about the page=20
 =
*************************************************************************=
*****/
shindig.SciverseService =3D function() {
	shindig.IfrGadgetService.call(this);

	gadgets.rpc.register('invokeResultsView', this.invokeResultsView);
	gadgets.rpc.register('getContextInfo', this.getContextInfo);
	gadgets.rpc.register('getAllResults', this.getAllResults);
	gadgets.rpc.register('getResults', this.getResults);
	gadgets.rpc.register('set_pref', this.setUserPref);=20
	gadgets.rpc.register('getArticleContent', this.getArticleContent);
	gadgets.rpc.register('getPageUrl', this.getPageUrl);
=09
}
shindig.SciverseService.inherits(shindig.IfrGadgetService);

shindig.SciverseService.prototype.getPageUrl =3D function (){
	return document.location.href;

}
shindig.SciverseService.prototype.getArticleContent =3D function (){
	if (jQuery(".svBigBox").length > 0) {
		return jQuery(".svBigBox").html();
	}
	return null;
}

/* extended requestNavigateTo metod . This is used as a service by =
gadgets to navigate to different views */
shindig.IfrGadgetService.prototype.requestNavigateTo =3D function(view, =
opt_params) { =20

  	var id =3D =
shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);
  	var gadget =3D shindig.container.getGadget(id);
=09
  	if (view =3D=3D 'canvas') {
  		gadget.openCanvasView(opt_params);
  		return;
  	}
};


/* service to set the user preference from within the gadget*/
shindig.SciverseService.prototype.setUserPref =3D function(editToken, =
name,
    value) {
  var id =3D =
shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);
  var gadget =3D shindig.container.getGadget(id);
 =20
  if (this.userPrefs =3D=3D null) this.userPrefs =3D {};
  for (var i =3D 1, j =3D arguments.length; i < j; i +=3D 2) {
  	if (typeof(this.userPrefs[arguments[i]]) =3D=3D 'undefined'){
  		var o =3D new Object();
  		o.name =3D arguments[i].name;
  		o.value =3D arguments[i+1];
  		this.userPrefs[arguments[i]] =3D o;
  	}else {
    	this.userPrefs[arguments[i]].value =3D arguments[i + 1];
    }
  }
  gadget.saveUserPrefs();
};
/* Sciverse Service to invoke Resultsview from a gadget.
 * Takes the resultID and viewParams(optional) as input params=20
 */

shindig.SciverseService.prototype.invokeResultsView =3D function(divId, =
viewParams) {

	if (jQuery('#resultsView_' + divId).length =3D=3D 0) {
		alert("Invalid location");
		return false;
	}
=09
	var id =3D =
shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);
	var gadget =3D shindig.container.getGadget(id);
=09
	//show the div under the selected result
	jQuery('#resultsView_' + divId).show();
	var resultsViewRoot =3D 'resultsView_' + divId;
=09
	//check if the requesting app is already running in result view mode
	if(jQuery('#resultsView'+divId + =
'_'+gadget.sciverseId_).length!=3D=3D0){
    return false;
    }
=09

	//Create a new float left layout manager with the above div as the =
layout root
	shindig.container.layoutManager =3D new shindig.FloatLeftLayoutManager(
			resultsViewRoot);

	//Create a new gadget and populate it with the specUrl and title from =
the current gadget
	var newgadget =3D shindig.container.createGadget( {
		specUrl :gadget.specUrl,
		title :gadget.title,
		userPrefs:this.userPrefs
	});
	newgadget.sciverseId_ =3D gadget.sciverseId_;
    newgadget.iconURL=3Dgadget.iconURL;
	newgadget.location =3D 'resultsView'+divId;
	//Add gadget=20
	shindig.container.addGadget(newgadget);

	var resultsViewChrome =3D shindig.container.layoutManager
			.getGadgetChrome(newgadget);

	//Build the frame url with the correct view name and any view params
	newgadget.prepareGadgetForView('sciverseResultsView', =
resultsViewChrome,
			viewParams);

};

/* Sciverse Service to return contextInfo to a gadget.
 * Returns : sciverse.contextInfo JSON object
 */

shindig.SciverseService.prototype.getContextInfo =3D function() {
	return sciverseObj.contextInfo;
};

/* Sciverse Service to return the current Result List to a gadget.
 * Returns : resultList javascript object
 */

shindig.SciverseService.prototype.getAllResults =3D function() {
	    	return resultList;
};

/* Sciverse Service to return the list of selected results to a gadget.
 *Input Parameters:array containing indices of the results to be =
returned =20
 *Returns : resultList javascript object
 */

shindig.SciverseService.prototype.getResults =3D function(resultID_args) =
{
	var selectedResultArr =3D [];
	var resultID_var;
	for ( var i =3D 0; i<resultID_args.length; i++) {
		resultID_var =3D resultID_args[i];
		selectedResultArr[i] =3D resultList[resultID_var];
	}
	return selectedResultArr;
};

shindig.IfrContainer.prototype.SciverseService =3D new =
shindig.SciverseService();

/************************************************************************=
*******
 * ELSEVIER - SCIENCE CONFIDENTIAL
 *=20
 * This document is the property of Elsevier Science (ES), and its =
contents are
 * proprietary to ES. Reproduction in any form by anyone of the =
materials
 * contained herein without the permission of ES is prohibited. Finders =
are
 * asked to return this document to the following Elsevier Science =
location.
 *=20
 * Elsevier Science 360 Park Avenue South, New York, NY 10010-1710
 *=20
 * Copyright (c) 2010 by Elsevier Science, a member of the Reed Elsevier =
plc
 * group. All Rights Reserved.
 =
*************************************************************************=
*****/

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/gadgetcontext/gadgets/js/SciverseShindigContainer.js

/************************************************************************=
*******
This JavaScript file contains all the Shindig APIs which have been =
inherited=20
or newly written in order to customize Sciverse Gadgets functionalty. =20
 =
*************************************************************************=
*****/
=20
shindig.SciverseContainer =3D function(){
	shindig.IfrContainer.call(this);
	this.view_ =3D 'profile';
}
shindig.SciverseContainer.inherits(shindig.IfrContainer);
shindig.container =3D new shindig.SciverseContainer();

var terms;

shindig.SciverseGadget =3D function(opt_params) {
  shindig.IfrGadget.call(this, opt_params);
  this.setServerBase(sciverseObj.smapiVars.serverBaseURL+"/"); // =
default tomcat gadget server
  };

shindig.SciverseGadget.inherits(shindig.IfrGadget);
shindig.IfrContainer.prototype.gadgetClass =3D shindig.SciverseGadget;

/**
 * Gets the HTML element that is the chrome of a gadget into which the =
cotnent
 * of the gadget can be rendered.=20
 * @param {Object} gadget Gadget instance
 * @param {Object} location variable
 * @return {Object} HTML element that is the chrome for the given gadget
 */

shindig.FloatLeftLayoutManager.prototype.getGadgetChrome =3D
    function(gadget, location) {
=09
  var layoutRoot =3D document.getElementById(this.layoutRootId_);
 =20
  if (layoutRoot) {
    var chrome =3D document.createElement('div');
    chrome.id =3D gadget.location + '_' + gadget.sciverseId_;
    chrome.className =3D 'containerApplOver';
    layoutRoot.appendChild(chrome);
    return chrome;
   =20
  } else {
    return null;
  }
};

/**
 * Gets the HTML element into which the cotnent
 * of the gadget debug window can be rendered.=20
 * @param {Object} gadget Gadget instance
 * @param {Object} location variable
 * @return {Object} HTML element that is the chrome for=20
 * the gadget debug window of the given gadget
 */

shindig.FloatLeftLayoutManager.prototype.getGadgetDebugChrome =3D
    function(gid,location) {
  var layoutRoot =3D document.getElementById(this.layoutRootId_);
  if (layoutRoot) {
    var debugArea =3D document.createElement('textarea');
    debugArea.id =3D location + '_debug_'+gid;
    debugArea.rows=3D'3';
    debugArea.cols=3D'28';
    debugArea.readonly=3D'readonly';
    layoutRoot.appendChild(debugArea);
    return debugArea;
  } else {
    return null;
  }
};

/**
 * Renders a gadget using ifr.
 * @param {Object} gadget Gadget object
 */
shindig.IfrContainer.prototype.renderGadget =3D function(gadget, view, =
url, chrome) {=20
  if (view =3D=3D 'canvas') {  =20
	    jQuery('#'+sciverseObj.contextInfo.pageContentDivTagName).hide();
     	startTimer('canvas', 'canvas');
  		gadget.renderCanvas(url);
	    } else if (view =3D=3D 'sciverseResultsView') {
	  	startTimer(gadget.sciverseId_, gadget.location);
	  	gadget.renderResultsView(chrome, url);
  } else {=20
	    var chrome =3D this.layoutManager.getGadgetChrome(gadget);
	    log(gadget.sciverseId_, gadget.location, 'chrome created');=20
	   	startTimer(gadget.sciverseId_, gadget.location);
	   	log(gadget.sciverseId_, gadget.location, 'timer created');
	  	gadget.render(chrome);
	  	log(gadget.sciverseId_, gadget.location, 'gadget rendered');
	  	log(gadget.sciverseId_, gadget.location, =
gadgets.json.stringify(sciverseObj.contextInfo));
  }
};
/* This function gets fired just=20
 * before the rendergadget call is made*/

function startTimer(chromeid, location){
	if (typeof(timers_) =3D=3D 'undefined' || timers_ =3D=3D null){
		timers_ =3D new Array();
	}
	timers_[location+chromeid] =3D setTimeout("timeout('"+chromeid+"', '"+ =
location +"')",sciverseObj.smapiVars.gadgetLoadTimeout);
=09
};


/* This function gets fired =20
 * inside the startTimer function and prints the time=20
 * out message in the gadget chrome
 */
=20
function timeout(chromeid, location){
	//return false;
	jQuery('#'+location+'_'+chromeid).remove();
	//jQuery('#pleaseWait').remove();
	if(Toolbarorientation=3D=3D'vertical'){
	var toolbarHeight =3D parseInt(jQuery('#sciverse_toolbar').height()-7);
	jQuery('#toggleImg').css('height',toolbarHeight+'px' );}
	log(chromeid,location, 'Gadget timedout while loading.');
}

/* This function gets fired =20
 * on gadget onload event
 * and clear the time out
 */

function killTimer(chromeid, location) {
	clearTimeout(timers_[location+chromeid]);
=09
log(chromeid,location, 'Timer Killed');
=09
=09
	//load the toolbar hide/show image once the iframe has loaded=20
	if(!sciverseObj.contextInfo.toolbarState){
		var toolbarHeight =3D =
parseInt(jQuery('#sciverse_toolbar').height()-7);
		jQuery('#toggleImg').css('height',toolbarHeight+'px' );
	}
};

/* This function renders the gadget in profile view
 */
shindig.SciverseGadget.prototype.render =3D function(chrome) {
  if (chrome) {
    var gadget =3D this;
    this.getContent(function(content) {
      	chrome.innerHTML =3D content;
    });
  }
};
/* This function renders the gadget's main content in profile view
 */
shindig.SciverseGadget.prototype.getMainContent =3D =
function(continuation) {

	var =
aboutAppLink=3DsciverseObj.smapiVars.gadgetDetailPage+"/"+this.sciverseId=
_;
	var iframeId =3D this.getIframeId();
	var content =3D '';
	var zone =3D this.location;
	var failureStatus =3D false;
	var iframeWidth;
	var height_;
	if (typeof(this.height) !=3D 'undefined' && this.height !=3D null) {
	    height_ =3D this.height;
	}
	else {
	    height_ =3D ''
	}
	if(MSIE7Flag){
		if(toolbarWidth=3D=3Dnull||toolbarWidth=3D=3D''){
		iframeWidth=3D'100%';
		}
		else{
			if(Toolbarorientation.toLowerCase()=3D=3D'vertical'){
				iframeWidth=3DparseInt(tbWidthwithoutImage,10)-15;
				iframeWidth+=3D'px';
			}
			else{
				iframeWidth=3DparseInt(toolbarWidth,10)-15;
				iframeWidth+=3D'px';
			}
		}
	}
	else{
		if (toolbarWidth =3D=3D null || toolbarWidth =3D=3D '') {
		    iframeWidth =3D '100%';
		}
		else {
		    iframeWidth =3D '99.5%';
		}
	}

   if(this.closed_) { var state=3D'none';}else{state=3D'';}
		content +=3D '<div id=3D"maincont'+iframeId+'" =
style=3D"display:'+state+' ;" class=3D"containerAppDetails">';
 		 content +=3D '<iframe =
id=3D"'+iframeId+'"onload=3D"killTimer(\''+this.sciverseId_+'\', =
\''+this.location+'\');" name=3D"'+iframeId+'"  src=3D"'+(state =3D=3D =
"none" ? '' : this.getIframeUrl())+ '"' +
	  ' style=3D" align: left;text-align: left;"' +
      '" frameborder=3D"no"  scrolling=3D"auto" height=3D"'+height_+'" =
width=3D"'+iframeWidth+'"' +
          '></iframe>';
    	content+=3D'</div>'; =20
      gadgets.rpc.setRelayUrl(iframeId, this.serverBase_ + =
this.rpcRelay);
   =20
  gadgets.rpc.setAuthToken(iframeId, this.rpcToken);
  log(this.sciverseId_, 'got frame content');
  continuation(content);
};
/* This function renders the gadget's titlebar content in profile view
 */
shindig.SciverseGadget.prototype.getTitleBarContent =3D =
function(continuation) {

  if (this.includeChrome =3D=3D false) {
    continuation('');
    return;
  }
  var gtitle;
  if (this.title) gtitle =3D this.title;
  else gtitle =3D 'title';
 =20
  var content =3D '';
  var state =3D gadgetIconPath+'/close.gif';
  var title =3D 'Close this application';
  var decide;
  var leftEdgeUrl;
  var bodyUrl;
  var rightEdgeUrl;
  var appTitClass;
  if (this.closed_) {
  	state =3D gadgetIconPath+'/open.gif';
  	title =3D 'Open this application';
  	decide=3Dtrue;
  =09
  	appheaderClass=3D'boxGrey';
    appTitClass=3D"elsevierTimeL";
  }
  else{
	  decide=3Dfalse;
	=20
	  appheaderClass=3D'boxYellow';=09
	  	appTitClass=3D"elsevierTimeLOver";
  }
=20
  content+=3D'<div id=3D"footer' + this.cssClassTitleBar + '-' + this.id =
+'" class=3D"curveBoxleftNormal '+appheaderClass+'" >';
 =20
  content+=3D'<img src=3D"'+this.iconURL+'"  border=3D"none" =
class=3D"heading" title=3D"'+this.title+'">';
  content+=3D'<h3 id=3D"GadgetName'+this.id+'" class=3D"'+appTitClass+' =
truncateTitle">'+gtitle +'</h3>'+
  =20
      '<div class=3D"Controls">' +'<ul  class=3D"menu">';
=20
  content +=3D '<li><a href=3D"javascript:void(0);" =
id=3D"button-'+this.getUserPrefsDialogId()+'" =
onclick=3D"shindig.container.getGadget(' + this.id =
+').openMenuOptions();return false;" ><img style=3D"border: 0;" =
src=3D"'+gadgetIconPath+'/options.gif"' +
      ' alt=3D"Open/Close Options" title=3D"open options"></a></li>';
=20
  content +=3D '<li> <a href=3D"javascript:void(0);" =
onclick=3D"shindig.container.getGadget('+this.id+').openCanvasView();"><i=
mg style=3D"border: 0px;" src=3D"'+gadgetIconPath+'/canvas.gif" =
title=3D"open application to full-screen mode"/></a></li>';
  content +=3D '<li> <a href=3D"javascript:void(0);" =
onclick=3D"shindig.container.getGadget('+this.id+').handleToggle(this);">=
<img id=3D"img_'+this.id+'" style=3D"border: 0px;" src=3D"'+state+'" =
title=3D"'+title+'"/></a></li>';
  content+=3D'<ul class=3D"submenu" =
id=3D"sb-'+this.getUserPrefsDialogId()+'"></ul>';
  content +=3D '</ul>' ;
  content +=3D '</div>';
  content +=3D '</div>';	 =20
 =20
=20
=20
=20
log(this.sciverseId_, 'got title bar content');

  continuation(content);
};
/* This function loads the gadget's=20
 *user preference dialogue content in profile view
 */
shindig.SciverseGadget.prototype.getUserPrefsDialogContent =3D =
function(continuation) {
  continuation('<div id=3D"' + this.getUserPrefsDialogId() +'"  =
style=3D"display: none;z-index: 10; left: 0px;top:0px;border: 1px solid =
#e2cda2;border-top:0px ;font: smaller;background-color:#feffd3; =
width:99%;font-weight:bold;"></div>');
};

/* This function cancels the  =20
 *user preference dialogue box and hides it in profile view
 */
 shindig.SciverseGadget.prototype.handleCancelUserPrefs =3D function() {

var failureStatus=3Dfalse;
 jQuery('#'+this.getUserPrefsDialogId()).slideToggle();
=20
  =
ajaxKeyEventLog(this.title,'cancelGadgetPreferences',this.sciverseId_,'la=
ndingPage','','SubmitAction',failureStatus,'','');
};
=20


 /*=20
  This function is used to toggle the gadget=20
  */
shindig.SciverseGadget.prototype.handleToggle =3D function(imgObject) {
	if =
(jQuery('#'+this.getUserPrefsDialogId()).css('display')=3D=3D'block')
	 {jQuery('#'+this.getUserPrefsDialogId()).slideToggle();}
	 =20
 var isImg =3D false;

 var keyEventType =3D 'SubmitAction';
 var eventName =3D '';
 var failureStatus =3D false;
 if (jQuery(imgObject).children()[0] !=3D null && =
jQuery(imgObject).children()[0].tagName =3D=3D 'IMG') isImg =3D true;
  var gadgetIframe =3D document.getElementById(this.getIframeId());
  if (gadgetIframe) {     =20
    var display =3D =
jQuery('#maincont'+this.getIframeId()).css('display');
    if (display =3D=3D 'none'){
    	if (jQuery('#'+this.getIframeId()).attr('src') =3D=3D '') {
    		jQuery('#'+this.getIframeId()).attr('src', this.getIframeUrl());
    	}
    		jQuery('#img_'+this.id).attr('src',gadgetIconPath+'/close.gif');
    		jQuery('#img_'+this.id).attr('title', 'Close this application');
    		jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).removeClass('boxGrey');
    		jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).addClass('boxYellow');
				/*jQuery('#body' + this.cssClassTitleBar + '-' + =
this.id).css('background-image',
				'url('+gadgetIconPath+'/curvebody.gif)');
				jQuery('#' + this.cssClassTitleBar + '-' + =
this.id).css('background-image',
				'url('+gadgetIconPath+'/curveRight.gif)');*/
    	=09
    		jQuery('#GadgetName'+this.id).css('font-weight', 'bold');
    	=09

    }else{

	    	jQuery('#img_'+this.id).attr('src', gadgetIconPath+'/open.gif');
	    	jQuery('#img_'+this.id).attr('title', 'Open this application');
	    	jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).removeClass('boxYellow');
    		jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).addClass('boxGrey');
	    //	jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).removeClass('boxYellow').addClass('boxGrey'));
	    	/*jQuery('#footer' + this.cssClassTitleBar + '-' + =
this.id).css('background-image',
				'url('+gadgetIconPath+'/curveLeftNormal.gif)');
				jQuery('#body' + this.cssClassTitleBar + '-' + =
this.id).css('background-image',
				'url('+gadgetIconPath+'/curveBodyNormal.gif)');
				jQuery('#' + this.cssClassTitleBar + '-' + =
this.id).css('background-image',
				'url('+gadgetIconPath+'/curveRightNormal.gif)');*/
	    =09
    	jQuery('#GadgetName'+this.id).css('font-weight', 'normal');
    =09
    }=20
	jQuery('#maincont'+this.getIframeId()).slideToggle('normal',function () =
{
	var =
toolbarHeight=3DparseInt(jQuery("#sciverse_toolbar").height(),10)-7;
	toolbarHeight+=3D'px';
	jQuery('#toggleImg').css('height', toolbarHeight);
	});=20

	if(isImg){=09
		var imgCloseFlag=3Dthis.closed_;
		if(imgCloseFlag){
			eventName =3D 'openGadget';
			this.closed_=3Dfalse;=20
		}else=20
		{
			eventName =3D 'closeGadget';
			this.closed_=3Dtrue;=20
		}=09
		if( =
jQuery('#sb-'+this.getUserPrefsDialogId()).css('display')=3D=3D'block')jQ=
uery('#sb-'+this.getUserPrefsDialogId()).toggle();
	}
	if (!isImg) {	=20
		var closeFlag=3Dthis.closed_;
		if(closeFlag){
			eventName =3D 'openGadget';
			this.closed_=3Dfalse
		}else=20
		{
			eventName =3D 'closeGadget';
			this.closed_=3Dtrue;
		}	=09
		this.openMenuOptions();	=09
	}
  }
 =20
	this.saveGadgetState(eventName,keyEventType,failureStatus);
	=09
};

/* This function makes the ajax call
 * to the gadget state action bean to save=20
 * the gadget state in the session
 */
=20
shindig.SciverseGadget.prototype.saveGadgetState=3Dfunction(eventName,key=
EventType,failureStatus){
var pageName=3DsciverseObj.contextInfo.pageType;
var f_gadgetOpen=3D'';
if(this.closed_){f_gadgetOpen=3D'N'}
else{f_gadgetOpen=3D'Y'}
var zone =3D this.location;
var =
req=3D"gadgetDefinition=3D"+this.specUrl+"&"+"location=3D"+this.location+=
"&"+"gadgetOpen=3D"+f_gadgetOpen;
	=
req+=3D"&"+"eventName=3D"+eventName+"&"+"keyEventType=3D"+keyEventType+"&=
"+"zone=3D"+zone;
	=
req+=3D"&"+"failureStatus=3D"+failureStatus+"&"+"pageName=3D"+pageName+"&=
"+"isKeyEventURLAvailble=3D"+isKeyEventURLExists;
	req+=3D"&"+"gadgetId=3D"+this.sciverseId_+"&"+"moduleName=3Dgadget";

jQuery.ajax({
			type: 'GET',
			url: sciverseObj.smapiVars.gadgetStateURL +"?",
			async: true,
			data: req});
		=09

}
/* This function loads  the menu options dropdown for the gadget
 */

shindig.SciverseGadget.prototype.openMenuOptions =3D function() {	=09
	var =
aboutAppLink=3DsciverseObj.smapiVars.gadgetDetailPage+"/"+this.sciverseId=
_;
	var failureStatus=3Dfalse;

	var i_closeFlag=3Dthis.closed_;
=09
	var id;
	id=3D"sb-";
	id+=3D this.getUserPrefsDialogId();
=09
=09
	jQuery('#'+id).toggle();
	var builtMenu=3D'';
=09
	if (!i_closeFlag) builtMenu +=3D '<li><a =
href=3D"javascript:void(0);"onclick=3D"shindig.container.getGadget('+ =
this.id + ').handleToggle(this);">Turn Off</a></li>';
	else builtMenu +=3D '<li><a =
href=3D"javascript:void(0);"onclick=3D"shindig.container.getGadget('+this=
.id + ').handleToggle(this);">Turn On</a></li>';
	if (isUserPrefURLExists && this.hasUserPrefs) {
		builtMenu +=3D '<li><a href=3D"javascript:void(0);" =
onclick=3D"shindig.container.getGadget('+this.id+').handleOpenUserPrefsDi=
alog();">Edit preferences</a></li>';
	}
	if(isGadgetRemoveURLExists) {
		builtMenu +=3D '<li><a href=3D"#" =
onclick=3D"shindig.container.getGadget(' + this.id + =
').handleRemove();return false;">Remove</a></li>';
	}
	builtMenu +=3D '<li><a href=3D"javascript:void(0);" =
onclick=3D"openAboutPage(\''+aboutAppLink+'\',\''+failureStatus+'\',\''+t=
his.sciverseId_+'\',\''+this.gadgetName+'\',\''+this.location+'\');shindi=
g.container.getGadget(' + this.id + ').togglesubmenu();" >About this =
app</a></li>';
	jQuery("#"+id).html(builtMenu);

	jQuery(subMenuIdBuf).unbind("clickoutside");
	submenuID=3D'#sb-'+this.getUserPrefsDialogId();
	if(submenuID1 !=3D=3D submenuID){
	jQuery(submenuID1).hide();=20
	}
	submenuID1=3D'#sb-'+this.getUserPrefsDialogId();
	subMenuIdBuf =3D "#button-"+this.getUserPrefsDialogId();
=09
	jQuery("#button-"+this.getUserPrefsDialogId()).bind( "clickoutside", =
function(event){
=09
	jQuery(submenuID1).hide();=20
});
	=20
};


/* function to hide.unhide options dropdown menu in titlebar*/
shindig.SciverseGadget.prototype.togglesubmenu =3D function() {
	jQuery('#sb-'+this.getUserPrefsDialogId()).toggle();=09
};



shindig.SciverseGadget.prototype.getUserPrefs =3D function() {
  return this.userPrefs;
};


shindig.SciverseGadget.prototype.resizeUserPrefsDialog =3D function(){
	var id =3D this.getUserPrefsDialogId();

	jQuery("#"+id).css('width', '100%');
	jQuery("#"+id).css('height', '100%');
};

/*
 *This function loads the user preferences
 * by creating a HTML element on the basis=20
 * of user preferences supplied to the gadget
 */
shindig.SciverseGadget.prototype.handleOpenUserPrefsDialog =3D =
function() {
=09
    var gadget =3D this;
	terms =3D new Array();
    var igCallbackName =3D 'ig_callback_' + this.id;=09
    window[igCallbackName] =3D function(userPrefsDialogContent) {
      gadget.userPrefsDialogContentLoaded =3D true;	=20
      gadget.buildUserPrefsDialog(userPrefsDialogContent);
      gadget.showUserPrefsDialog();
         };

	var script =3D document.createElement('script');

	script.src =3D sciverseObj.smapiVars.gadgetPrefDialogboxURL+'?mid=3D' + =
this.id +
        '&output=3Djs' + this.getUserPrefsParams() +  '&url=3D' + =
this.specUrl;
     =20
    document.body.appendChild(script);
    if =
(this.closed_){shindig.container.getGadget(this.id).handleToggle(this);}
    else{jQuery('#sb-'+this.getUserPrefsDialogId()).toggle();}
    //jQuery('#sb-'+this.getUserPrefsDialogId()).toggle();
    =
ajaxKeyEventLog(this.title,'editGadgetPreferences',this.sciverseId_,'edit=
Preferences','','SubmitAction',false,'','');
};

function removeItemsFromList(removeID) {
    $('#' + removeID).remove();
}

function addItemsToList(id) {
    var element =3D document.getElementById(id).value;

    terms.push(element);
    var newListItem =3D document.createElement("li");
    //newdiv.id =3D 'listPref_' + id;
    //var listId =3D newdiv.id;
	//newdiv.innerHTML =3D element + "<input type=3D\"button\" =
name=3Dremove value=3Dremove onclick=3DremoveItemsFromList(\"" + listId =
+ "\")>";
	newListItem.innerHTML =3D '<li =
style=3D"margin-left:20px;">'+element+'</li>';
    var container =3D document.getElementById("listItemsUL");
    container.appendChild(newListItem);
};

/*
 *This function saves the user preferences
 * by creating a HTML element on the basis=20
 * of user preferences supplied to the gadget
 */
shindig.SciverseGadget.prototype.handleSaveUserPrefs =3D function() {
   jQuery('#'+this.getUserPrefsDialogId()).slideToggle();
  var numFields =3D document.getElementById('m_' + this.id +
      '_numfields').value;
   =20
  for (var i =3D 0; i < numFields; i++) {
    var input =3D document.getElementById('m_' + this.id + '_' + i);
    var userPrefNamePrefix =3D 'm_' + this.id + '_up_';
    var userPrefName =3D =
input.name.substring(userPrefNamePrefix.length);
    var userPrefValue =3D input.value;
    if (typeof(this.userPrefs[userPrefName]) =3D=3D 'undefined' && =
userPrefName.indexOf('list') < 0 ){
    	var o =3D new Object();
    	o.name =3D userPrefName;
    	o.value =3D userPrefValue;
    	this.userPrefs[userPrefName] =3D o;
    }  else {
		if(userPrefName.indexOf('list') > 0) {
			var userPref =3D =
userPrefName.substring(0,userPrefName.indexOf('_list'));
			if(typeof(this.userPrefs[userPref]) !=3D 'undefined') {
				var lastSavedPrefs =3D new Array();		=09
				lastSavedPrefs.push(this.userPrefs[userPref].value);
				for(var i=3D0;i<terms.length;i++) {
					lastSavedPrefs.push(terms[i]);
				}
				this.userPrefs[userPref].value =3D lastSavedPrefs;	   	=09
			} else {
				var prefs =3D new Array();
				for(var i=3D0;i<terms.length;i++) {
					prefs.push(terms[i]);
				}
				this.userPrefs[userPref].value =3D prefs;
			}
	   	}	  =09
	  	else if(input.type =3D=3D 'checkbox') {
	    	this.userPrefs[userPrefName].value =3D input.checked;
    	}
    	else if(input.type =3D=3D 'text' || input.type =3D=3D 'hidden' || =
input.type =3D=3D 'select-one') {
	   		this.userPrefs[userPrefName].value =3D userPrefValue;   =20
	   	}
   	}
  }
  this.saveUserPrefs();
  this.refresh();
};

shindig.DefaultUserPrefStore.prototype.getPrefs =3D function(gadget) {=20
=09
};

/*
 * This function calls the user preference action=20
 * bean and saves the user preferences,=20
 * entered by the user in session.
 */
shindig.DefaultUserPrefStore.prototype.savePrefs =3D function(gadget) {=20
	var reqPrefs=3Dgadgets.json.stringify(gadget.userPrefs);
=09
	var eventName =3D 'saveGadgetPreferences';
	var zone =3D sciverseObj.gadgetInfo[0].location;
	var failureStatus =3D false;
=09
	var req=3D"userPreferences=3D"+reqPrefs+"&";
	req+=3D"location=3D"+gadget.location+"&";
	req+=3D"originPage=3D"+sciverseObj.contextInfo.pageType+"&";
	req+=3D"gadgetDefinition=3D"+gadget.specUrl+"&";
	req+=3D"eventName=3D"+eventName+"&";
	req+=3D"gadgetId=3D"+gadget.sciverseId_+"&";
	req+=3D"gadgetName=3D"+gadget.title+"&";
	req+=3D"zone=3D"+zone+"&";
	req+=3D"pageName=3D"+sciverseObj.contextInfo.pageType+"&";
	req+=3D"failureStatus=3D"+failureStatus+"&";
	req+=3D"isKeyEventURLAvailble=3D"+isKeyEventURLExists;
	if(isUserPrefURLExists){
		jQuery.ajax({
					type: 'GET',
					url: sciverseObj.smapiVars.gadgetUserPrefsURL+"?",
					async: true,
					data: req});
	}
};

/*
 * This function is called when the user=20
 * selects to remove the gadget from his=20
 * profile
 */
shindig.SciverseGadget.prototype.handleRemove =3D function() {
	if(this.removable){
		var answer =3D confirm("Are you sure that you want to permanently =
delete this application?");
		if(answer){
 			jQuery('#'+this.location+'_'+this.sciverseId_).remove();
 			if(Toolbarorientation=3D=3D'vertical'){
	var toolbarHeight =3D parseInt(jQuery('#sciverse_toolbar').height()-7);
	jQuery('#toggleImg').css('height',toolbarHeight+'px' );
	}
 			this.removeFromCSAS();
		}
		else{=20
			jQuery('#sb-'+this.getUserPrefsDialogId()).toggle();
		}
	}
	else{
		alert("You cannot remove this application. It is provided for you by =
SciVerse or your institution.")
		jQuery('#sb-'+this.getUserPrefsDialogId()).toggle();
	}
};
/*
 * This function is called within the handleRemove() function
 * when user selects to remove the gadget from his=20
 * profile . It makes an ajax call to GadgetStateActionBean to remove
 * this gadget from the user's profile
 */
shindig.SciverseGadget.prototype.removeFromCSAS =3D function() {
	var pageName=3DsciverseObj.contextInfo.pageType;
	var eventName =3D 'removeGadget';
	var keyEventType =3D 'SubmitAction';
	var zone =3D this.location;
	var failureStatus =3D false;
	var =
req=3D"gadgetId=3D"+this.sciverseId_+"&"+"moduleName=3D"+this.title+"&"+"=
eventName=3D"+eventName+"&"+"location=3D"+this.location;
		=
req+=3D"&"+"zone=3D"+zone+"&"+"keyEventType=3D"+keyEventType+"&"+"failure=
Status=3D"+failureStatus+"&"+"isKeyEventURLAvailble=3D"+isKeyEventURLExis=
ts+"&"+"pageName=3D"+pageName;
=09
	jQuery.ajax({
				type: 'GET',
				url: sciverseObj.smapiVars.removeGadgetURL +"?",
				async: true,
				data: req});
};

/*shindig.SciverseGadget.prototype.showGadgetInView =3D function(view, =
url, chrome, location){=09
		shindig.container.renderGadget(this, view, url, chrome, location);
};*/

shindig.SciverseGadget.prototype.openCanvasView =3D =
function(viewParams){

    var canvasDiv =3D document.createElement('div');
    canvasDiv.id=3D'canvas';
  =20
    =
jQuery('#'+sciverseObj.contextInfo.pageContentDivTagName).parent().prepen=
d('<div id=3Dcanvas></div><div class=3D"clear"></div>');
 =20

    shindig.container.layoutManager =3D new =
shindig.FloatLeftLayoutManager(canvasDiv.id);=09
	var canvasGadget =3D shindig.container.createGadget({specUrl: =
this.specUrl, title: this.title ,userPrefs:this.userPrefs});
	canvasGadget.sciverseId_ =3D this.sciverseId_;
	canvasGadget.closed_ =3D this.closed_;=09
	canvasGadget.location =3D 'resultsView';
	canvasGadget.iconURL =3D(this.iconURL=3D=3Dnull||this.iconURL=3D=3D'') =
? gadgetIconPath+'/netbase.gif' : this.iconURL;

	shindig.container.addGadget(canvasGadget);
	canvasGadget.prepareGadgetForView('canvas', canvasDiv, viewParams);=20
	ajaxKeyEventLog('gadget', 'openCanvas', this.sciverseId_, '', '',
			'SubmitAction', false,'','');
};

shindig.SciverseGadget.prototype.prepareGadgetForView =3D function(view, =
chrome, viewParams) {;
	var url =3D this.getIframeUrl();
	url =3D buildViewUrl(url, view, viewParams);
	//this.showGadgetInView(view, url, chrome);
	shindig.container.renderGadget(this, view, url, chrome, location); =20

};
/*Function to restore the canvas view*/
shindig.SciverseGadget.prototype.closeCanvas =3D function(imgObject) {
	var isImg =3D false;
 var keyEventType =3D 'SubmitAction';
 var eventName =3D '';
 var failureStatus =3D false;
 if (jQuery(imgObject).children()[0] !=3D null && =
jQuery(imgObject).children()[0].tagName =3D=3D 'IMG') isImg =3D true;
	if(isImg){eventName=3D'closeCanvas';}
	else{eventName=3D'openCanvas';}
	jQuery("#canvas").children().remove();
	jQuery("#canvas").remove();
	jQuery('#'+sciverseObj.contextInfo.pageContentDivTagName).show();
=09
=09
=09
	if( =
jQuery('#sb-'+this.getUserPrefsDialogId()).css('display')=3D=3D'block')jQ=
uery('#sb-'+this.getUserPrefsDialogId()).toggle();
	=
ajaxKeyEventLog(this.title,eventName,this.sciverseId_,'landingPage','',ke=
yEventType,failureStatus,'','');

}

/* utility function to build the view url*/
function buildViewUrl(url, view, opt_params){

  var prevView =3D getUrlParam("view", url);
  if (prevView) {
    var url =3D url.replace("view=3D" + prevView, "view=3D" + view);
  } else {
    url +=3D '&view=3D' + encodeURIComponent(view);
  }

  if (opt_params) {
    var paramStr =3D gadgets.json.stringify(opt_params);
    if (paramStr.length > 0) {
      url +=3D '&view-params=3D' + encodeURIComponent(paramStr);
    }
  }
	return url;
};

/**
 * Simple utility function to get a URL param
 */
function getUrlParam(name, url) {
    name =3D name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS =3D "[\\?&]"+name+"=3D([^&#]*)";
    var regex =3D new RegExp(regexS);
    var results =3D regex.exec(url);
    if (results =3D=3D null) {
        return "";
    } else {
        return results[1];
    }
};

var canvasUrl =3D '';
/*Function to load the canvas view */
shindig.SciverseGadget.prototype.getCanvasContent =3D function(url, =
continuation) {
	canvasUrl =3D url;
	=09
  shindig.callAsyncAndJoin([
      this.getCanvasTitleBarContent, this.getCanvasMainContent], =
function(results) {
        continuation(results.join(''));
      }, this);
};

/*Function to load the titlebar of the gadget in  canvas view */
shindig.SciverseGadget.prototype.getCanvasTitleBarContent =3D =
function(continuation) {

  if (this.includeChrome =3D=3D false) {
    continuation('');
    return;
  }
  var gtitle;
  if (this.title) gtitle =3D this.title;
  else gtitle =3D 'title';
var content=3D'<div id=3D"footer' + this.cssClassTitleBar + '-' + =
this.id +'" class=3D"curveBoxRight boxYellow" >';
=20
=20
   content+=3D'<img src=3D"'+this.iconURL+'"  border=3D"none" =
class=3D"heading" title=3D"'+this.title+'">';
=20
   content+=3D'<h3 id=3D"GadgetName'+this.id+'" =
class=3D"elsevierTimeLOver">'+gtitle +'</h3>'+
   =20
       '<div class=3D"CanvasControls">' +'<ul>';
  content +=3D '<li> <a href=3D"javascript:void(0);" =
onclick=3D"shindig.container.getGadget('+this.id+').closeCanvas(this);"><=
img id=3D"img_'+this.id+'" style=3D"border: 0px;" =
src=3D"'+gadgetIconPath+'/restore.gif" title=3D"Minimize this =
application"/></a></li>';
=20
   content +=3D '</ul>' ;
   content +=3D '</div>';
      content +=3D '<div class=3D"clear"></div>';
   content +=3D '</div>';	 =20
  =20
  continuation(content);
};

/*Function to load the main content of the gadget in  canvas view */
shindig.SciverseGadget.prototype.getCanvasMainContent =3D =
function(continuation) {


  var iframeId =3D this.getIframeId();
  var =
aboutAppLink=3DsciverseObj.smapiVars.gadgetDetailPage+"?appId=3D"+this.sc=
iverseId_;
 =20

  var content=3D'<div class=3D"containerAppDetailsCanvas" =
style=3D"height:100%"';
      content+=3D(this.height ? ' style=3D"height: '+this.height+'px;"' =
: '') +
      '><iframe id=3D"'+iframeId+'" onload=3D"killTimer(\'canvas\', =
\'canvas\')" name=3D"'+iframeId+'" class=3D"'+this.cssClassGadget +
    =20
      '" src=3D"'+ canvasUrl +
      '" frameborder=3D"no" scrolling=3D"no" height=3D"100%" =
width=3D"100%"></iframe>';
     =20
    content+=3D'</div>'; =20
      continuation(content);

  gadgets.rpc.setRelayUrl(iframeId, this.serverBase_ + this.rpcRelay);

  gadgets.rpc.setAuthToken(iframeId, this.rpcToken);
};

/*This function calls the getCanvasContent function to load canvas view =
*/
shindig.SciverseGadget.prototype.renderCanvas =3D function(url){
    this.getCanvasContent(url, function(content) {
      jQuery('#canvas').html(content);
     =20
    });
};

/*Function to load the ICSResults view */
shindig.SciverseGadget.prototype.renderResultsView =3D function(chrome, =
url){
	this.getResultsViewContent(url, chrome, function(content) {
=09
		chrome.innerHTML =3D content;
	});
};
/*This function gets called withing the renderResultsView function to =
load ICSResults view */
shindig.SciverseGadget.prototype.getResultsViewContent =3D function(url, =
chrome, continuation) {
  this.resultsViewUrl =3D url;
  this.resultsViewChrome =3D chrome;
  var iframeId =3D this.getIframeId();
  gadgets.rpc.setRelayUrl(iframeId, this.serverBase_ + this.rpcRelay);
  gadgets.rpc.setAuthToken(iframeId, this.rpcToken); =20
  shindig.callAsyncAndJoin([this.getResultsViewTitleBarContent, =
this.getResultsViewMainContent],=20
  		function(results) {
        	continuation(results.join(''));
      	}, this);
};
/*Function to load the titlebar of the gadget in  ICSResults view */
shindig.SciverseGadget.prototype.getResultsViewTitleBarContent =3D =
function(continuation) {
	var gtitle;
	  if (this.title) gtitle =3D this.title;
	  else gtitle =3D 'title';

var content=3D'';


    =20
    =20
        =20
continuation(content);         =20
};

/*Function to load the maincontent of the gadget in  ICSResults view */
shindig.SciverseGadget.prototype.getResultsViewMainContent =3D =
function(continuation) {
	  var content=3D'';
	content +=3D '<div id=3D"mainCon_Res' + this.cssClassTitleBar + '-' + =
this.id +'" class=3D"containerAppDetailsRes"  > ';
	content +=3D '<iframe id=3D"'+this.getIframeId()+'" =
onload=3D"killTimer(\''+this.sciverseId_+'\', \''+this.location+'\');" =
name=3D"'+this.getIframeId()+'"  src=3D"'+ this.resultsViewUrl +
		'" frameborder=3D"no" scrolling=3D"auto" =
width=3D"100%"></iframe></div>';
	content+=3D'</div>';
=09
	continuation(content);
};
=09
/*Function to close the gadget in ICSResults view */
shindig.SciverseGadget.prototype.closeResultView =3D function(){
	=
jQuery('#footer_res_gadgets-gadget-title-bar-'+this.id).parent().remove()=
;
};


/*Function to log the messages in debug mode*/
function log(gid, location, text){
	if (debug) {
		jQuery('#'+location+ '_debug_'+gid).append('\n<br>' + text+ "->" + =
calculateUTCTime());		=09
	}
};

  function calculateUTCTime() {
	var utcDateTime;
	var d =3D new Date();
	var utcDate =3D d.getUTCDate();
	var utcMonth =3D d.getUTCMonth();
	var utcYear =3D d.getUTCFullYear();
	var utcHour =3D d.getUTCHours();
	var utcMin =3D d.getUTCMinutes();
	var utcSec =3D d.getUTCSeconds();
	var utcMsc =3D d.getUTCMilliseconds();
	utcDateTime =3D utcDate + "-" + utcMonth + "-" + utcYear + " ";
	var a_p =3D "AM";
	if (utcHour =3D=3D 0) {
		utcHour =3D 12;
	}
	if (utcHour > 12) {
		utcHour =3D utcHour - 12;
		a_p =3D "PM"
	}
	utcMin =3D utcMin + "";
	if (utcMin.length =3D=3D 1) {
		utcMin =3D "0" + utcMin;
	}
	utcSec =3D utcSec + "";
	if (utcSec.length =3D=3D 1) {
		utcSec =3D "0" + utcSec;
	}
	utcDateTime +=3D utcHour + ":" + utcMin + ":" + utcSec + ":" + utcMsc + =
" "
			+ a_p;
	return utcDateTime;
};


/************************************************************************=
*******
 * ELSEVIER - SCIENCE CONFIDENTIAL
 *=20
 * This document is the property of Elsevier Science (ES), and its =
contents are
 * proprietary to ES. Reproduction in any form by anyone of the =
materials
 * contained herein without the permission of ES is prohibited. Finders =
are
 * asked to return this document to the following Elsevier Science =
location.
 *=20
 * Elsevier Science 360 Park Avenue South, New York, NY 10010-1710
 *=20
 * Copyright (c) 2010 by Elsevier Science, a member of the Reed Elsevier =
plc
 * group. All Rights Reserved.
 =
*************************************************************************=
*****/
------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.hub.sciverse.com/gadgetcontext/gadgets/js/HUBShindigService.js

/************************************************************************=
*******
This JavaScript File contains only ICS related APIs . Gadgets can =
interact with the=20
container through these APIs and request information about the page=20
 =
*************************************************************************=
*****/
shindig.HUBService =3D function() {
	shindig.IfrGadgetService.call(this);

	gadgets.rpc.register('executeSearch', this.executeSearch);
}
shindig.HUBService.inherits(shindig.IfrGadgetService);

/*=20
	ICS Service to execute a new search from a gadget.
	Input Parameters:search query URL ready to be appended to =
SciverseQueryUrl =20
*/

shindig.HUBService.prototype.executeSearch =3D =
function(searchConditions) {
	if(typeof(searchConditions) =3D=3D 'undefined' || searchConditions =
=3D=3D null || searchConditions =3D=3D "") {
		return;
	}=09
	var url =3D sciverseObj.smapiVars.searchQueryURL;
	url+=3D'?st=3D('+searchConditions+')';
	window.location =3D url;
};

shindig.IfrContainer.prototype.HUBService =3D new shindig.HUBService();
------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/gadgetcontext/gadgets/js/GadgetToolBar.js

/************************************************************************=
*******
 * This JavaScript file containes all the utility methods used by =
applications
 * for loading the gadgets on their respective pages.
 =
*************************************************************************=
*****/

var isKeyEventURLExists;
var isUserPrefURLExists;
var isGadgetRemoveURLExists;
var Toolbarorientation;
var toolbarWidth;
var tbWidthwithoutImage;

var submenuID;
var submenuID1;
var subMenuIdBuf;
var debug =3D false; // flag for debug mode
if (document.location.href.indexOf('debug=3Dy') > 0)
	debug =3D true;
var gadgetPrefs =3D {};// variable to store user preferences
var sciverseObj;    //variable to store parsed sciverse object
var isUserEntitledtoGadgets;
/* varibales to hold the gadgetutils path */
var gadgetIconPath;
var gadgetJSPath;
var gadgetHTMLPath;

/* To store Metadata varibales*/
var userPrefs;
var browserVersion =3Dnavigator.appVersion;
var MSIE7Flag;
if (browserVersion.indexOf('MSIE 7.0')>0){MSIE7Flag=3Dtrue;}
/*
 * This Function is called from the displaygadgetsHome() function. It in =
turn
 * calls the shindig APIs to render the gadgets on the homepage
 */
=20
=20
=20
function renderGadgetsHome() {
	// validate if 3 columns to render the gadgets are present on the page
	if (jQuery('#column0').length =3D=3D 0 || jQuery('#column1').length =
=3D=3D 0
			|| jQuery('#column2').length =3D=3D 0) {
		return false;
	}
	isUserEntitled();
	isKeyEventURLAvailable();
    isUserPrefURLAvailable();
    isGadgetRemoveURLAvailable();
	isAppManageEnabled();
	populateHelpIconPath();
	var gadgetHeightFromPrefs;
=09
   	if(!isUserEntitledtoGadgets){
		jQuery('#ErrormessageDiv').css('display','block');
		jQuery('#ErrormessageDiv').html('You currently have no applications');
	=09
	}
	// call processMetadata to populate the user preferences in the =
variable
	// gadgetPrefs
	processMetadata();
	var columnNo =3D -1;
	//create the Layout Manager
	shindig.container.layoutManager =3D new =
shindig.FloatLeftLayoutManager();
=09
	// loop through the gadgetInfo object of sciverse JSON for gadget =
details
		jQuery.each(
					sciverseObj.gadgetInfo,
					function(index, g) {
				=09
						//assign the column id to the gadget=20
							columnNo =3D columnNo + 1;
							if(columnNo%3=3D=3D0){columnNo=3D0;}
							shindig.container.layoutManager.layoutRootId_ =3D =
'column'+columnNo;
							if (typeof(g.gadgetMetadata) !=3D 'undefined' && g.gadgetMetadata =
!=3D null) {
							    gadgetHeightFromPrefs =3D (typeof(g.gadgetMetadata.height) =
!=3D 'undefined' && g.gadgetMetadata.height !=3D null && =
g.gadgetMetadata.height !=3D 0) ? g.gadgetMetadata.height : null;
							}
							// check if debug flag is set and if true, create
							// the debug window for the gadget
							if (debug)
								debugArea =3D shindig.container.layoutManager
										.getGadgetDebugChrome(g.gadgetId, g.location);
							// if userPrefs are null, then create a new Array object
							if(gadgetPrefs[g.url].uprefObj =3D=3D null) {
								userPrefs =3D new Array();
							} else {
								userPrefs =3D gadgetPrefs[g.url].uprefObj;
							}
							// call creategadget API of Shindig and pass title ,
							// url and user preferences
							var gadget =3D shindig.container.createGadget( {
								specUrl :g.url,
								title :g.gadgetName,
								userPrefs :userPrefs,
								height:gadgetHeightFromPrefs
							});
							// populate gadget variable with additional info
							gadget.sciverseId_ =3D g.gadgetId;
							gadget.closed_ =3D g.closed;
							gadget.location =3D g.location;
							gadget.iconURL =3D(g.gadgetIcon=3D=3Dnull||g.gadgetIcon=3D=3D'') =
? gadgetIconPath+'/netbase.gif' : g.gadgetIcon;
							gadget.removable=3Dg.removable;
							gadget.hasUserPrefs =3D gadgetPrefs[g.url].hasUserPrefs;
							// add the gadget
							shindig.container.addGadget(gadget);
							// render the gadget on the page
							shindig.container.renderGadget(gadget);
							var gadgetState=3D(g.closed) ? 'close' : 'open';
				=09
						=
ajaxKeyEventLog('gadget','displayGadget',g.gadgetId,sciverseObj.contextIn=
fo.pageType,'','PageView',false,gadgetState,'')
					});
					truncateGadgetTitleAsNecessary();
				=09
}
/*
 * This Function is called from the displayGadgets() function. It in =
turn
 * calls the shindig APIs to render the gadgets on the ResultsPage
 */
function renderGadgets() {
      isUserEntitled();
	isKeyEventURLAvailable();
    isUserPrefURLAvailable();
    isGadgetRemoveURLAvailable();
	isAppManageEnabled();
	populateHelpIconPath();
=09
	var gadgetHeightFromPrefs;
=09
	//Display HelpText in case the user is not entitled to any application
	if (!isUserEntitledtoGadgets){
		jQuery('#rptoolbar').css('text-align','center');
		jQuery('#rptoolbar').html('You currently have no applications');
		if (Toolbarorientation=3D=3D'vertical'){onLoadToolbarStateVertical();}
	         else   {onLoadToolbarStateHorizontal();}=09
	}
		if (Toolbarorientation=3D=3D'vertical'){onLoadToolbarStateVertical();}
	         else   {onLoadToolbarStateHorizontal();}=09
=09
	// call processMetadata to populate the user preferences in the =
variable
	// gadgetPrefs
	processMetadata();
	// Create a new float left layout manager and pass the layout root
	shindig.container.layoutManager =3D new shindig.FloatLeftLayoutManager(
			'rptoolbar');
		=09
	// loop through the gadgetInfo object of sciverse JSON for gadget =
details
		jQuery.each(sciverseObj.gadgetInfo, function(index, g) {
			=09
					// check if debug flag is set and if true, create the debug
					// window for the gadget
				if (debug)debugArea =3D =
shindig.container.layoutManager.getGadgetDebugChrome(g.gadgetId, =
g.location);
				if (typeof(g.gadgetMetadata) !=3D 'undefined' && g.gadgetMetadata =
!=3D null) {
				    gadgetHeightFromPrefs =3D (typeof(g.gadgetMetadata.height) !=3D =
'undefined' && g.gadgetMetadata.height !=3D null && =
g.gadgetMetadata.height !=3D 0) ? g.gadgetMetadata.height : null;
				}
				// if userPrefs are null, then create a new Array object
				if(gadgetPrefs[g.url].uprefObj =3D=3D null) {
					userPrefs =3D new Array();
				} else {
					userPrefs =3D gadgetPrefs[g.url].uprefObj;
				}
					// call creategadget API of Shindig and pass title , url and
					// user preferences
					var gadget =3D shindig.container
							.createGadget( {
								specUrl :g.url,
								title :g.gadgetName,
								userPrefs :userPrefs,
								height:gadgetHeightFromPrefs
							});
					// populate gadget variable with additional info
					gadget.sciverseId_ =3D g.gadgetId;
					gadget.closed_ =3D g.closed;
					gadget.location =3D g.location;
					gadget.removable =3D g.removable;
					gadget.iconURL =3D(g.gadgetIcon=3D=3Dnull||g.gadgetIcon=3D=3D'') ? =
gadgetIconPath+'/netbase.gif' : g.gadgetIcon;
				=09
					gadget.hasUserPrefs =3D gadgetPrefs[g.url].hasUserPrefs;

					log(gadget.sciverseId_, gadget.location, 'gadget created');
					// Add the gadget by calling addGadget() shindig API
					shindig.container.addGadget(gadget);
					log(gadget.sciverseId_, gadget.location, 'gadget added');
					// render the gadget by calling renderGadget() shindig API
					shindig.container.renderGadget(gadget);
					var gadgetState=3D(g.closed) ? 'close' : 'open';
					=
ajaxKeyEventLog('gadget','displayGadget',g.gadgetId,sciverseObj.contextIn=
fo.pageType,'','PageView',false,gadgetState,'')
			});
		=09
	 truncateGadgetTitleAsNecessary();     =20
};

/*
 * This function populates the gadgetPrefs variable with gadget user =
preferences
 */

function processMetadata() {

    //function to populate metaData for gadgets
    getMetadataFromShindig();
    var prefs;

    for (var i =3D 0; i <=3D sciverseObj.gadgetInfo.length - 1; i++) {
        var ps =3D '{';
        gadgetPrefs[sciverseObj.gadgetInfo[i].url] =3D null;
        gadgetPrefs[sciverseObj.gadgetInfo[i].url] =3D {};
        gadgetPrefs[sciverseObj.gadgetInfo[i].url].uprefObj =3D null;
        gadgetPrefs[sciverseObj.gadgetInfo[i].url].hasUserPrefs =3D =
false;
        if (sciverseObj.gadgetInfo[i].gadgetMetadata) {
            if (typeof(sciverseObj.gadgetInfo[i].gadgetMetadata) !=3D =
'undefined' && sciverseObj.gadgetInfo[i].gadgetMetadata !=3D=3D null) {
                prefs =3D =
sciverseObj.gadgetInfo[i].gadgetMetadata.userPrefs;
                for (var p in prefs) {
                    if (sgf.isPrefInContextInfo(p)) {
                        var up =3D '"' + p + '":{"name":"' + p + '", =
"value":"' + escape(sciverseObj.contextInfo[p]) + =
'","datatype":"hidden"}';
                        if (ps =3D=3D '{') ps +=3D up;
                        else ps +=3D ', ' + up;
                    } else {
                        var prefValue =3D prefs[p]['default'];
                        if (sciverseObj.gadgetInfo[i].userPreferences) {
                            var storedPref =3D =
sciverseObj.gadgetInfo[i].userPreferences;
                            prefValue =3D storedPref[p].value;
                        }
                        var up =3D '"' + p + '":{"name":"' + p + '", =
"value":"' + prefValue + '","datatype":"' + prefs[p].type + '"}';
                        if (ps =3D=3D '{') ps +=3D up;
                        else ps +=3D ', ' + up;
                    }
                    //}
                } //for p in prefs                              =20
            }
            ps +=3D '}';

            if (ps !=3D '{}') { // non empty user prefs
                // check if there are any non-hidden type prefs
                var uprefs =3D gadgets.json.parse(ps);
                var hasUserPrefs =3D false;
                for (var up in uprefs) {
                    if (uprefs[up].datatype !=3D 'hidden') {
                        hasUserPrefs =3D true;
                        break;
                    }
                }
                gadgetPrefs[sciverseObj.gadgetInfo[i].url].uprefObj =3D =
uprefs;
                gadgetPrefs[sciverseObj.gadgetInfo[i].url].hasUserPrefs =
=3D hasUserPrefs;
            }
        } // if gadgetMetadata                          =20
    }
}

var sgf =3D sgf || {};
sgf.isPrefInContextInfo =3D function(pref){
      for (var c in sciverseObj.contextInfo){
            if (pref =3D=3D c) {
                  return true;
            }
      }
      return false;
};

/*

This function calculates the maximum allowed width for gadget title=20
and assigns ellipsis when that limit is reached.=20


*/
function truncateGadgetTitleAsNecessary() {
    var ellipsArray =3D jQuery(".truncateTitle");
    var titleElementWidth =3D jQuery('.truncateTitle').width();
    if(typeof(titleElementWidth) !=3D 'undefined' && titleElementWidth =
!=3D 0) {
	    var titleLength =3D Math.floor(titleElementWidth / 7);
	    for (i =3D 0; i < ellipsArray.length; i++) {
	        var t =3D jQuery(ellipsArray[i]).text();
	        if (t.length > titleLength) {
	            jQuery(ellipsArray[i]).text(t.substring(0, (titleLength - =
3)) + '...');
	        }
	    }
	}=09
}
/*This function calls shindig metadata service and populates
 * the metadata for gadgets=20
*/=20
function getMetadataFromShindig(){

	var gadgetparams=3Dnew Array();
	var moduleId =3D 0;
	for (var i =3D 0; i <=3D sciverseObj.gadgetInfo.length - 1; i++) {
	    if (sciverseObj.gadgetInfo[i].url !=3D '' && =
!sciverseObj.gadgetInfo[i].gadgetMetadata) {
	        gadgetparams[moduleId] =3D ({
	            url: sciverseObj.gadgetInfo[i].url
	        });
	        moduleId++;
	    }
	}
	if(gadgetparams.length=3D=3D0){return false;}
	=09
	  var request =3D {
	    context: {country: "US", language: "en", view: "profile", =
container: "default"},
	    gadgets: gadgetparams
	  =20
	  };=09
		var req =3D gadgets.json.stringify(request);

		jQuery.ajax({
			type: 'POST',
			url: sciverseObj.smapiVars.metadataService,
			async: false,
			data: req,
			success: function(response) {
				var data =3D gadgets.json.parse(response);
				if (gadgets.json.stringify(data)=3D=3D'{}'){return false;}
				if(data.gadgets) {
					var gadgetList=3D data.gadgets;
					for ( var j =3D 0, gadget; gadget =3D gadgetList[j]; j++) {
                         for(var i=3D0; i< =
sciverseObj.gadgetInfo.length; i++){
                               =
if(sciverseObj.gadgetInfo[i].url=3D=3DgadgetList[j].url){
                                     =
sciverseObj.gadgetInfo[i].gadgetMetadata =3D gadget;
                                     break;
                               }
                         }  =20
					}
				}
			}
			});
}
/*
 * This function is called onload of HOmepage. It in turn loads the =
toolbar HTML
 * and calls renderGadgetsHome @param {Object} sciverse object @param =
{Object}
 * div id of the toolbar holder div
 */
function displayGadgetsHome(toolBardivID) {
	var divID =3D toolBardivID;
  	sciverseObj =3D gadgets.json.parse(sciverse);
  	if(typeof(sciverseObj) =3D=3D 'undefined' || sciverseObj =3D=3D false =
|| sciverseObj =3D=3D '') {
  		if(debug){
  			alert('No data available to render the gadgets');
  		}
  		return false;
  	}
  =09
	setGadgetIHSURL();
	// validate if the div to render the gadgets exists on the page
	if ('#' + divID.length =3D=3D 0) {
		alert("invalid toolbar location");
	} else {
		jQuery('#' + divID).load(gadgetHTMLPath+'/HomePageToolBar.html', =
function() {
		renderGadgetsHome();
		});
	}
}

/*
 * This function is called onload of ResultsPage. It in turn loads the =
toolbar
 * HTML and calls renderGadgets @param {Object} sciverse object @param
 * {Object} div id of the toolbar holder div
 */
function displayGadgets(toolBardivID, orientation) {
	var divID =3D toolBardivID;
  	sciverseObj =3D gadgets.json.parse(sciverse);
  =09
  	if(typeof(sciverseObj) =3D=3D 'undefined' || sciverseObj =3D=3D false =
|| sciverseObj =3D=3D '') {
  		if(debug){
  			alert('No data available to render the gadgets');
  		}
  		return false;
  	}=09
	toolbarWidth=3DparseInt(jQuery('#' + divID).css('width'),10);
	var toolbarImgWidth =3D 15;
	tbWidthwithoutImage=3D (toolbarWidth - toolbarImgWidth);
	toolbarWidth+=3D'px';
	tbWidthwithoutImage+=3D'px';
	setGadgetIHSURL();
	// validate if the div to render the gadgets exists on the page
	if ('#' + divID.length =3D=3D 0) {
		alert("invalid toolbar location")
	} else {
		if (orientation.toLowerCase() =3D=3D 'vertical') {
		Toolbarorientation=3Dorientation;
			jQuery('#' + =
divID).load(gadgetHTMLPath+'/ResultPageToolBarVertical.html',
					function() {
						renderGadgets();
					});
		} else if (orientation.toLowerCase() =3D=3D 'horizontal') {
		Toolbarorientation=3Dorientation;
			jQuery('#' + =
divID).load(gadgetHTMLPath+'/ResultPageToolBarHorizontal.html',
					function() {
						renderGadgets();
					});
		} else {
			alert("Invalid Orientation");
		}
	}

}
/*
 * Function to load the toolbar (collapsed/shown)in case of horizontal =
orientation, depending on the value stored
 * in the session
 */
function onLoadToolbarStateVertical() {

	var toolbarHeight =3D parseInt(jQuery('#sciverse_toolbar').height()-7);
	toolbarHeight+=3D'px'; =20
	=09
	if (sciverseObj.contextInfo.toolbarState) {
		jQuery('#toggleImg').css('background-image',
				'url('+gadgetIconPath+'/Show-applications.gif)');

		jQuery('#toolbar').css('width', '15px');
		jQuery('#sciverse_toolbar').css('display', 'none');
		jQuery('#toggleImg').css('height', '460px');
		jQuery('#toggleImg').attr('title', 'show');
		jQuery('#toggleImg').css('border-right','1px solid #c7c7c7');
	} else {
		jQuery('#toggleImg').css('background-image',
				'url('+gadgetIconPath+'/Hide-applications.gif)');
		jQuery('#toolbar').css('width', toolbarWidth);
		jQuery('#sciverse_toolbar').css('width', tbWidthwithoutImage);
		jQuery('#sciverse_toolbar').css('display', 'block');
		jQuery('#toggleImg').attr('title', 'hide');
		jQuery('#toggleImg').css('height',toolbarHeight );
		jQuery('#toggleImg').css('border-right','0px');
	}
}


/*
 Function to toggle the toolbar on the results Page
 */
function toggleToolbarVertical() {
	var toolbarState;
	var keyEventType =3D 'SubmitAction';
	var eventName =3D '';
	var failureStatus =3D false;
=09
		toolbarHeight+=3D'px';
	if (jQuery('#sciverse_toolbar').css('display') =3D=3D 'block') {
		jQuery('#toggleImg').css('background-image',
				'url('+gadgetIconPath+'/Show-applications.gif)');

		jQuery('#toolbar').css('width', '15px');
		jQuery('#sciverse_toolbar').css('display', 'none');

=09
		jQuery('#toggleImg').attr('title', 'show');

		jQuery('#toggleImg').css('height', '460px');
		jQuery('#toggleImg').css('border-right','1px solid #c7c7c7');
		toolbarState =3D 'Y';
		eventName =3D 'closeToolBar';
	} else {
		jQuery('#toggleImg').css('background-image',
				'url('+gadgetIconPath+'/Hide-applications.gif)');

		jQuery('#toolbar').css('width', toolbarWidth);
		jQuery('#sciverse_toolbar').css('width', tbWidthwithoutImage);
		jQuery('#sciverse_toolbar').css('display', 'block');
		var toolbarHeight =3D (jQuery('#sciverse_toolbar').height()-7)+ "px";
		jQuery('#toggleImg').attr('title', 'hide');
	=09
		jQuery('#toggleImg').css('height', toolbarHeight);
		jQuery('#toggleImg').css('border-right','0px');
		toolbarState =3D 'N';
		eventName =3D 'openToolBar';

	}
	truncateGadgetTitleAsNecessary();
	saveToolBarState(toolbarState, eventName, keyEventType, failureStatus);
}

/*
 * Function to load the toolbar (collapsed/shown) in case of horizontal =
orientation, depending on the value stored
 * in the session
 */
function onLoadToolbarStateHorizontal() {
	jQuery('#sciverse_toolbar').css('width', toolbarWidth);
	if (sciverseObj.contextInfo.toolbarState) {
		jQuery('#arrowImg').attr('src',gadgetIconPath+'/showDownArrow.gif');
		jQuery('#arrowImg1').attr('src',gadgetIconPath+'/showDownArrow.gif');
		jQuery('#FooterText').text('Show Applications');
		jQuery('#sciverse_toolbar').css('display', 'none');
	} else {
		jQuery('#arrowImg').attr('src',gadgetIconPath+'/hideUpArrow.gif');
		jQuery('#arrowImg1').attr('src',gadgetIconPath+'/hideUpArrow.gif');
		jQuery('#FooterText').text('Hide Applications');
		jQuery('#sciverse_toolbar').css('display', 'block');
	}
}

/*
 Function to toggle the toolbar on the results Page when orientation is =
horizontal
 */
function toggleToolbarHorizontal() {

	var toolbarState;
	var keyEventType =3D 'SubmitAction';
	var eventName =3D '';=09
	var failureStatus =3D false;

	if (jQuery('#sciverse_toolbar').css('display') =3D=3D 'block') {
		jQuery('#sciverse_toolbar').slideToggle('normal');
		jQuery('#arrowImg').attr('src',gadgetIconPath+'/showDownArrow.gif');
		jQuery('#arrowImg1').attr('src',gadgetIconPath+'/showDownArrow.gif');
		jQuery('#FooterText').text('Show Applications');
		toolbarState =3D 'Y';
		eventName =3D 'closeToolBar';
	} else {
		jQuery('#sciverse_toolbar').slideToggle('normal');
		jQuery('#arrowImg').attr('src',gadgetIconPath+'/hideUpArrow.gif');
		jQuery('#arrowImg1').attr('src',gadgetIconPath+'/hideUpArrow.gif');
		jQuery('#FooterText').text('Hide Applications');
		toolbarState =3D 'N';
		eventName =3D 'openToolBar';
	}
	=
if(sciverseObj.smapiVars.toolbarStateURL!=3Dnull||typeof(sciverseObj.smap=
iVars.toolbarStateURL)!=3D=3D'undefined')saveToolBarState(toolbarState, =
eventName, keyEventType, failureStatus);
}

/*
 * Function to call the gadgetState actionbean,
 * through AJAX and save the toolbar state in session
 */
function saveToolBarState(obj, eventName, keyEventType, failureStatus) {
	var zone;
	if(isUserEntitledtoGadgets){
		zone =3D sciverseObj.gadgetInfo[0].location;
	}
	else{zone=3D'';}
	var req =3D "originPage=3D"+sciverseObj.contextInfo.pageType + "&" + =
"toolbarOpen=3D" + obj + "&"
			+ "eventName=3D" + eventName+"&" + "pageName=3D" + =
sciverseObj.contextInfo.pageType;

	req +=3D "&" + "location=3D"+sciverseObj.contextInfo.pageType + "&" + =
"keyEventType=3D" + keyEventType;
	req +=3D "&" + "zone=3D" + zone + "&" + "failureStatus=3D" + =
failureStatus+"&"+"isKeyEventURLAvailble=3D"+isKeyEventURLExists;

	jQuery.ajax( {
		type :'GET',
		url :sciverseObj.smapiVars.toolbarStateURL+"?",
		async :true,
		data :req
	});
}

/**
 * Function lo log the Key event to GadgetUsageActionBean
 *
 */

ajaxKeyEventLog =3D function(gadgetName,  activity, gadgetID,
		landingPage, targetURL, eventType, =
failureStatus,gadgetState,isPartnerIdRequired) {

	var eventHandler =3D '';
	var zone;
	if(isUserEntitledtoGadgets){
		zone =3D sciverseObj.gadgetInfo[0].location;
	}
	else{zone=3D'';}
   var location=3DsciverseObj.contextInfo.pageType;
	for ( var i =3D 0; i <=3D arguments.length; i++) {
		if (arguments[i] =3D=3D null)
			arguments[i] =3D '';
	}
=09
	var keyString =3D "moduleName=3D" + gadgetName + "&" + "location=3D" + =
location
				+ "&" + "eventName=3D" + activity + "&" + "moduleId=3D" + gadgetID
				+ "&" + "pageName=3D" + sciverseObj.contextInfo.pageType + "&" + =
"zone=3D" + zone=20
				+ "&" + "failed=3D" + failureStatus+"&" + "keyEventType=3D" +  =
eventType+"&" +"partner=3D" +  isPartnerIdRequired+"&" + =
"gadgetState=3D" + gadgetState+ "&" + "targetURL=3D" + targetURL;
		//alert(isKeyEventURLAvailable());
	if(isKeyEventURLExists){
		jQuery.ajax( {
			type :"GET",
			url :sciverseObj.smapiVars.keyEventURL+ "?",
			data :keyString
		});}
};

/*
 not a generic function. Being used to log two key events in one go.=20
 */

function openAboutPage(aboutAppLink, failureStatus, gadgetId, =
gadgetName,location) {
	window.open(aboutAppLink);
	ajaxKeyEventLog(gadgetName, 'aboutGadget', gadgetId, =
'AboutPage',aboutAppLink, 'outwardLink', failureStatus,'','');
}

/*
 function to open application gallery page and log the key event
 */

function openAddAppPage(location) {

	var url =3D sciverseObj.smapiVars.gadgetAddURL;
	window.location =3D url;=09
	ajaxKeyEventLog(null,  'addGadget', null, 'AppGallery', url,
			'SubmitAction', false,'','');
}

/*
function to open manage my application page and log the key event
 */

function openManageAppPage(location) {

	var url =3D sciverseObj.smapiVars.gadgetManagePage;
	window.location =3D url;
	ajaxKeyEventLog(null,  'outwardLink', null, 'AppGallery', url,
			'outwardLink', false,'',true);
}
/*
function to open Help page and log the key event
 */

function openHelpPage(location) {
	var helpURL;
	var helpContextPath =3D sciverseObj.contextInfo.gadgetUtilsURL;
	helpContextPath =3D =
helpContextPath.substring(0,helpContextPath.indexOf("gadgets"));
	jQuery.ajax({
		type: 'POST',
		url: helpContextPath+'toolbarHelp',
		async: false,
		data: null,
		success: function(response) {
			helpURL =3D response;
		}
	});
	=
window.open(helpURL,'help','resizable=3Dyes,scrollbars=3Dyes,width=3D760,=
height=3D570');
	ajaxKeyEventLog(null,  'outwardLink', null, 'AppGallery', helpURL,
			'outwardLink', false,'','');
}

/*
function to Check if keyEvent URL is available in sciverse object or not
 */
function isKeyEventURLAvailable(){
	if (typeof(sciverseObj.smapiVars.keyEventURL)!=3D=3D'undefined' && =
sciverseObj.smapiVars.keyEventURL!=3Dnull)
	{
		isKeyEventURLExists=3Dtrue;
	} else=20
	{
		isKeyEventURLExists=3Dfalse;
	}
}
=09
/*
function to Check if UserPref URL is available in sciverse object or not
 */		=09
function isUserPrefURLAvailable(){
	if (sciverseObj.smapiVars.gadgetUserPrefsURL=3D=3Dnull) {
		isUserPrefURLExists=3Dfalse;
	}
	else{
		isUserPrefURLExists=3Dtrue;
	}
}
			=09
/*
function to Check if gadget remove URL is available in sciverse object =
or not
 */		=09
function isGadgetRemoveURLAvailable(){
	if (sciverseObj.smapiVars.removeGadgetURL=3D=3Dnull) {
		isGadgetRemoveURLExists=3Dfalse;
	}
	else{
		isGadgetRemoveURLExists=3Dtrue;
	}
}			=09
					=09
/*
function to Check if user has the privileges to manage his apps.=20
 */				=09
function isAppManageEnabled(){
	if(sciverseObj.contextInfo.individualUser){
		jQuery('#addManage').append('&nbsp;|&nbsp; <a =
onclick=3D"openManageAppPage(sciverseObj.contextInfo.pageType)" =
style=3D"cursor:pointer">Manage Applications</a>');
	}
}

/*
	Function to set the gadgetUtils URL to access the gadget images, =
javascript files & common html files
*/
function setGadgetIHSURL() {
		gadgetIconPath =3DsciverseObj.contextInfo.gadgetUtilsURL+'/images';
		gadgetJSPath =3D sciverseObj.contextInfo.gadgetUtilsURL+'/js';
		gadgetHTMLPath =3DsciverseObj.contextInfo.gadgetUtilsURL+'/html';
}		=09

/*
	This method is to set the absolute path for toolbar help icon.=20
*/
=09
function populateHelpIconPath() {
	var iconName=3DjQuery('#HelpImageId').attr('src');
	 jQuery('#HelpImageId').attr('src',gadgetIconPath+'/help_toolbar.gif');
	 =
jQuery('.iconadd').css('background-image','url('+gadgetIconPath+'/add.gif=
)');
}=09

/* finds out if user has any entitlements sets the flag =
isUserEntitledtoGadgets accordingly */
function isUserEntitled(){
	=
if(sciverseObj.gadgetInfo.length=3D=3D0||sciverseObj.gadgetInfo=3D=3D''){=

		isUserEntitledtoGadgets=3Dfalse;
	}
	else{
		isUserEntitledtoGadgets=3Dtrue;
	}
}				=09
/************************************************************************=
*******
 * ELSEVIER - SCIENCE CONFIDENTIAL
 *=20
 * This document is the property of Elsevier Science (ES), and its =
contents are
 * proprietary to ES. Reproduction in any form by anyone of the =
materials
 * contained herein without the permission of ES is prohibited. Finders =
are
 * asked to return this document to the following Elsevier Science =
location.
 *=20
 * Elsevier Science 360 Park Avenue South, New York, NY 10010-1710
 *=20
 * Copyright (c) 2010 by Elsevier Science, a member of the Reed Elsevier =
plc
 * group. All Rights Reserved.
 =
*************************************************************************=
*****/


------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/previewWindow.js

function closePreview(artID, imgID, defImg, labelID) {=0A=
    var imgEle =3D document.getElementById(imgID);=0A=
	var labelEle =3D document.getElementById(labelID);=0A=
    if (imgEle) {=0A=
        imgEle.src =3D defImg;=0A=
        imgEle.alt =3D "Open";=0A=
        imgEle.title =3D "Open";=0A=
    }=0A=
	if (labelEle){=0A=
				labelEle.innerHTML =3D "Show preview";=0A=
			}=0A=
    var artDiv =3D document.getElementById(artID);=0A=
    if (artDiv) {=0A=
        artDiv.style.display =3D "none";=0A=
    }=0A=
}=0A=
=0A=
function openPreview(artID, targetURL, absID, id2, id3, imgID, defImg, =0A=
                     flipToImg, labelID) {=0A=
    var artDiv =3D document.getElementById(artID);=0A=
    if (artDiv) {=0A=
        if (artDiv.style.display =3D=3D "block") {=0A=
            return closePreview(artID, imgID, defImg, labelID);=0A=
        }=0A=
        else {=0A=
            var imgEle =3D document.getElementById(imgID);=0A=
			var labelEle =3D document.getElementById(labelID);=0A=
            if (imgEle) {=0A=
                imgEle.src =3D flipToImg;=0A=
                imgEle.alt =3D "Close";=0A=
                imgEle.title =3D "Close";=0A=
            }=0A=
			if (labelEle){=0A=
				labelEle.innerHTML =3D "Close preview";=0A=
			}=0A=
            getContent(targetURL, artID, id2, id3);=0A=
        }=0A=
    }=0A=
=0A=
    var absDiv =3D document.getElementById(absID);=0A=
    if(absDiv) {=0A=
        absDiv.style.display =3D "block";=0A=
        var absURLOn =3D document.getElementById(absID+"-on");=0A=
        var absURLOff =3D document.getElementById(absID+"-off");=0A=
        if(absURLOn) { absURLOn.style.display=3D"none"; }=0A=
        if(absURLOff) { absURLOff.style.display=3D""; }=0A=
    }=0A=
	=0A=
}=0A=
=0A=
function getContent(targetURL, updateID, id2, id3) {=0A=
=0A=
    var updateDiv =3D document.getElementById(updateID);=0A=
    if (updateDiv) {=0A=
        if(updateDiv.innerHTML.length =3D=3D 0) {=0A=
            updateDiv.innerHTML =3D '<b>LOADING....</b>';=0A=
            targetURL =3D targetURL.replace(/\#/g,'%23');=0A=
            new Ajax.Updater(updateID, targetURL);=0A=
        }=0A=
        updateDiv.style.display =3D "block";=0A=
    }=0A=
    var updateURLOn =3D document.getElementById(updateID+"-on");=0A=
    var updateURLOff =3D document.getElementById(updateID+"-off");=0A=
    if(updateURLOn) { updateURLOn.style.display=3D"none"; }=0A=
    if(updateURLOff) { updateURLOff.style.display=3D""; }=0A=
=0A=
    var div2 =3D document.getElementById(id2);=0A=
    var div3 =3D document.getElementById(id3);=0A=
    if(div2) {=0A=
       div2.style.display =3D "none";=0A=
    }=0A=
    if(div3) {=0A=
       div3.style.display =3D "none";=0A=
    }=0A=
    var id2On =3D document.getElementById(id2+"-on");=0A=
    var id2Off =3D document.getElementById(id2+"-off");=0A=
    if(id2On) { id2On.style.display=3D""; }=0A=
    if(id2Off) { id2Off.style.display=3D"none"; }=0A=
=0A=
    var id3On =3D document.getElementById(id3+"-on");=0A=
    var id3Off =3D document.getElementById(id3+"-off");=0A=
    if(id3On) { id3On.style.display=3D""; }=0A=
    if(id3Off) { id3Off.style.display=3D"none"; }=0A=
}=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/fontSizeChanger.js

function fontSizeAdd(elemId, fontURL) {=0A=
  var active =3D getFontStyle(elemId);=0A=
  switch (active) {=0A=
    case 'font1' :=0A=
      setActiveStyle('font2', elemId, fontURL);=0A=
      break;=0A=
    case 'font2' :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
    case 'font3' :=0A=
      setActiveStyle('font4', elemId, fontURL);=0A=
      break;=0A=
    case 'font4' :=0A=
      setActiveStyle('font5', elemId, fontURL);=0A=
      break;=0A=
    case 'font5' :=0A=
      break;=0A=
    default :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
  }=0A=
}=0A=
=0A=
function fontSizeMinus(elemId, fontURL) {=0A=
  var active =3D getFontStyle(elemId);=0A=
  switch (active) {=0A=
    case 'font5' :=0A=
      setActiveStyle('font4', elemId, fontURL);=0A=
      break;=0A=
    case 'font4' :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
    case 'font3' :=0A=
      setActiveStyle('font2', elemId, fontURL);=0A=
      break;=0A=
    case 'font2' :=0A=
      setActiveStyle('font1', elemId, fontURL);=0A=
      break;=0A=
    case 'font1' :=0A=
       break;=0A=
    default :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
  }=0A=
}=0A=
=0A=
function getFontStyle(elemId) {=0A=
  var x =3D document.getElementById(elemId);=0A=
  if(!x) {return 'fontDefault';}=0A=
  var z =3D x.className;=0A=
  return z;=0A=
}=0A=
=0A=
function setActiveStyle(fontClass, elemId, fontURL) {=0A=
  var x =3D document.getElementById(elemId);=0A=
  if(!x) {return;}=0A=
  var z =3D x.className;=0A=
  if(z !=3D fontClass) {=0A=
    var fontId;=0A=
    switch (fontClass) {=0A=
    case 'font5' :=0A=
      fontId =3D 5;=0A=
      break;=0A=
    case 'font4' :=0A=
      fontId =3D 4;=0A=
      break;=0A=
    case 'font3' :=0A=
      fontId =3D 3;=0A=
      break;=0A=
    case 'font2' :=0A=
      fontId =3D 2;=0A=
      break;=0A=
    case 'font1' :=0A=
      fontId =3D 1;=0A=
      break;=0A=
    default :=0A=
      fontId =3D 3;=0A=
      break;=0A=
    }=0A=
    var url =3D "/" + fontURL + "/fontsize/" + fontId;=0A=
    new Ajax.Request(url);=0A=
    x.className=3DfontClass;=0A=
  }=0A=
}=0A=
document.getElementsByClassName =3D function(cl) {=0A=
var retnode =3D [];=0A=
var myclass =3D new RegExp('\\b'+cl+'\\b');=0A=
var elem =3D this.getElementsByTagName('*');=0A=
                for (var i =3D 0; i < elem.length; i++) {=0A=
                                var classes =3D elem[i].className;=0A=
                                if (myclass.test(classes)) =
retnode.push(elem[i]);=0A=
                }=0A=
return retnode;=0A=
};=0A=
=0A=
function fontSizeAddIm(elemId, fontURL) {=0A=
  var active =3D getFontStyle(elemId);=0A=
  var obj;=0A=
  var captObj;=0A=
  switch (active) {=0A=
    case 'font1' :=0A=
	  obj =3D document.getElementsByClassName("height1");=0A=
	  captObj =3D document.getElementsByClassName("innerCaption =
heightCapt1");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height2";=0A=
		captObj[j].className=3D "innerCaption heightCapt2";=0A=
      }=0A=
      setActiveStyle('font2', elemId, fontURL);=0A=
      break;=0A=
    case 'font2' :=0A=
	  obj =3D document.getElementsByClassName("height2");=0A=
	  captObj =3D document.getElementsByClassName("innerCaption =
heightCapt2");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height3";=0A=
		captObj[j].className=3D "innerCaption heightCapt3";=0A=
      }=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
    case 'font3' :=0A=
	  obj =3D document.getElementsByClassName("height3");=0A=
	  captObj =3D document.getElementsByClassName("innerCaption =
heightCapt3");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height4";=0A=
		captObj[j].className=3D "innerCaption heightCapt4";=0A=
      }=0A=
      setActiveStyle('font4', elemId, fontURL);=0A=
      break;=0A=
    case 'font4' :=0A=
	  obj =3D document.getElementsByClassName("height4");=0A=
	  captObj =3D document.getElementsByClassName("innerCaption =
heightCapt4");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height5";=0A=
		captObj[j].className=3D "innerCaption heightCapt5";=0A=
      }=0A=
      setActiveStyle('font5', elemId, fontURL);=0A=
      break;=0A=
    case 'font5' :=0A=
      break;=0A=
    default :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
  }=0A=
}=0A=
=0A=
function fontSizeMinusIm(elemId, fontURL) {=0A=
  var active =3D getFontStyle(elemId);=0A=
  var obj;=0A=
  var captObj;=0A=
  switch (active) {=0A=
    case 'font5' :=0A=
	  obj =3D document.getElementsByClassName("height5");=0A=
	  captObj =3D document.getElementsByClassName("innerCaption =
heightCapt5");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height4";=0A=
		captObj[j].className=3D "innerCaption heightCapt4";=0A=
      }	  =0A=
      setActiveStyle('font4', elemId, fontURL);=0A=
      break;=0A=
    case 'font4' :=0A=
	 obj =3D document.getElementsByClassName("height4");=0A=
	 captObj =3D document.getElementsByClassName("innerCaption =
heightCapt4");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height3";=0A=
		captObj[j].className=3D "innerCaption heightCapt3";=0A=
      }	=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
    case 'font3' :=0A=
	 obj =3D document.getElementsByClassName("height3");=0A=
	 captObj =3D document.getElementsByClassName("innerCaption =
heightCapt3");=0A=
      for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height2";=0A=
		captObj[j].className=3D "innerCaption heightCapt2";=0A=
      }	=0A=
      setActiveStyle('font2', elemId, fontURL);=0A=
      break;=0A=
    case 'font2' :=0A=
	 obj =3D document.getElementsByClassName("height2");=0A=
	 captObj =3D document.getElementsByClassName("innerCaption =
heightCapt2");=0A=
	  for(j=3D0;j<obj.length;j++){=0A=
		obj[j].className=3D "height1";=0A=
		captObj[j].className=3D "innerCaption heightCapt1";=0A=
      }	=0A=
      setActiveStyle('font1', elemId, fontURL);=0A=
      break;=0A=
    case 'font1' :=0A=
       break;=0A=
    default :=0A=
      setActiveStyle('font3', elemId, fontURL);=0A=
      break;=0A=
  }=0A=
}=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/prototype.js

/*  Prototype JavaScript framework, version 1.6.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://www.prototypejs.org/=0A=
 *=0A=
 =
*------------------------------------------------------------------------=
--*/=0A=
=0A=
var Prototype =3D {=0A=
  Version: '1.6.0',=0A=
=0A=
  Browser: {=0A=
    IE:     !!(window.attachEvent && !window.opera),=0A=
    Opera:  !!window.opera,=0A=
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,=0A=
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && =
navigator.userAgent.indexOf('KHTML') =3D=3D -1,=0A=
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)=0A=
  },=0A=
=0A=
  BrowserFeatures: {=0A=
    XPath: !!document.evaluate,=0A=
    ElementExtensions: !!window.HTMLElement,=0A=
    SpecificElementExtensions:=0A=
      document.createElement('div').__proto__ &&=0A=
      document.createElement('div').__proto__ !=3D=3D=0A=
        document.createElement('form').__proto__=0A=
  },=0A=
=0A=
  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',=0A=
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,=0A=
=0A=
  emptyFunction: function() { },=0A=
  K: function(x) { return x }=0A=
};=0A=
=0A=
if (Prototype.Browser.MobileSafari)=0A=
  Prototype.BrowserFeatures.SpecificElementExtensions =3D false;=0A=
=0A=
if (Prototype.Browser.WebKit)=0A=
  Prototype.BrowserFeatures.XPath =3D false;=0A=
=0A=
/* Based on Alex Arnell's inheritance implementation. */=0A=
var Class =3D {=0A=
  create: function() {=0A=
    var parent =3D null, properties =3D $A(arguments);=0A=
    if (Object.isFunction(properties[0]))=0A=
      parent =3D properties.shift();=0A=
=0A=
    function klass() {=0A=
      this.initialize.apply(this, arguments);=0A=
    }=0A=
=0A=
    Object.extend(klass, Class.Methods);=0A=
    klass.superclass =3D parent;=0A=
    klass.subclasses =3D [];=0A=
=0A=
    if (parent) {=0A=
      var subclass =3D function() { };=0A=
      subclass.prototype =3D parent.prototype;=0A=
      klass.prototype =3D new subclass;=0A=
      parent.subclasses.push(klass);=0A=
    }=0A=
=0A=
    for (var i =3D 0; i < properties.length; i++)=0A=
      klass.addMethods(properties[i]);=0A=
=0A=
    if (!klass.prototype.initialize)=0A=
      klass.prototype.initialize =3D Prototype.emptyFunction;=0A=
=0A=
    klass.prototype.constructor =3D klass;=0A=
=0A=
    return klass;=0A=
  }=0A=
};=0A=
=0A=
Class.Methods =3D {=0A=
  addMethods: function(source) {=0A=
    var ancestor   =3D this.superclass && this.superclass.prototype;=0A=
    var properties =3D Object.keys(source);=0A=
=0A=
    if (!Object.keys({ toString: true }).length)=0A=
      properties.push("toString", "valueOf");=0A=
=0A=
    for (var i =3D 0, length =3D properties.length; i < length; i++) {=0A=
      var property =3D properties[i], value =3D source[property];=0A=
      if (ancestor && Object.isFunction(value) &&=0A=
          value.argumentNames().first() =3D=3D "$super") {=0A=
        var method =3D value, value =3D Object.extend((function(m) {=0A=
          return function() { return ancestor[m].apply(this, arguments) =
};=0A=
        })(property).wrap(method), {=0A=
          valueOf:  function() { return method },=0A=
          toString: function() { return method.toString() }=0A=
        });=0A=
      }=0A=
      this.prototype[property] =3D value;=0A=
    }=0A=
=0A=
    return this;=0A=
  }=0A=
};=0A=
=0A=
var Abstract =3D { };=0A=
=0A=
Object.extend =3D function(destination, source) {=0A=
  for (var property in source)=0A=
    destination[property] =3D source[property];=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=
  toJSONStr: function(object) {=0A=
    var type =3D typeof object;=0A=
    switch (type) {=0A=
      case 'undefined':=0A=
      case 'function':=0A=
      case 'unknown': return;=0A=
      case 'boolean': return object.toString();=0A=
    }=0A=
=0A=
    if (object =3D=3D=3D null) return 'null';=0A=
    if (object.toJSONStr) return object.toJSONStr();=0A=
    if (Object.isElement(object)) return;=0A=
=0A=
    var results =3D [];=0A=
    for (var property in object) {=0A=
      var value =3D Object.toJSONStr(object[property]);=0A=
      if (value !=3D=3D undefined)=0A=
        results.push(property.toJSONStr() + ': ' + value);=0A=
    }=0A=
=0A=
    return '{' + results.join(', ') + '}';=0A=
  },=0A=
=0A=
  toQueryString: function(object) {=0A=
    return $H(object).toQueryString();=0A=
  },=0A=
=0A=
  toHTML: function(object) {=0A=
    return object && object.toHTML ? object.toHTML() : =
String.interpret(object);=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=
  isElement: function(object) {=0A=
    return object && object.nodeType =3D=3D 1;=0A=
  },=0A=
=0A=
  isArray: function(object) {=0A=
    return object && object.constructor =3D=3D=3D Array;=0A=
  },=0A=
=0A=
  isHash: function(object) {=0A=
    return object instanceof Hash;=0A=
  },=0A=
=0A=
  isFunction: function(object) {=0A=
    return typeof object =3D=3D "function";=0A=
  },=0A=
=0A=
  isString: function(object) {=0A=
    return typeof object =3D=3D "string";=0A=
  },=0A=
=0A=
  isNumber: function(object) {=0A=
    return typeof object =3D=3D "number";=0A=
  },=0A=
=0A=
  isUndefined: function(object) {=0A=
    return typeof object =3D=3D "undefined";=0A=
  }=0A=
});=0A=
=0A=
Object.extend(Function.prototype, {=0A=
  argumentNames: function() {=0A=
    var names =3D =
this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").inv=
oke("strip");=0A=
    return names.length =3D=3D 1 && !names[0] ? [] : names;=0A=
  },=0A=
=0A=
  bind: function() {=0A=
    if (arguments.length < 2 && arguments[0] =3D=3D=3D undefined) return =
this;=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=
  bindAsEventListener: function() {=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));=0A=
    }=0A=
  },=0A=
=0A=
  curry: function() {=0A=
    if (!arguments.length) return this;=0A=
    var __method =3D this, args =3D $A(arguments);=0A=
    return function() {=0A=
      return __method.apply(this, args.concat($A(arguments)));=0A=
    }=0A=
  },=0A=
=0A=
  delay: function() {=0A=
    var __method =3D this, args =3D $A(arguments), timeout =3D =
args.shift() * 1000;=0A=
    return window.setTimeout(function() {=0A=
      return __method.apply(__method, args);=0A=
    }, timeout);=0A=
  },=0A=
=0A=
  wrap: function(wrapper) {=0A=
    var __method =3D this;=0A=
    return function() {=0A=
      return wrapper.apply(this, =
[__method.bind(this)].concat($A(arguments)));=0A=
    }=0A=
  },=0A=
=0A=
  methodize: function() {=0A=
    if (this._methodized) return this._methodized;=0A=
    var __method =3D this;=0A=
    return this._methodized =3D function() {=0A=
      return __method.apply(null, [this].concat($A(arguments)));=0A=
    };=0A=
  }=0A=
});=0A=
=0A=
Function.prototype.defer =3D Function.prototype.delay.curry(0.01);=0A=
=0A=
Date.prototype.toJSON =3D function() {=0A=
  return '"' + this.getUTCFullYear() + '-' +=0A=
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +=0A=
    this.getUTCDate().toPaddedString(2) + 'T' +=0A=
    this.getUTCHours().toPaddedString(2) + ':' +=0A=
    this.getUTCMinutes().toPaddedString(2) + ':' +=0A=
    this.getUTCSeconds().toPaddedString(2) + 'Z"';=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=
RegExp.prototype.match =3D RegExp.prototype.test;=0A=
=0A=
RegExp.escape =3D function(str) {=0A=
  return String(str).replace(/([.*+?^=3D!:${}()|[\]\/\\])/g, '\\$1');=0A=
};=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
var PeriodicalExecuter =3D Class.create({=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=
  execute: function() {=0A=
    this.callback(this);=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.execute();=0A=
      } finally {=0A=
        this.currentlyExecuting =3D false;=0A=
      }=0A=
    }=0A=
  }=0A=
});=0A=
Object.extend(String, {=0A=
  interpret: function(value) {=0A=
    return value =3D=3D null ? '' : String(value);=0A=
  },=0A=
  specialChar: {=0A=
    '\b': '\\b',=0A=
    '\t': '\\t',=0A=
    '\n': '\\n',=0A=
    '\f': '\\f',=0A=
    '\r': '\\r',=0A=
    '\\': '\\\\'=0A=
  }=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 String(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 : =
String(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 self =3D arguments.callee;=0A=
    self.text.data =3D this;=0A=
    return self.div.innerHTML;=0A=
  },=0A=
=0A=
  unescapeHTML: function() {=0A=
    var div =3D new Element('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 key =3D decodeURIComponent(pair.shift());=0A=
        var value =3D pair.length > 1 ? pair.join('=3D') : pair[0];=0A=
        if (value !=3D undefined) value =3D decodeURIComponent(value);=0A=
=0A=
        if (key in hash) {=0A=
          if (!Object.isArray(hash[key])) hash[key] =3D [hash[key]];=0A=
          hash[key].push(value);=0A=
        }=0A=
        else hash[key] =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=
  times: function(count) {=0A=
    return count < 1 ? '' : new Array(count + 1).join(this);=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.gsub(/[\x00-\x1f\\]/, function(match) {=0A=
      var character =3D String.specialChar[match[0]];=0A=
      return character ? character : '\\u00' + =
match[0].charCodeAt().toPaddedString(2, 16);=0A=
    });=0A=
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') =
+ '"';=0A=
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";=0A=
  },=0A=
=0A=
  toJSONStr: function() {=0A=
    return this.inspect(true);=0A=
  },=0A=
=0A=
  unfilterJSON: function(filter) {=0A=
    return this.sub(filter || Prototype.JSONFilter, '#{1}');=0A=
  },=0A=
=0A=
  isJSON: function() {=0A=
    var str =3D this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');=0A=
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);=0A=
  },=0A=
=0A=
  evalJSON: function(sanitize) {=0A=
    var json =3D this.unfilterJSON();=0A=
    try {=0A=
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');=0A=
    } catch (e) { }=0A=
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());=0A=
  },=0A=
=0A=
  include: function(pattern) {=0A=
    return this.indexOf(pattern) > -1;=0A=
  },=0A=
=0A=
  startsWith: function(pattern) {=0A=
    return this.indexOf(pattern) =3D=3D=3D 0;=0A=
  },=0A=
=0A=
  endsWith: function(pattern) {=0A=
    var d =3D this.length - pattern.length;=0A=
    return d >=3D 0 && this.lastIndexOf(pattern) =3D=3D=3D d;=0A=
  },=0A=
=0A=
  empty: function() {=0A=
    return this =3D=3D '';=0A=
  },=0A=
=0A=
  blank: function() {=0A=
    return /^\s*$/.test(this);=0A=
  },=0A=
=0A=
  interpolate: function(object, pattern) {=0A=
    return new Template(this, pattern).evaluate(object);=0A=
  }=0A=
});=0A=
=0A=
if (Prototype.Browser.WebKit || Prototype.Browser.IE) =
Object.extend(String.prototype, {=0A=
  escapeHTML: function() {=0A=
    return =
this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');=0A=
  },=0A=
  unescapeHTML: function() {=0A=
    return =
this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');=0A=
  }=0A=
});=0A=
=0A=
String.prototype.gsub.prepareReplacement =3D function(replacement) {=0A=
  if (Object.isFunction(replacement)) 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=
Object.extend(String.prototype.escapeHTML, {=0A=
  div:  document.createElement('div'),=0A=
  text: document.createTextNode('')=0A=
});=0A=
=0A=
with (String.prototype.escapeHTML) div.appendChild(text);=0A=
=0A=
var Template =3D Class.create({=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=
    if (Object.isFunction(object.toTemplateReplacements))=0A=
      object =3D object.toTemplateReplacements();=0A=
=0A=
    return this.template.gsub(this.pattern, function(match) {=0A=
      if (object =3D=3D null) return '';=0A=
=0A=
      var before =3D match[1] || '';=0A=
      if (before =3D=3D '\\') return match[2];=0A=
=0A=
      var ctx =3D object, expr =3D match[3];=0A=
      var pattern =3D /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match =
=3D pattern.exec(expr);=0A=
      if (match =3D=3D null) return before;=0A=
=0A=
      while (match !=3D null) {=0A=
        var comp =3D match[1].startsWith('[') ? match[2].gsub('\\\\]', =
']') : match[1];=0A=
        ctx =3D ctx[comp];=0A=
        if (null =3D=3D ctx || '' =3D=3D match[3]) break;=0A=
        expr =3D expr.substring('[' =3D=3D match[3] ? match[1].length : =
match[0].length);=0A=
        match =3D pattern.exec(expr);=0A=
      }=0A=
=0A=
      return before + String.interpret(ctx);=0A=
    }.bind(this));=0A=
  }=0A=
});=0A=
Template.Pattern =3D /(^|.|\r|\n)(#\{(.*?)\})/;=0A=
=0A=
var $break =3D { };=0A=
=0A=
var Enumerable =3D {=0A=
  each: function(iterator, context) {=0A=
    var index =3D 0;=0A=
    iterator =3D iterator.bind(context);=0A=
    try {=0A=
      this._each(function(value) {=0A=
        iterator(value, index++);=0A=
      });=0A=
    } catch (e) {=0A=
      if (e !=3D $break) throw e;=0A=
    }=0A=
    return this;=0A=
  },=0A=
=0A=
  eachSlice: function(number, iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=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.collect(iterator, context);=0A=
  },=0A=
=0A=
  all: function(iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var result =3D true;=0A=
    this.each(function(value, index) {=0A=
      result =3D result && !!iterator(value, index);=0A=
      if (!result) throw $break;=0A=
    });=0A=
    return result;=0A=
  },=0A=
=0A=
  any: function(iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var result =3D false;=0A=
    this.each(function(value, index) {=0A=
      if (result =3D !!iterator(value, index))=0A=
        throw $break;=0A=
    });=0A=
    return result;=0A=
  },=0A=
=0A=
  collect: function(iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var results =3D [];=0A=
    this.each(function(value, index) {=0A=
      results.push(iterator(value, index));=0A=
    });=0A=
    return results;=0A=
  },=0A=
=0A=
  detect: function(iterator, context) {=0A=
    iterator =3D iterator.bind(context);=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, context) {=0A=
    iterator =3D iterator.bind(context);=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(filter, iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var results =3D [];=0A=
=0A=
    if (Object.isString(filter))=0A=
      filter =3D new RegExp(filter);=0A=
=0A=
    this.each(function(value, index) {=0A=
      if (filter.match(value))=0A=
        results.push(iterator(value, index));=0A=
    });=0A=
    return results;=0A=
  },=0A=
=0A=
  include: function(object) {=0A=
    if (Object.isFunction(this.indexOf))=0A=
      if (this.indexOf(object) !=3D -1) return true;=0A=
=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, context) {=0A=
    iterator =3D iterator.bind(context);=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, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var result;=0A=
    this.each(function(value, index) {=0A=
      value =3D iterator(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, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var result;=0A=
    this.each(function(value, index) {=0A=
      value =3D iterator(value, index);=0A=
      if (result =3D=3D undefined || value < result)=0A=
        result =3D value;=0A=
    });=0A=
    return result;=0A=
  },=0A=
=0A=
  partition: function(iterator, context) {=0A=
    iterator =3D iterator ? iterator.bind(context) : Prototype.K;=0A=
    var trues =3D [], falses =3D [];=0A=
    this.each(function(value, index) {=0A=
      (iterator(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) {=0A=
      results.push(value[property]);=0A=
    });=0A=
    return results;=0A=
  },=0A=
=0A=
  reject: function(iterator, context) {=0A=
    iterator =3D iterator.bind(context);=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, context) {=0A=
    iterator =3D iterator.bind(context);=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 (Object.isFunction(args.last()))=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=
  filter:  Enumerable.findAll,=0A=
  member:  Enumerable.include,=0A=
  entries: Enumerable.toArray,=0A=
  every:   Enumerable.all,=0A=
  some:    Enumerable.any=0A=
});=0A=
function $A(iterable) {=0A=
  if (!iterable) return [];=0A=
  if (iterable.toArray) return iterable.toArray();=0A=
  var length =3D iterable.length, results =3D new Array(length);=0A=
  while (length--) results[length] =3D iterable[length];=0A=
  return results;=0A=
}=0A=
=0A=
if (Prototype.Browser.WebKit) {=0A=
  function $A(iterable) {=0A=
    if (!iterable) return [];=0A=
    if (!(Object.isFunction(iterable) && iterable =3D=3D '[object =
NodeList]') &&=0A=
        iterable.toArray) return iterable.toArray();=0A=
    var length =3D iterable.length, results =3D new Array(length);=0A=
    while (length--) results[length] =3D iterable[length];=0A=
    return results;=0A=
  }=0A=
}=0A=
=0A=
Array.from =3D $A;=0A=
=0A=
Object.extend(Array.prototype, Enumerable);=0A=
=0A=
if (!Array.prototype._reverse) 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(Object.isArray(value) ?=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=
  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(sorted) {=0A=
    return this.inject([], function(array, value, index) {=0A=
      if (0 =3D=3D index || (sorted ? array.last() !=3D value : =
!array.include(value)))=0A=
        array.push(value);=0A=
      return array;=0A=
    });=0A=
  },=0A=
=0A=
  intersect: function(array) {=0A=
    return this.uniq().findAll(function(item) {=0A=
      return array.detect(function(value) { return item =3D=3D=3D 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=
  toJSONStr: function() {=0A=
    var results =3D [];=0A=
    this.each(function(object) {=0A=
      var value =3D Object.toJSONStr(object);=0A=
      if (value !=3D=3D undefined) results.push(value);=0A=
    });=0A=
    return '[' + results.join(', ') + ']';=0A=
  }=0A=
});=0A=
=0A=
// use native browser JS 1.6 implementation if available=0A=
if (Object.isFunction(Array.prototype.forEach))=0A=
  Array.prototype._each =3D Array.prototype.forEach;=0A=
=0A=
if (!Array.prototype.indexOf) Array.prototype.indexOf =3D function(item, =
i) {=0A=
  i || (i =3D 0);=0A=
  var length =3D this.length;=0A=
  if (i < 0) i =3D length + i;=0A=
  for (; i < length; i++)=0A=
    if (this[i] =3D=3D=3D item) return i;=0A=
  return -1;=0A=
};=0A=
=0A=
if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf =3D =
function(item, i) {=0A=
  i =3D isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;=0A=
  var n =3D this.slice(0, i).reverse().indexOf(item);=0A=
  return (n < 0) ? n : i - n - 1;=0A=
};=0A=
=0A=
Array.prototype.toArray =3D Array.prototype.clone;=0A=
=0A=
function $w(string) {=0A=
  if (!Object.isString(string)) return [];=0A=
  string =3D string.strip();=0A=
  return string ? string.split(/\s+/) : [];=0A=
}=0A=
=0A=
if (Prototype.Browser.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 (Object.isArray(arguments[i])) {=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=
Object.extend(Number.prototype, {=0A=
  toColorPart: function() {=0A=
    return this.toPaddedString(2, 16);=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=
  toPaddedString: function(length, radix) {=0A=
    var string =3D this.toString(radix || 10);=0A=
    return '0'.times(length - string.length) + string;=0A=
  },=0A=
=0A=
  toJSONStr: function() {=0A=
    return isFinite(this) ? this.toString() : 'null';=0A=
  }=0A=
});=0A=
=0A=
$w('abs round ceil floor').each(function(method){=0A=
  Number.prototype[method] =3D Math[method].methodize();=0A=
});=0A=
function $H(object) {=0A=
  return new Hash(object);=0A=
};=0A=
=0A=
var Hash =3D Class.create(Enumerable, (function() {=0A=
  if (function() {=0A=
    var i =3D 0, Test =3D function(value) { this.key =3D value };=0A=
    Test.prototype.key =3D 'foo';=0A=
    for (var property in new Test('bar')) i++;=0A=
    return i > 1;=0A=
  }()) {=0A=
    function each(iterator) {=0A=
      var cache =3D [];=0A=
      for (var key in this._object) {=0A=
        var value =3D this._object[key];=0A=
        if (cache.include(key)) continue;=0A=
        cache.push(key);=0A=
        var pair =3D [key, value];=0A=
        pair.key =3D key;=0A=
        pair.value =3D value;=0A=
        iterator(pair);=0A=
      }=0A=
    }=0A=
  } else {=0A=
    function each(iterator) {=0A=
      for (var key in this._object) {=0A=
        var value =3D this._object[key], pair =3D [key, value];=0A=
        pair.key =3D key;=0A=
        pair.value =3D value;=0A=
        iterator(pair);=0A=
      }=0A=
    }=0A=
  }=0A=
=0A=
  function toQueryPair(key, value) {=0A=
    if (Object.isUndefined(value)) return key;=0A=
    return key + '=3D' + encodeURIComponent(String.interpret(value));=0A=
  }=0A=
=0A=
  return {=0A=
    initialize: function(object) {=0A=
      this._object =3D Object.isHash(object) ? object.toObject() : =
Object.clone(object);=0A=
    },=0A=
=0A=
    _each: each,=0A=
=0A=
    set: function(key, value) {=0A=
      return this._object[key] =3D value;=0A=
    },=0A=
=0A=
    get: function(key) {=0A=
      return this._object[key];=0A=
    },=0A=
=0A=
    unset: function(key) {=0A=
      var value =3D this._object[key];=0A=
      delete this._object[key];=0A=
      return value;=0A=
    },=0A=
=0A=
    toObject: function() {=0A=
      return Object.clone(this._object);=0A=
    },=0A=
=0A=
    keys: function() {=0A=
      return this.pluck('key');=0A=
    },=0A=
=0A=
    values: function() {=0A=
      return this.pluck('value');=0A=
    },=0A=
=0A=
    index: function(value) {=0A=
      var match =3D this.detect(function(pair) {=0A=
        return pair.value =3D=3D=3D value;=0A=
      });=0A=
      return match && match.key;=0A=
    },=0A=
=0A=
    merge: function(object) {=0A=
      return this.clone().update(object);=0A=
    },=0A=
=0A=
    update: function(object) {=0A=
      return new Hash(object).inject(this, function(result, pair) {=0A=
        result.set(pair.key, pair.value);=0A=
        return result;=0A=
      });=0A=
    },=0A=
=0A=
    toQueryString: function() {=0A=
      return this.map(function(pair) {=0A=
        var key =3D encodeURIComponent(pair.key), values =3D pair.value;=0A=
=0A=
        if (values && typeof values =3D=3D 'object') {=0A=
          if (Object.isArray(values))=0A=
            return values.map(toQueryPair.curry(key)).join('&');=0A=
        }=0A=
        return toQueryPair(key, values);=0A=
      }).join('&');=0A=
    },=0A=
=0A=
    inspect: function() {=0A=
      return '#<Hash:{' + this.map(function(pair) {=0A=
        return pair.map(Object.inspect).join(': ');=0A=
      }).join(', ') + '}>';=0A=
    },=0A=
=0A=
    toJSONStr: function() {=0A=
      return Object.toJSONStr(this.toObject());=0A=
    },=0A=
=0A=
    clone: function() {=0A=
      return new Hash(this);=0A=
    }=0A=
  }=0A=
})());=0A=
=0A=
Hash.prototype.toTemplateReplacements =3D Hash.prototype.toObject;=0A=
Hash.from =3D $H;=0A=
var ObjectRange =3D Class.create(Enumerable, {=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 (Object.isFunction(responder[callback])) {=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() { Ajax.activeRequestCount++ },=0A=
  onComplete: function() { Ajax.activeRequestCount-- }=0A=
});=0A=
=0A=
Ajax.Base =3D Class.create({=0A=
  initialize: 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=
      evalJSON:     true,=0A=
      evalJS:       true=0A=
    };=0A=
    Object.extend(this.options, options || { });=0A=
=0A=
    this.options.method =3D this.options.method.toLowerCase();=0A=
    if (Object.isString(this.options.parameters))=0A=
      this.options.parameters =3D =
this.options.parameters.toQueryParams();=0A=
  }=0A=
});=0A=
=0A=
Ajax.Request =3D Class.create(Ajax.Base, {=0A=
  _complete: false,=0A=
=0A=
  initialize: function($super, url, options) {=0A=
    $super(options);=0A=
    this.transport =3D Ajax.getTransport();=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 Object.clone(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=
    this.parameters =3D params;=0A=
=0A=
    if (params =3D Object.toQueryString(params)) {=0A=
      // when GET, append parameters to URL=0A=
      if (this.method =3D=3D 'get')=0A=
        this.url +=3D (this.url.include('?') ? '&' : '?') + params;=0A=
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))=0A=
        params +=3D '&_=3D';=0A=
    }=0A=
=0A=
    try {=0A=
      var response =3D new Ajax.Response(this);=0A=
      if (this.options.onCreate) this.options.onCreate(response);=0A=
      Ajax.Responders.dispatch('onCreate', this, response);=0A=
=0A=
      this.transport.open(this.method.toUpperCase(), this.url,=0A=
        this.options.asynchronous);=0A=
=0A=
      if (this.options.asynchronous) =
this.respondToReadyState.bind(this).defer(1);=0A=
=0A=
      this.transport.onreadystatechange =3D =
this.onStateChange.bind(this);=0A=
      this.setRequestHeaders();=0A=
=0A=
      this.body =3D this.method =3D=3D 'post' ? (this.options.postBody =
|| params) : null;=0A=
      this.transport.send(this.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 (Object.isFunction(extras.push))=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=
    var status =3D this.getStatus();=0A=
    return !status || (status >=3D 200 && status < 300);=0A=
  },=0A=
=0A=
  getStatus: function() {=0A=
    try {=0A=
      return this.transport.status || 0;=0A=
    } catch (e) { return 0 }=0A=
  },=0A=
=0A=
  respondToReadyState: function(readyState) {=0A=
    var state =3D Ajax.Request.Events[readyState], response =3D new =
Ajax.Response(this);=0A=
=0A=
    if (state =3D=3D 'Complete') {=0A=
      try {=0A=
        this._complete =3D true;=0A=
        (this.options['on' + response.status]=0A=
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]=0A=
         || Prototype.emptyFunction)(response, response.headerJSON);=0A=
      } catch (e) {=0A=
        this.dispatchException(e);=0A=
      }=0A=
=0A=
      var contentType =3D response.getHeader('Content-type');=0A=
      if (this.options.evalJS =3D=3D 'force'=0A=
          || (this.options.evalJS && contentType=0A=
          && =
contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s=
*$/i)))=0A=
        this.evalResponse();=0A=
    }=0A=
=0A=
    try {=0A=
      (this.options['on' + state] || Prototype.emptyFunction)(response, =
response.headerJSON);=0A=
      Ajax.Responders.dispatch('on' + state, this, response, =
response.headerJSON);=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=
  evalResponse: function() {=0A=
    try {=0A=
      return eval((this.transport.responseText || '').unfilterJSON());=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.Request.Events =3D=0A=
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];=0A=
=0A=
Ajax.Response =3D Class.create({=0A=
  initialize: function(request){=0A=
    this.request =3D request;=0A=
    var transport  =3D this.transport  =3D request.transport,=0A=
        readyState =3D this.readyState =3D transport.readyState;=0A=
=0A=
    if((readyState > 2 && !Prototype.Browser.IE) || readyState =3D=3D 4) =
{=0A=
      this.status       =3D this.getStatus();=0A=
      this.statusText   =3D this.getStatusText();=0A=
      this.responseText =3D String.interpret(transport.responseText);=0A=
      this.headerJSON   =3D this._getHeaderJSON();=0A=
    }=0A=
=0A=
    if(readyState =3D=3D 4) {=0A=
      var xml =3D transport.responseXML;=0A=
      this.responseXML  =3D xml =3D=3D=3D undefined ? null : xml;=0A=
      this.responseJSON =3D this._getResponseJSON();=0A=
    }=0A=
  },=0A=
=0A=
  status:      0,=0A=
  statusText: '',=0A=
=0A=
  getStatus: Ajax.Request.prototype.getStatus,=0A=
=0A=
  getStatusText: function() {=0A=
    try {=0A=
      return this.transport.statusText || '';=0A=
    } catch (e) { return '' }=0A=
  },=0A=
=0A=
  getHeader: Ajax.Request.prototype.getHeader,=0A=
=0A=
  getAllHeaders: function() {=0A=
    try {=0A=
      return this.getAllResponseHeaders();=0A=
    } catch (e) { return null }=0A=
  },=0A=
=0A=
  getResponseHeader: function(name) {=0A=
    return this.transport.getResponseHeader(name);=0A=
  },=0A=
=0A=
  getAllResponseHeaders: function() {=0A=
    return this.transport.getAllResponseHeaders();=0A=
  },=0A=
=0A=
  _getHeaderJSON: function() {=0A=
    var json =3D this.getHeader('X-JSON');=0A=
    if (!json) return null;=0A=
    json =3D decodeURIComponent(escape(json));=0A=
    try {=0A=
      return json.evalJSON(this.request.options.sanitizeJSON);=0A=
    } catch (e) {=0A=
      this.request.dispatchException(e);=0A=
    }=0A=
  },=0A=
=0A=
  _getResponseJSON: function() {=0A=
    var options =3D this.request.options;=0A=
    if (!options.evalJSON || (options.evalJSON !=3D 'force' &&=0A=
      !(this.getHeader('Content-type') || =
'').include('application/json')))=0A=
        return null;=0A=
    try {=0A=
      return this.transport.responseText.evalJSON(options.sanitizeJSON);=0A=
    } catch (e) {=0A=
      this.request.dispatchException(e);=0A=
    }=0A=
  }=0A=
});=0A=
=0A=
Ajax.Updater =3D Class.create(Ajax.Request, {=0A=
  initialize: function($super, container, url, options) {=0A=
    this.container =3D {=0A=
      success: (container.success || container),=0A=
      failure: (container.failure || (container.success ? null : =
container))=0A=
    };=0A=
=0A=
    options =3D options || { };=0A=
    var onComplete =3D options.onComplete;=0A=
    options.onComplete =3D (function(response, param) {=0A=
      this.updateContent(response.responseText);=0A=
      if (Object.isFunction(onComplete)) onComplete(response, param);=0A=
    }).bind(this);=0A=
=0A=
    $super(url, options);=0A=
  },=0A=
=0A=
  updateContent: function(responseText) {=0A=
    var receiver =3D this.container[this.success() ? 'success' : =
'failure'],=0A=
        options =3D this.options;=0A=
=0A=
    if (!options.evalScripts) responseText =3D =
responseText.stripScripts();=0A=
=0A=
    if (receiver =3D $(receiver)) {=0A=
      if (options.insertion) {=0A=
        if (Object.isString(options.insertion)) {=0A=
          var insertion =3D { }; insertion[options.insertion] =3D =
responseText;=0A=
          receiver.insert(insertion);=0A=
        }=0A=
        else options.insertion(receiver, responseText);=0A=
      }=0A=
      else receiver.update(responseText);=0A=
    }=0A=
=0A=
    if (this.success()) {=0A=
      if (this.onComplete) this.onComplete.bind(this).defer();=0A=
    }=0A=
  }=0A=
});=0A=
=0A=
Ajax.PeriodicalUpdater =3D Class.create(Ajax.Base, {=0A=
  initialize: function($super, container, url, options) {=0A=
    $super(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(response) {=0A=
    if (this.options.decay) {=0A=
      this.decay =3D (response.responseText =3D=3D this.lastText ?=0A=
        this.decay * this.options.decay : 1);=0A=
=0A=
      this.lastText =3D response.responseText;=0A=
    }=0A=
    this.timer =3D this.onTimerEvent.bind(this).delay(this.decay * =
this.frequency);=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 (Object.isString(element))=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(Element.extend(query.snapshotItem(i)));=0A=
    return results;=0A=
  };=0A=
}=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
if (!window.Node) var Node =3D { };=0A=
=0A=
if (!Node.ELEMENT_NODE) {=0A=
  // DOM level 2 ECMAScript Language Binding=0A=
  Object.extend(Node, {=0A=
    ELEMENT_NODE: 1,=0A=
    ATTRIBUTE_NODE: 2,=0A=
    TEXT_NODE: 3,=0A=
    CDATA_SECTION_NODE: 4,=0A=
    ENTITY_REFERENCE_NODE: 5,=0A=
    ENTITY_NODE: 6,=0A=
    PROCESSING_INSTRUCTION_NODE: 7,=0A=
    COMMENT_NODE: 8,=0A=
    DOCUMENT_NODE: 9,=0A=
    DOCUMENT_TYPE_NODE: 10,=0A=
    DOCUMENT_FRAGMENT_NODE: 11,=0A=
    NOTATION_NODE: 12=0A=
  });=0A=
}=0A=
=0A=
(function() {=0A=
  var element =3D this.Element;=0A=
  this.Element =3D function(tagName, attributes) {=0A=
    attributes =3D attributes || { };=0A=
    tagName =3D tagName.toLowerCase();=0A=
    var cache =3D Element.cache;=0A=
    if (Prototype.Browser.IE && attributes.name) {=0A=
      tagName =3D '<' + tagName + ' name=3D"' + attributes.name + '">';=0A=
      delete attributes.name;=0A=
      return Element.writeAttribute(document.createElement(tagName), =
attributes);=0A=
    }=0A=
    if (!cache[tagName]) cache[tagName] =3D =
Element.extend(document.createElement(tagName));=0A=
    return Element.writeAttribute(cache[tagName].cloneNode(false), =
attributes);=0A=
  };=0A=
  Object.extend(this.Element, element || { });=0A=
}).call(window);=0A=
=0A=
Element.cache =3D { };=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, content) {=0A=
    element =3D $(element);=0A=
    if (content && content.toElement) content =3D content.toElement();=0A=
    if (Object.isElement(content)) return =
element.update().insert(content);=0A=
    content =3D Object.toHTML(content);=0A=
    element.innerHTML =3D content.stripScripts();=0A=
    content.evalScripts.bind(content).defer();=0A=
    return element;=0A=
  },=0A=
=0A=
  replace: function(element, content) {=0A=
    element =3D $(element);=0A=
    if (content && content.toElement) content =3D content.toElement();=0A=
    else if (!Object.isElement(content)) {=0A=
      content =3D Object.toHTML(content);=0A=
      var range =3D element.ownerDocument.createRange();=0A=
      range.selectNode(element);=0A=
      content.evalScripts.bind(content).defer();=0A=
      content =3D range.createContextualFragment(content.stripScripts());=0A=
    }=0A=
    element.parentNode.replaceChild(content, element);=0A=
    return element;=0A=
  },=0A=
=0A=
  insert: function(element, insertions) {=0A=
    element =3D $(element);=0A=
=0A=
    if (Object.isString(insertions) || Object.isNumber(insertions) ||=0A=
        Object.isElement(insertions) || (insertions && =
(insertions.toElement || insertions.toHTML)))=0A=
          insertions =3D {bottom:insertions};=0A=
=0A=
    var content, t, range;=0A=
=0A=
    for (position in insertions) {=0A=
      content  =3D insertions[position];=0A=
      position =3D position.toLowerCase();=0A=
      t =3D Element._insertionTranslations[position];=0A=
=0A=
      if (content && content.toElement) content =3D content.toElement();=0A=
      if (Object.isElement(content)) {=0A=
        t.insert(element, content);=0A=
        continue;=0A=
      }=0A=
=0A=
      content =3D Object.toHTML(content);=0A=
=0A=
      range =3D element.ownerDocument.createRange();=0A=
      t.initializeRange(element, range);=0A=
      t.insert(element, =
range.createContextualFragment(content.stripScripts()));=0A=
=0A=
      content.evalScripts.bind(content).defer();=0A=
    }=0A=
=0A=
    return element;=0A=
  },=0A=
=0A=
  wrap: function(element, wrapper, attributes) {=0A=
    element =3D $(element);=0A=
    if (Object.isElement(wrapper))=0A=
      $(wrapper).writeAttribute(attributes || { });=0A=
    else if (Object.isString(wrapper)) wrapper =3D new Element(wrapper, =
attributes);=0A=
    else wrapper =3D new Element('div', wrapper);=0A=
    if (element.parentNode)=0A=
      element.parentNode.replaceChild(wrapper, element);=0A=
    wrapper.appendChild(element);=0A=
    return wrapper;=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('*')).each(Element.extend);=0A=
  },=0A=
=0A=
  firstDescendant: function(element) {=0A=
    element =3D $(element).firstChild;=0A=
    while (element && element.nodeType !=3D 1) element =3D =
element.nextSibling;=0A=
    return $(element);=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 (Object.isString(selector))=0A=
      selector =3D new Selector(selector);=0A=
    return selector.match($(element));=0A=
  },=0A=
=0A=
  up: function(element, expression, index) {=0A=
    element =3D $(element);=0A=
    if (arguments.length =3D=3D 1) return $(element.parentNode);=0A=
    var ancestors =3D element.ancestors();=0A=
    return expression ? Selector.findElement(ancestors, expression, =
index) :=0A=
      ancestors[index || 0];=0A=
  },=0A=
=0A=
  down: function(element, expression, index) {=0A=
    element =3D $(element);=0A=
    if (arguments.length =3D=3D 1) return element.firstDescendant();=0A=
    var descendants =3D element.descendants();=0A=
    return expression ? Selector.findElement(descendants, expression, =
index) :=0A=
      descendants[index || 0];=0A=
  },=0A=
=0A=
  previous: function(element, expression, index) {=0A=
    element =3D $(element);=0A=
    if (arguments.length =3D=3D 1) return =
$(Selector.handlers.previousElementSibling(element));=0A=
    var previousSiblings =3D element.previousSiblings();=0A=
    return expression ? Selector.findElement(previousSiblings, =
expression, index) :=0A=
      previousSiblings[index || 0];=0A=
  },=0A=
=0A=
  next: function(element, expression, index) {=0A=
    element =3D $(element);=0A=
    if (arguments.length =3D=3D 1) return =
$(Selector.handlers.nextElementSibling(element));=0A=
    var nextSiblings =3D element.nextSiblings();=0A=
    return expression ? Selector.findElement(nextSiblings, expression, =
index) :=0A=
      nextSiblings[index || 0];=0A=
  },=0A=
=0A=
  select: function() {=0A=
    var args =3D $A(arguments), element =3D $(args.shift());=0A=
    return Selector.findChildElements(element, args);=0A=
  },=0A=
=0A=
  adjacent: function() {=0A=
    var args =3D $A(arguments), element =3D $(args.shift());=0A=
    return Selector.findChildElements(element.parentNode, =
args).without(element);=0A=
  },=0A=
=0A=
  identify: function(element) {=0A=
    element =3D $(element);=0A=
    var id =3D element.readAttribute('id'), self =3D arguments.callee;=0A=
    if (id) return id;=0A=
    do { id =3D 'anonymous_element_' + self.counter++ } while ($(id));=0A=
    element.writeAttribute('id', id);=0A=
    return id;=0A=
  },=0A=
=0A=
  readAttribute: function(element, name) {=0A=
    element =3D $(element);=0A=
    if (Prototype.Browser.IE) {=0A=
      var t =3D Element._attributeTranslations.read;=0A=
      if (t.values[name]) return t.values[name](element, name);=0A=
      if (t.names[name]) name =3D t.names[name];=0A=
      if (name.include(':')) {=0A=
        return (!element.attributes || !element.attributes[name]) ? null =
:=0A=
         element.attributes[name].value;=0A=
      }=0A=
    }=0A=
    return element.getAttribute(name);=0A=
  },=0A=
=0A=
  writeAttribute: function(element, name, value) {=0A=
    element =3D $(element);=0A=
    var attributes =3D { }, t =3D Element._attributeTranslations.write;=0A=
=0A=
    if (typeof name =3D=3D 'object') attributes =3D name;=0A=
    else attributes[name] =3D value =3D=3D=3D undefined ? true : value;=0A=
=0A=
    for (var attr in attributes) {=0A=
      var name =3D t.names[attr] || attr, value =3D attributes[attr];=0A=
      if (t.values[attr]) name =3D t.values[attr](element, value);=0A=
      if (value =3D=3D=3D false || value =3D=3D=3D null)=0A=
        element.removeAttribute(name);=0A=
      else if (value =3D=3D=3D true)=0A=
        element.setAttribute(name, name);=0A=
      else element.setAttribute(name, value);=0A=
    }=0A=
    return element;=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=
    return (elementClassName.length > 0 && (elementClassName =3D=3D =
className ||=0A=
      new RegExp("(^|\\s)" + className + =
"(\\s|$)").test(elementClassName)));=0A=
  },=0A=
=0A=
  addClassName: function(element, className) {=0A=
    if (!(element =3D $(element))) return;=0A=
    if (!element.hasClassName(className))=0A=
      element.className +=3D (element.className ? ' ' : '') + className;=0A=
    return element;=0A=
  },=0A=
=0A=
  removeClassName: function(element, className) {=0A=
    if (!(element =3D $(element))) return;=0A=
    element.className =3D element.className.replace(=0A=
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();=0A=
    return element;=0A=
  },=0A=
=0A=
  toggleClassName: function(element, className) {=0A=
    if (!(element =3D $(element))) return;=0A=
    return element[element.hasClassName(className) ?=0A=
      'removeClassName' : 'addClassName'](className);=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.blank();=0A=
  },=0A=
=0A=
  descendantOf: function(element, ancestor) {=0A=
    element =3D $(element), ancestor =3D $(ancestor);=0A=
=0A=
    if (element.compareDocumentPosition)=0A=
      return (element.compareDocumentPosition(ancestor) & 8) =3D=3D=3D 8;=0A=
=0A=
    if (element.sourceIndex && !Prototype.Browser.Opera) {=0A=
      var e =3D element.sourceIndex, a =3D ancestor.sourceIndex,=0A=
       nextAncestor =3D ancestor.nextSibling;=0A=
      if (!nextAncestor) {=0A=
        do { ancestor =3D ancestor.parentNode; }=0A=
        while (!(nextAncestor =3D ancestor.nextSibling) && =
ancestor.parentNode);=0A=
      }=0A=
      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);=0A=
    }=0A=
=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 element.cumulativeOffset();=0A=
    window.scrollTo(pos[0], pos[1]);=0A=
    return element;=0A=
  },=0A=
=0A=
  getStyle: function(element, style) {=0A=
    element =3D $(element);=0A=
    style =3D style =3D=3D 'float' ? 'cssFloat' : style.camelize();=0A=
    var value =3D element.style[style];=0A=
    if (!value) {=0A=
      var css =3D document.defaultView.getComputedStyle(element, null);=0A=
      value =3D css ? css[style] : null;=0A=
    }=0A=
    if (style =3D=3D 'opacity') return value ? parseFloat(value) : 1.0;=0A=
    return value =3D=3D 'auto' ? null : value;=0A=
  },=0A=
=0A=
  getOpacity: function(element) {=0A=
    return $(element).getStyle('opacity');=0A=
  },=0A=
=0A=
  setStyle: function(element, styles) {=0A=
    element =3D $(element);=0A=
    var elementStyle =3D element.style, match;=0A=
    if (Object.isString(styles)) {=0A=
      element.style.cssText +=3D ';' + styles;=0A=
      return styles.include('opacity') ?=0A=
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : =
element;=0A=
    }=0A=
    for (var property in styles)=0A=
      if (property =3D=3D 'opacity') =
element.setOpacity(styles[property]);=0A=
      else=0A=
        elementStyle[(property =3D=3D 'float' || property =3D=3D =
'cssFloat') ?=0A=
          (elementStyle.styleFloat =3D=3D=3D undefined ? 'cssFloat' : =
'styleFloat') :=0A=
            property] =3D styles[property];=0A=
=0A=
    return element;=0A=
  },=0A=
=0A=
  setOpacity: function(element, value) {=0A=
    element =3D $(element);=0A=
    element.style.opacity =3D (value =3D=3D 1 || value =3D=3D=3D '') ? =
'' :=0A=
      (value < 0.00001) ? 0 : value;=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.getStyle(element, 'overflow') || =
'auto';=0A=
    if (element._overflow !=3D=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=
  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 Element._returnOffset(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 Element._returnOffset(valueL, valueT);=0A=
  },=0A=
=0A=
  absolutize: function(element) {=0A=
    element =3D $(element);=0A=
    if (element.getStyle('position') =3D=3D 'absolute') return;=0A=
    // Position.prepare(); // To be done manually by Scripty when it =
needs it.=0A=
=0A=
    var offsets =3D element.positionedOffset();=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=
    return element;=0A=
  },=0A=
=0A=
  relativize: function(element) {=0A=
    element =3D $(element);=0A=
    if (element.getStyle('position') =3D=3D 'relative') return;=0A=
    // Position.prepare(); // To be done manually by Scripty when it =
needs it.=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=
    return element;=0A=
  },=0A=
=0A=
  cumulativeScrollOffset: 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 Element._returnOffset(valueL, valueT);=0A=
  },=0A=
=0A=
  getOffsetParent: 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=
  viewportOffset: 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=3D document.body &&=0A=
        Element.getStyle(element, 'position') =3D=3D 'absolute') break;=0A=
=0A=
    } while (element =3D element.offsetParent);=0A=
=0A=
    element =3D forElement;=0A=
    do {=0A=
      if (!Prototype.Browser.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 Element._returnOffset(valueL, valueT);=0A=
  },=0A=
=0A=
  clonePosition: function(element, source) {=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 source.viewportOffset();=0A=
=0A=
    // find coordinate system to use=0A=
    element =3D $(element);=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(element, 'position') =3D=3D 'absolute') {=0A=
      parent =3D element.getOffsetParent();=0A=
      delta =3D parent.viewportOffset();=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)   element.style.left  =3D (p[0] - delta[0] + =
options.offsetLeft) + 'px';=0A=
    if (options.setTop)    element.style.top   =3D (p[1] - delta[1] + =
options.offsetTop) + 'px';=0A=
    if (options.setWidth)  element.style.width =3D source.offsetWidth + =
'px';=0A=
    if (options.setHeight) element.style.height =3D source.offsetHeight =
+ 'px';=0A=
    return element;=0A=
  }=0A=
};=0A=
=0A=
Element.Methods.identify.counter =3D 1;=0A=
=0A=
Object.extend(Element.Methods, {=0A=
  getElementsBySelector: Element.Methods.select,=0A=
  childElements: Element.Methods.immediateDescendants=0A=
});=0A=
=0A=
Element._attributeTranslations =3D {=0A=
  write: {=0A=
    names: {=0A=
      className: 'class',=0A=
      htmlFor:   'for'=0A=
    },=0A=
    values: { }=0A=
  }=0A=
};=0A=
=0A=
=0A=
if (!document.createRange || Prototype.Browser.Opera) {=0A=
  Element.Methods.insert =3D function(element, insertions) {=0A=
    element =3D $(element);=0A=
=0A=
    if (Object.isString(insertions) || Object.isNumber(insertions) ||=0A=
        Object.isElement(insertions) || (insertions && =
(insertions.toElement || insertions.toHTML)))=0A=
          insertions =3D { bottom: insertions };=0A=
=0A=
    var t =3D Element._insertionTranslations, content, position, pos, =
tagName;=0A=
=0A=
    for (position in insertions) {=0A=
      content  =3D insertions[position];=0A=
      position =3D position.toLowerCase();=0A=
      pos      =3D t[position];=0A=
=0A=
      if (content && content.toElement) content =3D content.toElement();=0A=
      if (Object.isElement(content)) {=0A=
        pos.insert(element, content);=0A=
        continue;=0A=
      }=0A=
=0A=
      content =3D Object.toHTML(content);=0A=
      tagName =3D ((position =3D=3D 'before' || position =3D=3D 'after')=0A=
        ? element.parentNode : element).tagName.toUpperCase();=0A=
=0A=
      if (t.tags[tagName]) {=0A=
        var fragments =3D =
Element._getContentFromAnonymousElement(tagName, content.stripScripts());=0A=
        if (position =3D=3D 'top' || position =3D=3D 'after') =
fragments.reverse();=0A=
        fragments.each(pos.insert.curry(element));=0A=
      }=0A=
      else element.insertAdjacentHTML(pos.adjacency, =
content.stripScripts());=0A=
=0A=
      content.evalScripts.bind(content).defer();=0A=
    }=0A=
=0A=
    return element;=0A=
  };=0A=
}=0A=
=0A=
if (Prototype.Browser.Opera) {=0A=
  Element.Methods._getStyle =3D Element.Methods.getStyle;=0A=
  Element.Methods.getStyle =3D function(element, style) {=0A=
    switch(style) {=0A=
      case 'left':=0A=
      case 'top':=0A=
      case 'right':=0A=
      case 'bottom':=0A=
        if (Element._getStyle(element, 'position') =3D=3D 'static') =
return null;=0A=
      default: return Element._getStyle(element, style);=0A=
    }=0A=
  };=0A=
  Element.Methods._readAttribute =3D Element.Methods.readAttribute;=0A=
  Element.Methods.readAttribute =3D function(element, attribute) {=0A=
    if (attribute =3D=3D 'title') return element.title;=0A=
    return Element._readAttribute(element, attribute);=0A=
  };=0A=
}=0A=
=0A=
else if (Prototype.Browser.IE) {=0A=
  $w('positionedOffset getOffsetParent =
viewportOffset').each(function(method) {=0A=
    Element.Methods[method] =3D Element.Methods[method].wrap(=0A=
      function(proceed, element) {=0A=
        element =3D $(element);=0A=
        var position =3D element.getStyle('position');=0A=
        if (position !=3D 'static') return proceed(element);=0A=
        element.setStyle({ position: 'relative' });=0A=
        var value =3D proceed(element);=0A=
        element.setStyle({ position: position });=0A=
        return value;=0A=
      }=0A=
    );=0A=
  });=0A=
=0A=
  Element.Methods.getStyle =3D function(element, style) {=0A=
    element =3D $(element);=0A=
    style =3D (style =3D=3D 'float' || style =3D=3D 'cssFloat') ? =
'styleFloat' : style.camelize();=0A=
    var value =3D element.style[style];=0A=
    if (!value && element.currentStyle) value =3D =
element.currentStyle[style];=0A=
=0A=
    if (style =3D=3D 'opacity') {=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=
=0A=
    if (value =3D=3D 'auto') {=0A=
      if ((style =3D=3D 'width' || style =3D=3D 'height') && =
(element.getStyle('display') !=3D 'none'))=0A=
        return element['offset' + style.capitalize()] + 'px';=0A=
      return null;=0A=
    }=0A=
    return value;=0A=
  };=0A=
=0A=
  Element.Methods.setOpacity =3D function(element, value) {=0A=
    function stripAlpha(filter){=0A=
      return filter.replace(/alpha\([^\)]*\)/gi,'');=0A=
    }=0A=
    element =3D $(element);=0A=
    var currentStyle =3D element.currentStyle;=0A=
    if ((currentStyle && !currentStyle.hasLayout) ||=0A=
      (!currentStyle && element.style.zoom =3D=3D 'normal'))=0A=
        element.style.zoom =3D 1;=0A=
=0A=
    var filter =3D element.getStyle('filter'), style =3D element.style;=0A=
    if (value =3D=3D 1 || value =3D=3D=3D '') {=0A=
      (filter =3D stripAlpha(filter)) ?=0A=
        style.filter =3D filter : style.removeAttribute('filter');=0A=
      return element;=0A=
    } else if (value < 0.00001) value =3D 0;=0A=
    style.filter =3D stripAlpha(filter) +=0A=
      'alpha(opacity=3D' + (value * 100) + ')';=0A=
    return element;=0A=
  };=0A=
=0A=
  Element._attributeTranslations =3D {=0A=
    read: {=0A=
      names: {=0A=
        'class': 'className',=0A=
        'for':   'htmlFor'=0A=
      },=0A=
      values: {=0A=
        _getAttr: function(element, attribute) {=0A=
          return element.getAttribute(attribute, 2);=0A=
        },=0A=
        _getAttrNode: function(element, attribute) {=0A=
          var node =3D element.getAttributeNode(attribute);=0A=
          return node ? node.value : "";=0A=
        },=0A=
        _getEv: function(element, attribute) {=0A=
          var attribute =3D element.getAttribute(attribute);=0A=
          return attribute ? attribute.toString().slice(23, -2) : null;=0A=
        },=0A=
        _flag: function(element, attribute) {=0A=
          return $(element).hasAttribute(attribute) ? attribute : null;=0A=
        },=0A=
        style: function(element) {=0A=
          return element.style.cssText.toLowerCase();=0A=
        },=0A=
        title: function(element) {=0A=
          return element.title;=0A=
        }=0A=
      }=0A=
    }=0A=
  };=0A=
=0A=
  Element._attributeTranslations.write =3D {=0A=
    names: Object.clone(Element._attributeTranslations.read.names),=0A=
    values: {=0A=
      checked: function(element, value) {=0A=
        element.checked =3D !!value;=0A=
      },=0A=
=0A=
      style: function(element, value) {=0A=
        element.style.cssText =3D value ? value : '';=0A=
      }=0A=
    }=0A=
  };=0A=
=0A=
  Element._attributeTranslations.has =3D {};=0A=
=0A=
  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +=0A=
      'encType maxLength readOnly longDesc').each(function(attr) {=0A=
    Element._attributeTranslations.write.names[attr.toLowerCase()] =3D =
attr;=0A=
    Element._attributeTranslations.has[attr.toLowerCase()] =3D attr;=0A=
  });=0A=
=0A=
  (function(v) {=0A=
    Object.extend(v, {=0A=
      href:        v._getAttr,=0A=
      src:         v._getAttr,=0A=
      type:        v._getAttr,=0A=
      action:      v._getAttrNode,=0A=
      disabled:    v._flag,=0A=
      checked:     v._flag,=0A=
      readonly:    v._flag,=0A=
      multiple:    v._flag,=0A=
      onload:      v._getEv,=0A=
      onunload:    v._getEv,=0A=
      onclick:     v._getEv,=0A=
      ondblclick:  v._getEv,=0A=
      onmousedown: v._getEv,=0A=
      onmouseup:   v._getEv,=0A=
      onmouseover: v._getEv,=0A=
      onmousemove: v._getEv,=0A=
      onmouseout:  v._getEv,=0A=
      onfocus:     v._getEv,=0A=
      onblur:      v._getEv,=0A=
      onkeypress:  v._getEv,=0A=
      onkeydown:   v._getEv,=0A=
      onkeyup:     v._getEv,=0A=
      onsubmit:    v._getEv,=0A=
      onreset:     v._getEv,=0A=
      onselect:    v._getEv,=0A=
      onchange:    v._getEv=0A=
    });=0A=
  })(Element._attributeTranslations.read.values);=0A=
}=0A=
=0A=
else if (Prototype.Browser.Gecko && =
/rv:1\.8\.0/.test(navigator.userAgent)) {=0A=
  Element.Methods.setOpacity =3D function(element, value) {=0A=
    element =3D $(element);=0A=
    element.style.opacity =3D (value =3D=3D 1) ? 0.999999 :=0A=
      (value =3D=3D=3D '') ? '' : (value < 0.00001) ? 0 : value;=0A=
    return element;=0A=
  };=0A=
}=0A=
=0A=
else if (Prototype.Browser.WebKit) {=0A=
  Element.Methods.setOpacity =3D function(element, value) {=0A=
    element =3D $(element);=0A=
    element.style.opacity =3D (value =3D=3D 1 || value =3D=3D=3D '') ? =
'' :=0A=
      (value < 0.00001) ? 0 : value;=0A=
=0A=
    if (value =3D=3D 1)=0A=
      if(element.tagName =3D=3D 'IMG' && element.width) {=0A=
        element.width++; element.width--;=0A=
      } else try {=0A=
        var n =3D document.createTextNode(' ');=0A=
        element.appendChild(n);=0A=
        element.removeChild(n);=0A=
      } catch (e) { }=0A=
=0A=
    return element;=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=
  Element.Methods.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 Element._returnOffset(valueL, valueT);=0A=
  };=0A=
}=0A=
=0A=
if (Prototype.Browser.IE || Prototype.Browser.Opera) {=0A=
  // IE and Opera are missing .innerHTML support for TABLE-related and =
SELECT elements=0A=
  Element.Methods.update =3D function(element, content) {=0A=
    element =3D $(element);=0A=
=0A=
    if (content && content.toElement) content =3D content.toElement();=0A=
    if (Object.isElement(content)) return =
element.update().insert(content);=0A=
=0A=
    content =3D Object.toHTML(content);=0A=
    var tagName =3D element.tagName.toUpperCase();=0A=
=0A=
    if (tagName in Element._insertionTranslations.tags) {=0A=
      $A(element.childNodes).each(function(node) { =
element.removeChild(node) });=0A=
      Element._getContentFromAnonymousElement(tagName, =
content.stripScripts())=0A=
        .each(function(node) { element.appendChild(node) });=0A=
    }=0A=
    else element.innerHTML =3D content.stripScripts();=0A=
=0A=
    content.evalScripts.bind(content).defer();=0A=
    return element;=0A=
  };=0A=
}=0A=
=0A=
if (document.createElement('div').outerHTML) {=0A=
  Element.Methods.replace =3D function(element, content) {=0A=
    element =3D $(element);=0A=
=0A=
    if (content && content.toElement) content =3D content.toElement();=0A=
    if (Object.isElement(content)) {=0A=
      element.parentNode.replaceChild(content, element);=0A=
      return element;=0A=
    }=0A=
=0A=
    content =3D Object.toHTML(content);=0A=
    var parent =3D element.parentNode, tagName =3D =
parent.tagName.toUpperCase();=0A=
=0A=
    if (Element._insertionTranslations.tags[tagName]) {=0A=
      var nextSibling =3D element.next();=0A=
      var fragments =3D Element._getContentFromAnonymousElement(tagName, =
content.stripScripts());=0A=
      parent.removeChild(element);=0A=
      if (nextSibling)=0A=
        fragments.each(function(node) { parent.insertBefore(node, =
nextSibling) });=0A=
      else=0A=
        fragments.each(function(node) { parent.appendChild(node) });=0A=
    }=0A=
    else element.outerHTML =3D content.stripScripts();=0A=
=0A=
    content.evalScripts.bind(content).defer();=0A=
    return element;=0A=
  };=0A=
}=0A=
=0A=
Element._returnOffset =3D function(l, t) {=0A=
  var result =3D [l, t];=0A=
  result.left =3D l;=0A=
  result.top =3D t;=0A=
  return result;=0A=
};=0A=
=0A=
Element._getContentFromAnonymousElement =3D function(tagName, html) {=0A=
  var div =3D new Element('div'), t =3D =
Element._insertionTranslations.tags[tagName];=0A=
  div.innerHTML =3D t[0] + html + t[1];=0A=
  t[2].times(function() { div =3D div.firstChild });=0A=
  return $A(div.childNodes);=0A=
};=0A=
=0A=
Element._insertionTranslations =3D {=0A=
  before: {=0A=
    adjacency: 'beforeBegin',=0A=
    insert: function(element, node) {=0A=
      element.parentNode.insertBefore(node, element);=0A=
    },=0A=
    initializeRange: function(element, range) {=0A=
      range.setStartBefore(element);=0A=
    }=0A=
  },=0A=
  top: {=0A=
    adjacency: 'afterBegin',=0A=
    insert: function(element, node) {=0A=
      element.insertBefore(node, element.firstChild);=0A=
    },=0A=
    initializeRange: function(element, range) {=0A=
      range.selectNodeContents(element);=0A=
      range.collapse(true);=0A=
    }=0A=
  },=0A=
  bottom: {=0A=
    adjacency: 'beforeEnd',=0A=
    insert: function(element, node) {=0A=
      element.appendChild(node);=0A=
    }=0A=
  },=0A=
  after: {=0A=
    adjacency: 'afterEnd',=0A=
    insert: function(element, node) {=0A=
      element.parentNode.insertBefore(node, element.nextSibling);=0A=
    },=0A=
    initializeRange: function(element, range) {=0A=
      range.setStartAfter(element);=0A=
    }=0A=
  },=0A=
  tags: {=0A=
    TABLE:  ['<table>',                '</table>',                   1],=0A=
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],=0A=
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],=0A=
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],=0A=
    SELECT: ['<select>',               '</select>',                  1]=0A=
  }=0A=
};=0A=
=0A=
(function() {=0A=
  this.bottom.initializeRange =3D this.top.initializeRange;=0A=
  Object.extend(this.tags, {=0A=
    THEAD: this.tags.TBODY,=0A=
    TFOOT: this.tags.TBODY,=0A=
    TH:    this.tags.TD=0A=
  });=0A=
}).call(Element._insertionTranslations);=0A=
=0A=
Element.Methods.Simulated =3D {=0A=
  hasAttribute: function(element, attribute) {=0A=
    attribute =3D Element._attributeTranslations.has[attribute] || =
attribute;=0A=
    var node =3D $(element).getAttributeNode(attribute);=0A=
    return node && node.specified;=0A=
  }=0A=
};=0A=
=0A=
Element.Methods.ByTag =3D { };=0A=
=0A=
Object.extend(Element, Element.Methods);=0A=
=0A=
if (!Prototype.BrowserFeatures.ElementExtensions &&=0A=
    document.createElement('div').__proto__) {=0A=
  window.HTMLElement =3D { };=0A=
  window.HTMLElement.prototype =3D =
document.createElement('div').__proto__;=0A=
  Prototype.BrowserFeatures.ElementExtensions =3D true;=0A=
}=0A=
=0A=
Element.extend =3D (function() {=0A=
  if (Prototype.BrowserFeatures.SpecificElementExtensions)=0A=
    return Prototype.K;=0A=
=0A=
  var Methods =3D { }, ByTag =3D Element.Methods.ByTag;=0A=
=0A=
  var extend =3D Object.extend(function(element) {=0A=
    if (!element || element._extendedByPrototype ||=0A=
        element.nodeType !=3D 1 || element =3D=3D window) return element;=0A=
=0A=
    var methods =3D Object.clone(Methods),=0A=
      tagName =3D element.tagName, property, value;=0A=
=0A=
    // extend methods for specific tags=0A=
    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);=0A=
=0A=
    for (property in methods) {=0A=
      value =3D methods[property];=0A=
      if (Object.isFunction(value) && !(property in element))=0A=
        element[property] =3D value.methodize();=0A=
    }=0A=
=0A=
    element._extendedByPrototype =3D Prototype.emptyFunction;=0A=
    return element;=0A=
=0A=
  }, {=0A=
    refresh: function() {=0A=
      // extend methods for all tags (Safari doesn't need this)=0A=
      if (!Prototype.BrowserFeatures.ElementExtensions) {=0A=
        Object.extend(Methods, Element.Methods);=0A=
        Object.extend(Methods, Element.Methods.Simulated);=0A=
      }=0A=
    }=0A=
  });=0A=
=0A=
  extend.refresh();=0A=
  return extend;=0A=
})();=0A=
=0A=
Element.hasAttribute =3D function(element, attribute) {=0A=
  if (element.hasAttribute) return element.hasAttribute(attribute);=0A=
  return Element.Methods.Simulated.hasAttribute(element, attribute);=0A=
};=0A=
=0A=
Element.addMethods =3D function(methods) {=0A=
  var F =3D Prototype.BrowserFeatures, T =3D Element.Methods.ByTag;=0A=
=0A=
  if (!methods) {=0A=
    Object.extend(Form, Form.Methods);=0A=
    Object.extend(Form.Element, Form.Element.Methods);=0A=
    Object.extend(Element.Methods.ByTag, {=0A=
      "FORM":     Object.clone(Form.Methods),=0A=
      "INPUT":    Object.clone(Form.Element.Methods),=0A=
      "SELECT":   Object.clone(Form.Element.Methods),=0A=
      "TEXTAREA": Object.clone(Form.Element.Methods)=0A=
    });=0A=
  }=0A=
=0A=
  if (arguments.length =3D=3D 2) {=0A=
    var tagName =3D methods;=0A=
    methods =3D arguments[1];=0A=
  }=0A=
=0A=
  if (!tagName) Object.extend(Element.Methods, methods || { });=0A=
  else {=0A=
    if (Object.isArray(tagName)) tagName.each(extend);=0A=
    else extend(tagName);=0A=
  }=0A=
=0A=
  function extend(tagName) {=0A=
    tagName =3D tagName.toUpperCase();=0A=
    if (!Element.Methods.ByTag[tagName])=0A=
      Element.Methods.ByTag[tagName] =3D { };=0A=
    Object.extend(Element.Methods.ByTag[tagName], methods);=0A=
  }=0A=
=0A=
  function copy(methods, destination, onlyIfAbsent) {=0A=
    onlyIfAbsent =3D onlyIfAbsent || false;=0A=
    for (var property in methods) {=0A=
      var value =3D methods[property];=0A=
      if (!Object.isFunction(value)) continue;=0A=
      if (!onlyIfAbsent || !(property in destination))=0A=
        destination[property] =3D value.methodize();=0A=
    }=0A=
  }=0A=
=0A=
  function findDOMClass(tagName) {=0A=
    var klass;=0A=
    var trans =3D {=0A=
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",=0A=
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": =
"DList",=0A=
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": =
"Heading",=0A=
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",=0A=
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", =
"CAPTION":=0A=
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":=0A=
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", =
"TR":=0A=
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":=0A=
      "FrameSet", "IFRAME": "IFrame"=0A=
    };=0A=
    if (trans[tagName]) klass =3D 'HTML' + trans[tagName] + 'Element';=0A=
    if (window[klass]) return window[klass];=0A=
    klass =3D 'HTML' + tagName + 'Element';=0A=
    if (window[klass]) return window[klass];=0A=
    klass =3D 'HTML' + tagName.capitalize() + 'Element';=0A=
    if (window[klass]) return window[klass];=0A=
=0A=
    window[klass] =3D { };=0A=
    window[klass].prototype =3D =
document.createElement(tagName).__proto__;=0A=
    return window[klass];=0A=
  }=0A=
=0A=
  if (F.ElementExtensions) {=0A=
    copy(Element.Methods, HTMLElement.prototype);=0A=
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);=0A=
  }=0A=
=0A=
  if (F.SpecificElementExtensions) {=0A=
    for (var tag in Element.Methods.ByTag) {=0A=
      var klass =3D findDOMClass(tag);=0A=
      if (Object.isUndefined(klass)) continue;=0A=
      copy(T[tag], klass.prototype);=0A=
    }=0A=
  }=0A=
=0A=
  Object.extend(Element, Element.Methods);=0A=
  delete Element.ByTag;=0A=
=0A=
  if (Element.extend.refresh) Element.extend.refresh();=0A=
  Element.cache =3D { };=0A=
};=0A=
=0A=
document.viewport =3D {=0A=
  getDimensions: function() {=0A=
    var dimensions =3D { };=0A=
    $w('width height').each(function(d) {=0A=
      var D =3D d.capitalize();=0A=
      dimensions[d] =3D self['inner' + D] ||=0A=
       (document.documentElement['client' + D] || document.body['client' =
+ D]);=0A=
    });=0A=
    return dimensions;=0A=
  },=0A=
=0A=
  getWidth: function() {=0A=
    return this.getDimensions().width;=0A=
  },=0A=
=0A=
  getHeight: function() {=0A=
    return this.getDimensions().height;=0A=
  },=0A=
=0A=
  getScrollOffsets: function() {=0A=
    return Element._returnOffset(=0A=
      window.pageXOffset || document.documentElement.scrollLeft || =
document.body.scrollLeft,=0A=
      window.pageYOffset || document.documentElement.scrollTop || =
document.body.scrollTop);=0A=
  }=0A=
};=0A=
/* Portions of the Selector class are derived from Jack Slocum=E2=80=99s =
DomQuery,=0A=
 * part of YUI-Ext version 0.40, distributed under the terms of an =
MIT-style=0A=
 * license.  Please see http://www.yui-ext.com/ for more information. */=0A=
=0A=
var Selector =3D Class.create({=0A=
  initialize: function(expression) {=0A=
    this.expression =3D expression.strip();=0A=
    this.compileMatcher();=0A=
  },=0A=
=0A=
  compileMatcher: function() {=0A=
    // Selectors with namespaced attributes can't use the XPath version=0A=
    if (Prototype.BrowserFeatures.XPath && =
!(/(\[[\w-]*?:|:checked)/).test(this.expression))=0A=
      return this.compileXPathMatcher();=0A=
=0A=
    var e =3D this.expression, ps =3D Selector.patterns, h =3D =
Selector.handlers,=0A=
        c =3D Selector.criteria, le, p, m;=0A=
=0A=
    if (Selector._cache[e]) {=0A=
      this.matcher =3D Selector._cache[e];=0A=
      return;=0A=
    }=0A=
=0A=
    this.matcher =3D ["this.matcher =3D function(root) {",=0A=
                    "var r =3D root, h =3D Selector.handlers, c =3D =
false, n;"];=0A=
=0A=
    while (e && le !=3D e && (/\S/).test(e)) {=0A=
      le =3D e;=0A=
      for (var i in ps) {=0A=
        p =3D ps[i];=0A=
        if (m =3D e.match(p)) {=0A=
          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :=0A=
    	      new Template(c[i]).evaluate(m));=0A=
          e =3D e.replace(m[0], '');=0A=
          break;=0A=
        }=0A=
      }=0A=
    }=0A=
=0A=
    this.matcher.push("return h.unique(n);\n}");=0A=
    eval(this.matcher.join('\n'));=0A=
    Selector._cache[this.expression] =3D this.matcher;=0A=
  },=0A=
=0A=
  compileXPathMatcher: function() {=0A=
    var e =3D this.expression, ps =3D Selector.patterns,=0A=
        x =3D Selector.xpath, le, m;=0A=
=0A=
    if (Selector._cache[e]) {=0A=
      this.xpath =3D Selector._cache[e]; return;=0A=
    }=0A=
=0A=
    this.matcher =3D ['.//*'];=0A=
    while (e && le !=3D e && (/\S/).test(e)) {=0A=
      le =3D e;=0A=
      for (var i in ps) {=0A=
        if (m =3D e.match(ps[i])) {=0A=
          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :=0A=
            new Template(x[i]).evaluate(m));=0A=
          e =3D e.replace(m[0], '');=0A=
          break;=0A=
        }=0A=
      }=0A=
    }=0A=
=0A=
    this.xpath =3D this.matcher.join('');=0A=
    Selector._cache[this.expression] =3D this.xpath;=0A=
  },=0A=
=0A=
  findElements: function(root) {=0A=
    root =3D root || document;=0A=
    if (this.xpath) return document._getElementsByXPath(this.xpath, =
root);=0A=
    return this.matcher(root);=0A=
  },=0A=
=0A=
  match: function(element) {=0A=
    this.tokens =3D [];=0A=
=0A=
    var e =3D this.expression, ps =3D Selector.patterns, as =3D =
Selector.assertions;=0A=
    var le, p, m;=0A=
=0A=
    while (e && le !=3D=3D e && (/\S/).test(e)) {=0A=
      le =3D e;=0A=
      for (var i in ps) {=0A=
        p =3D ps[i];=0A=
        if (m =3D e.match(p)) {=0A=
          // use the Selector.assertions methods unless the selector=0A=
          // is too complex.=0A=
          if (as[i]) {=0A=
            this.tokens.push([i, Object.clone(m)]);=0A=
            e =3D e.replace(m[0], '');=0A=
          } else {=0A=
            // reluctantly do a document-wide search=0A=
            // and look for a match in the array=0A=
            return this.findElements(document).include(element);=0A=
          }=0A=
        }=0A=
      }=0A=
    }=0A=
=0A=
    var match =3D true, name, matches;=0A=
    for (var i =3D 0, token; token =3D this.tokens[i]; i++) {=0A=
      name =3D token[0], matches =3D token[1];=0A=
      if (!Selector.assertions[name](element, matches)) {=0A=
        match =3D false; break;=0A=
      }=0A=
    }=0A=
=0A=
    return match;=0A=
  },=0A=
=0A=
  toString: function() {=0A=
    return this.expression;=0A=
  },=0A=
=0A=
  inspect: function() {=0A=
    return "#<Selector:" + this.expression.inspect() + ">";=0A=
  }=0A=
});=0A=
=0A=
Object.extend(Selector, {=0A=
  _cache: { },=0A=
=0A=
  xpath: {=0A=
    descendant:   "//*",=0A=
    child:        "/*",=0A=
    adjacent:     "/following-sibling::*[1]",=0A=
    laterSibling: '/following-sibling::*',=0A=
    tagName:      function(m) {=0A=
      if (m[1] =3D=3D '*') return '';=0A=
      return "[local-name()=3D'" + m[1].toLowerCase() +=0A=
             "' or local-name()=3D'" + m[1].toUpperCase() + "']";=0A=
    },=0A=
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",=0A=
    id:           "[@id=3D'#{1}']",=0A=
    attrPresence: "[@#{1}]",=0A=
    attr: function(m) {=0A=
      m[3] =3D m[5] || m[6];=0A=
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);=0A=
    },=0A=
    pseudo: function(m) {=0A=
      var h =3D Selector.xpath.pseudos[m[1]];=0A=
      if (!h) return '';=0A=
      if (Object.isFunction(h)) return h(m);=0A=
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);=0A=
    },=0A=
    operators: {=0A=
      '=3D':  "[@#{1}=3D'#{3}']",=0A=
      '!=3D': "[@#{1}!=3D'#{3}']",=0A=
      '^=3D': "[starts-with(@#{1}, '#{3}')]",=0A=
      '$=3D': "[substring(@#{1}, (string-length(@#{1}) - =
string-length('#{3}') + 1))=3D'#{3}']",=0A=
      '*=3D': "[contains(@#{1}, '#{3}')]",=0A=
      '~=3D': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",=0A=
      '|=3D': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"=0A=
    },=0A=
    pseudos: {=0A=
      'first-child': '[not(preceding-sibling::*)]',=0A=
      'last-child':  '[not(following-sibling::*)]',=0A=
      'only-child':  '[not(preceding-sibling::* or =
following-sibling::*)]',=0A=
      'empty':       "[count(*) =3D 0 and (count(text()) =3D 0 or =
translate(text(), ' \t\r\n', '') =3D '')]",=0A=
      'checked':     "[@checked]",=0A=
      'disabled':    "[@disabled]",=0A=
      'enabled':     "[not(@disabled)]",=0A=
      'not': function(m) {=0A=
        var e =3D m[6], p =3D Selector.patterns,=0A=
            x =3D Selector.xpath, le, m, v;=0A=
=0A=
        var exclusion =3D [];=0A=
        while (e && le !=3D e && (/\S/).test(e)) {=0A=
          le =3D e;=0A=
          for (var i in p) {=0A=
            if (m =3D e.match(p[i])) {=0A=
              v =3D Object.isFunction(x[i]) ? x[i](m) : new =
Template(x[i]).evaluate(m);=0A=
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");=0A=
              e =3D e.replace(m[0], '');=0A=
              break;=0A=
            }=0A=
          }=0A=
        }=0A=
        return "[not(" + exclusion.join(" and ") + ")]";=0A=
      },=0A=
      'nth-child':      function(m) {=0A=
        return =
Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);=0A=
      },=0A=
      'nth-last-child': function(m) {=0A=
        return =
Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);=0A=
      },=0A=
      'nth-of-type':    function(m) {=0A=
        return Selector.xpath.pseudos.nth("position() ", m);=0A=
      },=0A=
      'nth-last-of-type': function(m) {=0A=
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", =
m);=0A=
      },=0A=
      'first-of-type':  function(m) {=0A=
        m[6] =3D "1"; return Selector.xpath.pseudos['nth-of-type'](m);=0A=
      },=0A=
      'last-of-type':   function(m) {=0A=
        m[6] =3D "1"; return =
Selector.xpath.pseudos['nth-last-of-type'](m);=0A=
      },=0A=
      'only-of-type':   function(m) {=0A=
        var p =3D Selector.xpath.pseudos; return p['first-of-type'](m) + =
p['last-of-type'](m);=0A=
      },=0A=
      nth: function(fragment, m) {=0A=
        var mm, formula =3D m[6], predicate;=0A=
        if (formula =3D=3D 'even') formula =3D '2n+0';=0A=
        if (formula =3D=3D 'odd')  formula =3D '2n+1';=0A=
        if (mm =3D formula.match(/^(\d+)$/)) // digit only=0A=
          return '[' + fragment + "=3D " + mm[1] + ']';=0A=
        if (mm =3D formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b=0A=
          if (mm[1] =3D=3D "-") mm[1] =3D -1;=0A=
          var a =3D mm[1] ? Number(mm[1]) : 1;=0A=
          var b =3D mm[2] ? Number(mm[2]) : 0;=0A=
          predicate =3D "[((#{fragment} - #{b}) mod #{a} =3D 0) and " +=0A=
          "((#{fragment} - #{b}) div #{a} >=3D 0)]";=0A=
          return new Template(predicate).evaluate({=0A=
            fragment: fragment, a: a, b: b });=0A=
        }=0A=
      }=0A=
    }=0A=
  },=0A=
=0A=
  criteria: {=0A=
    tagName:      'n =3D h.tagName(n, r, "#{1}", c);   c =3D false;',=0A=
    className:    'n =3D h.className(n, r, "#{1}", c); c =3D false;',=0A=
    id:           'n =3D h.id(n, r, "#{1}", c);        c =3D false;',=0A=
    attrPresence: 'n =3D h.attrPresence(n, r, "#{1}"); c =3D false;',=0A=
    attr: function(m) {=0A=
      m[3] =3D (m[5] || m[6]);=0A=
      return new Template('n =3D h.attr(n, r, "#{1}", "#{3}", "#{2}"); c =
=3D false;').evaluate(m);=0A=
    },=0A=
    pseudo: function(m) {=0A=
      if (m[6]) m[6] =3D m[6].replace(/"/g, '\\"');=0A=
      return new Template('n =3D h.pseudo(n, "#{1}", "#{6}", r, c); c =
=3D false;').evaluate(m);=0A=
    },=0A=
    descendant:   'c =3D "descendant";',=0A=
    child:        'c =3D "child";',=0A=
    adjacent:     'c =3D "adjacent";',=0A=
    laterSibling: 'c =3D "laterSibling";'=0A=
  },=0A=
=0A=
  patterns: {=0A=
    // combinators must be listed first=0A=
    // (and descendant needs to be last combinator)=0A=
    laterSibling: /^\s*~\s*/,=0A=
    child:        /^\s*>\s*/,=0A=
    adjacent:     /^\s*\+\s*/,=0A=
    descendant:   /^\s/,=0A=
=0A=
    // selectors follow=0A=
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,=0A=
    id:           /^#([\w\-\*]+)(\b|$)/,=0A=
    className:    /^\.([\w\-\*]+)(\b|$)/,=0A=
    pseudo:       =
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis=
)abled|not)(\((.*?)\))?(\b|$|(?=3D\s)|(?=3D:))/,=0A=
    attrPresence: /^\[([\w]+)\]/,=0A=
    attr:         =
/\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=3D)\s*((['"])([^\4]*?)\4|([^'"][^=
\]]*?)))?\]/=0A=
  },=0A=
=0A=
  // for Selector.match and Element#match=0A=
  assertions: {=0A=
    tagName: function(element, matches) {=0A=
      return matches[1].toUpperCase() =3D=3D =
element.tagName.toUpperCase();=0A=
    },=0A=
=0A=
    className: function(element, matches) {=0A=
      return Element.hasClassName(element, matches[1]);=0A=
    },=0A=
=0A=
    id: function(element, matches) {=0A=
      return element.id =3D=3D=3D matches[1];=0A=
    },=0A=
=0A=
    attrPresence: function(element, matches) {=0A=
      return Element.hasAttribute(element, matches[1]);=0A=
    },=0A=
=0A=
    attr: function(element, matches) {=0A=
      var nodeValue =3D Element.readAttribute(element, matches[1]);=0A=
      return Selector.operators[matches[2]](nodeValue, matches[3]);=0A=
    }=0A=
  },=0A=
=0A=
  handlers: {=0A=
    // UTILITY FUNCTIONS=0A=
    // joins two collections=0A=
    concat: function(a, b) {=0A=
      for (var i =3D 0, node; node =3D b[i]; i++)=0A=
        a.push(node);=0A=
      return a;=0A=
    },=0A=
=0A=
    // marks an array of nodes for counting=0A=
    mark: function(nodes) {=0A=
      for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
        node._counted =3D true;=0A=
      return nodes;=0A=
    },=0A=
=0A=
    unmark: function(nodes) {=0A=
      for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
        node._counted =3D undefined;=0A=
      return nodes;=0A=
    },=0A=
=0A=
    // mark each child node with its position (for nth calls)=0A=
    // "ofType" flag indicates whether we're indexing for nth-of-type=0A=
    // rather than nth-child=0A=
    index: function(parentNode, reverse, ofType) {=0A=
      parentNode._counted =3D true;=0A=
      if (reverse) {=0A=
        for (var nodes =3D parentNode.childNodes, i =3D nodes.length - =
1, j =3D 1; i >=3D 0; i--) {=0A=
          var node =3D nodes[i];=0A=
          if (node.nodeType =3D=3D 1 && (!ofType || node._counted)) =
node.nodeIndex =3D j++;=0A=
        }=0A=
      } else {=0A=
        for (var i =3D 0, j =3D 1, nodes =3D parentNode.childNodes; node =
=3D nodes[i]; i++)=0A=
          if (node.nodeType =3D=3D 1 && (!ofType || node._counted)) =
node.nodeIndex =3D j++;=0A=
      }=0A=
    },=0A=
=0A=
    // filters out duplicates and extends all nodes=0A=
    unique: function(nodes) {=0A=
      if (nodes.length =3D=3D 0) return nodes;=0A=
      var results =3D [], n;=0A=
      for (var i =3D 0, l =3D nodes.length; i < l; i++)=0A=
        if (!(n =3D nodes[i])._counted) {=0A=
          n._counted =3D true;=0A=
          results.push(Element.extend(n));=0A=
        }=0A=
      return Selector.handlers.unmark(results);=0A=
    },=0A=
=0A=
    // COMBINATOR FUNCTIONS=0A=
    descendant: function(nodes) {=0A=
      var h =3D Selector.handlers;=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        h.concat(results, node.getElementsByTagName('*'));=0A=
      return results;=0A=
    },=0A=
=0A=
    child: function(nodes) {=0A=
      var h =3D Selector.handlers;=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++) {=0A=
        for (var j =3D 0, children =3D [], child; child =3D =
node.childNodes[j]; j++)=0A=
          if (child.nodeType =3D=3D 1 && child.tagName !=3D '!') =
results.push(child);=0A=
      }=0A=
      return results;=0A=
    },=0A=
=0A=
    adjacent: function(nodes) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++) {=0A=
        var next =3D this.nextElementSibling(node);=0A=
        if (next) results.push(next);=0A=
      }=0A=
      return results;=0A=
    },=0A=
=0A=
    laterSibling: function(nodes) {=0A=
      var h =3D Selector.handlers;=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        h.concat(results, Element.nextSiblings(node));=0A=
      return results;=0A=
    },=0A=
=0A=
    nextElementSibling: function(node) {=0A=
      while (node =3D node.nextSibling)=0A=
	      if (node.nodeType =3D=3D 1) return node;=0A=
      return null;=0A=
    },=0A=
=0A=
    previousElementSibling: function(node) {=0A=
      while (node =3D node.previousSibling)=0A=
        if (node.nodeType =3D=3D 1) return node;=0A=
      return null;=0A=
    },=0A=
=0A=
    // TOKEN FUNCTIONS=0A=
    tagName: function(nodes, root, tagName, combinator) {=0A=
      tagName =3D tagName.toUpperCase();=0A=
      var results =3D [], h =3D Selector.handlers;=0A=
      if (nodes) {=0A=
        if (combinator) {=0A=
          // fastlane for ordinary descendant combinators=0A=
          if (combinator =3D=3D "descendant") {=0A=
            for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
              h.concat(results, node.getElementsByTagName(tagName));=0A=
            return results;=0A=
          } else nodes =3D this[combinator](nodes);=0A=
          if (tagName =3D=3D "*") return nodes;=0A=
        }=0A=
        for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
          if (node.tagName.toUpperCase() =3D=3D tagName) =
results.push(node);=0A=
        return results;=0A=
      } else return root.getElementsByTagName(tagName);=0A=
    },=0A=
=0A=
    id: function(nodes, root, id, combinator) {=0A=
      var targetNode =3D $(id), h =3D Selector.handlers;=0A=
      if (!targetNode) return [];=0A=
      if (!nodes && root =3D=3D document) return [targetNode];=0A=
      if (nodes) {=0A=
        if (combinator) {=0A=
          if (combinator =3D=3D 'child') {=0A=
            for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
              if (targetNode.parentNode =3D=3D node) return [targetNode];=0A=
          } else if (combinator =3D=3D 'descendant') {=0A=
            for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
              if (Element.descendantOf(targetNode, node)) return =
[targetNode];=0A=
          } else if (combinator =3D=3D 'adjacent') {=0A=
            for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
              if (Selector.handlers.previousElementSibling(targetNode) =
=3D=3D node)=0A=
                return [targetNode];=0A=
          } else nodes =3D h[combinator](nodes);=0A=
        }=0A=
        for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
          if (node =3D=3D targetNode) return [targetNode];=0A=
        return [];=0A=
      }=0A=
      return (targetNode && Element.descendantOf(targetNode, root)) ? =
[targetNode] : [];=0A=
    },=0A=
=0A=
    className: function(nodes, root, className, combinator) {=0A=
      if (nodes && combinator) nodes =3D this[combinator](nodes);=0A=
      return Selector.handlers.byClassName(nodes, root, className);=0A=
    },=0A=
=0A=
    byClassName: function(nodes, root, className) {=0A=
      if (!nodes) nodes =3D Selector.handlers.descendant([root]);=0A=
      var needle =3D ' ' + className + ' ';=0A=
      for (var i =3D 0, results =3D [], node, nodeClassName; node =3D =
nodes[i]; i++) {=0A=
        nodeClassName =3D node.className;=0A=
        if (nodeClassName.length =3D=3D 0) continue;=0A=
        if (nodeClassName =3D=3D className || (' ' + nodeClassName + ' =
').include(needle))=0A=
          results.push(node);=0A=
      }=0A=
      return results;=0A=
    },=0A=
=0A=
    attrPresence: function(nodes, root, attr) {=0A=
      if (!nodes) nodes =3D root.getElementsByTagName("*");=0A=
      var results =3D [];=0A=
      for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
        if (Element.hasAttribute(node, attr)) results.push(node);=0A=
      return results;=0A=
    },=0A=
=0A=
    attr: function(nodes, root, attr, value, operator) {=0A=
      if (!nodes) nodes =3D root.getElementsByTagName("*");=0A=
      var handler =3D Selector.operators[operator], results =3D [];=0A=
      for (var i =3D 0, node; node =3D nodes[i]; i++) {=0A=
        var nodeValue =3D Element.readAttribute(node, attr);=0A=
        if (nodeValue =3D=3D=3D null) continue;=0A=
        if (handler(nodeValue, value)) results.push(node);=0A=
      }=0A=
      return results;=0A=
    },=0A=
=0A=
    pseudo: function(nodes, name, value, root, combinator) {=0A=
      if (nodes && combinator) nodes =3D this[combinator](nodes);=0A=
      if (!nodes) nodes =3D root.getElementsByTagName("*");=0A=
      return Selector.pseudos[name](nodes, value, root);=0A=
    }=0A=
  },=0A=
=0A=
  pseudos: {=0A=
    'first-child': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++) {=0A=
        if (Selector.handlers.previousElementSibling(node)) continue;=0A=
          results.push(node);=0A=
      }=0A=
      return results;=0A=
    },=0A=
    'last-child': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++) {=0A=
        if (Selector.handlers.nextElementSibling(node)) continue;=0A=
          results.push(node);=0A=
      }=0A=
      return results;=0A=
    },=0A=
    'only-child': function(nodes, value, root) {=0A=
      var h =3D Selector.handlers;=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        if (!h.previousElementSibling(node) && =
!h.nextElementSibling(node))=0A=
          results.push(node);=0A=
      return results;=0A=
    },=0A=
    'nth-child':        function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, formula, root);=0A=
    },=0A=
    'nth-last-child':   function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, formula, root, true);=0A=
    },=0A=
    'nth-of-type':      function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, formula, root, false, true);=0A=
    },=0A=
    'nth-last-of-type': function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, formula, root, true, true);=0A=
    },=0A=
    'first-of-type':    function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, "1", root, false, true);=0A=
    },=0A=
    'last-of-type':     function(nodes, formula, root) {=0A=
      return Selector.pseudos.nth(nodes, "1", root, true, true);=0A=
    },=0A=
    'only-of-type':     function(nodes, formula, root) {=0A=
      var p =3D Selector.pseudos;=0A=
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), =
formula, root);=0A=
    },=0A=
=0A=
    // handles the an+b logic=0A=
    getIndices: function(a, b, total) {=0A=
      if (a =3D=3D 0) return b > 0 ? [b] : [];=0A=
      return $R(1, total).inject([], function(memo, i) {=0A=
        if (0 =3D=3D (i - b) % a && (i - b) / a >=3D 0) memo.push(i);=0A=
        return memo;=0A=
      });=0A=
    },=0A=
=0A=
    // handles nth(-last)-child, nth(-last)-of-type, and =
(first|last)-of-type=0A=
    nth: function(nodes, formula, root, reverse, ofType) {=0A=
      if (nodes.length =3D=3D 0) return [];=0A=
      if (formula =3D=3D 'even') formula =3D '2n+0';=0A=
      if (formula =3D=3D 'odd')  formula =3D '2n+1';=0A=
      var h =3D Selector.handlers, results =3D [], indexed =3D [], m;=0A=
      h.mark(nodes);=0A=
      for (var i =3D 0, node; node =3D nodes[i]; i++) {=0A=
        if (!node.parentNode._counted) {=0A=
          h.index(node.parentNode, reverse, ofType);=0A=
          indexed.push(node.parentNode);=0A=
        }=0A=
      }=0A=
      if (formula.match(/^\d+$/)) { // just a number=0A=
        formula =3D Number(formula);=0A=
        for (var i =3D 0, node; node =3D nodes[i]; i++)=0A=
          if (node.nodeIndex =3D=3D formula) results.push(node);=0A=
      } else if (m =3D formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // =
an+b=0A=
        if (m[1] =3D=3D "-") m[1] =3D -1;=0A=
        var a =3D m[1] ? Number(m[1]) : 1;=0A=
        var b =3D m[2] ? Number(m[2]) : 0;=0A=
        var indices =3D Selector.pseudos.getIndices(a, b, nodes.length);=0A=
        for (var i =3D 0, node, l =3D indices.length; node =3D nodes[i]; =
i++) {=0A=
          for (var j =3D 0; j < l; j++)=0A=
            if (node.nodeIndex =3D=3D indices[j]) results.push(node);=0A=
        }=0A=
      }=0A=
      h.unmark(nodes);=0A=
      h.unmark(indexed);=0A=
      return results;=0A=
    },=0A=
=0A=
    'empty': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++) {=0A=
        // IE treats comments as element nodes=0A=
        if (node.tagName =3D=3D '!' || (node.firstChild && =
!node.innerHTML.match(/^\s*$/))) continue;=0A=
        results.push(node);=0A=
      }=0A=
      return results;=0A=
    },=0A=
=0A=
    'not': function(nodes, selector, root) {=0A=
      var h =3D Selector.handlers, selectorType, m;=0A=
      var exclusions =3D new Selector(selector).findElements(root);=0A=
      h.mark(exclusions);=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        if (!node._counted) results.push(node);=0A=
      h.unmark(exclusions);=0A=
      return results;=0A=
    },=0A=
=0A=
    'enabled': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        if (!node.disabled) results.push(node);=0A=
      return results;=0A=
    },=0A=
=0A=
    'disabled': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        if (node.disabled) results.push(node);=0A=
      return results;=0A=
    },=0A=
=0A=
    'checked': function(nodes, value, root) {=0A=
      for (var i =3D 0, results =3D [], node; node =3D nodes[i]; i++)=0A=
        if (node.checked) results.push(node);=0A=
      return results;=0A=
    }=0A=
  },=0A=
=0A=
  operators: {=0A=
    '=3D':  function(nv, v) { return nv =3D=3D v; },=0A=
    '!=3D': function(nv, v) { return nv !=3D v; },=0A=
    '^=3D': function(nv, v) { return nv.startsWith(v); },=0A=
    '$=3D': function(nv, v) { return nv.endsWith(v); },=0A=
    '*=3D': function(nv, v) { return nv.include(v); },=0A=
    '~=3D': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + =
' '); },=0A=
    '|=3D': function(nv, v) { return ('-' + nv.toUpperCase() + =
'-').include('-' + v.toUpperCase() + '-'); }=0A=
  },=0A=
=0A=
  matchElements: function(elements, expression) {=0A=
    var matches =3D new Selector(expression).findElements(), h =3D =
Selector.handlers;=0A=
    h.mark(matches);=0A=
    for (var i =3D 0, results =3D [], element; element =3D elements[i]; =
i++)=0A=
      if (element._counted) results.push(element);=0A=
    h.unmark(matches);=0A=
    return results;=0A=
  },=0A=
=0A=
  findElement: function(elements, expression, index) {=0A=
    if (Object.isNumber(expression)) {=0A=
      index =3D expression; expression =3D false;=0A=
    }=0A=
    return Selector.matchElements(elements, expression || '*')[index || =
0];=0A=
  },=0A=
=0A=
  findChildElements: function(element, expressions) {=0A=
    var exprs =3D expressions.join(','), expressions =3D [];=0A=
    exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {=0A=
      expressions.push(m[1].strip());=0A=
    });=0A=
    var results =3D [], h =3D Selector.handlers;=0A=
    for (var i =3D 0, l =3D expressions.length, selector; i < l; i++) {=0A=
      selector =3D new Selector(expressions[i].strip());=0A=
      h.concat(results, selector.findElements(element));=0A=
    }=0A=
    return (l > 1) ? h.unique(results) : results;=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, options) {=0A=
    if (typeof options !=3D 'object') options =3D { hash: !!options };=0A=
    else if (options.hash =3D=3D=3D undefined) options.hash =3D true;=0A=
    var key, value, submitted =3D false, submit =3D options.submit;=0A=
=0A=
    var data =3D elements.inject({ }, function(result, element) {=0A=
      if (!element.disabled && element.name) {=0A=
        key =3D element.name; value =3D $(element).getValue();=0A=
        if (value !=3D null && (element.type !=3D 'submit' || =
(!submitted &&=0A=
            submit !=3D=3D false && (!submit || key =3D=3D submit) && =
(submitted =3D true)))) {=0A=
          if (key in result) {=0A=
            // a key is already present; construct an array of values=0A=
            if (!Object.isArray(result[key])) 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 options.hash ? data : Object.toQueryString(data);=0A=
  }=0A=
};=0A=
=0A=
Form.Methods =3D {=0A=
  serialize: function(form, options) {=0A=
    return Form.serializeElements(Form.getElements(form), options);=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(form).invoke('disable');=0A=
    return form;=0A=
  },=0A=
=0A=
  enable: function(form) {=0A=
    form =3D $(form);=0A=
    Form.getElements(form).invoke('enable');=0A=
    return form;=0A=
  },=0A=
=0A=
  findFirstElement: function(form) {=0A=
    var elements =3D $(form).getElements().findAll(function(element) {=0A=
      return 'hidden' !=3D element.type && !element.disabled;=0A=
    });=0A=
    var firstByIndex =3D elements.findAll(function(element) {=0A=
      return element.hasAttribute('tabIndex') && element.tabIndex >=3D 0;=0A=
    }).sortBy(function(element) { return element.tabIndex }).first();=0A=
=0A=
    return firstByIndex ? firstByIndex : elements.find(function(element) =
{=0A=
      return ['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=
  request: function(form, options) {=0A=
    form =3D $(form), options =3D Object.clone(options || { });=0A=
=0A=
    var params =3D options.parameters, action =3D =
form.readAttribute('action') || '';=0A=
    if (action.blank()) action =3D window.location.href;=0A=
    options.parameters =3D form.serialize(true);=0A=
=0A=
    if (params) {=0A=
      if (Object.isString(params)) params =3D params.toQueryParams();=0A=
      Object.extend(options.parameters, params);=0A=
    }=0A=
=0A=
    if (form.hasAttribute('method') && !options.method)=0A=
      options.method =3D form.method;=0A=
=0A=
    return new Ajax.Request(action, options);=0A=
  }=0A=
};=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 Object.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=
  setValue: function(element, value) {=0A=
    element =3D $(element);=0A=
    var method =3D element.tagName.toLowerCase();=0A=
    Form.Element.Serializers[method](element, value);=0A=
    return 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=
    try {=0A=
      element.focus();=0A=
      if (element.select && (element.tagName.toLowerCase() !=3D 'input' =
||=0A=
          !['button', 'reset', 'submit'].include(element.type)))=0A=
        element.select();=0A=
    } catch (e) { }=0A=
    return element;=0A=
  },=0A=
=0A=
  disable: function(element) {=0A=
    element =3D $(element);=0A=
    element.blur();=0A=
    element.disabled =3D true;=0A=
    return element;=0A=
  },=0A=
=0A=
  enable: function(element) {=0A=
    element =3D $(element);=0A=
    element.disabled =3D false;=0A=
    return element;=0A=
  }=0A=
};=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
var Field =3D Form.Element;=0A=
var $F =3D Form.Element.Methods.getValue;=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
Form.Element.Serializers =3D {=0A=
  input: function(element, value) {=0A=
    switch (element.type.toLowerCase()) {=0A=
      case 'checkbox':=0A=
      case 'radio':=0A=
        return Form.Element.Serializers.inputSelector(element, value);=0A=
      default:=0A=
        return Form.Element.Serializers.textarea(element, value);=0A=
    }=0A=
  },=0A=
=0A=
  inputSelector: function(element, value) {=0A=
    if (value =3D=3D=3D undefined) return element.checked ? =
element.value : null;=0A=
    else element.checked =3D !!value;=0A=
  },=0A=
=0A=
  textarea: function(element, value) {=0A=
    if (value =3D=3D=3D undefined) return element.value;=0A=
    else element.value =3D value;=0A=
  },=0A=
=0A=
  select: function(element, index) {=0A=
    if (index =3D=3D=3D undefined)=0A=
      return this[element.type =3D=3D 'select-one' ?=0A=
        'selectOne' : 'selectMany'](element);=0A=
    else {=0A=
      var opt, value, single =3D !Object.isArray(index);=0A=
      for (var i =3D 0, length =3D element.length; i < length; i++) {=0A=
        opt =3D element.options[i];=0A=
        value =3D this.optionValue(opt);=0A=
        if (single) {=0A=
          if (value =3D=3D index) {=0A=
            opt.selected =3D true;=0A=
            return;=0A=
          }=0A=
        }=0A=
        else opt.selected =3D index.include(value);=0A=
      }=0A=
    }=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 Class.create(PeriodicalExecuter, {=0A=
  initialize: function($super, element, frequency, callback) {=0A=
    $super(callback, frequency);=0A=
    this.element   =3D $(element);=0A=
    this.lastValue =3D this.getValue();=0A=
  },=0A=
=0A=
  execute: function() {=0A=
    var value =3D this.getValue();=0A=
    if (Object.isString(this.lastValue) && Object.isString(value) ?=0A=
        this.lastValue !=3D value : String(this.lastValue) !=3D =
String(value)) {=0A=
      this.callback(this.element, value);=0A=
      this.lastValue =3D value;=0A=
    }=0A=
  }=0A=
});=0A=
=0A=
Form.Element.Observer =3D Class.create(Abstract.TimedObserver, {=0A=
  getValue: function() {=0A=
    return Form.Element.getValue(this.element);=0A=
  }=0A=
});=0A=
=0A=
Form.Observer =3D Class.create(Abstract.TimedObserver, {=0A=
  getValue: function() {=0A=
    return Form.serialize(this.element);=0A=
  }=0A=
});=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
Abstract.EventObserver =3D Class.create({=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, 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(Abstract.EventObserver, {=0A=
  getValue: function() {=0A=
    return Form.Element.getValue(this.element);=0A=
  }=0A=
});=0A=
=0A=
Form.EventObserver =3D Class.create(Abstract.EventObserver, {=0A=
  getValue: function() {=0A=
    return Form.serialize(this.element);=0A=
  }=0A=
});=0A=
if (!window.Event) var Event =3D { };=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=
  KEY_INSERT:   45,=0A=
=0A=
  cache: { },=0A=
=0A=
  relatedTarget: function(event) {=0A=
    var element;=0A=
    switch(event.type) {=0A=
      case 'mouseover': element =3D event.fromElement; break;=0A=
      case 'mouseout':  element =3D event.toElement;   break;=0A=
      default: return null;=0A=
    }=0A=
    return Element.extend(element);=0A=
  }=0A=
});=0A=
=0A=
Event.Methods =3D (function() {=0A=
  var isButton;=0A=
=0A=
  if (Prototype.Browser.IE) {=0A=
    var buttonMap =3D { 0: 1, 1: 4, 2: 2 };=0A=
    isButton =3D function(event, code) {=0A=
      return event.button =3D=3D buttonMap[code];=0A=
    };=0A=
=0A=
  } else if (Prototype.Browser.WebKit) {=0A=
    isButton =3D function(event, code) {=0A=
      switch (code) {=0A=
        case 0: return event.which =3D=3D 1 && !event.metaKey;=0A=
        case 1: return event.which =3D=3D 1 && event.metaKey;=0A=
        default: return false;=0A=
      }=0A=
    };=0A=
=0A=
  } else {=0A=
    isButton =3D function(event, code) {=0A=
      return event.which ? (event.which =3D=3D=3D code + 1) : =
(event.button =3D=3D=3D code);=0A=
    };=0A=
  }=0A=
=0A=
  return {=0A=
    isLeftClick:   function(event) { return isButton(event, 0) },=0A=
    isMiddleClick: function(event) { return isButton(event, 1) },=0A=
    isRightClick:  function(event) { return isButton(event, 2) },=0A=
=0A=
    element: function(event) {=0A=
      var node =3D Event.extend(event).target;=0A=
      return Element.extend(node.nodeType =3D=3D Node.TEXT_NODE ? =
node.parentNode : node);=0A=
    },=0A=
=0A=
    findElement: function(event, expression) {=0A=
      var element =3D Event.element(event);=0A=
      return element.match(expression) ? element : =
element.up(expression);=0A=
    },=0A=
=0A=
    pointer: function(event) {=0A=
      return {=0A=
        x: event.pageX || (event.clientX +=0A=
          (document.documentElement.scrollLeft || =
document.body.scrollLeft)),=0A=
        y: event.pageY || (event.clientY +=0A=
          (document.documentElement.scrollTop || =
document.body.scrollTop))=0A=
      };=0A=
    },=0A=
=0A=
    pointerX: function(event) { return Event.pointer(event).x },=0A=
    pointerY: function(event) { return Event.pointer(event).y },=0A=
=0A=
    stop: function(event) {=0A=
      Event.extend(event);=0A=
      event.preventDefault();=0A=
      event.stopPropagation();=0A=
      event.stopped =3D true;=0A=
    }=0A=
  };=0A=
})();=0A=
=0A=
Event.extend =3D (function() {=0A=
  var methods =3D Object.keys(Event.Methods).inject({ }, function(m, =
name) {=0A=
    m[name] =3D Event.Methods[name].methodize();=0A=
    return m;=0A=
  });=0A=
=0A=
  if (Prototype.Browser.IE) {=0A=
    Object.extend(methods, {=0A=
      stopPropagation: function() { this.cancelBubble =3D true },=0A=
      preventDefault:  function() { this.returnValue =3D false },=0A=
      inspect: function() { return "[object Event]" }=0A=
    });=0A=
=0A=
    return function(event) {=0A=
      if (!event) return false;=0A=
      if (event._extendedByPrototype) return event;=0A=
=0A=
      event._extendedByPrototype =3D Prototype.emptyFunction;=0A=
      var pointer =3D Event.pointer(event);=0A=
      Object.extend(event, {=0A=
        target: event.srcElement,=0A=
        relatedTarget: Event.relatedTarget(event),=0A=
        pageX:  pointer.x,=0A=
        pageY:  pointer.y=0A=
      });=0A=
      return Object.extend(event, methods);=0A=
    };=0A=
=0A=
  } else {=0A=
    Event.prototype =3D Event.prototype || =
document.createEvent("HTMLEvents").__proto__;=0A=
    Object.extend(Event.prototype, methods);=0A=
    return Prototype.K;=0A=
  }=0A=
})();=0A=
=0A=
Object.extend(Event, (function() {=0A=
  var cache =3D Event.cache;=0A=
=0A=
  function getEventID(element) {=0A=
    if (element._eventID) return element._eventID;=0A=
    arguments.callee.id =3D arguments.callee.id || 1;=0A=
    return element._eventID =3D ++arguments.callee.id;=0A=
  }=0A=
=0A=
  function getDOMEventName(eventName) {=0A=
    if (eventName && eventName.include(':')) return "dataavailable";=0A=
    return eventName;=0A=
  }=0A=
=0A=
  function getCacheForID(id) {=0A=
    return cache[id] =3D cache[id] || { };=0A=
  }=0A=
=0A=
  function getWrappersForEventName(id, eventName) {=0A=
    var c =3D getCacheForID(id);=0A=
    return c[eventName] =3D c[eventName] || [];=0A=
  }=0A=
=0A=
  function createWrapper(element, eventName, handler) {=0A=
    var id =3D getEventID(element);=0A=
    var c =3D getWrappersForEventName(id, eventName);=0A=
    if (c.pluck("handler").include(handler)) return false;=0A=
=0A=
    var wrapper =3D function(event) {=0A=
      if (!Event || !Event.extend ||=0A=
        (event.eventName && event.eventName !=3D eventName))=0A=
          return false;=0A=
=0A=
      Event.extend(event);=0A=
      handler.call(element, event)=0A=
    };=0A=
=0A=
    wrapper.handler =3D handler;=0A=
    c.push(wrapper);=0A=
    return wrapper;=0A=
  }=0A=
=0A=
  function findWrapper(id, eventName, handler) {=0A=
    var c =3D getWrappersForEventName(id, eventName);=0A=
    return c.find(function(wrapper) { return wrapper.handler =3D=3D =
handler });=0A=
  }=0A=
=0A=
  function destroyWrapper(id, eventName, handler) {=0A=
    var c =3D getCacheForID(id);=0A=
    if (!c[eventName]) return false;=0A=
    c[eventName] =3D c[eventName].without(findWrapper(id, eventName, =
handler));=0A=
  }=0A=
=0A=
  function destroyCache() {=0A=
    for (var id in cache)=0A=
      for (var eventName in cache[id])=0A=
        cache[id][eventName] =3D null;=0A=
  }=0A=
=0A=
  if (window.attachEvent) {=0A=
    window.attachEvent("onunload", destroyCache);=0A=
  }=0A=
=0A=
  return {=0A=
    observe: function(element, eventName, handler) {=0A=
      element =3D $(element);=0A=
      var name =3D getDOMEventName(eventName);=0A=
=0A=
      var wrapper =3D createWrapper(element, eventName, handler);=0A=
      if (!wrapper) return element;=0A=
=0A=
      if (element.addEventListener) {=0A=
        element.addEventListener(name, wrapper, false);=0A=
      } else {=0A=
        element.attachEvent("on" + name, wrapper);=0A=
      }=0A=
=0A=
      return element;=0A=
    },=0A=
=0A=
    stopObserving: function(element, eventName, handler) {=0A=
      element =3D $(element);=0A=
      var id =3D getEventID(element), name =3D =
getDOMEventName(eventName);=0A=
=0A=
      if (!handler && eventName) {=0A=
        getWrappersForEventName(id, eventName).each(function(wrapper) {=0A=
          element.stopObserving(eventName, wrapper.handler);=0A=
        });=0A=
        return element;=0A=
=0A=
      } else if (!eventName) {=0A=
        Object.keys(getCacheForID(id)).each(function(eventName) {=0A=
          element.stopObserving(eventName);=0A=
        });=0A=
        return element;=0A=
      }=0A=
=0A=
      var wrapper =3D findWrapper(id, eventName, handler);=0A=
      if (!wrapper) return element;=0A=
=0A=
      if (element.removeEventListener) {=0A=
        element.removeEventListener(name, wrapper, false);=0A=
      } else {=0A=
        element.detachEvent("on" + name, wrapper);=0A=
      }=0A=
=0A=
      destroyWrapper(id, eventName, handler);=0A=
=0A=
      return element;=0A=
    },=0A=
=0A=
    fire: function(element, eventName, memo) {=0A=
      element =3D $(element);=0A=
      if (element =3D=3D document && document.createEvent && =
!element.dispatchEvent)=0A=
        element =3D document.documentElement;=0A=
=0A=
      if (document.createEvent) {=0A=
        var event =3D document.createEvent("HTMLEvents");=0A=
        event.initEvent("dataavailable", true, true);=0A=
      } else {=0A=
        var event =3D document.createEventObject();=0A=
        event.eventType =3D "ondataavailable";=0A=
      }=0A=
=0A=
      event.eventName =3D eventName;=0A=
      event.memo =3D memo || { };=0A=
=0A=
      if (document.createEvent) {=0A=
        element.dispatchEvent(event);=0A=
      } else {=0A=
        element.fireEvent(event.eventType, event);=0A=
      }=0A=
=0A=
      return event;=0A=
    }=0A=
  };=0A=
})());=0A=
=0A=
Object.extend(Event, Event.Methods);=0A=
=0A=
Element.addMethods({=0A=
  fire:          Event.fire,=0A=
  observe:       Event.observe,=0A=
  stopObserving: Event.stopObserving=0A=
});=0A=
=0A=
Object.extend(document, {=0A=
  fire:          Element.Methods.fire.methodize(),=0A=
  observe:       Element.Methods.observe.methodize(),=0A=
  stopObserving: Element.Methods.stopObserving.methodize()=0A=
});=0A=
=0A=
(function() {=0A=
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,=0A=
     Matthias Miller, Dean Edwards and John Resig. */=0A=
=0A=
  var timer, fired =3D false;=0A=
=0A=
  function fireContentLoadedEvent() {=0A=
    if (fired) return;=0A=
    if (timer) window.clearInterval(timer);=0A=
    document.fire("dom:loaded");=0A=
    fired =3D true;=0A=
  }=0A=
=0A=
  if (document.addEventListener) {=0A=
    if (Prototype.Browser.WebKit) {=0A=
      timer =3D window.setInterval(function() {=0A=
        if (/loaded|complete/.test(document.readyState))=0A=
          fireContentLoadedEvent();=0A=
      }, 0);=0A=
=0A=
      Event.observe(window, "load", fireContentLoadedEvent);=0A=
=0A=
    } else {=0A=
      document.addEventListener("DOMContentLoaded",=0A=
        fireContentLoadedEvent, false);=0A=
    }=0A=
=0A=
  } else {=0A=
    document.write("<script id=3D__onDOMContentLoaded defer =
src=3D//:><\/script>");=0A=
    $("__onDOMContentLoaded").onreadystatechange =3D function() {=0A=
      if (this.readyState =3D=3D "complete") {=0A=
        this.onreadystatechange =3D null;=0A=
        fireContentLoadedEvent();=0A=
      }=0A=
    };=0A=
  }=0A=
})();=0A=
/*------------------------------- DEPRECATED =
-------------------------------*/=0A=
=0A=
Hash.toQueryString =3D Object.toQueryString;=0A=
=0A=
var Toggle =3D { display: Element.toggle };=0A=
=0A=
Element.Methods.childOf =3D Element.Methods.descendantOf;=0A=
=0A=
var Insertion =3D {=0A=
  Before: function(element, content) {=0A=
    return Element.insert(element, {before:content});=0A=
  },=0A=
=0A=
  Top: function(element, content) {=0A=
    return Element.insert(element, {top:content});=0A=
  },=0A=
=0A=
  Bottom: function(element, content) {=0A=
    return Element.insert(element, {bottom:content});=0A=
  },=0A=
=0A=
  After: function(element, content) {=0A=
    return Element.insert(element, {after:content});=0A=
  }=0A=
};=0A=
=0A=
var $continue =3D new Error('"throw $continue" is deprecated, use =
"return" instead');=0A=
=0A=
// This should be moved to script.aculo.us; notice the deprecated methods=0A=
// further below, that map to the newer Element methods.=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=
  // 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 Element.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 Element.cumulativeScrollOffset(element);=0A=
=0A=
    this.xcomp =3D x + offsetcache[0] - this.deltaX;=0A=
    this.ycomp =3D y + offsetcache[1] - this.deltaY;=0A=
    this.offset =3D Element.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=
  // Deprecation layer -- use newer Element methods now (1.5.2).=0A=
=0A=
  cumulativeOffset: Element.Methods.cumulativeOffset,=0A=
=0A=
  positionedOffset: Element.Methods.positionedOffset,=0A=
=0A=
  absolutize: function(element) {=0A=
    Position.prepare();=0A=
    return Element.absolutize(element);=0A=
  },=0A=
=0A=
  relativize: function(element) {=0A=
    Position.prepare();=0A=
    return Element.relativize(element);=0A=
  },=0A=
=0A=
  realOffset: Element.Methods.cumulativeScrollOffset,=0A=
=0A=
  offsetParent: Element.Methods.getOffsetParent,=0A=
=0A=
  page: Element.Methods.viewportOffset,=0A=
=0A=
  clone: function(source, target, options) {=0A=
    options =3D options || { };=0A=
    return Element.clonePosition(target, source, options);=0A=
  }=0A=
};=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
if (!document.getElementsByClassName) document.getElementsByClassName =
=3D function(instanceMethods){=0A=
  function iter(name) {=0A=
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' =
" + name + " ')]";=0A=
  }=0A=
=0A=
  instanceMethods.getElementsByClassName =3D =
Prototype.BrowserFeatures.XPath ?=0A=
  function(element, className) {=0A=
    className =3D className.toString().strip();=0A=
    var cond =3D /\s/.test(className) ? $w(className).map(iter).join('') =
: iter(className);=0A=
    return cond ? document._getElementsByXPath('.//*' + cond, element) : =
[];=0A=
  } : function(element, className) {=0A=
    className =3D className.toString().strip();=0A=
    var elements =3D [], classNames =3D (/\s/.test(className) ? =
$w(className) : null);=0A=
    if (!classNames && !className) return elements;=0A=
=0A=
    var nodes =3D $(element).getElementsByTagName('*');=0A=
    className =3D ' ' + className + ' ';=0A=
=0A=
    for (var i =3D 0, child, cn; child =3D nodes[i]; i++) {=0A=
      if (child.className && (cn =3D ' ' + child.className + ' ') && =
(cn.include(className) ||=0A=
          (classNames && classNames.all(function(name) {=0A=
            return !name.toString().blank() && cn.include(' ' + name + ' =
');=0A=
          }))))=0A=
        elements.push(Element.extend(child));=0A=
    }=0A=
    return elements;=0A=
  };=0A=
=0A=
  return function(className, parentElement) {=0A=
    return $(parentElement || =
document.body).getElementsByClassName(className);=0A=
  };=0A=
}(Element.Methods);=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=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
Element.addMethods();=0A=
=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/effects.js

// script.aculo.us effects.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007=0A=
=0A=
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, =
http://mir.aculo.us)=0A=
// Contributors:=0A=
//  Justin Palmer (http://encytemedia.com/)=0A=
//  Mark Pilgrim (http://diveintomark.org/)=0A=
//  Martin Bialasinki=0A=
// =0A=
// script.aculo.us is freely distributable under the terms of an =
MIT-style license.=0A=
// For details, see the script.aculo.us web site: =
http://script.aculo.us/ =0A=
=0A=
// converts rgb() and #xxx to #xxxxxx format,  =0A=
// returns self (or first argument) if not convertable  =0A=
String.prototype.parseColor =3D function() {  =0A=
  var color =3D '#';=0A=
  if (this.slice(0,4) =3D=3D 'rgb(') {  =0A=
    var cols =3D this.slice(4,this.length-1).split(',');  =0A=
    var i=3D0; do { color +=3D parseInt(cols[i]).toColorPart() } while =
(++i<3);  =0A=
  } else {  =0A=
    if (this.slice(0,1) =3D=3D '#') {  =0A=
      if (this.length=3D=3D4) for(var i=3D1;i<4;i++) color +=3D =
(this.charAt(i) + this.charAt(i)).toLowerCase();  =0A=
      if (this.length=3D=3D7) color =3D this.toLowerCase();  =0A=
    }  =0A=
  }  =0A=
  return (color.length=3D=3D7 ? color : (arguments[0] || this));  =0A=
};=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
Element.collectTextNodes =3D function(element) {  =0A=
  return $A($(element).childNodes).collect( function(node) {=0A=
    return (node.nodeType=3D=3D3 ? node.nodeValue : =0A=
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));=0A=
  }).flatten().join('');=0A=
};=0A=
=0A=
Element.collectTextNodesIgnoreClass =3D function(element, className) {  =0A=
  return $A($(element).childNodes).collect( function(node) {=0A=
    return (node.nodeType=3D=3D3 ? node.nodeValue : =0A=
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? =0A=
        Element.collectTextNodesIgnoreClass(node, className) : ''));=0A=
  }).flatten().join('');=0A=
};=0A=
=0A=
Element.setContentZoom =3D function(element, percent) {=0A=
  element =3D $(element);  =0A=
  element.setStyle({fontSize: (percent/100) + 'em'});   =0A=
  if (Prototype.Browser.WebKit) window.scrollBy(0,0);=0A=
  return element;=0A=
};=0A=
=0A=
Element.getInlineOpacity =3D function(element){=0A=
  return $(element).style.opacity || '';=0A=
};=0A=
=0A=
Element.forceRerendering =3D function(element) {=0A=
  try {=0A=
    element =3D $(element);=0A=
    var n =3D document.createTextNode(' ');=0A=
    element.appendChild(n);=0A=
    element.removeChild(n);=0A=
  } catch(e) { }=0A=
};=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
var Effect =3D {=0A=
  _elementDoesNotExistError: {=0A=
    name: 'ElementDoesNotExistError',=0A=
    message: 'The specified DOM element does not exist, but is required =
for this effect to operate'=0A=
  },=0A=
  Transitions: {=0A=
    linear: Prototype.K,=0A=
    sinoidal: function(pos) {=0A=
      return (-Math.cos(pos*Math.PI)/2) + 0.5;=0A=
    },=0A=
    reverse: function(pos) {=0A=
      return 1-pos;=0A=
    },=0A=
    flicker: function(pos) {=0A=
      var pos =3D ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;=0A=
      return pos > 1 ? 1 : pos;=0A=
    },=0A=
    wobble: function(pos) {=0A=
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;=0A=
    },=0A=
    pulse: function(pos, pulses) { =0A=
      pulses =3D pulses || 5; =0A=
      return (=0A=
        ((pos % (1/pulses)) * pulses).round() =3D=3D 0 ? =0A=
              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : =0A=
          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())=0A=
        );=0A=
    },=0A=
    spring: function(pos) { =0A=
      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); =0A=
    },=0A=
    none: function(pos) {=0A=
      return 0;=0A=
    },=0A=
    full: function(pos) {=0A=
      return 1;=0A=
    }=0A=
  },=0A=
  DefaultOptions: {=0A=
    duration:   1.0,   // seconds=0A=
    fps:        100,   // 100=3D assume 66fps max.=0A=
    sync:       false, // true for combining=0A=
    from:       0.0,=0A=
    to:         1.0,=0A=
    delay:      0.0,=0A=
    queue:      'parallel'=0A=
  },=0A=
  tagifyText: function(element) {=0A=
    var tagifyStyle =3D 'position:relative';=0A=
    if (Prototype.Browser.IE) tagifyStyle +=3D ';zoom:1';=0A=
    =0A=
    element =3D $(element);=0A=
    $A(element.childNodes).each( function(child) {=0A=
      if (child.nodeType=3D=3D3) {=0A=
        child.nodeValue.toArray().each( function(character) {=0A=
          element.insertBefore(=0A=
            new Element('span', {style: tagifyStyle}).update(=0A=
              character =3D=3D ' ' ? String.fromCharCode(160) : =
character), =0A=
              child);=0A=
        });=0A=
        Element.remove(child);=0A=
      }=0A=
    });=0A=
  },=0A=
  multiple: function(element, effect) {=0A=
    var elements;=0A=
    if (((typeof element =3D=3D 'object') || =0A=
        Object.isFunction(element)) && =0A=
       (element.length))=0A=
      elements =3D element;=0A=
    else=0A=
      elements =3D $(element).childNodes;=0A=
      =0A=
    var options =3D Object.extend({=0A=
      speed: 0.1,=0A=
      delay: 0.0=0A=
    }, arguments[2] || { });=0A=
    var masterDelay =3D options.delay;=0A=
=0A=
    $A(elements).each( function(element, index) {=0A=
      new effect(element, Object.extend(options, { delay: index * =
options.speed + masterDelay }));=0A=
    });=0A=
  },=0A=
  PAIRS: {=0A=
    'slide':  ['SlideDown','SlideUp'],=0A=
    'blind':  ['BlindDown','BlindUp'],=0A=
    'appear': ['Appear','Fade']=0A=
  },=0A=
  toggle: function(element, effect) {=0A=
    element =3D $(element);=0A=
    effect =3D (effect || 'appear').toLowerCase();=0A=
    var options =3D Object.extend({=0A=
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }=0A=
    }, arguments[2] || { });=0A=
    Effect[element.visible() ? =0A=
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, =
options);=0A=
  }=0A=
};=0A=
=0A=
Effect.DefaultOptions.transition =3D Effect.Transitions.sinoidal;=0A=
=0A=
/* ------------- core effects ------------- */=0A=
=0A=
Effect.ScopedQueue =3D Class.create(Enumerable, {=0A=
  initialize: function() {=0A=
    this.effects  =3D [];=0A=
    this.interval =3D null;    =0A=
  },=0A=
  _each: function(iterator) {=0A=
    this.effects._each(iterator);=0A=
  },=0A=
  add: function(effect) {=0A=
    var timestamp =3D new Date().getTime();=0A=
    =0A=
    var position =3D Object.isString(effect.options.queue) ? =0A=
      effect.options.queue : effect.options.queue.position;=0A=
    =0A=
    switch(position) {=0A=
      case 'front':=0A=
        // move unstarted effects after this effect  =0A=
        this.effects.findAll(function(e){ return e.state=3D=3D'idle' =
}).each( function(e) {=0A=
            e.startOn  +=3D effect.finishOn;=0A=
            e.finishOn +=3D effect.finishOn;=0A=
          });=0A=
        break;=0A=
      case 'with-last':=0A=
        timestamp =3D this.effects.pluck('startOn').max() || timestamp;=0A=
        break;=0A=
      case 'end':=0A=
        // start effect after last queued effect has finished=0A=
        timestamp =3D this.effects.pluck('finishOn').max() || timestamp;=0A=
        break;=0A=
    }=0A=
    =0A=
    effect.startOn  +=3D timestamp;=0A=
    effect.finishOn +=3D timestamp;=0A=
=0A=
    if (!effect.options.queue.limit || (this.effects.length < =
effect.options.queue.limit))=0A=
      this.effects.push(effect);=0A=
    =0A=
    if (!this.interval)=0A=
      this.interval =3D setInterval(this.loop.bind(this), 15);=0A=
  },=0A=
  remove: function(effect) {=0A=
    this.effects =3D this.effects.reject(function(e) { return =
e=3D=3Deffect });=0A=
    if (this.effects.length =3D=3D 0) {=0A=
      clearInterval(this.interval);=0A=
      this.interval =3D null;=0A=
    }=0A=
  },=0A=
  loop: function() {=0A=
    var timePos =3D new Date().getTime();=0A=
    for(var i=3D0, len=3Dthis.effects.length;i<len;i++) =0A=
      this.effects[i] && this.effects[i].loop(timePos);=0A=
  }=0A=
});=0A=
=0A=
Effect.Queues =3D {=0A=
  instances: $H(),=0A=
  get: function(queueName) {=0A=
    if (!Object.isString(queueName)) return queueName;=0A=
    =0A=
    return this.instances.get(queueName) ||=0A=
      this.instances.set(queueName, new Effect.ScopedQueue());=0A=
  }=0A=
};=0A=
Effect.Queue =3D Effect.Queues.get('global');=0A=
=0A=
Effect.Base =3D Class.create({=0A=
  position: null,=0A=
  start: function(options) {=0A=
    function codeForEvent(options,eventName){=0A=
      return (=0A=
        (options[eventName+'Internal'] ? =
'this.options.'+eventName+'Internal(this);' : '') +=0A=
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')=0A=
      );=0A=
    }=0A=
    if (options && options.transition =3D=3D=3D false) =
options.transition =3D Effect.Transitions.linear;=0A=
    this.options      =3D Object.extend(Object.extend({ =
},Effect.DefaultOptions), options || { });=0A=
    this.currentFrame =3D 0;=0A=
    this.state        =3D 'idle';=0A=
    this.startOn      =3D this.options.delay*1000;=0A=
    this.finishOn     =3D this.startOn+(this.options.duration*1000);=0A=
    this.fromToDelta  =3D this.options.to-this.options.from;=0A=
    this.totalTime    =3D this.finishOn-this.startOn;=0A=
    this.totalFrames  =3D this.options.fps*this.options.duration;=0A=
    =0A=
    eval('this.render =3D function(pos){ '+=0A=
      'if (this.state=3D=3D"idle"){this.state=3D"running";'+=0A=
      codeForEvent(this.options,'beforeSetup')+=0A=
      (this.setup ? 'this.setup();':'')+ =0A=
      codeForEvent(this.options,'afterSetup')+=0A=
      '};if (this.state=3D=3D"running"){'+=0A=
      =
'pos=3Dthis.options.transition(pos)*'+this.fromToDelta+'+'+this.options.f=
rom+';'+=0A=
      'this.position=3Dpos;'+=0A=
      codeForEvent(this.options,'beforeUpdate')+=0A=
      (this.update ? 'this.update(pos);':'')+=0A=
      codeForEvent(this.options,'afterUpdate')+=0A=
      '}}');=0A=
    =0A=
    this.event('beforeStart');=0A=
    if (!this.options.sync)=0A=
      Effect.Queues.get(Object.isString(this.options.queue) ? =0A=
        'global' : this.options.queue.scope).add(this);=0A=
  },=0A=
  loop: function(timePos) {=0A=
    if (timePos >=3D this.startOn) {=0A=
      if (timePos >=3D this.finishOn) {=0A=
        this.render(1.0);=0A=
        this.cancel();=0A=
        this.event('beforeFinish');=0A=
        if (this.finish) this.finish(); =0A=
        this.event('afterFinish');=0A=
        return;  =0A=
      }=0A=
      var pos   =3D (timePos - this.startOn) / this.totalTime,=0A=
          frame =3D (pos * this.totalFrames).round();=0A=
      if (frame > this.currentFrame) {=0A=
        this.render(pos);=0A=
        this.currentFrame =3D frame;=0A=
      }=0A=
    }=0A=
  },=0A=
  cancel: function() {=0A=
    if (!this.options.sync)=0A=
      Effect.Queues.get(Object.isString(this.options.queue) ? =0A=
        'global' : this.options.queue.scope).remove(this);=0A=
    this.state =3D 'finished';=0A=
  },=0A=
  event: function(eventName) {=0A=
    if (this.options[eventName + 'Internal']) this.options[eventName + =
'Internal'](this);=0A=
    if (this.options[eventName]) this.options[eventName](this);=0A=
  },=0A=
  inspect: function() {=0A=
    var data =3D $H();=0A=
    for(property in this)=0A=
      if (!Object.isFunction(this[property])) data.set(property, =
this[property]);=0A=
    return '#<Effect:' + data.inspect() + ',options:' + =
$H(this.options).inspect() + '>';=0A=
  }=0A=
});=0A=
=0A=
Effect.Parallel =3D Class.create(Effect.Base, {=0A=
  initialize: function(effects) {=0A=
    this.effects =3D effects || [];=0A=
    this.start(arguments[1]);=0A=
  },=0A=
  update: function(position) {=0A=
    this.effects.invoke('render', position);=0A=
  },=0A=
  finish: function(position) {=0A=
    this.effects.each( function(effect) {=0A=
      effect.render(1.0);=0A=
      effect.cancel();=0A=
      effect.event('beforeFinish');=0A=
      if (effect.finish) effect.finish(position);=0A=
      effect.event('afterFinish');=0A=
    });=0A=
  }=0A=
});=0A=
=0A=
Effect.Tween =3D Class.create(Effect.Base, {=0A=
  initialize: function(object, from, to) {=0A=
    object =3D Object.isString(object) ? $(object) : object;=0A=
    var args =3D $A(arguments), method =3D args.last(), =0A=
      options =3D args.length =3D=3D 5 ? args[3] : null;=0A=
    this.method =3D Object.isFunction(method) ? method.bind(object) :=0A=
      Object.isFunction(object[method]) ? object[method].bind(object) : =0A=
      function(value) { object[method] =3D value };=0A=
    this.start(Object.extend({ from: from, to: to }, options || { }));=0A=
  },=0A=
  update: function(position) {=0A=
    this.method(position);=0A=
  }=0A=
});=0A=
=0A=
Effect.Event =3D Class.create(Effect.Base, {=0A=
  initialize: function() {=0A=
    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));=0A=
  },=0A=
  update: Prototype.emptyFunction=0A=
});=0A=
=0A=
Effect.Opacity =3D Class.create(Effect.Base, {=0A=
  initialize: function(element) {=0A=
    this.element =3D $(element);=0A=
    if (!this.element) throw(Effect._elementDoesNotExistError);=0A=
    // make this work on IE on elements without 'layout'=0A=
    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))=0A=
      this.element.setStyle({zoom: 1});=0A=
    var options =3D Object.extend({=0A=
      from: this.element.getOpacity() || 0.0,=0A=
      to:   1.0=0A=
    }, arguments[1] || { });=0A=
    this.start(options);=0A=
  },=0A=
  update: function(position) {=0A=
    this.element.setOpacity(position);=0A=
  }=0A=
});=0A=
=0A=
Effect.Move =3D Class.create(Effect.Base, {=0A=
  initialize: function(element) {=0A=
    this.element =3D $(element);=0A=
    if (!this.element) throw(Effect._elementDoesNotExistError);=0A=
    var options =3D Object.extend({=0A=
      x:    0,=0A=
      y:    0,=0A=
      mode: 'relative'=0A=
    }, arguments[1] || { });=0A=
    this.start(options);=0A=
  },=0A=
  setup: function() {=0A=
    this.element.makePositioned();=0A=
    this.originalLeft =3D parseFloat(this.element.getStyle('left') || =
'0');=0A=
    this.originalTop  =3D parseFloat(this.element.getStyle('top')  || =
'0');=0A=
    if (this.options.mode =3D=3D 'absolute') {=0A=
      this.options.x =3D this.options.x - this.originalLeft;=0A=
      this.options.y =3D this.options.y - this.originalTop;=0A=
    }=0A=
  },=0A=
  update: function(position) {=0A=
    this.element.setStyle({=0A=
      left: (this.options.x  * position + this.originalLeft).round() + =
'px',=0A=
      top:  (this.options.y  * position + this.originalTop).round()  + =
'px'=0A=
    });=0A=
  }=0A=
});=0A=
=0A=
// for backwards compatibility=0A=
Effect.MoveBy =3D function(element, toTop, toLeft) {=0A=
  return new Effect.Move(element, =0A=
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));=0A=
};=0A=
=0A=
Effect.Scale =3D Class.create(Effect.Base, {=0A=
  initialize: function(element, percent) {=0A=
    this.element =3D $(element);=0A=
    if (!this.element) throw(Effect._elementDoesNotExistError);=0A=
    var options =3D Object.extend({=0A=
      scaleX: true,=0A=
      scaleY: true,=0A=
      scaleContent: true,=0A=
      scaleFromCenter: false,=0A=
      scaleMode: 'box',        // 'box' or 'contents' or { } with =
provided values=0A=
      scaleFrom: 100.0,=0A=
      scaleTo:   percent=0A=
    }, arguments[2] || { });=0A=
    this.start(options);=0A=
  },=0A=
  setup: function() {=0A=
    this.restoreAfterFinish =3D this.options.restoreAfterFinish || false;=0A=
    this.elementPositioning =3D this.element.getStyle('position');=0A=
    =0A=
    this.originalStyle =3D { };=0A=
    ['top','left','width','height','fontSize'].each( function(k) {=0A=
      this.originalStyle[k] =3D this.element.style[k];=0A=
    }.bind(this));=0A=
      =0A=
    this.originalTop  =3D this.element.offsetTop;=0A=
    this.originalLeft =3D this.element.offsetLeft;=0A=
    =0A=
    var fontSize =3D this.element.getStyle('font-size') || '100%';=0A=
    ['em','px','%','pt'].each( function(fontSizeType) {=0A=
      if (fontSize.indexOf(fontSizeType)>0) {=0A=
        this.fontSize     =3D parseFloat(fontSize);=0A=
        this.fontSizeType =3D fontSizeType;=0A=
      }=0A=
    }.bind(this));=0A=
    =0A=
    this.factor =3D (this.options.scaleTo - this.options.scaleFrom)/100;=0A=
    =0A=
    this.dims =3D null;=0A=
    if (this.options.scaleMode=3D=3D'box')=0A=
      this.dims =3D [this.element.offsetHeight, =
this.element.offsetWidth];=0A=
    if (/^content/.test(this.options.scaleMode))=0A=
      this.dims =3D [this.element.scrollHeight, =
this.element.scrollWidth];=0A=
    if (!this.dims)=0A=
      this.dims =3D [this.options.scaleMode.originalHeight,=0A=
                   this.options.scaleMode.originalWidth];=0A=
  },=0A=
  update: function(position) {=0A=
    var currentScale =3D (this.options.scaleFrom/100.0) + (this.factor * =
position);=0A=
    if (this.options.scaleContent && this.fontSize)=0A=
      this.element.setStyle({fontSize: this.fontSize * currentScale + =
this.fontSizeType });=0A=
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * =
currentScale);=0A=
  },=0A=
  finish: function(position) {=0A=
    if (this.restoreAfterFinish) =
this.element.setStyle(this.originalStyle);=0A=
  },=0A=
  setDimensions: function(height, width) {=0A=
    var d =3D { };=0A=
    if (this.options.scaleX) d.width =3D width.round() + 'px';=0A=
    if (this.options.scaleY) d.height =3D height.round() + 'px';=0A=
    if (this.options.scaleFromCenter) {=0A=
      var topd  =3D (height - this.dims[0])/2;=0A=
      var leftd =3D (width  - this.dims[1])/2;=0A=
      if (this.elementPositioning =3D=3D 'absolute') {=0A=
        if (this.options.scaleY) d.top =3D this.originalTop-topd + 'px';=0A=
        if (this.options.scaleX) d.left =3D this.originalLeft-leftd + =
'px';=0A=
      } else {=0A=
        if (this.options.scaleY) d.top =3D -topd + 'px';=0A=
        if (this.options.scaleX) d.left =3D -leftd + 'px';=0A=
      }=0A=
    }=0A=
    this.element.setStyle(d);=0A=
  }=0A=
});=0A=
=0A=
Effect.Highlight =3D Class.create(Effect.Base, {=0A=
  initialize: function(element) {=0A=
    this.element =3D $(element);=0A=
    if (!this.element) throw(Effect._elementDoesNotExistError);=0A=
    var options =3D Object.extend({ startcolor: '#ffff99' }, =
arguments[1] || { });=0A=
    this.start(options);=0A=
  },=0A=
  setup: function() {=0A=
    // Prevent executing on elements not in the layout flow=0A=
    if (this.element.getStyle('display')=3D=3D'none') { this.cancel(); =
return; }=0A=
    // Disable background image during the effect=0A=
    this.oldStyle =3D { };=0A=
    if (!this.options.keepBackgroundImage) {=0A=
      this.oldStyle.backgroundImage =3D =
this.element.getStyle('background-image');=0A=
      this.element.setStyle({backgroundImage: 'none'});=0A=
    }=0A=
    if (!this.options.endcolor)=0A=
      this.options.endcolor =3D =
this.element.getStyle('background-color').parseColor('#ffffff');=0A=
    if (!this.options.restorecolor)=0A=
      this.options.restorecolor =3D =
this.element.getStyle('background-color');=0A=
    // init color calculations=0A=
    this._base  =3D $R(0,2).map(function(i){ return =
parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));=0A=
    this._delta =3D $R(0,2).map(function(i){ return =
parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] =
}.bind(this));=0A=
  },=0A=
  update: function(position) {=0A=
    this.element.setStyle({backgroundColor: =
$R(0,2).inject('#',function(m,v,i){=0A=
      return =
m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); =
}.bind(this)) });=0A=
  },=0A=
  finish: function() {=0A=
    this.element.setStyle(Object.extend(this.oldStyle, {=0A=
      backgroundColor: this.options.restorecolor=0A=
    }));=0A=
  }=0A=
});=0A=
=0A=
Effect.ScrollTo =3D function(element) {=0A=
  var options =3D arguments[1] || { },=0A=
    scrollOffsets =3D document.viewport.getScrollOffsets(),=0A=
    elementOffsets =3D $(element).cumulativeOffset(),=0A=
    max =3D (window.height || document.body.scrollHeight) - =
document.viewport.getHeight();  =0A=
=0A=
  if (options.offset) elementOffsets[1] +=3D options.offset;=0A=
=0A=
  return new Effect.Tween(null,=0A=
    scrollOffsets.top,=0A=
    elementOffsets[1] > max ? max : elementOffsets[1],=0A=
    options,=0A=
    function(p){ scrollTo(scrollOffsets.left, p.round()) }=0A=
  );=0A=
};=0A=
=0A=
/* ------------- combination effects ------------- */=0A=
=0A=
Effect.Fade =3D function(element) {=0A=
  element =3D $(element);=0A=
  var oldOpacity =3D element.getInlineOpacity();=0A=
  var options =3D Object.extend({=0A=
    from: element.getOpacity() || 1.0,=0A=
    to:   0.0,=0A=
    afterFinishInternal: function(effect) { =0A=
      if (effect.options.to!=3D0) return;=0A=
      effect.element.hide().setStyle({opacity: oldOpacity}); =0A=
    }=0A=
  }, arguments[1] || { });=0A=
  return new Effect.Opacity(element,options);=0A=
};=0A=
=0A=
Effect.Appear =3D function(element) {=0A=
  element =3D $(element);=0A=
  var options =3D Object.extend({=0A=
  from: (element.getStyle('display') =3D=3D 'none' ? 0.0 : =
element.getOpacity() || 0.0),=0A=
  to:   1.0,=0A=
  // force Safari to render floated elements properly=0A=
  afterFinishInternal: function(effect) {=0A=
    effect.element.forceRerendering();=0A=
  },=0A=
  beforeSetup: function(effect) {=0A=
    effect.element.setOpacity(effect.options.from).show(); =0A=
  }}, arguments[1] || { });=0A=
  return new Effect.Opacity(element,options);=0A=
};=0A=
=0A=
Effect.Puff =3D function(element) {=0A=
  element =3D $(element);=0A=
  var oldStyle =3D { =0A=
    opacity: element.getInlineOpacity(), =0A=
    position: element.getStyle('position'),=0A=
    top:  element.style.top,=0A=
    left: element.style.left,=0A=
    width: element.style.width,=0A=
    height: element.style.height=0A=
  };=0A=
  return new Effect.Parallel(=0A=
   [ new Effect.Scale(element, 200, =0A=
      { sync: true, scaleFromCenter: true, scaleContent: true, =
restoreAfterFinish: true }), =0A=
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], =0A=
     Object.extend({ duration: 1.0, =0A=
      beforeSetupInternal: function(effect) {=0A=
        Position.absolutize(effect.effects[0].element)=0A=
      },=0A=
      afterFinishInternal: function(effect) {=0A=
         effect.effects[0].element.hide().setStyle(oldStyle); }=0A=
     }, arguments[1] || { })=0A=
   );=0A=
};=0A=
=0A=
Effect.BlindUp =3D function(element) {=0A=
  element =3D $(element);=0A=
  element.makeClipping();=0A=
  return new Effect.Scale(element, 0,=0A=
    Object.extend({ scaleContent: false, =0A=
      scaleX: false, =0A=
      restoreAfterFinish: true,=0A=
      afterFinishInternal: function(effect) {=0A=
        effect.element.hide().undoClipping();=0A=
      } =0A=
    }, arguments[1] || { })=0A=
  );=0A=
};=0A=
=0A=
Effect.BlindDown =3D function(element) {=0A=
  element =3D $(element);=0A=
  var elementDimensions =3D element.getDimensions();=0A=
  return new Effect.Scale(element, 100, Object.extend({ =0A=
    scaleContent: false, =0A=
    scaleX: false,=0A=
    scaleFrom: 0,=0A=
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: =
elementDimensions.width},=0A=
    restoreAfterFinish: true,=0A=
    afterSetup: function(effect) {=0A=
      effect.element.makeClipping().setStyle({height: '0px'}).show(); =0A=
    },  =0A=
    afterFinishInternal: function(effect) {=0A=
      effect.element.undoClipping();=0A=
    }=0A=
  }, arguments[1] || { }));=0A=
};=0A=
=0A=
Effect.SwitchOff =3D function(element) {=0A=
  element =3D $(element);=0A=
  var oldOpacity =3D element.getInlineOpacity();=0A=
  return new Effect.Appear(element, Object.extend({=0A=
    duration: 0.4,=0A=
    from: 0,=0A=
    transition: Effect.Transitions.flicker,=0A=
    afterFinishInternal: function(effect) {=0A=
      new Effect.Scale(effect.element, 1, { =0A=
        duration: 0.3, scaleFromCenter: true,=0A=
        scaleX: false, scaleContent: false, restoreAfterFinish: true,=0A=
        beforeSetup: function(effect) { =0A=
          effect.element.makePositioned().makeClipping();=0A=
        },=0A=
        afterFinishInternal: function(effect) {=0A=
          =
effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: =
oldOpacity});=0A=
        }=0A=
      })=0A=
    }=0A=
  }, arguments[1] || { }));=0A=
};=0A=
=0A=
Effect.DropOut =3D function(element) {=0A=
  element =3D $(element);=0A=
  var oldStyle =3D {=0A=
    top: element.getStyle('top'),=0A=
    left: element.getStyle('left'),=0A=
    opacity: element.getInlineOpacity() };=0A=
  return new Effect.Parallel(=0A=
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), =0A=
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],=0A=
    Object.extend(=0A=
      { duration: 0.5,=0A=
        beforeSetup: function(effect) {=0A=
          effect.effects[0].element.makePositioned(); =0A=
        },=0A=
        afterFinishInternal: function(effect) {=0A=
          =
effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);=0A=
        } =0A=
      }, arguments[1] || { }));=0A=
};=0A=
=0A=
Effect.Shake =3D function(element) {=0A=
  element =3D $(element);=0A=
  var options =3D Object.extend({=0A=
    distance: 20,=0A=
    duration: 0.5=0A=
  }, arguments[1] || {});=0A=
  var distance =3D parseFloat(options.distance);=0A=
  var split =3D parseFloat(options.duration) / 10.0;=0A=
  var oldStyle =3D {=0A=
    top: element.getStyle('top'),=0A=
    left: element.getStyle('left') };=0A=
    return new Effect.Move(element,=0A=
      { x:  distance, y: 0, duration: split, afterFinishInternal: =
function(effect) {=0A=
    new Effect.Move(effect.element,=0A=
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: =
function(effect) {=0A=
    new Effect.Move(effect.element,=0A=
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: =
function(effect) {=0A=
    new Effect.Move(effect.element,=0A=
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: =
function(effect) {=0A=
    new Effect.Move(effect.element,=0A=
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: =
function(effect) {=0A=
    new Effect.Move(effect.element,=0A=
      { x: -distance, y: 0, duration: split, afterFinishInternal: =
function(effect) {=0A=
        effect.element.undoPositioned().setStyle(oldStyle);=0A=
  }}) }}) }}) }}) }}) }});=0A=
};=0A=
=0A=
Effect.SlideDown =3D function(element) {=0A=
  element =3D $(element).cleanWhitespace();=0A=
  // SlideDown need to have the content of the element wrapped in a =
container element with fixed height!=0A=
  var oldInnerBottom =3D element.down().getStyle('bottom');=0A=
  var elementDimensions =3D element.getDimensions();=0A=
  return new Effect.Scale(element, 100, Object.extend({ =0A=
    scaleContent: false, =0A=
    scaleX: false, =0A=
    scaleFrom: window.opera ? 0 : 1,=0A=
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: =
elementDimensions.width},=0A=
    restoreAfterFinish: true,=0A=
    afterSetup: function(effect) {=0A=
      effect.element.makePositioned();=0A=
      effect.element.down().makePositioned();=0A=
      if (window.opera) effect.element.setStyle({top: ''});=0A=
      effect.element.makeClipping().setStyle({height: '0px'}).show(); =0A=
    },=0A=
    afterUpdateInternal: function(effect) {=0A=
      effect.element.down().setStyle({bottom:=0A=
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); =0A=
    },=0A=
    afterFinishInternal: function(effect) {=0A=
      effect.element.undoClipping().undoPositioned();=0A=
      effect.element.down().undoPositioned().setStyle({bottom: =
oldInnerBottom}); }=0A=
    }, arguments[1] || { })=0A=
  );=0A=
};=0A=
=0A=
Effect.SlideUp =3D function(element) {=0A=
  element =3D $(element).cleanWhitespace();=0A=
  var oldInnerBottom =3D element.down().getStyle('bottom');=0A=
  var elementDimensions =3D element.getDimensions();=0A=
  return new Effect.Scale(element, window.opera ? 0 : 1,=0A=
   Object.extend({ scaleContent: false, =0A=
    scaleX: false, =0A=
    scaleMode: 'box',=0A=
    scaleFrom: 100,=0A=
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: =
elementDimensions.width},=0A=
    restoreAfterFinish: true,=0A=
    afterSetup: function(effect) {=0A=
      effect.element.makePositioned();=0A=
      effect.element.down().makePositioned();=0A=
      if (window.opera) effect.element.setStyle({top: ''});=0A=
      effect.element.makeClipping().show();=0A=
    },  =0A=
    afterUpdateInternal: function(effect) {=0A=
      effect.element.down().setStyle({bottom:=0A=
        (effect.dims[0] - effect.element.clientHeight) + 'px' });=0A=
    },=0A=
    afterFinishInternal: function(effect) {=0A=
      effect.element.hide().undoClipping().undoPositioned();=0A=
      effect.element.down().undoPositioned().setStyle({bottom: =
oldInnerBottom});=0A=
    }=0A=
   }, arguments[1] || { })=0A=
  );=0A=
};=0A=
=0A=
// Bug in opera makes the TD containing this element expand for a =
instance after finish =0A=
Effect.Squish =3D function(element) {=0A=
  return new Effect.Scale(element, window.opera ? 1 : 0, { =0A=
    restoreAfterFinish: true,=0A=
    beforeSetup: function(effect) {=0A=
      effect.element.makeClipping(); =0A=
    },  =0A=
    afterFinishInternal: function(effect) {=0A=
      effect.element.hide().undoClipping(); =0A=
    }=0A=
  });=0A=
};=0A=
=0A=
Effect.Grow =3D function(element) {=0A=
  element =3D $(element);=0A=
  var options =3D Object.extend({=0A=
    direction: 'center',=0A=
    moveTransition: Effect.Transitions.sinoidal,=0A=
    scaleTransition: Effect.Transitions.sinoidal,=0A=
    opacityTransition: Effect.Transitions.full=0A=
  }, arguments[1] || { });=0A=
  var oldStyle =3D {=0A=
    top: element.style.top,=0A=
    left: element.style.left,=0A=
    height: element.style.height,=0A=
    width: element.style.width,=0A=
    opacity: element.getInlineOpacity() };=0A=
=0A=
  var dims =3D element.getDimensions();    =0A=
  var initialMoveX, initialMoveY;=0A=
  var moveX, moveY;=0A=
  =0A=
  switch (options.direction) {=0A=
    case 'top-left':=0A=
      initialMoveX =3D initialMoveY =3D moveX =3D moveY =3D 0; =0A=
      break;=0A=
    case 'top-right':=0A=
      initialMoveX =3D dims.width;=0A=
      initialMoveY =3D moveY =3D 0;=0A=
      moveX =3D -dims.width;=0A=
      break;=0A=
    case 'bottom-left':=0A=
      initialMoveX =3D moveX =3D 0;=0A=
      initialMoveY =3D dims.height;=0A=
      moveY =3D -dims.height;=0A=
      break;=0A=
    case 'bottom-right':=0A=
      initialMoveX =3D dims.width;=0A=
      initialMoveY =3D dims.height;=0A=
      moveX =3D -dims.width;=0A=
      moveY =3D -dims.height;=0A=
      break;=0A=
    case 'center':=0A=
      initialMoveX =3D dims.width / 2;=0A=
      initialMoveY =3D dims.height / 2;=0A=
      moveX =3D -dims.width / 2;=0A=
      moveY =3D -dims.height / 2;=0A=
      break;=0A=
  }=0A=
  =0A=
  return new Effect.Move(element, {=0A=
    x: initialMoveX,=0A=
    y: initialMoveY,=0A=
    duration: 0.01, =0A=
    beforeSetup: function(effect) {=0A=
      effect.element.hide().makeClipping().makePositioned();=0A=
    },=0A=
    afterFinishInternal: function(effect) {=0A=
      new Effect.Parallel(=0A=
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, =
from: 0.0, transition: options.opacityTransition }),=0A=
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: =
true, transition: options.moveTransition }),=0A=
          new Effect.Scale(effect.element, 100, {=0A=
            scaleMode: { originalHeight: dims.height, originalWidth: =
dims.width }, =0A=
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: =
options.scaleTransition, restoreAfterFinish: true})=0A=
        ], Object.extend({=0A=
             beforeSetup: function(effect) {=0A=
               effect.effects[0].element.setStyle({height: =
'0px'}).show(); =0A=
             },=0A=
             afterFinishInternal: function(effect) {=0A=
               =
effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldSty=
le); =0A=
             }=0A=
           }, options)=0A=
      )=0A=
    }=0A=
  });=0A=
};=0A=
=0A=
Effect.Shrink =3D function(element) {=0A=
  element =3D $(element);=0A=
  var options =3D Object.extend({=0A=
    direction: 'center',=0A=
    moveTransition: Effect.Transitions.sinoidal,=0A=
    scaleTransition: Effect.Transitions.sinoidal,=0A=
    opacityTransition: Effect.Transitions.none=0A=
  }, arguments[1] || { });=0A=
  var oldStyle =3D {=0A=
    top: element.style.top,=0A=
    left: element.style.left,=0A=
    height: element.style.height,=0A=
    width: element.style.width,=0A=
    opacity: element.getInlineOpacity() };=0A=
=0A=
  var dims =3D element.getDimensions();=0A=
  var moveX, moveY;=0A=
  =0A=
  switch (options.direction) {=0A=
    case 'top-left':=0A=
      moveX =3D moveY =3D 0;=0A=
      break;=0A=
    case 'top-right':=0A=
      moveX =3D dims.width;=0A=
      moveY =3D 0;=0A=
      break;=0A=
    case 'bottom-left':=0A=
      moveX =3D 0;=0A=
      moveY =3D dims.height;=0A=
      break;=0A=
    case 'bottom-right':=0A=
      moveX =3D dims.width;=0A=
      moveY =3D dims.height;=0A=
      break;=0A=
    case 'center':  =0A=
      moveX =3D dims.width / 2;=0A=
      moveY =3D dims.height / 2;=0A=
      break;=0A=
  }=0A=
  =0A=
  return new Effect.Parallel(=0A=
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, =
transition: options.opacityTransition }),=0A=
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, =
transition: options.scaleTransition, restoreAfterFinish: true}),=0A=
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, =
transition: options.moveTransition })=0A=
    ], Object.extend({            =0A=
         beforeStartInternal: function(effect) {=0A=
           effect.effects[0].element.makePositioned().makeClipping(); =0A=
         },=0A=
         afterFinishInternal: function(effect) {=0A=
           =
effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle=
(oldStyle); }=0A=
       }, options)=0A=
  );=0A=
};=0A=
=0A=
Effect.Pulsate =3D function(element) {=0A=
  element =3D $(element);=0A=
  var options    =3D arguments[1] || { };=0A=
  var oldOpacity =3D element.getInlineOpacity();=0A=
  var transition =3D options.transition || Effect.Transitions.sinoidal;=0A=
  var reverser   =3D function(pos){ return =
transition(1-Effect.Transitions.pulse(pos, options.pulses)) };=0A=
  reverser.bind(transition);=0A=
  return new Effect.Opacity(element, =0A=
    Object.extend(Object.extend({  duration: 2.0, from: 0,=0A=
      afterFinishInternal: function(effect) { =
effect.element.setStyle({opacity: oldOpacity}); }=0A=
    }, options), {transition: reverser}));=0A=
};=0A=
=0A=
Effect.Fold =3D function(element) {=0A=
  element =3D $(element);=0A=
  var oldStyle =3D {=0A=
    top: element.style.top,=0A=
    left: element.style.left,=0A=
    width: element.style.width,=0A=
    height: element.style.height };=0A=
  element.makeClipping();=0A=
  return new Effect.Scale(element, 5, Object.extend({   =0A=
    scaleContent: false,=0A=
    scaleX: false,=0A=
    afterFinishInternal: function(effect) {=0A=
    new Effect.Scale(element, 1, { =0A=
      scaleContent: false, =0A=
      scaleY: false,=0A=
      afterFinishInternal: function(effect) {=0A=
        effect.element.hide().undoClipping().setStyle(oldStyle);=0A=
      } });=0A=
  }}, arguments[1] || { }));=0A=
};=0A=
=0A=
Effect.Morph =3D Class.create(Effect.Base, {=0A=
  initialize: function(element) {=0A=
    this.element =3D $(element);=0A=
    if (!this.element) throw(Effect._elementDoesNotExistError);=0A=
    var options =3D Object.extend({=0A=
      style: { }=0A=
    }, arguments[1] || { });=0A=
    =0A=
    if (!Object.isString(options.style)) this.style =3D =
$H(options.style);=0A=
    else {=0A=
      if (options.style.include(':'))=0A=
        this.style =3D options.style.parseStyle();=0A=
      else {=0A=
        this.element.addClassName(options.style);=0A=
        this.style =3D $H(this.element.getStyles());=0A=
        this.element.removeClassName(options.style);=0A=
        var css =3D this.element.getStyles();=0A=
        this.style =3D this.style.reject(function(style) {=0A=
          return style.value =3D=3D css[style.key];=0A=
        });=0A=
        options.afterFinishInternal =3D function(effect) {=0A=
          effect.element.addClassName(effect.options.style);=0A=
          effect.transforms.each(function(transform) {=0A=
            effect.element.style[transform.style] =3D '';=0A=
          });=0A=
        }=0A=
      }=0A=
    }=0A=
    this.start(options);=0A=
  },=0A=
  =0A=
  setup: function(){=0A=
    function parseColor(color){=0A=
      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) =
color =3D '#ffffff';=0A=
      color =3D color.parseColor();=0A=
      return $R(0,2).map(function(i){=0A=
        return parseInt( color.slice(i*2+1,i*2+3), 16 ) =0A=
      });=0A=
    }=0A=
    this.transforms =3D this.style.map(function(pair){=0A=
      var property =3D pair[0], value =3D pair[1], unit =3D null;=0A=
=0A=
      if (value.parseColor('#zzzzzz') !=3D '#zzzzzz') {=0A=
        value =3D value.parseColor();=0A=
        unit  =3D 'color';=0A=
      } else if (property =3D=3D 'opacity') {=0A=
        value =3D parseFloat(value);=0A=
        if (Prototype.Browser.IE && =
(!this.element.currentStyle.hasLayout))=0A=
          this.element.setStyle({zoom: 1});=0A=
      } else if (Element.CSS_LENGTH.test(value)) {=0A=
          var components =3D value.match(/^([\+\-]?[0-9\.]+)(.*)$/);=0A=
          value =3D parseFloat(components[1]);=0A=
          unit =3D (components.length =3D=3D 3) ? components[2] : null;=0A=
      }=0A=
=0A=
      var originalValue =3D this.element.getStyle(property);=0A=
      return { =0A=
        style: property.camelize(), =0A=
        originalValue: unit=3D=3D'color' ? parseColor(originalValue) : =
parseFloat(originalValue || 0), =0A=
        targetValue: unit=3D=3D'color' ? parseColor(value) : value,=0A=
        unit: unit=0A=
      };=0A=
    }.bind(this)).reject(function(transform){=0A=
      return (=0A=
        (transform.originalValue =3D=3D transform.targetValue) ||=0A=
        (=0A=
          transform.unit !=3D 'color' &&=0A=
          (isNaN(transform.originalValue) || =
isNaN(transform.targetValue))=0A=
        )=0A=
      )=0A=
    });=0A=
  },=0A=
  update: function(position) {=0A=
    var style =3D { }, transform, i =3D this.transforms.length;=0A=
    while(i--)=0A=
      style[(transform =3D this.transforms[i]).style] =3D =0A=
        transform.unit=3D=3D'color' ? '#'+=0A=
          (Math.round(transform.originalValue[0]+=0A=
            =
(transform.targetValue[0]-transform.originalValue[0])*position)).toColorP=
art() +=0A=
          (Math.round(transform.originalValue[1]+=0A=
            =
(transform.targetValue[1]-transform.originalValue[1])*position)).toColorP=
art() +=0A=
          (Math.round(transform.originalValue[2]+=0A=
            =
(transform.targetValue[2]-transform.originalValue[2])*position)).toColorP=
art() :=0A=
        (transform.originalValue +=0A=
          (transform.targetValue - transform.originalValue) * =
position).toFixed(3) + =0A=
            (transform.unit =3D=3D=3D null ? '' : transform.unit);=0A=
    this.element.setStyle(style, true);=0A=
  }=0A=
});=0A=
=0A=
Effect.Transform =3D Class.create({=0A=
  initialize: function(tracks){=0A=
    this.tracks  =3D [];=0A=
    this.options =3D arguments[1] || { };=0A=
    this.addTracks(tracks);=0A=
  },=0A=
  addTracks: function(tracks){=0A=
    tracks.each(function(track){=0A=
      track =3D $H(track);=0A=
      var data =3D track.values().first();=0A=
      this.tracks.push($H({=0A=
        ids:     track.keys().first(),=0A=
        effect:  Effect.Morph,=0A=
        options: { style: data }=0A=
      }));=0A=
    }.bind(this));=0A=
    return this;=0A=
  },=0A=
  play: function(){=0A=
    return new Effect.Parallel(=0A=
      this.tracks.map(function(track){=0A=
        var ids =3D track.get('ids'), effect =3D track.get('effect'), =
options =3D track.get('options');=0A=
        var elements =3D [$(ids) || $$(ids)].flatten();=0A=
        return elements.map(function(e){ return new effect(e, =
Object.extend({ sync:true }, options)) });=0A=
      }).flatten(),=0A=
      this.options=0A=
    );=0A=
  }=0A=
});=0A=
=0A=
Element.CSS_PROPERTIES =3D $w(=0A=
  'backgroundColor backgroundPosition borderBottomColor =
borderBottomStyle ' + =0A=
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +=0A=
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +=0A=
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +=0A=
  'fontSize fontWeight height left letterSpacing lineHeight ' +=0A=
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight =
'+=0A=
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +=0A=
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +=0A=
  'right textIndent top width wordSpacing zIndex');=0A=
  =0A=
Element.CSS_LENGTH =3D =
/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;=0A=
=0A=
String.__parseStyleElement =3D document.createElement('div');=0A=
String.prototype.parseStyle =3D function(){=0A=
  var style, styleRules =3D $H();=0A=
  if (Prototype.Browser.WebKit)=0A=
    style =3D new Element('div',{style:this}).style;=0A=
  else {=0A=
    String.__parseStyleElement.innerHTML =3D '<div style=3D"' + this + =
'"></div>';=0A=
    style =3D String.__parseStyleElement.childNodes[0].style;=0A=
  }=0A=
  =0A=
  Element.CSS_PROPERTIES.each(function(property){=0A=
    if (style[property]) styleRules.set(property, style[property]); =0A=
  });=0A=
  =0A=
  if (Prototype.Browser.IE && this.include('opacity'))=0A=
    styleRules.set('opacity', =
this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);=0A=
=0A=
  return styleRules;=0A=
};=0A=
=0A=
if (document.defaultView && document.defaultView.getComputedStyle) {=0A=
  Element.getStyles =3D function(element) {=0A=
    var css =3D document.defaultView.getComputedStyle($(element), null);=0A=
    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) =
{=0A=
      styles[property] =3D css[property];=0A=
      return styles;=0A=
    });=0A=
  };=0A=
} else {=0A=
  Element.getStyles =3D function(element) {=0A=
    element =3D $(element);=0A=
    var css =3D element.currentStyle, styles;=0A=
    styles =3D Element.CSS_PROPERTIES.inject({ }, function(hash, =
property) {=0A=
      hash.set(property, css[property]);=0A=
      return hash;=0A=
    });=0A=
    if (!styles.opacity) styles.set('opacity', element.getOpacity());=0A=
    return styles;=0A=
  };=0A=
};=0A=
=0A=
Effect.Methods =3D {=0A=
  morph: function(element, style) {=0A=
    element =3D $(element);=0A=
    new Effect.Morph(element, Object.extend({ style: style }, =
arguments[2] || { }));=0A=
    return element;=0A=
  },=0A=
  visualEffect: function(element, effect, options) {=0A=
    element =3D $(element)=0A=
    var s =3D effect.dasherize().camelize(), klass =3D =
s.charAt(0).toUpperCase() + s.substring(1);=0A=
    new Effect[klass](element, options);=0A=
    return element;=0A=
  },=0A=
  highlight: function(element, options) {=0A=
    element =3D $(element);=0A=
    new Effect.Highlight(element, options);=0A=
    return element;=0A=
  }=0A=
};=0A=
=0A=
$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+=0A=
  'pulsate shake puff squish switchOff dropOut').each(=0A=
  function(effect) { =0A=
    Effect.Methods[effect] =3D function(element, options){=0A=
      element =3D $(element);=0A=
      Effect[effect.charAt(0).toUpperCase() + =
effect.substring(1)](element, options);=0A=
      return element;=0A=
    }=0A=
  }=0A=
);=0A=
=0A=
$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes =
collectTextNodesIgnoreClass getStyles').each( =0A=
  function(f) { Effect.Methods[f] =3D Element[f]; }=0A=
);=0A=
=0A=
Element.addMethods(Effect.Methods);=0A=
=0A=
function hideModalBox()=0A=
{=0A=
  document.getElementById("modalBoxDisplay").style.display=3D"none";=0A=
};=0A=
=0A=
function setCenterAlign()=0A=
{=0A=
   var msgBox =3D document.getElementById('modalWindowMsgBox');=0A=
   var winWidth =3D getWindowWidth();=0A=
   var winHeight =3D getWindowHeight();=0A=
   var top =3D (winHeight - msgBox.offsetHeight)/2;=0A=
   var left =3D (winWidth - msgBox.offsetWidth)/2;=0A=
   msgBox.style.top =3D top + 'px';=0A=
   msgBox.style.left =3D left + 'px';=0A=
   document.getElementById('modalWindow').style.height =3D winHeight + =
"px";=0A=
};=0A=
=0A=
function getWindowHeight()=0A=
{=0A=
   var myHeight =3D 0;=0A=
   if( typeof( window.innerWidth ) =3D=3D 'number' ) {=0A=
      //Non-IE=0A=
      myHeight =3D window.innerHeight;=0A=
   } else if( document.documentElement &&=0A=
    ( document.documentElement.clientWidth || =
document.documentElement.clientHeight ) ) {=0A=
      //IE 6+ in 'standards compliant mode'=0A=
      myHeight =3D document.documentElement.clientHeight;=0A=
   } else if( document.body && ( document.body.clientWidth || =
document.body.clientHeight ) ) {=0A=
      //IE 6 compatible=0A=
      myHeight =3D document.body.clientHeight;=0A=
   }=0A=
   return myHeight;=0A=
};=0A=
=0A=
function getWindowWidth()=0A=
{=0A=
   var myWidth =3D 0;=0A=
   if( typeof( window.innerWidth ) =3D=3D 'number' ) {=0A=
      //Non-IE=0A=
      myWidth =3D window.innerWidth;=0A=
   } else if( document.documentElement &&=0A=
    ( document.documentElement.clientWidth || =
document.documentElement.clientHeight ) ) {=0A=
      //IE 6+ in 'standards compliant mode'=0A=
      myWidth =3D document.documentElement.clientWidth;=0A=
   } else if( document.body && ( document.body.clientWidth || =
document.body.clientHeight ) ) {=0A=
      //IE 6 compatible=0A=
      myWidth =3D document.body.clientWidth;=0A=
   }=0A=
   return myWidth;=0A=
};=0A=
=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/controls_mod.js

// script.aculo.us controls.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007=0A=
=0A=
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, =
http://mir.aculo.us)=0A=
//           (c) 2005-2007 Ivan Krstic =
(http://blogs.law.harvard.edu/ivan)=0A=
//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)=0A=
// Contributors:=0A=
//  Richard Livsey=0A=
//  Rahul Bhargava=0A=
//  Rob Wills=0A=
// =0A=
// script.aculo.us is freely distributable under the terms of an =
MIT-style license.=0A=
// For details, see the script.aculo.us web site: http://script.aculo.us/=0A=
=0A=
// NOTE: Modified from original=0A=
=0A=
if(typeof Effect =3D=3D 'undefined')=0A=
  throw("controls.js requires including script.aculo.us' effects.js =
library");=0A=
=0A=
var Autocompleter =3D { }=0A=
Autocompleter.Base =3D Class.create({=0A=
  baseInitialize: function(element, update, options) {=0A=
    element          =3D $(element)=0A=
    this.element     =3D element; =0A=
    this.update      =3D $(update);  =0A=
    this.hasFocus    =3D false; =0A=
    this.changed     =3D false; =0A=
    this.active      =3D false; =0A=
    this.index       =3D 0;     =0A=
    this.entryCount  =3D 0;=0A=
    this.oldElementValue =3D this.element.value;=0A=
=0A=
    if(this.setOptions)=0A=
      this.setOptions(options);=0A=
    else=0A=
      this.options =3D options || { };=0A=
=0A=
    this.options.paramName    =3D this.options.paramName || =
this.element.name;=0A=
    this.options.tokens       =3D this.options.tokens || [];=0A=
    this.options.frequency    =3D this.options.frequency || 0.4;=0A=
    this.options.minChars     =3D this.options.minChars || 1;=0A=
    this.options.onShow       =3D this.options.onShow || =0A=
      function(element, update){ =0A=
        if(!update.style.position || =
update.style.position=3D=3D'absolute') {=0A=
          update.style.position =3D 'absolute';=0A=
          Position.clone(element, update, {=0A=
            setHeight: false, =0A=
            setLeft: false, =0A=
            offsetTop: element.offsetHeight=0A=
          });=0A=
        }=0A=
        Effect.Appear(update,{duration:0.15});=0A=
      };=0A=
    this.options.onHide =3D this.options.onHide || =0A=
      function(element, update){ new Effect.Fade(update,{duration:0.15}) =
};=0A=
=0A=
    if(typeof(this.options.tokens) =3D=3D 'string') =0A=
      this.options.tokens =3D new Array(this.options.tokens);=0A=
    // Force carriage returns as token delimiters anyway=0A=
    if (!this.options.tokens.include('\n'))=0A=
      this.options.tokens.push('\n');=0A=
=0A=
    this.observer =3D null;=0A=
    =0A=
    this.element.setAttribute('autocomplete','off');=0A=
=0A=
    Element.hide(this.update);=0A=
=0A=
    Event.observe(this.element, 'blur', =
this.onBlur.bindAsEventListener(this));=0A=
    Event.observe(this.element, 'keydown', =
this.onKeyPress.bindAsEventListener(this));=0A=
  },=0A=
=0A=
  show: function() {=0A=
    if(Element.getStyle(this.update, 'display')=3D=3D'none') =
this.options.onShow(this.element, this.update);=0A=
    if(!this.iefix && =0A=
      (Prototype.Browser.IE) &&=0A=
      (Element.getStyle(this.update, 'position')=3D=3D'absolute')) {=0A=
      new Insertion.After(this.update, =0A=
       '<iframe id=3D"' + this.update.id + '_iefix" '+=0A=
       =
'style=3D"display:none;position:absolute;filter:progid:DXImageTransform.M=
icrosoft.Alpha(opacity=3D0);" ' +=0A=
       'src=3D"javascript:false;" frameborder=3D"0" =
scrolling=3D"no"></iframe>');=0A=
      this.iefix =3D $(this.update.id+'_iefix');=0A=
    }=0A=
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);=0A=
  },=0A=
  =0A=
  fixIEOverlapping: function() {=0A=
    Position.clone(this.update, this.iefix, =
{setTop:(!this.update.style.height)});=0A=
    this.iefix.style.zIndex =3D 1;=0A=
    this.update.style.zIndex =3D 2;=0A=
    Element.show(this.iefix);=0A=
  },=0A=
=0A=
  hide: function() {=0A=
    this.stopIndicator();=0A=
    if(Element.getStyle(this.update, 'display')!=3D'none') =
this.options.onHide(this.element, this.update);=0A=
    if(this.iefix) Element.hide(this.iefix);=0A=
  },=0A=
=0A=
  startIndicator: function() {=0A=
    if(this.options.indicator) Element.show(this.options.indicator);=0A=
  },=0A=
=0A=
  stopIndicator: function() {=0A=
    if(this.options.indicator) Element.hide(this.options.indicator);=0A=
  },=0A=
=0A=
  onKeyPress: function(event) {=0A=
    if(this.active)=0A=
      switch(event.keyCode) {=0A=
       case Event.KEY_RETURN:=0A=
         this.selectEntry();=0A=
         Event.stop(event);=0A=
         this.hide();=0A=
         return;=0A=
       case Event.KEY_TAB:=0A=
         this.selectEntry();=0A=
         this.hide();=0A=
         return;=0A=
       case Event.KEY_ESC:=0A=
         this.hide();=0A=
         this.active =3D false;=0A=
         Event.stop(event);=0A=
         return;=0A=
       case Event.KEY_LEFT:=0A=
       case Event.KEY_RIGHT:=0A=
         return;=0A=
       case Event.KEY_UP:=0A=
         this.markPrevious();=0A=
         this.render();=0A=
         if(Prototype.Browser.WebKit) Event.stop(event);=0A=
         return;=0A=
       case Event.KEY_DOWN:=0A=
         this.markNext();=0A=
         this.render();=0A=
         if(Prototype.Browser.WebKit) Event.stop(event);=0A=
         return;=0A=
      }=0A=
     else =0A=
       if(event.keyCode=3D=3DEvent.KEY_TAB || =
event.keyCode=3D=3DEvent.KEY_RETURN || =0A=
         (Prototype.Browser.WebKit > 0 && event.keyCode =3D=3D 0)) =
return;=0A=
=0A=
    this.changed =3D true;=0A=
    this.hasFocus =3D true;=0A=
=0A=
    if(this.observer) clearTimeout(this.observer);=0A=
      this.observer =3D =0A=
        setTimeout(this.onObserverEvent.bind(this), =
this.options.frequency*1000);=0A=
  },=0A=
=0A=
  activate: function() {=0A=
    this.changed =3D false;=0A=
    this.hasFocus =3D true;=0A=
    this.getUpdatedChoices();=0A=
  },=0A=
=0A=
  onHover: function(event) {=0A=
    var element =3D Event.findElement(event, 'LI');=0A=
    if(this.index !=3D element.autocompleteIndex) =0A=
    {=0A=
        this.index =3D element.autocompleteIndex;=0A=
        this.render();=0A=
    }=0A=
    Event.stop(event);=0A=
  },=0A=
  =0A=
  onClick: function(event) {=0A=
    var element =3D Event.findElement(event, 'LI');=0A=
    this.index =3D element.autocompleteIndex;=0A=
    this.selectEntry();=0A=
    this.hide();=0A=
  },=0A=
  =0A=
  onBlur: function(event) {=0A=
    // needed to make click events working=0A=
    setTimeout(this.hide.bind(this), 250);=0A=
    this.hasFocus =3D false;=0A=
    this.active =3D false;     =0A=
  }, =0A=
  =0A=
  render: function() {=0A=
    if(this.entryCount > 0) {=0A=
      for (var i =3D 0; i < this.entryCount; i++)=0A=
        this.index=3D=3Di ? =0A=
          Element.addClassName(this.getEntry(i),"selected") : =0A=
          Element.removeClassName(this.getEntry(i),"selected");=0A=
      if(this.hasFocus) { =0A=
        this.show();=0A=
        this.active =3D true;=0A=
      }=0A=
    } else {=0A=
      this.active =3D false;=0A=
      this.hide();=0A=
    }=0A=
  },=0A=
  =0A=
  markPrevious: function() {=0A=
    if(this.index > 0) this.index--=0A=
      else this.index =3D this.entryCount-1;=0A=
    this.getEntry(this.index).scrollIntoView(false);=0A=
  },=0A=
  =0A=
  markNext: function() {=0A=
    if(this.index < this.entryCount-1) this.index++=0A=
      else this.index =3D 0;=0A=
    this.getEntry(this.index).scrollIntoView(false);=0A=
  },=0A=
  =0A=
  getEntry: function(index) {=0A=
    return this.update.firstChild.childNodes[index];=0A=
  },=0A=
  =0A=
  getCurrentEntry: function() {=0A=
    return this.getEntry(this.index);=0A=
  },=0A=
  =0A=
  selectEntry: function() {=0A=
    this.active =3D false;=0A=
    this.updateElement(this.getCurrentEntry());=0A=
  },=0A=
=0A=
  updateElement: function(selectedElement) {=0A=
    if (this.options.updateElement) {=0A=
      this.options.updateElement(selectedElement);=0A=
      return;=0A=
    }=0A=
    var value =3D '';=0A=
    if (this.options.select) {=0A=
      var nodes =3D $(selectedElement).select('.' + this.options.select) =
|| [];=0A=
      if(nodes.length>0) value =3D Element.collectTextNodes(nodes[0], =
this.options.select);=0A=
    } else=0A=
      value =3D Element.collectTextNodesIgnoreClass(selectedElement, =
'informal');=0A=
    =0A=
    var bounds =3D this.getTokenBounds();=0A=
    if (bounds[0] !=3D -1) {=0A=
      var newValue =3D this.element.value.substr(0, bounds[0]);=0A=
      var whitespace =3D =
this.element.value.substr(bounds[0]).match(/^\s+/);=0A=
      if (whitespace)=0A=
        newValue +=3D whitespace[0];=0A=
      this.element.value =3D newValue + value + =
this.element.value.substr(bounds[1]);=0A=
    } else {=0A=
      this.element.value =3D value;=0A=
    }=0A=
    this.oldElementValue =3D this.element.value;=0A=
    this.element.focus();=0A=
    =0A=
    if (this.options.afterUpdateElement)=0A=
      this.options.afterUpdateElement(this.element, selectedElement);=0A=
  },=0A=
=0A=
  updateChoices: function(choices) {=0A=
    if(!this.changed && this.hasFocus) {=0A=
      this.update.innerHTML =3D choices;=0A=
      Element.cleanWhitespace(this.update);=0A=
      Element.cleanWhitespace(this.update.down());=0A=
=0A=
      if(this.update.firstChild && this.update.down().childNodes) {=0A=
        this.entryCount =3D =0A=
          this.update.down().childNodes.length;=0A=
        for (var i =3D 0; i < this.entryCount; i++) {=0A=
          var entry =3D this.getEntry(i);=0A=
          entry.autocompleteIndex =3D i;=0A=
          this.addObservers(entry);=0A=
        }=0A=
      } else { =0A=
        this.entryCount =3D 0;=0A=
      }=0A=
=0A=
      this.stopIndicator();=0A=
      this.index =3D -1;=0A=
      =0A=
      if(this.entryCount=3D=3D1 && this.options.autoSelect) {=0A=
        this.selectEntry();=0A=
        this.hide();=0A=
      } else {=0A=
        this.render();=0A=
      }=0A=
    }=0A=
  },=0A=
=0A=
  addObservers: function(element) {=0A=
    Event.observe(element, "mouseover", =
this.onHover.bindAsEventListener(this));=0A=
    Event.observe(element, "click", =
this.onClick.bindAsEventListener(this));=0A=
  },=0A=
=0A=
  onObserverEvent: function() {=0A=
    this.changed =3D false;   =0A=
    this.tokenBounds =3D null;=0A=
    if(this.getToken().length>=3Dthis.options.minChars) {=0A=
      this.getUpdatedChoices();=0A=
    } else {=0A=
      this.active =3D false;=0A=
      this.hide();=0A=
    }=0A=
    this.oldElementValue =3D this.element.value;=0A=
  },=0A=
=0A=
  getToken: function() {=0A=
    var bounds =3D this.getTokenBounds();=0A=
    return this.element.value.substring(bounds[0], bounds[1]).strip();=0A=
  },=0A=
=0A=
  getTokenBounds: function() {=0A=
    if (null !=3D this.tokenBounds) return this.tokenBounds;=0A=
    var value =3D this.element.value;=0A=
    if (value.strip().empty()) return [-1, 0];=0A=
    var diff =3D arguments.callee.getFirstDifferencePos(value, =
this.oldElementValue);=0A=
    var offset =3D (diff =3D=3D this.oldElementValue.length ? 1 : 0);=0A=
    var prevTokenPos =3D -1, nextTokenPos =3D value.length;=0A=
    var tp;=0A=
    for (var index =3D 0, l =3D this.options.tokens.length; index < l; =
++index) {=0A=
      tp =3D value.lastIndexOf(this.options.tokens[index], diff + offset =
- 1);=0A=
      if (tp > prevTokenPos) prevTokenPos =3D tp;=0A=
      tp =3D value.indexOf(this.options.tokens[index], diff + offset);=0A=
      if (-1 !=3D tp && tp < nextTokenPos) nextTokenPos =3D tp;=0A=
    }=0A=
    return (this.tokenBounds =3D [prevTokenPos + 1, nextTokenPos]);=0A=
  }=0A=
});=0A=
=0A=
Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos =3D =
function(newS, oldS) {=0A=
  var boundary =3D Math.min(newS.length, oldS.length);=0A=
  for (var index =3D 0; index < boundary; ++index)=0A=
    if (newS[index] !=3D oldS[index])=0A=
      return index;=0A=
  return boundary;=0A=
};=0A=
=0A=
Ajax.Autocompleter =3D Class.create(Autocompleter.Base, {=0A=
  initialize: function(element, update, url, options) {=0A=
    this.baseInitialize(element, update, options);=0A=
    this.options.asynchronous  =3D true;=0A=
    this.options.onComplete    =3D this.onComplete.bind(this);=0A=
    this.options.defaultParams =3D this.options.parameters || null;=0A=
    this.url                   =3D url;=0A=
  },=0A=
=0A=
  getUpdatedChoices: function() {=0A=
    this.startIndicator();=0A=
    =0A=
    var entry =3D encodeURIComponent(this.options.paramName) + '=3D' + =0A=
      encodeURIComponent(this.getToken());=0A=
=0A=
    this.options.parameters =3D this.options.callback ?=0A=
      this.options.callback(this.element, entry) : entry;=0A=
=0A=
    if(this.options.defaultParams) =0A=
      this.options.parameters +=3D '&' + this.options.defaultParams;=0A=
    =0A=
    new Ajax.Request(this.url, this.options);=0A=
  },=0A=
=0A=
  onComplete: function(request) {=0A=
    this.updateChoices(request.responseText);=0A=
  }=0A=
});=0A=
=0A=
// The local array autocompleter. Used when you'd prefer to=0A=
// inject an array of autocompletion options into the page, rather=0A=
// than sending out Ajax queries, which can be quite slow sometimes.=0A=
//=0A=
// The constructor takes four parameters. The first two are, as usual,=0A=
// the id of the monitored textbox, and id of the autocompletion menu.=0A=
// The third is the array you want to autocomplete from, and the fourth=0A=
// is the options block.=0A=
//=0A=
// Extra local autocompletion options:=0A=
// - choices - How many autocompletion choices to offer=0A=
//=0A=
// - partialSearch - If false, the autocompleter will match entered=0A=
//                    text only at the beginning of strings in the =0A=
//                    autocomplete array. Defaults to true, which will=0A=
//                    match text at the beginning of any *word* in the=0A=
//                    strings in the autocomplete array. If you want to=0A=
//                    search anywhere in the string, additionally set=0A=
//                    the option fullSearch to true (default: off).=0A=
//=0A=
// - fullSsearch - Search anywhere in autocomplete array strings.=0A=
//=0A=
// - partialChars - How many characters to enter before triggering=0A=
//                   a partial match (unlike minChars, which defines=0A=
//                   how many characters are required to do any match=0A=
//                   at all). Defaults to 2.=0A=
//=0A=
// - ignoreCase - Whether to ignore case when autocompleting.=0A=
//                 Defaults to true.=0A=
//=0A=
// It's possible to pass in a custom function as the 'selector' =0A=
// option, if you prefer to write your own autocompletion logic.=0A=
// In that case, the other options above will not apply unless=0A=
// you support them.=0A=
=0A=
Autocompleter.Local =3D Class.create(Autocompleter.Base, {=0A=
  initialize: function(element, update, array, options) {=0A=
    this.baseInitialize(element, update, options);=0A=
    this.options.array =3D array;=0A=
  },=0A=
=0A=
  getUpdatedChoices: function() {=0A=
    this.updateChoices(this.options.selector(this));=0A=
  },=0A=
=0A=
  setOptions: function(options) {=0A=
    this.options =3D Object.extend({=0A=
      choices: 10,=0A=
      partialSearch: true,=0A=
      partialChars: 2,=0A=
      ignoreCase: true,=0A=
      fullSearch: false,=0A=
      selector: function(instance) {=0A=
        var ret       =3D []; // Beginning matches=0A=
        var partial   =3D []; // Inside matches=0A=
        var entry     =3D instance.getToken();=0A=
        var count     =3D 0;=0A=
=0A=
        for (var i =3D 0; i < instance.options.array.length &&  =0A=
          ret.length < instance.options.choices ; i++) { =0A=
=0A=
          var elem =3D instance.options.array[i];=0A=
          var foundPos =3D instance.options.ignoreCase ? =0A=
            elem.toLowerCase().indexOf(entry.toLowerCase()) : =0A=
            elem.indexOf(entry);=0A=
=0A=
          while (foundPos !=3D -1) {=0A=
            if (foundPos =3D=3D 0 && elem.length !=3D entry.length) { =0A=
              ret.push("<li>" + elem.substr(0, entry.length) + =0A=
                elem.substr(entry.length) + "</li>");=0A=
              break;=0A=
            } else if (entry.length >=3D instance.options.partialChars =
&& =0A=
              instance.options.partialSearch && foundPos !=3D -1) {=0A=
              if (instance.options.fullSearch || =
/\s/.test(elem.substr(foundPos-1,1))) {=0A=
                partial.push("<li>" + elem.substr(0, foundPos) +=0A=
                  elem.substr(foundPos, entry.length) + elem.substr(=0A=
                  foundPos + entry.length) + "</li>");=0A=
                break;=0A=
              }=0A=
            }=0A=
=0A=
            foundPos =3D instance.options.ignoreCase ? =0A=
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + =
1) : =0A=
              elem.indexOf(entry, foundPos + 1);=0A=
=0A=
          }=0A=
        }=0A=
        if (partial.length)=0A=
          ret =3D ret.concat(partial.slice(0, instance.options.choices - =
ret.length))=0A=
        return "<ul>" + ret.join('') + "</ul>";=0A=
      }=0A=
    }, options || { });=0A=
  }=0A=
});=0A=
=0A=
// AJAX in-place editor and collection editor=0A=
// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April =
2007).=0A=
=0A=
// Use this if you notice weird scrolling problems on some browsers,=0A=
// the DOM might be a bit confused when this gets called so do this=0A=
// waits 1 ms (with setTimeout) until it does the activation=0A=
Field.scrollFreeActivate =3D function(field) {=0A=
  setTimeout(function() {=0A=
    Field.activate(field);=0A=
  }, 1);=0A=
}=0A=
=0A=
Ajax.InPlaceEditor =3D Class.create({=0A=
  initialize: function(element, url, options) {=0A=
    this.url =3D url;=0A=
    this.element =3D element =3D $(element);=0A=
    this.prepareOptions();=0A=
    this._controls =3D { };=0A=
    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION =
LAYER!!!=0A=
    Object.extend(this.options, options || { });=0A=
    if (!this.options.formId && this.element.id) {=0A=
      this.options.formId =3D this.element.id + '-inplaceeditor';=0A=
      if ($(this.options.formId))=0A=
        this.options.formId =3D '';=0A=
    }=0A=
    if (this.options.externalControl)=0A=
      this.options.externalControl =3D $(this.options.externalControl);=0A=
    if (!this.options.externalControl)=0A=
      this.options.externalControlOnly =3D false;=0A=
    this._originalBackground =3D =
this.element.getStyle('background-color') || 'transparent';=0A=
    this.element.title =3D this.options.clickToEditText;=0A=
    this._boundCancelHandler =3D this.handleFormCancellation.bind(this);=0A=
    this._boundComplete =3D (this.options.onComplete || =
Prototype.emptyFunction).bind(this);=0A=
    this._boundFailureHandler =3D this.handleAJAXFailure.bind(this);=0A=
    this._boundSubmitHandler =3D this.handleFormSubmission.bind(this);=0A=
    this._boundWrapperHandler =3D this.wrapUp.bind(this);=0A=
    this.registerListeners();=0A=
  },=0A=
  checkForEscapeOrReturn: function(e) {=0A=
    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;=0A=
    if (Event.KEY_ESC =3D=3D e.keyCode)=0A=
      this.handleFormCancellation(e);=0A=
    else if (Event.KEY_RETURN =3D=3D e.keyCode)=0A=
      this.handleFormSubmission(e);=0A=
  },=0A=
  createControl: function(mode, handler, extraClasses) {=0A=
    var control =3D this.options[mode + 'Control'];=0A=
    var text =3D this.options[mode + 'Text'];=0A=
    if ('button' =3D=3D control) {=0A=
      var btn =3D document.createElement('input');=0A=
      btn.type =3D 'submit';=0A=
      btn.value =3D text;=0A=
      btn.className =3D 'editor_' + mode + '_button';=0A=
      if ('cancel' =3D=3D mode)=0A=
        btn.onclick =3D this._boundCancelHandler;=0A=
      this._form.appendChild(btn);=0A=
      this._controls[mode] =3D btn;=0A=
    } else if ('link' =3D=3D control) {=0A=
      var link =3D document.createElement('a');=0A=
      link.href =3D '#';=0A=
      link.appendChild(document.createTextNode(text));=0A=
      link.onclick =3D 'cancel' =3D=3D mode ? this._boundCancelHandler : =
this._boundSubmitHandler;=0A=
      link.className =3D 'editor_' + mode + '_link';=0A=
      if (extraClasses)=0A=
        link.className +=3D ' ' + extraClasses;=0A=
      this._form.appendChild(link);=0A=
      this._controls[mode] =3D link;=0A=
    }=0A=
  },=0A=
  createEditField: function() {=0A=
    var text =3D (this.options.loadTextURL ? this.options.loadingText : =
this.getText());=0A=
    var fld;=0A=
    if (1 >=3D this.options.rows && !/\r|\n/.test(this.getText())) {=0A=
      fld =3D document.createElement('input');=0A=
      fld.type =3D 'text';=0A=
      var size =3D this.options.size || this.options.cols || 0;=0A=
      if (0 < size) fld.size =3D size;=0A=
    } else {=0A=
      fld =3D document.createElement('textarea');=0A=
      fld.rows =3D (1 >=3D this.options.rows ? this.options.autoRows : =
this.options.rows);=0A=
      fld.cols =3D this.options.cols || 40;=0A=
    }=0A=
    fld.name =3D this.options.paramName;=0A=
    fld.value =3D text; // No HTML breaks conversion anymore=0A=
    fld.className =3D 'editor_field';=0A=
    if (this.options.submitOnBlur)=0A=
      fld.onblur =3D this._boundSubmitHandler;=0A=
    this._controls.editor =3D fld;=0A=
    if (this.options.loadTextURL)=0A=
      this.loadExternalText();=0A=
    this._form.appendChild(this._controls.editor);=0A=
  },=0A=
  createForm: function() {=0A=
    var ipe =3D this;=0A=
    function addText(mode, condition) {=0A=
      var text =3D ipe.options['text' + mode + 'Controls'];=0A=
      if (!text || condition =3D=3D=3D false) return;=0A=
      ipe._form.appendChild(document.createTextNode(text));=0A=
    };=0A=
    this._form =3D $(document.createElement('form'));=0A=
    this._form.id =3D this.options.formId;=0A=
    this._form.addClassName(this.options.formClassName);=0A=
    this._form.onsubmit =3D this._boundSubmitHandler;=0A=
    this.createEditField();=0A=
    if ('textarea' =3D=3D this._controls.editor.tagName.toLowerCase())=0A=
      this._form.appendChild(document.createElement('br'));=0A=
    if (this.options.onFormCustomization)=0A=
      this.options.onFormCustomization(this, this._form);=0A=
    addText('Before', this.options.okControl || =
this.options.cancelControl);=0A=
    this.createControl('ok', this._boundSubmitHandler);=0A=
    addText('Between', this.options.okControl && =
this.options.cancelControl);=0A=
    this.createControl('cancel', this._boundCancelHandler, =
'editor_cancel');=0A=
    addText('After', this.options.okControl || =
this.options.cancelControl);=0A=
  },=0A=
  destroy: function() {=0A=
    if (this._oldInnerHTML)=0A=
      this.element.innerHTML =3D this._oldInnerHTML;=0A=
    this.leaveEditMode();=0A=
    this.unregisterListeners();=0A=
  },=0A=
  enterEditMode: function(e) {=0A=
    if (this._saving || this._editing) return;=0A=
    this._editing =3D true;=0A=
    this.triggerCallback('onEnterEditMode');=0A=
    if (this.options.externalControl)=0A=
      this.options.externalControl.hide();=0A=
    this.element.hide();=0A=
    this.createForm();=0A=
    this.element.parentNode.insertBefore(this._form, this.element);=0A=
    if (!this.options.loadTextURL)=0A=
      this.postProcessEditField();=0A=
    if (e) Event.stop(e);=0A=
  },=0A=
  enterHover: function(e) {=0A=
    if (this.options.hoverClassName)=0A=
      this.element.addClassName(this.options.hoverClassName);=0A=
    if (this._saving) return;=0A=
    this.triggerCallback('onEnterHover');=0A=
  },=0A=
  getText: function() {=0A=
    return this.element.innerHTML;=0A=
  },=0A=
  handleAJAXFailure: function(transport) {=0A=
    this.triggerCallback('onFailure', transport);=0A=
    if (this._oldInnerHTML) {=0A=
      this.element.innerHTML =3D this._oldInnerHTML;=0A=
      this._oldInnerHTML =3D null;=0A=
    }=0A=
  },=0A=
  handleFormCancellation: function(e) {=0A=
    this.wrapUp();=0A=
    if (e) Event.stop(e);=0A=
  },=0A=
  handleFormSubmission: function(e) {=0A=
    var form =3D this._form;=0A=
    var value =3D $F(this._controls.editor);=0A=
    this.prepareSubmission();=0A=
    var params =3D this.options.callback(form, value) || '';=0A=
    if (Object.isString(params))=0A=
      params =3D params.toQueryParams();=0A=
    params.editorId =3D this.element.id;=0A=
    if (this.options.htmlResponse) {=0A=
      var options =3D Object.extend({ evalScripts: true }, =
this.options.ajaxOptions);=0A=
      Object.extend(options, {=0A=
        parameters: params,=0A=
        onComplete: this._boundWrapperHandler,=0A=
        onFailure: this._boundFailureHandler=0A=
      });=0A=
      new Ajax.Updater({ success: this.element }, this.url, options);=0A=
    } else {=0A=
      var options =3D Object.extend({ method: 'get' }, =
this.options.ajaxOptions);=0A=
      Object.extend(options, {=0A=
        parameters: params,=0A=
        onComplete: this._boundWrapperHandler,=0A=
        onFailure: this._boundFailureHandler=0A=
      });=0A=
      new Ajax.Request(this.url, options);=0A=
    }=0A=
    if (e) Event.stop(e);=0A=
  },=0A=
  leaveEditMode: function() {=0A=
    this.element.removeClassName(this.options.savingClassName);=0A=
    this.removeForm();=0A=
    this.leaveHover();=0A=
    this.element.style.backgroundColor =3D this._originalBackground;=0A=
    this.element.show();=0A=
    if (this.options.externalControl)=0A=
      this.options.externalControl.show();=0A=
    this._saving =3D false;=0A=
    this._editing =3D false;=0A=
    this._oldInnerHTML =3D null;=0A=
    this.triggerCallback('onLeaveEditMode');=0A=
  },=0A=
  leaveHover: function(e) {=0A=
    if (this.options.hoverClassName)=0A=
      this.element.removeClassName(this.options.hoverClassName);=0A=
    if (this._saving) return;=0A=
    this.triggerCallback('onLeaveHover');=0A=
  },=0A=
  loadExternalText: function() {=0A=
    this._form.addClassName(this.options.loadingClassName);=0A=
    this._controls.editor.disabled =3D true;=0A=
    var options =3D Object.extend({ method: 'get' }, =
this.options.ajaxOptions);=0A=
    Object.extend(options, {=0A=
      parameters: 'editorId=3D' + encodeURIComponent(this.element.id),=0A=
      onComplete: Prototype.emptyFunction,=0A=
      onSuccess: function(transport) {=0A=
        this._form.removeClassName(this.options.loadingClassName);=0A=
        var text =3D transport.responseText;=0A=
        if (this.options.stripLoadedTextTags)=0A=
          text =3D text.stripTags();=0A=
        this._controls.editor.value =3D text;=0A=
        this._controls.editor.disabled =3D false;=0A=
        this.postProcessEditField();=0A=
      }.bind(this),=0A=
      onFailure: this._boundFailureHandler=0A=
    });=0A=
    new Ajax.Request(this.options.loadTextURL, options);=0A=
  },=0A=
  postProcessEditField: function() {=0A=
    var fpc =3D this.options.fieldPostCreation;=0A=
    if (fpc)=0A=
      $(this._controls.editor)['focus' =3D=3D fpc ? 'focus' : =
'activate']();=0A=
  },=0A=
  prepareOptions: function() {=0A=
    this.options =3D Object.clone(Ajax.InPlaceEditor.DefaultOptions);=0A=
    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);=0A=
    [this._extraDefaultOptions].flatten().compact().each(function(defs) {=0A=
      Object.extend(this.options, defs);=0A=
    }.bind(this));=0A=
  },=0A=
  prepareSubmission: function() {=0A=
    this._saving =3D true;=0A=
    this.removeForm();=0A=
    this.leaveHover();=0A=
    this.showSaving();=0A=
  },=0A=
  registerListeners: function() {=0A=
    this._listeners =3D { };=0A=
    var listener;=0A=
    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {=0A=
      listener =3D this[pair.value].bind(this);=0A=
      this._listeners[pair.key] =3D listener;=0A=
      if (!this.options.externalControlOnly)=0A=
        this.element.observe(pair.key, listener);=0A=
      if (this.options.externalControl)=0A=
        this.options.externalControl.observe(pair.key, listener);=0A=
    }.bind(this));=0A=
  },=0A=
  removeForm: function() {=0A=
    if (!this._form) return;=0A=
    this._form.remove();=0A=
    this._form =3D null;=0A=
    this._controls =3D { };=0A=
  },=0A=
  showSaving: function() {=0A=
    this._oldInnerHTML =3D this.element.innerHTML;=0A=
    this.element.innerHTML =3D this.options.savingText;=0A=
    this.element.addClassName(this.options.savingClassName);=0A=
    this.element.style.backgroundColor =3D this._originalBackground;=0A=
    this.element.show();=0A=
  },=0A=
  triggerCallback: function(cbName, arg) {=0A=
    if ('function' =3D=3D typeof this.options[cbName]) {=0A=
      this.options[cbName](this, arg);=0A=
    }=0A=
  },=0A=
  unregisterListeners: function() {=0A=
    $H(this._listeners).each(function(pair) {=0A=
      if (!this.options.externalControlOnly)=0A=
        this.element.stopObserving(pair.key, pair.value);=0A=
      if (this.options.externalControl)=0A=
        this.options.externalControl.stopObserving(pair.key, pair.value);=0A=
    }.bind(this));=0A=
  },=0A=
  wrapUp: function(transport) {=0A=
    this.leaveEditMode();=0A=
    // Can't use triggerCallback due to backward compatibility: requires=0A=
    // binding + direct element=0A=
    this._boundComplete(transport, this.element);=0A=
  }=0A=
});=0A=
=0A=
Object.extend(Ajax.InPlaceEditor.prototype, {=0A=
  dispose: Ajax.InPlaceEditor.prototype.destroy=0A=
});=0A=
=0A=
Ajax.InPlaceCollectionEditor =3D Class.create(Ajax.InPlaceEditor, {=0A=
  initialize: function($super, element, url, options) {=0A=
    this._extraDefaultOptions =3D =
Ajax.InPlaceCollectionEditor.DefaultOptions;=0A=
    $super(element, url, options);=0A=
  },=0A=
=0A=
  createEditField: function() {=0A=
    var list =3D document.createElement('select');=0A=
    list.name =3D this.options.paramName;=0A=
    list.size =3D 1;=0A=
    this._controls.editor =3D list;=0A=
    this._collection =3D this.options.collection || [];=0A=
    if (this.options.loadCollectionURL)=0A=
      this.loadCollection();=0A=
    else=0A=
      this.checkForExternalText();=0A=
    this._form.appendChild(this._controls.editor);=0A=
  },=0A=
=0A=
  loadCollection: function() {=0A=
    this._form.addClassName(this.options.loadingClassName);=0A=
    this.showLoadingText(this.options.loadingCollectionText);=0A=
    var options =3D Object.extend({ method: 'get' }, =
this.options.ajaxOptions);=0A=
    Object.extend(options, {=0A=
      parameters: 'editorId=3D' + encodeURIComponent(this.element.id),=0A=
      onComplete: Prototype.emptyFunction,=0A=
      onSuccess: function(transport) {=0A=
        var js =3D transport.responseText.strip();=0A=
        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check=0A=
          throw 'Server returned an invalid collection representation.';=0A=
        this._collection =3D eval(js);=0A=
        this.checkForExternalText();=0A=
      }.bind(this),=0A=
      onFailure: this.onFailure=0A=
    });=0A=
    new Ajax.Request(this.options.loadCollectionURL, options);=0A=
  },=0A=
=0A=
  showLoadingText: function(text) {=0A=
    this._controls.editor.disabled =3D true;=0A=
    var tempOption =3D this._controls.editor.firstChild;=0A=
    if (!tempOption) {=0A=
      tempOption =3D document.createElement('option');=0A=
      tempOption.value =3D '';=0A=
      this._controls.editor.appendChild(tempOption);=0A=
      tempOption.selected =3D true;=0A=
    }=0A=
    tempOption.update((text || '').stripScripts().stripTags());=0A=
  },=0A=
=0A=
  checkForExternalText: function() {=0A=
    this._text =3D this.getText();=0A=
    if (this.options.loadTextURL)=0A=
      this.loadExternalText();=0A=
    else=0A=
      this.buildOptionList();=0A=
  },=0A=
=0A=
  loadExternalText: function() {=0A=
    this.showLoadingText(this.options.loadingText);=0A=
    var options =3D Object.extend({ method: 'get' }, =
this.options.ajaxOptions);=0A=
    Object.extend(options, {=0A=
      parameters: 'editorId=3D' + encodeURIComponent(this.element.id),=0A=
      onComplete: Prototype.emptyFunction,=0A=
      onSuccess: function(transport) {=0A=
        this._text =3D transport.responseText.strip();=0A=
        this.buildOptionList();=0A=
      }.bind(this),=0A=
      onFailure: this.onFailure=0A=
    });=0A=
    new Ajax.Request(this.options.loadTextURL, options);=0A=
  },=0A=
=0A=
  buildOptionList: function() {=0A=
    this._form.removeClassName(this.options.loadingClassName);=0A=
    this._collection =3D this._collection.map(function(entry) {=0A=
      return 2 =3D=3D=3D entry.length ? entry : [entry, entry].flatten();=0A=
    });=0A=
    var marker =3D ('value' in this.options) ? this.options.value : =
this._text;=0A=
    var textFound =3D this._collection.any(function(entry) {=0A=
      return entry[0] =3D=3D marker;=0A=
    }.bind(this));=0A=
    this._controls.editor.update('');=0A=
    var option;=0A=
    this._collection.each(function(entry, index) {=0A=
      option =3D document.createElement('option');=0A=
      option.value =3D entry[0];=0A=
      option.selected =3D textFound ? entry[0] =3D=3D marker : 0 =3D=3D =
index;=0A=
      option.appendChild(document.createTextNode(entry[1]));=0A=
      this._controls.editor.appendChild(option);=0A=
    }.bind(this));=0A=
    this._controls.editor.disabled =3D false;=0A=
    Field.scrollFreeActivate(this._controls.editor);=0A=
  }=0A=
});=0A=
=0A=
//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****=0A=
//**** This only  exists for a while,  in order to  let ****=0A=
//**** users adapt to  the new API.  Read up on the new ****=0A=
//**** API and convert your code to it ASAP!            ****=0A=
=0A=
Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions =3D =
function(options) {=0A=
  if (!options) return;=0A=
  function fallback(name, expr) {=0A=
    if (name in options || expr =3D=3D=3D undefined) return;=0A=
    options[name] =3D expr;=0A=
  };=0A=
  fallback('cancelControl', (options.cancelLink ? 'link' : =
(options.cancelButton ? 'button' :=0A=
    options.cancelLink =3D=3D options.cancelButton =3D=3D false ? false =
: undefined)));=0A=
  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? =
'button' :=0A=
    options.okLink =3D=3D options.okButton =3D=3D false ? false : =
undefined)));=0A=
  fallback('highlightColor', options.highlightcolor);=0A=
  fallback('highlightEndColor', options.highlightendcolor);=0A=
};=0A=
=0A=
Object.extend(Ajax.InPlaceEditor, {=0A=
  DefaultOptions: {=0A=
    ajaxOptions: { },=0A=
    autoRows: 3,                                // Use when multi-line =
w/ rows =3D=3D 1=0A=
    cancelControl: 'link',                      // 'link'|'button'|false=0A=
    cancelText: 'cancel',=0A=
    clickToEditText: 'Click to edit',=0A=
    externalControl: null,                      // id|elt=0A=
    externalControlOnly: false,=0A=
    fieldPostCreation: 'activate',              // =
'activate'|'focus'|false=0A=
    formClassName: 'inplaceeditor-form',=0A=
    formId: null,                               // id|elt=0A=
    highlightColor: '#ffff99',=0A=
    highlightEndColor: '#ffffff',=0A=
    hoverClassName: '',=0A=
    htmlResponse: true,=0A=
    loadingClassName: 'inplaceeditor-loading',=0A=
    loadingText: 'Loading...',=0A=
    okControl: 'button',                        // 'link'|'button'|false=0A=
    okText: 'ok',=0A=
    paramName: 'value',=0A=
    rows: 1,                                    // If 1 and multi-line, =
uses autoRows=0A=
    savingClassName: 'inplaceeditor-saving',=0A=
    savingText: 'Saving...',=0A=
    size: 0,=0A=
    stripLoadedTextTags: false,=0A=
    submitOnBlur: false,=0A=
    textAfterControls: '',=0A=
    textBeforeControls: '',=0A=
    textBetweenControls: ''=0A=
  },=0A=
  DefaultCallbacks: {=0A=
    callback: function(form) {=0A=
      return Form.serialize(form);=0A=
    },=0A=
    onComplete: function(transport, element) {=0A=
      // For backward compatibility, this one is bound to the IPE, and =
passes=0A=
      // the element directly.  It was too often customized, so we don't =
break it.=0A=
      new Effect.Highlight(element, {=0A=
        startcolor: this.options.highlightColor, keepBackgroundImage: =
true });=0A=
    },=0A=
    onEnterEditMode: null,=0A=
    onEnterHover: function(ipe) {=0A=
      ipe.element.style.backgroundColor =3D ipe.options.highlightColor;=0A=
      if (ipe._effect)=0A=
        ipe._effect.cancel();=0A=
    },=0A=
    onFailure: function(transport, ipe) {=0A=
      alert('Error communication with the server: ' + =
transport.responseText.stripTags());=0A=
    },=0A=
    onFormCustomization: null, // Takes the IPE and its generated form, =
after editor, before controls.=0A=
    onLeaveEditMode: null,=0A=
    onLeaveHover: function(ipe) {=0A=
      ipe._effect =3D new Effect.Highlight(ipe.element, {=0A=
        startcolor: ipe.options.highlightColor, endcolor: =
ipe.options.highlightEndColor,=0A=
        restorecolor: ipe._originalBackground, keepBackgroundImage: true=0A=
      });=0A=
    }=0A=
  },=0A=
  Listeners: {=0A=
    click: 'enterEditMode',=0A=
    keydown: 'checkForEscapeOrReturn',=0A=
    mouseover: 'enterHover',=0A=
    mouseout: 'leaveHover'=0A=
  }=0A=
});=0A=
=0A=
Ajax.InPlaceCollectionEditor.DefaultOptions =3D {=0A=
  loadingCollectionText: 'Loading options...'=0A=
};=0A=
=0A=
// Delayed observer, like Form.Element.Observer, =0A=
// but waits for delay after last key input=0A=
// Ideal for live-search fields=0A=
=0A=
Form.Element.DelayedObserver =3D Class.create({=0A=
  initialize: function(element, delay, callback) {=0A=
    this.delay     =3D delay || 0.5;=0A=
    this.element   =3D $(element);=0A=
    this.callback  =3D callback;=0A=
    this.timer     =3D null;=0A=
    this.lastValue =3D $F(this.element); =0A=
    =
Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListen=
er(this));=0A=
  },=0A=
  delayedListener: function(event) {=0A=
    if(this.lastValue =3D=3D $F(this.element)) return;=0A=
    if(this.timer) clearTimeout(this.timer);=0A=
    this.timer =3D setTimeout(this.onTimerEvent.bind(this), this.delay * =
1000);=0A=
    this.lastValue =3D $F(this.element);=0A=
  },=0A=
  onTimerEvent: function() {=0A=
    this.timer =3D null;=0A=
    this.callback(this.element, $F(this.element));=0A=
  }=0A=
});=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/openWindow.js

function openNS(url, width, height) {=0A=
    if ((navigator.appName =3D=3D "Microsoft Internet Explorer") &&=0A=
        (parseFloat(navigator.appVersion) < 4 ))=0A=
    {=0A=
        return false;=0A=
    }=0A=
     =0A=
    if (!width) var width =3D 600;=0A=
    if (!height) var height =3D 400;=0A=
=0A=
    var newX=3Dwidth,newY=3Dheight,xOffset=3D10,yOffset=3D10;=0A=
    var parms =3D 'width=3D' + newX +=0A=
            ',height=3D' + newY +=0A=
            ',screenX=3D'+ xOffset +=0A=
            ',screenY=3D' + yOffset +=0A=
            ',status=3Dyes,toolbar=3Dyes,menubar=3Dyes' +=0A=
            ',scrollbars=3Dyes,resizable=3Dyes,location=3Dyes';=0A=
    nsWin =3D window.open(url,'displayWindow',parms);=0A=
    nsWin.focus();=0A=
    return false;=0A=
}=0A=
=0A=
function openStrippedNS(url) {=0A=
    if ((navigator.appName =3D=3D "Microsoft Internet Explorer") &&=0A=
        (parseFloat(navigator.appVersion) < 4 ))=0A=
    {=0A=
        return false;=0A=
    }=0A=
=0A=
    var xOffset=3D25,yOffset=3D25;=0A=
    var parms =3D 'left=3D'+ xOffset +=0A=
            ',top=3D' + yOffset +=0A=
            ',status=3Dyes,toolbar=3Dno,menubar=3Dno' +=0A=
            ',scrollbars=3Dyes,resizable=3Dyes,location=3Dno';=0A=
    nsWin =3D window.open(url,'displayWindow',parms);=0A=
    nsWin.focus();=0A=
    return false;=0A=
}=0A=
=0A=
function openPopup(url, windowName, width, height) {=0A=
  if ((navigator.appName =3D=3D "Microsoft Internet Explorer") &&=0A=
    (parseFloat(navigator.appVersion) < 4 )) { return false; }=0A=
     =0A=
  var xOffset=3D25,yOffset=3D25;=0A=
  var parms =3D 'width=3D' + width +=0A=
        ',height=3D' + height +=0A=
        ',left=3D' + xOffset +=0A=
        ',top=3D' + yOffset +=0A=
        ',status=3Dno,toolbar=3Dno,menubar=3Dno' +=0A=
        ',scrollbars=3Dyes,resizable=3Dyes';=0A=
  var displayName =3D windowName;=0A=
=0A=
  nsWin =3D window.open(url, displayName, parms);=0A=
  nsWin.focus();=0A=
  return false;=0A=
}=0A=
=0A=
function displayAds() {=0A=
=0A=
  var lbZone =3D document.getElementById('leaderboard');=0A=
  var lbContent =3D document.getElementById('leaderboard2');=0A=
  if(lbZone && lbContent) {=0A=
      lbZone.appendChild(lbContent);=0A=
      lbContent.style.display=3D'inline';=0A=
  }=0A=
=0A=
  var skyZone =3D document.getElementById('skyscraper');=0A=
  var skyContent =3D document.getElementById('skyscraper2');=0A=
  if(skyZone && skyContent) {=0A=
      skyZone.appendChild(skyContent);=0A=
      skyContent.style.display=3D'inline';=0A=
  }=0A=
=0A=
  var boomZone =3D document.getElementById('boombox');=0A=
  var boomContent =3D document.getElementById('boombox2');=0A=
  if(boomZone && boomContent) {=0A=
      boomZone.appendChild(boomContent);=0A=
      boomContent.style.display=3D'inline';=0A=
  }=0A=
}=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/dragdrop.js

// script.aculo.us dragdrop.js v1.8.0, Tue Nov 06 15:01:40 +0300 2007=0A=
=0A=
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, =
http://mir.aculo.us)=0A=
//           (c) 2005-2007 Sammi Williams =
(http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)=0A=
// =0A=
// script.aculo.us is freely distributable under the terms of an =
MIT-style license.=0A=
// For details, see the script.aculo.us web site: http://script.aculo.us/=0A=
=0A=
if(Object.isUndefined(Effect))=0A=
  throw("dragdrop.js requires including script.aculo.us' effects.js =
library");=0A=
=0A=
var Droppables =3D {=0A=
  drops: [],=0A=
=0A=
  remove: function(element) {=0A=
    this.drops =3D this.drops.reject(function(d) { return =
d.element=3D=3D$(element) });=0A=
  },=0A=
=0A=
  add: function(element) {=0A=
    element =3D $(element);=0A=
    var options =3D Object.extend({=0A=
      greedy:     true,=0A=
      hoverclass: null,=0A=
      tree:       false=0A=
    }, arguments[1] || { });=0A=
=0A=
    // cache containers=0A=
    if(options.containment) {=0A=
      options._containers =3D [];=0A=
      var containment =3D options.containment;=0A=
      if(Object.isArray(containment)) {=0A=
        containment.each( function(c) { options._containers.push($(c)) =
});=0A=
      } else {=0A=
        options._containers.push($(containment));=0A=
      }=0A=
    }=0A=
    =0A=
    if(options.accept) options.accept =3D [options.accept].flatten();=0A=
=0A=
    Element.makePositioned(element); // fix IE=0A=
    options.element =3D element;=0A=
=0A=
    this.drops.push(options);=0A=
  },=0A=
  =0A=
  findDeepestChild: function(drops) {=0A=
    deepest =3D drops[0];=0A=
      =0A=
    for (i =3D 1; i < drops.length; ++i)=0A=
      if (Element.isParent(drops[i].element, deepest.element))=0A=
        deepest =3D drops[i];=0A=
    =0A=
    return deepest;=0A=
  },=0A=
=0A=
  isContained: function(element, drop) {=0A=
    var containmentNode;=0A=
    if(drop.tree) {=0A=
      containmentNode =3D element.treeNode; =0A=
    } else {=0A=
      containmentNode =3D element.parentNode;=0A=
    }=0A=
    return drop._containers.detect(function(c) { return containmentNode =
=3D=3D c });=0A=
  },=0A=
  =0A=
  isAffected: function(point, element, drop) {=0A=
    return (=0A=
      (drop.element!=3Delement) &&=0A=
      ((!drop._containers) ||=0A=
        this.isContained(element, drop)) &&=0A=
      ((!drop.accept) ||=0A=
        (Element.classNames(element).detect( =0A=
          function(v) { return drop.accept.include(v) } ) )) &&=0A=
      Position.within(drop.element, point[0], point[1]) );=0A=
  },=0A=
=0A=
  deactivate: function(drop) {=0A=
    if(drop.hoverclass)=0A=
      Element.removeClassName(drop.element, drop.hoverclass);=0A=
    this.last_active =3D null;=0A=
  },=0A=
=0A=
  activate: function(drop) {=0A=
    if(drop.hoverclass)=0A=
      Element.addClassName(drop.element, drop.hoverclass);=0A=
    this.last_active =3D drop;=0A=
  },=0A=
=0A=
  show: function(point, element) {=0A=
    if(!this.drops.length) return;=0A=
    var drop, affected =3D [];=0A=
    =0A=
    this.drops.each( function(drop) {=0A=
      if(Droppables.isAffected(point, element, drop))=0A=
        affected.push(drop);=0A=
    });=0A=
        =0A=
    if(affected.length>0)=0A=
      drop =3D Droppables.findDeepestChild(affected);=0A=
=0A=
    if(this.last_active && this.last_active !=3D drop) =
this.deactivate(this.last_active);=0A=
    if (drop) {=0A=
      Position.within(drop.element, point[0], point[1]);=0A=
      if(drop.onHover)=0A=
        drop.onHover(element, drop.element, =
Position.overlap(drop.overlap, drop.element));=0A=
      =0A=
      if (drop !=3D this.last_active) Droppables.activate(drop);=0A=
    }=0A=
  },=0A=
=0A=
  fire: function(event, element) {=0A=
    if(!this.last_active) return;=0A=
    Position.prepare();=0A=
=0A=
    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], =
element, this.last_active))=0A=
      if (this.last_active.onDrop) {=0A=
        this.last_active.onDrop(element, this.last_active.element, =
event); =0A=
        return true; =0A=
      }=0A=
  },=0A=
=0A=
  reset: function() {=0A=
    if(this.last_active)=0A=
      this.deactivate(this.last_active);=0A=
  }=0A=
}=0A=
=0A=
var Draggables =3D {=0A=
  drags: [],=0A=
  observers: [],=0A=
  =0A=
  register: function(draggable) {=0A=
    if(this.drags.length =3D=3D 0) {=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=
      =0A=
      Event.observe(document, "mouseup", this.eventMouseUp);=0A=
      Event.observe(document, "mousemove", this.eventMouseMove);=0A=
      Event.observe(document, "keypress", this.eventKeypress);=0A=
    }=0A=
    this.drags.push(draggable);=0A=
  },=0A=
  =0A=
  unregister: function(draggable) {=0A=
    this.drags =3D this.drags.reject(function(d) { return =
d=3D=3Ddraggable });=0A=
    if(this.drags.length =3D=3D 0) {=0A=
      Event.stopObserving(document, "mouseup", this.eventMouseUp);=0A=
      Event.stopObserving(document, "mousemove", this.eventMouseMove);=0A=
      Event.stopObserving(document, "keypress", this.eventKeypress);=0A=
    }=0A=
  },=0A=
  =0A=
  activate: function(draggable) {=0A=
    if(draggable.options.delay) { =0A=
      this._timeout =3D setTimeout(function() { =0A=
        Draggables._timeout =3D null; =0A=
        window.focus(); =0A=
        Draggables.activeDraggable =3D draggable; =0A=
      }.bind(this), draggable.options.delay); =0A=
    } else {=0A=
      window.focus(); // allows keypress events if window isn't =
currently focused, fails for Safari=0A=
      this.activeDraggable =3D draggable;=0A=
    }=0A=
  },=0A=
  =0A=
  deactivate: function() {=0A=
    this.activeDraggable =3D null;=0A=
  },=0A=
  =0A=
  updateDrag: function(event) {=0A=
    if(!this.activeDraggable) return;=0A=
    var pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A=
    // Mozilla-based browsers fire successive mousemove events with=0A=
    // the same coordinates, prevent needless redrawing (moz bug?)=0A=
    if(this._lastPointer && (this._lastPointer.inspect() =3D=3D =
pointer.inspect())) return;=0A=
    this._lastPointer =3D pointer;=0A=
    =0A=
    this.activeDraggable.updateDrag(event, pointer);=0A=
  },=0A=
  =0A=
  endDrag: function(event) {=0A=
    if(this._timeout) { =0A=
      clearTimeout(this._timeout); =0A=
      this._timeout =3D null; =0A=
    }=0A=
    if(!this.activeDraggable) return;=0A=
    this._lastPointer =3D null;=0A=
    this.activeDraggable.endDrag(event);=0A=
    this.activeDraggable =3D null;=0A=
  },=0A=
  =0A=
  keyPress: function(event) {=0A=
    if(this.activeDraggable)=0A=
      this.activeDraggable.keyPress(event);=0A=
  },=0A=
  =0A=
  addObserver: function(observer) {=0A=
    this.observers.push(observer);=0A=
    this._cacheObserverCallbacks();=0A=
  },=0A=
  =0A=
  removeObserver: function(element) {  // element instead of observer =
fixes mem leaks=0A=
    this.observers =3D this.observers.reject( function(o) { return =
o.element=3D=3Delement });=0A=
    this._cacheObserverCallbacks();=0A=
  },=0A=
  =0A=
  notify: function(eventName, draggable, event) {  // 'onStart', =
'onEnd', 'onDrag'=0A=
    if(this[eventName+'Count'] > 0)=0A=
      this.observers.each( function(o) {=0A=
        if(o[eventName]) o[eventName](eventName, draggable, event);=0A=
      });=0A=
    if(draggable.options[eventName]) =
draggable.options[eventName](draggable, event);=0A=
  },=0A=
  =0A=
  _cacheObserverCallbacks: function() {=0A=
    ['onStart','onEnd','onDrag'].each( function(eventName) {=0A=
      Draggables[eventName+'Count'] =3D Draggables.observers.select(=0A=
        function(o) { return o[eventName]; }=0A=
      ).length;=0A=
    });=0A=
  }=0A=
}=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
var Draggable =3D Class.create({=0A=
  initialize: function(element) {=0A=
    var defaults =3D {=0A=
      handle: false,=0A=
      reverteffect: function(element, top_offset, left_offset) {=0A=
        var dur =3D =
Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;=0A=
        new Effect.Move(element, { x: -left_offset, y: -top_offset, =
duration: dur,=0A=
          queue: {scope:'_draggable', position:'end'}=0A=
        });=0A=
      },=0A=
      endeffect: function(element) {=0A=
        var toOpacity =3D Object.isNumber(element._opacity) ? =
element._opacity : 1.0;=0A=
        new Effect.Opacity(element, {duration:0.2, from:0.7, =
to:toOpacity, =0A=
          queue: {scope:'_draggable', position:'end'},=0A=
          afterFinish: function(){ =0A=
            Draggable._dragging[element] =3D false =0A=
          }=0A=
        }); =0A=
      },=0A=
      zindex: 1000,=0A=
      revert: false,=0A=
      quiet: false,=0A=
      scroll: false,=0A=
      scrollSensitivity: 20,=0A=
      scrollSpeed: 15,=0A=
      snap: false,  // false, or xy or [x,y] or function(x,y){ return =
[x,y] }=0A=
      delay: 0=0A=
    };=0A=
    =0A=
    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))=0A=
      Object.extend(defaults, {=0A=
        starteffect: function(element) {=0A=
          element._opacity =3D Element.getOpacity(element);=0A=
          Draggable._dragging[element] =3D true;=0A=
          new Effect.Opacity(element, {duration:0.2, =
from:element._opacity, to:0.7}); =0A=
        }=0A=
      });=0A=
    =0A=
    var options =3D Object.extend(defaults, arguments[1] || { });=0A=
=0A=
    this.element =3D $(element);=0A=
    =0A=
    if(options.handle && Object.isString(options.handle))=0A=
      this.handle =3D this.element.down('.'+options.handle, 0);=0A=
    =0A=
    if(!this.handle) this.handle =3D $(options.handle);=0A=
    if(!this.handle) this.handle =3D this.element;=0A=
    =0A=
    if(options.scroll && !options.scroll.scrollTo && =
!options.scroll.outerHTML) {=0A=
      options.scroll =3D $(options.scroll);=0A=
      this._isScrollChild =3D Element.childOf(this.element, =
options.scroll);=0A=
    }=0A=
=0A=
    Element.makePositioned(this.element); // fix IE    =0A=
=0A=
    this.options  =3D options;=0A=
    this.dragging =3D false;   =0A=
=0A=
    this.eventMouseDown =3D this.initDrag.bindAsEventListener(this);=0A=
    Event.observe(this.handle, "mousedown", this.eventMouseDown);=0A=
    =0A=
    Draggables.register(this);=0A=
  },=0A=
  =0A=
  destroy: function() {=0A=
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);=0A=
    Draggables.unregister(this);=0A=
  },=0A=
  =0A=
  currentDelta: function() {=0A=
    return([=0A=
      parseInt(Element.getStyle(this.element,'left') || '0'),=0A=
      parseInt(Element.getStyle(this.element,'top') || '0')]);=0A=
  },=0A=
  =0A=
  initDrag: function(event) {=0A=
    if(!Object.isUndefined(Draggable._dragging[this.element]) &&=0A=
      Draggable._dragging[this.element]) return;=0A=
    if(Event.isLeftClick(event)) {    =0A=
      // abort on form elements, fixes a Firefox issue=0A=
      var src =3D Event.element(event);=0A=
      if((tag_name =3D src.tagName.toUpperCase()) && (=0A=
        tag_name=3D=3D'INPUT' ||=0A=
        tag_name=3D=3D'SELECT' ||=0A=
        tag_name=3D=3D'OPTION' ||=0A=
        tag_name=3D=3D'BUTTON' ||=0A=
        tag_name=3D=3D'TEXTAREA')) return;=0A=
        =0A=
      var pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A=
      var pos     =3D Position.cumulativeOffset(this.element);=0A=
      this.offset =3D [0,1].map( function(i) { return (pointer[i] - =
pos[i]) });=0A=
      =0A=
      Draggables.activate(this);=0A=
      Event.stop(event);=0A=
    }=0A=
  },=0A=
  =0A=
  startDrag: function(event) {=0A=
    this.dragging =3D true;=0A=
    if(!this.delta)=0A=
      this.delta =3D this.currentDelta();=0A=
    =0A=
    if(this.options.zindex) {=0A=
      this.originalZ =3D =
parseInt(Element.getStyle(this.element,'z-index') || 0);=0A=
      this.element.style.zIndex =3D this.options.zindex;=0A=
    }=0A=
    =0A=
    if(this.options.ghosting) {=0A=
      this._clone =3D this.element.cloneNode(true);=0A=
      this.element._originallyAbsolute =3D =
(this.element.getStyle('position') =3D=3D 'absolute');=0A=
      if (!this.element._originallyAbsolute)=0A=
        Position.absolutize(this.element);=0A=
      this.element.parentNode.insertBefore(this._clone, this.element);=0A=
    }=0A=
    =0A=
    if(this.options.scroll) {=0A=
      if (this.options.scroll =3D=3D window) {=0A=
        var where =3D this._getWindowScroll(this.options.scroll);=0A=
        this.originalScrollLeft =3D where.left;=0A=
        this.originalScrollTop =3D where.top;=0A=
      } else {=0A=
        this.originalScrollLeft =3D this.options.scroll.scrollLeft;=0A=
        this.originalScrollTop =3D this.options.scroll.scrollTop;=0A=
      }=0A=
    }=0A=
    =0A=
    Draggables.notify('onStart', this, event);=0A=
        =0A=
    if(this.options.starteffect) this.options.starteffect(this.element);=0A=
  },=0A=
  =0A=
  updateDrag: function(event, pointer) {=0A=
    if(!this.dragging) this.startDrag(event);=0A=
    =0A=
    if(!this.options.quiet){=0A=
      Position.prepare();=0A=
      Droppables.show(pointer, this.element);=0A=
    }=0A=
    =0A=
    Draggables.notify('onDrag', this, event);=0A=
    =0A=
    this.draw(pointer);=0A=
    if(this.options.change) this.options.change(this);=0A=
    =0A=
    if(this.options.scroll) {=0A=
      this.stopScrolling();=0A=
      =0A=
      var p;=0A=
      if (this.options.scroll =3D=3D window) {=0A=
        with(this._getWindowScroll(this.options.scroll)) { p =3D [ left, =
top, left+width, top+height ]; }=0A=
      } else {=0A=
        p =3D Position.page(this.options.scroll);=0A=
        p[0] +=3D this.options.scroll.scrollLeft + Position.deltaX;=0A=
        p[1] +=3D this.options.scroll.scrollTop + Position.deltaY;=0A=
        p.push(p[0]+this.options.scroll.offsetWidth);=0A=
        p.push(p[1]+this.options.scroll.offsetHeight);=0A=
      }=0A=
      var speed =3D [0,0];=0A=
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] =
=3D pointer[0]-(p[0]+this.options.scrollSensitivity);=0A=
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] =
=3D pointer[1]-(p[1]+this.options.scrollSensitivity);=0A=
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] =
=3D pointer[0]-(p[2]-this.options.scrollSensitivity);=0A=
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] =
=3D pointer[1]-(p[3]-this.options.scrollSensitivity);=0A=
      this.startScrolling(speed);=0A=
    }=0A=
    =0A=
    // fix AppleWebKit rendering=0A=
    if(Prototype.Browser.WebKit) window.scrollBy(0,0);=0A=
    =0A=
    Event.stop(event);=0A=
  },=0A=
  =0A=
  finishDrag: function(event, success) {=0A=
    this.dragging =3D false;=0A=
    =0A=
    if(this.options.quiet){=0A=
      Position.prepare();=0A=
      var pointer =3D [Event.pointerX(event), Event.pointerY(event)];=0A=
      Droppables.show(pointer, this.element);=0A=
    }=0A=
=0A=
    if(this.options.ghosting) {=0A=
      if (!this.element._originallyAbsolute)=0A=
        Position.relativize(this.element);=0A=
      delete this.element._originallyAbsolute;=0A=
      Element.remove(this._clone);=0A=
      this._clone =3D null;=0A=
    }=0A=
=0A=
    var dropped =3D false; =0A=
    if(success) { =0A=
      dropped =3D Droppables.fire(event, this.element); =0A=
      if (!dropped) dropped =3D false; =0A=
    }=0A=
    if(dropped && this.options.onDropped) =
this.options.onDropped(this.element);=0A=
    Draggables.notify('onEnd', this, event);=0A=
=0A=
    var revert =3D this.options.revert;=0A=
    if(revert && Object.isFunction(revert)) revert =3D =
revert(this.element);=0A=
    =0A=
    var d =3D this.currentDelta();=0A=
    if(revert && this.options.reverteffect) {=0A=
      if (dropped =3D=3D 0 || revert !=3D 'failure')=0A=
        this.options.reverteffect(this.element,=0A=
          d[1]-this.delta[1], d[0]-this.delta[0]);=0A=
    } else {=0A=
      this.delta =3D d;=0A=
    }=0A=
=0A=
    if(this.options.zindex)=0A=
      this.element.style.zIndex =3D this.originalZ;=0A=
=0A=
    if(this.options.endeffect) =0A=
      this.options.endeffect(this.element);=0A=
      =0A=
    Draggables.deactivate(this);=0A=
    Droppables.reset();=0A=
  },=0A=
  =0A=
  keyPress: function(event) {=0A=
    if(event.keyCode!=3DEvent.KEY_ESC) return;=0A=
    this.finishDrag(event, false);=0A=
    Event.stop(event);=0A=
  },=0A=
  =0A=
  endDrag: function(event) {=0A=
    if(!this.dragging) return;=0A=
    this.stopScrolling();=0A=
    this.finishDrag(event, true);=0A=
    Event.stop(event);=0A=
  },=0A=
  =0A=
  draw: function(point) {=0A=
    var pos =3D Position.cumulativeOffset(this.element);=0A=
    if(this.options.ghosting) {=0A=
      var r   =3D Position.realOffset(this.element);=0A=
      pos[0] +=3D r[0] - Position.deltaX; pos[1] +=3D r[1] - =
Position.deltaY;=0A=
    }=0A=
    =0A=
    var d =3D this.currentDelta();=0A=
    pos[0] -=3D d[0]; pos[1] -=3D d[1];=0A=
    =0A=
    if(this.options.scroll && (this.options.scroll !=3D window && =
this._isScrollChild)) {=0A=
      pos[0] -=3D this.options.scroll.scrollLeft-this.originalScrollLeft;=0A=
      pos[1] -=3D this.options.scroll.scrollTop-this.originalScrollTop;=0A=
    }=0A=
    =0A=
    var p =3D [0,1].map(function(i){ =0A=
      return (point[i]-pos[i]-this.offset[i]) =0A=
    }.bind(this));=0A=
    =0A=
    if(this.options.snap) {=0A=
      if(Object.isFunction(this.options.snap)) {=0A=
        p =3D this.options.snap(p[0],p[1],this);=0A=
      } else {=0A=
      if(Object.isArray(this.options.snap)) {=0A=
        p =3D p.map( function(v, i) {=0A=
          return (v/this.options.snap[i]).round()*this.options.snap[i] =
}.bind(this))=0A=
      } else {=0A=
        p =3D p.map( function(v) {=0A=
          return (v/this.options.snap).round()*this.options.snap =
}.bind(this))=0A=
      }=0A=
    }}=0A=
    =0A=
    var style =3D this.element.style;=0A=
    if((!this.options.constraint) || =
(this.options.constraint=3D=3D'horizontal'))=0A=
      style.left =3D p[0] + "px";=0A=
    if((!this.options.constraint) || =
(this.options.constraint=3D=3D'vertical'))=0A=
      style.top  =3D p[1] + "px";=0A=
    =0A=
    if(style.visibility=3D=3D"hidden") style.visibility =3D ""; // fix =
gecko rendering=0A=
  },=0A=
  =0A=
  stopScrolling: function() {=0A=
    if(this.scrollInterval) {=0A=
      clearInterval(this.scrollInterval);=0A=
      this.scrollInterval =3D null;=0A=
      Draggables._lastScrollPointer =3D null;=0A=
    }=0A=
  },=0A=
  =0A=
  startScrolling: function(speed) {=0A=
    if(!(speed[0] || speed[1])) return;=0A=
    this.scrollSpeed =3D =
[speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];=0A=
    this.lastScrolled =3D new Date();=0A=
    this.scrollInterval =3D setInterval(this.scroll.bind(this), 10);=0A=
  },=0A=
  =0A=
  scroll: function() {=0A=
    var current =3D new Date();=0A=
    var delta =3D current - this.lastScrolled;=0A=
    this.lastScrolled =3D current;=0A=
    if(this.options.scroll =3D=3D window) {=0A=
      with (this._getWindowScroll(this.options.scroll)) {=0A=
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {=0A=
          var d =3D delta / 1000;=0A=
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], =
top + d*this.scrollSpeed[1] );=0A=
        }=0A=
      }=0A=
    } else {=0A=
      this.options.scroll.scrollLeft +=3D this.scrollSpeed[0] * delta / =
1000;=0A=
      this.options.scroll.scrollTop  +=3D this.scrollSpeed[1] * delta / =
1000;=0A=
    }=0A=
    =0A=
    Position.prepare();=0A=
    Droppables.show(Draggables._lastPointer, this.element);=0A=
    Draggables.notify('onDrag', this);=0A=
    if (this._isScrollChild) {=0A=
      Draggables._lastScrollPointer =3D Draggables._lastScrollPointer || =
$A(Draggables._lastPointer);=0A=
      Draggables._lastScrollPointer[0] +=3D this.scrollSpeed[0] * delta =
/ 1000;=0A=
      Draggables._lastScrollPointer[1] +=3D this.scrollSpeed[1] * delta =
/ 1000;=0A=
      if (Draggables._lastScrollPointer[0] < 0)=0A=
        Draggables._lastScrollPointer[0] =3D 0;=0A=
      if (Draggables._lastScrollPointer[1] < 0)=0A=
        Draggables._lastScrollPointer[1] =3D 0;=0A=
      this.draw(Draggables._lastScrollPointer);=0A=
    }=0A=
    =0A=
    if(this.options.change) this.options.change(this);=0A=
  },=0A=
  =0A=
  _getWindowScroll: function(w) {=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=
Draggable._dragging =3D { };=0A=
=0A=
/*-----------------------------------------------------------------------=
---*/=0A=
=0A=
var SortableObserver =3D Class.create({=0A=
  initialize: function(element, observer) {=0A=
    this.element   =3D $(element);=0A=
    this.observer  =3D observer;=0A=
    this.lastValue =3D Sortable.serialize(this.element);=0A=
  },=0A=
  =0A=
  onStart: function() {=0A=
    this.lastValue =3D Sortable.serialize(this.element);=0A=
  },=0A=
  =0A=
  onEnd: function() {=0A=
    Sortable.unmark();=0A=
    if(this.lastValue !=3D Sortable.serialize(this.element))=0A=
      this.observer(this.element)=0A=
  }=0A=
});=0A=
=0A=
var Sortable =3D {=0A=
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,=0A=
  =0A=
  sortables: { },=0A=
  =0A=
  _findRootElement: function(element) {=0A=
    while (element.tagName.toUpperCase() !=3D "BODY") {  =0A=
      if(element.id && Sortable.sortables[element.id]) return element;=0A=
      element =3D element.parentNode;=0A=
    }=0A=
  },=0A=
=0A=
  options: function(element) {=0A=
    element =3D Sortable._findRootElement($(element));=0A=
    if(!element) return;=0A=
    return Sortable.sortables[element.id];=0A=
  },=0A=
  =0A=
  destroy: function(element){=0A=
    var s =3D Sortable.options(element);=0A=
    =0A=
    if(s) {=0A=
      Draggables.removeObserver(s.element);=0A=
      s.droppables.each(function(d){ Droppables.remove(d) });=0A=
      s.draggables.invoke('destroy');=0A=
      =0A=
      delete Sortable.sortables[s.element.id];=0A=
    }=0A=
  },=0A=
=0A=
  create: function(element) {=0A=
    element =3D $(element);=0A=
    var options =3D Object.extend({ =0A=
      element:     element,=0A=
      tag:         'li',       // assumes li children, override with =
tag: 'tagname'=0A=
      dropOnEmpty: false,=0A=
      tree:        false,=0A=
      treeTag:     'ul',=0A=
      overlap:     'vertical', // one of 'vertical', 'horizontal'=0A=
      constraint:  'vertical', // one of 'vertical', 'horizontal', false=0A=
      containment: element,    // also takes array of elements (or =
id's); or false=0A=
      handle:      false,      // or a CSS class=0A=
      only:        false,=0A=
      delay:       0,=0A=
      hoverclass:  null,=0A=
      ghosting:    false,=0A=
      quiet:       false, =0A=
      scroll:      false,=0A=
      scrollSensitivity: 20,=0A=
      scrollSpeed: 15,=0A=
      format:      this.SERIALIZE_RULE,=0A=
      =0A=
      // these take arrays of elements or ids and can be =0A=
      // used for better initialization performance=0A=
      elements:    false,=0A=
      handles:     false,=0A=
      =0A=
      onChange:    Prototype.emptyFunction,=0A=
      onUpdate:    Prototype.emptyFunction=0A=
    }, arguments[1] || { });=0A=
=0A=
    // clear any old sortable with same element=0A=
    this.destroy(element);=0A=
=0A=
    // build options for the draggables=0A=
    var options_for_draggable =3D {=0A=
      revert:      true,=0A=
      quiet:       options.quiet,=0A=
      scroll:      options.scroll,=0A=
      scrollSpeed: options.scrollSpeed,=0A=
      scrollSensitivity: options.scrollSensitivity,=0A=
      delay:       options.delay,=0A=
      ghosting:    options.ghosting,=0A=
      constraint:  options.constraint,=0A=
      handle:      options.handle };=0A=
=0A=
    if(options.starteffect)=0A=
      options_for_draggable.starteffect =3D options.starteffect;=0A=
=0A=
    if(options.reverteffect)=0A=
      options_for_draggable.reverteffect =3D options.reverteffect;=0A=
    else=0A=
      if(options.ghosting) options_for_draggable.reverteffect =3D =
function(element) {=0A=
        element.style.top  =3D 0;=0A=
        element.style.left =3D 0;=0A=
      };=0A=
=0A=
    if(options.endeffect)=0A=
      options_for_draggable.endeffect =3D options.endeffect;=0A=
=0A=
    if(options.zindex)=0A=
      options_for_draggable.zindex =3D options.zindex;=0A=
=0A=
    // build options for the droppables  =0A=
    var options_for_droppable =3D {=0A=
      overlap:     options.overlap,=0A=
      containment: options.containment,=0A=
      tree:        options.tree,=0A=
      hoverclass:  options.hoverclass,=0A=
      onHover:     Sortable.onHover=0A=
    }=0A=
    =0A=
    var options_for_tree =3D {=0A=
      onHover:      Sortable.onEmptyHover,=0A=
      overlap:      options.overlap,=0A=
      containment:  options.containment,=0A=
      hoverclass:   options.hoverclass=0A=
    }=0A=
=0A=
    // fix for gecko engine=0A=
    Element.cleanWhitespace(element); =0A=
=0A=
    options.draggables =3D [];=0A=
    options.droppables =3D [];=0A=
=0A=
    // drop on empty handling=0A=
    if(options.dropOnEmpty || options.tree) {=0A=
      Droppables.add(element, options_for_tree);=0A=
      options.droppables.push(element);=0A=
    }=0A=
=0A=
    (options.elements || this.findElements(element, options) || =
[]).each( function(e,i) {=0A=
      var handle =3D options.handles ? $(options.handles[i]) :=0A=
        (options.handle ? $(e).select('.' + options.handle)[0] : e); =0A=
      options.draggables.push(=0A=
        new Draggable(e, Object.extend(options_for_draggable, { handle: =
handle })));=0A=
      Droppables.add(e, options_for_droppable);=0A=
      if(options.tree) e.treeNode =3D element;=0A=
      options.droppables.push(e);      =0A=
    });=0A=
    =0A=
    if(options.tree) {=0A=
      (Sortable.findTreeElements(element, options) || []).each( =
function(e) {=0A=
        Droppables.add(e, options_for_tree);=0A=
        e.treeNode =3D element;=0A=
        options.droppables.push(e);=0A=
      });=0A=
    }=0A=
=0A=
    // keep reference=0A=
    this.sortables[element.id] =3D options;=0A=
=0A=
    // for onupdate=0A=
    Draggables.addObserver(new SortableObserver(element, =
options.onUpdate));=0A=
=0A=
  },=0A=
=0A=
  // return all suitable-for-sortable elements in a guaranteed order=0A=
  findElements: function(element, options) {=0A=
    return Element.findChildren(=0A=
      element, options.only, options.tree ? true : false, options.tag);=0A=
  },=0A=
  =0A=
  findTreeElements: function(element, options) {=0A=
    return Element.findChildren(=0A=
      element, options.only, options.tree ? true : false, =
options.treeTag);=0A=
  },=0A=
=0A=
  onHover: function(element, dropon, overlap) {=0A=
    if(Element.isParent(dropon, element)) return;=0A=
=0A=
    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {=0A=
      return;=0A=
    } else if(overlap>0.5) {=0A=
      Sortable.mark(dropon, 'before');=0A=
      if(dropon.previousSibling !=3D element) {=0A=
        var oldParentNode =3D element.parentNode;=0A=
        element.style.visibility =3D "hidden"; // fix gecko rendering=0A=
        dropon.parentNode.insertBefore(element, dropon);=0A=
        if(dropon.parentNode!=3DoldParentNode) =0A=
          Sortable.options(oldParentNode).onChange(element);=0A=
        Sortable.options(dropon.parentNode).onChange(element);=0A=
      }=0A=
    } else {=0A=
      Sortable.mark(dropon, 'after');=0A=
      var nextElement =3D dropon.nextSibling || null;=0A=
      if(nextElement !=3D element) {=0A=
        var oldParentNode =3D element.parentNode;=0A=
        element.style.visibility =3D "hidden"; // fix gecko rendering=0A=
        dropon.parentNode.insertBefore(element, nextElement);=0A=
        if(dropon.parentNode!=3DoldParentNode) =0A=
          Sortable.options(oldParentNode).onChange(element);=0A=
        Sortable.options(dropon.parentNode).onChange(element);=0A=
      }=0A=
    }=0A=
  },=0A=
  =0A=
  onEmptyHover: function(element, dropon, overlap) {=0A=
    var oldParentNode =3D element.parentNode;=0A=
    var droponOptions =3D Sortable.options(dropon);=0A=
        =0A=
    if(!Element.isParent(dropon, element)) {=0A=
      var index;=0A=
      =0A=
      var children =3D Sortable.findElements(dropon, {tag: =
droponOptions.tag, only: droponOptions.only});=0A=
      var child =3D null;=0A=
            =0A=
      if(children) {=0A=
        var offset =3D Element.offsetSize(dropon, droponOptions.overlap) =
* (1.0 - overlap);=0A=
        =0A=
        for (index =3D 0; index < children.length; index +=3D 1) {=0A=
          if (offset - Element.offsetSize (children[index], =
droponOptions.overlap) >=3D 0) {=0A=
            offset -=3D Element.offsetSize (children[index], =
droponOptions.overlap);=0A=
          } else if (offset - (Element.offsetSize (children[index], =
droponOptions.overlap) / 2) >=3D 0) {=0A=
            child =3D index + 1 < children.length ? children[index + 1] =
: null;=0A=
            break;=0A=
          } else {=0A=
            child =3D children[index];=0A=
            break;=0A=
          }=0A=
        }=0A=
      }=0A=
      =0A=
      dropon.insertBefore(element, child);=0A=
      =0A=
      Sortable.options(oldParentNode).onChange(element);=0A=
      droponOptions.onChange(element);=0A=
    }=0A=
  },=0A=
=0A=
  unmark: function() {=0A=
    if(Sortable._marker) Sortable._marker.hide();=0A=
  },=0A=
=0A=
  mark: function(dropon, position) {=0A=
    // mark on ghosting only=0A=
    var sortable =3D Sortable.options(dropon.parentNode);=0A=
    if(sortable && !sortable.ghosting) return; =0A=
=0A=
    if(!Sortable._marker) {=0A=
      Sortable._marker =3D =0A=
        ($('dropmarker') || =
Element.extend(document.createElement('DIV'))).=0A=
          =
hide().addClassName('dropmarker').setStyle({position:'absolute'});=0A=
      =
document.getElementsByTagName("body").item(0).appendChild(Sortable._marke=
r);=0A=
    }    =0A=
    var offsets =3D Position.cumulativeOffset(dropon);=0A=
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + =
'px'});=0A=
    =0A=
    if(position=3D=3D'after')=0A=
      if(sortable.overlap =3D=3D 'horizontal') =0A=
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) =
+ 'px'});=0A=
      else=0A=
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) =
+ 'px'});=0A=
    =0A=
    Sortable._marker.show();=0A=
  },=0A=
  =0A=
  _tree: function(element, options, parent) {=0A=
    var children =3D Sortable.findElements(element, options) || [];=0A=
  =0A=
    for (var i =3D 0; i < children.length; ++i) {=0A=
      var match =3D children[i].id.match(options.format);=0A=
=0A=
      if (!match) continue;=0A=
      =0A=
      var child =3D {=0A=
        id: encodeURIComponent(match ? match[1] : null),=0A=
        element: element,=0A=
        parent: parent,=0A=
        children: [],=0A=
        position: parent.children.length,=0A=
        container: $(children[i]).down(options.treeTag)=0A=
      }=0A=
      =0A=
      /* Get the element containing the children and recurse over it */=0A=
      if (child.container)=0A=
        this._tree(child.container, options, child)=0A=
      =0A=
      parent.children.push (child);=0A=
    }=0A=
=0A=
    return parent; =0A=
  },=0A=
=0A=
  tree: function(element) {=0A=
    element =3D $(element);=0A=
    var sortableOptions =3D this.options(element);=0A=
    var options =3D Object.extend({=0A=
      tag: sortableOptions.tag,=0A=
      treeTag: sortableOptions.treeTag,=0A=
      only: sortableOptions.only,=0A=
      name: element.id,=0A=
      format: sortableOptions.format=0A=
    }, arguments[1] || { });=0A=
    =0A=
    var root =3D {=0A=
      id: null,=0A=
      parent: null,=0A=
      children: [],=0A=
      container: element,=0A=
      position: 0=0A=
    }=0A=
    =0A=
    return Sortable._tree(element, options, root);=0A=
  },=0A=
=0A=
  /* Construct a [i] index for a particular node */=0A=
  _constructIndex: function(node) {=0A=
    var index =3D '';=0A=
    do {=0A=
      if (node.id) index =3D '[' + node.position + ']' + index;=0A=
    } while ((node =3D node.parent) !=3D null);=0A=
    return index;=0A=
  },=0A=
=0A=
  sequence: function(element) {=0A=
    element =3D $(element);=0A=
    var options =3D Object.extend(this.options(element), arguments[1] || =
{ });=0A=
    =0A=
    return $(this.findElements(element, options) || []).map( =
function(item) {=0A=
      return item.id.match(options.format) ? =
item.id.match(options.format)[1] : '';=0A=
    });=0A=
  },=0A=
=0A=
  setSequence: function(element, new_sequence) {=0A=
    element =3D $(element);=0A=
    var options =3D Object.extend(this.options(element), arguments[2] || =
{ });=0A=
    =0A=
    var nodeMap =3D { };=0A=
    this.findElements(element, options).each( function(n) {=0A=
        if (n.id.match(options.format))=0A=
            nodeMap[n.id.match(options.format)[1]] =3D [n, n.parentNode];=0A=
        n.parentNode.removeChild(n);=0A=
    });=0A=
   =0A=
    new_sequence.each(function(ident) {=0A=
      var n =3D nodeMap[ident];=0A=
      if (n) {=0A=
        n[1].appendChild(n[0]);=0A=
        delete nodeMap[ident];=0A=
      }=0A=
    });=0A=
  },=0A=
  =0A=
  serialize: function(element) {=0A=
    element =3D $(element);=0A=
    var options =3D Object.extend(Sortable.options(element), =
arguments[1] || { });=0A=
    var name =3D encodeURIComponent(=0A=
      (arguments[1] && arguments[1].name) ? arguments[1].name : =
element.id);=0A=
    =0A=
    if (options.tree) {=0A=
      return Sortable.tree(element, arguments[1]).children.map( function =
(item) {=0A=
        return [name + Sortable._constructIndex(item) + "[id]=3D" + =0A=
                =
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));=0A=
      }).flatten().join('&');=0A=
    } else {=0A=
      return Sortable.sequence(element, arguments[1]).map( =
function(item) {=0A=
        return name + "[]=3D" + encodeURIComponent(item);=0A=
      }).join('&');=0A=
    }=0A=
  }=0A=
}=0A=
=0A=
// Returns true if child is contained within element=0A=
Element.isParent =3D function(child, element) {=0A=
  if (!child.parentNode || child =3D=3D element) return false;=0A=
  if (child.parentNode =3D=3D element) return true;=0A=
  return Element.isParent(child.parentNode, element);=0A=
}=0A=
=0A=
Element.findChildren =3D function(element, only, recursive, tagName) {   =0A=
  if(!element.hasChildNodes()) return null;=0A=
  tagName =3D tagName.toUpperCase();=0A=
  if(only) only =3D [only].flatten();=0A=
  var elements =3D [];=0A=
  $A(element.childNodes).each( function(e) {=0A=
    if(e.tagName && e.tagName.toUpperCase()=3D=3DtagName &&=0A=
      (!only || (Element.classNames(e).detect(function(v) { return =
only.include(v) }))))=0A=
        elements.push(e);=0A=
    if(recursive) {=0A=
      var grandchildren =3D Element.findChildren(e, only, recursive, =
tagName);=0A=
      if(grandchildren) elements.push(grandchildren);=0A=
    }=0A=
  });=0A=
=0A=
  return (elements.length>0 ? elements.flatten() : []);=0A=
}=0A=
=0A=
Element.offsetSize =3D function (element, type) {=0A=
  return element['offset' + ((type=3D=3D'vertical' || =
type=3D=3D'height') ? 'Height' : 'Width')];=0A=
}=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.sciencedirect.com/science/page/javascript/pdfDownload.js

function validatePdfDownload(form, type) {=0A=
=0A=
  var total =3D 0;=0A=
  var typeMsg;=0A=
  var msg;=0A=
  var selectedDocList =3D form.art;=0A=
  if (!selectedDocList) {=0A=
    return;=0A=
  }=0A=
  var numDocs =3D 1;=0A=
  if (selectedDocList.length) {=0A=
    numDocs =3D selectedDocList.length;=0A=
  }=0A=
  var  max =3D form.PDF_DDM_MAX.value=0A=
  var proceed=3Dtrue;=0A=
=0A=
  if (numDocs > 1) {=0A=
    for (var i =3D 0; i < numDocs; i++) {=0A=
      if (selectedDocList[i].checked || selectedDocList[i].type =3D=3D =
"hidden") {=0A=
        total +=3D 1;=0A=
      }=0A=
    }=0A=
  } else if (numDocs =3D=3D 1) {=0A=
    // art is a checkbox or a hidden, not an array of such=0A=
    if (selectedDocList.checked || selectedDocList.type =3D=3D 'hidden') =
{=0A=
      total =3D 1;=0A=
    }=0A=
  }=0A=
=0A=
  if (total =3D=3D 0) {=0A=
    if (numDocs > max) {=0A=
      if (type =3D=3D "browse") {=0A=
        typeMsg =3D "results list contains";=0A=
      } else {=0A=
        typeMsg =3D "search retrieved";=0A=
      }=0A=
      msg =3D "Your " + typeMsg + " more than " + max + " documents. =
However, only the first " + max + " documents can be downloaded. =
\nSelect OK to download the first " + max + " documents, or Cancel if =
you do not want to continue.";=0A=
      proceed =3D confirm(msg);=0A=
    } else {=0A=
      if (type =3D=3D "browse") {=0A=
        typeMsg =3D "You have " + numDocs + " documents in your result.";=0A=
      } else {=0A=
        typeMsg =3D "Your search retrieved " + numDocs + " documents.";=0A=
      }=0A=
      msg =3D typeMsg + " \nSelect OK to download the " + numDocs + " =
document(s), or Cancel if you do not want to continue.";=0A=
      proceed =3D confirm(msg);=0A=
    }=0A=
  } else if (total > max) {=0A=
    msg =3D "You can download a maximum of " + max + " documents. =
\nSelect OK to download the first " + max + " documents, or Cancel if =
you do not want to continue.";=0A=
    proceed =3D confirm(msg);=0A=
  }=0A=
  if (proceed) {=0A=
    var oldTarget =3D form.target;=0A=
    var newWidth=3D((document.body.clientWidth*90)/100);=0A=
    var newHeight=3Ddocument.body.clientHeight;=0A=
    var =
pdfWin=3Dwindow.open('','QuosaDDM','width=3D'+newWidth+',height=3D'+newHe=
ight+',resizable=3Dyes,left=3D50,top=3D50');=0A=
    pdfWin.focus();=0A=
    form.target=3D"QuosaDDM";=0A=
    form.pdfDownload.value=3D'download';=0A=
    form.submit ();=0A=
    form.target =3D oldTarget;=0A=
    form.pdfDownload.value=3D'';=0A=
  }=0A=
  return proceed;=0A=
}=0A=

------=_NextPart_000_0071_01CBBD6A.9374CEC0--

