From ea9ff12efa67f4ec50e119098b6726b64e513b96 Mon Sep 17 00:00:00 2001 From: Ryan Bates Date: Sat, 12 Feb 2011 23:03:16 -0800 Subject: [PATCH] adding episode 253 --- episode-253/README | 10 + episode-253/paintings/burney_falls.jpg | Bin 0 -> 56861 bytes episode-253/paintings/crooked_river.jpg | Bin 0 -> 70576 bytes episode-253/paintings/quiet_place.jpg | Bin 0 -> 64136 bytes episode-253/paintings/tree_on_the_bank.jpg | Bin 0 -> 77917 bytes episode-253/paintings/union_creek.jpg | Bin 0 -> 52914 bytes episode-253/paintings/what_lies_beneath.jpg | Bin 0 -> 59405 bytes episode-253/picturesque/.gitignore | 5 + episode-253/picturesque/Gemfile | 9 + episode-253/picturesque/Gemfile.lock | 83 + episode-253/picturesque/Rakefile | 7 + .../app/controllers/application_controller.rb | 3 + .../app/controllers/galleries_controller.rb | 44 + .../app/controllers/paintings_controller.rb | 36 + .../app/helpers/application_helper.rb | 2 + .../app/helpers/error_messages_helper.rb | 23 + .../app/helpers/galleries_helper.rb | 2 + .../picturesque/app/helpers/layout_helper.rb | 22 + .../app/helpers/paintings_helper.rb | 2 + episode-253/picturesque/app/models/gallery.rb | 4 + .../picturesque/app/models/painting.rb | 5 + .../app/uploaders/image_uploader.rb | 47 + .../app/views/galleries/_form.html.erb | 8 + .../app/views/galleries/edit.html.erb | 8 + .../app/views/galleries/index.html.erb | 10 + .../app/views/galleries/new.html.erb | 5 + .../app/views/galleries/show.html.erb | 21 + .../app/views/layouts/application.html.erb | 19 + .../app/views/paintings/_form.html.erb | 16 + .../app/views/paintings/edit.html.erb | 5 + .../app/views/paintings/new.html.erb | 5 + episode-253/picturesque/config.ru | 4 + episode-253/picturesque/config/application.rb | 42 + episode-253/picturesque/config/boot.rb | 13 + episode-253/picturesque/config/database.yml | 22 + episode-253/picturesque/config/environment.rb | 5 + .../config/environments/development.rb | 26 + .../config/environments/production.rb | 49 + .../picturesque/config/environments/test.rb | 35 + .../initializers/backtrace_silencers.rb | 7 + .../config/initializers/inflections.rb | 10 + .../config/initializers/mime_types.rb | 5 + .../config/initializers/secret_token.rb | 7 + .../config/initializers/session_store.rb | 8 + episode-253/picturesque/config/locales/en.yml | 5 + episode-253/picturesque/config/routes.rb | 6 + .../20110213032730_create_galleries.rb | 12 + .../20110213032940_create_paintings.rb | 13 + .../20110213051146_add_image_to_paintings.rb | 9 + episode-253/picturesque/db/schema.rb | 29 + episode-253/picturesque/db/seeds.rb | 7 + episode-253/picturesque/doc/README_FOR_APP | 2 + episode-253/picturesque/lib/tasks/.gitkeep | 0 episode-253/picturesque/public/404.html | 26 + episode-253/picturesque/public/422.html | 26 + episode-253/picturesque/public/500.html | 26 + episode-253/picturesque/public/favicon.ico | 0 .../picturesque/public/images/rails.png | Bin 0 -> 6646 bytes .../public/javascripts/application.js | 2 + .../public/javascripts/controls.js | 965 +++ .../public/javascripts/dragdrop.js | 974 +++ .../picturesque/public/javascripts/effects.js | 1123 +++ .../public/javascripts/prototype.js | 6001 +++++++++++++++++ .../picturesque/public/javascripts/rails.js | 175 + episode-253/picturesque/public/robots.txt | 5 + .../picturesque/public/stylesheets/.gitkeep | 0 .../public/stylesheets/application.css | 106 + episode-253/picturesque/script/rails | 6 + .../picturesque/test/fixtures/galleries.yml | 5 + .../picturesque/test/fixtures/paintings.yml | 7 + .../functional/galleries_controller_test.rb | 54 + .../functional/paintings_controller_test.rb | 54 + .../test/performance/browsing_test.rb | 9 + episode-253/picturesque/test/test_helper.rb | 13 + .../picturesque/test/unit/gallery_test.rb | 7 + .../picturesque/test/unit/painting_test.rb | 7 + .../picturesque/vendor/plugins/.gitkeep | 0 77 files changed, 10308 insertions(+) create mode 100644 episode-253/README create mode 100644 episode-253/paintings/burney_falls.jpg create mode 100644 episode-253/paintings/crooked_river.jpg create mode 100644 episode-253/paintings/quiet_place.jpg create mode 100644 episode-253/paintings/tree_on_the_bank.jpg create mode 100644 episode-253/paintings/union_creek.jpg create mode 100644 episode-253/paintings/what_lies_beneath.jpg create mode 100644 episode-253/picturesque/.gitignore create mode 100644 episode-253/picturesque/Gemfile create mode 100644 episode-253/picturesque/Gemfile.lock create mode 100644 episode-253/picturesque/Rakefile create mode 100644 episode-253/picturesque/app/controllers/application_controller.rb create mode 100644 episode-253/picturesque/app/controllers/galleries_controller.rb create mode 100644 episode-253/picturesque/app/controllers/paintings_controller.rb create mode 100644 episode-253/picturesque/app/helpers/application_helper.rb create mode 100644 episode-253/picturesque/app/helpers/error_messages_helper.rb create mode 100644 episode-253/picturesque/app/helpers/galleries_helper.rb create mode 100644 episode-253/picturesque/app/helpers/layout_helper.rb create mode 100644 episode-253/picturesque/app/helpers/paintings_helper.rb create mode 100644 episode-253/picturesque/app/models/gallery.rb create mode 100644 episode-253/picturesque/app/models/painting.rb create mode 100644 episode-253/picturesque/app/uploaders/image_uploader.rb create mode 100644 episode-253/picturesque/app/views/galleries/_form.html.erb create mode 100644 episode-253/picturesque/app/views/galleries/edit.html.erb create mode 100644 episode-253/picturesque/app/views/galleries/index.html.erb create mode 100644 episode-253/picturesque/app/views/galleries/new.html.erb create mode 100644 episode-253/picturesque/app/views/galleries/show.html.erb create mode 100644 episode-253/picturesque/app/views/layouts/application.html.erb create mode 100644 episode-253/picturesque/app/views/paintings/_form.html.erb create mode 100644 episode-253/picturesque/app/views/paintings/edit.html.erb create mode 100644 episode-253/picturesque/app/views/paintings/new.html.erb create mode 100644 episode-253/picturesque/config.ru create mode 100644 episode-253/picturesque/config/application.rb create mode 100644 episode-253/picturesque/config/boot.rb create mode 100644 episode-253/picturesque/config/database.yml create mode 100644 episode-253/picturesque/config/environment.rb create mode 100644 episode-253/picturesque/config/environments/development.rb create mode 100644 episode-253/picturesque/config/environments/production.rb create mode 100644 episode-253/picturesque/config/environments/test.rb create mode 100644 episode-253/picturesque/config/initializers/backtrace_silencers.rb create mode 100644 episode-253/picturesque/config/initializers/inflections.rb create mode 100644 episode-253/picturesque/config/initializers/mime_types.rb create mode 100644 episode-253/picturesque/config/initializers/secret_token.rb create mode 100644 episode-253/picturesque/config/initializers/session_store.rb create mode 100644 episode-253/picturesque/config/locales/en.yml create mode 100644 episode-253/picturesque/config/routes.rb create mode 100644 episode-253/picturesque/db/migrate/20110213032730_create_galleries.rb create mode 100644 episode-253/picturesque/db/migrate/20110213032940_create_paintings.rb create mode 100644 episode-253/picturesque/db/migrate/20110213051146_add_image_to_paintings.rb create mode 100644 episode-253/picturesque/db/schema.rb create mode 100644 episode-253/picturesque/db/seeds.rb create mode 100644 episode-253/picturesque/doc/README_FOR_APP create mode 100644 episode-253/picturesque/lib/tasks/.gitkeep create mode 100644 episode-253/picturesque/public/404.html create mode 100644 episode-253/picturesque/public/422.html create mode 100644 episode-253/picturesque/public/500.html create mode 100644 episode-253/picturesque/public/favicon.ico create mode 100644 episode-253/picturesque/public/images/rails.png create mode 100644 episode-253/picturesque/public/javascripts/application.js create mode 100644 episode-253/picturesque/public/javascripts/controls.js create mode 100644 episode-253/picturesque/public/javascripts/dragdrop.js create mode 100644 episode-253/picturesque/public/javascripts/effects.js create mode 100644 episode-253/picturesque/public/javascripts/prototype.js create mode 100644 episode-253/picturesque/public/javascripts/rails.js create mode 100644 episode-253/picturesque/public/robots.txt create mode 100644 episode-253/picturesque/public/stylesheets/.gitkeep create mode 100644 episode-253/picturesque/public/stylesheets/application.css create mode 100755 episode-253/picturesque/script/rails create mode 100644 episode-253/picturesque/test/fixtures/galleries.yml create mode 100644 episode-253/picturesque/test/fixtures/paintings.yml create mode 100644 episode-253/picturesque/test/functional/galleries_controller_test.rb create mode 100644 episode-253/picturesque/test/functional/paintings_controller_test.rb create mode 100644 episode-253/picturesque/test/performance/browsing_test.rb create mode 100644 episode-253/picturesque/test/test_helper.rb create mode 100644 episode-253/picturesque/test/unit/gallery_test.rb create mode 100644 episode-253/picturesque/test/unit/painting_test.rb create mode 100644 episode-253/picturesque/vendor/plugins/.gitkeep diff --git a/episode-253/README b/episode-253/README new file mode 100644 index 00000000..bd6d4a50 --- /dev/null +++ b/episode-253/README @@ -0,0 +1,10 @@ +Railscasts Episode #253: CarrierWave File Uploads + +http://railscasts.com/episodes/253 + +Commands + + bundle + rails g uploader image + rails g migration add_image_to_paintings image:string + rake db:migrate diff --git a/episode-253/paintings/burney_falls.jpg b/episode-253/paintings/burney_falls.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8922dbaf380a19fc52825e5ba3a3796502cad92a GIT binary patch literal 56861 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 z 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�*xeJZugXUr!UH3Zhp=!30x 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 literal 0 HcmV?d00001 diff --git a/episode-253/paintings/tree_on_the_bank.jpg b/episode-253/paintings/tree_on_the_bank.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c77a37f2b9de41a398dcd91527be4a28965e95d GIT binary patch literal 77917 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 CF%KI6 literal 0 HcmV?d00001 diff --git a/episode-253/paintings/union_creek.jpg b/episode-253/paintings/union_creek.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15efd27e424a9cbedeef3ab6f7bb9d3ebe82aa3c GIT binary patch literal 52914 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

-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 literal 0 HcmV?d00001 diff --git a/episode-253/paintings/what_lies_beneath.jpg b/episode-253/paintings/what_lies_beneath.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ffd6747c6fbd9291142aa495bc863cbc8c13b8b GIT binary patch literal 59405 zcmbTdXIPV2)HWK&u_7{xfPjdK$Ve!oG^rU2Dj*`glTm62Aqvt184DmFGJp^PAu3G> zAySe6fn=mgml{ccNSBfXh>$?q$-L(}-}!TXobTHSxt@zB5A3z}+H2kST5F5HiN6DW zv%YC{6R>9w0I)~$0*Ge-e_BRE0ssJ8TYx4205}NPlMDg;D!G!}1t>{=0DxcK{qq0( zW)J<{-v4zS{ohS79dI4+%bq>|y?>FsC1dZtz5k8UiLDo+WK-nwmN?das};_Bw^;p^ug5Eujr4u2dG85JE9`|NpQQu2$G z)U52+Ik~7edHElTOG?YiKUP%M*45()#D>PE*0%PJ&aN-rJ;NiTW8>6s6SSGxx%q{~ zr60>H8=IV;TiaaT&hCG5?E&olzr~V#{(s7KOd{7Wk~R4Cz<+Y>`6cQXh=e4@r5 zdQ80HU)L%fd%XEkh`##OI7OV133qyu3M)fc;K|94_smCt(dd8h9;Ef0mbdic8yOFf zy}H@)kA)71a&NQqM6*T9IM1i*s^-CvqO*;|4{J?#5=a%bZ><2dd3Rcn87dsU7cX z$mx;04I%E@Z86k)IKHhI&^{iYl(#SaxsP+L9h|c0jjNRt1IR>I?+wt*35$d4o#~iD z>n_LojeRBA9V$6pXzl#sn7BajcNCiBb3skc>VcZ#NwDLW5IpMX9@%!(@nU4$LJqQF z>nCz;b(UwKyFYh4&qKw+`zd2>6<@%MLe_DpgXel^#urdFuA4GndWPV*zk~%v zzh-4EDV~ux63J#$FKyV^ep>gzRNG;0X-}6!)O07t!I`1HFl?Q$#9s{P0uGTCyr-f) zJM)nOHJ9AnaT>Ga;dLUniuhZ?R;V+T^+n_mO7{>0>XB{HOJndYZ$ocAACqU-D{qfi z4c6LF@=$@?T<;Y+a3en^{f>D+rOi}e@FUc}j}oLeR4A{^H0~>xP-r7oiqVuY%SAm+ z7(>M1Bg0zezR&WyW{#LNqcHH&>oaLf>)RFO{doT-cS`J6YcZfhiP%pPR_=`48pbxC z)`c6S$eVhmf6~&zF81I!J>6X77%V~zc;Z5B*G+eoC;z_jt5Jf6Xq+GV4ds~c-LDlV z@e87#A77+3HNW+ifnSW1+lVwRPI_F?*~n%b_vHn?i}tl4OO%*cALNvlNEQR`xP0rE zpQ;rD!r_8CT)M@@AOiWo&^gHC6l!-tRH0Gd3c8I8YVjdfO%l`1E^l;Fjqd!YoxEL> zuoB_S?s=*zRa~(xWe1#V-vxY=}n-~{Ru8T;OCnW~Nwj4?2S-;KkWArVyHwrJpl4u+r7mzVKAJabh-+z)DHj9uyv}(HCBXGuCR6xSc|0*+?;98$`psvrt1Q zDGiOXf9ANU6x(Ff#l-pSw`;D^-3a9uK=XN~>&M|QOwQBFk~&I8BAYW!)*|37VElJZ zpGj+Y4}xG^p8R@&_3ymC>QU*0McR;>TiFA$6DbnGV7X#D)~Dy%2(*Zzyb^FdVOtvX zLiMN^&^$@c)n$uTeG&MYa={e~xzWj`mpt7Y-&WIq1UZegFivd8j+0C+*SH(Ems2=tU#p;1>u!i81CVTg%3 zE*Zvj4RIkbTfE5}Jt}G?pF!)|y>7geu!X~Re;mgozg%^k&*mGokfGO8BhE0iq<74$ z%^Lq2DUPRbh6*4Bb$qHSfpK{M`AM6;H*4R z?3VgTdvt3UwPRB+XR~?B-n5v=cb3~~rXH)LOY;*psy{3aw;nwC1|3Eba-IEN$z{Y> zObLGw1X~X=#+1iD60OFbba>isds2S>Ee4oFJnKPFq}jveoOntkE;uUPOncij`VO1J zo^WCp!<1+))#V|arV7?_*!_vIr!S@Vyb5hY=|GiD1&wvsxDB4p>>-Q_M!9!;jc1uYrrzsQ27Hs4GiJYH z_3;hl_&^(53#>%`l8??ef6bb zRuHYg0vpOaug&Su;EDnCYTS*dt8OD^^gIV$^dgNC#mD~`d#)kX&gyh=g7`e(m6=md z`;uo9xP#=6boas{zb{$k>u`}twmnCtr&Q5bbeIGQ&5zF-tZKUPW=FoE*w)DR->#do z$@OJ^KAmb1+td#+ytUTEErV`Nqc<{FOyIpuzspUC?6MbeYCKfQipkB!_`RNouu~54LmitEFCndyQZZ>& z%6oRNh;QGFvX8qRrHQER2I^f#a}7%)Oimf?dS`XdGOxu|g`WtaHa4G%y6 z=n(7y2|oRAX8bPp(f5v=e5t^cNs9#d_hMQnvfW(i3K}A~hJBe9ae+zbJ6#>~h|T0be28wCCgWKlww56+ZG+ z(+xsQS`aov(?F;i59KjeN4FC>#aE0~8@oYkiG zR9TwXS0SVG2q}rl_SrG&b8gV+|4l(NC_*ygFDc)$P32W zH(WK?hKxpcmu!q;oL+Uh4cSUbsg9mr>v^|!AHQ2TUvBV{T2=cJ_qHIrf5%b8FD0(W zPZyV!E>vW%p|$$xQIdsFeFXh#adO#2AK1~@xmjp?W#-)&zuSOKF5O9x5RrR{Fq{V=sEDZ(+*-X)nLjHzO zRA?XE>j{}YG+dAMbi^l__6E&0dIo)%+PqVRC9=#B4*lw$3O7$|jd5Zk58n6v-P)_G zll^|>(DAPOs@WWg)q^*w$o0EB*yg*Lyo?9*Gq^h&c56@O%ufR$KTWldZzF4Wh&5X2 z3OO1Aj%{xZT?|mEK%C`YnY7zZ5A0H!PI+$^RG^;dI_RNXhmYOKdv$z9k@9EolmUJhT`2 ziDJm+vuXv8FqWkVbG}`x?IYcYxC=ov7y7UESBdP)0=khHaF~TVK5iB)Q8ouw#5x(^ z%s7!vGBIQnEJ-3787Teln+oeOf-u`VI$&xU5%xCL=&o~%D~N;VnE$Jg#L!blR1@} zvuzz`XX6;Tii$=ydtrPEi^a!>ZNpSs|FNcKDeA11Y|0PoyTmcJDc^7|#(V9zbuzSy z1BD3gxzH=1Fxf?qqOoVk*rZEy<%pU+XeO?24D7a%n3G<$*Ul4K zfUU&pFkki(1$e}c@0^sKyjQ=v=-bj0LYFMDpYYL(*G^yA@La|%m>Tx8Immxk2fgGD z4$_U-5yr)@3c*tn2dYsQ&7B?3!Sc$quZ@3ssb!i|KAB|cd^11{Kn9P=JQo2|mn=78 zAueCtR{|J=x7|H^8=T?I6r<@K3Ok>p9X9C7SL%*eVEAtm5$W22UMsFX(o_#~2jv&K zFx7O7s7v(BJ1zOsR)x^#IG57XWsObyQ0im9HL_cSokgb63I__b^q`ItT6gI3AauV3 z#6?X@Z0HpgZ8htCO+@Vu}#funS5a)1%zQ&zLy&rZc-Y=9EBX47Dt(Z6Ff zCVh7|TF;bzYe8dbGRIaBR~c+FYV?6QzNzv)plg7Xz>NLs^`hskv4!5dBI><$dAxcV zga2b_PVM{a`-TQ@~i`sjhOYMVm+B?RF?UGvpB=y;>N;jjUTE+`-f*2DnjaD>Li zxbnfdi?fxkJ_E6*>XzZ~XzeBU2Td=8Un!4POImVQY%Nw`;DH>LYcOl)5B5Dvtj!FB z7FXbTsDm-k&n?Xm9dKbI?2gtc#lN5EjbG6AjyEuTU49XvVOkb68#8MYH0=VP@nHY- z1U|k!CmOH>wf75mpWWggP4quHrx>>tIEnr@$K`hebI0D?gNw8TB&lwp+Qu5!w*EHf z64*_&yv#TxIssKxZ1&Ly9~Qp2jH783vHVk|+$8*i(J2P7aD(9M(IahW88ILLbO6QihCK($tSCtb=MfbI`_6PO39uNyro+x23$Ysv}{{M{63gWL>{{!20Rb6 zrJfr>TSKbzO0$L1V+GvJ_HF?vf?)6$!kuRkafLbeiOBa~czK7G(-(q+$q$(E7QijC z$T(gw3q5BFPNbzj-$f8S3c57=4PIx460<v+|gq!@TJ}fsUw|0wEXxf3^XHfCeUDRE% zd|Zobm{q6Am8I>0Urs(75>kn%faec*Z}wnxfs$ z?uhrHw}pJHt+FD_&N?I60{S@#%XcNEcmB10jI3#8Lj-3{ZmxVUsra@j2Aqg~06I2F z_z>XIG!+|){f<4_Yu98a?G4p4d-B?%6n@+o z75PPgr6BqE6_B(*dQSCM-ZgLCc8~ZmEVkXkvOlr?(qy~DQ>8c?!H@;Q-A>AhD#FWP zjfnW7{P<4&IfqhEpwrIHMVeb0MKB*j!Mej*0v!NaV3>q|K|ehq90 zf^mU2-l|jh{Q{Ve@2vax#B&*UZ{6Z=*a;pXV|BNO$!P6e zyWFYrJqCwPGp2Eqn`klM1y&k(om60-hpqO{?bOZmr)7|fN0#aXni_}uGCuYnuNn&3 zk?;vgu4*gl>bmHCv28dU8N3@@^%5JzM5~iIh@78?pF71=`MSKUL2Q<@uH?IVsFb~j zZ3i~nnhYs$xtGxfA5s!HAH;xDlqu_(1T|=QbQS&chtE0%GtBcXq!45D!Q&^5wYTh7wz6&WN{hS7inFkstu1lbgM22hC?3+9Y(!b1`rcW?} zMppJJ->$Jek;e7WW*~(<3kHls-Qm@qS08uAUvr_Wkzf(rS2y%XnMm4Ie?H%Zq+7+kV{WgXOEP}!^w z7{V`@AbTvAr@j^P702E!uROX*yApT-mRcl{Ny9;JEgXkKWAay*%)Xir}V{`vdZA~$_=B@AcUp47T+9@=?Pr|6_kD&Yr} z?U?kOyEpntL6q@U#f1@jok+KmI8PDJx>n2i3jYq0I~L5iH04n^AB#&u$d;`TsFxwc zeE*~h`KcP)kU{NXA{Wd9O;)$Hoj$lOL?yk)^D<}pEm(`w7nS)p4{lF-!Q*>L;Rrf% z+j^GpW7B)*dB|%qK-mhvLM|`Y9vvcNoc~0s?zA&6h>yH(+!|k@dVNbNoBxZzWvIUJ zKv$$kMq30zX6aykw zEp+!yEH`COTYsWY{Zp~jNjgdOoDqiT)CFEZ%V!|tA1Q0q29t1RQzQuwYSdj{tEL&3 zoqpJ?9-bS0>kxlqLETQuOK_tu=rQa9YnP@%_Uj=v<5+b_JlHa!gCT7uyUupYo$HWa zhnnOy^R@fQAF3!p&O5VUAWNek->?ImT?PfEga1Ws(v~?Bw5rQ`RS)&#X^hsb#0{J6 zf^oALL;CHKk&i7Y&y~ZO-bNFkx}{nt`eJRnEEJ=| zL-Da3*S87%pmj$#ou6s(%5zECai!mWY}^0alwP)4!KRNt?qnD6ySYH>V>Dgwdk3Q} z4Qph#VVG}_M!hl`QLI5f7l15C5Cc&2;3i5~v*4!p;ocm9?(Ry|O{|t(XN1Yk!gA2l ztpZ9Ct*r3=gG__bM=Mpe6Ls<15bsDKjgt;)=bly>+EVfDIGC?8g{>^MDi8jH0U7Ba zEu15Shjk)q-c8{OP8XVCMTw@M{+0t@D6FyjwRhwcD?gRJM%&N&@9X(K^wW8XSu-mY zmmVsK0uWSeLS7hQgW-WJ-l=3n`GLAbThXWvU78|U18Sqb>UoVHS=q&10B=($KB{wu zWWrcvNzbP{l`ENs!W`WsUDvy0Ba_EQ;jP0>2C+*YGp3<*#(M z_?|(yfQzsbcPi=j7GRco#OdS0k0A(i=&z2~<6%+dJ8_|~^L{ar#QsGIFkir)KHDE; ztD#_j5q+CiEIOnyN0C}KqfntFC(j>ZT zlbXv@-u|{uCYhzpUcuW)sph>SyqZu)noGhTnceSpf5YH`7!Y^bcNlwJrrCXl3znf? z9nH5nvtd9PrFm({4)11Z(x z#(%~8z%>UQGV`*7C4rs6b9B_Fgt&G^44kX+JtQf&F@rOKa|RD`+n|Kc>-G;IOH*6fnLi zmuEo<>nrmAMbuL}Kc=_L?9*NZm=^{;F996P;a;_53V*)${~% z2ATmPE#vfu*xfCOQeQ&(JeroBQv%%mOaI@>>KTaiKWn`9< zwp|PQqLtJcigt5wma{RFHt-jt1`=eIkcNcZ}$rM1aY z5n*+GM$BjPn-qGb+THpg6?qoe!hvEqDBNGwVcymsW!^DaQ-a|jiEgn~FlE(GJ&IBG zw+iw&r%pgdm(cZ@k*dc%mTMZ)?h;L17XtWfkr4iES^DEQIvDz>y{4aY^;e{BuW0I_ z0{3LLhBSeoh474m`<{B(u~=C>)kjB*_K5mn4%%H)r_UwY?Sw@daUj_%F2KlFFf1K` z6|%QMlNgWW^q-rnf$yf^vY_25iq=Ip51r&n-u$2Xaq{l!{O81e(Ut@g$c#U}a(a=w zHXI|9VrV3Yb2S>j=qRLT&O5(PdO35q)YhiSC9A1q^LbP1?}LtN!rh+|gneQd5jbn_ z8x!@&>=?_{CenM2At6*XK3a?3RTCmz-l5oS)nB4do6A#gQnhiS!SII|U=_5kSHi5n zu67Lk_3{4v9MDQ&QGVy4(;vYbCK3ckIdo=7Stu3e=@rU1+K?DlU=$ZqnEe^0@X2zo z%?StGbo4AI62}KKsm0Tf&6P+n&1C$;Ct8O>0l#z_bzFCYiELoBjy;KjK6>wVOXu$w zS;5EQxrT=aBpD@1)rxO`FjT(Oe)CfLt(epC*0P0mkiB0i5|nc=TG^iW(14+`JQx*q zg04Im0DUZ4=}_2kxz!2!`x6*))9x4jOLRLE%0#{-SXnZJ%Ly#THZXUC(&3qrXyTFw zeJ=&%!=^(X`Fvg!qL9-x$$wLitcm8{-5_U#`zCxXG+dhJXw!vo!2v#gllOAJZ*qrL zhf{X>#n=wr>tjzN)MAqpzgfnt7q^GMC%X7cAE2An>;R(sgXjseOAeZK8Npy{$57ME&P*R^;e@c51d??o5Q&vIOaDh6H#nWB zpJH2=0$H%O05c88EJ&cb~p6>BWS`AeV5j86DhQvg_^o z?yAsP@>4Kj--HY|YJ8nX`Ka-?YwI+yiP&88Ev-zypX@0=)hsEj#6{e9eR5y%T1hF> zl)j1tc-|HopXYz4u&(fc)2pJ|R|L!L$xzCElCXv8)o2`4=26U_Q&KAQBF|ZAqknOaAe@{;^7;U~9 zSALm{(|tYdQRP^ym3GRy?J<t zUd7|jNK1}3Y?-ipt|TamgeHOCJ7fFhdhV>RJ93X!D%;_!Je5v5_)WDG1guEt>+{g- z$~Jqf{8FM2nSy1vZ5OJAa?x#nhH{TZ1f9dgj7#gFAI>~@LuO2ODI0PTk5q7xy!;)r zNWE|4PX32%3Wz^bqG>tj-dmkw6~ti#&O`T`YP0R^p+KF%9mpdQmkS~_)v}t8A~ZrZ zsD30UHIm~Ib4&zp;a0Mq%nFUHhTdh^-ArXFmZEzz0@&MJq)Oo6#-;i3WP$p+t?3K{U%Ovlfor2DVV)^j4Fp+?ww%0*AK6fGX#m2NCcYNtkQYRp1S?yNZl#eNI+K zcJj&nlzvM~yMlR~=N_M`sShoKt5?U{ZAC#lyci&A#bl;Ln1~>$Mnv&6DV1(su${-)II&;DGZTj_F7$0Dbi#m{bFcI zY-p+Svg|iqb*r-s{Q}B&eZI8E?`m*^3@g`(VZBT68JQMCJm-QRJ?>+e6zp{pRar zXkM1K7;sLflkTqPQ8IL}D&nB8q#hzAz%&2SY`A(;Bjd$gEX2B^$CC$VMkz!YZQRWw z!68c8{RR=_{k-etJkb`jl$@{NzY}msR6H+fxDW#-D+$o}8PS~=Sfif49y*fUG>qSH zdH>FKJMwYSft{mYwy8ur{nw8d?xbEZxyQ>?@A_A${22{FcQ&ODlu#mRwEpcLBpumu zFB;iNI4w0kM?y-UA0Owiz$WU`y>*g`P-J;Vd+g}S2JPA$`yA#LxpJ8{w(uG%UmBWS z1%9OQ3NIS}xSh)Ht+@MEZjL2LO)%adA#RLHO)MV^T0XE_`otB)gvWNopB^3`iTk`* zi(q?KHDL=S5pX&3g;zZLtSC19!iZn?12-QGs5dtUXzBk97PK*hUbL`Qn`sdDI zC@03B2&*`wy~o1Cg26`0#X^Q3f3)eE2NjCOEG8aLX-@>yxJwGEvbaesg;3o5pvN7| zxx)!EP`wPu+@uqQV!*WPr-VVD9HyrN>i2?Dh z#T_$+m#t<|YevfVMB5ibiSh4&Mjak9$=W|BmPV>r+SQJ%_F?#qD*yb}&_5OeWLq`Z z;inQa+F_xcPBsm>8+HLZnmvMhEiEmUMJHcZ3cvI_K5dn9E0g%)r*SV-6u2@<7$AiU z=I0Ddn|e&667xY^Xp@}rphbyRq*C&$lHuZ1Tg{k2G<;B{FNG*67F9zXHag3z?8u^c zI<D$gl4&O!?Y1Fq)xMrq9Nht`Ek;CTU`vM|;FE=C3*CgY#djN~Q%1XfuWDc-xr&4l z>9&O3DA4+a_Z?Y5rV^ZWzE#nvs<&iRoGx#m>V%%1c%=1; zGF5e=>OgJu^|>wF-w~d9T2)6YU{R;LwNVRn(J*n^`WuN?QOQHuCEGWq>;KRN&2`dl zhyh+CNh^kr=l8;Mz4nQIV`?#q3bCI_zFx>W5i`~Y`ym+ny&u?4QIMzgT1$%VKW{%j zl5Q~>KPqBPBE*0xoC)5{T4fw$jz?hSf)4vqK@;>^1FK;i$+F#3FP1#umw{>(8_E{u;^xM&y~5JK3^1 zE;*9QGDUegT`Sflttv+5G*_NA+%9Pt+Jo!k_$Og{4~@_7eEa#(z@knj?DWp{PV}M2 zVnAxFH?u3zAkOB{xxCDf@`5;BZjPiP$nb<3ZAX1wvp607(-Q$6DmSug zqI@6=*DElU^!P+Jz~!K^=)`7N<*i2{>uHO(%WN|1t0)}m5+5D*vA1%fN~U6^=+Y>& zopiUAo1-#$<`nuwzUks5tZ?hBza%{e*w#)^@>T2_L?5)P@*@6BNL->{`OqEXJr|>^^~p0!AFyV5_6pJ7Kptu${T-}JFSzVE#TO%mk^;l=>n*`6|udv7KQ zfBW{VBiDo_J`%A0iTD{LjnG+lMd>`dKWm;KM{S1A+FIV9?w6ZiS@m-+P0uU#t|Te2 zFF)s%x0%R^u;#$%&8>ns#+T zX;UEIg3cC5Rukg+xJu$8C7W{!Hw5fN8EGPcsYPe)lN1q%_x&rD4{Yx0KwWFBH8C zgR|fkuXOC_qq}6^->(bejMgxj!MFsveOSdN0^Q}+&}Xg{VPstoKM{^UOy-{-(XPh( z{`v*o4cBJ%;BEPlP-t1nh05);3l1l3bTjx81;p$9dO%; zVchzdBt3I1c>3V5Wm$GY7DYg=3d(9vWkfBCww%{r6@Fwyqpe2`iZ9dJdkIW(1kriN zHDPd@l2o^K1%%&P{a7{BI(cX4CZTsTp526I;DEF^H=mG!!)`I*@gLZKZw-qsyqfL= zzW3`t;rfSW=r`=9uxEmt^t*rlxci+b!`j*bQsiX;qr>MJWG-D{rl&Gmq3t(_iy`aN z^^eoJxx0}&X5$Sah3u&H(QL$nBGsdol{|Et$K6jjt%~pq?_mqQPzyGxF#)cflT*wP zjUn#p8e&}P-v0ihehMt0$bL<6dvVhemIi{%5zzuXKO@g}$&QlDH=b@U_MH+?7$8 zX^RdKx8H*dY>BsszL2VFLc1{mRG|RJZ{)Wd8J+fj=beRQI1gPv`svgB%lHxE0rzq4 z$ZOF$#u;2AvB*1OfJvYg3ry#@6%vl0?Gmsz&^QSC>9niD(}uJjNfkJz9vdgbfT-F=ET&&3>6iW-0SjluHqBA?;h{^%Gse z4n2atfF+*FN(s?UW-w&I-)_#uwM*l;X;S8I4s`Q z*mpRe(VG($pQn-8fk8_4kM1@mV*{M5>pLnR_ot#1^S|<9|NZa_E3~RAua8~Pry_B) zo{f0dzt5-rzJrWWn8b{8!S_d8fM-xgUk%VHyrzj!gt;E$;;2z?jRLaeDzePh94D|T z^$d$O?P!r?G#h>9A313p{Ft#SH=`5kE5FpGK==f^{hm(bqa*9)Hnxj{DQY2hvrhb+ z#wy-khi5ic?YW%lsUE(wg+wc`ndU@Qv`KP2?4B2LnZ~w?>adkgd3DK6WPj!w(9wts#%+$H7 z!wCx4DA*{@NWkNwGT3C+dye9iw|{DB)W(yd!6pfH!rLdY?EQJ~Xi!v2U_`CGX4@HIt7H%87D`x40S~D8 z4}$P&F{0+!dzt91Lc1CH6u!msu1+%2-**-p?n=14TI&_|IN{QfhjQ?o?K%ZXt`{0O z%T4p;4L#6F00tY*vh4_-=6_7~&s##3s@vUiEG)q&K7KA1-j1Ohyj~R@JU%eJ!gm|> z&E4L%Wk8)%Kyy?X?m5oG{?0`j#=WV19T^fJ*x%Ts%+W&YgPF)0u+c4z9P3Q1kL%mm z-EAg)=#=csC1AyA%)1~Z3v{uM(Q|h0(gRH^i@_-yok0`~5)>uluQaH2p#Ngc(CXk% z#&4FzL1iPiUfAdeH?QuEsfzp$V8RbXD@jgGJk-I=h7$)+1D;m?0dxf}=v(~OSlYu@ zhpY-gg#4ypMs30XmZN1c%Q_62)K#gadY_K*jb$1qaq4yTK8CnRk%nhu++URUHK0V;b zGYY|d<(a@&$epP5?@SdXZbBTzR>lJl4xu!^N}EBZuKmPD(&pM}@tv4=bgRX|vQoxB zBa$qGS@S#}zwA*+Nku~J6bi5ZIUG{|Be4W}UOw)D+gay{MpPtsCo(j61FLo;>36QD zSIobZb>v>^5MvL>mn|E;+Tt`?k3^65eYBWXNye+{@^7HS=*kQ`ySXj5;H@3qcI-JqW8AM__a%MZW1&9 z6azFbm+^AJ+j*ET1}$N$9%G^Gh=OENV@qafVF{l##-2XE5m^&BdtjZ?se8l=lI2bB zmZS+lz<$4JzHd-As}|V^)}Qjkmt3yDjPGO==DQJe`dN~>g7^@xNpp|rH`au+af8*b zR!j3ueH{y?%G4OPYPD|XK3Pup+m19}HM2S1ev>NFOuIMwItX}5GpdizAP;g^^GBQi z+zci|ds7q%1ln#;tFt-vn1f@5;6{{-56I+!8St0x<|fHL*S2WubZqX^=Aw}Q;HCqs zHSC)?_u`A$qvWGC==S_p8U(9ky}B8?6D4ULw3<1S``&Kf&1AMrBu{Tp>1%v9Xstqz+>#)k2FD&(Q zA=%HHM4>Uj`U$;AfL-Sy1N%5clQXmG3gJnyRzC+ONor1cY=hFkwaM)=-?DG4!(V-G zq7<}}|H$Zh=0nU7N?&kC&e2xky95|%%#)AbiIN>@^{o*DoZDt$FJ65`9x24(1ja3L z4$d)ist>o3hY^SB*IC3zMk(`X#|&E%^ouXy=Gh6tPFM_hEuJluVo~29TzNG(gpTn2 z*4Y_)=f=&vs>_o;kZf8^|1TKC&74$>liB& z*+P5*M$b2B!A`*}3k)Lj?}c`^X!n-;@Ymv^(f$rE@9(3A59%hITtTa3ceo;tGJo=I zfTn1sdVS9L#qSxuf=UT!oad7)SSveq?i+!H=U6h|04q_sH?Ub7`~CG z;%7RrB?g3&WRiEirq4RcJ>Sl>5=e)e(91<2K}6SNIqh6jhH>??&zv1;{Fv$jKPUH6 z?>BeFt3H7>(Xy>=tsKnCMiAH0OLuU)AZbEY(kmT-AvCm%pe!eR-~ZTb?)wH&EVpH> zv34-M%|>cc{+72kM+F#4M6A*CW{0K{l<4c?AI#*&p4+8X*gOM)G! zOTI(VO>RM(dHMZ`WsQ|}jB|8Wx^o_k4CXIDW!g`lxIg0$GdYl}7zmBrWGva@e^^{1 za;hfiMzzKI4~6JOZ&ENWvH1kTcjjWYeWPdqb=O_P72fg?%awB#&hz_y2KFXx{G6=A4&8GIaneWHpj zd~BZTG~=OQ=Gj51tr~VWi%t0FW=;WbV^n z$!nTxla0w{RBeXxYa}h(E5)aE(d}WSZS*zQxdjv~ZZv$&%eRW6mldu4bw{Cn`fygS z)6EQ98!Mu|EkudXK^MeLf7-H>n*I=9`n?&%r&e{6(@>PdEO zj93Md5IH$v_bz@@iC8=1z`OsNGDt=W@qa6x$;Tl_K%crzPf? z%-8Rp3mQwXEm$2*goKCnz0eJE&24`pieIe5)k^|iHg{#U?wzuQ10yQJaw#dAYQOnN zxWFGP4r93_-Eo<|Q&rBZ(ABkfbiys9i()Ym>L{9_5$iKZqat zS@GA<8UFERbaWZJ#WS|(4Kcgsiu07S%J#XBUgOiu>w1bzL4Bx&^;3shSuWAJx7#A{ z`lr;Y2cqA}jvjIi6Tj$H6h!{ZFnBzz!>a+M)ITZn@T5a%!A9LD4sou4NiAXkFMlx? zWMr)0fp>PeErgm{JRf+jX?6Ezb>i%5`d+83?c-ddsKY(Ox9Jl^B%X@_IV6Dzmq?LC zkOV$!s{mc)E^4d(JZqB$t>Drv{ksC9~ z$q5HnXx0;6K_geSeqhY!{}Qou(f_sDOylYVd-onZt6(YrMqd8( zpb#ZFGzq@cv2k~x$0>K&=OAn(SanXa7!#{Q7Do_&ZWyJRT|bVv(3mTgB;Dehwtx~= zASZDB4XwGR%2#{R@80#HEQWs%76zPRnRPWyhykB1B4pBIyVtuu+s_mld9@^#h=!;U z@ET77W5=(u8}FW%;|g_sjkw600zLgOYH>>NS3NP?ZuorD$V=D-My;*#ssrof}kw)H|(C8Io`*Vgn5uN5*R^^;DSCe;HDo(&ez|&kD(UoU63A~ zP+E~x*!D4aq?8~E3GnRvi&5)SwLYsS$DaDyn zMCQ(i2@$Km692u)e*pH^sLtZ%!claAl3fW+pYm_(`kEPM`Y(7>CNBCE@;zxh z$C(qmcFz(NJvzx}M&7?-x102U^{Lv?k{b0|HMYjZV22EzlbhY`#9CCuo3kp;DHjl8 z%IU|;B)wS?7R)d|edzCTw}2zD9s1dfcoXxnvB8^(MkfqKqI+4l)iX;oJrmgZwP$uh zQIX>lj^0x{Jr89JWWH>20n}m3>2V`N|62{vXV(p;>1nTJt7k7{oA>nN{6*ebKWl;6h@`O(0F*DtD%J%aiGuw@T>Di_Ki=yj} zXESl*z0qBDt)iv48dVgnS^KUvijtyckSjGKQhP;m*A}%84MlOSRU$S)NLqWVT_RE= zb`qi_Wc2s`{`2{SB;N77&+}c6>6h-=N41rMUq+}%>LHHO^%tt6xt%*Oc-6o9?4U!m z@?yTKnpdR(YuWI91^+W3n9g!a`}`e->S_C*9%G|j7XEB%CMh9V3_ZHD7J!{Z6BO8coIm^l zu7@B8f%5OPHy1Ths;SAc^UNH7!Vyi%v$xl)Jf zi>JYnh0zk{+FR{4cMAj-YlJM)f7gk_RTXt(dDNN`)VFsKal-9L$Cc8LygaUB&DRBL z4dYpqKIb9Ykr%LelYu5MINg<5=bXQRlBJrA!7VcDIaGu6`L<3yok+$U^b*h6w*!)tt)>Fc`^kt!9jpT&THc)(d)#Yr}QF zX(P<0kt~T?l%edKf1lyvAUU4ZUz)y)?xgOW+V5@CH~eK!F!=y=aa#)?h)_ZaP;x>5 zQ{c|Hc}KWKO>-mx-j0X%85)i)8?oK^xAK=4-$zwMeu#B|j@&=q3}2v($V3rBH*$wF z>9^--5WUZDb?0E_USAg-ZSz>NAC?!uoP37ohYk}5ZL|E(V$S6Lw#s&Q5HOemgSJYO zkbcS`6wSah`fL}-W+9P_;Sz(~scl~PnJmxSdcsgf|IR9U)M z+29(O3{V-~`M*xIImksxEPg%*z5tW78uwZt&&pVEGQi{hF=%o-k*nv>Hg)# zuHNY>9=+5&D+g2ZRu>P{{0fz{@4j614ehxPuht!mT$z6H=^E0XQ>FDb#AR`5+BfLz z@=)Li=;Qs(^FPnI6qz(Q{;{VP+)nrRuKw7cc6MNy;1L#uN!)shSH`yf`r`z~8|WQH zh`#9OJ?Cfd21!5o*gvrX=j*v?zX;PaS6z8XT^!*myQis0wXWSw=pAJ)hU3zQ(gSE* zNeBhP77mp>J(0RtC+0Q~;g4_DsKnz?QP8{z%^F44Gm&uxQ#hHYW=$ZvlF=HDd08Ar*C`=b@)~4i?(cV8Vfl;Kv87PkC*Rj<| zPy5;5i!97IZkQ>&u^yNnm%a}Wc{;Nqi*X8r>g3@T<2l}p?kW=vrKihs61tiX~W+pG~QoV_?WIO>$MmeCXr%IC#BtH~JN ztwf*cv2VmqqcRxd-DK6!fxX6{feX8zOXqLbsW=AGHr?Gmnw`pr|4yunH}eh%borkA zmT2n5U#Y!fyb^3_H6_!(N-Gj`_RtvLdYW4#QIu|COb9s(1lcrKf2q- zojw*ZvDH*$Iv0ldR17TKaQoxT)j%>=a~xVIkT+}Um*yPKsEPrX^1n3uI)~U>rSLtO|xV&t(DKIpvA1hc8L<#vFnfeEA5u zKdTcZB%7e`T~yW=4FA9%&6tU$;Jsi~SUZR7^SMvTX*c@A7M1p{xV))%at6!DwbPQ( zumQjW)VG7)`*8xq{;PU;V>VFB?0RPVLqPVb?ry#;c)4#WlJxM)HwS1Kv$P-w!0OUk z^}y&vA~IVI)PQU>ekv~Q}iIiZ!T#6k#?0X%`K{Z%GpR1!Jrh@Js z?Y*lUP>KpzfGwFq_xN((1b22^@4gj7PT1B{H@6O~V5^}Vv(xXH>$JXI7XLTZ`SUjU zpou0ok=gD$eHc;fD0`*Fs<5eQ`$|3C8PQvw9k=9$s{a|-rmWK&*SoC(pVEre)M>lbQU@iwf0?7kk zu=%$yj|Ykmx|hV(G!s63t&7Zv0Ygk*jQj6tH!*}hSAu`e9>)2UJwx2x%)mX%ixr=9`#r6hYOLe|^mjQsOR-t82j zRU7cJ@uf3>TCN(-a0t&R)@dq9oG;u-8oBB(_m5;Xh165sR3tQ%EfnV1-BP>PvlLpc^vI$}h6G6&T)gz=}M3eS> zmCQasM4}Z@LvmF-N2@7sGkdg~5uUd-{^k3I##>h3K8}U?U3!;WwEHha-8JB07Q;*o zwR129W=k90P*+|D9c@foPg*l&!e1!k0rt&7 z7c^hqy|1WG6D#_5bj>&E5x8dWCssC5zu;bHwAf^VgEzF9Njdef^lMXJrG{vamyeq9 z^gLAHR%%>j!q_f+&b9G*(|rFVNgt%W=Q#P7kB)7Gc42wU68_Ji64`n!FA~eIZAYui z+`;+2HF#ZI3Az;c^5@7Pai@GWndij5W^Clp{eRwrc2+@J585>mG1V2z?+~N8OI|yz zV+QzF4|T2(E;cx6{;^?%6x>CfbShl15>m1$A(=p9S`80kwT(0tWHM~)=1FBFbmp>b zwj(Er7*x5Iao%}u-YY5s=xYM&-V;u!pA4obaVcHkwi9X0+0lJ&jWXs_K3but`}l(L zy=Bh<&w0bsY#DQ_v--xG;Ma~Je+G%6urGO)#en%iXwENs#dTCJ!`6YUhMqGz;vWR@ zrS`n||6(rYe;o3C;eaC7eNA&)rQs#g9l6Ncvyy0b>U2KNQzziG@k)T>ob<8g3J7OELfaOwVW z;zb63On_s+HP|JOrD$N(vF_xNr`Kv*_8kwmEb5tVGJ|a6VOU?K7h?(Z82z85= z+n9@-SsrhUgq6PJ^&}Y)xe!32&An1|_%Csf@p;6^f}K_ES18v3#`t~jzpW|N$V+o) z=!1S%qw}Q}X=Iiy;iZ&Wwpy6iwTDZet>ADw>OBYZ=2YM zK{=&1cqyy6?%sr6-+}Pi+RAp{8Xook@hy7YTD0qRQBQ%NvF5i)&Z%Cx8Q$(BL(_6H z8*Vd2yG#K!W-mwL0_~50JHC;!;KJN>Qdm}GPMEpN3tLUBo2eo0%r44kS&tUsz5RsN z?C0?~$6UmdaoOFm#M1b+h#U`Yeg<^534Xz?YehcxvSp}O{?1kyLEq`6H#G`TJUr|5|8FqRu!h%FN=2ozf{=_8#cSffO z>+ntnXA%dk=3#k2kd)Hca)1oxs=e;+w6e+r!LIPb{Vh=iF<#*{2%@Ubv*^%>@)2QI z_5d0}b!upjK@lzg8u7xo8h->*n|9zFdi8?I8r){T98%cgsZ*H*dA4}{UAcl>!$L8f ze{KYNbK&!mja%Nvka89NtLh^E`iw*`8vV3YlviYNIE@NlvscL7y??HSOr=-HxHmcY zIe>`#k+AJjb&Y2?!E6J}dHad(X3pMzVC+CqD|kuKLXoNUgxVh@a+vZAaeZ6>H_)e9 zBbPS&FK^sFuEo8GT;uZQSTe{~!*}oun@>}V6w?99KeZD2Sn@u^TY*-31x3tg%lgX` z@|AvZ>9nS;4%nh2De{_#6EcW@0C#^tEoM9;^QJ3BA0Nft&0%gGeLMc?-)B+D`a2^; zhB``EogK-AI>aiC9wntV*?dpviXuu+-#7SF!htaCQ{`=njHhS^0@7wUd;{7CaCj5y zl>!~5b`|aGAM4x;u^IWr80jV55M*bq_RF>u$>(rroUel%T0FU%{iazIDGRe{H(x%F zj|{I;i%q+=^beTbyWXZ9)IEo zt68R7I7oxTBMFFuZih(VVW z^5bMPcX6r^Zw2E`-jOgdSn(B)HW~q-SKB_s?)C1EQXG=s$5feSs*%y+ato0GD(wUEOhF3#GX~T(qwT`micQj#6KCk~ z<{fr1xA4aPr$&n_-26j+504T9E!ku7pmV(D(|OD@WIOr}tSP2T@+yBIKWt}rOa%!j z^RO{w2 zvY+&cDr0(@eWl|sR3AVs#%nZ&zTqO=z1s8u-Q@PF(&JaL({dqYdAx69mmZR&c3!So ztV*YWEt^ye(kNQTbWNveXOz1fCLEo}9pL#xx($k+*)Ifz%R$aE+Eq1%SGd5MUb(?1(ygY)u z_{r;F8-un`N%`~iu_gU4pI}3`bJdjWlwE9)pQD~&93Pu&?EDeiTRNe<-rOPS8bhJ3 zM7SL11?4B){Wd68keyRPa`jb`J+HTL&lQ7sJw=v8?U3Z0&kbVO6Ib&_dwz8f#q$B( z#Q(+p?lL%5<<}@-8T;7!S!S z_W1opFoMJxy+C;N-kOnw163A zfVcNip;eI<Y|CjE;(M;4QfJC`F>|@4KM-F!#YlAx&KtZd*AoCtaxdA#N%lYVH}2CA@RuD#PxmDd`&)I{r~EW zPCx9N#@TDhk2B_t$W_Ee#~i3`;L$eyu2b}z4YPR@1;~e4&!V&L>c|ZM3~XDFyh@z$ zibD3zid;7S>NfoKD15S~b4agENo8wIPG zzRP78{y4$HBwsUqqA-y$em2JP%9%UwBvxX*BLDgAYSPOd*of+zixZ$Rr{f($=u4${ zp&!s-&P%w*dA%?8h{O4Dc?yR_#5+fm*K;-UzXXO;x5#x*3nL1M;r~q?4*Vh_?hN#2 z_FE5fWh%qu6wP!DGQpS}Ib!P*m7SE6^`!vkJ@fr8uUgGMq^OMq6|~P^&l-mHLkTI= z;VA#LhY$r+#MFRez=8(HeAFNNg&75Db->d2VUcs!9Pm-X{T1}HD!FTnt!h+KgV&_o z>umDHF-9W>{GQ9KG(@{Y1pDOn+e8<&=toEwSKe?ruj|SQJO5N5+l4oX4gRm8@?9%m zY?J1ZM!5^Se->zMzVNTVCL3=H(NOJEmG-Z$6(~#93f za8!py=>r+DhuP{ZMTI_e0j0}Lqt4_?{t2cvB|mujX50m0yYVxxDqeY$W;v(p=Gj*( z{#i|xX6MwYk|!-RzNHg>%CH6cJl+=VJK26`M8_bvKuP7{T-Nqueeckrb@`dbCNRSJ zraH04WmK7J^6x!i>)o$`3=aXKk+p*R?f0Ymc1Kb0oR0H+Eb&~q%2P~Wl5hV0i1qHy zecom=tGHtIZX1%Obv*H_J<}4`|0HR=wk`Y2Z#PVg`R7VCUPqp&ken79{Cww~!_>jU zeoC@ip$g7c5hXHPmdqxDvJ#~@(|@mKW$ToiDS-`TjFfdONUt~ID}oN)>dnD zIR0tdvwHz+-sJQpvTN~(VyL$wrK_#z)ce~~VOM5^Wy?^Jqb-7v`t3AY3Is(nK=r&{=Zm;fPvK_x{l7c{U&^FM3#GWV7f z3qX4T@Fl+DPP<)kS;Er&{js%CZ2c+YIXv%pSzoWRN927A;6rD&N#!cl&DJO%kPS6k zS|XTs&y)Ze#9XQl&qFt+%rURv&G&n~%J3UGFN!(S#4^`;SHH`ZiVs2>*m|1JB9kq( z>bgBp>P9iVq;ieR?f!c;fSX`wyXF4S6TO14!eZXP`kRy(E3Q$Wi(qv%;p2=5sf1IF zH?&xC_!65dg)-{l_dp|+Y_dlWT&^7=h@UNm1pUNSUv0)~*`&+pT6tTNhC(D}s1IjT zDRR!clw9Z)SRm=rj}tRXs03c+5bQ|_APLLQpwRW;6#-##FGsQ!?8!e)tbYKIroU$; zPfbyW$FzkxvlWI!Ol*;(!{pf8d?Y;U#|f`01L$MRbfu_RN@wGSyB_(ONtk?QL+}W1 zu&9rJp>cP#$WJq^$+Jq6NoUfYkylam)0370E?9GqznbsbrWj0xqUv*A%X~rkrT^@& zb=V2T#|BbHp3D>ABe+1uH_ibtWYMxX%4J1+wlN*Hqm)PEn#poF(VQxxcSGCUzTyrC z3p7lCh05;m27B9UH*4AY-}&%3$@kGYLDXlHh6^;2)dhm%C}mfdQ?z_D3yK{OU?s?a zY1%dp89AfQ>&YR3%$x`ol)(;9>Uk<}&OnyO<(v1GxELDjo$h>J?04C9jy&g1a#qsM z0>^s+T?Yfp;M0ODmfhqZ6wV)CEB+VEqkSAqh}hHSK)RYcNWjS6WpID{;S@~YXekzI zk+c-veAvt^<*Rn!gJ(zF6?Yeq;#1c&eGl}4m|W~d)M7Ms`CP`(k=Gd$RBogga#1_r zU=yj)tuLj#kP{6X?2%Ecd5e8sHN>0Yiyhf56H`@zbYKTO)avFu34Ur~P|pVd8eln$ zrcl1Jn~EMyl_N>_yW#6$uHTQqVp%9gcD0gyD(%2;`F7G%INse_$*3kN#bdTJ`fY%w zuG(7SseCB31My1nG9;h3MR88gnxGt?xHFzt@+M zDLqa>PWfrla~%fT5na(18kY-PB2tqPrO#@_uh}}RC05;;;M-`bo;?4TA?P+I?^(9M zv%MabFJz z#rf+xlP(IfFaCUyT9jR$t#9mJB_4d8;d8VZWdu;Dfp6ap@_h#KNk@ST#6*$HhdD# zaIr=IJrLP%JJpwxX0g^-+Vp40>%KwVlqvNG|LiMx@{VWohbPg7aiXvOzWQAQ8@N(g z)LCs37<}(jd6W`feCtY}(X-)=8RM+b3tN<(>GD~)vCr6>ek^Y*Z#7|1{?GY}g-!&a z#;kE)&`Y|fxxE>${aGBxs$}oIi>3VrOngd(V8nWau=dvh{*M#91Cu2+9p~?_C&i7M zAKrNOEP`Tt#@#abiJn9gHfAX%)#G%L<(=2dN6jb+4=5E6|t z*<6zKm#Klh3zEjC90KpU7S=>i$=o7E;uv^QI>9!}>Sh`XlQ zd+D9%z0*52E24X8Wh#i~S|VVnGf5wG(8Dpjd?>`Vn%C{{U4|{&aoG)Q%trgDBvftE znxU5I2d@`<@y~0Y7|i)TS-SQ8uBvjfWg7?&C@GPR2;JrLrTf=}BLWsE!L8?OgqL22 zW!r<=>WzlneqB@o56LlqQytnb8$&C7K`Vx^2FeH2D_bT%G)@thBUWjs1OEy@D?^F? z)HZE6rf$%-5)z;k!c|1h@DEl`1rGzZg~Qxv8+qxhbUD>*_KfQ zulPkul*jQqVa4E(i)^>0^EIOE4^FA|Yo8HwGm+xy0Q?Z%Nc6q+`wL62NvyPpI~3f5 zf}U5#PRbAW<8%353rMT!9mx4cH;{FEOLCX4;rl93Q^cdbP!N$F5qnUh#Vdsc-Y!qD zo@vBQzQ<)+Vk}Ksz3Xw_oZ;jqyAYbovEq^OoqH-y#AvhJSKUKGZa+>a3~)ti^Hi^N zX{A>9hesz5toCVEEgA#L)t@am>r2F>(3-Q6aO*Fcm?J8_F|IJi%qeec8r3$K-sD2O zhq$|}qoEu=@h}`?qKo55Aqiz)3{~BHkvEE5CsYxdRqn(bc!WR+p86HAGyya+|0kBx zg?N0Yd4;(56$6~YwvlAh=M|9P!j`V_osD^8hpLDzz6ao!uE%g8yJBqmiW9ye<~6*` z^ESk=58eu~VK*GcTT%puB&J`QV6Kve$miOkQYfEjtvOzZ);;x}`NgKn^MYa!gPmxo z8cFf$xH2nt)vXfU*ZaKGF54z+4RFc4JQn;Z0c&c=I$&P~><)<^@Qt;9ie|_W`^WG+ zSkQcRRr!-bC+?CsZivWMig5_d`n)UD{v*7GAcKPte@e~m#(AEJ8GUOH88PFk=gy19nmdVMy~yb7{&#J z2?mN*AbZ_pUAMJcWE=(+Tu;|Gh%I&d#Q<+w!6Jp-v#v?ci6psWovo9o9NGON5$Pso zNl*J8Fv!xU1w2i?O_`-};%uB|=yCYp4Sw6QoKIQw$|#;=}?}VlJk)Gj2d1Kru_3*tGDQsgmNPjM)V=zaj+C?NQs<*eiE4 z-XVnu1*bu@Yat`bt&4w{fao*RsdIUnp`3bU`yh$shlxV}@waEP(NvSmy@sJR^1>>f zqGv5>IZJuYf%aK`kXDw`6!O}f(n5P6Z21WwVyS}Rx5pY2J!1ZzN!|}Uy4-QP6L}?r zMi+lF70{R~x}Hu899pYk*`vW;i0~k}Ar-qbTpu?~r!XL-mpH@IUHt96gZ^z0ZW-2$TBq=eAg4vf1=xW&DGXCK8VZ zG?eZ!dpY3viM17u`xwW>-a(E@H$)vG{g0{$9gj>vKH?UOmIr!IZ1vCg5-xQ#&bCu7 zQ8tg`7AWexB)B%5bFn`kdd2uKOPld3Sc$hD-TKi9J}t+&4hpCy&B%ox`H7oEE{y!X z(8tEjZfVFCTV_8BiPN!VS>DZ6ag6QWdzi>-riWW#t6bHbLG^3bWR8&EAEmprS-)jr zsDWWeQG-*_#D4;5sF>^c738)kxmq!@Ewqx^Dv8*vUf2BK%p=;^|APdcvCPA0$_(=Q zQJXAtu5p5_NDqrd0&eu+|Hgfi&GXC=-<>01zK1~MFGjx?)d+T7FzX;}4Kz^8lX@Kr zd^tKUH>}9-lzaipJP5d*P>D+a#Tw)d4E42XLUJ+o-#4pe%)MZABy5b8_aW`{t;J{7 zMjg!A_XmX7feN$Chc7J}|87%$#W&*~K$MWj;h5s8@$w?h7z^oEw5uE0;JfP3XnrkW zPj%PP`Bbv@;r;BFL1BDq)WLR);yZ3{pl+d0>=JgEB;--Vu#?`M^0=Hie^j;eGI*$t zNUmPwbOn5AD6uB)ij~wmo5Wss=_Hp(F~|S2kFr61H9LYf-&?=Od9m(OxRrOI4XW$* zix7Z0H|5B^;IgwkX1!K~JP&INg<;mdKpm;cltpoaTb;irQuFn+QSH+kOYcf0y$xe_ z2KP4CoDHLd_R0+lI|>~DBvP^a-_l`t-M?r~J8$b*+840WtB@l9twVzMcm&5pp)tzc zjA`-L6tvh1AC9`@;&@)Us~B7XVSVJBDqdr7)OAsH&TW}n;gdG%@h^i#Bb5q&oX|8q z)*zV!dVBviJ-3@t)n}i18ADhYAM1Kc;OmX&YN2BMX%y#J=)W7Gp6V&}yItT%ItI43)VX`dQB3o5(BrucaimzsoU2hVXBwU!!+)UR-O)0GQj@v^OmLkHmgEE&75d|QM=ptG#{^N9&z0bGUM3x|?=d40>U zl%T#Vpu?9xm*7MI+ZhX$zFIQ@nJZeM&L%WbTXts;Me+|hkq*lg0YqqTT6LkkK_A{?fKJbCP#txIaG&4VQvp9$7kUP(^gXX zF}Q#J%F|o>#_K2#(EOMwTU_#ewX>f~6+vq6?JfGa}Q;>I>ncH4^gqnxYdGk!E`K&`V;LP;u zDeF=WTXy4SikHdmd!Zxhy@ac^OjZ50MAFEVrzx{Moys>LlF5(@W_!4vVh8?oPEQ3Y z=t>5u7k4Sp+a5g!ju@&Vz}XV90EBT!nc{-JF=Tr9O7WVwG)w5m89^CZMgx-O9KoCB z9|YDX4&E$sEjJ1`TSL)ob`6YtAZY~I-GH23O7lO#wb;&Til&<|x*2ex4F11&gEpob z+U*A%3C|FQctk_-$dG0C4tO=<&IHy7S1se)Q$Xn)V*Gg*M{~ z?Wf1GDP)qLK=~=NYlHDUHMw*_!h$=E|x{wb>`^ymMW!M zf+kD$XNL>v>w|M#FeY=iw?ZnR`U0#j^C>HL`{R^J{QC>uGs_BdD_=KKx%L>0Vv_#o zUgC&t(cK+_a1!g&$Fl8i7le8@M(KeBaPBYDjSh+F5iE!H?G;oCoFKz?^$(u2x|mTm z+AI+MoglKzmw`KV8sRpc{4J=#l z?e|TwvnV`~`gPlVQB)fHI!-qu!d7P`z5JSm8b|&ojK9Lu&@zRpn)9iYmi&=9J})Ff zo9POY?Kw;Zd@3>UbbZeVuaE8<(K+!5qvF1h^HEw~Hox@fYK@F?n(2IMBzd3guT}f` zS1tdUyLF3oN49_+3<*3EQn&LZa?Dh*LssNti7Seg8Ee#=lLtZ4R|Bb6!{&$ZjHv;S zB%|Q)kC2vw)Z%(FB?>q0WgkIHUdQC6VNNoU)Y7J>ECTKM%o=7-Vrt74b;XJUvoIN7 zNh9kdtS(|)cV>k?%a3xNPftZk&p0FQWCH5|F5u^N->+CY(jwK6fgX z!bY)QGtCyyp`SBTzl9x!BaLm`O!01pq5fNlyDEi&awsw7gJD#cKzkB!<#z0&1cC?3 zT(`uGt^BE_aYoa?eFWc_M^>CfXPGN^BcUp^Oc;toC#b4rr#TuT?WPV!guvtNmY)27 ze*My!R7umgesHk`&neInh zfEDQy;t_vpvJ5vZ(=>haF3pJ=TPx48*qUaBZraDWM=N*llyb&`B>!B&3uw(giGiQ# zo`87=>8EmyI*S;ydYRPaV03^P;w6#@w_aa%NO!cb=SS1 zccX3>qsgKa5XK5XzAbLS|eHV@WUG(b0*2_(%f$s9) z+Ev-4MPsk5)vrx0c>^6yAlgG|^Sk?Yfj9n9E;O;p5Cy(;bZxw%zdIWwc+dCA7kwpY z^tG@K3uQge8g7Fhz$RX=iQc8WYSe?DHxVA8qDhLF^4(?%3pyaP_sF5P8&ftf6972A zE3v~xasME3ck zZSk4~{;xIKGwtHS*zO&zLG=#Fjy`~Ez4jebQPME^drU4m{D{U91=!MR?QU%&*m=1R zq}wpj;X<=fbfH^%x9P%QUy;itTuUVGHCMG+fEr%DYcH-EuUlQ`XV4p0zToybpn5_B zO7x07xzwSiBhwgzk1rs7V0JkO{{otJYLNz{1y3};22?{EivSX$5Bj=bj;L`07Co8795 z7}GZ=G`^N+>(GSlXCwMK?!v&rijMiH!8|*vL6xEVyTGVb5sQpkTq-c|_;GwDi>S%s zK&nd-63>ANTADFwRb8$O%JoEfphZEp(gL^67nni&4xuA}m%N)Zu7sj#LQI4@{vzMo zf0sJl$W(8n?W2OAB8)N9?0fCq$?WaPK)K0-^Yyb|@T2Wo2YlTcgRyg$L zi%|U2E)T?o_qs=&q9XM7!ps9iSMyJE8l{A_BPW?P_EM)B&whuE_e-G$4&!5sv^iHY zxME-2e)7wb=VkDPvxawP)#5G~hbs6HMSn|_^hU8naE(%lGdZSuU_GAL(X#j zJgb~YR>D^7RlbO!tIe7Gop5lh8F{X7B_|m zwJ@1ns5B^b$El4;|X zwbV}xLtQrJ=?W?TsOmfA=Af^`tsV56o+}SYIlQ*znuCp++g_+ku?6oV`J<%w&Jg%6 z4a7h-xspq?<^xL)n{roDSLRmXi^+U4IHyM>8++aMMoZcX4~}j+bl4nqXDOuCR5X-C zMo)-GQo80}$TgZ1oEW0eat>e#>9May-cX4<4<3v0yDk4bLq@z5bSNHXpJhJ*SNZm0 z)*(LTHF4@bdN?wDDQ3GlplH6I*uIEgrZn)5bEhiImaZ$SrflyR8u;y1_Okwzw*Q(m zK{EmPEmca*4K_NY)SaEZ>~>=wrPJOU3QGhux|K-jT>(bC?A_7#%N&L(*tcCAG>mybCr0~6y}VVDo1j|+xQ zR{!7OqVPRC#}bck%pjG}))+2TD4(k?L$TP+Bu|#1O$aU&v8J2{{j+{*K{x2z;NzEM`MOjbRB&j4`MkN(Xk;$LPj2&`XVYuORkYGCS8-Eu75&x zk0Snw2q5wLaw7OI!NvT`JkM_$(eSjUauy(NZVRqk zk8ZQYr-dD=5FYU41$THKj#9dF>b84t1*n961M0!&tLET0yh13bR5W&X`)}t0{)%=Q0tg?EjC@%z8o?)A^x5J6iZNmW8d_~{g1>8 z)p&g#F}OlGXTB&zYZYiS=rh#sUj`%oyl!iW^PJ?WzwekSQgEVivBMEVkQ|Sof6LGB zOP1H?ZG1!o-?7eHQUcokLTK+xILGa&fJX^I|G%|&p$uJsg z>2b0wzWpHe9dK_o!dBn(HQ%S&aoT5#QqYRTvm-n1eg8Q{W?8kh*!;TpM;||0tGfb) z3tY{-Wi_k};~HrJ25o^5cZnBs_OeNHr6J6y6!aHow#P#6#Nq;tFU!oKqdFi`Dev#6 zG)b48wf3SC8{Ju3mP6+9^pL`CLCo zVNHkRWxtP+4H(~Y6bB74|EzBusttPAN*tcZLreW#ZuFY|jI;GXmF$f<)@o2|hs9pG z{T@wvUZr3?AUd2|4x!@)z%JLC7eDZ9(icd0y5pB+h5H%=p?as*``62{e#FZjd!Qsq zaq%}3*mAwR^&!40f3U9Itz;7^6-jNHm1}8_iiip%%3!_yqGJn6U~*ND-a$cIWwXjhFd^l4>n*(hT>E`9m%!w3u(EA$yA6d1Yc!)Ypp?x{bTk|!xrz_{IkR%ekGpO?KA zAvzL+9lFQnqSag(xUA*R^%@^Z5hajq=zo(tG-a%VUb6U8StI6z#yo@1bTI33Lk@Kl z6k*!d9k@I*4!+3WAYvZ(qHIRmA!%ZQGzdS)FmD(kxkk=Ue;m}4k*fWE!i z?U~}x17%XhSpiRv=7@7}`pi|`?U=3S4*k+AV}p+D*ofFeQp*e!Y#HpF#W9umVod?k zKZIkJN1HGsFh9Z9#b2&r57A)YXg?v+%31!P%UjW-xDu0-ujXN0xDT`=6q$bzTzG4D zw7lF};GpM?whE^1S%Li_FjBaESGaBBI~xAzTWL-(r#{0?`pG4=Us`k4^t2FDo8PjX z^|w)lptgPn6L^5Mx|Y(h8W#qB9SV_-rPT&5P#C=VhjMtliJJ@kDv>CP{=YSE%Iq8s z={XfI1$w@@w)>{=_bJb)6_fi!88C8ltGax*29(Du74aiHIa;ke_8KDT9^tY{IqPn< z2q3pF00r0oM9gb}thi7sx5sl@rI%X`@4W>W_nC>H!(2Y(FkkosK_KxvEnV`!oixsx zn*6o>@q8&Gi)zRy^20dnyL^Brtz84Q;<&WTbM_@svzu)T@5)7EmLjX{C$yp*13jNe z1vlh$)_cA}cW`^xIs~80yf-GFOm2wngAs!((=YoCt8L$m;cwwTt_kZPg{BYBRo8vp zQ-bOHgeGOGPUOoU>!H(r)oW{>#|n4dPFM>wB3BTjM_Q#kq_V=dct794aQiy3LdoakUqRH`bF@RumHYC!U{st) zdxJCkAhukv(HU&+&$pQGPY$U4^Kv=a-lemHJ*~NuhY;JjI1)*E@3b= zArc4wR;jRPFZnRMy*1tmadJ6UkxqBc^Q8sS(Er!;#9fBq@jOO{yTJ-6)$+6VfZ?qT zv9v7VH^dgO-!zRb%je<^S5S2<=$7gkgm80KS9nMy9@xz>4flk6kHv7xew-+LMCqNz zS95Q6v`^fe3^Uh=;W$6_t#&avD&sSNh@&NY`)k3ydJ>O|ZEe;J!9Z-*W<*lP*4_AK z5@%q|A@O`5Ab^}}+mqh%9pBXZk6FBLYxU!VY?I>(@e}+kTSf07jmBu~uv*?njf;-p zS{(SNDJ-R)rV&ZzQs&?mlL@|+!+Kb+CKqAXXZPYwvwEDMpNdmq!&1@p&FI4hx%egk z7Bg$TOHTv$@_M=gfl#Mb970WoFY`$G^xnDXvkR@uz0%z zQ~P-%?pfb#kM*BW zcwd`ro8W8Z;ul-Wv+k}mv7Re5@tvdmHUC4>SOVlE-0+5z8{*QJtVhHSrm=zqwP(Q= zNMQ_=&*4Yc4Dk=Qj^_av%iGRYmYtRV5JT%FGI@PRj!@0m#1%@K z2>%SBb++A3cr`j&nmE_ko53F!<1X4)5~gE^ShgKmhe3eJ>P@8Oa(qttVr-UkX8-N* znT9_KpVXP*c_!a44%OvQVU(!wS!uhJsKlDT%OyNeT9Us{(7C{ZF`8=mYFezSa+x!k&LfdYG#<` z9$06@leCE=GvTgB zK2|cXr1VA0WW*2C{zLG{ybo&_(4eHgT+Y8uOAgBFPbgFRT8x;%_wy11gVfKZK>P5- zeY7u)rpZ{Zw$5^fC+loVVMzW(7j!yeuo)W>=dArAo-|l9$+QAi$S4^IP>LUywj55_`rc(LA9l|}Q!x)ZCblLPojaIy*V5!W5#M)v8-5SwSq-r^ zj}fIfql-m;7gv~G4P|OC% zcs#%&-rOECntxzh+b1CT;#n!Q)Xq$!gV$tuP^os89cyh#Oaj;ol-Je2r+mbRSz+Y7 zcz8$zykTc`*aiZO@BTlqIAMu}a9G zKf56T;Y=<6BZxLijf?s*6Hk$g8%=sN6drlz4?42$KTCza2=qb=T$|o60|m|Lep$f{ z^pClJw2bZ`6dkUoUDXFAQkRhB%A3j!3cI$P4{{|*zu!-fVqa}fF*uG<9*;I4hKqa` z^tAl&IwAW;K)s{jW27foFY5c7Ah28udCSD4&?dA?@5S1ieAf!Kk8>3w_`A>YG-J1mY!mnwH7{x&HJN?Gc-O9h-2ymRYQzZ2BnHo% z@nMh6CI`aT`2B5#G>TsldCvLpsKX=mz{yGf3O2M5UJfu&ig5Xk*GL25NV07v6GG05 zpaprU%}qXl=R(<48p%-q z{L@6nS8}QDs9TS+%Nr+X;oT#Eq3*DJJRIuRXJf^D0=OJaN(%Wc4Xfc5BK6VC7l}by zMLf@px=OeWCiF`Uz%eU)CJu-gqdlow`D#6#vf$+`>(k>JX?Zo^Z+)1>?qnlm-OYO(hX{eoA%$`Y4?fcMr3MT)5W3&SOD~Y=w_Og-M|bv z0f!Z!KM|9xZ*VvkJ^H1}_4U0wCvy$8?IJ;pxKVR3B9(MLamP{sz^I~ES)8<~Xej?}% z8QtIkVRcB@&tL=6x-5klM;aX`0h*T!Kw;7;j7Q0Lwr%lGQJ3eqNBWW%m~780b>9MW zX04ltV_7qq7pOalc)%cHpPk5Teq9~r)H&W^QXeh=h2_jHXqK#LT5!?GK)DW#)=VuS zMOd!SqNBfAoe8~$d9iE*umhn@nd1gBNv#%rW zkWF{WUbAn1N9htAQ$|p(-P5y&_@&Zg`R1mHd@kN&Gv(a-%lDEehxo&y}DFD^EMT=A9GO zyz-AcEx&BQ*yR-&am4rSjXvQh%i>hQ+G5e!U&3y9cK*3`M+?fT;rt`DlL3vWxtBCm z+8wUyBoyVgDaS8h^#l$Cwwu#Tbd7&MKb0Nm@5adm?6vswv+4M7v^opM!#u&W7dOA@ zMVr5hRw-1X=nP<$r}d)5a_&$&t&+=V>7yPOrEju)0c$t7=fo+h_rg;TuOW#Ycc%X& zuxlKZN;z1ARC82_=tMnAG0T^z;-xy7xmrai`C76+RG7lXbg?$fF7tkT7rh)Od{$8) zNeP?gAx@-Df~Mq35ekRBVWc;L$s&f{IG=G))vtj<%O)*FOq*HTjm!?r&pH<3=&=z; zOXHl#OMbxhF{G(t-NCk)ipl*OjlvkN$XfQ0>I<<~VZwQOJZrO-__mE+(8KUmh6SqyhE< z4)jQ-t!0*fkIG;WygUM}BH8&eS@V?Ogt5{BgBy&22$3M8CCLw_rAL} zhfDQS;>?A-dgifJ0e)4yEQXMz;~f8^vJRt;pXLqhoq6hIjbwx8k+jIHcn0E}MB*1G zPDYU>l!*K^ka~8y1>sw6S$5Eqt~+ZFw)hTWa-YU&5t$eAL0M?|xn==2y%vG4@(#XGWrcR^-Yc>S%7iN20q(yw_ zF9{uy`s{8E`@8VY!5vE|9r$u z=SGAI)S)^UA&#Q;%9d-pms^V}tK6hH^^;a-f>PbyBUx%d@i1#XzMVlx@jU$o^HC)Z z*F3u(Hz9^`NbGTNFO87ibIfUeIKzO*Jha1B{YBnm$PM&F02k=+c>r7jnz|95kgbG6 z-69szyW$z=F>k`wzCb3K@7wej5wECQEl!<4-&3U5+h}Mgy;f^Y92*(dy1~*z)dHCY zuSJ<1eq3~3zbq@=MR=LWzYGPbt=kxMknSFTRn^(t*|~!?`qW6<8VAvCQoo+3cU+B$ z4{4m9vKk~d%xidl_;*i$Nbf6rg9tiSZ(AGs)p@UBZ%_s_M8@+L$W_`~J7OZqaZvd; ztonWT&j7dd$K;0mli<|i@!-$Kh{Fjh5Mx_-5dE6p1&Cw4K=SsHO4&72B9G!lND_4Z($FGmRI8$JywL+`M?OrvXsd{xIbY|BE4y82gQ42Uv-3 zCF6_!mqktu2@lp5SkTc}=-oIP+c73-t;wZ1mg zeQ`+I2`=yO(|A?gV^vCd#Vu%D_R3i6ORF)@yPB91V0@Jl1=PNOyQf-zEdq*K;{U!l zaD|nySM{9YMkYWwIHoOs4U!yNDb=!+Zq>|8(Im9pV~MwLXKW8WD0Bgry48POp~f7O zWjY>)wpeL|MX?nc3V5F<;f!aufCKj+%y2sgH`M+aC2Xx{1ddrGv__v z80+(G*s%8U?3h#E?-e8sp2<2t1s0Of2N4|7zJ3T=22{$(8RK8i&v?2=AS{4Mv#%J=awYhiObG+fz0Y|uEkJ6M#=Eo6kQCM)A zGwWq&)Uh zDQHTp*DJMNT!*Xwn(0xJ_#1i$Pg!YP20!!C56IhymO7s8hn1|HPVv6Ay%bv1G>YYg zCIPrMgj#0#-A1DYT^txmZ|2U(*f_}U2fUF0^_*dc(EtxFIZHtsUZpcA=Z@wu|AB}s z_`m=MPfG$yowkp1{WU>2lXI3~vj#o@6v`CY0RP>Ty3edcc8l=~QQ>KsZBdi@2g1Al z1i|f3Ovsb$X5EcO(=3ZExW1Kb6z~b7SEiDCK+2S7hXza$T)WonoFJ(Tp8X6}Td&@< z?d^NU@tlb|+4a-PZ~(RQOq9L$FO>2z6NRvf5ZXY6?-%8PEnzpS-NWz8_1OqCu?@)Y zP;X$M{BL2jt9o8Cnm(`+BT6k10#LEi4wE%NL(;#A(Vfr|qepkzVdQDkp;NHL${8v( zd2LYPiiJo`|DK-%3WQr1dPT2JnAmE3n9b_+p`>W~j1hoV-Yut#B>c=46fND4?(|PN z-a6rbmTz_8H^P=ZNBW)?FC=?;&F4Pzc@^>OTWgE)C&}X0Ss+v-Ea3OX21H=opH%fe zVY4u&Xc1y_&B?5=<}+>6^5eMY3}DW!4rF9{EdfD;6j~>#e(ejZxu>M#z#pT_Gnzoz z`q0A~dP`-gg49M;{!Gb9^*RPDbm-UHaStqi7d@$eFq-H4eI%jyHlQ0Gw3#NYY67wF z7oq0aq=5pdI|*HhId62@c=nY&xo2{#)(vjRc;w=cFH&EMMXzdK&hgi zi~Nke2BSNwizRP4Si)&lGfL-)*0xRQ?bg*mz(5;9mn^-yU|@9nU8q?y z=sYrIRdC%8Bc!t$;{>~1P7rxl-7=i1mWUQk>u!5!=fJF^Fe z^^KJ4Fg7x@nQmS=*B2$kjn$5sJPE(vO^>P=LqIBzPs#t?!>jVJ zOlbw3a|s|1`n1#2Dlfe<*f(ImSp|3&1p@nM_%!xw)rAL@l@G>pJ5pb+s@i1yc*#_* zJ!ZP9L`F9Nco{2%#&1rLd%0;o>1@b6AOpI)Ali8eUxA9x{k-%RPC?Pks6jA6DjPMy zQk`{L&RP5T_;pJ^dAYIs{j9n3pP#*@TG+w6@kn`-r?y;^(@y_(I`C5BO1pTAEH1IJ@=&eg{bo4B!+vltwmxM7Z_g`c z7cS;z*c=~kNIkncv0K$)eiG{4kC10Y!zr==o8b^ z?fvf_pVXiB>n7aPPkCKefg^|BXw>kq3z6g#VK~9FjR0>cvyQeprLycPHvsahQB6EGL0)MOV`+($ zT{}~Dc2sVy)!G(O+K*nX8UvzFI4G>Y3l^qtYzE|TYKtM2(<2yRNt;<&XgQ1DDs*||3t%1Lyekjz-olV)dw8A5q1I`nDKy z4YIa0wN~&1bO=kN#p#q>O}Hn7(2;DlF1<6^`>C%Cm#KUeZsI$mnJiglNP}i3XwyL< zle&i&{gsF~H1+ngvJ)K4=E?FopoL53Al`7Nd?j2B^&9Q(eX6W;E8 zo7rFW{D}0(DZM79gc)8`R_Uz1yX4{N75a*t@5%1&wQ*K|E2|u zAXKlMYsvPKAx8|kM00NO089@cf9H)$8pFo2b3uxwcJgnz{YsmL#kDg{DV}r9sbUiI zqr|6^CJ5tMQy<40KDAP&!5<@+sw<+8*jk-L(e&`b2;mjMoz3#Bu;W#TiqMktr9mN* zDk5q0jZ@%^{4-0M)RKA`^@9i^vFpVqKzjuY|Lg|v(Z77wzO3??Fz+GqQeKeQ6W|kr zsGb0na{;6Ui)Od1H3pW8=B{REJ_@`!{LZV9J zfMyZRZ~_q3MD%>R-jw zvtSYf_pd~pefKVb@AIS;62y|Mh))-DCYGr~^UOc!E`%}VW6a+q*Zl(PPlWNq+d<{@ zcU_+(42CH@lh)mY5n;at3?@5EYKV3>2;wkW!dfgSWA@^>s-A;EEcQA-UOx|0Dw_~f z!`bj)-j81$Y0&0Ycd>b27e2&9&SBG&On1CP>Qwo+Xp#>4$u{cLgRsO`m(HpPSBIU8qN7!=hpm553A5d>N z8W=#7PTFP!&$Iz+nK({+3hIO2%nQ&20Y%Bng6XCpy!Su zz+;gvarolU(Sad;lmy^(=FIr+Nrd)W`SiU5$!d6$Xg6h+NJT=N_7~Mant1?re1kKr zxNE>IT(MW}aF&lj3;x}64VMj?zt#Eo`l``y z)Bh}zBUK^AY_HqK_~9)nD>;5(a0{KdR$Wo!vtE7y(;pX9zHoC`5X?Nu0l2UUdd4#B z7nI4UnO`szdT`sh-LDyVJ69x7+T#!&u)@K9K7ZUWTdf@&Txv_mJfi4nlJ`lZH)qzD zM%+&!Y_hk3yYoBw_s>ejA~pFwDQHs_mVw@9mJ)ufBsecX;Wh0_-`NT&jZ1f&2OsY{ z*PAcAl?`Vu72+YTp8wyw%A>K^Z-i~-{MPo^1of{E*;@^9LtD-0coB)-4K~N0@v;UU z(~fy;aqrj{u}Lp&9}>P_njNmC%qkODwgKd|-c!2tQp}q*H9r_)8vn+OZRi9oefGjm z+YW)bQU+MTY5IRLbkcKDU}#E8<*_$pTDqTK&ufMv?>#u}mTLvpC(|gSuksnmt%v06 z&X%GQx!)fR zH}8i17LjX4qim%NeDAnAhqYGg9!z<=UZkR;%e3hR9A|-hg0C}!&mQ8PYC?9FcFN;^ zPjA1IFbpO=n*96)N}j^KrbkiK#_oycU|~=aqrFV*LS&prVcS%DBsVK`taO z%?2MwM500M#Ww%W=jBgAyNgTa=5GbvJ<#2z882~`nthR89uFWV7C_o2JqkYhwaxf4 zCof?(HkcD+)V`ntm_&KmIVXiuegjSjV&cIn;PU4goz#8f*`HJ{9q4S87<3tZB>qMF z8FA;V0SIPC&LE4EnM(+c>xZHGSwg!h!*3eRZP{o*oc!+A7mLI8hN)t?u(NhdD%D6K z{c+u(`;aif6w}cztGOZPX>G_`#midK!Z?PCMJNF?n!>$8?S2x-ZE*IOXPc2 z{XKjiIme9JN4A9LdOG3#M2{A47w%}2^|QAqGI|{zpjcu>9aBq=a`-?d#iwp?@!8Ii zpaQS)pv1EhDtdTpT+JHoJg#0M7HZCgvO)k-*3Y%e{fXA;|7~;yM zOKzVz-7D|KJ^U|{R|!l(fe8Q-YAbM>3 zWOAc}3{68yB&onyOv|=4`t~LtSL*Eq6aqrUMPWULO?SWeezfDH)f)K;*Y&5$aL_5D z?C|m*Y%8tkW1naGBJ@zSS+UKMD`v5*N_Sn7j9%S4P1uL6?9KR)4teOUT%_I?Y}H$^B7(?<96eZjT0r zKYDFW@T@ZdfYNvJpVY07OxoNP^dk~mdS!ll>{~Lr*~b?@48LMN?jxqy(kA5U5&q$k zMdmhc#(h9vEEe77hfk9mC)`Ck1d1Nl`M=kdO?rN9>=*}LVjK5{CX|II(bme$egL@p z*RPG|+^_8u=Gha%j$qdShacEa?**&(9uGfaKIkRO0M;0Ig9tkUkW^73KeV*aX0)xT znZR05A{2Z5b(2mivHBey{4$V{1qZxm9M4Jq-D8sIv?XJe&~&NB(x}{C2K%28q}n>{ zxc!+2#C$BY!Wc#C{Euk`CMh1$fu_g%^R!3eN-laW!-}~EiTI86#Way{L1wqUfOsaoRG;wq8uAqN(7SQvxJ{o1%=b;FQ!ssU z>b06O9i9oQzMijN0>dGUP#*$04Tl{?ep;N?9*=Hh1U_)*3t3pVshmY`F zmGjnC`8iDxO{;QKA$$ABO?d_!`THoFYv2h*lProPaU4&v9NvJXEX!3_Y;;qNuFW;yC=o#wP;YVGj4NqJ*g1?81*YM;)*w9(M{pS z$9kH@4DdQcv_-tyv}dO*&=~f;3>X2fqrZ9vLC%Iqut3eA0!%w) z%U;>+O>h&u<2g6x&KsQ^iot?~xWFI+B(8Be^N?oTGPv{`{wpmDu;jnBEo-n*6D2## zYB~~jcUID)I7X$e@0xNL$l!nXc%6Y#gL5SVEF&4;cNlp5=CWr`ez8)inUN3A>Q8KE zhmThjoyKcH?v&fY2haKY;QwM70sUj6x{-QuWm~pR=Ih-5Lx&AddiAneaG!)f`wZ5J z!p?h0{$%qbnUWUZE+D#b(JlT#nq9OL{?;8Xt0y~D)+Mjm$krLyTbc$sGFMT0h8LT9 zRMvtzq?x-7&GP8*gWeovOw}MbXE|Gyc@UeRX<8E1Le$1+q}x6YT!e_-KMixfE2+sdlWKD;-6Z%Am&=? zR`*^RlvH)(82pK*@Y#Um2`ww>=ooymy3nSbUKgC?9m$wwhkElhA8IzoKeN#dx4=xv z6@W%c*!~9kh*M;#VU;&MHmi*`1#YF8p!cWrZmP%+Atlx*U(pr7FW~3ZcB3o;?plv$ zdGep~^L(yBoD`>6&+!(bk<=i$0g)v-GS5oCE6V&LLVFY1^Dn9mlF8#GOxKoIas6#j z(KtH8BNfK=0?(uOimuK7l(7Ra|E~p9^_+_~{q_1A&9?OfT1URa68OIitcd?KI8o($ ze>r?uvF5W(!LkZ+Pv=w3z<*+*_fEj>d5ziZE7u+|Q+V3`p~m9>q@J|z>vdht{Z+nL zbYBC%o?U1z9n=|^kLSbAi}>^0=W_L_DJPwb*d-DLwtcXn(Q2~F{l7G@|2%mG_yrcQ zfeuEr8+KMCl-};>*pzox%SxPW*33GaV7qXAXTF{t%LFc_F#wx4#5`T9I68;UFvEVA z8%wWtZ1SIio9xf*gYydH(8N+GLa1!HwdRqnn|Vq`*RCcJ$(_P&YoGhY%@6XImq6xG zQm;idEVy|s_3S4_)JWoeBMxm28V|1*YN+SJL<#ykaC_IxUA+$IHGumJu~!5xjlzN` zVX#<_&HeAJ-7HfE3P2S)tp$;5YIO2i6|>%dYPJPxEaMhkgm?rN$Z`ePWv((xWej!V zzMJppiHVCPMurZ;UxVaZ^y3zq&?BdlZ)AKAvrC^)8cV#TGC!Q&_tZx(_u#O3J!y5x z_n+ASUA*Ly=NDcuE-9qF?d#2C*noTX={PhG%^AgX3zg}!k;-QofpF&B)4#!z_4pxo zKy+kZ;nO;S;7I$XSC>C9{b;i{#6}JJwzoDG@sA5Fi)cGrf8=H`ri;seedHZw(_iar zS7*U+i<*#Y(tJBM!ynun)}D5iu?pRmu&TWqySPPX^{p1?t;Ax-<@s<uTS*8du96zJbv^ z33tyXv8R^3#g>~l=C91B;gw&q!o1^)S$t{jx{S?|Iwu)sZ<+_U@l8oh6q1BlltKZr zCCqViP{|c{;PM?PxXHKiYxpFgP2sgpl;6NPk#bcoeO$l0Q1uJd?ISmmP-YzGmoyTl zle^+}Y~W*-d?{wuK$KGR2@~;^O?3R3yxU(PM$aL))jvFZ`&~mL?aD-vd>JMVF3Oy& zS4F7?#(dP@t_y&75D8G=YKrGZ;x4Q-clTR{m0R8a`a0z!#$dht=ev4+$H>w{UO4xW z*i{_#$Zx(WOHJ)TtMDL`@RsIhNXe_QhoDO`;2( zfFP~%2cuPr-_cDk9rh4c+K*{}yicabRMB1uk|VtHXiG0{WV`k*^ikWHD0(oc73&y1 z|1$W&7YD%xXfEP*?>zHkW8C|bGe)-mg^$r>MGYy7m?_=h&bJWIFk(f^LK6DIx{T>0 zsWo_oo-D+qsK!4=suUnUW6l7*OG05hWVEE~1K4t8=5G)2I5dEMxaUu!{F7~^)y&K6 zkZVvilFFqS1SruH&<*Q3r>%oE+e%J7M$a+;IL6z>#iqrXc-udq$OX$RkDBJcmPmsX zS^ajQnWx2HvQmrQjihrS8?N1dATTR_JMrLg2A~?cc%bZvt?WBCyNy`pUe%MUBQY&v zU?!`;GaY&8lLQKSTXn$u;4PcGVWU^X9e*;)GtP!v_P7{+{A0@5P#jgKz#6oC-1Z>*z?nK5)eb#E`r= z-}w1^zVDA&5+bI$vhK<`46q81iWVl#=XG;M3gO({*SFS?Atnz%mlQLMQ=&bK?$<1d zogcUiOd#GBxyg5&YXFVAR&=R%OoC52P#E zT(aB;(2$QqvF7=93BMe~tjO8-MpP!)W7Fwgg-YH*c{V%#0O8mbJ#hjMLeh0AZIKbR z*9BgbpDO#7a1&$arsMlsg?~gvlzTgnH_NtL4rin6D`*+WBTpc)b*vS1`wq5J)OntW zFe6Q${dbR=bf@q8gOB}@b!QWy@hzVCN#!wR1+_z<8)9A24fL^GHw9q14MViTtlSyd zeT9g#sb(W01cWR(#qS*Z-4U@R)*qsxIqWH^o_|dB>glm@a+{lsg;~N;^lITzvutiu zMH`W6fNN$T9H*e17W7{Fah?4d{@&_?rU_+1T3=05R0pBPGZB{4K4xP$BHTrwWi&{n zF|o?Z1>bFa`tUORK;FA9XNhW?buxGaPgJ<#Kem*%z!mmpQ%p}p$rTEgah;%l%zyVW z_)t*Wo}QcN_*)PQ5RL$(ivO|j@Dc)ME+D;cq?;PfTb9#KYN`?0Qs;K4?F_$W5cnaD zM(EXc!ef`mY*oL`nQ4%gDXz&Tyb~+>aOB`rBcbgDW&v9A&5ZVp6Lkc_IH;Wo&Xdb` zj0*MohFG|Sl1omhrbVps&ek8ES zVLXs;)=ETkn`0G&RMT>x(U2)xUWK83>w#aRT!5b1rimdBQCN7j;c|~5Z{nhLPhX$HdBvoifzi+Mg!Ci2gS|jgaM*G_yF`F*ID^#MD}n zsg3R?sQ?$IYCAGbF!pCl+yK9qD)AJRZ%zm5Y!u1Jv~T2tjbq72%wsgPz3HWiqv`@{BTxdQ&#4x<_dg9&m?L_4@Hr~+KIesio|hvK|$RaAEu!+GM`ZdKHs$z zP;^0v0&>p*FQ{>y?qNpq2aO{mi|^iznjVAR5T|~vVO@**0Bo9aSQj&*F|CiXlC=*{8f0!7je6O4PR%q%in132Eb(ucEQpXpwR*Z3K7HG zXeQI6gQt?dJZ1&gc&Ogn$Hl?9rwKB32zsI;5<`Q{0WmwMLOcK|)r^`f&KvXrQAoEXiZq%iDE@h}p_w72 zA&Y}2ruZpquRV<`l~!#aaq_&^zkewZ=Iz?q7>kAlX`8*h^mNnQ!y@5zVp&vUthmS6 zuN$srOzggThEg#j;{uyJyj3%|{IE!cm%3&Eeh*^$@1YYY2*L+ac>r^L#1Q>8hzRHc z+k!CP#4)g=7$*L9Q`X=Y(<^(v8eyX2jm6H(7DHznTr3-Bm^R?@RwzJyVO;1P|D(6h z$g67oIO4MEFbH}MJ%fM#xhXN{;s;Yk%6I{IM+%NN=(Bp@AAwppJCnVs~07EZjQxSByqEBv?Hi{C;a(CkKIZj zRVkJhe%K|yNH|Vs2F;~6I0A;U&uA+1&Bb%+y`cT;mP#`frtvB#%%nN2UMna0E^3_T zN#iBkZtA4VhZka7Deqb_%cM+a06-fMzlanUiXXGLnaL?C641?els0~mec9W|p)C{g z3__Mq9sQwvA?0;|XDNbOWVO2FUfuShkfyi}%SbAJxET}~i^-wr}}R&5^=RJUck4VDZ%uOENBsJT~av|0U7 zC&MaaL8ju7`93WE9M z&FilCT(!DCB*)$d{w8c;`=;Ng5f1XD6Kx4~MM~@Tf4{K4&RljxU2cT7ShAIQ^#dC~ zV#or$O!S%SJL1Rmqd00gDqmDp5?i3-AE1>|j_<|Abqe3CjA#EMJpfKaVln&Ihb*%4 z7X*_=19d_Gj6`+*bW>C@pVfaej%?h311Mz!h5?O>Xw(6Z8{lW=OSlob92plV+@K6Z z_xGw$4k&dt{&PKk%NWo@JWtUzD_ffZ{dQMxqN2(g-4k~|p?ct(y&PE*{}p_&6K9?U@a42x~h*qxdi;Xh_^luVGc4 z?^Pn14e%_@9mvPemj;#nEqidOPa{xJ7lFjZb$+ z$-pp`DNYBl`pa>T{!_n#G-moR27XeyE*XboHZ{3k*u!SOX+GKczPRehh~4=)!J@nP zWa3Y*ot`j}NXC$_%NQ*UA}9M!f(KZU@F}msrGl9<4x4Y-DKb6jq}wmZc$I6gr5zUb z)n3=fG3=<*lFig34lo>py*yS2W~*y@7CQQz_#>l3MS)ofG00yt;YWF!kFrtw?rl|{ zYABU^_-wOX<;>6Ck$xqsa*rYiigghPu^3kTo|N`iUf+*JS?92wq-HEl0^^L^o8cAW zLJW2EO0&hctgU{#?{Tl0M96j%Rp(K|%`kiWk$1j2-#rD|<{g*;XlP`WA-48vg#H6` zB^JQVmK(J=;ziR$RVQb2Xku3kMTjN6zGRj-HaC2j`a@&-%XOB5)H#rPtE?ufK%Ur; zOa@4bQI6Sz*$ZDdvCQwd4oIZHB4L(SH88L)-_@DMyN}yku#H#$q*_yUev+vHP2mc$ zLmk%{wqtu?3Z>6#;GYJsAOJOp*VK~t+78UXVRB3R(QC-ynmMV6-s?xcAlH49xS!a= z`VP4$XL<}$0+YdpD}yoLiT<-)z41DLOne9iwS!k2`uf^>^%Ql$<4{ICNMh`6k#9{J z52f+eQY+AiuvlJ?W>S1Z*p6L_M2MgF`*L~yGei;v`|a}X7!JAe?;hM`r95r!%eW{T zh@eVkU30fCer2{{^>IdpiT+mKvXN3W+u^Y?_v8v!&)|-XQr?lG=h_?e$~f^x=8Hw^ zr|io|;(V}I@3YUIM^Cd{!Yxa%O6mV88 zYZbLpH2c4tfA`GP76~SrVuZ}mUW9APpRz1{`2LE zayE>}OCgzGGqhjv_qPCM*+^2dnORZ2ppg}#j!x?c3tF@HYWA?%N8gs&YVVD33~*Fo z1x0v=Io004)lau)(~{2PH3+;X)Y}dV*%;Z{hV;Z@)fg+PHi(oUU#n`lQ8>5Qyf*fB z<>ste=j%l9E%KM`2vGBp8BgwoX?sA+s36<%i_auxt4U5k9ZF_`Lgn7^0AWs>kqadr zE11of%nLcE4gFMY<$C)wK-~J5YXZx%vEQLHy=^w!QhDkP@#(v|<0UUfBy}6GY@bPrbPI`>gcZxX!rY-?;;sPOt2~7X#x4^!*VP z;Ku8$5Wf$aI}YsT8p>wMP%oLQxMaJs+%R^(36(!RU!=`iFpp*BI7dg5-N<%1Vd&&y zpr8@S;(ZL8szo^r_faj9cLBG>k+|MFw>jXnkNEcCQp&bm2Wxo?i>xWiJZSiHjXR9% z`N#9OX}`r>vqRdOmHh!p?jwsLdiY`O&$Fr>&R^ZyNQ|$M>{KN$lrlrv)rFC$aWOSf zX|}`Ok*6eoJ$%l%DMTEYW;dDEj!^I!T2#Xud2|v+=C70vwFOU6~GQ zTGy63=g-E4p0Zu(X5;%4l_G@nC0Kpr7QGmfs7eVwLx-llmtW<-=awzIJUO5ijdD4>_9~ z)g;Q9*8*G>=~M2Qg{Qcx?Mv%Fr@U2>aGpH}^kd_RU%Kyw8)ykNo~WA{MX3I}CxMx) zrpbnk_E^f;(_p@jl`ASwb2q~880le!ual-Am{Rv)Rb!}rQerO|@}1)q=gPo$JOesy2$lwayV!`l~l&DNE=w54Jz-M(4A^~vt{yZfJxOhd!I zOy7FPDTrpZdCAC#^7ez@6001fAk8#(Lmbvg@ak7Dw9pURtus-@pNid*1fl`1f6Xgs z4s#;H=0aO8_$wZ19Vb&+8ZDv^P1gxYv>~CFgedR@b$eUIF7A{E%g}a-FQpQdCqRgo z3yhvOn~>gTqgv2S2UNvL2P8(Xiep0;5rgD#>5zQr{%&z^?r~V?(9xoad@X5tq^k+n zvtF2#lG7MPK%7pnmzamuKwQBl1LYU3Et;hm4!vxBS0j5KyQ*SaBydj)&HxNNy$1cO z!`}aqblB|TXJ;*aO(n1Ts>AOxrmvdO9ufl!x=4sBU--1Y2{~TqLoidwvTSR0RCEtJ zO$`>u!Nd8}&KgVz3Bi6fr%)E~sCvwFWF5bs zQ_J;Lm)Fy4LLL4_%rm|3Le2+225R`EPM_22m+jc<1e1f^Gm)Gno~%DidFkZxWmvSQ z&xTw{g!kapWSGue>1M8)?RWlo{2f|7P;y9Yb?9Bow zL*u}vPWOAA_s*L3Je>>!j_UAj=Ue@a4{#J=UJHt5I4lMFLmd=X&Az#1Jg*r+ z@M9*xY)41qOOsn7T^qTt?q!|_LLL?iIk0`SJGtrpzwySB&_Gk-#JcMgtD$Hj`Hn>Y zP>irRl9mGa-`l^DBFFmDXS*P8NZHkV)W-mE9&HwQ9MHY~g(`it6KfXc-6R_6?$AzhCH2afSpUAbf^CI6$LqZ z$uTmouhy}`Q8CIh(-XEGEa&T?24Ut2ZryNfzjd=2nK6$ph{c?%llPvixN)Lm@y#&o z#721CKO0s?JkOM~T>)6;`8RRsr3#1oTG}+z5B)UNCQRrVgoNy59bzrPS`t%TfQGz( zM}!ODw`K`2x4P2j=!fgZd_U#xNbPZ22G199?#=Uf7wa17Q3I53$6PHiOVWn{If`!0|m(Z!Iax?iH z%eP=2pTsQBTmXg9+LMEu7KeP)l9M|hoG)U`(~v80ak2admk8R)A!;VNsnWJJh3eDJ zx&EI}!4|%Ng?_>9{~l>HgRE+wKry|kT`2O^X7HjT6xj6}US~g^eC=D&L}>b}CwXwz z+zfnz70!72>4C2n0o!iR6t0(bY;uQQ6z;=t$*kInaihD1B@-(HETN!>Sg>$JP-JC) z1*rIDL-239=e2(tyvbjuKS>>4P@Tv&4ZWGH%@j)Ua}7+{ap-m9>8@wA6bLkK7l%aG zI-OUS_5!ZXeeUPzh`V_c@o-H1H_5vH(k~v*!OBFB%c!%{9kzlzQ~ zF6sP_<9FTfx@%aMWkWNs(ky3|BPU&@rlvS?%VjwbmD1cIS6%Lrdg?jJJrGT0s5q`1 zxygYGkX)DpP)q?C_xs+z`~}~~m(S-tUa#j1Ifd8{n4~q7YFn&&NPtVU7*ny$`D3Xd za>nkJE>6A6)t&RGo8D-Xc7#IPO+Ovov^c5VZ{j)&CTA=)KBtI&sNio%@ni#ax6s@L zsV4dE1E~d9CMUbVouX=Mh3Y zzi$3PLE3Hb3bqm_G}*#LHXf7Y6fTi}+>rbXH1#pog~NGlk59V~P;(5II-Msw56m1P zugQ=f=QdWCDp*}HapsM~t_I-^enr7y(EWh@Qe*79xk#>{6vb%==4Ri?u!C4k;f?^c zt@3*CQWYjZwi)+&U=>7i1eOW^ez#uDt>yi(#ll~IR~Y-GKxxXFGPd1%QanUSUr%&xC z-PXr5#J34T{91u-OO4f)Ud>e}>MkdU($L;Fl0Vk=EUlW1&EL=lEJozNXLB z&TV3%+BcT5Q^OgMkbrjQVf;e%~0 zypO^k*viOo?zH|jT>G1Hf}oPd*q9MghBl%L;q!nLU)3_5Dw9uSK^Ggr<6R#b9y*&- ze2)266}x20LmC=u!d$om;Q(0n!DivcD~D&_>?_d4f< z=oYA&f}ZdZ+SrHcNk$wu2+pt5Ej~Un+FN)E)#=RYy1-9xPB%;FJ+SQQEV&$NfI#i< zS0V{k7j@3hrv!V2-+`-&d|2PV80N1)W#~|s0d()yL`C;Dh~vaa4DUKG>5+{{z|Z0D z01=*Z&Z~LAfyCuB7`jsStdF_n8e%$c39uAB97-Fg5Zhem8A%%WbuUAt%EXOT;ljOU z=hBqE8=s3!;Gj>U)UHO(N8dN``7qcOxoevuxVtW|Y~XhOH7CFofpk7s1=D-)c~u!B>j4imxiY0t>p4fEr{r zj=GM;%|#?E41J?NvCd{yL2)M2!fxaHu(hkK_8D+%lQQl*TvT(ffW#~3OkeU(rL z+M&45v9PG;NcF)K;krl$d#!?8{$YRilD=MS28lC$xO;K%_>Pe@Ne%GSc0I7%sdWmC z#VdIutN)(7ga!ucr5h;Tgrfl#GkPA1S46Xwe5tTq*CHJBhD0SQf5FcdD6kIc%$=Y2 z+G?;z{{0*LPPS@O4rs0+`{Ua_CZ~v%`O^>ye(j^huh~!K^nmf?xt$qs1wV4*6z0C7 z3R!};ojGgLs2JEU9vzDNb$fDXqU-6iI8+|nSuU#dJQHSuLbKTtgKxgLJR4k=B0>u+ zGz9KK>Wjkf=OjDz&0FvXH$sa_uvHcpVa?&H;)xW;H1@h~q9Sx3Q%%tp6NLMV0jZZx zryn5e^?4lVZ&s%+XuxC|nAfM=tjb&1s3vDwW)zlpe;o9t&Yf{gDKqo;Bs~<#*0|h# zZomtV^M%>euWu<4NIKP`Si@bBswHpmS=_TBEAhsgD~wA@hEr3y>AAZtGz3*LdNJvR z>b&)yTGUN2?Ah?GsG2q>L>|)5g&)9Px}d52Y0i#-pmTw~T4k7ORRis-UjLkgPy!%d zEu7951Osd0pW|PqCakdbGS2S6uG!Pqsir8 z)WAaQ$flkUXaZNl_@&5@pVBhz2*DCoFzl>U08dpB1yA;@smG6BxGpRm9V~5IB%g=n zPG=lW@g`^m3v#a)VZ)-KNwNonkK>tFgE`%BvXd)W}e)$wv zD?b!l*!>bSzo($^(Y7HcNUAr3t6V6loo-E2?s0J0_)Ly{$y)GCX3)UE%)nB6O~bnl z=z@>M9#80dK0gSrY43Yx)P3U}R9_J=$z-*EFFZf^E3KVx8-q-0{coT=q0yioG@|=? zws#~ID-C4fs9{RoF-o>d#Xp?rzFDoNji^Yn2m3~@0zJ3->{+5eT3qT%G`KH#y~VhV zYH=kx=YgNMtL7bL^b~Yf0XwJhpbo<+=TBxbH$E+ylscEX#TIpx2jlYarcwJopg$vO z19kNE>TMgsfqALk&Unlc8n^l+Lj|VR2#Gkp(_E*#t)pz;sN9i;EIvOpu7{g;tsMEK zeF*5F2rOws*erA)a|^(*>`X&4pCe@IEZ~|np75`N_$HZ=lr_slAhHu5Ihk5F(%*Rr z94D=<<2t2#xfO{O9TCZl!JjvWGVg7!w^y~t8zwAd*C2RJu6d<)gd>Mh3yt@s%;y5h z29{10&KWlDbI>iW*>jF55L$hVD-xRQgI=}JgVh>N&MC>@OOY*3U8d>QDI%zP#8lC{ zwzl*{+vEi$dBdI-8X!}9l!0ajd`-u{N&mP;1WKsdY0k8rf z1yFkLaK~@-LI3Q#R1tYW0CppW&p*&Tr>cwP zorVkGLMCEyHp4~MxX6wk$7H&$k}Xt6N1mh&*Y-!|lBlSEcAZ?NV*g5cPG!&o7n*`h z1+Ki{I_J-x^Zn$t+y4{R0@BYptP86Q&>?1lc&-t#Iaa-H-VE6B_wnRyh2_S#J=Tuc zC|QS8c8GOjTl-^`3NX(kpbb`|nJ=6??c4lQLZy4RO3;oT4<116u?q4p1XRjLyGHFR z7X35r-DY!qCpDk``<+Gl1th&6&!~8oc@aY;cYkHwWc%m*kWSr z>?A)=;s&7UjU7-YBC~s(o6Kur+Zm)?_J2~G=uSO%eoBPVS8Y$7FT2h$_Z4Wn#62N? zfS;!0zNwt$c*?V5lga%WER#Eed`-N|ECY{#pRRr7{H8nmgXrodnm% ze#xdzrhE0*N76mLmKd!6iRYO{*2}~6TXsQQvkis;dx65V|3}}Pm+^!+=P}>iL7M0Z zd^PbxB0ucGt~MSf|Ju=vdx;jJ59GaR{M?NLC%S62P-QAFIwcC86oC)v=yF^gJso$? zs@Baxq%-+nENI(+SjX9V(Fm=L{fAfUZi9UXe2{8@cZrZ{{^ zen!~+!EWR0W84kcuBmuF+Vx}$F;gW&lM_p^VNP(jBui}hB$46fC&!6mTAI;_%W~36 z(B`!WNM%}O!O4X{^EqB|K=uCNrvFXo3S(Z=BShZ@M1IDp!CAdcMxd(#jAsgu@iDW~ z;H{5q!4XY**4?*;C@htyTDrZu5*-^8_l+rv8KpqMU*;R%bT83E5l;6=`Ot1EDC7sESC-RE53eO7NpazB_^OQ~ z$F6+(9(EdVwgWg^Tug-O#p%Xd$O+*l;V=Dj*E0v^hnb?R$!ekSw8RZ1V}(>GSe#q| z^ZX6q50eK~h{78@OogA;vidDHx%aFdD8T0)>GxvP%Sm9>ikWw(%?+w;FL+p~uPx-D znSg&UIBUxU@4HV75s?6(Z~U=VHM~+nA116>W|jdc?L3Km1*VYl)s|O2aJZ_tOntSt zj@mIJxfVpJe#Zw1-5pBgquEw2GyL%gZ9F-^>l#k>FFTkXQ9V#bw{t2E0&wd7aPr&9 zT6g|lHqwuqP|$KU7+?d~Jb%+x20vj_UHM_rS~pUOpr#qrov^|!)&(>~2cO5W<>Muq zTk-VcMpgT?b%{9YBJ@-@F39|L6ahf26>_G$6n6TiiFHwsN4d>|okU$$H=70RbQ8Kg z<6Eu$$uq`@tX~6Zlaqhy-5wzUzcb|ho@$MeRS0%zPI}b};W8keKoMK`3vHX8Cnl}% z5XonhF_5Eyq%*cpE&}5B(;gMrW(pLs0D&&m>kFV-8Co4Z4?kCCew#e;)j9eu{-g*n zzwG|jq7_@>MgG#@EeC5z)yigVKLy^f|P!4STkIXyh+O_z}dt7^NxlfPnr-@ zkF;F%+kDU)Wtu4X(Uw4YLdtt8T?7PbRaot%ikG3PTTi1M*A9C${Sg$QI^F2XN^CdZ z<#^$<0sC5SYA#6%HcR_t81-g&H4fsIJQy-7U9(o&Qg&_keSIQ6)Zx|nccE8GGeI5r zze?2FaClUcboWBtZX|FZh!^T)DnXF|SMrC?|kbtvofYtsn7r#Vp_KrYR!QZF0;0!V%i4 zs>VFW-$A3F?hbKFwe7=8yif+@)1%jA3^snUmip`>x%)SituZt(69$v%@>!~~hT9~a zN|t7Pa?-J)!v84@zwO6|4^$p8t7?)Dd=b!-b-9Y4r2Z5|Uz_sIbK0?|Z-CmJT=uK! z^@SMSbeh#EBzmYt*5kXAk7g>Zq%NUgr*j;tQT)GPsh<2IuUw|(>Q8h zGU&uCuDe}O9@If#bl{g|!wxQtH!NDr1osIDfwg%3K=xBpTLV5d537aLv$RdN7FW;X-1LwfBQV(|Y6WQP< za00k@BX#dU=*jhUJwhsGVcYPT7OQ~i`8VamvM5=gknh^8CQ|lR zUV@_j_so(?_=h?!C!{dLKMy}AZIJS%7TwXOW7Lr0OB_0yc5Kiqfye>7=F<-NlZVo@YBVcY|urU9>*OW z{9mWc!XFNhysW97nd@a;9IGoB0h&g6vF?T9koJLU^_g|YGSQcaPWP_$Z&IG9wY1dfTCjXMi zt%_$G)b0ehBkvc39$|lKlSI+&Q)heO$jwq<8-=3`vX)+`8EweUDdFF{r9b4P{gWmuP^Q6#0oRj z0#Cj_!LHvs_Q?F40!Or$6IQ(*THfsb1cc(X)yoaXCs+tS*JHVw!ecI{XeK#L4@iJ? zi|!?JyaDXus03}JSeJhtl(RTv-w&o!HHTdbJa$|*)c2!Y!9t3gl$m=Caj2W*C?Gmo z7{T>p6?mA*>iFjwij12f#V>cRD2-UIGNMs3fc8m|M5KbRK;%1n&+(GC2Z`QX9Loo& zI`-?xYuEHJ4wbJfk31MFE1Yet+29qVQr9wh%7YJ%smA-ygi;RA!yGviE9OTW$k__LQhPbdMXs4Yzy@a{~A7Xf{4g*X$&*iNlaR#P`t6T&zyq9&E(i9?KeLr3rb#aco9zF1hE5 zv+wXwcdzb@PwoAn*g~bO^8^GCOcUOeY;=0~Ocr2KY9Hnz8f}V$k;7Hu(m#K3qZ$0u zb-&W|=n)MkmNK_8gWt6|jitY~xNc!`-_l4`Bf_m~s@fiB22gEEjMt5X1k^DdYm@TO zOAHNjBszjA%n35mT00TvmbLjI#I3`|v)DBbg4y3bl-5Oj!FhSjW?BFbXM74V`3n%}c7=-^wSh%Wr4KT?75j%qh73^~0Ld^!^o=%&5D(Y)G?De|_2W znUYg6e&Vfx;{E9tpSD7_G>O_oFQb^{!U`JdOLI;FfN*+Y=%05Urc<0 zM1l3B`@MIUcTuyRj8C2(T{_7@x5V$BrpLr*-Jww9_GU?!z?^Qz?0@OFaXNRp1U8`# zztyR-cjbIl3$P0Qf{O4jJLD68*{#o%T%N?@e{S$~hy7UL?j1kFeuVDn7Pr4bMvw2$ z|E3XWQ!2p{h-_U9(DU&&6N&9Fgy>sSZ^tGc>K1qH4evc{sKU2g7>e5h|JI$^7-pD+ zn7?}5R@>H+Ypyw)-^Cd~t9J8F1AuJl{(Wal4N&+XZ$?|V=0|i+cn28qHrnZ8>9t}>jT=;Z66I1=63g^UHpC_3-QXKwL-=R`^b}a#Frhl zJz%LGg#RSR*rBrsKT<~`V4RU2#>!^5l2)9sdYXx|6eDw{=Rf0YYn<3?N#XR|l?_8h z5dQ#j1(u!I(Ju%1$Q%jL#kiY#9Owu*Tb#@_skLt9zR<4^ZQn1@cK@(?yIz5X*B#sQ z%QPJiQ|9O5M0U-4Wn77mH84Z>poLa6|M-ypREXdFm|PTgf%^3zg*smcli1-*C9<`( z8@B^~PCDLr^a>!g*OMB)E5PLeW3R9-@#XGTpSg=@&G~qE zm1pn9{=uIU?@)y=+=)&k`o#bT%q>A+61QdM*20x`qTu(Ed(P}2j6pE|IV!}OntxL0 z#ISi&4z$>NiLpirR@Ho2s~o@lENxQ>myId#dwqwl=1xJcp}O`=URQru4K7g|040Ii z?CIxE4xc#*7`}BvD81Lg_X{e$kSX_jAk%~GVcdN&qY(LYQx`JE__g-Tm9$KbK&(A!HN-(9^ZVm>mMO($3r#0zp*^LNa-F7NA5XJJ#w4W7aI&FY09u-fAsg~(%g{F}%vpzutWz^#6G=K1U3 zRD}=I)%wsD{+dp)dnKBSKGfaJd8dNUPOKKviDJk#M)Hm?kNnLE(bTk$Xp^-q996)~HuT4ZO6d^~=sK6hdC zk5!sprzPQ7(ctJA$n6N<&wQ)xf0BL{-txuvW&!fXit00V9#vBkZI70m)Fh@K0{g$-H?5kYQzo}L&q26lvGY+~nTSuOaKT9L(lp?M??AF)^ zRwBZ0cGefi>PdxXXL0Eu%~efsrU;;V76mKc&6#&8&9KdGStsF zA6FFo*>&~MfmKQk(X{Ol5ztP{KS`-N9nit6|ROCj5+LxBTH9x3pL5N5~zvUAHqtS_kKF9)&T2`T+M=DBFq zTwj){%&@^t=IqbPJ9j;pEgB*R<55PgqQF61aJ@WJ{T2FN&gfLhv+#!j>XyJnjrah{ zmpS8j5Aip<)>5^UJc=1rpc$g(=PVTG<5?fQ0Yc&RhRHuIbo7_gq+@|9GG^lM*DR0r zBH8Qj4ugNs1dWA&JGFkjBc`<;?3$kW{_*9Ut7D;Pc0uaM1Q;*4Q~8-6R+gRw+)BQonJSVX_bS>g6HFYPyZ3-6&dvI?)Die@%;4$ zSm5Co^I=mOE)T}y2{`l4Wb54PJE#a|S@IzEyONEVK}{o4Q&XN0<9Rr(`nGEqQ}Brn zC3PjM7IgoUwB<+Rhr35WI*S){CGr#?*4MJ$O&>@R|5}!Fg!pc<%}X^--rms`UORzX zcf^>L#40d+=1gVoRBc&Xr_?TzaX=1H1^5e4epbYPt#L4w`B-Pw_7{>K53cAz9E+L> zMMyY>Zn>9!YRl?VZie~15eAhd*AC9wVN{Dxpci3h|Cecn5p_qY`n!QM7OYKTME%LC R%;yfl5xPzl?dX5!{trLh!ruS@ literal 0 HcmV?d00001 diff --git a/episode-253/picturesque/.gitignore b/episode-253/picturesque/.gitignore new file mode 100644 index 00000000..0c6a69bd --- /dev/null +++ b/episode-253/picturesque/.gitignore @@ -0,0 +1,5 @@ +.bundle +db/*.sqlite3 +log/*.log +tmp/**/* +public/uploads diff --git a/episode-253/picturesque/Gemfile b/episode-253/picturesque/Gemfile new file mode 100644 index 00000000..98a787e9 --- /dev/null +++ b/episode-253/picturesque/Gemfile @@ -0,0 +1,9 @@ +source 'http://rubygems.org' + +gem 'rails', '3.0.3' +gem 'sqlite3-ruby', '1.2.5', :require => 'sqlite3' +gem 'nifty-generators' +gem 'mocha', :group => :test + +gem "rmagick" +gem "carrierwave" diff --git a/episode-253/picturesque/Gemfile.lock b/episode-253/picturesque/Gemfile.lock new file mode 100644 index 00000000..25edf159 --- /dev/null +++ b/episode-253/picturesque/Gemfile.lock @@ -0,0 +1,83 @@ +GEM + remote: http://rubygems.org/ + specs: + abstract (1.0.0) + actionmailer (3.0.3) + actionpack (= 3.0.3) + mail (~> 2.2.9) + actionpack (3.0.3) + activemodel (= 3.0.3) + activesupport (= 3.0.3) + builder (~> 2.1.2) + erubis (~> 2.6.6) + i18n (~> 0.4) + rack (~> 1.2.1) + rack-mount (~> 0.6.13) + rack-test (~> 0.5.6) + tzinfo (~> 0.3.23) + activemodel (3.0.3) + activesupport (= 3.0.3) + builder (~> 2.1.2) + i18n (~> 0.4) + activerecord (3.0.3) + activemodel (= 3.0.3) + activesupport (= 3.0.3) + arel (~> 2.0.2) + tzinfo (~> 0.3.23) + activeresource (3.0.3) + activemodel (= 3.0.3) + activesupport (= 3.0.3) + activesupport (3.0.3) + arel (2.0.8) + builder (2.1.2) + carrierwave (0.5.1) + activesupport (~> 3.0) + erubis (2.6.6) + abstract (>= 1.0.0) + i18n (0.5.0) + mail (2.2.15) + activesupport (>= 2.3.6) + i18n (>= 0.4.0) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.16) + mocha (0.9.10) + rake + nifty-generators (0.4.4) + polyglot (0.3.1) + rack (1.2.1) + rack-mount (0.6.13) + rack (>= 1.0.0) + rack-test (0.5.7) + rack (>= 1.0) + rails (3.0.3) + actionmailer (= 3.0.3) + actionpack (= 3.0.3) + activerecord (= 3.0.3) + activeresource (= 3.0.3) + activesupport (= 3.0.3) + bundler (~> 1.0) + railties (= 3.0.3) + railties (3.0.3) + actionpack (= 3.0.3) + activesupport (= 3.0.3) + rake (>= 0.8.7) + thor (~> 0.14.4) + rake (0.8.7) + rmagick (2.13.1) + sqlite3-ruby (1.2.5) + thor (0.14.6) + treetop (1.4.9) + polyglot (>= 0.3.1) + tzinfo (0.3.24) + +PLATFORMS + ruby + +DEPENDENCIES + carrierwave + mocha + nifty-generators + rails (= 3.0.3) + rmagick + sqlite3-ruby (= 1.2.5) diff --git a/episode-253/picturesque/Rakefile b/episode-253/picturesque/Rakefile new file mode 100644 index 00000000..aea319e4 --- /dev/null +++ b/episode-253/picturesque/Rakefile @@ -0,0 +1,7 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) +require 'rake' + +Picturesque::Application.load_tasks diff --git a/episode-253/picturesque/app/controllers/application_controller.rb b/episode-253/picturesque/app/controllers/application_controller.rb new file mode 100644 index 00000000..e8065d95 --- /dev/null +++ b/episode-253/picturesque/app/controllers/application_controller.rb @@ -0,0 +1,3 @@ +class ApplicationController < ActionController::Base + protect_from_forgery +end diff --git a/episode-253/picturesque/app/controllers/galleries_controller.rb b/episode-253/picturesque/app/controllers/galleries_controller.rb new file mode 100644 index 00000000..e151018d --- /dev/null +++ b/episode-253/picturesque/app/controllers/galleries_controller.rb @@ -0,0 +1,44 @@ +class GalleriesController < ApplicationController + def index + @galleries = Gallery.all + end + + def show + @gallery = Gallery.find(params[:id]) + end + + def new + @gallery = Gallery.new + end + + def create + @gallery = Gallery.new(params[:gallery]) + if @gallery.save + flash[:notice] = "Successfully created gallery." + redirect_to @gallery + else + render :action => 'new' + end + end + + def edit + @gallery = Gallery.find(params[:id]) + end + + def update + @gallery = Gallery.find(params[:id]) + if @gallery.update_attributes(params[:gallery]) + flash[:notice] = "Successfully updated gallery." + redirect_to gallery_url + else + render :action => 'edit' + end + end + + def destroy + @gallery = Gallery.find(params[:id]) + @gallery.destroy + flash[:notice] = "Successfully destroyed gallery." + redirect_to galleries_url + end +end diff --git a/episode-253/picturesque/app/controllers/paintings_controller.rb b/episode-253/picturesque/app/controllers/paintings_controller.rb new file mode 100644 index 00000000..2f820b03 --- /dev/null +++ b/episode-253/picturesque/app/controllers/paintings_controller.rb @@ -0,0 +1,36 @@ +class PaintingsController < ApplicationController + def new + @painting = Painting.new(:gallery_id => params[:gallery_id]) + end + + def create + @painting = Painting.new(params[:painting]) + if @painting.save + flash[:notice] = "Successfully created painting." + redirect_to @painting.gallery + else + render :action => 'new' + end + end + + def edit + @painting = Painting.find(params[:id]) + end + + def update + @painting = Painting.find(params[:id]) + if @painting.update_attributes(params[:painting]) + flash[:notice] = "Successfully updated painting." + redirect_to @painting.gallery + else + render :action => 'edit' + end + end + + def destroy + @painting = Painting.find(params[:id]) + @painting.destroy + flash[:notice] = "Successfully destroyed painting." + redirect_to @painting.gallery + end +end diff --git a/episode-253/picturesque/app/helpers/application_helper.rb b/episode-253/picturesque/app/helpers/application_helper.rb new file mode 100644 index 00000000..de6be794 --- /dev/null +++ b/episode-253/picturesque/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/episode-253/picturesque/app/helpers/error_messages_helper.rb b/episode-253/picturesque/app/helpers/error_messages_helper.rb new file mode 100644 index 00000000..586e4aab --- /dev/null +++ b/episode-253/picturesque/app/helpers/error_messages_helper.rb @@ -0,0 +1,23 @@ +module ErrorMessagesHelper + # Render error messages for the given objects. The :message and :header_message options are allowed. + def error_messages_for(*objects) + options = objects.extract_options! + options[:header_message] ||= "Invalid Fields" + options[:message] ||= "Correct the following errors and try again." + messages = objects.compact.map { |o| o.errors.full_messages }.flatten + unless messages.empty? + content_tag(:div, :class => "error_messages") do + list_items = messages.map { |msg| content_tag(:li, msg) } + content_tag(:h2, options[:header_message]) + content_tag(:p, options[:message]) + content_tag(:ul, list_items.join.html_safe) + end + end + end + + module FormBuilderAdditions + def error_messages(options = {}) + @template.error_messages_for(@object, options) + end + end +end + +ActionView::Helpers::FormBuilder.send(:include, ErrorMessagesHelper::FormBuilderAdditions) diff --git a/episode-253/picturesque/app/helpers/galleries_helper.rb b/episode-253/picturesque/app/helpers/galleries_helper.rb new file mode 100644 index 00000000..2d7ca91e --- /dev/null +++ b/episode-253/picturesque/app/helpers/galleries_helper.rb @@ -0,0 +1,2 @@ +module GalleriesHelper +end diff --git a/episode-253/picturesque/app/helpers/layout_helper.rb b/episode-253/picturesque/app/helpers/layout_helper.rb new file mode 100644 index 00000000..09fa3497 --- /dev/null +++ b/episode-253/picturesque/app/helpers/layout_helper.rb @@ -0,0 +1,22 @@ +# These helper methods can be called in your template to set variables to be used in the layout +# This module should be included in all views globally, +# to do so you may need to add this line to your ApplicationController +# helper :layout +module LayoutHelper + def title(page_title, show_title = true) + content_for(:title) { h(page_title.to_s) } + @show_title = show_title + end + + def show_title? + @show_title + end + + def stylesheet(*args) + content_for(:head) { stylesheet_link_tag(*args) } + end + + def javascript(*args) + content_for(:head) { javascript_include_tag(*args) } + end +end diff --git a/episode-253/picturesque/app/helpers/paintings_helper.rb b/episode-253/picturesque/app/helpers/paintings_helper.rb new file mode 100644 index 00000000..cfbc2948 --- /dev/null +++ b/episode-253/picturesque/app/helpers/paintings_helper.rb @@ -0,0 +1,2 @@ +module PaintingsHelper +end diff --git a/episode-253/picturesque/app/models/gallery.rb b/episode-253/picturesque/app/models/gallery.rb new file mode 100644 index 00000000..d858d664 --- /dev/null +++ b/episode-253/picturesque/app/models/gallery.rb @@ -0,0 +1,4 @@ +class Gallery < ActiveRecord::Base + attr_accessible :name + has_many :paintings +end diff --git a/episode-253/picturesque/app/models/painting.rb b/episode-253/picturesque/app/models/painting.rb new file mode 100644 index 00000000..bca026bd --- /dev/null +++ b/episode-253/picturesque/app/models/painting.rb @@ -0,0 +1,5 @@ +class Painting < ActiveRecord::Base + attr_accessible :gallery_id, :name, :image, :remote_image_url + belongs_to :gallery + mount_uploader :image, ImageUploader +end diff --git a/episode-253/picturesque/app/uploaders/image_uploader.rb b/episode-253/picturesque/app/uploaders/image_uploader.rb new file mode 100644 index 00000000..5930792c --- /dev/null +++ b/episode-253/picturesque/app/uploaders/image_uploader.rb @@ -0,0 +1,47 @@ +# encoding: utf-8 + +class ImageUploader < CarrierWave::Uploader::Base + + # Include RMagick or ImageScience support: + include CarrierWave::RMagick + # include CarrierWave::ImageScience + + # Choose what kind of storage to use for this uploader: + storage :file + # storage :s3 + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + def store_dir + "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + # def default_url + # "/images/fallback/" + [version_name, "default.png"].compact.join('_') + # end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + version :thumb do + process :resize_to_limit => [200, 200] + end + + # Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + # def extension_white_list + # %w(jpg jpeg gif png) + # end + + # Override the filename of the uploaded files: + # def filename + # "something.jpg" if original_filename + # end + +end diff --git a/episode-253/picturesque/app/views/galleries/_form.html.erb b/episode-253/picturesque/app/views/galleries/_form.html.erb new file mode 100644 index 00000000..3a1b28e8 --- /dev/null +++ b/episode-253/picturesque/app/views/galleries/_form.html.erb @@ -0,0 +1,8 @@ +<%= form_for @gallery do |f| %> + <%= f.error_messages %> +

+ <%= f.label :name %>
+ <%= f.text_field :name %> +

+

<%= f.submit %>

+<% end %> diff --git a/episode-253/picturesque/app/views/galleries/edit.html.erb b/episode-253/picturesque/app/views/galleries/edit.html.erb new file mode 100644 index 00000000..6f230ac5 --- /dev/null +++ b/episode-253/picturesque/app/views/galleries/edit.html.erb @@ -0,0 +1,8 @@ +<% title "Edit Gallery" %> + +<%= render 'form' %> + +

+ <%= link_to "Show", @gallery %> | + <%= link_to "View All", galleries_path %> +

diff --git a/episode-253/picturesque/app/views/galleries/index.html.erb b/episode-253/picturesque/app/views/galleries/index.html.erb new file mode 100644 index 00000000..e7d4e5b1 --- /dev/null +++ b/episode-253/picturesque/app/views/galleries/index.html.erb @@ -0,0 +1,10 @@ +<% title "Galleries" %> + +<% for gallery in @galleries %> + +<% end %> + +

<%= link_to "New Gallery", new_gallery_path %>

diff --git a/episode-253/picturesque/app/views/galleries/new.html.erb b/episode-253/picturesque/app/views/galleries/new.html.erb new file mode 100644 index 00000000..16c805ae --- /dev/null +++ b/episode-253/picturesque/app/views/galleries/new.html.erb @@ -0,0 +1,5 @@ +<% title "New Gallery" %> + +<%= render 'form' %> + +

<%= link_to "Back to List", galleries_path %>

diff --git a/episode-253/picturesque/app/views/galleries/show.html.erb b/episode-253/picturesque/app/views/galleries/show.html.erb new file mode 100644 index 00000000..666dc314 --- /dev/null +++ b/episode-253/picturesque/app/views/galleries/show.html.erb @@ -0,0 +1,21 @@ +<% title @gallery.name %> + +
+ <% for painting in @gallery.paintings %> +
+ <%= image_tag painting.image_url(:thumb) if painting.image? %> +
<%= painting.name %>
+
+ <%= link_to "edit", edit_painting_path(painting) %> | + <%= link_to "remove", painting, :confirm => 'Are you sure?', :method => :delete %> +
+
+ <% end %> +
+
+ +

+ <%= link_to "Add a Painting", new_painting_path(:gallery_id => @gallery) %> | + <%= link_to "Remove Gallery", @gallery, :confirm => 'Are you sure?', :method => :delete %> | + <%= link_to "View Galleries", galleries_path %> +

diff --git a/episode-253/picturesque/app/views/layouts/application.html.erb b/episode-253/picturesque/app/views/layouts/application.html.erb new file mode 100644 index 00000000..3239c54f --- /dev/null +++ b/episode-253/picturesque/app/views/layouts/application.html.erb @@ -0,0 +1,19 @@ + + + + <%= content_for?(:title) ? yield(:title) : "Untitled" %> + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag :defaults %> + <%= csrf_meta_tag %> + <%= yield(:head) %> + + +
+ <% flash.each do |name, msg| %> + <%= content_tag :div, msg, :id => "flash_#{name}" %> + <% end %> + <%= content_tag :h1, yield(:title) if show_title? %> + <%= yield %> +
+ + diff --git a/episode-253/picturesque/app/views/paintings/_form.html.erb b/episode-253/picturesque/app/views/paintings/_form.html.erb new file mode 100644 index 00000000..d36b5c79 --- /dev/null +++ b/episode-253/picturesque/app/views/paintings/_form.html.erb @@ -0,0 +1,16 @@ +<%= form_for @painting, :html => {:multipart => true} do |f| %> + <%= f.error_messages %> + <%= f.hidden_field :gallery_id %> +

+ <%= f.label :name %>
+ <%= f.text_field :name %> +

+

+ <%= f.file_field :image %> +

+

+ <%= f.label :remote_image_url, "or image URL" %>
+ <%= f.text_field :remote_image_url %> +

+

<%= f.submit %>

+<% end %> diff --git a/episode-253/picturesque/app/views/paintings/edit.html.erb b/episode-253/picturesque/app/views/paintings/edit.html.erb new file mode 100644 index 00000000..bf2e13bf --- /dev/null +++ b/episode-253/picturesque/app/views/paintings/edit.html.erb @@ -0,0 +1,5 @@ +<% title "Edit Painting" %> + +<%= render 'form' %> + +

<%= link_to "Back to Gallery", @painting.gallery %>

diff --git a/episode-253/picturesque/app/views/paintings/new.html.erb b/episode-253/picturesque/app/views/paintings/new.html.erb new file mode 100644 index 00000000..93e5f02d --- /dev/null +++ b/episode-253/picturesque/app/views/paintings/new.html.erb @@ -0,0 +1,5 @@ +<% title "New Painting" %> + +<%= render 'form' %> + +

<%= link_to "Back to Gallery", @painting.gallery %>

diff --git a/episode-253/picturesque/config.ru b/episode-253/picturesque/config.ru new file mode 100644 index 00000000..11c553fa --- /dev/null +++ b/episode-253/picturesque/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Picturesque::Application diff --git a/episode-253/picturesque/config/application.rb b/episode-253/picturesque/config/application.rb new file mode 100644 index 00000000..ecf76b50 --- /dev/null +++ b/episode-253/picturesque/config/application.rb @@ -0,0 +1,42 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +# If you have a Gemfile, require the gems listed there, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(:default, Rails.env) if defined?(Bundler) + +module Picturesque + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + # config.autoload_paths += %W(#{config.root}/extras) + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # JavaScript files you want as :defaults (application.js is always included). + # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + end +end diff --git a/episode-253/picturesque/config/boot.rb b/episode-253/picturesque/config/boot.rb new file mode 100644 index 00000000..ab6cb374 --- /dev/null +++ b/episode-253/picturesque/config/boot.rb @@ -0,0 +1,13 @@ +require 'rubygems' + +# Set up gems listed in the Gemfile. +gemfile = File.expand_path('../../Gemfile', __FILE__) +begin + ENV['BUNDLE_GEMFILE'] = gemfile + require 'bundler' + Bundler.setup +rescue Bundler::GemNotFound => e + STDERR.puts e.message + STDERR.puts "Try running `bundle install`." + exit! +end if File.exist?(gemfile) diff --git a/episode-253/picturesque/config/database.yml b/episode-253/picturesque/config/database.yml new file mode 100644 index 00000000..025d62a8 --- /dev/null +++ b/episode-253/picturesque/config/database.yml @@ -0,0 +1,22 @@ +# SQLite version 3.x +# gem install sqlite3-ruby (not necessary on OS X Leopard) +development: + adapter: sqlite3 + database: db/development.sqlite3 + pool: 5 + timeout: 5000 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: sqlite3 + database: db/test.sqlite3 + pool: 5 + timeout: 5000 + +production: + adapter: sqlite3 + database: db/production.sqlite3 + pool: 5 + timeout: 5000 diff --git a/episode-253/picturesque/config/environment.rb b/episode-253/picturesque/config/environment.rb new file mode 100644 index 00000000..2566a1c3 --- /dev/null +++ b/episode-253/picturesque/config/environment.rb @@ -0,0 +1,5 @@ +# Load the rails application +require File.expand_path('../application', __FILE__) + +# Initialize the rails application +Picturesque::Application.initialize! diff --git a/episode-253/picturesque/config/environments/development.rb b/episode-253/picturesque/config/environments/development.rb new file mode 100644 index 00000000..1df64207 --- /dev/null +++ b/episode-253/picturesque/config/environments/development.rb @@ -0,0 +1,26 @@ +Picturesque::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the webserver when you make code changes. + config.cache_classes = false + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_view.debug_rjs = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # Only use best-standards-support built into browsers + config.action_dispatch.best_standards_support = :builtin +end + diff --git a/episode-253/picturesque/config/environments/production.rb b/episode-253/picturesque/config/environments/production.rb new file mode 100644 index 00000000..aeab8c28 --- /dev/null +++ b/episode-253/picturesque/config/environments/production.rb @@ -0,0 +1,49 @@ +Picturesque::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # The production environment is meant for finished, "live" apps. + # Code is not reloaded between requests + config.cache_classes = true + + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Specifies the header that your server uses for sending files + config.action_dispatch.x_sendfile_header = "X-Sendfile" + + # For nginx: + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' + + # If you have no front-end server that supports something like X-Sendfile, + # just comment this out and Rails will serve the files + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Use a different logger for distributed setups + # config.logger = SyslogLogger.new + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Disable Rails's static asset server + # In production, Apache or nginx will already do this + config.serve_static_assets = false + + # Enable serving of images, stylesheets, and javascripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify +end diff --git a/episode-253/picturesque/config/environments/test.rb b/episode-253/picturesque/config/environments/test.rb new file mode 100644 index 00000000..935f4792 --- /dev/null +++ b/episode-253/picturesque/config/environments/test.rb @@ -0,0 +1,35 @@ +Picturesque::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Use SQL instead of Active Record's schema dumper when creating the test database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr +end diff --git a/episode-253/picturesque/config/initializers/backtrace_silencers.rb b/episode-253/picturesque/config/initializers/backtrace_silencers.rb new file mode 100644 index 00000000..59385cdf --- /dev/null +++ b/episode-253/picturesque/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/episode-253/picturesque/config/initializers/inflections.rb b/episode-253/picturesque/config/initializers/inflections.rb new file mode 100644 index 00000000..9e8b0131 --- /dev/null +++ b/episode-253/picturesque/config/initializers/inflections.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end diff --git a/episode-253/picturesque/config/initializers/mime_types.rb b/episode-253/picturesque/config/initializers/mime_types.rb new file mode 100644 index 00000000..72aca7e4 --- /dev/null +++ b/episode-253/picturesque/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/episode-253/picturesque/config/initializers/secret_token.rb b/episode-253/picturesque/config/initializers/secret_token.rb new file mode 100644 index 00000000..d02472dc --- /dev/null +++ b/episode-253/picturesque/config/initializers/secret_token.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Picturesque::Application.config.secret_token = 'c520158abe2e6b4b0e2632098bb522dcf492c3b1facd48e499475541424269c1327d56b8a16d1755fd8dadbf6983f6e9b46b6f69cc692d92d021aa64b0fb376d' diff --git a/episode-253/picturesque/config/initializers/session_store.rb b/episode-253/picturesque/config/initializers/session_store.rb new file mode 100644 index 00000000..5c09d408 --- /dev/null +++ b/episode-253/picturesque/config/initializers/session_store.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +Picturesque::Application.config.session_store :cookie_store, :key => '_picturesque_session' + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rails generate session_migration") +# Picturesque::Application.config.session_store :active_record_store diff --git a/episode-253/picturesque/config/locales/en.yml b/episode-253/picturesque/config/locales/en.yml new file mode 100644 index 00000000..a747bfa6 --- /dev/null +++ b/episode-253/picturesque/config/locales/en.yml @@ -0,0 +1,5 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + hello: "Hello world" diff --git a/episode-253/picturesque/config/routes.rb b/episode-253/picturesque/config/routes.rb new file mode 100644 index 00000000..a37af68c --- /dev/null +++ b/episode-253/picturesque/config/routes.rb @@ -0,0 +1,6 @@ +Picturesque::Application.routes.draw do + root :to => "galleries#index" + + resources :galleries + resources :paintings +end diff --git a/episode-253/picturesque/db/migrate/20110213032730_create_galleries.rb b/episode-253/picturesque/db/migrate/20110213032730_create_galleries.rb new file mode 100644 index 00000000..abf8f509 --- /dev/null +++ b/episode-253/picturesque/db/migrate/20110213032730_create_galleries.rb @@ -0,0 +1,12 @@ +class CreateGalleries < ActiveRecord::Migration + def self.up + create_table :galleries do |t| + t.string :name + t.timestamps + end + end + + def self.down + drop_table :galleries + end +end diff --git a/episode-253/picturesque/db/migrate/20110213032940_create_paintings.rb b/episode-253/picturesque/db/migrate/20110213032940_create_paintings.rb new file mode 100644 index 00000000..5f0292b4 --- /dev/null +++ b/episode-253/picturesque/db/migrate/20110213032940_create_paintings.rb @@ -0,0 +1,13 @@ +class CreatePaintings < ActiveRecord::Migration + def self.up + create_table :paintings do |t| + t.integer :gallery_id + t.string :name + t.timestamps + end + end + + def self.down + drop_table :paintings + end +end diff --git a/episode-253/picturesque/db/migrate/20110213051146_add_image_to_paintings.rb b/episode-253/picturesque/db/migrate/20110213051146_add_image_to_paintings.rb new file mode 100644 index 00000000..3e3cab6f --- /dev/null +++ b/episode-253/picturesque/db/migrate/20110213051146_add_image_to_paintings.rb @@ -0,0 +1,9 @@ +class AddImageToPaintings < ActiveRecord::Migration + def self.up + add_column :paintings, :image, :string + end + + def self.down + remove_column :paintings, :image + end +end diff --git a/episode-253/picturesque/db/schema.rb b/episode-253/picturesque/db/schema.rb new file mode 100644 index 00000000..bf5b74ac --- /dev/null +++ b/episode-253/picturesque/db/schema.rb @@ -0,0 +1,29 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20110213051146) do + + create_table "galleries", :force => true do |t| + t.string "name" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "paintings", :force => true do |t| + t.integer "gallery_id" + t.string "name" + t.datetime "created_at" + t.datetime "updated_at" + t.string "image" + end + +end diff --git a/episode-253/picturesque/db/seeds.rb b/episode-253/picturesque/db/seeds.rb new file mode 100644 index 00000000..664d8c74 --- /dev/null +++ b/episode-253/picturesque/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). +# +# Examples: +# +# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) +# Mayor.create(:name => 'Daley', :city => cities.first) diff --git a/episode-253/picturesque/doc/README_FOR_APP b/episode-253/picturesque/doc/README_FOR_APP new file mode 100644 index 00000000..fe41f5cc --- /dev/null +++ b/episode-253/picturesque/doc/README_FOR_APP @@ -0,0 +1,2 @@ +Use this README file to introduce your application and point to useful places in the API for learning more. +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. diff --git a/episode-253/picturesque/lib/tasks/.gitkeep b/episode-253/picturesque/lib/tasks/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/episode-253/picturesque/public/404.html b/episode-253/picturesque/public/404.html new file mode 100644 index 00000000..9a48320a --- /dev/null +++ b/episode-253/picturesque/public/404.html @@ -0,0 +1,26 @@ + + + + The page you were looking for doesn't exist (404) + + + + + +
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+ + diff --git a/episode-253/picturesque/public/422.html b/episode-253/picturesque/public/422.html new file mode 100644 index 00000000..83660ab1 --- /dev/null +++ b/episode-253/picturesque/public/422.html @@ -0,0 +1,26 @@ + + + + The change you wanted was rejected (422) + + + + + +
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+ + diff --git a/episode-253/picturesque/public/500.html b/episode-253/picturesque/public/500.html new file mode 100644 index 00000000..b80307fc --- /dev/null +++ b/episode-253/picturesque/public/500.html @@ -0,0 +1,26 @@ + + + + We're sorry, but something went wrong (500) + + + + + +
+

We're sorry, but something went wrong.

+

We've been notified about this issue and we'll take a look at it shortly.

+
+ + diff --git a/episode-253/picturesque/public/favicon.ico b/episode-253/picturesque/public/favicon.ico new file mode 100644 index 00000000..e69de29b diff --git a/episode-253/picturesque/public/images/rails.png b/episode-253/picturesque/public/images/rails.png new file mode 100644 index 0000000000000000000000000000000000000000..d5edc04e65f555e3ba4dcdaad39dc352e75b575e GIT binary patch literal 6646 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/episode-253/picturesque/public/javascripts/application.js b/episode-253/picturesque/public/javascripts/application.js new file mode 100644 index 00000000..fe457769 --- /dev/null +++ b/episode-253/picturesque/public/javascripts/application.js @@ -0,0 +1,2 @@ +// Place your application-specific JavaScript functions and classes here +// This file is automatically included by javascript_include_tag :defaults diff --git a/episode-253/picturesque/public/javascripts/controls.js b/episode-253/picturesque/public/javascripts/controls.js new file mode 100644 index 00000000..7392fb66 --- /dev/null +++ b/episode-253/picturesque/public/javascripts/controls.js @@ -0,0 +1,965 @@ +// script.aculo.us controls.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// (c) 2005-2009 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +// (c) 2005-2009 Jon Tirsen (http://www.tirsen.com) +// Contributors: +// Richard Livsey +// Rahul Bhargava +// Rob Wills +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// Autocompleter.Base handles all the autocompletion functionality +// that's independent of the data source for autocompletion. This +// includes drawing the autocompletion menu, observing keyboard +// and mouse events, and similar. +// +// Specific autocompleters need to provide, at the very least, +// a getUpdatedChoices function that will be invoked every time +// the text inside the monitored textbox changes. This method +// should get the text for which to provide autocompletion by +// invoking this.getToken(), NOT by directly accessing +// this.element.value. This is to allow incremental tokenized +// autocompletion. Specific auto-completion logic (AJAX, etc) +// belongs in getUpdatedChoices. +// +// Tokenized incremental autocompletion is enabled automatically +// when an autocompleter is instantiated with the 'tokens' option +// in the options parameter, e.g.: +// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); +// will incrementally autocomplete with a comma as the token. +// Additionally, ',' in the above example can be replaced with +// a token array, e.g. { tokens: [',', '\n'] } which +// enables autocompletion on multiple tokens. This is most +// useful when one of the tokens is \n (a newline), as it +// allows smart autocompletion after linebreaks. + +if(typeof Effect == 'undefined') + throw("controls.js requires including script.aculo.us' effects.js library"); + +var Autocompleter = { }; +Autocompleter.Base = Class.create({ + baseInitialize: function(element, update, options) { + element = $(element); + this.element = element; + this.update = $(update); + this.hasFocus = false; + this.changed = false; + this.active = false; + this.index = 0; + this.entryCount = 0; + this.oldElementValue = this.element.value; + + if(this.setOptions) + this.setOptions(options); + else + this.options = options || { }; + + this.options.paramName = this.options.paramName || this.element.name; + this.options.tokens = this.options.tokens || []; + this.options.frequency = this.options.frequency || 0.4; + this.options.minChars = this.options.minChars || 1; + this.options.onShow = this.options.onShow || + function(element, update){ + if(!update.style.position || update.style.position=='absolute') { + update.style.position = 'absolute'; + Position.clone(element, update, { + setHeight: false, + offsetTop: element.offsetHeight + }); + } + Effect.Appear(update,{duration:0.15}); + }; + this.options.onHide = this.options.onHide || + function(element, update){ new Effect.Fade(update,{duration:0.15}) }; + + if(typeof(this.options.tokens) == 'string') + this.options.tokens = new Array(this.options.tokens); + // Force carriage returns as token delimiters anyway + if (!this.options.tokens.include('\n')) + this.options.tokens.push('\n'); + + this.observer = null; + + this.element.setAttribute('autocomplete','off'); + + Element.hide(this.update); + + Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this)); + Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this)); + }, + + show: function() { + if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); + if(!this.iefix && + (Prototype.Browser.IE) && + (Element.getStyle(this.update, 'position')=='absolute')) { + new Insertion.After(this.update, + ''); + this.iefix = $(this.update.id+'_iefix'); + } + if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); + }, + + fixIEOverlapping: function() { + Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)}); + this.iefix.style.zIndex = 1; + this.update.style.zIndex = 2; + Element.show(this.iefix); + }, + + hide: function() { + this.stopIndicator(); + if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); + if(this.iefix) Element.hide(this.iefix); + }, + + startIndicator: function() { + if(this.options.indicator) Element.show(this.options.indicator); + }, + + stopIndicator: function() { + if(this.options.indicator) Element.hide(this.options.indicator); + }, + + onKeyPress: function(event) { + if(this.active) + switch(event.keyCode) { + case Event.KEY_TAB: + case Event.KEY_RETURN: + this.selectEntry(); + Event.stop(event); + case Event.KEY_ESC: + this.hide(); + this.active = false; + Event.stop(event); + return; + case Event.KEY_LEFT: + case Event.KEY_RIGHT: + return; + case Event.KEY_UP: + this.markPrevious(); + this.render(); + Event.stop(event); + return; + case Event.KEY_DOWN: + this.markNext(); + this.render(); + Event.stop(event); + return; + } + else + if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || + (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return; + + this.changed = true; + this.hasFocus = true; + + if(this.observer) clearTimeout(this.observer); + this.observer = + setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); + }, + + activate: function() { + this.changed = false; + this.hasFocus = true; + this.getUpdatedChoices(); + }, + + onHover: function(event) { + var element = Event.findElement(event, 'LI'); + if(this.index != element.autocompleteIndex) + { + this.index = element.autocompleteIndex; + this.render(); + } + Event.stop(event); + }, + + onClick: function(event) { + var element = Event.findElement(event, 'LI'); + this.index = element.autocompleteIndex; + this.selectEntry(); + this.hide(); + }, + + onBlur: function(event) { + // needed to make click events working + setTimeout(this.hide.bind(this), 250); + this.hasFocus = false; + this.active = false; + }, + + render: function() { + if(this.entryCount > 0) { + for (var i = 0; i < this.entryCount; i++) + this.index==i ? + Element.addClassName(this.getEntry(i),"selected") : + Element.removeClassName(this.getEntry(i),"selected"); + if(this.hasFocus) { + this.show(); + this.active = true; + } + } else { + this.active = false; + this.hide(); + } + }, + + markPrevious: function() { + if(this.index > 0) this.index--; + else this.index = this.entryCount-1; + this.getEntry(this.index).scrollIntoView(true); + }, + + markNext: function() { + if(this.index < this.entryCount-1) this.index++; + else this.index = 0; + this.getEntry(this.index).scrollIntoView(false); + }, + + getEntry: function(index) { + return this.update.firstChild.childNodes[index]; + }, + + getCurrentEntry: function() { + return this.getEntry(this.index); + }, + + selectEntry: function() { + this.active = false; + this.updateElement(this.getCurrentEntry()); + }, + + updateElement: function(selectedElement) { + if (this.options.updateElement) { + this.options.updateElement(selectedElement); + return; + } + var value = ''; + if (this.options.select) { + var nodes = $(selectedElement).select('.' + this.options.select) || []; + if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); + } else + value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); + + var bounds = this.getTokenBounds(); + if (bounds[0] != -1) { + var newValue = this.element.value.substr(0, bounds[0]); + var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/); + if (whitespace) + newValue += whitespace[0]; + this.element.value = newValue + value + this.element.value.substr(bounds[1]); + } else { + this.element.value = value; + } + this.oldElementValue = this.element.value; + this.element.focus(); + + if (this.options.afterUpdateElement) + this.options.afterUpdateElement(this.element, selectedElement); + }, + + updateChoices: function(choices) { + if(!this.changed && this.hasFocus) { + this.update.innerHTML = choices; + Element.cleanWhitespace(this.update); + Element.cleanWhitespace(this.update.down()); + + if(this.update.firstChild && this.update.down().childNodes) { + this.entryCount = + this.update.down().childNodes.length; + for (var i = 0; i < this.entryCount; i++) { + var entry = this.getEntry(i); + entry.autocompleteIndex = i; + this.addObservers(entry); + } + } else { + this.entryCount = 0; + } + + this.stopIndicator(); + this.index = 0; + + if(this.entryCount==1 && this.options.autoSelect) { + this.selectEntry(); + this.hide(); + } else { + this.render(); + } + } + }, + + addObservers: function(element) { + Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); + Event.observe(element, "click", this.onClick.bindAsEventListener(this)); + }, + + onObserverEvent: function() { + this.changed = false; + this.tokenBounds = null; + if(this.getToken().length>=this.options.minChars) { + this.getUpdatedChoices(); + } else { + this.active = false; + this.hide(); + } + this.oldElementValue = this.element.value; + }, + + getToken: function() { + var bounds = this.getTokenBounds(); + return this.element.value.substring(bounds[0], bounds[1]).strip(); + }, + + getTokenBounds: function() { + if (null != this.tokenBounds) return this.tokenBounds; + var value = this.element.value; + if (value.strip().empty()) return [-1, 0]; + var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue); + var offset = (diff == this.oldElementValue.length ? 1 : 0); + var prevTokenPos = -1, nextTokenPos = value.length; + var tp; + for (var index = 0, l = this.options.tokens.length; index < l; ++index) { + tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1); + if (tp > prevTokenPos) prevTokenPos = tp; + tp = value.indexOf(this.options.tokens[index], diff + offset); + if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp; + } + return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]); + } +}); + +Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) { + var boundary = Math.min(newS.length, oldS.length); + for (var index = 0; index < boundary; ++index) + if (newS[index] != oldS[index]) + return index; + return boundary; +}; + +Ajax.Autocompleter = Class.create(Autocompleter.Base, { + initialize: function(element, update, url, options) { + this.baseInitialize(element, update, options); + this.options.asynchronous = true; + this.options.onComplete = this.onComplete.bind(this); + this.options.defaultParams = this.options.parameters || null; + this.url = url; + }, + + getUpdatedChoices: function() { + this.startIndicator(); + + var entry = encodeURIComponent(this.options.paramName) + '=' + + encodeURIComponent(this.getToken()); + + this.options.parameters = this.options.callback ? + this.options.callback(this.element, entry) : entry; + + if(this.options.defaultParams) + this.options.parameters += '&' + this.options.defaultParams; + + new Ajax.Request(this.url, this.options); + }, + + onComplete: function(request) { + this.updateChoices(request.responseText); + } +}); + +// The local array autocompleter. Used when you'd prefer to +// inject an array of autocompletion options into the page, rather +// than sending out Ajax queries, which can be quite slow sometimes. +// +// The constructor takes four parameters. The first two are, as usual, +// the id of the monitored textbox, and id of the autocompletion menu. +// The third is the array you want to autocomplete from, and the fourth +// is the options block. +// +// Extra local autocompletion options: +// - choices - How many autocompletion choices to offer +// +// - partialSearch - If false, the autocompleter will match entered +// text only at the beginning of strings in the +// autocomplete array. Defaults to true, which will +// match text at the beginning of any *word* in the +// strings in the autocomplete array. If you want to +// search anywhere in the string, additionally set +// the option fullSearch to true (default: off). +// +// - fullSsearch - Search anywhere in autocomplete array strings. +// +// - partialChars - How many characters to enter before triggering +// a partial match (unlike minChars, which defines +// how many characters are required to do any match +// at all). Defaults to 2. +// +// - ignoreCase - Whether to ignore case when autocompleting. +// Defaults to true. +// +// It's possible to pass in a custom function as the 'selector' +// option, if you prefer to write your own autocompletion logic. +// In that case, the other options above will not apply unless +// you support them. + +Autocompleter.Local = Class.create(Autocompleter.Base, { + initialize: function(element, update, array, options) { + this.baseInitialize(element, update, options); + this.options.array = array; + }, + + getUpdatedChoices: function() { + this.updateChoices(this.options.selector(this)); + }, + + setOptions: function(options) { + this.options = Object.extend({ + choices: 10, + partialSearch: true, + partialChars: 2, + ignoreCase: true, + fullSearch: false, + selector: function(instance) { + var ret = []; // Beginning matches + var partial = []; // Inside matches + var entry = instance.getToken(); + var count = 0; + + for (var i = 0; i < instance.options.array.length && + ret.length < instance.options.choices ; i++) { + + var elem = instance.options.array[i]; + var foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase()) : + elem.indexOf(entry); + + while (foundPos != -1) { + if (foundPos == 0 && elem.length != entry.length) { + ret.push("
  • " + elem.substr(0, entry.length) + "" + + elem.substr(entry.length) + "
  • "); + break; + } else if (entry.length >= instance.options.partialChars && + instance.options.partialSearch && foundPos != -1) { + if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { + partial.push("
  • " + elem.substr(0, foundPos) + "" + + elem.substr(foundPos, entry.length) + "" + elem.substr( + foundPos + entry.length) + "
  • "); + break; + } + } + + foundPos = instance.options.ignoreCase ? + elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : + elem.indexOf(entry, foundPos + 1); + + } + } + if (partial.length) + ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)); + return "
      " + ret.join('') + "
    "; + } + }, options || { }); + } +}); + +// AJAX in-place editor and collection editor +// Full rewrite by Christophe Porteneuve (April 2007). + +// Use this if you notice weird scrolling problems on some browsers, +// the DOM might be a bit confused when this gets called so do this +// waits 1 ms (with setTimeout) until it does the activation +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + Field.activate(field); + }, 1); +}; + +Ajax.InPlaceEditor = Class.create({ + initialize: function(element, url, options) { + this.url = url; + this.element = element = $(element); + this.prepareOptions(); + this._controls = { }; + arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!! + Object.extend(this.options, options || { }); + if (!this.options.formId && this.element.id) { + this.options.formId = this.element.id + '-inplaceeditor'; + if ($(this.options.formId)) + this.options.formId = ''; + } + if (this.options.externalControl) + this.options.externalControl = $(this.options.externalControl); + if (!this.options.externalControl) + this.options.externalControlOnly = false; + this._originalBackground = this.element.getStyle('background-color') || 'transparent'; + this.element.title = this.options.clickToEditText; + this._boundCancelHandler = this.handleFormCancellation.bind(this); + this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); + this._boundFailureHandler = this.handleAJAXFailure.bind(this); + this._boundSubmitHandler = this.handleFormSubmission.bind(this); + this._boundWrapperHandler = this.wrapUp.bind(this); + this.registerListeners(); + }, + checkForEscapeOrReturn: function(e) { + if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return; + if (Event.KEY_ESC == e.keyCode) + this.handleFormCancellation(e); + else if (Event.KEY_RETURN == e.keyCode) + this.handleFormSubmission(e); + }, + createControl: function(mode, handler, extraClasses) { + var control = this.options[mode + 'Control']; + var text = this.options[mode + 'Text']; + if ('button' == control) { + var btn = document.createElement('input'); + btn.type = 'submit'; + btn.value = text; + btn.className = 'editor_' + mode + '_button'; + if ('cancel' == mode) + btn.onclick = this._boundCancelHandler; + this._form.appendChild(btn); + this._controls[mode] = btn; + } else if ('link' == control) { + var link = document.createElement('a'); + link.href = '#'; + link.appendChild(document.createTextNode(text)); + link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler; + link.className = 'editor_' + mode + '_link'; + if (extraClasses) + link.className += ' ' + extraClasses; + this._form.appendChild(link); + this._controls[mode] = link; + } + }, + createEditField: function() { + var text = (this.options.loadTextURL ? this.options.loadingText : this.getText()); + var fld; + if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { + fld = document.createElement('input'); + fld.type = 'text'; + var size = this.options.size || this.options.cols || 0; + if (0 < size) fld.size = size; + } else { + fld = document.createElement('textarea'); + fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); + fld.cols = this.options.cols || 40; + } + fld.name = this.options.paramName; + fld.value = text; // No HTML breaks conversion anymore + fld.className = 'editor_field'; + if (this.options.submitOnBlur) + fld.onblur = this._boundSubmitHandler; + this._controls.editor = fld; + if (this.options.loadTextURL) + this.loadExternalText(); + this._form.appendChild(this._controls.editor); + }, + createForm: function() { + var ipe = this; + function addText(mode, condition) { + var text = ipe.options['text' + mode + 'Controls']; + if (!text || condition === false) return; + ipe._form.appendChild(document.createTextNode(text)); + }; + this._form = $(document.createElement('form')); + this._form.id = this.options.formId; + this._form.addClassName(this.options.formClassName); + this._form.onsubmit = this._boundSubmitHandler; + this.createEditField(); + if ('textarea' == this._controls.editor.tagName.toLowerCase()) + this._form.appendChild(document.createElement('br')); + if (this.options.onFormCustomization) + this.options.onFormCustomization(this, this._form); + addText('Before', this.options.okControl || this.options.cancelControl); + this.createControl('ok', this._boundSubmitHandler); + addText('Between', this.options.okControl && this.options.cancelControl); + this.createControl('cancel', this._boundCancelHandler, 'editor_cancel'); + addText('After', this.options.okControl || this.options.cancelControl); + }, + destroy: function() { + if (this._oldInnerHTML) + this.element.innerHTML = this._oldInnerHTML; + this.leaveEditMode(); + this.unregisterListeners(); + }, + enterEditMode: function(e) { + if (this._saving || this._editing) return; + this._editing = true; + this.triggerCallback('onEnterEditMode'); + if (this.options.externalControl) + this.options.externalControl.hide(); + this.element.hide(); + this.createForm(); + this.element.parentNode.insertBefore(this._form, this.element); + if (!this.options.loadTextURL) + this.postProcessEditField(); + if (e) Event.stop(e); + }, + enterHover: function(e) { + if (this.options.hoverClassName) + this.element.addClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onEnterHover'); + }, + getText: function() { + return this.element.innerHTML.unescapeHTML(); + }, + handleAJAXFailure: function(transport) { + this.triggerCallback('onFailure', transport); + if (this._oldInnerHTML) { + this.element.innerHTML = this._oldInnerHTML; + this._oldInnerHTML = null; + } + }, + handleFormCancellation: function(e) { + this.wrapUp(); + if (e) Event.stop(e); + }, + handleFormSubmission: function(e) { + var form = this._form; + var value = $F(this._controls.editor); + this.prepareSubmission(); + var params = this.options.callback(form, value) || ''; + if (Object.isString(params)) + params = params.toQueryParams(); + params.editorId = this.element.id; + if (this.options.htmlResponse) { + var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Updater({ success: this.element }, this.url, options); + } else { + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: params, + onComplete: this._boundWrapperHandler, + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.url, options); + } + if (e) Event.stop(e); + }, + leaveEditMode: function() { + this.element.removeClassName(this.options.savingClassName); + this.removeForm(); + this.leaveHover(); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + if (this.options.externalControl) + this.options.externalControl.show(); + this._saving = false; + this._editing = false; + this._oldInnerHTML = null; + this.triggerCallback('onLeaveEditMode'); + }, + leaveHover: function(e) { + if (this.options.hoverClassName) + this.element.removeClassName(this.options.hoverClassName); + if (this._saving) return; + this.triggerCallback('onLeaveHover'); + }, + loadExternalText: function() { + this._form.addClassName(this.options.loadingClassName); + this._controls.editor.disabled = true; + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._form.removeClassName(this.options.loadingClassName); + var text = transport.responseText; + if (this.options.stripLoadedTextTags) + text = text.stripTags(); + this._controls.editor.value = text; + this._controls.editor.disabled = false; + this.postProcessEditField(); + }.bind(this), + onFailure: this._boundFailureHandler + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + postProcessEditField: function() { + var fpc = this.options.fieldPostCreation; + if (fpc) + $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate'](); + }, + prepareOptions: function() { + this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); + Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); + [this._extraDefaultOptions].flatten().compact().each(function(defs) { + Object.extend(this.options, defs); + }.bind(this)); + }, + prepareSubmission: function() { + this._saving = true; + this.removeForm(); + this.leaveHover(); + this.showSaving(); + }, + registerListeners: function() { + this._listeners = { }; + var listener; + $H(Ajax.InPlaceEditor.Listeners).each(function(pair) { + listener = this[pair.value].bind(this); + this._listeners[pair.key] = listener; + if (!this.options.externalControlOnly) + this.element.observe(pair.key, listener); + if (this.options.externalControl) + this.options.externalControl.observe(pair.key, listener); + }.bind(this)); + }, + removeForm: function() { + if (!this._form) return; + this._form.remove(); + this._form = null; + this._controls = { }; + }, + showSaving: function() { + this._oldInnerHTML = this.element.innerHTML; + this.element.innerHTML = this.options.savingText; + this.element.addClassName(this.options.savingClassName); + this.element.style.backgroundColor = this._originalBackground; + this.element.show(); + }, + triggerCallback: function(cbName, arg) { + if ('function' == typeof this.options[cbName]) { + this.options[cbName](this, arg); + } + }, + unregisterListeners: function() { + $H(this._listeners).each(function(pair) { + if (!this.options.externalControlOnly) + this.element.stopObserving(pair.key, pair.value); + if (this.options.externalControl) + this.options.externalControl.stopObserving(pair.key, pair.value); + }.bind(this)); + }, + wrapUp: function(transport) { + this.leaveEditMode(); + // Can't use triggerCallback due to backward compatibility: requires + // binding + direct element + this._boundComplete(transport, this.element); + } +}); + +Object.extend(Ajax.InPlaceEditor.prototype, { + dispose: Ajax.InPlaceEditor.prototype.destroy +}); + +Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { + initialize: function($super, element, url, options) { + this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; + $super(element, url, options); + }, + + createEditField: function() { + var list = document.createElement('select'); + list.name = this.options.paramName; + list.size = 1; + this._controls.editor = list; + this._collection = this.options.collection || []; + if (this.options.loadCollectionURL) + this.loadCollection(); + else + this.checkForExternalText(); + this._form.appendChild(this._controls.editor); + }, + + loadCollection: function() { + this._form.addClassName(this.options.loadingClassName); + this.showLoadingText(this.options.loadingCollectionText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + var js = transport.responseText.strip(); + if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check + throw('Server returned an invalid collection representation.'); + this._collection = eval(js); + this.checkForExternalText(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadCollectionURL, options); + }, + + showLoadingText: function(text) { + this._controls.editor.disabled = true; + var tempOption = this._controls.editor.firstChild; + if (!tempOption) { + tempOption = document.createElement('option'); + tempOption.value = ''; + this._controls.editor.appendChild(tempOption); + tempOption.selected = true; + } + tempOption.update((text || '').stripScripts().stripTags()); + }, + + checkForExternalText: function() { + this._text = this.getText(); + if (this.options.loadTextURL) + this.loadExternalText(); + else + this.buildOptionList(); + }, + + loadExternalText: function() { + this.showLoadingText(this.options.loadingText); + var options = Object.extend({ method: 'get' }, this.options.ajaxOptions); + Object.extend(options, { + parameters: 'editorId=' + encodeURIComponent(this.element.id), + onComplete: Prototype.emptyFunction, + onSuccess: function(transport) { + this._text = transport.responseText.strip(); + this.buildOptionList(); + }.bind(this), + onFailure: this.onFailure + }); + new Ajax.Request(this.options.loadTextURL, options); + }, + + buildOptionList: function() { + this._form.removeClassName(this.options.loadingClassName); + this._collection = this._collection.map(function(entry) { + return 2 === entry.length ? entry : [entry, entry].flatten(); + }); + var marker = ('value' in this.options) ? this.options.value : this._text; + var textFound = this._collection.any(function(entry) { + return entry[0] == marker; + }.bind(this)); + this._controls.editor.update(''); + var option; + this._collection.each(function(entry, index) { + option = document.createElement('option'); + option.value = entry[0]; + option.selected = textFound ? entry[0] == marker : 0 == index; + option.appendChild(document.createTextNode(entry[1])); + this._controls.editor.appendChild(option); + }.bind(this)); + this._controls.editor.disabled = false; + Field.scrollFreeActivate(this._controls.editor); + } +}); + +//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! **** +//**** This only exists for a while, in order to let **** +//**** users adapt to the new API. Read up on the new **** +//**** API and convert your code to it ASAP! **** + +Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) { + if (!options) return; + function fallback(name, expr) { + if (name in options || expr === undefined) return; + options[name] = expr; + }; + fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' : + options.cancelLink == options.cancelButton == false ? false : undefined))); + fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' : + options.okLink == options.okButton == false ? false : undefined))); + fallback('highlightColor', options.highlightcolor); + fallback('highlightEndColor', options.highlightendcolor); +}; + +Object.extend(Ajax.InPlaceEditor, { + DefaultOptions: { + ajaxOptions: { }, + autoRows: 3, // Use when multi-line w/ rows == 1 + cancelControl: 'link', // 'link'|'button'|false + cancelText: 'cancel', + clickToEditText: 'Click to edit', + externalControl: null, // id|elt + externalControlOnly: false, + fieldPostCreation: 'activate', // 'activate'|'focus'|false + formClassName: 'inplaceeditor-form', + formId: null, // id|elt + highlightColor: '#ffff99', + highlightEndColor: '#ffffff', + hoverClassName: '', + htmlResponse: true, + loadingClassName: 'inplaceeditor-loading', + loadingText: 'Loading...', + okControl: 'button', // 'link'|'button'|false + okText: 'ok', + paramName: 'value', + rows: 1, // If 1 and multi-line, uses autoRows + savingClassName: 'inplaceeditor-saving', + savingText: 'Saving...', + size: 0, + stripLoadedTextTags: false, + submitOnBlur: false, + textAfterControls: '', + textBeforeControls: '', + textBetweenControls: '' + }, + DefaultCallbacks: { + callback: function(form) { + return Form.serialize(form); + }, + onComplete: function(transport, element) { + // For backward compatibility, this one is bound to the IPE, and passes + // the element directly. It was too often customized, so we don't break it. + new Effect.Highlight(element, { + startcolor: this.options.highlightColor, keepBackgroundImage: true }); + }, + onEnterEditMode: null, + onEnterHover: function(ipe) { + ipe.element.style.backgroundColor = ipe.options.highlightColor; + if (ipe._effect) + ipe._effect.cancel(); + }, + onFailure: function(transport, ipe) { + alert('Error communication with the server: ' + transport.responseText.stripTags()); + }, + onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls. + onLeaveEditMode: null, + onLeaveHover: function(ipe) { + ipe._effect = new Effect.Highlight(ipe.element, { + startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor, + restorecolor: ipe._originalBackground, keepBackgroundImage: true + }); + } + }, + Listeners: { + click: 'enterEditMode', + keydown: 'checkForEscapeOrReturn', + mouseover: 'enterHover', + mouseout: 'leaveHover' + } +}); + +Ajax.InPlaceCollectionEditor.DefaultOptions = { + loadingCollectionText: 'Loading options...' +}; + +// Delayed observer, like Form.Element.Observer, +// but waits for delay after last key input +// Ideal for live-search fields + +Form.Element.DelayedObserver = Class.create({ + initialize: function(element, delay, callback) { + this.delay = delay || 0.5; + this.element = $(element); + this.callback = callback; + this.timer = null; + this.lastValue = $F(this.element); + Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); + }, + delayedListener: function(event) { + if(this.lastValue == $F(this.element)) return; + if(this.timer) clearTimeout(this.timer); + this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); + this.lastValue = $F(this.element); + }, + onTimerEvent: function() { + this.timer = null; + this.callback(this.element, $F(this.element)); + } +}); \ No newline at end of file diff --git a/episode-253/picturesque/public/javascripts/dragdrop.js b/episode-253/picturesque/public/javascripts/dragdrop.js new file mode 100644 index 00000000..15c6dbca --- /dev/null +++ b/episode-253/picturesque/public/javascripts/dragdrop.js @@ -0,0 +1,974 @@ +// script.aculo.us dragdrop.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +if(Object.isUndefined(Effect)) + throw("dragdrop.js requires including script.aculo.us' effects.js library"); + +var Droppables = { + drops: [], + + remove: function(element) { + this.drops = this.drops.reject(function(d) { return d.element==$(element) }); + }, + + add: function(element) { + element = $(element); + var options = Object.extend({ + greedy: true, + hoverclass: null, + tree: false + }, arguments[1] || { }); + + // cache containers + if(options.containment) { + options._containers = []; + var containment = options.containment; + if(Object.isArray(containment)) { + containment.each( function(c) { options._containers.push($(c)) }); + } else { + options._containers.push($(containment)); + } + } + + if(options.accept) options.accept = [options.accept].flatten(); + + Element.makePositioned(element); // fix IE + options.element = element; + + this.drops.push(options); + }, + + findDeepestChild: function(drops) { + deepest = drops[0]; + + for (i = 1; i < drops.length; ++i) + if (Element.isParent(drops[i].element, deepest.element)) + deepest = drops[i]; + + return deepest; + }, + + isContained: function(element, drop) { + var containmentNode; + if(drop.tree) { + containmentNode = element.treeNode; + } else { + containmentNode = element.parentNode; + } + return drop._containers.detect(function(c) { return containmentNode == c }); + }, + + isAffected: function(point, element, drop) { + return ( + (drop.element!=element) && + ((!drop._containers) || + this.isContained(element, drop)) && + ((!drop.accept) || + (Element.classNames(element).detect( + function(v) { return drop.accept.include(v) } ) )) && + Position.within(drop.element, point[0], point[1]) ); + }, + + deactivate: function(drop) { + if(drop.hoverclass) + Element.removeClassName(drop.element, drop.hoverclass); + this.last_active = null; + }, + + activate: function(drop) { + if(drop.hoverclass) + Element.addClassName(drop.element, drop.hoverclass); + this.last_active = drop; + }, + + show: function(point, element) { + if(!this.drops.length) return; + var drop, affected = []; + + this.drops.each( function(drop) { + if(Droppables.isAffected(point, element, drop)) + affected.push(drop); + }); + + if(affected.length>0) + drop = Droppables.findDeepestChild(affected); + + if(this.last_active && this.last_active != drop) this.deactivate(this.last_active); + if (drop) { + Position.within(drop.element, point[0], point[1]); + if(drop.onHover) + drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); + + if (drop != this.last_active) Droppables.activate(drop); + } + }, + + fire: function(event, element) { + if(!this.last_active) return; + Position.prepare(); + + if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) + if (this.last_active.onDrop) { + this.last_active.onDrop(element, this.last_active.element, event); + return true; + } + }, + + reset: function() { + if(this.last_active) + this.deactivate(this.last_active); + } +}; + +var Draggables = { + drags: [], + observers: [], + + register: function(draggable) { + if(this.drags.length == 0) { + this.eventMouseUp = this.endDrag.bindAsEventListener(this); + this.eventMouseMove = this.updateDrag.bindAsEventListener(this); + this.eventKeypress = this.keyPress.bindAsEventListener(this); + + Event.observe(document, "mouseup", this.eventMouseUp); + Event.observe(document, "mousemove", this.eventMouseMove); + Event.observe(document, "keypress", this.eventKeypress); + } + this.drags.push(draggable); + }, + + unregister: function(draggable) { + this.drags = this.drags.reject(function(d) { return d==draggable }); + if(this.drags.length == 0) { + Event.stopObserving(document, "mouseup", this.eventMouseUp); + Event.stopObserving(document, "mousemove", this.eventMouseMove); + Event.stopObserving(document, "keypress", this.eventKeypress); + } + }, + + activate: function(draggable) { + if(draggable.options.delay) { + this._timeout = setTimeout(function() { + Draggables._timeout = null; + window.focus(); + Draggables.activeDraggable = draggable; + }.bind(this), draggable.options.delay); + } else { + window.focus(); // allows keypress events if window isn't currently focused, fails for Safari + this.activeDraggable = draggable; + } + }, + + deactivate: function() { + this.activeDraggable = null; + }, + + updateDrag: function(event) { + if(!this.activeDraggable) return; + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + // Mozilla-based browsers fire successive mousemove events with + // the same coordinates, prevent needless redrawing (moz bug?) + if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; + this._lastPointer = pointer; + + this.activeDraggable.updateDrag(event, pointer); + }, + + endDrag: function(event) { + if(this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + if(!this.activeDraggable) return; + this._lastPointer = null; + this.activeDraggable.endDrag(event); + this.activeDraggable = null; + }, + + keyPress: function(event) { + if(this.activeDraggable) + this.activeDraggable.keyPress(event); + }, + + addObserver: function(observer) { + this.observers.push(observer); + this._cacheObserverCallbacks(); + }, + + removeObserver: function(element) { // element instead of observer fixes mem leaks + this.observers = this.observers.reject( function(o) { return o.element==element }); + this._cacheObserverCallbacks(); + }, + + notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' + if(this[eventName+'Count'] > 0) + this.observers.each( function(o) { + if(o[eventName]) o[eventName](eventName, draggable, event); + }); + if(draggable.options[eventName]) draggable.options[eventName](draggable, event); + }, + + _cacheObserverCallbacks: function() { + ['onStart','onEnd','onDrag'].each( function(eventName) { + Draggables[eventName+'Count'] = Draggables.observers.select( + function(o) { return o[eventName]; } + ).length; + }); + } +}; + +/*--------------------------------------------------------------------------*/ + +var Draggable = Class.create({ + initialize: function(element) { + var defaults = { + handle: false, + reverteffect: function(element, top_offset, left_offset) { + var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; + new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur, + queue: {scope:'_draggable', position:'end'} + }); + }, + endeffect: function(element) { + var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0; + new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, + queue: {scope:'_draggable', position:'end'}, + afterFinish: function(){ + Draggable._dragging[element] = false + } + }); + }, + zindex: 1000, + revert: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] } + delay: 0 + }; + + if(!arguments[1] || Object.isUndefined(arguments[1].endeffect)) + Object.extend(defaults, { + starteffect: function(element) { + element._opacity = Element.getOpacity(element); + Draggable._dragging[element] = true; + new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); + } + }); + + var options = Object.extend(defaults, arguments[1] || { }); + + this.element = $(element); + + if(options.handle && Object.isString(options.handle)) + this.handle = this.element.down('.'+options.handle, 0); + + if(!this.handle) this.handle = $(options.handle); + if(!this.handle) this.handle = this.element; + + if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) { + options.scroll = $(options.scroll); + this._isScrollChild = Element.childOf(this.element, options.scroll); + } + + Element.makePositioned(this.element); // fix IE + + this.options = options; + this.dragging = false; + + this.eventMouseDown = this.initDrag.bindAsEventListener(this); + Event.observe(this.handle, "mousedown", this.eventMouseDown); + + Draggables.register(this); + }, + + destroy: function() { + Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); + Draggables.unregister(this); + }, + + currentDelta: function() { + return([ + parseInt(Element.getStyle(this.element,'left') || '0'), + parseInt(Element.getStyle(this.element,'top') || '0')]); + }, + + initDrag: function(event) { + if(!Object.isUndefined(Draggable._dragging[this.element]) && + Draggable._dragging[this.element]) return; + if(Event.isLeftClick(event)) { + // abort on form elements, fixes a Firefox issue + var src = Event.element(event); + if((tag_name = src.tagName.toUpperCase()) && ( + tag_name=='INPUT' || + tag_name=='SELECT' || + tag_name=='OPTION' || + tag_name=='BUTTON' || + tag_name=='TEXTAREA')) return; + + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + var pos = this.element.cumulativeOffset(); + this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); + + Draggables.activate(this); + Event.stop(event); + } + }, + + startDrag: function(event) { + this.dragging = true; + if(!this.delta) + this.delta = this.currentDelta(); + + if(this.options.zindex) { + this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); + this.element.style.zIndex = this.options.zindex; + } + + if(this.options.ghosting) { + this._clone = this.element.cloneNode(true); + this._originallyAbsolute = (this.element.getStyle('position') == 'absolute'); + if (!this._originallyAbsolute) + Position.absolutize(this.element); + this.element.parentNode.insertBefore(this._clone, this.element); + } + + if(this.options.scroll) { + if (this.options.scroll == window) { + var where = this._getWindowScroll(this.options.scroll); + this.originalScrollLeft = where.left; + this.originalScrollTop = where.top; + } else { + this.originalScrollLeft = this.options.scroll.scrollLeft; + this.originalScrollTop = this.options.scroll.scrollTop; + } + } + + Draggables.notify('onStart', this, event); + + if(this.options.starteffect) this.options.starteffect(this.element); + }, + + updateDrag: function(event, pointer) { + if(!this.dragging) this.startDrag(event); + + if(!this.options.quiet){ + Position.prepare(); + Droppables.show(pointer, this.element); + } + + Draggables.notify('onDrag', this, event); + + this.draw(pointer); + if(this.options.change) this.options.change(this); + + if(this.options.scroll) { + this.stopScrolling(); + + var p; + if (this.options.scroll == window) { + with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; } + } else { + p = Position.page(this.options.scroll); + p[0] += this.options.scroll.scrollLeft + Position.deltaX; + p[1] += this.options.scroll.scrollTop + Position.deltaY; + p.push(p[0]+this.options.scroll.offsetWidth); + p.push(p[1]+this.options.scroll.offsetHeight); + } + var speed = [0,0]; + if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity); + if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity); + if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity); + if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity); + this.startScrolling(speed); + } + + // fix AppleWebKit rendering + if(Prototype.Browser.WebKit) window.scrollBy(0,0); + + Event.stop(event); + }, + + finishDrag: function(event, success) { + this.dragging = false; + + if(this.options.quiet){ + Position.prepare(); + var pointer = [Event.pointerX(event), Event.pointerY(event)]; + Droppables.show(pointer, this.element); + } + + if(this.options.ghosting) { + if (!this._originallyAbsolute) + Position.relativize(this.element); + delete this._originallyAbsolute; + Element.remove(this._clone); + this._clone = null; + } + + var dropped = false; + if(success) { + dropped = Droppables.fire(event, this.element); + if (!dropped) dropped = false; + } + if(dropped && this.options.onDropped) this.options.onDropped(this.element); + Draggables.notify('onEnd', this, event); + + var revert = this.options.revert; + if(revert && Object.isFunction(revert)) revert = revert(this.element); + + var d = this.currentDelta(); + if(revert && this.options.reverteffect) { + if (dropped == 0 || revert != 'failure') + this.options.reverteffect(this.element, + d[1]-this.delta[1], d[0]-this.delta[0]); + } else { + this.delta = d; + } + + if(this.options.zindex) + this.element.style.zIndex = this.originalZ; + + if(this.options.endeffect) + this.options.endeffect(this.element); + + Draggables.deactivate(this); + Droppables.reset(); + }, + + keyPress: function(event) { + if(event.keyCode!=Event.KEY_ESC) return; + this.finishDrag(event, false); + Event.stop(event); + }, + + endDrag: function(event) { + if(!this.dragging) return; + this.stopScrolling(); + this.finishDrag(event, true); + Event.stop(event); + }, + + draw: function(point) { + var pos = this.element.cumulativeOffset(); + if(this.options.ghosting) { + var r = Position.realOffset(this.element); + pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; + } + + var d = this.currentDelta(); + pos[0] -= d[0]; pos[1] -= d[1]; + + if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { + pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft; + pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop; + } + + var p = [0,1].map(function(i){ + return (point[i]-pos[i]-this.offset[i]) + }.bind(this)); + + if(this.options.snap) { + if(Object.isFunction(this.options.snap)) { + p = this.options.snap(p[0],p[1],this); + } else { + if(Object.isArray(this.options.snap)) { + p = p.map( function(v, i) { + return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this)); + } else { + p = p.map( function(v) { + return (v/this.options.snap).round()*this.options.snap }.bind(this)); + } + }} + + var style = this.element.style; + if((!this.options.constraint) || (this.options.constraint=='horizontal')) + style.left = p[0] + "px"; + if((!this.options.constraint) || (this.options.constraint=='vertical')) + style.top = p[1] + "px"; + + if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering + }, + + stopScrolling: function() { + if(this.scrollInterval) { + clearInterval(this.scrollInterval); + this.scrollInterval = null; + Draggables._lastScrollPointer = null; + } + }, + + startScrolling: function(speed) { + if(!(speed[0] || speed[1])) return; + this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed]; + this.lastScrolled = new Date(); + this.scrollInterval = setInterval(this.scroll.bind(this), 10); + }, + + scroll: function() { + var current = new Date(); + var delta = current - this.lastScrolled; + this.lastScrolled = current; + if(this.options.scroll == window) { + with (this._getWindowScroll(this.options.scroll)) { + if (this.scrollSpeed[0] || this.scrollSpeed[1]) { + var d = delta / 1000; + this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] ); + } + } + } else { + this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; + this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000; + } + + Position.prepare(); + Droppables.show(Draggables._lastPointer, this.element); + Draggables.notify('onDrag', this); + if (this._isScrollChild) { + Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); + Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; + Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; + if (Draggables._lastScrollPointer[0] < 0) + Draggables._lastScrollPointer[0] = 0; + if (Draggables._lastScrollPointer[1] < 0) + Draggables._lastScrollPointer[1] = 0; + this.draw(Draggables._lastScrollPointer); + } + + if(this.options.change) this.options.change(this); + }, + + _getWindowScroll: function(w) { + var T, L, W, H; + with (w.document) { + if (w.document.documentElement && documentElement.scrollTop) { + T = documentElement.scrollTop; + L = documentElement.scrollLeft; + } else if (w.document.body) { + T = body.scrollTop; + L = body.scrollLeft; + } + if (w.innerWidth) { + W = w.innerWidth; + H = w.innerHeight; + } else if (w.document.documentElement && documentElement.clientWidth) { + W = documentElement.clientWidth; + H = documentElement.clientHeight; + } else { + W = body.offsetWidth; + H = body.offsetHeight; + } + } + return { top: T, left: L, width: W, height: H }; + } +}); + +Draggable._dragging = { }; + +/*--------------------------------------------------------------------------*/ + +var SortableObserver = Class.create({ + initialize: function(element, observer) { + this.element = $(element); + this.observer = observer; + this.lastValue = Sortable.serialize(this.element); + }, + + onStart: function() { + this.lastValue = Sortable.serialize(this.element); + }, + + onEnd: function() { + Sortable.unmark(); + if(this.lastValue != Sortable.serialize(this.element)) + this.observer(this.element) + } +}); + +var Sortable = { + SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, + + sortables: { }, + + _findRootElement: function(element) { + while (element.tagName.toUpperCase() != "BODY") { + if(element.id && Sortable.sortables[element.id]) return element; + element = element.parentNode; + } + }, + + options: function(element) { + element = Sortable._findRootElement($(element)); + if(!element) return; + return Sortable.sortables[element.id]; + }, + + destroy: function(element){ + element = $(element); + var s = Sortable.sortables[element.id]; + + if(s) { + Draggables.removeObserver(s.element); + s.droppables.each(function(d){ Droppables.remove(d) }); + s.draggables.invoke('destroy'); + + delete Sortable.sortables[s.element.id]; + } + }, + + create: function(element) { + element = $(element); + var options = Object.extend({ + element: element, + tag: 'li', // assumes li children, override with tag: 'tagname' + dropOnEmpty: false, + tree: false, + treeTag: 'ul', + overlap: 'vertical', // one of 'vertical', 'horizontal' + constraint: 'vertical', // one of 'vertical', 'horizontal', false + containment: element, // also takes array of elements (or id's); or false + handle: false, // or a CSS class + only: false, + delay: 0, + hoverclass: null, + ghosting: false, + quiet: false, + scroll: false, + scrollSensitivity: 20, + scrollSpeed: 15, + format: this.SERIALIZE_RULE, + + // these take arrays of elements or ids and can be + // used for better initialization performance + elements: false, + handles: false, + + onChange: Prototype.emptyFunction, + onUpdate: Prototype.emptyFunction + }, arguments[1] || { }); + + // clear any old sortable with same element + this.destroy(element); + + // build options for the draggables + var options_for_draggable = { + revert: true, + quiet: options.quiet, + scroll: options.scroll, + scrollSpeed: options.scrollSpeed, + scrollSensitivity: options.scrollSensitivity, + delay: options.delay, + ghosting: options.ghosting, + constraint: options.constraint, + handle: options.handle }; + + if(options.starteffect) + options_for_draggable.starteffect = options.starteffect; + + if(options.reverteffect) + options_for_draggable.reverteffect = options.reverteffect; + else + if(options.ghosting) options_for_draggable.reverteffect = function(element) { + element.style.top = 0; + element.style.left = 0; + }; + + if(options.endeffect) + options_for_draggable.endeffect = options.endeffect; + + if(options.zindex) + options_for_draggable.zindex = options.zindex; + + // build options for the droppables + var options_for_droppable = { + overlap: options.overlap, + containment: options.containment, + tree: options.tree, + hoverclass: options.hoverclass, + onHover: Sortable.onHover + }; + + var options_for_tree = { + onHover: Sortable.onEmptyHover, + overlap: options.overlap, + containment: options.containment, + hoverclass: options.hoverclass + }; + + // fix for gecko engine + Element.cleanWhitespace(element); + + options.draggables = []; + options.droppables = []; + + // drop on empty handling + if(options.dropOnEmpty || options.tree) { + Droppables.add(element, options_for_tree); + options.droppables.push(element); + } + + (options.elements || this.findElements(element, options) || []).each( function(e,i) { + var handle = options.handles ? $(options.handles[i]) : + (options.handle ? $(e).select('.' + options.handle)[0] : e); + options.draggables.push( + new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); + Droppables.add(e, options_for_droppable); + if(options.tree) e.treeNode = element; + options.droppables.push(e); + }); + + if(options.tree) { + (Sortable.findTreeElements(element, options) || []).each( function(e) { + Droppables.add(e, options_for_tree); + e.treeNode = element; + options.droppables.push(e); + }); + } + + // keep reference + this.sortables[element.identify()] = options; + + // for onupdate + Draggables.addObserver(new SortableObserver(element, options.onUpdate)); + + }, + + // return all suitable-for-sortable elements in a guaranteed order + findElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.tag); + }, + + findTreeElements: function(element, options) { + return Element.findChildren( + element, options.only, options.tree ? true : false, options.treeTag); + }, + + onHover: function(element, dropon, overlap) { + if(Element.isParent(dropon, element)) return; + + if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) { + return; + } else if(overlap>0.5) { + Sortable.mark(dropon, 'before'); + if(dropon.previousSibling != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, dropon); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } else { + Sortable.mark(dropon, 'after'); + var nextElement = dropon.nextSibling || null; + if(nextElement != element) { + var oldParentNode = element.parentNode; + element.style.visibility = "hidden"; // fix gecko rendering + dropon.parentNode.insertBefore(element, nextElement); + if(dropon.parentNode!=oldParentNode) + Sortable.options(oldParentNode).onChange(element); + Sortable.options(dropon.parentNode).onChange(element); + } + } + }, + + onEmptyHover: function(element, dropon, overlap) { + var oldParentNode = element.parentNode; + var droponOptions = Sortable.options(dropon); + + if(!Element.isParent(dropon, element)) { + var index; + + var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only}); + var child = null; + + if(children) { + var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap); + + for (index = 0; index < children.length; index += 1) { + if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) { + offset -= Element.offsetSize (children[index], droponOptions.overlap); + } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) { + child = index + 1 < children.length ? children[index + 1] : null; + break; + } else { + child = children[index]; + break; + } + } + } + + dropon.insertBefore(element, child); + + Sortable.options(oldParentNode).onChange(element); + droponOptions.onChange(element); + } + }, + + unmark: function() { + if(Sortable._marker) Sortable._marker.hide(); + }, + + mark: function(dropon, position) { + // mark on ghosting only + var sortable = Sortable.options(dropon.parentNode); + if(sortable && !sortable.ghosting) return; + + if(!Sortable._marker) { + Sortable._marker = + ($('dropmarker') || Element.extend(document.createElement('DIV'))). + hide().addClassName('dropmarker').setStyle({position:'absolute'}); + document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); + } + var offsets = dropon.cumulativeOffset(); + Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'}); + + if(position=='after') + if(sortable.overlap == 'horizontal') + Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'}); + else + Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'}); + + Sortable._marker.show(); + }, + + _tree: function(element, options, parent) { + var children = Sortable.findElements(element, options) || []; + + for (var i = 0; i < children.length; ++i) { + var match = children[i].id.match(options.format); + + if (!match) continue; + + var child = { + id: encodeURIComponent(match ? match[1] : null), + element: element, + parent: parent, + children: [], + position: parent.children.length, + container: $(children[i]).down(options.treeTag) + }; + + /* Get the element containing the children and recurse over it */ + if (child.container) + this._tree(child.container, options, child); + + parent.children.push (child); + } + + return parent; + }, + + tree: function(element) { + element = $(element); + var sortableOptions = this.options(element); + var options = Object.extend({ + tag: sortableOptions.tag, + treeTag: sortableOptions.treeTag, + only: sortableOptions.only, + name: element.id, + format: sortableOptions.format + }, arguments[1] || { }); + + var root = { + id: null, + parent: null, + children: [], + container: element, + position: 0 + }; + + return Sortable._tree(element, options, root); + }, + + /* Construct a [i] index for a particular node */ + _constructIndex: function(node) { + var index = ''; + do { + if (node.id) index = '[' + node.position + ']' + index; + } while ((node = node.parent) != null); + return index; + }, + + sequence: function(element) { + element = $(element); + var options = Object.extend(this.options(element), arguments[1] || { }); + + return $(this.findElements(element, options) || []).map( function(item) { + return item.id.match(options.format) ? item.id.match(options.format)[1] : ''; + }); + }, + + setSequence: function(element, new_sequence) { + element = $(element); + var options = Object.extend(this.options(element), arguments[2] || { }); + + var nodeMap = { }; + this.findElements(element, options).each( function(n) { + if (n.id.match(options.format)) + nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode]; + n.parentNode.removeChild(n); + }); + + new_sequence.each(function(ident) { + var n = nodeMap[ident]; + if (n) { + n[1].appendChild(n[0]); + delete nodeMap[ident]; + } + }); + }, + + serialize: function(element) { + element = $(element); + var options = Object.extend(Sortable.options(element), arguments[1] || { }); + var name = encodeURIComponent( + (arguments[1] && arguments[1].name) ? arguments[1].name : element.id); + + if (options.tree) { + return Sortable.tree(element, arguments[1]).children.map( function (item) { + return [name + Sortable._constructIndex(item) + "[id]=" + + encodeURIComponent(item.id)].concat(item.children.map(arguments.callee)); + }).flatten().join('&'); + } else { + return Sortable.sequence(element, arguments[1]).map( function(item) { + return name + "[]=" + encodeURIComponent(item); + }).join('&'); + } + } +}; + +// Returns true if child is contained within element +Element.isParent = function(child, element) { + if (!child.parentNode || child == element) return false; + if (child.parentNode == element) return true; + return Element.isParent(child.parentNode, element); +}; + +Element.findChildren = function(element, only, recursive, tagName) { + if(!element.hasChildNodes()) return null; + tagName = tagName.toUpperCase(); + if(only) only = [only].flatten(); + var elements = []; + $A(element.childNodes).each( function(e) { + if(e.tagName && e.tagName.toUpperCase()==tagName && + (!only || (Element.classNames(e).detect(function(v) { return only.include(v) })))) + elements.push(e); + if(recursive) { + var grandchildren = Element.findChildren(e, only, recursive, tagName); + if(grandchildren) elements.push(grandchildren); + } + }); + + return (elements.length>0 ? elements.flatten() : []); +}; + +Element.offsetSize = function (element, type) { + return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')]; +}; \ No newline at end of file diff --git a/episode-253/picturesque/public/javascripts/effects.js b/episode-253/picturesque/public/javascripts/effects.js new file mode 100644 index 00000000..c81e6c7d --- /dev/null +++ b/episode-253/picturesque/public/javascripts/effects.js @@ -0,0 +1,1123 @@ +// script.aculo.us effects.js v1.8.3, Thu Oct 08 11:23:33 +0200 2009 + +// Copyright (c) 2005-2009 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Contributors: +// Justin Palmer (http://encytemedia.com/) +// Mark Pilgrim (http://diveintomark.org/) +// Martin Bialasinki +// +// script.aculo.us is freely distributable under the terms of an MIT-style license. +// For details, see the script.aculo.us web site: http://script.aculo.us/ + +// converts rgb() and #xxx to #xxxxxx format, +// returns self (or first argument) if not convertable +String.prototype.parseColor = function() { + var color = '#'; + if (this.slice(0,4) == 'rgb(') { + var cols = this.slice(4,this.length-1).split(','); + var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); + } else { + if (this.slice(0,1) == '#') { + if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); + if (this.length==7) color = this.toLowerCase(); + } + } + return (color.length==7 ? color : (arguments[0] || this)); +}; + +/*--------------------------------------------------------------------------*/ + +Element.collectTextNodes = function(element) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); + }).flatten().join(''); +}; + +Element.collectTextNodesIgnoreClass = function(element, className) { + return $A($(element).childNodes).collect( function(node) { + return (node.nodeType==3 ? node.nodeValue : + ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? + Element.collectTextNodesIgnoreClass(node, className) : '')); + }).flatten().join(''); +}; + +Element.setContentZoom = function(element, percent) { + element = $(element); + element.setStyle({fontSize: (percent/100) + 'em'}); + if (Prototype.Browser.WebKit) window.scrollBy(0,0); + return element; +}; + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +}; + +Element.forceRerendering = function(element) { + try { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch(e) { } +}; + +/*--------------------------------------------------------------------------*/ + +var Effect = { + _elementDoesNotExistError: { + name: 'ElementDoesNotExistError', + message: 'The specified DOM element does not exist, but is required for this effect to operate' + }, + Transitions: { + linear: Prototype.K, + sinoidal: function(pos) { + return (-Math.cos(pos*Math.PI)/2) + .5; + }, + reverse: function(pos) { + return 1-pos; + }, + flicker: function(pos) { + var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; + return pos > 1 ? 1 : pos; + }, + wobble: function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; + }, + pulse: function(pos, pulses) { + return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; + }, + spring: function(pos) { + return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); + }, + none: function(pos) { + return 0; + }, + full: function(pos) { + return 1; + } + }, + DefaultOptions: { + duration: 1.0, // seconds + fps: 100, // 100= assume 66fps max. + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' + }, + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; + + element = $(element); + $A(element.childNodes).each( function(child) { + if (child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + new Element('span', {style: tagifyStyle}).update( + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if (((typeof element == 'object') || + Object.isFunction(element)) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || { }); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect, options) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + + return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({ + queue: { position:'end', scope:(element.id || 'global'), limit: 1 } + }, options || {})); + } +}; + +Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(Enumerable, { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = Object.isString(effect.options.queue) ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'with-last': + timestamp = this.effects.pluck('startOn').max() || timestamp; + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + + if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) + this.effects.push(effect); + + if (!this.interval) + this.interval = setInterval(this.loop.bind(this), 15); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if (this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + for(var i=0, len=this.effects.length;i= this.startOn) { + if (timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if (this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / this.totalTime, + frame = (pos * this.totalFrames).round(); + if (frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + cancel: function() { + if (!this.options.sync) + Effect.Queues.get(Object.isString(this.options.queue) ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if (this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + var data = $H(); + for(property in this) + if (!Object.isFunction(this[property])) data.set(property, this[property]); + return '#'; + } +}); + +Effect.Parallel = Class.create(Effect.Base, { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if (effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Tween = Class.create(Effect.Base, { + initialize: function(object, from, to) { + object = Object.isString(object) ? $(object) : object; + var args = $A(arguments), method = args.last(), + options = args.length == 5 ? args[3] : null; + this.method = Object.isFunction(method) ? method.bind(object) : + Object.isFunction(object[method]) ? object[method].bind(object) : + function(value) { object[method] = value }; + this.start(Object.extend({ from: from, to: to }, options || { })); + }, + update: function(position) { + this.method(position); + } +}); + +Effect.Event = Class.create(Effect.Base, { + initialize: function() { + this.start(Object.extend({ duration: 0 }, arguments[0] || { })); + }, + update: Prototype.emptyFunction +}); + +Effect.Opacity = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + // make this work on IE on elements without 'layout' + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + var options = Object.extend({ + from: this.element.getOpacity() || 0.0, + to: 1.0 + }, arguments[1] || { }); + this.start(options); + }, + update: function(position) { + this.element.setOpacity(position); + } +}); + +Effect.Move = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + this.element.makePositioned(); + this.originalLeft = parseFloat(this.element.getStyle('left') || '0'); + this.originalTop = parseFloat(this.element.getStyle('top') || '0'); + if (this.options.mode == 'absolute') { + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + this.element.setStyle({ + left: (this.options.x * position + this.originalLeft).round() + 'px', + top: (this.options.y * position + this.originalTop).round() + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); +}; + +Effect.Scale = Class.create(Effect.Base, { + initialize: function(element, percent) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or { } with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || { }); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = this.element.getStyle('position'); + + this.originalStyle = { }; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = this.element.getStyle('font-size') || '100%'; + ['em','px','%','pt'].each( function(fontSizeType) { + if (fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if (this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if (/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if (!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if (this.options.scaleContent && this.fontSize) + this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle); + }, + setDimensions: function(height, width) { + var d = { }; + if (this.options.scaleX) d.width = width.round() + 'px'; + if (this.options.scaleY) d.height = height.round() + 'px'; + if (this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if (this.elementPositioning == 'absolute') { + if (this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if (this.options.scaleY) d.top = -topd + 'px'; + if (this.options.scaleX) d.left = -leftd + 'px'; + } + } + this.element.setStyle(d); + } +}); + +Effect.Highlight = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { }); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if (this.element.getStyle('display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { }; + if (!this.options.keepBackgroundImage) { + this.oldStyle.backgroundImage = this.element.getStyle('background-image'); + this.element.setStyle({backgroundImage: 'none'}); + } + if (!this.options.endcolor) + this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff'); + if (!this.options.restorecolor) + this.options.restorecolor = this.element.getStyle('background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) }); + }, + finish: function() { + this.element.setStyle(Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = function(element) { + var options = arguments[1] || { }, + scrollOffsets = document.viewport.getScrollOffsets(), + elementOffsets = $(element).cumulativeOffset(); + + if (options.offset) elementOffsets[1] += options.offset; + + return new Effect.Tween(null, + scrollOffsets.top, + elementOffsets[1], + options, + function(p){ scrollTo(scrollOffsets.left, p.round()); } + ); +}; + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + var options = Object.extend({ + from: element.getOpacity() || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { + if (effect.options.to!=0) return; + effect.element.hide().setStyle({opacity: oldOpacity}); + } + }, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Appear = function(element) { + element = $(element); + var options = Object.extend({ + from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0), + to: 1.0, + // force Safari to render floated elements properly + afterFinishInternal: function(effect) { + effect.element.forceRerendering(); + }, + beforeSetup: function(effect) { + effect.element.setOpacity(effect.options.from).show(); + }}, arguments[1] || { }); + return new Effect.Opacity(element,options); +}; + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { + opacity: element.getInlineOpacity(), + position: element.getStyle('position'), + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height + }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { + Position.absolutize(effect.effects[0].element); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().setStyle(oldStyle); } + }, arguments[1] || { }) + ); +}; + +Effect.BlindUp = function(element) { + element = $(element); + element.makeClipping(); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }, arguments[1] || { }) + ); +}; + +Effect.BlindDown = function(element) { + element = $(element); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping(); + } + }, arguments[1] || { })); +}; + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = element.getInlineOpacity(); + return new Effect.Appear(element, Object.extend({ + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); + } + }); + } + }, arguments[1] || { })); +}; + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left'), + opacity: element.getInlineOpacity() }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { + effect.effects[0].element.makePositioned(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); + } + }, arguments[1] || { })); +}; + +Effect.Shake = function(element) { + element = $(element); + var options = Object.extend({ + distance: 20, + duration: 0.5 + }, arguments[1] || {}); + var distance = parseFloat(options.distance); + var split = parseFloat(options.duration) / 10.0; + var oldStyle = { + top: element.getStyle('top'), + left: element.getStyle('left') }; + return new Effect.Move(element, + { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { + effect.element.undoPositioned().setStyle(oldStyle); + }}); }}); }}); }}); }}); }}); +}; + +Effect.SlideDown = function(element) { + element = $(element).cleanWhitespace(); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: window.opera ? 0 : 1, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().setStyle({height: '0px'}).show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); } + }, arguments[1] || { }) + ); +}; + +Effect.SlideUp = function(element) { + element = $(element).cleanWhitespace(); + var oldInnerBottom = element.down().getStyle('bottom'); + var elementDimensions = element.getDimensions(); + return new Effect.Scale(element, window.opera ? 0 : 1, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { + effect.element.makePositioned(); + effect.element.down().makePositioned(); + if (window.opera) effect.element.setStyle({top: ''}); + effect.element.makeClipping().show(); + }, + afterUpdateInternal: function(effect) { + effect.element.down().setStyle({bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().undoPositioned(); + effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); + } + }, arguments[1] || { }) + ); +}; + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, { + restoreAfterFinish: true, + beforeSetup: function(effect) { + effect.element.makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping(); + } + }); +}; + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { + effect.element.hide().makeClipping().makePositioned(); + }, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { + effect.effects[0].element.setStyle({height: '0px'}).show(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); + } + }, options) + ); + } + }); +}; + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransition: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || { }); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: element.getInlineOpacity() }; + + var dims = element.getDimensions(); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { + effect.effects[0].element.makePositioned().makeClipping(); + }, + afterFinishInternal: function(effect) { + effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); } + }, options) + ); +}; + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || { }, + oldOpacity = element.getInlineOpacity(), + transition = options.transition || Effect.Transitions.linear, + reverser = function(pos){ + return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); + }; + + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 2.0, from: 0, + afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } + }, options), {transition: reverser})); +}; + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + element.makeClipping(); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { + effect.element.hide().undoClipping().setStyle(oldStyle); + } }); + }}, arguments[1] || { })); +}; + +Effect.Morph = Class.create(Effect.Base, { + initialize: function(element) { + this.element = $(element); + if (!this.element) throw(Effect._elementDoesNotExistError); + var options = Object.extend({ + style: { } + }, arguments[1] || { }); + + if (!Object.isString(options.style)) this.style = $H(options.style); + else { + if (options.style.include(':')) + this.style = options.style.parseStyle(); + else { + this.element.addClassName(options.style); + this.style = $H(this.element.getStyles()); + this.element.removeClassName(options.style); + var css = this.element.getStyles(); + this.style = this.style.reject(function(style) { + return style.value == css[style.key]; + }); + options.afterFinishInternal = function(effect) { + effect.element.addClassName(effect.options.style); + effect.transforms.each(function(transform) { + effect.element.style[transform.style] = ''; + }); + }; + } + } + this.start(options); + }, + + setup: function(){ + function parseColor(color){ + if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff'; + color = color.parseColor(); + return $R(0,2).map(function(i){ + return parseInt( color.slice(i*2+1,i*2+3), 16 ); + }); + } + this.transforms = this.style.map(function(pair){ + var property = pair[0], value = pair[1], unit = null; + + if (value.parseColor('#zzzzzz') != '#zzzzzz') { + value = value.parseColor(); + unit = 'color'; + } else if (property == 'opacity') { + value = parseFloat(value); + if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) + this.element.setStyle({zoom: 1}); + } else if (Element.CSS_LENGTH.test(value)) { + var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/); + value = parseFloat(components[1]); + unit = (components.length == 3) ? components[2] : null; + } + + var originalValue = this.element.getStyle(property); + return { + style: property.camelize(), + originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), + targetValue: unit=='color' ? parseColor(value) : value, + unit: unit + }; + }.bind(this)).reject(function(transform){ + return ( + (transform.originalValue == transform.targetValue) || + ( + transform.unit != 'color' && + (isNaN(transform.originalValue) || isNaN(transform.targetValue)) + ) + ); + }); + }, + update: function(position) { + var style = { }, transform, i = this.transforms.length; + while(i--) + style[(transform = this.transforms[i]).style] = + transform.unit=='color' ? '#'+ + (Math.round(transform.originalValue[0]+ + (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() + + (Math.round(transform.originalValue[1]+ + (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() + + (Math.round(transform.originalValue[2]+ + (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : + (transform.originalValue + + (transform.targetValue - transform.originalValue) * position).toFixed(3) + + (transform.unit === null ? '' : transform.unit); + this.element.setStyle(style, true); + } +}); + +Effect.Transform = Class.create({ + initialize: function(tracks){ + this.tracks = []; + this.options = arguments[1] || { }; + this.addTracks(tracks); + }, + addTracks: function(tracks){ + tracks.each(function(track){ + track = $H(track); + var data = track.values().first(); + this.tracks.push($H({ + ids: track.keys().first(), + effect: Effect.Morph, + options: { style: data } + })); + }.bind(this)); + return this; + }, + play: function(){ + return new Effect.Parallel( + this.tracks.map(function(track){ + var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options'); + var elements = [$(ids) || $$(ids)].flatten(); + return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) }); + }).flatten(), + this.options + ); + } +}); + +Element.CSS_PROPERTIES = $w( + 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + + 'fontSize fontWeight height left letterSpacing lineHeight ' + + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+ + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + + 'right textIndent top width wordSpacing zIndex'); + +Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; + +String.__parseStyleElement = document.createElement('div'); +String.prototype.parseStyle = function(){ + var style, styleRules = $H(); + if (Prototype.Browser.WebKit) + style = new Element('div',{style:this}).style; + else { + String.__parseStyleElement.innerHTML = '
    '; + style = String.__parseStyleElement.childNodes[0].style; + } + + Element.CSS_PROPERTIES.each(function(property){ + if (style[property]) styleRules.set(property, style[property]); + }); + + if (Prototype.Browser.IE && this.include('opacity')) + styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); + + return styleRules; +}; + +if (document.defaultView && document.defaultView.getComputedStyle) { + Element.getStyles = function(element) { + var css = document.defaultView.getComputedStyle($(element), null); + return Element.CSS_PROPERTIES.inject({ }, function(styles, property) { + styles[property] = css[property]; + return styles; + }); + }; +} else { + Element.getStyles = function(element) { + element = $(element); + var css = element.currentStyle, styles; + styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { + results[property] = css[property]; + return results; + }); + if (!styles.opacity) styles.opacity = element.getOpacity(); + return styles; + }; +} + +Effect.Methods = { + morph: function(element, style) { + element = $(element); + new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { })); + return element; + }, + visualEffect: function(element, effect, options) { + element = $(element); + var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); + new Effect[klass](element, options); + return element; + }, + highlight: function(element, options) { + element = $(element); + new Effect.Highlight(element, options); + return element; + } +}; + +$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ + 'pulsate shake puff squish switchOff dropOut').each( + function(effect) { + Effect.Methods[effect] = function(element, options){ + element = $(element); + Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); + return element; + }; + } +); + +$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( + function(f) { Effect.Methods[f] = Element[f]; } +); + +Element.addMethods(Effect.Methods); \ No newline at end of file diff --git a/episode-253/picturesque/public/javascripts/prototype.js b/episode-253/picturesque/public/javascripts/prototype.js new file mode 100644 index 00000000..06249a6a --- /dev/null +++ b/episode-253/picturesque/public/javascripts/prototype.js @@ -0,0 +1,6001 @@ +/* Prototype JavaScript framework, version 1.7_rc2 + * (c) 2005-2010 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + + Version: '1.7_rc2', + + Browser: (function(){ + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf('AppleWebKit/') > -1, + Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + } + })(), + + BrowserFeatures: { + XPath: !!document.evaluate, + + SelectorsAPI: !!document.querySelector, + + ElementExtensions: (function() { + var constructor = window.Element || window.HTMLElement; + return !!(constructor && constructor.prototype); + })(), + SpecificElementExtensions: (function() { + if (typeof window.HTMLDivElement !== 'undefined') + return true; + + var div = document.createElement('div'), + form = document.createElement('form'), + isSupported = false; + + if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { + isSupported = true; + } + + div = form = null; + + return isSupported; + })() + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +var Abstract = { }; + + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function() { + + var IS_DONTENUM_BUGGY = (function(){ + for (var p in { toString: 1 }) { + if (p === 'toString') return false; + } + return true; + })(); + + function subclass() {}; + function create() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0, length = properties.length; i < length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + return klass; + } + + function addMethods(source) { + var ancestor = this.superclass && this.superclass.prototype, + properties = Object.keys(source); + + if (IS_DONTENUM_BUGGY) { + if (source.toString != Object.prototype.toString) + properties.push("toString"); + if (source.valueOf != Object.prototype.valueOf) + properties.push("valueOf"); + } + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames()[0] == "$super") { + var method = value; + value = (function(m) { + return function() { return ancestor[m].apply(this, arguments); }; + })(property).wrap(method); + + value.valueOf = method.valueOf.bind(method); + value.toString = method.toString.bind(method); + } + this.prototype[property] = value; + } + + return this; + } + + return { + create: create, + Methods: { + addMethods: addMethods + } + }; +})(); +(function() { + + var _toString = Object.prototype.toString, + NULL_TYPE = 'Null', + UNDEFINED_TYPE = 'Undefined', + BOOLEAN_TYPE = 'Boolean', + NUMBER_TYPE = 'Number', + STRING_TYPE = 'String', + OBJECT_TYPE = 'Object', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && + typeof JSON.stringify === 'function' && + JSON.stringify(0) === '0' && + typeof JSON.stringify(Prototype.K) === 'undefined'; + + function Type(o) { + switch(o) { + case null: return NULL_TYPE; + case (void 0): return UNDEFINED_TYPE; + } + var type = typeof o; + switch(type) { + case 'boolean': return BOOLEAN_TYPE; + case 'number': return NUMBER_TYPE; + case 'string': return STRING_TYPE; + } + return OBJECT_TYPE; + } + + function extend(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; + } + + function inspect(object) { + try { + if (isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + } + + function toJSON(value) { + return Str('', { '': value }, []); + } + + function Str(key, holder, stack) { + var value = holder[key], + type = typeof value; + + if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + var _class = _toString.call(value); + + switch (_class) { + case NUMBER_CLASS: + case BOOLEAN_CLASS: + case STRING_CLASS: + value = value.valueOf(); + } + + switch (value) { + case null: return 'null'; + case true: return 'true'; + case false: return 'false'; + } + + type = typeof value; + switch (type) { + case 'string': + return value.inspect(true); + case 'number': + return isFinite(value) ? String(value) : 'null'; + case 'object': + + for (var i = 0, length = stack.length; i < length; i++) { + if (stack[i] === value) { throw new TypeError(); } + } + stack.push(value); + + var partial = []; + if (_class === ARRAY_CLASS) { + for (var i = 0, length = value.length; i < length; i++) { + var str = Str(i, value, stack); + partial.push(typeof str === 'undefined' ? 'null' : str); + } + partial = '[' + partial.join(',') + ']'; + } else { + var keys = Object.keys(value); + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i], str = Str(key, value, stack); + if (typeof str !== "undefined") { + partial.push(key.inspect(true)+ ':' + str); + } + } + partial = '{' + partial.join(',') + '}'; + } + stack.pop(); + return partial; + } + } + + function stringify(object) { + return JSON.stringify(object); + } + + function toQueryString(object) { + return $H(object).toQueryString(); + } + + function toHTML(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + } + + function keys(object) { + if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } + var results = []; + for (var property in object) { + if (object.hasOwnProperty(property)) { + results.push(property); + } + } + return results; + } + + function values(object) { + var results = []; + for (var property in object) + results.push(object[property]); + return results; + } + + function clone(object) { + return extend({ }, object); + } + + function isElement(object) { + return !!(object && object.nodeType == 1); + } + + function isArray(object) { + return _toString.call(object) === ARRAY_CLASS; + } + + var hasNativeIsArray = (typeof Array.isArray == 'function') + && Array.isArray([]) && !Array.isArray({}); + + if (hasNativeIsArray) { + isArray = Array.isArray; + } + + function isHash(object) { + return object instanceof Hash; + } + + function isFunction(object) { + return typeof object === "function"; + } + + function isString(object) { + return _toString.call(object) === STRING_CLASS; + } + + function isNumber(object) { + return _toString.call(object) === NUMBER_CLASS; + } + + function isUndefined(object) { + return typeof object === "undefined"; + } + + extend(Object, { + extend: extend, + inspect: inspect, + toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, + toQueryString: toQueryString, + toHTML: toHTML, + keys: Object.keys || keys, + values: values, + clone: clone, + isElement: isElement, + isArray: isArray, + isHash: isHash, + isFunction: isFunction, + isString: isString, + isNumber: isNumber, + isUndefined: isUndefined + }); +})(); +Object.extend(Function.prototype, (function() { + var slice = Array.prototype.slice; + + function update(array, args) { + var arrayLength = array.length, length = args.length; + while (length--) array[arrayLength + length] = args[length]; + return array; + } + + function merge(array, args) { + array = slice.call(array, 0); + return update(array, args); + } + + function argumentNames() { + var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] + .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') + .replace(/\s+/g, '').split(','); + return names.length == 1 && !names[0] ? [] : names; + } + + function bind(context) { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = slice.call(arguments, 1); + return function() { + var a = merge(args, arguments); + return __method.apply(context, a); + } + } + + function bindAsEventListener(context) { + var __method = this, args = slice.call(arguments, 1); + return function(event) { + var a = update([event || window.event], args); + return __method.apply(context, a); + } + } + + function curry() { + if (!arguments.length) return this; + var __method = this, args = slice.call(arguments, 0); + return function() { + var a = merge(args, arguments); + return __method.apply(this, a); + } + } + + function delay(timeout) { + var __method = this, args = slice.call(arguments, 1); + timeout = timeout * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + } + + function defer() { + var args = update([0.01], arguments); + return this.delay.apply(this, args); + } + + function wrap(wrapper) { + var __method = this; + return function() { + var a = update([__method.bind(this)], arguments); + return wrapper.apply(this, a); + } + } + + function methodize() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + var a = update([this], arguments); + return __method.apply(null, a); + }; + } + + return { + argumentNames: argumentNames, + bind: bind, + bindAsEventListener: bindAsEventListener, + curry: curry, + delay: delay, + defer: defer, + wrap: wrap, + methodize: methodize + } +})()); + + + +(function(proto) { + + + function toISOString() { + return this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z'; + } + + + function toJSON() { + return this.toISOString(); + } + + if (!proto.toISOString) proto.toISOString = toISOString; + if (!proto.toJSON) proto.toJSON = toJSON; + +})(Date.prototype); + + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + this.currentlyExecuting = false; + } catch(e) { + this.currentlyExecuting = false; + throw e; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, (function() { + var NATIVE_JSON_PARSE_SUPPORT = window.JSON && + typeof JSON.parse === 'function' && + JSON.parse('{"test": true}').test; + + function prepareReplacement(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; + } + + function gsub(pattern, replacement) { + var result = '', source = this, match; + replacement = prepareReplacement(replacement); + + if (Object.isString(pattern)) + pattern = RegExp.escape(pattern); + + if (!(pattern.length || pattern.source)) { + replacement = replacement(''); + return replacement + source.split('').join(replacement) + replacement; + } + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + } + + function sub(pattern, replacement, count) { + replacement = prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + } + + function scan(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + } + + function truncate(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + } + + function strip() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + function stripTags() { + return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, ''); + } + + function stripScripts() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + } + + function extractScripts() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'), + matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + } + + function evalScripts() { + return this.extractScripts().map(function(script) { return eval(script) }); + } + + function escapeHTML() { + return this.replace(/&/g,'&').replace(//g,'>'); + } + + function unescapeHTML() { + return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&'); + } + + + function toQueryParams(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()), + value = pair.length > 1 ? pair.join('=') : pair[0]; + + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + } + + function toArray() { + return this.split(''); + } + + function succ() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + } + + function times(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + } + + function camelize() { + return this.replace(/-+(.)?/g, function(match, chr) { + return chr ? chr.toUpperCase() : ''; + }); + } + + function capitalize() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + } + + function underscore() { + return this.replace(/::/g, '/') + .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') + .replace(/([a-z\d])([A-Z])/g, '$1_$2') + .replace(/-/g, '_') + .toLowerCase(); + } + + function dasherize() { + return this.replace(/_/g, '-'); + } + + function inspect(useDoubleQuotes) { + var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { + if (character in String.specialChar) { + return String.specialChar[character]; + } + return '\\u00' + character.charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + } + + function unfilterJSON(filter) { + return this.replace(filter || Prototype.JSONFilter, '$1'); + } + + function isJSON() { + var str = this; + if (str.blank()) return false; + str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); + str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); + str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + return (/^[\],:{}\s]*$/).test(str); + } + + function evalJSON(sanitize) { + var json = this.unfilterJSON(), + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + if (cx.test(json)) { + json = json.replace(cx, function (a) { + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + } + + function parseJSON() { + var json = this.unfilterJSON(); + return JSON.parse(json); + } + + function include(pattern) { + return this.indexOf(pattern) > -1; + } + + function startsWith(pattern) { + return this.lastIndexOf(pattern, 0) === 0; + } + + function endsWith(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.indexOf(pattern, d) === d; + } + + function empty() { + return this == ''; + } + + function blank() { + return /^\s*$/.test(this); + } + + function interpolate(object, pattern) { + return new Template(this, pattern).evaluate(object); + } + + return { + gsub: gsub, + sub: sub, + scan: scan, + truncate: truncate, + strip: String.prototype.trim || strip, + stripTags: stripTags, + stripScripts: stripScripts, + extractScripts: extractScripts, + evalScripts: evalScripts, + escapeHTML: escapeHTML, + unescapeHTML: unescapeHTML, + toQueryParams: toQueryParams, + parseQuery: toQueryParams, + toArray: toArray, + succ: succ, + times: times, + camelize: camelize, + capitalize: capitalize, + underscore: underscore, + dasherize: dasherize, + inspect: inspect, + unfilterJSON: unfilterJSON, + isJSON: isJSON, + evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, + include: include, + startsWith: startsWith, + endsWith: endsWith, + empty: empty, + blank: blank, + interpolate: interpolate + }; +})()); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (object && Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return (match[1] + ''); + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3], + pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = (function() { + function each(iterator, context) { + var index = 0; + try { + this._each(function(value) { + iterator.call(context, value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + } + + function eachSlice(number, iterator, context) { + var index = -number, slices = [], array = this.toArray(); + if (number < 1) return array; + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + } + + function all(iterator, context) { + iterator = iterator || Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator.call(context, value, index); + if (!result) throw $break; + }); + return result; + } + + function any(iterator, context) { + iterator = iterator || Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator.call(context, value, index)) + throw $break; + }); + return result; + } + + function collect(iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function detect(iterator, context) { + var result; + this.each(function(value, index) { + if (iterator.call(context, value, index)) { + result = value; + throw $break; + } + }); + return result; + } + + function findAll(iterator, context) { + var results = []; + this.each(function(value, index) { + if (iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function grep(filter, iterator, context) { + iterator = iterator || Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(RegExp.escape(filter)); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator.call(context, value, index)); + }); + return results; + } + + function include(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + } + + function inGroupsOf(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + } + + function inject(memo, iterator, context) { + this.each(function(value, index) { + memo = iterator.call(context, memo, value, index); + }); + return memo; + } + + function invoke(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + } + + function max(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value >= result) + result = value; + }); + return result; + } + + function min(iterator, context) { + iterator = iterator || Prototype.K; + var result; + this.each(function(value, index) { + value = iterator.call(context, value, index); + if (result == null || value < result) + result = value; + }); + return result; + } + + function partition(iterator, context) { + iterator = iterator || Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator.call(context, value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + } + + function pluck(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + } + + function reject(iterator, context) { + var results = []; + this.each(function(value, index) { + if (!iterator.call(context, value, index)) + results.push(value); + }); + return results; + } + + function sortBy(iterator, context) { + return this.map(function(value, index) { + return { + value: value, + criteria: iterator.call(context, value, index) + }; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + } + + function toArray() { + return this.map(); + } + + function zip() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + } + + function size() { + return this.toArray().length; + } + + function inspect() { + return '#'; + } + + + + + + + + + + return { + each: each, + eachSlice: eachSlice, + all: all, + every: all, + any: any, + some: any, + collect: collect, + map: collect, + detect: detect, + findAll: findAll, + select: findAll, + filter: findAll, + grep: grep, + include: include, + member: include, + inGroupsOf: inGroupsOf, + inject: inject, + invoke: invoke, + max: max, + min: min, + partition: partition, + pluck: pluck, + reject: reject, + sortBy: sortBy, + toArray: toArray, + entries: toArray, + zip: zip, + size: size, + inspect: inspect, + find: detect + }; +})(); + +function $A(iterable) { + if (!iterable) return []; + if ('toArray' in Object(iterable)) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +Array.from = $A; + + +(function() { + var arrayProto = Array.prototype, + slice = arrayProto.slice, + _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + + function each(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + } + if (!_each) _each = each; + + function clear() { + this.length = 0; + return this; + } + + function first() { + return this[0]; + } + + function last() { + return this[this.length - 1]; + } + + function compact() { + return this.select(function(value) { + return value != null; + }); + } + + function flatten() { + return this.inject([], function(array, value) { + if (Object.isArray(value)) + return array.concat(value.flatten()); + array.push(value); + return array; + }); + } + + function without() { + var values = slice.call(arguments, 0); + return this.select(function(value) { + return !values.include(value); + }); + } + + function reverse(inline) { + return (inline === false ? this.toArray() : this)._reverse(); + } + + function uniq(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + } + + function intersect(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + } + + + function clone() { + return slice.call(this, 0); + } + + function size() { + return this.length; + } + + function inspect() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } + + function indexOf(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; + } + + function lastIndexOf(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; + } + + function concat() { + var array = slice.call(this, 0), item; + for (var i = 0, length = arguments.length; i < length; i++) { + item = arguments[i]; + if (Object.isArray(item) && !('callee' in item)) { + for (var j = 0, arrayLength = item.length; j < arrayLength; j++) + array.push(item[j]); + } else { + array.push(item); + } + } + return array; + } + + Object.extend(arrayProto, Enumerable); + + if (!arrayProto._reverse) + arrayProto._reverse = arrayProto.reverse; + + Object.extend(arrayProto, { + _each: _each, + clear: clear, + first: first, + last: last, + compact: compact, + flatten: flatten, + without: without, + reverse: reverse, + uniq: uniq, + intersect: intersect, + clone: clone, + toArray: clone, + size: size, + inspect: inspect + }); + + var CONCAT_ARGUMENTS_BUGGY = (function() { + return [].concat(arguments)[0][0] !== 1; + })(1,2) + + if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + + if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; + if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + function initialize(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + } + + + function _each(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + } + + function set(key, value) { + return this._object[key] = value; + } + + function get(key) { + if (this._object[key] !== Object.prototype[key]) + return this._object[key]; + } + + function unset(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + } + + function toObject() { + return Object.clone(this._object); + } + + + + function keys() { + return this.pluck('key'); + } + + function values() { + return this.pluck('value'); + } + + function index(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + } + + function merge(object) { + return this.clone().update(object); + } + + function update(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + } + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + function toQueryString() { + return this.inject([], function(results, pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return results.concat(values.map(toQueryPair.curry(key))); + } else results.push(toQueryPair(key, values)); + return results; + }).join('&'); + } + + function inspect() { + return '#'; + } + + function clone() { + return new Hash(this); + } + + return { + initialize: initialize, + _each: _each, + set: set, + get: get, + unset: unset, + toObject: toObject, + toTemplateReplacements: toObject, + keys: keys, + values: values, + index: index, + merge: merge, + update: update, + toQueryString: toQueryString, + inspect: inspect, + toJSON: toObject, + clone: clone + }; +})()); + +Hash.from = $H; +Object.extend(Number.prototype, (function() { + function toColorPart() { + return this.toPaddedString(2, 16); + } + + function succ() { + return this + 1; + } + + function times(iterator, context) { + $R(0, this, true).each(iterator, context); + return this; + } + + function toPaddedString(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + } + + function abs() { + return Math.abs(this); + } + + function round() { + return Math.round(this); + } + + function ceil() { + return Math.ceil(this); + } + + function floor() { + return Math.floor(this); + } + + return { + toColorPart: toColorPart, + succ: succ, + times: times, + toPaddedString: toPaddedString, + abs: abs, + round: round, + ceil: ceil, + floor: floor + }; +})()); + +function $R(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { + function initialize(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + } + + function _each(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + } + + function include(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } + + return { + initialize: initialize, + _each: _each, + include: include + }; +})()); + + + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null; } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if (readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); + + +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + + + +(function(global) { + + var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ + try { + var el = document.createElement(''); + return el.tagName.toLowerCase() === 'input' && el.name === 'x'; + } + catch(err) { + return false; + } + })(); + + var element = global.Element; + + global.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + + Object.extend(global.Element, element || { }); + if (element) global.Element.prototype = element.prototype; + +})(this); + +Element.idCounter = 1; +Element.cache = { }; + +function purgeElement(element) { + var uid = element._prototypeUID; + if (uid) { + Element.stopObserving(element); + element._prototypeUID = void 0; + delete Element.Storage[uid]; + } +} + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + element = $(element); + element.style.display = 'none'; + return element; + }, + + show: function(element) { + element = $(element); + element.style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: (function(){ + + var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ + var el = document.createElement("select"), + isBuggy = true; + el.innerHTML = ""; + if (el.options && el.options[0]) { + isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; + } + el = null; + return isBuggy; + })(); + + var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ + try { + var el = document.createElement("table"); + if (el && el.tBodies) { + el.innerHTML = "test"; + var isBuggy = typeof el.tBodies[0] == "undefined"; + el = null; + return isBuggy; + } + } catch (e) { + return true; + } + })(); + + var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { + var s = document.createElement("script"), + isBuggy = false; + try { + s.appendChild(document.createTextNode("")); + isBuggy = !s.firstChild || + s.firstChild && s.firstChild.nodeType !== 3; + } catch (e) { + isBuggy = true; + } + s = null; + return isBuggy; + })(); + + function update(element, content) { + element = $(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + while (i--) purgeElement(descendants[i]); + + if (content && content.toElement) + content = content.toElement(); + + if (Object.isElement(content)) + return element.update().insert(content); + + content = Object.toHTML(content); + + var tagName = element.tagName.toUpperCase(); + + if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { + element.text = content; + return element; + } + + if (SELECT_ELEMENT_INNERHTML_BUGGY || TABLE_ELEMENT_INNERHTML_BUGGY) { + if (tagName in Element._insertionTranslations.tags) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { + element.appendChild(node) + }); + } + else { + element.innerHTML = content.stripScripts(); + } + } + else { + element.innerHTML = content.stripScripts(); + } + + content.evalScripts.bind(content).defer(); + return element; + } + + return update; + })(), + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), + attribute = pair.last(), + value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property, maximumLength) { + element = $(element); + maximumLength = maximumLength || -1; + var elements = []; + + while (element = element[property]) { + if (element.nodeType == 1) + elements.push(Element.extend(element)); + if (elements.length == maximumLength) + break; + } + + return elements; + }, + + ancestors: function(element) { + return Element.recursivelyCollect(element, 'parentNode'); + }, + + descendants: function(element) { + return Element.select(element, "*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + var results = [], child = $(element).firstChild; + while (child) { + if (child.nodeType === 1) { + results.push(Element.extend(child)); + } + child = child.nextSibling; + } + return results; + }, + + previousSiblings: function(element, maximumLength) { + return Element.recursivelyCollect(element, 'previousSibling'); + }, + + nextSiblings: function(element) { + return Element.recursivelyCollect(element, 'nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return Element.previousSiblings(element).reverse() + .concat(Element.nextSiblings(element)); + }, + + match: function(element, selector) { + element = $(element); + if (Object.isString(selector)) + return Prototype.Selector.match(element, selector); + return selector.match(element); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = Element.ancestors(element); + return Object.isNumber(expression) ? ancestors[expression] : + Prototype.Selector.find(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return Element.firstDescendant(element); + return Object.isNumber(expression) ? Element.descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.previousSiblings(), expression, index); + } else { + return element.recursivelyCollect("previousSibling", index + 1)[index]; + } + }, + + next: function(element, expression, index) { + element = $(element); + if (Object.isNumber(expression)) index = expression, expression = false; + if (!Object.isNumber(index)) index = 0; + + if (expression) { + return Prototype.Selector.find(element.nextSiblings(), expression, index); + } else { + var maximumLength = Object.isNumber(index) ? index + 1 : 1; + return element.recursivelyCollect("nextSibling", index + 1)[index]; + } + }, + + + select: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element); + }, + + adjacent: function(element) { + element = $(element); + var expressions = Array.prototype.slice.call(arguments, 1).join(', '); + return Prototype.Selector.select(expressions, element.parentNode).without(element); + }, + + identify: function(element) { + element = $(element); + var id = Element.readAttribute(element, 'id'); + if (id) return id; + do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); + Element.writeAttribute(element, 'id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return Element.getDimensions(element).height; + }, + + getWidth: function(element) { + return Element.getDimensions(element).width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!Element.hasClassName(element, className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return Element[Element.hasClassName(element, className) ? + 'removeClassName' : 'addClassName'](element, className); + }, + + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (ancestor.contains) + return ancestor.contains(element) && ancestor !== element; + + while (element = element.parentNode) + if (element == ancestor) return true; + + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = Element.cumulativeOffset(element); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value || value == 'auto') { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + if (Prototype.Browser.Opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + if (element.parentNode) { + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + } + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName.toUpperCase() == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'absolute') return element; + + var offsets = Element.positionedOffset(element), + top = offsets[1], + left = offsets[0], + width = element.clientWidth, + height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (Element.getStyle(element, 'position') == 'relative') return element; + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0), + left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, + valueL = 0, + element = forElement; + + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + source = $(source); + var p = Element.viewportOffset(source), delta = [0, 0], parent = null; + + element = $(element); + + if (Element.getStyle(element, 'position') == 'absolute') { + parent = Element.getOffsetParent(element); + delta = Element.viewportOffset(parent); + } + + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + if (!Element.visible(element)) return null; + + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + if (!element.parentNode) return $(document.body); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + if (!element.parentNode) return Element._returnOffset(0, 0); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = (function(){ + + var classProp = 'className', + forProp = 'for', + el = document.createElement('div'); + + el.setAttribute(classProp, 'x'); + + if (el.className !== 'x') { + el.setAttribute('class', 'x'); + if (el.className === 'x') { + classProp = 'class'; + } + } + el = null; + + el = document.createElement('label'); + el.setAttribute(forProp, 'x'); + if (el.htmlFor !== 'x') { + el.setAttribute('htmlFor', 'x'); + if (el.htmlFor === 'x') { + forProp = 'htmlFor'; + } + } + el = null; + + return { + read: { + names: { + 'class': classProp, + 'className': classProp, + 'for': forProp, + 'htmlFor': forProp + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute); + }, + _getAttr2: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: (function(){ + + var el = document.createElement('div'), f; + el.onclick = Prototype.emptyFunction; + var value = el.getAttribute('onclick'); + + if (String(value).indexOf('{') > -1) { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + attribute = attribute.toString(); + attribute = attribute.split('{')[1]; + attribute = attribute.split('}')[0]; + return attribute.strip(); + }; + } + else if (value === '') { + f = function(element, attribute) { + attribute = element.getAttribute(attribute); + if (!attribute) return null; + return attribute.strip(); + }; + } + el = null; + return f; + })(), + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + } + })(); + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr2, + src: v._getAttr2, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); + + if (Prototype.BrowserFeatures.ElementExtensions) { + (function() { + function _descendants(element) { + var nodes = element.getElementsByTagName('*'), results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName !== "!") // Filter out comment nodes. + results.push(node); + return results; + } + + Element.Methods.down = function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? _descendants(element)[expression] : + Element.select(element, expression)[index || 0]; + } + })(); + } + +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if (element.tagName.toUpperCase() == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if ('outerHTML' in document.documentElement) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(), + fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), + t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + for (var i = t[2]; i--; ) { + div = div.firstChild; + } + } + else { + div.innerHTML = html; + } + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
    ', 1], + TBODY: ['', '
    ', 2], + TR: ['', '
    ', 3], + TD: ['
    ', '
    ', 4], + SELECT: ['', 1] + } +}; + +(function() { + var tags = Element._insertionTranslations.tags; + Object.extend(tags, { + THEAD: tags.TBODY, + TFOOT: tags.TBODY, + TH: tags.TD + }); +})(); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return !!(node && node.specified); + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +(function(div) { + + if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { + window.HTMLElement = { }; + window.HTMLElement.prototype = div['__proto__']; + Prototype.BrowserFeatures.ElementExtensions = true; + } + + div = null; + +})(document.createElement('div')); + +Element.extend = (function() { + + function checkDeficiency(tagName) { + if (typeof window.Element != 'undefined') { + var proto = window.Element.prototype; + if (proto) { + var id = '_' + (Math.random()+'').slice(2), + el = document.createElement(tagName); + proto[id] = 'x'; + var isBuggy = (el[id] !== 'x'); + delete proto[id]; + el = null; + return isBuggy; + } + } + return false; + } + + function extendElementWith(element, methods) { + for (var property in methods) { + var value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + } + + var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + + if (Prototype.BrowserFeatures.SpecificElementExtensions) { + if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { + return function(element) { + if (element && typeof element._extendedByPrototype == 'undefined') { + var t = element.tagName; + if (t && (/^(?:object|applet|embed)$/i.test(t))) { + extendElementWith(element, Element.Methods); + extendElementWith(element, Element.Methods.Simulated); + extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); + } + } + return element; + } + } + return Prototype.K; + } + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || typeof element._extendedByPrototype != 'undefined' || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName.toUpperCase(); + + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + extendElementWith(element, methods); + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +if (document.documentElement.hasAttribute) { + Element.hasAttribute = function(element, attribute) { + return element.hasAttribute(attribute); + }; +} +else { + Element.hasAttribute = Element.Methods.Simulated.hasAttribute; +} + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + var element = document.createElement(tagName), + proto = element['__proto__'] || element.constructor.prototype; + + element = null; + return proto; + } + + var elementPrototype = window.HTMLElement ? HTMLElement.prototype : + Element.prototype; + + if (F.ElementExtensions) { + copy(Element.Methods, elementPrototype); + copy(Element.Methods.Simulated, elementPrototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + + +document.viewport = { + + getDimensions: function() { + return { width: this.getWidth(), height: this.getHeight() }; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; + +(function(viewport) { + var B = Prototype.Browser, doc = document, element, property = {}; + + function getRootElement() { + if (B.WebKit && !doc.evaluate) + return document; + + if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) + return document.body; + + return document.documentElement; + } + + function define(D) { + if (!element) element = getRootElement(); + + property[D] = 'client' + D; + + viewport['get' + D] = function() { return element[property[D]] }; + return viewport['get' + D](); + } + + viewport.getWidth = define.curry('Width'); + + viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { + UID: 1 +}; + +Element.addMethods({ + getStorage: function(element) { + if (!(element = $(element))) return; + + var uid; + if (element === window) { + uid = 0; + } else { + if (typeof element._prototypeUID === "undefined") + element._prototypeUID = Element.Storage.UID++; + uid = element._prototypeUID; + } + + if (!Element.Storage[uid]) + Element.Storage[uid] = $H(); + + return Element.Storage[uid]; + }, + + store: function(element, key, value) { + if (!(element = $(element))) return; + + if (arguments.length === 2) { + Element.getStorage(element).update(key); + } else { + Element.getStorage(element).set(key, value); + } + + return element; + }, + + retrieve: function(element, key, defaultValue) { + if (!(element = $(element))) return; + var hash = Element.getStorage(element), value = hash.get(key); + + if (Object.isUndefined(value)) { + hash.set(key, defaultValue); + value = defaultValue; + } + + return value; + }, + + clone: function(element, deep) { + if (!(element = $(element))) return; + var clone = element.cloneNode(deep); + clone._prototypeUID = void 0; + if (deep) { + var descendants = Element.select(clone, '*'), + i = descendants.length; + while (i--) { + descendants[i]._prototypeUID = void 0; + } + } + return Element.extend(clone); + }, + + purge: function(element) { + if (!(element = $(element))) return; + purgeElement(element); + + var descendants = element.getElementsByTagName('*'), + i = descendants.length; + + while (i--) purgeElement(descendants[i]); + + return null; + } +}); + +(function() { + + function toDecimal(pctString) { + var match = pctString.match(/^(\d+)%?$/i); + if (!match) return null; + return (Number(match[1]) / 100); + } + + function getPixelValue(value, property) { + if (Object.isElement(value)) { + element = value; + value = element.getStyle(property); + } + if (value === null) { + return null; + } + + if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { + return window.parseFloat(value); + } + + if (/\d/.test(value) && element.runtimeStyle) { + var style = element.style.left, rStyle = element.runtimeStyle.left; + element.runtimeStyle.left = element.currentStyle.left; + element.style.left = value || 0; + value = element.style.pixelLeft; + element.style.left = style; + element.runtimeStyle.left = rStyle; + + return value; + } + + if (value.include('%')) { + var decimal = toDecimal(value); + var whole; + if (property.include('left') || property.include('right') || + property.include('width')) { + whole = $(element.parentNode).measure('width'); + } else if (property.include('top') || property.include('bottom') || + property.include('height')) { + whole = $(element.parentNode).measure('height'); + } + + return whole * decimal; + } + + return 0; + } + + function toCSSPixels(number) { + if (Object.isString(number) && number.endsWith('px')) { + return number; + } + return number + 'px'; + } + + function isDisplayed(element) { + var originalElement = element; + while (element && element.parentNode) { + var display = element.getStyle('display'); + if (display === 'none') { + return false; + } + element = $(element.parentNode); + } + return true; + } + + var hasLayout = Prototype.K; + if ('currentStyle' in document.documentElement) { + hasLayout = function(element) { + if (!element.currentStyle.hasLayout) { + element.style.zoom = 1; + } + return element; + }; + } + + function cssNameFor(key) { + if (key.include('border')) key = key + '-width'; + return key.camelize(); + } + + Element.Layout = Class.create(Hash, { + initialize: function($super, element, preCompute) { + $super(); + this.element = $(element); + + Element.Layout.PROPERTIES.each( function(property) { + this._set(property, null); + }, this); + + if (preCompute) { + this._preComputing = true; + this._begin(); + Element.Layout.PROPERTIES.each( this._compute, this ); + this._end(); + this._preComputing = false; + } + }, + + _set: function(property, value) { + return Hash.prototype.set.call(this, property, value); + }, + + set: function(property, value) { + throw "Properties of Element.Layout are read-only."; + }, + + get: function($super, property) { + var value = $super(property); + return value === null ? this._compute(property) : value; + }, + + _begin: function() { + if (this._prepared) return; + + var element = this.element; + if (isDisplayed(element)) { + this._prepared = true; + return; + } + + var originalStyles = { + position: element.style.position || '', + width: element.style.width || '', + visibility: element.style.visibility || '', + display: element.style.display || '' + }; + + element.store('prototype_original_styles', originalStyles); + + var position = element.getStyle('position'), + width = element.getStyle('width'); + + element.setStyle({ + position: 'absolute', + visibility: 'hidden', + display: 'block' + }); + + var positionedWidth = element.getStyle('width'); + + var newWidth; + if (width && (positionedWidth === width)) { + newWidth = getPixelValue(width); + } else if (width && (position === 'absolute' || position === 'fixed')) { + newWidth = getPixelValue(width); + } else { + var parent = element.parentNode, pLayout = $(parent).getLayout(); + + newWidth = pLayout.get('width') - + this.get('margin-left') - + this.get('border-left') - + this.get('padding-left') - + this.get('padding-right') - + this.get('border-right') - + this.get('margin-right'); + } + + element.setStyle({ width: newWidth + 'px' }); + + this._prepared = true; + }, + + _end: function() { + var element = this.element; + var originalStyles = element.retrieve('prototype_original_styles'); + element.store('prototype_original_styles', null); + element.setStyle(originalStyles); + this._prepared = false; + }, + + _compute: function(property) { + var COMPUTATIONS = Element.Layout.COMPUTATIONS; + if (!(property in COMPUTATIONS)) { + throw "Property not found."; + } + return this._set(property, COMPUTATIONS[property].call(this, this.element)); + }, + + toObject: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var obj = {}; + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + var value = this.get(key); + if (value != null) obj[key] = value; + }, this); + return obj; + }, + + toHash: function() { + var obj = this.toObject.apply(this, arguments); + return new Hash(obj); + }, + + toCSS: function() { + var args = $A(arguments); + var keys = (args.length === 0) ? Element.Layout.PROPERTIES : + args.join(' ').split(' '); + var css = {}; + + keys.each( function(key) { + if (!Element.Layout.PROPERTIES.include(key)) return; + if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + + var value = this.get(key); + if (value != null) css[cssNameFor(key)] = value + 'px'; + }, this); + return css; + }, + + inspect: function() { + return "#"; + } + }); + + Object.extend(Element.Layout, { + 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'), + + COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), + + COMPUTATIONS: { + 'height': function(element) { + if (!this._preComputing) this._begin(); + + var bHeight = this.get('border-box-height'); + if (bHeight <= 0) return 0; + + var bTop = this.get('border-top'), + bBottom = this.get('border-bottom'); + + var pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + if (!this._preComputing) this._end(); + + return bHeight - bTop - bBottom - pTop - pBottom; + }, + + 'width': function(element) { + if (!this._preComputing) this._begin(); + + var bWidth = this.get('border-box-width'); + if (bWidth <= 0) return 0; + + var bLeft = this.get('border-left'), + bRight = this.get('border-right'); + + var pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + if (!this._preComputing) this._end(); + + return bWidth - bLeft - bRight - pLeft - pRight; + }, + + 'padding-box-height': function(element) { + var height = this.get('height'), + pTop = this.get('padding-top'), + pBottom = this.get('padding-bottom'); + + return height + pTop + pBottom; + }, + + 'padding-box-width': function(element) { + var width = this.get('width'), + pLeft = this.get('padding-left'), + pRight = this.get('padding-right'); + + return width + pLeft + pRight; + }, + + 'border-box-height': function(element) { + return element.offsetHeight; + }, + + 'border-box-width': function(element) { + return element.offsetWidth; + }, + + 'margin-box-height': function(element) { + var bHeight = this.get('border-box-height'), + mTop = this.get('margin-top'), + mBottom = this.get('margin-bottom'); + + if (bHeight <= 0) return 0; + + return bHeight + mTop + mBottom; + }, + + 'margin-box-width': function(element) { + var bWidth = this.get('border-box-width'), + mLeft = this.get('margin-left'), + mRight = this.get('margin-right'); + + if (bWidth <= 0) return 0; + + return bWidth + mLeft + mRight; + }, + + 'top': function(element) { + var offset = element.positionedOffset(); + return offset.top; + }, + + 'bottom': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pHeight = parent.measure('height'); + + var mHeight = this.get('border-box-height'); + + return pHeight - mHeight - offset.top; + }, + + 'left': function(element) { + var offset = element.positionedOffset(); + return offset.left; + }, + + 'right': function(element) { + var offset = element.positionedOffset(), + parent = element.getOffsetParent(), + pWidth = parent.measure('width'); + + var mWidth = this.get('border-box-width'); + + return pWidth - mWidth - offset.left; + }, + + 'padding-top': function(element) { + return getPixelValue(element, 'paddingTop'); + }, + + 'padding-bottom': function(element) { + return getPixelValue(element, 'paddingBottom'); + }, + + 'padding-left': function(element) { + return getPixelValue(element, 'paddingLeft'); + }, + + 'padding-right': function(element) { + return getPixelValue(element, 'paddingRight'); + }, + + 'border-top': function(element) { + return Object.isNumber(element.clientTop) ? element.clientTop : + getPixelValue(element, 'borderTopWidth'); + }, + + 'border-bottom': function(element) { + return Object.isNumber(element.clientBottom) ? element.clientBottom : + getPixelValue(element, 'borderBottomWidth'); + }, + + 'border-left': function(element) { + return Object.isNumber(element.clientLeft) ? element.clientLeft : + getPixelValue(element, 'borderLeftWidth'); + }, + + 'border-right': function(element) { + return Object.isNumber(element.clientRight) ? element.clientRight : + getPixelValue(element, 'borderRightWidth'); + }, + + 'margin-top': function(element) { + return getPixelValue(element, 'marginTop'); + }, + + 'margin-bottom': function(element) { + return getPixelValue(element, 'marginBottom'); + }, + + 'margin-left': function(element) { + return getPixelValue(element, 'marginLeft'); + }, + + 'margin-right': function(element) { + return getPixelValue(element, 'marginRight'); + } + } + }); + + if ('getBoundingClientRect' in document.documentElement) { + Object.extend(Element.Layout.COMPUTATIONS, { + 'right': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.right - rect.right).round(); + }, + + 'bottom': function(element) { + var parent = hasLayout(element.getOffsetParent()); + var rect = element.getBoundingClientRect(), + pRect = parent.getBoundingClientRect(); + + return (pRect.bottom - rect.bottom).round(); + } + }); + } + + Element.Offset = Class.create({ + initialize: function(left, top) { + this.left = left.round(); + this.top = top.round(); + + this[0] = this.left; + this[1] = this.top; + }, + + relativeTo: function(offset) { + return new Element.Offset( + this.left - offset.left, + this.top - offset.top + ); + }, + + inspect: function() { + return "#".interpolate(this); + }, + + toString: function() { + return "[#{left}, #{top}]".interpolate(this); + }, + + toArray: function() { + return [this.left, this.top]; + } + }); + + function getLayout(element, preCompute) { + return new Element.Layout(element, preCompute); + } + + function measure(element, property) { + return $(element).getLayout().get(property); + } + + function getDimensions(element) { + var layout = $(element).getLayout(); + return { + width: layout.get('width'), + height: layout.get('height') + }; + } + + function getOffsetParent(element) { + if (isDetached(element)) return $(document.body); + + var isInline = (Element.getStyle(element, 'display') === 'inline'); + if (!isInline && element.offsetParent) return $(element.offsetParent); + if (element === document.body) return $(element); + + while ((element = element.parentNode) && element !== document.body) { + if (Element.getStyle(element, 'position') !== 'static') { + return (element.nodeName === 'HTML') ? $(document.body) : $(element); + } + } + + return $(document.body); + } + + + function cumulativeOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function positionedOffset(element) { + var layout = element.getLayout(); + + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (isBody(element)) break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + + valueL -= layout.get('margin-top'); + valueT -= layout.get('margin-left'); + + return new Element.Offset(valueL, valueT); + } + + function cumulativeScrollOffset(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return new Element.Offset(valueL, valueT); + } + + function viewportOffset(forElement) { + var valueT = 0, valueL = 0, docBody = document.body; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == docBody && + Element.getStyle(element, 'position') == 'absolute') break; + } while (element = element.offsetParent); + + element = forElement; + do { + if (element != docBody) { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + return new Element.Offset(valueL, valueT); + } + + function absolutize(element) { + element = $(element); + + if (Element.getStyle(element, 'position') === 'absolute') { + return element; + } + + var offsetParent = getOffsetParent(element); + var eOffset = element.viewportOffset(), + pOffset = offsetParent.viewportOffset(); + + var offset = eOffset.relativeTo(pOffset); + var layout = element.getLayout(); + + element.store('prototype_absolutize_original_styles', { + left: element.getStyle('left'), + top: element.getStyle('top'), + width: element.getStyle('width'), + height: element.getStyle('height') + }); + + element.setStyle({ + position: 'absolute', + top: offset.top + 'px', + left: offset.left + 'px', + width: layout.get('width') + 'px', + height: layout.get('height') + 'px' + }); + + return element; + } + + function relativize(element) { + element = $(element); + if (Element.getStyle(element, 'position') === 'relative') { + return element; + } + + var originalStyles = + element.retrieve('prototype_absolutize_original_styles'); + + if (originalStyles) element.setStyle(originalStyles); + return element; + } + + Element.addMethods({ + getLayout: getLayout, + measure: measure, + getDimensions: getDimensions, + getOffsetParent: getOffsetParent, + cumulativeOffset: cumulativeOffset, + positionedOffset: positionedOffset, + cumulativeScrollOffset: cumulativeScrollOffset, + viewportOffset: viewportOffset, + absolutize: absolutize, + relativize: relativize + }); + + function isBody(element) { + return element.nodeName.toUpperCase() === 'BODY'; + } + + function isDetached(element) { + return element !== document.body && + !Element.descendantOf(element, document.body); + } + + if ('getBoundingClientRect' in document.documentElement) { + Element.addMethods({ + viewportOffset: function(element) { + element = $(element); + if (isDetached(element)) return new Element.Offset(0, 0); + + var rect = element.getBoundingClientRect(), + docEl = document.documentElement; + return new Element.Offset(rect.left - docEl.clientLeft, + rect.top - docEl.clientTop); + }, + + positionedOffset: function(element) { + element = $(element); + var parent = element.getOffsetParent(); + if (isDetached(element)) return new Element.Offset(0, 0); + + if (element.offsetParent && + element.offsetParent.nodeName.toUpperCase() === 'HTML') { + return positionedOffset(element); + } + + var eOffset = element.viewportOffset(), + pOffset = isBody(parent) ? viewportOffset(parent) : + parent.viewportOffset(); + var retOffset = eOffset.relativeTo(pOffset); + + var layout = element.getLayout(); + var top = retOffset.top - layout.get('margin-top'); + var left = retOffset.left - layout.get('margin-left'); + + return new Element.Offset(left, top); + } + }); + } +})(); +window.$$ = function() { + var expression = $A(arguments).join(', '); + return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function() { + + function select() { + throw new Error('Method "Prototype.Selector.select" must be defined.'); + } + + function match() { + throw new Error('Method "Prototype.Selector.match" must be defined.'); + } + + function find(elements, expression, index) { + index = index || 0; + var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; + + for (i = 0; i < length; i++) { + if (match(elements[i], expression) && index == matchIndex++) { + return Element.extend(elements[i]); + } + } + } + + function extendElements(elements) { + for (var i = 0, length = elements.length; i < length; i++) { + Element.extend(elements[i]); + } + return elements; + } + + + var K = Prototype.K; + + return { + select: select, + match: match, + find: find, + extendElements: (Element.extend === K) ? K : extendElements, + extendElement: Element.extend + }; +})(); +Prototype._original_property = window.Sizzle; +/*! + * Sizzle CSS Selector Engine - v1.0 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true; + +[0, 0].sort(function(){ + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function(selector, context, results, seed) { + results = results || []; + var origContext = context = context || document; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), + soFar = selector; + + while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) + selector += parts.shift(); + + set = posProcess( selector, set ); + } + } + } else { + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + var ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; + } + + if ( context ) { + var ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray(set); + } else { + prune = false; + } + + while ( parts.length ) { + var cur = parts.pop(), pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + throw "Syntax error, unrecognized expression: " + (cur || selector); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + } else if ( context && context.nodeType === 1 ) { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + } else { + for ( var i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function(results){ + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort(sortOrder); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[i-1] ) { + results.splice(i--, 1); + } + } + } + } + + return results; +}; + +Sizzle.matches = function(expr, set){ + return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ + var set, match; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var type = Expr.order[i], match; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice(1,1); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace(/\\/g, ""); + set = Expr.find[ type ]( match, context, isXML ); + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = context.getElementsByTagName("*"); + } + + return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ + var old = expr, result = [], curLoop = set, match, anyFound, + isXMLFilter = set && set[0] && isXML(set[0]); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.match[ type ].exec( expr )) != null ) { + var filter = Expr.filter[ type ], found, item; + anyFound = false; + + if ( curLoop == result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + } else { + curLoop[i] = false; + } + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + if ( expr == old ) { + if ( anyFound == null ) { + throw "Syntax error, unrecognized expression: " + expr; + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + match: { + ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ + }, + leftMatch: {}, + attrMap: { + "class": "className", + "for": "htmlFor" + }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, + relative: { + "+": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !/\W/.test(part), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag && !isXML ) { + part = part.toUpperCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + ">": function(checkSet, part, isXML){ + var isPartStr = typeof part === "string"; + + if ( isPartStr && !/\W/.test(part) ) { + part = isXML ? part : part.toUpperCase(); + + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName === part ? parent : false; + } + } + } else { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + "": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); + }, + "~": function(checkSet, part, isXML){ + var doneName = done++, checkFn = dirCheck; + + if ( typeof part === "string" && !/\W/.test(part) ) { + var nodeCheck = part = isXML ? part : part.toUpperCase(); + checkFn = dirNodeCheck; + } + + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); + } + }, + find: { + ID: function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? [m] : []; + } + }, + NAME: function(match, context, isXML){ + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], results = context.getElementsByName(match[1]); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + TAG: function(match, context){ + return context.getElementsByTagName(match[1]); + } + }, + preFilter: { + CLASS: function(match, curLoop, inplace, result, not, isXML){ + match = " " + match[1].replace(/\\/g, "") + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { + if ( !inplace ) + result.push( elem ); + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + ID: function(match){ + return match[1].replace(/\\/g, ""); + }, + TAG: function(match, curLoop){ + for ( var i = 0; curLoop[i] === false; i++ ){} + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); + }, + CHILD: function(match){ + if ( match[1] == "nth" ) { + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + + match[0] = done++; + + return match; + }, + ATTR: function(match, curLoop, inplace, result, not, isXML){ + var name = match[1].replace(/\\/g, ""); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + PSEUDO: function(match, curLoop, inplace, result, not){ + if ( match[1] === "not" ) { + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + if ( !inplace ) { + result.push.apply( result, ret ); + } + return false; + } + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + POS: function(match){ + match.unshift( true ); + return match; + } + }, + filters: { + enabled: function(elem){ + return elem.disabled === false && elem.type !== "hidden"; + }, + disabled: function(elem){ + return elem.disabled === true; + }, + checked: function(elem){ + return elem.checked === true; + }, + selected: function(elem){ + elem.parentNode.selectedIndex; + return elem.selected === true; + }, + parent: function(elem){ + return !!elem.firstChild; + }, + empty: function(elem){ + return !elem.firstChild; + }, + has: function(elem, i, match){ + return !!Sizzle( match[3], elem ).length; + }, + header: function(elem){ + return /h\d/i.test( elem.nodeName ); + }, + text: function(elem){ + return "text" === elem.type; + }, + radio: function(elem){ + return "radio" === elem.type; + }, + checkbox: function(elem){ + return "checkbox" === elem.type; + }, + file: function(elem){ + return "file" === elem.type; + }, + password: function(elem){ + return "password" === elem.type; + }, + submit: function(elem){ + return "submit" === elem.type; + }, + image: function(elem){ + return "image" === elem.type; + }, + reset: function(elem){ + return "reset" === elem.type; + }, + button: function(elem){ + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; + }, + input: function(elem){ + return /input|select|textarea|button/i.test(elem.nodeName); + } + }, + setFilters: { + first: function(elem, i){ + return i === 0; + }, + last: function(elem, i, match, array){ + return i === array.length - 1; + }, + even: function(elem, i){ + return i % 2 === 0; + }, + odd: function(elem, i){ + return i % 2 === 1; + }, + lt: function(elem, i, match){ + return i < match[3] - 0; + }, + gt: function(elem, i, match){ + return i > match[3] - 0; + }, + nth: function(elem, i, match){ + return match[3] - 0 == i; + }, + eq: function(elem, i, match){ + return match[3] - 0 == i; + } + }, + filter: { + PSEUDO: function(elem, match, i, array){ + var name = match[1], filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; + } else if ( name === "not" ) { + var not = match[3]; + + for ( var i = 0, l = not.length; i < l; i++ ) { + if ( not[i] === elem ) { + return false; + } + } + + return true; + } + }, + CHILD: function(elem, match){ + var type = match[1], node = elem; + switch (type) { + case 'only': + case 'first': + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) return false; + } + if ( type == 'first') return true; + node = elem; + case 'last': + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) return false; + } + return true; + case 'nth': + var first = match[2], last = match[3]; + + if ( first == 1 && last == 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + if ( first == 0 ) { + return diff == 0; + } else { + return ( diff % first == 0 && diff / first >= 0 ); + } + } + }, + ID: function(elem, match){ + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + TAG: function(elem, match){ + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; + }, + CLASS: function(elem, match){ + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + ATTR: function(elem, match){ + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value != check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + POS: function(elem, match, i, array){ + var name = match[2], filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); +} + +var makeArray = function(array, results) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 ); + +} catch(e){ + makeArray = function(array, results) { + var ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + } else { + if ( typeof array.length === "number" ) { + for ( var i = 0, l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + } else { + for ( var i = 0; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( "sourceIndex" in document.documentElement ) { + sortOrder = function( a, b ) { + if ( !a.sourceIndex || !b.sourceIndex ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var ret = a.sourceIndex - b.sourceIndex; + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} else if ( document.createRange ) { + sortOrder = function( a, b ) { + if ( !a.ownerDocument || !b.ownerDocument ) { + if ( a == b ) { + hasDuplicate = true; + } + return 0; + } + + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); + aRange.setStart(a, 0); + aRange.setEnd(a, 0); + bRange.setStart(b, 0); + bRange.setEnd(b, 0); + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); + if ( ret === 0 ) { + hasDuplicate = true; + } + return ret; + }; +} + +(function(){ + var form = document.createElement("div"), + id = "script" + (new Date).getTime(); + form.innerHTML = ""; + + var root = document.documentElement; + root.insertBefore( form, root.firstChild ); + + if ( !!document.getElementById( id ) ) { + Expr.find.ID = function(match, context, isXML){ + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; + } + }; + + Expr.filter.ID = function(elem, match){ + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + root = form = null; // release memory in IE +})(); + +(function(){ + + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function(match, context){ + var results = context.getElementsByTagName(match[1]); + + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + div.innerHTML = ""; + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } + + div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) (function(){ + var oldSizzle = Sizzle, div = document.createElement("div"); + div.innerHTML = "

    "; + + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function(query, context, extra, seed){ + context = context || document; + + if ( !seed && context.nodeType === 9 && !isXML(context) ) { + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(e){} + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + div = null; // release memory in IE +})(); + +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ + var div = document.createElement("div"); + div.innerHTML = "
    "; + + if ( div.getElementsByClassName("e").length === 0 ) + return; + + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) + return; + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function(match, context, isXML) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ){ + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + var sibDir = dir == "previousSibling" && !isXML; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + if ( elem ) { + if ( sibDir && elem.nodeType === 1 ) { + elem.sizcache = doneName; + elem.sizset = i; + } + elem = elem[dir]; + var match = false; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +var contains = document.compareDocumentPosition ? function(a, b){ + return a.compareDocumentPosition(b) & 16; +} : function(a, b){ + return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; +}; + +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + + +window.Sizzle = Sizzle; + +})(); + +;(function(engine) { + var extendElements = Prototype.Selector.extendElements; + + function select(selector, scope) { + return extendElements(engine(selector, scope || document)); + } + + function match(element, selector) { + return engine.matches(selector, [element]).length == 1; + } + + Prototype.Selector.engine = engine; + Prototype.Selector.select = select; + Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + +var Form = { + reset: function(form) { + form = $(form); + form.reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + var elements = $(form).getElementsByTagName('*'), + element, + arr = [ ], + serializers = Form.Element.Serializers; + for (var i = 0; element = elements[i]; i++) { + arr.push(element); + } + return arr.inject([], function(elements, child) { + if (serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + }) + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return /^(?:input|select|textarea)$/i.test(element.tagName); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !(/^(?:button|reset|submit)$/i.test(element.type)))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; + +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, value) { + if (Object.isUndefined(value)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, currentValue, single = !Object.isArray(value); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + currentValue = this.optionValue(opt); + if (single) { + if (currentValue == value) { + opt.selected = true; + return; + } + } + else opt.selected = value.include(currentValue); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +(function() { + + var Event = { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: {} + }; + + var docEl = document.documentElement; + var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl + && 'onmouseleave' in docEl; + + var _isButton; + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + _isButton = function(event, code) { + return event.button === buttonMap[code]; + }; + } else if (Prototype.Browser.WebKit) { + _isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + } else { + _isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + function isLeftClick(event) { return _isButton(event, 0) } + + function isMiddleClick(event) { return _isButton(event, 1) } + + function isRightClick(event) { return _isButton(event, 2) } + + function element(event) { + event = Event.extend(event); + + var node = event.target, type = event.type, + currentTarget = event.currentTarget; + + if (currentTarget && currentTarget.tagName) { + if (type === 'load' || type === 'error' || + (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' + && currentTarget.type === 'radio')) + node = currentTarget; + } + + if (node.nodeType == Node.TEXT_NODE) + node = node.parentNode; + + return Element.extend(node); + } + + function findElement(event, expression) { + var element = Event.element(event); + if (!expression) return element; + while (element) { + if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { + return Element.extend(element); + } + element = element.parentNode; + } + } + + function pointer(event) { + return { x: pointerX(event), y: pointerY(event) }; + } + + function pointerX(event) { + var docElement = document.documentElement, + body = document.body || { scrollLeft: 0 }; + + return event.pageX || (event.clientX + + (docElement.scrollLeft || body.scrollLeft) - + (docElement.clientLeft || 0)); + } + + function pointerY(event) { + var docElement = document.documentElement, + body = document.body || { scrollTop: 0 }; + + return event.pageY || (event.clientY + + (docElement.scrollTop || body.scrollTop) - + (docElement.clientTop || 0)); + } + + + function stop(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + + event.stopped = true; + } + + Event.Methods = { + isLeftClick: isLeftClick, + isMiddleClick: isMiddleClick, + isRightClick: isRightClick, + + element: element, + findElement: findElement, + + pointer: pointer, + pointerX: pointerX, + pointerY: pointerY, + + stop: stop + }; + + + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + function _relatedTarget(event) { + var element; + switch (event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } + + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return '[object Event]' } + }); + + Event.extend = function(event, element) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + + Object.extend(event, { + target: event.srcElement || element, + relatedTarget: _relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + + return Object.extend(event, methods); + }; + } else { + Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; + Object.extend(Event.prototype, methods); + Event.extend = Prototype.K; + } + + function _createResponder(element, eventName, handler) { + var registry = Element.retrieve(element, 'prototype_event_registry'); + + if (Object.isUndefined(registry)) { + CACHE.push(element); + registry = Element.retrieve(element, 'prototype_event_registry', $H()); + } + + var respondersForEvent = registry.get(eventName); + if (Object.isUndefined(respondersForEvent)) { + respondersForEvent = []; + registry.set(eventName, respondersForEvent); + } + + if (respondersForEvent.pluck('handler').include(handler)) return false; + + var responder; + if (eventName.include(":")) { + responder = function(event) { + if (Object.isUndefined(event.eventName)) + return false; + + if (event.eventName !== eventName) + return false; + + Event.extend(event, element); + handler.call(element, event); + }; + } else { + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && + (eventName === "mouseenter" || eventName === "mouseleave")) { + if (eventName === "mouseenter" || eventName === "mouseleave") { + responder = function(event) { + Event.extend(event, element); + + var parent = event.relatedTarget; + while (parent && parent !== element) { + try { parent = parent.parentNode; } + catch(e) { parent = element; } + } + + if (parent === element) return; + + handler.call(element, event); + }; + } + } else { + responder = function(event) { + Event.extend(event, element); + handler.call(element, event); + }; + } + } + + responder.handler = handler; + respondersForEvent.push(responder); + return responder; + } + + function _destroyCache() { + for (var i = 0, length = CACHE.length; i < length; i++) { + Event.stopObserving(CACHE[i]); + CACHE[i] = null; + } + } + + var CACHE = []; + + if (Prototype.Browser.IE) + window.attachEvent('onunload', _destroyCache); + + if (Prototype.Browser.WebKit) + window.addEventListener('unload', Prototype.emptyFunction, false); + + + var _getDOMEventName = Prototype.K, + translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + + if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { + _getDOMEventName = function(eventName) { + return (translations[eventName] || eventName); + }; + } + + function observe(element, eventName, handler) { + element = $(element); + + var responder = _createResponder(element, eventName, handler); + + if (!responder) return element; + + if (eventName.include(':')) { + if (element.addEventListener) + element.addEventListener("dataavailable", responder, false); + else { + element.attachEvent("ondataavailable", responder); + element.attachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + + if (element.addEventListener) + element.addEventListener(actualEventName, responder, false); + else + element.attachEvent("on" + actualEventName, responder); + } + + return element; + } + + function stopObserving(element, eventName, handler) { + element = $(element); + + var registry = Element.retrieve(element, 'prototype_event_registry'); + if (!registry) return element; + + if (!eventName) { + registry.each( function(pair) { + var eventName = pair.key; + stopObserving(element, eventName); + }); + return element; + } + + var responders = registry.get(eventName); + if (!responders) return element; + + if (!handler) { + responders.each(function(r) { + stopObserving(element, eventName, r.handler); + }); + return element; + } + + var responder = responders.find( function(r) { return r.handler === handler; }); + if (!responder) return element; + + if (eventName.include(':')) { + if (element.removeEventListener) + element.removeEventListener("dataavailable", responder, false); + else { + element.detachEvent("ondataavailable", responder); + element.detachEvent("onfilterchange", responder); + } + } else { + var actualEventName = _getDOMEventName(eventName); + if (element.removeEventListener) + element.removeEventListener(actualEventName, responder, false); + else + element.detachEvent('on' + actualEventName, responder); + } + + registry.set(eventName, responders.without(responder)); + + return element; + } + + function fire(element, eventName, memo, bubble) { + element = $(element); + + if (Object.isUndefined(bubble)) + bubble = true; + + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent('HTMLEvents'); + event.initEvent('dataavailable', true, true); + } else { + event = document.createEventObject(); + event.eventType = bubble ? 'ondataavailable' : 'onfilterchange'; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) + element.dispatchEvent(event); + else + element.fireEvent(event.eventType, event); + + return Event.extend(event); + } + + Event.Handler = Class.create({ + initialize: function(element, eventName, selector, callback) { + this.element = $(element); + this.eventName = eventName; + this.selector = selector; + this.callback = callback; + this.handler = this.handleEvent.bind(this); + }, + + start: function() { + Event.observe(this.element, this.eventName, this.handler); + return this; + }, + + stop: function() { + Event.stopObserving(this.element, this.eventName, this.handler); + return this; + }, + + handleEvent: function(event) { + var element = event.findElement(this.selector); + if (element) this.callback.call(this.element, event, element); + } + }); + + function on(element, eventName, selector, callback) { + element = $(element); + if (Object.isFunction(selector) && Object.isUndefined(callback)) { + callback = selector, selector = null; + } + + return new Event.Handler(element, eventName, selector, callback).start(); + } + + Object.extend(Event, Event.Methods); + + Object.extend(Event, { + fire: fire, + observe: observe, + stopObserving: stopObserving, + on: on + }); + + Element.addMethods({ + fire: fire, + + observe: observe, + + stopObserving: stopObserving, + + on: on + }); + + Object.extend(document, { + fire: fire.methodize(), + + observe: observe.methodize(), + + stopObserving: stopObserving.methodize(), + + on: on.methodize(), + + loaded: false + }); + + if (window.Event) Object.extend(window.Event, Event); + else window.Event = Event; +})(); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearTimeout(timer); + document.loaded = true; + document.fire('dom:loaded'); + } + + function checkReadyState() { + if (document.readyState === 'complete') { + document.stopObserving('readystatechange', checkReadyState); + fireContentLoadedEvent(); + } + } + + function pollDoScroll() { + try { document.documentElement.doScroll('left'); } + catch(e) { + timer = pollDoScroll.defer(); + return; + } + fireContentLoadedEvent(); + } + + if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); + } else { + document.observe('readystatechange', checkReadyState); + if (window == top) + timer = pollDoScroll.defer(); + } + + Event.observe(window, 'load', fireContentLoadedEvent); +})(); + +Element.addMethods(); + +/*------------------------------- DEPRECATED -------------------------------*/ + +Hash.toQueryString = Object.toQueryString; + +var Toggle = { display: Element.toggle }; + +Element.Methods.childOf = Element.Methods.descendantOf; + +var Insertion = { + Before: function(element, content) { + return Element.insert(element, {before:content}); + }, + + Top: function(element, content) { + return Element.insert(element, {top:content}); + }, + + Bottom: function(element, content) { + return Element.insert(element, {bottom:content}); + }, + + After: function(element, content) { + return Element.insert(element, {after:content}); + } +}; + +var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); + +var Position = { + includeScrollOffsets: false, + + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = Element.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = Element.cumulativeScrollOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = Element.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + + cumulativeOffset: Element.Methods.cumulativeOffset, + + positionedOffset: Element.Methods.positionedOffset, + + absolutize: function(element) { + Position.prepare(); + return Element.absolutize(element); + }, + + relativize: function(element) { + Position.prepare(); + return Element.relativize(element); + }, + + realOffset: Element.Methods.cumulativeScrollOffset, + + offsetParent: Element.Methods.getOffsetParent, + + page: Element.Methods.viewportOffset, + + clone: function(source, target, options) { + options = options || { }; + return Element.clonePosition(target, source, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ + function iter(name) { + return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; + } + + instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? + function(element, className) { + className = className.toString().strip(); + var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); + return cond ? document._getElementsByXPath('.//*' + cond, element) : []; + } : function(element, className) { + className = className.toString().strip(); + var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); + if (!classNames && !className) return elements; + + var nodes = $(element).getElementsByTagName('*'); + className = ' ' + className + ' '; + + for (var i = 0, child, cn; child = nodes[i]; i++) { + if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || + (classNames && classNames.all(function(name) { + return !name.toString().blank() && cn.include(' ' + name + ' '); + })))) + elements.push(Element.extend(child)); + } + return elements; + }; + + return function(className, parentElement) { + return $(parentElement || document.body).getElementsByClassName(className); + }; +}(Element.Methods); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set($A(this).concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set($A(this).without(classNameToRemove).join(' ')); + }, + + toString: function() { + return $A(this).join(' '); + } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); + +/*--------------------------------------------------------------------------*/ + +(function() { + window.Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + }, + + findElements: function(rootElement) { + return Prototype.Selector.select(this.expression, rootElement); + }, + + match: function(element) { + return Prototype.Selector.match(element, this.expression); + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } + }); + + Object.extend(Selector, { + matchElements: function(elements, expression) { + var match = Prototype.Selector.match, + results = []; + + for (var i = 0, length = elements.length; i < length; i++) { + var element = elements[i]; + if (match(element, expression)) { + results.push(Element.extend(element)); + } + } + return results; + }, + + findElement: function(elements, expression, index) { + index = index || 0; + var matchIndex = 0, element; + for (var i = 0, length = elements.length; i < length; i++) { + element = elements[i]; + if (Prototype.Selector.match(element, expression) && index === matchIndex++) { + return Element.extend(element); + } + } + }, + + findChildElements: function(element, expressions) { + var selector = expressions.toArray().join(', '); + return Prototype.Selector.select(selector, element || document); + } + }); +})(); diff --git a/episode-253/picturesque/public/javascripts/rails.js b/episode-253/picturesque/public/javascripts/rails.js new file mode 100644 index 00000000..4283ed89 --- /dev/null +++ b/episode-253/picturesque/public/javascripts/rails.js @@ -0,0 +1,175 @@ +(function() { + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + function isEventSupported(eventName) { + var el = document.createElement('div'); + eventName = 'on' + eventName; + var isSupported = (eventName in el); + if (!isSupported) { + el.setAttribute(eventName, 'return;'); + isSupported = typeof el[eventName] == 'function'; + } + el = null; + return isSupported; + } + + function isForm(element) { + return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM' + } + + function isInput(element) { + if (Object.isElement(element)) { + var name = element.nodeName.toUpperCase() + return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA' + } + else return false + } + + var submitBubbles = isEventSupported('submit'), + changeBubbles = isEventSupported('change') + + if (!submitBubbles || !changeBubbles) { + // augment the Event.Handler class to observe custom events when needed + Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap( + function(init, element, eventName, selector, callback) { + init(element, eventName, selector, callback) + // is the handler being attached to an element that doesn't support this event? + if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) || + (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) { + // "submit" => "emulated:submit" + this.eventName = 'emulated:' + this.eventName + } + } + ) + } + + if (!submitBubbles) { + // discover forms on the page by observing focus events which always bubble + document.on('focusin', 'form', function(focusEvent, form) { + // special handler for the real "submit" event (one-time operation) + if (!form.retrieve('emulated:submit')) { + form.on('submit', function(submitEvent) { + var emulated = form.fire('emulated:submit', submitEvent, true) + // if custom event received preventDefault, cancel the real one too + if (emulated.returnValue === false) submitEvent.preventDefault() + }) + form.store('emulated:submit', true) + } + }) + } + + if (!changeBubbles) { + // discover form inputs on the page + document.on('focusin', 'input, select, texarea', function(focusEvent, input) { + // special handler for real "change" events + if (!input.retrieve('emulated:change')) { + input.on('change', function(changeEvent) { + input.fire('emulated:change', changeEvent, true) + }) + input.store('emulated:change', true) + } + }) + } + + function handleRemote(element) { + var method, url, params; + + var event = element.fire("ajax:before"); + if (event.stopped) return false; + + if (element.tagName.toLowerCase() === 'form') { + method = element.readAttribute('method') || 'post'; + url = element.readAttribute('action'); + params = element.serialize(); + } else { + method = element.readAttribute('data-method') || 'get'; + url = element.readAttribute('href'); + params = {}; + } + + new Ajax.Request(url, { + method: method, + parameters: params, + evalScripts: true, + + onComplete: function(request) { element.fire("ajax:complete", request); }, + onSuccess: function(request) { element.fire("ajax:success", request); }, + onFailure: function(request) { element.fire("ajax:failure", request); } + }); + + element.fire("ajax:after"); + } + + function handleMethod(element) { + var method = element.readAttribute('data-method'), + url = element.readAttribute('href'), + csrf_param = $$('meta[name=csrf-param]')[0], + csrf_token = $$('meta[name=csrf-token]')[0]; + + var form = new Element('form', { method: "POST", action: url, style: "display: none;" }); + element.parentNode.insert(form); + + if (method !== 'post') { + var field = new Element('input', { type: 'hidden', name: '_method', value: method }); + form.insert(field); + } + + if (csrf_param) { + var param = csrf_param.readAttribute('content'), + token = csrf_token.readAttribute('content'), + field = new Element('input', { type: 'hidden', name: param, value: token }); + form.insert(field); + } + + form.submit(); + } + + + document.on("click", "*[data-confirm]", function(event, element) { + var message = element.readAttribute('data-confirm'); + if (!confirm(message)) event.stop(); + }); + + document.on("click", "a[data-remote]", function(event, element) { + if (event.stopped) return; + handleRemote(element); + event.stop(); + }); + + document.on("click", "a[data-method]", function(event, element) { + if (event.stopped) return; + handleMethod(element); + event.stop(); + }); + + document.on("submit", function(event) { + var element = event.findElement(), + message = element.readAttribute('data-confirm'); + if (message && !confirm(message)) { + event.stop(); + return false; + } + + var inputs = element.select("input[type=submit][data-disable-with]"); + inputs.each(function(input) { + input.disabled = true; + input.writeAttribute('data-original-value', input.value); + input.value = input.readAttribute('data-disable-with'); + }); + + var element = event.findElement("form[data-remote]"); + if (element) { + handleRemote(element); + event.stop(); + } + }); + + document.on("ajax:after", "form", function(event, element) { + var inputs = element.select("input[type=submit][disabled=true][data-disable-with]"); + inputs.each(function(input) { + input.value = input.readAttribute('data-original-value'); + input.removeAttribute('data-original-value'); + input.disabled = false; + }); + }); +})(); diff --git a/episode-253/picturesque/public/robots.txt b/episode-253/picturesque/public/robots.txt new file mode 100644 index 00000000..085187fa --- /dev/null +++ b/episode-253/picturesque/public/robots.txt @@ -0,0 +1,5 @@ +# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file +# +# To ban all spiders from the entire site uncomment the next two lines: +# User-Agent: * +# Disallow: / diff --git a/episode-253/picturesque/public/stylesheets/.gitkeep b/episode-253/picturesque/public/stylesheets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/episode-253/picturesque/public/stylesheets/application.css b/episode-253/picturesque/public/stylesheets/application.css new file mode 100644 index 00000000..13baede4 --- /dev/null +++ b/episode-253/picturesque/public/stylesheets/application.css @@ -0,0 +1,106 @@ +body { + background-color: #4B7399; + font-family: Verdana, Helvetica, Arial; + font-size: 14px; + padding-bottom: 250px; +} + +a img { + border: none; +} + +a { + color: #0000FF; +} + +.clear { + clear: both; + height: 0; + overflow: hidden; +} + +#container { + width: 75%; + margin: 0 auto; + background-color: #FFF; + padding: 20px 40px; + border: solid 1px black; + margin-top: 20px; +} + +#flash_notice, #flash_error, #flash_alert { + padding: 5px 8px; + margin: 10px 0; +} + +#flash_notice { + background-color: #CFC; + border: solid 1px #6C6; +} + +#flash_error, #flash_alert { + background-color: #FCC; + border: solid 1px #C66; +} + +.fieldWithErrors { + display: inline; +} + +.error_messages { + width: 400px; + border: 2px solid #CF0000; + padding: 0px; + padding-bottom: 12px; + margin-bottom: 20px; + background-color: #f0f0f0; + font-size: 12px; +} + +.error_messages h2 { + text-align: left; + font-weight: bold; + padding: 5px 10px; + font-size: 12px; + margin: 0; + background-color: #c00; + color: #fff; +} + +.error_messages p { + margin: 8px 10px; +} + +.error_messages ul { + margin: 0; +} + +.gallery h2 { + margin-bottom: 2px; +} + +.painting { + border: solid 1px #CCC; + padding: 10px 10px; + float: left; + margin-right: 20px; + margin-bottom: 20px; +} + +.painting .name { + padding-top: 5px; + text-align: center; + font-weight: bold; +} + +.painting .image_placeholder { + width: 200px; + height: 150px; + background-color: #B6B6B6; +} + +.painting .actions { + font-size: 10px; + text-align: center; + color: #777; +} \ No newline at end of file diff --git a/episode-253/picturesque/script/rails b/episode-253/picturesque/script/rails new file mode 100755 index 00000000..f8da2cff --- /dev/null +++ b/episode-253/picturesque/script/rails @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. + +APP_PATH = File.expand_path('../../config/application', __FILE__) +require File.expand_path('../../config/boot', __FILE__) +require 'rails/commands' diff --git a/episode-253/picturesque/test/fixtures/galleries.yml b/episode-253/picturesque/test/fixtures/galleries.yml new file mode 100644 index 00000000..a2241739 --- /dev/null +++ b/episode-253/picturesque/test/fixtures/galleries.yml @@ -0,0 +1,5 @@ +one: + name: MyString + +two: + name: MyString diff --git a/episode-253/picturesque/test/fixtures/paintings.yml b/episode-253/picturesque/test/fixtures/paintings.yml new file mode 100644 index 00000000..07f2a189 --- /dev/null +++ b/episode-253/picturesque/test/fixtures/paintings.yml @@ -0,0 +1,7 @@ +one: + gallery_id: 1 + name: MyText + +two: + gallery_id: 1 + name: MyText diff --git a/episode-253/picturesque/test/functional/galleries_controller_test.rb b/episode-253/picturesque/test/functional/galleries_controller_test.rb new file mode 100644 index 00000000..adc5b223 --- /dev/null +++ b/episode-253/picturesque/test/functional/galleries_controller_test.rb @@ -0,0 +1,54 @@ +require 'test_helper' + +class GalleriesControllerTest < ActionController::TestCase + def test_index + get :index + assert_template 'index' + end + + def test_show + get :show, :id => Gallery.first + assert_template 'show' + end + + def test_new + get :new + assert_template 'new' + end + + def test_create_invalid + Gallery.any_instance.stubs(:valid?).returns(false) + post :create + assert_template 'new' + end + + def test_create_valid + Gallery.any_instance.stubs(:valid?).returns(true) + post :create + assert_redirected_to gallery_url(assigns(:gallery)) + end + + def test_edit + get :edit, :id => Gallery.first + assert_template 'edit' + end + + def test_update_invalid + Gallery.any_instance.stubs(:valid?).returns(false) + put :update, :id => Gallery.first + assert_template 'edit' + end + + def test_update_valid + Gallery.any_instance.stubs(:valid?).returns(true) + put :update, :id => Gallery.first + assert_redirected_to gallery_url(assigns(:gallery)) + end + + def test_destroy + gallery = Gallery.first + delete :destroy, :id => gallery + assert_redirected_to galleries_url + assert !Gallery.exists?(gallery.id) + end +end diff --git a/episode-253/picturesque/test/functional/paintings_controller_test.rb b/episode-253/picturesque/test/functional/paintings_controller_test.rb new file mode 100644 index 00000000..109c52ad --- /dev/null +++ b/episode-253/picturesque/test/functional/paintings_controller_test.rb @@ -0,0 +1,54 @@ +require 'test_helper' + +class PaintingsControllerTest < ActionController::TestCase + def test_index + get :index + assert_template 'index' + end + + def test_show + get :show, :id => Painting.first + assert_template 'show' + end + + def test_new + get :new + assert_template 'new' + end + + def test_create_invalid + Painting.any_instance.stubs(:valid?).returns(false) + post :create + assert_template 'new' + end + + def test_create_valid + Painting.any_instance.stubs(:valid?).returns(true) + post :create + assert_redirected_to painting_url(assigns(:painting)) + end + + def test_edit + get :edit, :id => Painting.first + assert_template 'edit' + end + + def test_update_invalid + Painting.any_instance.stubs(:valid?).returns(false) + put :update, :id => Painting.first + assert_template 'edit' + end + + def test_update_valid + Painting.any_instance.stubs(:valid?).returns(true) + put :update, :id => Painting.first + assert_redirected_to painting_url(assigns(:painting)) + end + + def test_destroy + painting = Painting.first + delete :destroy, :id => painting + assert_redirected_to paintings_url + assert !Painting.exists?(painting.id) + end +end diff --git a/episode-253/picturesque/test/performance/browsing_test.rb b/episode-253/picturesque/test/performance/browsing_test.rb new file mode 100644 index 00000000..867fc8c9 --- /dev/null +++ b/episode-253/picturesque/test/performance/browsing_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' +require 'rails/performance_test_help' + +# Profiling results for each test method are written to tmp/performance. +class BrowsingTest < ActionDispatch::PerformanceTest + def test_homepage + get '/' + end +end diff --git a/episode-253/picturesque/test/test_helper.rb b/episode-253/picturesque/test/test_helper.rb new file mode 100644 index 00000000..8bf1192f --- /dev/null +++ b/episode-253/picturesque/test/test_helper.rb @@ -0,0 +1,13 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path('../../config/environment', __FILE__) +require 'rails/test_help' + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. + # + # Note: You'll currently still have to declare fixtures explicitly in integration tests + # -- they do not yet inherit this setting + fixtures :all + + # Add more helper methods to be used by all tests here... +end diff --git a/episode-253/picturesque/test/unit/gallery_test.rb b/episode-253/picturesque/test/unit/gallery_test.rb new file mode 100644 index 00000000..dca54419 --- /dev/null +++ b/episode-253/picturesque/test/unit/gallery_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class GalleryTest < ActiveSupport::TestCase + def test_should_be_valid + assert Gallery.new.valid? + end +end diff --git a/episode-253/picturesque/test/unit/painting_test.rb b/episode-253/picturesque/test/unit/painting_test.rb new file mode 100644 index 00000000..8c55ecea --- /dev/null +++ b/episode-253/picturesque/test/unit/painting_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class PaintingTest < ActiveSupport::TestCase + def test_should_be_valid + assert Painting.new.valid? + end +end diff --git a/episode-253/picturesque/vendor/plugins/.gitkeep b/episode-253/picturesque/vendor/plugins/.gitkeep new file mode 100644 index 00000000..e69de29b