From 104e6b40ba34db09a544ac97b5dee4cc73ffe60d Mon Sep 17 00:00:00 2001 From: Justin D'Arcangelo Date: Tue, 21 Jun 2011 22:15:13 -0400 Subject: [PATCH] Implemented support for opening files from the local file system using the HTML5 File API. --- images/buttons.png | Bin 2787 -> 3854 bytes images/source/FileButton.psd.zip | Bin 0 -> 19244 bytes multi-page-viewer.css | 53 ++++++++++++++++- multi-page-viewer.html | 12 ++++ multi-page-viewer.js | 98 +++++++++++++++++++++++++------ 5 files changed, 144 insertions(+), 19 deletions(-) create mode 100644 images/source/FileButton.psd.zip diff --git a/images/buttons.png b/images/buttons.png index 682212660d388acaa181d9df7102a5f8eaefda22..3357b47d6bb6ffbc46f6e0bb545d06cdf2d7434e 100644 GIT binary patch delta 3234 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 B2$28) delta 2159 zcmZ{mdpHw}7sp3S$emo8q2Si-MVk|ZHD+c}{{^tL(roUrpkA-3XH!%KPlcsv~HJ5-ubN}BP znEZ~V862=C=JQn@0Dwd8SPa@VeqyPhC(ISA+O3;`9SJs;)64|hzs<^+mRp%NN1TL0 zDRt95Vnw8Qf%>QEz3En)Ik=hl3>q!ath)&Nw^AJM(*&@#>o`9Un^TS?De^hgW=_UYe{me6_N@z1>fd*HP`7=M;l_Jy8FdoS5J#HQ(4hx~(fU+`m|Q!q9* zcJbBc)rH~y+1^~lda6pd?9S@K`4TQsFnx;|RI1BwN}NA^7V9I>b}S68yxfp;wWjrn zRi9aQ?dLp1klbx(8Rvn8sUoP*GVv9Pn7B?DatjC>$T#Ut+WBd;hy1y<7FKJ5!{Ow^ zN4y&2eV&(>|8R`zNRtg5Vc;Wjq4=tb3JJ?IV3LyIl^q`o>zwt?AM@Qawn2S#AIIX; z;cPa$updwLb$KMlUUrf4o!s8q>MOz0d{NqIRIlcw1vd1PCMvJMG%`P1>nt&Fsj9rZ zw}7^CK05m4B;=llti;C%%2#*-&TaPVWGxc|Pdc8O($pRMR$4-0XT(nAkh{d_kW5l& zP^keeS+di6dwcM^0*UC=biF2Qt}m}WT^%nobP(7OZqK#-2Nv_iH7-kP_OM~*a@Sv= zIUXz8wPDb|Zf0+6a&j_+Q%|(2NFK@8D6A;`Ry)691RB^K9UNS#(h9E9?zqx2;Taiy zM`ePdzQ*j28`p!_a$%e@C}@tJUi~2obtq$B(`{c0^O%0A+{T1x0$d#$_ z;Z_G!-gQ9oUWHFO-Ishk$&6|rJW`KMw&lJcLP3fF?F4_DF!?ytd>zC)rM}4j zy3_35-$WE-OFd^t@F686B*f@lm6ub;%eJAX$V+-3yi?@0?O}f1nE`!hZq^xiKJ=mg zW5p&ymL%+^3{b%rqj5BK63{IN!DxsnVxGv+hGz%?aw_r$r-(5zYYz!_?LSvOP8G-j zwh_dFuNC61pWZhn(9+I?hK8ytvUBaWx=g!$&9?Z zU3k1(+zDKBIT|90Qp}kD)m)!atx*E_*!=VY(D+M^SOoso_i2DN{X#%e+Gc$ITLP1A zr%f?3W>GG>B8Bib*Qy;VfkL+m0c*n25IV7q=JCneIaW`vtJ_!=Z60H@5&dj&@R3a_ z@0h+k!(XJoa!;IIm`9zL=hcMevXZxB|KPqTE9)VQztA`l|E`3c3Kl(=uQjaEwm=XJ zJ;f~_gWuDCf9hPEUzXD7y1Y>Gv#IV?9fel0DZ~SUofXHfz|GMQssqlL#y@QJ?;zd? z6wq{>>h)h2mtAX+o^xG3^`Ky5k!_}NMSA#Tuc344gByD)DV$=kdC0=9{zEuDdqt2A zm|-$Xw~C5Ya2{%IsHw>DvBOFR_VjdkjOfreYSqyE_XDl=9d8N^l?*)X%o%0FMU+Bm zwS&|trgtl;L=11K=N2-q0x33+A+q&b3_&iXmV8}?U*N<)ArYFhD*x`|^$2&GtS7M*h~7JVuaz;=L(|EA zlHm$Y(N!j^Q)+eKKARkaMsUC-6+cB5BXYP@d=y;MYxMKa=M%dC^-C%)oaJcj8}gX^ z*q@cqE%&th88^y2M(cz-Pi)f4!sOyv9gnZa7N?lpL33X;H#aYGUj_}FrxXSva~I|O zybJE?MzNBvE^%X~opBOw4G0f|{yn+mx&JKNbZ*gKi1YQO=73j@nJ{a2oW(SWXb zAq|v=KVKU<+}3H68qOs;VCiiZp=Gr9x9c~Gf&bjIE6uetU*Sg^Xk+X;6sQsv&opV0J7%7G0o9 z*MHSGwJn}6riqSNl71_uAuo<(h`vu8TY5KPc_OusBP67p#~gkeE`;*YcfimuT1oh- z>)Qjeuy_B%uY*Jd1sxq0b~bc?L8_C$=sZ^*|zl2%F>7k;GVoZ@hM}u*Ltw`@;kTD_YG9vZ`1Mc4k4j9uBlyKHi zakf_xu%|jofJafDz~LBD!1x=kXA~+*HHHpT5Zpg+2%=5rYGHMtIEe;sIvYHkk#ORn z0AKQ}YB*Mep=l1MMUK%fgCjyCi7t8WqCf!RN()uKc%= zh_%V216(t)=S)esBy3o|R)j`XL6_6zqsZuc(doi*lEp-Uty~$mN$GDn)+cThrtMR+|DQklY7K_DqQEvG_BdeVYH~@n{6hqfpoID{V=cZUnVQe(&_o}UY+^3=?EG>FsWU4%q&X>bJk)zOKGluH;sD-Mlr)U8X{xW@#LkUn) z|72dp0@AM#qcNZgg~5O6KC8=$gHfd9CX52lqFDBl6Ev14lhgi0A+JWFseetPV`gc> z3}A@UxjGfgTVJP;4vf?|@Cq$;7yX$P}s{UnHzV zy1^lbKnVvC40-ki=GLBIIpUMiDtn7dw~aLU^CHu-B-PR5+9Z$h2aBV$fGl@>?@f=d;UvFg^GMpChKCsGL`3(b5P3RFlWi zuZCAMX-S#DD|lKF@#>d1g8e=EFp?&cES6~k+q2SAq?Cv}N`DtFP61iS>aUP$Fa`9; z*o?(0=R!6~&nq<>Ku>I(qck;a?IiKF%eE*XTI&QTjnu;CR4ZRF@l>i{r`iB>VZF*%m%xl^FAzX8-=SK%aN9)5P?|Pg{mx()m#MB@X0^B0rvXH^;f>t3#Jp#X2 zohhw4UsY0l438S>rR~DoJA?%b@8qQn*7sBJAvZA#g8oSgeP03+#$y`V0LlWpp7;*`^4 zm?Z~H1nE`?>HiC1>sOF0=S7o*V^f#1M&RE28)|^za6#ATgm3CfGdIw~Brb1x^@;6- zk@7ApL9bL|JaY=mh>0y(ZYWu8pr#MoVOcUZvk#GM5gZ}Es4&RF5h07Zx=@Pjr`ijGt?s5m5MK;T%+rC$)lo7P07o4FC_ejpQ@DJ%EV5iQF+;BGnk5S(y&!htfG+Tu+?>uk5KjhgRtsb88Y?;QX4S9x^ zvFK2-c5;y#T`9o_b|3};a}-!v{J;;?BAl%a|46G@&=~TdydDAX5$QA|De!Ol(?MTd z=1`t`X&hPtBlTc0`n{4d<`#-H&ykng#PGQ{)H%$;!ASHmN62=*Rft4;Ed^8jfs&dwh#JU87Q=<`y2k^0>vUhd?ccj>lChq6o(n9u`w-$RX{Vr-zJPL z@QAiLF~=0qx2r^{CZ&=zouCaNqQW?NE4H0YPETr#@ha{`k7%K_vhpiRAC|y7)p(RO49+mKA5SGMsBiNj*X5IcgB~QMxK%1Oj<~)( z(fWv1IG)t;TFN1!1GhxiW0)eMq7TaBDCFgRit-8peCp(Y%8&levg}FVH|Ne8$1=jDgc26E>Sn znXeXM7m?8ueBjjZB5=)ZW)$uSX2Og}`Hgjm)(w6l%N3v++y!iEE6&b~)OTe-BJ1sdazSnDh(SFC`05uD~%^rF(zgP_n?x`aSHSzu;{Bz4nl^Xt|MWgAnI~%tf2Xxln~j62iz6 z!kkGm&&1(~kHAE+!jOkJjQ%o3Y6#F#t{~r{5F&Yn3lBLQXdi$$M88G5j~O-UX!cZL zRJm3WsgcpZ+Y<$ z)DqY7G6tkhT#n*S;Lcq6N66H4K8qb=@D&ekn+&Fih zI!{<6HDf$|nPHk~pApU;<(PHaIRf;(bDvsbVq)^AQl;uKz@*MIJnHN?yiXkmOy1V) z)MV?3)`053*DUI+w%s^1@SeDLojOb%hLk3nam&Y-4ml;A3e6(&$b0QPKis3Zn|hXa zmAF^GavixWZ}xX)yCt+vd3C)?-O6_{e$;tyyoCXZ_znST?|66ZN0W~>x0xs0OKuIf zn?2&*cC2@{NE<}8f);_n@O-xRJ;a@cogo(R$?&D@TMKt8gQ3w{ED?4hY@XfoC1R8~ z+jd)34m!pS4yuRK(ei9QYeBnY<&uht>9Q^C?>*F|7NsTK87VBf3r_-zxYK}47aIy2 zwPkDRM&@bFX>Qh8TfVOMi4*aRU7Ps^Q7Ks2$ai`^3x`6}!4wDj(3Y%iNA*doYJk>o zi&9g@wxwI;YAfHyN4&mQ?~af0H`}N8?nt|=NoD|B z(`0XQ@0xGWFT^jiP4vez2>t?gvYN@Vi=k;|>i`^DqwYSG7{B`f; z-b%h#s3E?Z^IHdLt+B~yK};mK&wBVWb(OMVX>fLo%Rd){+p4p!w#R#hEe1v1G6vd? zEChS_FhnYZH6(lDIzt1`y|un;fA+wyzz@i2I4-OwG7dTo>@J$Osy^*G;Xi71%6FM{ zi3&72R9{>}^kkexBqrix*K;%ZCT9tAb_0NcA;V2M6v$A|?vqWM^wRGn)X~F0i!KYWp z%hY*$-f8T4_CoVH_b{CU;yv!c?ca@m3fP;>g8#HmaMO3qnrCrRo(&oGYOC~My>w?V zOk&6Q(hd`uIn2Cgy0?P1&fCqr+|F#yx*2Cl?F4o@x<0*8KBq36dh8T-}d`Uwc2b7Od=gTrC9F{K7%y;H~-VocHntWg)2{y?NG*>rC#vgxiEa;57M< z>dBNFgdExV>3tP{=*uOz)IS>O2Z|ag$NaC zN!IUeB!Q#TAz+ylf#bBiKQAkjK&?{G`R`o2ZQeM9_Ri8+l+{Kx}X29>U z6S+h-7SqAP=68IjGE(^|^G3I!8By24$^PqkjdjW-YTSc`%j3GT#(nq^waM8t{5F5c zC?}C#XIStlay_(|tV^3JcOauA!}Z}gcKN99t3+P;0dTxK;!GrzkC%G~R2W=zm5*3} zFUH6r=JuFC*g>!!E=}Dqug*MVsPbJN;2yBIOrOlwWO$!W_uCOzuZSw4a_9 z&u%j9`u;?{$6}%}aJ2t1+&>YW#_aAn`!QNSK$Sj7vDVr!IzK8#Or=ioZsak2Z$ZCS zo6;QD*6ezCsOVCK+>HQOZC{jBQr7+$!#AINZCo{fu8LM^xAwe$oa1WX!r|7~;MLtv zwxaIt)KeQQK1{>2%lklf8M~i;bPDhAHW#0!c;AZlw4Q&r+%j%lG&Wn})>m6^R$m8i z&fcE29=<{H@~yQtUd~h#Lin_u6s{1`f3@|GF1m5v;`C0obpl?uc{6y~UnXAlw%FZw z*X2Ka9-e>nK4S^aJoXyp6ZyZ748HoebB6&h^Z94OgaCr~_m{!_&{lkC?uO^cI>r_P zc>a!SjiGvceKGI$NB7plPB~}(`q#>#TE1_t>&rn(W;p`><-a{Yt=kC*2rx{lM)`QR(errBLpPxh6aLkymw8z8s$c0G$-=fd+`{Mi5 zZHC$Qg^P)f%7IEkUFn{e)ZHVLcrSTezG`uEIz^PXW=0sckUD5AzRUu z<-iU`f6}CnFmxUcr|!I#;i);a2k3LauDBA302&8$;4S(db1#Aw6&@qp@QuQLl$Z!N z`T=`3;J$Bpetv#@etCR+d2)DtxY9qgvQj*7gpUs%0KoBTH!|~Cx`txM#AJ74mv?iM z*LQPs(|2}yWi`F`Bmf)X?VCi#=mF2X1EpgOxE96g4P~78dqdeVsN^_(=}s{U0TwxU z%*nyU*@?tT3f*V47@y;}hh&WrI_$E?>9}4){AVF@+TxmiZ{#)M?F}B6^yqy?=f_qE z_ZMQ_>rq&!**G>5Z)0Yn-DST;1#`uIIK|-_Wp^x@{93yl(ayQxHTKBvHv0F7c5wLO z=%rCz*8O+-TmRSjw7MEnPOl?VU4h48=E5d7rvt!9QXJb=D4JohRehaQar=f+w zkO&%!8xlFEwKwfgj&*W6h#r%E9w}AF{`ppo^!o+7QQs)S318GPw`t>1283`u@RIEp ztg$YUvc#<;|6@)q^i6JVM;~wxXK!kpp_j+~My`RR`-kIjZ{8S^y~#_b+5V`-X_Oom ze?@=Cv*KZ76V|P?D+TlGu5WveuqOJW$twKerY10uFVn5{yEznn_o?FsnXh3qyZeiJ zUU{TBVz=XSd=S4HUf)%oJ>cT}RlS;%8q2-4^G;o{QcUml1>^T_XC<3}-}l=k7xu#o z;?xbHjnC5IbhBVH@#hW?`)wtYuvZ`X1C-T%pHR9sC&#xm+Oj@o(R%K^ui%k8g~2y% z{i1X_d~=h>$14Ib5ytfD=GA;{`}JTMHQ70spvAyI%i5)mCgP(jSM37$TpB}P74PPJ zJG+ZF5o|`ezoP|X~$ins=}D_hwMQEE?CPUz?%Dsg3K8_Pl^(D6K+Z3G5QuPZz8WC2 zAdtkF4$F3`IAQT4pYo*a%NN+tuxhpbIb`C5L~EIrxh3EGnK56_taoC`685_AGU9h) z!gTsJW5gBDbhv_5%$8F4vMD~C_oo@gI+ zoC*g@j#=8gk2Buk79tMiQL0ofqn?!FnP~^{!dLB3XhH~m?c`N6vS3k{q!QI~b!2<; zB5~(Q4lA;UU25e9KS*@CdQnbjwou9L6m@Mkpy{Gtdfn+kEwL|H2pVq6%&w9RAMMQZ zD5Q4*N2%~4j2MYZeNS+4#g(fAXeH~uJCAGOMA|@KwZhDInpIYJE@SLe5A2*&fK-E| zxdPj~8Tp_Tp96*QG4DXCnKdL1_6P0}!C?m}BMxvt5O1MX*^2SR8~U2fECcT~BF*+> zp^`0-G;NEG+jAy^7Yk`1J+}CIH&k8*K{?;hgd?au9`$gN!*n;zIdYJTXIIsk@dV68 zm9pPCBw@9%ec-`vn2FEAQ9(UTElE7PD2Rq8zRfxqh$}jHG;xL=_r<_ZIU0{mq7B4Mn0;tHIW$2EynCPoKy;0yS#oRk(j`s63WR>Q2;k z<+0j$uBQ%`t0?ZX^-3E^s(fs8M1JW5G+;@RfSMIfjy3r4jPm(|X!x9YY?P1| zQPCAY@s04se@G1R2K$ApZbCnJ-suTD)~z54Flc$~8}a<|1uT23O@decBn^8SHN?f{ z2g;-ytzym;8Gn}~4x<)KDxXm<%jab1gV%E_=*20)F1V!xfinxyo;bxeS6lF8s({7C zY3WW03ajm%hXz1q>-;=IWU8keyI>WM&^LwSx}26IcCzldTs#XnHLvI4bM<8s6`#r@ zT8L1BfQh?=1o^&11AvGEy=8&J{P=*sMEi2MfkyJ&v15|^o`jGP0*J}LN}_|xWj;%J z;B$br>@oXTsH%ZV;y3nYeqq}LQ+R|;ol3?u5k*U;62>IAcX>QQwqUt2URbPW+U!X( zp=n1je`1DsHc7n=-M$dP1?lx^kSoBTauJ7aslFSDxd~Ve74{Gz4jiLJV8T^JeXZ zV~^oluc>-R;Wmw@g%O#~0M1U2RQzz_GX1nJ%6BkFXqQy62rpRbIVIxJ^L#)i`%ddzfCvROt0%i3si>dtjTPPxY48RpLomso^7&mInGbAA z0$no>h6=F`Duc_k`QD$Ft!bE6tI2eXJ8AsyVtYVxzXMkG8}a_FXv_~)D_luLz?;xs z_6WVH*l#cMN9Lx6EdMq}E=1|3X*J8r%SYAx@3E4Z*zd1wEO3t3Q>#&P%ufrs`^lNU zF;w}nOkwZ&udPNK6&;?Drnqktln_|vBLC~z?G8N^K71?yu*SFIstVp+!hHr2Ai#Cy zG;#L}cSm1Ii-Q!osKmvhy^@~&VjSI10t z=>%#*}rKR@R--vFiO1e@7w~fjJaywC4i?|&l1+l)mHmvq20#7woNx|DJdz5 zihfg#s9H@_l35iE&~ToPE?Tu@W$&L;S+Leaq^oFc=qy?vysnyb#f$NlTSL_%kshH$ z+Dd=5TQ5#}+9?FW z<9#jt#oU~~j5E_7G~Is3@28X-h-~0rUSKp4A=Rahc%K;^dO8ktT{`{O|QE>3?MdO_tV?>@cZNv4EU$JA6!K{X9M>+eU0=vZF664?+?F) z5!>9&XRNzVu57k~{=?1-;eO)+POEm=5nuzI(_Dju>CSZeGjE4G;sWf_d8(l;dE8Y^uS)H$!=dfSrC8b{5uxL_jK`?GvaO=^K+?Y3HU{) zWfkq#n~|E{;GeWW&?*O>f`M-o3jCUaiC*tsLeJpWRy?r&2>n$OeNU~Ld-}Umej4hLCNj zW;S)x`%wKXRW&n~wv7GHka-OPn zt%@sH_ufCUm46$I$K~~DiT;%4e7+{$&wgQD$@kyDSRsG#!dFrU)7qN`{yX&TFf{pP z>A?n~XT%khR)D@u-s9@h_oX4v0x7K-;M8su{QA%*s?lGe?2AQL%RIw%xH@B_Q`WT) zcA1}-X}uwg2qh1&qx%=>Row$P1pa)u&@&S1`ncdVVg=~+c!svoK^#oB0(a~Vyd~yQ#18+<3zQKA3hhK%?eyDqH2VZr84t5-$g^geVa$OyPWkFBOwCp=;BRd-D z(BF}fp4&)`Ug-45nZ=`BlfC!4TRDoSvduf`%Lirm{kN}CSG&>T+J1%V(R*j6hl@UY zY%)%`N&Q~fm744AxMC~q4gccuFwJ4Q_Ge*#&q}`$N1U|Z++bj$%VLg1gP;Qg0t4~5 zLY$=~WM{|TNE5T;)1e8wo(LqN!wcN?M2ysW`~SXY3+V~|SbcxI-VUN3OGG@GlHNoe z!Luuf(kv^~xc^b*tEup$skIykdq5_gXzPZRrj*H5=FMd{6FUx)Og?P?E{~vg!cb>C zrBCO!nTR@9b`NYi{Kufv{xO5IGa=geuZPo%!Y$5rYf6;1LfyE}8VZZU`s(R@vO@hK zWjdG7d!_1p3-}_U9BKUT&H<-#=}a0^@}@p(!$masa-;|BPFY0;S98Q>tGWAeRQocl zyOWuUnwqMr<0D!zYRPm>&SWO9%|MW3B89!v@vt$)Y*o&5Ca1?$8Z_#NeWU3{#Dv8% zv&SNZs!9|#GfYoZg|)Tmv&l|T{jn)&NUEdq=S1^yVddz(SnQm|bBAHqn_eIcYsdn( zX&1`%+(5qYao1T=7Vuxud3W%DP1BuN&jS!)`a)QkiVdVpapMVLP2ClOANftaj-gOjd*G z-TIFmoRy1ftNx$es6D#+8TV6Y!>=@ru-r+_!>EzYIp%cMA@ie;d6 z6imrN6Q6D4?9ODd)C!g}uUP#GC8dtD1uTB(g=h@;Zz#N@(NW1KQ6?XXVhitKO+dVs z^ur)XAZStle*c%fU>*?}3kgX9tUeYU6aowe1auH^K-d|Qp|kxT8~SlZ3~c3#|H(gc zqkV1?;sl!22*|=BB81F?27uB?1k}aO$%}!LYNDZ`qbcK;B%5KZOa1>Z^npe!EQM5aYHsaly_FRzNZN?-Qxq2o_{_+5l( z#xY31AShUTdqCV-UD?@Qnctqm7&$IkNfN7l*mUlZt42_OPCk(q5(4tNQN6S_YOGcX z6_pnQ-AWS6Y@p?z?^+mPismsP<2jo8G1CPiCCLg2soKB?q_s(5ifD$ui7X>>oMpYNPu_+IT5+6?M66zH*JkP#3IBhx9U`!S|49#la9*#2S9Nl=QOtf? z1}4-cA1(=bCMy|2{k7MCw5=}T!>8taE^06T2QlS98Sd4pV7NSe_(4QC}7)Q`<60xdd}EhFaC@vH*p z)&5U_#2kCPvAD}fdVjLyzw;=5wHBh;MDz*0c)|D3TADSItNH&I)Uch84r^lmr`VWaUAQMc9O)3-)eCwp=9hg?2Bhc6DkPC_fUdO=;2niMn^2$ zBwpp^s21Yqp*^Z}8~KP<^q`zGAIPbt-GbVg^}J+sdEKp%FAWq8l^>Io`)N9JI??1Q zW1T?I+YTWR?Eg>|=DhQ)_@6WpKKBl3m?v(`p&G8liPx|LLx^%f2={;ZHw?oHHF4T9 z8vX+noOb^UR9r0VM?M}~xFl7hXljvjVSrbOL!0<(NpBR{2lc&ybc=#h%_JAbZx}hK zQJ2ZAF;YL7{xe5~OHSGlu9s3Mvf9QQ@tol#emlNg;l9!lPydam(JRtuA-L|Ka9)?N z0J3bUclHLu>lPCI5x(%l{eLKltB~LSLrFwlv7md6C0_u-|Ej}^*Ek2u*{Q)sRqEu6 zP^yux>`8@P3RA^M)->|fU6djAbOjwQ|JNDzbH^q*d`7 zS!?S_Sb_>N8B#O9gkAibd8!*SqEl0?p(sS!g=+d(b($lVQXUz`T&X~0H&YY;A-_@mQX{3xT2c=J_!jw_1jf-{L(4%O zM&*zoG-)szi0XN*+LgYQYEm2Q)2g7TDsY!+^-E%5tA5?QFjy;!QTp+sIczJQ5}PE0 zHb{ul0$N?ca?QGr$~_&}?_R52pYL}Bal>b~fNDe-Es|x6A!n$%|)T&AP;7bJPDe+~RlzQ=qgRZ0=jFUwiApvQja=QsD;H_X@9cI3X4u zqu}Laxo(gZERIg&*}8#;Q_wnZ5TNK;4a1*FgHAukP1mUtZ=8Y;qryBHK`BsVVfveN z=$ygzIarZ1x~qN4j14lvds!Im9Kp%e{&$3N#4^qBU&oP-$$9cjI-+JWaHpewt&+SW zg{>qR|KEFE!DY&!-n8lv=4GohfEq7wPavrODU*KR&oR{ATN}`eANikjFZipg2@CLn1Mx!?5uo zIwRovEDiB4X@I~LIRf%%xLr8x5bFW^0deHCqv?BtR^3K@fJS_kyPCWjgB6kV49*CR zS+tp~@w9QZfsKic@wF-bzig9iv+t>nNeF99S7BExS0L^LdLy%j&qmlatrsd+bT0%i za4%FZ%1@$C+82)(_?KHeg3-{yQ!x7uMQ1eWi1zZ1j1IT=?p+~WFI`Z2G_{0wRCXM8Fm_CK z%yx*k9JeI5|Gg^+qlV5PFd?KPpg?vHiiEx+;NrV-XW6$M-Sy26*C!XwF|F74k{)xc zIK&)!j_Srx;?;8SIX*aBUZPzmos&7yIAz>4O<0sJGL=fp#b$M9ZE}xtoN^($5FGN% zdL%vqpWbFw>gwox=@jUAwo~bdbxt{Xj2<(m!ZP%BdUm=xqPHX1v$n}O=^l2BK5MU9 zva`3k+B(>NZ$H^CZmqO?AGpq3`*+5A<#}avPIV7>=YO)jqTaCcX7Oxz4tc>nP`#!d z-sg-m#p343Ms@g%`y6#Bs{Jp*3 zq3!0s?>QTMu{b1si2sOs)I4_TJ56AmZSA(pxK-F4@3H$Ncl8E(?1CtU$6$MF z>wgcq3c1E9VO3$v+Od}&RE8&Hvz({uL0&(57R$uRHh1oIXdH2f9v@MSW@qPHe=|h& zNi3oemHo%IzH{_hl2wwO@nWg9;4HZaDr?8`XtUCs-lVD8NIyNpV#a#A#MAkHcS4&< zXyMZ;I*CC|&q9CF`c^a?odT~t(u}v^=sKxOU)%g(fxam_&`$4bPP$6+Ac7u*-(f9`J# z+6uV?_kego$ijSPFqgPjXJC3)vDXMr4{5m6c;9nTuSOq+DK9=;)5|9EfrP~_Ca;= zdUj{-{giU1-wEMNf6>u%xomsg8NaRO(usA5NgA$6;KY|g$W7*|dG&r%-6`Esd-h|j zlgXjEbadNIj_hQsk)YRWc*Po4rCJo6*8>triR5W3 zbG@D4n*Z9v6WaysartobDtX0RIs4ut=q>)jyH#t!FWQU$jsJ1_tiSzxVMCC=% zR*kbFq>L}GtDMBLx1+d2#am}llUdQpN8_oEJ#>5FWvONbxx>E$-&3C>oy+LVAkCmn z0Z+TD?oCiqZ``X`uUO?gzCq5kHdU8ep263O!>rButp~YUJPO;v(By0ExG+rdz3@e~ zsT@n+!NPgstl2ng6fOGQ$og(g)A%;(lG*n34dYNewwHt0bRZ=B2DKSgUfs1?hbx>} zlIi^HlDKx(_ggZ#>f&*{Kk-z?hewp__^~{o{ILY56kUd!ix=>bfZc_?6s64EIjh4x zX{GjF6=@f?yT+Eu-)Z@h%?{b?VJ>%;RqT{~igS{ao62W53iy3zKH=9>Xxlp)2nx=` zWYvHADEN#tjg+Sg*KV+|h%8P_<YjNlsVceAic#W3$$xgDfZ}Gh2-^J`_ zU)~~kye_5WXuou0zVDR0Zuaz=SI(|f*bKEa*tE7_+Vb}n?#3JvKD`<2&eU+X`e427 zXT)mxHr*XU5X$c!cUgTg9Ns)^yS}q@}zg}L_513xqj;20dMcIjAVKo55_aGW{gsdKVOMArK71M`mUWkr&5))mo+f8KF;*-8>y@M zoj&Jg)3dR*GGD`&siN%MTY%ryHvQPG3$M!sn`@gxJLQT@mD+YxPqW?as?O7!@*Ca` z{pY;#z~)}@AD=tJ+)#CbWFA*{p4-?M-z&hvD;)Re z>a3@gV4flP;5^@q6JF-^LhmIfRrFO_!@s&%ox*C1D=>cCkn?LA34 z2$_|)Bx_Hujy!E{yDjaAqhI>8oc&@JbH=&|-GkPMljj^9g%=!q32*&(yjzCfF z_F3AIKA!Iu3<lbZ9v|3B_Cjd|^E9HSS-3#{^8|MKNMR)NXm%jP8}A~_ zk-k*({aFy{fyjHo)J;Yu3o7)v{eK76XVSOOiB1%ZQw z!61Cqop5SLra{ftlNuObJCkb|{M{`hq-!TlJe#jXT3Wk-=4PJ+bO9rRU=3Am7O9p9 zrCR$}*e9nzok=CCf-%D}N1rKa{VC3Y^ch2t+BWj}$F2pL*gsn>rFb%GRl=4U;BIw| zy7)qulC`TKrk(122S*Vez3P0Ea>?cT;!Juc33pTS)+_L7u25Oi_HJX(C3e|wUyp;O zNmrC~eylH@3;+{n9(JpTrE=y`b};MOx@PI0G{n8(^wzKJJBXn##EMlU?v=pr*62NM zqvraL|1L+v(js%EH439N9DYUA^o!aEC&G+|)4Z_-fEt4uGkiY25AC8f^nWp{r(DNm zMk+l1{Vp<$>RU{|%THxIRzj1$HIE>+#9KCk{HSAhHxp<+e}{%rM7oHcP^l|(_sN-4 zPxqdDEdTf7&q8U^N!J2j1fm)ACx9&8CNS*72A9RJ&=12EbXdTDdi7Gk54#|cpQE;X z_QapAvt>H)A*Ui$>zjAUbn#&raQaF^=7xh z1r>u3=o`>$ahb6A2BxXXH<^2*eqY6*)QQ- z{p89CHwU3&0^?rQ&c1(ZkIsZAgGyY0jEa@^uLV%c1Mgg8w- zpY{2?VqEXDQkU^3{IsKQ$ITJ)>omj7cH3lz?KI0zC;5Z~zb}KKX4*dXw^F&Up+0!G z{GYEAjkvay`n=DEnbG{V>CA2={tK9x@a8_n%hA&o7B<{k3f_}vccm_GnayR(wS)XC zVxj!qwy*qi`?m%=$qr$INHOn1R&dqU&Tq4&ib%JMocXb$pL%f!zjvh}r&Cj>RhhqGunUM zHj=OxOYa~oMyGY!9G|mUyOJaSO#_@>WNwJI+tMS|RBA{3){*|$udSUwrmEH+(P#2| ze^hBMwu3IAD-$P}b`3j~$YnDb)3o+lnk?hOR$xA2bSbK`x>%yO+RfihU^`V}-kr>p zRaI3~9Gy^0QOacM@}{zTZ3IClQpoO|Ohk^#LQh_-FncJG ztti7{{)Yy@R$X74xESw}G@hIkgJV1{c}cdK6jzTuj3&rmyl@$Gzwd@Xw}dNpn{X%J z$PX3{o$#2a<^(l~DBzabnG5I#g@6Y{$77Q+i~airP1hWaP+ycAt@QCW0wTv=i32oebBwwFfuk{dtt!hw}(xr6Z`I7ha zYHhGKt)}M?&cya7XBGm&m@nY}lU3$6e94p#)tCo)eZ-V__z zngp;8JuQk}6gqUDM!Z3lL>Cq%XFCS$<{MP-u7fGwtu9d zF*7jwb*~9?LCvd~wb&mvQmjnmsA;H?e?z-tYJ*JwcMN9C98izlzZPX+E%pV{?mK9|GZ?1GRwnM3A-~OODLiG*@JAdiL!+7ZR&ik82 zD#(0+KQqEF;B;q?5An+lKf?~pi4P0#F8<$EbN(^73Flwgx%)MAIKKbIM!E`^U-?z! zeoy>KrNNM63y2Nz?7|%2UH={FmtK#JP|IyEkKnFLzt|u-eff}|wdK}+`o5{XZT3oP z-@7g@B+yfppS1ct>SQ#dPd8}BaqvFX*1u~1>2DIwcqW|QcKl~NymEisT}*hT^?sj_ z94JbtZu4V0u0%Rl!yIru9c8f6_iTahyH(v~3>LdH^<_MY7;8pvi{iTKGOr*w*|-bM z-Q)G%9XrtS!mHH&Xb@Jj8x6nQX&kZmwHt86CFICU6SWI6(h{`X0=6Qj)@u`P%hp1E z_T2sJZv&m1J2mTOK0U}bW2qfr>R(^wMS($e3BI0!#JAiMbeG;j4)}R)A*bo6D7Cq; zGSeoRi3;-pS%e_&zyVgFtX9%6kW{pd7it%UIaZ_26a8z(b^Rz!+@H5vNsWIZBuIVK z3c4Fr_+s>T=cn2#6p_mV7wAywapECvIgrPWjFQpQ4&S){#_uvAI;ZPB`kY@GjJfFSWp|2N4T2wTxf0JklMS;)QMAF`grY;s8k`)-OoxmBx07G5vh=^ z2nfwu7^SP%52lFzBop&Y^MylXgN`?vR8?D!_-74+SiUlKV<0DcGo{nn7B>yomXL&% zoSeJ_-!+O>G_$H{G@7VSr#!c_U@d%6iCQ#>KFQ0XWo@tgzD*TAiY#o$C`W$3$9leP6lSWaUEriu=(jR$1~ z#+1^qjR9NaTbLBK=gUgEoNbZxbJDe5s76Wt;6Sgg+Jt-mgzx_vriQ!rn7rJmrs<$Z zuZozfxR@`kt`G0wBlpE=?UIV_O145kZr4Pfd;K}s5zJ1vKuu5h*sNj28;??(q@04G zC|?Tq7uMPHv%yT!GiY+b;PS#np|Bb@2d>l2%Nhzq0T-Ax!#t)(MzUATF=l6p1^&at z3E7d}p@a>=QN$hWM_QJ_T0*I1+PU~?F%1!?C?n&8{@Sy3MCn*TNK@0>nY&bNchYLX#zXSG;l52Li7kTsth z!}vO4e6oA>ut>e;UcdhUR)?PezQw1sYKEC=UVfSru4b`U*~Z;WWt5~BJX%8_^gVI@ z5!xQjIVEZL`LLF}ntP+j>uc(d77>E&R(w{k2dr|^%V)#g`u|%Y=N`|5`p0o4mo8G2 zvP5ajrQ>!Yml)Ah?sA)HC@Zu`F3lRtp;*k6d&;WAsgBDsBC$powQ>oY<(ejzdoHsz z+u`&&zvI{W{a)ww{p0yQe>|Vp=k@&Y`Tp}f?`pVGiBxU)R~|YH!{6?85h8Rq^YO?_ zubl<=>ycvtZQ_}p`1^7`iQI7~LsQ(Tp)U7>16|sB+{`DnyFxW5$xFOg(TO)ksbvT* znIulbPPYNE*%>D?(*`bdxhT%+CB6d1-i`Q{O&Qf)b2x+aFQA}=Riu4~;q@)JJO zIwXl@?J=N7CUL!Ecr@|Fk#0((nMO;&%y0Dim$)-w zT*0r0L;IF^+&t-}u@~Ps^^;~25ga9;qIvCGXY@oz?ljhc~o2L1;#b@oAV~-!VwAU>)k6vn2 zjPeh(7pOc0ZKR>1e5%@ogf_n=%}OIxomne6Gku-gXw0St$EVFUO(5`b1PEk=|yZaPJ$(Hu`C-I-s~xUu()E+M6XGpsslVUgfZBzs})3`J#*$mk-3eS*a&-_nDYvVWYeGckw-s(NH(s3NPK-A ztgM|*dFlSeAX(**tTISekNt0ciQ?L0I==scGP#Sj--FoQJXljzleOtaf#!y@t|>Mr zWT6k;lg}3KnAitv-d)a;ZhR-~ysok}AOQJGg}h!EZZod?pq+Z&OrnX){%!czlE79y z8LbY*s^6kGJGtCR;v<5(}M>X9YSirUXP7ks$7{X@StS41qU8BHo*R-1iR z8Qj*u#sp5eOIRflcO?)9tj6LL6DkS}T>GuQXuF)7tv0V@an*C7R(>yW(v_sp0aSoR zd-GcXsv#;_W!ncxlcb)<8!O@U!){MaI2k}yDbbF7Z;7l|V@IYLB^^N9Gp3Zg zsSH39BZ5t6GSO+}dBW7jV;z&^69SEgQ*C&_d!QO5kbTMc=mY1Rx-y%QXeh|wCIq)_ z6Nr6D;x)`IcZD?I`AUtK=!Z)UkWn5f+w4;$c(Dxye$jy5CzR*CU6fdeaAi zxDD&Ce3S3VV96t(*+z#Gb}sm#$|aG;8VKi{{+y=;sylAlVXa?-3lijbxkleaheSWW zyHyHmS+I<8?o-&I>$zPaOII0C`N?`$_H~%FZa0BudqjF90N z81cjB(stzFqCGU1<>t+)*0f`m(JLtLPj`p*yF!CB4;!LO>2D1Ccol`{8K}=i{i>^_ zuRD%S=oD4RF#PhKO(5DHDxIzi&2pboDsD0>L6D*q*kebO^5?(k5EH_+HDloh9@>#xH5dW+jZ) zu!#O_1@4dWyz|9DfKW*X?IY4RXy->iYj`&WhF^~4*9sQcoXBbu zZ%E;gSYW0p%+pUp%ZRM@i(w{vcEUx;TrfJm!wrrodg4$>^KdVn zS$6tuT4WF_%Hw>)W^ks#9#Xf;rm;U>?~w1&uMJFPRjO%Yd;D;Gj~qeG`U9N^%$Eq* zzaYCB*B9p>ne3Mk6I Zoom + + + + Open File + +
diff --git a/multi-page-viewer.js b/multi-page-viewer.js index 9d9cec702..baad7809e 100644 --- a/multi-page-viewer.js +++ b/multi-page-viewer.js @@ -12,6 +12,7 @@ var PDFViewer = { nextPageButton: null, pageNumberInput: null, scaleSelect: null, + fileInput: null, willJumpToPage: false, @@ -215,7 +216,7 @@ var PDFViewer = { } }, - open: function(url) { + openURL: function(url) { PDFViewer.url = url; document.title = url; @@ -231,26 +232,35 @@ var PDFViewer = { req.responseArrayBuffer || req.response; - PDFViewer.pdf = new PDFDoc(new Stream(data)); - PDFViewer.numberOfPages = PDFViewer.pdf.numPages; - document.getElementById('numPages').innerHTML = PDFViewer.numberOfPages.toString(); - - for (var i = 1; i <= PDFViewer.numberOfPages; i++) { - PDFViewer.createPage(i); - } - - if (PDFViewer.numberOfPages > 0) { - PDFViewer.drawPage(1); - } - - PDFViewer.previousPageButton.className = (PDFViewer.pageNumber === 1) ? - 'disabled' : ''; - PDFViewer.nextPageButton.className = (PDFViewer.pageNumber === PDFViewer.numberOfPages) ? - 'disabled' : ''; + PDFViewer.readPDF(data); } }; req.send(null); + }, + + readPDF: function(data) { + while (PDFViewer.element.hasChildNodes()) { + PDFViewer.element.removeChild(PDFViewer.element.firstChild); + } + + PDFViewer.pdf = new PDFDoc(new Stream(data)); + PDFViewer.numberOfPages = PDFViewer.pdf.numPages; + document.getElementById('numPages').innerHTML = PDFViewer.numberOfPages.toString(); + + for (var i = 1; i <= PDFViewer.numberOfPages; i++) { + PDFViewer.createPage(i); + } + + if (PDFViewer.numberOfPages > 0) { + PDFViewer.drawPage(1); + document.location.hash = 1; + } + + PDFViewer.previousPageButton.className = (PDFViewer.pageNumber === 1) ? + 'disabled' : ''; + PDFViewer.nextPageButton.className = (PDFViewer.pageNumber === PDFViewer.numberOfPages) ? + 'disabled' : ''; } }; @@ -354,11 +364,63 @@ window.onload = function() { PDFViewer.scaleSelect.onchange = function(evt) { PDFViewer.changeScale(parseInt(this.value)); }; + + if (window.File && window.FileReader && window.FileList && window.Blob) { + var openFileButton = document.getElementById('openFileButton'); + openFileButton.onclick = function(evt) { + if (this.className.indexOf('disabled') === -1) { + PDFViewer.fileInput.click(); + } + }; + openFileButton.onmousedown = function(evt) { + if (this.className.indexOf('disabled') === -1) { + this.className = 'down'; + } + }; + openFileButton.onmouseup = function(evt) { + this.className = (this.className.indexOf('disabled') !== -1) ? 'disabled' : ''; + }; + openFileButton.onmouseout = function(evt) { + this.className = (this.className.indexOf('disabled') !== -1) ? 'disabled' : ''; + }; + + PDFViewer.fileInput = document.getElementById('fileInput'); + PDFViewer.fileInput.onchange = function(evt) { + var files = evt.target.files; + + if (files.length > 0) { + var file = files[0]; + var fileReader = new FileReader(); + + document.title = file.name; + + // Read the local file into a Uint8Array. + fileReader.onload = function(evt) { + var data = evt.target.result; + var buffer = new ArrayBuffer(data.length); + var uint8Array = new Uint8Array(buffer); + + for (var i = 0; i < data.length; i++) { + uint8Array[i] = data.charCodeAt(i); + } + + PDFViewer.readPDF(uint8Array); + }; + + // Read as a binary string since "readAsArrayBuffer" is not yet + // implemented in Firefox. + fileReader.readAsBinaryString(file); + } + }; + PDFViewer.fileInput.value = null; + } else { + document.getElementById('fileWrapper').style.display = 'none'; + } PDFViewer.pageNumber = parseInt(PDFViewer.queryParams.page) || PDFViewer.pageNumber; PDFViewer.scale = parseInt(PDFViewer.scaleSelect.value) / 100 || 1.0; - PDFViewer.open(PDFViewer.queryParams.file || PDFViewer.url); + PDFViewer.openURL(PDFViewer.queryParams.file || PDFViewer.url); window.onscroll = function(evt) { var lastPagesDrawn = PDFViewer.lastPagesDrawn;