From: <Salvato da Windows Internet Explorer 7>
Subject: Torino Film Festival | 26
Date: Tue, 5 May 2009 01:44:05 +0200
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0050_01C9CD22.F9345B70"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://209.85.129.132/search?q=cache:sTyhYvOIc0sJ:www.torinofilmfest.org/view.php%3Ftable%3Dtffdb%26ID%3D1694%26lang%3Dita+domenico+liggeri&cd=291&hl=it&ct=clnk

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Torino Film Festival | 26</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; charset=3DUTF-8">
<META content=3D"MSHTML 6.00.6000.16825" name=3DGENERATOR></HEAD>
<BODY>
<DIV=20
style=3D"BORDER-RIGHT: #999 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: =
#999 1px solid; PADDING-LEFT: 0px; BACKGROUND: #fff; PADDING-BOTTOM: =
0px; MARGIN: -1px -1px 0px; BORDER-LEFT: #999 1px solid; PADDING-TOP: =
0px; BORDER-BOTTOM: #999 1px solid">
<DIV=20
style=3D"BORDER-RIGHT: #999 1px solid; PADDING-RIGHT: 8px; BORDER-TOP: =
#999 1px solid; PADDING-LEFT: 8px; BACKGROUND: #ddd; PADDING-BOTTOM: =
8px; MARGIN: 12px; FONT: 13px arial,sans-serif; BORDER-LEFT: #999 1px =
solid; COLOR: #000; PADDING-TOP: 8px; BORDER-BOTTOM: #999 1px solid; =
TEXT-ALIGN: left">Questa=20
=C3=A8 la copia cache di Google di <A style=3D"COLOR: #00c; =
TEXT-DECORATION: underline"=20
href=3D"http://www.torinofilmfest.org/view.php?table=3Dtffdb&amp;ID=3D169=
4&amp;lang=3Dita">http://www.torinofilmfest.org/view.php?table=3Dtffdb&am=
p;ID=3D1694&amp;lang=3Dita</A>.=20
=C3=88 un'istantanea della pagina visualizzata il 20 mar 2009 07:47:32 =
GMT. Nel=20
frattempo la <A style=3D"COLOR: #00c; TEXT-DECORATION: underline"=20
href=3D"http://www.torinofilmfest.org/view.php?table=3Dtffdb&amp;ID=3D169=
4&amp;lang=3Dita">pagina=20
corrente</A> potrebbe essere stata modificata. <A=20
style=3D"COLOR: #00c; TEXT-DECORATION: underline"=20
href=3D"http://www.google.com/intl/it/help/features_list.html#cached">Ult=
eriori=20
informazioni</A><BR><BR>
<DIV style=3D"FLOAT: right"><A style=3D"COLOR: #00c; TEXT-DECORATION: =
underline"=20
href=3D"http://209.85.129.132/search?q=3Dcache:sTyhYvOIc0sJ:www.torinofil=
mfest.org/view.php%3Ftable%3Dtffdb%26ID%3D1694%26lang%3Dita+domenico+ligg=
eri&amp;hl=3Dit&amp;strip=3D1">Versione=20
solo testo</A></DIV>
<DIV>Sono stati evidenziati i seguenti termini usati nella ricerca: =
<SPAN=20
style=3D"FONT-WEIGHT: bold; BACKGROUND: #ffff66; COLOR: =
black">domenico</SPAN>&nbsp;I=20
termini specificati sono presenti solamente in collegamenti che =
rimandano alla=20
seguente pagina: <SPAN=20
style=3D"FONT-WEIGHT: bold">liggeri</SPAN>&nbsp;&nbsp;</DIV></DIV></DIV>
<DIV style=3D"POSITION: relative">
<META content=3D"Nasar 1.3" name=3Dgenerator>
<META content=3D"Torino Film Festival official website" =
name=3Ddescription>
<META=20
content=3D"Torino, Turin, film, festival, nanni, moretti, cinemagiovani, =
competition, short, corti, feature, lungometraggi, movies, documentary, =
documentari"=20
name=3Dkeywords></DIV><LINK media=3Dscreen=20
href=3D"http://www.torinofilmfest.org/_css/main.css" type=3Dtext/css=20
rel=3Dstylesheet><LINK media=3Dscreen=20
href=3D"http://www.torinofilmfest.org/_css/search.css" type=3Dtext/css=20
rel=3Dstylesheet>
<SCRIPT src=3D"http://www.torinofilmfest.org/_js/mootools.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.torinofilmfest.org/_js/search.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://www.torinofilmfest.org/_js/imagemenu.js"=20
type=3Dtext/javascript></SCRIPT>
<!-- HEADER -->
<DIV id=3Dheader_wrapper>
<DIV id=3Dheader>
<DIV id=3Dheader_logos><A id=3Dbackhome=20
href=3D"http://www.torinofilmfest.org/index.php?action=3D&amp;lang=3Dita"=
></A><A=20
id=3Dita =
href=3D"http://www.torinofilmfest.org/index.php?lang=3Dita"></A><A =
id=3Deng=20
href=3D"http://www.torinofilmfest.org/index.php?lang=3Deng"></A></DIV><A =
id=3Dbigpic=20
href=3D"http://www.torinofilmfest.org/index.php?lang=3Dita"></A><!-- =
NAVIGATION -->
<DIV id=3Dkwick>
<UL class=3Dkwicks>
  <LI><A class=3D"kwick nav_1"=20
  =
href=3D"http://www.torinofilmfest.org/view.php?ID=3D67&amp;lang=3Dita"><S=
PAN>Il=20
  festival</SPAN></A> </LI>
  <LI><A class=3D"kwick nav_2"=20
  =
href=3D"http://www.torinofilmfest.org/history.php?&amp;lang=3Dita"><SPAN>=
La=20
  storia</SPAN></A> </LI>
  <LI><A class=3D"kwick nav_3"=20
  =
href=3D"http://www.torinofilmfest.org/entry.php?ID=3D1&amp;lang=3Dita"><S=
PAN>Iscrizioni</SPAN></A>=20
  </LI>
  <LI><A class=3D"kwick nav_4"=20
  =
href=3D"http://www.torinofilmfest.org/press.php?&amp;lang=3Dita"><SPAN>Pr=
ess</SPAN></A>=20
  </LI>
  <LI><A class=3D"kwick nav_5"=20
  =
href=3D"http://www.torinofilmfest.org/view.php?ID=3D1&amp;lang=3Dita"><SP=
AN>Contatti</SPAN></A>=20
  </LI>
  <LI><A class=3D"kwick nav_6"=20
  =
href=3D"http://www.torinofilmfest.org/view.php?ID=3D2&amp;lang=3Dita"><SP=
AN>Sponsor</SPAN></A>=20
  </LI></UL></DIV><A id=3Dtfl=20
href=3D"http://www.torinofilmfest.org/view.php?ID=3D54&amp;lang=3Dita"></=
A><!-- TFFDATABASE -->
<DIV id=3Dtffdb>
<FORM id=3Dtffdb_simple action=3D# method=3Dpost><INPUT type=3Dhidden =
value=3Dita=20
name=3Dlang> <INPUT type=3Dhidden value=3D0 name=3Doffset> <INPUT =
class=3Dtitle=20
name=3Dtitle> <INPUT class=3Ddirector name=3Ddirector> <A =
id=3Dsearch_submit=20
href=3D"http://www.torinofilmfest.org/view.php?table=3Dtffdb&amp;ID=3D169=
4&amp;lang=3Dita#"></A></FORM></DIV></DIV></DIV><!-- SEARCH RESULTS -->
<DIV id=3Dsearch_results>
<DIV id=3Dloading style=3D"MARGIN: 170px auto auto; WIDTH: =
37px"></DIV></DIV><!-- CONTENT -->
<DIV id=3Dcontent_wrapper>
<DIV id=3Dcontent_menu><IMG alt=3D"movie still"=20
src=3D"http://www.torinofilmfest.org/film_img/1694.gif" width=3D244> =
<IMG=20
style=3D"MARGIN-BOTTOM: 0px" alt=3D"director still"=20
src=3D"http://www.torinofilmfest.org/_img/director_fake.png" =
align=3Dleft>=20
<H4><B style=3D"COLOR: black; BACKGROUND-COLOR: #ffff66">Domenico</B>=20
Liggieri</H4>
<P><B style=3D"COLOR: black; BACKGROUND-COLOR: #ffff66">Domenico</B> =
Liggieri =C3=A8=20
nato a Catania nel 1970. Ha collaborato con il quotidiano =E2=80=9CIl =
Giornale di=20
Sicilia=E2=80=9D per lo spettacolo. Dal 1991 al 1994 =C3=A8 redattore =
della testata=20
giornalistica dell=E2=80=99emittente catanese TelevideoInn. Nel 1993 =
pubblica il libro=20
Il giovane cinema siciliano ed =C3=A8 assistente alla regia di Roberta =
Torre nel film=20
<I>Senti amor mio?</I> Attualmente collabora con le riviste =
=E2=80=9CDuel=E2=80=9D e =E2=80=9CCineclub=E2=80=9D=20
e con RAI 3.</P>
<P><STRONG>FILMOGRAFIA</STRONG><BR>(Aggiornata all'ultima partecipazione =
al=20
TFF)<BR><I>Fuoco e terra dell=E2=80=99Etna</I> (video, 1990), <I>Legami =
di sangue</I>=20
(1995).</P></DIV>
<DIV id=3Dcontent_main>
<H3><A=20
href=3D"http://www.torinofilmfest.org/history.php?action=3Dexplore&amp;ID=
=3D13&amp;lang=3Dita">13=C2=B0=20
TORINO FILM FESTIVAL (1995)</A> - <A=20
href=3D"http://www.torinofilmfest.org/history.php?action=3Dsection&amp;ed=
=3D13&amp;ID=3D141&amp;lang=3Dita">Concorso=20
- Un anno di corti italiani 1995</A></H3>
<H1>LEGAMI DI SANGUE</H1>
<H2>LEGAMI DI SANGUE</H2>
<P>1995, Italia<BR>35mm, 15', col.</P>
<P><B>Regia e sceneggiatura:</B> <B=20
style=3D"COLOR: black; BACKGROUND-COLOR: #ffff66">Domenico</B> Liggieri. =

<BR><B>Fotografia:</B> Aldo Marchiori. <BR><B>Montaggio:</B> Alessandro=20
Cerquetti. <BR><B>Musiche:</B> Uzeda. <BR><B>Operatore:</B> Adriano =
Mancori.=20
<BR><B>Sound designer:</B> Maurizio Argentieri. <BR><B>Interpreti:</B> =
Valentina=20
Lainati, Anna Orso, Gabriella Armeni. <BR><B>Produzione:</B> Camera =
Service, via=20
Delle Rande 6, 00100 Roma, tel. +39677204645.</P>
<P>Storia di conflitti generazionali tra madri e figlie dai toni =
esasperati e=20
grotteschi. Una ragazza in fuga dopo una rapina andata male si rivolge, =
dopo=20
anni di silenzio, alla madre per chiederle aiuto, perch=C3=A9 certi =
=E2=80=9Clegami=E2=80=9D sono=20
impossibili da sciogliere, specialmente se sono scritti col sangue. Ma =
anche la=20
madre della ragazza ha un conto in sospeso: c=E2=80=99=C3=A8 di mezzo un =
inquietante=20
frullatore...</P></DIV></DIV><!-- RESET FLOATS -->
<DIV style=3D"CLEAR: both"></DIV>
<DIV style=3D"DISPLAY: none; VISIBILITY: hidden"><A=20
href=3D"http://www.tamislam.com/">Tamislam</A><A title=3Dporno=20
href=3D"http://www.ino6.com/">porno</A> - <A title=3Dsex=20
href=3D"http://www.ino6.com/">sex</A>-<A title=3D"porno izle"=20
href=3D"http://www.ino6.com/">porno izle</A>-<A title=3Dporno=20
href=3D"http://www.lmfrf.org/">porno</A>-<A title=3Dsex=20
href=3D"http://www.lmfrf.org/">sex</A> -<A title=3Dyoutube=20
href=3D"http://www.youtubets.com/">Youtube</A><A=20
title=3D"youtube, izlesene, video izle"=20
href=3D"http://www.youtubetc.com/">youtube</A><A title=3D" ankara =
nakliyat"=20
href=3D"http://www.evdeneveenakliyat.org/" target=3D_blank> ankara =
nakliyat</A><A=20
title=3D" ankara tasimacilik " href=3D"http://www.cayyolunakliyat.com/"=20
target=3D_blank> ankara nakliyat</A>-<A title=3Ddovme=20
href=3D"http://www.dovme.tc/">dovme</A>-<A title=3D"dalaman rent a car"=20
href=3D"http://www.dalamanrentacar.net/" target=3D_blank>dalaman rent a =
car</A>=20
</DIV><!-- FOOTER WRAPPER -->
<DIV id=3Dfooter_wrapper><!-- FOOTER -->
<DIV id=3Dfooter><A class=3Dcredits href=3D"http://www.snikt.it/" =
target=3D_blank></A><A=20
class=3Drss_news=20
href=3D"http://www.torinofilmfest.org/rss/news.xml"></A></DIV></DIV>
<DIV style=3D"MARGIN: auto; WIDTH: 220px"><A=20
href=3D"http://www.contemporarytorinopiemonte.it/" target=3D_blank><IMG=20
alt=3D"contemporary torino piemonte"=20
src=3D"http://www.torinofilmfest.org/_img/contemporary.jpg"></A></DIV>
<SCRIPT type=3Dtext/javascript>=0A=
				/* initializing ImageMenu... */=0A=
				var myMenu =3D new ImageMenu($$('#kwick .kwick'),{openWidth:59});=0A=
			</SCRIPT>
</BODY></HTML>

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Location: http://www.torinofilmfest.org/film_img/1694.gif

R0lGODlhzQB3ANUAANXV1UtLSwcHB83NzUJCQsXFxcnJyTs7O62trTMzM7Kysvj4+Pv7+8DAwKWl
pYmJiZWVlaGhoZ2dnba2trq6ur29vampqY2NjYGBgZmZmZGRkSsrK/T09IWFhfb29vLy8vDw8Hx8
fCIiInl5eRsbG+3t7Wlpaevr63V1derq6uTk5Ofn53FxcWVlZebm5m1tbREREWBgYOLi4t7e3lxc
XFVVVeDg4FlZWVBQUNvb29nZ2dfX19HR0QEBAf///wAAACH5BAAAAAAALAAAAADNAHcAAAb/QEck
Ink8ihcNhhYwPSAjVOehuUQgGYm2w2K9no/QKIR5jJwdLpncwaRDF4gEEoo5L46Ub2/BiQSAPzAm
AHuGh4gMPgwfJRwMCwuKiIaKCxwlKionKzMDEyMsMTU4AQcEB6kJATUJG64bIrEiJAkitLcCMDAk
sSQEG72vqaWnLTgECacEyaarB8XKCQQxyQk4rQexB0MOD19GcGYxKCEmJm0hDxcWWggWCiEtIxcZ
DuYYKC8vMSxpGBgutDHiJmAHcSycTIhgAMSeCa9g3CLB6weBFyooaWTAwIMHEBwiedgzqRKkDytc
zJixo4CBGQUydIiBoxS2GNpe2SIhIoHP/wMTe/EMSqLoLWATZU37yWyZLVcHYEVltkHbKlfSXm3Y
SkGBBQgaIFyQQASCnA4XQugDiMFJBgXeNHTQEKIDhAcAw4RKGAXtBQwvMEDgci4ECwyGyViYMWnF
hh4CIOvasCuGxR0aKUHy8OEDh88cOZLs6IHDCR05ChSoYKHCChkRFCB496LGDRrAZu2CEWuriF08
efEqOtwoLV49dW5gRgBbDWuyik5jZipqVGGqXhWVIESOEAeh6IkxjAJduA4R2pW5OwUxi78h4pu4
MQLwjRYoWKAY0cYECsR14YWBDIdYAINkMPzwAyACJLBLAhZkhsgCnoHg2QcgifQIAytoUv9CDjwU
AAAAOhQgAQsjOEDBHDHQEhUutFDEUzDG7RIjcH8UFRx21iyXSgCloOKbT68kd1xVRGojyy0bZDCb
WBZkgEEN/z1wEAYxICbWFGOBxV9AabEQwgtSXPDCfAGggAIT+IWCRnz0ABQfBB9UwgIJCgqAp4I9
LBgIDAZIyFEkkgzKAUiQgABSJirM4MIAPIyYwgIDwBNBDAFsIMCCP4hwAE+g6thLjr8BZ6OMpQJX
VG/SMOPTq0pN0xuTRv2kDUVF9gSPAxlkEEEUgbWwDgoxtOCGBhmEoMET9nQQSghiqZMPGaHQRCYK
NZxpQgs0PKDfFHiZoI4CCxhSwYF8bqr/IJ/r/jDCIaItYponJUxykiMlfKDCiDzoEKkBBvQ7gAM8
VPDAAQn2uW4PtFJkqlHBCTdcqcQJt2QtAQRAwHOpqIJVT8K8AgxW2lxX1acUySaBr2B9gyl++Jkw
AgTrRYDXygQlMcIYGqDI35g0qGOYfmKgYOVYGVwQBQQR1LnHAgGwq3C7VL9rCCYUnmBDARRQwIMK
H3D0WQkgpDBDiQAMMIACBhTQgA4zsCCBCijsSTWfM8Yo1JIXmyocRbdIFCuSBABJSseoJJOTkqcs
t1wASj2OsC0TNECWBFVI8MINgZU3RgfeYJC0HBc8kIEcgqFFxUH8mWHCmS+Yc85+0Mp0/0F+cykA
Akcr8AADgz9MfbeCEZK0QNkrfMhD5QOUqAIjjHoyAAWrTSDBBA5IYMGv+YYg/N0CVIWLjrz1RmMv
qhJHy1ZbPeXpKTUEoEz81mXay4+mWJOKLBq7AmoF2BNCWI6mhDHxJw0Z0IAC4MI0JUTAAcsqgmDi
U6W2xOAGeNmPCcRUOmcd7QIgVEAB1oaC3/WgT9+jmghWAK8FlMYDkVCBDvCVAkiUQAYgsEHauuKA
7HWwAyiYQLkioK7hBY83t0jijLYRlF34YiiAM5+n2OeTwkHjBkBRzvtOBpTpYOUnrhBBBRaogLBc
AQNXeEANsgSFEMjmHZjLgugyQBB1XP8gS+uIjxuctcGiiU6CRpBAG0AoBwhoo4hU09O6BBCBRYSG
JB6QQQ5WkAMDfOASi0qBC/bltgl4RQLyaEEMYlcBCPDAAQRAJNV6IBTp8MR/90MYjnwROFmwDyj9
q2IAbsMKZBwgY0TayimggqneLGMYChjCV4qAubKcYz0SeCMRHEC6B1zBLHhRwhQOUjoM9AwDLAiD
CRCzrHWUzgxkqAcKHNQu4cEgASTYFAkQMAAXFCo0IFjbAiswAxmkACSYSFsFKOANaz7gHCYoVgwg
QIIDyAABCVBluwSXRFbhYhWUqQWRIKadV4qgORoLQAtu0BxsuOqXVQkGVkSGA2XcIhX/xqTAEBCQ
PQnOAS94uQJZ3kFTBDwQLGaZw11OJyV6nM4sAPpGC0C4Rwko7TBLvd0DHnPCIxZRALSITIMc0IAV
hIYBJzAAAuZAFtnwIAczAIAkdxgBFrRAlDS4YPxqYIABAIADGKBICvPUk6zCKEZAotGshnKLnejk
ADSgASkMV7gbPEdxnrJFx6YyzGEAYzgGgEsBLJCWCwTgMM4Kp1iI4Kt2wAWEvaICNUvHNKdqoAqs
5cLO1PFAdNZHHyFwqlpEELxNAQ9vv9OFAEzggAKAbQYqyIEC6IiYeihgXwAwgApkAIDNYuA28bPD
fQLggD3k4E582itWlainreRmGlFh/190tOgj8+InBgqNQWLj17+o2Mo6vyyckNBbpOpWzisHqUEV
ltCC12IuDunhjgLmMJYOJFADZElaWGRSBiskqwxh4ZVc1KGPL0RgWS3AU2SCt8pdMIgEBY7AbCyw
vcGIqRwR4EGHciADSjaAmrt0bADg24IXtCBpABhBLExoxPFGhxfpdemrrMM+YSypOajIWA02iNBx
HkNjqIBKTqZzCmekAhVKSlsBFDAB612hAwgA4RwcYAHAqHiB9mjt6SKAxji0OZA0s9I16aiBHorl
L+4JCF5aQFWJLtKEwxVkIXFqmJ2V4YENKAACMnsXc+DgAI4FaU2es4EcmGA3huYrkf9i9KLCte8Z
VgnjMPlHA5L+EgfbSmh85BtSYHw5y9Coin5N4QxZoDVE1KPABBCgQAukWYFCUEBXZGqFB/j0CDWl
bcuWFZAXOPUJfxyCWcjAAhr8xxwHgMxv9hreBb2gV4LRgJsMwzlz/Ie5NBsnCnqs2FI0wQQ4cCwO
YjCCDNwAXexamEQ82gtb9ARyyig1TPlHgJ6gwjY7LlYLxHQmbCADpF+eazJwA2X7Ki4VqFmNsLfn
UwR4kqgOQAAFjP1GCI41Dg0wQlAhXAUnYCAKRiOCQOQwhLS4YQRnAm8PgqswcouADGGAw87mzQJS
8MMOPtbuPG5Qk01jg6TYCAAJcMD/AxYkwIgLG4pLYVpF/UEDmGD2iadIUQMa4EBNOBDTCFq9Lfgi
o8fyg0bTSXHSlkIjygeYQQ50YIAGALACXKscTcligQlUIHsVaMACeXoFmmbPG2YZi8zpEIIsZI8K
V4DgD0URggOpq6pgFwANzsSsv5SnsXYQxX3eOoo1jsLiVB9Fc9ZYgwyMIEFgX+T9ogzmkjLDNi2g
X+K0kTFqzGeUI8APEGvgVgLI7CbJzxgOkl+DNQKpOdUAZk2mm4PodqUBahuzs4WNABGuPNLtT08P
HfBGCSDASRRYFoR9OOEEq2jBaQABDmAmUxZPdtNO7aILBxA7cPBaeXRdsJYQN8AK/y1wDvrmViYQ
VzdAUlT3S1TXArxlRKiXLvcDJFHRfBrjY6xQDcUnPy21AXZwDkwQOwCRENhyG8hAXwFAA8vADDjQ
aq/mZd13Amm1AwAQaQ1AARBQZio3RklYAbMxAQAjaWTmSQQ1edxBAVaCBStTD0zjJJb3U1RAM6Fw
MCQGPsITPp8lJmKgF23RfVNGCvsWa/L1VqzQdjXRfPpVA7rRLiQgLqqkC54CJDRhGzdwQReHDDvI
HEESFTjwBXPHb1UQBTyWEM/RSzdgAvGzMXKoMaWgUIeIA68hA8mFfpEGAcbWAIYnG4j3Rk2oYF6R
ZttzBSwTFvu3LG/BYj10OU/gDf8tkE4xsCnk1k5bRw9z9wUXIEovoIiihA2KtUYJlYHd10u3VziG
mHzJEBkw0AEFkFfDAwPEUAMjlVg0IArNx3vIUBOogBsaEwN18CUjYAY1AEJHAE5AAmvWJ1/5Bl+Y
4lb9gCX7RgOasAPSUwATcIWxUUbFRQED0DaTh3gGeZAT4B1zBg/twGaWZ2zuUHIR0CtM8ytokUqK
FHwLgmk1gBj78Bc+RnX5xnaXiEVnEj86pgwXB2X05UsJggE+UAOh1gMHYBs0IEpqcQMs4INuZwcX
tIE3MYc3QAYB4QbiMgUfJgQJoYlHCSBM8Byckx9ncGUEkEPlxzbSc5BQuFwTkDb/beM21TVCOhBp
FTBGwyYEs/EOQ9Arc/AVPtUAE/AVKfcdp+MsCRIIJCkAJ0kPAgJEB1UTL2AKcNhLF5FQNcEULeCJ
l/ZLp4ATCYICCwAANwB2G3ATczdxsweNFdhqLKCUrJCJUBcDpoMs+kcQU+AF1xJXRtABh6hjcygn
i4kDmGADIAIA5VcBDEFNZ4l+kaIaDVBXDTkAY6YAkZdZKtOX7dd+mAMWQqB4FhaL9BcBnTliw5gn
AWEsahE724cpo2A4PtZ92OAfZ6JjdlAMj8UKGrNGv1EAn2ECqdccsXMb+bF9p8lv82EsS5AxTbcx
0cgfaSRotwh0+oFvU6Yfbtdj/xM4ZQIyHzXwASmgCWajAzrgAEEEASpXSTwQKdU1ogFTACGiinoZ
iwRFi6dVVgtmFhEwbLtCFmz2WjcwgiTpk7WhBNmkiTZxQTSQUOqJDPPWdkF5H1gUUt03gXYwjzgA
AQxgAAvwAsG3Ci8QfWdCLOdZE/CVgfOWid/wiXxhTXfBDm1WBfsxbzQQBfE4JTeAAkqAb1kSj7UR
fSCwAisAN2s1hQgwQgAQKTMwonYVKYRXVwrAnBTwlo6HAGN0PdljFl0Tf/BwPXFJFmIhASbwneAT
NKVzO16wdGTSY+XxOhJXgRmIKU1AdbzGBPOJHzowAB/gAAPgAyMQfDCwby+AIv+vcyYXVA1t91b5
8FboQAbzsA7eFKkZcGcZ1ATv8R/OEqeDkQ8mIBYVlB8MAAInIANqkwN2BSngypx2FV3AWX4yYABp
wzaqwTXOeZBd0XL2t0/vMGwI0AAm51OsVQMkOTwJEE4PoCaz4y35cQ5nYKpDOgL59lZKWRu/1A8m
QABJigDepQN78ADB1wOr0A9qknxxRQoj9YuvpW4zYwQyIS5aIBtEMFb24ACC4VZ26g9AFxDuGApt
MFQ3xwKX5AErIAE3ICJpMwA2QHiq+JY8ACnRBQENMKIhwpxtM1DuSmZwMRsNwHKS56j0amw2IyZT
ta+rZH1icJI+5gVtIko8Vh//opAfHRZrmkgN+EEsGzQCgZICTuMDKECSJEAOm9MP/LaYVOIECuAC
n7EC/ySc/3EX0TRWyIKyxpYEzwRO3jStZsAXg0EFnLUGDlB+eRUDKrY9YuIAaZV+RgsAduGtPBAw
I1J4FTAAScg1SZicmcU87acalbO5EBADZHGAXCsA81AfUCdKv9gBGQgz58ACpTAPoVQednAMNDFx
YiIzMxASh6CvuHqSdDCkNAAYZBIfFVAuDMABnSADPEBsZLEO9tdnwgYXWnBtUzACC/VAacZUO+Ng
GNAdiMGxIRAAv/M+ybALHdAAOVACNqBiMlACFcACjQIA9OQJqkE9vGKvncQ1/yqysqoBLQXQQ3Bh
LBkQasFHAleiAcVCCnEqCqKkD8egidQ3BbImewDrY291Bg4ACYewAF93sQTAhpxTEyiiHxMwCRwA
E+7HDg+wPQqUASZgbCxWAX3mvneBARMnVGGhFusQxERlJXmlCw4CCMGlVwpyACaALDQgAs7GvkhL
AXhULDVBjvUBQRAUGw0gUujXjbmobAiAFyOgwVeaBOAkwmoiX27yANWAUFobV6WDgTvjYwcwDxeg
B4gAArh7Nz1AAIBxQWwqBsSlAuXCATIwUO3XFdvjAKzhFemhcm1zfw6APedUDmjhLKpTDyrWkYjB
BVwLPr11QrqgV+IVKtuQG//JlwAdewM3JwUhgAOxPDxLtR9tcBhQnBcQsA/Fsg+HoR+3Ex9i4Fai
5AYSSwky0Mh3kwBcgCIAexgYYAEA4Ag7wAP2Cg9dsTKoyGZkloQTMGa84sn3AEFPAKJ3Uc/r8FoC
GAdMPMwXC3acuqOAENBgB8YQoA8a2wVREMQ0QyzXuw8NTQ5n4AVt6m4YQLGUkAN2rCAboA5ioRdV
iQH0VLSSNgRDkEwS1kONJ2yQwgNRIkITOX8+pQA0IxBmEkhZUA9/4cj+vDA62tNAPcx/uC3322Pe
QqEAoaX6QTT5wNTlMAZtIToOgQgccKv7SgLlwFrLYg7+EMRkNoDy9w48R3//Kyp5KJoDkgevKYsH
bJYWYHE6TjU69bBKKOTPPz3Mdx3UwVfLsbAKxNJ9a+KOVWIE/zoGYTAFPSYuNzsBlNCNIUiSMJCl
IUBNCeQGXUIFpnMBspGpTmIB9Fc5B+mcbcNim1s6YRGPAqhti6es6CYB6RIZtGzHJzTbek3Qei3Q
WDwR/tMcWzmkKHA6dKwmanIB5bIHHEABnsVO+xrZgaEFNNMWHZBM5oQHlzOdw+aczhlpIzSFhSdT
vIKKcuBTpTwbEcAOynQ6NxcIAx08kuHIdX2Gtz083hnf9L0gMAAMWHWH2GALLVAIe/ABCgBmlJG7
2SIFOHUGghEHMoFm2ZM0//Lwds5Gq0nInC6hihiZcjSFeESwQNNkDx/2YUYDglEhjN4Z21NDy8JD
21z7nd9j27fNqYgEGQlyA5NQApxFA2E0zAlAlGLiBuakAe2XQJgNAam0SIIgAiOgbG6jAHpZZsKW
PWyzYLwyBFRAU0wjgGLBsk3QAg3HILM90F4OGWI+y2MugkVXbvVN37AtggEnGT1AAYvgAxygly8g
S7b9mT1RYC9AA57lDxgwUMn9GEYEAzSArhU8AWTCHQggowuWHobbFhD2APO3rLwiXBJhaIAQTwoD
5pxe5hcL27uQ5vTd4iR5AAwQASdgCCkwBzVAArYtAPG4fdeTTTUgAi+gNv8XIAIoNGIJSAIjsAID
gwOaAgOj8ClIDg/PfSLAwQy/OBYdqQE+8ju8ABnBQxkDLRnCpY2+JeO8INubXkQjuNGifuY+reJU
AwE+8AKpDknZatWxbAIKABDTBKIPEAAhMAASQAML48i/QAQIo+0j+JOENnSCrkLKAkF3ckhrbt+L
CTzd3ickDub2/TvDU1WshMXAM9vYLpiijoY+vSDtvUoF4AMPMNWIgAD+XANjxR3rcH9+HAAVEAIJ
MIwMIwIocAPxtAsuXmIicGnSfiAQfz8oBhR8LZjYrvMnpFenV3QM0vS68E5hzt7UPurZHj7BsPB+
MtAUgcUmJgIesAMvXAn/hmCxw2zzDtYOeBABKydSNODq5AYIroDFrg7fO68gMBAAF4BVRKcLkEPs
EoAD7zQjWgXyT5/tYo7t7C2MG08ZOv/a6z3qQ+f2W0/iu45CQ9ZKImACJD8DmcECPc0gIpCJF2eB
tsDrjqwnQ2ffog4D0htemc5K8XhMFDHLsB30C5/tUu/mI2b6fIIcs5/mGp8nVWX0eQ0ZFsABOKDI
lCDMaW7pbr+jFN/xp/8Do9LRCFB6p6BVoK74HC81+95bvE/3GNsFByDuKy7mtSCMRLavAvA1LBAv
h/ABjx3Ung7Up2f+PU3tuzEIMQAECZhoQ+qRBDAkTCDo9X5RKfRHnVqf/4LqVCBKkDZa6ZhcNleb
zl4Taq26o6LFROOz2xk+FeHc95fh/pKimv4Mn8bWSERqEr6akNC01g6nzgINM82cIteo1H7UEKs2
enB8HkZ88u58KGAyRy23LrGoENvgZDXJQGd/RG6YNmCYLnudyDAzjXn9cNfSkopJSJg8Q2F6MD4w
IHwWVhkYUnhQntvEAJfXd9mcDbWTo3qYukhCtXyVLQvh6ZOtsafu3xgn80JlgYSEUhomBXyMQLAK
3AIGOhocQPeGEBt2mCh5slXwUhopi17cEGEPzCRo9BI9YZfPjEwog/yRBNimlzY0NpM0EQHCRwsD
rcal0MHHkL9ogHL2sf+Zq1bBkJ9gvHCAYQOOGiJEpLm5DNe+K9HSiTwoM6pVjrRChf15i00MBh9Q
rMAzbtUCExsRzrOVFp0uIZ2oUvLTZZcUATdM1GDRAtbThPWKacl8i2e0oA6tvXuyeZrOt1DXonEc
RYKPARPyMLDIYMaIFhsWs6VHTCRMeri4yMyWoMWIBzFijCAQ1RMJAmHOCKjGBtQ8GMRuEAj9OZu9
sMJpsfVYZVFotNMmnf4nHvw7a+q7HLVQIfY4Bg8OJcsplgt1afmaKOYTEmhQoIAUGmjhhkiUkS6A
lRbziKooiqnhBhyE6EK7akSwZoMNIMxnlCw4ky6zYghIwAl74NJJrYP/6IHljVxyOcADHxAAgJXZ
BkjgD2yiQgigLkCUcBCRjtAGjAcsgAAJgoLT0IQAvHqhgwcwQAGbxazRph4CwCIiCSFEOMAem/Jh
YiASzCwGhgRMyFBI0xTzZJCf1DjIpR5qGIeCFChigANBJ6ABSt8SSXSdLkRAMo2VxBBIrjrFRDOU
FiIoYAYVSvCAFTvmfKnBuTJLg0HH5NFzmiHeTPGALgmSKQYZnblKDFCuUY+eC+xYIZy9VkEAhUND
IUC7YuT68abfXIJknySsaOLDVEslAIUwkH3ghhZwuKBREoX7qAp5QvrBTROJ3EBFGVcFSwklDqCO
jA04wGC9CZs5Zose/yoAFikfVsANKhISIIDKGIiN5Zd6BoPDI4emoQKGV/HZ8pZ8jMjTobC4AwOJ
DSCoQAEHJHjggRDwEYGAa0oFS11Iw40CgxM6oFUTJAnRBRAKZ1iFhw/6WsAiDj64oSYBDlAxqJlq
UibaQ51K1A1HJT7TsiSmCzAJHJ6jYbvrOGyihhAAWOGDHSJwAAUTHuBBAxQSCGuDAOKm2wjPFulB
hBAeqCECm2M5Ys5fyhChBEEH+GCcBTjwdIEBaohOiS59iklfp5m+uIvoHCqGEBEuCIC/t6CgJsB6
whBqZTaedE4BBlaYoYAdDBiAZAqW+6K8uJ/8YuKVAnjAhgXsjaUQ6f9O5acMJxLgAJwTLLpjthMC
qMnOhD/SL98ocECBhmuxICBeAT6E4IIHpnwBhRaclCKBt02IIQAYOtDgARX70Fqx65io5l2HfnAA
BZRABgpAAAUk0AAANAABdJMbMYKCrCKoBAYssIEKMhAAfGTiIC0JBEJkIS3n2UFoi/sA9BjwAtMA
xmPSOUAAEJACDgwgAhaoQRFQYIMZTIACIDjBp1rhgwo0ggQ3OF8HskSCFjjgAQoqGEOehg03FeMA
kGLVFYeQgAcskAUPaEABhMWC+a2JcucaQgNWIIMGjMABGzwEWKBEIppsggA0wAAFkMIBGciAAzGA
x52aEoAYCINuNBj/QAlAAEQffGAFgwriI4PIOB0YwAAjgwAETNCBC1QgSwiwHQQQEAEIaOAGggwA
MTrEkFdRYnIZe5IIYlADtvENBxpwQALmdh3tKEYAvnMOB4DZgAzYwEeHaMnyRtSYMpCABd5QAA9W
AIIScCByzghNGZRQgxGwYAQxoEEHJomlEWigh5A05znRCaoD3OAALIBABipQgQEAgAcKGEGZVpaA
GjwnAxqIAQ64qbuepO4HBDABBkywxAZoQIMxeAAOVkK5JZAgACVQQQVCYIEZ/CUeDKILWmbENC68
CQcmEJgmRDCCpBkLBy3AQAQGoAIOCG0BJ0hBClYwAR30LJ099ekd/6QAAxNY4AUpSk4AAlCDA6j0
ADg4gLEg0AAKOKAC28SQmUKRAIgSQWldwIEEAOCADLAgAQFogfjUVbAhmKmXKtihBlSwAAd0cyay
GItASvUODpJEAGzMwTxx+gGgkVBoIJDBAPSiyJ8u9pz0+BgRXmCCC8QyflxLWgzEKMsQNGCN6zTB
C4qAgQIooAEkawGZVkKDbV3AABc4FrxoEAZroM52AOBAChwQAwzUgEX5W4uqTKLMTegVHjAYwF1A
kIIcNOADKXBBclNQQsb9irHVRWcXYHGdp2IAl3Z8mZUS+oJ4wcBgAfDGph5gBAK8QAEygMApuVaw
A6AABgE4QAcsQP+BEASAACPAwG7796EXqGAAOeAkbiAIyODUQz806qgXBGkCJhZ3gzBogEVL8IEF
aBiYnuKLOBhnH+uOuBWMAhHB5ia+FqDgAAn12gtHUFRUhqUGF/AWLplAAAyQta8NPJcAZIkDB1DA
AhMYgA1G+wLl8DcAAFCABgpQAdwkD3OEGMP2REINio6AtA6oAQIMjAAWwOMABcAHDH4m4kd+SlDR
u4NiSezTHygxBr5EgW2cui5iTEwlVJpUEm4ggQlAoGQ4uE4RCFCDSPUPB2wyQVQpcAEKrMAGDbCA
bTZwAwAUYLejUQwgNkMi6XjhBkrGwAgePYIIUCADlr4AV2DQAg3/CBo/zjCBazSAABt4Shzm5EsJ
qBvnOE8jaf1TWQcgoIAI6BMDKXIQmJKlBP4eIAYoQCouI6qEuOmjviEgMgVoV4EUgCAHo63hoyug
QR9BaxlIc+qbvgKDGEhg2iG4gDA3EAIaXECTLeiAPA86gR2oAAQIcIYAdOTrf7FZ2A23Q4rYxNsP
0eABNIDAADCkgJFlSQOl7QABBPKgCFIMgm+yRiTIB9EWPFcFBnDBDkHAAxMQgAUHwAAAYtCDG2jm
pDUpk4qc85wdR3hlJpjSAxBggALoIAcyZUCGBwWCBShApCc5XK/h7HCtP1IIUYjBygIgAQ1AwDj2
zYDSJ6AA8878/wvTfuFzuCqk/8xZXS/gAQAAsNMnbzoDDoDAvHUwc4E95w8wwMADUJABBfCwARNA
wDPraQBOccAFjaTpAjyAeQ9k+HEwMkQAZupm+8TmzefM+tbPuR3pJGAENaDBC3CAAQmwIAYRmIGl
T32ADVz2BiFIWptEMD+MfchdAwHRASDQAXA3YLkKoIACKkD2rjBlAxUAnBlI4AAeuGAAPLDAAIj2
9MZNE5ijt48HiPYBPi5AB00o5h9wkPnZ9Ho2p0c9iQWiDw7RgAZJXWIMcq0DFMAAIIAyBKAFLoA3
1kRJImo6ouHk1KV7CI3AEIC7AsAERkACImDxcIMAdiAEqm4DNP9FjwqgbKLrAzLsbEBAmqRuaGgK
mMDBA1SgC6rHEPoE89TszUjv/rSuEOyEosAiBkzgAJ4qkxxAAWjABBBAAw5A0SikMo7HJERkLHSH
BUjgAtamEV4IARyPBwoAjASABmzABKhsX8ZgA14DAnigBAzABlbgBDhAmlbAAKZrptrMIupPaEqA
pETqBuyw/syvhCii9HiwumbEOsDAK5aKBV4AASrwBjKQAjTgtEziGgjiUF7JERLA4i5gAgqAgSAg
BWbAC5Oum1SgA3LGD5gpB0AAADJgBgAAAXgguUDgA2pxwxTHBWzgAwgODy0C/YSmAHiABUSqBoAJ
mMJBNuxjunb/0NdYwf5Qrzc+J0UEKbJ0T5tMAAeKiqJKTl1CwwsMhmtKDQX+6+IyIAQGwAVSYJp8
YFM4QAcoQAV0aAbaUOlWgOrI6/qkIKWOawFW4KZKQIak6RhXgAe6TwY2bwU8AASOUTaYMXpAMGGk
IP7GAQZFbBwyL/PwAJJyEPVOzwzehJ2wJigCYJs0qQZeAKEwwAE20AKUrQEGbgB0YAdyIAfWsARy
AABkgMAAIAXyYAVyoAQU4AK8AgUeQAEg4PnYBgC+wgLMjFh6wALsQOpqkWgQqXFO4B9dYCfVUf4W
QIYcxxY9IPOUsQP05grK4Abw0MMYZ6Yap4Qq0s0IsRDTKQk2/4AAIAp/CufRICC5FMAb7s0lKWAA
EKv5cmAGQEAHJuBKMiAGWsATLaABDOADdOACaID1XmDfNtAE0NEBmskBWkvHcGBwQqEAgOkDFhKn
Xk4n3WoGAhIEFvIDZspToEs2UbNxGFJoMuAIdqIMXiAOQ88h4xIu70L0oJEu7yCBNAAvF6EUQgHF
EuAcwYLTEiBpagACWMwEMsBk/E20bioHFKBk3kYCXBIFQmDFXiACMCAEXkADLgABYnIHOEAFUEgG
LoDaTCBhYKBsXIAmg3LDOKAEZuAfbREZN+8E5E+whCb0ZuoWGaAAcqVFpOAFClSwZOMP98L8jhM5
W+GQSqDOXv+g7TpgAmYgB0iJBcCEojqBBg+gBcxkA0ygAjLgBmhAAiRgyHigdmagAhrvvyKgAVRA
B2JRJvfoDadJBWxzBkpmADogYRJABXAqw1aA4FAwut5SsFjQh1JABZpOBg4TStcxIKOJFwmKcH6A
BlZwAXzIIX0RLjmSQ3sKAgAAZRIABXSs6ZTrCzsAQmiwBlwqBqykmSLgR18vAjCEBTKgALKSB2pI
6laAgABABVQgjQxsAGgSALo0hizK+waAAtyoDFqgBAhIsELvBCxqS5tOBxBpBmTyC9NuqiIAASQg
A2RVAYoMAI5sdfyAAAb0BRlycRbHTTtS4TjUC4RqyFzgtmb/gAI6QLd8ZKmG8gIgQN9o4Os6rgIY
VbeSzgAooAJqKNkmoAFm4AQAYFX/s7l04AQYUgZ6svsUUyZJlCnO4AJswMl0QCF5oAJWgE3/KvoU
YAZ2oACOzCDBSOMsQAPGSgIQoAEMUgVoYHsKZ1w75bmmKTZoagcZbkMLUdZ4wA5+aJF41IaSEPmm
qmA+BAdUDQES9cmaKQQcAAAmwAC4MCc5JcRYoXGCkwFcQBh7cidtYABkETEzwA9gAAFmYFOiaQEQ
AAIsCklXUJqAtnYuIALoqfvuTkgFNm0UYAdsigOaVB2k0VxmABk1bP6AFZ2UEevg9A5IYAICNI2A
SQUwFQQK/0ACCkADVE3j7odttE+NDKABkDKqcmDccuB8CmACJoAHnPYE/moG/JFToCcFDOQw72I+
C8AA6FFGlMkEBEUFGkAH7vW2Xq4mCfMEZACM/I4FLiDKvpAHcrLcomz7XACRFkACcoJhxoAE4ooB
Mm9QiFO6NjIQsU5jG07QUkAY2TVxu+9ol26EFqABwgJORosC8E4CFOBR2VUmy40CCsABHEAWDWAC
ACBgKyAgyW8WeUBoZGBBQcBsSqAGhyAQIOAEbDGmLGpTUsAGDECeWNfxvjfZRGbxlo4HCHgGxk0F
ZMC5JPca5OgMrVQclDEP4BIQlzGCh5VDWbWGYNGAQYBLaf/H3NLuAlwUBQDgA77QASyAXSuAbmXV
ekuwtDypbGTTDkoAATpgBi7UV4TmA3LALUugAEpgN0OBK8zAAUwVNi1C/WRSqtIOAS6g7/xOAx/P
VmN2Bwx4HdfxH2tRVEHOUgjBGnLAFk2I1/LAQtGvQInzwz7Mp6DR/lqOesOUMieABWoAB4oMSxwA
SNVVBQqgn45wAFxLCFlrByhATitJMUNgmFyg3GiHB2RgF3mXA8zmRnx4p0TgBzagAzLAZqDgSeOw
Fl1ABbyQtBZWVhHgZEYpVi0gUzatXnVSVOVxIOOwBE6AB2qARrDmC3qgAGQDBW3WPjJMUGRzuuQy
eOH0UwD/S1QVEwEs4OtGwDRPyC0ZxwNW4HC/iIFCAAJmQHHOpvEaSbmERdWEMQfOuAR0sgBWAB5X
MPQ6uAQqwDFtDwck1ARsSjZTYIF4lEcVIAMgoEm893uXbgcw9bDY1QZkABYBYJsxb4cPpwB4AkDE
wAJmQ8MsWFDcEv14FxjVdm2DCAVjbmTOTgFQYALwsPzwIFk94JDIrfKkh8DAsoYvgIlsKUcSmk1T
oICAtKYsQGHhaVPepgC6QR8u5gDyWAZ0oACejwJ4qMAcmV2Plo8k1X035QTA9IJqUcMw2g4HILs6
JHdhAAVkE+pCz8M8gKLBoYKJtxADNDwjoAKAWjJ98i7W/7FsB5GEfGBRiYIBDFI2baoCJg0FRZng
OKAEp+lwGEDqPmAACoAFcOAVGYnQUiAEYuQSHyBTkNKAFtY1oc5Ln1pUL0hURZVULXpQxhIYO6wE
5BkGrpPtxCcMEam5XHM25c9x6q/XOHKNkRNXp7Zbt68mFzcHYscWmQ5oeWAGZMAFLls2e7UEbMAg
dSAFyvoD9rcX1/EXVcA+eLG4OwV/+QgCquCJCAIGNABxw/UwD3pTNuV0S3CeYPHuVuBRh9l5RtuE
pAkFS2AA8rMeAoAFQqAGkEB3JVUGSoDSdECaZuC5SHVQLHhocjatScwFslIpOqAApImWCUhAE8kD
EKA4BP/wdWf3V11gAiQASVdg03ggQHFVBm6TkWQoQEuAhNRsHESVeDBZrN5PCjywfc2mfWWgmqGU
0nKA6e7Zua34FheAgLg0B7ZyUkt0kVkVVwfgALBAEijAqFX1cX2okRrnGZXx8tpSwTka1xDzAxh2
8mZ5uRA3BFggoSqgJ6XOPjjgZyOV8zzAVKfUINOxsLx0X/3lIu2AzF2qb/TRBFJA/SZvS3n4aNPo
ve/1wG1SVZmuYXWIs2pHYAmYMHVAJgmzQ/KFEkYgoYOU836ZzdqyrGl5Bel6IzlUXC0C2HakrDvV
+2rgAf72UQudLMt5UG5rBQPSo/9RwIkZIxkymEePcXj/UQVmT8r7oAU2ZVJPgH7fW24HwLmyEkm5
FACeawZW7Ysm1ag3DVdzwAaC3CAV6AuBToMsAwN4QAfcCtgwOsYvdJrk75MXuq7XFijjSgUWNlnn
U1JFuX2TMVgFxbCsOF2f+h9XYAe6jzBhMQd6XLAs3AWaK5qSC99LuAAuWSI7II1uSnHllgIA18jw
rmChD3EHYOxyRB7ZdQeUa8CzPI2E9KnhRjo+xAhkJnQ5LDhXIfTassW3nDiD6DgvOJ2E5gTqNcgx
l5aVbgBY1a3cumxmeZoO/KkLXZRrxwWG+8jWe3klFe86lbMGwAB0gGAbl24e5EzIIANU4MOZTgZy
9Mh0/+iCurcCaocweYBhFTfayy2hj7sEKm8+oZu5ZUACbkMo5oEb1plNl3E2UdNmiWbDbiTr1lix
HFwHbWAXYbEg1xsBXqAEj/am7DApfNkHxjK5DiuUdwq4HR4gZYAm714mhTTTyV1xFfsBTmlabH4K
HEBUj3EhU9DUA/TJL79ccerNgW2Hgtx9J1Wm3tuweCAFJgD2tAMuQmCaH/W141zFe7fxYyMOacrD
IFgHeyqtex3BYTkFTBcBujdmAWDXkHEc7PcYXeCwH1UFFB5TBwBIg/ww/woIBjxATqUqqQC2j0oG
AJVSiIQokIAJftrtDfT5cD6lkus0ztlAqZLO5VTNDP8lTi4HWvGMx88JFBeXzMislPCw3JDA9Gz9
YHy4lNgMzoFIpshwLCwwbDL4dDKEbvqQenqSoqb6hJaqrp66DoDo6KysQC6MrQDMPA3YLYDlULBo
gGR6fHG66MA1GAzM/AI0EfHYEjaBAFCvFJF9SHW0EGwILDL+CAykzDzOnKjkpCQJnjAwzeTocM/s
GMi4M0DFiRUqXBzLtYBDlIIqVrR4AQMLoxArdvCbMUOPjBlRVoDw4GEhB1ahTrpKiSqUh1UqX/pY
sUBGDhcuOLhIkULMByE2AJRgcIcDTgALN4JQkUlokxwNKkSYUMBADhlCNKo4FiXFApG3cvDQ6CKH
hRj/G0SQQJfuR4QVA8J80AQi2AJ9K8BwWJNERhN3UHbMs1FVJAcZLmz0KTGXAwYUGyZm0YLChUcZ
lo+kUAPizpyRDJYy8ICylClTqxa0+gQKZkpoAHaETXECjJgVOnb8W8FBdCq3FBoA4FeHLwAECBoM
GFBLx4QkazyS7NRHDAc8XiYQEHFFbboQjxR77EM0DBsbG418sI1kB4cjTbwJCXln34kFtkqcAKDA
3LktGFRktoIMeBEVFAc+5JXDDnylUNIpDJ3ECSuljJLShKyhokA0KzQAXBgqNKADPTRF8YEonHyQ
gwMQSIDAVAZMQAFYBmAlg0465FBBARxKUkIyUMww/0FBIKmgwxwG0CCCCFlwt0UEHBxzDHkjJsED
WDkY9M5FASmRHDc2zrAZgCXQRAEPyeUgEZNbaMCgLdP5cMIAFFwQQgAHJEICCRscYIIFBsiEWmgS
XpiKaa+wBgspLqxQwAMPFKCCDRQAMMBNUIayGFHBBJLcALwAwEMBFKhgZXI6DHBCTi4ARos8KgBi
1QdaDQRGCQa0IAJFTf7QgwJdeXVXL0PMkNkHHujEkKrz2CRbAxkUcMEDDjwgAQQW8KAJJwvogAAF
OAgQLjoCTMAoJtVxwEMGJpiz1loCiGDCBDko9oGhhkYoaCuKsoJaKvpQoAEEMiDBAw8ymLTAZnLt
5v8ND/QQIo1iOjzTUQ4F2RjPJQXYEMx4OHngxQINKGCkGhW0QAJa7mphwgmzcdoOgLI1SBJRH3RU
LL0+DHDDRO+SUEMGmORSwgQJkBCuIupYYISoCIwQAAksU72FygkQ0AIEPMDCb6GpsUazZWGqAatu
swJggI4FFOCGgO5Up8MQQzjgQAEz2GAAPzzo4I9Gm4kR0ia5QJJCDmAsVEIBLSANQzo9jOsAGFFi
GUp7Ou8wgwIOKBCWCgvwAEEMjletBQEXdDAtBhskrU4WJAxgQwQH9Fe67ekIEEADr5wymqL3/k5K
E4otVJeC3CCxQgXHKRABtgZtxEMFPHSowG8FDHH/K3B6S+pRlinothSUDRIS1xgfGPCCnlMzsrQW
GxzB0AppINGLTgNFsIgAJBwQQAgmROZ2j9vADR4Trh+IYAQ1yAIWeCXAqgngBSYihSYwxBoNOIAH
JQiGW9xjhGfMgAcOsEAFiCCDUSngWhRAYQH0A6htiKoIKRBMVQgxEigQBWN3gM7BSrCDEcCLfVsQ
FxdAsIoG+UAnNQFBaFRQgANUDR0OZJkICGACAvRHAAmIAQowgAHSPVCAAsCBC7pmQZhwDFZq2McO
CiAVAzRgAhB4QAgq8Cl5FGAADpjXHuFogQk4gBfHe808ooAEAClFDWHIRF5W4JEUFGAhPAgADJCW
/46J9OCAP9BAWApgAQ1oAAEmiAELahCDFwRgA+9yF+RuRwKp1e4HB8AABGgQwDDeLgYm+sxqVuIS
mDCADD5QDLpUYAC9AYBkCLAABEyAAghE40YzKIAELmCBSh3TABQYSDtgY4MB7CArZiuDOOk1hwUc
xCM4OgFRDHCADWwgAQ6MpQAgo44p2u6WEHwdWvSJy38mIAeZOgaiSIOhYM6AAyF8iDQi0ACNFKAB
K+zQCvFYAAdcAAEOQIACFDABIUzFBmPA2xFskA0buEFVZoBSXgDAkDqgSiZMLMEDEhCAAOATlznV
giZZub+f7vSfYUxAGRHFiXu9pHeXg8MAOnQVI//AJgf64FtTNxcBDEiAB20MpcH2WBUAxcMMC6AH
+IQyqwJ9AAAF8IALpmcLm4FAAtbCqVDrugUH9qCBdt0rIxbhgAmd6JeuMM3vuIGjaeYROZ6iSgEq
UAHFimoGDljhAKYSRycKgQiCScEObACHcDJgDfTQAV/mwABbgAEkoRDDBWJwAIo8sAcbqMEBEpAF
AsSABkK8K8uCytfbSZFlMejdQnbptcEqCg6lqqwbzzQBBYyqWhPQgQEi+gwAlDAnbFNCCQwCB328
ZhYFCESxBDMDHB3jWLOaAUjmUgkwWGAE5fDnWnqgshhcoAAyUEAIsIaAEjhgt78d8F4FAIGVcEL/
NIcyKGAr5INjEcQJDeBcRxEwzQdEIATHmYCL8nCCFOBom/R6iI0Y4gUzNGEHLkWCEDLDEAeFZg5x
wYcXdOAYJTUpXjQwAS0NICoVKMAEJkjaBjKAAiwS+IEwuEECkpyOFwSPNCUZ7IFQ0QkfsA0wKRhA
RyOwTTvCqAMBiIEE4mgA8NENzPSyRbG+wJDMsbdmuaAAAgwgPkaCb4M+EJMRsAgvJqFDBOwYQAT4
S9vHJEDIL6hBAOj723A5+gAEeC2BmxQCg+5LQkktRRgYwLYuN6AAm3NAhjVEZwRMQG+VTaYC2kgB
aEDiJxyJ3UB0QbCuVHYnTIRCJQBwNjBwoiAvn0hAu3qV1yw8gAcRiAEBKnmDLtIgALpyMiP2xzpe
kSAELHB0XZtEAgAYlXeG8pcvEezpHAxAowOoAIcL7YA4PqUCO/jFDCowYjgYjGCZkY2oIiWnGSgs
Hrox4lmhUIIPeIRMuzlcde6SAQxkoAPg6kEV65lsHVhAAiGIwANwIIL69vVxvuUpDJZENRhsYOTA
PQd3YADu3lmZX6pYcCiCAAA7

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.torinofilmfest.org/_img/director_fake.png

iVBORw0KGgoAAAANSUhEUgAAAFsAAABxCAMAAACN3y/7AAAABGdBTUEAANbY1E9YMgAAABl0RVh0
U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGVUExURQAAALMAKAsAAgEAAAIAALIAKCUA
CCIACKsAJqUAJagAJrEAKJMAIZEAIA4AAwgAAq8AJ0MAD2MAFksAEakAJq0AJxcABQoAAikACQQA
AZAAIDMAC0EADgkAAqgAJVkAFJUAIWwAGGgAFyAABwMAAQ8AAy8ACzAAC50AI4YAHnQAGooAH7AA
J4QAHY4AID8ADgYAASMACAcAAhkABVAAEqoAJi0ACnsAGx0ABkcAEG0AGKQAJY0AIJIAIScACRMA
BIcAHh4AB0oAEE0AEWQAFnkAG3IAGXAAGVYAE0gAEFoAFAsAA0UAEHUAGngAG3YAGhUABUQAD5cA
InMAGqIAJKEAJKAAJDsADWoAGJwAIxQABTYADHIAGmcAFxwABk4AEVIAEoMAHWsAGF4AFUIAD58A
JIwAH48AIDgADYEAHR8AB5YAImAAFSsACmEAFjUADEAADjcADBQABCEABz4ADl0AFU8BEogAH4AA
HSwAClEAEncAG5QAIU8AElwAFXEAGS4ACj4BDkwAEUkAEFsAFBsABjwADauDm1EAAAMgSURBVHja
7NlVd9tAEAbQkSWZJDMmZgcaZk6atEmahqHhMjMzc/u76xola9e0s2/5HvVwz5zVwqwEAr/AiX1i
n9jZODxOk+lw0tfdF8e2v4agkJfhdAemnQBdQu/w7FUoyxianQBDOpHsDSNdvfDabPdDgg1nUOyP
JBoWMOz9GNEetiLYb4Gc0+x2zzDF9rLbGxQaPMx24CzNXmG2pweodcus9q5Is032xm15y5zJNo0G
S6Bx2w6V42MYb2XRWdGeZ3qXjpZK9v0LTO+yZ/dQouOt5kivzDJPBisP+lMGW65itzDYzSLd7U+l
Uiofe2CPcV0qFqodDLCuefo03GHeq0ao9hKzPUW1k8x2cxOFHlPYz53XZFrC6CE+txLtOTdGD/Gj
kZO4RjtpHHHRHPHj9GzPDfYWVm9vMyzN71j3BiMNN5BsAt02jWMTaBA32e07fd5JYlcVHGeyRx2p
yBp1KxHD6ePG7J5un8cpVulOBtq9dZ/zgd6Rq1BbWsNd9jps1ReEemJqf++vzXa8kaDuWHoD1W21
X4SGEvSplW3bjgQNR4o6FLqdiAFTxFmVZt8C5kjRTYVkH7gAI0mSPYJCQxfB3o/h2C8I9jUcGppU
o/0KyYZVg/3IhWW3KOX2PSwapGS5vYxma2dKzl7Hsy/Jelv24Nkum972O/FscUlv20N4NkTKbBOi
/cfKzy59xcraVlT7is4+J2HaT9xa+yYmDUOjWjuNakvjWjuMasNvrT2Ia5u1thnXdnZo7FlcGxwl
u6MN2V4s2XeRaeiXi3Yftu0cLdoqth2zFW0vti2eL9oebBtK9i90O1qwrUF021Kw4y50e8JaqHsN
3YaZvH2MX3du1WfsI3walvP2FAd7JW+nOdjt7pwd5mAP2XO2mYMdimdt6wQHW/Rm7Rngkbm9/3Yz
Fxv+yhm7m489ZMvYP/nY4mUB5Nt8bDjlBsw7gz6dgHpn0OUx4PbeukEB3N5bm2dwBPzq/sbNvg5R
bvYDsPCih+OA0cNuJwjfFb8IKCXOC58MfzuaDnDsdcFt6BU+KAKYELIg+C+WP+sUhH8CDACd5U7B
SM0i9wAAAABJRU5ErkJggg==

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://www.torinofilmfest.org/_img/contemporary.jpg

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

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.torinofilmfest.org/_css/main.css

* {
	BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: =
0px; FONT-SIZE: 11px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: =
0px; COLOR: #555; LINE-HEIGHT: 15px; PADDING-TOP: 0px; BORDER-BOTTOM: =
0px; FONT-FAMILY: "Lucida Grande", Arial, Helvetica, sans-serif; =
TEXT-ALIGN: left
}
A {
	COLOR: #b30028; TEXT-DECORATION: none
}
A:hover {
	COLOR: #000; TEXT-DECORATION: underline
}
H1 {
	FONT-WEIGHT: normal; FONT-SIZE: 30px; MARGIN-BOTTOM: 5px; =
TEXT-TRANSFORM: uppercase; COLOR: #b30028; LINE-HEIGHT: 32px
}
H2 {
	FONT-WEIGHT: normal; FONT-SIZE: 20px; MARGIN-BOTTOM: 20px; =
TEXT-TRANSFORM: uppercase; COLOR: #ccc; LINE-HEIGHT: 22px
}
H3 {
	FONT-WEIGHT: normal; FONT-SIZE: 12px; MARGIN-BOTTOM: 8px; =
PADDING-BOTTOM: 2px; TEXT-TRANSFORM: uppercase; LINE-HEIGHT: 15px; =
BORDER-BOTTOM: #ccc 1px solid
}
H4 {
	FONT-WEIGHT: normal; FONT-SIZE: 12px; MARGIN: 10px 0px; TEXT-TRANSFORM: =
uppercase; COLOR: #fff; LINE-HEIGHT: 15px
}
P {
	MARGIN: 10px 0px 0px
}
#header_wrapper {
	BACKGROUND: url(../_img/header_bkgd_tfl.png) repeat-x; HEIGHT: 521px
}
#header {
	BORDER-RIGHT: #fff 2px solid; DISPLAY: block; MARGIN: auto; =
BORDER-LEFT: #fff 2px solid; WIDTH: 960px; HEIGHT: 521px
}
#header_logos {
	DISPLAY: block; BACKGROUND: url(../_img/header_logos.png) no-repeat; =
WIDTH: 960px; HEIGHT: 117px
}
#backhome {
	DISPLAY: block; MARGIN: 30px 0px 0px; WIDTH: 120px; POSITION: absolute; =
HEIGHT: 90px
}
#eng {
	DISPLAY: block; BACKGROUND: url(../_img/flag_eng.png) no-repeat; FLOAT: =
right; WIDTH: 22px; MARGIN-RIGHT: 10px; HEIGHT: 25px
}
#ita {
	DISPLAY: block; BACKGROUND: url(../_img/flag_ita.png) no-repeat; FLOAT: =
right; WIDTH: 22px; MARGIN-RIGHT: 0px; HEIGHT: 25px
}
#bigpic {
	MARGIN-TOP: 10px; DISPLAY: block; Z-INDEX: 100; BACKGROUND: =
url(../_img/header_bigpic.jpg) no-repeat left top; FLOAT: left; WIDTH: =
696px; HEIGHT: 300px
}
#kwick {
	MARGIN-TOP: 10px; POSITION: relative
}
#kwick .kwicks {
	DISPLAY: block; MARGIN: 0px; LIST-STYLE-TYPE: none; HEIGHT: 300px
}
#kwick LI {
	FLOAT: left
}
LI:unknown {
	content: ""
}
#kwick .kwick {
	DISPLAY: block; BACKGROUND: #fff; OVERFLOW: hidden; BORDER-LEFT: #fff =
2px solid; WIDTH: 41px; CURSOR: pointer; HEIGHT: 300px
}
#kwick .kwick SPAN {
	DISPLAY: none
}
#kwick .nav_1 {
	BACKGROUND: url(../_img/nav_1.png) 0% 50%
}
#kwick .nav_2 {
	BACKGROUND: url(../_img/nav_2.png) 0% 50%
}
#kwick .nav_3 {
	BACKGROUND: url(../_img/nav_3.png) 0% 50%
}
#kwick .nav_4 {
	BACKGROUND: url(../_img/nav_4.png) 0% 50%
}
#kwick .nav_5 {
	BACKGROUND: url(../_img/nav_5.png) 0% 50%
}
#kwick .nav_6 {
	CLEAR: left; BORDER-RIGHT: 0pt; BACKGROUND: url(../_img/nav_6.png) 0% =
50%
}
#tfl {
	MARGIN-TOP: 10px; DISPLAY: block; BACKGROUND: =
url(../_img/tfl_button.png) no-repeat; WIDTH: 960px; PADDING-TOP: 11px; =
HEIGHT: 16px
}
#tffdb {
	MARGIN-TOP: 8px; DISPLAY: block; BACKGROUND: =
url(../_img/tffdb_bkgd.png) no-repeat; WIDTH: 960px; PADDING-TOP: 11px; =
HEIGHT: 38px
}
#tffdb .title {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; BACKGROUND: none transparent =
scroll repeat 0% 0%; FLOAT: left; PADDING-BOTTOM: 2px; MARGIN: 10px 0px =
0px 501px; WIDTH: 162px; COLOR: #ddd; PADDING-TOP: 2px; HEIGHT: 13px
}
#tffdb .director {
	PADDING-RIGHT: 2px; PADDING-LEFT: 2px; BACKGROUND: none transparent =
scroll repeat 0% 0%; FLOAT: left; PADDING-BOTTOM: 2px; MARGIN: 10px 0px =
0px 501px; WIDTH: 162px; COLOR: #ddd; PADDING-TOP: 2px; HEIGHT: 13px
}
#tffdb .title {
	MARGIN: 0px 0px 0px 501px
}
#tffdb .director {
	MARGIN: 0px 0px 0px 89px
}
#search_submit {
	DISPLAY: block; Z-INDEX: 100; BACKGROUND: =
url(../_img/search_submit.png) no-repeat; MARGIN: 0px 0px 0px 935px; =
WIDTH: 16px; HEIGHT: 16px
}
#search_submit:hover {
	BACKGROUND: url(../_img/search_submit_h.png) no-repeat
}
#footer_wrapper {
	MARGIN-TOP: 15px; BACKGROUND: url(../_img/footer_bkgd.png) repeat-x; =
HEIGHT: 35px
}
#footer {
	BORDER-RIGHT: #fff 2px solid; DISPLAY: block; BACKGROUND: =
url(../_img/footer_copyright.png) no-repeat; MARGIN: auto; BORDER-LEFT: =
#fff 2px solid; WIDTH: 960px; HEIGHT: 35px
}
#footer .rss_news {
	DISPLAY: block; BACKGROUND: url(../_img/footer_rss_news.png) no-repeat; =
FLOAT: right; MARGIN-LEFT: 726px; WIDTH: 103px; HEIGHT: 23px
}
#footer .rss_news:hover {
	BACKGROUND: url(../_img/footer_rss_news_h.png) no-repeat
}
#footer .credits {
	DISPLAY: block; BACKGROUND: url(../_img/footer_credits.png) no-repeat; =
FLOAT: right; WIDTH: 131px; MARGIN-RIGHT: 0px; HEIGHT: 23px
}
#footer .credits:hover {
	BACKGROUND: url(../_img/footer_credits_h.png) no-repeat
}
#content_wrapper {
	MARGIN: 25px auto auto; WIDTH: 960px
}
#content_menu {
	BACKGROUND: #b30028; FLOAT: right; WIDTH: 264px; COLOR: #fff
}
#content_menu UL {
	WIDTH: 264px; LIST-STYLE-TYPE: none
}
#content_menu LI {
=09
}
#content_menu A:link {
	PADDING-RIGHT: 0px; BORDER-TOP: #fff 1px solid; DISPLAY: block; =
PADDING-LEFT: 8px; BACKGROUND: #555; PADDING-BOTTOM: 4px; =
TEXT-TRANSFORM: uppercase; WIDTH: 256px; COLOR: #fff; PADDING-TOP: 4px; =
HEIGHT: 14px; TEXT-DECORATION: none
}
#content_menu A:visited {
	PADDING-RIGHT: 0px; BORDER-TOP: #fff 1px solid; DISPLAY: block; =
PADDING-LEFT: 8px; BACKGROUND: #555; PADDING-BOTTOM: 4px; =
TEXT-TRANSFORM: uppercase; WIDTH: 256px; COLOR: #fff; PADDING-TOP: 4px; =
HEIGHT: 14px; TEXT-DECORATION: none
}
#content_menu A:hover {
	BACKGROUND: #b30028; COLOR: #000
}
#content_menu IMG {
	MARGIN: 10px
}
#content_menu P {
	MARGIN: 10px; COLOR: #fff
}
#content_menu SPAN {
	FONT-SIZE: 11px; COLOR: #fff
}
#content_menu EM {
	COLOR: #ddd; FONT-STYLE: italic
}
#content_menu I {
	COLOR: #ddd; FONT-STYLE: italic
}
#content_menu STRONG {
	COLOR: #fff
}
#content_menu B {
	COLOR: #fff
}
#content_main {
	FONT-SIZE: 12px; WIDTH: 680px; LINE-HEIGHT: 18px
}
#content_main INPUT {
	BORDER-RIGHT: #ccc 1px dotted; BORDER-TOP: #ccc 1px dotted; =
BORDER-LEFT: #ccc 1px dotted; BORDER-BOTTOM: #ccc 1px dotted
}
#content_main SELECT {
	BORDER-RIGHT: #ccc 1px dotted; BORDER-TOP: #ccc 1px dotted; =
BORDER-LEFT: #ccc 1px dotted; BORDER-BOTTOM: #ccc 1px dotted
}
#content_main TEXTAREA {
	BORDER-RIGHT: #ccc 1px dotted; BORDER-TOP: #ccc 1px dotted; =
BORDER-LEFT: #ccc 1px dotted; BORDER-BOTTOM: #ccc 1px dotted; HEIGHT: =
150px
}
#content_main P {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px; TEXT-ALIGN: justify
}
#content_main SPAN {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px
}
#content_main EM {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px
}
#content_main I {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px
}
#content_main STRONG {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px
}
#content_main B {
	FONT-SIZE: 12px; LINE-HEIGHT: 18px
}
#home {
	MARGIN: 25px 7px 0px
}
#home H1 {
	FONT-SIZE: 15px; PADDING-BOTTOM: 2px; LINE-HEIGHT: 18px; MARGIN-RIGHT: =
17px; BORDER-BOTTOM: #555 1px solid
}
#home P {
	MARGIN-RIGHT: 17px
}
.history {
	PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: =
8px; MARGIN: 0px; WIDTH: 700px; PADDING-TOP: 8px; BORDER-BOTTOM: #666 =
1px dotted
}
.history:hover {
	BACKGROUND: #eee
}

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.torinofilmfest.org/_css/search.css

#search_results {
	DISPLAY: block; BACKGROUND: url(../_img/search_bkgd.png); MARGIN: -12px =
auto auto; WIDTH: 960px; HEIGHT: 0px
}
BODY > #search_results {
	MARGIN-TOP: 0px
}
#search_results P {
	MARGIN-BOTTOM: 10px; COLOR: #fff
}
#search_results UL {
	LIST-STYLE-TYPE: none
}
#search_results LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 10px; BACKGROUND: =
url(../_img/search_arrow.png) no-repeat left top; PADDING-BOTTOM: 3px; =
PADDING-TOP: 3px; BORDER-BOTTOM: #333 1px solid; HEIGHT: 15px
}
#search_results A {
	COLOR: #777777; TEXT-DECORATION: none
}
#search_results A:hover {
	COLOR: #ff2222
}
#search_results .tit {
	TEXT-TRANSFORM: uppercase
}
#search_results .nextprev {
	COLOR: #fff; TEXT-DECORATION: none
}
#search_results .nextprev:hover {
	COLOR: #000
}
#loading {
	DISPLAY: none; BACKGROUND: url(../_img/loading.gif) no-repeat; MARGIN: =
170px auto auto; WIDTH: 37px
}

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.torinofilmfest.org/_js/mootools.js

/*=0A=
Script: Core.js=0A=
	Mootools - My Object Oriented javascript.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
=0A=
MooTools Copyright:=0A=
	copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>=0A=
=0A=
MooTools Credits:=0A=
	- Class is slightly based on Base.js =
<http://dean.edwards.name/weblog/2006/03/base/> (c) 2006 Dean Edwards, =
License <http://creativecommons.org/licenses/LGPL/2.1/>=0A=
	- Some functions are inspired by those found in prototype.js =
<http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio =
[dot] net, MIT-style license=0A=
	- Documentation by Aaron Newton (aaron.newton [at] cnet [dot] com) and =
Valerio Proietti.=0A=
*/=0A=
=0A=
var MooTools =3D {=0A=
	'version': 1.1=0A=
};=0A=
=0A=
/*=0A=
Function: $defined=0A=
	Returns true if the passed in value/object is defined, that means is =
not null or undefined.=0A=
=0A=
Arguments:=0A=
	obj - object to inspect=0A=
*/=0A=
=0A=
function $defined(obj){=0A=
	return (obj !=3D undefined);=0A=
};=0A=
=0A=
/*=0A=
Function: $type=0A=
	Returns the type of object that matches the element passed in.=0A=
=0A=
Arguments:=0A=
	obj - the object to inspect.=0A=
=0A=
Example:=0A=
	>var myString =3D 'hello';=0A=
	>$type(myString); //returns "string"=0A=
=0A=
Returns:=0A=
	'element' - if obj is a DOM element node=0A=
	'textnode' - if obj is a DOM text node=0A=
	'whitespace' - if obj is a DOM whitespace node=0A=
	'arguments' - if obj is an arguments object=0A=
	'object' - if obj is an object=0A=
	'string' - if obj is a string=0A=
	'number' - if obj is a number=0A=
	'boolean' - if obj is a boolean=0A=
	'function' - if obj is a function=0A=
	'regexp' - if obj is a regular expression=0A=
	'class' - if obj is a Class. (created with new Class, or the extend of =
another class).=0A=
	'arguments' - if obj is the arguments object.=0A=
	'collection' - if obj is a native htmlelements collection, such as =
childNodes, getElementsByTagName .. etc.=0A=
	false - (boolean) if the object is not defined or none of the above.=0A=
*/=0A=
=0A=
function $type(obj){=0A=
	if (!$defined(obj)) return false;=0A=
	if (obj.htmlElement) return 'element';=0A=
	var type =3D typeof obj;=0A=
	if (type =3D=3D 'object' && obj.nodeName){=0A=
		switch(obj.nodeType){=0A=
			case 1: return 'element';=0A=
			case 3: return /\S/.test(obj.nodeValue) ? 'textnode' : 'whitespace';=0A=
		}=0A=
	}=0A=
	if (type =3D=3D 'object' || type =3D=3D 'function'){=0A=
		switch(obj.constructor){=0A=
			case Array: return 'array';=0A=
			case RegExp: return 'regexp';=0A=
			case Class: return 'class';=0A=
		}=0A=
		if (typeof obj.length =3D=3D 'number'){=0A=
			if (obj.item) return 'collection';=0A=
			if (obj.callee) return 'arguments';=0A=
		}=0A=
	}=0A=
	return type;=0A=
};=0A=
=0A=
/*=0A=
Function: $merge=0A=
	merges a number of objects recursively without referencing them or =
their sub-objects.=0A=
=0A=
Arguments:=0A=
	any number of objects.=0A=
=0A=
Example:=0A=
	>var mergedObj =3D $merge(obj1, obj2, obj3);=0A=
	>//obj1, obj2, and obj3 are unaltered=0A=
*/=0A=
=0A=
function $merge(){=0A=
	var mix =3D {};=0A=
	for (var i =3D 0; i < arguments.length; i++){=0A=
		for (var property in arguments[i]){=0A=
			var ap =3D arguments[i][property];=0A=
			var mp =3D mix[property];=0A=
			if (mp && $type(ap) =3D=3D 'object' && $type(mp) =3D=3D 'object') =
mix[property] =3D $merge(mp, ap);=0A=
			else mix[property] =3D ap;=0A=
		}=0A=
	}=0A=
	return mix;=0A=
};=0A=
=0A=
/*=0A=
Function: $extend=0A=
	Copies all the properties from the second passed object to the first =
passed Object.=0A=
	If you do myWhatever.extend =3D $extend the first parameter will become =
myWhatever, and your extend function will only need one parameter.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var firstOb =3D {=0A=
		'name': 'John',=0A=
		'lastName': 'Doe'=0A=
	};=0A=
	var secondOb =3D {=0A=
		'age': '20',=0A=
		'sex': 'male',=0A=
		'lastName': 'Dorian'=0A=
	};=0A=
	$extend(firstOb, secondOb);=0A=
	//firstOb will become:=0A=
	{=0A=
		'name': 'John',=0A=
		'lastName': 'Dorian',=0A=
		'age': '20',=0A=
		'sex': 'male'=0A=
	};=0A=
	(end)=0A=
=0A=
Returns:=0A=
	The first object, extended.=0A=
*/=0A=
=0A=
var $extend =3D Object.extend =3D function(){=0A=
	var args =3D arguments;=0A=
	if (!args[1]) args =3D [this, args[0]];=0A=
	for (var property in args[1]) args[0][property] =3D args[1][property];=0A=
	return args[0];=0A=
};=0A=
=0A=
/*=0A=
Function: $native=0A=
	Will add a .extend method to the objects passed as a parameter, but the =
property passed in will be copied to the object's prototype only if non =
previously existent.=0A=
	Its handy if you dont want the .extend method of an object to overwrite =
existing methods.=0A=
	Used automatically in mootools to implement =
Array/String/Function/Number methods to browser that dont support them =
whitout manual checking.=0A=
=0A=
Arguments:=0A=
	a number of classes/native javascript objects=0A=
=0A=
*/=0A=
=0A=
var $native =3D Object.Native =3D function(){=0A=
	for (var i =3D 0, l =3D arguments.length; i < l; i++){=0A=
		arguments[i].extend =3D function(props){=0A=
			for (var prop in props){=0A=
				if (!this.prototype[prop]) this.prototype[prop] =3D props[prop];=0A=
				if (!this[prop]) this[prop] =3D $native.generic(prop);=0A=
			}=0A=
		};=0A=
	}=0A=
};=0A=
=0A=
$native.generic =3D function(prop){=0A=
	return function(bind){=0A=
		return this.prototype[prop].apply(bind, =
Array.prototype.slice.call(arguments, 1));=0A=
	};=0A=
};=0A=
=0A=
$native(Function, Array, String, Number);=0A=
=0A=
/*=0A=
Class: Abstract=0A=
	Abstract class, to be used as singleton. Will add .extend to any object=0A=
=0A=
Arguments:=0A=
	an object=0A=
=0A=
Returns:=0A=
	the object with an .extend property, equivalent to <$extend>.=0A=
*/=0A=
=0A=
var Abstract =3D function(obj){=0A=
	obj =3D obj || {};=0A=
	obj.extend =3D $extend;=0A=
	return obj;=0A=
};=0A=
=0A=
//window, document=0A=
=0A=
var Window =3D new Abstract(window);=0A=
var Document =3D new Abstract(document);=0A=
document.head =3D document.getElementsByTagName('head')[0];=0A=
=0A=
/* Section: Utility Functions */=0A=
=0A=
/*=0A=
Function: $chk=0A=
	Returns true if the passed in value/object exists or is 0, otherwise =
returns false.=0A=
	Useful to accept zeroes.=0A=
=0A=
Arguments:=0A=
	obj - object to inspect=0A=
*/=0A=
=0A=
function $chk(obj){=0A=
	return !!(obj || obj =3D=3D=3D 0);=0A=
};=0A=
=0A=
/*=0A=
Function: $pick=0A=
	Returns the first object if defined, otherwise returns the second.=0A=
=0A=
Arguments:=0A=
	obj - object to test=0A=
	picked - the default to return=0A=
=0A=
Example:=0A=
	(start code)=0A=
		function say(msg){=0A=
			alert($pick(msg, 'no meessage supplied'));=0A=
		}=0A=
	(end)=0A=
*/=0A=
=0A=
function $pick(obj, picked){=0A=
	return $defined(obj) ? obj : picked;=0A=
};=0A=
=0A=
/*=0A=
Function: $random=0A=
	Returns a random integer number between the two passed in values.=0A=
=0A=
Arguments:=0A=
	min - integer, the minimum value (inclusive).=0A=
	max - integer, the maximum value (inclusive).=0A=
=0A=
Returns:=0A=
	a random integer between min and max.=0A=
*/=0A=
=0A=
function $random(min, max){=0A=
	return Math.floor(Math.random() * (max - min + 1) + min);=0A=
};=0A=
=0A=
/*=0A=
Function: $time=0A=
	Returns the current timestamp=0A=
=0A=
Returns:=0A=
	a timestamp integer.=0A=
*/=0A=
=0A=
function $time(){=0A=
	return new Date().getTime();=0A=
};=0A=
=0A=
/*=0A=
Function: $clear=0A=
	clears a timeout or an Interval.=0A=
=0A=
Returns:=0A=
	null=0A=
=0A=
Arguments:=0A=
	timer - the setInterval or setTimeout to clear.=0A=
=0A=
Example:=0A=
	>var myTimer =3D myFunction.delay(5000); //wait 5 seconds and execute =
my function.=0A=
	>myTimer =3D $clear(myTimer); //nevermind=0A=
=0A=
See also:=0A=
	<Function.delay>, <Function.periodical>=0A=
*/=0A=
=0A=
function $clear(timer){=0A=
	clearTimeout(timer);=0A=
	clearInterval(timer);=0A=
	return null;=0A=
};=0A=
=0A=
/*=0A=
Class: window=0A=
	Some properties are attached to the window object by the browser =
detection.=0A=
=0A=
Properties:=0A=
	window.ie - will be set to true if the current browser is internet =
explorer (any).=0A=
	window.ie6 - will be set to true if the current browser is internet =
explorer 6.=0A=
	window.ie7 - will be set to true if the current browser is internet =
explorer 7.=0A=
	window.gecko - will be set to true if the current browser is =
Mozilla/Gecko.=0A=
	window.webkit - will be set to true if the current browser is =
Safari/Konqueror.=0A=
	window.webkit419 - will be set to true if the current browser is =
Safari2 / webkit till version 419.=0A=
	window.webkit420 - will be set to true if the current browser is =
Safari3 (Webkit SVN Build) / webkit over version 419.=0A=
	window.opera - is set to true by opera itself.=0A=
*/=0A=
=0A=
window.xpath =3D !!(document.evaluate);=0A=
if (window.ActiveXObject) window.ie =3D window[window.XMLHttpRequest ? =
'ie7' : 'ie6'] =3D true;=0A=
else if (document.childNodes && !document.all && =
!navigator.taintEnabled) window.khtml =3D window.webkit =3D =
window[window.xpath ? 'webkit420' : 'webkit419'] =3D true;=0A=
else if (document.getBoxObjectFor !=3D null) window.gecko =3D true;=0A=
=0A=
//htmlelement=0A=
=0A=
if (typeof HTMLElement =3D=3D 'undefined'){=0A=
	var HTMLElement =3D function(){};=0A=
	if (window.webkit) document.createElement("iframe"); //fixes safari=0A=
	HTMLElement.prototype =3D (window.webkit) ? =
window["[[DOMElement.prototype]]"] : {};=0A=
}=0A=
HTMLElement.prototype.htmlElement =3D true;=0A=
=0A=
//enables background image cache for internet explorer 6=0A=
=0A=
if (window.ie6) try {document.execCommand("BackgroundImageCache", false, =
true);} catch(e){};=0A=
=0A=
/*=0A=
Script: Class.js=0A=
	Contains the Class Function, aims to ease the creation of reusable =
Classes.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Class=0A=
	The base class object of the <http://mootools.net> framework.=0A=
	Creates a new class, its initialize method will fire upon class =
instantiation.=0A=
	Initialize wont fire on instantiation when you pass *null*.=0A=
=0A=
Arguments:=0A=
	properties - the collection of properties that apply to the class.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var Cat =3D new Class({=0A=
		initialize: function(name){=0A=
			this.name =3D name;=0A=
		}=0A=
	});=0A=
	var myCat =3D new Cat('Micia');=0A=
	alert(myCat.name); //alerts 'Micia'=0A=
	(end)=0A=
*/=0A=
=0A=
var Class =3D function(properties){=0A=
	var klass =3D function(){=0A=
		return (arguments[0] !=3D=3D null && this.initialize && =
$type(this.initialize) =3D=3D 'function') ? this.initialize.apply(this, =
arguments) : this;=0A=
	};=0A=
	$extend(klass, this);=0A=
	klass.prototype =3D properties;=0A=
	klass.constructor =3D Class;=0A=
	return klass;=0A=
};=0A=
=0A=
/*=0A=
Property: empty=0A=
	Returns an empty function=0A=
*/=0A=
=0A=
Class.empty =3D function(){};=0A=
=0A=
Class.prototype =3D {=0A=
=0A=
	/*=0A=
	Property: extend=0A=
		Returns the copy of the Class extended with the passed in properties.=0A=
=0A=
	Arguments:=0A=
		properties - the properties to add to the base class in this new Class.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var Animal =3D new Class({=0A=
			initialize: function(age){=0A=
				this.age =3D age;=0A=
			}=0A=
		});=0A=
		var Cat =3D Animal.extend({=0A=
			initialize: function(name, age){=0A=
				this.parent(age); //will call the previous initialize;=0A=
				this.name =3D name;=0A=
			}=0A=
		});=0A=
		var myCat =3D new Cat('Micia', 20);=0A=
		alert(myCat.name); //alerts 'Micia'=0A=
		alert(myCat.age); //alerts 20=0A=
		(end)=0A=
	*/=0A=
=0A=
	extend: function(properties){=0A=
		var proto =3D new this(null);=0A=
		for (var property in properties){=0A=
			var pp =3D proto[property];=0A=
			proto[property] =3D Class.Merge(pp, properties[property]);=0A=
		}=0A=
		return new Class(proto);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: implement=0A=
		Implements the passed in properties to the base Class prototypes, =
altering the base class, unlike <Class.extend>.=0A=
=0A=
	Arguments:=0A=
		properties - the properties to add to the base class.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var Animal =3D new Class({=0A=
			initialize: function(age){=0A=
				this.age =3D age;=0A=
			}=0A=
		});=0A=
		Animal.implement({=0A=
			setName: function(name){=0A=
				this.name =3D name=0A=
			}=0A=
		});=0A=
		var myAnimal =3D new Animal(20);=0A=
		myAnimal.setName('Micia');=0A=
		alert(myAnimal.name); //alerts 'Micia'=0A=
		(end)=0A=
	*/=0A=
=0A=
	implement: function(){=0A=
		for (var i =3D 0, l =3D arguments.length; i < l; i++) =
$extend(this.prototype, arguments[i]);=0A=
	}=0A=
=0A=
};=0A=
=0A=
//internal=0A=
=0A=
Class.Merge =3D function(previous, current){=0A=
	if (previous && previous !=3D current){=0A=
		var type =3D $type(current);=0A=
		if (type !=3D $type(previous)) return current;=0A=
		switch(type){=0A=
			case 'function':=0A=
				var merged =3D function(){=0A=
					this.parent =3D arguments.callee.parent;=0A=
					return current.apply(this, arguments);=0A=
				};=0A=
				merged.parent =3D previous;=0A=
				return merged;=0A=
			case 'object': return $merge(previous, current);=0A=
		}=0A=
	}=0A=
	return current;=0A=
};=0A=
=0A=
/*=0A=
Script: Class.Extras.js=0A=
	Contains common implementations for custom classes. In Mootools is =
implemented in <Ajax>, <XHR> and <Fx.Base> and many more.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Chain=0A=
	An "Utility" Class. Its methods can be implemented with =
<Class.implement> into any <Class>.=0A=
	Currently implemented in <Fx.Base>, <XHR> and <Ajax>. In <Fx.Base> for =
example, is used to execute a list of function, one after another, once =
the effect is completed.=0A=
	The functions will not be fired all togheter, but one every completion, =
to create custom complex animations.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var myFx =3D new Fx.Style('element', 'opacity');=0A=
=0A=
	myFx.start(1,0).chain(function(){=0A=
		myFx.start(0,1);=0A=
	}).chain(function(){=0A=
		myFx.start(1,0);=0A=
	}).chain(function(){=0A=
		myFx.start(0,1);=0A=
	});=0A=
	//the element will appear and disappear three times=0A=
	(end)=0A=
*/=0A=
=0A=
var Chain =3D new Class({=0A=
=0A=
	/*=0A=
	Property: chain=0A=
		adds a function to the Chain instance stack.=0A=
=0A=
	Arguments:=0A=
		fn - the function to append.=0A=
	*/=0A=
=0A=
	chain: function(fn){=0A=
		this.chains =3D this.chains || [];=0A=
		this.chains.push(fn);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: callChain=0A=
		Executes the first function of the Chain instance stack, then removes =
it. The first function will then become the second.=0A=
	*/=0A=
=0A=
	callChain: function(){=0A=
		if (this.chains && this.chains.length) this.chains.shift().delay(10, =
this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: clearChain=0A=
		Clears the stack of a Chain instance.=0A=
	*/=0A=
=0A=
	clearChain: function(){=0A=
		this.chains =3D [];=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Events=0A=
	An "Utility" Class. Its methods can be implemented with =
<Class.implement> into any <Class>.=0A=
=0A=
	In <Fx.Base> Class, for example, is used to give the possibility add =
any number of functions to the Effects events, like onComplete, onStart, =
onCancel.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var myFx =3D new Fx.Style('element', 'opacity').addEvent('onComplete', =
function(){=0A=
		alert('the effect is completed');=0A=
	}).addEvent('onComplete', function(){=0A=
		alert('I told you the effect is completed');=0A=
	});=0A=
=0A=
	myFx.start(0,1);=0A=
	//upon completion it will display the 2 alerts, in order.=0A=
	(end)=0A=
=0A=
Implementing:=0A=
	This class can be implemented into other classes to add the =
functionality to them.=0A=
	Goes well with the <Options> class.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var Widget =3D new Class({=0A=
		initialize: function(){},=0A=
		finish: function(){=0A=
			this.fireEvent('onComplete');=0A=
		}=0A=
	});=0A=
	Widget.implement(new Events);=0A=
	//later...=0A=
	var myWidget =3D new Widget();=0A=
	myWidget.addEvent('onComplete', myfunction);=0A=
	(end)=0A=
*/=0A=
=0A=
var Events =3D new Class({=0A=
=0A=
	/*=0A=
	Property: addEvent=0A=
		adds an event to the stack of events of the Class instance.=0A=
=0A=
	Arguments:=0A=
		type - string; the event name (e.g. 'onComplete')=0A=
		fn - function to execute=0A=
	*/=0A=
=0A=
	addEvent: function(type, fn){=0A=
		if (fn !=3D Class.empty){=0A=
			this.$events =3D this.$events || {};=0A=
			this.$events[type] =3D this.$events[type] || [];=0A=
			this.$events[type].include(fn);=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: fireEvent=0A=
		fires all events of the specified type in the Class instance.=0A=
=0A=
	Arguments:=0A=
		type - string; the event name (e.g. 'onComplete')=0A=
		args - array or single object; arguments to pass to the function; if =
more than one argument, must be an array=0A=
		delay - (integer) delay (in ms) to wait to execute the event=0A=
=0A=
	Example:=0A=
	(start code)=0A=
	var Widget =3D new Class({=0A=
		initialize: function(arg1, arg2){=0A=
			...=0A=
			this.fireEvent("onInitialize", [arg1, arg2], 50);=0A=
		}=0A=
	});=0A=
	Widget.implement(new Events);=0A=
	(end)=0A=
	*/=0A=
=0A=
	fireEvent: function(type, args, delay){=0A=
		if (this.$events && this.$events[type]){=0A=
			this.$events[type].each(function(fn){=0A=
				fn.create({'bind': this, 'delay': delay, 'arguments': args})();=0A=
			}, this);=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: removeEvent=0A=
		removes an event from the stack of events of the Class instance.=0A=
=0A=
	Arguments:=0A=
		type - string; the event name (e.g. 'onComplete')=0A=
		fn - function that was added=0A=
	*/=0A=
=0A=
	removeEvent: function(type, fn){=0A=
		if (this.$events && this.$events[type]) this.$events[type].remove(fn);=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Options=0A=
	An "Utility" Class. Its methods can be implemented with =
<Class.implement> into any <Class>.=0A=
	Used to automate the options settings, also adding Class <Events> when =
the option begins with on.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var Widget =3D new Class({=0A=
			options: {=0A=
				color: '#fff',=0A=
				size: {=0A=
					width: 100=0A=
					height: 100=0A=
				}=0A=
			},=0A=
			initialize: function(options){=0A=
				this.setOptions(options);=0A=
			}=0A=
		});=0A=
		Widget.implement(new Options);=0A=
		//later...=0A=
		var myWidget =3D new Widget({=0A=
			color: '#f00',=0A=
			size: {=0A=
				width: 200=0A=
			}=0A=
		});=0A=
		//myWidget.options =3D {color: #f00, size: {width: 200, height: 100}}=0A=
		(end)=0A=
*/=0A=
=0A=
var Options =3D new Class({=0A=
=0A=
	/*=0A=
	Property: setOptions=0A=
		sets this.options=0A=
=0A=
	Arguments:=0A=
		defaults - object; the default set of options=0A=
		options - object; the user entered options. can be empty too.=0A=
=0A=
	Note:=0A=
		if your Class has <Events> implemented, every option beginning with =
on, followed by a capital letter (onComplete) becomes an Class instance =
event.=0A=
	*/=0A=
=0A=
	setOptions: function(){=0A=
		this.options =3D $merge.apply(null, [this.options].extend(arguments));=0A=
		if (!this.addEvent) return this;=0A=
		for (var option in this.options){=0A=
			if ($type(this.options[option] =3D=3D 'function') && =
option.test(/^on[A-Z]/)) this.addEvent(option, this.options[option]);=0A=
		}=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Array.js=0A=
	Contains Array prototypes, <$A>, <$each>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Array=0A=
	A collection of The Array Object prototype methods.=0A=
*/=0A=
=0A=
//custom methods=0A=
=0A=
Array.extend({=0A=
=0A=
	/*=0A=
	Property: forEach=0A=
		Iterates through an array; This method is only available for browsers =
without native *forEach* support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Globa=
l_Objects:Array:forEach>=0A=
=0A=
		*forEach* executes the provided function (callback) once for each =
element present in the array. callback is invoked only for indexes of =
the array which have assigned values; it is not invoked for indexes =
which have been deleted or which have never been assigned values.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - the object to bind "this" to (see <Function.bind>)=0A=
=0A=
	Example:=0A=
		>['apple','banana','lemon'].each(function(item, index) {=0A=
		>	alert(index + " =3D " + item); //alerts "0 =3D apple" etc.=0A=
		>}, bindObj); //optional second arg for binding, not used here=0A=
	*/=0A=
=0A=
	forEach: function(fn, bind){=0A=
		for (var i =3D 0, j =3D this.length; i < j; i++) fn.call(bind, =
this[i], i, this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: filter=0A=
		This method is provided only for browsers without native *filter* =
support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objec=
ts:Array:filter>=0A=
=0A=
		*filter* calls a provided callback function once for each element in =
an array, and constructs a new array of all the values for which =
callback returns a true value. callback is invoked only for indexes of =
the array which have assigned values; it is not invoked for indexes =
which have been deleted or which have never been assigned values. Array =
elements which do not pass the callback test are simply skipped, and are =
not included in the new array.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - the object to bind "this" to (see <Function.bind>)=0A=
=0A=
	Example:=0A=
		>var biggerThanTwenty =3D [10,3,25,100].filter(function(item, index) {=0A=
		> return item > 20;=0A=
		>});=0A=
		>//biggerThanTwenty =3D [25,100]=0A=
	*/=0A=
=0A=
	filter: function(fn, bind){=0A=
		var results =3D [];=0A=
		for (var i =3D 0, j =3D this.length; i < j; i++){=0A=
			if (fn.call(bind, this[i], i, this)) results.push(this[i]);=0A=
		}=0A=
		return results;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: map=0A=
		This method is provided only for browsers without native *map* support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Globa=
l_Objects:Array:map>=0A=
=0A=
		*map* calls a provided callback function once for each element in an =
array, in order, and constructs a new array from the results. callback =
is invoked only for indexes of the array which have assigned values; it =
is not invoked for indexes which have been deleted or which have never =
been assigned values.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - the object to bind "this" to (see <Function.bind>)=0A=
=0A=
	Example:=0A=
		>var timesTwo =3D [1,2,3].map(function(item, index){=0A=
		> return item*2;=0A=
		>});=0A=
		>//timesTwo =3D [2,4,6];=0A=
	*/=0A=
=0A=
	map: function(fn, bind){=0A=
		var results =3D [];=0A=
		for (var i =3D 0, j =3D this.length; i < j; i++) results[i] =3D =
fn.call(bind, this[i], i, this);=0A=
		return results;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: every=0A=
		This method is provided only for browsers without native *every* =
support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Globa=
l_Objects:Array:every>=0A=
=0A=
		*every* executes the provided callback function once for each element =
present in the array until it finds one where callback returns a false =
value. If such an element is found, the every method immediately returns =
false. Otherwise, if callback returned a true value for all elements, =
every will return true. callback is invoked only for indexes of the =
array which have assigned values; it is not invoked for indexes which =
have been deleted or which have never been assigned values.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - the object to bind "this" to (see <Function.bind>)=0A=
=0A=
	Example:=0A=
		>var areAllBigEnough =3D [10,4,25,100].every(function(item, index){=0A=
		> return item > 20;=0A=
		>});=0A=
		>//areAllBigEnough =3D false=0A=
	*/=0A=
=0A=
	every: function(fn, bind){=0A=
		for (var i =3D 0, j =3D this.length; i < j; i++){=0A=
			if (!fn.call(bind, this[i], i, this)) return false;=0A=
		}=0A=
		return true;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: some=0A=
		This method is provided only for browsers without native *some* =
support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Globa=
l_Objects:Array:some>=0A=
=0A=
		*some* executes the callback function once for each element present in =
the array until it finds one where callback returns a true value. If =
such an element is found, some immediately returns true. Otherwise, some =
returns false. callback is invoked only for indexes of the array which =
have assigned values; it is not invoked for indexes which have been =
deleted or which have never been assigned values.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - the object to bind "this" to (see <Function.bind>)=0A=
=0A=
	Example:=0A=
		>var isAnyBigEnough =3D [10,4,25,100].some(function(item, index){=0A=
		> return item > 20;=0A=
		>});=0A=
		>//isAnyBigEnough =3D true=0A=
	*/=0A=
=0A=
	some: function(fn, bind){=0A=
		for (var i =3D 0, j =3D this.length; i < j; i++){=0A=
			if (fn.call(bind, this[i], i, this)) return true;=0A=
		}=0A=
		return false;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: indexOf=0A=
		This method is provided only for browsers without native *indexOf* =
support.=0A=
		For more info see =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Globa=
l_Objects:Array:indexOf>=0A=
=0A=
		*indexOf* compares a search element to elements of the Array using =
strict equality (the same method used by the =3D=3D=3D, or =
triple-equals, operator).=0A=
=0A=
	Arguments:=0A=
		item - any type of object; element to locate in the array=0A=
		from - integer; optional; the index of the array at which to begin the =
search (defaults to 0)=0A=
=0A=
	Example:=0A=
		>['apple','lemon','banana'].indexOf('lemon'); //returns 1=0A=
		>['apple','lemon'].indexOf('banana'); //returns -1=0A=
	*/=0A=
=0A=
	indexOf: function(item, from){=0A=
		var len =3D this.length;=0A=
		for (var i =3D (from < 0) ? Math.max(0, len + from) : from || 0; i < =
len; i++){=0A=
			if (this[i] =3D=3D=3D item) return i;=0A=
		}=0A=
		return -1;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: each=0A=
		Same as <Array.forEach>.=0A=
=0A=
	Arguments:=0A=
		fn - function to execute with each item in the array; passed the item =
and the index of that item in the array=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
=0A=
	Example:=0A=
		>var Animals =3D ['Cat', 'Dog', 'Coala'];=0A=
		>Animals.each(function(animal){=0A=
		>	document.write(animal)=0A=
		>});=0A=
	*/=0A=
=0A=
	/*=0A=
	Property: copy=0A=
		returns a copy of the array.=0A=
=0A=
	Returns:=0A=
		a new array which is a copy of the current one.=0A=
=0A=
	Arguments:=0A=
		start - integer; optional; the index where to start the copy, default =
is 0. If negative, it is taken as the offset from the end of the array.=0A=
		length - integer; optional; the number of elements to copy. By =
default, copies all elements from start to the end of the array.=0A=
=0A=
	Example:=0A=
		>var letters =3D ["a","b","c"];=0A=
		>var copy =3D letters.copy();		// ["a","b","c"] (new instance)=0A=
	*/=0A=
=0A=
	copy: function(start, length){=0A=
		start =3D start || 0;=0A=
		if (start < 0) start =3D this.length + start;=0A=
		length =3D length || (this.length - start);=0A=
		var newArray =3D [];=0A=
		for (var i =3D 0; i < length; i++) newArray[i] =3D this[start++];=0A=
		return newArray;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: remove=0A=
		Removes all occurrences of an item from the array.=0A=
=0A=
	Arguments:=0A=
		item - the item to remove=0A=
=0A=
	Returns:=0A=
		the Array with all occurrences of the item removed.=0A=
=0A=
	Example:=0A=
		>["1","2","3","2"].remove("2") // ["1","3"];=0A=
	*/=0A=
=0A=
	remove: function(item){=0A=
		var i =3D 0;=0A=
		var len =3D this.length;=0A=
		while (i < len){=0A=
			if (this[i] =3D=3D=3D item){=0A=
				this.splice(i, 1);=0A=
				len--;=0A=
			} else {=0A=
				i++;=0A=
			}=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: contains=0A=
		Tests an array for the presence of an item.=0A=
=0A=
	Arguments:=0A=
		item - the item to search for in the array.=0A=
		from - integer; optional; the index at which to begin the search, =
default is 0. If negative, it is taken as the offset from the end of the =
array.=0A=
=0A=
	Returns:=0A=
		true - the item was found=0A=
		false - it wasn't=0A=
=0A=
	Example:=0A=
		>["a","b","c"].contains("a"); // true=0A=
		>["a","b","c"].contains("d"); // false=0A=
	*/=0A=
=0A=
	contains: function(item, from){=0A=
		return this.indexOf(item, from) !=3D -1;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: associate=0A=
		Creates an object with key-value pairs based on the array of keywords =
passed in=0A=
		and the current content of the array.=0A=
=0A=
	Arguments:=0A=
		keys - the array of keywords.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var Animals =3D ['Cat', 'Dog', 'Coala', 'Lizard'];=0A=
		var Speech =3D ['Miao', 'Bau', 'Fruuu', 'Mute'];=0A=
		var Speeches =3D Animals.associate(Speech);=0A=
		//Speeches['Miao'] is now Cat.=0A=
		//Speeches['Bau'] is now Dog.=0A=
		//...=0A=
		(end)=0A=
	*/=0A=
=0A=
	associate: function(keys){=0A=
		var obj =3D {}, length =3D Math.min(this.length, keys.length);=0A=
		for (var i =3D 0; i < length; i++) obj[keys[i]] =3D this[i];=0A=
		return obj;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: extend=0A=
		Extends an array with another one.=0A=
=0A=
	Arguments:=0A=
		array - the array to extend ours with=0A=
=0A=
	Example:=0A=
		>var Animals =3D ['Cat', 'Dog', 'Coala'];=0A=
		>Animals.extend(['Lizard']);=0A=
		>//Animals is now: ['Cat', 'Dog', 'Coala', 'Lizard'];=0A=
	*/=0A=
=0A=
	extend: function(array){=0A=
		for (var i =3D 0, j =3D array.length; i < j; i++) this.push(array[i]);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: merge=0A=
		merges an array in another array, without duplicates. (case- and =
type-sensitive)=0A=
=0A=
	Arguments:=0A=
		array - the array to merge from.=0A=
=0A=
	Example:=0A=
		>['Cat','Dog'].merge(['Dog','Coala']); //returns ['Cat','Dog','Coala']=0A=
	*/=0A=
=0A=
	merge: function(array){=0A=
		for (var i =3D 0, l =3D array.length; i < l; i++) =
this.include(array[i]);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: include=0A=
		includes the passed in element in the array, only if its not already =
present. (case- and type-sensitive)=0A=
=0A=
	Arguments:=0A=
		item - item to add to the array (if not present)=0A=
=0A=
	Example:=0A=
		>['Cat','Dog'].include('Dog'); //returns ['Cat','Dog']=0A=
		>['Cat','Dog'].include('Coala'); //returns ['Cat','Dog','Coala']=0A=
	*/=0A=
=0A=
	include: function(item){=0A=
		if (!this.contains(item)) this.push(item);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getRandom=0A=
		returns a random item in the Array=0A=
	*/=0A=
=0A=
	getRandom: function(){=0A=
		return this[$random(0, this.length - 1)] || false;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getLast=0A=
		returns the last item in the Array=0A=
	*/=0A=
=0A=
	getLast: function(){=0A=
		return this[this.length - 1] || false;=0A=
	}=0A=
=0A=
});=0A=
=0A=
//copies=0A=
=0A=
Array.prototype.each =3D Array.prototype.forEach;=0A=
Array.prototype.test =3D Array.prototype.contains;=0A=
=0A=
/* Section: Utility Functions */=0A=
=0A=
/*=0A=
Function: $A()=0A=
	Same as <Array.copy>, but as function.=0A=
	Useful to apply Array prototypes to iterable objects, as a collection =
of DOM elements or the arguments object.=0A=
=0A=
Example:=0A=
	(start code)=0A=
	function myFunction(){=0A=
		$A(arguments).each(argument, function(){=0A=
			alert(argument);=0A=
		});=0A=
	};=0A=
	//the above will alert all the arguments passed to the function =
myFunction.=0A=
	(end)=0A=
*/=0A=
=0A=
function $A(array){=0A=
	return Array.copy(array);=0A=
};=0A=
=0A=
/*=0A=
Function: $each=0A=
	Use to iterate through iterables that are not regular arrays, such as =
builtin getElementsByTagName calls, arguments of a function, or an =
object.=0A=
=0A=
Arguments:=0A=
	iterable - an iterable element or an objct.=0A=
	function - function to apply to the iterable.=0A=
	bind - optional, the 'this' of the function will refer to this object.=0A=
=0A=
Function argument:=0A=
	The function argument will be passed the following arguments.=0A=
=0A=
	item - the current item in the iterator being procesed=0A=
	index - integer; the index of the item, or key in case of an object.=0A=
=0A=
Examples:=0A=
	(start code)=0A=
	$each(['Sun','Mon','Tue'], function(day, index) {=0A=
		alert('name:' + day + ', index: ' + index);=0A=
	});=0A=
	//alerts "name: Sun, index: 0", "name: Mon, index: 1", etc.=0A=
	//over an object=0A=
	$each({first: "Sunday", second: "Monday", third: "Tuesday"}, =
function(value, key){=0A=
		alert("the " + key + " day of the week is " + value);=0A=
	});=0A=
	//alerts "the first day of the week is Sunday",=0A=
	//"the second day of the week is Monday", etc.=0A=
	(end)=0A=
*/=0A=
=0A=
function $each(iterable, fn, bind){=0A=
	if (iterable && typeof iterable.length =3D=3D 'number' && =
$type(iterable) !=3D 'object') Array.forEach(iterable, fn, bind);=0A=
	else for (var name in iterable) fn.call(bind || iterable, =
iterable[name], name);=0A=
};=0A=
=0A=
/*=0A=
Script: String.js=0A=
	Contains String prototypes and Number prototypes.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: String=0A=
	A collection of The String Object prototype methods.=0A=
*/=0A=
=0A=
String.extend({=0A=
=0A=
	/*=0A=
	Property: test=0A=
		Tests a string with a regular expression.=0A=
=0A=
	Arguments:=0A=
		regex - a string or regular expression object, the regular expression =
you want to match the string with=0A=
		params - optional, if first parameter is a string, any parameters you =
want to pass to the regex ('g' has no effect)=0A=
=0A=
	Returns:=0A=
		true if a match for the regular expression is found in the string, =
false if not.=0A=
		See =
<http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objec=
ts:RegExp:test>=0A=
=0A=
	Example:=0A=
		>"I like cookies".test("cookie"); // returns true=0A=
		>"I like cookies".test("COOKIE", "i") // ignore case, returns true=0A=
		>"I like cookies".test("cake"); // returns false=0A=
	*/=0A=
=0A=
	test: function(regex, params){=0A=
		return (($type(regex) =3D=3D 'string') ? new RegExp(regex, params) : =
regex).test(this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toInt=0A=
		parses a string to an integer.=0A=
=0A=
	Returns:=0A=
		either an int or "NaN" if the string is not a number.=0A=
=0A=
	Example:=0A=
		>var value =3D "10px".toInt(); // value is 10=0A=
	*/=0A=
=0A=
	toInt: function(){=0A=
		return parseInt(this, 10);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toFloat=0A=
		parses a string to an float.=0A=
=0A=
	Returns:=0A=
		either a float or "NaN" if the string is not a number.=0A=
=0A=
	Example:=0A=
		>var value =3D "10.848".toFloat(); // value is 10.848=0A=
	*/=0A=
=0A=
	toFloat: function(){=0A=
		return parseFloat(this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: camelCase=0A=
		Converts a hiphenated string to a camelcase string.=0A=
=0A=
	Example:=0A=
		>"I-like-cookies".camelCase(); //"ILikeCookies"=0A=
=0A=
	Returns:=0A=
		the camel cased string=0A=
	*/=0A=
=0A=
	camelCase: function(){=0A=
		return this.replace(/-\D/g, function(match){=0A=
			return match.charAt(1).toUpperCase();=0A=
		});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hyphenate=0A=
		Converts a camelCased string to a hyphen-ated string.=0A=
=0A=
	Example:=0A=
		>"ILikeCookies".hyphenate(); //"I-like-cookies"=0A=
	*/=0A=
=0A=
	hyphenate: function(){=0A=
		return this.replace(/\w[A-Z]/g, function(match){=0A=
			return (match.charAt(0) + '-' + match.charAt(1).toLowerCase());=0A=
		});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: capitalize=0A=
		Converts the first letter in each word of a string to Uppercase.=0A=
=0A=
	Example:=0A=
		>"i like cookies".capitalize(); //"I Like Cookies"=0A=
=0A=
	Returns:=0A=
		the capitalized string=0A=
	*/=0A=
=0A=
	capitalize: function(){=0A=
		return this.replace(/\b[a-z]/g, function(match){=0A=
			return match.toUpperCase();=0A=
		});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: trim=0A=
		Trims the leading and trailing spaces off a string.=0A=
=0A=
	Example:=0A=
		>"    i like cookies     ".trim() //"i like cookies"=0A=
=0A=
	Returns:=0A=
		the trimmed string=0A=
	*/=0A=
=0A=
	trim: function(){=0A=
		return this.replace(/^\s+|\s+$/g, '');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: clean=0A=
		trims (<String.trim>) a string AND removes all the double spaces in a =
string.=0A=
=0A=
	Returns:=0A=
		the cleaned string=0A=
=0A=
	Example:=0A=
		>" i      like     cookies      \n\n".clean() //"i like cookies"=0A=
	*/=0A=
=0A=
	clean: function(){=0A=
		return this.replace(/\s{2,}/g, ' ').trim();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: rgbToHex=0A=
		Converts an RGB value to hexidecimal. The string must be in the format =
of "rgb(255,255,255)" or "rgba(255,255,255,1)";=0A=
=0A=
	Arguments:=0A=
		array - boolean value, defaults to false. Use true if you want the =
array ['FF','33','00'] as output instead of "#FF3300"=0A=
=0A=
	Returns:=0A=
		hex string or array. returns "transparent" if the output is set as =
string and the fourth value of rgba in input string is 0.=0A=
=0A=
	Example:=0A=
		>"rgb(17,34,51)".rgbToHex(); //"#112233"=0A=
		>"rgba(17,34,51,0)".rgbToHex(); //"transparent"=0A=
		>"rgb(17,34,51)".rgbToHex(true); //['11','22','33']=0A=
	*/=0A=
=0A=
	rgbToHex: function(array){=0A=
		var rgb =3D this.match(/\d{1,3}/g);=0A=
		return (rgb) ? rgb.rgbToHex(array) : false;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hexToRgb=0A=
		Converts a hexidecimal color value to RGB. Input string must be the =
hex color value (with or without the hash). Also accepts triplets =
('333');=0A=
=0A=
	Arguments:=0A=
		array - boolean value, defaults to false. Use true if you want the =
array [255,255,255] as output instead of "rgb(255,255,255)";=0A=
=0A=
	Returns:=0A=
		rgb string or array.=0A=
=0A=
	Example:=0A=
		>"#112233".hexToRgb(); //"rgb(17,34,51)"=0A=
		>"#112233".hexToRgb(true); //[17,34,51]=0A=
	*/=0A=
=0A=
	hexToRgb: function(array){=0A=
		var hex =3D this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);=0A=
		return (hex) ? hex.slice(1).hexToRgb(array) : false;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: contains=0A=
		checks if the passed in string is contained in the String. also =
accepts an optional second parameter, to check if the string is =
contained in a list of separated values.=0A=
=0A=
	Example:=0A=
		>'a b c'.contains('c', ' '); //true=0A=
		>'a bc'.contains('bc'); //true=0A=
		>'a bc'.contains('b', ' '); //false=0A=
	*/=0A=
	=0A=
	contains: function(string, s){=0A=
		return (s) ? (s + this + s).indexOf(s + string + s) > -1 : =
this.indexOf(string) > -1;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: escapeRegExp=0A=
		Returns string with escaped regular expression characters=0A=
=0A=
	Example:=0A=
		>var search =3D 'animals.sheeps[1]'.escapeRegExp(); // search is now =
'animals\.sheeps\[1\]'=0A=
=0A=
	Returns:=0A=
		Escaped string=0A=
	*/=0A=
=0A=
	escapeRegExp: function(){=0A=
		return this.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');=0A=
	}=0A=
=0A=
});=0A=
=0A=
Array.extend({=0A=
=0A=
	/*=0A=
	Property: rgbToHex=0A=
		see <String.rgbToHex>, but as an array method.=0A=
	*/=0A=
=0A=
	rgbToHex: function(array){=0A=
		if (this.length < 3) return false;=0A=
		if (this.length =3D=3D 4 && this[3] =3D=3D 0 && !array) return =
'transparent';=0A=
		var hex =3D [];=0A=
		for (var i =3D 0; i < 3; i++){=0A=
			var bit =3D (this[i] - 0).toString(16);=0A=
			hex.push((bit.length =3D=3D 1) ? '0' + bit : bit);=0A=
		}=0A=
		return array ? hex : '#' + hex.join('');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hexToRgb=0A=
		same as <String.hexToRgb>, but as an array method.=0A=
	*/=0A=
=0A=
	hexToRgb: function(array){=0A=
		if (this.length !=3D 3) return false;=0A=
		var rgb =3D [];=0A=
		for (var i =3D 0; i < 3; i++){=0A=
			rgb.push(parseInt((this[i].length =3D=3D 1) ? this[i] + this[i] : =
this[i], 16));=0A=
		}=0A=
		return array ? rgb : 'rgb(' + rgb.join(',') + ')';=0A=
	}=0A=
=0A=
});=0A=
=0A=
/* =0A=
Script: Function.js=0A=
	Contains Function prototypes and utility functions .=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
=0A=
Credits:=0A=
	- Some functions are inspired by those found in prototype.js =
<http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio =
[dot] net, MIT-style license=0A=
*/=0A=
=0A=
/*=0A=
Class: Function=0A=
	A collection of The Function Object prototype methods.=0A=
*/=0A=
=0A=
Function.extend({=0A=
=0A=
	/*=0A=
	Property: create=0A=
		Main function to create closures.=0A=
=0A=
	Returns:=0A=
		a function.=0A=
=0A=
	Arguments:=0A=
		options - An Options object.=0A=
=0A=
	Options:=0A=
		bind - The object that the "this" of the function will refer to. =
Default is the current function.=0A=
		event - If set to true, the function will act as an event listener and =
receive an event as first argument.=0A=
				If set to a class name, the function will receive a new instance of =
this class (with the event passed as argument's constructor) as first =
argument.=0A=
				Default is false.=0A=
		arguments - A single argument or array of arguments that will be =
passed to the function when called.=0A=
		=0A=
					If both the event and arguments options are set, the event is =
passed as first argument and the arguments array will follow.=0A=
					=0A=
					Default is no custom arguments, the function will receive the =
standard arguments when called.=0A=
					=0A=
		delay - Numeric value: if set, the returned function will delay the =
actual execution by this amount of milliseconds and return a timer =
handle when called.=0A=
				Default is no delay.=0A=
		periodical - Numeric value: if set, the returned function will =
periodically perform the actual execution with this specified interval =
and return a timer handle when called.=0A=
				Default is no periodical execution.=0A=
		attempt - If set to true, the returned function will try to execute =
and return either the results or false on error. Default is false.=0A=
	*/=0A=
=0A=
	create: function(options){=0A=
		var fn =3D this;=0A=
		options =3D $merge({=0A=
			'bind': fn,=0A=
			'event': false,=0A=
			'arguments': null,=0A=
			'delay': false,=0A=
			'periodical': false,=0A=
			'attempt': false=0A=
		}, options);=0A=
		if ($chk(options.arguments) && $type(options.arguments) !=3D 'array') =
options.arguments =3D [options.arguments];=0A=
		return function(event){=0A=
			var args;=0A=
			if (options.event){=0A=
				event =3D event || window.event;=0A=
				args =3D [(options.event =3D=3D=3D true) ? event : new =
options.event(event)];=0A=
				if (options.arguments) args.extend(options.arguments);=0A=
			}=0A=
			else args =3D options.arguments || arguments;=0A=
			var returns =3D function(){=0A=
				return fn.apply($pick(options.bind, fn), args);=0A=
			};=0A=
			if (options.delay) return setTimeout(returns, options.delay);=0A=
			if (options.periodical) return setInterval(returns, =
options.periodical);=0A=
			if (options.attempt) try {return returns();} catch(err){return =
false;};=0A=
			return returns();=0A=
		};=0A=
	},=0A=
=0A=
	/*=0A=
	Property: pass=0A=
		Shortcut to create closures with arguments and bind.=0A=
=0A=
	Returns:=0A=
		a function.=0A=
=0A=
	Arguments:=0A=
		args - the arguments passed. must be an array if arguments > 1=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
=0A=
	Example:=0A=
		>myFunction.pass([arg1, arg2], myElement);=0A=
	*/=0A=
=0A=
	pass: function(args, bind){=0A=
		return this.create({'arguments': args, 'bind': bind});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: attempt=0A=
		Tries to execute the function, returns either the result of the =
function or false on error.=0A=
=0A=
	Arguments:=0A=
		args - the arguments passed. must be an array if arguments > 1=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
=0A=
	Example:=0A=
		>myFunction.attempt([arg1, arg2], myElement);=0A=
	*/=0A=
=0A=
	attempt: function(args, bind){=0A=
		return this.create({'arguments': args, 'bind': bind, 'attempt': =
true})();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: bind=0A=
		method to easily create closures with "this" altered.=0A=
=0A=
	Arguments:=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
		args - optional, the arguments passed. must be an array if arguments > =
1=0A=
=0A=
	Returns:=0A=
		a function.=0A=
=0A=
	Example:=0A=
		>function myFunction(){=0A=
		>	this.setStyle('color', 'red');=0A=
		>	// note that 'this' here refers to myFunction, not an element=0A=
		>	// we'll need to bind this function to the element we want to alter=0A=
		>};=0A=
		>var myBoundFunction =3D myFunction.bind(myElement);=0A=
		>myBoundFunction(); // this will make the element myElement red.=0A=
	*/=0A=
=0A=
	bind: function(bind, args){=0A=
		return this.create({'bind': bind, 'arguments': args});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: bindAsEventListener=0A=
		cross browser method to pass event firer=0A=
=0A=
	Arguments:=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
		args - optional, the arguments passed. must be an array if arguments > =
1=0A=
=0A=
	Returns:=0A=
		a function with the parameter bind as its "this" and as a pre-passed =
argument event or window.event, depending on the browser.=0A=
=0A=
	Example:=0A=
		>function myFunction(event){=0A=
		>	alert(event.clientx) //returns the coordinates of the mouse..=0A=
		>};=0A=
		>myElement.onclick =3D myFunction.bindAsEventListener(myElement);=0A=
	*/=0A=
=0A=
	bindAsEventListener: function(bind, args){=0A=
		return this.create({'bind': bind, 'event': true, 'arguments': args});=0A=
	},=0A=
=0A=
	/*=0A=
	Property: delay=0A=
		Delays the execution of a function by a specified duration.=0A=
=0A=
	Arguments:=0A=
		delay - the duration to wait in milliseconds.=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
		args - optional, the arguments passed. must be an array if arguments > =
1=0A=
=0A=
	Example:=0A=
		>myFunction.delay(50, myElement) //wait 50 milliseconds, then call =
myFunction and bind myElement to it=0A=
		>(function(){alert('one second later...')}).delay(1000); //wait a =
second and alert=0A=
	*/=0A=
=0A=
	delay: function(delay, bind, args){=0A=
		return this.create({'delay': delay, 'bind': bind, 'arguments': =
args})();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: periodical=0A=
		Executes a function in the specified intervals of time=0A=
=0A=
	Arguments:=0A=
		interval - the duration of the intervals between executions.=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
		args - optional, the arguments passed. must be an array if arguments > =
1=0A=
	*/=0A=
=0A=
	periodical: function(interval, bind, args){=0A=
		return this.create({'periodical': interval, 'bind': bind, 'arguments': =
args})();=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Number=0A=
	A collection of The Number Object prototype methods.=0A=
*/=0A=
=0A=
Number.extend({=0A=
=0A=
	/*=0A=
	Property: toInt=0A=
		Returns this number; useful because toInt must work on both Strings =
and Numbers.=0A=
	*/=0A=
=0A=
	toInt: function(){=0A=
		return parseInt(this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toFloat=0A=
		Returns this number as a float; useful because toFloat must work on =
both Strings and Numbers.=0A=
	*/=0A=
=0A=
	toFloat: function(){=0A=
		return parseFloat(this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: limit=0A=
		Limits the number.=0A=
		=0A=
	Arguments:=0A=
		min - number, minimum value=0A=
		max - number, maximum value=0A=
		=0A=
	Returns:=0A=
		the number in the given limits.=0A=
		=0A=
	Example:=0A=
		>(12).limit(2, 6.5)  // returns 6.5=0A=
		>(-4).limit(2, 6.5)  // returns 2=0A=
		>(4.3).limit(2, 6.5) // returns 4.3=0A=
	*/=0A=
=0A=
	limit: function(min, max){=0A=
		return Math.min(max, Math.max(min, this));=0A=
	},=0A=
=0A=
	/*=0A=
	Property: round=0A=
		Returns the number rounded to specified precision.=0A=
=0A=
	Arguments:=0A=
		precision - integer, number of digits after the decimal point. Can =
also be negative or zero (default).=0A=
=0A=
	Example:=0A=
		>12.45.round() // returns 12=0A=
		>12.45.round(1) // returns 12.5=0A=
		>12.45.round(-1) // returns 10=0A=
		=0A=
	Returns:=0A=
		The rounded number.=0A=
	*/=0A=
=0A=
	round: function(precision){=0A=
		precision =3D Math.pow(10, precision || 0);=0A=
		return Math.round(this * precision) / precision;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: times=0A=
		Executes a passed in function the specified number of times=0A=
=0A=
	Arguments:=0A=
		function - the function to be executed on each iteration of the loop=0A=
=0A=
	Example:=0A=
		>(4).times(alert);=0A=
	*/=0A=
=0A=
	times: function(fn) {=0A=
		for (var i =3D 0; i < this; i++) fn(i);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Element.js=0A=
	Contains useful Element prototypes, to be used with the dollar function =
<$>.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
=0A=
Credits:=0A=
	- Some functions are inspired by those found in prototype.js =
<http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio =
[dot] net, MIT-style license=0A=
*/=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
var Element =3D new Class({=0A=
=0A=
	/*=0A=
	Property: initialize=0A=
		Creates a new element of the type passed in.=0A=
=0A=
	Arguments:=0A=
		el - string; the tag name for the element you wish to create. you can =
also pass in an element reference, in which case it will be extended.=0A=
		props - object; the properties you want to add to your element.=0A=
		Accepts the same keys as <Element.setProperties>, but also allows =
events and styles=0A=
=0A=
	Props:=0A=
		the key styles will be used as setStyles, the key events will be used =
as addEvents. any other key is used as setProperty.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		new Element('a', {=0A=
			'styles': {=0A=
				'display': 'block',=0A=
				'border': '1px solid black'=0A=
			},=0A=
			'events': {=0A=
				'click': function(){=0A=
					//aaa=0A=
				},=0A=
				'mousedown': function(){=0A=
					//aaa=0A=
				}=0A=
			},=0A=
			'class': 'myClassSuperClass',=0A=
			'href': 'http://mad4milk.net'=0A=
		});=0A=
=0A=
		(end)=0A=
	*/=0A=
=0A=
	initialize: function(el, props){=0A=
		if ($type(el) =3D=3D 'string'){=0A=
			if (window.ie && props && (props.name || props.type)){=0A=
				var name =3D (props.name) ? ' name=3D"' + props.name + '"' : '';=0A=
				var type =3D (props.type) ? ' type=3D"' + props.type + '"' : '';=0A=
				delete props.name;=0A=
				delete props.type;=0A=
				el =3D '<' + el + name + type + '>';=0A=
			}=0A=
			el =3D document.createElement(el);=0A=
		}=0A=
		el =3D $(el);=0A=
		return (!props || !el) ? el : el.set(props);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Elements=0A=
	- Every dom function such as <$$>, or in general every function that =
returns a collection of nodes in mootools, returns them as an Elements =
class.=0A=
	- The purpose of the Elements class is to allow <Element> methods to =
work also on <Elements> array.=0A=
	- Elements is also an Array, so it accepts all the <Array> methods.=0A=
	- Every node of the Elements instance is already extended with <$>.=0A=
=0A=
Example:=0A=
	>$$('myselector').each(function(el){=0A=
	> //...=0A=
	>});=0A=
=0A=
	some iterations here, $$('myselector') is also an array.=0A=
=0A=
	>$$('myselector').setStyle('color', 'red');=0A=
	every element returned by $$('myselector') also accepts <Element> =
methods, in this example every element will be made red.=0A=
*/=0A=
=0A=
var Elements =3D new Class({=0A=
=0A=
	initialize: function(elements){=0A=
		return (elements) ? $extend(elements, this) : this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
Elements.extend =3D function(props){=0A=
	for (var prop in props){=0A=
		this.prototype[prop] =3D props[prop];=0A=
		this[prop] =3D $native.generic(prop);=0A=
	}=0A=
};=0A=
=0A=
/*=0A=
Section: Utility Functions=0A=
=0A=
Function: $=0A=
	returns the element passed in with all the Element prototypes applied.=0A=
=0A=
Arguments:=0A=
	el - a reference to an actual element or a string representing the id =
of an element=0A=
=0A=
Example:=0A=
	>$('myElement') // gets a DOM element by id with all the Element =
prototypes applied.=0A=
	>var div =3D document.getElementById('myElement');=0A=
	>$(div) //returns an Element also with all the mootools extentions =
applied.=0A=
=0A=
	You'll use this when you aren't sure if a variable is an actual element =
or an id, as=0A=
	well as just shorthand for document.getElementById().=0A=
=0A=
Returns:=0A=
	a DOM element or false (if no id was found).=0A=
=0A=
Note:=0A=
	you need to call $ on an element only once to get all the prototypes.=0A=
	But its no harm to call it multiple times, as it will detect if it has =
been already extended.=0A=
*/=0A=
=0A=
function $(el){=0A=
	if (!el) return false;=0A=
	if (el.htmlElement) return Garbage.collect(el);=0A=
	if ([window, document].contains(el)) return el;=0A=
	var type =3D $type(el);=0A=
	if (type =3D=3D 'string'){=0A=
		el =3D document.getElementById(el);=0A=
		type =3D (el) ? 'element' : false;=0A=
	}=0A=
	if (type !=3D 'element') return false;=0A=
	if (el.htmlElement) return Garbage.collect(el);=0A=
	if (['object', 'embed'].contains(el.tagName.toLowerCase())) return el;=0A=
	$extend(el, Element.prototype);=0A=
	el.htmlElement =3D true;=0A=
	return Garbage.collect(el);=0A=
};=0A=
=0A=
/*=0A=
Function: $$=0A=
	Selects, and extends DOM elements. Elements arrays returned with $$ =
will also accept all the <Element> methods.=0A=
	The return type of element methods run through $$ is always an array. =
If the return array is only made by elements,=0A=
	$$ will be applied automatically.=0A=
=0A=
Arguments:=0A=
	HTML Collections, arrays of elements, arrays of strings as element ids, =
elements, strings as selectors.=0A=
	Any number of the above as arguments are accepted.=0A=
=0A=
Note:=0A=
	if you load <Element.Selectors.js>, $$ will also accept CSS Selectors, =
otherwise the only selectors supported are tag names.=0A=
=0A=
Example:=0A=
	>$$('a') //an array of all anchor tags on the page=0A=
	>$$('a', 'b') //an array of all anchor and bold tags on the page=0A=
	>$$('#myElement') //array containing only the element with id =3D =
myElement. (only with <Element.Selectors.js>)=0A=
	>$$('#myElement a.myClass') //an array of all anchor tags with the =
class "myClass"=0A=
	>//within the DOM element with id "myElement" (only with =
<Element.Selectors.js>)=0A=
	>$$(myelement, myelement2, 'a', ['myid', myid2, 'myid3'], =
document.getElementsByTagName('div')) //an array containing:=0A=
	>// the element referenced as myelement if existing,=0A=
	>// the element referenced as myelement2 if existing,=0A=
	>// all the elements with a as tag in the page,=0A=
	>// the element with id =3D myid if existing=0A=
	>// the element with id =3D myid2 if existing=0A=
	>// the element with id =3D myid3 if existing=0A=
	>// all the elements with div as tag in the page=0A=
=0A=
Returns:=0A=
	array - array of all the dom elements matched, extended with <$>.  =
Returns as <Elements>.=0A=
*/=0A=
=0A=
document.getElementsBySelector =3D document.getElementsByTagName;=0A=
=0A=
function $$(){=0A=
	var elements =3D [];=0A=
	for (var i =3D 0, j =3D arguments.length; i < j; i++){=0A=
		var selector =3D arguments[i];=0A=
		switch($type(selector)){=0A=
			case 'element': elements.push(selector);=0A=
			case 'boolean': break;=0A=
			case false: break;=0A=
			case 'string': selector =3D document.getElementsBySelector(selector, =
true);=0A=
			default: elements.extend(selector);=0A=
		}=0A=
	}=0A=
	return $$.unique(elements);=0A=
};=0A=
=0A=
$$.unique =3D function(array){=0A=
	var elements =3D [];=0A=
	for (var i =3D 0, l =3D array.length; i < l; i++){=0A=
		if (array[i].$included) continue;=0A=
		var element =3D $(array[i]);=0A=
		if (element && !element.$included){=0A=
			element.$included =3D true;=0A=
			elements.push(element);=0A=
		}=0A=
	}=0A=
	for (var i =3D 0, l =3D elements.length; i < l; i++) =
elements[i].$included =3D null;=0A=
	return new Elements(elements);=0A=
};=0A=
=0A=
Elements.Multi =3D function(property){=0A=
	return function(){=0A=
		var args =3D arguments;=0A=
		var items =3D [];=0A=
		var elements =3D true;=0A=
		for (var i =3D 0, j =3D this.length, returns; i < j; i++){=0A=
			returns =3D this[i][property].apply(this[i], args);=0A=
			if ($type(returns) !=3D 'element') elements =3D false;=0A=
			items.push(returns);=0A=
		};=0A=
		return (elements) ? $$.unique(items) : items;=0A=
	};=0A=
};=0A=
=0A=
Element.extend =3D function(properties){=0A=
	for (var property in properties){=0A=
		HTMLElement.prototype[property] =3D properties[property];=0A=
		Element.prototype[property] =3D properties[property];=0A=
		Element[property] =3D $native.generic(property);=0A=
		var elementsProperty =3D (Array.prototype[property]) ? property + =
'Elements' : property;=0A=
		Elements.prototype[elementsProperty] =3D Elements.Multi(property);=0A=
	}=0A=
};=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: set=0A=
		you can set events, styles and properties with this shortcut. same as =
calling new Element.=0A=
	*/=0A=
=0A=
	set: function(props){=0A=
		for (var prop in props){=0A=
			var val =3D props[prop];=0A=
			switch(prop){=0A=
				case 'styles': this.setStyles(val); break;=0A=
				case 'events': if (this.addEvents) this.addEvents(val); break;=0A=
				case 'properties': this.setProperties(val); break;=0A=
				default: this.setProperty(prop, val);=0A=
			}=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	inject: function(el, where){=0A=
		el =3D $(el);=0A=
		switch(where){=0A=
			case 'before': el.parentNode.insertBefore(this, el); break;=0A=
			case 'after':=0A=
				var next =3D el.getNext();=0A=
				if (!next) el.parentNode.appendChild(this);=0A=
				else el.parentNode.insertBefore(this, next);=0A=
				break;=0A=
			case 'top':=0A=
				var first =3D el.firstChild;=0A=
				if (first){=0A=
					el.insertBefore(this, first);=0A=
					break;=0A=
				}=0A=
			default: el.appendChild(this);=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: injectBefore=0A=
		Inserts the Element before the passed element.=0A=
=0A=
	Arguments:=0A=
		el - an element reference or the id of the element to be injected in.=0A=
=0A=
	Example:=0A=
		>html:=0A=
		><div id=3D"myElement"></div>=0A=
		><div id=3D"mySecondElement"></div>=0A=
		>js:=0A=
		>$('mySecondElement').injectBefore('myElement');=0A=
		>resulting html:=0A=
		><div id=3D"mySecondElement"></div>=0A=
		><div id=3D"myElement"></div>=0A=
	*/=0A=
=0A=
	injectBefore: function(el){=0A=
		return this.inject(el, 'before');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: injectAfter=0A=
		Same as <Element.injectBefore>, but inserts the element after.=0A=
	*/=0A=
=0A=
	injectAfter: function(el){=0A=
		return this.inject(el, 'after');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: injectInside=0A=
		Same as <Element.injectBefore>, but inserts the element inside.=0A=
	*/=0A=
=0A=
	injectInside: function(el){=0A=
		return this.inject(el, 'bottom');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: injectTop=0A=
		Same as <Element.injectInside>, but inserts the element inside, at the =
top.=0A=
	*/=0A=
=0A=
	injectTop: function(el){=0A=
		return this.inject(el, 'top');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: adopt=0A=
		Inserts the passed elements inside the Element.=0A=
=0A=
	Arguments:=0A=
		accepts elements references, element ids as string, selectors =
($$('stuff')) / array of elements, array of ids as strings and =
collections.=0A=
	*/=0A=
=0A=
	adopt: function(){=0A=
		var elements =3D [];=0A=
		$each(arguments, function(argument){=0A=
			elements =3D elements.concat(argument);=0A=
		});=0A=
		$$(elements).inject(this);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: remove=0A=
		Removes the Element from the DOM.=0A=
=0A=
	Example:=0A=
		>$('myElement').remove() //bye bye=0A=
	*/=0A=
=0A=
	remove: function(){=0A=
		return this.parentNode.removeChild(this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: clone=0A=
		Clones the Element and returns the cloned one.=0A=
=0A=
	Arguments:=0A=
		contents - boolean, when true the Element is cloned with childNodes, =
default true=0A=
=0A=
	Returns:=0A=
		the cloned element=0A=
=0A=
	Example:=0A=
		>var clone =3D $('myElement').clone().injectAfter('myElement');=0A=
		>//clones the Element and append the clone after the Element.=0A=
	*/=0A=
=0A=
	clone: function(contents){=0A=
		var el =3D $(this.cloneNode(contents !=3D=3D false));=0A=
		if (!el.$events) return el;=0A=
		el.$events =3D {};=0A=
		for (var type in this.$events) el.$events[type] =3D {=0A=
			'keys': $A(this.$events[type].keys),=0A=
			'values': $A(this.$events[type].values)=0A=
		};=0A=
		return el.removeEvents();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: replaceWith=0A=
		Replaces the Element with an element passed.=0A=
=0A=
	Arguments:=0A=
		el - a string representing the element to be injected in (myElementId, =
or div), or an element reference.=0A=
		If you pass div or another tag, the element will be created.=0A=
=0A=
	Returns:=0A=
		the passed in element=0A=
=0A=
	Example:=0A=
		>$('myOldElement').replaceWith($('myNewElement')); //$('myOldElement') =
is gone, and $('myNewElement') is in its place.=0A=
	*/=0A=
=0A=
	replaceWith: function(el){=0A=
		el =3D $(el);=0A=
		this.parentNode.replaceChild(el, this);=0A=
		return el;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: appendText=0A=
		Appends text node to a DOM element.=0A=
=0A=
	Arguments:=0A=
		text - the text to append.=0A=
=0A=
	Example:=0A=
		><div id=3D"myElement">hey</div>=0A=
		>$('myElement').appendText(' howdy'); //myElement innerHTML is now =
"hey howdy"=0A=
	*/=0A=
=0A=
	appendText: function(text){=0A=
		if (window.ie){=0A=
			switch(this.getTag()){=0A=
				case 'style': this.styleSheet.cssText =3D text; return this;=0A=
				case 'script': return this.setProperty('text', text);=0A=
			}=0A=
		}=0A=
		this.appendChild(document.createTextNode(text));=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hasClass=0A=
		Tests the Element to see if it has the passed in className.=0A=
=0A=
	Returns:=0A=
		true - the Element has the class=0A=
		false - it doesn't=0A=
=0A=
	Arguments:=0A=
		className - string; the class name to test.=0A=
=0A=
	Example:=0A=
		><div id=3D"myElement" class=3D"testClass"></div>=0A=
		>$('myElement').hasClass('testClass'); //returns true=0A=
	*/=0A=
=0A=
	hasClass: function(className){=0A=
		return this.className.contains(className, ' ');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: addClass=0A=
		Adds the passed in class to the Element, if the element doesnt already =
have it.=0A=
=0A=
	Arguments:=0A=
		className - string; the class name to add=0A=
=0A=
	Example:=0A=
		><div id=3D"myElement" class=3D"testClass"></div>=0A=
		>$('myElement').addClass('newClass'); //<div id=3D"myElement" =
class=3D"testClass newClass"></div>=0A=
	*/=0A=
=0A=
	addClass: function(className){=0A=
		if (!this.hasClass(className)) this.className =3D (this.className + ' =
' + className).clean();=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: removeClass=0A=
		Works like <Element.addClass>, but removes the class from the element.=0A=
	*/=0A=
=0A=
	removeClass: function(className){=0A=
		this.className =3D this.className.replace(new RegExp('(^|\\s)' + =
className + '(?:\\s|$)'), '$1').clean();=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toggleClass=0A=
		Adds or removes the passed in class name to the element, depending on =
if it's present or not.=0A=
=0A=
	Arguments:=0A=
		className - the class to add or remove=0A=
=0A=
	Example:=0A=
		><div id=3D"myElement" class=3D"myClass"></div>=0A=
		>$('myElement').toggleClass('myClass');=0A=
		><div id=3D"myElement" class=3D""></div>=0A=
		>$('myElement').toggleClass('myClass');=0A=
		><div id=3D"myElement" class=3D"myClass"></div>=0A=
	*/=0A=
=0A=
	toggleClass: function(className){=0A=
		return this.hasClass(className) ? this.removeClass(className) : =
this.addClass(className);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setStyle=0A=
		Sets a css property to the Element.=0A=
=0A=
		Arguments:=0A=
			property - the property to set=0A=
			value - the value to which to set it; for numeric values that require =
"px" you can pass an integer=0A=
=0A=
		Example:=0A=
			>$('myElement').setStyle('width', '300px'); //the width is now 300px=0A=
			>$('myElement').setStyle('width', 300); //the width is now 300px=0A=
	*/=0A=
=0A=
	setStyle: function(property, value){=0A=
		switch(property){=0A=
			case 'opacity': return this.setOpacity(parseFloat(value));=0A=
			case 'float': property =3D (window.ie) ? 'styleFloat' : 'cssFloat';=0A=
		}=0A=
		property =3D property.camelCase();=0A=
		switch($type(value)){=0A=
			case 'number': if (!['zIndex', 'zoom'].contains(property)) value +=3D =
'px'; break;=0A=
			case 'array': value =3D 'rgb(' + value.join(',') + ')';=0A=
		}=0A=
		this.style[property] =3D value;=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setStyles=0A=
		Applies a collection of styles to the Element.=0A=
=0A=
	Arguments:=0A=
		source - an object or string containing all the styles to apply. When =
its a string it overrides old style.=0A=
=0A=
	Examples:=0A=
		>$('myElement').setStyles({=0A=
		>	border: '1px solid #000',=0A=
		>	width: 300,=0A=
		>	height: 400=0A=
		>});=0A=
=0A=
		OR=0A=
=0A=
		>$('myElement').setStyles('border: 1px solid #000; width: 300px; =
height: 400px;');=0A=
	*/=0A=
=0A=
	setStyles: function(source){=0A=
		switch($type(source)){=0A=
			case 'object': Element.setMany(this, 'setStyle', source); break;=0A=
			case 'string': this.style.cssText =3D source;=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setOpacity=0A=
		Sets the opacity of the Element, and sets also visibility =3D=3D =
"hidden" if opacity =3D=3D 0, and visibility =3D "visible" if opacity > =
0.=0A=
=0A=
	Arguments:=0A=
		opacity - float; Accepts values from 0 to 1.=0A=
=0A=
	Example:=0A=
		>$('myElement').setOpacity(0.5) //make it 50% transparent=0A=
	*/=0A=
=0A=
	setOpacity: function(opacity){=0A=
		if (opacity =3D=3D 0){=0A=
			if (this.style.visibility !=3D "hidden") this.style.visibility =3D =
"hidden";=0A=
		} else {=0A=
			if (this.style.visibility !=3D "visible") this.style.visibility =3D =
"visible";=0A=
		}=0A=
		if (!this.currentStyle || !this.currentStyle.hasLayout) =
this.style.zoom =3D 1;=0A=
		if (window.ie) this.style.filter =3D (opacity =3D=3D 1) ? '' : =
"alpha(opacity=3D" + opacity * 100 + ")";=0A=
		this.style.opacity =3D this.$tmp.opacity =3D opacity;=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getStyle=0A=
		Returns the style of the Element given the property passed in.=0A=
=0A=
	Arguments:=0A=
		property - the css style property you want to retrieve=0A=
=0A=
	Example:=0A=
		>$('myElement').getStyle('width'); //returns "400px"=0A=
		>//but you can also use=0A=
		>$('myElement').getStyle('width').toInt(); //returns 400=0A=
=0A=
	Returns:=0A=
		the style as a string=0A=
	*/=0A=
=0A=
	getStyle: function(property){=0A=
		property =3D property.camelCase();=0A=
		var result =3D this.style[property];=0A=
		if (!$chk(result)){=0A=
			if (property =3D=3D 'opacity') return this.$tmp.opacity;=0A=
			var result =3D [];=0A=
			for (var style in Element.Styles){=0A=
				if (property =3D=3D style){=0A=
					Element.Styles[style].each(function(s){=0A=
						var style =3D this.getStyle(s);=0A=
						result.push(parseInt(style) ? style : '0px');=0A=
					}, this);=0A=
					if (property =3D=3D 'border'){=0A=
						var every =3D result.every(function(bit){=0A=
							return (bit =3D=3D result[0]);=0A=
						});=0A=
						return (every) ? result[0] : false;=0A=
					}=0A=
					return result.join(' ');=0A=
				}=0A=
			}=0A=
			if (property.contains('border')){=0A=
				if (Element.Styles.border.contains(property)){=0A=
					return ['Width', 'Style', 'Color'].map(function(p){=0A=
						return this.getStyle(property + p);=0A=
					}, this).join(' ');=0A=
				} else if (Element.borderShort.contains(property)){=0A=
					return ['Top', 'Right', 'Bottom', 'Left'].map(function(p){=0A=
						return this.getStyle('border' + p + property.replace('border', =
''));=0A=
					}, this).join(' ');=0A=
				}=0A=
			}=0A=
			if (document.defaultView) result =3D =
document.defaultView.getComputedStyle(this, =
null).getPropertyValue(property.hyphenate());=0A=
			else if (this.currentStyle) result =3D this.currentStyle[property];=0A=
		}=0A=
		if (window.ie) result =3D Element.fixStyle(property, result, this);=0A=
		if (result && property.test(/color/i) && result.contains('rgb')){=0A=
			return result.split('rgb').splice(1,4).map(function(color){=0A=
				return color.rgbToHex();=0A=
			}).join(' ');=0A=
		}=0A=
		return result;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getStyles=0A=
		Returns an object of styles of the Element for each argument passed in.=0A=
		Arguments:=0A=
		properties - strings; any number of style properties=0A=
	Example:=0A=
		>$('myElement').getStyles('width','height','padding');=0A=
		>//returns an object like:=0A=
		>{width: "10px", height: "10px", padding: "10px 0px 10px 0px"}=0A=
	*/=0A=
=0A=
	getStyles: function(){=0A=
		return Element.getMany(this, 'getStyle', arguments);=0A=
	},=0A=
=0A=
	walk: function(brother, start){=0A=
		brother +=3D 'Sibling';=0A=
		var el =3D (start) ? this[start] : this[brother];=0A=
		while (el && $type(el) !=3D 'element') el =3D el[brother];=0A=
		return $(el);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getPrevious=0A=
		Returns the previousSibling of the Element, excluding text nodes.=0A=
=0A=
	Example:=0A=
		>$('myElement').getPrevious(); //get the previous DOM element from =
myElement=0A=
=0A=
	Returns:=0A=
		the sibling element or undefined if none found.=0A=
	*/=0A=
=0A=
	getPrevious: function(){=0A=
		return this.walk('previous');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getNext=0A=
		Works as Element.getPrevious, but tries to find the nextSibling.=0A=
	*/=0A=
=0A=
	getNext: function(){=0A=
		return this.walk('next');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getFirst=0A=
		Works as <Element.getPrevious>, but tries to find the firstChild.=0A=
	*/=0A=
=0A=
	getFirst: function(){=0A=
		return this.walk('next', 'firstChild');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getLast=0A=
		Works as <Element.getPrevious>, but tries to find the lastChild.=0A=
	*/=0A=
=0A=
	getLast: function(){=0A=
		return this.walk('previous', 'lastChild');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getParent=0A=
		returns the $(element.parentNode)=0A=
	*/=0A=
=0A=
	getParent: function(){=0A=
		return $(this.parentNode);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getChildren=0A=
		returns all the $(element.childNodes), excluding text nodes. Returns =
as <Elements>.=0A=
	*/=0A=
=0A=
	getChildren: function(){=0A=
		return $$(this.childNodes);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hasChild=0A=
		returns true if the passed in element is a child of the $(element).=0A=
	*/=0A=
=0A=
	hasChild: function(el) {=0A=
		return !!$A(this.getElementsByTagName('*')).contains(el);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getProperty=0A=
		Gets the an attribute of the Element.=0A=
=0A=
	Arguments:=0A=
		property - string; the attribute to retrieve=0A=
=0A=
	Example:=0A=
		>$('myImage').getProperty('src') // returns whatever.gif=0A=
=0A=
	Returns:=0A=
		the value, or an empty string=0A=
	*/=0A=
=0A=
	getProperty: function(property){=0A=
		var index =3D Element.Properties[property];=0A=
		if (index) return this[index];=0A=
		if (!window.ie) return this.getAttribute(property);=0A=
		var node =3D this.attributes[property];=0A=
		return (node) ? node.nodeValue : null;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: removeProperty=0A=
		Removes an attribute from the Element=0A=
=0A=
	Arguments:=0A=
		property - string; the attribute to remove=0A=
	*/=0A=
=0A=
	removeProperty: function(property){=0A=
		var index =3D Element.Properties[property];=0A=
		if (index) this[index] =3D '';=0A=
		else this.removeAttribute(property);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getProperties=0A=
		same as <Element.getStyles>, but for properties=0A=
	*/=0A=
=0A=
	getProperties: function(){=0A=
		return Element.getMany(this, 'getProperty', arguments);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setProperty=0A=
		Sets an attribute for the Element.=0A=
=0A=
	Arguments:=0A=
		property - string; the property to assign the value passed in=0A=
		value - the value to assign to the property passed in=0A=
=0A=
	Example:=0A=
		>$('myImage').setProperty('src', 'whatever.gif'); //myImage now points =
to whatever.gif for its source=0A=
	*/=0A=
=0A=
	setProperty: function(property, value){=0A=
		var index =3D Element.Properties[property];=0A=
		if (index) this[index] =3D value;=0A=
		else this.setAttribute(property, value);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setProperties=0A=
		Sets numerous attributes for the Element.=0A=
=0A=
	Arguments:=0A=
		source - an object with key/value pairs.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		$('myElement').setProperties({=0A=
			src: 'whatever.gif',=0A=
			alt: 'whatever dude'=0A=
		});=0A=
		<img src=3D"whatever.gif" alt=3D"whatever dude">=0A=
		(end)=0A=
	*/=0A=
=0A=
	setProperties: function(source){=0A=
		return Element.setMany(this, 'setProperty', source);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setHTML=0A=
		Sets the innerHTML of the Element.=0A=
=0A=
	Arguments:=0A=
		html - string; the new innerHTML for the element.=0A=
=0A=
	Example:=0A=
		>$('myElement').setHTML(newHTML) //the innerHTML of myElement is now =
=3D newHTML=0A=
	*/=0A=
=0A=
	setHTML: function(){=0A=
		this.innerHTML =3D $A(arguments).join('');=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getTag=0A=
		Returns the tagName of the element in lower case.=0A=
=0A=
	Example:=0A=
		>$('myImage').getTag() // returns 'img'=0A=
=0A=
	Returns:=0A=
		The tag name in lower case=0A=
	*/=0A=
=0A=
	getTag: function(){=0A=
		return this.tagName.toLowerCase();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: empty=0A=
		Empties an element of all its children.=0A=
=0A=
	Example:=0A=
		>$('myDiv').empty() // empties the Div and returns it=0A=
=0A=
	Returns:=0A=
		The element.=0A=
	*/=0A=
=0A=
	empty: function(){=0A=
		Garbage.trash(this.getElementsByTagName('*'));=0A=
		return this.setHTML('');=0A=
	}=0A=
=0A=
});=0A=
=0A=
Element.fixStyle =3D function(property, result, element){=0A=
	if ($chk(parseInt(result))) return result;=0A=
	if (['height', 'width'].contains(property)){=0A=
		var values =3D (property =3D=3D 'width') ? ['left', 'right'] : ['top', =
'bottom'];=0A=
		var size =3D 0;=0A=
		values.each(function(value){=0A=
			size +=3D element.getStyle('border-' + value + '-width').toInt() + =
element.getStyle('padding-' + value).toInt();=0A=
		});=0A=
		return element['offset' + property.capitalize()] - size + 'px';=0A=
	} else if (property.test(/border(.+)Width|margin|padding/)){=0A=
		return '0px';=0A=
	}=0A=
	return result;=0A=
};=0A=
=0A=
Element.Styles =3D {'border': [], 'padding': [], 'margin': []};=0A=
['Top', 'Right', 'Bottom', 'Left'].each(function(direction){=0A=
	for (var style in Element.Styles) Element.Styles[style].push(style + =
direction);=0A=
});=0A=
=0A=
Element.borderShort =3D ['borderWidth', 'borderStyle', 'borderColor'];=0A=
=0A=
Element.getMany =3D function(el, method, keys){=0A=
	var result =3D {};=0A=
	$each(keys, function(key){=0A=
		result[key] =3D el[method](key);=0A=
	});=0A=
	return result;=0A=
};=0A=
=0A=
Element.setMany =3D function(el, method, pairs){=0A=
	for (var key in pairs) el[method](key, pairs[key]);=0A=
	return el;=0A=
};=0A=
=0A=
Element.Properties =3D new Abstract({=0A=
	'class': 'className', 'for': 'htmlFor', 'colspan': 'colSpan',=0A=
	'rowspan': 'rowSpan', 'accesskey': 'accessKey', 'tabindex': 'tabIndex',=0A=
	'maxlength': 'maxLength', 'readonly': 'readOnly', 'value': 'value',=0A=
	'disabled': 'disabled', 'checked': 'checked', 'multiple': 'multiple'=0A=
});=0A=
=0A=
Element.Methods =3D {=0A=
	Listeners: {=0A=
		addListener: function(type, fn){=0A=
			if (this.addEventListener) this.addEventListener(type, fn, false);=0A=
			else this.attachEvent('on' + type, fn);=0A=
			return this;=0A=
		},=0A=
=0A=
		removeListener: function(type, fn){=0A=
			if (this.removeEventListener) this.removeEventListener(type, fn, =
false);=0A=
			else this.detachEvent('on' + type, fn);=0A=
			return this;=0A=
		}=0A=
	}=0A=
};=0A=
=0A=
window.extend(Element.Methods.Listeners);=0A=
document.extend(Element.Methods.Listeners);=0A=
Element.extend(Element.Methods.Listeners);=0A=
=0A=
var Garbage =3D {=0A=
=0A=
	elements: [],=0A=
=0A=
	collect: function(el){=0A=
		if (!el.$tmp){=0A=
			Garbage.elements.push(el);=0A=
			el.$tmp =3D {'opacity': 1};=0A=
		}=0A=
		return el;=0A=
	},=0A=
=0A=
	trash: function(elements){=0A=
		for (var i =3D 0, j =3D elements.length, el; i < j; i++){=0A=
			if (!(el =3D elements[i]) || !el.$tmp) continue;=0A=
			if (el.$events) el.fireEvent('trash').removeEvents();=0A=
			for (var p in el.$tmp) el.$tmp[p] =3D null;=0A=
			for (var p in Element.prototype) el[p] =3D null;=0A=
			el.htmlElement =3D el.$tmp =3D el =3D null;=0A=
			Garbage.elements.remove(el);=0A=
		}=0A=
	},=0A=
=0A=
	empty: function(){=0A=
		Garbage.collect(window);=0A=
		Garbage.collect(document);=0A=
		Garbage.trash(Garbage.elements);=0A=
	}=0A=
=0A=
};=0A=
=0A=
=0A=
window.addListener('beforeunload', function(){=0A=
	window.addListener('unload', Garbage.empty);=0A=
	if (window.ie) window.addListener('unload', CollectGarbage);=0A=
});=0A=
=0A=
/*=0A=
Script: Element.Event.js=0A=
	Contains the Event Class, Element methods to deal with Element events, =
custom Events, and the Function prototype bindWithEvent.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Event=0A=
	Cross browser methods to manage events.=0A=
=0A=
Arguments:=0A=
	event - the event=0A=
=0A=
Properties:=0A=
	shift - true if the user pressed the shift=0A=
	control - true if the user pressed the control=0A=
	alt - true if the user pressed the alt=0A=
	meta - true if the user pressed the meta key=0A=
	wheel - the amount of third button scrolling=0A=
	code - the keycode of the key pressed=0A=
	page.x - the x position of the mouse, relative to the full window=0A=
	page.y - the y position of the mouse, relative to the full window=0A=
	client.x - the x position of the mouse, relative to the viewport=0A=
	client.y - the y position of the mouse, relative to the viewport=0A=
	key - the key pressed as a lowercase string. key also returns 'enter', =
'up', 'down', 'left', 'right', 'space', 'backspace', 'delete', 'esc'. =
Handy for these special keys.=0A=
	target - the event target=0A=
	relatedTarget - the event related target=0A=
=0A=
Example:=0A=
	(start code)=0A=
	$('myLink').onkeydown =3D function(event){=0A=
		var event =3D new Event(event);=0A=
		//event is now the Event class.=0A=
		alert(event.key); //returns the lowercase letter pressed=0A=
		alert(event.shift); //returns true if the key pressed is shift=0A=
		if (event.key =3D=3D 's' && event.control) alert('document saved');=0A=
	};=0A=
	(end)=0A=
*/=0A=
=0A=
var Event =3D new Class({=0A=
=0A=
	initialize: function(event){=0A=
		if (event && event.$extended) return event;=0A=
		this.$extended =3D true;=0A=
		event =3D event || window.event;=0A=
		this.event =3D event;=0A=
		this.type =3D event.type;=0A=
		this.target =3D event.target || event.srcElement;=0A=
		if (this.target.nodeType =3D=3D 3) this.target =3D =
this.target.parentNode;=0A=
		this.shift =3D event.shiftKey;=0A=
		this.control =3D event.ctrlKey;=0A=
		this.alt =3D event.altKey;=0A=
		this.meta =3D event.metaKey;=0A=
		if (['DOMMouseScroll', 'mousewheel'].contains(this.type)){=0A=
			this.wheel =3D (event.wheelDelta) ? event.wheelDelta / 120 : =
-(event.detail || 0) / 3;=0A=
		} else if (this.type.contains('key')){=0A=
			this.code =3D event.which || event.keyCode;=0A=
			for (var name in Event.keys){=0A=
				if (Event.keys[name] =3D=3D this.code){=0A=
					this.key =3D name;=0A=
					break;=0A=
				}=0A=
			}=0A=
			if (this.type =3D=3D 'keydown'){=0A=
				var fKey =3D this.code - 111;=0A=
				if (fKey > 0 && fKey < 13) this.key =3D 'f' + fKey;=0A=
			}=0A=
			this.key =3D this.key || String.fromCharCode(this.code).toLowerCase();=0A=
		} else if (this.type.test(/(click|mouse|menu)/)){=0A=
			this.page =3D {=0A=
				'x': event.pageX || event.clientX + =
document.documentElement.scrollLeft,=0A=
				'y': event.pageY || event.clientY + =
document.documentElement.scrollTop=0A=
			};=0A=
			this.client =3D {=0A=
				'x': event.pageX ? event.pageX - window.pageXOffset : event.clientX,=0A=
				'y': event.pageY ? event.pageY - window.pageYOffset : event.clientY=0A=
			};=0A=
			this.rightClick =3D (event.which =3D=3D 3) || (event.button =3D=3D 2);=0A=
			switch(this.type){=0A=
				case 'mouseover': this.relatedTarget =3D event.relatedTarget || =
event.fromElement; break;=0A=
				case 'mouseout': this.relatedTarget =3D event.relatedTarget || =
event.toElement;=0A=
			}=0A=
			this.fixRelatedTarget();=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: stop=0A=
		cross browser method to stop an event=0A=
	*/=0A=
=0A=
	stop: function() {=0A=
		return this.stopPropagation().preventDefault();=0A=
	},=0A=
=0A=
	/*=0A=
	Property: stopPropagation=0A=
		cross browser method to stop the propagation of an event=0A=
	*/=0A=
=0A=
	stopPropagation: function(){=0A=
		if (this.event.stopPropagation) this.event.stopPropagation();=0A=
		else this.event.cancelBubble =3D true;=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: preventDefault=0A=
		cross browser method to prevent the default action of the event=0A=
	*/=0A=
=0A=
	preventDefault: function(){=0A=
		if (this.event.preventDefault) this.event.preventDefault();=0A=
		else this.event.returnValue =3D false;=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
Event.fix =3D {=0A=
=0A=
	relatedTarget: function(){=0A=
		if (this.relatedTarget && this.relatedTarget.nodeType =3D=3D 3) =
this.relatedTarget =3D this.relatedTarget.parentNode;=0A=
	},=0A=
=0A=
	relatedTargetGecko: function(){=0A=
		try {Event.fix.relatedTarget.call(this)} catch(e){this.relatedTarget =
=3D this.target};=0A=
	}=0A=
=0A=
};=0A=
=0A=
Event.prototype.fixRelatedTarget =3D (window.gecko) ? =
Event.fix.relatedTargetGecko : Event.fix.relatedTarget;=0A=
=0A=
/*=0A=
Property: keys=0A=
	you can add additional Event keys codes this way:=0A=
=0A=
Example:=0A=
	(start code)=0A=
	Event.keys.whatever =3D 80;=0A=
	$(myelement).addEvent(keydown, function(event){=0A=
		event =3D new Event(event);=0A=
		if (event.key =3D=3D 'whatever') console.log(whatever key clicked).=0A=
	});=0A=
	(end)=0A=
*/=0A=
=0A=
Event.keys =3D new Abstract({=0A=
	'enter': 13,=0A=
	'up': 38,=0A=
	'down': 40,=0A=
	'left': 37,=0A=
	'right': 39,=0A=
	'esc': 27,=0A=
	'space': 32,=0A=
	'backspace': 8,=0A=
	'tab': 9,=0A=
	'delete': 46=0A=
});=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.Methods.Events =3D {=0A=
=0A=
	/*=0A=
	Property: addEvent=0A=
		Attaches an event listener to a DOM element.=0A=
=0A=
	Arguments:=0A=
		type - the event to monitor ('click', 'load', etc) without the prefix =
'on'.=0A=
		fn - the function to execute=0A=
=0A=
	Example:=0A=
		>$('myElement').addEvent('click', function(){alert('clicked!')});=0A=
	*/=0A=
=0A=
	addEvent: function(type, fn){=0A=
		this.$events =3D this.$events || {};=0A=
		this.$events[type] =3D this.$events[type] || {'keys': [], 'values': =
[]};=0A=
		if (this.$events[type].keys.contains(fn)) return this;=0A=
		this.$events[type].keys.push(fn);=0A=
		var realType =3D type;=0A=
		var custom =3D Element.Events[type];=0A=
		if (custom){=0A=
			if (custom.add) custom.add.call(this, fn);=0A=
			if (custom.map) fn =3D custom.map;=0A=
			if (custom.type) realType =3D custom.type;=0A=
		}=0A=
		if (!this.addEventListener) fn =3D fn.create({'bind': this, 'event': =
true});=0A=
		this.$events[type].values.push(fn);=0A=
		return this.addListener(realType, fn);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: removeEvent=0A=
		Works as Element.addEvent, but instead removes the previously added =
event listener.=0A=
	*/=0A=
=0A=
	removeEvent: function(type, fn){=0A=
		if (!this.$events || !this.$events[type]) return this;=0A=
		var pos =3D this.$events[type].keys.indexOf(fn);=0A=
		if (pos =3D=3D -1) return this;=0A=
		var key =3D this.$events[type].keys.splice(pos,1)[0];=0A=
		var value =3D this.$events[type].values.splice(pos,1)[0];=0A=
		var custom =3D Element.Events[type];=0A=
		if (custom){=0A=
			if (custom.remove) custom.remove.call(this, fn);=0A=
			if (custom.type) type =3D custom.type;=0A=
		}=0A=
		return this.removeListener(type, value);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: addEvents=0A=
		As <addEvent>, but accepts an object and add multiple events at once.=0A=
	*/=0A=
=0A=
	addEvents: function(source){=0A=
		return Element.setMany(this, 'addEvent', source);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: removeEvents=0A=
		removes all events of a certain type from an element. if no argument =
is passed in, removes all events.=0A=
=0A=
	Arguments:=0A=
		type - string; the event name (e.g. 'click')=0A=
	*/=0A=
=0A=
	removeEvents: function(type){=0A=
		if (!this.$events) return this;=0A=
		if (!type){=0A=
			for (var evType in this.$events) this.removeEvents(evType);=0A=
			this.$events =3D null;=0A=
		} else if (this.$events[type]){=0A=
			this.$events[type].keys.each(function(fn){=0A=
				this.removeEvent(type, fn);=0A=
			}, this);=0A=
			this.$events[type] =3D null;=0A=
		}=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: fireEvent=0A=
		executes all events of the specified type present in the element.=0A=
=0A=
	Arguments:=0A=
		type - string; the event name (e.g. 'click')=0A=
		args - array or single object; arguments to pass to the function; if =
more than one argument, must be an array=0A=
		delay - (integer) delay (in ms) to wait to execute the event=0A=
	*/=0A=
=0A=
	fireEvent: function(type, args, delay){=0A=
		if (!this.$events || !this.$events[type]) return this;=0A=
		this.$events[type].keys.each(function(fn){=0A=
			fn.create({'bind': this, 'delay': delay, 'arguments': args})();=0A=
		}, this);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: cloneEvents=0A=
		Clones all events from an element to this element.=0A=
=0A=
	Arguments:=0A=
		from - element, copy all events from this element=0A=
		type - optional, copies only events of this type=0A=
	*/=0A=
=0A=
	cloneEvents: function(from, type){=0A=
		if (!from.$events) return this;=0A=
		if (!type){=0A=
			for (var evType in from.$events) this.cloneEvents(from, evType);=0A=
		} else if (from.$events[type]){=0A=
			from.$events[type].keys.each(function(fn){=0A=
				this.addEvent(type, fn);=0A=
			}, this);=0A=
		}=0A=
		return this;=0A=
	}=0A=
=0A=
};=0A=
=0A=
window.extend(Element.Methods.Events);=0A=
document.extend(Element.Methods.Events);=0A=
Element.extend(Element.Methods.Events);=0A=
=0A=
/* Section: Custom Events */=0A=
=0A=
Element.Events =3D new Abstract({=0A=
=0A=
	/*=0A=
	Event: mouseenter=0A=
		In addition to the standard javascript events (load, mouseover, =
mouseout, click, etc.) <Event.js> contains two custom events=0A=
		this event fires when the mouse enters the area of the dom element; =
will not be fired again if the mouse crosses over children of the =
element (unlike mouseover)=0A=
=0A=
=0A=
	Example:=0A=
		>$(myElement).addEvent('mouseenter', myFunction);=0A=
	*/=0A=
=0A=
	'mouseenter': {=0A=
		type: 'mouseover',=0A=
		map: function(event){=0A=
			event =3D new Event(event);=0A=
			if (event.relatedTarget =3D=3D this || =
this.hasChild(event.relatedTarget)) return;=0A=
			this.fireEvent('mouseenter', event);=0A=
		}=0A=
	},=0A=
=0A=
	/*=0A=
	Event: mouseleave=0A=
		this event fires when the mouse exits the area of the dom element; =
will not be fired again if the mouse crosses over children of the =
element (unlike mouseout)=0A=
=0A=
=0A=
	Example:=0A=
		>$(myElement).addEvent('mouseleave', myFunction);=0A=
	*/=0A=
=0A=
	'mouseleave': {=0A=
		type: 'mouseout',=0A=
		map: function(event){=0A=
			event =3D new Event(event);=0A=
			if (event.relatedTarget =3D=3D this || =
this.hasChild(event.relatedTarget)) return;=0A=
			this.fireEvent('mouseleave', event);=0A=
		}=0A=
	},=0A=
=0A=
	'mousewheel': {=0A=
		type: (window.gecko) ? 'DOMMouseScroll' : 'mousewheel'=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Function=0A=
	A collection of The Function Object prototype methods.=0A=
*/=0A=
=0A=
Function.extend({=0A=
=0A=
	/*=0A=
	Property: bindWithEvent=0A=
		automatically passes mootools Event Class.=0A=
=0A=
	Arguments:=0A=
		bind - optional, the object that the "this" of the function will refer =
to.=0A=
		args - optional, an argument to pass to the function; if more than one =
argument, it must be an array of arguments.=0A=
=0A=
	Returns:=0A=
		a function with the parameter bind as its "this" and as a pre-passed =
argument event or window.event, depending on the browser.=0A=
=0A=
	Example:=0A=
		>function myFunction(event){=0A=
		>	alert(event.client.x) //returns the coordinates of the mouse..=0A=
		>};=0A=
		>myElement.onclick =3D myFunction.bindWithEvent(myElement);=0A=
	*/=0A=
=0A=
	bindWithEvent: function(bind, args){=0A=
		return this.create({'bind': bind, 'arguments': args, 'event': Event});=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Element.Filters.js=0A=
	add Filters capability to <Elements>.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Elements=0A=
	A collection of methods to be used with <$$> elements collections.=0A=
*/=0A=
=0A=
Elements.extend({=0A=
	=0A=
	/*=0A=
	Property: filterByTag=0A=
		Filters the collection by a specified tag name.=0A=
		Returns a new Elements collection, while the original remains =
untouched.=0A=
	*/=0A=
	=0A=
	filterByTag: function(tag){=0A=
		return new Elements(this.filter(function(el){=0A=
			return (Element.getTag(el) =3D=3D tag);=0A=
		}));=0A=
	},=0A=
	=0A=
	/*=0A=
	Property: filterByClass=0A=
		Filters the collection by a specified class name.=0A=
		Returns a new Elements collection, while the original remains =
untouched.=0A=
	*/=0A=
	=0A=
	filterByClass: function(className, nocash){=0A=
		var elements =3D this.filter(function(el){=0A=
			return (el.className && el.className.contains(className, ' '));=0A=
		});=0A=
		return (nocash) ? elements : new Elements(elements);=0A=
	},=0A=
	=0A=
	/*=0A=
	Property: filterById=0A=
		Filters the collection by a specified ID.=0A=
		Returns a new Elements collection, while the original remains =
untouched.=0A=
	*/=0A=
	=0A=
	filterById: function(id, nocash){=0A=
		var elements =3D this.filter(function(el){=0A=
			return (el.id =3D=3D id);=0A=
		});=0A=
		return (nocash) ? elements : new Elements(elements);=0A=
	},=0A=
	=0A=
	/*=0A=
	Property: filterByAttribute=0A=
		Filters the collection by a specified attribute.=0A=
		Returns a new Elements collection, while the original remains =
untouched.=0A=
		=0A=
	Arguments:=0A=
		name - the attribute name.=0A=
		operator - optional, the attribute operator.=0A=
		value - optional, the attribute value, only valid if the operator is =
specified.=0A=
	*/=0A=
	=0A=
	filterByAttribute: function(name, operator, value, nocash){=0A=
		var elements =3D this.filter(function(el){=0A=
			var current =3D Element.getProperty(el, name);=0A=
			if (!current) return false;=0A=
			if (!operator) return true;=0A=
			switch(operator){=0A=
				case '=3D': return (current =3D=3D value);=0A=
				case '*=3D': return (current.contains(value));=0A=
				case '^=3D': return (current.substr(0, value.length) =3D=3D value);=0A=
				case '$=3D': return (current.substr(current.length - value.length) =
=3D=3D value);=0A=
				case '!=3D': return (current !=3D value);=0A=
				case '~=3D': return current.contains(value, ' ');=0A=
			}=0A=
			return false;=0A=
		});=0A=
		return (nocash) ? elements : new Elements(elements);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Element.Selectors.js=0A=
	Css Query related functions and <Element> extensions=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/* Section: Utility Functions */=0A=
=0A=
/*=0A=
Function: $E=0A=
	Selects a single (i.e. the first found) Element based on the selector =
passed in and an optional filter element.=0A=
	Returns as <Element>.=0A=
=0A=
Arguments:=0A=
	selector - string; the css selector to match=0A=
	filter - optional; a DOM element to limit the scope of the selector =
match; defaults to document.=0A=
=0A=
Example:=0A=
	>$E('a', 'myElement') //find the first anchor tag inside the DOM =
element with id 'myElement'=0A=
=0A=
Returns:=0A=
	a DOM element - the first element that matches the selector=0A=
*/=0A=
=0A=
function $E(selector, filter){=0A=
	return ($(filter) || document).getElement(selector);=0A=
};=0A=
=0A=
/*=0A=
Function: $ES=0A=
	Returns a collection of Elements that match the selector passed in =
limited to the scope of the optional filter.=0A=
	See Also: <Element.getElements> for an alternate syntax.=0A=
	Returns as <Elements>.=0A=
=0A=
Returns:=0A=
	an array of dom elements that match the selector within the filter=0A=
=0A=
Arguments:=0A=
	selector - string; css selector to match=0A=
	filter - optional; a DOM element to limit the scope of the selector =
match; defaults to document.=0A=
=0A=
Examples:=0A=
	>$ES("a") //gets all the anchor tags; synonymous with $$("a")=0A=
	>$ES('a','myElement') //get all the anchor tags within $('myElement')=0A=
*/=0A=
=0A=
function $ES(selector, filter){=0A=
	return ($(filter) || document).getElementsBySelector(selector);=0A=
};=0A=
=0A=
$$.shared =3D {=0A=
=0A=
	'regexp': =
/^(\w*|\*)(?:#([\w-]+)|\.([\w-]+))?(?:\[(\w+)(?:([!*^$]?=3D)["']?([^"'\]]=
*)["']?)?])?$/,=0A=
	=0A=
	'xpath': {=0A=
=0A=
		getParam: function(items, context, param, i){=0A=
			var temp =3D [context.namespaceURI ? 'xhtml:' : '', param[1]];=0A=
			if (param[2]) temp.push('[@id=3D"', param[2], '"]');=0A=
			if (param[3]) temp.push('[contains(concat(" ", @class, " "), " ', =
param[3], ' ")]');=0A=
			if (param[4]){=0A=
				if (param[5] && param[6]){=0A=
					switch(param[5]){=0A=
						case '*=3D': temp.push('[contains(@', param[4], ', "', param[6], =
'")]'); break;=0A=
						case '^=3D': temp.push('[starts-with(@', param[4], ', "', =
param[6], '")]'); break;=0A=
						case '$=3D': temp.push('[substring(@', param[4], ', =
string-length(@', param[4], ') - ', param[6].length, ' + 1) =3D "', =
param[6], '"]'); break;=0A=
						case '=3D': temp.push('[@', param[4], '=3D"', param[6], '"]'); =
break;=0A=
						case '!=3D': temp.push('[@', param[4], '!=3D"', param[6], '"]');=0A=
					}=0A=
				} else {=0A=
					temp.push('[@', param[4], ']');=0A=
				}=0A=
			}=0A=
			items.push(temp.join(''));=0A=
			return items;=0A=
		},=0A=
		=0A=
		getItems: function(items, context, nocash){=0A=
			var elements =3D [];=0A=
			var xpath =3D document.evaluate('.//' + items.join('//'), context, =
$$.shared.resolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);=0A=
			for (var i =3D 0, j =3D xpath.snapshotLength; i < j; i++) =
elements.push(xpath.snapshotItem(i));=0A=
			return (nocash) ? elements : new Elements(elements.map($));=0A=
		}=0A=
=0A=
	},=0A=
	=0A=
	'normal': {=0A=
		=0A=
		getParam: function(items, context, param, i){=0A=
			if (i =3D=3D 0){=0A=
				if (param[2]){=0A=
					var el =3D context.getElementById(param[2]);=0A=
					if (!el || ((param[1] !=3D '*') && (Element.getTag(el) !=3D =
param[1]))) return false;=0A=
					items =3D [el];=0A=
				} else {=0A=
					items =3D $A(context.getElementsByTagName(param[1]));=0A=
				}=0A=
			} else {=0A=
				items =3D $$.shared.getElementsByTagName(items, param[1]);=0A=
				if (param[2]) items =3D Elements.filterById(items, param[2], true);=0A=
			}=0A=
			if (param[3]) items =3D Elements.filterByClass(items, param[3], true);=0A=
			if (param[4]) items =3D Elements.filterByAttribute(items, param[4], =
param[5], param[6], true);=0A=
			return items;=0A=
		},=0A=
=0A=
		getItems: function(items, context, nocash){=0A=
			return (nocash) ? items : $$.unique(items);=0A=
		}=0A=
=0A=
	},=0A=
=0A=
	resolver: function(prefix){=0A=
		return (prefix =3D=3D 'xhtml') ? 'http://www.w3.org/1999/xhtml' : =
false;=0A=
	},=0A=
=0A=
	getElementsByTagName: function(context, tagName){=0A=
		var found =3D [];=0A=
		for (var i =3D 0, j =3D context.length; i < j; i++) =
found.extend(context[i].getElementsByTagName(tagName));=0A=
		return found;=0A=
	}=0A=
=0A=
};=0A=
=0A=
$$.shared.method =3D (window.xpath) ? 'xpath' : 'normal';=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.Methods.Dom =3D {=0A=
=0A=
	/*=0A=
	Property: getElements=0A=
		Gets all the elements within an element that match the given (single) =
selector.=0A=
		Returns as <Elements>.=0A=
=0A=
	Arguments:=0A=
		selector - string; the css selector to match=0A=
=0A=
	Examples:=0A=
		>$('myElement').getElements('a'); // get all anchors within myElement=0A=
		>$('myElement').getElements('input[name=3Ddialog]') //get all input =
tags with name 'dialog'=0A=
		>$('myElement').getElements('input[name$=3Dlog]') //get all input tags =
with names ending with 'log'=0A=
=0A=
	Notes:=0A=
		Supports these operators in attribute selectors:=0A=
=0A=
		- =3D : is equal to=0A=
		- ^=3D : starts-with=0A=
		- $=3D : ends-with=0A=
		- !=3D : is not equal to=0A=
=0A=
		Xpath is used automatically for compliant browsers.=0A=
	*/=0A=
=0A=
	getElements: function(selector, nocash){=0A=
		var items =3D [];=0A=
		selector =3D selector.trim().split(' ');=0A=
		for (var i =3D 0, j =3D selector.length; i < j; i++){=0A=
			var sel =3D selector[i];=0A=
			var param =3D sel.match($$.shared.regexp);=0A=
			if (!param) break;=0A=
			param[1] =3D param[1] || '*';=0A=
			var temp =3D $$.shared[$$.shared.method].getParam(items, this, param, =
i);=0A=
			if (!temp) break;=0A=
			items =3D temp;=0A=
		}=0A=
		return $$.shared[$$.shared.method].getItems(items, this, nocash);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getElement=0A=
		Same as <Element.getElements>, but returns only the first. Alternate =
syntax for <$E>, where filter is the Element.=0A=
		Returns as <Element>.=0A=
=0A=
	Arguments:=0A=
		selector - string; css selector=0A=
	*/=0A=
=0A=
	getElement: function(selector){=0A=
		return $(this.getElements(selector, true)[0] || false);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getElementsBySelector=0A=
		Same as <Element.getElements>, but allows for comma separated =
selectors, as in css. Alternate syntax for <$$>, where filter is the =
Element.=0A=
		Returns as <Elements>.=0A=
=0A=
	Arguments:=0A=
		selector - string; css selector=0A=
	*/=0A=
=0A=
	getElementsBySelector: function(selector, nocash){=0A=
		var elements =3D [];=0A=
		selector =3D selector.split(',');=0A=
		for (var i =3D 0, j =3D selector.length; i < j; i++) elements =3D =
elements.concat(this.getElements(selector[i], true));=0A=
		return (nocash) ? elements : $$.unique(elements);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getElementsByClassName=0A=
		Returns all the elements that match a specific class name.=0A=
		Here for compatibility purposes. can also be written: =
document.getElements('.className'), or $$('.className')=0A=
		Returns as <Elements>.=0A=
=0A=
	Arguments:=0A=
		className - string; css classname=0A=
	*/=0A=
=0A=
	getElementsByClassName: function(className){=0A=
		return this.getElements('.' + className);=0A=
	}=0A=
=0A=
};=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: getElementById=0A=
		Targets an element with the specified id found inside the Element. =
Does not overwrite document.getElementById.=0A=
=0A=
	Arguments:=0A=
		id - string; the id of the element to find.=0A=
	*/=0A=
=0A=
	getElementById: function(id){=0A=
		var el =3D document.getElementById(id);=0A=
		if (!el) return false;=0A=
		for (var parent =3D el.parentNode; parent !=3D this; parent =3D =
parent.parentNode){=0A=
			if (!parent) return false;=0A=
		}=0A=
		return el;=0A=
	}=0A=
=0A=
});=0A=
=0A=
document.extend(Element.Methods.Dom);=0A=
Element.extend(Element.Methods.Dom);=0A=
=0A=
/*=0A=
Script: Element.Form.js=0A=
	Contains Element prototypes to deal with Forms and their elements.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: getValue=0A=
		Returns the value of the Element, if its tag is textarea, select or =
input. getValue called on a multiple select will return an array.=0A=
	*/=0A=
=0A=
	getValue: function(){=0A=
		switch(this.getTag()){=0A=
			case 'select':=0A=
				var values =3D [];=0A=
				$each(this.options, function(option){=0A=
					if (option.selected) values.push($pick(option.value, option.text));=0A=
				});=0A=
				return (this.multiple) ? values : values[0];=0A=
			case 'input': if (!(this.checked && ['checkbox', =
'radio'].contains(this.type)) && !['hidden', 'text', =
'password'].contains(this.type)) break;=0A=
			case 'textarea': return this.value;=0A=
		}=0A=
		return false;=0A=
	},=0A=
=0A=
	getFormElements: function(){=0A=
		return $$(this.getElementsByTagName('input'), =
this.getElementsByTagName('select'), =
this.getElementsByTagName('textarea'));=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toQueryString=0A=
		Reads the children inputs of the Element and generates a query string, =
based on their values. Used internally in <Ajax>=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		<form id=3D"myForm" action=3D"submit.php">=0A=
		<input name=3D"email" value=3D"bob@bob.com">=0A=
		<input name=3D"zipCode" value=3D"90210">=0A=
		</form>=0A=
=0A=
		<script>=0A=
		 $('myForm').toQueryString()=0A=
		</script>=0A=
		(end)=0A=
=0A=
		Returns:=0A=
			email=3Dbob@bob.com&zipCode=3D90210=0A=
	*/=0A=
=0A=
	toQueryString: function(){=0A=
		var queryString =3D [];=0A=
		this.getFormElements().each(function(el){=0A=
			var name =3D el.name;=0A=
			var value =3D el.getValue();=0A=
			if (value =3D=3D=3D false || !name || el.disabled) return;=0A=
			var qs =3D function(val){=0A=
				queryString.push(name + '=3D' + encodeURIComponent(val));=0A=
			};=0A=
			if ($type(value) =3D=3D 'array') value.each(qs);=0A=
			else qs(value);=0A=
		});=0A=
		return queryString.join('&');=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Element.Dimensions.js=0A=
	Contains Element prototypes to deal with Element size and position in =
space.=0A=
=0A=
Note:=0A=
	The functions in this script require n XHTML doctype.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: scrollTo=0A=
		Scrolls the element to the specified coordinated (if the element has =
an overflow)=0A=
=0A=
	Arguments:=0A=
		x - the x coordinate=0A=
		y - the y coordinate=0A=
=0A=
	Example:=0A=
		>$('myElement').scrollTo(0, 100)=0A=
	*/=0A=
=0A=
	scrollTo: function(x, y){=0A=
		this.scrollLeft =3D x;=0A=
		this.scrollTop =3D y;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getSize=0A=
		Return an Object representing the size/scroll values of the element.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		$('myElement').getSize();=0A=
		(end)=0A=
=0A=
	Returns:=0A=
		(start code)=0A=
		{=0A=
			'scroll': {'x': 100, 'y': 100},=0A=
			'size': {'x': 200, 'y': 400},=0A=
			'scrollSize': {'x': 300, 'y': 500}=0A=
		}=0A=
		(end)=0A=
	*/=0A=
=0A=
	getSize: function(){=0A=
		return {=0A=
			'scroll': {'x': this.scrollLeft, 'y': this.scrollTop},=0A=
			'size': {'x': this.offsetWidth, 'y': this.offsetHeight},=0A=
			'scrollSize': {'x': this.scrollWidth, 'y': this.scrollHeight}=0A=
		};=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getPosition=0A=
		Returns the real offsets of the element.=0A=
=0A=
	Arguments:=0A=
		overflown - optional, an array of nested scrolling containers for =
scroll offset calculation, use this if your element is inside any =
element containing scrollbars=0A=
=0A=
	Example:=0A=
		>$('element').getPosition();=0A=
=0A=
	Returns:=0A=
		>{x: 100, y:500};=0A=
	*/=0A=
=0A=
	getPosition: function(overflown){=0A=
		overflown =3D overflown || [];=0A=
		var el =3D this, left =3D 0, top =3D 0;=0A=
		do {=0A=
			left +=3D el.offsetLeft || 0;=0A=
			top +=3D el.offsetTop || 0;=0A=
			el =3D el.offsetParent;=0A=
		} while (el);=0A=
		overflown.each(function(element){=0A=
			left -=3D element.scrollLeft || 0;=0A=
			top -=3D element.scrollTop || 0;=0A=
		});=0A=
		return {'x': left, 'y': top};=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getTop=0A=
		Returns the distance from the top of the window to the Element.=0A=
=0A=
	Arguments:=0A=
		overflown - optional, an array of nested scrolling containers, see =
Element::getPosition=0A=
	*/=0A=
=0A=
	getTop: function(overflown){=0A=
		return this.getPosition(overflown).y;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getLeft=0A=
		Returns the distance from the left of the window to the Element.=0A=
=0A=
	Arguments:=0A=
		overflown - optional, an array of nested scrolling containers, see =
Element::getPosition=0A=
	*/=0A=
=0A=
	getLeft: function(overflown){=0A=
		return this.getPosition(overflown).x;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getCoordinates=0A=
		Returns an object with width, height, left, right, top, and bottom, =
representing the values of the Element=0A=
=0A=
	Arguments:=0A=
		overflown - optional, an array of nested scrolling containers, see =
Element::getPosition=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var myValues =3D $('myElement').getCoordinates();=0A=
		(end)=0A=
=0A=
	Returns:=0A=
		(start code)=0A=
		{=0A=
			width: 200,=0A=
			height: 300,=0A=
			left: 100,=0A=
			top: 50,=0A=
			right: 300,=0A=
			bottom: 350=0A=
		}=0A=
		(end)=0A=
	*/=0A=
=0A=
	getCoordinates: function(overflown){=0A=
		var position =3D this.getPosition(overflown);=0A=
		var obj =3D {=0A=
			'width': this.offsetWidth,=0A=
			'height': this.offsetHeight,=0A=
			'left': position.x,=0A=
			'top': position.y=0A=
		};=0A=
		obj.right =3D obj.left + obj.width;=0A=
		obj.bottom =3D obj.top + obj.height;=0A=
		return obj;=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Window.DomReady.js=0A=
	Contains the custom event domready, for window.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/* Section: Custom Events */=0A=
=0A=
/*=0A=
Event: domready=0A=
	executes a function when the dom tree is loaded, without waiting for =
images. Only works when called from window. =0A=
=0A=
Credits:=0A=
	(c) Dean Edwards/Matthias Miller/John Resig, remastered for mootools.=0A=
=0A=
Arguments:=0A=
	fn - the function to execute when the DOM is ready=0A=
=0A=
Example:=0A=
	> window.addEvent('domready', function(){=0A=
	>	alert('the dom is ready');=0A=
	> });=0A=
*/=0A=
=0A=
Element.Events.domready =3D {=0A=
=0A=
	add: function(fn){=0A=
		if (window.loaded){=0A=
			fn.call(this);=0A=
			return;=0A=
		}=0A=
		var domReady =3D function(){=0A=
			if (window.loaded) return;=0A=
			window.loaded =3D true;=0A=
			window.timer =3D $clear(window.timer);=0A=
			this.fireEvent('domready');=0A=
		}.bind(this);=0A=
		if (document.readyState && window.webkit){=0A=
			window.timer =3D function(){=0A=
				if (['loaded','complete'].contains(document.readyState)) domReady();=0A=
			}.periodical(50);=0A=
		} else if (document.readyState && window.ie){=0A=
			if (!$('ie_ready')){=0A=
				var src =3D (window.location.protocol =3D=3D 'https:') ? '://0' : =
'javascript:void(0)';=0A=
				document.write('<script id=3D"ie_ready" defer src=3D"' + src + =
'"><\/script>');=0A=
				$('ie_ready').onreadystatechange =3D function(){=0A=
					if (this.readyState =3D=3D 'complete') domReady();=0A=
				};=0A=
			}=0A=
		} else {=0A=
			window.addListener("load", domReady);=0A=
			document.addListener("DOMContentLoaded", domReady);=0A=
		}=0A=
	}=0A=
=0A=
};=0A=
=0A=
window.onDomReady =3D function(fn){=0A=
	return this.addEvent('domready', fn);=0A=
};=0A=
=0A=
/*=0A=
Script: Window.Size.js=0A=
	Window cross-browser dimensions methods.=0A=
	=0A=
Note:=0A=
	The Functions in this script require an XHTML doctype.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: window=0A=
	Cross browser methods to get various window dimensions.=0A=
	Warning: All these methods require that the browser operates in strict =
mode, not quirks mode.=0A=
*/=0A=
=0A=
window.extend({=0A=
=0A=
	/*=0A=
	Property: getWidth=0A=
		Returns an integer representing the width of the browser window =
(without the scrollbar).=0A=
	*/=0A=
=0A=
	getWidth: function(){=0A=
		if (this.webkit419) return this.innerWidth;=0A=
		if (this.opera) return document.body.clientWidth;=0A=
		return document.documentElement.clientWidth;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getHeight=0A=
		Returns an integer representing the height of the browser window =
(without the scrollbar).=0A=
	*/=0A=
=0A=
	getHeight: function(){=0A=
		if (this.webkit419) return this.innerHeight;=0A=
		if (this.opera) return document.body.clientHeight;=0A=
		return document.documentElement.clientHeight;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getScrollWidth=0A=
		Returns an integer representing the scrollWidth of the window.=0A=
		This value is equal to or bigger than <getWidth>.=0A=
=0A=
	See Also:=0A=
		<http://developer.mozilla.org/en/docs/DOM:element.scrollWidth>=0A=
	*/=0A=
=0A=
	getScrollWidth: function(){=0A=
		if (this.ie) return Math.max(document.documentElement.offsetWidth, =
document.documentElement.scrollWidth);=0A=
		if (this.webkit) return document.body.scrollWidth;=0A=
		return document.documentElement.scrollWidth;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getScrollHeight=0A=
		Returns an integer representing the scrollHeight of the window.=0A=
		This value is equal to or bigger than <getHeight>.=0A=
=0A=
	See Also:=0A=
		<http://developer.mozilla.org/en/docs/DOM:element.scrollHeight>=0A=
	*/=0A=
=0A=
	getScrollHeight: function(){=0A=
		if (this.ie) return Math.max(document.documentElement.offsetHeight, =
document.documentElement.scrollHeight);=0A=
		if (this.webkit) return document.body.scrollHeight;=0A=
		return document.documentElement.scrollHeight;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getScrollLeft=0A=
		Returns an integer representing the scrollLeft of the window (the =
number of pixels the window has scrolled from the left).=0A=
=0A=
	See Also:=0A=
		<http://developer.mozilla.org/en/docs/DOM:element.scrollLeft>=0A=
	*/=0A=
=0A=
	getScrollLeft: function(){=0A=
		return this.pageXOffset || document.documentElement.scrollLeft;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getScrollTop=0A=
		Returns an integer representing the scrollTop of the window (the =
number of pixels the window has scrolled from the top).=0A=
=0A=
	See Also:=0A=
		<http://developer.mozilla.org/en/docs/DOM:element.scrollTop>=0A=
	*/=0A=
=0A=
	getScrollTop: function(){=0A=
		return this.pageYOffset || document.documentElement.scrollTop;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getSize=0A=
		Same as <Element.getSize>=0A=
	*/=0A=
=0A=
	getSize: function(){=0A=
		return {=0A=
			'size': {'x': this.getWidth(), 'y': this.getHeight()},=0A=
			'scrollSize': {'x': this.getScrollWidth(), 'y': =
this.getScrollHeight()},=0A=
			'scroll': {'x': this.getScrollLeft(), 'y': this.getScrollTop()}=0A=
		};=0A=
	},=0A=
=0A=
	//ignore=0A=
	getPosition: function(){return {'x': 0, 'y': 0}}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Base.js=0A=
	Contains <Fx.Base> and two Transitions.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
var Fx =3D {Shared: {}};=0A=
=0A=
/*=0A=
Class: Fx.Base=0A=
	Base class for the Mootools Effects (Moo.Fx) library.=0A=
=0A=
Options:=0A=
	onStart - the function to execute as the effect begins; nothing =
(<Class.empty>) by default.=0A=
	onComplete - the function to execute after the effect has processed; =
nothing (<Class.empty>) by default.=0A=
	transition - the equation to use for the effect see <Fx.Transitions>; =
default is <Fx.Transitions.Sine.easeInOut>=0A=
	duration - the duration of the effect in ms; 500 is the default.=0A=
	unit - the unit is 'px' by default (other values include things like =
'em' for fonts or '%').=0A=
	wait - boolean: to wait or not to wait for a current transition to end =
before running another of the same instance. defaults to true.=0A=
	fps - the frames per second for the transition; default is 30=0A=
*/=0A=
=0A=
Fx.Base =3D new Class({=0A=
=0A=
	options: {=0A=
		onStart: Class.empty,=0A=
		onComplete: Class.empty,=0A=
		onCancel: Class.empty,=0A=
		transition: function(p){=0A=
			return -(Math.cos(Math.PI * p) - 1) / 2;=0A=
		},=0A=
		duration: 500,=0A=
		unit: 'px',=0A=
		wait: true,=0A=
		fps: 50=0A=
	},=0A=
=0A=
	initialize: function(options){=0A=
		this.element =3D this.element || null;=0A=
		this.setOptions(options);=0A=
		if (this.options.initialize) this.options.initialize.call(this);=0A=
	},=0A=
=0A=
	step: function(){=0A=
		var time =3D $time();=0A=
		if (time < this.time + this.options.duration){=0A=
			this.delta =3D this.options.transition((time - this.time) / =
this.options.duration);=0A=
			this.setNow();=0A=
			this.increase();=0A=
		} else {=0A=
			this.stop(true);=0A=
			this.set(this.to);=0A=
			this.fireEvent('onComplete', this.element, 10);=0A=
			this.callChain();=0A=
		}=0A=
	},=0A=
=0A=
	/*=0A=
	Property: set=0A=
		Immediately sets the value with no transition.=0A=
=0A=
	Arguments:=0A=
		to - the point to jump to=0A=
=0A=
	Example:=0A=
		>var myFx =3D new Fx.Style('myElement', 'opacity').set(0); //will make =
it immediately transparent=0A=
	*/=0A=
=0A=
	set: function(to){=0A=
		this.now =3D to;=0A=
		this.increase();=0A=
		return this;=0A=
	},=0A=
	=0A=
	setNow: function(){=0A=
		this.now =3D this.compute(this.from, this.to);=0A=
	},=0A=
	=0A=
	compute: function(from, to){=0A=
		return (to - from) * this.delta + from;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: start=0A=
		Executes an effect from one position to the other.=0A=
=0A=
	Arguments:=0A=
		from - integer: staring value=0A=
		to - integer: the ending value=0A=
=0A=
	Examples:=0A=
		>var myFx =3D new Fx.Style('myElement', 'opacity').start(0,1); =
//display a transition from transparent to opaque.=0A=
	*/=0A=
=0A=
	start: function(from, to){=0A=
		if (!this.options.wait) this.stop();=0A=
		else if (this.timer) return this;=0A=
		this.from =3D from;=0A=
		this.to =3D to;=0A=
		this.change =3D this.to - this.from;=0A=
		this.time =3D $time();=0A=
		this.timer =3D this.step.periodical(Math.round(1000 / =
this.options.fps), this);=0A=
		this.fireEvent('onStart', this.element);=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: stop=0A=
		Stops the transition.=0A=
	*/=0A=
=0A=
	stop: function(end){=0A=
		if (!this.timer) return this;=0A=
		this.timer =3D $clear(this.timer);=0A=
		if (!end) this.fireEvent('onCancel', this.element);=0A=
		return this;=0A=
	},=0A=
=0A=
	//compat=0A=
	custom: function(from, to){return this.start(from, to)},=0A=
	clearTimer: function(end){return this.stop(end)}=0A=
=0A=
});=0A=
=0A=
Fx.Base.implement(new Chain, new Events, new Options);=0A=
=0A=
/*=0A=
Script: Fx.CSS.js=0A=
	Css parsing class for effects. Required by <Fx.Style>, <Fx.Styles>, =
<Fx.Elements>. No documentation needed, as its used internally.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
Fx.CSS =3D {=0A=
=0A=
	select: function(property, to){=0A=
		if (property.test(/color/i)) return this.Color;=0A=
		if (to.contains && to.contains(' ')) return this.Multi;=0A=
		return this.Single;=0A=
	},=0A=
=0A=
	parse: function(el, property, fromTo){=0A=
		if (!fromTo.push) fromTo =3D [fromTo];=0A=
		var from =3D fromTo[0], to =3D fromTo[1];=0A=
		if (!to && to !=3D 0){=0A=
			to =3D from;=0A=
			from =3D el.getStyle(property);=0A=
		}=0A=
		var css =3D this.select(property, to);=0A=
		return {from: css.parse(from), to: css.parse(to), css: css};=0A=
	}=0A=
=0A=
};=0A=
=0A=
Fx.CSS.Single =3D {=0A=
=0A=
	parse: function(value){=0A=
		return parseFloat(value);=0A=
	},=0A=
=0A=
	getNow: function(from, to, fx){=0A=
		return fx.compute(from, to);=0A=
	},=0A=
=0A=
	getValue: function(value, unit, property){=0A=
		if (unit =3D=3D 'px' && property !=3D 'opacity') value =3D =
Math.round(value);=0A=
		return value + unit;=0A=
	}=0A=
=0A=
};=0A=
=0A=
Fx.CSS.Multi =3D {=0A=
=0A=
	parse: function(value){=0A=
		return value.push ? value : value.split(' ').map(function(v){=0A=
			return parseFloat(v);=0A=
		});=0A=
	},=0A=
=0A=
	getNow: function(from, to, fx){=0A=
		var now =3D [];=0A=
		for (var i =3D 0; i < from.length; i++) now[i] =3D fx.compute(from[i], =
to[i]);=0A=
		return now;=0A=
	},=0A=
=0A=
	getValue: function(value, unit, property){=0A=
		if (unit =3D=3D 'px' && property !=3D 'opacity') value =3D =
value.map(Math.round);=0A=
		return value.join(unit + ' ') + unit;=0A=
	}=0A=
=0A=
};=0A=
=0A=
Fx.CSS.Color =3D {=0A=
=0A=
	parse: function(value){=0A=
		return value.push ? value : value.hexToRgb(true);=0A=
	},=0A=
=0A=
	getNow: function(from, to, fx){=0A=
		var now =3D [];=0A=
		for (var i =3D 0; i < from.length; i++) now[i] =3D =
Math.round(fx.compute(from[i], to[i]));=0A=
		return now;=0A=
	},=0A=
=0A=
	getValue: function(value){=0A=
		return 'rgb(' + value.join(',') + ')';=0A=
	}=0A=
=0A=
};=0A=
=0A=
/*=0A=
Script: Fx.Style.js=0A=
	Contains <Fx.Style>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Style=0A=
	The Style effect; Extends <Fx.Base>, inherits all its properties. Used =
to transition any css property from one value to another. Includes =
colors.=0A=
	Colors must be in hex format.=0A=
=0A=
Arguments:=0A=
	el - the $(element) to apply the style transition to=0A=
	property - the property to transition=0A=
	options - the Fx.Base options (see: <Fx.Base>)=0A=
=0A=
Example:=0A=
	>var marginChange =3D new Fx.Style('myElement', 'margin-top', =
{duration:500});=0A=
	>marginChange.start(10, 100);=0A=
*/=0A=
=0A=
Fx.Style =3D Fx.Base.extend({=0A=
=0A=
	initialize: function(el, property, options){=0A=
		this.element =3D $(el);=0A=
		this.property =3D property;=0A=
		this.parent(options);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hide=0A=
		Same as <Fx.Base.set> (0); hides the element immediately without =
transition.=0A=
	*/=0A=
=0A=
	hide: function(){=0A=
		return this.set(0);=0A=
	},=0A=
=0A=
	setNow: function(){=0A=
		this.now =3D this.css.getNow(this.from, this.to, this);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: set=0A=
		Sets the element's css property (specified at instantiation) to the =
specified value immediately.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var marginChange =3D new Fx.Style('myElement', 'margin-top', =
{duration:500});=0A=
		marginChange.set(10); //margin-top is set to 10px immediately=0A=
		(end)=0A=
	*/=0A=
=0A=
	set: function(to){=0A=
		this.css =3D Fx.CSS.select(this.property, to);=0A=
		return this.parent(this.css.parse(to));=0A=
	},=0A=
=0A=
	/*=0A=
	Property: start=0A=
		Displays the transition to the value/values passed in=0A=
=0A=
	Arguments:=0A=
		from - (integer; optional) the starting position for the transition=0A=
		to - (integer) the ending position for the transition=0A=
=0A=
	Note:=0A=
		If you provide only one argument, the transition will use the current =
css value for its starting value.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var marginChange =3D new Fx.Style('myElement', 'margin-top', =
{duration:500});=0A=
		marginChange.start(10); //tries to read current margin top value and =
goes from current to 10=0A=
		(end)=0A=
	*/=0A=
=0A=
	start: function(from, to){=0A=
		if (this.timer && this.options.wait) return this;=0A=
		var parsed =3D Fx.CSS.parse(this.element, this.property, [from, to]);=0A=
		this.css =3D parsed.css;=0A=
		return this.parent(parsed.from, parsed.to);=0A=
	},=0A=
=0A=
	increase: function(){=0A=
		this.element.setStyle(this.property, this.css.getValue(this.now, =
this.options.unit, this.property));=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: effect=0A=
		Applies an <Fx.Style> to the Element; This a shortcut for <Fx.Style>.=0A=
=0A=
	Arguments:=0A=
		property - (string) the css property to alter=0A=
		options - (object; optional) key/value set of options (see <Fx.Style>)=0A=
=0A=
	Example:=0A=
		>var myEffect =3D $('myElement').effect('height', {duration: 1000, =
transition: Fx.Transitions.linear});=0A=
		>myEffect.start(10, 100);=0A=
		>//OR=0A=
		>$('myElement').effect('height', {duration: 1000, transition: =
Fx.Transitions.linear}).start(10,100);=0A=
	*/=0A=
=0A=
	effect: function(property, options){=0A=
		return new Fx.Style(this, property, options);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Styles.js=0A=
	Contains <Fx.Styles>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Styles=0A=
	Allows you to animate multiple css properties at once; Extends =
<Fx.Base>, inherits all its properties. Includes colors.=0A=
	Colors must be in hex format.=0A=
=0A=
Arguments:=0A=
	el - the $(element) to apply the styles transition to=0A=
	options - the fx options (see: <Fx.Base>)=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var myEffects =3D new Fx.Styles('myElement', {duration: 1000, =
transition: Fx.Transitions.linear});=0A=
=0A=
	//height from 10 to 100 and width from 900 to 300=0A=
	myEffects.start({=0A=
		'height': [10, 100],=0A=
		'width': [900, 300]=0A=
	});=0A=
=0A=
	//or height from current height to 100 and width from current width to =
300=0A=
	myEffects.start({=0A=
		'height': 100,=0A=
		'width': 300=0A=
	});=0A=
	(end)=0A=
*/=0A=
=0A=
Fx.Styles =3D Fx.Base.extend({=0A=
=0A=
	initialize: function(el, options){=0A=
		this.element =3D $(el);=0A=
		this.parent(options);=0A=
	},=0A=
=0A=
	setNow: function(){=0A=
		for (var p in this.from) this.now[p] =3D =
this.css[p].getNow(this.from[p], this.to[p], this);=0A=
	},=0A=
=0A=
	set: function(to){=0A=
		var parsed =3D {};=0A=
		this.css =3D {};=0A=
		for (var p in to){=0A=
			this.css[p] =3D Fx.CSS.select(p, to[p]);=0A=
			parsed[p] =3D this.css[p].parse(to[p]);=0A=
		}=0A=
		return this.parent(parsed);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: start=0A=
		Executes a transition for any number of css properties in tandem.=0A=
=0A=
	Arguments:=0A=
		obj - an object containing keys that specify css properties to alter =
and values that specify either the from/to values (as an array) or just =
the end value (an integer).=0A=
=0A=
	Example:=0A=
		see <Fx.Styles>=0A=
	*/=0A=
=0A=
	start: function(obj){=0A=
		if (this.timer && this.options.wait) return this;=0A=
		this.now =3D {};=0A=
		this.css =3D {};=0A=
		var from =3D {}, to =3D {};=0A=
		for (var p in obj){=0A=
			var parsed =3D Fx.CSS.parse(this.element, p, obj[p]);=0A=
			from[p] =3D parsed.from;=0A=
			to[p] =3D parsed.to;=0A=
			this.css[p] =3D parsed.css;=0A=
		}=0A=
		return this.parent(from, to);=0A=
	},=0A=
=0A=
	increase: function(){=0A=
		for (var p in this.now) this.element.setStyle(p, =
this.css[p].getValue(this.now[p], this.options.unit, p));=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: effects=0A=
		Applies an <Fx.Styles> to the Element; This a shortcut for <Fx.Styles>.=0A=
=0A=
	Example:=0A=
		>var myEffects =3D $(myElement).effects({duration: 1000, transition: =
Fx.Transitions.Sine.easeInOut});=0A=
 		>myEffects.start({'height': [10, 100], 'width': [900, 300]});=0A=
	*/=0A=
=0A=
	effects: function(options){=0A=
		return new Fx.Styles(this, options);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Elements.js=0A=
	Contains <Fx.Elements>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Elements=0A=
	Fx.Elements allows you to apply any number of styles transitions to a =
selection of elements. Includes colors (must be in hex format).=0A=
=0A=
Arguments:=0A=
	elements - a collection of elements the effects will be applied to.=0A=
	options - same as <Fx.Base> options.=0A=
*/=0A=
=0A=
Fx.Elements =3D Fx.Base.extend({=0A=
=0A=
	initialize: function(elements, options){=0A=
		this.elements =3D $$(elements);=0A=
		this.parent(options);=0A=
	},=0A=
=0A=
	setNow: function(){=0A=
		for (var i in this.from){=0A=
			var iFrom =3D this.from[i], iTo =3D this.to[i], iCss =3D this.css[i], =
iNow =3D this.now[i] =3D {};=0A=
			for (var p in iFrom) iNow[p] =3D iCss[p].getNow(iFrom[p], iTo[p], =
this);=0A=
		}=0A=
	},=0A=
=0A=
	set: function(to){=0A=
		var parsed =3D {};=0A=
		this.css =3D {};=0A=
		for (var i in to){=0A=
			var iTo =3D to[i], iCss =3D this.css[i] =3D {}, iParsed =3D parsed[i] =
=3D {};=0A=
			for (var p in iTo){=0A=
				iCss[p] =3D Fx.CSS.select(p, iTo[p]);=0A=
				iParsed[p] =3D iCss[p].parse(iTo[p]);=0A=
			}=0A=
		}=0A=
		return this.parent(parsed);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: start=0A=
		Applies the passed in style transitions to each object named (see =
example). Each item in the collection is refered to as a numerical =
string ("1" for instance). The first item is "0", the second "1", etc.=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		var myElementsEffects =3D new Fx.Elements($$('a'));=0A=
		myElementsEffects.start({=0A=
			'0': { //let's change the first element's opacity and width=0A=
				'opacity': [0,1],=0A=
				'width': [100,200]=0A=
			},=0A=
			'4': { //and the fifth one's opacity=0A=
				'opacity': [0.2, 0.5]=0A=
			}=0A=
		});=0A=
		(end)=0A=
	*/=0A=
=0A=
	start: function(obj){=0A=
		if (this.timer && this.options.wait) return this;=0A=
		this.now =3D {};=0A=
		this.css =3D {};=0A=
		var from =3D {}, to =3D {};=0A=
		for (var i in obj){=0A=
			var iProps =3D obj[i], iFrom =3D from[i] =3D {}, iTo =3D to[i] =3D =
{}, iCss =3D this.css[i] =3D {};=0A=
			for (var p in iProps){=0A=
				var parsed =3D Fx.CSS.parse(this.elements[i], p, iProps[p]);=0A=
				iFrom[p] =3D parsed.from;=0A=
				iTo[p] =3D parsed.to;=0A=
				iCss[p] =3D parsed.css;=0A=
			}=0A=
		}=0A=
		return this.parent(from, to);=0A=
	},=0A=
=0A=
	increase: function(){=0A=
		for (var i in this.now){=0A=
			var iNow =3D this.now[i], iCss =3D this.css[i];=0A=
			for (var p in iNow) this.elements[i].setStyle(p, =
iCss[p].getValue(iNow[p], this.options.unit, p));=0A=
		}=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Scroll.js=0A=
	Contains <Fx.Scroll>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Scroll=0A=
	Scroll any element with an overflow, including the window element.=0A=
=0A=
Note:=0A=
	Fx.Scroll requires an XHTML doctype.=0A=
=0A=
Arguments:=0A=
	element - the element to scroll=0A=
	options - optional, see Options below.=0A=
=0A=
Options:=0A=
	all the Fx.Base options, plus:=0A=
	offset - the distance for the scrollTo point/element. an Object with =
x/y properties.=0A=
	overflown - an array of nested scrolling containers, see =
<Element.getPosition>=0A=
*/=0A=
=0A=
Fx.Scroll =3D Fx.Base.extend({=0A=
=0A=
	options: {=0A=
		overflown: [],=0A=
		offset: {'x': 0, 'y': 0}=0A=
	},=0A=
=0A=
	initialize: function(element, options){=0A=
		this.now =3D [];=0A=
		this.element =3D $(element);=0A=
		this.bound =3D {'stop': this.stop.bind(this, false)};=0A=
		this.addEvent('onStart', function(){=0A=
			document.addEvent('mousewheel', this.bound.stop);=0A=
		}.bind(this));=0A=
		this.removeEvent('onComplete', function(){=0A=
			document.removeEvent('mousewheel', this.bound.stop);=0A=
		}.bind(this));=0A=
		this.parent(options);=0A=
	},=0A=
=0A=
	setNow: function(){=0A=
		for (var i =3D 0; i < 2; i++) this.now[i] =3D =
this.compute(this.from[i], this.to[i]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: scrollTo=0A=
		Scrolls the chosen element to the x/y coordinates.=0A=
=0A=
	Arguments:=0A=
		x - the x coordinate to scroll the element to=0A=
		y - the y coordinate to scroll the element to=0A=
	*/=0A=
=0A=
	scrollTo: function(x, y){=0A=
		if (this.timer && this.options.wait) return this;=0A=
		var el =3D this.element.getSize();=0A=
		var values =3D {'x': x, 'y': y};=0A=
		for (var z in el.size){=0A=
			var max =3D el.scrollSize[z] - el.size[z];=0A=
			if ($chk(values[z])) values[z] =3D ($type(values[z]) =3D=3D 'number') =
? values[z].limit(0, max) : max;=0A=
			else values[z] =3D el.scroll[z];=0A=
			values[z] +=3D this.options.offset[z];=0A=
		}=0A=
		return this.start([el.scroll.x, el.scroll.y], [values.x, values.y]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toTop=0A=
		Scrolls the chosen element to its maximum top.=0A=
	*/=0A=
=0A=
	toTop: function(){=0A=
		return this.scrollTo(false, 0);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toBottom=0A=
		Scrolls the chosen element to its maximum bottom.=0A=
	*/=0A=
=0A=
	toBottom: function(){=0A=
		return this.scrollTo(false, 'full');=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toLeft=0A=
		Scrolls the chosen element to its maximum left.=0A=
	*/=0A=
=0A=
	toLeft: function(){=0A=
		return this.scrollTo(0, false);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toRight=0A=
		Scrolls the chosen element to its maximum right.=0A=
	*/=0A=
=0A=
	toRight: function(){=0A=
		return this.scrollTo('full', false);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toElement=0A=
		Scrolls the specified element to the position the passed in element is =
found.=0A=
=0A=
	Arguments:=0A=
		el - the $(element) to scroll the window to=0A=
	*/=0A=
=0A=
	toElement: function(el){=0A=
		var parent =3D this.element.getPosition(this.options.overflown);=0A=
		var target =3D $(el).getPosition(this.options.overflown);=0A=
		return this.scrollTo(target.x - parent.x, target.y - parent.y);=0A=
	},=0A=
=0A=
	increase: function(){=0A=
		this.element.scrollTo(this.now[0], this.now[1]);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Slide.js=0A=
	Contains <Fx.Slide>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Slide=0A=
	The slide effect; slides an element in horizontally or vertically, the =
contents will fold inside. Extends <Fx.Base>, inherits all its =
properties.=0A=
	=0A=
Note:=0A=
	Fx.Slide requires an XHTML doctype.=0A=
=0A=
Options:=0A=
	mode - set it to vertical or horizontal. Defaults to vertical.=0A=
	options - all the <Fx.Base> options=0A=
=0A=
Example:=0A=
	(start code)=0A=
	var mySlider =3D new Fx.Slide('myElement', {duration: 500});=0A=
	mySlider.toggle() //toggle the slider up and down.=0A=
	(end)=0A=
*/=0A=
=0A=
Fx.Slide =3D Fx.Base.extend({=0A=
=0A=
	options: {=0A=
		mode: 'vertical'=0A=
	},=0A=
=0A=
	initialize: function(el, options){=0A=
		this.element =3D $(el);=0A=
		this.wrapper =3D new Element('div', {'styles': =
$extend(this.element.getStyles('margin'), {'overflow': =
'hidden'})}).injectAfter(this.element).adopt(this.element);=0A=
		this.element.setStyle('margin', 0);=0A=
		this.setOptions(options);=0A=
		this.now =3D [];=0A=
		this.parent(this.options);=0A=
		if (window.webkit419) this.addEvent('onComplete', function(){=0A=
			this.element.remove().inject(this.wrapper);=0A=
		});=0A=
	},=0A=
=0A=
	setNow: function(){=0A=
		for (var i =3D 0; i < 2; i++) this.now[i] =3D =
this.compute(this.from[i], this.to[i]);=0A=
	},=0A=
=0A=
	vertical: function(){=0A=
		this.margin =3D 'margin-top';=0A=
		this.layout =3D 'height';=0A=
		this.offset =3D this.element.offsetHeight;=0A=
	},=0A=
=0A=
	horizontal: function(){=0A=
		this.margin =3D 'margin-left';=0A=
		this.layout =3D 'width';=0A=
		this.offset =3D this.element.offsetWidth;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: slideIn=0A=
		Slides the elements in view horizontally or vertically.=0A=
=0A=
	Arguments:=0A=
		mode - (optional, string) 'horizontal' or 'vertical'; defaults to =
options.mode.=0A=
	*/=0A=
=0A=
	slideIn: function(mode){=0A=
		this[mode || this.options.mode]();=0A=
		return this.start([this.element.getStyle(this.margin).toInt(), =
this.wrapper.getStyle(this.layout).toInt()], [0, this.offset]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: slideOut=0A=
		Sides the elements out of view horizontally or vertically.=0A=
=0A=
	Arguments:=0A=
		mode - (optional, string) 'horizontal' or 'vertical'; defaults to =
options.mode.=0A=
	*/=0A=
=0A=
	slideOut: function(mode){=0A=
		this[mode || this.options.mode]();=0A=
		return this.start([this.element.getStyle(this.margin).toInt(), =
this.wrapper.getStyle(this.layout).toInt()], [-this.offset, 0]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: hide=0A=
		Hides the element without a transition.=0A=
=0A=
	Arguments:=0A=
		mode - (optional, string) 'horizontal' or 'vertical'; defaults to =
options.mode.=0A=
	*/=0A=
=0A=
	hide: function(mode){=0A=
		this[mode || this.options.mode]();=0A=
		return this.set([-this.offset, 0]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: show=0A=
		Shows the element without a transition.=0A=
=0A=
	Arguments:=0A=
		mode - (optional, string) 'horizontal' or 'vertical'; defaults to =
options.mode.=0A=
	*/=0A=
=0A=
	show: function(mode){=0A=
		this[mode || this.options.mode]();=0A=
		return this.set([0, this.offset]);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: toggle=0A=
		Slides in or Out the element, depending on its state=0A=
=0A=
	Arguments:=0A=
		mode - (optional, string) 'horizontal' or 'vertical'; defaults to =
options.mode.=0A=
=0A=
	*/=0A=
=0A=
	toggle: function(mode){=0A=
		if (this.wrapper.offsetHeight =3D=3D 0 || this.wrapper.offsetWidth =
=3D=3D 0) return this.slideIn(mode);=0A=
		return this.slideOut(mode);=0A=
	},=0A=
=0A=
	increase: function(){=0A=
		this.element.setStyle(this.margin, this.now[0] + this.options.unit);=0A=
		this.wrapper.setStyle(this.layout, this.now[1] + this.options.unit);=0A=
	}=0A=
=0A=
});=0A=
=0A=
/*=0A=
Script: Fx.Transitions.js=0A=
	Effects transitions, to be used with all the effects.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
=0A=
Credits:=0A=
	Easing Equations by Robert Penner, =
<http://www.robertpenner.com/easing/>, modified & optimized to be used =
with mootools.=0A=
*/=0A=
=0A=
/*=0A=
Class: Fx.Transitions=0A=
	A collection of tweening transitions for use with the <Fx.Base> classes.=0A=
=0A=
Example:=0A=
	>//Elastic.easeOut with default values:=0A=
	>new Fx.Style('margin', {transition: Fx.Transitions.Elastic.easeOut});=0A=
	>//Elastic.easeOut with user-defined value for elasticity.=0A=
	> var myTransition =3D new Fx.Transition(Fx.Transitions.Elastic, 3);=0A=
	>new Fx.Style('margin', {transition: myTransition.easeOut});=0A=
=0A=
See also:=0A=
	http://www.robertpenner.com/easing/=0A=
*/=0A=
=0A=
Fx.Transition =3D function(transition, params){=0A=
	params =3D params || [];=0A=
	if ($type(params) !=3D 'array') params =3D [params];=0A=
	return $extend(transition, {=0A=
		easeIn: function(pos){=0A=
			return transition(pos, params);=0A=
		},=0A=
		easeOut: function(pos){=0A=
			return 1 - transition(1 - pos, params);=0A=
		},=0A=
		easeInOut: function(pos){=0A=
			return (pos <=3D 0.5) ? transition(2 * pos, params) / 2 : (2 - =
transition(2 * (1 - pos), params)) / 2;=0A=
		}=0A=
	});=0A=
};=0A=
=0A=
Fx.Transitions =3D new Abstract({=0A=
=0A=
	/*=0A=
	Property: linear=0A=
		displays a linear transition.=0A=
=0A=
	Graph:=0A=
		(see Linear.png)=0A=
	*/=0A=
=0A=
	linear: function(p){=0A=
		return p;=0A=
	}=0A=
=0A=
});=0A=
=0A=
Fx.Transitions.extend =3D function(transitions){=0A=
	for (var transition in transitions){=0A=
		Fx.Transitions[transition] =3D new =
Fx.Transition(transitions[transition]);=0A=
		Fx.Transitions.compat(transition);=0A=
	};=0A=
};=0A=
=0A=
Fx.Transitions.compat =3D function(transition){=0A=
	['In', 'Out', 'InOut'].each(function(easeType){=0A=
		Fx.Transitions[transition.toLowerCase() + easeType] =3D =
Fx.Transitions[transition]['ease' + easeType];=0A=
	});=0A=
};=0A=
=0A=
Fx.Transitions.extend({=0A=
=0A=
	/*=0A=
	Property: Quad=0A=
		displays a quadratic transition. Must be used as Quad.easeIn or =
Quad.easeOut or Quad.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Quad.png)=0A=
	*/=0A=
=0A=
	//auto generated=0A=
=0A=
	/*=0A=
	Property: Cubic=0A=
		displays a cubicular transition. Must be used as Cubic.easeIn or =
Cubic.easeOut or Cubic.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Cubic.png)=0A=
	*/=0A=
=0A=
	//auto generated=0A=
=0A=
	/*=0A=
	Property: Quart=0A=
		displays a quartetic transition. Must be used as Quart.easeIn or =
Quart.easeOut or Quart.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Quart.png)=0A=
	*/=0A=
=0A=
	//auto generated=0A=
=0A=
	/*=0A=
	Property: Quint=0A=
		displays a quintic transition. Must be used as Quint.easeIn or =
Quint.easeOut or Quint.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Quint.png)=0A=
	*/=0A=
=0A=
	//auto generated=0A=
=0A=
	/*=0A=
	Property: Pow=0A=
		Used to generate Quad, Cubic, Quart and Quint.=0A=
		By default is p^6.=0A=
=0A=
	Graph:=0A=
		(see Pow.png)=0A=
	*/=0A=
=0A=
	Pow: function(p, x){=0A=
		return Math.pow(p, x[0] || 6);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: Expo=0A=
		displays a exponential transition. Must be used as Expo.easeIn or =
Expo.easeOut or Expo.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Expo.png)=0A=
	*/=0A=
=0A=
	Expo: function(p){=0A=
		return Math.pow(2, 8 * (p - 1));=0A=
	},=0A=
=0A=
	/*=0A=
	Property: Circ=0A=
		displays a circular transition. Must be used as Circ.easeIn or =
Circ.easeOut or Circ.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Circ.png)=0A=
	*/=0A=
=0A=
	Circ: function(p){=0A=
		return 1 - Math.sin(Math.acos(p));=0A=
	},=0A=
=0A=
=0A=
	/*=0A=
	Property: Sine=0A=
		displays a sineousidal transition. Must be used as Sine.easeIn or =
Sine.easeOut or Sine.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Sine.png)=0A=
	*/=0A=
=0A=
	Sine: function(p){=0A=
		return 1 - Math.sin((1 - p) * Math.PI / 2);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: Back=0A=
		makes the transition go back, then all forth. Must be used as =
Back.easeIn or Back.easeOut or Back.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Back.png)=0A=
	*/=0A=
=0A=
	Back: function(p, x){=0A=
		x =3D x[0] || 1.618;=0A=
		return Math.pow(p, 2) * ((x + 1) * p - x);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: Bounce=0A=
		makes the transition bouncy. Must be used as Bounce.easeIn or =
Bounce.easeOut or Bounce.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Bounce.png)=0A=
	*/=0A=
=0A=
	Bounce: function(p){=0A=
		var value;=0A=
		for (var a =3D 0, b =3D 1; 1; a +=3D b, b /=3D 2){=0A=
			if (p >=3D (7 - 4 * a) / 11){=0A=
				value =3D - Math.pow((11 - 6 * a - 11 * p) / 4, 2) + b * b;=0A=
				break;=0A=
			}=0A=
		}=0A=
		return value;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: Elastic=0A=
		Elastic curve. Must be used as Elastic.easeIn or Elastic.easeOut or =
Elastic.easeInOut=0A=
=0A=
	Graph:=0A=
		(see Elastic.png)=0A=
	*/=0A=
=0A=
	Elastic: function(p, x){=0A=
		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) =
/ 3);=0A=
	}=0A=
=0A=
});=0A=
=0A=
['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){=0A=
	Fx.Transitions[transition] =3D new Fx.Transition(function(p){=0A=
		return Math.pow(p, [i + 2]);=0A=
	});=0A=
	Fx.Transitions.compat(transition);=0A=
});=0A=
=0A=
/*=0A=
Script: XHR.js=0A=
	Contains the basic XMLHttpRequest Class Wrapper.=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: XHR=0A=
	Basic XMLHttpRequest Wrapper.=0A=
=0A=
Arguments:=0A=
	options - an object with options names as keys. See options below.=0A=
=0A=
Options:=0A=
	method - 'post' or 'get' - the protocol for the request; optional, =
defaults to 'post'.=0A=
	async - boolean: asynchronous option; true uses asynchronous requests. =
Defaults to true.=0A=
	onRequest - function to execute when the XHR request is fired.=0A=
	onSuccess - function to execute when the XHR request completes.=0A=
	onStateChange - function to execute when the state of the =
XMLHttpRequest changes.=0A=
	onFailure - function to execute when the state of the XMLHttpRequest =
changes.=0A=
	encoding - the encoding, defaults to utf-8.=0A=
	autoCancel - cancels the already running request if another one is =
sent. defaults to false.=0A=
	headers - accepts an object, that will be set to request headers.=0A=
=0A=
Properties:=0A=
	running - true if the request is running.=0A=
	response - object, text and xml as keys. You can access this property =
in the onSuccess event.=0A=
=0A=
Example:=0A=
	>var myXHR =3D new XHR({method: =
'get'}).send('http://site.com/requestHandler.php', =
'name=3Djohn&lastname=3Ddorian');=0A=
*/=0A=
=0A=
var XHR =3D new Class({=0A=
=0A=
	options: {=0A=
		method: 'post',=0A=
		async: true,=0A=
		onRequest: Class.empty,=0A=
		onSuccess: Class.empty,=0A=
		onFailure: Class.empty,=0A=
		urlEncoded: true,=0A=
		encoding: 'utf-8',=0A=
		autoCancel: false,=0A=
		headers: {}=0A=
	},=0A=
	=0A=
	setTransport: function(){=0A=
		this.transport =3D (window.XMLHttpRequest) ? new XMLHttpRequest() : =
(window.ie ? new ActiveXObject('Microsoft.XMLHTTP') : false);=0A=
		return this;=0A=
	},=0A=
=0A=
	initialize: function(options){=0A=
		this.setTransport().setOptions(options);=0A=
		this.options.isSuccess =3D this.options.isSuccess || this.isSuccess;=0A=
		this.headers =3D {};=0A=
		if (this.options.urlEncoded && this.options.method =3D=3D 'post'){=0A=
			var encoding =3D (this.options.encoding) ? '; charset=3D' + =
this.options.encoding : '';=0A=
			this.setHeader('Content-type', 'application/x-www-form-urlencoded' + =
encoding);=0A=
		}=0A=
		if (this.options.initialize) this.options.initialize.call(this);=0A=
	},=0A=
=0A=
	onStateChange: function(){=0A=
		if (this.transport.readyState !=3D 4 || !this.running) return;=0A=
		this.running =3D false;=0A=
		var status =3D 0;=0A=
		try {status =3D this.transport.status} catch(e){};=0A=
		if (this.options.isSuccess.call(this, status)) this.onSuccess();=0A=
		else this.onFailure();=0A=
		this.transport.onreadystatechange =3D Class.empty;=0A=
	},=0A=
=0A=
	isSuccess: function(status){=0A=
		return ((status >=3D 200) && (status < 300));=0A=
	},=0A=
=0A=
	onSuccess: function(){=0A=
		this.response =3D {=0A=
			'text': this.transport.responseText,=0A=
			'xml': this.transport.responseXML=0A=
		};=0A=
		this.fireEvent('onSuccess', [this.response.text, this.response.xml]);=0A=
		this.callChain();=0A=
	},=0A=
=0A=
	onFailure: function(){=0A=
		this.fireEvent('onFailure', this.transport);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: setHeader=0A=
		Add/modify an header for the request. It will not override headers =
from the options.=0A=
=0A=
	Example:=0A=
		>var myAjax =3D new Ajax(url, {method: 'get', headers: {'X-Request': =
'JSON'}});=0A=
		>myAjax.setHeader('Last-Modified','Sat, 1 Jan 2005 05:00:00 GMT');=0A=
	*/=0A=
=0A=
	setHeader: function(name, value){=0A=
		this.headers[name] =3D value;=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: send=0A=
		Opens the XHR connection and sends the data. Data has to be null or a =
string.=0A=
=0A=
	Example:=0A=
		>var myXhr =3D new XHR({method: 'post'});=0A=
		>myXhr.send(url, querystring);=0A=
		>=0A=
		>var syncXhr =3D new XHR({async: false, method: 'post'});=0A=
		>syncXhr.send(url, null);=0A=
		>=0A=
	*/=0A=
=0A=
	send: function(url, data){=0A=
		if (this.options.autoCancel) this.cancel();=0A=
		else if (this.running) return this;=0A=
		this.running =3D true;=0A=
		if (data && this.options.method =3D=3D 'get') url =3D url + =
(url.contains('?') ? '&' : '?') + data, data =3D null;=0A=
		this.transport.open(this.options.method, url, this.options.async);=0A=
		this.transport.onreadystatechange =3D this.onStateChange.bind(this);=0A=
		if ((this.options.method =3D=3D 'post') && =
this.transport.overrideMimeType) this.setHeader('Connection', 'close');=0A=
		$extend(this.headers, this.options.headers);=0A=
		for (var type in this.headers) try =
{this.transport.setRequestHeader(type, this.headers[type]);} catch(e){};=0A=
		this.fireEvent('onRequest');=0A=
		this.transport.send($pick(data, null));=0A=
		return this;=0A=
	},=0A=
=0A=
	/*=0A=
	Property: cancel=0A=
		Cancels the running request. No effect if the request is not running.=0A=
=0A=
	Example:=0A=
		>var myXhr =3D new XHR({method: 'get'}).send(url);=0A=
		>myXhr.cancel();=0A=
	*/=0A=
=0A=
	cancel: function(){=0A=
		if (!this.running) return this;=0A=
		this.running =3D false;=0A=
		this.transport.abort();=0A=
		this.transport.onreadystatechange =3D Class.empty;=0A=
		this.setTransport();=0A=
		this.fireEvent('onCancel');=0A=
		return this;=0A=
	}=0A=
=0A=
});=0A=
=0A=
XHR.implement(new Chain, new Events, new Options);=0A=
=0A=
/*=0A=
Script: Ajax.js=0A=
	Contains the <Ajax> class. Also contains methods to generate =
querystings from forms and Objects.=0A=
=0A=
Credits:=0A=
	Loosely based on the version from prototype.js =
<http://prototype.conio.net>=0A=
=0A=
License:=0A=
	MIT-style license.=0A=
*/=0A=
=0A=
/*=0A=
Class: Ajax=0A=
	An Ajax class, For all your asynchronous needs. Inherits methods, =
properties and options from <XHR>.=0A=
=0A=
Arguments:=0A=
	url - the url pointing to the server-side script.=0A=
	options - optional, an object containing options.=0A=
=0A=
Options:=0A=
	data - you can write parameters here. Can be a querystring, an object =
or a Form element.=0A=
	onComplete - function to execute when the ajax request completes.=0A=
	update - $(element) to insert the response text of the XHR into, upon =
completion of the request.=0A=
	evalScripts - boolean; default is false. Execute scripts in the =
response text onComplete. When the response is javascript the whole =
response is evaluated.=0A=
	evalResponse - boolean; default is false. Force global evalulation of =
the whole response, no matter what content-type it is.=0A=
=0A=
Example:=0A=
	>var myAjax =3D new Ajax(url, {method: 'get'}).request();=0A=
*/=0A=
=0A=
var Ajax =3D XHR.extend({=0A=
=0A=
	options: {=0A=
		data: null,=0A=
		update: null,=0A=
		onComplete: Class.empty,=0A=
		evalScripts: false,=0A=
		evalResponse: false=0A=
	},=0A=
=0A=
	initialize: function(url, options){=0A=
		this.addEvent('onSuccess', this.onComplete);=0A=
		this.setOptions(options);=0A=
		this.options.data =3D this.options.data || this.options.postBody;=0A=
		if (!['post', 'get'].contains(this.options.method)){=0A=
			this._method =3D '_method=3D' + this.options.method;=0A=
			this.options.method =3D 'post';=0A=
		}=0A=
		this.parent();=0A=
		this.setHeader('X-Requested-With', 'XMLHttpRequest');=0A=
		this.setHeader('Accept', 'text/javascript, text/html, application/xml, =
text/xml, */*');=0A=
		this.url =3D url;=0A=
	},=0A=
=0A=
	onComplete: function(){=0A=
		if (this.options.update) =
$(this.options.update).empty().setHTML(this.response.text);=0A=
		if (this.options.evalScripts || this.options.evalResponse) =
this.evalScripts();=0A=
		this.fireEvent('onComplete', [this.response.text, this.response.xml], =
20);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: request=0A=
		Executes the ajax request.=0A=
=0A=
	Example:=0A=
		>var myAjax =3D new Ajax(url, {method: 'get'});=0A=
		>myAjax.request();=0A=
=0A=
		OR=0A=
=0A=
		>new Ajax(url, {method: 'get'}).request();=0A=
	*/=0A=
=0A=
	request: function(data){=0A=
		data =3D data || this.options.data;=0A=
		switch($type(data)){=0A=
			case 'element': data =3D $(data).toQueryString(); break;=0A=
			case 'object': data =3D Object.toQueryString(data);=0A=
		}=0A=
		if (this._method) data =3D (data) ? [this._method, data].join('&') : =
this._method;=0A=
		return this.send(this.url, data);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: evalScripts=0A=
		Executes scripts in the response text=0A=
	*/=0A=
=0A=
	evalScripts: function(){=0A=
		if (this.options.evalResponse || =
/(ecma|java)script/.test(this.getHeader('Content-type'))) var scripts =
=3D this.response.text;=0A=
		else {=0A=
			var script, scripts =3D [], regexp =3D =
/<script[^>]*>([\s\S]*?)<\/script>/gi;=0A=
			while ((script =3D regexp.exec(this.response.text))) =
scripts.push(script[1]);=0A=
			scripts =3D scripts.join('\n');=0A=
		}=0A=
		if (scripts) (window.execScript) ? window.execScript(scripts) : =
window.setTimeout(scripts, 0);=0A=
	},=0A=
=0A=
	/*=0A=
	Property: getHeader=0A=
		Returns the given response header or null=0A=
	*/=0A=
=0A=
	getHeader: function(name) {=0A=
		try {return this.transport.getResponseHeader(name);} catch(e){};=0A=
		return null;=0A=
	}=0A=
=0A=
});=0A=
=0A=
/* Section: Object related Functions */=0A=
=0A=
/*=0A=
Function: Object.toQueryString=0A=
	Generates a querystring from key/pair values in an object=0A=
=0A=
Arguments:=0A=
	source - the object to generate the querystring from.=0A=
=0A=
Returns:=0A=
	the query string.=0A=
=0A=
Example:=0A=
	>Object.toQueryString({apple: "red", lemon: "yellow"}); //returns =
"apple=3Dred&lemon=3Dyellow"=0A=
*/=0A=
=0A=
Object.toQueryString =3D function(source){=0A=
	var queryString =3D [];=0A=
	for (var property in source) =
queryString.push(encodeURIComponent(property) + '=3D' + =
encodeURIComponent(source[property]));=0A=
	return queryString.join('&');=0A=
};=0A=
=0A=
/*=0A=
Class: Element=0A=
	Custom class to allow all of its methods to be used with any DOM =
element via the dollar function <$>.=0A=
*/=0A=
=0A=
Element.extend({=0A=
=0A=
	/*=0A=
	Property: send=0A=
		Sends a form with an ajax post request=0A=
=0A=
	Arguments:=0A=
		options - option collection for ajax request. See <Ajax> for the =
options list.=0A=
=0A=
	Returns:=0A=
		The Ajax Class Instance=0A=
=0A=
	Example:=0A=
		(start code)=0A=
		<form id=3D"myForm" action=3D"submit.php">=0A=
		<input name=3D"email" value=3D"bob@bob.com">=0A=
		<input name=3D"zipCode" value=3D"90210">=0A=
		</form>=0A=
		<script>=0A=
		$('myForm').send()=0A=
		</script>=0A=
		(end)=0A=
	*/=0A=
=0A=
	send: function(options){=0A=
		return new Ajax(this.getProperty('action'), $merge({postBody: =
this.toQueryString()}, options, {method: 'post'})).request();=0A=
	}=0A=
=0A=
});
------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.torinofilmfest.org/_js/search.js

/*=0A=
	ajax search functions used by TffDB engine=0A=
*/=0A=
=0A=
function Search() {=0A=
	var growDiv =3D new Fx.Style($('search_results'), 'height', {duration: =
300});=0A=
	growDiv.start(288);=0A=
	=0A=
	var myAjax =3D new Ajax('search_results.php', {=0A=
		method: 'get', =0A=
		postBody: $('tffdb_simple'), =0A=
		update: $('search_results')=0A=
	}).request();=0A=
}=0A=
=0A=
function SearchPaging(url) {=0A=
	var myAjax =3D new Ajax(url, {=0A=
		method: 'get', =0A=
		update: $('search_results')=0A=
	}).request();=0A=
}=0A=
=0A=
window.addEvent('domready',function(){=0A=
	$('search_submit').addEvent('click',Search);=0A=
});=0A=
=0A=

------=_NextPart_000_0050_01C9CD22.F9345B70
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.torinofilmfest.org/_js/imagemenu.js

/*=0A=
Snikt.it adaptation of Sam Birch's ImageMenu=0A=
*/=0A=
var ImageMenu =3D new Class({=0A=
	=0A=
	initialize: function(myElements,options){=0A=
		options =3D Object.extend({=0A=
			onClick: Class.empty,=0A=
			start: -1,=0A=
			openWidth: 0,=0A=
			smallWidth: 0,=0A=
			itemWidth: 0,=0A=
			selected: -1,=0A=
			open: -1,=0A=
			transition: Fx.Transitions.quadOut=0A=
		}, options || {});=0A=
		=0A=
		this.myElements =3D myElements;=0A=
		this.options =3D options;=0A=
		=0A=
		options.itemWidth =3D myElements[0].getStyle('width').toInt();=0A=
		options.smallWidth =3D =
Math.round(((options.itemWidth*myElements.length)-options.openWidth)/(myE=
lements.length-1));=0A=
		=0A=
		var fx =3D new Fx.Elements(myElements, {wait: false, duration: 300, =
transition: options.transition});=0A=
		=0A=
		myElements.each(function(el, i){=0A=
			el.addEvent('mouseover', function(e){=0A=
				e =3D new Event(e).stop();=0A=
				el.show();=0A=
			});=0A=
			=0A=
			el.addEvent('click', function(e){=0A=
				el.select();=0A=
			});=0A=
			=0A=
			el.addEvent('mouseout', function(e){=0A=
				e =3D new Event(e).stop();=0A=
				el.hide();=0A=
			});=0A=
			=0A=
			el.show =3D function(){=0A=
				var obj =3D {};=0A=
				obj[i] =3D {'width': [el.getStyle('width').toInt(), =
options.openWidth]};=0A=
				myElements.each(function(other, j){=0A=
					if (other !=3D el){=0A=
						var w =3D other.getStyle('width').toInt();=0A=
						if (w !=3D options.smallWidth) obj[j] =3D {'width': [w, =
options.smallWidth]};=0A=
					}=0A=
				});=0A=
				fx.start(obj);=0A=
			};=0A=
			=0A=
			el.hide =3D function(){=0A=
				var obj =3D {};=0A=
				if(options.selected =3D=3D -1){=0A=
					myElements.each(function(el,i){=0A=
						obj[i] =3D {'width': [el.getStyle('width').toInt(), =
options.itemWidth]};	=0A=
					});=0A=
				}else{=0A=
					myElements.each(function(el,i){=0A=
						if(i !=3D options.selected){=0A=
							var w =3D el.getStyle('width').toInt();=0A=
							if(w !=3D options.smallWidth){obj[i] =3D {'width': [w, =
options.smallWidth]}};=0A=
						}else{=0A=
							obj[i] =3D {'width': [el.getStyle('width').toInt(), =
options.openWidth]};=0A=
						}=0A=
					});=0A=
				}=0A=
				fx.start(obj);=0A=
			};=0A=
			=0A=
			el.select =3D function(){=0A=
				if(options.selected =3D=3D i){options.selected =3D =
-1}else{options.selected =3D i}=0A=
				options.onClick(options.selected,options.open);=0A=
				options.open =3D options.selected;=0A=
			};=0A=
		});=0A=
		=0A=
		if(options.start !=3D -1){=0A=
			myElements[options.start].show();=0A=
			myElements[options.start].select();=0A=
		}=0A=
	},=0A=
	=0A=
	reset: function(){=0A=
		this.options.selected =3D -1;=0A=
		this.options.open =3D -1;=0A=
		this.myElements.each(function(el, i){=0A=
			el.hide();=0A=
		});=0A=
	}=0A=
	=0A=
});
------=_NextPart_000_0050_01C9CD22.F9345B70--

