From 6e9dc004c177eaa6d9639103643019837a04a139 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Wed, 29 Oct 2014 21:54:17 +0300 Subject: [PATCH] UI improvements Updates some styles and colours Updated document button Added new document state: downloaded Added modal document preview --- app/css/app.css | 123 ++++--- app/css/desktop.css | 15 +- app/css/mobile.css | 4 +- app/img/icons/IconsetW.png | Bin 25746 -> 26483 bytes app/img/icons/IconsetW_1x.png | Bin 12666 -> 12961 bytes app/js/controllers.js | 33 ++ app/js/directives.js | 127 ++++++- app/js/i18n.js | 10 - app/js/lib/mtproto_wrapper.js | 8 + app/js/lib/ng_utils.js | 182 +++++++++- app/js/lib/utils.js | 32 ++ app/js/locales/en-us.json | 1 + app/js/services.js | 342 ++++-------------- app/partials/desktop/document_modal.html | 21 ++ app/partials/desktop/full_document.html | 21 ++ app/partials/desktop/message.html | 2 +- .../desktop/message_attach_document.html | 37 +- app/partials/desktop/photo_modal.html | 2 +- app/partials/desktop/video_modal.html | 2 +- 19 files changed, 607 insertions(+), 355 deletions(-) create mode 100644 app/partials/desktop/document_modal.html create mode 100644 app/partials/desktop/full_document.html diff --git a/app/css/app.css b/app/css/app.css index 7ac9490c..0b5b43f2 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -79,7 +79,7 @@ input[type="number"] { } .btn-success { color: #ffffff; - background-color: #6AC065; + background-color: #6ec26d; } .btn-success:hover, @@ -94,7 +94,7 @@ input[type="number"] { .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { - background: #5aaf54; + background: #66b864; background-image: none; } @@ -425,7 +425,7 @@ input[type="number"] { .modal-close-button i { display: inline-block; background: url(../img/icons/IconsetW.png) -15px -320px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; width: 12px; height: 12px; margin: 21px; @@ -910,7 +910,7 @@ img.welcome_logo { font-size: 12px; line-height: normal; background: #F2F2F2 url(../img/icons/IconsetW.png) -6px -205px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; border: 1px solid #F2F2F2; border-radius: 3px; padding: 6px 20px 6px 30px; @@ -938,7 +938,7 @@ img.welcome_logo { height: 13px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -15px -192px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.6; } .is_1x .im_dialogs_search_clear { @@ -1070,7 +1070,7 @@ a.im_dialog_selected .im_dialog_message_text { } .im_dialog_badge { - background: #75BB72; + background: #6ec26d; border-radius: 2px; font-size: 10px; padding: 3px 4px; @@ -1144,7 +1144,7 @@ a.im_dialog_selected .im_dialog_date { margin-left: 6px; background: url(../img/icons/IconsetW.png) -17px -444px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; } .is_1x .icon-caret { background-image: url(../img/icons/IconsetW_1x.png); @@ -1302,7 +1302,7 @@ div.im_message_video_thumb { height: 42px; background: url(../img/icons/IconsetW.png) 0 -590px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; z-index: 1; } .is_1x .icon-videoplay { @@ -1329,7 +1329,7 @@ div.im_message_video_thumb { height: 19px; background: url(../img/icons/IconsetW.png) -14px -389px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; } .is_1x .icon-geo-point { background-image: url(../img/icons/IconsetW_1x.png); @@ -1373,39 +1373,44 @@ div.im_message_video_thumb { .im_message_document, .im_message_upload_file { margin-top: 3px; - border-radius: 3px; - display: inline-block; - width: 340px; + /*border-radius: 3px;*/ + /*display: inline-block;*/ + width: 342px; } .im_message_audio { margin-top: 3px; } -.icon-document, -.icon-photo, -.icon-video { +.im_message_file_button { display: block; + background: rgba(218,228,234,0.50); float: left; - width: 38px; - height: 38px; - vertical-align: text-top; - - background: #F2F2F2 url(../img/icons/IconsetW.png) -2px -229px no-repeat; - background-size: 42px 971px; - border-radius: 3px; + width: 42px; + height: 42px; + border-radius: 0; margin-right: 10px; } -.is_1x .icon-document, -.is_1x .icon-photo, -.is_1x .icon-video { +.im_message_file_button_icon { + display: inline-block; + line-height: 0; + /*#dae4ea 50%*/ + background: url(../img/icons/IconsetW.png) -15px -953px no-repeat; + background-size: 42px 1171px; + width: 12px; + height: 20px; + margin: 11px 15px; +} +.is_1x .im_message_file_button_icon { background-image: url(../img/icons/IconsetW_1x.png); } +.im_message_file_button_dl_doc .im_message_file_button_icon { + background-position: -13px -983px; + width: 16px; + height: 18px; + margin: 12px 13px; +} .im_message_selected .icon-document, -.im_message_selected .icon-photo, -.im_message_selected .icon-video, -.im_history_selectable .im_message_outer_wrap:hover .icon-document, -.im_history_selectable .im_message_outer_wrap:hover .icon-photo, -.im_history_selectable .im_message_outer_wrap:hover .icon-video { +.im_history_selectable .im_message_outer_wrap:hover .icon-document { background-color: #dae6f0; background-position: -2px -542px; } @@ -1479,7 +1484,7 @@ img.im_message_document_thumb { width: 14px; height: 17px; background: url(../img/icons/IconsetW.png) -15px -897px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; } .is_1x .audio_player_btn_icon { background-image: url(../img/icons/IconsetW_1x.png); @@ -1759,7 +1764,7 @@ textarea.im_message_field { height: 23px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -12px -68px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.8; } .is_1x .icon-paperclip { @@ -1787,7 +1792,7 @@ textarea.im_message_field { height: 23px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -10px -4px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.8; } .is_1x .icon-emoji { @@ -1836,7 +1841,7 @@ textarea.im_message_field { height: 21px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -9px -132px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.8; } .is_1x .icon-camera { @@ -1852,7 +1857,7 @@ textarea.im_message_field { .icon-online { - background: #6DBF69; + background: #6ec26d; border: 1px solid #FFF; display: block; width: 11px; @@ -1868,13 +1873,41 @@ textarea.im_message_field { .media_modal_wrap .modal-body { padding: 19px 18px 17px; } -a.img_fullsize { +a.img_fullsize, +.img_fullsize_wrap { display: block; text-align: center; } img.img_fullsize { margin: 0 auto; } +.document_modal_image_wrap { + overflow: auto; +} +.document_fullsize_wrap { + display: none; + cursor: zoom-in; + text-align: center; +} +.document_fullsize_zoomed { + cursor: zoom-out; +} +.document_fullsize_img { + /*max-width: 100%;*/ + -webkit-user-select: none; +} +.document_fullsize_zoomed .document_fullsize_img { + /*min-width: 100%;*/ + -webkit-user-select: none; + image-rendering: optimizeSpeed; /* FUCK SMOOTHING, GIVE ME SPEED */ + image-rendering: -moz-crisp-edges; /* Firefox */ + image-rendering: -o-crisp-edges; /* Opera */ + image-rendering: -webkit-optimize-contrast; /* Chrome (and eventually Safari) */ + image-rendering: optimize-contrast; /* CSS3 Proposed */ + -ms-interpolation-mode: nearest-neighbor; /* IE8+ */ + +} + .media_modal_info { color: #999; margin: 20px 0 0; @@ -1886,8 +1919,12 @@ img.img_fullsize { margin-left: 15px; } .media_modal_author { + color: inherit; font-weight: bold; } +.media_modal_author:hover { + color: inherit; +} .non_osx .media_modal_author { font-size: 12px; } @@ -1914,7 +1951,7 @@ img.img_fullsize { overflow: auto; line-height: 17px; - border: 1px solid #d9dbde; + border: 1px solid #d2dbe3; border-radius: 2px; -webkit-box-shadow: none; box-shadow: none; @@ -2179,7 +2216,7 @@ a:hover .icon-twitter { font-size: 12px; line-height: normal; background: url(../img/icons/IconsetW.png) -6px -205px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; border: 1px solid #d9dbde; border-radius: 3px; padding: 6px 15px 6px 30px; @@ -2198,7 +2235,7 @@ a:hover .icon-twitter { height: 13px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -15px -192px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.6; } .is_1x .contacts_modal_search_clear { @@ -2314,7 +2351,7 @@ img.chat_modal_participant_photo { width: 25px; height: 25px; background: url(../img/icons/IconsetW.png) -9px -516px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.5; } .is_1x .icon-contact-tick { @@ -2395,7 +2432,7 @@ img.chat_modal_participant_photo { height: 26px; margin: 13px 0 0 40px; background: url(../img/icons/IconsetW.png) -9px -516px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; } .is_1x .icon-select-tick { background-image: url(../img/icons/IconsetW_1x.png); @@ -2514,7 +2551,7 @@ ce671b orange font-size: 12px; line-height: normal; background: #F2F2F2 url(../img/icons/IconsetW.png) -6px -205px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; border: 1px solid #F2F2F2; border-radius: 3px; padding: 6px 20px 6px 30px; @@ -2537,7 +2574,7 @@ ce671b orange height: 13px; vertical-align: text-top; background: url(../img/icons/IconsetW.png) -15px -192px no-repeat; - background-size: 42px 971px; + background-size: 42px 1171px; opacity: 0.6; } .is_1x .countries_modal_search_clear { diff --git a/app/css/desktop.css b/app/css/desktop.css index ffbcddac..4833179a 100644 --- a/app/css/desktop.css +++ b/app/css/desktop.css @@ -179,7 +179,7 @@ a.footer_lang_link.active:active { .im_history_col .nano > .nano-pane, .contacts_modal_col .nano > .nano-pane, .im_dialogs_modal_col .nano > .nano-pane { - background : rgba(3,36,64,0.08); + background : rgba(216,223,225,0.45); /*45% d8dfe5*/ width : 9px; right: 0; top: 0; @@ -218,7 +218,7 @@ a.footer_lang_link.active:active { .im_history_col .nano > .nano-pane > .nano-slider, .contacts_modal_col .nano > .nano-pane > .nano-slider, .im_dialogs_modal_col .nano > .nano-pane > .nano-slider { - background : rgba(3,46,79,0.22); + background : rgba(137,160,179,0.50); /*50% 89a0b3*/ margin: 0; -moz-border-radius : 2px; -webkit-border-radius : 2px; @@ -324,7 +324,7 @@ a.footer_lang_link.active:active { } .icon-message-status { - background: #43A4DB; + background: #6ba2cb; border: 0; display: block; width: 10px; @@ -381,6 +381,7 @@ a.footer_lang_link.active:active { font-size: 13px; line-height: 17px; min-width: 60px; + border-radius: 2px; } .im_message_selected .im_message_date, @@ -492,7 +493,7 @@ a.footer_lang_link.active:active { .im_panel_own_photo { width: 50px; height: 50px; - border-radius: 3px; + border-radius: 0; overflow: hidden; } div.im_panel_peer_photo { @@ -505,7 +506,7 @@ div.im_panel_own_photo { } .im_panel_peer_online { - background: #6DBF69; + background: #6ec26d; border: 1px solid #FFF; display: block; width: 11px; @@ -516,6 +517,10 @@ div.im_panel_own_photo { margin-top: -7px; margin-left: 43px; } +.emoji-wysiwyg-editor, +.im_message_field { + border-radius: 0; +} /* Peer modals */ .user_modal_window .modal-dialog { diff --git a/app/css/mobile.css b/app/css/mobile.css index f77916b1..c02539ac 100644 --- a/app/css/mobile.css +++ b/app/css/mobile.css @@ -535,9 +535,7 @@ img.im_message_video_thumb, color: #93a2ae; } -.im_message_out .icon-document, -.im_message_out .icon-photo, -.im_message_out .icon-video { +.im_message_out .icon-document { background-color: #dae6f0; background-position: -2px -542px; } diff --git a/app/img/icons/IconsetW.png b/app/img/icons/IconsetW.png index 3b2b0cd4dd8d08f328f63d118f8c468e0042bc9a..39e592bf8023589b57a4b766ed7ec2a24bdfa23f 100644 GIT binary patch literal 26483 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 QeFo>@JstJ;suscj1vxmCPyhe` literal 25746 zcma&N1yo$wvOkQw1P@LK5Q4kACIm?14vjSKH0~aJ2=0wT;}QsNAtboF26uP+Ix}kBvcw0S5<%{r;VdD(q7o4h}UL4Fz@;dJumC z`yd6&YJ=4r%)#!)&LB8RGY1n8&3ijz3y>eq$p(SV8>?s zn}*H9&Ji{m4o*be!_nB(1_Y)t0a;kti_#vqbkNdRnTgVB@hWjBIZA^pt=@S#gVel~ z)lI!@Oa;wo#l>huJcM8j>_A{+8V@^Ldlw-OQQANG3c;>_-)5(!`I7`}BTD<1P})iW z8fgb-5DhOIH>)WJCnpUb9~&nRFCQN#3k??sCl@;h?4OU7lShb`Pl$`3=I=jR*wdWN z%!O2CD=j>od^XHU>tp0adWd2uve~&f$UuEHeP2hi-2Rlp{_TP&AZ;Jlc zE!gh)efiI}g?;&FT-`oXxP?(TBGk#-jCP{_o=ZdH_+X*&xLE=|6uKlrh@liFj%xNJX$UvGXT6Ka_FNQDvYgT> zw%wHzN*rYyaGVlQ=!-Gkk}nyILhgOJ=lZh4V?Bod43|P+6s295s9l)+Y6?}%-l8T; z^yG1B6=nI7b@cXpdj(_VW3ae1gV9L9@m3!q@Dwq(Fple12x}#Vk^|V8(2j`lMhyFk z_xoUylxMF0^HY@S+;I>x=3V!|3r1h1SSz6ifT=HHqTUt(L(~c`&6^^ZXE@?U{w}0N zOYRSs6aYi|6)ts{wBHd1Nw~&n;nnLWtx&`%!%SNicT`1?6C1bovEPJov>*=RatoTk zmu&Y8V63<2UOKQhJnf1-N8^aX!&q0`&MNlEocg|eG=C+|a2&JQC53VlA2(*v-l>nj zGV>S~=Y4KE@QF)vGxyaU(v$sbpG&UH)h|xX>UOyzn11#ZJ#1?70#A4Vrh{fVxD$F0 zQWo{|nCb_??9wv;mHz4_l9D z7_B957(pu1`aU*sβV6)x9S26U__Ejy*JY^hGW>$IZ3D{@d0f}g%R=PHR{|cp zrZ*m;NXflHKly+#3@5W18Wmas_HC!5+7%=L2UpiVd3Uu(-zFS*Y|L{o>gKB9}s zZI0DQUq5>0Q!=TT-*{JL^Z?8HLT%lsfm>}_MH_D#s@eo zxGjN~$V2cn*WEcSxh$It)k!~V2n*U&%<(^It(D;$;K~W(b`3}?(t^6BY;?MErNc4I z1a%TjOB1OW)#nVt!XObW5;1?uKwel87S`E7@B4JS9T({2I>7S{SNB)LFCGPpdCIbK z;^r|R(Y7w@{k%<8)+9tSczf+z|JF#(^McuR#Qrb7Si!AS62}ZaVz0`jnttnC8*EfN z!S+fhwEIJs00aBC>Lu7Vm1AfYhba*>CgH}uSTq#3)OVy^h=j33a-bjO5;HI9%2K;C z`5dtQ)`y3n{1De=dl*{~tvkd~M_=CTd!yAB{>jU4)vJ_4=@jO4*zHO+myGNklyWuwV4bQRMV*0+-s>pQ4Q&EdmC$Z{%{q4JS4lhN>c zE~nG}YF+4SrBZ(AJq6kJ>_+8T_s>-%)b%eJxo%owxiwZ8*aM6LmBuFxrM)J?#^Ut6 zyu937({64J+SN=`Fie>ozH$py0{(OYQP9kIQdgdjSvNi8S?o>~DL63Kr z%r2u@LOJp^-}V*nAs}(~1Om#%)X3nvgcUPq#ok@3%*}(+wAYLx@R_QXH!nY4cnasF zBMjbq@Urs+v~Z`rT_4ve0hVe`kZ#xQ(0u|cT6~kU3;4--Ya^7;u~mfLxQoPeGpUt! znRw#rqj1v)Xy-GW)^7E1BDXA2?vX&H&Ty}u#gThP?Je8#Yqo+ve%i@+rPY9@doGOV zG!bO{?p@K3)BEr2sm7f9ZD}9|4^35x0}o z6Q-A}YrGEyRoJ&=mV6scvA&}+f7*Ts9nAKlGe!j9!<+yu1St`Afe%j)yO5Cp0b&(V zCr)e5?sCbdlXeyG)Kcx907Z2}iem%ag0@rh!a|gZn-m3K-_6{{U$-zr`S2weQpDBA zQufk?Y=#U-Q0}>$Q{?-Fcc5pC+In6LLX72#V;90&D^qW^2`Jgp&m>)9Lf-_-;`{)# zWmMIU-duk-SbZ)PfIG)mnz20(XHqoE+wCtNH9r!le8MGPX=P0puisvG*mwq?Af1%X zmqPP$D!A_-a-n&K*nr0j@%r=En++4B@SP7Ha4dc_3%k)aM|&F`yV0@<1MmeV*)Z9R z7|Cbe7NR%Gs`cLoVR8;pW6Tz%#2jzrpf@gZ?K7NC%sqnKT{BaMA4x=O-Dr7~i*BWd zSf*SgJd?^Z#MQOFCoj1g%h~HPdTl(uax{0f*M&=QZW=4}z_2Xfo%tekD{UNcRMzJ{ zXxTr&mN1iDm9c?~Tyoeuy`q-T%fqVA@6V`hUSym{dmrFSD#o_ax6xMPlOn%N-I;gY zP42T5TDgfEbMS$G12@z(k|JX!EL%2V#;?0?jk8UkuYLVXg8@@f{gnFQ+?i7rB|XXx z4@gN~Lrs21v8sBXtgB|SpE~jsPJsA$1Gl%P37+BLz2{&ND0T~1V-`(AYvt|T`MuM5 zxLbN_5i48N{%Z4A?ESj(x?{eFmu)JW#)PInhDtv&-9Ltsv(PGr!WC*h0f=LB#Cg6= z>fTB_ksCZ+WLrIr?zCUNzv^Rr3&85y4TG&der+^Dsj()%e@WhjrKnTF<`Cvhmi=dO z^?{*X)5q5{VkjbVBAUB_a=+4GH7qbrr0YaQ5YF zK*Ofl&adhE=t%vIKO-1>eG8XY$DDK}xll2-*ZWrbBje4hBLn-(`b9|$m^j>NOJj1M1jUkx?TxB2w<_32;ym`^+p|HbF1*YL(h0Os2I=j_IH4wE$- zhpD}~q>ppJ0hAtw!EAuBjk5w6Ve{7*#JfP4UzkSKy4T*LC`%-ULTzlWFU!xvw>B*; zdJy6ta;vxMWD{1X(*zXtw=JJWfAF#1|M(IIo3$!J1^UzwwJy)D@5C!Z?J?|I>B}@( zwdtodYgCwaN%e_m@JLVXrje;d!(i&Zt?9?+;d1&gmO>WB0Xqc)eeRVB;)H`cT@H;o zs$(GMCeSKEM-RwRr$=kxmTxG`tPOj8vM?>xEIIy@Z^~Qhi)q)x%lS72^^K7cL4_6Y z0x%|l9N;qzKNTe#9B&TTqER1DGnc{>q z5tTNTJ7Sl)SA7hgN#gSeRTaO_ZrHrR?ZJ(<=LFyj7Y6i%!~FMjYUwh|M&QIPNo&^$ zsP;B+S;<$%GGMcp35T8KEM@Sg`az~)$|(!L9>T+C4RgD-z-k>gpt>2KG-A;Ob0 zT(SexmQ~vDrvy?(3)y>Hq4lx7j|BD;80sgb4Y$&{p+*Q6cQw$Os+bgBwsiGnIkh>f z>U@{n!bTWhF&99q^-)d+F_<;~R=R8c80(u7=9gwZu%41v;IuR17m3D!CRDav%?r*6hUKWhLj?M} zPsTs68{}KfGY5UygZcZRa9rvqSB5}^IXeX+hDg2YR9uC%Wb#%&MsUu>z90 zVl|HP5z%pZ3z~m9EDxz1(<}-5<$H))R#wKY=;jR=I;ASoZqt;?9raBU@hkOV><&rc zmPv&xDBQXJD%=^-jAqU0)A3`6WZkwgdHeRO?;eJ~Viok3< z3pKl%vW;)dx5OnxiZv7V=4}FJ@Zz76Z_7tlIdA`MPdgB2$k~QI-dXV5Tn3(9wU($Q-#}#qE)P}?3GJ3?;OgL`N~rM ztS7Ct??o^}E0@(C$&Yq|1b8+3%Fy}tta-n3KjYKoJZqFDOE-QpUZ7F>uFKHP=*0Vt zPwaIXNU_t*2p=cyQsLa`snVS=UC}0{y|C?jh#8E`8{oH?xKp$10G1UFfh4Dfm%)xE z*!VTebS$E|0?=X>LL9di&e`}+m*!+e+hp`5ksoePP9UO!q_w)TC_i(LU!cz8ez?np~#~Ckrw=La^mq#{s_%aErTeFi(190TB-Z?MN7`juC39Kfk}L z<6RiO)TF9VD^G`8=dDXX^}pe0oegrXjXq}OA;iEYc+8x-p)fqE#heq=VR#|YMcXU3 zUaTBU`D<1%N;@CiBhyL0k4foUJ@+x z%!DNTjbkx|s|Sp^W75@}exkWT2(^uW{WkFIZK!-uY*SOy`7dyt2{=)BtNUkKyO12*({-7QA^Tu26^nlr%q)1w{ft=H6933| zLHD0c!(Wl(Z&ZO3cMJEB&lQxvm;PWJS-G0%*ox%K^ERqm%)HqU%Gp-nn_5`_nRg%|`xHNema z{&3!CZTlDZxl>cO^t6guyH)fE+(orclwDGnyFo24qr^2K0d8rv4M=3^WimNw8Qvb+ zwF?73MMdH%+wKdDzcw2>0fny62=wPKX$LbirI%zn`j#a1iX@{dYgKRByLU)r*W9a@ zdgU9)chRfySM*8L-w4WzBd#{w#jpxU_u-Uq2S^=HS8-D?s zz>txMPEV~Lv($EIJ)@^m1L|c^RasZ}S3(5QWPh7riar6i$4Pz^IGSsn60qN%ZLUT2XD4L4{VIxZFdx zqEd4?*UD8t>V<32Ui+;5i&avHd=O=H76Xd#bo4$CE8hMW1LAV+5PB9DBoD^zKdysc zE7Quuo{h)shOk%%vuDv3Z73%VniM*6Dj%#}S6$sY(iVP%aFGFzL~euGFea7>`nEyq zLJdmaya>Kr$gG!SV{n9n54}yRU*qi$@hFaH++H8;-RPKkSmFytA_-&7M3yTrqnD)b zc}3M>6C|B_FkU;*D@(cZ8H=8toie>^?@PqBN`j09l#`peRu)%PNv zXU#qW;Yx{kMQ>OqEwcm)c*v1mJqud3wGw3;I4D`xy)m)FQ)emf=CRD_oC_G~-Cha5 z8TbK-My&AFkuu6`0EWwIk6cUGOlbUS=ro77C^l|eh3Cc7)VT;YhmnpIN+2Qw?d%}g zZ|<~SmCsa9-{_m9R@R?+bg^=|GVpyytJ^BP1~1w-V)MV2&$ijjSHp-?mMg*8oiGdB zU1F-DZc7c*dh3K`&-ZcS*H(yzVc_okXoA)w24YFo>m^269b3Q%gri>ow z^M=C4k2;rwnpfR06O-R0dj}?^l~>g(so4yFj79dJSE`<^GM*Z*u2gby5qN(qUD}WO z;m=Ux@09evha&&LmA^v~RS^&?-gKU9)Vx)CgIL*g0rYSU6wJ=Tv%taailx5!sJbb8 zdAzbRHHU{u%reUT#jX~X=4u#5S|3?KxWEzLDpg=`2fs&i{{R9vd7qTnq>UJlUOQKU z!Rz0Ie+N8!e4Y|8?8J@=Bea=0vbM&k!_VfYl-lUS?Rg*EVAbkKT61NJw9)xOC??4j z4dkcmBx10+1wVD*L?zLD^P?_MyH~-d^yO@@vSj@m4AHj_D!IqE6ePZC#imtYV!(Rz`h+~R} zkKp@WsZiT?uFB8Zp1s~{M~LL;qE1FA(R3m{450scf3(Jr9uqi2?t3U*a~HHF7?6g8 z9rh^LZ_{1;%VR`pt+U2>ckgpNVds+^nRtD(^J-Hx4v=++`q;g0zU#^U(k>|+`ed1@ z?8yLz=J;AV5YwoL{MHkK!e=Z?2BASiL1Kj|xzhO`;s1p){DVOM8w&Ba$|ZGLcx!e> zjvGzWvzHd>puch!-F3p#a!nyj$0O$qCBqL*$0bR{OvlH+HLD7a2&q(= zJ7&LdI})}6ny+d92=^KaHy_Y4ueFgO{x85|i2-*f?=3aY47jbOD1<*bZeOwKSan~o zU0iPBOV!H>3uv=0j_;5|6hn&IQA+_(`7JdT&HhHasiMy8>6&xDZ_20UhucR@MXhp| zmC|VE6+w;th>SC^QsankF=Ja4L)*uuhS=4W(pLeW}gqIkuDXDU_MYJ}Fid2tU zcfEV6o1?)B=}k%$FP4K+NpSywH;2_Ql#Nl$?Fmq8IkOAXwYTI* zS=9RN)mr!1ZFo~^`-N?7Rm0MDnb;2>00bp0l*y#Cx48^cM)TIn(jznoUrNv3$CMyo zPv)u2uOgQ~Nq~7Hif%GQmXOoCG{XR>0!p1y>+~X$HF+9DVGLKv94YajF_K_i+aG!l{r!snu zu)DoszFdrXcTNw!zN??4WY?&2mJlT!9&JPc>kYrtxe`Q@@xr0+Hd%E+q3o&JhVqx?clsLr@2ECq?! zl96zatyL6__}VOQL0~J@G&?lKHz?@}jRnAmKc1+U@zF^{}6nR42|reUZP9{Gh5 z^1ysr5H<0P9ljYRb`%v2(XnJ#dTf#HA z$T>bli`)<2u1EV%-Z=2>RW-U8)+Vz-vr+bzD?&8LfcZX1Iy3tXgyijz}z)0c-gPNXVTEz?XNaP8&$3 z&s!%!Q$9##j}p_n925p*v#V&aP2{}RJmgOl_!eUofNK61VUIj`dSJ;9S4T?=4y&Dk z#tGDe&k_Rz1N&N0MYzqe;wK#OhjF9pCp*5>{9l8NcF7 zyau!)jf)N!^>^|vlCpDc+CXM4kUBoa-{OQ-O?UCJp;CL${Wu*KKITCN`a0RhN~<%z z(soB}wGRYs_tXkg+*$e~$V#j^-mq$3|62H-o}T^zR+jrBEFF{m9AGklH30M<6TqLx zpggrtG4!(f9v0Q!QuM7waFam=lI2*NVu4@8exD0Wvr_~fg^hT3mza~Ef7PdcE16WDocnuesO-H2S!*(_q}4y+VmGhMFZAw8=uuxyV* zyi#d3f1;8vm(+|sNuc4kHJH{5XHrP2D252CT3a^<_A;-@zm(Hh{>HWTQk+YhRJlD1 zN25i`5g82+J{Hdao?^gp3>m4p-zAk9S%Qe-kIgK~SqTjdjWr>=&~-uf24!Gide`8< zK#RxC$(lE1b3~j8V2l-RGzxJa=5k>%s_Xz5gCO+8w4KP8{R#(R4!4&Hv)wTseyi7Q zYEhBm37k8vfBgM)`v=Oz>hoUbMkUQSYOnX_!DhLjB<0{krBw-o8i18giH<2kCtEE1 z`pUWiZEu){9XZoj$}+5IssQw{balO?l^zgTgmWoGS5z-JttIp8cDo`&L488K8{{4t zBo;pW-oC!p6J8uyT|``BR3nk1lDMW0;Tv?E!EM9@TY90K*45O++J z__eoXa&s3lGBR3b-6cF~35RFSoMq2|1;e@4g;ntKI0l{^eGrI|a7_7n+bsgCfiV{NBD| zk1{c6u(7?pa&#eoP6V*0Uoh>8oqewxvU``VT}0rHcP)Ra;Yi098;i`DDU+P3P1SL6 z8b9Hf!~Xi}ZKsU;mVlK8hlD{LKT6fGI9~S@RdlB6jDicQA3Hinb zG3d1x$24QtzVdwNdzZp~tyTY%F37C#@Fls@_06LD7z0v>Cdod7P9_*#{rubv&F!5- zZXT8Y!|D3j`FStSy#+_I|8c{Dy>MpNQHFn@xinZWrtkkpz3PvBLHS|9?aWL2qvM2+ zVphjCm{UA*Fe|<%fJRT^D2?uGT&$NI zK!v;oT=iv!03C5cj5c(CH`lNInT`TJtlBo(#1Pe6K!6}Od}@hJXF7EelS3XXLm}>} zDOWae2NtZ=bt*J|4xJVoQ~62mW{KsRfrX9Ndhy9r^oxo>xn1*F90fCn>Rk-qMWPk z873p5m(=MwIaQ=$7^KU`%1$Krun59q)ciiZD!|ZnO5=X5Q1_+;4!Rl7C>mb#dhT$) zxqawFC3o$SYDL3SVAntL`26fl_tP{nZrdMbKz>3p@<}ot(9j0PW1ER*JILVVTIuvcfY@rLTzpRN~eVx)R z@7wVpuxKEZPUE~*)P;_S=4bi-ecJ0&7G47JkmDAm2&p8ZBK1c=F#r_y)}T*}N`1~) zVT_S}7F&VT9OzKS8Q4E=oEDfxZLRuPSg}P&fldp^V9H6Z@rMNH@+jnZ!$bFwQ+K!% zC{>WjEL;7GNFY!cwn9__O#ynre&bE8mDT`-?$UL#yq+w_7M&p7d1t2QN99$-YHem- z8d!GbQOciX>VgNYK3rA5WqJC8kRo>#?LQcw|7lA{6|K91kYAsu*dp;@r^9x}OOIO{ zMnc^~V)dyJ4kFpK?maJQ%W#S5#zm^L1(54APGS^H7|r0!Sg_ zbSfo=0lQ3qr_^Pswby-sHUxsrJta&`61Gf~dvaKdk(L0(5uf8~C#!wu#gq~z9FQd- z)&6F7T(!+CO~+<4OX?ElU&~r2_Nt)Paf)3RuIaBZOYR{&gNdL!F^2@?$!HCim6i7v zYigqF+=UbadJ>luilsrXQA)By-iG4x{+@hrZXtVc>{BdO%xo(v&yTz&rT;s?{M-1I zEOeJ;?=sfzC3m!HaP6@(vw@>z=h?@)>o~9@DGInW%c*Inkap}p`H4W(H`jY) zHcN!`4kuO7OGF1#r6MacKT1p>60|K;e2i;7utL~-mD-NLgs8XzmjsIx0{W3A&Lu#> zyD-42`+^0aV{DGRQ{nHq-<*--*%D4|+>AqLyw`lznz#2MArR(yv;w~aO(>ABGZ@v` zJHbSZovjf)BDD_1e=e)_%~7%rvsh3{Ls%TIftr`N?*wR|7JI^Ft)*DbO&r&dDY_2` zDmAPfEdO$*oa+VCnZ~l!rItD$7dgj77j0RJ1Pf#@?E3)kz{Laoi>SRSkBamUychKW zd+$@nqc>S0UN}YSU3iGzhUWRYG7gU%Ujl1&qf{Oo{+LU%g7BVWgGVuzlp?YE{Zi)JRaH;Yo{&p zt!^xggepDH4Ghc_5`=AU^YvaVO=)HRl?#JRB zTYq-Z@@%(Xt^97t-BP*F0<+T&K^lCm&ox3EDz}s^wQ{(kU5N+_d@OOtuW6(|h8mb$ zy9WDp7z+*!S3ihd)Dg^aN;@c8QTve(G=32yOPV@<5_jSURGrf++JSwX?@tH-k9%d( zC*zZ6KxGkh=y?rJtS-oULhT^gvj2M10U};YeJFeqjw84-yCz+FIDjjGx!u+lH@|C$FdO>Yn7F;zH(J@FK1!tYKM63G;8U2FtMlR8Z zxi0q<9d|DAhXBgdXOqQvyM_Ss*PRdOiEM6|5AM@EnsrSn!ia&pXri^@t zajJAk;fL$LqG*%7gf!=gp!U?UIW1(?j=y_fSylEZ$e|%7Ue4Z~p3!6!{aAKd#ypLR z!YCI6q0CO|B6F1IBcCd-KNHmTz-U#s08TvHmQ%KHI7;NkeU&!0bx!Ax`ibdRJeWa( zLjjmXpLfFT9GC{%;rc<|C}%dZ?Bf;>lL4v=m}I9M6eqSCtmfCeK`&FyTnjGhw3fT~ z#o3E}@K1U&1*+<~P9#)#(}jo)uL=NDACx^dD~M{bvg&XyHas1UP?+))D)yknRLp8D zQjx3g*0oYPGG(T4rORMovkHA_V4jrjjk(9%nvX=m$3Jp4Qiv_Tjq|uN>SiPM=}c?e z2t>SREd7-mv)$IDV9}o_5Os(i+B0L`f_RJ$!7G`sApnO~e5p~s$Pi8~_>9BocH`2$ zCV8@b)a<90mKdw!7KlJbzQ4~zuA5PG#-@GTrs(`$xbNwkRx*3A^1XEC)-ag?DP7sh z1=62uKmg9F0PtS!{ebJl{QQV#ZLh2i88jh<+uLV4mi;sS`&W+rpP{?-5U>F?{HA&u zE?}=LJIs_aU;fgS0a6qitQCO4aj7V&go--#dddf@Rgv2#TE|tnkSV7bly@clHjjy& zQ*i~+mAt4b&>XSIAMvhjYEoF=($>!VV8HJ$Ri53_J-5k5A^!d@1Mx1-U#$+QgOzbQcBG};u8$q<5L{DmOg~Qbj~hx zMGW|2+j%kc?k56tpTigCS_1dT6jx$4l_1R+6DeJI@UYtx$m-24@oOI0At@xr-p3Y* zmi-hvS4S5Jg-uFU#Q)F!6?%x6daNxf&sjvFojUKN#>^$(2_G&-`*isDi+;AOnk_-@Zqr9EWkUen@|0aFJm+rQM zn{Am`4JGk&U-YUDZTQ^B36+W*zuVRGvQ3%~Cq81^*@sWX^ViMae}3biG?UblCXeK5 zeS-aw#et1=ROKVP11kGrsym^ohHpr{1h1%w42r^x(RA37a0z$xn_qn-5Ij;AhoqT( zx|0En!C2PxTBA%ymiu7tk|F==$?=A9_?WxAkl-HDKvK1dZUjER&QP3k^+PtwQ3_f1 z&*o zXWs{SZm46SEphrNyn)Y=m92gU=4`+)D_uZ@H4Qlcq({q9_12p7_P(}Zh*Glc=+`u9 zF#6-@(#I9&8hr`Z?+rpaY~uXinsfAoI|*=^x>>AU6~b7!oli10_rsxgLT?5rD{<=H zMlD--Ur|F5zZex8HQ^Ej3n{KJQjP{mC!tM_`Q%ZmPt)>7H7K`Dm7Pc$Q|fQuhrk;?j`dQf>OwzosC>XH^6A1`O#R%!IQCRRq@Dug(y*YnS~3*k|K38y zjc>sIOO3>@)301)gGq5T`S{~}hq^8V54FlNPS7q>=J5Xb6`$49{Q*!TMvtRQw&s1r zAoUQ&XtBd?%mga+J9C2&q0>#ShG(G0cjF+whf$AbOsnU3E>0a5u9_>0KEG~Nw8f{| z-P41pEOB!Tb8WSHSXXzUyKF^!{b1ekNp}jgjJkR!i$WD$`EJ=l?%JzlcvWU=&i!GA zdZ-|w{a1Jb(;JZWK515$$oX`39buNz=TBQGqWsr;V1AiOcv(^I=50}tP*B5{N`(pU zB4_FZLJ5^Rxoff^up1)Ic`cHQUoiA>$$VwnrV;aLu5H2E@A`t=KtriZUWT}Ni<8K0 zq+HKS$XPghfch>a!@B}w-`czWC5c-jsq(RNF^8yCZr;rjIIcTqH`@unDaw9pCwqj! zcF6A?smNXg|9uD%AHwwaTiHuBtFGKutafKPu4~Ub6iY=9g1{o`y;yg;eZ}3i&JmLt z3*-a$w`yf1qTGA_Zbb(UkC~HX4xquZ;@?$G&dlA?F#=5{=~ti+uBnH&`#a1Hg>xE! zWJl6K)krLMw}bzu+i;>YP~AUs&2gRL6b|WDHdS;e=WvUpYIA*{c`zvD-gF78YJQ5y ztE(NR)YbX{hMCC%y*fV^2Z7HvZ~#0CB`MED!c3JuZPJID0+*KQ<05CA?2f%A^GAlk zICtzsobEn7xM82!d7Rn3BMvn;#^#2M-Q2roC`kyo0@)|-x}k9_U&kXI1FY2*$5p0w zKh2Jcv6Jp^OV!N*pF}m}Q6^*IJ6MGiz6EYuEf1+|tXe+N5e`^Hg%wQd>;(!z)l+?u zeoNM&Re_cI9h(-O>eu4#l~mSVcNVW*i=L@%8_}P?A~lF2 z#44Rrj$Vr`PBIm6X7+#L=Q;@MJ${@?smP`j0KDI~{gsr#N3=m@=H595#1YG6zN{ou zl?RJdZMv<%8Jw?KP^J}Cn0w?fWdbX|S00Y$UREkLG=xz*MiFb?gPS0m+i582r+$p# zI#hw^*x!e%bPcktQcI$S9om|pVm(bIvuBL}>G>8L@w@W0;ufW{X*&^md5sy94_Fn) ziOL=JqRWSVYeh;KXIE4v=c|3+!ph36{ezE4j20jM*k%E5_S;>;Z4JcRV_)Fa!4ph1 zyY54wUI)521PNG#o0Q(Gp^8WBrV{5EIEmFe2OBZBUTwK^6m9y8&93z75Wm@%Cb*_U z;(S9F>PhTI9abE+m-II-xIR9T#cmaiTLS@VsHI}uE{eXh)X zK2uDqx@XO(UZQ{cbvqnDlT7PKsIgrDi3i0%VN!oi3kf zL)v^-s>6$Ce7*a3*3s5UKQktE*Z7^RqT2@PNWK=N+)BD9;akp$KSh|Dw?2a8Rqm&S z%~1Ps_RC%_?<2)b^d~X9(A5JfKI!dZY{8#?f9rfpxBZo2TLD!a+~u0}xGDQB}F%E<}XBeOOiuJv_w#gubl_L3*QrO87A5G=>em zPqk3wN!P?-`6BV1>7&W+kmJ2tJuZ~jY`OFtS%tcv2~>WD=U>32V0wHqnQ;>Mqwx%W zYL4V#b@&1UaFWG(Q*9OHqhT0xwVTKyW=4-r5JOQ0WzK+&0zG^wBhgMyap<-;MA}(< zY!OSqVT>De=-uVmBn$+a<#SJAY5OI-toDxCi2VcLgJ%<7oPb9?-?Q)tB4JPuQJWr+Vb0BxZ zmwr<;3!LMf71sPD6H}yV!AR=$i~6|46E82JemrKo6>F61LOVaFJB!AC6!j6)RI18X zd~&jfdMQ(9+E%N7q}8-iJ#M-diGQkFH47wd`t)O#gSbt?y?D~}R=53PregaX1xiy; zGvkrNUKaUOefOcY>OrE20cgfDKe_v$X^B2dFGv8LYqh;odyqU0?}g&{oo^~1>Up!H zax3>tPrZ=pbvmOT-5VK1QO_JJ-AYc~s%-Z_wC`<@(URyDO)P<~i0pi-Qg&wa(^DbrD(v7P0?B8$dTd}oUdbngl`C$QM4Gn9yaO(Jh%x7}HXHc(Otjx@(k+yuDXG7~`G&jt)OUhBp3xetd?k zeDnn!%$7zeCv18UvLj4N_j?q{f39Q-tGm^-xFe5Sy2>C&v!sa05V|H~Ef7VdAs5tc zl^eTo@^63SpI8)A{si!yoyebz!jthL1!Aw$oB%6DgybCN*nRrU`&m&TVd4i*hB2n76QZIH_sJBd#;;Bff@fXjo3K)?j20xkUQ%%; z&Vo$Oc7_)^wr7C5urOTaTPJY~sQZp|_qnkzK(-y1(hzg%+N=lKfSt7Sftr&09lBx? zsx}d=;=$2mP(<~9x6G8hzm4F7`mFI-Ga~%OuvL}cE4TR=-@ZSbZ|v~+uB2T>od*=l zrK?K%*S?MrjOpB%t-#tr)nm=aIlFo8pT=r}{cdMxCAahaMNK|o*bq1v*<;CSlmdgM z=DLt9qkdOzMJyLO_vG!ZN0$VO%i&|9>yWjzW5)JkWs-_IRIMMLMjEmAY;1q57G@h@ zt-k9it2Ssyj^rRRAbr){ZO!6`YkF4sR~1)#=>YiZu_!-dbmfG8REPsU1h0tF_JjM2 z={Hd;@+=RQ(#1AwUj7%9fbyU(z_lBZ%#|^G1|J8M^Xs^d=8{<97i1Lqp~1(#tntQW zZvy1*0-%0ctf^A4mkg^Ag@vf9OxH#|h!&bKO|d!d3`Y=SNCffQE!^S@J&ppN89Tl} z;oIS%q4lLE)jbI22lr&$sYORpBOQagaa+ugMFnep}JSCC5Mg^?#L;oB_Lr#0q1_wMR5;om;`BEvnBCz^y{M;+(nRctAAtX?_<&hus%axiUKSOC% zh^vWjz*yiTlDs0VG#(IRVn%j>yfAncHwH!eB8pZ#On$@b&jRl*JqI6C&yBt{M4m-M z#e8N@FEXeSPj0)~CGU3!oRsou?E)FRV zan@#l%<5hTj(_r0oAr34>`&nWADrfTrP5VrhocJIwxWJcu-0NGf_yy>1Pot~{Ww)O ztbX&tjeya-k`$pZ4L5v!r-6f{fBR>2^Jn>?7l@gY; zQo>SdQG1Cvm;5P|_>5ENr#^}9rAK*y;V_-|i!UJ>9pP$_moJ~_Iit$d2Ae;dOGJH2 zGIfnWt&dok7IfbDVNTUJK5?Myd6D&|*;5AAXVcUKd&jkp!Iv5xrhK7Q0yuhPRuqfBVP5$tZ}42{(kt zj7k;uR@1Ofhu`BYtoy0-gQR5O|JTTOMm4oFWy$7TUQX(Kl4owtk z(vc3KOIHC6AP_)`^d>d*9)fg`E+9o(Aan@u#rwYJe&^orz2kfLkBpVI=h|zIz1A3W z?zx`l5nNK+el7WUez&jSkuRb>jKn*ty=}v7rRP%XeWxsK$Q61Z>=(VRbhaz@XaCfz z1*Gr8I_LSSK;I^}5|qD%kXbEmb=IX-;rwXIvK99^Nf$LRYRy{iHyAv_2i%-*@*ZKd z3=lci3qBu{F_jLFB&{JhNKH^U{vPVT+wiij_SJ0ARJo<1)H)r*Dc#1q%-7Yn1$Zpw zkG0X!QAj~nkYAwGQ$JwZKtNfUc~fna`qpu(*h>pQMwqq*-4Gf2=op8?`Eh9^Y&YBV zCYXsbjZ@D7Ba4cPIv0blFSFxP?Vw7#i>UJQJ6eO%YtzxRC+b8{mYNs7H&`1$isHapKrO;3~S=&x8saN^v2 z_EsZt>GAnidF$1VOUv2XTh%BdrebX2js@U+^`oV8>q>&$hx?{gsy$D?nzQolz(#eA z-uj>H&P&KI2ny$+1~nT=_R!qJhZ{jt0q$Y6qp=nr1aQW=~vrB-SGC!d&?xYAC*w1 z@6RL&xof^j^w6k)bV23enObP4BaYa$37dUEh9{sc<9FH-&DklomW7h$A$eVc`U9zI zcj%f1`o0Ta@>GgZg_>}4#(A6HF{^0q+Iv%xg=}*U@lm2Vpn?{&znWllySC@!8T(S{ z*6}CHOCalpKXS2OpD3oI>z+?i+t3a21A~Q|m7WA@)-zQ-NT4R1(1XJRzN;`I#|yTN zsiPpi*L1sf!-LLVg^nnul`gW#mAPTDI?kHA@+?}iuYX}B>_dzc@uy`2IE&9mk);CJ z&+cR6#?UK@Jeh+bd4rlB?~=%rRN|QP4^l>?Ut4;ucUQ06J@{EPdtU{nAcG?fIQ0&B zwOOCFqH~5onwr0K6BE3D9`8Yg0j2ItiDsYGQv0M5jS^GqV&FOn^@0@T1lD&0sp!i{ z`pLz)k&p=A_!%u=ZDdoyiAf|kbJM;m(5d9x`aLs)p?%J$M9D|{p)3{vesY)5UVpGz z!?1uf+RO=w-kO;kae`FeSjyy1HWW6Gl93i%tS5U6La1l7nd4c9m$DXl1InyrrnX!#|9eN}rHQJOf%yWx$O11;ZaOe}Ux_ zJ^{f;33P~yw8446G*ZK9D=ms~GD9Y7Evj+qq7rZ(i39NyTX-g|vd#$r_CMtG|K<>% z=C8&DQj`gA9`tzg>l1<(%*nN?C?<3?_svp6EvuckA4rFbaC9PJN4!YO$BOO z%gs~H!fzWQVyW(e3MxwNLu&PFROz#(dDR>j(@Tvk{ot%nsf9gH55n1sdAd;h#me3j zn-wR2`1d6mLbNsaTjp*8=W+3<__2k%9Zu%vT-W-nF~ys-I-MTQ9R?d!I#OZl5I4*Jo{g`5SD{rc z6O!xmoTLD^(|Pw)L)inE=DjE8H7mH(;9e!)>qfYvz$;H(^5-HMLu5mK@fyAyZG*Rq z&n~F8wrxMd^WjLvUMVIRht$T=Z{LM$QVR>P0_FJMd$9zh>MwR`-!pt!?PSkC%LU)J z`5Y1{GwF(*C9@?~@sj*8XeE2)h9j*uB?L$1ag{Ls(W(g^bILGMK|Lb@$KIeC>&mGu z5cy7vKGTZy`B@`QEEn1D(^52W;o(kJH#x3ikyk0UIP8#m*K9*Io!iqN802(yh zEjjR&>Ujkh8KQ^6d62b41-t^7+46MYY}ZE4Y$0_9;W?YYQVoi zR=gg_RNeU=XZ%qz;v)yNu{u`_^IFA}cs1g2m>=fdetllkLz25Hd)T|la)_U%f<|Pk z1TfhM*i2^$jj)UIuT9q!8E6?%g*7&NEiDzGJuU&g!%ZPk_l?uXG^4A?F5_iLit{~+ z($dG8Wl<1s$|q-yRFAV5BuBzvlSVeYM0_QSpYSb-k*%kW-MB6~4TkqTpWdqG&sde(yy zW5%@La?CX>5qa`Y%v(;A&*+}1M(4%XAfUsiF7WrgAfDtAGG}@onK{7yyx(Xy?pcc+ z4a5s|iio7vu02ySLU+3_cBz+uHM-7qX&a2;(j~P?KH6Jp>2t+Ms`aT)m1ZnXFuB^q zb0#OnB65@&MW=F2U%sPgXL3x0-{Rqs8lT+5GBAotzHOh+Pkw%gJWxsB3tGF+D{xwz zYO7-Ju#w(KK7Q2y%t|e>YGY3Cv6Sn8b`REOw%gRlo28|Nu_d?dCABLI%JRe0b4M*V5Uup$`ey{`|ND(fbGQdLKZH@dd>iKYf{}h+5 zz~u&FMVUCW?RT>d;X4w`&eoyUW`Wkz-4AM^V(_8;$i7iw!kT92@Kol@ib*aEfvO0eZ4U_Rh$^2G$a$96{RiKey1i)FE-3DxXPDRGlhOb91> ziwfNIVA|1@WL~<^d0&t^kRSOb{&5`w;6>=ciBT^7St{M)Oj5WXVDlxLWz8SaNeMnl zZ4<2A_`Y)S1>lu7cw9#jTz4b~4VRfEKyR%$y`)s~A}r2!3Bl6FF`;9mCu6;t1#nNc z9TNs?y$Vgkrw2K-t6yjV2ZY>yu(L2lmRu2{iu2uWOHXp3$4R9T7MuykDC?Pk zf4)v@k10sS!JduVi(oeVS@3Klgf4v;o2&a6E8cUM{hzPlq>l=zI9)L$8bJ6uvlX>i zO~-!86bN~HtHxERQ}k7avnig?>s2yk5=b?`Z2jSOP#ayR=t&dppXx8fpV9C{F){rn zq`E$PwPISXHo!JD$~H-?XSQ*|-A-+`r31{bFQEjBQ8VbSi7iy9S}`-n)7b`<_Pv`0 zo4$6dwayWRjD%d&(S-?siRI8G#*}fN9B<1~i%nY?cOF-XmJO-z$_c>zg{*qaCOw&? zo_aE=YuQloTz}27YE;ngaFCrC9=Tr&lbIyY9%JW82hX$eNr+LrHbKjY-cUpX#twV? zCAFo5Jf9JQlVaZ4I@X#?MrICDKJm!u?q`&PnF@+&*9jVKQwP2xee-7JfR5g=^i5ry zHh7+J20eWCnqeC(nEud2_$EZ0n`lou?&ACvK=Tm);z~)STX@)KW zh3iZK`Aq0_JPQ3o#0T6=;#WRRhHZs@@pP9h z*w~kd8}-$W9#8^?ou_&GgQ{~47@{g0PuRSwx7cp4e<%6!n13xul$f%dBYvq{+s&G| zaTfTYCc_(>ffh>JRfCrq`KlagnAphFM21rEu3pu0hOo!L&P_d~ME`*!_&X)-ABe!e zg{!0Ns!YX0{1+KxB2kvaVu)JOjpgc1Kt3Iy6pV_hcu`hoy;0L=`o;%Xn{ z9F{ZnETZ}Lj(mS;q%|QF8<7q%^rGc{I-oafO%WUMpq7)2Ehq>j$!rNwe8m-M}_3SH7sBJEz-8`83 z#m!`s(Dj=qBkMl%%E3f0$QNm9$9)**>|nlqL^jid#n&vjK#t@B)18`E3k0akwRz-N znTI124cHOx-{Cx_1BLv=$az@q3L%h1EA2EZ?60ES+1utmMmS@npgj-Hgo6`iyop6^7ZF6?jIFSwG>^X|Oj4_BfhIzi%%&qAGswu#(=wM``Ig!&0n>of2c+Cht8A4#NU0Us`=y<=G1oCeK2-I&e4Yr&bKVg-(pfGQzxOj>Lx6 z=8NEay|)SP4cW4NQooX;Ch}rszjfJRn}I=~S5)R~e8D~RN{O^3L{Z7X(be+0?_C^D zOB5FqQYt!~S;aCjZRWVtERQ#s+z>`s=3o==yUkrh>-5|osBuo+pTDHC~7$h1LDuV-3a*3sMi3>`rhMhCLh+9OH~-!4PU%dv|+jgnwWq32jl`FuPX2I^!#v^@V_ zY>=7!PPby@H6p5ky(D2pYK6+%suXeua`|3c; zscJj0k65gQ=#^$+4>L(Fg#>?AtA>w{DHD(SpM5#)PB@nGBHeJ&-enR8;riIbW8?*ZXjY?29+O#&N}sfR7~i6>=Sm#4$3%$w)Gyy z3Y}L40ugx@d)e&!^j-9?C?=ZP>H+MFlHOsNMBpS`h_hNQBZetM3_IxMdeuv%1c;1qwT_L@+Qv zI1yw}vIn?Qd7rLhZ%#|#fN^Pq#TVdRJ>j31CX`mVBr~~|#r_AlP$?~*y`tI28=t23 z-i^7(sx+zGb|`zU!K3oo+b}7*K_`Hk-l&zR<6$9B+f~nVQ{-HTM_SoKx4I#$b+PGU z)vc51_qRC?lSI=?%hwq9QX($n!p=Acau6Rw1-%y z+Y%sm$(v+OU?~eW^hW8ZOFqJmXxc@Vo=uW^#lQ$DD=wcKc9NOpLv<%|S9dg?)m2dr zxqmywK`jQ^f4+s1_&$=SE%-_5u^sP#GQ*xDMaT|lZ%OK#Eys20{ruqDoIN1k`I+07 zf;TFL>yu(-?wHl^)3x00Dm(Q`&mskyU*`7%BFk*?@Us3Sdgmp?^}wZl34LNn+~Qrw z4-1ALR_f*I|0KO*T07(pq@6LZNa0p68zGF3%QD6r9=@piY@{LcH36to3gy#u{RG67xBDUl^>^PDx4m(-34 ziZF66epVaHwm^GJj+@Jd(j=bLn2O*{hR?$IB@h`h*7eaN7kE&1faMA*v*JEzsJV_R9Mt&O}&P3ll^8U=*L4!phIh`E#2%!LZCyV z4V;dEol|o2_o{$JUaU%pb{@t=_z~wb!u-hdx0Mt~3~Uj2u7&_~s3W;DMFZ}0jROdG zBo8Vp&=_zdT3~#Ses{8*KCy`6y8#W4mSU^H-atDUpUJnjqa}y?xxtP;-u+47$J5AC zVxdE>R#UrLi~%S9^;+u_AkU5@I@jU0b`o-FMj0?}(pv_Ip_3birg+&Nuea<7l=$Hx zk>PZXj!2;glKe@}9-DIWWHIyw71$qCg#M@`PxjWM4A+%XKV}#s+gFuJf5IqrRKZ~jgw30zL#XL}h!@>Tglq71=6@@7J zzhpT7zWM)F4mpQ1HRX@vzPQ*VZnj4$v(LO9=)VyBFu)IxzCUEbyYLo9^B{wC)f{l5 z!5d$QD&P)Crm;xv;t5zf*qFRAPJ&>?!+PDUQ+n4qrEUhv*O&z8FT28G_$FJ>MRl^SluBcTHGzZ!~H8iU}Ap;z$<@>2{=yh1^bo z&1@Jrf7uV$5rQPp@dRAn(PANVC{sNcx%{M-b+ZYGVmCQFI|LfugtYJF{xRv;lQU!x zlyWiSL1t%ox;Lh$Z*ncTFt1z@yoL#*NS4yh`fP1Liq+jE&+H&DdfSUVl|Q{RX@*G)Rwnw*B-wS#4a_3w)IZu%J*E#TqkuPB((etMA zbk`rfd)7Q1@)4boc(p77ch+l;o9_362bbDZ0;bQYX-I5ne2f?D!YQrjBe^b0qnpBa zCly%*gE`sxIB;1HWXQDiEEq_(R%l!mVi!~z->W6DoRb&&e2SRcOjyCNxKF(sx>nzk zPYw3w^ycWT>cT)5s8<)!(<#ID_usvFTzQXtl~h+Nunlt3 zk=Gg2OA|ztG!VS#f&qUkGW{+|$0N%YOIkZF>NOzs;Gh5kUv6&%D3$H$*L{(Sg}lm# z(n*C1omnE#VO5bQDPzm&bECK3w^1HgZ#eO$1AbdAQ*6eqxn z>e8L78qP;nXHr?qgFGPC&x0R{nsYFPk^iNaDjLWEthb0S5rtg=;TM1slflws8?k0+hwWuK3 z9?|;4Xj4_1ot=kU9yOQ2utbHx>B{nmCA#G>62HDi{j47sER9&MHJc7dG`|x7V(Z~j zdg{ATqsAM@G zM;BSgMO`*7TFvF@JqjJ=kIV~}JvmY=KaxMORtp&BZ0Oow z;X{FvO~>>=ZeLWsp47hj7G2fwp-ExkOPL?c_?8_o*7nx5kg1)Y;P`htYoq;gQaeA4 z*!%nu?0^Ym(#~89loq5gQ2I4ZP`o*Qk`zD0QH0$-P)%t}V2ZgE0Z_BAkAf

cG3dMO3>D3d(fmH-W|ZD_)$iDQPJ zB^Go|y~9&*^Mv71DLa4MKiwb?_+-iy3pr~$$SIM=ldS(CzWkpUC%=p2_O~pK#)VLu zf=)a_@6T$PyH|Ihc=4nE4IlQetm?m(xCp)0Bw_kp_o*rw>Hk0W{HtcuzcX$B^~rw= kS$_@tPx&0N`n7NypiDIEm+*v`G5~*Rs_CkhDO-j9ALOBHg#Z8m diff --git a/app/img/icons/IconsetW_1x.png b/app/img/icons/IconsetW_1x.png index f1fa31825b4032bb54113ad0057b5bd5dca45484..92d5ec04e87ddf9ab44ac10d7adf53699ed8d86a 100644 GIT binary patch delta 12355 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 WPV|=IeEF{cKv_XuzEajAs8QEk*xl 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 SJpU(;pd_azTO$1~=>G$1trsT% diff --git a/app/js/controllers.js b/app/js/controllers.js index 47ab1d5e..7420b0c7 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1765,6 +1765,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) .controller('VideoModalController', function ($scope, $rootScope, $modalInstance, PeersSelectService, AppMessagesManager, AppVideoManager, AppPeersManager, ErrorService) { + $scope.video = AppVideoManager.wrapForFull($scope.videoID); $scope.progress = {enabled: false}; @@ -1799,6 +1800,38 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); }) + .controller('DocumentModalController', function ($scope, $rootScope, $modalInstance, PeersSelectService, AppMessagesManager, AppDocsManager, AppPeersManager, ErrorService) { + + $scope.document = AppDocsManager.wrapForHistory($scope.docID); + + $scope.forward = function () { + var messageID = $scope.messageID; + PeersSelectService.selectPeer({confirm_type: 'FORWARD_PEER'}).then(function (peerString) { + var peerID = AppPeersManager.getPeerID(peerString); + AppMessagesManager.forwardMessages(peerID, [messageID]).then(function () { + $rootScope.$broadcast('history_focus', {peerString: peerString}); + }); + }); + }; + + $scope['delete'] = function () { + var messageID = $scope.messageID; + ErrorService.confirm({type: 'MESSAGE_DELETE'}).then(function () { + AppMessagesManager.deleteMessages([messageID]); + }); + }; + + $scope.download = function () { + AppDocsManager.saveDocFile($scope.docID); + }; + + $scope.$on('history_delete', function (e, historyUpdate) { + if (historyUpdate.msgs[$scope.messageID]) { + $modalInstance.dismiss(); + } + }); + }) + .controller('UserModalController', function ($scope, $location, $rootScope, $modal, AppUsersManager, MtpApiManager, NotificationsManager, AppPhotosManager, AppMessagesManager, AppPeersManager, PeersSelectService, ErrorService) { var peerString = AppUsersManager.getUserString($scope.userID); diff --git a/app/js/directives.js b/app/js/directives.js index 6ded1e2f..09e9235c 100644 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -182,9 +182,25 @@ angular.module('myApp.directives', ['myApp.filters']) templateUrl: templateUrl('message_attach_video') }; }) - .directive('myMessageDocument', function() { + .directive('myMessageDocument', function(AppDocsManager) { return { - templateUrl: templateUrl('message_attach_document') + scope: { + 'document': '=myMessageDocument', + 'messageId': '=messageId' + }, + templateUrl: templateUrl('message_attach_document'), + link: function ($scope, element, attrs) { + AppDocsManager.updateDocDownloaded($scope.document.id); + $scope.docSave = function () { + AppDocsManager.saveDocFile($scope.document.id); + }; + $scope.docOpen = function () { + if (!$scope.document.withPreview) { + return $scope.download(); + } + AppDocsManager.openDoc($scope.document.id, $scope.messageId); + }; + } }; }) .directive('myMessageAudio', function() { @@ -1395,7 +1411,7 @@ angular.module('myApp.directives', ['myApp.filters']) }) - .directive('myLoadGif', function($rootScope, MtpApiFileManager) { + .directive('myLoadGif', function($rootScope, MtpApiFileManager, AppDocsManager) { return { link: link, @@ -1417,11 +1433,9 @@ angular.module('myApp.directives', ['myApp.filters']) $scope.isActive = false; $scope.document.url = MtpApiFileManager.getCachedFile(inputFileLocation); - /*return $scope.document.progress = {enabled: true, percent: 30, total: $scope.document.size};*/ - $scope.toggle = function (e) { if (checkClick(e, true)) { - $rootScope.downloadDoc($scope.document.id); + AppDocsManager.saveDocFile($scope.document.id); return false; } @@ -1464,6 +1478,102 @@ angular.module('myApp.directives', ['myApp.filters']) } }) + .directive('myLoadDocument', function($rootScope, MtpApiFileManager, AppDocsManager) { + + return { + link: link, + templateUrl: templateUrl('full_document'), + scope: { + document: '=myLoadDocument' + } + }; + + function updateModalWidth(element, width) { + while (element && !$(element).hasClass('modal-dialog')) { + element = element.parentNode; + } + if (element) { + $(element).width(width + (Config.Mobile ? 0 : 36)); + } + } + + function link ($scope, element, attrs) { + var loaderWrap = $('.document_fullsize_with_progress_wrap', element); + var fullSizeWrap = $('.document_fullsize_wrap', element); + var fullSizeImage = $('.document_fullsize_img', element); + + var fullWidth = $(window).width() - (Config.Mobile ? 20 : 36); + var fullHeight = $(window).height() - 150; + + $scope.imageWidth = fullWidth; + $scope.imageHeight = fullHeight; + + var thumbPhotoSize = $scope.document.thumb; + + if (thumbPhotoSize && thumbPhotoSize._ != 'photoSizeEmpty') { + var wh = calcImageInBox(thumbPhotoSize.width, thumbPhotoSize.height, fullWidth, fullHeight); + $scope.imageWidth = wh.w; + $scope.imageHeight = wh.h; + + $scope.thumbSrc = MtpApiFileManager.getCachedFile(thumbPhotoSize.location); + } + + $scope.frameWidth = Math.max($scope.imageWidth, Math.min(600, fullWidth)) + $scope.frameHeight = $scope.imageHeight; + + onContentLoaded(function () { + $scope.$emit('ui_height'); + }); + + updateModalWidth(element[0], $scope.frameWidth); + + var checkSizesInt; + var realImageWidth, realImageHeight; + AppDocsManager.downloadDoc($scope.document.id).then(function (url) { + var image = new Image(); + var checkSizes = function (e) { + if (!image.height || !image.width) { + return; + } + realImageWidth = image.width; + realImageHeight = image.height; + clearInterval(checkSizesInt); + + var defaultWh = calcImageInBox(image.width, image.height, fullWidth, fullHeight, true); + var zoomedWh = {w: realImageWidth, h: realImageHeight}; + if (defaultWh.w >= zoomedWh.w && defaultWh.h >= zoomedWh.h) { + zoomedWh.w *= 4; + zoomedWh.h *= 4; + } + + var zoomed = true; + $scope.toggleZoom = function () { + zoomed = !zoomed; + var imageWidth = (zoomed ? zoomedWh : defaultWh).w; + var imageHeight = (zoomed ? zoomedWh : defaultWh).h; + fullSizeImage.css({ + width: imageWidth, + height: imageHeight, + marginTop: $scope.frameHeight > imageHeight ? Math.floor(($scope.frameHeight - imageHeight) / 2) : 0 + }); + fullSizeWrap.toggleClass('document_fullsize_zoomed', zoomed); + }; + + $scope.toggleZoom(false); + + fullSizeImage.attr('src', url); + loaderWrap.hide(); + fullSizeWrap.css({width: $scope.frameWidth, height: $scope.frameHeight}).show(); + + }; + checkSizesInt = setInterval(checkSizes, 20); + image.onload = checkSizes; + image.src = url; + setZeroTimeout(checkSizes); + }); + } + }) + .directive('myMapPoint', function(ExternalResourcesManager) { return { @@ -1730,8 +1840,8 @@ angular.module('myApp.directives', ['myApp.filters']) var updateMargin = function () { var height = element[0].offsetHeight, fullHeight = height - (height && usePadding ? 2 * prevMargin : 0), - contHeight = $($window).height(), ratio = attrs.myVerticalPosition && parseFloat(attrs.myVerticalPosition) || 0.5, + contHeight = attrs.contHeight ? $scope.$eval(attrs.contHeight) : $($window).height(), margin = fullHeight < contHeight ? parseInt((contHeight - fullHeight) * ratio) : '', styles = usePadding ? {paddingTop: margin, paddingBottom: margin} @@ -1747,9 +1857,10 @@ angular.module('myApp.directives', ['myApp.filters']) prevMargin = margin; }; + $($window).on('resize', updateMargin); + onContentLoaded(updateMargin); - $($window).on('resize', updateMargin); $scope.$on('ui_height', function () { onContentLoaded(updateMargin); diff --git a/app/js/i18n.js b/app/js/i18n.js index 4e02f554..197fc73a 100644 --- a/app/js/i18n.js +++ b/app/js/i18n.js @@ -21,16 +21,6 @@ angular.module('myApp.i18n', ['izhukov.utils']) }); } - function encodeEntities(value) { - return value. - replace(/&/g, '&'). - replace(/([^\#-~| |!\n\*])/g, function (value) { // non-alphanumeric - return '&#' + value.charCodeAt(0) + ';'; - }). - replace(//g, '>'); - } - function parseMarkdownString(msgstr, msgid) { msgstr = msgstr.replace(/\*\*(.+?)\*\*/g, "$1") .replace(/\n/g, "
"); diff --git a/app/js/lib/mtproto_wrapper.js b/app/js/lib/mtproto_wrapper.js index bf6ca356..951e8185 100644 --- a/app/js/lib/mtproto_wrapper.js +++ b/app/js/lib/mtproto_wrapper.js @@ -383,6 +383,13 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) }); } + function getDownloadedFile(location, size) { + var fileStorage = getFileStorage(), + fileName = getFileName(location); + + return fileStorage.getFile(fileName, size); + } + function downloadFile (dcID, location, size, options) { if (!FileManager.isAvailable()) { return $q.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'}); @@ -598,6 +605,7 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) return { getCachedFile: getCachedFile, + getDownloadedFile: getDownloadedFile, downloadFile: downloadFile, downloadSmallFile: downloadSmallFile, saveSmallFile: saveSmallFile, diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index 5e7c81a9..61e17733 100644 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -33,7 +33,7 @@ angular.module('izhukov.utils', []) }) -.service('FileManager', function ($window, $q) { +.service('FileManager', function ($window, $q, $timeout) { $window.URL = $window.URL || $window.webkitURL; $window.BlobBuilder = $window.BlobBuilder || $window.WebKitBlobBuilder || $window.MozBlobBuilder; @@ -610,6 +610,186 @@ angular.module('izhukov.utils', []) }; }) +.service('SearchIndexManager', function () { + var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, + trimRe = /^\s+|\s$/g, + accentsReplace = { + a: /[åáâäà]/g, + e: /[éêëè]/g, + i: /[íîïì]/g, + o: /[óôöò]/g, + u: /[úûüù]/g, + c: /ç/g, + ss: /ß/g + } + + return { + createIndex: createIndex, + indexObject: indexObject, + cleanSearchText: cleanSearchText, + search: search + }; + + function createIndex () { + return { + shortIndexes: {}, + fullTexts: {} + } + } + + function cleanSearchText (text) { + text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); + + for (var key in accentsReplace) { + if (accentsReplace.hasOwnProperty(key)) { + text = text.replace(accentsReplace[key], key); + } + } + + return text; + } + + function indexObject (id, searchText, searchIndex) { + if (searchIndex.fullTexts[id] !== undefined) { + return false; + } + + searchText = cleanSearchText(searchText); + + if (!searchText.length) { + return false; + } + + var shortIndexes = searchIndex.shortIndexes; + + searchIndex.fullTexts[id] = searchText; + + angular.forEach(searchText.split(' '), function(searchWord) { + var len = Math.min(searchWord.length, 3), + wordPart, i; + for (i = 1; i <= len; i++) { + wordPart = searchWord.substr(0, i); + if (shortIndexes[wordPart] === undefined) { + shortIndexes[wordPart] = [id]; + } else { + shortIndexes[wordPart].push(id); + } + } + }); + } + + function search (query, searchIndex) { + var shortIndexes = searchIndex.shortIndexes, + fullTexts = searchIndex.fullTexts; + + query = cleanSearchText(query); + + var queryWords = query.split(' '), + foundObjs = false, + newFoundObjs, i, j, searchText, found; + + for (i = 0; i < queryWords.length; i++) { + newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; + if (!newFoundObjs) { + foundObjs = []; + break; + } + if (foundObjs === false || foundObjs.length > newFoundObjs.length) { + foundObjs = newFoundObjs; + } + } + + newFoundObjs = {}; + + for (j = 0; j < foundObjs.length; j++) { + found = true; + searchText = fullTexts[foundObjs[j]]; + for (i = 0; i < queryWords.length; i++) { + if (searchText.indexOf(queryWords[i]) == -1) { + found = false; + break; + } + } + if (found) { + newFoundObjs[foundObjs[j]] = true; + } + } + + return newFoundObjs; + } +}) + +.service('ExternalResourcesManager', function ($q, $http) { + var urlPromises = {}; + + function downloadImage (url) { + if (urlPromises[url] !== undefined) { + return urlPromises[url]; + } + + return urlPromises[url] = $http.get(url, {responseType: 'blob', transformRequest: null}) + .then(function (response) { + window.URL = window.URL || window.webkitURL; + return window.URL.createObjectURL(response.data); + }); + } + + return { + downloadImage: downloadImage + } +}) + +.service('IdleManager', function ($rootScope, $window, $timeout) { + + $rootScope.idle = {isIDLE: false}; + + var toPromise, started = false; + + return { + start: start + }; + + function start () { + if (!started) { + started = true; + $($window).on('blur focus keydown mousedown touchstart', onEvent); + + setTimeout(function () { + onEvent({type: 'blur'}); + }, 0); + } + } + + function onEvent (e) { + // console.log('event', e.type); + if (e.type == 'mousemove') { + $($window).off('mousemove', onEvent); + } + var isIDLE = e.type == 'blur' || e.type == 'timeout' ? true : false; + + $timeout.cancel(toPromise); + if (!isIDLE) { + // console.log('update timeout'); + toPromise = $timeout(function () { + onEvent({type: 'timeout'}); + }, 30000); + } + + if ($rootScope.idle.isIDLE == isIDLE) { + return; + } + + // console.log('IDLE changed', isIDLE); + $rootScope.$apply(function () { + $rootScope.idle.isIDLE = isIDLE; + }); + + if (isIDLE && e.type == 'timeout') { + $($window).on('mousemove', onEvent); + } + } +}) + .service('AppRuntimeManager', function ($window) { return { diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index 46cf9624..a86851bc 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -114,3 +114,35 @@ function templateUrl (tplName) { return 'partials/' + (Config.Mobile ? 'mobile' : 'desktop') + '/' + tplName + '.html'; } +function encodeEntities(value) { + return value. + replace(/&/g, '&'). + replace(/([^\#-~| |!])/g, function (value) { // non-alphanumeric + return '&#' + value.charCodeAt(0) + ';'; + }). + replace(//g, '>'); +} + +function calcImageInBox(imageW, imageH, boxW, boxH, noZooom) { + var boxedImageW = boxW; + var boxedImageH = boxH; + + if ((imageW / imageH) > (boxW / boxH)) { + boxedImageH = parseInt(imageH * boxW / imageW); + } + else { + boxedImageW = parseInt(imageW * boxH / imageH); + if (boxedImageW > boxW) { + boxedImageH = parseInt(boxedImageH * boxW / boxedImageW); + boxedImageW = boxW; + } + } + + if (noZooom && boxedImageW >= imageW && boxedImageH >= imageH) { + boxedImageW = imageW; + boxedImageH = imageH; + } + + return {w: boxedImageW, h: boxedImageH}; +} diff --git a/app/js/locales/en-us.json b/app/js/locales/en-us.json index 64c0ca8d..b8dbef04 100644 --- a/app/js/locales/en-us.json +++ b/app/js/locales/en-us.json @@ -325,6 +325,7 @@ "message_attach_document_open": "Open", "message_attach_document_download": "Download", + "message_attach_document_save": "Save File", "message_attach_video_video": "Video", "message_attach_video_download": "Download", diff --git a/app/js/services.js b/app/js/services.js index 8a6b6602..fc3de5fd 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -9,7 +9,7 @@ /* Services */ -angular.module('myApp.services', ['myApp.i18n']) +angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) .service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, MtpApiFileManager, MtpApiManager, RichTextProcessor, SearchIndexManager, ErrorService, Storage, _) { var users = {}, @@ -606,115 +606,6 @@ angular.module('myApp.services', ['myApp.i18n']) } }) -.service('SearchIndexManager', function () { - var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, - trimRe = /^\s+|\s$/g, - accentsReplace = { - a: /[åáâäà]/g, - e: /[éêëè]/g, - i: /[íîïì]/g, - o: /[óôöò]/g, - u: /[úûüù]/g, - c: /ç/g, - ss: /ß/g - } - - return { - createIndex: createIndex, - indexObject: indexObject, - cleanSearchText: cleanSearchText, - search: search - }; - - function createIndex () { - return { - shortIndexes: {}, - fullTexts: {} - } - } - - function cleanSearchText (text) { - text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); - - for (var key in accentsReplace) { - if (accentsReplace.hasOwnProperty(key)) { - text = text.replace(accentsReplace[key], key); - } - } - - return text; - } - - function indexObject (id, searchText, searchIndex) { - if (searchIndex.fullTexts[id] !== undefined) { - return false; - } - - searchText = cleanSearchText(searchText); - - if (!searchText.length) { - return false; - } - - var shortIndexes = searchIndex.shortIndexes; - - searchIndex.fullTexts[id] = searchText; - - angular.forEach(searchText.split(' '), function(searchWord) { - var len = Math.min(searchWord.length, 3), - wordPart, i; - for (i = 1; i <= len; i++) { - wordPart = searchWord.substr(0, i); - if (shortIndexes[wordPart] === undefined) { - shortIndexes[wordPart] = [id]; - } else { - shortIndexes[wordPart].push(id); - } - } - }); - } - - function search (query, searchIndex) { - var shortIndexes = searchIndex.shortIndexes, - fullTexts = searchIndex.fullTexts; - - query = cleanSearchText(query); - - var queryWords = query.split(' '), - foundObjs = false, - newFoundObjs, i, j, searchText, found; - - for (i = 0; i < queryWords.length; i++) { - newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; - if (!newFoundObjs) { - foundObjs = []; - break; - } - if (foundObjs === false || foundObjs.length > newFoundObjs.length) { - foundObjs = newFoundObjs; - } - } - - newFoundObjs = {}; - - for (j = 0; j < foundObjs.length; j++) { - found = true; - searchText = fullTexts[foundObjs[j]]; - for (i = 0; i < queryWords.length; i++) { - if (searchText.indexOf(queryWords[i]) == -1) { - found = false; - break; - } - } - if (found) { - newFoundObjs[foundObjs[j]] = true; - } - } - - return newFoundObjs; - } -}) - .service('AppMessagesManager', function ($q, $rootScope, $location, $filter, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, SearchIndexManager, PeersSelectService,Storage, _) { var messagesStorage = {}; @@ -2389,21 +2280,9 @@ angular.module('myApp.services', ['myApp.i18n']) full.height = fullHeight; if (fullPhotoSize && fullPhotoSize._ != 'photoSizeEmpty') { - if ((fullPhotoSize.w / fullPhotoSize.h) > (fullWidth / fullHeight)) { - full.height = parseInt(fullPhotoSize.h * fullWidth / fullPhotoSize.w); - } - else { - full.width = parseInt(fullPhotoSize.w * fullHeight / fullPhotoSize.h); - if (full.width > fullWidth) { - full.height = parseInt(full.height * fullWidth / full.width); - full.width = fullWidth; - } - } - - if (!Config.Mobile && full.width >= fullPhotoSize.w && full.height >= fullPhotoSize.h) { - full.width = fullPhotoSize.w; - full.height = fullPhotoSize.h; - } + var wh = calcImageInBox(fullPhotoSize.w, fullPhotoSize.h, fullWidth, fullHeight, Config.Mobile); + full.width = wh.w; + full.height = wh.h; full.modalWidth = Math.max(full.width, Math.min(400, fullWidth)); @@ -2464,7 +2343,7 @@ angular.module('myApp.services', ['myApp.i18n']) mime: mimeType, toFileEntry: writableFileEntry }).then(function (url) { - console.log('file save done'); + // console.log('file save done'); }, function (e) { console.log('photo download failed', e); }); @@ -2563,16 +2442,10 @@ angular.module('myApp.services', ['myApp.i18n']) if (!video.w || !video.h) { full.height = full.width = Math.min(fullWidth, fullHeight); - } - else if (video.w > video.h) { - full.height = parseInt(video.h * fullWidth / video.w); - } - else { - full.width = parseInt(video.w * fullHeight / video.h); - if (full.width > fullWidth) { - full.height = parseInt(full.height * fullWidth / full.width); - full.width = fullWidth; - } + } else { + var wh = calcImageInBox(video.w, video.h, fullWidth, fullHeight); + full.width = wh.w; + full.height = wh.h; } video.full = full; @@ -2669,7 +2542,7 @@ angular.module('myApp.services', ['myApp.i18n']) } }) -.service('AppDocsManager', function ($rootScope, $modal, $window, $timeout, MtpApiFileManager, FileManager) { +.service('AppDocsManager', function ($rootScope, $modal, $window, $timeout, $q, MtpApiFileManager, FileManager) { var docs = {}, docsForHistory = {}, windowW = $(window).width(), @@ -2737,7 +2610,7 @@ angular.module('myApp.services', ['myApp.i18n']) return docsForHistory[docID] = doc; } - function downloadDoc (docID, action) { + function updateDocDownloaded (docID) { var doc = docs[docID], historyDoc = docsForHistory[docID] || doc || {}, inputFileLocation = { @@ -2746,68 +2619,90 @@ angular.module('myApp.services', ['myApp.i18n']) access_hash: doc.access_hash }; - function updateDownloadProgress (progress) { + if (historyDoc.downloaded === undefined) { + MtpApiFileManager.getDownloadedFile(inputFileLocation, doc.size).then(function () { + historyDoc.downloaded = true; + }, function () { + historyDoc.downloaded = false; + }); + } + } + + function downloadDoc (docID, toFileEntry) { + var doc = docs[docID], + historyDoc = docsForHistory[docID] || doc || {}, + inputFileLocation = { + _: 'inputDocumentFileLocation', + id: docID, + access_hash: doc.access_hash + }; + + historyDoc.progress = {enabled: true, percent: 1, total: doc.size}; + + var downloadPromise = MtpApiFileManager.downloadFile(doc.dc_id, inputFileLocation, doc.size, { + mime: doc.mime_type, + toFileEntry: toFileEntry + }); + + downloadPromise.then(function (url) { + delete historyDoc.progress; + historyDoc.url = url; + historyDoc.downloaded = true; + console.log('file save done'); + }, function (e) { + console.log('document download failed', e); + historyDoc.progress.enabled = false; + }, function (progress) { console.log('dl progress', progress); historyDoc.progress.done = progress.done; historyDoc.progress.percent = Math.max(1, Math.floor(100 * progress.done / progress.total)); $rootScope.$broadcast('history_update'); - } + }); + + historyDoc.progress.cancel = downloadPromise.cancel; + + return downloadPromise; + } + + function openDoc (docID, messageID) { + var scope = $rootScope.$new(true); + scope.docID = docID; + scope.messageID = messageID; + + var modalInstance = $modal.open({ + templateUrl: templateUrl('document_modal'), + controller: 'DocumentModalController', + scope: scope, + windowClass: 'document_modal_window' + }); + } + + function saveDocFile (docID) { + var doc = docs[docID], + historyDoc = docsForHistory[docID] || doc || {}; var ext = (doc.file_name.split('.', 2) || [])[1] || ''; FileManager.chooseSave(doc.file_name, ext, doc.mime_type).then(function (writableFileEntry) { if (!writableFileEntry) { return; } - - historyDoc.progress = {enabled: true, percent: 1, total: doc.size}; - - var downloadPromise = MtpApiFileManager.downloadFile(doc.dc_id, inputFileLocation, doc.size, { - mime: doc.mime_type, - toFileEntry: writableFileEntry - }); - - downloadPromise.then(function (url) { - delete historyDoc.progress; + downloadDoc(docID, writableFileEntry).then(function () { console.log('file save done'); - }, function (e) { - console.log('document download failed', e); - historyDoc.progress.enabled = false; - }, updateDownloadProgress); - - historyDoc.progress.cancel = downloadPromise.cancel; + }); }, function () { - historyDoc.progress = {enabled: true, percent: 1, total: doc.size}; - - var downloadPromise = MtpApiFileManager.downloadFile(doc.dc_id, inputFileLocation, doc.size, {mime: doc.mime_type}); - - downloadPromise.then(function (url) { - delete historyDoc.progress; - - historyDoc.url = url; - - switch (action) { - case 1: - window.open(url, '_blank'); - break; - - default: - FileManager.download(url, doc.mime_type, doc.file_name); - } - }, function (e) { - console.log('document download failed', e); - historyDoc.progress.enabled = false; - }, updateDownloadProgress); - - historyDoc.progress.cancel = downloadPromise.cancel; + downloadDoc(docID).then(function (url) { + FileManager.download(url, doc.mime_type, doc.file_name); + }); }); } - $rootScope.downloadDoc = downloadDoc; - return { saveDoc: saveDoc, wrapForHistory: wrapForHistory, - downloadDoc: downloadDoc + updateDocDownloaded: updateDocDownloaded, + downloadDoc: downloadDoc, + openDoc: openDoc, + saveDocFile: saveDocFile } }) @@ -2877,27 +2772,6 @@ angular.module('myApp.services', ['myApp.i18n']) } }) -.service('ExternalResourcesManager', function ($q, $http) { - var urlPromises = {}; - - function downloadImage (url) { - if (urlPromises[url] !== undefined) { - return urlPromises[url]; - } - - return urlPromises[url] = $http.get(url, {responseType: 'blob', transformRequest: null}) - .then(function (response) { - window.URL = window.URL || window.webkitURL; - return window.URL.createObjectURL(response.data); - }); - } - - return { - downloadImage: downloadImage - } -}) - - .service('ApiUpdatesManager', function ($rootScope, MtpNetworkerFactory, AppUsersManager, AppChatsManager, AppPeersManager, MtpApiManager) { var isSynchronizing = true, @@ -3193,16 +3067,6 @@ angular.module('myApp.services', ['myApp.i18n']) wrapPlainText: wrapPlainText }; - function encodeEntities(value) { - return value. - replace(/&/g, '&'). - replace(/([^\#-~| |!])/g, function (value) { // non-alphanumeric - return '&#' + value.charCodeAt(0) + ';'; - }). - replace(//g, '>'); - } - function getEmojiSpritesheetCoords(emojiCode) { var i, row, column, totalColumns; for (var cat = 0; cat < Config.EmojiCategories.length; cat++) { @@ -3377,58 +3241,6 @@ angular.module('myApp.services', ['myApp.i18n']) }) - -.service('IdleManager', function ($rootScope, $window, $timeout) { - - $rootScope.idle = {isIDLE: false}; - - var toPromise, started = false; - - return { - start: start - }; - - function start () { - if (!started) { - started = true; - $($window).on('blur focus keydown mousedown touchstart', onEvent); - - setTimeout(function () { - onEvent({type: 'blur'}); - }, 0); - } - } - - function onEvent (e) { - // console.log('event', e.type); - if (e.type == 'mousemove') { - $($window).off('mousemove', onEvent); - } - var isIDLE = e.type == 'blur' || e.type == 'timeout' ? true : false; - - $timeout.cancel(toPromise); - if (!isIDLE) { - // console.log('update timeout'); - toPromise = $timeout(function () { - onEvent({type: 'timeout'}); - }, 30000); - } - - if ($rootScope.idle.isIDLE == isIDLE) { - return; - } - - // console.log('IDLE changed', isIDLE); - $rootScope.$apply(function () { - $rootScope.idle.isIDLE = isIDLE; - }); - - if (isIDLE && e.type == 'timeout') { - $($window).on('mousemove', onEvent); - } - } -}) - .service('StatusManager', function ($timeout, $rootScope, MtpApiManager, IdleManager) { var toPromise, lastOnlineUpdated = 0, started = false; diff --git a/app/partials/desktop/document_modal.html b/app/partials/desktop/document_modal.html new file mode 100644 index 00000000..0a0e494f --- /dev/null +++ b/app/partials/desktop/document_modal.html @@ -0,0 +1,21 @@ +

+ + + +
diff --git a/app/partials/desktop/full_document.html b/app/partials/desktop/full_document.html new file mode 100644 index 00000000..765e69ce --- /dev/null +++ b/app/partials/desktop/full_document.html @@ -0,0 +1,21 @@ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
\ No newline at end of file diff --git a/app/partials/desktop/message.html b/app/partials/desktop/message.html index 059e09ad..c854165c 100644 --- a/app/partials/desktop/message.html +++ b/app/partials/desktop/message.html @@ -52,7 +52,7 @@
-
+
diff --git a/app/partials/desktop/message_attach_document.html b/app/partials/desktop/message_attach_document.html index 888626ca..bf539c6a 100644 --- a/app/partials/desktop/message_attach_document.html +++ b/app/partials/desktop/message_attach_document.html @@ -1,39 +1,42 @@ -
+
-
+
-
+
-
+
- - -
+ + + + +
- - - + + +
-
- - +
+ + +
-
- +
+
-
+
diff --git a/app/partials/desktop/photo_modal.html b/app/partials/desktop/photo_modal.html index 13ce2fd0..d51a35f3 100644 --- a/app/partials/desktop/photo_modal.html +++ b/app/partials/desktop/photo_modal.html @@ -12,7 +12,7 @@

- , + ,

diff --git a/app/partials/desktop/video_modal.html b/app/partials/desktop/video_modal.html index 62b11703..01e75d60 100644 --- a/app/partials/desktop/video_modal.html +++ b/app/partials/desktop/video_modal.html @@ -12,7 +12,7 @@

- , + ,