[From nobody Thu Apr 18 20:12:38 2013 From: "Guardado pelo Windows Internet Explorer 9" Subject: =?Windows-1252?Q?Portugalmail_-_In=C3=ADcio?= Date: Mon, 7 Nov 2011 12:10:29 -0100 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_0000_01CC9D46.3DA66B90" X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.17609 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://portugalmail.pt/?app=imp&url=http%3A%2F%2Fcorreio.portugalmail.pt%2Fimp%2F%3Fu%3D17237151174eb7d8af82316&logout_reason=100 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">=0A= <html>=0A= <head>=0A= <title>Portugalmail - In=C3=ADcio</title>=0A= <link href=3D"theme/style.css" rel=3D"stylesheet" type=3D"text/css">=0A= <script type=3D"text/javascript" src=3D"js/prototype.js"></script>=0A= <script type=3D"text/javascript" src=3D"js/portal.js"></script>=0A= </head>=0A= <body>=0A= <div id=3D"header">=0A= <div class=3D"content">=0A= <a id=3D"logo" href=3D"."></a>=0A= <div id=3D"navtop">=0A= <a href=3D"features.php">Funcionalidades</a>=0A= <a = href=3D"http://ajuda.portugalmail.pt">Suporte</a>=0A= </div>=0A= <form id=3D"login" name=3D"login" = action=3D"http://correio.portugalmail.pt/login.php" method=3D"POST">=0A= <div style=3D"display: none">=0A= <div class=3D"logoutMessage error">O seu navegador = parece ter mudado desde o in=C3=ADcio da sess=C3=A3o. Para garantir a = sua seguran=C3=A7a, deve autenticar-se de novo.</div>=0A= <div class=3D"clear"></div>=0A= <span class=3D"label-wrap">=0A= <label for=3D"horde_user">Endere=C3=A7o</label>=0A= <input id=3D"horde_user" tabindex=3D"1" title=3D"Insira aqui = o seu email" type=3D"text" value=3D"" name=3D"horde_user" />=0A= </span>=0A= <span class=3D"label-wrap">=0A= <label for=3D"horde_pass">Palavra-chave</label>=0A= <input id=3D"horde_pass" tabindex=3D"2" title=3D"Insira aqui = a sua password" type=3D"password" name=3D"horde_pass" />=0A= </span>=0A= <input id=3D"login_post" name=3D"login_post" type=3D"hidden" = value=3D"1" />=0A= <input id=3D"login_browser" name=3D"login_browser" = type=3D"hidden" value=3D"" />=0A= <input id=3D"url" name=3D"url" type=3D"hidden" = value=3D"http://correio.portugalmail.pt/imp/?u=3D17237151174eb7d8af82316"= />=0A= <input id=3D"autologin" name=3D"autologin" type=3D"hidden" = value=3D"0" />=0A= <input id=3D"horde_login" tabindex=3D"3" type=3D"submit" = class=3D"button" value=3D"" />=0A= <span id=3D"loading" style=3D"display: none;">A = Carregar...</span>=0A= </div>=0A= <noscript>=0A= <div class=3D"logoutMessage error">=0A= O <em>javascript</em> encontra-se desactivado no seu = navegador. Por favor active-o antes de iniciar a sess=C3=A3o. Saiba como = activ=C3=A1-lo atrav=C3=A9s do nosso <a = href=3D"http://ajuda.portugalmail.pt/index.php?_m=3Dknowledgebase&_a=3Dvi= ewarticle&kbarticleid=3D102">Centro de Suporte</a>=0A= </div>=0A= </noscript>=0A= </form>=0A= <div class=3D"clear"></div>=0A= <h1>Obtenha o melhor no email gratuito</h1>=0A= </div>=0A= </div>=0A= <div id=3D"signup">=0A= <a class=3D"button" = href=3D"http://correio.portugalmail.pt/signup.php"></a>=0A= </div>=0A= <div id=3D"features">=0A= <div id=3D"arrows"></div>=0A= <table class=3D"content" cellspacing=3D"0" cellpadding=3D"0">=0A= <tr>=0A= <td class=3D"column one">=0A= <img class=3D"image" = src=3D"theme/graphics/features/contacts-large.png" />=0A= <a href=3D"features.php#contacts" = class=3D"title">Inovador sistema de contactos</a>=0A= <p>Informa=C3=A7=C3=A3o pessoal e profissional. = Anivers=C3=A1rios. Interesses. Redes Sociais. Todos os dados dos seus = amigos, colegas e fam=C3=ADlia num s=C3=B3 local. Deite fora a sua = agenda e partilhe todas as novidades.</p>=0A= <div class=3D"teste"></div>=0A= </td>=0A= <td class=3D"column two">=0A= <img class=3D"image" = src=3D"theme/graphics/features/antivirus-large.png" />=0A= <a href=3D"features.php#antivirus" = class=3D"title">Forte sistema antispam e antiv=C3=ADrus</a>=0A= <p>Exterminamos v=C3=ADrus num estalar de dedos. = Lutamos como a Padeira de Aljubarrota contra intrusos e intrujos. O = nosso filtro anti-spam =C3=A9 a sua equipa de limpeza virtual.</p>=0A= <div class=3D"teste"></div>=0A= </td>=0A= <td class=3D"column = tree">=0A= <img class=3D"image" = src=3D"theme/graphics/features/support-large.png" />=0A= <a href=3D"features.php#support" = class=3D"title">Atendimento personalizado</a>=0A= <p>Sempre dispon=C3=ADveis para o ajudar. Suporte em = Portugu=C3=AAs feito por portugueses. Conte com um Centro de Suporte que = o vai ajudar, passo a passo, a tirar o melhor partido do seu email. </p>=0A= <div class=3D"teste"></div>=0A= </td>=0A= <td class=3D"column = four">=0A= <img class=3D"image" = src=3D"theme/graphics/features/embed-large.png" />=0A= <a href=3D"features.php#embed" class=3D"title">Fotos = e videos embebidos</a>=0A= <p>Cansado de ter muitas janelas abertas? De saltar = de link em link para encontrar o que procura? Evite o zapping e veja = todos os v=C3=ADdeos do Youtube e fotografias do Flickr directamente no = seu email.</p>=0A= <div class=3D"teste"></div>=0A= </td>=0A= </tr>=0A= </table>=0A= <div class=3D"viewmore">=0A= <a href=3D"features.php">Ver todas as funcionalidades = =C2=BB</a>=0A= </div>=0A= </div>=0A= <div id=3D"blog">=0A= <div class=3D"content">=0A= <div id=3D"services">=0A= <div id=3D"services_icon"></div>=0A= <h2 class=3D"underline title">Mais servi=C3=A7os</h2>=0A= <div class=3D"clear"></div>=0A= <div class=3D"list">=0A= <div class=3D"service">=0A= <h2><a href=3D"http://www.portugalmail.net">Email = Profissional</a></h2>=0A= <p>O Business Email Portugalmail =C3=A9 uma = solu=C3=A7=C3=A3o de comunica=C3=A7=C3=A3o que contribui para melhorar = os n=C3=ADveis de produtividade para quem usa o email como instrumento = de trabalho. Sem qualquer custo de investimento em software ou hardware, = a solu=C3=A7=C3=A3o permite uma gest=C3=A3o eficaz e personalizada dos = servidores de email.</p>=0A= <a href=3D"http://www.portugalmail.net" = class=3D"link">Visitar Portugalmail.net</a>=0A= </div>=0A= <div class=3D"service">=0A= <h2><a href=3D"http://www.ping.pt">Dom=C3=ADnios e = Alojamento Web</a></h2>=0A= <p>Gra=C3=A7as =C3=A0 dimens=C3=A3o dos parques de = servidores, que no conjunto das marcas da Portugalmail alojam mais de 2 = milh=C3=B5es de sites, e =C3=A0s enormes economias de escala que = s=C3=A3o transferidas para os clientes, garantimos qualidade aos = pre=C3=A7os mais competitivos.</p>=0A= <a href=3D"http://www.ping.pt" class=3D"link">Visitar = Ping.pt</a>=0A= </div>=0A= </div>=0A= </div>=0A= =0A= <div id=3D"sidebar">=0A= <div id=3D"posts">=0A= <div id=3D"posts_icon"></div>=0A= <h2 class=3D"underline title">Novidades</h2>=0A= <div class=3D"clear"></div>=0A= <div class=3D"post">=0A= <div class=3D"writedate">Escrito a <span class=3D"date">24 = Outubro 2011</span></div>=0A= <h2><a = href=3D"http://portugalmail.blog.pt/lista-negra-e-lista-branca/">Lista = Negra e Lista Branca</a></h2>=0A= <p>=0A= A Lista Negra e a Lista Branca s=C3=A3o funcionalidades = de que o utilizador pode tirar partido para definir um conjunto de = endere=C3=A7os de email indesejados ou leg=C3=ADtimos. Para adicionar = contactos =C3=A0 estas lista, deve=C2=A0aceder =C3=A0s PREFER=C3=8ANCIAS = da sua caixa de &#8230; <a = href=3D"http://portugalmail.blog.pt/lista-negra-e-lista-branca/">Continua= r a ler <span>&#8594;</span></a> <a class=3D"viewmore" = href=3D"http://portugalmail.blog.pt/lista-negra-e-lista-branca/">=0A= <span class=3D"icon" title=3D"Ler mais">[+]</span>=0A= </a>=0A= </p>=0A= </div>=0A= <a class=3D"viewmore" = href=3D"http://portugalmail.blog.pt">=0A= <span class=3D"icon">[=C2=BB]</span>=0A= <span class=3D"label">Visite o nosso blog</span>=0A= </a>=0A= </div>=0A= <div id=3D"followus">=0A= <span class=3D"title">Ou siga-nos atrav=C3=A9s de:</span>=0A= <div class=3D"clear"></div>=0A= <a id=3D"facebook" = href=3D"http://www.facebook.com/pages/Portugalmail/370371909626" = title=3D"Goste de n=C3=B3s no Facebook" target=3D"_blank"></a>=0A= <a id=3D"twitter" href=3D"http://www.twitter.com/portugalmail" = title=3D"Siga-nos no Twitter" target=3D"_blank"></a>=0A= <a id=3D"rss" href=3D"http://portugalmail.blog.pt/feed/" = title=3D"Subscreva o nosso RSS feed" target=3D"_blank"></a>=0A= <div class=3D"clear"></div>=0A= </div>=0A= </div>=0A= <div class=3D"clear"></div>=0A= </div>=0A= </div>=0A= <div id=3D"footer" class=3D"links">=0A= <div class=3D"content">=0A= <div class=3D"navleft">=0A= <div class=3D"block">=0A= <div class=3D"title">Navega=C3=A7=C3=A3o</div>=0A= <ul>=0A= <li><a href=3D"index.php">In=C3=ADcio</a></li>=0A= <li><a = href=3D"http://ajuda.portugalmail.pt">Suporte</a></li>=0A= </ul>=0A= </div>=0A= <div class=3D"block">=0A= <div class=3D"title">Informa=C3=A7=C3=A3o</div>=0A= <ul>=0A= <li><a = href=3D"http://noticias.portugalmail.pt">Actualidades</a></li>=0A= <li><a = href=3D"http://futebolar.portugalmail.pt">Futebolar</a></li>=0A= <li><a = href=3D"http://casas.portugalmail.pt">Casas</a></li>=0A= <li><a = href=3D"http://carros.portugalmail.pt">Carros</a></li>=0A= </ul>=0A= </div>=0A= <div class=3D"block">=0A= <div class=3D"title">Servi=C3=A7os Web</div>=0A= <ul>=0A= <li><a = href=3D"http://www.ping.pt">Alojamentos</a></li>=0A= <li><a = href=3D"http://www.ping.pt">Dom=C3=ADnios</a></li>=0A= <li><a href=3D"http://www.blog.pt">Blog</a></li>=0A= </ul>=0A= </div>=0A= </div>=0A= <div class=3D"clear"></div>=0A= <span>=C2=A9 2010 Portugalmail Comunica=C3=A7=C3=B5es = S.A.</span>=0A= </div>=0A= </div>=0A= <script type=3D"text/javascript">//<![CDATA[=0A= var PORTAL =3D {"signup_domains":["portugalmail.pt","portugalmail.com"]}=0A= //]]></script>=0A= <script type=3D"text/javascript">=0A= var _gaq =3D _gaq || [];=0A= _gaq.push(['_setAccount', 'UA-161806-1']);=0A= _gaq.push(['_trackPageview']);=0A= =0A= (function() {=0A= var ga =3D document.createElement('script'); ga.type =3D = 'text/javascript'; ga.async =3D true;=0A= ga.src =3D ('https:' =3D=3D document.location.protocol ? = 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';=0A= var s =3D document.getElementsByTagName('script')[0]; = s.parentNode.insertBefore(ga, s);=0A= })();=0A= </script>=0A= </body>=0A= </html>=0A= ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://portugalmail.pt/theme/graphics/features/contacts-large.png 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 ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://portugalmail.pt/theme/graphics/features/antivirus-large.png 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 tFUAAAAASUVORK5CYII= ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://portugalmail.pt/theme/graphics/features/support-large.png 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 ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Location: http://portugalmail.pt/theme/graphics/features/embed-large.png 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 AQQBsxK8IpTLAAAAAElFTkSuQmCC ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://portugalmail.pt/theme/style.css BODY { PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: = 0px; FONT-FAMILY: Arial, Helvetica, sans-serif; COLOR: #37332d; = FONT-SIZE: 13px; PADDING-TOP: 0px } A { COLOR: #0c8bac; TEXT-DECORATION: none } A:hover { TEXT-DECORATION: underline } P { PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: = 0px; FONT-FAMILY: Georgia, Times New Roman, serif; FONT-SIZE: 16px; = PADDING-TOP: 0px } H1 { TEXT-ALIGN: center; PADDING-BOTTOM: 20px; MARGIN: 0px; PADDING-LEFT: = 0px; WIDTH: 960px; PADDING-RIGHT: 0px; FONT-FAMILY: Georgia, Times New = Roman, serif; COLOR: #37342f; FONT-SIZE: 38px; FONT-WEIGHT: normal; = PADDING-TOP: 20px } H2.underline { BACKGROUND: url(graphics/news-h2-bg.png) repeat-x 0px 28px; FLOAT: = left; HEIGHT: 38px; COLOR: #4e4b45; FONT-SIZE: 21px; FONT-WEIGHT: bold } INPUT { BORDER-BOTTOM: #bdc4c2 1px solid; BORDER-LEFT: #bdc4c2 1px solid; = PADDING-BOTTOM: 0px; LINE-HEIGHT: 24px; MARGIN: 0px; PADDING-LEFT: 8px; = PADDING-RIGHT: 8px; FONT-FAMILY: Arial, Helvetica, sans-serif; HEIGHT: = 24px; COLOR: #2e2e2e; BORDER-TOP: #bdc4c2 1px solid; BORDER-RIGHT: = #bdc4c2 1px solid; PADDING-TOP: 0px } #header { BACKGROUND: url(graphics/header-bg.png) } #features { BORDER-BOTTOM: #c7e4ea 11px solid; BACKGROUND: #4f4b45 } #signup { BACKGROUND: url(graphics/signup-bg.png); BORDER-TOP: #dce3e1 1px solid } #blog { PADDING-BOTTOM: 30px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; = BACKGROUND: #f4f9f7; PADDING-TOP: 30px } #footer { BACKGROUND: #f4f9f7 } .content { MARGIN: 0px auto; WIDTH: 960px } #logo { WIDTH: 216px; BACKGROUND: url(graphics/logo.png); HEIGHT: 36px } #navtop { MARGIN-TOP: 25px; FLOAT: left } #logo { MARGIN-TOP: 25px; FLOAT: left } #navtop { PADDING-LEFT: 25px } #navtop A { PADDING-BOTTOM: 5px; LINE-HEIGHT: 20px; PADDING-LEFT: 14px; = PADDING-RIGHT: 14px; DISPLAY: block; FLOAT: left; FONT-SIZE: 16px; = PADDING-TOP: 5px } #navtop A:hover { BACKGROUND: #d4e9ec; TEXT-DECORATION: none; -webkit-border-radius: 3px; = -moz-border-radius: 3px; border-radius: 3px } #navtop #home SPAN { WIDTH: 19px; DISPLAY: block; BACKGROUND: url(graphics/index.png) = no-repeat; FLOAT: left; HEIGHT: 19px; MARGIN-LEFT: -5px; MARGIN-RIGHT: = 5px } #navtop #home:hover SPAN { BACKGROUND-POSITION: 0px -19px } #login { PADDING-LEFT: 95px; WIDTH: 305px; BACKGROUND: = url(graphics/login-bg.png); FLOAT: right; HEIGHT: 103px; PADDING-TOP: = 12px } .horiz #login { PADDING-BOTTOM: 35px; PADDING-LEFT: 8px; WIDTH: 372px; PADDING-RIGHT: = 0px; BACKGROUND: url(graphics/login-bg-horiz.png); HEIGHT: 45px; = PADDING-TOP: 35px } #login .block { HEIGHT: 20px } #login .block * { VERTICAL-ALIGN: top } #login SPAN.label-wrap { POSITION: relative; DISPLAY: block; FLOAT: left } #login LABEL { POSITION: absolute; PADDING-BOTTOM: 0px; LINE-HEIGHT: 24px; = PADDING-LEFT: 10px; PADDING-RIGHT: 10px; COLOR: #999999; FONT-SIZE: = 13px; PADDING-TOP: 0px; TOP: 0px; LEFT: 0px } .horiz LABEL { MARGIN-TOP: 3px } #login #horde_user { WIDTH: 273px; MARGIN-BOTTOM: 5px } .horiz #login #horde_user { WIDTH: 153px; MARGIN-RIGHT: 4px } #login #horde_pass { WIDTH: 202px; FLOAT: left } .horiz #login #horde_pass { WIDTH: 100px } #horde_user { LINE-HEIGHT: 22px; FONT-SIZE: 13px } #horde_pass { LINE-HEIGHT: 22px; FONT-SIZE: 13px } .horiz #horde_user { MARGIN-TOP: 3px; MARGIN-BOTTOM: 6px; FLOAT: left } .horiz #horde_pass { MARGIN-TOP: 3px; MARGIN-BOTTOM: 6px; FLOAT: left } .horiz #horde_login { MARGIN-TOP: 3px; MARGIN-BOTTOM: 6px; FLOAT: left } #login .button { BORDER-BOTTOM-STYLE: none; MARGIN-TOP: -1px; BORDER-LEFT-STYLE: none; = WIDTH: 67px; DISPLAY: block; BORDER-TOP-STYLE: none; BACKGROUND: = url(graphics/login-button.png); FLOAT: left; HEIGHT: 28px; MARGIN-LEFT: = 4px; BORDER-RIGHT-STYLE: none; CURSOR: pointer } #login .button:hover { BACKGROUND-POSITION: 0px 28px } .horiz #login .button { MARGIN-TOP: 2px } #login .logoutMessage { PADDING-BOTTOM: 6px; BACKGROUND-COLOR: #fde3dc; PADDING-LEFT: 10px; = WIDTH: 271px; PADDING-RIGHT: 10px; MARGIN-BOTTOM: 6px; COLOR: #e03f45; = FONT-WEIGHT: bold; PADDING-TOP: 6px; -webkit-border-radius: 3px; = -moz-border-radius: 3px; border-radius: 3px } #login .success.logoutMessage { BACKGROUND: #d5f8dc; COLOR: #37342f; FONT-WEIGHT: normal } #loading { MARGIN: 30px auto; PADDING-LEFT: 40px; WIDTH: 100px; DISPLAY: block; = FONT-FAMILY: Arial, Helvetica, sans-serif; BACKGROUND: = url(graphics/loading.gif) no-repeat 0px 1px; COLOR: #85868c; FONT-SIZE: = 13px } #header #mod { PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #cdeafc; MARGIN: 5px 20px 0px; = PADDING-LEFT: 15px; WIDTH: 890px; PADDING-RIGHT: 15px; FONT-SIZE: 15px; = PADDING-TOP: 10px; -webkit-border-radius: 3px; -moz-border-radius: 3px; = border-radius: 3px } #signup { PADDING-BOTTOM: 25px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; = PADDING-TOP: 25px } #signup .label { TEXT-ALIGN: center; DISPLAY: block; MARGIN-BOTTOM: 15px; COLOR: = #d65b4c; FONT-SIZE: 20px } #signup .button { MARGIN: 0px auto; WIDTH: 271px; DISPLAY: block; BACKGROUND: = url(graphics/signup.png); HEIGHT: 49px } #signup .button:hover { BACKGROUND-POSITION: 0px 49px } #arrows { Z-INDEX: 100; POSITION: relative; MARGIN: 0px auto; WIDTH: 954px; = BACKGROUND: url(graphics/arrows.png) no-repeat 0px 0px; HEIGHT: 118px } #features TABLE.content { BORDER-BOTTOM: #69635f 1px solid; MARGIN: 0px auto } .column { PADDING-BOTTOM: 0px; PADDING-LEFT: 10px; BORDER-SPACING: 0px; WIDTH: = 220px; PADDING-RIGHT: 10px; DISPLAY: table-cell; HEIGHT: 200px; = VERTICAL-ALIGN: top; BORDER-RIGHT: #69635f 1px solid; PADDING-TOP: 0px } .one.column { PADDING-LEFT: 0px; WIDTH: 230px } .four.column { BORDER-RIGHT-WIDTH: 0px; WIDTH: auto; PADDING-RIGHT: 0px } .column .image { MARGIN: 0px auto; WIDTH: 140px; DISPLAY: block; HEIGHT: 92px } A.title { PADDING-BOTTOM: 0px; LINE-HEIGHT: 21px; MARGIN: 0px; PADDING-LEFT: 0px; = PADDING-RIGHT: 0px; FONT-FAMILY: 'Arial Black', Gadget, sans-serif; = COLOR: #2a98b9; FONT-SIZE: 21px; CURSOR: pointer; PADDING-TOP: 0px } .blocks#features { BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-LEFT-WIDTH: 0px } .blocks#features A.title { MARGIN-TOP: 13px; DISPLAY: block; FONT-SIZE: 18px } #features A.title:hover { COLOR: #46b1e6; TEXT-DECORATION: none } #features P { PADDING-BOTTOM: 15px; LINE-HEIGHT: 1.3; MARGIN: 0px; PADDING-LEFT: 0px; = PADDING-RIGHT: 0px; COLOR: #eaf2f0; PADDING-TOP: 8px } .blocks#features P { LINE-HEIGHT: 1.4 } #features .viewmore { TEXT-ALIGN: center; PADDING-BOTTOM: 13px; PADDING-LEFT: 0px; WIDTH: = 100%; PADDING-RIGHT: 0px; PADDING-TOP: 13px } #features .viewmore A { PADDING-BOTTOM: 17px; LINE-HEIGHT: 13px; MARGIN: 0px auto; = PADDING-LEFT: 10px; WIDTH: 250px; PADDING-RIGHT: 10px; DISPLAY: block; = FONT-FAMILY: Georgia, Times New Roman, serif; BACKGROUND: #47433e; = COLOR: #ffffc0; FONT-SIZE: 16px; PADDING-TOP: 17px; = -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px } #features .viewmore A:hover { BACKGROUND: #3f3c36; TEXT-DECORATION: none } H2.underline.title { LINE-HEIGHT: 32px; TEXT-TRANSFORM: uppercase; MARGIN: 5px 10px 10px; = FONT-FAMILY: 'Arial Black', Gadget, sans-serif; COLOR: #4e4b45; = FONT-SIZE: 18px; FONT-WEIGHT: normal } #services { WIDTH: 713px; FLOAT: left } #services_icon { WIDTH: 51px; BACKGROUND: url(graphics/services.png) no-repeat; FLOAT: = left; HEIGHT: 51px } #services P { LINE-HEIGHT: 1.4; MARGIN: 5px 0px 25px; FONT-FAMILY: Arial, Helvetica, = sans-serif; FONT-SIZE: 13px } .service { PADDING-BOTTOM: 10px; PADDING-LEFT: 0px; WIDTH: 335px; PADDING-RIGHT: = 20px; FLOAT: left; PADDING-TOP: 10px } .service H2 { MARGIN: 0px; FONT-SIZE: 17px } .service A.link { PADDING-BOTTOM: 6px; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; = FONT-FAMILY: Georgia, Times New Roman, serif; BACKGROUND: #ceecf7; = FONT-SIZE: 14px; PADDING-TOP: 6px; -webkit-border-radius: 3px; = -moz-border-radius: 3px; border-radius: 3px } .service A.link:hover { BACKGROUND: #bee1ef; TEXT-DECORATION: none } #sidebar { BORDER-LEFT: #dce3e1 1px solid; PADDING-LEFT: 20px; WIDTH: 226px; = FLOAT: left } #posts { WIDTH: 226px } #posts_icon { WIDTH: 51px; BACKGROUND: url(graphics/news.png) no-repeat; FLOAT: left; = HEIGHT: 51px } #posts A.viewmore { PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 100%; = PADDING-RIGHT: 0px; DISPLAY: block; FONT-WEIGHT: bold; PADDING-TOP: 10px } #posts P A.viewmore { PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; WIDTH: auto; PADDING-RIGHT: = 0px; DISPLAY: inline; PADDING-TOP: 0px } .post { BORDER-BOTTOM: #dce3e1 1px solid; PADDING-BOTTOM: 13px; PADDING-LEFT: = 0px; PADDING-RIGHT: 0px; PADDING-TOP: 13px } .post .writedate { LINE-HEIGHT: 24px; PADDING-LEFT: 24px; FONT-FAMILY: Arial, Helvetica, = sans-serif; BACKGROUND: url(graphics/pin.png) no-repeat; COLOR: #85868c; = FONT-SIZE: 13px } .post .writedate .date { FONT-STYLE: normal; FONT-WEIGHT: bold } .post H2 { LINE-HEIGHT: 19px; MARGIN: 0px; FONT-SIZE: 17px } .post P { LINE-HEIGHT: 20px; MARGIN-TOP: 6px; FONT-FAMILY: Arial, Helvetica, = sans-serif; FONT-SIZE: 13px } #blog A.viewmore { TEXT-ALIGN: center; FONT-FAMILY: Georgia, Times New Roman, serif; = FONT-SIZE: 14px } #blog A.viewmore:hover { TEXT-DECORATION: none } #blog P A.viewmore .icon { DISPLAY: inline; COLOR: #068ab0; FONT-WEIGHT: bold } #blog A.viewmore .icon { DISPLAY: block; COLOR: #e15f4f; FONT-SIZE: 12px } #blog A.viewmore .label { DISPLAY: block } #blog A.viewmore:hover .label { TEXT-DECORATION: underline } #followus { MARGIN: 5px auto 15px; WIDTH: 226px; BACKGROUND: = url(graphics/followus-bg.png) no-repeat; HEIGHT: 91px } #followus SPAN.title { TEXT-ALIGN: center; LINE-HEIGHT: 38px; WIDTH: 100%; FONT-FAMILY: = Georgia, Times New Roman, serif; FLOAT: left; FONT-SIZE: 14px; = FONT-WEIGHT: bold } #followus A { MARGIN-TOP: 4px; WIDTH: 32px; DISPLAY: inline; FLOAT: left; HEIGHT: = 32px; MARGIN-RIGHT: 22px } #facebook { BACKGROUND: url(graphics/facebook.png) no-repeat; MARGIN-LEFT: 44px } #twitter { BACKGROUND: url(graphics/twitter.png) no-repeat } #rss { BACKGROUND: url(graphics/rss.png) no-repeat } #footer .content { PADDING-BOTTOM: 150px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; = FONT-FAMILY: Georgia, Times New Roman, serif; COLOR: #534d48; = PADDING-TOP: 17px } .horiz#header { BORDER-BOTTOM: #dce3e1 1px solid; PADDING-BOTTOM: 25px } .tos.horiz#header { HEIGHT: 165px } .horiz#header .promote { FLOAT: left } .horiz#header H1 { POSITION: relative; PADDING-BOTTOM: 10px; MARGIN-TOP: 0px; WIDTH: auto; = MARGIN-BOTTOM: 0px; FLOAT: left; CLEAR: left; TOP: 0px } .horiz#header P { LINE-HEIGHT: 1.3; WIDTH: 630px; FLOAT: left; COLOR: #37342f; CLEAR: = left } .horiz#header #signup { BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: center; PADDING-BOTTOM: 0px; = MARGIN-TOP: 23px; BORDER-LEFT-STYLE: none; PADDING-LEFT: 30px; WIDTH: = 259px; PADDING-RIGHT: 0px; BORDER-TOP-STYLE: none; BACKGROUND: = url(graphics/signup-block.png) no-repeat; FLOAT: right; HEIGHT: 106px; = COLOR: #37342f; BORDER-RIGHT-STYLE: none; FONT-SIZE: 18px; PADDING-TOP: = 15px } .horiz#header #signup .button { MARGIN-TOP: 10px; WIDTH: 162px; DISPLAY: block; BACKGROUND: = url(graphics/signup-button.png) no-repeat; HEIGHT: 39px } .horiz#header #signup .button:hover { BACKGROUND-POSITION: 0px -39px } #tos { BACKGROUND: #f4f9f7 } #tos .content { PADDING-BOTTOM: 40px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; = PADDING-TOP: 40px } #tos .content P { LINE-HEIGHT: 1.3 } #tos .content UL { LINE-HEIGHT: 1.3 } #tos .content P { WIDTH: 600px } #tos .content UL { WIDTH: 550px; FONT-FAMILY: Georgia, Times New Roman, serif; FONT-SIZE: = 16px } #tos .content H2 { MARGIN-TOP: 20px; FONT-FAMILY: 'Arial Black', Gadget, sans-serif; = MARGIN-BOTTOM: 10px; COLOR: #4e4b45; FONT-SIZE: 18px; FONT-WEIGHT: = normal } #tos .content H2:first-child { MARGIN-TOP: 0px } .blocks#features { PADDING-BOTTOM: 0px; BACKGROUND: #f4f9f7 } .blocks#features .content { PADDING-BOTTOM: 40px; MARGIN: 0px auto; PADDING-LEFT: 0px; = PADDING-RIGHT: 0px; PADDING-TOP: 40px } .blocks#features H2 { HEIGHT: 60px; FONT-SIZE: 18px } .blocks#features P { COLOR: #37342f; CLEAR: both; FONT-SIZE: 14px } .blocks#features .row { PADDING-BOTTOM: 30px; BORDER-TOP: #dce3e1 1px solid; PADDING-TOP: 30px } .blocks#features :first-child.row { BORDER-TOP-WIDTH: 0px; PADDING-TOP: 0px } .blocks#features .feature { BORDER-LEFT: #d9dfdc 1px solid; PADDING-BOTTOM: 0px; PADDING-LEFT: = 20px; WIDTH: 293px; PADDING-RIGHT: 20px; FLOAT: left; MARGIN-RIGHT: = -1px; BORDER-RIGHT: #d9dfdc 1px solid; PADDING-TOP: 0px } .blocks#features .feature IMG { DISPLAY: block; FLOAT: left; MARGIN-RIGHT: 10px } .blocks#features .first.feature { BORDER-LEFT-STYLE: none; PADDING-LEFT: 0px } .blocks#features .last.feature { PADDING-RIGHT: 0px; BORDER-RIGHT-STYLE: none } .links#footer { BACKGROUND: #eaf2f0; BORDER-TOP: #dce3e1 1px solid } .links#footer .content { PADDING-BOTTOM: 30px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; = PADDING-TOP: 24px } #footer .content SPAN { MARGIN-TOP: 30px; DISPLAY: block; FONT-SIZE: 14px } #footer .navleft UL { PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 0px; PADDING-LEFT: = 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px } #footer .navleft LI { LINE-HEIGHT: 22px; FONT-SIZE: 14px } #footer .navleft .block { WIDTH: 188px; FLOAT: left } #footer .navleft .title { TEXT-TRANSFORM: uppercase; FONT-FAMILY: 'Arial Black', Gadget, = sans-serif; MARGIN-BOTTOM: 3px; COLOR: #e15f4f; FONT-SIZE: 15px; = FONT-WEIGHT: normal } #footer .navleft A { FONT-FAMILY: Arial, Helvetica, sans-serif } .clear { CLEAR: both } ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://portugalmail.pt/js/prototype.js /* Prototype JavaScript framework, version 1.7_rc2=0A= * (c) 2005-2010 Sam Stephenson=0A= *=0A= * Prototype is freely distributable under the terms of an MIT-style = license.=0A= * For details, see the Prototype web site: http://www.prototypejs.org/=0A= *=0A= = *------------------------------------------------------------------------= --*/=0A= =0A= var Prototype =3D {=0A= =0A= Version: '1.7_rc2',=0A= =0A= Browser: (function(){=0A= var ua =3D navigator.userAgent;=0A= var isOpera =3D Object.prototype.toString.call(window.opera) =3D=3D = '[object Opera]';=0A= return {=0A= IE: !!window.attachEvent && !isOpera,=0A= Opera: isOpera,=0A= WebKit: ua.indexOf('AppleWebKit/') > -1,=0A= Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') = =3D=3D=3D -1,=0A= MobileSafari: /Apple.*Mobile/.test(ua)=0A= }=0A= })(),=0A= =0A= BrowserFeatures: {=0A= XPath: !!document.evaluate,=0A= =0A= SelectorsAPI: !!document.querySelector,=0A= =0A= ElementExtensions: (function() {=0A= var constructor =3D window.Element || window.HTMLElement;=0A= return !!(constructor && constructor.prototype);=0A= })(),=0A= SpecificElementExtensions: (function() {=0A= if (typeof window.HTMLDivElement !=3D=3D 'undefined')=0A= return true;=0A= =0A= var div =3D document.createElement('div'),=0A= form =3D document.createElement('form'),=0A= isSupported =3D false;=0A= =0A= if (div['__proto__'] && (div['__proto__'] !=3D=3D = form['__proto__'])) {=0A= isSupported =3D true;=0A= }=0A= =0A= div =3D form =3D null;=0A= =0A= return isSupported;=0A= })()=0A= },=0A= =0A= ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',=0A= JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,=0A= =0A= emptyFunction: function() { },=0A= =0A= K: function(x) { return x }=0A= };=0A= =0A= if (Prototype.Browser.MobileSafari)=0A= Prototype.BrowserFeatures.SpecificElementExtensions =3D false;=0A= =0A= =0A= var Abstract =3D { };=0A= =0A= =0A= var Try =3D {=0A= these: function() {=0A= var returnValue;=0A= =0A= for (var i =3D 0, length =3D arguments.length; i < length; i++) {=0A= var lambda =3D arguments[i];=0A= try {=0A= returnValue =3D lambda();=0A= break;=0A= } catch (e) { }=0A= }=0A= =0A= return returnValue;=0A= }=0A= };=0A= =0A= /* Based on Alex Arnell's inheritance implementation. */=0A= =0A= var Class =3D (function() {=0A= =0A= var IS_DONTENUM_BUGGY =3D (function(){=0A= for (var p in { toString: 1 }) {=0A= if (p =3D=3D=3D 'toString') return false;=0A= }=0A= return true;=0A= })();=0A= =0A= function subclass() {};=0A= function create() {=0A= var parent =3D null, properties =3D $A(arguments);=0A= if (Object.isFunction(properties[0]))=0A= parent =3D properties.shift();=0A= =0A= function klass() {=0A= this.initialize.apply(this, arguments);=0A= }=0A= =0A= Object.extend(klass, Class.Methods);=0A= klass.superclass =3D parent;=0A= klass.subclasses =3D [];=0A= =0A= if (parent) {=0A= subclass.prototype =3D parent.prototype;=0A= klass.prototype =3D new subclass;=0A= parent.subclasses.push(klass);=0A= }=0A= =0A= for (var i =3D 0, length =3D properties.length; i < length; i++)=0A= klass.addMethods(properties[i]);=0A= =0A= if (!klass.prototype.initialize)=0A= klass.prototype.initialize =3D Prototype.emptyFunction;=0A= =0A= klass.prototype.constructor =3D klass;=0A= return klass;=0A= }=0A= =0A= function addMethods(source) {=0A= var ancestor =3D this.superclass && this.superclass.prototype,=0A= properties =3D Object.keys(source);=0A= =0A= if (IS_DONTENUM_BUGGY) {=0A= if (source.toString !=3D Object.prototype.toString)=0A= properties.push("toString");=0A= if (source.valueOf !=3D Object.prototype.valueOf)=0A= properties.push("valueOf");=0A= }=0A= =0A= for (var i =3D 0, length =3D properties.length; i < length; i++) {=0A= var property =3D properties[i], value =3D source[property];=0A= if (ancestor && Object.isFunction(value) &&=0A= value.argumentNames()[0] =3D=3D "$super") {=0A= var method =3D value;=0A= value =3D (function(m) {=0A= return function() { return ancestor[m].apply(this, arguments); = };=0A= })(property).wrap(method);=0A= =0A= value.valueOf =3D method.valueOf.bind(method);=0A= value.toString =3D method.toString.bind(method);=0A= }=0A= this.prototype[property] =3D value;=0A= }=0A= =0A= return this;=0A= }=0A= =0A= return {=0A= create: create,=0A= Methods: {=0A= addMethods: addMethods=0A= }=0A= };=0A= })();=0A= (function() {=0A= =0A= var _toString =3D Object.prototype.toString,=0A= NULL_TYPE =3D 'Null',=0A= UNDEFINED_TYPE =3D 'Undefined',=0A= BOOLEAN_TYPE =3D 'Boolean',=0A= NUMBER_TYPE =3D 'Number',=0A= STRING_TYPE =3D 'String',=0A= OBJECT_TYPE =3D 'Object',=0A= BOOLEAN_CLASS =3D '[object Boolean]',=0A= NUMBER_CLASS =3D '[object Number]',=0A= STRING_CLASS =3D '[object String]',=0A= ARRAY_CLASS =3D '[object Array]',=0A= NATIVE_JSON_STRINGIFY_SUPPORT =3D window.JSON &&=0A= typeof JSON.stringify =3D=3D=3D 'function' &&=0A= JSON.stringify(0) =3D=3D=3D '0' &&=0A= typeof JSON.stringify(Prototype.K) =3D=3D=3D 'undefined';=0A= =0A= function Type(o) {=0A= switch(o) {=0A= case null: return NULL_TYPE;=0A= case (void 0): return UNDEFINED_TYPE;=0A= }=0A= var type =3D typeof o;=0A= switch(type) {=0A= case 'boolean': return BOOLEAN_TYPE;=0A= case 'number': return NUMBER_TYPE;=0A= case 'string': return STRING_TYPE;=0A= }=0A= return OBJECT_TYPE;=0A= }=0A= =0A= function extend(destination, source) {=0A= for (var property in source)=0A= destination[property] =3D source[property];=0A= return destination;=0A= }=0A= =0A= function inspect(object) {=0A= try {=0A= if (isUndefined(object)) return 'undefined';=0A= if (object =3D=3D=3D null) return 'null';=0A= return object.inspect ? object.inspect() : String(object);=0A= } catch (e) {=0A= if (e instanceof RangeError) return '...';=0A= throw e;=0A= }=0A= }=0A= =0A= function toJSON(value) {=0A= return Str('', { '': value }, []);=0A= }=0A= =0A= function Str(key, holder, stack) {=0A= var value =3D holder[key],=0A= type =3D typeof value;=0A= =0A= if (Type(value) =3D=3D=3D OBJECT_TYPE && typeof value.toJSON = =3D=3D=3D 'function') {=0A= value =3D value.toJSON(key);=0A= }=0A= =0A= var _class =3D _toString.call(value);=0A= =0A= switch (_class) {=0A= case NUMBER_CLASS:=0A= case BOOLEAN_CLASS:=0A= case STRING_CLASS:=0A= value =3D value.valueOf();=0A= }=0A= =0A= switch (value) {=0A= case null: return 'null';=0A= case true: return 'true';=0A= case false: return 'false';=0A= }=0A= =0A= type =3D typeof value;=0A= switch (type) {=0A= case 'string':=0A= return value.inspect(true);=0A= case 'number':=0A= return isFinite(value) ? String(value) : 'null';=0A= case 'object':=0A= =0A= for (var i =3D 0, length =3D stack.length; i < length; i++) {=0A= if (stack[i] =3D=3D=3D value) { throw new TypeError(); }=0A= }=0A= stack.push(value);=0A= =0A= var partial =3D [];=0A= if (_class =3D=3D=3D ARRAY_CLASS) {=0A= for (var i =3D 0, length =3D value.length; i < length; i++) {=0A= var str =3D Str(i, value, stack);=0A= partial.push(typeof str =3D=3D=3D 'undefined' ? 'null' : = str);=0A= }=0A= partial =3D '[' + partial.join(',') + ']';=0A= } else {=0A= var keys =3D Object.keys(value);=0A= for (var i =3D 0, length =3D keys.length; i < length; i++) {=0A= var key =3D keys[i], str =3D Str(key, value, stack);=0A= if (typeof str !=3D=3D "undefined") {=0A= partial.push(key.inspect(true)+ ':' + str);=0A= }=0A= }=0A= partial =3D '{' + partial.join(',') + '}';=0A= }=0A= stack.pop();=0A= return partial;=0A= }=0A= }=0A= =0A= function stringify(object) {=0A= return JSON.stringify(object);=0A= }=0A= =0A= function toQueryString(object) {=0A= return $H(object).toQueryString();=0A= }=0A= =0A= function toHTML(object) {=0A= return object && object.toHTML ? object.toHTML() : = String.interpret(object);=0A= }=0A= =0A= function keys(object) {=0A= if (Type(object) !=3D=3D OBJECT_TYPE) { throw new TypeError(); }=0A= var results =3D [];=0A= for (var property in object) {=0A= if (object.hasOwnProperty(property)) {=0A= results.push(property);=0A= }=0A= }=0A= return results;=0A= }=0A= =0A= function values(object) {=0A= var results =3D [];=0A= for (var property in object)=0A= results.push(object[property]);=0A= return results;=0A= }=0A= =0A= function clone(object) {=0A= return extend({ }, object);=0A= }=0A= =0A= function isElement(object) {=0A= return !!(object && object.nodeType =3D=3D 1);=0A= }=0A= =0A= function isArray(object) {=0A= return _toString.call(object) =3D=3D=3D ARRAY_CLASS;=0A= }=0A= =0A= var hasNativeIsArray =3D (typeof Array.isArray =3D=3D 'function')=0A= && Array.isArray([]) && !Array.isArray({});=0A= =0A= if (hasNativeIsArray) {=0A= isArray =3D Array.isArray;=0A= }=0A= =0A= function isHash(object) {=0A= return object instanceof Hash;=0A= }=0A= =0A= function isFunction(object) {=0A= return typeof object =3D=3D=3D "function";=0A= }=0A= =0A= function isString(object) {=0A= return _toString.call(object) =3D=3D=3D STRING_CLASS;=0A= }=0A= =0A= function isNumber(object) {=0A= return _toString.call(object) =3D=3D=3D NUMBER_CLASS;=0A= }=0A= =0A= function isUndefined(object) {=0A= return typeof object =3D=3D=3D "undefined";=0A= }=0A= =0A= extend(Object, {=0A= extend: extend,=0A= inspect: inspect,=0A= toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,=0A= toQueryString: toQueryString,=0A= toHTML: toHTML,=0A= keys: Object.keys || keys,=0A= values: values,=0A= clone: clone,=0A= isElement: isElement,=0A= isArray: isArray,=0A= isHash: isHash,=0A= isFunction: isFunction,=0A= isString: isString,=0A= isNumber: isNumber,=0A= isUndefined: isUndefined=0A= });=0A= })();=0A= Object.extend(Function.prototype, (function() {=0A= var slice =3D Array.prototype.slice;=0A= =0A= function update(array, args) {=0A= var arrayLength =3D array.length, length =3D args.length;=0A= while (length--) array[arrayLength + length] =3D args[length];=0A= return array;=0A= }=0A= =0A= function merge(array, args) {=0A= array =3D slice.call(array, 0);=0A= return update(array, args);=0A= }=0A= =0A= function argumentNames() {=0A= var names =3D = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]=0A= .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')=0A= .replace(/\s+/g, '').split(',');=0A= return names.length =3D=3D 1 && !names[0] ? [] : names;=0A= }=0A= =0A= function bind(context) {=0A= if (arguments.length < 2 && Object.isUndefined(arguments[0])) return = this;=0A= var __method =3D this, args =3D slice.call(arguments, 1);=0A= return function() {=0A= var a =3D merge(args, arguments);=0A= return __method.apply(context, a);=0A= }=0A= }=0A= =0A= function bindAsEventListener(context) {=0A= var __method =3D this, args =3D slice.call(arguments, 1);=0A= return function(event) {=0A= var a =3D update([event || window.event], args);=0A= return __method.apply(context, a);=0A= }=0A= }=0A= =0A= function curry() {=0A= if (!arguments.length) return this;=0A= var __method =3D this, args =3D slice.call(arguments, 0);=0A= return function() {=0A= var a =3D merge(args, arguments);=0A= return __method.apply(this, a);=0A= }=0A= }=0A= =0A= function delay(timeout) {=0A= var __method =3D this, args =3D slice.call(arguments, 1);=0A= timeout =3D timeout * 1000;=0A= return window.setTimeout(function() {=0A= return __method.apply(__method, args);=0A= }, timeout);=0A= }=0A= =0A= function defer() {=0A= var args =3D update([0.01], arguments);=0A= return this.delay.apply(this, args);=0A= }=0A= =0A= function wrap(wrapper) {=0A= var __method =3D this;=0A= return function() {=0A= var a =3D update([__method.bind(this)], arguments);=0A= return wrapper.apply(this, a);=0A= }=0A= }=0A= =0A= function methodize() {=0A= if (this._methodized) return this._methodized;=0A= var __method =3D this;=0A= return this._methodized =3D function() {=0A= var a =3D update([this], arguments);=0A= return __method.apply(null, a);=0A= };=0A= }=0A= =0A= return {=0A= argumentNames: argumentNames,=0A= bind: bind,=0A= bindAsEventListener: bindAsEventListener,=0A= curry: curry,=0A= delay: delay,=0A= defer: defer,=0A= wrap: wrap,=0A= methodize: methodize=0A= }=0A= })());=0A= =0A= =0A= =0A= (function(proto) {=0A= =0A= =0A= function toISOString() {=0A= return this.getUTCFullYear() + '-' +=0A= (this.getUTCMonth() + 1).toPaddedString(2) + '-' +=0A= this.getUTCDate().toPaddedString(2) + 'T' +=0A= this.getUTCHours().toPaddedString(2) + ':' +=0A= this.getUTCMinutes().toPaddedString(2) + ':' +=0A= this.getUTCSeconds().toPaddedString(2) + 'Z';=0A= }=0A= =0A= =0A= function toJSON() {=0A= return this.toISOString();=0A= }=0A= =0A= if (!proto.toISOString) proto.toISOString =3D toISOString;=0A= if (!proto.toJSON) proto.toJSON =3D toJSON;=0A= =0A= })(Date.prototype);=0A= =0A= =0A= RegExp.prototype.match =3D RegExp.prototype.test;=0A= =0A= RegExp.escape =3D function(str) {=0A= return String(str).replace(/([.*+?^=3D!:${}()|[\]\/\\])/g, '\\$1');=0A= };=0A= var PeriodicalExecuter =3D Class.create({=0A= initialize: function(callback, frequency) {=0A= this.callback =3D callback;=0A= this.frequency =3D frequency;=0A= this.currentlyExecuting =3D false;=0A= =0A= this.registerCallback();=0A= },=0A= =0A= registerCallback: function() {=0A= this.timer =3D setInterval(this.onTimerEvent.bind(this), = this.frequency * 1000);=0A= },=0A= =0A= execute: function() {=0A= this.callback(this);=0A= },=0A= =0A= stop: function() {=0A= if (!this.timer) return;=0A= clearInterval(this.timer);=0A= this.timer =3D null;=0A= },=0A= =0A= onTimerEvent: function() {=0A= if (!this.currentlyExecuting) {=0A= try {=0A= this.currentlyExecuting =3D true;=0A= this.execute();=0A= this.currentlyExecuting =3D false;=0A= } catch(e) {=0A= this.currentlyExecuting =3D false;=0A= throw e;=0A= }=0A= }=0A= }=0A= });=0A= Object.extend(String, {=0A= interpret: function(value) {=0A= return value =3D=3D null ? '' : String(value);=0A= },=0A= specialChar: {=0A= '\b': '\\b',=0A= '\t': '\\t',=0A= '\n': '\\n',=0A= '\f': '\\f',=0A= '\r': '\\r',=0A= '\\': '\\\\'=0A= }=0A= });=0A= =0A= Object.extend(String.prototype, (function() {=0A= var NATIVE_JSON_PARSE_SUPPORT =3D window.JSON &&=0A= typeof JSON.parse =3D=3D=3D 'function' &&=0A= JSON.parse('{"test": true}').test;=0A= =0A= function prepareReplacement(replacement) {=0A= if (Object.isFunction(replacement)) return replacement;=0A= var template =3D new Template(replacement);=0A= return function(match) { return template.evaluate(match) };=0A= }=0A= =0A= function gsub(pattern, replacement) {=0A= var result =3D '', source =3D this, match;=0A= replacement =3D prepareReplacement(replacement);=0A= =0A= if (Object.isString(pattern))=0A= pattern =3D RegExp.escape(pattern);=0A= =0A= if (!(pattern.length || pattern.source)) {=0A= replacement =3D replacement('');=0A= return replacement + source.split('').join(replacement) + = replacement;=0A= }=0A= =0A= while (source.length > 0) {=0A= if (match =3D source.match(pattern)) {=0A= result +=3D source.slice(0, match.index);=0A= result +=3D String.interpret(replacement(match));=0A= source =3D source.slice(match.index + match[0].length);=0A= } else {=0A= result +=3D source, source =3D '';=0A= }=0A= }=0A= return result;=0A= }=0A= =0A= function sub(pattern, replacement, count) {=0A= replacement =3D prepareReplacement(replacement);=0A= count =3D Object.isUndefined(count) ? 1 : count;=0A= =0A= return this.gsub(pattern, function(match) {=0A= if (--count < 0) return match[0];=0A= return replacement(match);=0A= });=0A= }=0A= =0A= function scan(pattern, iterator) {=0A= this.gsub(pattern, iterator);=0A= return String(this);=0A= }=0A= =0A= function truncate(length, truncation) {=0A= length =3D length || 30;=0A= truncation =3D Object.isUndefined(truncation) ? '...' : truncation;=0A= return this.length > length ?=0A= this.slice(0, length - truncation.length) + truncation : = String(this);=0A= }=0A= =0A= function strip() {=0A= return this.replace(/^\s+/, '').replace(/\s+$/, '');=0A= }=0A= =0A= function stripTags() {=0A= return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, = '');=0A= }=0A= =0A= function stripScripts() {=0A= return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');=0A= }=0A= =0A= function extractScripts() {=0A= var matchAll =3D new RegExp(Prototype.ScriptFragment, 'img'),=0A= matchOne =3D new RegExp(Prototype.ScriptFragment, 'im');=0A= return (this.match(matchAll) || []).map(function(scriptTag) {=0A= return (scriptTag.match(matchOne) || ['', ''])[1];=0A= });=0A= }=0A= =0A= function evalScripts() {=0A= return this.extractScripts().map(function(script) { return = eval(script) });=0A= }=0A= =0A= function escapeHTML() {=0A= return = this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');=0A= }=0A= =0A= function unescapeHTML() {=0A= return = this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;= /g,'&');=0A= }=0A= =0A= =0A= function toQueryParams(separator) {=0A= var match =3D this.strip().match(/([^?#]*)(#.*)?$/);=0A= if (!match) return { };=0A= =0A= return match[1].split(separator || '&').inject({ }, function(hash, = pair) {=0A= if ((pair =3D pair.split('=3D'))[0]) {=0A= var key =3D decodeURIComponent(pair.shift()),=0A= value =3D pair.length > 1 ? pair.join('=3D') : pair[0];=0A= =0A= if (value !=3D undefined) value =3D decodeURIComponent(value);=0A= =0A= if (key in hash) {=0A= if (!Object.isArray(hash[key])) hash[key] =3D [hash[key]];=0A= hash[key].push(value);=0A= }=0A= else hash[key] =3D value;=0A= }=0A= return hash;=0A= });=0A= }=0A= =0A= function toArray() {=0A= return this.split('');=0A= }=0A= =0A= function succ() {=0A= return this.slice(0, this.length - 1) +=0A= String.fromCharCode(this.charCodeAt(this.length - 1) + 1);=0A= }=0A= =0A= function times(count) {=0A= return count < 1 ? '' : new Array(count + 1).join(this);=0A= }=0A= =0A= function camelize() {=0A= return this.replace(/-+(.)?/g, function(match, chr) {=0A= return chr ? chr.toUpperCase() : '';=0A= });=0A= }=0A= =0A= function capitalize() {=0A= return this.charAt(0).toUpperCase() + = this.substring(1).toLowerCase();=0A= }=0A= =0A= function underscore() {=0A= return this.replace(/::/g, '/')=0A= .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')=0A= .replace(/([a-z\d])([A-Z])/g, '$1_$2')=0A= .replace(/-/g, '_')=0A= .toLowerCase();=0A= }=0A= =0A= function dasherize() {=0A= return this.replace(/_/g, '-');=0A= }=0A= =0A= function inspect(useDoubleQuotes) {=0A= var escapedString =3D this.replace(/[\x00-\x1f\\]/g, = function(character) {=0A= if (character in String.specialChar) {=0A= return String.specialChar[character];=0A= }=0A= return '\\u00' + character.charCodeAt().toPaddedString(2, 16);=0A= });=0A= if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') = + '"';=0A= return "'" + escapedString.replace(/'/g, '\\\'') + "'";=0A= }=0A= =0A= function unfilterJSON(filter) {=0A= return this.replace(filter || Prototype.JSONFilter, '$1');=0A= }=0A= =0A= function isJSON() {=0A= var str =3D this;=0A= if (str.blank()) return false;=0A= str =3D str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');=0A= str =3D = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d= +)?/g, ']');=0A= str =3D str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');=0A= return (/^[\],:{}\s]*$/).test(str);=0A= }=0A= =0A= function evalJSON(sanitize) {=0A= var json =3D this.unfilterJSON(),=0A= cx =3D = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u= 2060-\u206f\ufeff\ufff0-\uffff]/g;=0A= if (cx.test(json)) {=0A= json =3D json.replace(cx, function (a) {=0A= return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);=0A= });=0A= }=0A= try {=0A= if (!sanitize || json.isJSON()) return eval('(' + json + ')');=0A= } catch (e) { }=0A= throw new SyntaxError('Badly formed JSON string: ' + this.inspect());=0A= }=0A= =0A= function parseJSON() {=0A= var json =3D this.unfilterJSON();=0A= return JSON.parse(json);=0A= }=0A= =0A= function include(pattern) {=0A= return this.indexOf(pattern) > -1;=0A= }=0A= =0A= function startsWith(pattern) {=0A= return this.lastIndexOf(pattern, 0) =3D=3D=3D 0;=0A= }=0A= =0A= function endsWith(pattern) {=0A= var d =3D this.length - pattern.length;=0A= return d >=3D 0 && this.indexOf(pattern, d) =3D=3D=3D d;=0A= }=0A= =0A= function empty() {=0A= return this =3D=3D '';=0A= }=0A= =0A= function blank() {=0A= return /^\s*$/.test(this);=0A= }=0A= =0A= function interpolate(object, pattern) {=0A= return new Template(this, pattern).evaluate(object);=0A= }=0A= =0A= return {=0A= gsub: gsub,=0A= sub: sub,=0A= scan: scan,=0A= truncate: truncate,=0A= strip: String.prototype.trim || strip,=0A= stripTags: stripTags,=0A= stripScripts: stripScripts,=0A= extractScripts: extractScripts,=0A= evalScripts: evalScripts,=0A= escapeHTML: escapeHTML,=0A= unescapeHTML: unescapeHTML,=0A= toQueryParams: toQueryParams,=0A= parseQuery: toQueryParams,=0A= toArray: toArray,=0A= succ: succ,=0A= times: times,=0A= camelize: camelize,=0A= capitalize: capitalize,=0A= underscore: underscore,=0A= dasherize: dasherize,=0A= inspect: inspect,=0A= unfilterJSON: unfilterJSON,=0A= isJSON: isJSON,=0A= evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,=0A= include: include,=0A= startsWith: startsWith,=0A= endsWith: endsWith,=0A= empty: empty,=0A= blank: blank,=0A= interpolate: interpolate=0A= };=0A= })());=0A= =0A= var Template =3D Class.create({=0A= initialize: function(template, pattern) {=0A= this.template =3D template.toString();=0A= this.pattern =3D pattern || Template.Pattern;=0A= },=0A= =0A= evaluate: function(object) {=0A= if (object && Object.isFunction(object.toTemplateReplacements))=0A= object =3D object.toTemplateReplacements();=0A= =0A= return this.template.gsub(this.pattern, function(match) {=0A= if (object =3D=3D null) return (match[1] + '');=0A= =0A= var before =3D match[1] || '';=0A= if (before =3D=3D '\\') return match[2];=0A= =0A= var ctx =3D object, expr =3D match[3],=0A= pattern =3D /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;=0A= =0A= match =3D pattern.exec(expr);=0A= if (match =3D=3D null) return before;=0A= =0A= while (match !=3D null) {=0A= var comp =3D match[1].startsWith('[') ? = match[2].replace(/\\\\]/g, ']') : match[1];=0A= ctx =3D ctx[comp];=0A= if (null =3D=3D ctx || '' =3D=3D match[3]) break;=0A= expr =3D expr.substring('[' =3D=3D match[3] ? match[1].length : = match[0].length);=0A= match =3D pattern.exec(expr);=0A= }=0A= =0A= return before + String.interpret(ctx);=0A= });=0A= }=0A= });=0A= Template.Pattern =3D /(^|.|\r|\n)(#\{(.*?)\})/;=0A= =0A= var $break =3D { };=0A= =0A= var Enumerable =3D (function() {=0A= function each(iterator, context) {=0A= var index =3D 0;=0A= try {=0A= this._each(function(value) {=0A= iterator.call(context, value, index++);=0A= });=0A= } catch (e) {=0A= if (e !=3D $break) throw e;=0A= }=0A= return this;=0A= }=0A= =0A= function eachSlice(number, iterator, context) {=0A= var index =3D -number, slices =3D [], array =3D this.toArray();=0A= if (number < 1) return array;=0A= while ((index +=3D number) < array.length)=0A= slices.push(array.slice(index, index+number));=0A= return slices.collect(iterator, context);=0A= }=0A= =0A= function all(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var result =3D true;=0A= this.each(function(value, index) {=0A= result =3D result && !!iterator.call(context, value, index);=0A= if (!result) throw $break;=0A= });=0A= return result;=0A= }=0A= =0A= function any(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var result =3D false;=0A= this.each(function(value, index) {=0A= if (result =3D !!iterator.call(context, value, index))=0A= throw $break;=0A= });=0A= return result;=0A= }=0A= =0A= function collect(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= results.push(iterator.call(context, value, index));=0A= });=0A= return results;=0A= }=0A= =0A= function detect(iterator, context) {=0A= var result;=0A= this.each(function(value, index) {=0A= if (iterator.call(context, value, index)) {=0A= result =3D value;=0A= throw $break;=0A= }=0A= });=0A= return result;=0A= }=0A= =0A= function findAll(iterator, context) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (iterator.call(context, value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= }=0A= =0A= function grep(filter, iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var results =3D [];=0A= =0A= if (Object.isString(filter))=0A= filter =3D new RegExp(RegExp.escape(filter));=0A= =0A= this.each(function(value, index) {=0A= if (filter.match(value))=0A= results.push(iterator.call(context, value, index));=0A= });=0A= return results;=0A= }=0A= =0A= function include(object) {=0A= if (Object.isFunction(this.indexOf))=0A= if (this.indexOf(object) !=3D -1) return true;=0A= =0A= var found =3D false;=0A= this.each(function(value) {=0A= if (value =3D=3D object) {=0A= found =3D true;=0A= throw $break;=0A= }=0A= });=0A= return found;=0A= }=0A= =0A= function inGroupsOf(number, fillWith) {=0A= fillWith =3D Object.isUndefined(fillWith) ? null : fillWith;=0A= return this.eachSlice(number, function(slice) {=0A= while(slice.length < number) slice.push(fillWith);=0A= return slice;=0A= });=0A= }=0A= =0A= function inject(memo, iterator, context) {=0A= this.each(function(value, index) {=0A= memo =3D iterator.call(context, memo, value, index);=0A= });=0A= return memo;=0A= }=0A= =0A= function invoke(method) {=0A= var args =3D $A(arguments).slice(1);=0A= return this.map(function(value) {=0A= return value[method].apply(value, args);=0A= });=0A= }=0A= =0A= function max(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D iterator.call(context, value, index);=0A= if (result =3D=3D null || value >=3D result)=0A= result =3D value;=0A= });=0A= return result;=0A= }=0A= =0A= function min(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var result;=0A= this.each(function(value, index) {=0A= value =3D iterator.call(context, value, index);=0A= if (result =3D=3D null || value < result)=0A= result =3D value;=0A= });=0A= return result;=0A= }=0A= =0A= function partition(iterator, context) {=0A= iterator =3D iterator || Prototype.K;=0A= var trues =3D [], falses =3D [];=0A= this.each(function(value, index) {=0A= (iterator.call(context, value, index) ?=0A= trues : falses).push(value);=0A= });=0A= return [trues, falses];=0A= }=0A= =0A= function pluck(property) {=0A= var results =3D [];=0A= this.each(function(value) {=0A= results.push(value[property]);=0A= });=0A= return results;=0A= }=0A= =0A= function reject(iterator, context) {=0A= var results =3D [];=0A= this.each(function(value, index) {=0A= if (!iterator.call(context, value, index))=0A= results.push(value);=0A= });=0A= return results;=0A= }=0A= =0A= function sortBy(iterator, context) {=0A= return this.map(function(value, index) {=0A= return {=0A= value: value,=0A= criteria: iterator.call(context, value, index)=0A= };=0A= }).sort(function(left, right) {=0A= var a =3D left.criteria, b =3D right.criteria;=0A= return a < b ? -1 : a > b ? 1 : 0;=0A= }).pluck('value');=0A= }=0A= =0A= function toArray() {=0A= return this.map();=0A= }=0A= =0A= function zip() {=0A= var iterator =3D Prototype.K, args =3D $A(arguments);=0A= if (Object.isFunction(args.last()))=0A= iterator =3D args.pop();=0A= =0A= var collections =3D [this].concat(args).map($A);=0A= return this.map(function(value, index) {=0A= return iterator(collections.pluck(index));=0A= });=0A= }=0A= =0A= function size() {=0A= return this.toArray().length;=0A= }=0A= =0A= function inspect() {=0A= return '#<Enumerable:' + this.toArray().inspect() + '>';=0A= }=0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= return {=0A= each: each,=0A= eachSlice: eachSlice,=0A= all: all,=0A= every: all,=0A= any: any,=0A= some: any,=0A= collect: collect,=0A= map: collect,=0A= detect: detect,=0A= findAll: findAll,=0A= select: findAll,=0A= filter: findAll,=0A= grep: grep,=0A= include: include,=0A= member: include,=0A= inGroupsOf: inGroupsOf,=0A= inject: inject,=0A= invoke: invoke,=0A= max: max,=0A= min: min,=0A= partition: partition,=0A= pluck: pluck,=0A= reject: reject,=0A= sortBy: sortBy,=0A= toArray: toArray,=0A= entries: toArray,=0A= zip: zip,=0A= size: size,=0A= inspect: inspect,=0A= find: detect=0A= };=0A= })();=0A= =0A= function $A(iterable) {=0A= if (!iterable) return [];=0A= if ('toArray' in Object(iterable)) return iterable.toArray();=0A= var length =3D iterable.length || 0, results =3D new Array(length);=0A= while (length--) results[length] =3D iterable[length];=0A= return results;=0A= }=0A= =0A= =0A= function $w(string) {=0A= if (!Object.isString(string)) return [];=0A= string =3D string.strip();=0A= return string ? string.split(/\s+/) : [];=0A= }=0A= =0A= Array.from =3D $A;=0A= =0A= =0A= (function() {=0A= var arrayProto =3D Array.prototype,=0A= slice =3D arrayProto.slice,=0A= _each =3D arrayProto.forEach; // use native browser JS 1.6 = implementation if available=0A= =0A= function each(iterator) {=0A= for (var i =3D 0, length =3D this.length; i < length; i++)=0A= iterator(this[i]);=0A= }=0A= if (!_each) _each =3D each;=0A= =0A= function clear() {=0A= this.length =3D 0;=0A= return this;=0A= }=0A= =0A= function first() {=0A= return this[0];=0A= }=0A= =0A= function last() {=0A= return this[this.length - 1];=0A= }=0A= =0A= function compact() {=0A= return this.select(function(value) {=0A= return value !=3D null;=0A= });=0A= }=0A= =0A= function flatten() {=0A= return this.inject([], function(array, value) {=0A= if (Object.isArray(value))=0A= return array.concat(value.flatten());=0A= array.push(value);=0A= return array;=0A= });=0A= }=0A= =0A= function without() {=0A= var values =3D slice.call(arguments, 0);=0A= return this.select(function(value) {=0A= return !values.include(value);=0A= });=0A= }=0A= =0A= function reverse(inline) {=0A= return (inline =3D=3D=3D false ? this.toArray() : this)._reverse();=0A= }=0A= =0A= function uniq(sorted) {=0A= return this.inject([], function(array, value, index) {=0A= if (0 =3D=3D index || (sorted ? array.last() !=3D value : = !array.include(value)))=0A= array.push(value);=0A= return array;=0A= });=0A= }=0A= =0A= function intersect(array) {=0A= return this.uniq().findAll(function(item) {=0A= return array.detect(function(value) { return item =3D=3D=3D value = });=0A= });=0A= }=0A= =0A= =0A= function clone() {=0A= return slice.call(this, 0);=0A= }=0A= =0A= function size() {=0A= return this.length;=0A= }=0A= =0A= function inspect() {=0A= return '[' + this.map(Object.inspect).join(', ') + ']';=0A= }=0A= =0A= function indexOf(item, i) {=0A= i || (i =3D 0);=0A= var length =3D this.length;=0A= if (i < 0) i =3D length + i;=0A= for (; i < length; i++)=0A= if (this[i] =3D=3D=3D item) return i;=0A= return -1;=0A= }=0A= =0A= function lastIndexOf(item, i) {=0A= i =3D isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;=0A= var n =3D this.slice(0, i).reverse().indexOf(item);=0A= return (n < 0) ? n : i - n - 1;=0A= }=0A= =0A= function concat() {=0A= var array =3D slice.call(this, 0), item;=0A= for (var i =3D 0, length =3D arguments.length; i < length; i++) {=0A= item =3D arguments[i];=0A= if (Object.isArray(item) && !('callee' in item)) {=0A= for (var j =3D 0, arrayLength =3D item.length; j < arrayLength; = j++)=0A= array.push(item[j]);=0A= } else {=0A= array.push(item);=0A= }=0A= }=0A= return array;=0A= }=0A= =0A= Object.extend(arrayProto, Enumerable);=0A= =0A= if (!arrayProto._reverse)=0A= arrayProto._reverse =3D arrayProto.reverse;=0A= =0A= Object.extend(arrayProto, {=0A= _each: _each,=0A= clear: clear,=0A= first: first,=0A= last: last,=0A= compact: compact,=0A= flatten: flatten,=0A= without: without,=0A= reverse: reverse,=0A= uniq: uniq,=0A= intersect: intersect,=0A= clone: clone,=0A= toArray: clone,=0A= size: size,=0A= inspect: inspect=0A= });=0A= =0A= var CONCAT_ARGUMENTS_BUGGY =3D (function() {=0A= return [].concat(arguments)[0][0] !=3D=3D 1;=0A= })(1,2)=0A= =0A= if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat =3D concat;=0A= =0A= if (!arrayProto.indexOf) arrayProto.indexOf =3D indexOf;=0A= if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf =3D lastIndexOf;=0A= })();=0A= function $H(object) {=0A= return new Hash(object);=0A= };=0A= =0A= var Hash =3D Class.create(Enumerable, (function() {=0A= function initialize(object) {=0A= this._object =3D Object.isHash(object) ? object.toObject() : = Object.clone(object);=0A= }=0A= =0A= =0A= function _each(iterator) {=0A= for (var key in this._object) {=0A= var value =3D this._object[key], pair =3D [key, value];=0A= pair.key =3D key;=0A= pair.value =3D value;=0A= iterator(pair);=0A= }=0A= }=0A= =0A= function set(key, value) {=0A= return this._object[key] =3D value;=0A= }=0A= =0A= function get(key) {=0A= if (this._object[key] !=3D=3D Object.prototype[key])=0A= return this._object[key];=0A= }=0A= =0A= function unset(key) {=0A= var value =3D this._object[key];=0A= delete this._object[key];=0A= return value;=0A= }=0A= =0A= function toObject() {=0A= return Object.clone(this._object);=0A= }=0A= =0A= =0A= =0A= function keys() {=0A= return this.pluck('key');=0A= }=0A= =0A= function values() {=0A= return this.pluck('value');=0A= }=0A= =0A= function index(value) {=0A= var match =3D this.detect(function(pair) {=0A= return pair.value =3D=3D=3D value;=0A= });=0A= return match && match.key;=0A= }=0A= =0A= function merge(object) {=0A= return this.clone().update(object);=0A= }=0A= =0A= function update(object) {=0A= return new Hash(object).inject(this, function(result, pair) {=0A= result.set(pair.key, pair.value);=0A= return result;=0A= });=0A= }=0A= =0A= function toQueryPair(key, value) {=0A= if (Object.isUndefined(value)) return key;=0A= return key + '=3D' + encodeURIComponent(String.interpret(value));=0A= }=0A= =0A= function toQueryString() {=0A= return this.inject([], function(results, pair) {=0A= var key =3D encodeURIComponent(pair.key), values =3D pair.value;=0A= =0A= if (values && typeof values =3D=3D 'object') {=0A= if (Object.isArray(values))=0A= return results.concat(values.map(toQueryPair.curry(key)));=0A= } else results.push(toQueryPair(key, values));=0A= return results;=0A= }).join('&');=0A= }=0A= =0A= function inspect() {=0A= return '#<Hash:{' + this.map(function(pair) {=0A= return pair.map(Object.inspect).join(': ');=0A= }).join(', ') + '}>';=0A= }=0A= =0A= function clone() {=0A= return new Hash(this);=0A= }=0A= =0A= return {=0A= initialize: initialize,=0A= _each: _each,=0A= set: set,=0A= get: get,=0A= unset: unset,=0A= toObject: toObject,=0A= toTemplateReplacements: toObject,=0A= keys: keys,=0A= values: values,=0A= index: index,=0A= merge: merge,=0A= update: update,=0A= toQueryString: toQueryString,=0A= inspect: inspect,=0A= toJSON: toObject,=0A= clone: clone=0A= };=0A= })());=0A= =0A= Hash.from =3D $H;=0A= Object.extend(Number.prototype, (function() {=0A= function toColorPart() {=0A= return this.toPaddedString(2, 16);=0A= }=0A= =0A= function succ() {=0A= return this + 1;=0A= }=0A= =0A= function times(iterator, context) {=0A= $R(0, this, true).each(iterator, context);=0A= return this;=0A= }=0A= =0A= function toPaddedString(length, radix) {=0A= var string =3D this.toString(radix || 10);=0A= return '0'.times(length - string.length) + string;=0A= }=0A= =0A= function abs() {=0A= return Math.abs(this);=0A= }=0A= =0A= function round() {=0A= return Math.round(this);=0A= }=0A= =0A= function ceil() {=0A= return Math.ceil(this);=0A= }=0A= =0A= function floor() {=0A= return Math.floor(this);=0A= }=0A= =0A= return {=0A= toColorPart: toColorPart,=0A= succ: succ,=0A= times: times,=0A= toPaddedString: toPaddedString,=0A= abs: abs,=0A= round: round,=0A= ceil: ceil,=0A= floor: floor=0A= };=0A= })());=0A= =0A= function $R(start, end, exclusive) {=0A= return new ObjectRange(start, end, exclusive);=0A= }=0A= =0A= var ObjectRange =3D Class.create(Enumerable, (function() {=0A= function initialize(start, end, exclusive) {=0A= this.start =3D start;=0A= this.end =3D end;=0A= this.exclusive =3D exclusive;=0A= }=0A= =0A= function _each(iterator) {=0A= var value =3D this.start;=0A= while (this.include(value)) {=0A= iterator(value);=0A= value =3D value.succ();=0A= }=0A= }=0A= =0A= function include(value) {=0A= if (value < this.start)=0A= return false;=0A= if (this.exclusive)=0A= return value < this.end;=0A= return value <=3D this.end;=0A= }=0A= =0A= return {=0A= initialize: initialize,=0A= _each: _each,=0A= include: include=0A= };=0A= })());=0A= =0A= =0A= =0A= var Ajax =3D {=0A= getTransport: function() {=0A= return Try.these(=0A= function() {return new XMLHttpRequest()},=0A= function() {return new ActiveXObject('Msxml2.XMLHTTP')},=0A= function() {return new ActiveXObject('Microsoft.XMLHTTP')}=0A= ) || false;=0A= },=0A= =0A= activeRequestCount: 0=0A= };=0A= =0A= Ajax.Responders =3D {=0A= responders: [],=0A= =0A= _each: function(iterator) {=0A= this.responders._each(iterator);=0A= },=0A= =0A= register: function(responder) {=0A= if (!this.include(responder))=0A= this.responders.push(responder);=0A= },=0A= =0A= unregister: function(responder) {=0A= this.responders =3D this.responders.without(responder);=0A= },=0A= =0A= dispatch: function(callback, request, transport, json) {=0A= this.each(function(responder) {=0A= if (Object.isFunction(responder[callback])) {=0A= try {=0A= responder[callback].apply(responder, [request, transport, = json]);=0A= } catch (e) { }=0A= }=0A= });=0A= }=0A= };=0A= =0A= Object.extend(Ajax.Responders, Enumerable);=0A= =0A= Ajax.Responders.register({=0A= onCreate: function() { Ajax.activeRequestCount++ },=0A= onComplete: function() { Ajax.activeRequestCount-- }=0A= });=0A= Ajax.Base =3D Class.create({=0A= initialize: function(options) {=0A= this.options =3D {=0A= method: 'post',=0A= asynchronous: true,=0A= contentType: 'application/x-www-form-urlencoded',=0A= encoding: 'UTF-8',=0A= parameters: '',=0A= evalJSON: true,=0A= evalJS: true=0A= };=0A= Object.extend(this.options, options || { });=0A= =0A= this.options.method =3D this.options.method.toLowerCase();=0A= =0A= if (Object.isString(this.options.parameters))=0A= this.options.parameters =3D = this.options.parameters.toQueryParams();=0A= else if (Object.isHash(this.options.parameters))=0A= this.options.parameters =3D this.options.parameters.toObject();=0A= }=0A= });=0A= Ajax.Request =3D Class.create(Ajax.Base, {=0A= _complete: false,=0A= =0A= initialize: function($super, url, options) {=0A= $super(options);=0A= this.transport =3D Ajax.getTransport();=0A= this.request(url);=0A= },=0A= =0A= request: function(url) {=0A= this.url =3D url;=0A= this.method =3D this.options.method;=0A= var params =3D Object.clone(this.options.parameters);=0A= =0A= if (!['get', 'post'].include(this.method)) {=0A= params['_method'] =3D this.method;=0A= this.method =3D 'post';=0A= }=0A= =0A= this.parameters =3D params;=0A= =0A= if (params =3D Object.toQueryString(params)) {=0A= if (this.method =3D=3D 'get')=0A= this.url +=3D (this.url.include('?') ? '&' : '?') + params;=0A= else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))=0A= params +=3D '&_=3D';=0A= }=0A= =0A= try {=0A= var response =3D new Ajax.Response(this);=0A= if (this.options.onCreate) this.options.onCreate(response);=0A= Ajax.Responders.dispatch('onCreate', this, response);=0A= =0A= this.transport.open(this.method.toUpperCase(), this.url,=0A= this.options.asynchronous);=0A= =0A= if (this.options.asynchronous) = this.respondToReadyState.bind(this).defer(1);=0A= =0A= this.transport.onreadystatechange =3D = this.onStateChange.bind(this);=0A= this.setRequestHeaders();=0A= =0A= this.body =3D this.method =3D=3D 'post' ? (this.options.postBody = || params) : null;=0A= this.transport.send(this.body);=0A= =0A= /* Force Firefox to handle ready state 4 for synchronous requests = */=0A= if (!this.options.asynchronous && this.transport.overrideMimeType)=0A= this.onStateChange();=0A= =0A= }=0A= catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= onStateChange: function() {=0A= var readyState =3D this.transport.readyState;=0A= if (readyState > 1 && !((readyState =3D=3D 4) && this._complete))=0A= this.respondToReadyState(this.transport.readyState);=0A= },=0A= =0A= setRequestHeaders: function() {=0A= var headers =3D {=0A= 'X-Requested-With': 'XMLHttpRequest',=0A= 'X-Prototype-Version': Prototype.Version,=0A= 'Accept': 'text/javascript, text/html, application/xml, text/xml, = */*'=0A= };=0A= =0A= if (this.method =3D=3D 'post') {=0A= headers['Content-type'] =3D this.options.contentType +=0A= (this.options.encoding ? '; charset=3D' + this.options.encoding = : '');=0A= =0A= /* Force "Connection: close" for older Mozilla browsers to work=0A= * around a bug where XMLHttpRequest sends an incorrect=0A= * Content-length header. See Mozilla Bugzilla #246651.=0A= */=0A= if (this.transport.overrideMimeType &&=0A= (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < = 2005)=0A= headers['Connection'] =3D 'close';=0A= }=0A= =0A= if (typeof this.options.requestHeaders =3D=3D 'object') {=0A= var extras =3D this.options.requestHeaders;=0A= =0A= if (Object.isFunction(extras.push))=0A= for (var i =3D 0, length =3D extras.length; i < length; i +=3D 2)=0A= headers[extras[i]] =3D extras[i+1];=0A= else=0A= $H(extras).each(function(pair) { headers[pair.key] =3D = pair.value });=0A= }=0A= =0A= for (var name in headers)=0A= this.transport.setRequestHeader(name, headers[name]);=0A= },=0A= =0A= success: function() {=0A= var status =3D this.getStatus();=0A= return !status || (status >=3D 200 && status < 300);=0A= },=0A= =0A= getStatus: function() {=0A= try {=0A= return this.transport.status || 0;=0A= } catch (e) { return 0 }=0A= },=0A= =0A= respondToReadyState: function(readyState) {=0A= var state =3D Ajax.Request.Events[readyState], response =3D new = Ajax.Response(this);=0A= =0A= if (state =3D=3D 'Complete') {=0A= try {=0A= this._complete =3D true;=0A= (this.options['on' + response.status]=0A= || this.options['on' + (this.success() ? 'Success' : 'Failure')]=0A= || Prototype.emptyFunction)(response, response.headerJSON);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= var contentType =3D response.getHeader('Content-type');=0A= if (this.options.evalJS =3D=3D 'force'=0A= || (this.options.evalJS && this.isSameOrigin() && contentType=0A= && = contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s= *$/i)))=0A= this.evalResponse();=0A= }=0A= =0A= try {=0A= (this.options['on' + state] || Prototype.emptyFunction)(response, = response.headerJSON);=0A= Ajax.Responders.dispatch('on' + state, this, response, = response.headerJSON);=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= =0A= if (state =3D=3D 'Complete') {=0A= this.transport.onreadystatechange =3D Prototype.emptyFunction;=0A= }=0A= },=0A= =0A= isSameOrigin: function() {=0A= var m =3D this.url.match(/^\s*https?:\/\/[^\/]*/);=0A= return !m || (m[0] =3D=3D = '#{protocol}//#{domain}#{port}'.interpolate({=0A= protocol: location.protocol,=0A= domain: document.domain,=0A= port: location.port ? ':' + location.port : ''=0A= }));=0A= },=0A= =0A= getHeader: function(name) {=0A= try {=0A= return this.transport.getResponseHeader(name) || null;=0A= } catch (e) { return null; }=0A= },=0A= =0A= evalResponse: function() {=0A= try {=0A= return eval((this.transport.responseText || '').unfilterJSON());=0A= } catch (e) {=0A= this.dispatchException(e);=0A= }=0A= },=0A= =0A= dispatchException: function(exception) {=0A= (this.options.onException || Prototype.emptyFunction)(this, = exception);=0A= Ajax.Responders.dispatch('onException', this, exception);=0A= }=0A= });=0A= =0A= Ajax.Request.Events =3D=0A= ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];=0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= Ajax.Response =3D Class.create({=0A= initialize: function(request){=0A= this.request =3D request;=0A= var transport =3D this.transport =3D request.transport,=0A= readyState =3D this.readyState =3D transport.readyState;=0A= =0A= if ((readyState > 2 && !Prototype.Browser.IE) || readyState =3D=3D = 4) {=0A= this.status =3D this.getStatus();=0A= this.statusText =3D this.getStatusText();=0A= this.responseText =3D String.interpret(transport.responseText);=0A= this.headerJSON =3D this._getHeaderJSON();=0A= }=0A= =0A= if (readyState =3D=3D 4) {=0A= var xml =3D transport.responseXML;=0A= this.responseXML =3D Object.isUndefined(xml) ? null : xml;=0A= this.responseJSON =3D this._getResponseJSON();=0A= }=0A= },=0A= =0A= status: 0,=0A= =0A= statusText: '',=0A= =0A= getStatus: Ajax.Request.prototype.getStatus,=0A= =0A= getStatusText: function() {=0A= try {=0A= return this.transport.statusText || '';=0A= } catch (e) { return '' }=0A= },=0A= =0A= getHeader: Ajax.Request.prototype.getHeader,=0A= =0A= getAllHeaders: function() {=0A= try {=0A= return this.getAllResponseHeaders();=0A= } catch (e) { return null }=0A= },=0A= =0A= getResponseHeader: function(name) {=0A= return this.transport.getResponseHeader(name);=0A= },=0A= =0A= getAllResponseHeaders: function() {=0A= return this.transport.getAllResponseHeaders();=0A= },=0A= =0A= _getHeaderJSON: function() {=0A= var json =3D this.getHeader('X-JSON');=0A= if (!json) return null;=0A= json =3D decodeURIComponent(escape(json));=0A= try {=0A= return json.evalJSON(this.request.options.sanitizeJSON ||=0A= !this.request.isSameOrigin());=0A= } catch (e) {=0A= this.request.dispatchException(e);=0A= }=0A= },=0A= =0A= _getResponseJSON: function() {=0A= var options =3D this.request.options;=0A= if (!options.evalJSON || (options.evalJSON !=3D 'force' &&=0A= !(this.getHeader('Content-type') || = '').include('application/json')) ||=0A= this.responseText.blank())=0A= return null;=0A= try {=0A= return this.responseText.evalJSON(options.sanitizeJSON ||=0A= !this.request.isSameOrigin());=0A= } catch (e) {=0A= this.request.dispatchException(e);=0A= }=0A= }=0A= });=0A= =0A= Ajax.Updater =3D Class.create(Ajax.Request, {=0A= initialize: function($super, container, url, options) {=0A= this.container =3D {=0A= success: (container.success || container),=0A= failure: (container.failure || (container.success ? null : = container))=0A= };=0A= =0A= options =3D Object.clone(options);=0A= var onComplete =3D options.onComplete;=0A= options.onComplete =3D (function(response, json) {=0A= this.updateContent(response.responseText);=0A= if (Object.isFunction(onComplete)) onComplete(response, json);=0A= }).bind(this);=0A= =0A= $super(url, options);=0A= },=0A= =0A= updateContent: function(responseText) {=0A= var receiver =3D this.container[this.success() ? 'success' : = 'failure'],=0A= options =3D this.options;=0A= =0A= if (!options.evalScripts) responseText =3D = responseText.stripScripts();=0A= =0A= if (receiver =3D $(receiver)) {=0A= if (options.insertion) {=0A= if (Object.isString(options.insertion)) {=0A= var insertion =3D { }; insertion[options.insertion] =3D = responseText;=0A= receiver.insert(insertion);=0A= }=0A= else options.insertion(receiver, responseText);=0A= }=0A= else receiver.update(responseText);=0A= }=0A= }=0A= });=0A= =0A= Ajax.PeriodicalUpdater =3D Class.create(Ajax.Base, {=0A= initialize: function($super, container, url, options) {=0A= $super(options);=0A= this.onComplete =3D this.options.onComplete;=0A= =0A= this.frequency =3D (this.options.frequency || 2);=0A= this.decay =3D (this.options.decay || 1);=0A= =0A= this.updater =3D { };=0A= this.container =3D container;=0A= this.url =3D url;=0A= =0A= this.start();=0A= },=0A= =0A= start: function() {=0A= this.options.onComplete =3D this.updateComplete.bind(this);=0A= this.onTimerEvent();=0A= },=0A= =0A= stop: function() {=0A= this.updater.options.onComplete =3D undefined;=0A= clearTimeout(this.timer);=0A= (this.onComplete || Prototype.emptyFunction).apply(this, arguments);=0A= },=0A= =0A= updateComplete: function(response) {=0A= if (this.options.decay) {=0A= this.decay =3D (response.responseText =3D=3D this.lastText ?=0A= this.decay * this.options.decay : 1);=0A= =0A= this.lastText =3D response.responseText;=0A= }=0A= this.timer =3D this.onTimerEvent.bind(this).delay(this.decay * = this.frequency);=0A= },=0A= =0A= onTimerEvent: function() {=0A= this.updater =3D new Ajax.Updater(this.container, this.url, = this.options);=0A= }=0A= });=0A= =0A= =0A= function $(element) {=0A= if (arguments.length > 1) {=0A= for (var i =3D 0, elements =3D [], length =3D arguments.length; i < = length; i++)=0A= elements.push($(arguments[i]));=0A= return elements;=0A= }=0A= if (Object.isString(element))=0A= element =3D document.getElementById(element);=0A= return Element.extend(element);=0A= }=0A= =0A= if (Prototype.BrowserFeatures.XPath) {=0A= document._getElementsByXPath =3D function(expression, parentElement) {=0A= var results =3D [];=0A= var query =3D document.evaluate(expression, $(parentElement) || = document,=0A= null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);=0A= for (var i =3D 0, length =3D query.snapshotLength; i < length; i++)=0A= results.push(Element.extend(query.snapshotItem(i)));=0A= return results;=0A= };=0A= }=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= if (!Node) var Node =3D { };=0A= =0A= if (!Node.ELEMENT_NODE) {=0A= Object.extend(Node, {=0A= ELEMENT_NODE: 1,=0A= ATTRIBUTE_NODE: 2,=0A= TEXT_NODE: 3,=0A= CDATA_SECTION_NODE: 4,=0A= ENTITY_REFERENCE_NODE: 5,=0A= ENTITY_NODE: 6,=0A= PROCESSING_INSTRUCTION_NODE: 7,=0A= COMMENT_NODE: 8,=0A= DOCUMENT_NODE: 9,=0A= DOCUMENT_TYPE_NODE: 10,=0A= DOCUMENT_FRAGMENT_NODE: 11,=0A= NOTATION_NODE: 12=0A= });=0A= }=0A= =0A= =0A= =0A= (function(global) {=0A= =0A= var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX =3D (function(){=0A= try {=0A= var el =3D document.createElement('<input name=3D"x">');=0A= return el.tagName.toLowerCase() =3D=3D=3D 'input' && el.name = =3D=3D=3D 'x';=0A= }=0A= catch(err) {=0A= return false;=0A= }=0A= })();=0A= =0A= var element =3D global.Element;=0A= =0A= global.Element =3D function(tagName, attributes) {=0A= attributes =3D attributes || { };=0A= tagName =3D tagName.toLowerCase();=0A= var cache =3D Element.cache;=0A= if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {=0A= tagName =3D '<' + tagName + ' name=3D"' + attributes.name + '">';=0A= delete attributes.name;=0A= return Element.writeAttribute(document.createElement(tagName), = attributes);=0A= }=0A= if (!cache[tagName]) cache[tagName] =3D = Element.extend(document.createElement(tagName));=0A= return Element.writeAttribute(cache[tagName].cloneNode(false), = attributes);=0A= };=0A= =0A= Object.extend(global.Element, element || { });=0A= if (element) global.Element.prototype =3D element.prototype;=0A= =0A= })(this);=0A= =0A= Element.idCounter =3D 1;=0A= Element.cache =3D { };=0A= =0A= function purgeElement(element) {=0A= var uid =3D element._prototypeUID;=0A= if (uid) {=0A= Element.stopObserving(element);=0A= element._prototypeUID =3D void 0;=0A= delete Element.Storage[uid];=0A= }=0A= }=0A= =0A= Element.Methods =3D {=0A= visible: function(element) {=0A= return $(element).style.display !=3D 'none';=0A= },=0A= =0A= toggle: function(element) {=0A= element =3D $(element);=0A= Element[Element.visible(element) ? 'hide' : 'show'](element);=0A= return element;=0A= },=0A= =0A= hide: function(element) {=0A= element =3D $(element);=0A= element.style.display =3D 'none';=0A= return element;=0A= },=0A= =0A= show: function(element) {=0A= element =3D $(element);=0A= element.style.display =3D '';=0A= return element;=0A= },=0A= =0A= remove: function(element) {=0A= element =3D $(element);=0A= element.parentNode.removeChild(element);=0A= return element;=0A= },=0A= =0A= update: (function(){=0A= =0A= var SELECT_ELEMENT_INNERHTML_BUGGY =3D (function(){=0A= var el =3D document.createElement("select"),=0A= isBuggy =3D true;=0A= el.innerHTML =3D "<option value=3D\"test\">test</option>";=0A= if (el.options && el.options[0]) {=0A= isBuggy =3D el.options[0].nodeName.toUpperCase() !=3D=3D = "OPTION";=0A= }=0A= el =3D null;=0A= return isBuggy;=0A= })();=0A= =0A= var TABLE_ELEMENT_INNERHTML_BUGGY =3D (function(){=0A= try {=0A= var el =3D document.createElement("table");=0A= if (el && el.tBodies) {=0A= el.innerHTML =3D "<tbody><tr><td>test</td></tr></tbody>";=0A= var isBuggy =3D typeof el.tBodies[0] =3D=3D "undefined";=0A= el =3D null;=0A= return isBuggy;=0A= }=0A= } catch (e) {=0A= return true;=0A= }=0A= })();=0A= =0A= var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING =3D (function () {=0A= var s =3D document.createElement("script"),=0A= isBuggy =3D false;=0A= try {=0A= s.appendChild(document.createTextNode(""));=0A= isBuggy =3D !s.firstChild ||=0A= s.firstChild && s.firstChild.nodeType !=3D=3D 3;=0A= } catch (e) {=0A= isBuggy =3D true;=0A= }=0A= s =3D null;=0A= return isBuggy;=0A= })();=0A= =0A= function update(element, content) {=0A= element =3D $(element);=0A= =0A= var descendants =3D element.getElementsByTagName('*'),=0A= i =3D descendants.length;=0A= while (i--) purgeElement(descendants[i]);=0A= =0A= if (content && content.toElement)=0A= content =3D content.toElement();=0A= =0A= if (Object.isElement(content))=0A= return element.update().insert(content);=0A= =0A= content =3D Object.toHTML(content);=0A= =0A= var tagName =3D element.tagName.toUpperCase();=0A= =0A= if (tagName =3D=3D=3D 'SCRIPT' && = SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {=0A= element.text =3D content;=0A= return element;=0A= }=0A= =0A= if (SELECT_ELEMENT_INNERHTML_BUGGY || = TABLE_ELEMENT_INNERHTML_BUGGY) {=0A= if (tagName in Element._insertionTranslations.tags) {=0A= while (element.firstChild) {=0A= element.removeChild(element.firstChild);=0A= }=0A= Element._getContentFromAnonymousElement(tagName, = content.stripScripts())=0A= .each(function(node) {=0A= element.appendChild(node)=0A= });=0A= }=0A= else {=0A= element.innerHTML =3D content.stripScripts();=0A= }=0A= }=0A= else {=0A= element.innerHTML =3D content.stripScripts();=0A= }=0A= =0A= content.evalScripts.bind(content).defer();=0A= return element;=0A= }=0A= =0A= return update;=0A= })(),=0A= =0A= replace: function(element, content) {=0A= element =3D $(element);=0A= if (content && content.toElement) content =3D content.toElement();=0A= else if (!Object.isElement(content)) {=0A= content =3D Object.toHTML(content);=0A= var range =3D element.ownerDocument.createRange();=0A= range.selectNode(element);=0A= content.evalScripts.bind(content).defer();=0A= content =3D range.createContextualFragment(content.stripScripts());=0A= }=0A= element.parentNode.replaceChild(content, element);=0A= return element;=0A= },=0A= =0A= insert: function(element, insertions) {=0A= element =3D $(element);=0A= =0A= if (Object.isString(insertions) || Object.isNumber(insertions) ||=0A= Object.isElement(insertions) || (insertions && = (insertions.toElement || insertions.toHTML)))=0A= insertions =3D {bottom:insertions};=0A= =0A= var content, insert, tagName, childNodes;=0A= =0A= for (var position in insertions) {=0A= content =3D insertions[position];=0A= position =3D position.toLowerCase();=0A= insert =3D Element._insertionTranslations[position];=0A= =0A= if (content && content.toElement) content =3D content.toElement();=0A= if (Object.isElement(content)) {=0A= insert(element, content);=0A= continue;=0A= }=0A= =0A= content =3D Object.toHTML(content);=0A= =0A= tagName =3D ((position =3D=3D 'before' || position =3D=3D 'after')=0A= ? element.parentNode : element).tagName.toUpperCase();=0A= =0A= childNodes =3D Element._getContentFromAnonymousElement(tagName, = content.stripScripts());=0A= =0A= if (position =3D=3D 'top' || position =3D=3D 'after') = childNodes.reverse();=0A= childNodes.each(insert.curry(element));=0A= =0A= content.evalScripts.bind(content).defer();=0A= }=0A= =0A= return element;=0A= },=0A= =0A= wrap: function(element, wrapper, attributes) {=0A= element =3D $(element);=0A= if (Object.isElement(wrapper))=0A= $(wrapper).writeAttribute(attributes || { });=0A= else if (Object.isString(wrapper)) wrapper =3D new Element(wrapper, = attributes);=0A= else wrapper =3D new Element('div', wrapper);=0A= if (element.parentNode)=0A= element.parentNode.replaceChild(wrapper, element);=0A= wrapper.appendChild(element);=0A= return wrapper;=0A= },=0A= =0A= inspect: function(element) {=0A= element =3D $(element);=0A= var result =3D '<' + element.tagName.toLowerCase();=0A= $H({'id': 'id', 'className': 'class'}).each(function(pair) {=0A= var property =3D pair.first(),=0A= attribute =3D pair.last(),=0A= value =3D (element[property] || '').toString();=0A= if (value) result +=3D ' ' + attribute + '=3D' + = value.inspect(true);=0A= });=0A= return result + '>';=0A= },=0A= =0A= recursivelyCollect: function(element, property, maximumLength) {=0A= element =3D $(element);=0A= maximumLength =3D maximumLength || -1;=0A= var elements =3D [];=0A= =0A= while (element =3D element[property]) {=0A= if (element.nodeType =3D=3D 1)=0A= elements.push(Element.extend(element));=0A= if (elements.length =3D=3D maximumLength)=0A= break;=0A= }=0A= =0A= return elements;=0A= },=0A= =0A= ancestors: function(element) {=0A= return Element.recursivelyCollect(element, 'parentNode');=0A= },=0A= =0A= descendants: function(element) {=0A= return Element.select(element, "*");=0A= },=0A= =0A= firstDescendant: function(element) {=0A= element =3D $(element).firstChild;=0A= while (element && element.nodeType !=3D 1) element =3D = element.nextSibling;=0A= return $(element);=0A= },=0A= =0A= immediateDescendants: function(element) {=0A= var results =3D [], child =3D $(element).firstChild;=0A= while (child) {=0A= if (child.nodeType =3D=3D=3D 1) {=0A= results.push(Element.extend(child));=0A= }=0A= child =3D child.nextSibling;=0A= }=0A= return results;=0A= },=0A= =0A= previousSiblings: function(element, maximumLength) {=0A= return Element.recursivelyCollect(element, 'previousSibling');=0A= },=0A= =0A= nextSiblings: function(element) {=0A= return Element.recursivelyCollect(element, 'nextSibling');=0A= },=0A= =0A= siblings: function(element) {=0A= element =3D $(element);=0A= return Element.previousSiblings(element).reverse()=0A= .concat(Element.nextSiblings(element));=0A= },=0A= =0A= match: function(element, selector) {=0A= element =3D $(element);=0A= if (Object.isString(selector))=0A= return Prototype.Selector.match(element, selector);=0A= return selector.match(element);=0A= },=0A= =0A= up: function(element, expression, index) {=0A= element =3D $(element);=0A= if (arguments.length =3D=3D 1) return $(element.parentNode);=0A= var ancestors =3D Element.ancestors(element);=0A= return Object.isNumber(expression) ? ancestors[expression] :=0A= Prototype.Selector.find(ancestors, expression, index);=0A= },=0A= =0A= down: function(element, expression, index) {=0A= element =3D $(element);=0A= if (arguments.length =3D=3D 1) return = Element.firstDescendant(element);=0A= return Object.isNumber(expression) ? = Element.descendants(element)[expression] :=0A= Element.select(element, expression)[index || 0];=0A= },=0A= =0A= previous: function(element, expression, index) {=0A= element =3D $(element);=0A= if (Object.isNumber(expression)) index =3D expression, expression = =3D false;=0A= if (!Object.isNumber(index)) index =3D 0;=0A= =0A= if (expression) {=0A= return Prototype.Selector.find(element.previousSiblings(), = expression, index);=0A= } else {=0A= return element.recursivelyCollect("previousSibling", index + = 1)[index];=0A= }=0A= },=0A= =0A= next: function(element, expression, index) {=0A= element =3D $(element);=0A= if (Object.isNumber(expression)) index =3D expression, expression = =3D false;=0A= if (!Object.isNumber(index)) index =3D 0;=0A= =0A= if (expression) {=0A= return Prototype.Selector.find(element.nextSiblings(), expression, = index);=0A= } else {=0A= var maximumLength =3D Object.isNumber(index) ? index + 1 : 1;=0A= return element.recursivelyCollect("nextSibling", index + 1)[index];=0A= }=0A= },=0A= =0A= =0A= select: function(element) {=0A= element =3D $(element);=0A= var expressions =3D Array.prototype.slice.call(arguments, 1).join(', = ');=0A= return Prototype.Selector.select(expressions, element);=0A= },=0A= =0A= adjacent: function(element) {=0A= element =3D $(element);=0A= var expressions =3D Array.prototype.slice.call(arguments, 1).join(', = ');=0A= return Prototype.Selector.select(expressions, = element.parentNode).without(element);=0A= },=0A= =0A= identify: function(element) {=0A= element =3D $(element);=0A= var id =3D Element.readAttribute(element, 'id');=0A= if (id) return id;=0A= do { id =3D 'anonymous_element_' + Element.idCounter++ } while = ($(id));=0A= Element.writeAttribute(element, 'id', id);=0A= return id;=0A= },=0A= =0A= readAttribute: function(element, name) {=0A= element =3D $(element);=0A= if (Prototype.Browser.IE) {=0A= var t =3D Element._attributeTranslations.read;=0A= if (t.values[name]) return t.values[name](element, name);=0A= if (t.names[name]) name =3D t.names[name];=0A= if (name.include(':')) {=0A= return (!element.attributes || !element.attributes[name]) ? null = :=0A= element.attributes[name].value;=0A= }=0A= }=0A= return element.getAttribute(name);=0A= },=0A= =0A= writeAttribute: function(element, name, value) {=0A= element =3D $(element);=0A= var attributes =3D { }, t =3D Element._attributeTranslations.write;=0A= =0A= if (typeof name =3D=3D 'object') attributes =3D name;=0A= else attributes[name] =3D Object.isUndefined(value) ? true : value;=0A= =0A= for (var attr in attributes) {=0A= name =3D t.names[attr] || attr;=0A= value =3D attributes[attr];=0A= if (t.values[attr]) name =3D t.values[attr](element, value);=0A= if (value =3D=3D=3D false || value =3D=3D=3D null)=0A= element.removeAttribute(name);=0A= else if (value =3D=3D=3D true)=0A= element.setAttribute(name, name);=0A= else element.setAttribute(name, value);=0A= }=0A= return element;=0A= },=0A= =0A= getHeight: function(element) {=0A= return Element.getDimensions(element).height;=0A= },=0A= =0A= getWidth: function(element) {=0A= return Element.getDimensions(element).width;=0A= },=0A= =0A= classNames: function(element) {=0A= return new Element.ClassNames(element);=0A= },=0A= =0A= hasClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= var elementClassName =3D element.className;=0A= return (elementClassName.length > 0 && (elementClassName =3D=3D = className ||=0A= new RegExp("(^|\\s)" + className + = "(\\s|$)").test(elementClassName)));=0A= },=0A= =0A= addClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= if (!Element.hasClassName(element, className))=0A= element.className +=3D (element.className ? ' ' : '') + className;=0A= return element;=0A= },=0A= =0A= removeClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= element.className =3D element.className.replace(=0A= new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();=0A= return element;=0A= },=0A= =0A= toggleClassName: function(element, className) {=0A= if (!(element =3D $(element))) return;=0A= return Element[Element.hasClassName(element, className) ?=0A= 'removeClassName' : 'addClassName'](element, className);=0A= },=0A= =0A= cleanWhitespace: function(element) {=0A= element =3D $(element);=0A= var node =3D element.firstChild;=0A= while (node) {=0A= var nextNode =3D node.nextSibling;=0A= if (node.nodeType =3D=3D 3 && !/\S/.test(node.nodeValue))=0A= element.removeChild(node);=0A= node =3D nextNode;=0A= }=0A= return element;=0A= },=0A= =0A= empty: function(element) {=0A= return $(element).innerHTML.blank();=0A= },=0A= =0A= descendantOf: function(element, ancestor) {=0A= element =3D $(element), ancestor =3D $(ancestor);=0A= =0A= if (element.compareDocumentPosition)=0A= return (element.compareDocumentPosition(ancestor) & 8) =3D=3D=3D 8;=0A= =0A= if (ancestor.contains)=0A= return ancestor.contains(element) && ancestor !=3D=3D element;=0A= =0A= while (element =3D element.parentNode)=0A= if (element =3D=3D ancestor) return true;=0A= =0A= return false;=0A= },=0A= =0A= scrollTo: function(element) {=0A= element =3D $(element);=0A= var pos =3D Element.cumulativeOffset(element);=0A= window.scrollTo(pos[0], pos[1]);=0A= return element;=0A= },=0A= =0A= getStyle: function(element, style) {=0A= element =3D $(element);=0A= style =3D style =3D=3D 'float' ? 'cssFloat' : style.camelize();=0A= var value =3D element.style[style];=0A= if (!value || value =3D=3D 'auto') {=0A= var css =3D document.defaultView.getComputedStyle(element, null);=0A= value =3D css ? css[style] : null;=0A= }=0A= if (style =3D=3D 'opacity') return value ? parseFloat(value) : 1.0;=0A= return value =3D=3D 'auto' ? null : value;=0A= },=0A= =0A= getOpacity: function(element) {=0A= return $(element).getStyle('opacity');=0A= },=0A= =0A= setStyle: function(element, styles) {=0A= element =3D $(element);=0A= var elementStyle =3D element.style, match;=0A= if (Object.isString(styles)) {=0A= element.style.cssText +=3D ';' + styles;=0A= return styles.include('opacity') ?=0A= element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : = element;=0A= }=0A= for (var property in styles)=0A= if (property =3D=3D 'opacity') = element.setOpacity(styles[property]);=0A= else=0A= elementStyle[(property =3D=3D 'float' || property =3D=3D = 'cssFloat') ?=0A= (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : = 'styleFloat') :=0A= property] =3D styles[property];=0A= =0A= return element;=0A= },=0A= =0A= setOpacity: function(element, value) {=0A= element =3D $(element);=0A= element.style.opacity =3D (value =3D=3D 1 || value =3D=3D=3D '') ? = '' :=0A= (value < 0.00001) ? 0 : value;=0A= return element;=0A= },=0A= =0A= makePositioned: function(element) {=0A= element =3D $(element);=0A= var pos =3D Element.getStyle(element, 'position');=0A= if (pos =3D=3D 'static' || !pos) {=0A= element._madePositioned =3D true;=0A= element.style.position =3D 'relative';=0A= if (Prototype.Browser.Opera) {=0A= element.style.top =3D 0;=0A= element.style.left =3D 0;=0A= }=0A= }=0A= return element;=0A= },=0A= =0A= undoPositioned: function(element) {=0A= element =3D $(element);=0A= if (element._madePositioned) {=0A= element._madePositioned =3D undefined;=0A= element.style.position =3D=0A= element.style.top =3D=0A= element.style.left =3D=0A= element.style.bottom =3D=0A= element.style.right =3D '';=0A= }=0A= return element;=0A= },=0A= =0A= makeClipping: function(element) {=0A= element =3D $(element);=0A= if (element._overflow) return element;=0A= element._overflow =3D Element.getStyle(element, 'overflow') || = 'auto';=0A= if (element._overflow !=3D=3D 'hidden')=0A= element.style.overflow =3D 'hidden';=0A= return element;=0A= },=0A= =0A= undoClipping: function(element) {=0A= element =3D $(element);=0A= if (!element._overflow) return element;=0A= element.style.overflow =3D element._overflow =3D=3D 'auto' ? '' : = element._overflow;=0A= element._overflow =3D null;=0A= return element;=0A= },=0A= =0A= cumulativeOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= if (element.parentNode) {=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= } while (element);=0A= }=0A= return Element._returnOffset(valueL, valueT);=0A= },=0A= =0A= positionedOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= if (element) {=0A= if (element.tagName.toUpperCase() =3D=3D 'BODY') break;=0A= var p =3D Element.getStyle(element, 'position');=0A= if (p !=3D=3D 'static') break;=0A= }=0A= } while (element);=0A= return Element._returnOffset(valueL, valueT);=0A= },=0A= =0A= absolutize: function(element) {=0A= element =3D $(element);=0A= if (Element.getStyle(element, 'position') =3D=3D 'absolute') return = element;=0A= =0A= var offsets =3D Element.positionedOffset(element),=0A= top =3D offsets[1],=0A= left =3D offsets[0],=0A= width =3D element.clientWidth,=0A= height =3D element.clientHeight;=0A= =0A= element._originalLeft =3D left - parseFloat(element.style.left || = 0);=0A= element._originalTop =3D top - parseFloat(element.style.top || = 0);=0A= element._originalWidth =3D element.style.width;=0A= element._originalHeight =3D element.style.height;=0A= =0A= element.style.position =3D 'absolute';=0A= element.style.top =3D top + 'px';=0A= element.style.left =3D left + 'px';=0A= element.style.width =3D width + 'px';=0A= element.style.height =3D height + 'px';=0A= return element;=0A= },=0A= =0A= relativize: function(element) {=0A= element =3D $(element);=0A= if (Element.getStyle(element, 'position') =3D=3D 'relative') return = element;=0A= =0A= element.style.position =3D 'relative';=0A= var top =3D parseFloat(element.style.top || 0) - = (element._originalTop || 0),=0A= left =3D parseFloat(element.style.left || 0) - = (element._originalLeft || 0);=0A= =0A= element.style.top =3D top + 'px';=0A= element.style.left =3D left + 'px';=0A= element.style.height =3D element._originalHeight;=0A= element.style.width =3D element._originalWidth;=0A= return element;=0A= },=0A= =0A= cumulativeScrollOffset: function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.scrollTop || 0;=0A= valueL +=3D element.scrollLeft || 0;=0A= element =3D element.parentNode;=0A= } while (element);=0A= return Element._returnOffset(valueL, valueT);=0A= },=0A= =0A= getOffsetParent: function(element) {=0A= if (element.offsetParent) return $(element.offsetParent);=0A= if (element =3D=3D document.body) return $(element);=0A= =0A= while ((element =3D element.parentNode) && element !=3D = document.body)=0A= if (Element.getStyle(element, 'position') !=3D 'static')=0A= return $(element);=0A= =0A= return $(document.body);=0A= },=0A= =0A= viewportOffset: function(forElement) {=0A= var valueT =3D 0,=0A= valueL =3D 0,=0A= element =3D forElement;=0A= =0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= =0A= if (element.offsetParent =3D=3D document.body &&=0A= Element.getStyle(element, 'position') =3D=3D 'absolute') break;=0A= =0A= } while (element =3D element.offsetParent);=0A= =0A= element =3D forElement;=0A= do {=0A= if (!Prototype.Browser.Opera || (element.tagName && = (element.tagName.toUpperCase() =3D=3D 'BODY'))) {=0A= valueT -=3D element.scrollTop || 0;=0A= valueL -=3D element.scrollLeft || 0;=0A= }=0A= } while (element =3D element.parentNode);=0A= =0A= return Element._returnOffset(valueL, valueT);=0A= },=0A= =0A= clonePosition: function(element, source) {=0A= var options =3D Object.extend({=0A= setLeft: true,=0A= setTop: true,=0A= setWidth: true,=0A= setHeight: true,=0A= offsetTop: 0,=0A= offsetLeft: 0=0A= }, arguments[2] || { });=0A= =0A= source =3D $(source);=0A= var p =3D Element.viewportOffset(source), delta =3D [0, 0], parent = =3D null;=0A= =0A= element =3D $(element);=0A= =0A= if (Element.getStyle(element, 'position') =3D=3D 'absolute') {=0A= parent =3D Element.getOffsetParent(element);=0A= delta =3D Element.viewportOffset(parent);=0A= }=0A= =0A= if (parent =3D=3D document.body) {=0A= delta[0] -=3D document.body.offsetLeft;=0A= delta[1] -=3D document.body.offsetTop;=0A= }=0A= =0A= if (options.setLeft) element.style.left =3D (p[0] - delta[0] + = options.offsetLeft) + 'px';=0A= if (options.setTop) element.style.top =3D (p[1] - delta[1] + = options.offsetTop) + 'px';=0A= if (options.setWidth) element.style.width =3D source.offsetWidth + = 'px';=0A= if (options.setHeight) element.style.height =3D source.offsetHeight = + 'px';=0A= return element;=0A= }=0A= };=0A= =0A= Object.extend(Element.Methods, {=0A= getElementsBySelector: Element.Methods.select,=0A= =0A= childElements: Element.Methods.immediateDescendants=0A= });=0A= =0A= Element._attributeTranslations =3D {=0A= write: {=0A= names: {=0A= className: 'class',=0A= htmlFor: 'for'=0A= },=0A= values: { }=0A= }=0A= };=0A= =0A= if (Prototype.Browser.Opera) {=0A= Element.Methods.getStyle =3D Element.Methods.getStyle.wrap(=0A= function(proceed, element, style) {=0A= switch (style) {=0A= case 'left': case 'top': case 'right': case 'bottom':=0A= if (proceed(element, 'position') =3D=3D=3D 'static') return = null;=0A= case 'height': case 'width':=0A= if (!Element.visible(element)) return null;=0A= =0A= var dim =3D parseInt(proceed(element, style), 10);=0A= =0A= if (dim !=3D=3D element['offset' + style.capitalize()])=0A= return dim + 'px';=0A= =0A= var properties;=0A= if (style =3D=3D=3D 'height') {=0A= properties =3D ['border-top-width', 'padding-top',=0A= 'padding-bottom', 'border-bottom-width'];=0A= }=0A= else {=0A= properties =3D ['border-left-width', 'padding-left',=0A= 'padding-right', 'border-right-width'];=0A= }=0A= return properties.inject(dim, function(memo, property) {=0A= var val =3D proceed(element, property);=0A= return val =3D=3D=3D null ? memo : memo - parseInt(val, 10);=0A= }) + 'px';=0A= default: return proceed(element, style);=0A= }=0A= }=0A= );=0A= =0A= Element.Methods.readAttribute =3D Element.Methods.readAttribute.wrap(=0A= function(proceed, element, attribute) {=0A= if (attribute =3D=3D=3D 'title') return element.title;=0A= return proceed(element, attribute);=0A= }=0A= );=0A= }=0A= =0A= else if (Prototype.Browser.IE) {=0A= Element.Methods.getOffsetParent =3D = Element.Methods.getOffsetParent.wrap(=0A= function(proceed, element) {=0A= element =3D $(element);=0A= if (!element.parentNode) return $(document.body);=0A= var position =3D element.getStyle('position');=0A= if (position !=3D=3D 'static') return proceed(element);=0A= element.setStyle({ position: 'relative' });=0A= var value =3D proceed(element);=0A= element.setStyle({ position: position });=0A= return value;=0A= }=0A= );=0A= =0A= $w('positionedOffset viewportOffset').each(function(method) {=0A= Element.Methods[method] =3D Element.Methods[method].wrap(=0A= function(proceed, element) {=0A= element =3D $(element);=0A= if (!element.parentNode) return Element._returnOffset(0, 0);=0A= var position =3D element.getStyle('position');=0A= if (position !=3D=3D 'static') return proceed(element);=0A= var offsetParent =3D element.getOffsetParent();=0A= if (offsetParent && offsetParent.getStyle('position') =3D=3D=3D = 'fixed')=0A= offsetParent.setStyle({ zoom: 1 });=0A= element.setStyle({ position: 'relative' });=0A= var value =3D proceed(element);=0A= element.setStyle({ position: position });=0A= return value;=0A= }=0A= );=0A= });=0A= =0A= Element.Methods.getStyle =3D function(element, style) {=0A= element =3D $(element);=0A= style =3D (style =3D=3D 'float' || style =3D=3D 'cssFloat') ? = 'styleFloat' : style.camelize();=0A= var value =3D element.style[style];=0A= if (!value && element.currentStyle) value =3D = element.currentStyle[style];=0A= =0A= if (style =3D=3D 'opacity') {=0A= if (value =3D (element.getStyle('filter') || = '').match(/alpha\(opacity=3D(.*)\)/))=0A= if (value[1]) return parseFloat(value[1]) / 100;=0A= return 1.0;=0A= }=0A= =0A= if (value =3D=3D 'auto') {=0A= if ((style =3D=3D 'width' || style =3D=3D 'height') && = (element.getStyle('display') !=3D 'none'))=0A= return element['offset' + style.capitalize()] + 'px';=0A= return null;=0A= }=0A= return value;=0A= };=0A= =0A= Element.Methods.setOpacity =3D function(element, value) {=0A= function stripAlpha(filter){=0A= return filter.replace(/alpha\([^\)]*\)/gi,'');=0A= }=0A= element =3D $(element);=0A= var currentStyle =3D element.currentStyle;=0A= if ((currentStyle && !currentStyle.hasLayout) ||=0A= (!currentStyle && element.style.zoom =3D=3D 'normal'))=0A= element.style.zoom =3D 1;=0A= =0A= var filter =3D element.getStyle('filter'), style =3D element.style;=0A= if (value =3D=3D 1 || value =3D=3D=3D '') {=0A= (filter =3D stripAlpha(filter)) ?=0A= style.filter =3D filter : style.removeAttribute('filter');=0A= return element;=0A= } else if (value < 0.00001) value =3D 0;=0A= style.filter =3D stripAlpha(filter) +=0A= 'alpha(opacity=3D' + (value * 100) + ')';=0A= return element;=0A= };=0A= =0A= Element._attributeTranslations =3D (function(){=0A= =0A= var classProp =3D 'className',=0A= forProp =3D 'for',=0A= el =3D document.createElement('div');=0A= =0A= el.setAttribute(classProp, 'x');=0A= =0A= if (el.className !=3D=3D 'x') {=0A= el.setAttribute('class', 'x');=0A= if (el.className =3D=3D=3D 'x') {=0A= classProp =3D 'class';=0A= }=0A= }=0A= el =3D null;=0A= =0A= el =3D document.createElement('label');=0A= el.setAttribute(forProp, 'x');=0A= if (el.htmlFor !=3D=3D 'x') {=0A= el.setAttribute('htmlFor', 'x');=0A= if (el.htmlFor =3D=3D=3D 'x') {=0A= forProp =3D 'htmlFor';=0A= }=0A= }=0A= el =3D null;=0A= =0A= return {=0A= read: {=0A= names: {=0A= 'class': classProp,=0A= 'className': classProp,=0A= 'for': forProp,=0A= 'htmlFor': forProp=0A= },=0A= values: {=0A= _getAttr: function(element, attribute) {=0A= return element.getAttribute(attribute);=0A= },=0A= _getAttr2: function(element, attribute) {=0A= return element.getAttribute(attribute, 2);=0A= },=0A= _getAttrNode: function(element, attribute) {=0A= var node =3D element.getAttributeNode(attribute);=0A= return node ? node.value : "";=0A= },=0A= _getEv: (function(){=0A= =0A= var el =3D document.createElement('div'), f;=0A= el.onclick =3D Prototype.emptyFunction;=0A= var value =3D el.getAttribute('onclick');=0A= =0A= if (String(value).indexOf('{') > -1) {=0A= f =3D function(element, attribute) {=0A= attribute =3D element.getAttribute(attribute);=0A= if (!attribute) return null;=0A= attribute =3D attribute.toString();=0A= attribute =3D attribute.split('{')[1];=0A= attribute =3D attribute.split('}')[0];=0A= return attribute.strip();=0A= };=0A= }=0A= else if (value =3D=3D=3D '') {=0A= f =3D function(element, attribute) {=0A= attribute =3D element.getAttribute(attribute);=0A= if (!attribute) return null;=0A= return attribute.strip();=0A= };=0A= }=0A= el =3D null;=0A= return f;=0A= })(),=0A= _flag: function(element, attribute) {=0A= return $(element).hasAttribute(attribute) ? attribute : null;=0A= },=0A= style: function(element) {=0A= return element.style.cssText.toLowerCase();=0A= },=0A= title: function(element) {=0A= return element.title;=0A= }=0A= }=0A= }=0A= }=0A= })();=0A= =0A= Element._attributeTranslations.write =3D {=0A= names: Object.extend({=0A= cellpadding: 'cellPadding',=0A= cellspacing: 'cellSpacing'=0A= }, Element._attributeTranslations.read.names),=0A= values: {=0A= checked: function(element, value) {=0A= element.checked =3D !!value;=0A= },=0A= =0A= style: function(element, value) {=0A= element.style.cssText =3D value ? value : '';=0A= }=0A= }=0A= };=0A= =0A= Element._attributeTranslations.has =3D {};=0A= =0A= $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +=0A= 'encType maxLength readOnly longDesc = frameBorder').each(function(attr) {=0A= Element._attributeTranslations.write.names[attr.toLowerCase()] =3D = attr;=0A= Element._attributeTranslations.has[attr.toLowerCase()] =3D attr;=0A= });=0A= =0A= (function(v) {=0A= Object.extend(v, {=0A= href: v._getAttr2,=0A= src: v._getAttr2,=0A= type: v._getAttr,=0A= action: v._getAttrNode,=0A= disabled: v._flag,=0A= checked: v._flag,=0A= readonly: v._flag,=0A= multiple: v._flag,=0A= onload: v._getEv,=0A= onunload: v._getEv,=0A= onclick: v._getEv,=0A= ondblclick: v._getEv,=0A= onmousedown: v._getEv,=0A= onmouseup: v._getEv,=0A= onmouseover: v._getEv,=0A= onmousemove: v._getEv,=0A= onmouseout: v._getEv,=0A= onfocus: v._getEv,=0A= onblur: v._getEv,=0A= onkeypress: v._getEv,=0A= onkeydown: v._getEv,=0A= onkeyup: v._getEv,=0A= onsubmit: v._getEv,=0A= onreset: v._getEv,=0A= onselect: v._getEv,=0A= onchange: v._getEv=0A= });=0A= })(Element._attributeTranslations.read.values);=0A= =0A= if (Prototype.BrowserFeatures.ElementExtensions) {=0A= (function() {=0A= function _descendants(element) {=0A= var nodes =3D element.getElementsByTagName('*'), results =3D [];=0A= for (var i =3D 0, node; node =3D nodes[i]; i++)=0A= if (node.tagName !=3D=3D "!") // Filter out comment nodes.=0A= results.push(node);=0A= return results;=0A= }=0A= =0A= Element.Methods.down =3D function(element, expression, index) {=0A= element =3D $(element);=0A= if (arguments.length =3D=3D 1) return element.firstDescendant();=0A= return Object.isNumber(expression) ? = _descendants(element)[expression] :=0A= Element.select(element, expression)[index || 0];=0A= }=0A= })();=0A= }=0A= =0A= }=0A= =0A= else if (Prototype.Browser.Gecko && = /rv:1\.8\.0/.test(navigator.userAgent)) {=0A= Element.Methods.setOpacity =3D function(element, value) {=0A= element =3D $(element);=0A= element.style.opacity =3D (value =3D=3D 1) ? 0.999999 :=0A= (value =3D=3D=3D '') ? '' : (value < 0.00001) ? 0 : value;=0A= return element;=0A= };=0A= }=0A= =0A= else if (Prototype.Browser.WebKit) {=0A= Element.Methods.setOpacity =3D function(element, value) {=0A= element =3D $(element);=0A= element.style.opacity =3D (value =3D=3D 1 || value =3D=3D=3D '') ? = '' :=0A= (value < 0.00001) ? 0 : value;=0A= =0A= if (value =3D=3D 1)=0A= if (element.tagName.toUpperCase() =3D=3D 'IMG' && element.width) {=0A= element.width++; element.width--;=0A= } else try {=0A= var n =3D document.createTextNode(' ');=0A= element.appendChild(n);=0A= element.removeChild(n);=0A= } catch (e) { }=0A= =0A= return element;=0A= };=0A= =0A= Element.Methods.cumulativeOffset =3D function(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= if (element.offsetParent =3D=3D document.body)=0A= if (Element.getStyle(element, 'position') =3D=3D 'absolute') = break;=0A= =0A= element =3D element.offsetParent;=0A= } while (element);=0A= =0A= return Element._returnOffset(valueL, valueT);=0A= };=0A= }=0A= =0A= if ('outerHTML' in document.documentElement) {=0A= Element.Methods.replace =3D function(element, content) {=0A= element =3D $(element);=0A= =0A= if (content && content.toElement) content =3D content.toElement();=0A= if (Object.isElement(content)) {=0A= element.parentNode.replaceChild(content, element);=0A= return element;=0A= }=0A= =0A= content =3D Object.toHTML(content);=0A= var parent =3D element.parentNode, tagName =3D = parent.tagName.toUpperCase();=0A= =0A= if (Element._insertionTranslations.tags[tagName]) {=0A= var nextSibling =3D element.next(),=0A= fragments =3D Element._getContentFromAnonymousElement(tagName, = content.stripScripts());=0A= parent.removeChild(element);=0A= if (nextSibling)=0A= fragments.each(function(node) { parent.insertBefore(node, = nextSibling) });=0A= else=0A= fragments.each(function(node) { parent.appendChild(node) });=0A= }=0A= else element.outerHTML =3D content.stripScripts();=0A= =0A= content.evalScripts.bind(content).defer();=0A= return element;=0A= };=0A= }=0A= =0A= Element._returnOffset =3D function(l, t) {=0A= var result =3D [l, t];=0A= result.left =3D l;=0A= result.top =3D t;=0A= return result;=0A= };=0A= =0A= Element._getContentFromAnonymousElement =3D function(tagName, html) {=0A= var div =3D new Element('div'),=0A= t =3D Element._insertionTranslations.tags[tagName];=0A= if (t) {=0A= div.innerHTML =3D t[0] + html + t[1];=0A= for (var i =3D t[2]; i--; ) {=0A= div =3D div.firstChild;=0A= }=0A= }=0A= else {=0A= div.innerHTML =3D html;=0A= }=0A= return $A(div.childNodes);=0A= };=0A= =0A= Element._insertionTranslations =3D {=0A= before: function(element, node) {=0A= element.parentNode.insertBefore(node, element);=0A= },=0A= top: function(element, node) {=0A= element.insertBefore(node, element.firstChild);=0A= },=0A= bottom: function(element, node) {=0A= element.appendChild(node);=0A= },=0A= after: function(element, node) {=0A= element.parentNode.insertBefore(node, element.nextSibling);=0A= },=0A= tags: {=0A= TABLE: ['<table>', '</table>', 1],=0A= TBODY: ['<table><tbody>', '</tbody></table>', 2],=0A= TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],=0A= TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],=0A= SELECT: ['<select>', '</select>', 1]=0A= }=0A= };=0A= =0A= (function() {=0A= var tags =3D Element._insertionTranslations.tags;=0A= Object.extend(tags, {=0A= THEAD: tags.TBODY,=0A= TFOOT: tags.TBODY,=0A= TH: tags.TD=0A= });=0A= })();=0A= =0A= Element.Methods.Simulated =3D {=0A= hasAttribute: function(element, attribute) {=0A= attribute =3D Element._attributeTranslations.has[attribute] || = attribute;=0A= var node =3D $(element).getAttributeNode(attribute);=0A= return !!(node && node.specified);=0A= }=0A= };=0A= =0A= Element.Methods.ByTag =3D { };=0A= =0A= Object.extend(Element, Element.Methods);=0A= =0A= (function(div) {=0A= =0A= if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {=0A= window.HTMLElement =3D { };=0A= window.HTMLElement.prototype =3D div['__proto__'];=0A= Prototype.BrowserFeatures.ElementExtensions =3D true;=0A= }=0A= =0A= div =3D null;=0A= =0A= })(document.createElement('div'));=0A= =0A= Element.extend =3D (function() {=0A= =0A= function checkDeficiency(tagName) {=0A= if (typeof window.Element !=3D 'undefined') {=0A= var proto =3D window.Element.prototype;=0A= if (proto) {=0A= var id =3D '_' + (Math.random()+'').slice(2),=0A= el =3D document.createElement(tagName);=0A= proto[id] =3D 'x';=0A= var isBuggy =3D (el[id] !=3D=3D 'x');=0A= delete proto[id];=0A= el =3D null;=0A= return isBuggy;=0A= }=0A= }=0A= return false;=0A= }=0A= =0A= function extendElementWith(element, methods) {=0A= for (var property in methods) {=0A= var value =3D methods[property];=0A= if (Object.isFunction(value) && !(property in element))=0A= element[property] =3D value.methodize();=0A= }=0A= }=0A= =0A= var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY =3D checkDeficiency('object');=0A= =0A= if (Prototype.BrowserFeatures.SpecificElementExtensions) {=0A= if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {=0A= return function(element) {=0A= if (element && typeof element._extendedByPrototype =3D=3D = 'undefined') {=0A= var t =3D element.tagName;=0A= if (t && (/^(?:object|applet|embed)$/i.test(t))) {=0A= extendElementWith(element, Element.Methods);=0A= extendElementWith(element, Element.Methods.Simulated);=0A= extendElementWith(element, = Element.Methods.ByTag[t.toUpperCase()]);=0A= }=0A= }=0A= return element;=0A= }=0A= }=0A= return Prototype.K;=0A= }=0A= =0A= var Methods =3D { }, ByTag =3D Element.Methods.ByTag;=0A= =0A= var extend =3D Object.extend(function(element) {=0A= if (!element || typeof element._extendedByPrototype !=3D 'undefined' = ||=0A= element.nodeType !=3D 1 || element =3D=3D window) return element;=0A= =0A= var methods =3D Object.clone(Methods),=0A= tagName =3D element.tagName.toUpperCase();=0A= =0A= if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);=0A= =0A= extendElementWith(element, methods);=0A= =0A= element._extendedByPrototype =3D Prototype.emptyFunction;=0A= return element;=0A= =0A= }, {=0A= refresh: function() {=0A= if (!Prototype.BrowserFeatures.ElementExtensions) {=0A= Object.extend(Methods, Element.Methods);=0A= Object.extend(Methods, Element.Methods.Simulated);=0A= }=0A= }=0A= });=0A= =0A= extend.refresh();=0A= return extend;=0A= })();=0A= =0A= if (document.documentElement.hasAttribute) {=0A= Element.hasAttribute =3D function(element, attribute) {=0A= return element.hasAttribute(attribute);=0A= };=0A= }=0A= else {=0A= Element.hasAttribute =3D Element.Methods.Simulated.hasAttribute;=0A= }=0A= =0A= Element.addMethods =3D function(methods) {=0A= var F =3D Prototype.BrowserFeatures, T =3D Element.Methods.ByTag;=0A= =0A= if (!methods) {=0A= Object.extend(Form, Form.Methods);=0A= Object.extend(Form.Element, Form.Element.Methods);=0A= Object.extend(Element.Methods.ByTag, {=0A= "FORM": Object.clone(Form.Methods),=0A= "INPUT": Object.clone(Form.Element.Methods),=0A= "SELECT": Object.clone(Form.Element.Methods),=0A= "TEXTAREA": Object.clone(Form.Element.Methods)=0A= });=0A= }=0A= =0A= if (arguments.length =3D=3D 2) {=0A= var tagName =3D methods;=0A= methods =3D arguments[1];=0A= }=0A= =0A= if (!tagName) Object.extend(Element.Methods, methods || { });=0A= else {=0A= if (Object.isArray(tagName)) tagName.each(extend);=0A= else extend(tagName);=0A= }=0A= =0A= function extend(tagName) {=0A= tagName =3D tagName.toUpperCase();=0A= if (!Element.Methods.ByTag[tagName])=0A= Element.Methods.ByTag[tagName] =3D { };=0A= Object.extend(Element.Methods.ByTag[tagName], methods);=0A= }=0A= =0A= function copy(methods, destination, onlyIfAbsent) {=0A= onlyIfAbsent =3D onlyIfAbsent || false;=0A= for (var property in methods) {=0A= var value =3D methods[property];=0A= if (!Object.isFunction(value)) continue;=0A= if (!onlyIfAbsent || !(property in destination))=0A= destination[property] =3D value.methodize();=0A= }=0A= }=0A= =0A= function findDOMClass(tagName) {=0A= var klass;=0A= var trans =3D {=0A= "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",=0A= "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": = "DList",=0A= "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": = "Heading",=0A= "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",=0A= "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", = "CAPTION":=0A= "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":=0A= "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", = "TR":=0A= "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":=0A= "FrameSet", "IFRAME": "IFrame"=0A= };=0A= if (trans[tagName]) klass =3D 'HTML' + trans[tagName] + 'Element';=0A= if (window[klass]) return window[klass];=0A= klass =3D 'HTML' + tagName + 'Element';=0A= if (window[klass]) return window[klass];=0A= klass =3D 'HTML' + tagName.capitalize() + 'Element';=0A= if (window[klass]) return window[klass];=0A= =0A= var element =3D document.createElement(tagName),=0A= proto =3D element['__proto__'] || element.constructor.prototype;=0A= =0A= element =3D null;=0A= return proto;=0A= }=0A= =0A= var elementPrototype =3D window.HTMLElement ? HTMLElement.prototype :=0A= Element.prototype;=0A= =0A= if (F.ElementExtensions) {=0A= copy(Element.Methods, elementPrototype);=0A= copy(Element.Methods.Simulated, elementPrototype, true);=0A= }=0A= =0A= if (F.SpecificElementExtensions) {=0A= for (var tag in Element.Methods.ByTag) {=0A= var klass =3D findDOMClass(tag);=0A= if (Object.isUndefined(klass)) continue;=0A= copy(T[tag], klass.prototype);=0A= }=0A= }=0A= =0A= Object.extend(Element, Element.Methods);=0A= delete Element.ByTag;=0A= =0A= if (Element.extend.refresh) Element.extend.refresh();=0A= Element.cache =3D { };=0A= };=0A= =0A= =0A= document.viewport =3D {=0A= =0A= getDimensions: function() {=0A= return { width: this.getWidth(), height: this.getHeight() };=0A= },=0A= =0A= getScrollOffsets: function() {=0A= return Element._returnOffset(=0A= window.pageXOffset || document.documentElement.scrollLeft || = document.body.scrollLeft,=0A= window.pageYOffset || document.documentElement.scrollTop || = document.body.scrollTop);=0A= }=0A= };=0A= =0A= (function(viewport) {=0A= var B =3D Prototype.Browser, doc =3D document, element, property =3D = {};=0A= =0A= function getRootElement() {=0A= if (B.WebKit && !doc.evaluate)=0A= return document;=0A= =0A= if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)=0A= return document.body;=0A= =0A= return document.documentElement;=0A= }=0A= =0A= function define(D) {=0A= if (!element) element =3D getRootElement();=0A= =0A= property[D] =3D 'client' + D;=0A= =0A= viewport['get' + D] =3D function() { return element[property[D]] };=0A= return viewport['get' + D]();=0A= }=0A= =0A= viewport.getWidth =3D define.curry('Width');=0A= =0A= viewport.getHeight =3D define.curry('Height');=0A= })(document.viewport);=0A= =0A= =0A= Element.Storage =3D {=0A= UID: 1=0A= };=0A= =0A= Element.addMethods({=0A= getStorage: function(element) {=0A= if (!(element =3D $(element))) return;=0A= =0A= var uid;=0A= if (element =3D=3D=3D window) {=0A= uid =3D 0;=0A= } else {=0A= if (typeof element._prototypeUID =3D=3D=3D "undefined")=0A= element._prototypeUID =3D Element.Storage.UID++;=0A= uid =3D element._prototypeUID;=0A= }=0A= =0A= if (!Element.Storage[uid])=0A= Element.Storage[uid] =3D $H();=0A= =0A= return Element.Storage[uid];=0A= },=0A= =0A= store: function(element, key, value) {=0A= if (!(element =3D $(element))) return;=0A= =0A= if (arguments.length =3D=3D=3D 2) {=0A= Element.getStorage(element).update(key);=0A= } else {=0A= Element.getStorage(element).set(key, value);=0A= }=0A= =0A= return element;=0A= },=0A= =0A= retrieve: function(element, key, defaultValue) {=0A= if (!(element =3D $(element))) return;=0A= var hash =3D Element.getStorage(element), value =3D hash.get(key);=0A= =0A= if (Object.isUndefined(value)) {=0A= hash.set(key, defaultValue);=0A= value =3D defaultValue;=0A= }=0A= =0A= return value;=0A= },=0A= =0A= clone: function(element, deep) {=0A= if (!(element =3D $(element))) return;=0A= var clone =3D element.cloneNode(deep);=0A= clone._prototypeUID =3D void 0;=0A= if (deep) {=0A= var descendants =3D Element.select(clone, '*'),=0A= i =3D descendants.length;=0A= while (i--) {=0A= descendants[i]._prototypeUID =3D void 0;=0A= }=0A= }=0A= return Element.extend(clone);=0A= },=0A= =0A= purge: function(element) {=0A= if (!(element =3D $(element))) return;=0A= purgeElement(element);=0A= =0A= var descendants =3D element.getElementsByTagName('*'),=0A= i =3D descendants.length;=0A= =0A= while (i--) purgeElement(descendants[i]);=0A= =0A= return null;=0A= }=0A= });=0A= =0A= (function() {=0A= =0A= function toDecimal(pctString) {=0A= var match =3D pctString.match(/^(\d+)%?$/i);=0A= if (!match) return null;=0A= return (Number(match[1]) / 100);=0A= }=0A= =0A= function getPixelValue(value, property) {=0A= if (Object.isElement(value)) {=0A= element =3D value;=0A= value =3D element.getStyle(property);=0A= }=0A= if (value =3D=3D=3D null) {=0A= return null;=0A= }=0A= =0A= if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {=0A= return window.parseFloat(value);=0A= }=0A= =0A= if (/\d/.test(value) && element.runtimeStyle) {=0A= var style =3D element.style.left, rStyle =3D = element.runtimeStyle.left;=0A= element.runtimeStyle.left =3D element.currentStyle.left;=0A= element.style.left =3D value || 0;=0A= value =3D element.style.pixelLeft;=0A= element.style.left =3D style;=0A= element.runtimeStyle.left =3D rStyle;=0A= =0A= return value;=0A= }=0A= =0A= if (value.include('%')) {=0A= var decimal =3D toDecimal(value);=0A= var whole;=0A= if (property.include('left') || property.include('right') ||=0A= property.include('width')) {=0A= whole =3D $(element.parentNode).measure('width');=0A= } else if (property.include('top') || property.include('bottom') ||=0A= property.include('height')) {=0A= whole =3D $(element.parentNode).measure('height');=0A= }=0A= =0A= return whole * decimal;=0A= }=0A= =0A= return 0;=0A= }=0A= =0A= function toCSSPixels(number) {=0A= if (Object.isString(number) && number.endsWith('px')) {=0A= return number;=0A= }=0A= return number + 'px';=0A= }=0A= =0A= function isDisplayed(element) {=0A= var originalElement =3D element;=0A= while (element && element.parentNode) {=0A= var display =3D element.getStyle('display');=0A= if (display =3D=3D=3D 'none') {=0A= return false;=0A= }=0A= element =3D $(element.parentNode);=0A= }=0A= return true;=0A= }=0A= =0A= var hasLayout =3D Prototype.K;=0A= if ('currentStyle' in document.documentElement) {=0A= hasLayout =3D function(element) {=0A= if (!element.currentStyle.hasLayout) {=0A= element.style.zoom =3D 1;=0A= }=0A= return element;=0A= };=0A= }=0A= =0A= function cssNameFor(key) {=0A= if (key.include('border')) key =3D key + '-width';=0A= return key.camelize();=0A= }=0A= =0A= Element.Layout =3D Class.create(Hash, {=0A= initialize: function($super, element, preCompute) {=0A= $super();=0A= this.element =3D $(element);=0A= =0A= Element.Layout.PROPERTIES.each( function(property) {=0A= this._set(property, null);=0A= }, this);=0A= =0A= if (preCompute) {=0A= this._preComputing =3D true;=0A= this._begin();=0A= Element.Layout.PROPERTIES.each( this._compute, this );=0A= this._end();=0A= this._preComputing =3D false;=0A= }=0A= },=0A= =0A= _set: function(property, value) {=0A= return Hash.prototype.set.call(this, property, value);=0A= },=0A= =0A= set: function(property, value) {=0A= throw "Properties of Element.Layout are read-only.";=0A= },=0A= =0A= get: function($super, property) {=0A= var value =3D $super(property);=0A= return value =3D=3D=3D null ? this._compute(property) : value;=0A= },=0A= =0A= _begin: function() {=0A= if (this._prepared) return;=0A= =0A= var element =3D this.element;=0A= if (isDisplayed(element)) {=0A= this._prepared =3D true;=0A= return;=0A= }=0A= =0A= var originalStyles =3D {=0A= position: element.style.position || '',=0A= width: element.style.width || '',=0A= visibility: element.style.visibility || '',=0A= display: element.style.display || ''=0A= };=0A= =0A= element.store('prototype_original_styles', originalStyles);=0A= =0A= var position =3D element.getStyle('position'),=0A= width =3D element.getStyle('width');=0A= =0A= element.setStyle({=0A= position: 'absolute',=0A= visibility: 'hidden',=0A= display: 'block'=0A= });=0A= =0A= var positionedWidth =3D element.getStyle('width');=0A= =0A= var newWidth;=0A= if (width && (positionedWidth =3D=3D=3D width)) {=0A= newWidth =3D getPixelValue(width);=0A= } else if (width && (position =3D=3D=3D 'absolute' || position = =3D=3D=3D 'fixed')) {=0A= newWidth =3D getPixelValue(width);=0A= } else {=0A= var parent =3D element.parentNode, pLayout =3D = $(parent).getLayout();=0A= =0A= newWidth =3D pLayout.get('width') -=0A= this.get('margin-left') -=0A= this.get('border-left') -=0A= this.get('padding-left') -=0A= this.get('padding-right') -=0A= this.get('border-right') -=0A= this.get('margin-right');=0A= }=0A= =0A= element.setStyle({ width: newWidth + 'px' });=0A= =0A= this._prepared =3D true;=0A= },=0A= =0A= _end: function() {=0A= var element =3D this.element;=0A= var originalStyles =3D = element.retrieve('prototype_original_styles');=0A= element.store('prototype_original_styles', null);=0A= element.setStyle(originalStyles);=0A= this._prepared =3D false;=0A= },=0A= =0A= _compute: function(property) {=0A= var COMPUTATIONS =3D Element.Layout.COMPUTATIONS;=0A= if (!(property in COMPUTATIONS)) {=0A= throw "Property not found.";=0A= }=0A= return this._set(property, COMPUTATIONS[property].call(this, = this.element));=0A= },=0A= =0A= toObject: function() {=0A= var args =3D $A(arguments);=0A= var keys =3D (args.length =3D=3D=3D 0) ? Element.Layout.PROPERTIES = :=0A= args.join(' ').split(' ');=0A= var obj =3D {};=0A= keys.each( function(key) {=0A= if (!Element.Layout.PROPERTIES.include(key)) return;=0A= var value =3D this.get(key);=0A= if (value !=3D null) obj[key] =3D value;=0A= }, this);=0A= return obj;=0A= },=0A= =0A= toHash: function() {=0A= var obj =3D this.toObject.apply(this, arguments);=0A= return new Hash(obj);=0A= },=0A= =0A= toCSS: function() {=0A= var args =3D $A(arguments);=0A= var keys =3D (args.length =3D=3D=3D 0) ? Element.Layout.PROPERTIES = :=0A= args.join(' ').split(' ');=0A= var css =3D {};=0A= =0A= keys.each( function(key) {=0A= if (!Element.Layout.PROPERTIES.include(key)) return;=0A= if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;=0A= =0A= var value =3D this.get(key);=0A= if (value !=3D null) css[cssNameFor(key)] =3D value + 'px';=0A= }, this);=0A= return css;=0A= },=0A= =0A= inspect: function() {=0A= return "#<Element.Layout>";=0A= }=0A= });=0A= =0A= Object.extend(Element.Layout, {=0A= PROPERTIES: $w('height width top left right bottom border-left = border-right border-top border-bottom padding-left padding-right = padding-top padding-bottom margin-top margin-bottom margin-left = margin-right padding-box-width padding-box-height border-box-width = border-box-height margin-box-width margin-box-height'),=0A= =0A= COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height = margin-box-width margin-box-height border-box-width border-box-height'),=0A= =0A= COMPUTATIONS: {=0A= 'height': function(element) {=0A= if (!this._preComputing) this._begin();=0A= =0A= var bHeight =3D this.get('border-box-height');=0A= if (bHeight <=3D 0) return 0;=0A= =0A= var bTop =3D this.get('border-top'),=0A= bBottom =3D this.get('border-bottom');=0A= =0A= var pTop =3D this.get('padding-top'),=0A= pBottom =3D this.get('padding-bottom');=0A= =0A= if (!this._preComputing) this._end();=0A= =0A= return bHeight - bTop - bBottom - pTop - pBottom;=0A= },=0A= =0A= 'width': function(element) {=0A= if (!this._preComputing) this._begin();=0A= =0A= var bWidth =3D this.get('border-box-width');=0A= if (bWidth <=3D 0) return 0;=0A= =0A= var bLeft =3D this.get('border-left'),=0A= bRight =3D this.get('border-right');=0A= =0A= var pLeft =3D this.get('padding-left'),=0A= pRight =3D this.get('padding-right');=0A= =0A= if (!this._preComputing) this._end();=0A= =0A= return bWidth - bLeft - bRight - pLeft - pRight;=0A= },=0A= =0A= 'padding-box-height': function(element) {=0A= var height =3D this.get('height'),=0A= pTop =3D this.get('padding-top'),=0A= pBottom =3D this.get('padding-bottom');=0A= =0A= return height + pTop + pBottom;=0A= },=0A= =0A= 'padding-box-width': function(element) {=0A= var width =3D this.get('width'),=0A= pLeft =3D this.get('padding-left'),=0A= pRight =3D this.get('padding-right');=0A= =0A= return width + pLeft + pRight;=0A= },=0A= =0A= 'border-box-height': function(element) {=0A= return element.offsetHeight;=0A= },=0A= =0A= 'border-box-width': function(element) {=0A= return element.offsetWidth;=0A= },=0A= =0A= 'margin-box-height': function(element) {=0A= var bHeight =3D this.get('border-box-height'),=0A= mTop =3D this.get('margin-top'),=0A= mBottom =3D this.get('margin-bottom');=0A= =0A= if (bHeight <=3D 0) return 0;=0A= =0A= return bHeight + mTop + mBottom;=0A= },=0A= =0A= 'margin-box-width': function(element) {=0A= var bWidth =3D this.get('border-box-width'),=0A= mLeft =3D this.get('margin-left'),=0A= mRight =3D this.get('margin-right');=0A= =0A= if (bWidth <=3D 0) return 0;=0A= =0A= return bWidth + mLeft + mRight;=0A= },=0A= =0A= 'top': function(element) {=0A= var offset =3D element.positionedOffset();=0A= return offset.top;=0A= },=0A= =0A= 'bottom': function(element) {=0A= var offset =3D element.positionedOffset(),=0A= parent =3D element.getOffsetParent(),=0A= pHeight =3D parent.measure('height');=0A= =0A= var mHeight =3D this.get('border-box-height');=0A= =0A= return pHeight - mHeight - offset.top;=0A= },=0A= =0A= 'left': function(element) {=0A= var offset =3D element.positionedOffset();=0A= return offset.left;=0A= },=0A= =0A= 'right': function(element) {=0A= var offset =3D element.positionedOffset(),=0A= parent =3D element.getOffsetParent(),=0A= pWidth =3D parent.measure('width');=0A= =0A= var mWidth =3D this.get('border-box-width');=0A= =0A= return pWidth - mWidth - offset.left;=0A= },=0A= =0A= 'padding-top': function(element) {=0A= return getPixelValue(element, 'paddingTop');=0A= },=0A= =0A= 'padding-bottom': function(element) {=0A= return getPixelValue(element, 'paddingBottom');=0A= },=0A= =0A= 'padding-left': function(element) {=0A= return getPixelValue(element, 'paddingLeft');=0A= },=0A= =0A= 'padding-right': function(element) {=0A= return getPixelValue(element, 'paddingRight');=0A= },=0A= =0A= 'border-top': function(element) {=0A= return Object.isNumber(element.clientTop) ? element.clientTop :=0A= getPixelValue(element, 'borderTopWidth');=0A= },=0A= =0A= 'border-bottom': function(element) {=0A= return Object.isNumber(element.clientBottom) ? = element.clientBottom :=0A= getPixelValue(element, 'borderBottomWidth');=0A= },=0A= =0A= 'border-left': function(element) {=0A= return Object.isNumber(element.clientLeft) ? element.clientLeft :=0A= getPixelValue(element, 'borderLeftWidth');=0A= },=0A= =0A= 'border-right': function(element) {=0A= return Object.isNumber(element.clientRight) ? = element.clientRight :=0A= getPixelValue(element, 'borderRightWidth');=0A= },=0A= =0A= 'margin-top': function(element) {=0A= return getPixelValue(element, 'marginTop');=0A= },=0A= =0A= 'margin-bottom': function(element) {=0A= return getPixelValue(element, 'marginBottom');=0A= },=0A= =0A= 'margin-left': function(element) {=0A= return getPixelValue(element, 'marginLeft');=0A= },=0A= =0A= 'margin-right': function(element) {=0A= return getPixelValue(element, 'marginRight');=0A= }=0A= }=0A= });=0A= =0A= if ('getBoundingClientRect' in document.documentElement) {=0A= Object.extend(Element.Layout.COMPUTATIONS, {=0A= 'right': function(element) {=0A= var parent =3D hasLayout(element.getOffsetParent());=0A= var rect =3D element.getBoundingClientRect(),=0A= pRect =3D parent.getBoundingClientRect();=0A= =0A= return (pRect.right - rect.right).round();=0A= },=0A= =0A= 'bottom': function(element) {=0A= var parent =3D hasLayout(element.getOffsetParent());=0A= var rect =3D element.getBoundingClientRect(),=0A= pRect =3D parent.getBoundingClientRect();=0A= =0A= return (pRect.bottom - rect.bottom).round();=0A= }=0A= });=0A= }=0A= =0A= Element.Offset =3D Class.create({=0A= initialize: function(left, top) {=0A= this.left =3D left.round();=0A= this.top =3D top.round();=0A= =0A= this[0] =3D this.left;=0A= this[1] =3D this.top;=0A= },=0A= =0A= relativeTo: function(offset) {=0A= return new Element.Offset(=0A= this.left - offset.left,=0A= this.top - offset.top=0A= );=0A= },=0A= =0A= inspect: function() {=0A= return "#<Element.Offset left: #{left} top: = #{top}>".interpolate(this);=0A= },=0A= =0A= toString: function() {=0A= return "[#{left}, #{top}]".interpolate(this);=0A= },=0A= =0A= toArray: function() {=0A= return [this.left, this.top];=0A= }=0A= });=0A= =0A= function getLayout(element, preCompute) {=0A= return new Element.Layout(element, preCompute);=0A= }=0A= =0A= function measure(element, property) {=0A= return $(element).getLayout().get(property);=0A= }=0A= =0A= function getDimensions(element) {=0A= var layout =3D $(element).getLayout();=0A= return {=0A= width: layout.get('width'),=0A= height: layout.get('height')=0A= };=0A= }=0A= =0A= function getOffsetParent(element) {=0A= if (isDetached(element)) return $(document.body);=0A= =0A= var isInline =3D (Element.getStyle(element, 'display') =3D=3D=3D = 'inline');=0A= if (!isInline && element.offsetParent) return = $(element.offsetParent);=0A= if (element =3D=3D=3D document.body) return $(element);=0A= =0A= while ((element =3D element.parentNode) && element !=3D=3D = document.body) {=0A= if (Element.getStyle(element, 'position') !=3D=3D 'static') {=0A= return (element.nodeName =3D=3D=3D 'HTML') ? $(document.body) : = $(element);=0A= }=0A= }=0A= =0A= return $(document.body);=0A= }=0A= =0A= =0A= function cumulativeOffset(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= } while (element);=0A= return new Element.Offset(valueL, valueT);=0A= }=0A= =0A= function positionedOffset(element) {=0A= var layout =3D element.getLayout();=0A= =0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= element =3D element.offsetParent;=0A= if (element) {=0A= if (isBody(element)) break;=0A= var p =3D Element.getStyle(element, 'position');=0A= if (p !=3D=3D 'static') break;=0A= }=0A= } while (element);=0A= =0A= valueL -=3D layout.get('margin-top');=0A= valueT -=3D layout.get('margin-left');=0A= =0A= return new Element.Offset(valueL, valueT);=0A= }=0A= =0A= function cumulativeScrollOffset(element) {=0A= var valueT =3D 0, valueL =3D 0;=0A= do {=0A= valueT +=3D element.scrollTop || 0;=0A= valueL +=3D element.scrollLeft || 0;=0A= element =3D element.parentNode;=0A= } while (element);=0A= return new Element.Offset(valueL, valueT);=0A= }=0A= =0A= function viewportOffset(forElement) {=0A= var valueT =3D 0, valueL =3D 0, docBody =3D document.body;=0A= =0A= var element =3D forElement;=0A= do {=0A= valueT +=3D element.offsetTop || 0;=0A= valueL +=3D element.offsetLeft || 0;=0A= if (element.offsetParent =3D=3D docBody &&=0A= Element.getStyle(element, 'position') =3D=3D 'absolute') break;=0A= } while (element =3D element.offsetParent);=0A= =0A= element =3D forElement;=0A= do {=0A= if (element !=3D docBody) {=0A= valueT -=3D element.scrollTop || 0;=0A= valueL -=3D element.scrollLeft || 0;=0A= }=0A= } while (element =3D element.parentNode);=0A= return new Element.Offset(valueL, valueT);=0A= }=0A= =0A= function absolutize(element) {=0A= element =3D $(element);=0A= =0A= if (Element.getStyle(element, 'position') =3D=3D=3D 'absolute') {=0A= return element;=0A= }=0A= =0A= var offsetParent =3D getOffsetParent(element);=0A= var eOffset =3D element.viewportOffset(),=0A= pOffset =3D offsetParent.viewportOffset();=0A= =0A= var offset =3D eOffset.relativeTo(pOffset);=0A= var layout =3D element.getLayout();=0A= =0A= element.store('prototype_absolutize_original_styles', {=0A= left: element.getStyle('left'),=0A= top: element.getStyle('top'),=0A= width: element.getStyle('width'),=0A= height: element.getStyle('height')=0A= });=0A= =0A= element.setStyle({=0A= position: 'absolute',=0A= top: offset.top + 'px',=0A= left: offset.left + 'px',=0A= width: layout.get('width') + 'px',=0A= height: layout.get('height') + 'px'=0A= });=0A= =0A= return element;=0A= }=0A= =0A= function relativize(element) {=0A= element =3D $(element);=0A= if (Element.getStyle(element, 'position') =3D=3D=3D 'relative') {=0A= return element;=0A= }=0A= =0A= var originalStyles =3D=0A= element.retrieve('prototype_absolutize_original_styles');=0A= =0A= if (originalStyles) element.setStyle(originalStyles);=0A= return element;=0A= }=0A= =0A= Element.addMethods({=0A= getLayout: getLayout,=0A= measure: measure,=0A= getDimensions: getDimensions,=0A= getOffsetParent: getOffsetParent,=0A= cumulativeOffset: cumulativeOffset,=0A= positionedOffset: positionedOffset,=0A= cumulativeScrollOffset: cumulativeScrollOffset,=0A= viewportOffset: viewportOffset,=0A= absolutize: absolutize,=0A= relativize: relativize=0A= });=0A= =0A= function isBody(element) {=0A= return element.nodeName.toUpperCase() =3D=3D=3D 'BODY';=0A= }=0A= =0A= function isDetached(element) {=0A= return element !=3D=3D document.body &&=0A= !Element.descendantOf(element, document.body);=0A= }=0A= =0A= if ('getBoundingClientRect' in document.documentElement) {=0A= Element.addMethods({=0A= viewportOffset: function(element) {=0A= element =3D $(element);=0A= if (isDetached(element)) return new Element.Offset(0, 0);=0A= =0A= var rect =3D element.getBoundingClientRect(),=0A= docEl =3D document.documentElement;=0A= return new Element.Offset(rect.left - docEl.clientLeft,=0A= rect.top - docEl.clientTop);=0A= },=0A= =0A= positionedOffset: function(element) {=0A= element =3D $(element);=0A= var parent =3D element.getOffsetParent();=0A= if (isDetached(element)) return new Element.Offset(0, 0);=0A= =0A= if (element.offsetParent &&=0A= element.offsetParent.nodeName.toUpperCase() =3D=3D=3D 'HTML') {=0A= return positionedOffset(element);=0A= }=0A= =0A= var eOffset =3D element.viewportOffset(),=0A= pOffset =3D isBody(parent) ? viewportOffset(parent) :=0A= parent.viewportOffset();=0A= var retOffset =3D eOffset.relativeTo(pOffset);=0A= =0A= var layout =3D element.getLayout();=0A= var top =3D retOffset.top - layout.get('margin-top');=0A= var left =3D retOffset.left - layout.get('margin-left');=0A= =0A= return new Element.Offset(left, top);=0A= }=0A= });=0A= }=0A= })();=0A= window.$$ =3D function() {=0A= var expression =3D $A(arguments).join(', ');=0A= return Prototype.Selector.select(expression, document);=0A= };=0A= =0A= Prototype.Selector =3D (function() {=0A= =0A= function select() {=0A= throw new Error('Method "Prototype.Selector.select" must be = defined.');=0A= }=0A= =0A= function match() {=0A= throw new Error('Method "Prototype.Selector.match" must be = defined.');=0A= }=0A= =0A= function find(elements, expression, index) {=0A= index =3D index || 0;=0A= var match =3D Prototype.Selector.match, length =3D elements.length, = matchIndex =3D 0, i;=0A= =0A= for (i =3D 0; i < length; i++) {=0A= if (match(elements[i], expression) && index =3D=3D matchIndex++) {=0A= return Element.extend(elements[i]);=0A= }=0A= }=0A= }=0A= =0A= function extendElements(elements) {=0A= for (var i =3D 0, length =3D elements.length; i < length; i++) {=0A= Element.extend(elements[i]);=0A= }=0A= return elements;=0A= }=0A= =0A= =0A= var K =3D Prototype.K;=0A= =0A= return {=0A= select: select,=0A= match: match,=0A= find: find,=0A= extendElements: (Element.extend =3D=3D=3D K) ? K : extendElements,=0A= extendElement: Element.extend=0A= };=0A= })();=0A= Prototype._original_property =3D window.Sizzle;=0A= /*!=0A= * Sizzle CSS Selector Engine - v1.0=0A= * Copyright 2009, The Dojo Foundation=0A= * Released under the MIT, BSD, and GPL Licenses.=0A= * More information: http://sizzlejs.com/=0A= */=0A= (function(){=0A= =0A= var chunker =3D = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+= )+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,=0A= done =3D 0,=0A= toString =3D Object.prototype.toString,=0A= hasDuplicate =3D false,=0A= baseHasDuplicate =3D true;=0A= =0A= [0, 0].sort(function(){=0A= baseHasDuplicate =3D false;=0A= return 0;=0A= });=0A= =0A= var Sizzle =3D function(selector, context, results, seed) {=0A= results =3D results || [];=0A= var origContext =3D context =3D context || document;=0A= =0A= if ( context.nodeType !=3D=3D 1 && context.nodeType !=3D=3D 9 ) {=0A= return [];=0A= }=0A= =0A= if ( !selector || typeof selector !=3D=3D "string" ) {=0A= return results;=0A= }=0A= =0A= var parts =3D [], m, set, checkSet, check, mode, extra, prune =3D true, = contextXML =3D isXML(context),=0A= soFar =3D selector;=0A= =0A= while ( (chunker.exec(""), m =3D chunker.exec(soFar)) !=3D=3D null ) {=0A= soFar =3D m[3];=0A= =0A= parts.push( m[1] );=0A= =0A= if ( m[2] ) {=0A= extra =3D m[3];=0A= break;=0A= }=0A= }=0A= =0A= if ( parts.length > 1 && origPOS.exec( selector ) ) {=0A= if ( parts.length =3D=3D=3D 2 && Expr.relative[ parts[0] ] ) {=0A= set =3D posProcess( parts[0] + parts[1], context );=0A= } else {=0A= set =3D Expr.relative[ parts[0] ] ?=0A= [ context ] :=0A= Sizzle( parts.shift(), context );=0A= =0A= while ( parts.length ) {=0A= selector =3D parts.shift();=0A= =0A= if ( Expr.relative[ selector ] )=0A= selector +=3D parts.shift();=0A= =0A= set =3D posProcess( selector, set );=0A= }=0A= }=0A= } else {=0A= if ( !seed && parts.length > 1 && context.nodeType =3D=3D=3D 9 && = !contextXML &&=0A= Expr.match.ID.test(parts[0]) && = !Expr.match.ID.test(parts[parts.length - 1]) ) {=0A= var ret =3D Sizzle.find( parts.shift(), context, contextXML );=0A= context =3D ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : = ret.set[0];=0A= }=0A= =0A= if ( context ) {=0A= var ret =3D seed ?=0A= { expr: parts.pop(), set: makeArray(seed) } :=0A= Sizzle.find( parts.pop(), parts.length =3D=3D=3D 1 && (parts[0] = =3D=3D=3D "~" || parts[0] =3D=3D=3D "+") && context.parentNode ? = context.parentNode : context, contextXML );=0A= set =3D ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;=0A= =0A= if ( parts.length > 0 ) {=0A= checkSet =3D makeArray(set);=0A= } else {=0A= prune =3D false;=0A= }=0A= =0A= while ( parts.length ) {=0A= var cur =3D parts.pop(), pop =3D cur;=0A= =0A= if ( !Expr.relative[ cur ] ) {=0A= cur =3D "";=0A= } else {=0A= pop =3D parts.pop();=0A= }=0A= =0A= if ( pop =3D=3D null ) {=0A= pop =3D context;=0A= }=0A= =0A= Expr.relative[ cur ]( checkSet, pop, contextXML );=0A= }=0A= } else {=0A= checkSet =3D parts =3D [];=0A= }=0A= }=0A= =0A= if ( !checkSet ) {=0A= checkSet =3D set;=0A= }=0A= =0A= if ( !checkSet ) {=0A= throw "Syntax error, unrecognized expression: " + (cur || selector);=0A= }=0A= =0A= if ( toString.call(checkSet) =3D=3D=3D "[object Array]" ) {=0A= if ( !prune ) {=0A= results.push.apply( results, checkSet );=0A= } else if ( context && context.nodeType =3D=3D=3D 1 ) {=0A= for ( var i =3D 0; checkSet[i] !=3D null; i++ ) {=0A= if ( checkSet[i] && (checkSet[i] =3D=3D=3D true || = checkSet[i].nodeType =3D=3D=3D 1 && contains(context, checkSet[i])) ) {=0A= results.push( set[i] );=0A= }=0A= }=0A= } else {=0A= for ( var i =3D 0; checkSet[i] !=3D null; i++ ) {=0A= if ( checkSet[i] && checkSet[i].nodeType =3D=3D=3D 1 ) {=0A= results.push( set[i] );=0A= }=0A= }=0A= }=0A= } else {=0A= makeArray( checkSet, results );=0A= }=0A= =0A= if ( extra ) {=0A= Sizzle( extra, origContext, results, seed );=0A= Sizzle.uniqueSort( results );=0A= }=0A= =0A= return results;=0A= };=0A= =0A= Sizzle.uniqueSort =3D function(results){=0A= if ( sortOrder ) {=0A= hasDuplicate =3D baseHasDuplicate;=0A= results.sort(sortOrder);=0A= =0A= if ( hasDuplicate ) {=0A= for ( var i =3D 1; i < results.length; i++ ) {=0A= if ( results[i] =3D=3D=3D results[i-1] ) {=0A= results.splice(i--, 1);=0A= }=0A= }=0A= }=0A= }=0A= =0A= return results;=0A= };=0A= =0A= Sizzle.matches =3D function(expr, set){=0A= return Sizzle(expr, null, null, set);=0A= };=0A= =0A= Sizzle.find =3D function(expr, context, isXML){=0A= var set, match;=0A= =0A= if ( !expr ) {=0A= return [];=0A= }=0A= =0A= for ( var i =3D 0, l =3D Expr.order.length; i < l; i++ ) {=0A= var type =3D Expr.order[i], match;=0A= =0A= if ( (match =3D Expr.leftMatch[ type ].exec( expr )) ) {=0A= var left =3D match[1];=0A= match.splice(1,1);=0A= =0A= if ( left.substr( left.length - 1 ) !=3D=3D "\\" ) {=0A= match[1] =3D (match[1] || "").replace(/\\/g, "");=0A= set =3D Expr.find[ type ]( match, context, isXML );=0A= if ( set !=3D null ) {=0A= expr =3D expr.replace( Expr.match[ type ], "" );=0A= break;=0A= }=0A= }=0A= }=0A= }=0A= =0A= if ( !set ) {=0A= set =3D context.getElementsByTagName("*");=0A= }=0A= =0A= return {set: set, expr: expr};=0A= };=0A= =0A= Sizzle.filter =3D function(expr, set, inplace, not){=0A= var old =3D expr, result =3D [], curLoop =3D set, match, anyFound,=0A= isXMLFilter =3D set && set[0] && isXML(set[0]);=0A= =0A= while ( expr && set.length ) {=0A= for ( var type in Expr.filter ) {=0A= if ( (match =3D Expr.match[ type ].exec( expr )) !=3D null ) {=0A= var filter =3D Expr.filter[ type ], found, item;=0A= anyFound =3D false;=0A= =0A= if ( curLoop =3D=3D result ) {=0A= result =3D [];=0A= }=0A= =0A= if ( Expr.preFilter[ type ] ) {=0A= match =3D Expr.preFilter[ type ]( match, curLoop, inplace, result, = not, isXMLFilter );=0A= =0A= if ( !match ) {=0A= anyFound =3D found =3D true;=0A= } else if ( match =3D=3D=3D true ) {=0A= continue;=0A= }=0A= }=0A= =0A= if ( match ) {=0A= for ( var i =3D 0; (item =3D curLoop[i]) !=3D null; i++ ) {=0A= if ( item ) {=0A= found =3D filter( item, match, i, curLoop );=0A= var pass =3D not ^ !!found;=0A= =0A= if ( inplace && found !=3D null ) {=0A= if ( pass ) {=0A= anyFound =3D true;=0A= } else {=0A= curLoop[i] =3D false;=0A= }=0A= } else if ( pass ) {=0A= result.push( item );=0A= anyFound =3D true;=0A= }=0A= }=0A= }=0A= }=0A= =0A= if ( found !=3D=3D undefined ) {=0A= if ( !inplace ) {=0A= curLoop =3D result;=0A= }=0A= =0A= expr =3D expr.replace( Expr.match[ type ], "" );=0A= =0A= if ( !anyFound ) {=0A= return [];=0A= }=0A= =0A= break;=0A= }=0A= }=0A= }=0A= =0A= if ( expr =3D=3D old ) {=0A= if ( anyFound =3D=3D null ) {=0A= throw "Syntax error, unrecognized expression: " + expr;=0A= } else {=0A= break;=0A= }=0A= }=0A= =0A= old =3D expr;=0A= }=0A= =0A= return curLoop;=0A= };=0A= =0A= var Expr =3D Sizzle.selectors =3D {=0A= order: [ "ID", "NAME", "TAG" ],=0A= match: {=0A= ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,=0A= CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,=0A= NAME: /\[name=3D['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,=0A= ATTR: = /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=3D)\s*(['"]*)(.*?)\3|)\s*\]= /,=0A= TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,=0A= CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,=0A= POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=3D[^-]|$)/,=0A= PSEUDO: = /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2= \))?/=0A= },=0A= leftMatch: {},=0A= attrMap: {=0A= "class": "className",=0A= "for": "htmlFor"=0A= },=0A= attrHandle: {=0A= href: function(elem){=0A= return elem.getAttribute("href");=0A= }=0A= },=0A= relative: {=0A= "+": function(checkSet, part, isXML){=0A= var isPartStr =3D typeof part =3D=3D=3D "string",=0A= isTag =3D isPartStr && !/\W/.test(part),=0A= isPartStrNotTag =3D isPartStr && !isTag;=0A= =0A= if ( isTag && !isXML ) {=0A= part =3D part.toUpperCase();=0A= }=0A= =0A= for ( var i =3D 0, l =3D checkSet.length, elem; i < l; i++ ) {=0A= if ( (elem =3D checkSet[i]) ) {=0A= while ( (elem =3D elem.previousSibling) && elem.nodeType !=3D=3D 1 = ) {}=0A= =0A= checkSet[i] =3D isPartStrNotTag || elem && elem.nodeName =3D=3D=3D = part ?=0A= elem || false :=0A= elem =3D=3D=3D part;=0A= }=0A= }=0A= =0A= if ( isPartStrNotTag ) {=0A= Sizzle.filter( part, checkSet, true );=0A= }=0A= },=0A= ">": function(checkSet, part, isXML){=0A= var isPartStr =3D typeof part =3D=3D=3D "string";=0A= =0A= if ( isPartStr && !/\W/.test(part) ) {=0A= part =3D isXML ? part : part.toUpperCase();=0A= =0A= for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A= var elem =3D checkSet[i];=0A= if ( elem ) {=0A= var parent =3D elem.parentNode;=0A= checkSet[i] =3D parent.nodeName =3D=3D=3D part ? parent : false;=0A= }=0A= }=0A= } else {=0A= for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A= var elem =3D checkSet[i];=0A= if ( elem ) {=0A= checkSet[i] =3D isPartStr ?=0A= elem.parentNode :=0A= elem.parentNode =3D=3D=3D part;=0A= }=0A= }=0A= =0A= if ( isPartStr ) {=0A= Sizzle.filter( part, checkSet, true );=0A= }=0A= }=0A= },=0A= "": function(checkSet, part, isXML){=0A= var doneName =3D done++, checkFn =3D dirCheck;=0A= =0A= if ( !/\W/.test(part) ) {=0A= var nodeCheck =3D part =3D isXML ? part : part.toUpperCase();=0A= checkFn =3D dirNodeCheck;=0A= }=0A= =0A= checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);=0A= },=0A= "~": function(checkSet, part, isXML){=0A= var doneName =3D done++, checkFn =3D dirCheck;=0A= =0A= if ( typeof part =3D=3D=3D "string" && !/\W/.test(part) ) {=0A= var nodeCheck =3D part =3D isXML ? part : part.toUpperCase();=0A= checkFn =3D dirNodeCheck;=0A= }=0A= =0A= checkFn("previousSibling", part, doneName, checkSet, nodeCheck, = isXML);=0A= }=0A= },=0A= find: {=0A= ID: function(match, context, isXML){=0A= if ( typeof context.getElementById !=3D=3D "undefined" && !isXML ) {=0A= var m =3D context.getElementById(match[1]);=0A= return m ? [m] : [];=0A= }=0A= },=0A= NAME: function(match, context, isXML){=0A= if ( typeof context.getElementsByName !=3D=3D "undefined" ) {=0A= var ret =3D [], results =3D context.getElementsByName(match[1]);=0A= =0A= for ( var i =3D 0, l =3D results.length; i < l; i++ ) {=0A= if ( results[i].getAttribute("name") =3D=3D=3D match[1] ) {=0A= ret.push( results[i] );=0A= }=0A= }=0A= =0A= return ret.length =3D=3D=3D 0 ? null : ret;=0A= }=0A= },=0A= TAG: function(match, context){=0A= return context.getElementsByTagName(match[1]);=0A= }=0A= },=0A= preFilter: {=0A= CLASS: function(match, curLoop, inplace, result, not, isXML){=0A= match =3D " " + match[1].replace(/\\/g, "") + " ";=0A= =0A= if ( isXML ) {=0A= return match;=0A= }=0A= =0A= for ( var i =3D 0, elem; (elem =3D curLoop[i]) !=3D null; i++ ) {=0A= if ( elem ) {=0A= if ( not ^ (elem.className && (" " + elem.className + " = ").indexOf(match) >=3D 0) ) {=0A= if ( !inplace )=0A= result.push( elem );=0A= } else if ( inplace ) {=0A= curLoop[i] =3D false;=0A= }=0A= }=0A= }=0A= =0A= return false;=0A= },=0A= ID: function(match){=0A= return match[1].replace(/\\/g, "");=0A= },=0A= TAG: function(match, curLoop){=0A= for ( var i =3D 0; curLoop[i] =3D=3D=3D false; i++ ){}=0A= return curLoop[i] && isXML(curLoop[i]) ? match[1] : = match[1].toUpperCase();=0A= },=0A= CHILD: function(match){=0A= if ( match[1] =3D=3D "nth" ) {=0A= var test =3D /(-?)(\d*)n((?:\+|-)?\d*)/.exec(=0A= match[2] =3D=3D "even" && "2n" || match[2] =3D=3D "odd" && "2n+1" ||=0A= !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);=0A= =0A= match[2] =3D (test[1] + (test[2] || 1)) - 0;=0A= match[3] =3D test[3] - 0;=0A= }=0A= =0A= match[0] =3D done++;=0A= =0A= return match;=0A= },=0A= ATTR: function(match, curLoop, inplace, result, not, isXML){=0A= var name =3D match[1].replace(/\\/g, "");=0A= =0A= if ( !isXML && Expr.attrMap[name] ) {=0A= match[1] =3D Expr.attrMap[name];=0A= }=0A= =0A= if ( match[2] =3D=3D=3D "~=3D" ) {=0A= match[4] =3D " " + match[4] + " ";=0A= }=0A= =0A= return match;=0A= },=0A= PSEUDO: function(match, curLoop, inplace, result, not){=0A= if ( match[1] =3D=3D=3D "not" ) {=0A= if ( ( chunker.exec(match[3]) || "" ).length > 1 || = /^\w/.test(match[3]) ) {=0A= match[3] =3D Sizzle(match[3], null, null, curLoop);=0A= } else {=0A= var ret =3D Sizzle.filter(match[3], curLoop, inplace, true ^ not);=0A= if ( !inplace ) {=0A= result.push.apply( result, ret );=0A= }=0A= return false;=0A= }=0A= } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( = match[0] ) ) {=0A= return true;=0A= }=0A= =0A= return match;=0A= },=0A= POS: function(match){=0A= match.unshift( true );=0A= return match;=0A= }=0A= },=0A= filters: {=0A= enabled: function(elem){=0A= return elem.disabled =3D=3D=3D false && elem.type !=3D=3D "hidden";=0A= },=0A= disabled: function(elem){=0A= return elem.disabled =3D=3D=3D true;=0A= },=0A= checked: function(elem){=0A= return elem.checked =3D=3D=3D true;=0A= },=0A= selected: function(elem){=0A= elem.parentNode.selectedIndex;=0A= return elem.selected =3D=3D=3D true;=0A= },=0A= parent: function(elem){=0A= return !!elem.firstChild;=0A= },=0A= empty: function(elem){=0A= return !elem.firstChild;=0A= },=0A= has: function(elem, i, match){=0A= return !!Sizzle( match[3], elem ).length;=0A= },=0A= header: function(elem){=0A= return /h\d/i.test( elem.nodeName );=0A= },=0A= text: function(elem){=0A= return "text" =3D=3D=3D elem.type;=0A= },=0A= radio: function(elem){=0A= return "radio" =3D=3D=3D elem.type;=0A= },=0A= checkbox: function(elem){=0A= return "checkbox" =3D=3D=3D elem.type;=0A= },=0A= file: function(elem){=0A= return "file" =3D=3D=3D elem.type;=0A= },=0A= password: function(elem){=0A= return "password" =3D=3D=3D elem.type;=0A= },=0A= submit: function(elem){=0A= return "submit" =3D=3D=3D elem.type;=0A= },=0A= image: function(elem){=0A= return "image" =3D=3D=3D elem.type;=0A= },=0A= reset: function(elem){=0A= return "reset" =3D=3D=3D elem.type;=0A= },=0A= button: function(elem){=0A= return "button" =3D=3D=3D elem.type || elem.nodeName.toUpperCase() = =3D=3D=3D "BUTTON";=0A= },=0A= input: function(elem){=0A= return /input|select|textarea|button/i.test(elem.nodeName);=0A= }=0A= },=0A= setFilters: {=0A= first: function(elem, i){=0A= return i =3D=3D=3D 0;=0A= },=0A= last: function(elem, i, match, array){=0A= return i =3D=3D=3D array.length - 1;=0A= },=0A= even: function(elem, i){=0A= return i % 2 =3D=3D=3D 0;=0A= },=0A= odd: function(elem, i){=0A= return i % 2 =3D=3D=3D 1;=0A= },=0A= lt: function(elem, i, match){=0A= return i < match[3] - 0;=0A= },=0A= gt: function(elem, i, match){=0A= return i > match[3] - 0;=0A= },=0A= nth: function(elem, i, match){=0A= return match[3] - 0 =3D=3D i;=0A= },=0A= eq: function(elem, i, match){=0A= return match[3] - 0 =3D=3D i;=0A= }=0A= },=0A= filter: {=0A= PSEUDO: function(elem, match, i, array){=0A= var name =3D match[1], filter =3D Expr.filters[ name ];=0A= =0A= if ( filter ) {=0A= return filter( elem, i, match, array );=0A= } else if ( name =3D=3D=3D "contains" ) {=0A= return (elem.textContent || elem.innerText || "").indexOf(match[3]) = >=3D 0;=0A= } else if ( name =3D=3D=3D "not" ) {=0A= var not =3D match[3];=0A= =0A= for ( var i =3D 0, l =3D not.length; i < l; i++ ) {=0A= if ( not[i] =3D=3D=3D elem ) {=0A= return false;=0A= }=0A= }=0A= =0A= return true;=0A= }=0A= },=0A= CHILD: function(elem, match){=0A= var type =3D match[1], node =3D elem;=0A= switch (type) {=0A= case 'only':=0A= case 'first':=0A= while ( (node =3D node.previousSibling) ) {=0A= if ( node.nodeType =3D=3D=3D 1 ) return false;=0A= }=0A= if ( type =3D=3D 'first') return true;=0A= node =3D elem;=0A= case 'last':=0A= while ( (node =3D node.nextSibling) ) {=0A= if ( node.nodeType =3D=3D=3D 1 ) return false;=0A= }=0A= return true;=0A= case 'nth':=0A= var first =3D match[2], last =3D match[3];=0A= =0A= if ( first =3D=3D 1 && last =3D=3D 0 ) {=0A= return true;=0A= }=0A= =0A= var doneName =3D match[0],=0A= parent =3D elem.parentNode;=0A= =0A= if ( parent && (parent.sizcache !=3D=3D doneName || = !elem.nodeIndex) ) {=0A= var count =3D 0;=0A= for ( node =3D parent.firstChild; node; node =3D node.nextSibling = ) {=0A= if ( node.nodeType =3D=3D=3D 1 ) {=0A= node.nodeIndex =3D ++count;=0A= }=0A= }=0A= parent.sizcache =3D doneName;=0A= }=0A= =0A= var diff =3D elem.nodeIndex - last;=0A= if ( first =3D=3D 0 ) {=0A= return diff =3D=3D 0;=0A= } else {=0A= return ( diff % first =3D=3D 0 && diff / first >=3D 0 );=0A= }=0A= }=0A= },=0A= ID: function(elem, match){=0A= return elem.nodeType =3D=3D=3D 1 && elem.getAttribute("id") =3D=3D=3D = match;=0A= },=0A= TAG: function(elem, match){=0A= return (match =3D=3D=3D "*" && elem.nodeType =3D=3D=3D 1) || = elem.nodeName =3D=3D=3D match;=0A= },=0A= CLASS: function(elem, match){=0A= return (" " + (elem.className || elem.getAttribute("class")) + " ")=0A= .indexOf( match ) > -1;=0A= },=0A= ATTR: function(elem, match){=0A= var name =3D match[1],=0A= result =3D Expr.attrHandle[ name ] ?=0A= Expr.attrHandle[ name ]( elem ) :=0A= elem[ name ] !=3D null ?=0A= elem[ name ] :=0A= elem.getAttribute( name ),=0A= value =3D result + "",=0A= type =3D match[2],=0A= check =3D match[4];=0A= =0A= return result =3D=3D null ?=0A= type =3D=3D=3D "!=3D" :=0A= type =3D=3D=3D "=3D" ?=0A= value =3D=3D=3D check :=0A= type =3D=3D=3D "*=3D" ?=0A= value.indexOf(check) >=3D 0 :=0A= type =3D=3D=3D "~=3D" ?=0A= (" " + value + " ").indexOf(check) >=3D 0 :=0A= !check ?=0A= value && result !=3D=3D false :=0A= type =3D=3D=3D "!=3D" ?=0A= value !=3D check :=0A= type =3D=3D=3D "^=3D" ?=0A= value.indexOf(check) =3D=3D=3D 0 :=0A= type =3D=3D=3D "$=3D" ?=0A= value.substr(value.length - check.length) =3D=3D=3D check :=0A= type =3D=3D=3D "|=3D" ?=0A= value =3D=3D=3D check || value.substr(0, check.length + 1) =3D=3D=3D = check + "-" :=0A= false;=0A= },=0A= POS: function(elem, match, i, array){=0A= var name =3D match[2], filter =3D Expr.setFilters[ name ];=0A= =0A= if ( filter ) {=0A= return filter( elem, i, match, array );=0A= }=0A= }=0A= }=0A= };=0A= =0A= var origPOS =3D Expr.match.POS;=0A= =0A= for ( var type in Expr.match ) {=0A= Expr.match[ type ] =3D new RegExp( Expr.match[ type ].source + = /(?![^\[]*\])(?![^\(]*\))/.source );=0A= Expr.leftMatch[ type ] =3D new RegExp( /(^(?:.|\r|\n)*?)/.source + = Expr.match[ type ].source );=0A= }=0A= =0A= var makeArray =3D function(array, results) {=0A= array =3D Array.prototype.slice.call( array, 0 );=0A= =0A= if ( results ) {=0A= results.push.apply( results, array );=0A= return results;=0A= }=0A= =0A= return array;=0A= };=0A= =0A= try {=0A= Array.prototype.slice.call( document.documentElement.childNodes, 0 );=0A= =0A= } catch(e){=0A= makeArray =3D function(array, results) {=0A= var ret =3D results || [];=0A= =0A= if ( toString.call(array) =3D=3D=3D "[object Array]" ) {=0A= Array.prototype.push.apply( ret, array );=0A= } else {=0A= if ( typeof array.length =3D=3D=3D "number" ) {=0A= for ( var i =3D 0, l =3D array.length; i < l; i++ ) {=0A= ret.push( array[i] );=0A= }=0A= } else {=0A= for ( var i =3D 0; array[i]; i++ ) {=0A= ret.push( array[i] );=0A= }=0A= }=0A= }=0A= =0A= return ret;=0A= };=0A= }=0A= =0A= var sortOrder;=0A= =0A= if ( document.documentElement.compareDocumentPosition ) {=0A= sortOrder =3D function( a, b ) {=0A= if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {=0A= if ( a =3D=3D b ) {=0A= hasDuplicate =3D true;=0A= }=0A= return 0;=0A= }=0A= =0A= var ret =3D a.compareDocumentPosition(b) & 4 ? -1 : a =3D=3D=3D b ? 0 = : 1;=0A= if ( ret =3D=3D=3D 0 ) {=0A= hasDuplicate =3D true;=0A= }=0A= return ret;=0A= };=0A= } else if ( "sourceIndex" in document.documentElement ) {=0A= sortOrder =3D function( a, b ) {=0A= if ( !a.sourceIndex || !b.sourceIndex ) {=0A= if ( a =3D=3D b ) {=0A= hasDuplicate =3D true;=0A= }=0A= return 0;=0A= }=0A= =0A= var ret =3D a.sourceIndex - b.sourceIndex;=0A= if ( ret =3D=3D=3D 0 ) {=0A= hasDuplicate =3D true;=0A= }=0A= return ret;=0A= };=0A= } else if ( document.createRange ) {=0A= sortOrder =3D function( a, b ) {=0A= if ( !a.ownerDocument || !b.ownerDocument ) {=0A= if ( a =3D=3D b ) {=0A= hasDuplicate =3D true;=0A= }=0A= return 0;=0A= }=0A= =0A= var aRange =3D a.ownerDocument.createRange(), bRange =3D = b.ownerDocument.createRange();=0A= aRange.setStart(a, 0);=0A= aRange.setEnd(a, 0);=0A= bRange.setStart(b, 0);=0A= bRange.setEnd(b, 0);=0A= var ret =3D aRange.compareBoundaryPoints(Range.START_TO_END, bRange);=0A= if ( ret =3D=3D=3D 0 ) {=0A= hasDuplicate =3D true;=0A= }=0A= return ret;=0A= };=0A= }=0A= =0A= (function(){=0A= var form =3D document.createElement("div"),=0A= id =3D "script" + (new Date).getTime();=0A= form.innerHTML =3D "<a name=3D'" + id + "'/>";=0A= =0A= var root =3D document.documentElement;=0A= root.insertBefore( form, root.firstChild );=0A= =0A= if ( !!document.getElementById( id ) ) {=0A= Expr.find.ID =3D function(match, context, isXML){=0A= if ( typeof context.getElementById !=3D=3D "undefined" && !isXML ) {=0A= var m =3D context.getElementById(match[1]);=0A= return m ? m.id =3D=3D=3D match[1] || typeof m.getAttributeNode = !=3D=3D "undefined" && m.getAttributeNode("id").nodeValue =3D=3D=3D = match[1] ? [m] : undefined : [];=0A= }=0A= };=0A= =0A= Expr.filter.ID =3D function(elem, match){=0A= var node =3D typeof elem.getAttributeNode !=3D=3D "undefined" && = elem.getAttributeNode("id");=0A= return elem.nodeType =3D=3D=3D 1 && node && node.nodeValue =3D=3D=3D = match;=0A= };=0A= }=0A= =0A= root.removeChild( form );=0A= root =3D form =3D null; // release memory in IE=0A= })();=0A= =0A= (function(){=0A= =0A= var div =3D document.createElement("div");=0A= div.appendChild( document.createComment("") );=0A= =0A= if ( div.getElementsByTagName("*").length > 0 ) {=0A= Expr.find.TAG =3D function(match, context){=0A= var results =3D context.getElementsByTagName(match[1]);=0A= =0A= if ( match[1] =3D=3D=3D "*" ) {=0A= var tmp =3D [];=0A= =0A= for ( var i =3D 0; results[i]; i++ ) {=0A= if ( results[i].nodeType =3D=3D=3D 1 ) {=0A= tmp.push( results[i] );=0A= }=0A= }=0A= =0A= results =3D tmp;=0A= }=0A= =0A= return results;=0A= };=0A= }=0A= =0A= div.innerHTML =3D "<a href=3D'#'></a>";=0A= if ( div.firstChild && typeof div.firstChild.getAttribute !=3D=3D = "undefined" &&=0A= div.firstChild.getAttribute("href") !=3D=3D "#" ) {=0A= Expr.attrHandle.href =3D function(elem){=0A= return elem.getAttribute("href", 2);=0A= };=0A= }=0A= =0A= div =3D null; // release memory in IE=0A= })();=0A= =0A= if ( document.querySelectorAll ) (function(){=0A= var oldSizzle =3D Sizzle, div =3D document.createElement("div");=0A= div.innerHTML =3D "<p class=3D'TEST'></p>";=0A= =0A= if ( div.querySelectorAll && div.querySelectorAll(".TEST").length = =3D=3D=3D 0 ) {=0A= return;=0A= }=0A= =0A= Sizzle =3D function(query, context, extra, seed){=0A= context =3D context || document;=0A= =0A= if ( !seed && context.nodeType =3D=3D=3D 9 && !isXML(context) ) {=0A= try {=0A= return makeArray( context.querySelectorAll(query), extra );=0A= } catch(e){}=0A= }=0A= =0A= return oldSizzle(query, context, extra, seed);=0A= };=0A= =0A= for ( var prop in oldSizzle ) {=0A= Sizzle[ prop ] =3D oldSizzle[ prop ];=0A= }=0A= =0A= div =3D null; // release memory in IE=0A= })();=0A= =0A= if ( document.getElementsByClassName && = document.documentElement.getElementsByClassName ) (function(){=0A= var div =3D document.createElement("div");=0A= div.innerHTML =3D "<div class=3D'test e'></div><div = class=3D'test'></div>";=0A= =0A= if ( div.getElementsByClassName("e").length =3D=3D=3D 0 )=0A= return;=0A= =0A= div.lastChild.className =3D "e";=0A= =0A= if ( div.getElementsByClassName("e").length =3D=3D=3D 1 )=0A= return;=0A= =0A= Expr.order.splice(1, 0, "CLASS");=0A= Expr.find.CLASS =3D function(match, context, isXML) {=0A= if ( typeof context.getElementsByClassName !=3D=3D "undefined" && = !isXML ) {=0A= return context.getElementsByClassName(match[1]);=0A= }=0A= };=0A= =0A= div =3D null; // release memory in IE=0A= })();=0A= =0A= function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {=0A= var sibDir =3D dir =3D=3D "previousSibling" && !isXML;=0A= for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A= var elem =3D checkSet[i];=0A= if ( elem ) {=0A= if ( sibDir && elem.nodeType =3D=3D=3D 1 ){=0A= elem.sizcache =3D doneName;=0A= elem.sizset =3D i;=0A= }=0A= elem =3D elem[dir];=0A= var match =3D false;=0A= =0A= while ( elem ) {=0A= if ( elem.sizcache =3D=3D=3D doneName ) {=0A= match =3D checkSet[elem.sizset];=0A= break;=0A= }=0A= =0A= if ( elem.nodeType =3D=3D=3D 1 && !isXML ){=0A= elem.sizcache =3D doneName;=0A= elem.sizset =3D i;=0A= }=0A= =0A= if ( elem.nodeName =3D=3D=3D cur ) {=0A= match =3D elem;=0A= break;=0A= }=0A= =0A= elem =3D elem[dir];=0A= }=0A= =0A= checkSet[i] =3D match;=0A= }=0A= }=0A= }=0A= =0A= function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {=0A= var sibDir =3D dir =3D=3D "previousSibling" && !isXML;=0A= for ( var i =3D 0, l =3D checkSet.length; i < l; i++ ) {=0A= var elem =3D checkSet[i];=0A= if ( elem ) {=0A= if ( sibDir && elem.nodeType =3D=3D=3D 1 ) {=0A= elem.sizcache =3D doneName;=0A= elem.sizset =3D i;=0A= }=0A= elem =3D elem[dir];=0A= var match =3D false;=0A= =0A= while ( elem ) {=0A= if ( elem.sizcache =3D=3D=3D doneName ) {=0A= match =3D checkSet[elem.sizset];=0A= break;=0A= }=0A= =0A= if ( elem.nodeType =3D=3D=3D 1 ) {=0A= if ( !isXML ) {=0A= elem.sizcache =3D doneName;=0A= elem.sizset =3D i;=0A= }=0A= if ( typeof cur !=3D=3D "string" ) {=0A= if ( elem =3D=3D=3D cur ) {=0A= match =3D true;=0A= break;=0A= }=0A= =0A= } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {=0A= match =3D elem;=0A= break;=0A= }=0A= }=0A= =0A= elem =3D elem[dir];=0A= }=0A= =0A= checkSet[i] =3D match;=0A= }=0A= }=0A= }=0A= =0A= var contains =3D document.compareDocumentPosition ? function(a, b){=0A= return a.compareDocumentPosition(b) & 16;=0A= } : function(a, b){=0A= return a !=3D=3D b && (a.contains ? a.contains(b) : true);=0A= };=0A= =0A= var isXML =3D function(elem){=0A= return elem.nodeType =3D=3D=3D 9 && elem.documentElement.nodeName = !=3D=3D "HTML" ||=0A= !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName = !=3D=3D "HTML";=0A= };=0A= =0A= var posProcess =3D function(selector, context){=0A= var tmpSet =3D [], later =3D "", match,=0A= root =3D context.nodeType ? [context] : context;=0A= =0A= while ( (match =3D Expr.match.PSEUDO.exec( selector )) ) {=0A= later +=3D match[0];=0A= selector =3D selector.replace( Expr.match.PSEUDO, "" );=0A= }=0A= =0A= selector =3D Expr.relative[selector] ? selector + "*" : selector;=0A= =0A= for ( var i =3D 0, l =3D root.length; i < l; i++ ) {=0A= Sizzle( selector, root[i], tmpSet );=0A= }=0A= =0A= return Sizzle.filter( later, tmpSet );=0A= };=0A= =0A= =0A= window.Sizzle =3D Sizzle;=0A= =0A= })();=0A= =0A= ;(function(engine) {=0A= var extendElements =3D Prototype.Selector.extendElements;=0A= =0A= function select(selector, scope) {=0A= return extendElements(engine(selector, scope || document));=0A= }=0A= =0A= function match(element, selector) {=0A= return engine.matches(selector, [element]).length =3D=3D 1;=0A= }=0A= =0A= Prototype.Selector.engine =3D engine;=0A= Prototype.Selector.select =3D select;=0A= Prototype.Selector.match =3D match;=0A= })(Sizzle);=0A= =0A= window.Sizzle =3D Prototype._original_property;=0A= delete Prototype._original_property;=0A= =0A= var Form =3D {=0A= reset: function(form) {=0A= form =3D $(form);=0A= form.reset();=0A= return form;=0A= },=0A= =0A= serializeElements: function(elements, options) {=0A= if (typeof options !=3D 'object') options =3D { hash: !!options };=0A= else if (Object.isUndefined(options.hash)) options.hash =3D true;=0A= var key, value, submitted =3D false, submit =3D options.submit;=0A= =0A= var data =3D elements.inject({ }, function(result, element) {=0A= if (!element.disabled && element.name) {=0A= key =3D element.name; value =3D $(element).getValue();=0A= if (value !=3D null && element.type !=3D 'file' && (element.type = !=3D 'submit' || (!submitted &&=0A= submit !=3D=3D false && (!submit || key =3D=3D submit) && = (submitted =3D true)))) {=0A= if (key in result) {=0A= if (!Object.isArray(result[key])) result[key] =3D = [result[key]];=0A= result[key].push(value);=0A= }=0A= else result[key] =3D value;=0A= }=0A= }=0A= return result;=0A= });=0A= =0A= return options.hash ? data : Object.toQueryString(data);=0A= }=0A= };=0A= =0A= Form.Methods =3D {=0A= serialize: function(form, options) {=0A= return Form.serializeElements(Form.getElements(form), options);=0A= },=0A= =0A= getElements: function(form) {=0A= var elements =3D $(form).getElementsByTagName('*'),=0A= element,=0A= arr =3D [ ],=0A= serializers =3D Form.Element.Serializers;=0A= for (var i =3D 0; element =3D elements[i]; i++) {=0A= arr.push(element);=0A= }=0A= return arr.inject([], function(elements, child) {=0A= if (serializers[child.tagName.toLowerCase()])=0A= elements.push(Element.extend(child));=0A= return elements;=0A= })=0A= },=0A= =0A= getInputs: function(form, typeName, name) {=0A= form =3D $(form);=0A= var inputs =3D form.getElementsByTagName('input');=0A= =0A= if (!typeName && !name) return $A(inputs).map(Element.extend);=0A= =0A= for (var i =3D 0, matchingInputs =3D [], length =3D inputs.length; i = < length; i++) {=0A= var input =3D inputs[i];=0A= if ((typeName && input.type !=3D typeName) || (name && input.name = !=3D name))=0A= continue;=0A= matchingInputs.push(Element.extend(input));=0A= }=0A= =0A= return matchingInputs;=0A= },=0A= =0A= disable: function(form) {=0A= form =3D $(form);=0A= Form.getElements(form).invoke('disable');=0A= return form;=0A= },=0A= =0A= enable: function(form) {=0A= form =3D $(form);=0A= Form.getElements(form).invoke('enable');=0A= return form;=0A= },=0A= =0A= findFirstElement: function(form) {=0A= var elements =3D $(form).getElements().findAll(function(element) {=0A= return 'hidden' !=3D element.type && !element.disabled;=0A= });=0A= var firstByIndex =3D elements.findAll(function(element) {=0A= return element.hasAttribute('tabIndex') && element.tabIndex >=3D 0;=0A= }).sortBy(function(element) { return element.tabIndex }).first();=0A= =0A= return firstByIndex ? firstByIndex : elements.find(function(element) = {=0A= return /^(?:input|select|textarea)$/i.test(element.tagName);=0A= });=0A= },=0A= =0A= focusFirstElement: function(form) {=0A= form =3D $(form);=0A= form.findFirstElement().activate();=0A= return form;=0A= },=0A= =0A= request: function(form, options) {=0A= form =3D $(form), options =3D Object.clone(options || { });=0A= =0A= var params =3D options.parameters, action =3D = form.readAttribute('action') || '';=0A= if (action.blank()) action =3D window.location.href;=0A= options.parameters =3D form.serialize(true);=0A= =0A= if (params) {=0A= if (Object.isString(params)) params =3D params.toQueryParams();=0A= Object.extend(options.parameters, params);=0A= }=0A= =0A= if (form.hasAttribute('method') && !options.method)=0A= options.method =3D form.method;=0A= =0A= return new Ajax.Request(action, options);=0A= }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= =0A= Form.Element =3D {=0A= focus: function(element) {=0A= $(element).focus();=0A= return element;=0A= },=0A= =0A= select: function(element) {=0A= $(element).select();=0A= return element;=0A= }=0A= };=0A= =0A= Form.Element.Methods =3D {=0A= =0A= serialize: function(element) {=0A= element =3D $(element);=0A= if (!element.disabled && element.name) {=0A= var value =3D element.getValue();=0A= if (value !=3D undefined) {=0A= var pair =3D { };=0A= pair[element.name] =3D value;=0A= return Object.toQueryString(pair);=0A= }=0A= }=0A= return '';=0A= },=0A= =0A= getValue: function(element) {=0A= element =3D $(element);=0A= var method =3D element.tagName.toLowerCase();=0A= return Form.Element.Serializers[method](element);=0A= },=0A= =0A= setValue: function(element, value) {=0A= element =3D $(element);=0A= var method =3D element.tagName.toLowerCase();=0A= Form.Element.Serializers[method](element, value);=0A= return element;=0A= },=0A= =0A= clear: function(element) {=0A= $(element).value =3D '';=0A= return element;=0A= },=0A= =0A= present: function(element) {=0A= return $(element).value !=3D '';=0A= },=0A= =0A= activate: function(element) {=0A= element =3D $(element);=0A= try {=0A= element.focus();=0A= if (element.select && (element.tagName.toLowerCase() !=3D 'input' = ||=0A= !(/^(?:button|reset|submit)$/i.test(element.type))))=0A= element.select();=0A= } catch (e) { }=0A= return element;=0A= },=0A= =0A= disable: function(element) {=0A= element =3D $(element);=0A= element.disabled =3D true;=0A= return element;=0A= },=0A= =0A= enable: function(element) {=0A= element =3D $(element);=0A= element.disabled =3D false;=0A= return element;=0A= }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= var Field =3D Form.Element;=0A= =0A= var $F =3D Form.Element.Methods.getValue;=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Form.Element.Serializers =3D {=0A= input: function(element, value) {=0A= switch (element.type.toLowerCase()) {=0A= case 'checkbox':=0A= case 'radio':=0A= return Form.Element.Serializers.inputSelector(element, value);=0A= default:=0A= return Form.Element.Serializers.textarea(element, value);=0A= }=0A= },=0A= =0A= inputSelector: function(element, value) {=0A= if (Object.isUndefined(value)) return element.checked ? = element.value : null;=0A= else element.checked =3D !!value;=0A= },=0A= =0A= textarea: function(element, value) {=0A= if (Object.isUndefined(value)) return element.value;=0A= else element.value =3D value;=0A= },=0A= =0A= select: function(element, value) {=0A= if (Object.isUndefined(value))=0A= return this[element.type =3D=3D 'select-one' ?=0A= 'selectOne' : 'selectMany'](element);=0A= else {=0A= var opt, currentValue, single =3D !Object.isArray(value);=0A= for (var i =3D 0, length =3D element.length; i < length; i++) {=0A= opt =3D element.options[i];=0A= currentValue =3D this.optionValue(opt);=0A= if (single) {=0A= if (currentValue =3D=3D value) {=0A= opt.selected =3D true;=0A= return;=0A= }=0A= }=0A= else opt.selected =3D value.include(currentValue);=0A= }=0A= }=0A= },=0A= =0A= selectOne: function(element) {=0A= var index =3D element.selectedIndex;=0A= return index >=3D 0 ? this.optionValue(element.options[index]) : = null;=0A= },=0A= =0A= selectMany: function(element) {=0A= var values, length =3D element.length;=0A= if (!length) return null;=0A= =0A= for (var i =3D 0, values =3D []; i < length; i++) {=0A= var opt =3D element.options[i];=0A= if (opt.selected) values.push(this.optionValue(opt));=0A= }=0A= return values;=0A= },=0A= =0A= optionValue: function(opt) {=0A= return Element.extend(opt).hasAttribute('value') ? opt.value : = opt.text;=0A= }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= =0A= Abstract.TimedObserver =3D Class.create(PeriodicalExecuter, {=0A= initialize: function($super, element, frequency, callback) {=0A= $super(callback, frequency);=0A= this.element =3D $(element);=0A= this.lastValue =3D this.getValue();=0A= },=0A= =0A= execute: function() {=0A= var value =3D this.getValue();=0A= if (Object.isString(this.lastValue) && Object.isString(value) ?=0A= this.lastValue !=3D value : String(this.lastValue) !=3D = String(value)) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= }=0A= });=0A= =0A= Form.Element.Observer =3D Class.create(Abstract.TimedObserver, {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.Observer =3D Class.create(Abstract.TimedObserver, {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Abstract.EventObserver =3D Class.create({=0A= initialize: function(element, callback) {=0A= this.element =3D $(element);=0A= this.callback =3D callback;=0A= =0A= this.lastValue =3D this.getValue();=0A= if (this.element.tagName.toLowerCase() =3D=3D 'form')=0A= this.registerFormCallbacks();=0A= else=0A= this.registerCallback(this.element);=0A= },=0A= =0A= onElementEvent: function() {=0A= var value =3D this.getValue();=0A= if (this.lastValue !=3D value) {=0A= this.callback(this.element, value);=0A= this.lastValue =3D value;=0A= }=0A= },=0A= =0A= registerFormCallbacks: function() {=0A= Form.getElements(this.element).each(this.registerCallback, this);=0A= },=0A= =0A= registerCallback: function(element) {=0A= if (element.type) {=0A= switch (element.type.toLowerCase()) {=0A= case 'checkbox':=0A= case 'radio':=0A= Event.observe(element, 'click', = this.onElementEvent.bind(this));=0A= break;=0A= default:=0A= Event.observe(element, 'change', = this.onElementEvent.bind(this));=0A= break;=0A= }=0A= }=0A= }=0A= });=0A= =0A= Form.Element.EventObserver =3D Class.create(Abstract.EventObserver, {=0A= getValue: function() {=0A= return Form.Element.getValue(this.element);=0A= }=0A= });=0A= =0A= Form.EventObserver =3D Class.create(Abstract.EventObserver, {=0A= getValue: function() {=0A= return Form.serialize(this.element);=0A= }=0A= });=0A= (function() {=0A= =0A= var Event =3D {=0A= KEY_BACKSPACE: 8,=0A= KEY_TAB: 9,=0A= KEY_RETURN: 13,=0A= KEY_ESC: 27,=0A= KEY_LEFT: 37,=0A= KEY_UP: 38,=0A= KEY_RIGHT: 39,=0A= KEY_DOWN: 40,=0A= KEY_DELETE: 46,=0A= KEY_HOME: 36,=0A= KEY_END: 35,=0A= KEY_PAGEUP: 33,=0A= KEY_PAGEDOWN: 34,=0A= KEY_INSERT: 45,=0A= =0A= cache: {}=0A= };=0A= =0A= var docEl =3D document.documentElement;=0A= var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED =3D 'onmouseenter' in docEl=0A= && 'onmouseleave' in docEl;=0A= =0A= var _isButton;=0A= if (Prototype.Browser.IE) {=0A= var buttonMap =3D { 0: 1, 1: 4, 2: 2 };=0A= _isButton =3D function(event, code) {=0A= return event.button =3D=3D=3D buttonMap[code];=0A= };=0A= } else if (Prototype.Browser.WebKit) {=0A= _isButton =3D function(event, code) {=0A= switch (code) {=0A= case 0: return event.which =3D=3D 1 && !event.metaKey;=0A= case 1: return event.which =3D=3D 1 && event.metaKey;=0A= default: return false;=0A= }=0A= };=0A= } else {=0A= _isButton =3D function(event, code) {=0A= return event.which ? (event.which =3D=3D=3D code + 1) : = (event.button =3D=3D=3D code);=0A= };=0A= }=0A= =0A= function isLeftClick(event) { return _isButton(event, 0) }=0A= =0A= function isMiddleClick(event) { return _isButton(event, 1) }=0A= =0A= function isRightClick(event) { return _isButton(event, 2) }=0A= =0A= function element(event) {=0A= event =3D Event.extend(event);=0A= =0A= var node =3D event.target, type =3D event.type,=0A= currentTarget =3D event.currentTarget;=0A= =0A= if (currentTarget && currentTarget.tagName) {=0A= if (type =3D=3D=3D 'load' || type =3D=3D=3D 'error' ||=0A= (type =3D=3D=3D 'click' && currentTarget.tagName.toLowerCase() = =3D=3D=3D 'input'=0A= && currentTarget.type =3D=3D=3D 'radio'))=0A= node =3D currentTarget;=0A= }=0A= =0A= if (node.nodeType =3D=3D Node.TEXT_NODE)=0A= node =3D node.parentNode;=0A= =0A= return Element.extend(node);=0A= }=0A= =0A= function findElement(event, expression) {=0A= var element =3D Event.element(event);=0A= if (!expression) return element;=0A= while (element) {=0A= if (Object.isElement(element) && Prototype.Selector.match(element, = expression)) {=0A= return Element.extend(element);=0A= }=0A= element =3D element.parentNode;=0A= }=0A= }=0A= =0A= function pointer(event) {=0A= return { x: pointerX(event), y: pointerY(event) };=0A= }=0A= =0A= function pointerX(event) {=0A= var docElement =3D document.documentElement,=0A= body =3D document.body || { scrollLeft: 0 };=0A= =0A= return event.pageX || (event.clientX +=0A= (docElement.scrollLeft || body.scrollLeft) -=0A= (docElement.clientLeft || 0));=0A= }=0A= =0A= function pointerY(event) {=0A= var docElement =3D document.documentElement,=0A= body =3D document.body || { scrollTop: 0 };=0A= =0A= return event.pageY || (event.clientY +=0A= (docElement.scrollTop || body.scrollTop) -=0A= (docElement.clientTop || 0));=0A= }=0A= =0A= =0A= function stop(event) {=0A= Event.extend(event);=0A= event.preventDefault();=0A= event.stopPropagation();=0A= =0A= event.stopped =3D true;=0A= }=0A= =0A= Event.Methods =3D {=0A= isLeftClick: isLeftClick,=0A= isMiddleClick: isMiddleClick,=0A= isRightClick: isRightClick,=0A= =0A= element: element,=0A= findElement: findElement,=0A= =0A= pointer: pointer,=0A= pointerX: pointerX,=0A= pointerY: pointerY,=0A= =0A= stop: stop=0A= };=0A= =0A= =0A= var methods =3D Object.keys(Event.Methods).inject({ }, function(m, = name) {=0A= m[name] =3D Event.Methods[name].methodize();=0A= return m;=0A= });=0A= =0A= if (Prototype.Browser.IE) {=0A= function _relatedTarget(event) {=0A= var element;=0A= switch (event.type) {=0A= case 'mouseover': element =3D event.fromElement; break;=0A= case 'mouseout': element =3D event.toElement; break;=0A= default: return null;=0A= }=0A= return Element.extend(element);=0A= }=0A= =0A= Object.extend(methods, {=0A= stopPropagation: function() { this.cancelBubble =3D true },=0A= preventDefault: function() { this.returnValue =3D false },=0A= inspect: function() { return '[object Event]' }=0A= });=0A= =0A= Event.extend =3D function(event, element) {=0A= if (!event) return false;=0A= if (event._extendedByPrototype) return event;=0A= =0A= event._extendedByPrototype =3D Prototype.emptyFunction;=0A= var pointer =3D Event.pointer(event);=0A= =0A= Object.extend(event, {=0A= target: event.srcElement || element,=0A= relatedTarget: _relatedTarget(event),=0A= pageX: pointer.x,=0A= pageY: pointer.y=0A= });=0A= =0A= return Object.extend(event, methods);=0A= };=0A= } else {=0A= Event.prototype =3D window.Event.prototype || = document.createEvent('HTMLEvents').__proto__;=0A= Object.extend(Event.prototype, methods);=0A= Event.extend =3D Prototype.K;=0A= }=0A= =0A= function _createResponder(element, eventName, handler) {=0A= var registry =3D Element.retrieve(element, = 'prototype_event_registry');=0A= =0A= if (Object.isUndefined(registry)) {=0A= CACHE.push(element);=0A= registry =3D Element.retrieve(element, 'prototype_event_registry', = $H());=0A= }=0A= =0A= var respondersForEvent =3D registry.get(eventName);=0A= if (Object.isUndefined(respondersForEvent)) {=0A= respondersForEvent =3D [];=0A= registry.set(eventName, respondersForEvent);=0A= }=0A= =0A= if (respondersForEvent.pluck('handler').include(handler)) return = false;=0A= =0A= var responder;=0A= if (eventName.include(":")) {=0A= responder =3D function(event) {=0A= if (Object.isUndefined(event.eventName))=0A= return false;=0A= =0A= if (event.eventName !=3D=3D eventName)=0A= return false;=0A= =0A= Event.extend(event, element);=0A= handler.call(element, event);=0A= };=0A= } else {=0A= if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&=0A= (eventName =3D=3D=3D "mouseenter" || eventName =3D=3D=3D = "mouseleave")) {=0A= if (eventName =3D=3D=3D "mouseenter" || eventName =3D=3D=3D = "mouseleave") {=0A= responder =3D function(event) {=0A= Event.extend(event, element);=0A= =0A= var parent =3D event.relatedTarget;=0A= while (parent && parent !=3D=3D element) {=0A= try { parent =3D parent.parentNode; }=0A= catch(e) { parent =3D element; }=0A= }=0A= =0A= if (parent =3D=3D=3D element) return;=0A= =0A= handler.call(element, event);=0A= };=0A= }=0A= } else {=0A= responder =3D function(event) {=0A= Event.extend(event, element);=0A= handler.call(element, event);=0A= };=0A= }=0A= }=0A= =0A= responder.handler =3D handler;=0A= respondersForEvent.push(responder);=0A= return responder;=0A= }=0A= =0A= function _destroyCache() {=0A= for (var i =3D 0, length =3D CACHE.length; i < length; i++) {=0A= Event.stopObserving(CACHE[i]);=0A= CACHE[i] =3D null;=0A= }=0A= }=0A= =0A= var CACHE =3D [];=0A= =0A= if (Prototype.Browser.IE)=0A= window.attachEvent('onunload', _destroyCache);=0A= =0A= if (Prototype.Browser.WebKit)=0A= window.addEventListener('unload', Prototype.emptyFunction, false);=0A= =0A= =0A= var _getDOMEventName =3D Prototype.K,=0A= translations =3D { mouseenter: "mouseover", mouseleave: "mouseout" = };=0A= =0A= if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {=0A= _getDOMEventName =3D function(eventName) {=0A= return (translations[eventName] || eventName);=0A= };=0A= }=0A= =0A= function observe(element, eventName, handler) {=0A= element =3D $(element);=0A= =0A= var responder =3D _createResponder(element, eventName, handler);=0A= =0A= if (!responder) return element;=0A= =0A= if (eventName.include(':')) {=0A= if (element.addEventListener)=0A= element.addEventListener("dataavailable", responder, false);=0A= else {=0A= element.attachEvent("ondataavailable", responder);=0A= element.attachEvent("onfilterchange", responder);=0A= }=0A= } else {=0A= var actualEventName =3D _getDOMEventName(eventName);=0A= =0A= if (element.addEventListener)=0A= element.addEventListener(actualEventName, responder, false);=0A= else=0A= element.attachEvent("on" + actualEventName, responder);=0A= }=0A= =0A= return element;=0A= }=0A= =0A= function stopObserving(element, eventName, handler) {=0A= element =3D $(element);=0A= =0A= var registry =3D Element.retrieve(element, = 'prototype_event_registry');=0A= if (!registry) return element;=0A= =0A= if (!eventName) {=0A= registry.each( function(pair) {=0A= var eventName =3D pair.key;=0A= stopObserving(element, eventName);=0A= });=0A= return element;=0A= }=0A= =0A= var responders =3D registry.get(eventName);=0A= if (!responders) return element;=0A= =0A= if (!handler) {=0A= responders.each(function(r) {=0A= stopObserving(element, eventName, r.handler);=0A= });=0A= return element;=0A= }=0A= =0A= var responder =3D responders.find( function(r) { return r.handler = =3D=3D=3D handler; });=0A= if (!responder) return element;=0A= =0A= if (eventName.include(':')) {=0A= if (element.removeEventListener)=0A= element.removeEventListener("dataavailable", responder, false);=0A= else {=0A= element.detachEvent("ondataavailable", responder);=0A= element.detachEvent("onfilterchange", responder);=0A= }=0A= } else {=0A= var actualEventName =3D _getDOMEventName(eventName);=0A= if (element.removeEventListener)=0A= element.removeEventListener(actualEventName, responder, false);=0A= else=0A= element.detachEvent('on' + actualEventName, responder);=0A= }=0A= =0A= registry.set(eventName, responders.without(responder));=0A= =0A= return element;=0A= }=0A= =0A= function fire(element, eventName, memo, bubble) {=0A= element =3D $(element);=0A= =0A= if (Object.isUndefined(bubble))=0A= bubble =3D true;=0A= =0A= if (element =3D=3D document && document.createEvent && = !element.dispatchEvent)=0A= element =3D document.documentElement;=0A= =0A= var event;=0A= if (document.createEvent) {=0A= event =3D document.createEvent('HTMLEvents');=0A= event.initEvent('dataavailable', true, true);=0A= } else {=0A= event =3D document.createEventObject();=0A= event.eventType =3D bubble ? 'ondataavailable' : 'onfilterchange';=0A= }=0A= =0A= event.eventName =3D eventName;=0A= event.memo =3D memo || { };=0A= =0A= if (document.createEvent)=0A= element.dispatchEvent(event);=0A= else=0A= element.fireEvent(event.eventType, event);=0A= =0A= return Event.extend(event);=0A= }=0A= =0A= Event.Handler =3D Class.create({=0A= initialize: function(element, eventName, selector, callback) {=0A= this.element =3D $(element);=0A= this.eventName =3D eventName;=0A= this.selector =3D selector;=0A= this.callback =3D callback;=0A= this.handler =3D this.handleEvent.bind(this);=0A= },=0A= =0A= start: function() {=0A= Event.observe(this.element, this.eventName, this.handler);=0A= return this;=0A= },=0A= =0A= stop: function() {=0A= Event.stopObserving(this.element, this.eventName, this.handler);=0A= return this;=0A= },=0A= =0A= handleEvent: function(event) {=0A= var element =3D event.findElement(this.selector);=0A= if (element) this.callback.call(this.element, event, element);=0A= }=0A= });=0A= =0A= function on(element, eventName, selector, callback) {=0A= element =3D $(element);=0A= if (Object.isFunction(selector) && Object.isUndefined(callback)) {=0A= callback =3D selector, selector =3D null;=0A= }=0A= =0A= return new Event.Handler(element, eventName, selector, = callback).start();=0A= }=0A= =0A= Object.extend(Event, Event.Methods);=0A= =0A= Object.extend(Event, {=0A= fire: fire,=0A= observe: observe,=0A= stopObserving: stopObserving,=0A= on: on=0A= });=0A= =0A= Element.addMethods({=0A= fire: fire,=0A= =0A= observe: observe,=0A= =0A= stopObserving: stopObserving,=0A= =0A= on: on=0A= });=0A= =0A= Object.extend(document, {=0A= fire: fire.methodize(),=0A= =0A= observe: observe.methodize(),=0A= =0A= stopObserving: stopObserving.methodize(),=0A= =0A= on: on.methodize(),=0A= =0A= loaded: false=0A= });=0A= =0A= if (window.Event) Object.extend(window.Event, Event);=0A= else window.Event =3D Event;=0A= })();=0A= =0A= (function() {=0A= /* Support for the DOMContentLoaded event is based on work by Dan Webb,=0A= Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */=0A= =0A= var timer;=0A= =0A= function fireContentLoadedEvent() {=0A= if (document.loaded) return;=0A= if (timer) window.clearTimeout(timer);=0A= document.loaded =3D true;=0A= document.fire('dom:loaded');=0A= }=0A= =0A= function checkReadyState() {=0A= if (document.readyState =3D=3D=3D 'complete') {=0A= document.stopObserving('readystatechange', checkReadyState);=0A= fireContentLoadedEvent();=0A= }=0A= }=0A= =0A= function pollDoScroll() {=0A= try { document.documentElement.doScroll('left'); }=0A= catch(e) {=0A= timer =3D pollDoScroll.defer();=0A= return;=0A= }=0A= fireContentLoadedEvent();=0A= }=0A= =0A= if (document.addEventListener) {=0A= document.addEventListener('DOMContentLoaded', = fireContentLoadedEvent, false);=0A= } else {=0A= document.observe('readystatechange', checkReadyState);=0A= if (window =3D=3D top)=0A= timer =3D pollDoScroll.defer();=0A= }=0A= =0A= Event.observe(window, 'load', fireContentLoadedEvent);=0A= })();=0A= =0A= Element.addMethods();=0A= =0A= /*------------------------------- DEPRECATED = -------------------------------*/=0A= =0A= Hash.toQueryString =3D Object.toQueryString;=0A= =0A= var Toggle =3D { display: Element.toggle };=0A= =0A= Element.Methods.childOf =3D Element.Methods.descendantOf;=0A= =0A= var Insertion =3D {=0A= Before: function(element, content) {=0A= return Element.insert(element, {before:content});=0A= },=0A= =0A= Top: function(element, content) {=0A= return Element.insert(element, {top:content});=0A= },=0A= =0A= Bottom: function(element, content) {=0A= return Element.insert(element, {bottom:content});=0A= },=0A= =0A= After: function(element, content) {=0A= return Element.insert(element, {after:content});=0A= }=0A= };=0A= =0A= var $continue =3D new Error('"throw $continue" is deprecated, use = "return" instead');=0A= =0A= var Position =3D {=0A= includeScrollOffsets: false,=0A= =0A= prepare: function() {=0A= this.deltaX =3D window.pageXOffset=0A= || document.documentElement.scrollLeft=0A= || document.body.scrollLeft=0A= || 0;=0A= this.deltaY =3D window.pageYOffset=0A= || document.documentElement.scrollTop=0A= || document.body.scrollTop=0A= || 0;=0A= },=0A= =0A= within: function(element, x, y) {=0A= if (this.includeScrollOffsets)=0A= return this.withinIncludingScrolloffsets(element, x, y);=0A= this.xcomp =3D x;=0A= this.ycomp =3D y;=0A= this.offset =3D Element.cumulativeOffset(element);=0A= =0A= return (y >=3D this.offset[1] &&=0A= y < this.offset[1] + element.offsetHeight &&=0A= x >=3D this.offset[0] &&=0A= x < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= withinIncludingScrolloffsets: function(element, x, y) {=0A= var offsetcache =3D Element.cumulativeScrollOffset(element);=0A= =0A= this.xcomp =3D x + offsetcache[0] - this.deltaX;=0A= this.ycomp =3D y + offsetcache[1] - this.deltaY;=0A= this.offset =3D Element.cumulativeOffset(element);=0A= =0A= return (this.ycomp >=3D this.offset[1] &&=0A= this.ycomp < this.offset[1] + element.offsetHeight &&=0A= this.xcomp >=3D this.offset[0] &&=0A= this.xcomp < this.offset[0] + element.offsetWidth);=0A= },=0A= =0A= overlap: function(mode, element) {=0A= if (!mode) return 0;=0A= if (mode =3D=3D 'vertical')=0A= return ((this.offset[1] + element.offsetHeight) - this.ycomp) /=0A= element.offsetHeight;=0A= if (mode =3D=3D 'horizontal')=0A= return ((this.offset[0] + element.offsetWidth) - this.xcomp) /=0A= element.offsetWidth;=0A= },=0A= =0A= =0A= cumulativeOffset: Element.Methods.cumulativeOffset,=0A= =0A= positionedOffset: Element.Methods.positionedOffset,=0A= =0A= absolutize: function(element) {=0A= Position.prepare();=0A= return Element.absolutize(element);=0A= },=0A= =0A= relativize: function(element) {=0A= Position.prepare();=0A= return Element.relativize(element);=0A= },=0A= =0A= realOffset: Element.Methods.cumulativeScrollOffset,=0A= =0A= offsetParent: Element.Methods.getOffsetParent,=0A= =0A= page: Element.Methods.viewportOffset,=0A= =0A= clone: function(source, target, options) {=0A= options =3D options || { };=0A= return Element.clonePosition(target, source, options);=0A= }=0A= };=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= if (!document.getElementsByClassName) document.getElementsByClassName = =3D function(instanceMethods){=0A= function iter(name) {=0A= return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' = " + name + " ')]";=0A= }=0A= =0A= instanceMethods.getElementsByClassName =3D = Prototype.BrowserFeatures.XPath ?=0A= function(element, className) {=0A= className =3D className.toString().strip();=0A= var cond =3D /\s/.test(className) ? $w(className).map(iter).join('') = : iter(className);=0A= return cond ? document._getElementsByXPath('.//*' + cond, element) : = [];=0A= } : function(element, className) {=0A= className =3D className.toString().strip();=0A= var elements =3D [], classNames =3D (/\s/.test(className) ? = $w(className) : null);=0A= if (!classNames && !className) return elements;=0A= =0A= var nodes =3D $(element).getElementsByTagName('*');=0A= className =3D ' ' + className + ' ';=0A= =0A= for (var i =3D 0, child, cn; child =3D nodes[i]; i++) {=0A= if (child.className && (cn =3D ' ' + child.className + ' ') && = (cn.include(className) ||=0A= (classNames && classNames.all(function(name) {=0A= return !name.toString().blank() && cn.include(' ' + name + ' = ');=0A= }))))=0A= elements.push(Element.extend(child));=0A= }=0A= return elements;=0A= };=0A= =0A= return function(className, parentElement) {=0A= return $(parentElement || = document.body).getElementsByClassName(className);=0A= };=0A= }(Element.Methods);=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= Element.ClassNames =3D Class.create();=0A= Element.ClassNames.prototype =3D {=0A= initialize: function(element) {=0A= this.element =3D $(element);=0A= },=0A= =0A= _each: function(iterator) {=0A= this.element.className.split(/\s+/).select(function(name) {=0A= return name.length > 0;=0A= })._each(iterator);=0A= },=0A= =0A= set: function(className) {=0A= this.element.className =3D className;=0A= },=0A= =0A= add: function(classNameToAdd) {=0A= if (this.include(classNameToAdd)) return;=0A= this.set($A(this).concat(classNameToAdd).join(' '));=0A= },=0A= =0A= remove: function(classNameToRemove) {=0A= if (!this.include(classNameToRemove)) return;=0A= this.set($A(this).without(classNameToRemove).join(' '));=0A= },=0A= =0A= toString: function() {=0A= return $A(this).join(' ');=0A= }=0A= };=0A= =0A= Object.extend(Element.ClassNames.prototype, Enumerable);=0A= =0A= /*-----------------------------------------------------------------------= ---*/=0A= =0A= (function() {=0A= window.Selector =3D Class.create({=0A= initialize: function(expression) {=0A= this.expression =3D expression.strip();=0A= },=0A= =0A= findElements: function(rootElement) {=0A= return Prototype.Selector.select(this.expression, rootElement);=0A= },=0A= =0A= match: function(element) {=0A= return Prototype.Selector.match(element, this.expression);=0A= },=0A= =0A= toString: function() {=0A= return this.expression;=0A= },=0A= =0A= inspect: function() {=0A= return "#<Selector: " + this.expression + ">";=0A= }=0A= });=0A= =0A= Object.extend(Selector, {=0A= matchElements: function(elements, expression) {=0A= var match =3D Prototype.Selector.match,=0A= results =3D [];=0A= =0A= for (var i =3D 0, length =3D elements.length; i < length; i++) {=0A= var element =3D elements[i];=0A= if (match(element, expression)) {=0A= results.push(Element.extend(element));=0A= }=0A= }=0A= return results;=0A= },=0A= =0A= findElement: function(elements, expression, index) {=0A= index =3D index || 0;=0A= var matchIndex =3D 0, element;=0A= for (var i =3D 0, length =3D elements.length; i < length; i++) {=0A= element =3D elements[i];=0A= if (Prototype.Selector.match(element, expression) && index = =3D=3D=3D matchIndex++) {=0A= return Element.extend(element);=0A= }=0A= }=0A= },=0A= =0A= findChildElements: function(element, expressions) {=0A= var selector =3D expressions.toArray().join(', ');=0A= return Prototype.Selector.select(selector, element || document);=0A= }=0A= });=0A= })();=0A= ------=_NextPart_000_0000_01CC9D46.3DA66B90 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://portugalmail.pt/js/portal.js /**=0A= * portal.js - Javascript used in portugalmail portal.=0A= *=0A= * Copyright 2010 Portugalmail=0A= *=0A= * See the enclosed file COPYING for license information (GPL). If you=0A= * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.=0A= *=0A= * @author Rui Carneiro <rui.carneiro@portugalmail.net>=0A= */=0A= var Portal =3D {=0A= /* Determine in which webmail this client should be authenticated */=0A= login: function(e)=0A= {=0A= var user =3D $('horde_user'),=0A= pass =3D $('horde_pass'),=0A= parameters_list;=0A= =0A= /* Do not submit when username is empty */=0A= if (user.value =3D=3D '') {=0A= e.stop();=0A= user.focus();=0A= return;=0A= }=0A= =0A= /* Do not submit when password is empty */=0A= if (pass.value =3D=3D '') {=0A= e.stop();=0A= pass.focus();=0A= return;=0A= }=0A= =0A= Portal.loading();=0A= },=0A= =0A= loading: function()=0A= {=0A= $$('#login input, #loading, #horde_login, #login = .logoutMessage').invoke('toggle');=0A= },=0A= =0A= toggleLabels: function()=0A= {=0A= ['horde_user','horde_pass'].each(function(input) {=0A= if (!$F(input).empty()) {=0A= this._toggleLabel(input);=0A= }=0A= new Form.Element.Observer(input, 0.5, = this._toggleLabel.bind(this, input));=0A= =0A= //Hide "manually" on focus=0A= $(input).onfocus =3D function() {=0A= if ($F(input).empty()){=0A= $(input).previous().hide();=0A= }=0A= }.bind(this);=0A= =0A= //Show "manually" on focus=0A= $(input).onblur =3D function() {=0A= if ($F(input).empty()){=0A= $(input).previous().show();=0A= }=0A= }.bind(this);=0A= =0A= }.bind(this));=0A= },=0A= =0A= _toggleLabel: function(id, e)=0A= {=0A= var input =3D $(id),=0A= label =3D input.previous();=0A= =0A= $F(input).empty() ? label.show() : label.hide();=0A= },=0A= =0A= /* Mouse click handler. */=0A= clickHandler: function(e)=0A= {=0A= if (e.isRightClick()) {=0A= return;=0A= }=0A= =0A= var elt =3D e.element(), id, tmp;=0A= =0A= while (Object.isElement(elt)) {=0A= id =3D elt.readAttribute('id');=0A= =0A= switch (id) {=0A= case 'horde_login':=0A= Portal.login(e);=0A= break;=0A= }=0A= =0A= elt =3D elt.up();=0A= }=0A= },=0A= =0A= //Try to complete user email if he didn't provided a full address=0A= completeUserEmail: function(e)=0A= {=0A= var mail =3D $F("horde_user");=0A= =0A= if (mail.indexOf("@") =3D=3D -1) {=0A= var domain =3D null;=0A= PORTAL.signup_domains.each(function (d) {=0A= if (document.domain.search(d) !=3D -1) {=0A= domain =3D d;=0A= }=0A= });=0A= =0A= if (domain !=3D=3D null) {=0A= $("horde_user").setValue(mail + "@" + domain);=0A= }=0A= }=0A= },=0A= =0A= onDomLoad: function()=0A= {=0A= /* Add click handler. */=0A= document.observe('click', = Portal.clickHandler.bindAsEventListener(Portal));=0A= $('horde_user').observe('change', = Portal.completeUserEmail.bindAsEventListener(Portal));=0A= =0A= /* Browser auto complete detection */=0A= this.toggleLabels();=0A= =0A= /* Enable login is javascript is enabled */=0A= $('login').down('div').show();=0A= =0A= }=0A= };=0A= =0A= /* Initialize onload handler. */=0A= document.observe('dom:loaded', Portal.onDomLoad.bind(Portal));=0A= ------=_NextPart_000_0000_01CC9D46.3DA66B90-- ]