From: <Salvato da Windows Internet Explorer 8>
Subject: =?Windows-1252?Q?La_favola_dell'aborto_facile._Miti_e_realt=E0_della_pill?=
	=?Windows-1252?Q?ola_RU_486_-_Assuntina_Morresi_-_Eugenia_Roccella=2C_Fra?=
	=?Windows-1252?Q?nco_Angeli=2C_9788846475152?=
Date: Sat, 5 Dec 2009 16:16:26 +0100
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_00BC_01CA75C6.4B59EF40"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-assuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" =
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns=3D"http://www.w3.org/1999/xhtml"><HEAD><TITLE>La favola =
dell'aborto facile. Miti e realt=C3=A0 della pillola RU 486 - Assuntina =
Morresi - Eugenia Roccella, Franco Angeli, 9788846475152</TITLE>
<META content=3D"text/html; charset=3Dutf-8" http-equiv=3DContent-Type>
<META lang=3Dit name=3Dkeywords=20
content=3D"libro, La favola dell'aborto facile. Miti e realt=C3=A0 della =
pillola RU 486, , Autore, Assuntina Morresi - Eugenia Roccella, , La =
societ=C3=A0. Saggi, Franco Angeli, 9788846475152, Problemi etici: =
aborto e controllo delle nascite, www.deastore.com">
<META lang=3Dit name=3Ddescription=20
content=3D"&#10;La favola dell'aborto facile. Miti e realt=C3=A0 della =
pillola RU 486 Assuntina Morresi - Eugenia Roccella libro&#10;Una =
campagna ideologica indifferente alla salute delle donne ha diffuso, =
intorno alla RU 486, la pilllola abortiva, il mito di un aborto facile. =
Il nuovo farmaco =C3=A8 apparso come un simbolo di libert=C3=A0 =
femminile e di progresso. Per le autrici, la realt=C3=A0 =C3=A8 diversa: =
l'aborto chimico =C3=A8 pi=C3=B9 rischioso, doloroso, traumatico di =
quello effettuato con altri metodi. Inoltre dura molto pi=C3=B9 tempo, e =
riversa ogni responsabilit=C3=A0 su chi lo subisce, sollevando i medici =
e le strutture sanitarie da molti problemi. Le donne che ne hanno fatto =
esperienza hanno segnalato spontaneamente centinaia di eventi avversi: =
infezioni, emorragie gravi, crampi, allergie, vomito, diarrea, =
complicazioni cardiache e respiratorie.">
<META content=3Dit http-equiv=3DContent-Language>
<META name=3Dcopyright content=3Dwww.deastore.com>
<META name=3Dauthor content=3D"Setit srl"><LINK rel=3D"shortcut icon"=20
type=3Dimage/x-icon href=3D"/favicon.ico"><LINK rel=3Dicon =
type=3Dimage/gif=20
href=3D"/images/car_ani.gif"><LINK rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.deastore.com/stylesheets/all.css?1259592602" =
media=3Dscreen><LINK=20
rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.deastore.com/stylesheets/print_all.css?1216117623"=20
media=3Dprint><LINK rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.deastore.com/stylesheets/_libri_italiani.css?125786109=
3"=20
media=3Dscreen><LINK rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.deastore.com/stylesheets/_scheda_prodotto.css?12532618=
57"=20
media=3Dscreen><LINK rel=3Dstylesheet type=3Dtext/css=20
href=3D"http://www.deastore.com/stylesheets/print_scheda.css?1216117623" =

media=3Dprint>
<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.deastore.com/javascripts/all.js?1250844501"></SCRIPT>

<SCRIPT type=3Dtext/javascript charset=3DUTF-8=20
src=3D"http://service.avail.net/2009-02-13/dynamic/8556be20-24f0-11de-b17=
5-002215995ebc/emark.js"></SCRIPT>

<SCRIPT type=3Dtext/javascript=20
src=3D"http://www.deastore.com/javascripts/avail_util.js?1245756022"></SC=
RIPT>

<META name=3DGENERATOR content=3D"MSHTML 8.00.6001.18852"></HEAD>
<BODY>
<DIV id=3Dheader>
<DIV id=3Dpernatale>
<DIV id=3Dpernatale2>
<DIV id=3Dlogo><A href=3D"http://www.deastore.com/"><IMG alt=3D"Deastore =
Home"=20
src=3D"http://www.deastore.com/images/deastore.gif?1257861092"></A> <IMG =

alt=3DIt_logo =
src=3D"http://www.deastore.com/images/it_logo.gif?1257861092"> </DIV>
<DIV id=3Dwelcome>
<DIV id=3Dwelcome_h1>Buongiorno </DIV>
<P>
<P>Inserisci la login per le <A=20
href=3D"http://www.deastore.com/session/new">raccomandazioni =
deastore</A><BR>Nuovo=20
cliente? <A href=3D"http://www.deastore.com/session/new">Inizia da =
qui</A></P>
<P></P></DIV>
<DIV id=3Dtop_menu>
<UL>
  <LI id=3Dcarrello><A href=3D"http://www.deastore.com/basket"=20
  rel=3Dnofollow>Carrello</A> </LI>
  <LI><A href=3D"http://www.deastore.com/deaonline/logon" =
rel=3Dnofollow>Controllo=20
  ordini</A> </LI>
  <LI><A href=3D"http://www.deastore.com/desiderata" =
rel=3Dnofollow>Lista dei=20
  desideri</A> </LI>
  <LI><A href=3D"http://www.deastore.com/accounts" =
rel=3Dnofollow>Conto</A> </LI>
  <LI><A href=3D"http://www.deastore.com/session/new" =
rel=3Dnofollow>Login</A> </LI>
  <LI id=3Dhelp><A href=3D"http://www.deastore.com/help">Aiuto</A> =
</LI></UL></DIV>
<DIV id=3Dlanguage><A id=3Dlang_it_on=20
onclick=3D"var f =3D document.createElement('form'); f.style.display =3D =
'none'; this.parentNode.appendChild(f); f.method =3D 'POST'; f.action =
=3D this.href;var m =3D document.createElement('input'); =
m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); =
m.setAttribute('value', 'put'); f.appendChild(m);var s =3D =
document.createElement('input'); s.setAttribute('type', 'hidden'); =
s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', =
'983e08cfe0faced4a07d863c4f3ddf51b0728ff0'); =
f.appendChild(s);f.submit();return false;"=20
href=3D"http://www.deastore.com/session/language?id=3Dit-IT"=20
rel=3Dnofollow><SPAN>it</SPAN></A> <A id=3Dlang_en=20
onclick=3D"var f =3D document.createElement('form'); f.style.display =3D =
'none'; this.parentNode.appendChild(f); f.method =3D 'POST'; f.action =
=3D this.href;var m =3D document.createElement('input'); =
m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); =
m.setAttribute('value', 'put'); f.appendChild(m);var s =3D =
document.createElement('input'); s.setAttribute('type', 'hidden'); =
s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', =
'983e08cfe0faced4a07d863c4f3ddf51b0728ff0'); =
f.appendChild(s);f.submit();return false;"=20
href=3D"http://www.deastore.com/session/language?id=3Den-US"=20
rel=3Dnofollow><SPAN>en</SPAN></A> <A id=3Dlang_es=20
onclick=3D"var f =3D document.createElement('form'); f.style.display =3D =
'none'; this.parentNode.appendChild(f); f.method =3D 'POST'; f.action =
=3D this.href;var m =3D document.createElement('input'); =
m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); =
m.setAttribute('value', 'put'); f.appendChild(m);var s =3D =
document.createElement('input'); s.setAttribute('type', 'hidden'); =
s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', =
'983e08cfe0faced4a07d863c4f3ddf51b0728ff0'); =
f.appendChild(s);f.submit();return false;"=20
href=3D"http://www.deastore.com/session/language?id=3Des-ES"=20
rel=3Dnofollow><SPAN>es</SPAN></A> </DIV>
<DIV id=3Dtabs_menu>
<UL>
  <LI id=3DhomeTab><A href=3D"http://www.deastore.com/">Home</A> </LI>
  <LI id=3DMDSTab><A =
href=3D"http://www.deastore.com/customerpage.html">My DEA=20
  Store</A> </LI>
  <LI id=3DlibriTab><A =
href=3D"http://www.deastore.com/libri.html">Libri</A> </LI>
  <LI id=3DbooksTab><A =
href=3D"http://www.deastore.com/books.html">Books</A> </LI><!-- =
%li#livresTab --><!-- %li#librosTab --><!-- %li#bucherTab -->
  <LI id=3DmusicTab><A =
href=3D"http://www.deastore.com/cds.html">Musica</A> </LI>
  <LI id=3DdvdTab><A href=3D"http://www.deastore.com/dvds.html">Film</A> =
</LI>
  <LI id=3DgamesTab><A=20
  href=3D"http://www.deastore.com/games.html">Video<BR>Giochi</A> </LI>
  <LI id=3DgiftTab><A =
href=3D"http://www.deastore.com/regali.html">Regali</A> </LI>
  <LI id=3Dpartner><A href=3D"http://www.deastore.com/partner">Guadagna =
con noi!</A>=20
  </LI>
  <LI id=3DbusinessTab><A =
href=3D"http://www.deastore.com/corporate">Business</A>=20
  </LI></UL></DIV></DIV></DIV>
<DIV id=3Dsub_menu>
<UL id=3DbluMenu>
  <LI><A =
href=3D"http://www.deastore.com/libri/new_releases.html">Novit=C3=A0</A> =
</LI>
  <LI><A href=3D"http://www.deastore.com/libri/offerte.html">Offerte</A> =
</LI>
  <LI><A =
href=3D"http://www.deastore.com/libri/remainders.html">Remainders al=20
  50%</A> </LI>
  <LI><A =
href=3D"http://www.deastore.com/libri/bestsellers.html">Bestsellers=20
  Libri</A> </LI><!-- %li -->
  <LI><A =
href=3D"http://www.deastore.com/categorie/libri.html">Reparti</A>=20
</LI></UL></DIV>
<DIV id=3Dsearch_line>
<UL class=3Dsearch_ul>
  <LI>
  <P><SPAN>Ricerca </SPAN></P></LI>
  <LI>
  <FORM method=3Dpost action=3D/search/italian_books>
  <DIV=20
  style=3D"PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px"><INPUT=20
  value=3D983e08cfe0faced4a07d863c4f3ddf51b0728ff0 type=3Dhidden=20
  name=3Dauthenticity_token></DIV><SELECT id=3Dquery_field=20
    name=3Dproduct_type><OPTION value=3Dproducts>Tutti i =
prodotti</OPTION> <OPTION=20
    selected value=3Ditalian_books>Libri italiani</OPTION> <OPTION=20
    value=3Denglish_books>Libri inglesi</OPTION> <OPTION=20
    value=3Dmusic>Musica</OPTION> <OPTION value=3Dvideos>Film</OPTION> =
<OPTION=20
    value=3Dgames>Videogiochi</OPTION></SELECT> <INPUT id=3Dquery_string =

  title=3D"Per trovare pi=C3=B9 facilmente ci=C3=B2 che cerchi seleziona =
il Tipo di Prodotto prima di cliccare su GO"=20
  type=3Dtext name=3Dcriteria[keywords]> <INPUT id=3Dgo_query=20
  src=3D"http://www.deastore.com/images/go_books.gif?1210171669" =
type=3Dimage>=20
  </FORM></LI>
  <LI><A =
href=3D"http://www.deastore.com/advanced_search/italian_books/new"=20
  rel=3Dnofollow>Ricerca avanzata</A> </LI>
  <LI><A =
href=3D"http://www.deastore.com/customerpage/browsing_history.html"=20
  rel=3Dnofollow>Storia della navigazione</A> </LI></UL>
<P id=3Dfirst_time>Visiti per la prima volta questo sito? <A=20
href=3D"http://www.deastore.com/help">clicca qui</A> e scopri tutto =
quello che c=E2=80=99=C3=A8=20
da sapere su deastore.com </P></DIV><!-- #global_notice --></DIV>
<DIV id=3Dstickies></DIV>
<DIV id=3Dcontainer>
<DIV id=3Dcenter>
<DIV id=3Ddati_scheda>
<DIV id=3Dmain_title>
<H1 class=3Dtitolo_scheda>La favola dell'aborto facile. Miti e =
realt=C3=A0 della=20
pillola RU 486 </H1>
<H1 class=3Dautore_scheda>di: Assuntina Morresi - Eugenia Roccella =
</H1></DIV><A=20
id=3Dcopertina_prod onclick=3D"new Effect.Appear('cover_big'); return =
false;"=20
href=3D"http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-a=
ssuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html#"=20
name=3Dtop><IMG border=3Dnone=20
alt=3D"La favola dell'aborto facile. Miti e realt=C3=A0 della pillola RU =
486"=20
src=3D"http://www.deastore.com/covers/978/884/647/batch2/9788846475152.jp=
g?1252069984"></A>=20

<DIV style=3D"DISPLAY: none" id=3Dcover_big><IMG border=3Dnone=20
alt=3D"La favola dell'aborto facile. Miti e realt=C3=A0 della pillola RU =
486"=20
src=3D"http://www.deastore.com/covers/978/884/647/batch3/9788846475152.jp=
g?1252069984">=20

<P class=3Dchiudi_img><A onclick=3D"new Effect.Fade('cover_big'); return =
false;"=20
href=3D"http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-a=
ssuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html#">Chiu=
di</A>=20
</P></DIV><BR><SPAN class=3Dint_scheda>Autore/i: <A class=3Dinfo=20
href=3D"http://www.deastore.com/autore/Assuntina%20Morresi.html">Assuntin=
a=20
Morresi</A>, <A class=3Dinfo=20
href=3D"http://www.deastore.com/autore/Eugenia%20Roccella.html">Eugenia=20
Roccella</A> </SPAN>
<P><SPAN class=3Dint_scheda>Editore: </SPAN><A class=3Dinfo=20
href=3D"http://www.deastore.com/search/italian_books/0/publisher/Franco%2=
0Angeli">Franco=20
Angeli</A> </P>
<P><SPAN class=3Dint_scheda>Collana: </SPAN><A class=3Dinfo=20
href=3D"http://www.deastore.com/search/italian_books/0/series/La%20societ=
%C3%A0.%20Saggi/publisher/Franco%20Angeli">La=20
societ=C3=A0. Saggi</A> </P>
<P class=3Dsconto_scheda><SPAN class=3Dblack_text>Prezzo deastore.com =
</SPAN><A=20
class=3Dinfo href=3D"http://www.deastore.com/help/260">(info)</A> =
=E2=82=AC 17.00 </P>
<P><SPAN class=3Dint_scheda>Formato: </SPAN>Libro </P>
<P><SPAN class=3Dint_scheda>Data di pubblicazione: </SPAN>2006 </P>
<P><SPAN class=3Dint_scheda>Disponibilit=C3=A0 <A class=3Dinfo=20
href=3D"http://www.deastore.com/help/249">(info)</A> 3 giorni lavorativi =

</SPAN></P>
<DIV class=3Dsotto><SPAN class=3Disbn>ISBN: 8846475151 </SPAN><SPAN =
class=3Disbn>ISBN=20
13: 9788846475152 </SPAN>
<SCRIPT type=3Dtext/javascript=20
src=3D"http://books.google.com/books/previewlib.js"></SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
              GBS_setViewerOptions({'showLinkChrome': false});=0A=
              GBS_setLanguage('it');=0A=
              GBS_insertPreviewButtonPopup('ISBN:9788846475152');=0A=
            </SCRIPT>
</DIV></DIV>
<DIV class=3Dsotto_schede>
<H1 class=3Dtitolo_sotto>La favola dell'aborto facile. Miti e =
realt=C3=A0 della pillola=20
RU 486 un libro di Assuntina Morresi - Eugenia Roccella </H1>Una =
campagna=20
ideologica indifferente alla salute delle donne ha diffuso, intorno alla =
RU 486,=20
la pilllola abortiva, il mito di un aborto facile. Il nuovo farmaco =
=C3=A8 apparso=20
come un simbolo di libert=C3=A0 femminile e di progresso. Per le =
autrici, la realt=C3=A0 =C3=A8=20
diversa: l'aborto chimico =C3=A8 pi=C3=B9 rischioso, doloroso, =
traumatico di quello=20
effettuato con altri metodi. Inoltre dura molto pi=C3=B9 tempo, e =
riversa ogni=20
responsabilit=C3=A0 su chi lo subisce, sollevando i medici e le =
strutture sanitarie=20
da molti problemi. Le donne che ne hanno fatto esperienza hanno =
segnalato=20
spontaneamente centinaia di eventi avversi: infezioni, emorragie gravi, =
crampi,=20
allergie, vomito, diarrea, complicazioni cardiache e respiratorie. <A=20
class=3Dinizio=20
href=3D"http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-a=
ssuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html#top">I=
nizio=20
Pagina</A> </DIV>
<DIV id=3Drecs_display></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
        //<![CDATA[=0A=
        =0A=
                document.observe("dom:loaded", function(){=0A=
                  predictor =3D new DeastorePredictor();=0A=
                  predictor.updateWithPredictions('product', =
'/predictions/products/detail.html', 'recs_display', '177508', =
'ProdPageRelated');=0A=
        =0A=
                  predictor.debugResult("calling consumer predictions");=0A=
                  predictor.onCommit.push(function(){=0A=
                      new =
Ajax.Request('http://www.deastore.com/predictions/events/log', =
{asynchronous:true, evalScripts:true, method:'post', =
parameters:'message=3D' + predictor.getEventsLog() + =
'&authenticity_token=3D' + =
encodeURIComponent('983e08cfe0faced4a07d863c4f3ddf51b0728ff0')})=0A=
                    }=0A=
                  );=0A=
                  predictor.commit();=0A=
                });=0A=
                =0A=
        //]]>=0A=
        </SCRIPT>

<DIV class=3Dsotto_schede>
<H1 class=3Dtitolo_sotto>Informazioni generali sul libro </H1>
<P><SPAN class=3Dint_scheda>Editore &amp; Imprint: </SPAN>Franco Angeli =
</P>
<P><SPAN class=3Dint_scheda>Pagine: </SPAN>176 </P><A class=3Dinizio=20
href=3D"http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-a=
ssuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html#top">I=
nizio=20
Pagina</A> </DIV>
<DIV class=3Dsotto_schede><BR>
<P><SPAN class=3Dtitolo_sotto>Inserisci un commento </SPAN></P>
<P><A class=3Dtitolo_link=20
href=3D"http://www.deastore.com/products/177508/reviews/new"=20
rel=3Dnofollow>Recensisci questo libro</A> - <A class=3Dtitolo_link=20
href=3D"http://www.deastore.com/products/177508/suggestions/new"=20
rel=3Dnofollow>Segnala questo libro a un amico</A> </P>
<P>Per favore, loggati o iscriviti per inviare la tua recensione di =
questo=20
prodotto </P><A class=3Dinizio=20
href=3D"http://www.deastore.com/libro/la-favola-dell-aborto-facile-miti-a=
ssuntina-morresi-eugenia-roccella-franco-angeli/9788846475152.html#top">I=
nizio=20
Pagina</A> </DIV>
<DIV id=3Driferimenti><SPAN class=3Daltri_titolo>Altri libri dello =
stesso autore=20
</SPAN>
<UL>
  <LI class=3Daltri_prodotti><A=20
  =
href=3D"http://www.deastore.com/search/italian_books/0/author/Assuntina%2=
0Morresi">Altri=20
  libri di:&nbsp;Assuntina Morresi</A> </LI>
  <LI class=3Daltri_prodotti><A=20
  =
href=3D"http://www.deastore.com/search/italian_books/0/author/Eugenia%20R=
occella">Altri=20
  libri di:&nbsp;Eugenia Roccella</A> </LI></UL><SPAN =
class=3Daltri_titolo>Altri=20
libri dello stesso reparto </SPAN>
<UL>
  <LI class=3Daltri_prodotti><A=20
  =
href=3D"http://www.deastore.com/libri/problemi-etici-aborto-e-controllo-d=
elle-nascite/CCE_2_0_JFMA/1.html">Altri=20
  libri su:&nbsp;Problemi etici: aborto e controllo delle nascite</A>=20
</LI></UL></DIV></DIV>
<DIV id=3Dright>
<DIV class=3Davailability><SPAN class=3Dquant>Quantit=C3=A0 </SPAN>
<FORM method=3Dpost action=3D/basket/cart_items>
<DIV=20
style=3D"PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px"><INPUT=20
value=3D983e08cfe0faced4a07d863c4f3ddf51b0728ff0 type=3Dhidden=20
name=3Dauthenticity_token></DIV><INPUT id=3Did177508 value=3D177508 =
type=3Dhidden=20
name=3Dcart_item[product_id]> <INPUT id=3Dcart_item_price value=3D17.0 =
type=3Dhidden=20
name=3Dcart_item[price]> <INPUT id=3Dcart_item_referral_code =
type=3Dhidden=20
name=3Dcart_item[referral_code]> <SELECT id=3Dcart_item_quantity=20
name=3Dcart_item[quantity]><OPTION selected value=3D1>1</OPTION> <OPTION =

  value=3D2>2</OPTION> <OPTION value=3D3>3</OPTION> <OPTION =
value=3D4>4</OPTION>=20
  <OPTION value=3D5>5</OPTION> <OPTION value=3D6>6</OPTION> <OPTION=20
  value=3D7>7</OPTION> <OPTION value=3D8>8</OPTION> <OPTION =
value=3D9>9</OPTION>=20
  <OPTION value=3D10>10</OPTION></SELECT> <BR><INPUT=20
src=3D"http://www.deastore.com/images/it_add_to_cart_scheda.gif?121017166=
9"=20
type=3Dimage> </FORM>
<P class=3Dav>Disponibilit=C3=A0 3 giorni lavorativi </P></DIV><BR>
<FORM method=3Dpost action=3D/desiderata/add_item>
<DIV=20
style=3D"PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px"><INPUT=20
value=3D983e08cfe0faced4a07d863c4f3ddf51b0728ff0 type=3Dhidden=20
name=3Dauthenticity_token></DIV><INPUT id=3Dcart_item_product_id =
value=3D177508=20
type=3Dhidden name=3Dcart_item[product_id]> <INPUT id=3Dcart_item_price =
value=3D17.0=20
type=3Dhidden name=3Dcart_item[price]> <INPUT id=3Dcart_item_quantity =
value=3D1=20
type=3Dhidden name=3Dcart_item[quantity]> <INPUT=20
src=3D"http://www.deastore.com/images/it_add_wish.gif?1213885386" =
type=3Dimage>=20
</FORM><A class=3Dwish_or_remove=20
href=3D"http://www.deastore.com/products/177508/suggestions/new"=20
rel=3Dnofollow>Invia a un amico</A> <A class=3Dwish_or_remove=20
href=3D"http://www.deastore.com/products/177508/reviews/new"=20
rel=3Dnofollow>Inserisci un commento</A> <!-- *#posta --><!-- *  %h1 =
--><!-- *    =3D "dea_alerts".t --><!-- *  - form_for :alerts, :url =3D> =
'' do |form| --><!-- *    %p --><!-- *      %span#contPosta --><!-- *    =
    =3D "want_alerts".t --><!-- *      - if !product.subjects.empty? || =
product.type_name =3D=3D "Book" && !product.authors.empty? --><!-- *     =
   %span#select_ok --><!-- *         =3D "select_params".t --><!-- * =
--><!-- *      %ul --><!-- * --><!-- *       - if product.type_name =
=3D=3D "Book" --><!-- *          - =
meaningless_authors_remover(product.authors).each do |author| --><!-- *  =
          %li --><!-- *              =3D check_box_tag author --><!-- *  =
            %span.vantaggi --><!-- *                =3D author --><!-- * =
--><!-- *        - product.subjects.each do |category| --><!-- *         =
 - unless category.blank? --><!-- *            %li --><!-- *             =
 =3D check_box_tag category --><!-- *              %span.vantaggi =
--><!-- *                =3D category.code.t --><!-- * --><!-- *        =
- if product.type_name =3D=3D "Game" && product.platform --><!-- *       =
   %li --><!-- *            =3D check_box_tag product.platform --><!-- * =
           %span.vantaggi --><!-- *              =3D product.platform =
--><!-- *    %p --><!-- *      =3D #image_submit_tag language_prefix + =
"_avanti.gif" --><!-- *      =3D link_to(image_tag(language_prefix + =
"_avanti.gif"), coming_soon_path) -->
<DIV id=3Dsame_authors_container_assuntina-morresi =
class=3Dajax_container></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
          document.observe("dom:loaded", function() {=0A=
          function indicator_show(id){=0A=
          $(id).show();=0A=
          }=0A=
          function indicator_hide(id){=0A=
          $(id).hide();=0A=
          }=0A=
          new Ajax.Updater('same_authors_container_assuntina-morresi', =
'/italian_books/authorship', {asynchronous:true, evalScripts:true, =
method:'get', =
onLoaded:function(request){indicator_hide('same_authors_indicator_assunti=
na-morresi');}, =
onLoading:function(request){indicator_show('same_authors_indicator_assunt=
ina-morresi')}, =
parameters:'authorship=3DAssuntina+Morresi&ean=3D9788846475152&per_page=3D=
5&role=3Dauthor' + '&authenticity_token=3D' + =
encodeURIComponent('983e08cfe0faced4a07d863c4f3ddf51b0728ff0')})=0A=
          });=0A=
        </SCRIPT>
<IMG style=3D"DISPLAY: none" =
id=3Dsame_authors_indicator_assuntina-morresi=20
alt=3DSpinner =
src=3D"http://www.deastore.com/images/spinner.gif?1231497154">=20
<DIV id=3Dsame_authors_container_eugenia-roccella =
class=3Dajax_container></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
          document.observe("dom:loaded", function() {=0A=
          function indicator_show(id){=0A=
          $(id).show();=0A=
          }=0A=
          function indicator_hide(id){=0A=
          $(id).hide();=0A=
          }=0A=
          new Ajax.Updater('same_authors_container_eugenia-roccella', =
'/italian_books/authorship', {asynchronous:true, evalScripts:true, =
method:'get', =
onLoaded:function(request){indicator_hide('same_authors_indicator_eugenia=
-roccella');}, =
onLoading:function(request){indicator_show('same_authors_indicator_eugeni=
a-roccella')}, =
parameters:'authorship=3DEugenia+Roccella&ean=3D9788846475152&per_page=3D=
5&role=3Dauthor' + '&authenticity_token=3D' + =
encodeURIComponent('983e08cfe0faced4a07d863c4f3ddf51b0728ff0')})=0A=
          });=0A=
        </SCRIPT>
<IMG style=3D"DISPLAY: none" =
id=3Dsame_authors_indicator_eugenia-roccella=20
alt=3DSpinner =
src=3D"http://www.deastore.com/images/spinner.gif?1231497154"> </DIV>
<DIV style=3D"CLEAR: both"></DIV></DIV>
<DIV id=3Dfooter>
<DIV id=3Dhistory class=3D"roundedBox storia ">
<DIV class=3D"roundedBox_head storia">
<H2>Storia della navigazione</H2></DIV>
<DIV class=3D"roundedBox_body storia">
<DIV><SPAN class=3DtitleHistory>Per vedere la storia della tua =
navigazione occorre=20
effettuare l=E2=80=99accesso </SPAN>
<DIV class=3Dhd><SPAN class=3DtitleHistory>Prodotti visualizzati =
recentemente=20
</SPAN>
<UL id=3DlastProducts>
  <LI></LI></UL></DIV>
<DIV class=3D"hd middle_f"><SPAN class=3DtitleHistory>Categorie =
visualizzate=20
recentemente </SPAN>
<UL>
  <LI></LI></UL></DIV>
<DIV class=3D"hd right_f"><SPAN class=3DtitleHistory>Ricerche eseguite =
recentemente=20
</SPAN>
<UL>
  <LI></LI></UL></DIV><!-- .hd.right_f --><!-- %span.titleHistory =
--><!-- %ul --><!-- %li --></DIV></DIV></DIV>
<DIV id=3Dpiedino class=3D"roundedBox terra ">
<DIV class=3D"roundedBox_head terra">
<H2></H2></DIV>
<DIV class=3D"roundedBox_body terra">
<DIV>
<UL id=3Dpiedino_ul>
  <LI class=3Dleft_li><A href=3D"http://www.deastore.com/basket"=20
  rel=3Dnofollow>Carrello</A> </LI>
  <LI class=3Dleft_li><A href=3D"http://www.deastore.com/desiderata"=20
  rel=3Dnofollow>Lista dei desideri</A> </LI>
  <LI class=3D"left_li blank"><BR></LI>
  <LI class=3Dleft_li><A=20
  href=3D"http://www.deastore.com/indexes/book/authors/a/1.html">Indice =
Autori=20
  Libri</A> </LI>
  <LI class=3Dleft_li><A=20
  href=3D"http://www.deastore.com/indexes/music/authors/a/1.html">Indice =
Artisti=20
  Musica</A> </LI>
  <LI class=3Dleft_li><A=20
  href=3D"http://www.deastore.com/indexes/video/authors/a/1.html">Indice =

  Attori/Registi Film</A> </LI>
  <LI class=3D"left_li blank"><BR></LI>
  <LI class=3D"middle_li reset"><A =
href=3D"http://www.deastore.com/accounts"=20
  rel=3Dnofollow>Conto</A> </LI>
  <LI class=3Dmiddle_li><A =
href=3D"http://www.deastore.com/deaonline/logon"=20
  rel=3Dnofollow>Controllo ordini</A> </LI>
  <LI class=3D"middle_li blank"><BR></LI>
  <LI class=3Dmiddle_li><A=20
  href=3D"http://www.deastore.com/indexes/book/titles/a/1.html">Indice =
Titoli=20
  Libri</A> </LI>
  <LI class=3Dmiddle_li><A=20
  href=3D"http://www.deastore.com/indexes/music/titles/a/1.html">Indice =
Titoli=20
  Dischi</A> </LI>
  <LI class=3Dmiddle_li><A=20
  href=3D"http://www.deastore.com/indexes/video/titles/a/1.html">Indice =
Titoli=20
  Film</A> </LI>
  <LI class=3Dmiddle_li><A=20
  href=3D"http://www.deastore.com/indexes/game/titles/a/1.html">Indice =
Titoli=20
  Videogiochi</A> </LI>
  <LI class=3D"right_li reset"><A =
href=3D"http://www.deastore.com/session/new"=20
  rel=3Dnofollow>Login</A> </LI>
  <LI class=3Dright_li><A =
href=3D"http://www.deastore.com/help">Aiuto</A> </LI>
  <LI class=3D"right_li blank"><BR></LI>
  <LI class=3Dright_li><A=20
  =
href=3D"http://www.deastore.com/indexes/book/publishers/a/1.html">Indice =
Editori=20
  Libri</A> </LI>
  <LI class=3Dright_li><A=20
  =
href=3D"http://www.deastore.com/indexes/music/publishers/a/1.html">Indice=
=20
  Etichette Musica</A> </LI>
  <LI class=3Dright_li><A=20
  =
href=3D"http://www.deastore.com/indexes/video/publishers/a/1.html">Indice=
=20
  Produttori Film</A> </LI>
  <LI class=3Dright_li><A=20
  =
href=3D"http://www.deastore.com/indexes/game/publishers/a/1.html">Indice =

  Produttori Videogiochi</A> </LI></UL>
<UL id=3Dmenu_bottom>
  <LI>Ricerca </LI>
  <LI>
  <FORM method=3Dpost action=3D/search/italian_books>
  <DIV=20
  style=3D"PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
PADDING-RIGHT: 0px; PADDING-TOP: 0px"><INPUT=20
  value=3D983e08cfe0faced4a07d863c4f3ddf51b0728ff0 type=3Dhidden=20
  name=3Dauthenticity_token></DIV><SELECT id=3Dquery_field2=20
    name=3Dproduct_type><OPTION value=3Dproducts>Tutti i =
prodotti</OPTION> <OPTION=20
    selected value=3Ditalian_books>Libri italiani</OPTION> <OPTION=20
    value=3Denglish_books>Libri inglesi</OPTION> <OPTION =
value=3Dfrench_books>Libri=20
    francesi</OPTION> <OPTION value=3Dspanish_books>Libri =
spagnoli</OPTION>=20
    <OPTION value=3Dgerman_books>Libri tedeschi</OPTION> <OPTION=20
    value=3Dmusic>Musica</OPTION> <OPTION value=3Dvideos>Film</OPTION> =
<OPTION=20
    value=3Dgames>Videogiochi</OPTION></SELECT> <INPUT =
id=3Dquery_string2 type=3Dtext=20
  name=3Dcriteria[keywords]> <INPUT id=3Dgo_bottom=20
  src=3D"http://www.deastore.com/images/go_books.gif?1210171669" =
type=3Dimage>=20
  </FORM></LI>
  <LI><A class=3Dmenu_b=20
  =
href=3D"http://www.deastore.com/advanced_search/italian_books/new">Ricerc=
a=20
  avanzata</A> </LI>
  <LI><A class=3Dmenu_b=20
  =
href=3D"http://www.deastore.com/customerpage/browsing_history.html">Stori=
a della=20
  navigazione</A> </LI></UL></DIV></DIV></DIV></DIV>
<DIV id=3Dcopyright>
<P>2003 - 2009&nbsp;deastore.com </P>
<P>=E2=80=9CLa conoscenza non ha limiti=E2=80=9D sito di propriet=C3=A0 =
<A=20
href=3D"http://www.deamediagroup.com/">DEA Mediagroup =
SpA.</A><BR>Tel.<INS>39 06=20
852121 Fax.</INS>39 06 8543228 Via Pietro Boccanelli 27 00138 Roma Italy =

<BR>P.Iva 00901181008 Cod.Fiscale 00469620587</P><BR>Per commenti o =
suggerimenti=20
sul sito inviare una e-mail a: <A=20
href=3D"mailto:customerservice@deastore.com">customerservice@deastore.com=
</A>=20
<BR>Per problemi sull=E2=80=99utilizzo del sistema, consultare il Centro =
di aiuto online=20
del deastore o inviare una e=E2=80=99mail al servizio tecnico: <A=20
href=3D"mailto:helpdesk@deastore.com">helpdesk@deastore.com</A>=20
<P></P><!-- =3D link_to "Sviluppo e grafica SETIT srl - www.setit.com", =
"http://www.setit.com" --></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
    //<![CDATA[=0A=
    =0A=
          var gaJsHost =3D (("https:" =3D=3D document.location.protocol) =
? "https://ssl." : "http://www.");=0A=
          document.write(unescape("%3Cscript src=3D'" + gaJsHost + =
"google-analytics.com/ga.js' type=3D'text/javascript'%3E%3C/script%3E"));=0A=
        =0A=
    //]]>=0A=
    </SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
    //<![CDATA[=0A=
    =0A=
         try {=0A=
            var pageTracker =3D _gat._getTracker("UA-1610175-1");=0A=
            pageTracker._trackPageview();=0A=
            } catch(err) {}=0A=
        =0A=
    //]]>=0A=
    </SCRIPT>
</BODY></HTML>

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/deastore.gif?1257861092

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
TH0NkJWyiQKBAAA7

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/it_logo.gif?1257861092

R0lGODlhcAAqAOYAALvi+bTLy/G0Tsq7it3u+dWxZcvt+dns+XnE7er1+xCa42q66czQtvP5/anU
8ej0+5TL7rHY8uXz+qzW8dDCkuTy+vzv25rO7un0+7/V1fbAaN/UsaDQ7z2s5/7+/4HC66va9Fu4
6uamNOW6aKTT8PGdFMHp+eDw+pqvm3a9596rS7Ta8+qhJCGh5OLx+prT8qfT8Lje9tbt+YjF7Mbt
+bTU4qPS8Eyy6dzn6cPk9+TLl9Ht+eTGh+v1/LXb9o3I7N7w+YnM8N3i2Pz8/UWu5y+n5tbr+PCk
Jbfc9b7m+fjNiGq/7efz+/n8/rje+J3P79Hq+OLy+ub0+8rn96XY9O/4/Mzn6eefI/z27N/v+djr
+P78/fv9/rfb+L7CqdTp9hqe49rs+MPr+f7+/f38/eHw+fvju/39/fjVm+bs65bQ8bbb812t4/D4
/NzcyIHI7uv2/PKrNuPx+v3+/vb7/arP4L7f9d2iNqve9uz2/O/3/O32/POYBAKU4e73/Nvt+SH5
BAAAAAAALAAAAABwACoAAAf/gHp6VVWCg4WGiYSJen6CiIyNfpOCk4SFjodtDXN0bYxlf6J/E082
MEmiDj6iO6l/houRhJufspeXipCRkY6Tv8DBwr+yig10DYl7BDuiBj4wKzsRExE0ExwRTgaiJ7zf
4I+Yw+Tle+Xo6cEnO10ASDBPE6IrNj8kHBA2Kybd6v/C9pwjJ3BgwIEFDU4qeBAhQ2DLIkTI5uDJ
DgA2JviA8GPCCm6jTkA0SBLiL4EnEyZc+NAPSpYF88jM85LlpJl5UtZUeS7LHwMATHRZ0YXDBwgS
ncgAsGLUnyx+aPIsuVDnS54jp07FybUrV5haC/YoI8cnDRg/LkD4MAGAmD80/6hNWIPEzgEZfyqE
Jbl3T5tPe6QGjpnQKxyvPRLDOTwzcQ+vMgNDTvAnyYQJMCBwqGbjAhK8KyYkcRChS6oEPCNLnrmV
Jh1kVVZD5uq4x2Lbt3Ev3s17d+LGXjG4EOWjGl4xDi4v+BHBRLMV0LX9ITC7utcmXJo02FN7d57u
cBT77pGgfO3E5c2TL59b/G3GBEbtWMFKVAQIKS784PAk9AokADh1gm7u/SbTYY7h5Ngxnvhx3oMP
pifhhBRWKOF45WEwigE0gJTERjPMsEAKH3xAwgFiRNCMU/H9wcR57RU4Xg97CMJdAujVlt56FWKA
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

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/covers/978/884/647/batch2/9788846475152.jpg?1252069984

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

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/covers/978/884/647/batch3/9788846475152.jpg?1252069984

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

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/spinner.gif?1231497154

R0lGODlhEAAQALMNADAwMBAQEO/v78/Pz0BAQCAgIN/f37+/v2BgYJ+fnwAAAP///4CAgP///wAA
AAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAAANACwAAAAAEAAQAAAEObDJieq8uFVEer5bR3xZ
FxQFiaGpOrHSIqtP3cgLbeP6IxlA1wRoEP4MgsPB2FAeElCXE5pgUpmuCAAh+QQJAAANACwAAAAA
EAAQAAAEPrDJSaulKF+bUV1glQEEMYHLVZoSqpaSIW9NYTeyQdsFPm88yWF4eRgnw0PxKDwMEomK
8VGBRmkTK3bLpUUAACH5BAkAAA0ALAAAAAAQABAAAAQ6sMlJK13Yarw0NQZXIeQEGhqJmGBaNkfs
NUQNy15N3MesS4mgpkCcBBPDIlBIeTiVM+dj1nRSr9hJBAAh+QQJAAANACwAAAAAEAAQAAAEN7DJ
ueq80+i6MNYG50nHIWjjVR4ptrZTIrdI3cgJbeM6AkuE4A8ohBUKgaLnwTwWYMyHE8oc/iIAIfkE
CQAADQAsAAAAABAAEAAABDiwyWnqvPPoapbHknZw3oIlyaBN5YmCMJrAdG3feN4gfM4jmIdwQiAA
ehfho8AsEmBKZsFpk+pqEQAh+QQJAAANACwAAAAAEAAQAAAENrDJeeq8M+l6jMeSlnCeATbi5C3s
CbKLi8Fybd/yo+P6w+uFwgRBPAULhCQRYQwmCcvaE1eLAAAh+QQJAAANACwAAAAAEAAQAAAEObDJ
meq8uNV0er5bd3xZJxgGiaGpOrHSI6tL3cgPbeP6IhVA1wRYEP4KAQLB2FASEFCXE4pgUpmuCAAh
+QQJAAANACwAAAAAEAAQAAAEPrDJSaulKV+bU31glQ3HMYHPVZoSqpZSIW+NYTdyQdsGPm88CWF4
WRgnQ0LxKCQAEIiKcVGBRmkTK3bLpUUAACH5BAkAAA0ALAAAAAAQABAAAAQ6sMlJK33Yavw0LQVX
JeQEFhqZmGBaNkTsNUcNy1593MSsS4igxkCcBBHDIlBIWTiVM+di1nRSr9hJBAAh+QQJAAANACwA
AAAAEAAQAAAEN7DJ+eq8s+j6MNYF50kEEWjjVRIptrYTIrdJ3cgIbeN6AkuH4A8ohBkMgqJnwTwa
YMyFE8oc/iIAIfkECQAADQAsAAAAABAAEAAABDiwyVnqvJPoWp7HkkZw3oMhCKBN5YmCMIrAdG3f
eN4kfM4nmIVwcjgMehfhwsAsHmBKpsFpk+pqEQAh+QQJAAANACwAAAAAEAAQAAAENrDJSeq8E+lK
iseShnBeATbi5D3sCbKPi8Fybd/youP6wusGwyRBPAUNhyQxYQwmD8vaE1eLAAA7

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/go_books.gif?1210171669

R0lGODlhFQAVANUAAJ7R5P///97e3uDg4Nra2tbW1h0dHdDQ0MjIyIevvmyHkWR7g8zMzHmapo65
yWqDjXORnI+7y3+jsKmpqf7+/tPT08PDw0BAQGNjY7S0tL6+vu3t7fb29re3tzQ0NIKCgk1NTaCr
r9DV2LW+weXl5WR7hNne32iBirGxsbi4uKWlpXyFiJycnIGKjZGWl3yHipaZmYCGiL29vcLCwu/v
752jpcrMzefp6pmdn+7x8XF7f/39/aSkpAAAAAAAAAAAACH5BAAAAAAALAAAAAAVABUAAAb/QIBw
6JBAHqUHROIYOoeRxiIkyu1yotCiEXkKE4oRJUAuBygjReKZOJnMcLLptBZGFO8zZ0MakDYcYwEm
Cl0ADSNkHH0DjY4kHGQjDQAOC2MbjR0TjgMdBwMbZwtFIQGZHR4eICADFh4XBh+hASFGIhwCAiAY
ugcCGL0dBhYCHCJHNwMCFga/ugIGLLoXHwIDN0g0BAITBt0G3wYTuiDWBDRJNgQEB8QE3gTS7NXs
Nko1Fey88AYEwQSGWSBQocaSFwwKFEABKxaBV7E+KGTwgskCGQwqKEQxAYHChR4rMJBB6lALDQwO
aPz4scIBBhpaUAJwB4cGBCkP6NzJAIEGNhyFhrRxkUHDDARIkc7QkMEFHTYKVqjIkCGFVaoqVqjx
QlOKjhgweMCIoWOLIa6VjCBRwsRLEAA7

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/it_add_to_cart_scheda.gif?1210171669

R0lGODlhhQAjAOZ/AFuz1Oj0+XS51r7H1v/06jyjyrne7PH4+/+WNuXz+N3j60WpzVScw4vJ4Mvn
8c7V32i51//HlH3D3ER3qaXV5//+/f+HG/+nV/+4d//s24XH32OIszl0p7Xc6665ylSKtszn8Yek
xe/x9E2t0NLq8//Zt//48v+MI2Wcwdvu9ZDM4lqoy2ekyFR+rXiszJW61EeFs//jyv+bQcPi7v/S
qkaQuzuItq7a6tjt9YO30//Ci+Hx98Xk8Gu62Fax0muRuqPU5tru9fn8/b3g7S9Zlf+tYlCu0f/p
1nrC3P+zbZzR5P+hS9bp8pbO45DL4ev2+rvP4dfs9P/9+/D0+HGx0f/NoPL5+zyVv1yArv/ewUdw
pP++gmS31mi31XO+2v/v4P/n0ajX6DNpoK3B2Exmitvv9hs8azBZlW2CoJ2rvyxKdVx0lTxYgH2Q
qtTr9O/4+//792etzt7w9o2dtfj8/fv9/v3+/vX6/On1+e33+uTy+PH5+wsuYDBZlP///wAAACH5
BAEAAH8ALAAAAACFACMAAAf/gH+Cg4SCIRtafYp9Z42LZ4yLio2Qk46SlI+Xk5GamJuckqKjpKWi
WlgohaushBtYIVAKdrS1tre4ubq7vL2+v74KUCFYWC6tyD8bA1N1zs/Q0dLT1NN2fti01dvc3d7R
UwMtLcirWGMHdOrr7O3u7/Dw19j0fnbx+Pn6++08KBMsygn6oeCOwYMIEypcyLDhnWsyLMjYkqGC
nzoOM2rcuDGBFyoTVCUTsaekyZMoU6pcybIkthMWYsqgIcWPkJY4c+rMiceLFwEwGLTakCKP0aNI
kypdyrTp0Tp+IiRBEPNECYtOs2rdqnWHlx49ugA0BwWP2bNo06pdy7Yt2jzY/6TESALzAgE/T9zq
3ctXLwgIgCGs4LAqhJ7DiBMrXsy4sePFT+5gM6HDAoIMfgI83sy582YKXEKHhgGDUIsZO+SoXs26
tevWCRK8nv1asxwrfuAUOXHEj2zYv1UnyBNcToIAtJO/1oPcePAUPbgAkM5l8KAfIXBo345DjuQ7
eriLH08HG53x6MfLEYLtDo4DfqrIAONnh/jyfs7jkIxtR5ADUF10QBDpFSgef0Lgp18TADToIACk
CYIFFCC4QcKFJEQRIDZyYOjhhyQE4McDD2QG4okfSjaAAn7I4YcUNCyBWRAeikhiZrhlEIEfBmHz
wADtRYHikBiW4YcCQI5YYv8ASvjg5JNOMkAYCj/w4MCVWLroAR9t4OWAHHjskccbdbwBpphk+kEG
GX7sER4O4YEA5w5G7eAAnXvgIaIffMzh24s6LPGFH2UkkKcce6jJpmRf7EbPA2rwwYcaJb5BZx47
kAAnDjvYF16nbuCZgB5+zMEHNmsSqgQPJISBhBGwwspBDR+EwMOtuPIAFxqT5vdEPcACm0YawfIY
LG7BzgGkG7lhYNexitoUVUzYiGAGGx6kYYYZIgC7YbHelnpqtEEA68UI6I5gAwwtvDDEu/DOAJUZ
kZbohwhokLHGHGbcm+++/Q7rxwB+lgokwQ+ssUa3CZOBRhtsKusHCbkVkYT/CdjM4bC9qWJThAVb
ZMwHi3540Ea3HijsQcYDCKyswAOsQcbK4qLK5ogyF+zFAiMsUAMHE7zQwdBEU7xlGlyiqoYHZIys
5tJNs5iqqdj0Ka4abfRp7cxqqFG1nzPkdsEWFqXBxgBs3NyxH0VcMKgfa7Dhx3/0KGCGB2hwyycb
ZhDLB99pDNCnqStTHa21aHhghp8GLOD4FWIEfcPklCfgR95we82nn4IDaXXn0Rputand9gm66H4C
4YcJS+xYLb7jpvorBltgHC0IPdyAgwP3iuu5Gt3yCfzlcvvBxho1R4s0i2h4ncACBSwAuRYvUGC9
9TewR6/GfJS4pghZS00G//hOTz3u6OfPYe3JZGhudRh+fCFDFdXmHanNf+qwxV1wy40DsPxiAx88
V7DNoUpSkopY7BQoMmwU4IHTy4ESJjjBsG0JgUkTHB/6hg0NcjB06Use+iZlL6sxCwwzwUa+RGC4
VFlOB0XAjLjsNQc2iEBbSBqgAb+GDZkBcIHJa0O/rPDAAkSwCUhEoosw10OvOQxYT6yH+fCGPh7y
gVj1sBo2YoAAGqCKfUCUTBJk0Jt7bWsOvJJbDf2QNQLSQ4uCe4AI2OCnFrJJAVpTAxr8wIMiQg4g
TghkICVjhj1iA2kPMJWk7iauRa4sVQpQw+KqaMA1IFANLNKiH7iog5o8YP9blhQfNsCAABlgBgRH
siQf0NCtOfJhDRzUpNVIlYZIsTJ5HfOALbulgegVwAYcgAEKGkBMYvKOHhqYxwP4EDyILbOZNwNX
sdaIDTrWgwd+yAACEBAB24ErA0uwAAYwxoVj1mMI0pxYPXowj3T6AT7ndFz0gFmDFmigAffUAAB4
cAceNGABEGCW3cgwByHOYaAFXZwfQEACIAwhAHdglhu8IFFmlWyVaNShHybqg9WF0wJLiIEJ4ICZ
L2QhAxmgAUwQEAM/zMBxTbCoG/55gxRstJ8S9UJAN7ozCDx0ow2g6EYpwFAgAOCnM3WcUjlggz9M
gAoaiKoEYIUuI6QLlQr/SMMc5mCvrG7VXkioaqysOoJYjQAAiUrkVlmUAB/AqqNS0AFMYkLXulrg
BAi4wFX8YFay9jVdVqWqWKnaV7+OVaxlFauUrvAHGHwgqg2QwIMe1AOK1aMMlqVHCvQ52c46yAtG
qkcUkPAgdBJAKkVYQillsE0ZXOACGCgB/4bg2dra9ra4fZAPYNBUQWhBAg1wggYCQ1wIgEUDQJhc
AwCDXOUWFyyB6QFgoBuYBlBuudIlrmVNkIUi5LUEWcgCGKrw2gjchQfEzW50swtd6qY3usZdL3Wl
S1/ixoEwg4DBD5KIhP5KAAkSCLCAAwzg/xa4wANOcIIRvOABF5h3BLhA/1V0gI0jRCQmW4CDHxTM
4Q47+L8EDrGHFfyB0hBiAjkAAhBUIMhAspjFLo6xjGHsBBXYuMY1frEgX0xjHfPYDxWggUSK4FqM
VeEES7gAkge1YhzbGMY9frKTdeziGz/ZyjvOsgpcMIFVMKAFyb2Biq9HZiCQmQJmPjOa1czmMrM5
zfCDQxUoYgIwbGFQVcAAAQgQAx3QpwNtTnObryfoNQ960E0gBysYsAEDzGAIBoi0pCdN6Upb+tKY
rjQ64UADGnzhCxEYpx9KUATZZqAK9OFBplfN6lbfYAPlQMEGoEACEDgABLi+Na5zbetd93rXV+K1
r29NbGDrWti3BnIJVv97gpBlcwknkIEMijAoEhw718HW9bWNHexhI9vX2IYCrAXCgnYxQQ5lCEIZ
UpCCMqy7DHJg97rV7e54v1ve7m53vt3N737zW9/uho/8ZCLDuM41AhruN8D9re526zsI8l74uye+
734z4QWKFsgf4rCBDYwBTHoKQMgDQPKSk3zkJxf5WVRulpLrqeUuTznJ2eMt/gDrDi9X+clXHnOT
+xzmK2/5yFMwho5rvBAseEUIVvSGAzj9AFawgtOlPnWqV/3pU8d61qN+da0fQAjzsEMdnH6HDdnh
Dla3+tPV7nWosx3qWqe6MIgx7qOzAgVY0AIR9s73vvv972foeyX6sPcawEOi75MQfOD5HnjC890U
kI+85PuACpGUIxAAOw==

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: http://www.deastore.com/images/it_add_wish.gif?1213885386

R0lGODlhmAAUAOZ/ANXV1bW1tevt8OLi4t3i6GqDpc3Nzd3d3cbGxv7+/tTa5Lm5uWB6oLbB0WuD
prKysq67zjlainmPrnuQrrrF1ejq7cLK14aat26GqVRwmcDAwNLZ4ujo6Nzg5u/x9Nvb29LS0s/V
37CwsODg4Nre5au5y8nS3+vr6zpbipSmv1NvmKq3yqKxyJyswrjD0jhaiV55n5ChukVkkHuRsfb2
9vr6+vn5+fX19fz8/P39/TZXhqCwxk1qk56tw22FqKGwxmV+oIWZtZ+uxMjR3sTN2sPM2cbP3LfA
zcfQ3cbO25SkusXO2m2GqO7w8+Xl5YSYtMTK1Nze4eHm7ISYtZ6uxOTk5EZlkXeNrUFgjKe0x0Zl
kqy3x+Lm7Udmkomas8LL2OPn7oOXs87U3J+vxaGxx5yrwers74+huoWZtpGivJKkvZWnwODl69/k
6oebuNDW4NjY2Pf39+/v7/j4+Ozs7Pv7+/T09PLy8u7u7vHx8fPz8/Dw8O3t7a+vr+fn5////yH5
BAEAAH8ALAAAAACYABQAAAf/gH+CgycID32IiYqLjI2Oj5CRkpOUlZQPBnSDm4N0BhoHd3p6d6Wm
d3mpqXusrXKvsHJ4s7S1fLe4ubq7uHR0t77BwsPExcbHyMm5J3ALIHucggMBH3g3dtij2qSnqKqq
reGx43iy5bXo6bO87O3u7/Dxt7VyTgAPHJzTVXFxN///sAnMto1bt2/fwilU+IrVuIcQI6qbiA4i
xXSvztEy95BVqgMP/HRa4MTGnH5xaKhcSQOgy4ECC4rqdhChzZurFurcyXNnwp5AdSI0BfKEoD4H
6picw5TpBgcCUJYokZJlyxsO/qUJATOmnVFiYowqUNCgGBI00546I6aUzSxZ/3CmKqAqrU26COG6
9ZYH1dq2orTZufEhwJ84Ae4otcG4cRIUEpoKEcIUpeUIKh0UWemy8xcH2Cx0FehA9MCyZQtYQK2H
BAnWo14I7lp2dcEyZUbd+co6RIWBAGnwMTDiA4I4OWooX17DCBMGFBiPGcO4zQUfQgQwjXDSAZF+
LiQ4CCLAahEHKnuoNPPEwZMKN76oeNLhxpv2V950vlEhjYMWDnzxzwoOXGGaBaYNFEIYDjTwAjYV
ADgFAS1V0F4Yv9nRgkAAhpFGC/9YcIUDK2DTQQNPXNHBCvXdYNUcdhyAwAIj8JFDDnXkqCMSGCiQ
QRM17LBDDU1ksEMS1zGGAv9jPiwxxxJWuLCEBGicVBkRDvQTQT9BBEFEl3EQoUIQBAggAxVE9KCC
VTQ4MEURV0SwWQ8wuOCCDHOqx5IZMvTgAgyY0XCFBERQIUNUQbw5xRQqBUpnET1E0EMcG8hQQhEw
qFeEpCW0+Z1lc5jEhxMPPOAEB3vkkAAOrLI6BAZ1/JBCrD/UAYEbOdaQARs1oKAcE0bY0EYSjEHg
Q2OMJeHDdkxJoEaZ2s3R5BwCuMAUAdw1NQcBKqCkwncqENBPCUHEQQUVlsVBbj/YxsFtHKFeAMEc
zkKrZT/hcknFHGiUcNK7RMDQj7ROaluDDXj44UcfAQyg8B4JJJBDq6+yysD/ED+QgcMPKHTcMRJ1
oJAjsERewAAKGTCxHGNGHGvDkjZscDJ0TBJrwxg+oAyzY8cy5UMSc0QgtNDLTqbtHEYzu4TQHg+p
AAMRMGBt0MwyNZkNPkSAwtBPuiytzTbUgEMNcii8sKlm80GDqhGbgEHbGazBQgIsrHFjDmDciMKN
GJiQgxtuKJBDxa3iQDgKONTBBQ5S/KBFjhiADAEDIIesY45P60h5HVp4kKMHnv9Q6+Wyfu5r5jjg
PbEUdTT+uOWce15HCjvgMAMFOLZeB486Rl5H4nXowYfZC2vwAfEcyFGHxG7fvUYXLODARRdDGN6F
BzggjgMG1c9ARusMwHo5/++wZwBBHQpYoRwGFAQ5Qcm+MlcDA0NCgIIRNVxwQRNNTDCkkPJjQwbw
d4H4GUlxGaie+WqQPuXELwX7S1/tJgeGIKnMOcshGQ4QxgHiTWMAGiCeCI8ABLNFgQdKUNgWeKAD
HmxBYTpQGBCO4AcosJAHXuDBCEvohxjW8IY09IMSdCCEKABBB1jwAhbEIEIoHBEIGaBhFCagAx1M
IApCTKEIV6gDL/jQiUjUog1bGEQfTrGFGNCiErCgAyBAwQ8kNNsMRWg2JyAADjZ4AADoyMc++vGP
gAykIAdJyEIaso9weEAd/uAEDVThkJCMpCQnSUlJDgABAxiECBDwyEp68j+ToAwlIC8JAE4AAJOi
TKUqV3lIUkbjDyLQAAgcxspa2pKVVQCBBvrwSkH4wQABsIQwh0nMYhrzmInAhBM4EQgAOw==

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/stylesheets/all.css?1259592602

BODY {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
* {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
A IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: =
medium none; BORDER-RIGHT: medium none
}
#container {
	BACKGROUND-IMAGE: url(/images/containerLeft.gif); MIN-WIDTH: 635px; =
PADDING-LEFT: 180px; PADDING-RIGHT: 180px; BACKGROUND-REPEAT: repeat-y; =
BACKGROUND-POSITION: 27px top; CLEAR: both; OVERFLOW: hidden
}
#center {
	POSITION: relative; MARGIN: 0px; WIDTH: 100%; FLOAT: left
}
#categories_sidebar {
	POSITION: relative; WIDTH: 170px; FLOAT: left; MARGIN-LEFT: -100%; =
RIGHT: 180px
}
#right {
	POSITION: relative; WIDTH: 160px; FLOAT: left; RIGHT: 0px; =
MARGIN-RIGHT: -180px
}
#footer {
	WIDTH: 100%; CLEAR: both
}
#banner {
	TEXT-ALIGN: center; MARGIN-TOP: 2px
}
.flat_box {
	MARGIN: 30px 0px 20px 1%; WIDTH: 98%; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 10px top; FLOAT: left; CLEAR: both
}
.flat_image {
	MARGIN-BOTTOM: 10px
}
.campaign {
	TEXT-ALIGN: left; MARGIN-TOP: -1px; WIDTH: 98%; MARGIN-BOTTOM: 10px; =
MARGIN-LEFT: 1%
}
.rounded_image {
	Z-INDEX: 1; POSITION: relative; MARGIN-TOP: 20px; WIDTH: 96%; DISPLAY: =
block; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left top; =
HEIGHT: 20px; MARGIN-LEFT: 20px; CLEAR: both
}
.stude {
	BACKGROUND: url(/images/sf_arrotond_bord_azzurro.jpg) #ffffff no-repeat =
right bottom
}
.stude H2 {
	BACKGROUND: url(/images/sf_arrotond_bord_azzurro.jpg) #ffffff no-repeat =
right bottom
}
.bianco {
	BACKGROUND: url(/images/sfondo_arrotondato.gif) #ffffff no-repeat right =
bottom
}
.bianco H2 {
	BACKGROUND: url(/images/sfondo_arrotondato.gif) #ffffff no-repeat right =
bottom
}
.storia {
	BACKGROUND: url(/images/sfondo_arrotondato_storia.gif) #ffffff =
no-repeat right bottom
}
.storia H2 {
	BACKGROUND: url(/images/sfondo_arrotondato_storia.gif) #ffffff =
no-repeat right bottom
}
.CPS {
	BACKGROUND: url(/images/sfondo_arrotondatoCPS.jpg) #ffffff no-repeat =
right bottom
}
.CPS H2 {
	BACKGROUND: url(/images/sfondo_arrotondatoCPS.jpg) #ffffff no-repeat =
right bottom
}
.ultimi {
	BACKGROUND: url(/images/sfondo_arrotondato_bordino_rosa.jpg) #ffffff =
no-repeat right bottom
}
.ultimi H2 {
	BACKGROUND: url(/images/sfondo_arrotondato_bordino_rosa.jpg) #ffffff =
no-repeat right bottom
}
.l_testo {
	BACKGROUND: url(/images/sfondo_arrotondato_azz2.gif) #ffffff no-repeat =
right bottom
}
.l_testo H2 {
	BACKGROUND: url(/images/sfondo_arrotondato_azz2.gif) #ffffff no-repeat =
right bottom
}
.help {
	BACKGROUND: url(/images/sfondo_arrotondato_help.jpg) #ffffff no-repeat =
right bottom
}
.help H2 {
	BACKGROUND: url(/images/sfondo_arrotondato_help.jpg) #ffffff no-repeat =
right bottom
}
.sel_corso {
	BACKGROUND: url(/images/sfondo_arrot_grande_rosa3.gif) #ffffff =
no-repeat right bottom
}
.sel_corso H2 {
	BACKGROUND: url(/images/sfondo_arrot_grande_rosa3.gif) #ffffff =
no-repeat right bottom
}
.wish {
	BACKGROUND: url(/images/sf_arrot_wishlist.jpg) #ffffff no-repeat right =
bottom
}
.wish H2 {
	BACKGROUND: url(/images/sf_arrot_wishlist.jpg) #ffffff no-repeat right =
bottom
}
.storia2 {
	BACKGROUND: url(/images/sf_semi_arrot_storia.gif) #ffffff no-repeat =
right bottom
}
.storia2 H2 {
	BACKGROUND: url(/images/sf_semi_arrot_storia.gif) #ffffff no-repeat =
right bottom
}
.storia3 {
	BACKGROUND: url(/images/sf_semi_arrot_storia_dx.gif) #ffffff no-repeat =
right bottom
}
.storia3 H2 {
	BACKGROUND: url(/images/sf_semi_arrot_storia_dx.gif) #ffffff no-repeat =
right bottom
}
.buono {
	BACKGROUND: url(/images/sfondo_arrotondato_storia.gif) #ffffff =
no-repeat right bottom
}
.buono H2 {
	BACKGROUND: url(/images/sfondo_arrotondato_storia.gif) #ffffff =
no-repeat right bottom
}
.carrello_st {
	BACKGROUND: url(/images/sf_arr_storia_carrello.gif) #ffffff no-repeat =
right bottom
}
.carrello_st H2 {
	BACKGROUND: url(/images/sf_arr_storia_carrello.gif) #ffffff no-repeat =
right bottom
}
.vet_edi {
	BACKGROUND: url(/images/sf_arr_azz_vetrina.jpg) #ffffff no-repeat right =
bottom
}
.vet_edi H2 {
	BACKGROUND: url(/images/sf_arr_azz_vetrina.jpg) #ffffff no-repeat right =
bottom
}
.terra {
	BACKGROUND: url(/images/piedino.gif) #ffffff no-repeat right bottom
}
.terra H2 {
	BACKGROUND: url(/images/piedino.gif) #ffffff no-repeat right bottom
}
.b_reg {
	BACKGROUND: url(/images/sf_beige3.gif) #ffffff no-repeat right bottom
}
.b_reg H2 {
	BACKGROUND: url(/images/sf_beige3.gif) #ffffff no-repeat right bottom
}
.b_b {
	BACKGROUND: url(/images/sf_b_b.jpg) #ffffff no-repeat right bottom
}
.b_b H2 {
	BACKGROUND: url(/images/sf_b_b.jpg) #ffffff no-repeat right bottom
}
.roundedBox {
	FLOAT: left; CLEAR: both
}
.roundedBox_head {
	PADDING-RIGHT: 15px; BACKGROUND-POSITION: right top
}
.roundedBox_head H2 {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
PADDING-LEFT: 40px; PADDING-RIGHT: 0px; FONT-FAMILY: arial; =
BACKGROUND-POSITION: left top; HEIGHT: 15px; COLOR: #083971; FONT-SIZE: =
14px; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px
}
.roundedBox_body {
	PADDING-BOTTOM: 15px; PADDING-LEFT: 10px; WIDTH: 97%; PADDING-RIGHT: =
0px; BACKGROUND-POSITION: left bottom; FLOAT: left; MARGIN-RIGHT: 10px; =
PADDING-TOP: 0px
}
.buono H2 {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 20px; PADDING-RIGHT: 0px; HEIGHT: =
auto !important; PADDING-TOP: 12px
}
.carrello_st H2 {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 20px; PADDING-RIGHT: 0px; HEIGHT: =
auto !important; PADDING-TOP: 12px
}
.lilla3 H2 {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 20px; PADDING-RIGHT: 0px; HEIGHT: =
auto !important; PADDING-TOP: 12px
}
.storia H2 {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 15px; PADDING-RIGHT: 0px; HEIGHT: =
auto !important; PADDING-TOP: 17px
}
.scheda_libro {
	MIN-WIDTH: 30%; TEXT-ALIGN: left; BORDER-LEFT: #999999 1px solid; =
MARGIN: 0px auto; MIN-HEIGHT: 185px; PADDING-LEFT: 6px; WIDTH: 30%; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; MAX-WIDTH: =
30%; FLOAT: left; COLOR: #666666; FONT-SIZE: 11px
}
.titolo_link {
	DISPLAY: block; FONT-FAMILY: verdana; COLOR: #0a88b5; CLEAR: both; =
FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.titolo_link:hover {
	DISPLAY: block; FONT-FAMILY: verdana; COLOR: #0a88b5; CLEAR: both; =
FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.titolo_link:visited {
	DISPLAY: block; FONT-FAMILY: verdana; COLOR: #0a88b5; CLEAR: both; =
FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.scheda_libro P {
	WIDTH: 90%
}
.last_scheda {
	FLOAT: right
}
.middle_scheda {
	MARGIN-LEFT: 3%
}
.prezzo {
	COLOR: #96190c; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.ex_price {
	TEXT-DECORATION: line-through
}
.sconto {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#96190c; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.nyp {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#96190c; FONT-WEIGHT: bold
}
.strillo {
	FONT-STYLE: italic; FONT-FAMILY: verdana; FONT-SIZE: 11px
}
.scheda_libro IMG {
	Z-INDEX: 10; BORDER-BOTTOM: medium none; POSITION: relative; =
BORDER-LEFT: medium none; MAX-WIDTH: 120px; FLOAT: left; BORDER-TOP: =
medium none; BORDER-RIGHT: medium none
}
.cover_small {
	WIDTH: 80px
}
.sconto_img {
	Z-INDEX: 1; POSITION: relative; MARGIN: 70px 0px 0px -15px; FLOAT: left
}
.sconto_img_best {
	Z-INDEX: 1; POSITION: relative; MARGIN: 50px 0px 0px -35px; FLOAT: left
}
.spazio_bottone {
	PADDING-BOTTOM: 5px; LINE-HEIGHT: 16px; BACKGROUND-COLOR: #e5f3f8; =
MARGIN: 10px 0px; PADDING-LEFT: 10px; WIDTH: 100%; PADDING-RIGHT: 10px; =
FLOAT: left; CLEAR: both; PADDING-TOP: 5px
}
.invia.spazio_bottone {
	TEXT-ALIGN: center
}
#disclaimer {
	BORDER-BOTTOM: #083971 1px dotted; BORDER-LEFT: #083971 1px dotted; =
PADDING-BOTTOM: 0px; MARGIN: 10px 0px; PADDING-LEFT: 10px; WIDTH: 100%; =
PADDING-RIGHT: 10px; FLOAT: left; CLEAR: both; BORDER-TOP: #083971 1px =
dotted; BORDER-RIGHT: #083971 1px dotted; PADDING-TOP: 0px
}
.bottone_143 {
	BACKGROUND-IMAGE: url(/images/bottone_143x20.gif); TEXT-ALIGN: center; =
WIDTH: 143px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: =
arial; HEIGHT: 20px; COLOR: #06306c; FONT-SIZE: 11px; FONT-WEIGHT: bold; =
TEXT-DECORATION: none; PADDING-TOP: 2px
}
.bottone_143:hover {
	BACKGROUND-IMAGE: url(/images/bottone_143x20.gif); TEXT-ALIGN: center; =
WIDTH: 143px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: =
arial; HEIGHT: 20px; COLOR: #06306c; FONT-SIZE: 11px; FONT-WEIGHT: bold; =
TEXT-DECORATION: none; PADDING-TOP: 2px
}
.bottone_143:visited {
	BACKGROUND-IMAGE: url(/images/bottone_143x20.gif); TEXT-ALIGN: center; =
WIDTH: 143px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: =
arial; HEIGHT: 20px; COLOR: #06306c; FONT-SIZE: 11px; FONT-WEIGHT: bold; =
TEXT-DECORATION: none; PADDING-TOP: 2px
}
.scheda_prodotto {
	MARGIN: 10px 0px 20px; WIDTH: 100%; FONT-FAMILY: verdana; FLOAT: left; =
COLOR: #555555; FONT-SIZE: 11px
}
.scheda_prodotto IMG {
	FLOAT: left
}
.dati_biblio SPAN {
	LINE-HEIGHT: 14px
}
.autore_link {
	FONT-FAMILY: verdana; COLOR: #0a88b5; FONT-SIZE: 12px; FONT-WEIGHT: =
normal
}
.autore_link:hover {
	FONT-FAMILY: verdana; COLOR: #0a88b5; FONT-SIZE: 12px; FONT-WEIGHT: =
normal
}
.autore_link:visited {
	FONT-FAMILY: verdana; COLOR: #0a88b5; FONT-SIZE: 12px; FONT-WEIGHT: =
normal
}
.info {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
normal
}
.info:hover {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
normal
}
.info:visited {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
normal
}
.autore SPAN .info {
	COLOR: #666; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.autore SPAN .info:visited {
	COLOR: #666; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.autore SPAN .info:hover {
	COLOR: #666; TEXT-DECORATION: underline
}
.see_all {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
bold
}
.see_all:hover {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
bold
}
.see_all:visited {
	FONT-FAMILY: verdana; COLOR: #008acc; FONT-SIZE: 11px; FONT-WEIGHT: =
bold
}
.autore {
	FONT-FAMILY: verdana; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.int_data_pubblicazione {
	FONT-FAMILY: verdana; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.int_prezzo {
	FONT-FAMILY: verdana; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.ns_prezzo {
	FONT-FAMILY: verdana; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.editore {
	FONT-FAMILY: verdana; FONT-SIZE: 10px
}
.platform {
	FONT-FAMILY: verdana; FONT-SIZE: 10px
}
.collana {
	DISPLAY: block
}
.autore {
	DISPLAY: block
}
.editore {
	DISPLAY: block
}
.platform {
	DISPLAY: block
}
.platform {
	COLOR: #666666
}
.books_ico {
	BACKGROUND-IMAGE: url(/images/book_ico.gif); PADDING-BOTTOM: 5px; =
PADDING-LEFT: 30px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left top; PADDING-TOP: 5px
}
.music_ico {
	BACKGROUND-IMAGE: url(/images/music_ico.gif); PADDING-BOTTOM: 5px; =
PADDING-LEFT: 30px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left top; PADDING-TOP: 5px
}
.dvd_ico {
	BACKGROUND-IMAGE: url(/images/video_ico.gif); PADDING-BOTTOM: 5px; =
PADDING-LEFT: 30px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left top; PADDING-TOP: 5px
}
.games_ico {
	BACKGROUND-IMAGE: url(/images/game_ico.gif); PADDING-BOTTOM: 5px; =
PADDING-LEFT: 30px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left top; PADDING-TOP: 5px
}
.sotto_schede {
	BORDER-BOTTOM: #888 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 16px; =
MARGIN: 5px 0px 0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FLOAT: left; =
COLOR: #000; FONT-SIZE: 12px; PADDING-TOP: 5px
}
.titolo_sotto {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: =
block; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
COLOR: #103f83; FONT-SIZE: 13px; FONT-WEIGHT: bold; PADDING-TOP: 0px
}
.wish_or_remove {
	BACKGROUND-IMAGE: url(/images/bottone_carrello.gif); TEXT-ALIGN: =
center; PADDING-BOTTOM: 0px; MARGIN-TOP: 3px; PADDING-LEFT: 0px; WIDTH: =
154px; PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: arial; HEIGHT: 22px; COLOR: #06306c; CLEAR: both; =
FONT-SIZE: 12px; FONT-WEIGHT: bold; TEXT-DECORATION: none; PADDING-TOP: =
3px
}
.titolo_interno {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: =
0px; DISPLAY: block; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #af0539; CLEAR: both; FONT-SIZE: 12px; FONT-WEIGHT: =
bold; PADDING-TOP: 30px
}
.interno {
	WIDTH: 100%; FLOAT: left; BORDER-TOP: #888888 1px dashed; PADDING-TOP: =
10px
}
#carrello_st SPAN {
	FONT-FAMILY: verdana; COLOR: #555
}
#carrello_st P {
	FONT-FAMILY: verdana; COLOR: #555
}
#carrello_st SPAN {
	DISPLAY: block; FONT-SIZE: 11px
}
.inte {
	FONT-WEIGHT: bold
}
.inte A {
	COLOR: #555; TEXT-DECORATION: none
}
.bottoni {
	MARGIN: 5px 0px 0px
}
.titolo_pagina {
	FONT-FAMILY: Arial, Helvetica, sans-serif; FONT-SIZE: 18px; =
FONT-WEIGHT: bold
}
.maior {
	BACKGROUND-IMAGE: url(/images/maior.gif); PADDING-LEFT: 13px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left 3px
}
.simple_b {
	FONT-WEIGHT: bold
}
.lefter4 {
	WIDTH: 25%; FLOAT: left
}
.last_span {
	FLOAT: right
}
#tabbed {
	MARGIN: 0px auto; WIDTH: 800px
}
.istruzioni {
	BACKGROUND-IMAGE: url(/images/tab_area_business_lungo.gif); =
PADDING-BOTTOM: 15px; LINE-HEIGHT: 16px; BACKGROUND-COLOR: #e5f3f8; =
MARGIN: 0px 0px 10px 1px; MIN-HEIGHT: 25px; PADDING-LEFT: 10px; WIDTH: =
100%; PADDING-RIGHT: 10px; BACKGROUND-REPEAT: repeat-x; FONT-FAMILY: =
verdana; BACKGROUND-POSITION: 50% top; COLOR: #083971; CLEAR: both; =
FONT-SIZE: 11px; PADDING-TOP: 15px
}
.vantaggi {
	FONT-FAMILY: verdana; COLOR: #083971; FONT-SIZE: 11px; FONT-WEIGHT: =
bold
}
.dati {
	BACKGROUND-IMAGE: url(/images/tab_area_business.gif); Z-INDEX: 1; =
POSITION: relative; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; WIDTH: =
217px; PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: arial; BACKGROUND-POSITION: left top; MARGIN-BOTTOM: -8px; =
HEIGHT: 22px; COLOR: #06306c; CLEAR: both; FONT-SIZE: 13px; FONT-WEIGHT: =
bold; PADDING-TOP: 10px
}
.vet_edi H2 {
	PADDING-BOTTOM: 8px; PADDING-LEFT: 10px; PADDING-RIGHT: 0px; HEIGHT: =
auto !important; PADDING-TOP: 8px
}
.sponsored_items {
	BORDER-BOTTOM: #888 1px dashed; TEXT-ALIGN: left; PADDING-BOTTOM: 10px
}
#carrello_st {
	BACKGROUND-IMAGE: url(/images/bottom_160_beige2.gif); TEXT-ALIGN: =
center; PADDING-BOTTOM: 30px; MARGIN-TOP: 10px; WIDTH: 160px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
#carrello_st H1 {
	BACKGROUND-IMAGE: url(/images/top_160_beige.gif); TEXT-ALIGN: center; =
PADDING-BOTTOM: 6px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 160px; =
PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px; =
PADDING-TOP: 7px
}
#carrello_st P {
	BACKGROUND-IMAGE: url(/images/center_160_beige.gif); PADDING-BOTTOM: =
5px; MARGIN: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; =
BACKGROUND-REPEAT: repeat-y; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; BACKGROUND-POSITION: left top; COLOR: #666; =
FONT-SIZE: 11px; PADDING-TOP: 5px
}
.beige_160 {
	BACKGROUND-IMAGE: url(/images/bottom_160_beige.gif); WIDTH: 160px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
.beige_160 H1 {
	BACKGROUND-IMAGE: url(/images/top_160_beige.gif); TEXT-ALIGN: center; =
MARGIN: 0px; WIDTH: 160px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.beige_160 UL {
	BACKGROUND-IMAGE: url(/images/center_160_beige.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.beige_160 P {
	BACKGROUND-IMAGE: url(/images/center_160_beige.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.beige_160 OL {
	BACKGROUND-IMAGE: url(/images/center_160_beige.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.w_160 {
	BACKGROUND-IMAGE: url(/images/bottom_160_w.gif); WIDTH: 160px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
.w_160 H1 {
	BACKGROUND-IMAGE: url(/images/top_160_w.gif); TEXT-ALIGN: center; =
MARGIN: 0px; WIDTH: 160px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.w_160 UL {
	BACKGROUND-IMAGE: url(/images/center_160_w.gif); MARGIN: 0px; DISPLAY: =
block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left top
}
.w_160 P {
	BACKGROUND-IMAGE: url(/images/center_160_w.gif); MARGIN: 0px; DISPLAY: =
block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left top
}
.lilla_160 {
	BACKGROUND-IMAGE: url(/images/bottom_160_lilla.gif); WIDTH: 160px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
.lilla_160 H1 {
	BACKGROUND-IMAGE: url(/images/top_160_lilla.gif); TEXT-ALIGN: center; =
MARGIN: 0px; WIDTH: 160px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.lilla_160 UL {
	BACKGROUND-IMAGE: url(/images/center_160_lilla.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.lilla_160 P {
	BACKGROUND-IMAGE: url(/images/center_160_lilla.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.vetrina_147 {
	BACKGROUND-IMAGE: url(/images/bottom_147_vetrina_l.gif); WIDTH: 147px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
.vetrina_147 H1 {
	BACKGROUND-IMAGE: url(/images/top_147_bord_lilla.gif); TEXT-ALIGN: =
center; MARGIN: 0px; WIDTH: 147px; DISPLAY: block; BACKGROUND-REPEAT: =
no-repeat; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.vetrina_147 UL {
	BACKGROUND-IMAGE: url(/images/center_147_vetrina_l.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.vetrina_147 P {
	BACKGROUND-IMAGE: url(/images/center_147_vetrina_l.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
#verisign {
	BACKGROUND-IMAGE: url(/images/sf_verisign_home.jpg); TEXT-ALIGN: =
center; MARGIN: 0px 0px 10px 7px; WIDTH: 147px; BACKGROUND-REPEAT: =
no-repeat; HEIGHT: 115px
}
#verisign P {
	COLOR: #083971; FONT-WEIGHT: bold
}
#verisign .content {
	TEXT-ALIGN: center; MARGIN: 2px 0px 0px; DISPLAY: block; FONT-FAMILY: =
Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: #083971; =
FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#verisign .content:hover {
	TEXT-DECORATION: underline
}
#verisign .title {
	TEXT-ALIGN: center; PADDING-BOTTOM: 0px; MARGIN: 0px; FONT-FAMILY: =
Arial, Helvetica, sans-serif; FONT-SIZE: 13px; PADDING-TOP: 2px
}
#verisign IMG {
	TEXT-ALIGN: center; MARGIN: 0px auto; HEIGHT: 68px
}
.pink_b_170 {
	BACKGROUND-IMAGE: url(/images/bottom_170_w.gif); WIDTH: 170px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left bottom
}
.pink_b_170 H1 {
	BACKGROUND-IMAGE: url(/images/top_170_rosa.gif); TEXT-ALIGN: center; =
MARGIN: 0px; WIDTH: 170px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.pink_b_170 UL {
	BACKGROUND-IMAGE: url(/images/center_170_w.gif); MARGIN: 0px; DISPLAY: =
block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left top
}
.pink_b_170 P {
	BACKGROUND-IMAGE: url(/images/center_170_w.gif); MARGIN: 0px; DISPLAY: =
block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left top
}
.vetrina_160 {
	BACKGROUND-IMAGE: url(/images/bottom_160_vetrina_l.gif); =
PADDING-BOTTOM: 8px; WIDTH: 160px; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: left bottom
}
.vetrina_160 H1 {
	BACKGROUND-IMAGE: url(/images/top_160_bord_lilla.gif); TEXT-ALIGN: =
center; MARGIN: 0px; WIDTH: 160px; DISPLAY: block; BACKGROUND-REPEAT: =
no-repeat; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px
}
.vetrina_160 UL {
	BACKGROUND-IMAGE: url(/images/center_160_vetrina_l.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.vetrina_160 P {
	BACKGROUND-IMAGE: url(/images/center_160_vetrina_l.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
#navigatore_categorie SPAN {
	DISPLAY: block; FLOAT: left
}
#navigatore_categorie {
	MARGIN: 5px 0px 0px 1%; WIDTH: 98%; FONT-FAMILY: verdana; COLOR: =
#0386a5; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
#nav_right A {
	DISPLAY: block; COLOR: #083971; TEXT-DECORATION: none
}
#nav_right A:visited {
	DISPLAY: block; COLOR: #083971; TEXT-DECORATION: none
}
#navigatore_categorie H2 {
	HEIGHT: 5px
}
#nav_right .ajax_container {
	BORDER-BOTTOM: 1px; BORDER-LEFT: 1px; PADDING-BOTTOM: 0px; MARGIN: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; FLOAT: right; =
BORDER-TOP: 1px; BORDER-RIGHT: 1px; PADDING-TOP: 0px
}
#nav_right .azzurrino.ajax_container A {
	COLOR: #0386a5
}
#nav_right .azzurrino.ajax_container A:hover {
	COLOR: #0386a5
}
#nav_right .azzurrino.ajax_container A:visited {
	COLOR: #0386a5
}
.home_l {
	FLOAT: left; COLOR: #cc6600; FONT-SIZE: 13px
}
.home_l:hover {
	FLOAT: left; COLOR: #cc6600; FONT-SIZE: 13px
}
.home_l:visited {
	FLOAT: left; COLOR: #cc6600; FONT-SIZE: 13px
}
#home_l2 {
	BORDER-BOTTOM: #083971 1px dotted; PADDING-BOTTOM: 5px; =
BACKGROUND-COLOR: #f4fafb; PADDING-LEFT: 0px; PADDING-RIGHT: 5px; =
BORDER-TOP: #083971 1px dotted; PADDING-TOP: 5px
}
#home_l2:hover {
	BORDER-BOTTOM: #083971 1px dotted; PADDING-BOTTOM: 5px; =
BACKGROUND-COLOR: #f4fafb; PADDING-LEFT: 0px; PADDING-RIGHT: 5px; =
BORDER-TOP: #083971 1px dotted; PADDING-TOP: 5px
}
#home_l2:visited {
	BORDER-BOTTOM: #083971 1px dotted; PADDING-BOTTOM: 5px; =
BACKGROUND-COLOR: #f4fafb; PADDING-LEFT: 0px; PADDING-RIGHT: 5px; =
BORDER-TOP: #083971 1px dotted; PADDING-TOP: 5px
}
.cat_tree {
	FLOAT: left; COLOR: #0386a5; TEXT-DECORATION: none
}
.cat_tree:visited {
	FLOAT: left; COLOR: #0386a5; TEXT-DECORATION: none
}
.cat_tree:hover {
	TEXT-DECORATION: underline
}
#nav_right A:hover {
	TEXT-DECORATION: underline
}
#nav_left {
=09
}
#nav_right {
=09
}
#nav_left {
	WIDTH: 61%; FLOAT: left
}
#nav_left H2 {
	FONT-SIZE: 13px
}
#nav_left .cat_tree {
	FONT-SIZE: 13px
}
#nav_left SPAN {
	FONT-SIZE: 13px
}
#nav_left H1 {
	DISPLAY: block; FLOAT: left; FONT-SIZE: 13px
}
#nav_right {
	TEXT-ALIGN: right; WIDTH: 38%; FLOAT: right
}
.note_text {
	MARGIN-TOP: 30px; DISPLAY: block; FONT-SIZE: 10px
}
#alerts_ric {
	BACKGROUND-IMAGE: url(/images/sfondo_alerts.jpg); TEXT-ALIGN: center; =
PADDING-BOTTOM: 40px; MARGIN: 1px 0px 5px 7px; PADDING-LEFT: 2px; WIDTH: =
147px; PADDING-RIGHT: 2px; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: =
Verdana, Geneva, Arial, Helvetica, sans-serif; BACKGROUND-POSITION: left =
top; FLOAT: left; FONT-SIZE: 11px; PADDING-TOP: 25px
}
#cont_posta {
	MAX-WIDTH: 143px
}
.infoalerts {
	COLOR: #008acc; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.infoalerts:visited {
	COLOR: #008acc; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.infoalerts:hover {
	TEXT-DECORATION: underline
}
#browse IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; MARGIN-TOP: 5px; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
#browse LI {
	TEXT-ALIGN: center; LIST-STYLE-TYPE: none; MARGIN: 0px 10px 10px 3px; =
LIST-STYLE-IMAGE: none
}
#browse H1 {
	PADDING-BOTTOM: 18px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 9px
}
#visitati H1 {
	PADDING-BOTTOM: 18px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 9px
}
#browse {
	PADDING-BOTTOM: 8px; MARGIN-TOP: 10px
}
#visitati {
	PADDING-BOTTOM: 8px; MARGIN-TOP: 10px
}
#browse .titolo_link {
	COLOR: #0978a1; FONT-SIZE: 10px
}
#browse .titolo_link:hover {
	COLOR: #0978a1; FONT-SIZE: 10px
}
#browse .titolo_link:visited {
	COLOR: #0978a1; FONT-SIZE: 10px
}
.tipo {
	BORDER-BOTTOM: #888 1px dashed; PADDING-BOTTOM: 5px; MARGIN-TOP: 0px; =
PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DISPLAY: block; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#b41646; FONT-SIZE: 11px; BORDER-TOP: #888 1px dashed; FONT-WEIGHT: =
bold; PADDING-TOP: 5px
}
.inte {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#b41646; FONT-SIZE: 18px
}
.inte SPAN {
	MARGIN: 5px 10px 0px; DISPLAY: block; COLOR: #083971; CLEAR: both; =
FONT-SIZE: 13px; FONT-WEIGHT: normal
}
.how .interno {
	TEXT-ALIGN: center; MARGIN: auto; WIDTH: 80%; FLOAT: none
}
.how .titolo_interno {
	MARGIN: auto; WIDTH: 80%
}
.inte IMG {
	MARGIN: 15px 0px 0px 10px; HEIGHT: 30px
}
.prezzo_cart_finale {
	COLOR: #06306c; FONT-WEIGHT: bold
}
.cart_content TH {
	COLOR: #d96903; FONT-WEIGHT: bold
}
#wish_content TH {
	COLOR: #d96903; FONT-WEIGHT: bold
}
.carts TH {
	COLOR: #d96903; FONT-WEIGHT: bold
}
.cart_content TR {
	HEIGHT: 40px
}
#wish_content TR {
	HEIGHT: 40px
}
.carts TR {
	HEIGHT: 40px
}
.cart_content {
	TEXT-ALIGN: center; MARGIN: 20px auto 0px; WIDTH: 100%; FONT-FAMILY: =
verdana; FONT-SIZE: 10px
}
#wish_content {
	TEXT-ALIGN: center; MARGIN: 20px auto 0px; WIDTH: 100%; FONT-FAMILY: =
verdana; FONT-SIZE: 10px
}
.carts {
	TEXT-ALIGN: center; MARGIN: 20px auto 0px; WIDTH: 100%; FONT-FAMILY: =
verdana; FONT-SIZE: 10px
}
.quantity {
	WIDTH: 9%
}
.item {
	TEXT-ALIGN: left; PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; WIDTH: 35%; =
PADDING-RIGHT: 10px; PADDING-TOP: 0px
}
.title_cart {
	DISPLAY: block; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.totale {
	TEXT-ALIGN: center; FONT-FAMILY: verdana; COLOR: #d96903; FONT-SIZE: =
12px; FONT-WEIGHT: bold
}
.stelle5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle4 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle3 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle2 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle1 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle0 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle4e5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle3e5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle2e5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle1e5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle0e5 {
	MARGIN: 0px; WIDTH: 60px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 0px 3px; FLOAT: left; HEIGHT: 17px; FONT-WEIGHT: =
bold
}
.stelle5 SPAN {
	VISIBILITY: hidden
}
.stelle4 SPAN {
	VISIBILITY: hidden
}
.stelle3 SPAN {
	VISIBILITY: hidden
}
.stelle2 SPAN {
	VISIBILITY: hidden
}
.stelle1 SPAN {
	VISIBILITY: hidden
}
.stelle0 SPAN {
	VISIBILITY: hidden
}
.stelle4e5 SPAN {
	VISIBILITY: hidden
}
.stelle3e5 SPAN {
	VISIBILITY: hidden
}
.stelle2e5 SPAN {
	VISIBILITY: hidden
}
.stelle1e5 SPAN {
	VISIBILITY: hidden
}
.stelle0e5 SPAN {
	VISIBILITY: hidden
}
.stelle5 {
	BACKGROUND-IMAGE: url(/images/5_stelle.gif)
}
.stelle4 {
	BACKGROUND-IMAGE: url(/images/4_stelle.gif)
}
.stelle3 {
	BACKGROUND-IMAGE: url(/images/3_stelle.gif)
}
.stelle2 {
	BACKGROUND-IMAGE: url(/images/2_stelle.gif)
}
.stelle1 {
	BACKGROUND-IMAGE: url(/images/1_stella.gif)
}
.stelle4e5 {
	BACKGROUND-IMAGE: url(/images/4e5_stelle.gif)
}
.stelle3e5 {
	BACKGROUND-IMAGE: url(/images/3e5_stelle.gif)
}
.stelle2e5 {
	BACKGROUND-IMAGE: url(/images/2e5_stelle.gif)
}
.stelle1e5 {
	BACKGROUND-IMAGE: url(/images/1e5_stelle.gif)
}
.stelle0e5 {
	BACKGROUND-IMAGE: url(/images/0e5_stelle.gif)
}
.stelle0 {
	BACKGROUND-IMAGE: url(/images/0_stella.gif)
}
.extralinks LI {
	BACKGROUND-IMAGE: url(/images/plus.gif); LINE-HEIGHT: 14px; =
LIST-STYLE-TYPE: none; PADDING-LEFT: 10px; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: left 7px; LIST-STYLE-IMAGE: none
}
.bottone_link {
	BACKGROUND-IMAGE: url(/images/bottone_135x21.gif); TEXT-ALIGN: center; =
MARGIN: 2px 0px 0px 4px; WIDTH: 135px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; HEIGHT: 21px; PADDING-TOP: 3px
}
.bottone_link:hover {
	BACKGROUND-IMAGE: url(/images/bottone_135x21.gif); TEXT-ALIGN: center; =
MARGIN: 2px 0px 0px 4px; WIDTH: 135px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; HEIGHT: 21px; PADDING-TOP: 3px
}
.bottone_link:visited {
	BACKGROUND-IMAGE: url(/images/bottone_135x21.gif); TEXT-ALIGN: center; =
MARGIN: 2px 0px 0px 4px; WIDTH: 135px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; HEIGHT: 21px; PADDING-TOP: 3px
}
.user_text {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#e97304; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.user_simple {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#e97304; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.user_center {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#e97304; FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.scheda_pub {
	MIN-WIDTH: 30%; TEXT-ALIGN: left; BORDER-LEFT: #999999 1px solid; =
MARGIN: 0px auto; PADDING-LEFT: 6px; WIDTH: 30%; FONT-FAMILY: Verdana, =
Geneva, Arial, Helvetica, sans-serif; MAX-WIDTH: 30%; FLOAT: left; =
COLOR: #666666; FONT-SIZE: 11px
}
.first_scheda.scheda_pub {
	CLEAR: both
}
.last_scheda.scheda_pub {
	FLOAT: right
}
.middle_scheda.scheda_pub {
	MARGIN-LEFT: 3%
}
.publisher_link {
	MARGIN-TOP: 5px; WIDTH: 90%; CLEAR: both
}
.publisher_link P {
	WIDTH: 70%; FLOAT: left
}
.publisher_link A {
	COLOR: #0978a1; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.publisher_link IMG {
	MARGIN-RIGHT: 5px
}
.azz_147 {
	BACKGROUND-IMAGE: url(/images/bottom_147_azz.gif); PADDING-BOTTOM: =
10px; WIDTH: 147px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left bottom
}
#tips_underbox {
	BACKGROUND-IMAGE: url(/images/center_147_azz.gif); MARGIN: 0px; WIDTH: =
147px; DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: =
left top; FLOAT: left
}
#tips_box UL {
	BACKGROUND-IMAGE: url(/images/center_147_azz.gif); MARGIN: 0px; WIDTH: =
147px; DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: =
left top; FLOAT: left
}
.azz_147 H1 {
	BACKGROUND-IMAGE: url(/images/top_147_azz.gif); TEXT-ALIGN: center; =
PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 147px; =
PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px; =
PADDING-TOP: 8px
}
#tips_box H1 {
	BACKGROUND-IMAGE: url(/images/top_147_azz.gif); TEXT-ALIGN: center; =
PADDING-BOTTOM: 8px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 147px; =
PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px; =
PADDING-TOP: 8px
}
#tips_box {
	BACKGROUND-IMAGE: url(/images/bottom_147_azz.gif); PADDING-BOTTOM: =
10px; WIDTH: 147px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left bottom; FLOAT: left; COLOR: #083971; FONT-SIZE: 10px
}
.azz_147 UL {
	BACKGROUND-IMAGE: url(/images/center_147_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.azz_147 P {
	BACKGROUND-IMAGE: url(/images/center_147_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
#tips_box LI {
	BORDER-BOTTOM: #083971 1px dashed; PADDING-BOTTOM: 3px; =
LIST-STYLE-TYPE: none; PADDING-LEFT: 5px; WIDTH: 140px; MAX-WIDTH: =
147px; FLOAT: left; CLEAR: both; LIST-STYLE-IMAGE: none; PADDING-TOP: =
10px
}
#tips_box P {
	MAX-WIDTH: 90px; FLOAT: left
}
#tips_box .info {
	COLOR: #083971; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: =
none
}
#tips_box .info:hover {
	TEXT-DECORATION: underline
}
#buttb {
	BACKGROUND-IMAGE: url(../images/go_right_blue.gif); MARGIN: 70px 0px =
0px 10px; WIDTH: 42px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FLOAT: right; HEIGHT: 41px; TEXT-DECORATION: none
}
#buttb:hover {
	BACKGROUND-IMAGE: url(../images/go_right_blue2.gif)
}
#butta {
	BACKGROUND-IMAGE: url(../images/go_left_blue.gif); MARGIN: 70px 5px 0px =
0px; WIDTH: 42px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; FLOAT: =
left; HEIGHT: 41px; TEXT-DECORATION: none
}
#butta:hover {
	BACKGROUND-IMAGE: url(../images/go_left_blue2.gif)
}
.scroller_ul LI {
	TEXT-ALIGN: center; LIST-STYLE-TYPE: none; MARGIN: 10px 2%; MIN-HEIGHT: =
160px; WIDTH: 12%; FLOAT: left; LIST-STYLE-IMAGE: none
}
.scroller_ul LI IMG {
	MAX-WIDTH: 70px
}
.scroller_ul {
	MARGIN: 0px 0px 0px 2%; WIDTH: 84%; DISPLAY: block; FLOAT: left
}
#scroller {
	WIDTH: 100%; HEIGHT: 260px
}
#scroller A {
	CURSOR: pointer
}
.piccolo_titolo {
	TEXT-ALIGN: center; DISPLAY: block; FONT-FAMILY: Verdana, Geneva, =
Arial, Helvetica, sans-serif; COLOR: #083971; MARGIN-LEFT: 0px; CLEAR: =
both; FONT-SIZE: 10px; TEXT-DECORATION: none
}
A.piccolo_titolo:hover {
	TEXT-DECORATION: underline
}
A.piccolo_titolo {
	FONT-WEIGHT: bold
}
P.piccolo_titolo {
=09
}
.sottotitolo {
	FONT-STYLE: italic
}
.pagination {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FLOAT: =
right; PADDING-TOP: 0px
}
.pagination A {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
2px; MARGIN: 2px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; COLOR: #0386a5; =
BORDER-TOP: medium none; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
TEXT-DECORATION: none; PADDING-TOP: 2px
}
.pagination A:hover {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; COLOR: #0386a5; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
.pagination A:active {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; COLOR: #0386a5; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
.pagination A:hover {
	TEXT-DECORATION: underline
}
.pagination SPAN.current {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
2px; BACKGROUND-COLOR: transparent; MARGIN: 2px; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; COLOR: #cc6600; BORDER-TOP: medium none; =
FONT-WEIGHT: bold; BORDER-RIGHT: medium none; PADDING-TOP: 2px
}
.pagination SPAN.disabled {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: =
2px; MARGIN: 2px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; COLOR: #0386a5; =
BORDER-TOP: medium none; FONT-WEIGHT: bold; BORDER-RIGHT: medium none; =
PADDING-TOP: 2px
}
.notice {
	TEXT-ALIGN: center; WIDTH: 100%; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; COLOR: #ea040a; FONT-SIZE: 13px; FONT-WEIGHT: =
bold
}
.notice A {
	COLOR: #ea040a
}
.notice A:visited {
	COLOR: #ea040a
}
.cope_small {
	MAX-WIDTH: 40px; FLOAT: left; MARGIN-RIGHT: 5px
}
.acc_cope_small {
	MAX-WIDTH: 140px; FLOAT: left
}
.black_text {
	COLOR: #000000
}
#contratto_scroll {
	BORDER-BOTTOM: #dee1e3 1px solid; TEXT-ALIGN: left; BORDER-LEFT: =
#dee1e3 1px solid; LINE-HEIGHT: 11px; BACKGROUND-COLOR: #fff; WIDTH: =
100%; HEIGHT: 150px; COLOR: #083971; CLEAR: both; FONT-SIZE: 9px; =
OVERFLOW: scroll; BORDER-TOP: #dee1e3 1px solid; BORDER-RIGHT: #dee1e3 =
1px solid
}
#contratto_scroll P {
	LINE-HEIGHT: 12px; FONT-SIZE: 10px
}
#contratto_scroll LI {
	LINE-HEIGHT: 12px; FONT-SIZE: 10px
}
.caps {
	DISPLAY: inline
}
#contratto_scroll SPAN.caps {
	DISPLAY: inline; FLOAT: none; FONT-WEIGHT: normal
}
#new_login {
	WIDTH: 100%; CLEAR: both
}
#STitle {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
MARGIN-LEFT: 10px; FONT-SIZE: 14px; FONT-WEIGHT: bold; PADDING-TOP: 5px
}
.bottone_speciale IMG {
	MARGIN: 0px 0px 6px 7px; DISPLAY: block; FLOAT: left
}
.bottone_speciale1 IMG {
	MARGIN: 0px 0px 6px 7px; DISPLAY: block; FLOAT: left
}
.bottone_speciale1 IMG {
	BORDER-BOTTOM: #888 1px solid; BORDER-LEFT: #888 1px solid; BORDER-TOP: =
#888 1px solid; BORDER-RIGHT: #888 1px solid
}
#add_textbook_start_date {
	WIDTH: 180px; MARGIN-LEFT: 130px
}
#fonte {
	TEXT-ALIGN: right
}
#bannertop {
	TEXT-ALIGN: center
}
#global_notice {
	BORDER-BOTTOM: #6495ed 1px dotted; TEXT-ALIGN: center; PADDING-BOTTOM: =
5px; BACKGROUND-COLOR: #eef9fd; PADDING-LEFT: 0px; WIDTH: 100%; =
PADDING-RIGHT: 0px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #2c6fe6; FONT-SIZE: 12px; BORDER-TOP: #6495ed 1px =
dotted; PADDING-TOP: 5px
}
#box_db {
	MARGIN: 0px 0px 5px 7px; WIDTH: 147px; FLOAT: left
}
.brown1 {
	FLOAT: left
}
.brown2 {
	FLOAT: right
}
#titolo_corp {
	MARGIN: 10px 0px 10px 40px; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; COLOR: #083971; FONT-SIZE: 20px
}
#section_expl {
	MARGIN: 3px 0px 2px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #083971; FONT-SIZE: 14px
}
#explained {
	LINE-HEIGHT: 18px; PADDING-LEFT: 3px; BORDER-TOP: #fff 2px solid
}
H2.sezioni {
	MARGIN: 10px 0px 0px 10px; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; COLOR: #083971; FONT-SIZE: 12px; FONT-WEIGHT: =
bold
}
H2.sezioni A {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#083971; FONT-SIZE: 12px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
H2.sezioni A:visited {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#083971; FONT-SIZE: 12px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
H2.sezioni A:hover {
	TEXT-DECORATION: underline
}
#errore {
	BORDER-BOTTOM: red 1px dashed; BORDER-LEFT: red 1px dashed; =
PADDING-BOTTOM: 10px; MARGIN: 10px 3%; PADDING-LEFT: 10px; WIDTH: 90%; =
PADDING-RIGHT: 10px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; FLOAT: left; HEIGHT: 100px; COLOR: red; CLEAR: both; =
FONT-SIZE: 16px; BORDER-TOP: red 1px dashed; FONT-WEIGHT: bold; =
BORDER-RIGHT: red 1px dashed; PADDING-TOP: 10px
}
#sub_menu {
	WIDTH: 100%
}
#search_line {
	WIDTH: 100%
}
#navigatore {
	WIDTH: 100%
}
#sub_menu {
	Z-INDEX: 1; POSITION: relative; TEXT-ALIGN: center; BACKGROUND-COLOR: =
#0978a1; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; HEIGHT: =
23px; COLOR: #fff; CLEAR: both; FONT-SIZE: 9px
}
#sub_menu LI {
	LIST-STYLE-TYPE: none; MARGIN-TOP: 7px; PADDING-LEFT: 10px; =
PADDING-RIGHT: 10px; FLOAT: left; LIST-STYLE-IMAGE: none; BORDER-RIGHT: =
white 1px solid
}
#sub_menu LI {
	FONT-WEIGHT: bold
}
#sub_menu A {
	COLOR: #fff; FONT-WEIGHT: normal
}
#sub_menu A:hover {
	COLOR: #fff; FONT-WEIGHT: normal
}
#sub_menu A:visited {
	COLOR: #fff; FONT-WEIGHT: normal
}
#sub_menu A {
	TEXT-DECORATION: none
}
#sub_menu A:visited {
	TEXT-DECORATION: none
}
#sub_menu A:hover {
	TEXT-DECORATION: underline
}
#bluMenu {
	WIDTH: 660px; MARGIN-LEFT: auto; CLEAR: both; MARGIN-RIGHT: auto
}
#logo {
	Z-INDEX: 10; POSITION: relative; MARGIN-TOP: 7px; WIDTH: 200px; FLOAT: =
left; MARGIN-LEFT: 12px
}
#logo IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; FLOAT: left; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
#welcome {
	MARGIN-TOP: 1px; PADDING-LEFT: 8px; WIDTH: 260px; PADDING-RIGHT: 8px; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FLOAT: left; =
MARGIN-LEFT: 5px; PADDING-TOP: 2px
}
#welcome H1 {
	TEXT-ALIGN: center; LINE-HEIGHT: 12px; COLOR: #cc6600; FONT-SIZE: 9px; =
FONT-WEIGHT: bold
}
#welcome_h1 {
	TEXT-ALIGN: center; LINE-HEIGHT: 12px; COLOR: #cc6600; FONT-SIZE: 9px; =
FONT-WEIGHT: bold
}
#welcome P {
	Z-INDEX: 1; TEXT-ALIGN: center; LINE-HEIGHT: 13px; FONT-SIZE: 9px
}
#welcome P A {
	COLOR: #666666
}
#welcome P A:hover {
	COLOR: #666666
}
#welcome P A:visited {
	COLOR: #666666
}
.int_conto {
	TEXT-ALIGN: center; LINE-HEIGHT: 13px; TEXT-TRANSFORM: capitalize; =
COLOR: #083971; FONT-SIZE: 9px; FONT-WEIGHT: bold
}
.int_conto A {
	COLOR: #083971; FONT-WEIGHT: bold
}
.int_conto A:hover {
	COLOR: #083971; FONT-WEIGHT: bold
}
.int_conto A:visited {
	COLOR: #083971; FONT-WEIGHT: bold
}
#down A {
	COLOR: #083971; FONT-WEIGHT: bold
}
#down A:hover {
	COLOR: #083971; FONT-WEIGHT: bold
}
#down A:visited {
	COLOR: #083971; FONT-WEIGHT: bold
}
#down {
	Z-INDEX: 1000; BORDER-BOTTOM: black 1px solid; POSITION: absolute; =
TEXT-ALIGN: center; BORDER-LEFT: black 1px solid; BACKGROUND-COLOR: =
white; PADDING-LEFT: 8px; WIDTH: 300px; PADDING-RIGHT: 8px; MARGIN-LEFT: =
-9px; CLEAR: both; FONT-SIZE: 9px; BORDER-RIGHT: black 1px solid; =
PADDING-TOP: 0px
}
#down UL {
	PADDING-BOTTOM: 10px
}
#down LI {
	LINE-HEIGHT: 14px; BACKGROUND-COLOR: white; LIST-STYLE-TYPE: none; =
LIST-STYLE-IMAGE: none
}
.toggle {
	BACKGROUND-IMAGE: url(/images/freccetta.gif); PADDING-RIGHT: 20px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: right bottom; =
PADDING-TOP: 1px
}
#top_menu {
	TEXT-ALIGN: right; MARGIN-TOP: 10px; WIDTH: 406px; FLOAT: right
}
#top_menu UL {
	HEIGHT: 30px
}
#top_menu A {
	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; COLOR: #555; =
FONT-SIZE: 9px; TEXT-DECORATION: none
}
#top_menu A:visited {
	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; COLOR: #555; =
FONT-SIZE: 9px; TEXT-DECORATION: none
}
#top_menu A:hover {
	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; COLOR: #555; =
FONT-SIZE: 9px; TEXT-DECORATION: none
}
#top_menu A {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; DISPLAY: =
block; HEIGHT: 30px; BORDER-RIGHT: #999999 1px solid; PADDING-TOP: 0px
}
#top_menu LI {
	LINE-HEIGHT: 30px; LIST-STYLE-TYPE: none; FLOAT: left; HEIGHT: 30px; =
LIST-STYLE-IMAGE: none
}
#w_list {
	BACKGROUND-IMAGE: url(../images/freccetta_top.gif); TEXT-ALIGN: left; =
WIDTH: 88px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 75px =
14px
}
#down_wl {
	Z-INDEX: 20; POSITION: relative; BACKGROUND-COLOR: #fff
}
#down_wl LI {
	FLOAT: none
}
#down_wl A {
	Z-INDEX: 10; POSITION: relative; BACKGROUND-COLOR: #fff; PADDING-RIGHT: =
5px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; COLOR: #555; =
MARGIN-LEFT: -12px; FONT-SIZE: 9px; TEXT-DECORATION: none
}
#down_wl A:hover {
	TEXT-DECORATION: underline
}
#top_menu A:hover {
	TEXT-DECORATION: underline
}
.top_menu_text {
	LINE-HEIGHT: 30px; HEIGHT: 30px; VERTICAL-ALIGN: middle
}
#carrello {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-RIGHT: =
2px; HEIGHT: 26px; VERTICAL-ALIGN: top; BORDER-TOP: medium none; =
BORDER-RIGHT: medium none
}
#carrello A {
	WIDTH: 38px; PADDING-RIGHT: 22px; DISPLAY: block; BACKGROUND: =
url(/images/loghinoBlu.gif) no-repeat right top; HEIGHT: 28px; =
BORDER-RIGHT: #999 1px solid
}
#help {
	BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-RIGHT: 10px; BACKGROUND: =
url(/images/question2.gif) no-repeat right top; BORDER-TOP: 0px; =
BORDER-RIGHT: 0px
}
#help A {
	BORDER-RIGHT: medium none
}
.search_ul {
	WIDTH: 956px; MARGIN-LEFT: auto; CLEAR: both; MARGIN-RIGHT: auto
}
.search_ul LI {
	LIST-STYLE-TYPE: none; FONT-FAMILY: Verdana, Arial, Helvetica, =
sans-serif; FLOAT: left; COLOR: #666; FONT-SIZE: 10px; FONT-WEIGHT: =
bold; LIST-STYLE-IMAGE: none
}
.search_ul A {
	MARGIN-TOP: 12px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #666; =
FONT-WEIGHT: bold; BORDER-RIGHT: #666 1px solid; TEXT-DECORATION: none
}
.search_ul A:visited {
	MARGIN-TOP: 12px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #666; =
FONT-WEIGHT: bold; BORDER-RIGHT: #666 1px solid; TEXT-DECORATION: none
}
.search_ul SPAN {
	MARGIN-TOP: 12px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #666; =
FONT-WEIGHT: bold; BORDER-RIGHT: #666 1px solid; TEXT-DECORATION: none
}
.search_ul SPAN {
	BORDER-RIGHT: medium none
}
.search_ul A:hover {
	TEXT-DECORATION: underline
}
#search_line {
	TEXT-ALIGN: center; HEIGHT: 53px
}
#go_query {
	MARGIN: 8px 0px 0px 5px; FLOAT: left
}
#link_utili_oriz {
	WIDTH: 718px; MARGIN-LEFT: auto; CLEAR: both; MARGIN-RIGHT: auto; =
PADDING-TOP: 1px
}
#link_utili_oriz LI {
	LIST-STYLE-TYPE: none; FLOAT: left; LIST-STYLE-IMAGE: none
}
#link_utili_oriz LI A {
	MARGIN-TOP: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #666; =
FONT-SIZE: 9px; FONT-WEIGHT: bold; BORDER-RIGHT: #666 1px solid; =
TEXT-DECORATION: none
}
#link_utili_oriz LI A:visited {
	MARGIN-TOP: 5px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #666; =
FONT-SIZE: 9px; FONT-WEIGHT: bold; BORDER-RIGHT: #666 1px solid; =
TEXT-DECORATION: none
}
#link_utili_oriz LI A:visited {
	COLOR: #666; TEXT-DECORATION: none
}
#link_utili_oriz LI A:hover {
	TEXT-DECORATION: underline
}
#first_time {
	TEXT-ALIGN: center; WIDTH: 100%; FONT-FAMILY: Verdana, Arial, =
Helvetica, sans-serif; COLOR: #666; CLEAR: both; FONT-SIZE: 9px; =
FONT-WEIGHT: bold; TEXT-DECORATION: none; PADDING-TOP: 6px
}
#first_time A {
	COLOR: #666; TEXT-DECORATION: underline
}
#query_field {
	MARGIN-TOP: 8px; FLOAT: left; MARGIN-LEFT: 5px
}
#query_string {
	MARGIN-TOP: 8px; FLOAT: left; MARGIN-LEFT: 5px
}
#query_field2 {
	MARGIN: -2px 5px 0px; FLOAT: left
}
#query_string2 {
	MARGIN: -2px 5px 0px; FLOAT: left
}
#query_string {
	WIDTH: 480px; HEIGHT: 18px; COLOR: #555; FONT-WEIGHT: normal
}
#query_field2 {
	WIDTH: 100px; HEIGHT: 19px; FONT-SIZE: 12px
}
#query_field {
	MIN-HEIGHT: 22px; WIDTH: 120px; HEIGHT: 22px; MAX-HEIGHT: 22px
}
#query_string2 {
	WIDTH: 350px; HEIGHT: 16px; FONT-SIZE: 12px
}
#tabs_menu {
	BACKGROUND-IMAGE: url(/images/bkg_blu.gif); POSITION: relative; =
MARGIN-TOP: -27px; WIDTH: 100%; BACKGROUND-REPEAT: repeat-x; =
BACKGROUND-POSITION: left bottom; FLOAT: left; HEIGHT: 32px; CLEAR: both
}
#tabs_menu UL {
	WIDTH: 590px; MARGIN-LEFT: auto; MARGIN-RIGHT: auto
}
#tabs_menu LI {
	LIST-STYLE-TYPE: none; FLOAT: left; LIST-STYLE-IMAGE: none
}
#tabs_menu A {
	Z-INDEX: 100; POSITION: relative; TEXT-ALIGN: center; PADDING-BOTTOM: =
10px; LINE-HEIGHT: 11px; PADDING-LEFT: 0px; WIDTH: 58px; PADDING-RIGHT: =
0px; DISPLAY: block; FONT-FAMILY: Arial, Helvetica, sans-serif; =
BACKGROUND: url(/images/tab_w.gif) no-repeat right top; COLOR: #555; =
FONT-SIZE: 11px; FONT-WEIGHT: bold; TEXT-DECORATION: none; PADDING-TOP: =
16px
}
#tabs_menu A:hover {
=09
}
#homeTab A {
	WIDTH: 60px; BACKGROUND: url(/images/tab_h.gif) no-repeat right top; =
COLOR: #555
}
#homeTab A:hover {
=09
}
#businessTab A {
	WIDTH: 65px; BACKGROUND: url(/images/tab_bus.gif) no-repeat right top
}
#businessTab A:hover {
=09
}
#LIATab A {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 7px
}
#MDSTab A {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 7px
}
#gamesTab A {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 7px
}
#giftTab A {
	TEXT-TRANSFORM: capitalize; BACKGROUND: url(/images/tab_red.gif) =
no-repeat right top; COLOR: #fff
}
#partner A {
	PADDING-BOTTOM: 5px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
PADDING-TOP: 7px
}
#navigatore A {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#003366; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#navigatore A:hover {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#003366; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#navigatore A:visited {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#003366; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#navigatore {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#003366; FONT-SIZE: 10px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#header {
	MIN-WIDTH: 960px
}
#footer {
	MIN-WIDTH: 960px
}
#header {
	BACKGROUND-IMAGE: url(/images/pernatale2.jpg); PADDING-BOTTOM: 0px; =
MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; =
BACKGROUND-REPEAT: repeat-x; BACKGROUND-POSITION: 50% top; FLOAT: left; =
PADDING-TOP: 0px
}
#pernatale2 {
	BACKGROUND-IMAGE: url(/images/sfondo_head.jpg); PADDING-BOTTOM: 0px; =
MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: left top; FLOAT: =
left; PADDING-TOP: 0px
}
#history {
	Z-INDEX: 1; POSITION: relative; MARGIN-TOP: 10px; WIDTH: 97%; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
MARGIN-BOTTOM: 10px; FLOAT: left; MARGIN-LEFT: 2%; FONT-SIZE: 10px
}
#piedino {
	Z-INDEX: 1; POSITION: relative; MARGIN-TOP: 10px; WIDTH: 97%; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
MARGIN-BOTTOM: 10px; FLOAT: left; MARGIN-LEFT: 2%; FONT-SIZE: 10px
}
#history UL LI {
	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
}
.hd {
	PADDING-LEFT: 6px; WIDTH: 32%; FLOAT: left; PADDING-TOP: 20px
}
.middle_f.hd {
	WIDTH: 33%
}
.right_f {
	FLOAT: right; MARGIN-RIGHT: -10px
}
.hd UL {
	MARGIN-TOP: 10px; MARGIN-LEFT: 10px
}
.hd LI {
	BACKGROUND-IMAGE: url(/images/puntini.gif); LINE-HEIGHT: 22px; =
PADDING-LEFT: 10px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left center
}
#lastProducts LI {
	BACKGROUND-IMAGE: none; LINE-HEIGHT: 30px; DISPLAY: block; CLEAR: both; =
PADDING-TOP: 0px
}
#lastProducts A {
	MARGIN-TOP: -3px; DISPLAY: block; FLOAT: left
}
.prod_image {
	FLOAT: left; MARGIN-RIGHT: 5px
}
.titleHistory {
	PADDING-LEFT: 10px; DISPLAY: block; COLOR: #003366; FONT-SIZE: 11px; =
FONT-WEIGHT: bold
}
#piedino_ul {
	WIDTH: 100%; FONT-FAMILY: Arial, Helvetica, sans-serif; COLOR: #555555; =
FONT-SIZE: 10px
}
#piedino_ul LI {
	LIST-STYLE-TYPE: disc; HEIGHT: 13px
}
#piedino_ul LI A {
	FONT-FAMILY: Arial, Helvetica, sans-serif; COLOR: #666666; FONT-SIZE: =
10px; CURSOR: pointer; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.left_li {
	MARGIN-LEFT: 23%
}
#piedino_ul LI.blank.left_li {
	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
}
#piedino_ul LI.blank.middle_li {
	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
}
#piedino_ul LI.blank.right_li {
	LIST-STYLE-TYPE: none; LIST-STYLE-IMAGE: none
}
.middle_li {
	MARGIN-LEFT: 48%
}
.right_li {
	MARGIN-LEFT: 73%
}
.reset {
	MARGIN-TOP: -92px
}
#copyright {
	TEXT-ALIGN: center; WIDTH: 100%; MARGIN-BOTTOM: 10px; CLEAR: both
}
#copyright P {
	TEXT-ALIGN: center; WIDTH: 60%; FONT-FAMILY: Arial, Helvetica, =
sans-serif; COLOR: #666666; MARGIN-LEFT: auto; FONT-SIZE: 10px; =
MARGIN-RIGHT: auto
}
#copyright A {
	COLOR: #444
}
#copyright A:hover {
	COLOR: #444
}
#copyright A:visited {
	COLOR: #444
}
#menu_bottom {
	MARGIN: 0px auto; WIDTH: 805px; PADDING-TOP: 7px
}
#menu_bottom {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#333; FONT-SIZE: 10px; TEXT-DECORATION: none
}
#menu_bottom A {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: =
#333; FONT-SIZE: 10px; TEXT-DECORATION: none
}
#menu_bottom LI {
	TEXT-ALIGN: center; LIST-STYLE-TYPE: none; FLOAT: left; =
LIST-STYLE-IMAGE: none
}
.menu_b {
	BACKGROUND-IMAGE: url(/images/maggiore.gif); PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
right 50%
}
#go_bottom {
	POSITION: relative; MARGIN-TOP: -3px; FLOAT: left; z-inde: 1
}
#language A {
	WIDTH: 15px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
BACKGROUND-POSITION: 50% bottom; FLOAT: left; HEIGHT: 22px; MARGIN-LEFT: =
6px; TEXT-DECORATION: none
}
#language {
	MARGIN: 10px 20px 0px 0px; FLOAT: right
}
#language SPAN {
	DISPLAY: none
}
#lang_it {
	BACKGROUND-IMAGE: url(/images/ita_off.gif); BACKGROUND-REPEAT: =
no-repeat
}
#lang_it:hover {
	BACKGROUND-IMAGE: url(/images/ita_on.gif)
}
#lang_it_on {
	BACKGROUND-IMAGE: url(/images/ita_on.gif)
}
#lang_en {
	BACKGROUND-IMAGE: url(/images/en_off.gif); BACKGROUND-REPEAT: no-repeat
}
#lang_en:hover {
	BACKGROUND-IMAGE: url(/images/en_on.gif)
}
#lang_en_on {
	BACKGROUND-IMAGE: url(/images/en_on.gif)
}
#lang_es {
	BACKGROUND-IMAGE: url(/images/es_off.gif); BACKGROUND-REPEAT: no-repeat
}
#lang_es:hover {
	BACKGROUND-IMAGE: url(/images/es_on.gif)
}
#lang_es_on {
	BACKGROUND-IMAGE: url(/images/es_on.gif)
}
#lang_fr {
	BACKGROUND-IMAGE: url(/images/fr_off.gif); BACKGROUND-REPEAT: no-repeat
}
#lang_fr:hover {
	BACKGROUND-IMAGE: url(/images/fr_on.gif)
}
#lang_fr_on {
	BACKGROUND-IMAGE: url(/images/fr_on.gif)
}
#lang_de {
	BACKGROUND-IMAGE: url(/images/de_off.gif); BACKGROUND-REPEAT: no-repeat
}
#lang_de:hover {
	BACKGROUND-IMAGE: url(/images/de_on.gif)
}
#lang_de_on {
	BACKGROUND-IMAGE: url(/images/de_on.gif)
}
#suggestions {
	BACKGROUND-IMAGE: url(/images/suggestions_bkg.gif); Z-INDEX: 1000; =
POSITION: absolute; MARGIN-TOP: -50px; WIDTH: 180px; HEIGHT: 55px; =
MARGIN-LEFT: 140px
}
#stickies .stickies_close_area {
	PADDING-BOTTOM: 4px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
10px; FLOAT: right; PADDING-TOP: 0px
}
#stickies .error_stickie {
	PADDING-BOTTOM: 8px; MARGIN: 10px 0px; PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; PADDING-TOP: 8px; -webkit-border-radius: 10px
}
#stickies .warning_stickie {
	PADDING-BOTTOM: 8px; MARGIN: 10px 0px; PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; PADDING-TOP: 8px; -webkit-border-radius: 10px
}
#stickies .notice_stickie {
	PADDING-BOTTOM: 8px; MARGIN: 10px 0px; PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; PADDING-TOP: 8px; -webkit-border-radius: 10px
}
#stickies .debug_stickie {
	PADDING-BOTTOM: 8px; MARGIN: 10px 0px; PADDING-LEFT: 8px; =
PADDING-RIGHT: 8px; PADDING-TOP: 8px; -webkit-border-radius: 10px
}
.error_stickie {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FONT-SIZE: =
12px; FONT-WEIGHT: bold
}
.warning_stickie {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FONT-SIZE: =
12px; FONT-WEIGHT: bold
}
.notice_stickie {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FONT-SIZE: =
12px; FONT-WEIGHT: bold
}
.debug_stickie {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FONT-SIZE: =
12px; FONT-WEIGHT: bold
}
#stickies .error_stickie {
	BORDER-BOTTOM: #cc2f00 2px solid; BORDER-LEFT: #cc2f00 2px solid; =
BACKGROUND-COLOR: #ff9999; BORDER-TOP: #cc2f00 2px solid; BORDER-RIGHT: =
#cc2f00 2px solid
}
#stickies .warning_stickie {
	BORDER-BOTTOM: #ff7700 2px solid; BORDER-LEFT: #ff7700 2px solid; =
BACKGROUND-COLOR: #ffc28d; BORDER-TOP: #ff7700 2px solid; BORDER-RIGHT: =
#ff7700 2px solid
}
#stickies .notice_stickie {
	BORDER-BOTTOM: #399c07 2px solid; BORDER-LEFT: #399c07 2px solid; =
BACKGROUND-COLOR: #d7ffaf; BORDER-TOP: #399c07 2px solid; BORDER-RIGHT: =
#399c07 2px solid
}
#stickies .debug_stickie {
	BORDER-BOTTOM: #444 2px dashed; BORDER-LEFT: #444 2px dashed; =
BACKGROUND-COLOR: #eee; BORDER-TOP: #444 2px dashed; BORDER-RIGHT: #444 =
2px dashed
}

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/stylesheets/print_all.css?1216117623

#categories_sidebar {
	DISPLAY: none
}
#footer {
	DISPLAY: none
}
#copyright {
	DISPLAY: none
}
.carrello {
	DISPLAY: none
}
.notice {
	DISPLAY: none
}
#right {
	DISPLAY: none
}
#welcome {
	DISPLAY: none
}
#top_menu {
	DISPLAY: none
}
#tabs_menu {
	DISPLAY: none
}
#language {
	DISPLAY: none
}
#search_line {
	DISPLAY: none
}
#sub_menu {
	DISPLAY: none
}
.results_summary {
	DISPLAY: none
}
.selector {
	DISPLAY: none
}
.suggerimenti {
	DISPLAY: none
}
A IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: =
medium none; MARGIN-RIGHT: 10px; BORDER-RIGHT: medium none
}
.quant {
	FONT-WEIGHT: bold
}

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/stylesheets/_libri_italiani.css?1257861093

#libriTab A {
	BACKGROUND: url(/images/tab_blu.gif) no-repeat right top; COLOR: #fff
}
#libriTab A:hover {
	BACKGROUND: url(/images/tab_blu.gif) no-repeat right top; COLOR: #fff
}
#it_Title {
	BACKGROUND-IMAGE: url(/images/libri_italiani.gif); WIDTH: 115px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: center 50%; HEIGHT: =
20px; MARGIN-LEFT: 10px; PADDING-TOP: 5px
}
#en_Title {
	BACKGROUND-IMAGE: url(/images/italian_books.gif); WIDTH: 130px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: center 50%; HEIGHT: =
23px; MARGIN-LEFT: 10px; PADDING-TOP: 5px
}
#es_Title {
	BACKGROUND-IMAGE: url(/images/libros_italianos.gif); WIDTH: 150px; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: center 50%; HEIGHT: =
23px; MARGIN-LEFT: 10px; PADDING-TOP: 5px
}
#bluMenu {
	WIDTH: 480px
}
#search_line {
	BACKGROUND-COLOR: #9ed1e4
}
#right {
	BACKGROUND-IMAGE: url(/images/reminders_libri.jpg); =
BACKGROUND-POSITION: 10px top; PADDING-TOP: 91px
}
#STitle {
	COLOR: #00a0c6
}
.h1title {
	COLOR: #083971
}

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/stylesheets/_scheda_prodotto.css?1253261857

A IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: =
medium none; BORDER-RIGHT: medium none
}
#container {
	BACKGROUND-IMAGE: none; MIN-WIDTH: 750px; PADDING-LEFT: 25px; =
PADDING-RIGHT: 220px
}
#center {
	WIDTH: 97%; PADDING-RIGHT: 15px; FONT-SIZE: 11px
}
#right {
	BACKGROUND-IMAGE: none; TEXT-ALIGN: center; WIDTH: 210px; MARGIN-RIGHT: =
-210px; PADDING-TOP: 10px
}
#dati_scheda IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; FLOAT: left; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
#scheda_recensioni IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; FLOAT: left; =
BORDER-TOP: medium none; BORDER-RIGHT: medium none
}
#copertina_prod {
	POSITION: relative; MARGIN: 10px 20px 0px 10px; FLOAT: left; CURSOR: =
pointer; TEXT-DECORATION: none
}
#music IMG {
	MARGIN: 10px 20px 0px 10px
}
#sconto_due {
	Z-INDEX: 1; POSITION: relative; MARGIN: 100px 0px 0px -35px; WIDTH: =
30px; DISPLAY: block; FLOAT: left; HEIGHT: 30px
}
#cover_big {
	Z-INDEX: 10; POSITION: absolute; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: =
#000; PADDING-LEFT: 0px; WIDTH: 200px; PADDING-RIGHT: 0px; FLOAT: left; =
TOP: -10px; PADDING-TOP: 0px; LEFT: 0px
}
#cover_big IMG {
	Z-INDEX: 20; POSITION: relative; MARGIN: 0px; FLOAT: left
}
.chiudi_img {
	TEXT-ALIGN: right; WIDTH: 100%; DISPLAY: block; CLEAR: both
}
.chiudi_img A {
	COLOR: #fff; FONT-WEIGHT: bold
}
.chiudi_img A:hover {
	COLOR: #fff; FONT-WEIGHT: bold
}
.chiudi_img A:visited {
	COLOR: #fff; FONT-WEIGHT: bold
}
#scheda {
	BORDER-BOTTOM: #888 1px solid; PADDING-BOTTOM: 5px; WIDTH: 100%; =
MARGIN-BOTTOM: 5px; FLOAT: left
}
#scheda_recensioni {
	PADDING-BOTTOM: 5px; WIDTH: 97%; PADDING-RIGHT: 15px; MARGIN-BOTTOM: =
5px; FLOAT: left
}
#dati_scheda {
	BORDER-BOTTOM: #888 1px solid; PADDING-BOTTOM: 5px; MARGIN-TOP: 10px; =
WIDTH: 100%; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
FLOAT: left; COLOR: #000
}
#videoplayer {
	PADDING-BOTTOM: 5px; FLOAT: right
}
.sotto {
	LINE-HEIGHT: 20px; MARGIN: 5px 0px 0px; FONT-FAMILY: Verdana, Geneva, =
Arial, Helvetica, sans-serif; FLOAT: left; COLOR: #000; CLEAR: left
}
#dati_scheda SPAN {
	LINE-HEIGHT: 22px
}
#main_title {
	PADDING-BOTTOM: 15px; WIDTH: 100%
}
.titolo_scheda {
	MARGIN-TOP: 10px; DISPLAY: block; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; FONT-SIZE: 17px; FONT-WEIGHT: bold
}
.sottotitolo_scheda {
	FONT-STYLE: italic; DISPLAY: block; FONT-FAMILY: Verdana, Geneva, =
Arial, Helvetica, sans-serif; FONT-SIZE: 13px
}
.autore_scheda {
	DISPLAY: block; FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.collana_scheda {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FONT-SIZE: =
14px; FONT-WEIGHT: bold
}
.int_prezzo_scheda {
	FONT-SIZE: 11px; FONT-WEIGHT: bold
}
.int_ex_price_scheda {
	FONT-SIZE: 11px
}
.ex_price {
	FONT-WEIGHT: bold
}
.isbn {
	DISPLAY: block
}
.int_scheda {
	FONT-WEIGHT: bold
}
.editore_scheda {
	DISPLAY: block
}
.editore_scheda.int_scheda {
	CLEAR: both
}
.sconto_scheda {
	COLOR: #96190c; FONT-SIZE: 12px; FONT-WEIGHT: bold
}
.prezzo_scheda {
	COLOR: #96190c; FONT-SIZE: 12px; FONT-WEIGHT: bold
}
P.sconto_scheda {
	DISPLAY: block
}
#better_with .sconto_scheda {
	FONT-SIZE: 12px
}
#better_with .prezzo_scheda {
	FONT-SIZE: 12px
}
.inizio {
	FONT-FAMILY: verdana; FLOAT: right; COLOR: #0978a1; FONT-SIZE: 9px; =
FONT-WEIGHT: bold; TEXT-DECORATION: none
}
#riferimenti {
	PADDING-LEFT: 5px; WIDTH: 100%; FONT-FAMILY: verdana; MARGIN-BOTTOM: =
10px; FLOAT: left
}
.altri_titolo {
	MARGIN: 10px 0px; DISPLAY: block; FONT-FAMILY: verdana; COLOR: #06306c; =
FONT-SIZE: 12px; FONT-WEIGHT: bold
}
#riferimenti {
	MARGIN: 20px
}
#history_scheda {
	MARGIN: 20px
}
#history_scheda {
	BORDER-BOTTOM: #f9f9f9 5px solid; BORDER-LEFT: #f9f9f9 5px solid; =
FLOAT: left; BORDER-TOP: #f9f9f9 5px solid; BORDER-RIGHT: #f9f9f9 5px =
solid
}
#history_scheda LI {
	PADDING-BOTTOM: 5px; LIST-STYLE-TYPE: none; PADDING-LEFT: 5px; =
PADDING-RIGHT: 5px; FONT-FAMILY: verdana; LIST-STYLE-IMAGE: none; =
PADDING-TOP: 5px
}
.titolo_box {
	Z-INDEX: 1; POSITION: relative; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: =
#f2f0f1; MARGIN: -5px; PADDING-LEFT: 0px; PADDING-RIGHT: 25px; =
FONT-FAMILY: arial; COLOR: #06306c; FONT-SIZE: 14px; FONT-WEIGHT: bold; =
PADDING-TOP: 5px
}
#better_with {
	TEXT-ALIGN: center; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
#better_with SPAN {
	TEXT-ALIGN: center; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
#better_with .titolo_scheda {
	TEXT-ALIGN: center; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
#better_with .autore_scheda {
	TEXT-ALIGN: center; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
#better_with .int_prezzo_scheda {
	DISPLAY: block
}
#better_with .prezzo_scheda {
	PADDING-BOTTOM: 10px; DISPLAY: block
}
.prezzi {
	WIDTH: 250px
}
.plus {
	WIDTH: 20px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #777; FONT-SIZE: 17px; FONT-WEIGHT: bold
}
.add_td {
	WIDTH: 200px
}
.altri_prodotti {
	BACKGROUND-IMAGE: url(../images/plus.gif); LINE-HEIGHT: 22px; =
LIST-STYLE-TYPE: none; PADDING-LEFT: 13px; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left 8px; COLOR: #0978a1; FONT-SIZE: 13px; =
LIST-STYLE-IMAGE: none
}
.altri_prodotti A {
	COLOR: #008acc; TEXT-DECORATION: underline
}
.altre_ric {
	MARGIN: 5px 0px; DISPLAY: block; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; COLOR: #06306c; FONT-SIZE: 11px; FONT-WEIGHT: =
bold
}
.availability {
	BACKGROUND-IMAGE: url(/images/sf_availability.gif); TEXT-ALIGN: center; =
WIDTH: 207px; BACKGROUND-REPEAT: no-repeat; MARGIN-BOTTOM: 10px; HEIGHT: =
124px
}
.proposer.availability {
	CLEAR: both; PADDING-TOP: 35px
}
.quant {
	MARGIN: 10px 0px 2px 50px; DISPLAY: block; FONT-FAMILY: verdana; FLOAT: =
left; COLOR: #d96903; FONT-SIZE: 10px; FONT-WEIGHT: bold; PADDING-TOP: =
10px
}
.availability SELECT {
	Z-INDEX: 10; POSITION: relative; MARGIN: 15px 0px 8px 10px; WIDTH: =
35px; FONT-FAMILY: verdana; FLOAT: left; FONT-SIZE: 9px
}
.av {
	TEXT-ALIGN: center; MARGIN: 5px 10px; FONT-FAMILY: verdana; COLOR: =
#fff; FONT-SIZE: 10px; FONT-WEIGHT: bold
}
.not_av {
	FONT-FAMILY: verdana; COLOR: #083971; FONT-SIZE: 12px; FONT-WEIGHT: =
bold; PADDING-TOP: 30px
}
#altre_opzioni {
	BACKGROUND-IMAGE: url(/images/sf_altre_opzioni.gif); TEXT-ALIGN: =
center; MARGIN-TOP: 5px; WIDTH: 207px; BACKGROUND-REPEAT: no-repeat; =
HEIGHT: 117px
}
#altre_opzioni P {
	COLOR: #083971; FONT-WEIGHT: bold
}
#altre_opzioni A {
	COLOR: #083971
}
#altre_opzioni A:hover {
	COLOR: #083971
}
#altre_opzioni A:visited {
	COLOR: #083971
}
.bottone_143 {
	MARGIN: 15px auto 0px
}
.title {
	TEXT-ALIGN: center; FONT-FAMILY: Arial, Helvetica, sans-serif; =
FONT-SIZE: 14px; PADDING-TOP: 7px
}
.content {
	MARGIN-TOP: 20px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; FONT-SIZE: 10px
}
.content SPAN {
	MARGIN-TOP: 10px; DISPLAY: block
}
#altre_opzioni A {
	DISPLAY: block; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #083971; FONT-SIZE: 11px; PADDING-TOP: 5px
}
#abe_container {
	DISPLAY: block; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; COLOR: #083971; FONT-SIZE: 11px; PADDING-TOP: 5px
}
.title_box {
	TEXT-ALIGN: center; PADDING-BOTTOM: 5px; BACKGROUND-COLOR: #1893bf; =
PADDING-LEFT: 2px; WIDTH: 100%; PADDING-RIGHT: 2px; FONT-FAMILY: Arial, =
Helvetica, sans-serif; MARGIN-BOTTOM: 5px; COLOR: #ffffff; FONT-SIZE: =
12px; FONT-WEIGHT: bold; PADDING-TOP: 5px
}
.dati {
	TEXT-ALIGN: center; PADDING-BOTTOM: 2px; PADDING-LEFT: 10px; =
PADDING-RIGHT: 0px; FLOAT: left; HEIGHT: 22px; MARGIN-LEFT: 0px; CLEAR: =
none; PADDING-TOP: 8px
}
.wish_or_remove {
	MARGIN: 2px auto; FONT-WEIGHT: normal
}
#classifica_lettori {
	MARGIN-LEFT: 20px
}
#classifica_lettori LI {
	MARGIN: 10px 0px 0px 10px; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; FLOAT: none; COLOR: #103f83; FONT-SIZE: 11px; =
FONT-WEIGHT: bold
}
.pari_li {
	BACKGROUND-COLOR: #f3f3f3
}
.normal {
	COLOR: #333; FONT-WEIGHT: normal
}
.ac {
	DISPLAY: block; CLEAR: both
}
.cleared {
	MARGIN-TOP: 5px; CLEAR: both
}
.f_left {
	DISPLAY: block; FLOAT: left
}
.navigatore_pagine {
	TEXT-ALIGN: right; PADDING-BOTTOM: 10px; PADDING-LEFT: 0px; WIDTH: =
auto; PADDING-RIGHT: 0px; FONT-FAMILY: Verdana, Geneva, Arial, =
Helvetica, sans-serif; COLOR: #103f83; FONT-SIZE: 11px; FONT-WEIGHT: =
bold; PADDING-TOP: 10px
}
.navigatore_pagine A {
	COLOR: #0386a5; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.navigatore_pagine A:visited {
	COLOR: #0386a5; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.navigatore_pagine A:hover {
	COLOR: #0386a5; FONT-WEIGHT: bold; TEXT-DECORATION: underline
}
#top {
	PADDING-BOTTOM: 10px; PADDING-LEFT: 0px; WIDTH: 30%; PADDING-RIGHT: =
70px; BACKGROUND-POSITION: right top; PADDING-TOP: 0px
}
.sotto_schede_big {
	MARGIN: 10px 1%; WIDTH: 96%; BORDER-TOP: #888888 1px dashed
}
.on_a {
	FONT-SIZE: 10px
}
.istruzioni {
	PADDING-BOTTOM: 15px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; =
MARGIN-LEFT: 0px; PADDING-TOP: 15px
}
.istruzioni SPAN {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
PADDING-TOP: 0px
}
.other_content {
	MIN-WIDTH: 730px; PADDING-BOTTOM: 10px; PADDING-LEFT: 4%; =
PADDING-RIGHT: 4%; PADDING-TOP: 10px
}
.nav_tab {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; CLEAR: =
both; PADDING-TOP: 20px
}
.mt20 {
	FLOAT: left; PADDING-TOP: 20px
}
.azz_200 {
	BACKGROUND-IMAGE: url(/images/bottom_200_azz.gif); PADDING-BOTTOM: =
10px; WIDTH: 207px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: =
left bottom; FLOAT: left
}
.azz_200 H1 {
	BACKGROUND-IMAGE: url(/images/top_200_azz.gif); TEXT-ALIGN: center; =
PADDING-BOTTOM: 1px; MARGIN: 0px; MIN-HEIGHT: 36px; PADDING-LEFT: 0px; =
WIDTH: 207px; PADDING-RIGHT: 5px; DISPLAY: block; BACKGROUND-REPEAT: =
no-repeat; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px; =
FONT-WEIGHT: bold; PADDING-TOP: 8px
}
.azz_200_h1 {
	BACKGROUND-IMAGE: url(/images/top_200_azz.gif); TEXT-ALIGN: center; =
PADDING-BOTTOM: 1px; MARGIN: 0px; MIN-HEIGHT: 36px; PADDING-LEFT: 0px; =
WIDTH: 207px; PADDING-RIGHT: 5px; DISPLAY: block; BACKGROUND-REPEAT: =
no-repeat; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #083971; FONT-SIZE: 11px; =
FONT-WEIGHT: bold; PADDING-TOP: 8px
}
.azz_200 UL {
	BACKGROUND-IMAGE: url(/images/center_200_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.azz_200 P {
	BACKGROUND-IMAGE: url(/images/center_200_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.azz_200 OL {
	BACKGROUND-IMAGE: url(/images/center_200_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.same_au_cont {
	BACKGROUND-IMAGE: url(/images/center_200_azz.gif); MARGIN: 0px; =
DISPLAY: block; BACKGROUND-REPEAT: repeat-y; BACKGROUND-POSITION: left =
top
}
.same_au {
	TEXT-ALIGN: left; MARGIN-TOP: 5px; MARGIN-LEFT: 2px
}
.same_au_cont {
	WIDTH: 207px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, =
sans-serif; FLOAT: left; FONT-SIZE: 11px
}
.same_au LI {
	BORDER-BOTTOM: #555 1px dashed; PADDING-BOTTOM: 3px; LIST-STYLE-TYPE: =
none; MIN-HEIGHT: 60px; PADDING-LEFT: 5px; WIDTH: 95%; PADDING-RIGHT: =
0px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FLOAT: =
left; COLOR: #555555; CLEAR: both; FONT-SIZE: 10px; LIST-STYLE-IMAGE: =
none; MARGIN-RIGHT: 5px; PADDING-TOP: 5px
}
.same_au_cont_cont {
	BORDER-BOTTOM: #555 1px dashed; PADDING-BOTTOM: 3px; LIST-STYLE-TYPE: =
none; MIN-HEIGHT: 60px; PADDING-LEFT: 5px; WIDTH: 95%; PADDING-RIGHT: =
0px; FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; FLOAT: =
left; COLOR: #555555; CLEAR: both; FONT-SIZE: 10px; LIST-STYLE-IMAGE: =
none; MARGIN-RIGHT: 5px; PADDING-TOP: 5px
}
#last_same {
	MIN-HEIGHT: 20px
}
#posta H1 {
	BACKGROUND-IMAGE: url(/images/top_208_posta_libri.gif); TEXT-ALIGN: =
center; PADDING-BOTTOM: 15px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: =
207px; PADDING-RIGHT: 0px; DISPLAY: block; BACKGROUND-REPEAT: no-repeat; =
FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif; =
BACKGROUND-POSITION: left top; COLOR: #fff; FONT-SIZE: 11px; =
PADDING-TOP: 2px
}
#posta {
	BACKGROUND-IMAGE: url(/images/bottom_207_lilla.gif); TEXT-ALIGN: =
center; PADDING-BOTTOM: 8px; WIDTH: 207px; MARGIN-LEFT: 0px
}
#posta P {
	BACKGROUND-IMAGE: url(/images/center_207_lilla.gif); PADDING-BOTTOM: =
5px; MARGIN: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: #999; FONT-SIZE: =
9px; FONT-WEIGHT: bold; PADDING-TOP: 5px
}
#posta UL {
	BACKGROUND-IMAGE: url(/images/center_207_lilla.gif); PADDING-BOTTOM: =
5px; MARGIN: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; FONT-FAMILY: =
Verdana, Geneva, Arial, Helvetica, sans-serif; COLOR: #999; FONT-SIZE: =
9px; FONT-WEIGHT: bold; PADDING-TOP: 5px
}
#posta LI {
	TEXT-ALIGN: left; LIST-STYLE-TYPE: none; MIN-HEIGHT: 16px; MARGIN-LEFT: =
5px; LIST-STYLE-IMAGE: none
}
#select_ok {
	MARGIN-TOP: 5px; DISPLAY: block; COLOR: #009999; TEXT-DECORATION: none
}
.cover_dvd {
	WIDTH: 120px
}
.stelle5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle4 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle3 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle2 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle1 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle0 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle4e5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle3e5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle2e5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle1e5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle0e5 {
	MARGIN: 0px 0px 0px 5px; WIDTH: 130px; DISPLAY: block; =
BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 50px 3px; FLOAT: =
left; HEIGHT: 17px; FONT-WEIGHT: bold
}
.stelle5 SPAN {
	VISIBILITY: visible
}
.stelle4 SPAN {
	VISIBILITY: visible
}
.stelle3 SPAN {
	VISIBILITY: visible
}
.stelle2 SPAN {
	VISIBILITY: visible
}
.stelle1 SPAN {
	VISIBILITY: visible
}
.stelle0 SPAN {
	VISIBILITY: visible
}
.stelle4e5 SPAN {
	VISIBILITY: visible
}
.stelle3e5 SPAN {
	VISIBILITY: visible
}
.stelle2e5 SPAN {
	VISIBILITY: visible
}
.stelle1e5 SPAN {
	VISIBILITY: visible
}
.stelle0e5 SPAN {
	VISIBILITY: visible
}
#main_title .stelle5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle4 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle3 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle2 SPAN {
	PADDING-LEFT: 65px
}
.stelle1#main_title SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle0 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle4e5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle3e5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle2e5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle1e5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle0e5 SPAN {
	PADDING-LEFT: 65px
}
#main_title .stelle5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle4 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle3 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle2 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
.stelle1#main_title {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle0 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle4e5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle3e5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle2e5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle1e5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .stelle0e5 {
	WIDTH: 100px; BACKGROUND-POSITION: 0px 5px
}
#main_title .gray A {
	PADDING-LEFT: 0px; COLOR: #999999
}
.titolo_link {
	DISPLAY: inline; CLEAR: none
}
.titolo_link:hover {
	DISPLAY: inline; CLEAR: none
}
.titolo_link:visited {
	DISPLAY: inline; CLEAR: none
}
.reflect {
	DISPLAY: block
}
#verisign {
	BACKGROUND-IMAGE: url(/images/sf_verisign2.gif); MARGIN: 5px 0px 0px =
2px; WIDTH: 207px; BACKGROUND-REPEAT: no-repeat; FLOAT: left; HEIGHT: =
147px
}

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/stylesheets/print_scheda.css?1216117623

BODY {
	FONT-FAMILY: Verdana, Geneva, Arial, Helvetica, sans-serif
}
#categories_sidebar {
	DISPLAY: none
}
#footer {
	DISPLAY: none
}
#copyright {
	DISPLAY: none
}
.carrello {
	DISPLAY: none
}
.inizio {
	DISPLAY: none
}
#right {
	DISPLAY: none
}
.notice {
	DISPLAY: none
}
#welcome {
	DISPLAY: none
}
#top_menu {
	DISPLAY: none
}
#tabs_menu {
	DISPLAY: none
}
#language {
	DISPLAY: none
}
#search_line {
	DISPLAY: none
}
#sub_menu {
	DISPLAY: none
}
.titolo_scheda {
	DISPLAY: block; CLEAR: both; FONT-WEIGHT: bold
}
A IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; FLOAT: left; =
BORDER-TOP: medium none; MARGIN-RIGHT: 10px; BORDER-RIGHT: medium none
}
IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; FLOAT: left; =
BORDER-TOP: medium none; MARGIN-RIGHT: 10px; BORDER-RIGHT: medium none
}
#copertina_prod {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; MARGIN: 10px 10px =
0px 0px; FLOAT: left; CLEAR: both; BORDER-TOP: medium none; =
BORDER-RIGHT: medium none
}
#dati_scheda SPAN {
	WIDTH: 60%; FLOAT: left
}
#dati_scheda SPAN.int_scheda {
	WIDTH: 20%
}
.sotto_schede {
	CLEAR: both
}

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/javascripts/all.js?1250844501

/*  Prototype JavaScript framework, version 1.6.0.1=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.1',=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=
=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.isUndefined(object)) 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=
  toJSON: 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.toJSON) return object.toJSON();=0A=
    if (Object.isElement(object)) return;=0A=
=0A=
    var results =3D [];=0A=
    for (var property in object) {=0A=
      var value =3D Object.toJSON(object[property]);=0A=
      if (!Object.isUndefined(value))=0A=
        results.push(property.toJSON() + ': ' + 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 && Object.isUndefined(arguments[0])) 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 Object.isUndefined(count) ? 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 Object.isUndefined(truncation) ? '...' : 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=
  toJSON: 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;=0A=
    if (str.blank()) return false;=0A=
    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 /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;=0A=
      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 Object.isUndefined(fillWith) ? 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 null || 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 null || 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=
  toJSON: function() {=0A=
    var results =3D [];=0A=
    this.each(function(object) {=0A=
      var value =3D Object.toJSON(object);=0A=
      if (!Object.isUndefined(value)) 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=
  toJSON: 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=
=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: function(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=
    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=
    toJSON: function() {=0A=
      return Object.toJSON(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=
=0A=
    if (Object.isString(this.options.parameters))=0A=
      this.options.parameters =3D =
this.options.parameters.toQueryParams();=0A=
    else if (Object.isHash(this.options.parameters))=0A=
      this.options.parameters =3D this.options.parameters.toObject();=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 Object.isUndefined(xml) ? 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=
        this.responseText.blank())=0A=
          return null;=0A=
    try {=0A=
      return this.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 Object.clone(options);=0A=
    var onComplete =3D options.onComplete;=0A=
    options.onComplete =3D (function(response, json) {=0A=
      this.updateContent(response.responseText);=0A=
      if (Object.isFunction(onComplete)) onComplete(response, json);=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=
});=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 $(element).getElementsBySelector("*");=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 Object.isUndefined(value) ? true : value;=0A=
=0A=
    for (var attr in attributes) {=0A=
      name =3D t.names[attr] || attr;=0A=
      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=
    var originalAncestor =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 originalAncestor) 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=
          (Object.isUndefined(elementStyle.styleFloat) ? '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.wrap(=0A=
    function(proceed, element, style) {=0A=
      switch (style) {=0A=
        case 'left': case 'top': case 'right': case 'bottom':=0A=
          if (proceed(element, 'position') =3D=3D=3D 'static') return =
null;=0A=
        case 'height': case 'width':=0A=
          // returns '0px' for hidden elements; we want it to return null=0A=
          if (!Element.visible(element)) return null;=0A=
=0A=
          // returns the border-box dimensions rather than the =
content-box=0A=
          // dimensions, so we subtract padding and borders from the =
value=0A=
          var dim =3D parseInt(proceed(element, style), 10);=0A=
=0A=
          if (dim !=3D=3D element['offset' + style.capitalize()])=0A=
            return dim + 'px';=0A=
=0A=
          var properties;=0A=
          if (style =3D=3D=3D 'height') {=0A=
            properties =3D ['border-top-width', 'padding-top',=0A=
             'padding-bottom', 'border-bottom-width'];=0A=
          }=0A=
          else {=0A=
            properties =3D ['border-left-width', 'padding-left',=0A=
             'padding-right', 'border-right-width'];=0A=
          }=0A=
          return properties.inject(dim, function(memo, property) {=0A=
            var val =3D proceed(element, property);=0A=
            return val =3D=3D=3D null ? memo : memo - parseInt(val, 10);=0A=
          }) + 'px';=0A=
        default: return proceed(element, style);=0A=
      }=0A=
    }=0A=
  );=0A=
=0A=
  Element.Methods.readAttribute =3D Element.Methods.readAttribute.wrap(=0A=
    function(proceed, element, attribute) {=0A=
      if (attribute =3D=3D=3D 'title') return element.title;=0A=
      return proceed(element, attribute);=0A=
    }=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=
          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 =
Element#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=
    var B =3D Prototype.Browser;=0A=
    $w('width height').each(function(d) {=0A=
      var D =3D d.capitalize();=0A=
      dimensions[d] =3D (B.WebKit && !document.evaluate) ? self['inner' =
+ D] :=0A=
        (B.Opera) ? document.body['client' + D] : =
document.documentElement['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=
  shouldUseXPath: function() {=0A=
    if (!Prototype.BrowserFeatures.XPath) return false;=0A=
=0A=
    var e =3D this.expression;=0A=
=0A=
    // Safari 3 chokes on :*-of-type and :empty=0A=
    if (Prototype.Browser.WebKit &&=0A=
     (e.include("-of-type") || e.include(":empty")))=0A=
      return false;=0A=
=0A=
    // XPath can't do namespaced attributes, nor can it read=0A=
    // the "checked" property from DOM nodes=0A=
    if ((/(\[[\w-]*?:|:checked)/).test(this.expression))=0A=
      return false;=0A=
=0A=
    return true;=0A=
  },=0A=
=0A=
  compileMatcher: function() {=0A=
    if (this.shouldUseXPath())=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: function(m) {=0A=
      m[1] =3D m[1].toLowerCase();=0A=
      return new Template("[@#{1}]").evaluate(m);=0A=
    },=0A=
    attr: function(m) {=0A=
      m[1] =3D m[1].toLowerCase();=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, 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, 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(',');=0A=
    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=
if (Prototype.Browser.IE) {=0A=
  // IE returns comment nodes on getElementsByTagName("*").=0A=
  // Filter them out.=0A=
  Selector.handlers.concat =3D function(a, b) {=0A=
    for (var i =3D 0, node; node =3D b[i]; i++)=0A=
      if (node.tagName !=3D=3D "!") a.push(node);=0A=
    return a;=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 (Object.isUndefined(options.hash)) 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 (Object.isUndefined(value)) return element.checked ? =
element.value : null;=0A=
    else element.checked =3D !!value;=0A=
  },=0A=
=0A=
  textarea: function(element, value) {=0A=
    if (Object.isUndefined(value)) return element.value;=0A=
    else element.value =3D value;=0A=
  },=0A=
=0A=
  select: function(element, index) {=0A=
    if (Object.isUndefined(index))=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=
      if (!expression) return element;=0A=
      var elements =3D [element].concat(element.ancestors());=0A=
      return Selector.findElement(elements, expression, 0);=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.extend(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=
// 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=
=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=
=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=
// Autocompleter.Base handles all the autocompletion functionality =0A=
// that's independent of the data source for autocompletion. This=0A=
// includes drawing the autocompletion menu, observing keyboard=0A=
// and mouse events, and similar.=0A=
//=0A=
// Specific autocompleters need to provide, at the very least, =0A=
// a getUpdatedChoices function that will be invoked every time=0A=
// the text inside the monitored textbox changes. This method =0A=
// should get the text for which to provide autocompletion by=0A=
// invoking this.getToken(), NOT by directly accessing=0A=
// this.element.value. This is to allow incremental tokenized=0A=
// autocompletion. Specific auto-completion logic (AJAX, etc)=0A=
// belongs in getUpdatedChoices.=0A=
//=0A=
// Tokenized incremental autocompletion is enabled automatically=0A=
// when an autocompleter is instantiated with the 'tokens' option=0A=
// in the options parameter, e.g.:=0A=
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });=0A=
// will incrementally autocomplete with a comma as the token.=0A=
// Additionally, ',' in the above example can be replaced with=0A=
// a token array, e.g. { tokens: [',', '\n'] } which=0A=
// enables autocompletion on multiple tokens. This is most =0A=
// useful when one of the tokens is \n (a newline), as it =0A=
// allows smart autocompletion after linebreaks.=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=
            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_TAB:=0A=
       case Event.KEY_RETURN:=0A=
         this.selectEntry();=0A=
         Event.stop(event);=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=
         Event.stop(event);=0A=
         return;=0A=
       case Event.KEY_DOWN:=0A=
         this.markNext();=0A=
         this.render();=0A=
         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(true);=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 0;=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><strong>" + elem.substr(0, entry.length) + =
"</strong>" + =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) + =
"<strong>" +=0A=
                  elem.substr(foundPos, entry.length) + "</strong>" + =
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=
=0A=
=0A=
/**
 * reflection.js v1.9
 * http://cow.neondragon.net/stuff/reflection/
 * Freely distributable under MIT-style license.
 */
=20
/* From prototype.js */
if (!document.myGetElementsByClassName) {
	document.myGetElementsByClassName =3D function(className) {
		var children =3D document.getElementsByTagName('*') || document.all;
		var elements =3D new Array();
	 =20
		for (var i =3D 0; i < children.length; i++) {
			var child =3D children[i];
			var classNames =3D child.className.split(' ');
			for (var j =3D 0; j < classNames.length; j++) {
				if (classNames[j] =3D=3D className) {
					elements.push(child);
					break;
				}
			}
		}
		return elements;
	}
}

var Reflection =3D {
	defaultHeight : 0.5,
	defaultOpacity: 0.5,
=09
	add: function(image, options) {
		Reflection.remove(image);
	=09
		doptions =3D { "height" : Reflection.defaultHeight, "opacity" : =
Reflection.defaultOpacity }
		if (options) {
			for (var i in doptions) {
				if (!options[i]) {
					options[i] =3D doptions[i];
				}
			}
		} else {
			options =3D doptions;
		}
=09
		try {
			var d =3D document.createElement('div');
			var p =3D image;
		=09
			var classes =3D p.className.split(' ');
			var newClasses =3D '';
			for (j=3D0;j<classes.length;j++) {
				if (classes[j] !=3D "reflect") {
					if (newClasses) {
						newClasses +=3D ' '
					}
				=09
					newClasses +=3D classes[j];
				}
			}

			var reflectionHeight =3D Math.floor(112*options['height']);
			var divHeight =3D Math.floor(112*(1+options['height']));
		=09
			var reflectionWidth =3D 80;
		=09
			if (document.all && !window.opera) {
				/* Fix hyperlinks */
                if(p.parentElement.tagName =3D=3D 'A') {
	                var d =3D document.createElement('a');
	                d.href =3D p.parentElement.href;
                } =20
                   =20
				/* Copy original image's classes & styles to div */
				d.className =3D newClasses;
				p.className =3D 'reflected';
				p.className =3D 'cover_small';
			=09
				d.style.cssText =3D p.style.cssText;
				p.style.cssText =3D 'vertical-align: bottom';
		=09
				var reflection =3D document.createElement('img');
				reflection.src =3D p.src;
				reflection.style.width =3D reflectionWidth+'px';
				reflection.style.display =3D 'block';
				reflection.style.height =3D p.height+"px";
			=09
				reflection.style.marginBottom =3D =
"-"+(p.height-reflectionHeight)+'px';
				reflection.style.filter =3D 'flipv =
progid:DXImageTransform.Microsoft.Alpha(opacity=3D'+(options['opacity']*1=
00)+', style=3D1, finishOpacity=3D0, startx=3D0, starty=3D0, =
finishx=3D0, finishy=3D'+(options['height']*100)+')';
			=09
				d.style.width =3D reflectionWidth+'px';
				d.style.height =3D divHeight+'px';
				p.parentNode.replaceChild(d, p);
			=09
				d.appendChild(p);
				d.appendChild(reflection);
			} else {
				var canvas =3D document.createElement('canvas');
				if (canvas.getContext) {
					/* Copy original image's classes & styles to div */
					d.className =3D newClasses;
					p.className =3D 'reflected';
					p.className =3D 'cover_small';
				=09
					d.style.cssText =3D p.style.cssText;
					p.style.cssText =3D 'vertical-align: bottom';
		=09
					var context =3D canvas.getContext("2d");
			=09
					canvas.style.height =3D reflectionHeight+'px';
					canvas.style.width =3D reflectionWidth+'px';
					canvas.height =3D reflectionHeight;
					canvas.width =3D reflectionWidth;
				=09
					d.style.width =3D reflectionWidth+'px';
					d.style.height =3D divHeight+'px';
					p.parentNode.replaceChild(d, p);
				=09
					d.appendChild(p);
					d.appendChild(canvas);
				=09
					context.save();
				=09
					context.translate(0,image.height-1);
					context.scale(1,-1);
				=09
					context.drawImage(image, 0, 0, reflectionWidth, image.height);
=09
					context.restore();
				=09
					context.globalCompositeOperation =3D "destination-out";
					var gradient =3D context.createLinearGradient(0, 0, 0, =
reflectionHeight);
				=09
					gradient.addColorStop(1, "rgba(255, 255, 255, 1.0)");
					gradient.addColorStop(0, "rgba(255, 255, 255, =
"+(1-options['opacity'])+")");
	=09
					context.fillStyle =3D gradient;
					if (navigator.appVersion.indexOf('WebKit') !=3D -1) {
						context.fill();
					} else {
						context.fillRect(0, 0, reflectionWidth, reflectionHeight*2);
					}
				}
			}
		} catch (e) {
	    }
	},
=09
	remove : function(image) {
		if (image.className =3D=3D "reflected") {
			image.className =3D image.parentNode.className;
			image.parentNode.parentNode.replaceChild(image, image.parentNode);
		}
	}
}

function addReflections() {
	var rimages =3D document.myGetElementsByClassName('reflect');
	for (i=3D0;i<rimages.length;i++) {
		var rheight =3D null;
		var ropacity =3D null;
	=09
		var classes =3D rimages[i].className.split(' ');
		for (j=3D0;j<classes.length;j++) {
			if (classes[j].indexOf("rheight") =3D=3D 0) {
				var rheight =3D classes[j].substring(7)/100;
			} else if (classes[j].indexOf("ropacity") =3D=3D 0) {
				var ropacity =3D classes[j].substring(8)/100;
			}
		}
	=09
		Reflection.add(rimages[i], { height: rheight, opacity : ropacity});
	}
}

var previousOnload =3D window.onload;
window.onload =3D function () { if(previousOnload) previousOnload(); =
addReflections(); }
=0A=
=0A=
var stScroller =3D Class.create({
	startFrom: 0,
	currPage: null,
	perPage: 6,
	scrollElmPrefix: null,
	totalHits: null,
	previousElm: null,
	nextElm: null,
	initialize: function(idPrefix, total){
	=09
		this.currPage =3D this.startFrom;
		this.totalHits =3D total;
		this.scrollElmPrefix =3D idPrefix;
	=09
	},
	nextPage : function(){
		var currPageElmName =3D this.scrollElmPrefix + this.currPage;
		if((this.currPage + 1)  >=3D (this.totalHits/this.perPage))=20
		{
		  this.currPage =3D this.startFrom;
		}
		else
		{=20
		  this.currPage +=3D 1;=20
		} =20
		var nextPageElmName =3D this.scrollElmPrefix + this.currPage;
		$(currPageElmName).hide();
		new Effect.Appear(nextPageElmName, {duration:0.8});
//		alert(this.currPage);
	=09

	},
	previousPage: function(){
		var currPageElmName =3D this.scrollElmPrefix + this.currPage;
		if(this.currPage =3D=3D this.startFrom)=20
		{
		  this.currPage =3D ((this.totalHits/this.perPage).ceil()) - 1;
		}
		else
		{=20
		  this.currPage -=3D 1;=20
		} =20
		var nextPageElmName =3D this.scrollElmPrefix + this.currPage;
		$(currPageElmName).hide();
		new Effect.Appear(nextPageElmName, {duration:0.8});

	}
});
=0A=
=0A=
// Place your application-specific JavaScript functions and classes here=0A=
// This file is automatically included by javascript_include_tag =
:defaults
Form.Methods.Extended =3D {
  addInputsFrom: function(form, items){
    try{
      if(items.size() > 0){
        form =3D $(form);
        items.each(function(item){
          var m =3D document.createElement('input');=20
          m.setAttribute('type', 'hidden');=20
          m.setAttribute('name', item.name);
          m.setAttribute('value', item.value);=20
          form.appendChild(m);
        });
        return true;
      }
      else
      {
        return false;
      }
    }catch (e){
      return false;
    }
  }
};
Object.extend(Form, Form.Methods.Extended);
------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://service.avail.net/2009-02-13/dynamic/8556be20-24f0-11de-b175-002215995ebc/emark.js

var AI_NEW_SESSION_ID =3D "9339dd5c-e1af-11de-b098-12313c00f244";=0A=
var AI_CUSTOMER_ID =3D "8556be20-24f0-11de-b175-002215995ebc"; =0A=
var AI_TOP_DOMAIN =3D document.domain; =0A=
=0A=
=0A=
/*=0A=
*	Global STATIC Parameters, dynamic ones above=0A=
*/=0A=
var AI_SERVICE_PROTOCOL =3D ai_getProtocol();=0A=
var AI_SERVICE_HOST =3D "service.avail.net";=0A=
var AI_SERVICE_PATH =3D "/2009-02-13/dynamic/";=0A=
var AI_COOKIE_NAME =3D "__avail_session__";=0A=
var AI_DEBUG =3D false;=0A=
var AI_TESTING =3D false;=0A=
=0A=
/**=0A=
*	This is the return type of all calls to functions in the Emark class. =
The dynamic script will populate the=0A=
*	member {@link #values} with the result from the dynamic script.=0A=
*	@constructor=0A=
*/=0A=
function ResponseObj(){=0A=
=0A=
	/**=0A=
	* Holds the result from function calls. Values can be of the type one =
or two dimensional Array.=0A=
	*/=0A=
	this.values =3D new Array('');=0A=
=0A=
	/** @private */=0A=
	this.valueOf =3D this.toSource =3D this.toString =3D function(){ return =
this.values.toString();}=0A=
	/** @private */=0A=
	this.update =3D function(v) { this.values =3D v;}=0A=
}=0A=
=0A=
/*=0A=
*	Call Object=0A=
*	Each call to an Emark function creates a Call Object that is placed on =
the call stack=0A=
*/=0A=
function CallObj(method, args){=0A=
	this._method =3D ai_jesc(method);=0A=
	this._args =3D args;=0A=
=0A=
	// Return a list: [methodname , {arg1 : val1, arg2 : val2, ... }]=0A=
	this.toQString =3D function(){=0A=
		var ret =3D new Array();=0A=
		ret[0] =3D this._method;=0A=
		ret[1] =3D this._args;=0A=
=0A=
		return '[' + ret.toString() + ']';=0A=
	}=0A=
=0A=
	this.toString =3D this.toQString;=0A=
}=0A=
=0A=
=0A=
/*=0A=
	_AI_* -classes below provides JSON compatible toString() -methods=0A=
*/=0A=
function _AI_String(str){=0A=
	this.str =3D str;=0A=
=0A=
	this.toString =3D function(){=0A=
		//return '"' + this.str + '"';=0A=
		return this.str;=0A=
	}=0A=
}=0A=
=0A=
function _AI_Array(arr){=0A=
	this.arr =3D arr;=0A=
=0A=
	this.toString =3D function(){=0A=
		if(this.arr.length =3D=3D 0){=0A=
			return "[]";=0A=
		}=0A=
		var ret =3D '[';=0A=
		ret +=3D this.arr[0];=0A=
		for (var i =3D 1; i < this.arr.length; i++){=0A=
			ret +=3D ',' + this.arr[i];=0A=
		}=0A=
		return ret + ']';=0A=
	}=0A=
}=0A=
function _AI_Dic(dic){=0A=
	this.dic =3D dic;=0A=
=0A=
	this.toString =3D function(){=0A=
		var ret =3D new Array();=0A=
		for(e in dic){=0A=
			ret.push('"' + e + '":' + dic[e]);=0A=
		}=0A=
		return '{' + ret + '}';=0A=
	}=0A=
}=0A=
=0A=
/**=0A=
*	Main object that has all public methods.=0A=
*=0A=
*	@param {boolean} debug (Optional) Set to true to enable debug logging. =
Should only be used for development.=0A=
*	@constructor=0A=
*/=0A=
function Emark(debug){=0A=
	if(ai_typeOf(debug) =3D=3D 'boolean'){=0A=
		AI_DEBUG =3D debug;=0A=
	}=0A=
=0A=
	/** @private */=0A=
	this._res_arr =3D new Array(1);=0A=
	/** @private */=0A=
	this._call_arr =3D new Array(1);=0A=
	/** @private */=0A=
	this._nr_calls =3D 0;=0A=
	/** @private */=0A=
	this._customer_callback =3D null;=0A=
=0A=
=0A=
	if(AI_DEBUG){=0A=
		window.onerror =3Dfunction(msg, url, linenumber){=0A=
					ai_log('Error message: '+msg+'\nURL: '+url+'\nLine Number: =
'+linenumber)=0A=
					return true;=0A=
				}=0A=
	}=0A=
=0A=
	//------------ Public methods ----------------=0A=
	/**=0A=
	* Return predictions for one or more products using a given template.=0A=
	* @param {Array} ProductIDs Array of product ids. Must not be empty. =
Each product id must be an alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {String} TemplateName Which template to use for predictions. =
Must not be empty. Alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {Array} DynamicParameters (Optional) Specify modification =
parameters to use with the specified template. Default empty. See <a =
href=3D"Datatypes.html#DynPara">Data types</a> for details.=0A=
	* @param {Array} ColumnNames (Optional) Which columns to return. If not =
specified then product id column is returned. Contains alphanumeric =
strings, see <a href=3D"Datatypes.html#AlphNumString">Data types</a> for =
details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* When requesting only a single column, e.g product identifiers =
(ProductIDs), values is a single dimensional array (myReturn.values[i]).=0A=
	* When requesting recommendations with meta data - for example price, =
image url and so on - values is a two dimensional array =
(myReturn.values[i][j]).=0A=
	*/=0A=
	this.getProductsPredictions =3D function (ProductIDs, TemplateName, =
DynamicParameters, ColumnNames ) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Products", =
ProductIDs) ||=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Template", =
TemplateName) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
=0A=
						ColumnNames =3D this._checkAndAddDefaultColumnName(ColumnNames);=0A=
=0A=
						return this._addToStack(	"getProductsPredictions",=0A=
										new _AI_Dic({=0A=
										"Products" : new _AI_Array(ai_jesc_array(ProductIDs)),=0A=
										"Template" : new _AI_String(ai_jesc(TemplateName)),=0A=
										"ColumnNames" : new _AI_Array(ai_jesc_array(ColumnNames)),=0A=
										"DynamicParameters" : new =
_AI_Array(ai_jesc_array(DynamicParameters))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Return predictions for a user with a given template.=0A=
	* @param {String} UserID Must not be empty. Alpha-numeric string, see =
<a href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {String} TemplateName Which template to use for predictions. =
Must not be empty. Also an alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {Array} DynamicParameters (Optional) Specify modification =
parameters to use with the specified template. Default empty. See <a =
href=3D"Datatypes.html#DynPara">Data types</a> for details.=0A=
	* @param {Array} ColumnNames (Optional) Which columns to return. If not =
specified then product id column is returned. Contains alphanumeric =
strings, see <a href=3D"Datatypes.html#AlphNumString">Data types</a> for =
details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* When requesting only a single column, e.g product identifiers =
(ProductIDs), values is a single dimensional array (myReturn.values[i]).=0A=
	* When requesting recommendations with meta data - for example price, =
image url and so on - values is a two dimensional array =
(myReturn.values[i][j]).=0A=
	*/=0A=
	this.getUserPredictions =3D function (UserID, TemplateName,  =
DynamicParameters, ColumnNames) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyString("User", UserID) ||=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Template", =
TemplateName) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
=0A=
						ColumnNames =3D this._checkAndAddDefaultColumnName(ColumnNames);=0A=
=0A=
						return this._addToStack(	"getUserPredictions",=0A=
										new _AI_Dic({=0A=
										"User" : new _AI_String(ai_jesc(UserID)),=0A=
										"Template" : new _AI_String(ai_jesc(TemplateName)),=0A=
										"ColumnNames" : new _AI_Array(ai_jesc_array(ColumnNames)),=0A=
										"DynamicParameters" : new =
_AI_Array(ai_jesc_array(DynamicParameters))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Return predictions for a search phrase with a given template.=0A=
	* @param {String} SearchPhrase Must not be empty.=0A=
	* @param {String} TemplateName Which template to use for predictions. =
Must not be empty. Alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {Array} DynamicParameters (Optional) Specify modification =
parameters to use with the specified template. Default empty. See <a =
href=3D"Datatypes.html#DynPara">Data types</a> for details.=0A=
	* @param {Array} ColumnNames (Optional) Which columns to return. If not =
specified then product id column is returned. Contains alphanumeric =
strings, see <a href=3D"Datatypes.html#AlphNumString">Data types</a> for =
details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* When requesting only a single column, e.g product identifiers =
(ProductIDs), values is a single dimensional array (myReturn.values[i]).=0A=
	* When requesting recommendations with meta data - for example price, =
image url and so on - values is a two dimensional array =
(myReturn.values[i][j]).=0A=
	*/=0A=
	this.getSearchPredictions =3D function (SearchPhrase, TemplateName, =
DynamicParameters, ColumnNames) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyString("Phrase", SearchPhrase) ||=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Template", =
TemplateName) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
=0A=
						ColumnNames =3D this._checkAndAddDefaultColumnName(ColumnNames);=0A=
=0A=
						return this._addToStack(	"getSearchPredictions",=0A=
										new _AI_Dic({=0A=
										"Phrase" : new _AI_String(ai_jesc(SearchPhrase)),=0A=
										"Template" : new _AI_String(ai_jesc(TemplateName)),=0A=
										"ColumnNames" : new _AI_Array(ai_jesc_array(ColumnNames)),=0A=
										"DynamicParameters" : new =
_AI_Array(ai_jesc_array(DynamicParameters))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Return predictions for a search phrase (used on an external web =
search engine) with a given template.=0A=
	* @param {String} SearchPhrase Must not be empty.=0A=
	* @param {String} TemplateName Which template to use for predictions. =
Must not be empty. Alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {Array} DynamicParameters (Optional) Specify modification =
parameters to use with the specified template. Default empty. See <a =
href=3D"Datatypes.html#DynPara">Data types</a> for details.=0A=
	* @param {Array} ColumnNames (Optional) Which columns to return. If not =
specified then product id column is returned. Contains alphanumeric =
strings, see <a href=3D"Datatypes.html#AlphNumString">Data types</a> for =
details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* When requesting only a single column, e.g product identifiers =
(ProductIDs), values is a single dimensional array (myReturn.values[i]).=0A=
	* When requesting recommendations with meta data - for example price, =
image url and so on - values is a two dimensional array =
(myReturn.values[i][j]).=0A=
	*/=0A=
	this.getLandingPagePredictions =3D function (SearchPhrase, =
TemplateName, DynamicParameters, ColumnNames) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyString("Phrase", SearchPhrase) ||=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Template", =
TemplateName) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
=0A=
						ColumnNames =3D this._checkAndAddDefaultColumnName(ColumnNames);=0A=
=0A=
						return this._addToStack(	"getLandingPagePredictions",=0A=
										new _AI_Dic({=0A=
										"Phrase" : new _AI_String(ai_jesc(SearchPhrase)),=0A=
										"Template" : new _AI_String(ai_jesc(TemplateName)),=0A=
										"ColumnNames" : new _AI_Array(ai_jesc_array(ColumnNames)),=0A=
										"DynamicParameters" : new =
_AI_Array(ai_jesc_array(DynamicParameters))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Log a purchase to the server.=0A=
	* @param {String} UserID Unique identifier for this user. This must =
match the user string sent to {@link #getUserPredictions}. Alphanumeric =
string, see <a href=3D"Datatypes.html#AlphNumString">Data types</a> for =
details.=0A=
	* @param {Array} ProductIDs Array of product ids that is purchased. =
Must not be empty. Alphanumeric strings, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @param {Array} Prices Array of prices that is purchased. Dot denotes =
decimal. Must be in the same order as the products. Must not be empty. =
Do not include taxes, shipment and handling or other charges outside the =
actual product price. All prices submitted must be in the same currency.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* Values will contain a status message of the operation as a string.=0A=
	*/=0A=
	this.logPurchase =3D function (UserID, ProductIDs, Prices) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Products", =
ProductIDs) ||=0A=
							!this._validateNonNullAndNonEmptyStringOrArray("Prices", Prices) =
||=0A=
							!this._validateNonNullAndNonEmptyString("User", UserID) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
=0A=
						return this._addToStack(	"logPurchase",=0A=
										new _AI_Dic({=0A=
										"User" : new _AI_String(ai_jesc(UserID)),=0A=
										"Products" : new _AI_Array(ai_jesc_array(ProductIDs)),=0A=
										"Prices" : new _AI_Array(ai_jesc_array(Prices))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Save a search to the server. Predictions for searches are based on =
these.=0A=
	* @param {String} SearchPhrase The complete search phrase that the user =
entered into the search field. Must not be empty.=0A=
	* @param {String} ProductID What product the user eventually bought. =
Must not be empty. Alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* Values will contain a status message of the operation as a string.=0A=
	*/=0A=
	this.saveSearch =3D function (SearchPhrase, ProductID) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyString("Phrase", SearchPhrase) ||=0A=
							!this._validateNonNullAndNonEmptyString("Product", ProductID) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
						return this._addToStack(	"saveSearch",=0A=
										new _AI_Dic({=0A=
										"Phrase" : new _AI_String(ai_jesc(SearchPhrase)),=0A=
										"Product" : new _AI_String(ai_jesc(ProductID))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Save a landing page phrase. Predictions for landing pages are based =
on these.=0A=
	* @param {String} SearchPhrase The complete search phrase that the user =
entered into the search field. Must not be empty.=0A=
	* @param {String} ProductID What product the user eventually bought. =
Must not be empty. Alphanumeric string, see <a =
href=3D"Datatypes.html#AlphNumString">Data types</a> for details.=0A=
	* @return Object - After {@link #commit} has been called, the returned =
object will have a member variable 'values'.=0A=
	* Values will contain a status message of the operation as a string.=0A=
	*/=0A=
	this.saveLandingPageData =3D function (SearchPhrase, ProductID) {=0A=
						if(=0A=
							!this._validateNonNullAndNonEmptyString("Phrase", SearchPhrase) ||=0A=
							!this._validateNonNullAndNonEmptyString("Product", ProductID) ){=0A=
								return new Array(new Array(''));=0A=
						}=0A=
						return this._addToStack(	"saveLandingPageData",=0A=
										new _AI_Dic({=0A=
										"Phrase" : new _AI_String(ai_jesc(SearchPhrase)),=0A=
										"Product" : new _AI_String(ai_jesc(ProductID))=0A=
										})=0A=
										); };=0A=
	/**=0A=
	* Commit a single or a set of calls to the other methods. Note that =
there can only be call to this method per page.=0A=
	* @param {Function} CustomerCallback Method to invoke once the =
predictions are loaded from the server.=0A=
	* @return void=0A=
	*/=0A=
	this.commit =3D function(CustomerCallback){=0A=
=0A=
		var type =3D ai_typeOf(CustomerCallback);=0A=
		if(type !=3D 'undefined' && type !=3D 'function'){=0A=
			ai_log("Input argument 'Callback' for method 'commit' must be a =
function.");=0A=
			return;=0A=
		}=0A=
=0A=
		var url =3D this._generateCallString();=0A=
		if(!url){=0A=
			return;=0A=
		}=0A=
=0A=
		if(AI_DEBUG){=0A=
			var msg =3D "It seems that the script did not load correctly. Check =
\'Fetch URL\' in Debug Log for details. Copy the \'Fetch URL\' into a =
browser to see Server Error Response.";=0A=
			setTimeout('if(window.__avail_ret =3D=3D=3D undefined){ =
ai_log("'+msg+'"); }', 1500);=0A=
		}=0A=
=0A=
		ai_log("Fetch URL: " + url);=0A=
=0A=
		if(type =3D=3D 'function'){=0A=
			// bind customer_callback to emark object to get a hold of the =
callback later=0A=
			this.customer_callback =3D CustomerCallback;=0A=
		} else {=0A=
			this.customer_callback =3D function(){ /* Do nothing */ };=0A=
		}=0A=
=0A=
		var scr =3D document.createElement('script');=0A=
=0A=
		ai_f =3D ai_callback(this._populateResultArray, {bind:this});=0A=
=0A=
		// If IE ...=0A=
		scr.onreadystatechange =3D function(){=0A=
		    if(this.readyState =3D=3D "loaded" || this.readyState =3D=3D =
"complete"){=0A=
			ai_f();=0A=
		    }=0A=
		}=0A=
=0A=
		// Everybody else ...=0A=
		scr.onload =3D ai_f;=0A=
=0A=
		scr.id=3D"avail_dynamic_code";=0A=
		scr.src=3Durl;=0A=
		scr.charset =3D "UTF-8";=0A=
=0A=
		document.getElementsByTagName('head')[0].appendChild(scr);=0A=
	}=0A=
=0A=
	//------- Private methods -----------=0A=
	/** @private */=0A=
	this.echo =3D function (Phrase) {=0A=
		if( !this._validateNonNullAndNonEmptyString("Phrase", SearchPhrase) ){=0A=
				return new Array(new Array(''));=0A=
		}=0A=
=0A=
		return this._addToStack( "echo", new _AI_Dic({ "Phrase" : new =
_AI_String(ai_jesc(SearchPhrase)) }));=0A=
	};=0A=
=0A=
=0A=
	/** @private */=0A=
	this._validateNonNullAndNonEmptyStringOrArray =3D function (_name, =
_val){=0A=
		if(ai_typeOf(_val) !=3D 'string' && ai_typeOf(_val) !=3D 'array'){=0A=
			ai_log("Variable '" + _name + "' must be string or array, was: " + =
_val);=0A=
			return false;=0A=
		}=0A=
		if(_val.length =3D=3D 0){=0A=
			ai_log("Variable '" + _name + "' must have length > 0");=0A=
			return false;=0A=
		}=0A=
=0A=
		return true;=0A=
	}=0A=
	/** @private */=0A=
	this._validateNonNullAndNonEmptyString =3D function (_name, _val){=0A=
		if(ai_typeOf(_val) !=3D 'string'){=0A=
			ai_log("Variable '" + _name + "' must be string, was: " + =
ai_typeOf(_val));=0A=
			return false;=0A=
		}=0A=
		if(_val.length =3D=3D 0){=0A=
			ai_log("Variable '" + _name + "' must have length > 0");=0A=
			return false;=0A=
		}=0A=
=0A=
		return true;=0A=
	}=0A=
=0A=
	/** @private */=0A=
	this._checkAndAddDefaultColumnName =3D function (_val){=0A=
		/*=0A=
		* - Check type.=0A=
		* - Return val=0A=
		*/=0A=
		var col_name =3D 'ProductId';=0A=
		var type =3D ai_typeOf(_val);=0A=
=0A=
		if(type =3D=3D 'string' || type =3D=3D 'array'){=0A=
			if(_val.toString().replace(/[\s|,]/g,"").length =3D=3D 0){=0A=
				return new Array(col_name);=0A=
			} else {=0A=
				return _val;=0A=
			}=0A=
		} else {=0A=
			return new Array(col_name);=0A=
		}=0A=
	}=0A=
=0A=
	/**=0A=
	* Add results from dynamic script to user defined variables=0A=
	* @private */=0A=
	this._populateResultArray =3D function() {=0A=
		var index =3D 0;=0A=
=0A=
		for (var i in __avail_ret) {=0A=
=0A=
			this._res_arr[index].update(__avail_ret["ret" + index]);=0A=
			index++;=0A=
		}=0A=
=0A=
		this.customer_callback();=0A=
=0A=
		this._nr_calls =3D 0;=0A=
		this._call_arr =3D new Array(1);=0A=
		this._res_arr =3D new Array(1);=0A=
=0A=
	}=0A=
=0A=
	/**=0A=
	* Add a function call to the call stack.=0A=
	* All calls in stack are concatenated into a JSON-compatible query =
string (call string)=0A=
	* @private */=0A=
	this._addToStack =3D function ( _method, args) {=0A=
		this._call_arr[this._nr_calls] =3D new CallObj(_method, args);=0A=
		this._res_arr[this._nr_calls] =3D new ResponseObj();=0A=
=0A=
		return this._res_arr[this._nr_calls++];=0A=
	}=0A=
=0A=
	/**=0A=
	* Create URL and then iterate call stack and create querystring for url.=0A=
	* @private */=0A=
	this._generateCallString =3D function (){=0A=
		try{=0A=
			var last_index =3D (this._nr_calls - 1);=0A=
			if(last_index =3D=3D -1){=0A=
				return null;=0A=
			}=0A=
=0A=
			var url =3D ai_getStaticURL();=0A=
			var session =3D ai_getSessionID();=0A=
=0A=
			url +=3D "&s=3D" + session;=0A=
=0A=
			url +=3D "&q=3D{";=0A=
			for(var i =3D 0; i < last_index; i++){=0A=
				url +=3D '"ret' + i + '":' + this._call_arr[i].toQString() + ",";=0A=
			}=0A=
			url +=3D '"ret' + last_index + '":' + =
this._call_arr[last_index].toQString() + "}";=0A=
			return url;=0A=
		} catch (e){=0A=
			alert(e);=0A=
		}=0A=
	}=0A=
=0A=
}=0A=
=0A=
=0A=
/**********************************************************=0A=
*	Utility functions=0A=
**********************************************************/=0A=
function ai_getStaticURL() {=0A=
=0A=
	if(AI_TESTING){=0A=
	    AI_SERVICE_HOST =3D "service.labs.avail.net"=0A=
	}=0A=
=0A=
	return ( AI_SERVICE_PROTOCOL + AI_SERVICE_HOST + AI_SERVICE_PATH + =
AI_CUSTOMER_ID + "/scr?r=3Djs");=0A=
}=0A=
=0A=
=0A=
/*=0A=
	JSON Escape a String=0A=
*/=0A=
function ai_jesc(string) {=0A=
	var type =3D ai_typeOf(string);=0A=
	if(type =3D=3D 'null' || type =3D=3D 'undefined'){=0A=
		return "";=0A=
	} else if(type !=3D 'string'){=0A=
		ai_log("Type unknown for jesc() (JSON Escape) : " + ai_typeOf(type));=0A=
	}=0A=
=0A=
	var escapable =3D =
/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200=
f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,=0A=
	ai_meta =3D {    // table of character substitutions=0A=
		'\b': '\\b',=0A=
		'\t': '\\t',=0A=
		'\n': '\\n',=0A=
		'\f': '\\f',=0A=
		'\r': '\\r',=0A=
		'"' : '\\"',=0A=
		'\\': '\\\\'=0A=
	}=0A=
=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 =
escape=0A=
	// sequences.=0A=
=0A=
	escapable.lastIndex =3D 0;=0A=
	return escapable.test(string) ?=0A=
		'"' + string.replace(escapable, function (a) {=0A=
			var c =3D ai_meta[a];=0A=
			return typeof c =3D=3D=3D 'string' ? c :=0A=
				'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);=0A=
		}) + '"' :=0A=
		'"' + string + '"';=0A=
}=0A=
=0A=
/*=0A=
	JSON Escape an Array.=0A=
	Also! Type check. If not array, then check if String and return array.=0A=
*/=0A=
function ai_jesc_array(arr) {=0A=
	var type =3D ai_typeOf(arr);=0A=
	if(type =3D=3D 'array'){=0A=
		var ret =3D new Array(arr.length);=0A=
		for(var i =3D 0; i < arr.length; i++) {=0A=
			ret[i] =3D ai_jesc(arr[i]);=0A=
		}=0A=
		return ret;=0A=
	} else if(type =3D=3D 'string'){=0A=
		return new Array(ai_jesc(arr));=0A=
	} else if(type =3D=3D 'null' || type =3D=3D 'undefined'){=0A=
		return new Array();=0A=
	} else {=0A=
		ai_log("Type unknown for jesc_array() (JSON Escape Array) : " + type);=0A=
	}=0A=
}=0A=
=0A=
/*=0A=
	Custom type check function since javascript 'typeof' does not handle =
'null' and 'Array' properly=0A=
*/=0A=
function ai_typeOf(obj) {=0A=
	var type =3D typeof(obj)=0A=
=0A=
	if ( type =3D=3D 'object' ) {=0A=
		if(!obj){=0A=
			return 'null';=0A=
		}=0A=
		if (typeof(obj.length) =3D=3D 'number'){=0A=
			return 'array';=0A=
		} else {=0A=
			return type;=0A=
		}=0A=
	} else {=0A=
		return type;=0A=
	}=0A=
}=0A=
=0A=
/**=0A=
 * From =
http://onemarco.com/2008/11/12/callbacks-and-binding-and-callback-argumen=
ts-and-references/=0A=
 *=0A=
 * @param {Function} func the callback function=0A=
 * @param {Object} opts an object literal with the following=0A=
 * properties (all optional):=0A=
 * bind: the object to bind the function to (what the "this" keyword =
will refer to)=0A=
 * args: an array of arguments to pass to the function when it is =
called, these will be=0A=
 * appended after any arguments passed by the caller=0A=
 * suppressArgs: boolean, whether to supress the arguments passed=0A=
 * by the caller.  This default is false.=0A=
 */=0A=
function ai_callback(func,opts) {=0A=
	var cb =3D function() {=0A=
		var args =3D opts.args ? opts.args : [];=0A=
		var bind =3D opts.bind ? opts.bind : this;=0A=
		var fargs =3D opts.suppressArgs =3D=3D=3D true ?=0A=
			[] : ai_toArray(arguments);=0A=
		func.apply(bind,fargs.concat(args));=0A=
	}=0A=
	return cb;=0A=
}=0A=
=0A=
/* A utility function for _ai_callback() */=0A=
function ai_toArray(arrayLike) {=0A=
	var arr =3D [];=0A=
	for(var i =3D 0; i < arrayLike.length; i++){=0A=
		arr.push(arrayLike[i]);=0A=
	}=0A=
	return arr;=0A=
}=0A=
=0A=
/*=0A=
	Get stored sessionid from cookie, or create a new one and store it.=0A=
*/=0A=
function ai_getSessionID(){=0A=
=0A=
	var cookie =3D null;=0A=
=0A=
	// If there is a previously stored cookie, then parse it out=0A=
	if (document.cookie.length > 0) {=0A=
		var start =3D document.cookie.indexOf(AI_COOKIE_NAME + "=3D");=0A=
		if (start !=3D -1) {=0A=
			start +=3D AI_COOKIE_NAME.length + 1;=0A=
			var end =3D document.cookie.indexOf(";",start);=0A=
			if (end =3D=3D -1){=0A=
				end =3D document.cookie.length;=0A=
			}=0A=
			cookie =3D unescape(document.cookie.substring(start,end));=0A=
		}=0A=
  	}=0A=
=0A=
	// Store session_id, if there is none stored=0A=
	if(!cookie){=0A=
		cookie =3D AI_NEW_SESSION_ID;=0A=
		var exdate =3D new Date();=0A=
		exdate.setDate( exdate.getDate() + 1 );=0A=
=0A=
		// Remove the www-part=0A=
		if(AI_TOP_DOMAIN.indexOf("www.") =3D=3D 0){=0A=
			AI_TOP_DOMAIN =3D AI_TOP_DOMAIN.substring(3)=0A=
		}=0A=
=0A=
		document.cookie =3D AI_COOKIE_NAME + "=3D" + escape(cookie) + ( "; =
expires=3D" + exdate.toGMTString() ) + ("; domain=3D" + AI_TOP_DOMAIN) + =
("; path=3D/");=0A=
=0A=
		// Also, store cookie on server=0A=
		var url =3D ai_getStaticURL();=0A=
		url +=3D "&s=3D" + cookie;=0A=
		url +=3D "&q=3D{\"ret0\":[\"registerSession\",{}]}";=0A=
=0A=
		var img =3D new Image();=0A=
		img.src =3D url;=0A=
=0A=
	}=0A=
=0A=
	return cookie;=0A=
}=0A=
=0A=
function ai_getProtocol(){=0A=
	var proto =3D "";=0A=
=0A=
	try{=0A=
		proto =3D parent.location.protocol + "//";=0A=
	} catch (e){=0A=
		ai_log("Could not use parent.location.protocol")=0A=
		proto =3D "";=0A=
	}=0A=
=0A=
	if(proto =3D=3D ""){=0A=
		try{=0A=
			proto =3D window.location.protocol + "//";=0A=
		} catch (e){=0A=
			ai_log("Could not use window.location.protocol")=0A=
			proto =3D "";=0A=
		}=0A=
	}=0A=
=0A=
	if(proto =3D=3D "file://" || proto =3D=3D ""){=0A=
		ai_log("Using fallback protocol http")=0A=
		proto =3D "http://";=0A=
	}=0A=
=0A=
	return proto;=0A=
}=0A=
=0A=
function ai_log(msg) {=0A=
	if(AI_DEBUG){=0A=
		var elem_id =3D '__avail_log__';=0A=
=0A=
		var elem =3D document.getElementById(elem_id);=0A=
=0A=
		if(elem){=0A=
			elem.innerHTML +=3D "<br>" + msg + "<br>";=0A=
		} else {=0A=
			var m =3D "--- Could not get eMark Log output element ---\nPlease =
create a 'DIV' element with id=3D'" + elem_id + "' somewhere on the page =
to enable log output.\n\n";=0A=
			m +=3D "Also, make sure that the BODY is loaded before calls to eMark =
script, while in debug mode. \n";=0A=
			m +=3D "Else the script can not get hold of the DIV log tag.\n\n";=0A=
			m +=3D "Log message:\n" + msg;=0A=
			alert(m);=0A=
			return;=0A=
		}=0A=
	}=0A=
}=0A=
=0A=
// This will run when script is loaded ...=0A=
ai_getSessionID();=0A=

------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.deastore.com/javascripts/avail_util.js?1245756022

//~ REQUIRES PROTOTYPE

//~ usage:
    //~ predictor =3D new DeastorePredictor();
    //~ predictor.updateWithPredictions('user', =
'/predictions/products/detail.html', 'userRecsDisplay', '62200');=20
    //~ predictor.updateWithPredictions('product', =
'/predictions/products/detail.html', 'prodRecsDisplay', '98950');
    //~ predictor.updateWithPredictions('search', =
'/predictions/products/detail.html', 'searchRecsDisplay', 'einaudi');
    //~ predictor.logPurchase('62200', new Array('98950', '9850', =
'5950', '50'), new Array('10.5', '11.0', '154.95', '12.0'));
    //~ ...several actions and finally commit
    //~ predictor.commit();
   =20
    //~ methods:
      //~ updateWithPredictions    ** dynamically update html container =
with avail recommendations **
          //~ params:
              //~  prediction type  /user|product|search/
              //~ url from wich ajax update retrieves content
              //~ html container for content update
              //~ object id required for prediction type: =
/accountid|productid/
      //~ logPurchase         **  log user purchase **
          //~ params:
              //~ account id
              //~ product id array=20
              //~ prices array

var DeastorePredictor =3D Class.create({
  emark: null,
  templateName: 'ProdPageRelated',
  resultLog: '',
  initialize: function(){
    this.emark =3D new Emark();
    this.onCommit =3D $A();
    this.resultLog =3D "";
	},
  updateWithPredictions: function(type, deastore_predictions_url, =
html_container, obj_id, avail_template){
    var response =3D null;
    var template =3D (avail_template || this.templateName);
    if(type =3D=3D 'product'){
      response =3D this.emark.getProductsPredictions(obj_id, template);
    }else if(type =3D=3D 'user'){
      response =3D this.emark.getUserPredictions(obj_id, template);
    }else if(type =3D=3D 'search'){
      response =3D this.emark.getSearchPredictions(obj_id, template);
    }
    this.onCommit.push( (function(){=20
          this.debugResult("updateWithPredictions called for template: " =
+ template);=20
          this.updateContent(html_container, response, =
deastore_predictions_url);
      }).bind(this) );
  },
  productPredictions: function(obj_id, avail_template){
    var template =3D (avail_template || this.templateName);
    var response =3D this.emark.getProductsPredictions(obj_id, template, =
null, ['ActionId']);
    this.onCommit.push( (function(){ return response; }).bind(this) );
  },
  updateContent: function(obj_id, avail_response, =
deastore_predictions_url){
    if(avail_response){
      ids =3D $A(avail_response.values).flatten();
      pars =3D $H({'id[]': ids}).toQueryString();
      new Ajax.Updater(obj_id, deastore_predictions_url, {asynchronous: =
true, evalScripts: true, method: 'get', parameters: pars});
      this.debugResult("updateContent with predictions ids: " + =
ids.inspect());=20
    }
  },
  logPurchase: function(user_id, product_ids, prices)
  {
    var response =3D this.emark.logPurchase(user_id, product_ids, =
prices);
    this.onCommit.push( (function(){=20
      this.debugResult("log purchase for user_id " + user_id + " product =
ids: " + product_ids.inspect() + " response: "+ response);=20
    }).bind(this) );
  },
  logSearch: function(keyword, purchased_product_id)
  {
    var response =3D this.emark.saveSearch(keyword, =
purchased_product_id);
    this.onCommit.push( (function(){=20
      this.debugResult("log Search for keyword " + keyword + " product =
id: " + purchased_product_id + " response: "+ response);=20
    }).bind(this) );
  },
  commit: function(){
    var callbacks =3D this.onCommit;
    this.emark.commit(function(){=20
      callbacks.each(function(callback){=20
        if (Object.isFunction(callback)){ callback.apply(); }=20
      });
    });
  },
  debugResult: function(message){
      this.resultLog +=3D "\n " + message;
  },
  getEventsLog: function(){
    return this.resultLog;
  }
});




------=_NextPart_000_00BC_01CA75C6.4B59EF40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://books.google.com/books/previewlib.js

(function(){var GBS_HOST =3D "http://books.google.com/";var GBS_LANG =3D =
"en";var =
g=3Dtrue,j=3Dnull,k=3Dfalse,l,o=3Dthis,r=3Dfunction(a,b,c){a=3Da.split(".=
");c=3Dc||o;!(a[0]in c)&&c.execScript&&c.execScript("var "+a[0]);for(var =
d;a.length&&(d=3Da.shift());)if(!a.length&&b!=3D=3Dundefined)c[d]=3Db;els=
e =
c=3Dc[d]?c[d]:(c[d]=3D{})},aa=3Dfunction(a,b){a=3Da.split(".");b=3Db||o;f=
or(var c;c=3Da.shift();)if(b[c])b=3Db[c];else return j;return =
b},s=3Dfunction(){},t=3Dfunction(a){var b=3Dtypeof =
a;if(b=3D=3D"object")if(a){if(a instanceof Array||!(a instanceof =
Object)&&Object.prototype.toString.call(a)=3D=3D"[object Array]"||typeof =
a.length=3D=3D=0A=
"number"&&typeof a.splice!=3D"undefined"&&typeof =
a.propertyIsEnumerable!=3D"undefined"&&!a.propertyIsEnumerable("splice"))=
return"array";if(!(a instanceof =
Object)&&(Object.prototype.toString.call(a)=3D=3D"[object =
Function]"||typeof a.call!=3D"undefined"&&typeof =
a.propertyIsEnumerable!=3D"undefined"&&!a.propertyIsEnumerable("call")))r=
eturn"function"}else return"null";else if(b=3D=3D"function"&&typeof =
a.call=3D=3D"undefined")return"object";return b},u=3Dfunction(a){return =
t(a)=3D=3D"array"},w=3Dfunction(a){var b=3Dt(a);return b=3D=3D=0A=
"array"||b=3D=3D"object"&&typeof =
a.length=3D=3D"number"},x=3Dfunction(a){return typeof =
a=3D=3D"string"},ba=3Dfunction(a){return =
t(a)=3D=3D"function"},ca=3Dfunction(a){a=3Dt(a);return =
a=3D=3D"object"||a=3D=3D"array"||a=3D=3D"function"},z=3Dfunction(a){if(a.=
hasOwnProperty&&a.hasOwnProperty(y))return =
a[y];a[y]||(a[y]=3D++da);return =
a[y]},y=3D"closure_hashCode_"+Math.floor(Math.random()*2147483648).toStri=
ng(36),da=3D0,ea=3Dfunction(a){var =
b=3Dt(a);if(b=3D=3D"object"||b=3D=3D"array"){if(a.g)return =
a.g.call(a);b=3Db=3D=3D"array"?[]:{};for(var c in a)b[c]=3Dea(a[c]);=0A=
return b}return a},fa=3Dfunction(a,b){var =
c=3Db||o;if(arguments.length>2){var =
d=3DArray.prototype.slice.call(arguments,2);return function(){var =
e=3DArray.prototype.slice.call(arguments);Array.prototype.unshift.apply(e=
,d);return a.apply(c,e)}}else return function(){return =
a.apply(c,arguments)}},ga=3Dfunction(a){var =
b=3DArray.prototype.slice.call(arguments,1);return function(){var =
c=3DArray.prototype.slice.call(arguments);c.unshift.apply(c,b);return =
a.apply(this,c)}},ha=3DDate.now||function(){return+new =
Date},A=3Dfunction(a,=0A=
b){function =
c(){}c.prototype=3Db.prototype;a.ba=3Db.prototype;a.prototype=3Dnew =
c};var ia=3Dfunction(a,b,c){if(a.forEach)a.forEach(b,c);else =
if(Array.forEach)Array.forEach(a,b,c);else for(var =
d=3Da.length,e=3Dx(a)?a.split(""):a,f=3D0;f<d;f++)f in =
e&&b.call(c,e[f],f,a)},ja=3Dfunction(a){if(u(a))return =
a.concat();else{for(var =
b=3D[],c=3D0,d=3Da.length;c<d;c++)b[c]=3Da[c];return =
b}},ka=3Dfunction(a){for(var b=3D1;b<arguments.length;b++){var =
c=3Darguments[b];if(w(c)){c=3Dc;c=3Du(c)?c.concat():ja(c);a.push.apply(a,=
c)}else a.push(c)}};var =
la=3Dfunction(a,b){this.x=3Da!=3D=3Dundefined?a:0;this.y=3Db!=3D=3Dundefi=
ned?b:0};la.prototype.g=3Dfunction(){return new la(this.x,this.y)};var =
B=3Dfunction(a,b){this.width=3Da;this.height=3Db};B.prototype.g=3Dfunctio=
n(){return new =
B(this.width,this.height)};B.prototype.floor=3Dfunction(){this.width=3DMa=
th.floor(this.width);this.height=3DMath.floor(this.height);return =
this};B.prototype.round=3Dfunction(){this.width=3DMath.round(this.width);=
this.height=3DMath.round(this.height);return this};var =
ma=3Dfunction(a,b,c){for(var d in =
a)b.call(c,a[d],d,a)},na=3Dfunction(a){var b=3D[],c=3D0;for(var d in =
a)b[c++]=3Da[d];return b},oa=3Dfunction(a){var b=3D[],c=3D0;for(var d in =
a)b[c++]=3Dd;return =
b},pa=3D["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumer=
able","toLocaleString","toString","valueOf"],qa=3Dfunction(a){for(var =
b,c,d=3D1;d<arguments.length;d++){c=3Darguments[d];for(b in =
c)a[b]=3Dc[b];for(var =
e=3D0;e<pa.length;e++){b=3Dpa[e];if(Object.prototype.hasOwnProperty.call(=
c,b))a[b]=3Dc[b]}}};var ra=3Dfunction(a){for(var =
b=3D1;b<arguments.length;b++){var =
c=3DString(arguments[b]).replace(/\$/g,"$$$$");a=3Da.replace(/\%s/,c)}ret=
urn a},sa=3Dfunction(a){return =
a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},ta=3D/^[a-zA-Z0-9\-_.!~*'()]*$/,u=
a=3Dfunction(a){a=3DString(a);if(!ta.test(a))return =
encodeURIComponent(a);return a},Aa=3Dfunction(a,b){if(b)return =
a.replace(va,"&amp;").replace(wa,"&lt;").replace(xa,"&gt;").replace(ya,"&=
quot;");else{if(!za.test(a))return =
a;if(a.indexOf("&")!=3D-1)a=3Da.replace(va,"&amp;");if(a.indexOf("<")!=3D=0A=
-1)a=3Da.replace(wa,"&lt;");if(a.indexOf(">")!=3D-1)a=3Da.replace(xa,"&gt=
;");if(a.indexOf('"')!=3D-1)a=3Da.replace(ya,"&quot;");return =
a}},va=3D/&/g,wa=3D/</g,xa=3D/>/g,ya=3D/\"/g,za=3D/[&<>\"]/,Ba=3Dfunction=
(a,b){return a.indexOf(b)!=3D-1},Da=3Dfunction(a,b){var =
c=3D0;a=3Dsa(String(a)).split(".");b=3Dsa(String(b)).split(".");for(var =
d=3DMath.max(a.length,b.length),e=3D0;c=3D=3D0&&e<d;e++){var =
f=3Da[e]||"",h=3Db[e]||"",i=3Dnew RegExp("(\\d*)(\\D*)","g"),n=3Dnew =
RegExp("(\\d*)(\\D*)","g");do{var =
q=3Di.exec(f)||["","",""],m=3Dn.exec(h)||["","",""];if(q[0].length=3D=3D=0A=
0&&m[0].length=3D=3D0)break;c=3Dq[1].length=3D=3D0?0:parseInt(q[1],10);va=
r =
v=3Dm[1].length=3D=3D0?0:parseInt(m[1],10);c=3DCa(c,v)||Ca(q[2].length=3D=
=3D0,m[2].length=3D=3D0)||Ca(q[2],m[2])}while(c=3D=3D0)}return =
c},Ca=3Dfunction(a,b){if(a<b)return-1;else if(a>b)return 1;return =
0};ha();var =
C,Ea,Fa,Ga,Ha,Ia,D,Ja,E,Ka,La,Ma,Na,Oa,Pa,Qa=3Dfunction(){return =
o.navigator?o.navigator.userAgent:j},Ra=3Dfunction(){return =
o.navigator};Ha=3DGa=3DFa=3DEa=3DC=3Dk;var F;if(F=3DQa()){var =
Sa=3DRa();C=3DF.indexOf("Opera")=3D=3D0;Ea=3D!C&&F.indexOf("MSIE")!=3D-1;=
Ga=3D(Fa=3D!C&&F.indexOf("WebKit")!=3D-1)&&F.indexOf("Mobile")!=3D-1;Ha=3D=
!C&&!Fa&&Sa.product=3D=3D"Gecko"}Ia=3DC;D=3DEa;Ja=3DHa;E=3DFa;Ka=3DGa;La=3D=
E;var =
Ta,Ua=3DRa(),Va=3DTa=3DUa&&Ua.platform||"";Ma=3DBa(Va,"Mac");Na=3DBa(Va,"=
Win");Oa=3DBa(Va,"Linux");Pa=3D!!Ra()&&Ba(Ra().appVersion||"","X11");=0A=
var Wa=3DMa,Xa=3DPa,Ya,Za=3D"",G;if(Ia&&o.opera){var =
$a=3Do.opera.version;Za=3Dtypeof =
$a=3D=3D"function"?$a():$a}else{if(Ja)G=3D/rv\:([^\);]+)(\)|;)/;else =
if(D)G=3D/MSIE\s+([^\);]+)(\)|;)/;else =
if(E)G=3D/WebKit\/(\S+)/;if(G){var =
ab=3DG.exec(Qa());Za=3Dab?ab[1]:""}}var =
bb=3DYa=3DZa,cb=3D{},H=3Dfunction(a){return =
cb[a]||(cb[a]=3DDa(bb,a)>=3D0)};var =
eb=3Dfunction(a,b){ma(b,function(c,d){if(d=3D=3D"style")a.style.cssText=3D=
c;else if(d=3D=3D"class")a.className=3Dc;else =
if(d=3D=3D"for")a.htmlFor=3Dc;else if(d in =
db)a.setAttribute(db[d],c);else =
a[d]=3Dc})},db=3D{cellpadding:"cellPadding",cellspacing:"cellSpacing",col=
span:"colSpan",rowspan:"rowSpan",valign:"vAlign",height:"height",width:"w=
idth",usemap:"useMap",frameborder:"frameBorder",type:"type"},fb=3Dfunctio=
n(a){var b=3Da.document;if(E&&!H("500")&&!Ka){if(typeof =
a.innerHeight=3D=3D"undefined")a=3Dwindow;b=3Da.innerHeight;var c=3D=0A=
a.document.documentElement.scrollHeight;if(a=3D=3Da.top)if(c<b)b-=3D15;re=
turn new =
B(a.innerWidth,b)}a=3Db.compatMode=3D=3D"CSS1Compat"&&(!Ia||Ia&&H("9.50")=
)?b.documentElement:b.body;return new =
B(a.clientWidth,a.clientHeight)},gb=3Dfunction(a){a=3D!E&&a.compatMode=3D=
=3D"CSS1Compat"?a.documentElement:a.body;return new =
la(a.scrollLeft,a.scrollTop)},ib=3Dfunction(){return =
hb(document,arguments)},hb=3Dfunction(a,b){var =
c=3Db[0],d=3Db[1];if(D&&d&&(d.name||d.type)){c=3D["<",c];d.name&&c.push('=
 name=3D"',Aa(d.name),'"');if(d.type){c.push(' type=3D"',=0A=
Aa(d.type),'"');d=3Dea(d);delete d.type}c.push(">");c=3Dc.join("")}var =
e=3Da.createElement(c);if(d)if(x(d))e.className=3Dd;else =
eb(e,d);if(b.length>2){function =
f(h){if(h)e.appendChild(x(h)?a.createTextNode(h):h)}for(d=3D2;d<b.length;=
d++){c=3Db[d];w(c)&&!(ca(c)&&c.nodeType>0)?ia(jb(c)?ja(c):c,f):f(c)}}retu=
rn e},I=3Dfunction(a){return =
document.createElement(a)},kb=3Dfunction(a){return =
a&&a.parentNode?a.parentNode.removeChild(a):j};E&&H("522");=0A=
var jb=3Dfunction(a){if(a&&typeof a.length=3D=3D"number")if(ca(a))return =
typeof a.item=3D=3D"function"||typeof a.item=3D=3D"string";else =
if(ba(a))return typeof a.item=3D=3D"function";return k};var =
J=3Dfunction(){};J.prototype.Ua=3Dfunction(a){var =
b=3D[];this.ka(a,b);return =
b.join("")};J.prototype.ka=3Dfunction(a,b){switch(typeof a){case =
"string":this.Fa(a,b);break;case "number":this.Wa(a,b);break;case =
"boolean":b.push(a);break;case "undefined":b.push("null");break;case =
"object":if(a=3D=3Dj){b.push("null");break}if(u(a)){this.Va(a,b);break}th=
is.Xa(a,b);break;case "function":break;default:throw Error("Unknown =
type: "+typeof a);}};=0A=
var =
lb=3D{'"':'\\"',"\\":"\\\\","/":"\\/","\u0008":"\\b","\u000c":"\\f","\n":=
"\\n","\r":"\\r","\t":"\\t","\u000b":"\\u000b"},mb=3D/\uffff/.test("\ufff=
f")?/[\\\"\x00-\x1f\x7f-\uffff]/g:/[\\\"\x00-\x1f\x7f-\xff]/g;J.prototype=
.Fa=3Dfunction(a,b){b.push('"',a.replace(mb,function(c){if(c in =
lb)return lb[c];var =
d=3Dc.charCodeAt(0),e=3D"\\u";if(d<16)e+=3D"000";else =
if(d<256)e+=3D"00";else if(d<4096)e+=3D"0";return =
lb[c]=3De+d.toString(16)}),'"')};J.prototype.Wa=3Dfunction(a,b){b.push(is=
Finite(a)&&!isNaN(a)?a:"null")};=0A=
J.prototype.Va=3Dfunction(a,b){var c=3Da.length;b.push("[");for(var =
d=3D"",e=3D0;e<c;e++){b.push(d);this.ka(a[e],b);d=3D","}b.push("]")};J.pr=
ototype.Xa=3Dfunction(a,b){b.push("{");var c=3D"";for(var d in =
a)if(a.hasOwnProperty(d)){var e=3Da[d];if(typeof =
e!=3D"function"){b.push(c);this.Fa(d,b);b.push(":");this.ka(e,b);c=3D","}=
}b.push("}")};var nb,ob,pb,qb,rb,sb;sb=3Drb=3Dqb=3Dpb=3Dob=3Dnb=3Dk;var =
K=3DQa();if(K)if(K.indexOf("Firefox")!=3D-1)nb=3Dg;else =
if(K.indexOf("Camino")!=3D-1)ob=3Dg;else =
if(K.indexOf("iPhone")!=3D-1||K.indexOf("iPod")!=3D-1)pb=3Dg;else =
if(K.indexOf("Android")!=3D-1)qb=3Dg;else =
if(K.indexOf("Chrome")!=3D-1)rb=3Dg;else =
if(K.indexOf("Safari")!=3D-1)sb=3Dg;var =
L=3Dfunction(a,b,c){x(b)?tb(a,c,b):ma(b,ga(tb,a))},tb=3Dfunction(a,b,c){a=
.style[ub(c)]=3Db},vb=3Dfunction(a,b,c){var =
d,e=3DJa&&(Wa||Xa)&&H("1.9");if(b instanceof =
la){d=3Db.x;b=3Db.y}else{d=3Db;b=3Dc}a.style.left=3Dtypeof =
d=3D=3D"number"?(e?Math.round(d):d)+"px":d;a.style.top=3Dtypeof =
b=3D=3D"number"?(e?Math.round(b):b)+"px":b},wb=3Dfunction(a,b,c){if(b =
instanceof B){c=3Db.height;b=3Db.width}else{if(c=3D=3Dundefined)throw =
Error("missing height argument");c=3Dc}a.style.width=3Dtypeof =
b=3D=3D"number"?Math.round(b)+"px":b;a.style.height=3Dtypeof c=3D=3D=0A=
"number"?Math.round(c)+"px":c},xb=3D{},ub=3Dfunction(a){return =
xb[a]||(xb[a]=3DString(a).replace(/\-([a-z])/g,function(b,c){return =
c.toUpperCase()}))},yb=3Dfunction(a,b){a=3Da.style;if("opacity"in =
a)a.opacity=3Db;else if("MozOpacity"in a)a.MozOpacity=3Db;else =
if("filter"in =
a)a.filter=3Db=3D=3D=3D""?"":"alpha(opacity=3D"+b*100+")"};var =
zb=3D"StopIteration"in =
o?o.StopIteration:Error("StopIteration"),Ab=3Dfunction(){};Ab.prototype.n=
ext=3Dfunction(){throw zb;};Ab.prototype.Ia=3Dfunction(){return =
this};var Bb=3Dfunction(a){if(typeof a.v=3D=3D"function")return =
a.v();if(x(a))return a.split("");if(w(a)){for(var =
b=3D[],c=3Da.length,d=3D0;d<c;d++)b.push(a[d]);return b}return =
na(a)},Cb=3Dfunction(a,b,c){if(typeof =
a.forEach=3D=3D"function")a.forEach(b,c);else =
if(w(a)||x(a))ia(a,b,c);else{var d;var e=3Da;if(typeof =
e.A=3D=3D"function")d=3De.A();else if(typeof =
e.v!=3D"function")if(w(e)||x(e)){d=3D[];e=3De.length;for(var =
f=3D0;f<e;f++)d.push(f);d=3Dd}else d=3Doa(e);else d=3Dvoid =
0;e=3DBb(a);f=3De.length;for(var =
h=3D0;h<f;h++)b.call(c,e[h],d&&d[h],a)}};var =
Db=3Dfunction(a){this.i=3D{};this.c=3D[];var =
b=3Darguments.length;if(b>1){if(b%2)throw Error("Uneven number of =
arguments");for(var =
c=3D0;c<b;c+=3D2)this.s(arguments[c],arguments[c+1])}else =
a&&this.Ja(a)};l=3DDb.prototype;l.a=3D0;l.ca=3D0;l.v=3Dfunction(){this.R(=
);for(var a=3D[],b=3D0;b<this.c.length;b++){var =
c=3Dthis.c[b];a.push(this.i[c])}return =
a};l.A=3Dfunction(){this.R();return =
this.c.concat()};l.o=3Dfunction(a){return M(this.i,a)};=0A=
l.remove=3Dfunction(a){if(M(this.i,a)){delete =
this.i[a];this.a--;this.ca++;this.c.length>2*this.a&&this.R();return =
g}return k};l.R=3Dfunction(){if(this.a!=3Dthis.c.length){for(var =
a=3D0,b=3D0;a<this.c.length;){var =
c=3Dthis.c[a];if(M(this.i,c))this.c[b++]=3Dc;a++}this.c.length=3Db}if(thi=
s.a!=3Dthis.c.length){var =
d=3D{};for(b=3Da=3D0;a<this.c.length;){c=3Dthis.c[a];if(!M(d,c)){this.c[b=
++]=3Dc;d[c]=3D1}a++}this.c.length=3Db}};l.q=3Dfunction(a,b){if(M(this.i,=
a))return this.i[a];return b};=0A=
l.s=3Dfunction(a,b){if(!M(this.i,a)){this.a++;this.c.push(a);this.ca++}th=
is.i[a]=3Db};l.Ja=3Dfunction(a){var b;if(a instanceof =
Db){b=3Da.A();a=3Da.v()}else{b=3Doa(a);a=3Dna(a)}for(var =
c=3D0;c<b.length;c++)this.s(b[c],a[c])};l.g=3Dfunction(){return new =
Db(this)};l.Ia=3Dfunction(a){this.R();var =
b=3D0,c=3Dthis.c,d=3Dthis.i,e=3Dthis.ca,f=3Dthis,h=3Dnew =
Ab;h.next=3Dfunction(){for(;1;){if(e!=3Df.ca)throw Error("The map has =
changed since the iterator was created");if(b>=3Dc.length)throw zb;var =
i=3Dc[b++];return a?i:d[i]}};return h};=0A=
var M=3Dfunction(a,b){return =
Object.prototype.hasOwnProperty.call(a,b)};var =
Eb=3D/^(?:([^:\/?#]+):)?(?:\/\/(?:([^\/?#]*)@)?([^\/?#:@]*)(?::([0-9]+))?=
)?([^?#]+)?(?:\?([^#]*))?(?:#(.*))?$/,Fb=3Dfunction(a){return =
a.match(Eb)};var N=3Dfunction(a,b){var c;if(a instanceof =
N){this.F(b=3D=3Dj?a.h:b);this.aa(a.n);this.ma(a.Q);this.X(a.z);this.$(a.=
w);this.Z(a.K);this.la(a.e.g());this.Y(a.H)}else =
if(a&&(c=3DFb(String(a)))){this.F(!!b);this.aa(c[1]||"",g);this.ma(c[2]||=
"",g);this.X(c[3]||"",g);this.$(c[4]);this.Z(c[5]||"",g);this.Za(c[6]||""=
,g);this.Y(c[7]||"",g)}else{this.F(!!b);this.e=3Dnew =
O(j,this,this.h)}};l=3DN.prototype;l.n=3D"";l.Q=3D"";l.z=3D"";l.w=3Dj;l.K=
=3D"";l.H=3D"";l.Ra=3Dk;l.h=3Dk;=0A=
l.toString=3Dfunction(){if(this.d)return this.d;var =
a=3D[];this.n&&a.push(P(this.n,Gb),":");if(this.z){a.push("//");this.Q&&a=
.push(P(this.Q,Gb),"@");a.push(Hb(this.z));this.w!=3Dj&&a.push(":",String=
(this.w))}this.K&&a.push(P(this.K,Ib));var =
b=3DString(this.e);b&&a.push("?",b);this.H&&a.push("#",P(this.H,Jb));retu=
rn this.d=3Da.join("")};=0A=
l.g=3Dfunction(){var a;a=3Dthis.n;var =
b=3Dthis.Q,c=3Dthis.z,d=3Dthis.w,e=3Dthis.K,f=3Dthis.e.g(),h=3Dthis.H,i=3D=
new =
N(j,this.h);a&&i.aa(a);b&&i.ma(b);c&&i.X(c);d&&i.$(d);e&&i.Z(e);f&&i.la(f=
);h&&i.Y(h);return a=3Di};l.aa=3Dfunction(a,b){this.k();delete =
this.d;if(this.n=3Db?a?decodeURIComponent(a):"":a)this.n=3Dthis.n.replace=
(/:$/,"");return this};l.ma=3Dfunction(a,b){this.k();delete =
this.d;this.Q=3Db?a?decodeURIComponent(a):"":a;return =
this};l.X=3Dfunction(a,b){this.k();delete =
this.d;this.z=3Db?a?decodeURIComponent(a):"":a;return this};=0A=
l.$=3Dfunction(a){this.k();delete =
this.d;if(a){a=3DNumber(a);if(isNaN(a)||a<0)throw Error("Bad port number =
"+a);this.w=3Da}else this.w=3Dj;return =
this};l.Z=3Dfunction(a,b){this.k();delete =
this.d;this.K=3Db?a?decodeURIComponent(a):"":a;return =
this};l.la=3Dfunction(a,b){this.k();delete this.d;if(a instanceof =
O){this.e=3Da;this.e.P=3Dthis;this.e.F(this.h)}else{b||(a=3DP(a,Kb));this=
.e=3Dnew O(a,this,this.h)}return this};l.Za=3Dfunction(a,b){return =
this.la(a,b)};l.O=3Dfunction(a,b){this.k();delete =
this.d;this.e.s(a,b);return this};=0A=
l.Ga=3Dfunction(a,b){this.k();delete =
this.d;u(b)||(b=3D[String(b)]);this.e.$a(a,b);return =
this};l.Y=3Dfunction(a,b){this.k();delete =
this.d;this.H=3Db?a?decodeURIComponent(a):"":a;return =
this};l.k=3Dfunction(){if(this.Ra)throw Error("Tried to modify a =
read-only Uri");};l.F=3Dfunction(a){this.h=3Da;this.e&&this.e.F(a)};=0A=
var Hb=3Dfunction(a){if(x(a))return encodeURIComponent(a);return =
j},Lb=3D/^[a-zA-Z0-9\-_.!~*'():\/;?]*$/,P=3Dfunction(a,b){var =
c=3Dj;if(x(a)){c=3Da;Lb.test(c)||(c=3DencodeURI(a));if(c.search(b)>=3D0)c=
=3Dc.replace(b,Mb)}return =
c},Mb=3Dfunction(a){a=3Da.charCodeAt(0);return"%"+(a>>4&15).toString(16)+=
(a&15).toString(16)},Gb=3D/[#\/\?@]/g,Ib=3D/[\#\?]/g,Kb=3D/[\#\?@]/g,Jb=3D=
/#/g,O=3Dfunction(a,b,c){this.j=3Da||j;this.P=3Db||j;this.h=3D!!c};l=3DO.=
prototype;=0A=
l.l=3Dfunction(){if(!this.b){this.b=3Dnew Db;if(this.j)for(var =
a=3Dthis.j.split("&"),b=3D0;b<a.length;b++){var =
c=3Da[b].indexOf("=3D"),d=3Dj,e=3Dj;if(c>=3D0){d=3Da[b].substring(0,c);e=3D=
a[b].substring(c+1)}else =
d=3Da[b];d=3DdecodeURIComponent(d.replace(/\+/g," =
"));d=3Dthis.r(d);this.add(d,e?decodeURIComponent(e.replace(/\+/g," =
")):"")}}};l.b=3Dj;l.a=3Dj;l.add=3Dfunction(a,b){this.l();this.I();a=3Dth=
is.r(a);if(this.o(a)){var =
c=3Dthis.b.q(a);u(c)?c.push(b):this.b.s(a,[c,b])}else =
this.b.s(a,b);this.a++;return this};=0A=
l.remove=3Dfunction(a){this.l();a=3Dthis.r(a);if(this.b.o(a)){this.I();va=
r b=3Dthis.b.q(a);if(u(b))this.a-=3Db.length;else this.a--;return =
this.b.remove(a)}return =
k};l.o=3Dfunction(a){this.l();a=3Dthis.r(a);return =
this.b.o(a)};l.A=3Dfunction(){this.l();for(var =
a=3Dthis.b.v(),b=3Dthis.b.A(),c=3D[],d=3D0;d<b.length;d++){var =
e=3Da[d];if(u(e))for(var f=3D0;f<e.length;f++)c.push(b[d]);else =
c.push(b[d])}return c};=0A=
l.v=3Dfunction(a){this.l();if(a){a=3Dthis.r(a);if(this.o(a)){var =
b=3Dthis.b.q(a);if(u(b))return b;else{a=3D[];a.push(b)}}else =
a=3D[]}else{b=3Dthis.b.v();a=3D[];for(var c=3D0;c<b.length;c++){var =
d=3Db[c];u(d)?ka(a,d):a.push(d)}}return =
a};l.s=3Dfunction(a,b){this.l();this.I();a=3Dthis.r(a);if(this.o(a)){var =
c=3Dthis.b.q(a);if(u(c))this.a-=3Dc.length;else =
this.a--}this.b.s(a,b);this.a++;return =
this};l.q=3Dfunction(a,b){this.l();a=3Dthis.r(a);if(this.o(a)){a=3Dthis.b=
.q(a);return u(a)?a[0]:a}else return b};=0A=
l.$a=3Dfunction(a,b){this.l();this.I();a=3Dthis.r(a);if(this.o(a)){var =
c=3Dthis.b.q(a);if(u(c))this.a-=3Dc.length;else =
this.a--}if(b.length>0){this.b.s(a,b);this.a+=3Db.length}};l.toString=3Df=
unction(){if(this.j)return this.j;if(!this.b)return"";for(var =
a=3D[],b=3D0,c=3Dthis.b.A(),d=3D0;d<c.length;d++){var =
e=3Dc[d],f=3Dua(e);e=3Dthis.b.q(e);if(u(e))for(var =
h=3D0;h<e.length;h++){b>0&&a.push("&");a.push(f,"=3D",ua(e[h]));b++}else{=
b>0&&a.push("&");a.push(f,"=3D",ua(e));b++}}return this.j=3Da.join("")};=0A=
l.I=3Dfunction(){delete this.fa;delete this.j;this.P&&delete =
this.P.d};l.g=3Dfunction(){var a=3Dnew =
O;if(this.fa)a.fa=3Dthis.fa;if(this.j)a.j=3Dthis.j;if(this.b)a.b=3Dthis.b=
.g();return =
a};l.r=3Dfunction(a){a=3DString(a);if(this.h)a=3Da.toLowerCase();return =
a};l.F=3Dfunction(a){var =
b=3Da&&!this.h;if(b){this.l();this.I();Cb(this.b,function(c,d){var =
e=3Dd.toLowerCase();if(d!=3De){this.remove(d);this.add(e,c)}},this)}this.=
h=3Da};var =
Q=3Dfunction(){};Q.prototype.ta=3Dk;Q.prototype.S=3Dfunction(){if(!this.t=
a){this.ta=3Dg;this.p()}};Q.prototype.p=3Dfunction(){};var =
R=3Dfunction(a,b){this.type=3Da;this.currentTarget=3Dthis.target=3Db};A(R=
,Q);R.prototype.p=3Dfunction(){delete this.type;delete =
this.target;delete =
this.currentTarget};R.prototype.C=3Dk;R.prototype.W=3Dg;var =
S=3Dfunction(a,b){a&&this.T(a,b)};A(S,R);l=3DS.prototype;l.target=3Dj;l.r=
elatedTarget=3Dj;l.offsetX=3D0;l.offsetY=3D0;l.clientX=3D0;l.clientY=3D0;=
l.screenX=3D0;l.screenY=3D0;l.button=3D0;l.keyCode=3D0;l.charCode=3D0;l.c=
trlKey=3Dk;l.altKey=3Dk;l.shiftKey=3Dk;l.metaKey=3Dk;l.ua=3Dj;=0A=
l.T=3Dfunction(a,b){var =
c=3Dthis.type=3Da.type;this.target=3Da.target||a.srcElement;this.currentT=
arget=3Db;if(b=3Da.relatedTarget){if(Ja)try{b=3Db.nodeName&&b}catch(d){}}=
else if(c=3D=3D"mouseover")b=3Da.fromElement;else =
if(c=3D=3D"mouseout")b=3Da.toElement;this.relatedTarget=3Db;this.offsetX=3D=
a.offsetX!=3D=3Dundefined?a.offsetX:a.layerX;this.offsetY=3Da.offsetY!=3D=
=3Dundefined?a.offsetY:a.layerY;this.clientX=3Da.clientX!=3D=3Dundefined?=
a.clientX:a.pageX;this.clientY=3Da.clientY!=3D=3Dundefined?a.clientY:a.pa=
geY;this.screenX=3Da.screenX||0;this.screenY=3D=0A=
a.screenY||0;this.button=3Da.button;this.keyCode=3Da.keyCode||0;this.char=
Code=3Da.charCode||(c=3D=3D"keypress"?a.keyCode:0);this.ctrlKey=3Da.ctrlK=
ey;this.altKey=3Da.altKey;this.shiftKey=3Da.shiftKey;this.metaKey=3Da.met=
aKey;this.ua=3Da;delete this.W;delete =
this.C};D&&H("8");S.prototype.p=3Dfunction(){S.ba.p.call(this);this.relat=
edTarget=3Dthis.currentTarget=3Dthis.target=3Dthis.ua=3Dj};var =
T=3Dfunction(a,b){this.za=3Db;this.t=3D[];this.Ma(a)};A(T,Q);l=3DT.protot=
ype;l.ea=3Dj;l.sa=3Dj;l.N=3Dfunction(a){this.ea=3Da};l.u=3Dfunction(){if(=
this.t.length)return this.t.pop();return =
this.pa()};l.L=3Dfunction(a){this.t.length<this.za?this.t.push(a):this.ra=
(a)};l.Ma=3Dfunction(a){if(a>this.za)throw =
Error("[goog.structs.SimplePool] Initial cannot be greater than =
max");for(var =
b=3D0;b<a;b++)this.t.push(this.pa())};l.pa=3Dfunction(){return =
this.ea?this.ea():{}};=0A=
l.ra=3Dfunction(a){if(this.sa)this.sa(a);else if(ba(a.S))a.S();else =
for(var b in a)delete a[b]};l.p=3Dfunction(){T.ba.p.call(this);for(var =
a=3Dthis.t;a.length;)this.ra(a.pop());delete this.t};var =
Nb,Ob,Pb=3D"ScriptEngine"in =
o;Ob=3D(Nb=3DPb&&o.ScriptEngine()=3D=3D"JScript")?o.ScriptEngineMajorVers=
ion()+"."+o.ScriptEngineMinorVersion()+"."+o.ScriptEngineBuildVersion():"=
0";var Qb=3DNb,Rb=3DOb;var =
Sb=3Dfunction(){},Tb=3D0;l=3DSb.prototype;l.m=3D0;l.D=3Dk;l.da=3Dk;l.T=3D=
function(a,b,c,d,e,f){if(ba(a))this.xa=3Dg;else =
if(a&&a.handleEvent&&ba(a.handleEvent))this.xa=3Dk;else throw =
Error("Invalid listener =
argument");this.J=3Da;this.Ca=3Db;this.src=3Dc;this.type=3Dd;this.capture=
=3D!!e;this.ha=3Df;this.da=3Dk;this.m=3D++Tb;this.D=3Dk};l.handleEvent=3D=
function(a){if(this.xa)return this.J.call(this.ha||this.src,a);return =
this.J.handleEvent.call(this.J,a)};var Ub,Vb,U,Wb,Xb,Yb,Zb,$b,ac,bc,cc;=0A=
(function(){var a=3DQb&&!(Da(Rb,"5.7")>=3D0);function =
b(){return{a:0,f:0}}function c(){return[]}var =
d;Yb=3Dfunction(p){d=3Dp};function e(){var p=3Dfunction(zc){return =
d.call(p.src,p.m,zc)};return p}function f(){return new Sb}function =
h(){return new S}if(a){Ub=3Dfunction(){return =
i.u()};Vb=3Dfunction(p){i.L(p)};U=3Dfunction(){return =
n.u()};Wb=3Dfunction(p){n.L(p)};Xb=3Dfunction(){return =
q.u()};Zb=3Dfunction(){q.L(e())};$b=3Dfunction(){return =
m.u()};ac=3Dfunction(p){m.L(p)};bc=3Dfunction(){return =
v.u()};cc=3Dfunction(p){v.L(p)};=0A=
var i=3Dnew T(0,600);i.N(b);var n=3Dnew T(0,600);n.N(c);var q=3Dnew =
T(0,600);q.N(e);var m=3Dnew T(0,600);m.N(f);var v=3Dnew =
T(0,600);v.N(h)}else{Ub=3Db;Vb=3Ds;U=3Dc;Wb=3Ds;Xb=3De;Zb=3Ds;$b=3Df;ac=3D=
s;bc=3Dh;cc=3Ds}})();var =
V=3D{},W=3D{},X=3D{},dc=3D"on",ec=3D{},Y=3Dfunction(a,b,c,d,e){if(b)if(u(=
b)){for(var f=3D0;f<b.length;f++)Y(a,b[f],c,d,e);return =
j}else{d=3D!!d;var h=3DW;b in h||(h[b]=3DUb());h=3Dh[b];if(!(d in =
h)){h[d]=3DUb();h.a++}h=3Dh[d];var =
i=3Dz(a),n;h.f++;if(h[i]){n=3Dh[i];for(f=3D0;f<n.length;f++){h=3Dn[f];if(=
h.J=3D=3Dc&&h.ha=3D=3De){if(h.D)break;return =
n[f].m}}}else{n=3Dh[i]=3DU();h.a++}f=3DXb();f.src=3Da;h=3D$b();h.T(c,f,a,=
b,d,e);c=3Dh.m;f.m=3Dc;n.push(h);V[c]=3Dh;X[i]||(X[i]=3DU());X[i].push(h)=
;if(a.addEventListener){if(a=3D=3Do||!a.qa)a.addEventListener(b,f,d)}else=
 a.attachEvent(fc(b),=0A=
f);return c}else throw Error("Invalid event =
type");},gc=3Dfunction(a,b,c,d,e){if(u(b)){for(var =
f=3D0;f<b.length;f++)gc(a,b[f],c,d,e);return =
j}a=3DY(a,b,c,d,e);b=3DV[a];b.da=3Dg;return =
a},hc=3Dfunction(a,b,c,d,e){if(u(b)){for(var =
f=3D0;f<b.length;f++)hc(a,b[f],c,d,e);return j}d=3D!!d;a:{f=3DW;if(b in =
f){f=3Df[b];if(d in f){f=3Df[d];a=3Dz(a);if(f[a]){a=3Df[a];break =
a}}}a=3Dj}if(!a)return =
k;for(f=3D0;f<a.length;f++)if(a[f].J=3D=3Dc&&a[f].capture=3D=3Dd&&a[f].ha=
=3D=3De)return ic(a[f].m);return k},ic=3Dfunction(a){if(!V[a])return =
k;var b=3DV[a];if(b.D)return k;=0A=
var =
c=3Db.src,d=3Db.type,e=3Db.Ca,f=3Db.capture;if(c.removeEventListener){if(=
c=3D=3Do||!c.qa)c.removeEventListener(d,e,f)}else =
c.detachEvent&&c.detachEvent(fc(d),e);c=3Dz(c);e=3DW[d][f][c];if(X[c]){va=
r h=3DX[c],i=3Dh,n;a:{n=3Di;var =
q=3Db,m=3Dundefined;if(n.indexOf)n=3Dn.indexOf(q,m);else =
if(Array.indexOf)n=3DArray.indexOf(n,q,m);else{for(m=3Dm=3Dm=3D=3Dj?0:m<0=
?Math.max(0,n.length+m):m;m<n.length;m++)if(m in =
n&&n[m]=3D=3D=3Dq){n=3Dm;break =
a}n=3D-1}}n!=3D-1&&Array.prototype.splice.call(i,n,1).length=3D=3D1;h.len=
gth=3D=3D0&&delete X[c]}b.D=3Dg;e.Aa=3Dg;jc(d,f,=0A=
c,e);delete V[a];return =
g},jc=3Dfunction(a,b,c,d){if(!d.V)if(d.Aa){for(var =
e=3D0,f=3D0;e<d.length;e++)if(d[e].D){var =
h=3Dd[e].Ca;h.src=3Dj;Zb(h);ac(d[e])}else{if(e!=3Df)d[f]=3Dd[e];f++}d.len=
gth=3Df;d.Aa=3Dk;if(f=3D=3D0){Wb(d);delete =
W[a][b][c];W[a][b].a--;if(W[a][b].a=3D=3D0){Vb(W[a][b]);delete =
W[a][b];W[a].a--}if(W[a].a=3D=3D0){Vb(W[a]);delete =
W[a]}}}},kc=3Dfunction(a,b,c){var =
d=3D0,e=3Da=3D=3Dj,f=3Db=3D=3Dj,h=3Dc=3D=3Dj;c=3D!!c;if(e)ma(X,function(n=
){for(var q=3Dn.length-1;q>=3D0;q--){var =
m=3Dn[q];if((f||b=3D=3Dm.type)&&(h||c=3D=3Dm.capture)){ic(m.m);d++}}});el=
se{a=3D=0A=
z(a);if(X[a]){a=3DX[a];for(e=3Da.length-1;e>=3D0;e--){var =
i=3Da[e];if((f||b=3D=3Di.type)&&(h||c=3D=3Di.capture)){ic(i.m);d++}}}}ret=
urn d},fc=3Dfunction(a){if(a in ec)return ec[a];return =
ec[a]=3Ddc+a},mc=3Dfunction(a,b,c,d,e){var =
f=3D1;b=3Dz(b);if(a[b]){a.f--;a=3Da[b];if(a.V)a.V++;else =
a.V=3D1;try{for(var h=3Da.length,i=3D0;i<h;i++){var =
n=3Da[i];if(n&&!n.D)f&=3Dlc(n,e)!=3D=3Dk}}finally{a.V--;jc(c,d,b,a)}}retu=
rn =
Boolean(f)},lc=3Dfunction(a,b){b=3Da.handleEvent(b);a.da&&ic(a.m);return =
b},nc=3Dfunction(a,b){if(!V[a])return g;a=3DV[a];var c=3Da.type,d=3D=0A=
W;if(!(c in d))return g;d=3Dd[c];var =
e,f;if(D){e=3Db||aa("window.event");b=3Dg in d;var h=3Dk in =
d;if(b){if(e.keyCode<0||e.returnValue!=3Dundefined)return g;a:{var =
i=3De,n=3Dk;if(i.keyCode=3D=3D0)try{i.keyCode=3D-1;break =
a}catch(q){n=3Dg}if(n||i.returnValue=3D=3Dundefined)i.returnValue=3Dg}}i=3D=
bc();i.T(e,this);e=3Dg;try{if(b){for(var =
m=3DU(),v=3Di.currentTarget;v;v=3Dv.parentNode)m.push(v);f=3Dd[g];f.f=3Df=
.a;for(var =
p=3Dm.length-1;!i.C&&p>=3D0&&f.f;p--){i.currentTarget=3Dm[p];e&=3Dmc(f,m[=
p],c,g,i)}if(h){f=3Dd[k];f.f=3Df.a;for(p=3D0;!i.C&&p<m.length&&=0A=
f.f;p++){i.currentTarget=3Dm[p];e&=3Dmc(f,m[p],c,k,i)}}}else =
e=3Dlc(a,i)}finally{if(m){m.length=3D0;Wb(m)}i.S();cc(i)}return =
e}f=3Dnew S(b,this);try{e=3Dlc(a,f)}finally{f.S()}return e};Yb(nc);var =
oc=3Dfunction(a,b){this.ia=3Db||"en"};oc.prototype.va=3Dfunction(){var =
a=3DI("img");a.src=3Dra("http://books.google.com/intl/%s/googlebooks/imag=
es/gbs_preview_button1.gif",this.ia);a.border=3D0;L(a,"cursor","pointer")=
;return a};var =
pc=3Dfunction(a,b,c){this.ia=3Dc||"en";c=3DI("a");c.href=3Db;a.appendChil=
d(c);a=3Dthis.va();c.appendChild(a)};A(pc,oc);var =
qc=3Dfunction(a,b,c){this.ia=3Dc||"en";c=3Dthis.va();a.appendChild(c);L(a=
,"cursor","pointer");Y(a,"click",b)};A(qc,oc);var =
sc=3Dfunction(a){this.Na();rc(this.oa,a);this.Ta()};=0A=
sc.prototype.Na=3Dfunction(){var =
a=3Ddocument.getElementsByTagName("body")[0],b=3DI("div");yb(b,0.5);L(b,{=
backgroundColor:"#333",position:"absolute",zIndex:200});this.Ka=3Db;var =
c=3Dfb(window),d=3Da.scrollWidth;c=3DMath.max(a.scrollHeight,c.height);wb=
(b,d,c);vb(b,0,0);a.appendChild(b);this.M=3DI("div");L(this.M,{position:"=
absolute",zIndex:201});a.appendChild(this.M);this.G=3DI("div");wb(this.G,=
618,500);L(this.G,{backgroundColor:"#333",position:"absolute",zIndex:202}=
);vb(this.G,3,3);yb(this.G,0.3);this.M.appendChild(this.G);=0A=
this.B=3DI("div");vb(this.B,0,0);L(this.B,{position:"absolute",padding:"8=
px",border:"1px solid =
#2c4462",backgroundColor:"#b4cffe",zIndex:203});a=3DI("div");L(a,{backgro=
undColor:"#d8e8fd",fontSize:"16px",fontFamily:"Arial, =
sans-serif",fontWeight:"bold",padding:"2px 2px 2px =
5px"});this.B.appendChild(a);b=3DI("img");b.src=3D"http://books.google.co=
m/googlebooks/images/dialog_close_x.gif";b.width=3D15;b.height=3D15;L(b,{=
cursor:"pointer",position:"absolute",right:"11px",top:"11px"});gc(b,"clic=
k",fa(this.close,this));=0A=
a.appendChild(b);b=3DI("div");b.innerHTML=3D"&nbsp;";a.appendChild(b);thi=
s.oa=3DI("div");this.B.appendChild(this.oa);wb(this.oa,600,456);this.M.ap=
pendChild(this.B)};sc.prototype.Ta=3Dfunction(){var =
a=3Dfb(window),b=3DMath.max(0,(a.height-500)/2);b=3DMath.floor(b+gb(docum=
ent).y);a=3DMath.max(0,(a.width-618)/2);a=3DMath.floor(a);vb(this.M,a,b)}=
;sc.prototype.close=3Dfunction(){ia([this.B,this.Ka,this.G],kb)};var =
tc=3Dfunction(a,b){this.P=3Dnew =
N(a);this.La=3Db?b:"callback";this.na=3D5000},uc=3D0;=0A=
tc.prototype.send=3Dfunction(a,b,c,d){if(!document.documentElement.firstC=
hild){c&&c(a);return =
j}d=3Dd||"_"+(uc++).toString(36)+ha().toString(36);o._callbacks_||(o._cal=
lbacks_=3D{});var =
e=3DI("script"),f=3Dj;if(this.na>0){f=3Dvc(d,e,a,c);f=3Do.setTimeout(f,th=
is.na)}c=3Dthis.P.g();a=3Da;var h=3Dc;for(var i in =
a)if(!a.hasOwnProperty||a.hasOwnProperty(i))h.Ga(i,a[i]);if(b){b=3Dwc(d,e=
,b,f);o._callbacks_[d]=3Db;c.Ga(this.La,"_callbacks_."+d)}eb(e,{type:"tex=
t/javascript",id:d,charset:"UTF-8",src:c.toString()});b=3Ddocument.getEle=
mentsByTagName("head")[0];=0A=
b.appendChild(e);return{ab:d,na:f}};var vc=3Dfunction(a,b,c,d){return =
function(){xc(a,b,k);d&&d(c)}},wc=3Dfunction(a,b,c,d){return =
function(){o.clearTimeout(d);xc(a,b,g);c.apply(undefined,arguments)}},xc=3D=
function(a,b,c){o.setTimeout(function(){kb(b)},0);if(o._callbacks_[a])if(=
c)delete o._callbacks_[a];else o._callbacks_[a]=3Ds};var =
yc=3Dfunction(){};A(yc,Q);l=3Dyc.prototype;l.qa=3Dg;l.ja=3Dj;l.addEventLi=
stener=3Dfunction(a,b,c,d){Y(this,a,b,c,d)};l.removeEventListener=3Dfunct=
ion(a,b,c,d){hc(this,a,b,c,d)};=0A=
l.dispatchEvent=3Dfunction(a){a=3Da;if(x(a))a=3Dnew R(a,this);else if(a =
instanceof R)a.target=3Da.target||this;else{var b=3Da;a=3Dnew =
R(a.type,this);qa(a,b)}b=3D1;var c,d=3Da.type,e=3DW;if(d in =
e){e=3De[d];d=3Dg in e;var =
f;if(d){c=3D[];for(f=3Dthis;f;f=3Df.ja)c.push(f);f=3De[g];f.f=3Df.a;for(v=
ar =
h=3Dc.length-1;!a.C&&h>=3D0&&f.f;h--){a.currentTarget=3Dc[h];b&=3Dmc(f,c[=
h],a.type,g,a)&&a.W!=3Dk}}if(f=3Dk in =
e){f=3De[k];f.f=3Df.a;if(d)for(h=3D0;!a.C&&h<c.length&&f.f;h++){a.current=
Target=3Dc[h];b&=3Dmc(f,c[h],a.type,k,a)&&a.W!=3Dk}else =
for(c=3Dthis;!a.C&&c&&=0A=
f.f;c=3Dc.ja){a.currentTarget=3Dc;b&=3Dmc(f,c,a.type,k,a)&&a.W!=3Dk}}a=3D=
Boolean(b)}else a=3Dg;return =
a};l.p=3Dfunction(){yc.ba.p.call(this);kc(this);this.ja=3Dj};var =
Z=3Dfunction(a){this.url=3Da;this.Ea=3Dj;this.ya=3Dg};A(Z,yc);Z.prototype=
.ga=3Dfunction(){if(this.ya)this.ya=3Dk;else =
throw{};};Z.prototype.Ya=3Dfunction(a){this.Ea=3Da};Z.prototype.u=3Dfunct=
ion(){return this.Ea};var $=3Dfunction(a){Z.call(this,a);this.Sa=3Dnew =
tc(a);this.U=3Dg};A($,Z);$.prototype.ga=3Dfunction(a,b){$.ba.ga.call(this=
,a,b);this.U=3Dk;this.Sa.send({},fa(this.Qa,this,a),fa(this.Pa,this,b))};=
$.prototype.Qa=3Dfunction(a,b){if(!this.U){this.Ya(b);this.dispatchEvent(=
"success");a&&a(this.u());this.Da()}};$.prototype.Pa=3Dfunction(a){if(!th=
is.U){this.dispatchEvent("error");a&&a();this.Da()}};$.prototype.Da=3Dfun=
ction(){this.U=3Dg};var =
Bc=3Dfunction(a,b,c,d){u(a)||(a=3D[a]);this.wa=3Da;this.Ha=3Db;this.Ba=3D=
c;b=3Dnew =
N(Ac);b.O("bibkeys",a.join(","));b.O("hl",GBS_LANG);b.O("source",d||"prev=
iewlib");a=3Dnew =
$(b);a.ga(fa(this.Oa,this))},Ac=3D(GBS_HOST||"http://books.google.com/")+=
"books?jscmd=3Dviewapi";Bc.prototype.Oa=3Dfunction(a){for(var =
b=3D0;b<this.wa.length;b++){var c=3Dthis.wa[b];if(c=3Da[c]){var =
d=3Dc.preview_url;if(d&&Cc(c)){this.Ha&&this.Ha(d);return}}}this.Ba&&this=
.Ba()};=0A=
var Cc=3Dfunction(a){var =
b=3Da.preview;a=3Da.embeddable;a!=3D=3Dundefined||(a=3Dg);return(b=3D=3D"=
full"||b=3D=3D"partial")&&a};var =
Fc=3Dfunction(a,b){b=3Db||{};b=3Db.alternativeUrl;b=3Dga(Dc,b);Ec(a,b,"GB=
S_insertPreviewButtonLink")};r("GBS_insertPreviewButtonLink",Fc,undefined=
);var =
Hc=3Dfunction(a){Ec(a,Gc,"GBS_insertPreviewButtonPopup")};r("GBS_insertPr=
eviewButtonPopup",Hc,undefined);var =
Jc=3Dfunction(a,b,c){Ec(a,ga(Ic,b,c),"GBS_insertEmbeddedViewer")};r("GBS_=
insertEmbeddedViewer",Jc,undefined);=0A=
var Ec=3Dfunction(a,b,c){var d=3DKc(),e=3Dfunction(f){b(d,f)};new =
Bc(a,e,j,c)},Dc=3Dfunction(a,b,c){if(a)a=3Da;else{a=3Dnew =
N(c);if(Lc){c=3Dnew =
N(GBS_HOST);a.aa(c.n);a.X(c.z);a.$(c.w);a.Z("/books/p/"+Lc)}a.O("hl",Mc||=
"en");a=3Da.toString()}new =
pc(b,a,Mc)},Gc=3Dfunction(a,b){b=3Dga(Nc,b);new =
qc(a,b,Mc)},Ic=3Dfunction(a,b,c,d){var =
e=3DI("div");c.appendChild(e);wb(e,a,b);rc(e,d)},rc=3Dfunction(a,b){var =
c=3Dib("iframe",{frameBorder:"0",width:"100%",height:"100%"});a.appendChi=
ld(c);a=3Dnew N(b);a.O("output","embed");Oc&&a.Y(ua((new J).Ua(Oc)));=0A=
c.src=3Da.toString()},Nc=3Dfunction(a){new =
sc(a)},Mc=3D"en",Pc=3Dfunction(a){Mc=3Da};r("GBS_setLanguage",Pc,undefine=
d);var =
Qc=3Dfunction(a){Oc=3Da};r("GBS_setViewerOptions",Qc,undefined);var =
Lc=3Dj,Rc=3Dfunction(a){Lc=3Da};r("GBS_setCobrandName",Rc,undefined);var =
Oc=3D{},Kc=3Dfunction(){var =
a=3D"__GBS_Button"+Sc++;document.write(ra('<span =
id=3D"%s"></span>',a));return =
x(a)?document.getElementById(a):a},Sc=3D0;Y(window,"unload",function(){kc=
()});=0A=
})();
------=_NextPart_000_00BC_01CA75C6.4B59EF40--
