PK [&4zzcontent/browser/contents.rdfUT 0žCCUx PK [&4b#content/browser-region/contents.rdfUT 1žCCUx PK [&4$ OOcontent/browser/about.pngUT 0žCCUxPNG  IHDR,ubKGD pHYs  tIME&g>5 IDATx{t՝.]n=%c!Y2$8`HH30wMfƐgN srי{Zsb20ܙʁuqrlL %ے!j޻jWu,,{VWwWWWW}~6000020000e```!,CX a20000e````!,mA=(~q[(p` _zj@&=@{Gzzzf68i ۇ!j-;ӃW5ksI aCؿoyؿoqBB[4DD  }L3֬Y^׮_o!,}Ggqxp3Q Xܢ jDԿ.KR830xphֹ'~Jp, ܢe.)"TDj;W"#%aqs9@~5U 7~7|Fb" a:[Q#{>Gn[m BXB}%A`ՍJ\*0IX,ghqo͗kl'*nY뀸. [ +Aj:qz^[DZh]Mxid`|*27V#1Ƙ$-&Yx w;hY\H@l|", C>Dt9к q݄J|ƵG:ǎabr^Ru#㒸X y1ex)-Iow~ь*28mۢ/q@AS.ed:NTMXh_)FJ/8eZމԑbz[x FGޔ1 R ߫޷Ō(28S0zh<Ц&P bYQVcS3/ /  :HsF!1Hk\{&W\B;ǎQBq@ ^|j (W2ep&aϞH*U%oI@/\ܽL@ż MDq1L0Qϡʊv!}*Ç+p$Q%i09=ݸ-&e&ȣ!XͰ2Ke b¥B،5kBssFF:B\D&X5dWCeq^~|",p?B1UҪT@$}ǐ".V-h~P[!` A ` v_Z`ĶۢfN"mnECpƿ@!_0'!,9#+BLv&+\qle>(E@-447cIN|DEP I> jTH3*냐@y؄ΎNVtmb + i2;RVNc#Tummó,xT,\Jh"APLT9)]a<" Nj(s8ωZDx{B㒜"IO&-I9HrS@s}n6'!,.dM.8-uQEV)$)G]>+  ( cU3ԫ& uO(0z!P 3H J! #h "96}x~t,0'!,$Fw, N - -rV%JQ!~b-.S>!` sǝ?K(%eT$#;(_蓏+$!dhU$)< )A@(,çQP#i4A29b(Hߜg(L=[)ӺnS3t0.ǁgEꪢ턂Sr)IKC42…#lP}<> FcԶ)@=H;DDY&B q+E >QDqviZxP Ϣ§fHہ } 992б&Ln&+V.e{R  Jia8-/КNCk*U0 DJ宄C>n'W-S8MH.JdVKl'&r^> <1|1P8* N:Rmۆkׯ7mi29Tu жNchZCx])edz:2WBYxx+Dx>A"EC7V)0m_vPXB1}B\) oMqKT(S)q\PG8isS;!,oɼMp`7v*e" T4DR9 PJ5$C" R!ِ!t0f:ռX$.0P9Pb /ԧ|ɷ,9q-&X `i2PxG酋46J74-FB-xD8Ʌ&Bjq2Cw;* Ԑv8LLr_UE4WSi%N\Sb%Ƶc"BdFPYR]lGD͡PGJ#=4jNZCX& B8*h74qRQvJ́mʗIdrB AW'DB>h'A߈ ՐF4D1j($Q^3N"﫽?#Q$j4_Jxsj2&ZBe[ ^.46X(j$9n0y >Cb( D]NoOW^ R.c}PjSW{ҊTU4sSNDꩶ{\x1Z2fFkE&uДrڠ$NY8 eޙjH5r \T5GY\FťO1nilCQ?tr&q9 )TNna| 9}k9 a}튂]IXJ|k^Eʶ|.ZtK-Xk/M/g [k{,׬["v +DkkJk^wͩ"D:p( m ba+Vv,LI|=똘C$"TLBeq) bX qp'4oTq]RW̧Q,.@K@ @AY%epTdwFY)RS`Q9|&ƿY1Y!Ȧ44Iv3sr0,] K]=0"G:\Xtڝvjvь9ں`8(p9 s簂4`Si ^)!Be610kVcwza}_9 }aJ0y(1U>W*V#aBՈR"_9P,WJ5ZԔC)\$c#4Di?4,a +EX$7wCXg#^Â.sӨ8.<3V1r GTKkx]( ODz ٴR Wd5U0]j+K/ GZu깒׉RA\T#WUK5ג*$~깬pZ`жт8N8=c}pZO,lW+ `׃&Sq\$r@Tbʑ8 ȕ4/ ]6m؇<'J E_xהs{h8(e,^9zr5M(1!'"a5b?WU CEgRǕ#uw_akBnZ$U=a C@ c'xO9N Y)d^؏iǴ/(+O zgp\ =YY m]qbT߲‘-2Ҹ*0L\*hF~PyL{>&=IZ2,[ ?~j2i7jBAՙX+^BF 0ZB:%U.|2Ov1è~,ԱSҔ"(Ējd` ח?0퀫\mVּǾ_pЁOmj$TQ$ 7JkFI$xTH/B*V|1y`*L#3A6h#7dI(+EZD IFZb>6K9&R X ?$-shy$ a5TAsV$/6Z5FT"$4dbW37 9\IѪU}^ WJIR]>y۟X1,l)r[2UxKSTV2N-0,ۂHen!_헄mv4*Ah Irh|ˮe>==䅯_}m0Q%K/m׮Uk" - Siu.j%Ac#ժijUWШ`Rm0 >/B8‹庡<04dNwf4`HȤ9+S ޏphN6g" g@rBrLqmA3)RHKP4!Yub3u᭩irQD7I4&0VճPeH"cu0cDN .fFiը&0rpp0 \mٰlIJ- q!,CX|!,vcK3 Xr5C1%,aɧEzK5KL[$jS#{OMX܄B_Ҏ?DY'8Paerk$67">a{ ½ H*]8,}\?.[r}^{FŤm~@|GM!!D]˶DErPKz͇)DEʲVךq; XSSX"w/l%45"_đv׮z?OD8lG,TV y8@!Ѻd0& Br(wQZ *m〨iLy K5H$hn'*T͢Za*vPu%dRu˯a[\dtYkۏ\ٚɑD2P+EeQJq-7=ND;6D+G a9 w`Yisš!a Wn*RXac>}C$.K͊ E Vi-Қj=)> ۋP і"{iUau>!77V ږ%C2CuK/!1[D5E 7}R͓e5̲P9kق605pkCqE*N`(_jL|GE`hP̊\ޞ IDAT:Q[r4!BzZj*z"UU%q"I $16~p‘B"U,ek>Ll8s P%lGi(EQꄠ\Jɨ0"<}"x~`'%i [yaa69֘$#")B=]!jE )hJLJA,+6ImDXFaYnYZylwikГҪ1j,\T[^ȵoTQDS@ڶeaІ!ɯu`k[3|/.LǦYsX UH!G e?+F ;mxib{(-nI4+6=yea`YLn|CXj[M|^tr?Nn T5Z((eO`i„r i܃mA+RdcDZ-hEd9hL9Y zO,4$RXbtPyČDʔA211! +K FN 5C RK&G j š!聅g>IfGb63$~1}[ lbJ$IKV؀OW[T@-xdiBw6i)Cx*F׆GDZCR "\ ԢG Rl Ҁ)":*l%a15U=BVFSˆ$Cޢ I,9!(0 JԐ̧hC_NV$ OTG"q}Y>U 㨞 U |^O>Vt S_u`iIf,BQD#*Н5*bB*)Sa!!Wa68%% uUMX<$™8L e 2,D7TEG"eNHiiy+ͼ /=JEDPg ņ,N0 e/}4N^փWE:QOd\kZ(¹ sɉNcIUŹzG$Dt!Q1F{֢IjvpUɐЉ3 aME2V*v&EҪx9-48i-iLo];bœ"bDCd'I`꾠<&VJ*$,EN~HZȈwз Y͓%8LƜ솰/3͢[C!™ -Ƣ QukGA"'Hyr[Ķ#h(Ĥ,–4T7w+2؛U-bÊ[i7pa wb!1a'Qp1  b )r⚂RM:( B$0V]T-p*|Xj .6QšU'AZF04"zH2$LΚ7Cb-$,cVhDH󍒇 z\ɶ4$"@JkK%K7FjpIfKSa *RR$G@"SH#J0jQTs+7!4$d0B'vMvrл+Rҕf(ED 14E-+(n$I"|ₔ 1*^غ%ʟ+܇k-~$*Fa5&Q*DTU!MjjQӨ6)IJD-K[B(!c3rYՁG^(cЊaWpzD}jXԼ\vO`r~G&;*<(3у>T!z~_톰 a  / <ݢC.Ky8QE"F$EIJzPXmX*։Eo| 2]J- ^~1.hi^S0EAՏi,LYomʄh&;dA^§ek^G),}X H+ϑz /c$z5]}"{< 灗ˀp=%< P^,^,", @}aDd,tk3aرT$B4(yP )QL]ERQ]7"1bmiqOBШuxXi_:G9PC6jݭ.S@%ebC.V= a65WIeL hy\&c,3._]*rӰRe ,|~NNPǮ-/""1ՙTԉK ,XlXٖ$'PGv:-M%8^hb4TORLTNT`Z2BA #`Uʠh@Č:sI;qx01X =0c>8 @ [n@2zx8<Ӏ͍hkpqIk3.b*uU<`՘yQ8X ^(b8).%`dȊ2.ʦ 2V*%&$aueUY{Q܄+|V  d iCѕiDW ˳jn% NlSsOkئÅ)/`0yLW< QY`AM%;U]%ډRW{%BL]!7|F|G18 +eMcQ 04Qwa V->+I?7ǟ^|||/" E7csKWD6}l6+k>+vm = 2ш|0^:6 Lt?EV*sPWc aa-ǎYW|O la҅XՎ/eKg\'ل<4{r\jO~zdY\RڕW]#$43ӈxc9}GWJB>FCpֹ5A>Yx޶k/~>~X|2)RBxy8"6 W_ |xyo)+l+WIJNtvvYњ n[_ݯ3? ^=:]&pJ(nNdllz=( g>b ]u q5гm{ddxybxcʥc2h¹OSÇć`ѿ~F*WP|0 5;1'!_߼?~IdYs??yibOcdd3ج5ɰp7J\2<8~1L9!Fqg>wKw}RO~?OV M)i~޷? /R.O>98ʪH%K}qkUhr44b\F*FSs3Ǝ{}h!,FFFv|'LŽ.E],HhJ)rb3xyܶsl:;1:2:`:KXցn,{ Rѫ=4Ʀx !DiҎLOO×o9(Fa{G ?O)} [,X-\_y132hƶ(68Ԝ+p&<)t6!ṋ;hh7 㺸}THV6CV D1Y",Dw~CXkX~[,2]eY𢋱xSxݳ鯑f2ewYr.,۔x[Kѵ|9>rǎ#!, l[wU=CSS3l14,_|  āKzMbc,\1uUzVbjr / }4g[gBACXp۟܎k_[7=5}2Actࢋ{PK$2 N{ۂHe <!<--|Ub'?K{Wajj ; ϚZyc=C0zhݺBQ|1e,m@Gb1TesN ?}e![0nv N:;hΈA9 ( //MkThG7/p\boUwOw fpQ7`ҥhjj8xǏRTc…G+. ^{WCdO?@_WnÙ6ww YA#؀Ʀ&,\mI9) pQw7nV,8ǿ&& Y2x0zhe:dkށ  ۶\ǎ>#(>I "^pզ"*|JRp0&|[S%K%LO055|!b|> &&PJ45JRmH749mm@oo//^BPIr9cl|cco0ޜiw~ф r(:::ڊ榦Pq"jaH y2KBMMM!/YP@nbiLNNbzz ^I}7%Ӳ,8 ۱ҊK`ҥB{{;t477"aRbBp1LP(cxi`ҮTսmADzsb28֣<m9K{Wʫ+pB466 Nu]8$r>yJ2U*D ؎L& @ J!͠%ۂT* ϓOm[ZPMNN"cb"cǎal8 ǎA |3g_. FboO< wq7^_|1.\l6Fi8۶`Q Ԣ8Cq TΣ 3! \blˆ뺠eY=, I |T*LMMKW@>/JX4Xcll ^z֜io~U2ab߶ocK;ᒕ+qqw:;x",XЊt:T*t:q8,˂E)eYiDHD)jiu_8gsxpOܖd9qIV(x0rM Q=z p1,ZXֆxK2e^`!|Gb ;aaҥXp!Z[[4m[*#qK):15E` ByK4=a"t }}$.~Վ7G\.#`(xǟ{*>O(9AۢXt)w`ѢEXhD)N!Jò-40R JB6y|o 4ʥ2ILNN8Yd|>1?ȍ" =miGPYe|?{w?[T:L 9A&y uSH\ضQYHJ<|9zTU.Y&N(vzOK_z+//2!_(\.c套Bagg' !"iNHֻn㲨˶Br 0pުIDATp{ {z͚FR ΢|}044T:ttW5k+!ã804U#'Bs===d2h0} ]h20e``pnLe````qΚX?$zӦYo[V­63`qng޺?&%U]u~3zg݋Zj۳?P:b_u+ LHxb]r@u#~y`'(SLHRFaT ?~jdֶ0F` bS;wrxnnC%*,>8<=ۋ׭ƍ굏ǬLs[jeKMBΝ;1<2RxWg'VZ _}J~~ٳ֭[uy{jNݻ~ֆ pu5͛kr9lC⎍O |pxJn3͆q}v]ˢ[ .\1&Cᮻ"~˺Gsnubif{hdT־6sOj|mI9\kIv'|}a;hf_ ߫޶kazUlW:>aJ#[o1!RWtrY\7| ދ/ui_뮓&:X?>OYî]N᡻曫z$fEVgsL7{Ȫ>R)\zI^{udd:O~c&eaƍ5/w/QdU/ ?~Zriܺ*>Uzw}os? '~dz{{k>w'E3Vl۾ _[y%! dL _w]Lyܵ4oIV]شiSH}}}5]wߍ׭CKK b.]6Ūą*g3S*UWg'm*u\X2ۋ.ٳG,uYǭ_=,*ߏ 6T c \՞={xٻγl6l6k.LCX3ɺuS&5î^pǎXru]wUJ뾰[7lKԪ޺v$l6Q,i``?͛g$olR3X]Źn:ٻn6m"z.={&p-Ɩ-b``'k*B\8`ǎ~\->W#g:}puUȬgK^ z\6ԭT#͠r!#[7lYӟ3H޺a6R; gWWggbժUt=u +TKm喚uj) aSM﬑R!N-뮫y2rL-f;vęu5RYM:jgxd$)Y'xGD}?aܺaCU`]'m|_:QR/I

XW ΤH]Ν;k׮G*Of' k)5Q#mri=hlGrϩ&6sό%/##7A;V iO91SLV;1}LHV}I$Z)ZZZ;jIr]vIWO5H;'>;*k:믯J5#9---Ѡ?=WstuC^l`ǎbHDŽJ:geJ;\~-:M#oz\n R=V?SQ/[nIVwB:QD-ií6T㏟){u3mii7lƍgm;()V^6w~}4'#"mLNjsv!r%&UOh\byW~`}'(S_<xf'gPUh! ˳d-mwqGJ3?NR^ꎢDUsM!V:)gӖdժU5%qyzu|@bʼnwH3)~XtY/D6CXN5N=ٟ~ VMN[7!:H(1s.|鮻fLFܹ6f*-ꎊ& |y;wuӶ۱mvsšܺa)5UM7ߌm\EFΝ]waڵ3`Ҽv ׹|pڵ'>onZU͛*(c~&2'>~Fl۾/kC2>஻"jzwcڹsF{ERQ nīŚ+8."()---x?̨3Rjz%"O3ϕfcj=ԝBLq`p0lNl+֮ I-i K>]wߍ4쬩}jמ{gN Fa%fR3_xD8濱eKlNO3f=HE]:)grI>Xxt5u栞a)-[ޕ e}TVOyftjd}ᚡl8tuuOh瘫``kNSŭ6O`R ,3{10AX02:f|!s aa|!a0000 ` 9 󅰎```0_ aa000/```0_tk0007ez {p@ v*N IENDB`PK [&4kBkB content/browser/aboutCredits.pngUT 1žCCUxPNG  IHDR,|bKGD pHYs  tIME d IDATxy\y;{Rv 0Hac[±%y[2~'q<8'7}ϛ3 w{L18<8 EV{soUc09χګ~/덍abbmێm۷c vطw/۱o'1{4eD]A@8_5ʕ2oߎ7ڍ]w;˙tnzq82uǷS 0 P (/8@\r"N^z^^vno[Ic M%US/~!@a$ LW$ ' IS]ze˱RZ7p}6E<RH=T YnR[B(%!s.E$k=eyurA%$@D}Z<# .5U453'(y%wzoAsť"K(bXiccrrr$UR)IG\в^eANFCמ8zF 3'17s'M1/ȅO (ʨ..,g8F?UW}JŦ!VYMgcpr; ,(YY*#"}nv'Mbn*꽄 xCD A<+?R#v՟ h_ @)Y1fr4{HYdH,khF, ^O?qSOҀK%ICH XAw=rXNEk_ǵ\>HZ@ 6e}^kBCBǔ2:旾],2+DbW=y(;&VJ]D9D' x Z^V*6ux W~B@F)c h_Ɩ3u@7jÀ "kºI7ʊ,\p&cxqđ4 œIB4@'tj٩dwv|ӟ2*R(RbjO2!rkyVp;*.PD$뷉 avci9RY[ȫ1y*=rg:$༄VnqLl?{m9`9{%nV.U*&IPBW*c Q.W$,٫ Z+?i`c`J%P?HŽoԊU!,,iPeTVZ" <2S^R^L>t!91$IV7@m\qܗ}xCC@@ %*0V0 B !9Ҳ\['Ltla`4%p3qSB'ϡbZH8xGⰃi4%>*rrR؁GA[U,W( ?U*vyg!zţl70kSXVWi (ZD9Du*zp8<en@+AQܶ}]0K +V+JX ϗʄfڿx݆B !t1څdTBWS0Y(eQ]*K{m4 ۃZjC 8Bc2͵pZdZ$/eU*E<$!a 1cH(ڵ>b.sDp! q\.Vש@nҏIp2qݏz~ןsΑ$ q3PN<&'aɚIP\d݃j՚9`9{`EPT E 3RĔ" e+1>RI* h@d0Tzu= e  DO @\+c$,=Ye\ĂOS=M$9IuC )0z&"]J= J RDp%TC˓*Fiq̧9eRW*`AP$ta2(INSfjDtg8tut0ٻ׃Mw(җ昊\`^󇇖aj$@f>L`ZeQ1-زey{/*x}% (@>CRp Vzu`!d%6DG(a Zu[[}XPqԬ|RauJ (Z\'`B#(:9p21ኦ=rA@)+硣`3J>-cV%+.H&v"Fq$Ë,*'TDŽ DpHr׃U! \ ) ZW~q÷,oS?'/0hA R({2u!d̪M)BBFn ;dNlx.JI'xjȉ4ÝXzg *2G肔  `TQP34_%Ih^Kh}y q+ #/dbh }D,UW Nҽ3bRҕtάA*8Q;MVڃJH`ߗ#$HH6"Q1W3rݒDcuBJ1*Ԙdx>X s>KA\󵯻/SXlk_7Av22V8U=BR~qMvC"t !u{ilvS7NƯtJf UrD@ iҥv}Qjv.i.Q$)9ELH0P`;s$I 'kknז),gL՝BY_ }GA:9GyUJ+N(`o\mV\ \D*% R1 J0I ڥHs'KMjަM2۝RO,Ec$I@}OwvYXΔ}Aŭ$^2!cUB ݠ) v|DP *ەɚY +eCv!9 +v.a&2C\1rn.@sf_% N߁u X>uu !d 3  4=jKc(^fml&eP1@/ 6,Ɔ!lhyj=4:=$M؇Q`@@Pu':ndJKj|XĿ}1oF > >Ji}dO|6!Sb_x~G%L4#X &~֏ ް g?597/q'K'=O 0P./|!4Iթ4@m$&F|n۶o5p*430_&.@y&P KYu(EDkMP JS QxQDp( 8mtfhQOck0=OMaՖᩝJM͢UI-=G oq1}M}N6'qdk<;w^w=2 4sm)t[hiY*z굮 "l|d۶V _&3e`!p?BCՄO?B((` O |( +Q"#7}n}h?Q cT;af'B3ЉZr!vt'T&QN2WmnP]&8,z8܌F'L?3s˿}Bc&8VkR]*0 |BPD}*f%?/TR]Ji@ͷ,mWU3 \Ww%N̦Q~]("Q턨v$4:q76X/m/p]SK48*+AI*n!hD!u'z;}BlJ>iVoL]絥 R Z2|@T;qK퀵4mjA eMOR ԭ( h,X12 *J]f'BZ߽"5Y2Bq+t$ ;b-ZHPAH@aW>~tR~际fI"Hg7 "M!8J ?XMNI`Q pS O@+P ΥrU=::a&Mh"_B ADLGNNa-=78 K}Uy2n\B Vul4<-ԫ`TAib ʁN`иQ»gKnVe9Nb\*G|ׅzP"P-RJTW-(;a{aXWK")E\Cd7yl䂆,mb JMgVXXwwh9#SG$FVE~rnc)'N^cX:^_e*E"|ưmr Uf'B+nh}-;qə/@qfUPu\c3@R V]ǵC>+kЎeUB=5 |قX%\ro^cT`^W pն̷\&} L{bVٮ 05N^ n~@P.k3`:1<7BHTB!pn meI@A-t k?!(:nzXҮQ$0sìlPJ'H}hE1ZѪNV#u.lY>lԓ${kh#TJ+oNNm>T^ETϡC,A򐨱P09YəQXru #Ğ3fVL[$JUd3+`։;qu+qQɍ\Z^HAKPyZ_vugbxQd L]t3te@ADA癬qAD^4!2*fW^ʽC1p!P cQZO^tyE`fTˢZIYn4e4-Z17[}_bQp_*Kddp< ~TDJ `njńJ^1uF׃X.g) B+$BpBpQ 1f(K6f >pPu9;i@+׀p#H7]D2QV$R p1^'ciQCc!ThtVjB$R"${NЊdxOvt q#Sk+iQe“l>L!p*n5VvaLHPQX}sbe 0=Vg6\it7XφKe \ӰRR.Jb\C S.ՠr$X`DŽa-3q }*{Z$ZfgJ2qjfL̅QfPUvB#=JfvrL9ch'iK3߉#:rӣ-_QXoj ]7jމCcÃIP|xV/-C|? |όYsبwuP+'Psi0'' NrW ef͚ cVr Fl9@fisr+K}8gx8N;e=9`-BP2'ȷNoifdOlV*9HMF)[mQ!T@)Ö Zq ҁTn~5,~a% %zӗSH6$4`u Υ`QmbףҶ2*_`J8Q0-ːT̏FuɣXK14S5)V{beÊvV\$ 0;/+ӧ*8jǰDNUv7F<9 hf, |0+h#?|z e2@7aӡǭ'Jr  f6@@0.Yn`;Ks0JI3tUؙ6ݼ.sґ4G2j/҄0V܊XSeqv=_v\=*J了\WwjZ?UvCD*,!d{RJ}H!D8z*.3)PO0VW.Mp怵E `JԪt&8XWe&n$[H*⤻1ٚDa\?:>w^he A_h}_h>\ RR62y*&9Ru$ <{Y(PCɽȄRPOWfQ0HȢ3 z5aL{wB,9DgLiLP.>0E֩YO4.]Qlox}9lO(*K(YMTXԂRQ@p ՗D媠nVD9 Lд.Rj*cd^3E+ @L Š\܉ tR\=bRQ>dVh֥Dd{wU;gxdP Z+KE'z0R)8Q0P+e<.JKI 6R #J~nzEX9YR]A$PTܗkZRjU%8OODkꌰ::+"$:y]2-iI0[H&.,əa[Tbvx8myfžr` i9OPtLJ$ؙTa"nUVbҽsiTaB,lQ8`-bUQA FӖ04V= ,w SsyMر\BƼjGr[aRCveA- Y``2ѹOW % g K(i7SXJC $$XIuR9WQέ¹XK%ƍbjT'"]1+[iYjRHa"(cYUFIw<2y}XsZ-i3v^~t2*Fa=&ijDT*͍'cSBՖ"JPdIeJ;sZfb*( bv@s6lOsJ =îL]WY0y]vLh;>CĹ*!V|B_mZO8MWzv)Ui hTJn♸ u  ^oID1`||}_&s/Fr&IKjZ,bƨ6)1.1eژUKaQңCBwgJDzT]YT}gXCkhUMوFbc:=R@'p5ߑ YŪ% ̚?hFy 0@"srZ KjI' "1nۡ UTa\ӝ X톔PXmX.D{"f3j Ut5̶ryq^`-a9ocr2nF L!!O02ws kQۖ b0c8IbDuΑz Om$wx=>n:^P4ͪ(H)H)N`m+(δ1@$|_-,mh,][ 3.v :m(Lk[wh4A8-Q*+ $Jh9ɀJ. غA+ib'UfW;nKSS=jt֟n_z(,UM(`LLwV+G͎5 K8G Q݂HbN~/"q+e]"(c<I$QŶ´vJ/RZLȱa#?4eJfP\O!NK8i*DPaPU۷]1]Y=fmef $[n2Z!O "dJAt:@9w0J:h,B/!DDM6iqMRshW eV}N!助 eت= <ՑiKc= A҇?<{}UTp*BEJUCJ1%D[P.g 5ZMp"l$*^1BN B3 ,m;lk"X!BG`Lw2epI,-;_ʮ#D>E`Z`b //%x`ԋA- he[0NDz<*^tvZ6@@sICVDp@pdI D!h nAZ}m۾}nA`~X$ڒ` Z0d\YrR%Czw <EQn \o#@ 4B^v[cn !B DUjK`M`m3)HtlP"\2;H;-:hkXXK_^>; <V \A$ (MyBectq8= zb+`Q!rmi^mi >"UdQJsB#T{d+Afqө O&]}9H4 !:m0m6EwZV`jmnƣT4OJh!eSN@Alx$`(9 8O8_Uĸyn,TX'<2ED7mψ'!=Kp1`EB~ $Fhp41XzяIp7RӣRp45E7R @ 0r}ݑU9\*,գ=6NcЮqID!H 69fvv_rcvƵ\#T_BxI,KאDfsb53cz١g ﱮZn+rL|FfItQNX?؏cJLCh80WOZ@1, I.F&eh$QF1Hv [MVM11:dvldX8!x ,*3@2;҇u8cˋr.^LzL~^Q [G3םlnxdg-51jVа\Ȳ)SXV+D!NFSWXKVex sҭcDIrr3ޱRJ? \ÿR<1*fZgkx*ZaDut + X/Yߩ:N#8iԪ*u.,%h^v9n$A2s~_ ^"80DFq2lIJb=?**޿Pb@ֳܺ;< &,O֚803ONTcaZ(7?î[W i+VE!G5,@mFc^76sVBOÕ[QV_ ~z>f``gnPy mM5޲~ \ ;S?`q8c8Bj^CGtzu/IѨ(cGcx˙}jT z-޳ڏ+pچ w1YZ{/v^lݺ׬5k}6 Ua'6;qGĝO'UרoQ.^~̸>/ժ5\v;P,_M^]o|#.X={rrwكڃg;@J+KWտ;wb͚5Xv .ع dߏC'QcS~$p7XK>O7߂O\}y.vۭ[oWZw ^6܉[̳ʽr;:4t7qׯ֕8`-}:ž٫s@ @}pGv:-?;8XNee+Wa雰wgGx ,WE˘9y~8`9mrrot/ osE2# ,?3{=W<^SةS\їW/|_ğ4 {N+xl !DigVj!V>٫Aq g[6߆앵,=ι[tzu5_,vvYu6Iַ\s _vŇ?1w N1O?V}b"+r"0O k?xŇqrx{6Ƙ;@/1pڦ]SpP >xEk(`+|lgbu8~N8n\Aב˙e exKlL`݆ V9WٳWfK';hTnٯ}-&f|I\)/|ѹXص{WV @`ljAzauٯhZx_hq+*x|S=<߿ǏJ$U+f?2zfZ:`x/y a8u!\)b<@vgrɹΞY7|FTT!UAi3m< z^.9 ?POXu+׮),g!\KP r*1;7gzpa߼ 7ljx1<}V7|F W|ʏ˃CCXq#FWB\FI;29&]pMx9TU6N8COѣUU* -o}.|EVk ~JL\00꿄qC'`CwQuιX|Q(4M:GcCZ+FG񖷾 ;vDf0;;y? g&+>? u8QyIy1ԪUDQdT'&]!077ٹYLϠ^ѣ;~( _yտܭ:_?v%n6y8wvu+ߏPc QVc~n338v=9oZ^CCx.®/iVjYLLcnvf><Ѓq'o~^uJ+q5 ʗ~+׿+100RavZiLODZEV,*ڭ){eu+뿎ם bV zss󘞙 133}wǕk5.y K,'ܲ,B{O?'8|0ߏ /z#zQ.Q,65qh6ΣhѨc~N&cfz|Ϩtq|vZZjðm~~͵Wjԛ8󬳱 aÆ Aԇb Q B$I(%|N0 1Z(BA'AW-on$* FFP@eA ,SOc ȨF*qILVavf<9WO|x۝{ā5ұC/ዅw}:}ؼy3FFF000"|߇10@ O>I$I"RHW!fb=1A2 Ƙ| @QQ# C4-jV%dIUqgT*|SU`paOʗT{Llju+6o5k1:C(( ( }1F)(cr4MDLi}Lj !81ܷ쬂j**~ Lz33Pw?z^:[o?~7:"U+W+W&??;A.%l7|7 j۰O;VPׇR2{J)Ϩ)7$AHE2.ccf fS'̙ZǏSOcf\<e]QzA+}-;'[`r3~#sjҵs=~~֍7Vn*ǎ0ġġ?),_1Va8VX+VOƙ "ЧHJ)(!H87*<$#"qlqj^ohިQZbvFf8~3͛;ߙ_}Jn !CLXΉS[aëѭ ?+((W*9]J  (xQ1 @h5VUiDV*nF\2|]w;pIDAT^ts;snَgݷOaxǔw<[o[v?Ӳf !2hN q1mv X?ts?ǟ,۷wO<>pɗ|\뫧oT;ǎݻwl޲ŹcΞX󾳞v ~LM?cCpGFE֯-Ѧ͛֬YXa}K/= W|裏vM?rJWE3gy܊3g9s֜; Μ9[,rΜ9[4̙; Μ9[,j̙,W ̙E; Μ9[,r;9s̙3g/6ܔgΜ-`1Μ9sr̙Xn3gQw9s̙3gΜ9s̙3gΜ9s̙3gΜ9{*%IENDB`PK [&4 <content/browser/aboutFooter.pngUT 1žCCUxPNG  IHDR,2*gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?(` @LA0 F(* F Q0 F4Z`Q0 kQ0d@X`!h` @(`-F(C 3(`(bQ0 F( F Q0 F4Z`Q0  Pa: `h` @m4F(Ch kQ0d@F(Cb Q0 FP4` @-Q0 F4Z`Q0 kQ0d@X`!h` @(`X0 F( F[X`!h5 F(2 F Q0 F4%` @-Q0 F4` @-Q0 F4` @(`-F(Ch5 F(2 F Q0 F4Z`Q0 K(F(Ch kQ0d@F(CU`!h5 F(2 F[X`!h` @,P< F(h5 F(2 F Q0 F8 KIENDB`PK [&4@%%content/browser/browser.cssUT 0žCCUxsearchbar { -moz-binding: url("chrome://browser/content/search.xml#searchbar"); } /* ::::: print preview toolbar ::::: */ toolbar[printpreview="true"] { -moz-binding: url("chrome://global/content/printPreviewBindings.xml#printpreviewtoolbar"); } toolbarbutton[type="updates"] { -moz-binding: url("chrome://mozapps/content/update/updates.xml#updateStatusbarNotification"); } #noPreviewAvailable { background-color: white !important; font-size: 12px !important; } .rss-heading { display:none; } deck[selectedIndex="7"]>.rss-heading { padding: 10; height: 60px; display:-moz-box; } .rss-numread { font-weight: bold; font-size: 20px; } #rss-buttons { text-align: right; } .rss-title { font-weight: bold; font-size: 24px; } PK [&4Lcontent/browser/webmail.cssUT 1žCCUx@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); toolbarpaletteitem .webmail-preview { display: -moz-box; } toolbarpaletteitem .webmail-draggable { display: none; } toolbarpaletteitem .webmail-content { display: none; } toolbarpaletteitem .webmail-imagebox { display: none; } toolbarpaletteitem .webmail-component-button { display: none; } toolbarpaletteitem[place="toolbar"] .webmail-preview { display: none; } /* toolbarpaletteitem[place="toolbar"] .webmail-content { display: none; } toolbarpaletteitem[place="toolbar"] .webmail-imagebox { display: none; } toolbarpaletteitem[place="toolbar"] .webmail-component-button { display: none; } */ toolbar .webmail-preview { display: none; } toolbar .webmail-draggable { display: none; } toolbar .webmail-content { display: -moz-box; } toolbar .webmail-imagebox { display: -moz-box; } multibartray .webmail-preview { display: none; } multibartray .webmail-draggable { display: none; } multibartray .webmail-content { display: -moz-box; } .webmail-dropmarker { margin: 0px !important; padding-right: 3px; width: 8px !important; } .webmail-component-button{ -moz-border-radius: 4px; border: 1px solid #424D4B; opacity: 1; background-color: transparent; height: 22px; margin-left: 1px; margin-right: 1px; cursor: pointer; } .webmail-imagebox{ height: 22px; } .webmail-draggable > .toolbarbutton-text { display: -moz-box !important; } .webmail-toolbarbutton { display: -moz-box; } .webmail-toolbarbutton > .toolbarbutton-menubutton-button { display: -moz-box; } .webmail-toolbarbutton > .toolbarbutton-text { display: -moz-box !important; } toolbar[iconsize=small] .webmail-toolbaritem { height: 24px; }PK [&4-:<content/browser/progressbar.cssUT 1žCCUx/* ===== progressmeter.css ============================================== == Styles used by the XUL progressmeter element. ======================================================================= */ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); /* ::::: progressmeter ::::: */ progressmeter { -moz-appearance: progressbar; margin: 2px 4px; border: 2px solid; -moz-border-top-colors: ThreeDShadow -moz-Dialog; -moz-border-right-colors: ThreeDHighlight -moz-Dialog; -moz-border-bottom-colors: ThreeDHighlight -moz-Dialog; -moz-border-left-colors: ThreeDShadow -moz-Dialog; background-color: -moz-Dialog; min-width: 128px; min-height: 15px; } progressmeter[mode="undetermined"] { background: url("chrome://browser/skin/progress-busy.gif") repeat-x; } progressmeter[type="barberpole"] { -moz-appearance: none; } .progress-bar { -moz-appearance: progresschunk; min-width: 0px; background-color: ThreeDShadow; } progressmeter[mode="undetermined"] > .progress-bar, progressmeter[mode="undetermined"] > .progress-remainder { display: none; } /* ::::: statusbar progressmeter ::::: */ .progressmeter-statusbar { margin: 0; border: 0px; -moz-border-top-colors: ThreeDHighlight -moz-Dialog; -moz-border-right-colors: ThreeDShadow -moz-Dialog; -moz-border-bottom-colors: ThreeDShadow -moz-Dialog; -moz-border-left-colors: ThreeDHighlight -moz-Dialog; min-width: 96px; } PK [&48M22#content/browser/featureDiscovery.jsUT 1žCCUxvar featureDiscovery = { // Set this to false to disable debug output FD_DEBUG : false, // Constants MAX_NUMBER_FEATURES : 256, // maximum number of feature discovery urls in .dat file FEATURE_DISCOVERY_FILE : "featureDiscovery.dat", // Prefs PREF_LASTUPDATEDATE : "browser.featurediscovery.lastupdatedate", PREF_UPDATE_URL : "browser.featurediscovery.updateurl", PREF_UPDATE_INTERVAL : "browser.featurediscovery.updateinterval", // Pref types PREF_TYPE_INVALID : 0, // Invalid PREF_TYPE_STRING : 32, // String PREF_TYPE_INT : 64, // Integer PREF_TYPE_BOOL : 128, // Boolean // File open flags (from prio.h) PR_RDONLY : 1, PR_WRONLY : 2, PR_TRUNCATE : 4, // Globals datFileDir : null, ioService : null, remoteupdatefile : null, featureList : null, prefService : null, uriservice : null, Init : function() { this.debug('Init()'); // Get the working directory based on DefRt // Data file stored in /dist/bin/defaults/featurediscovery.dat (for the debug build) if (!this.datFileDir) { this.datFileDir = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("DefRt", Components.interfaces.nsILocalFile); } this.debug(' datFileDir: '+this.datFileDir.path); /* const IPS = Components.interfaces.nsIPromptService; var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(IPS); ps.alert(window,"Feature Discovery", "The feature discovery path is " + this.datFileDir.path ); */ this.ReadFeatureDiscovery(); // MERC - rfransen - begin update featurediscovery.dat process. // We need to work with the browser preferences, so let's get a reference // to the preference service. prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); // And we need to the uri service uriservice = Components.classes["@mozilla.org/network/standard-url;1"] .createInstance(Components.interfaces.nsIURI); if (prefService) { // We should first check to see if our prefs our at all valid... if ((prefService.getPrefType(this.PREF_LASTUPDATEDATE) == this.PREF_TYPE_INT ) && (prefService.getPrefType(this.PREF_UPDATE_INTERVAL) == this.PREF_TYPE_INT ) && (prefService.getPrefType(this.PREF_UPDATE_URL) == this.PREF_TYPE_STRING )) { // Ok, the first thing we should do is see if it is time go fetch an updated .dat file // Right, so how about we see the last we downloaded the File? var lastdownloadtime = prefService.getIntPref(this.PREF_LASTUPDATEDATE); this.debug("lastdownloadtime: " + lastdownloadtime); // Right, now we know when we last updated this file, so now what? // We should determine the update frequency var updatefrequency = prefService.getIntPref(this.PREF_UPDATE_INTERVAL); this.debug("updatefrequency: " + updatefrequency); // Ok, so have we passed the update interval? var updatedifferential = this.NowInSeconds() > (lastdownloadtime + updatefrequency); this.debug("updatedifferential: " + updatedifferential); // if uodatedifferential is true, let's party, otherwise, not time to download if (updatedifferential) { // It is time to get the new .dat file, let's get it! this.FetchNewDatFile(); } else { this.debug("No new .dat file to grab. Aborting Fetch."); } } else { // Uh oh, some of our pref's are not valid, let's dump and bail try { this.debug("lastupdatedate : " + prefService.getPrefType(this.PREF_LASTUPDATEDATE) + "\n" + "updateinterval : " + prefService.getPrefType(this.PREF_UPDATE_INTERVAL) + "\n" + "update url : " + prefService.getPrefType(this.PREF_UPDATE_URL)); } catch(e) { dump("Caught Exception trying to dump prefs : " + e); return; } } } else { // Not good if we are here. let's dump a msg and bail this.debug("Pref service unavailable. Aborting feature discovery update."); return; } }, /* ***************************************************************** * Function: FetchNewDatFile() * Arguments: None * Return: None * Description: Retrieves the latest featurediscovery.dat file * from the remote datastore using the nsIXPInstallManager * service. * Author: Ryan Fransen ***************************************************************** */ FetchNewDatFile : function() { this.debug("Starting 'FetchNewDatFile'"); // Lets find out where the remote .dat file is. this.remoteupdatefile = new Array(1); this.remoteupdatefile[0] = prefService.getCharPref(this.PREF_UPDATE_URL) // Lets get the ball rolling with the update service var xpimgr = Components.classes["@mozilla.org/xpinstall/install-manager;1"] .createInstance(Components.interfaces.nsIXPInstallManager); if (xpimgr) { // Engage! xpimgr.initManagerFromChrome(this.remoteupdatefile, this.remoteupdatefile.length, this); // We should probably wait to load the .dat file until the update // service has finished loading it. So there must be some sort of callback for // this... Aha! There is. It is called "OnStateChange" via the // nsIXPIProgressDialog::INSTALL_DONE flag. // Hm... What if the download fails, or takes WAY too long, what then? // We would have no feature discovery file loaded at that point... // Well, we could just go ahead and load the local one at startup, and then // re-load the file again once we get the new one. } else { // Note the failure and abort this.debug("nsIXPInstallManager service unavailable."); return; } }, /* ***************************************************************** * Function: NowInSeconds() * Arguments: None * Return: The current workstation time in seconds (Unix Time/1000) * Description: Provides a way to get a time reference. * Author: Ryan Fransen ***************************************************************** */ NowInSeconds : function () { return new Date().valueOf() / 1000; }, /* ***************************************************************** * Function: onStateChange() * Arguments: aIndex, aState, aValue * Return: None * Description: Callback from nsIXPInstallManager. * Handles the various states that the install manager goes through * that we may be interested in. Of course, we really only care * about one state - INSTALL_DONE * Author: Ryan Fransen ***************************************************************** */ onStateChange : function (aIndex, aState, aValue) { this.debug("OnStateChange"); const nsIXPIProgressDialog = Components.interfaces.nsIXPIProgressDialog; switch (aState) { case nsIXPIProgressDialog.DOWNLOAD_START: case nsIXPIProgressDialog.DOWNLOAD_DONE: case nsIXPIProgressDialog.INSTALL_START: // Do nothing break; case nsIXPIProgressDialog.INSTALL_DONE: // Call our local oninstalldone handler this.OnInstallDone(); break; } }, /* ***************************************************************** * Function: OnInstallDone() * Arguments: None * Return: None * Description: Performs any post .dat file install work * Author: Ryan Fransen ***************************************************************** */ OnInstallDone : function () { // It is finally time to read in the feaurediscovery.dat file into memory and process it. try { this.ReadFeatureDiscovery(); } catch(e) { // Ok, so we couldn't load the new featurediscovery.dat file, what should we do? // Note the failure and bail - don't update the lastupdatedate pref. this.debug("ReadFeatureDiscovery() failed!"); return; } // Now that we have fetched the new .dat file, we should probably // capture the current time and save it in the lastupdatedate pref. try { prefService.setIntPref(this.PREF_LASTUPDATEDATE, this.NowInSeconds()); } // We don't want to bail if this fails. We should note the failure. catch(e) { dump("Caught Exception trying to set pref 'browser.featurediscovery.lastupdatedate': " + e); } this.debug("Install complete"); }, // We don't really need this callback, // so let's just placate the install service // and play nicely with the other kids onProgress : function(aIndex, aValue, aMaxValue) {}, // END - rfransen GetFeatureDiscoveryFile : function() { this.debug('GetFeatureDiscoveryFile(): '+this.FEATURE_DISCOVERY_FILE); if (!this.datFileDir) this.Init(); // Create file descriptor if (this.datFileDir) { var file = this.datFileDir.clone(); file.append(this.FEATURE_DISCOVERY_FILE); return file; // returns nsILocalFile } else return null; }, EnsureFeatureDiscoveryFileExists : function() { this.debug('EnsureFeatureDiscoveryFileExists()'); var file = this.GetFeatureDiscoveryFile(); //this.debug('EnsureFeatureDiscoveryFileExists() - file is ' + file); if (!file.exists()) { this.debug(' creating file: '+this.FEATURE_DISCOVERY_FILE); file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0); } return file; // returns nsILocalFile }, ReadFeatureDiscovery : function() { this.debug('ReadFeatureDiscovery()'); var file = this.EnsureFeatureDiscoveryFileExists(); if (file) { // Init the file input stream var fis = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); fis.init(file, this.PR_RDONLY, 0, 0); // Init a scriptable input stream var sis = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance(Components.interfaces.nsIScriptableInputStream); sis.init(fis); // Read the file var fileContents = sis.read(sis.available()); // Close file fis.close(); // Return the lines as an array this.featureList = fileContents.split('\n'); //return fileContents.split('\n'); } //return null; }, ProcessFeatureDiscovery : function(uri) { // Determine if this uri is found in the list of feature discovery urls. uriservice.spec = uri; var host = uriservice.host; this.debug('ProcessFeatureDiscovery()'); var featureType = null; // return string value (e.g. searchbar) if (uriservice.scheme == "http" || uriservice == "https") { if (!this.featureList) this.ReadFeatureDiscovery(); // Load in the feature discovery urls var entries = this.featureList; //this.ReadFeatureDiscovery(); if (entries) { host=host.toLowerCase(); // match "ABC.com" and "abc.com" var blnFoundMatch = false; // did we find a match? var i; // loop index // loop for each feature discovery URL in the file until a match is found or // we have looped too many times this.debug('Searching through : ' + entries.length); for (i = 0; i < entries.length && !blnFoundMatch && i < this.MAX_NUMBER_FEATURES; i++) { // each line in featurediscovery.dat is x|y where x is the URL and y is the // feature discovery type (e.g. searchbar) - whitespace is trimmed out in code // parse out the line into the featureURL array featureURL = entries[i].split('|'); if (featureURL) { // if featureURL[0] is found in host, the indexOf returns something other than -1 // trim removes any trailing whitespace this.debug('Searching for [' + trim(featureURL[0].toLowerCase()) + '] in [' + host + ']'); if (host.indexOf(trim(featureURL[0].toLowerCase())) != -1) { // trip the flag to end the loop this.debug('Found match [' + trim(featureURL[0].toLowerCase()) + '] in [' + host + ']'); blnFoundMatch = true; featureType = featureURL; } // end if } } // end for if (i >= this.MAX_NUMBER_FEATURES) this.debug('Reached max number of features in featurediscovery.dat.'); } else { // else no file was found so return null this.debug('Unable to read entries from array.'); } } return featureType; }, debug : function(msg) { if (this.FD_DEBUG) dump('^^^ featureDiscovery.js: '+msg+'\n'); }, trim : function(str) { if (!str) return ""; str = str.replace(/^\s+/, ""); return str.replace(/\s+$/, ""); } };PK [&4d e#e#content/browser/monitor.pngUT 1žCCUxPNG  IHDRmetIME '*P pHYs  ~gAMA a"IDATx]i%Gu>mٳ1c `3( R( "HQ BBF2Bvȓxό3̛ޭooS]޾էO:uTu]%t8((>umz`YɧBvmL5zܲ$y{琢;-[kx姩) Q.Ќ *Gݶ š; h]q"#圃{VtQDXU UIKkלADS'h2$*qӧD4 FV8,\. rs!ϴwP+ Ѵ,ºݞ?2kEbg~iQ6kQ!/;KKK|k4}ss0G8v^v ?uة}{̽7aݴYXKp w$<9 ?yHMFǮuiÀVw\Hz;.+OUĸY!^(K8Tu\4ȵ.㺾ɹ$- W,{ᅦV7%吹"yRT6?{P6k W(dee78ĎpW~FV 5GNS5ȅ ;zm:vW(Ƥ^fT**czˮoPj[ ϪZ*Šĩs1}_Uj.\<́KWaItsǫA".o^.i c?UໝG*g_<փދof_Fz' M(dPg:d aV$RKM3 /ᵀR)]JVUQe~Nlb?ϧ|v17tfa {a׎ImaffjeW_)5zԶn6bfZ0??zq K_XeNF7iGV63LA[&lZՀ4kP@zxg7tOܔto:oV~ߥdw-&< 2LƁs#(ЦxzM3mIC,pbDVD} fV,Cxa0:gM~ɞJ3 SqnT^U0uA5 cj?PUY]aيhTZ (v&n\(),/U"ǣ^ā*Vhӗ*V,}<^2YY,jpu(W\[S(*rZ-]ЙKl]n&VUvt oT:L4Y7<3q 4sRQ (^mhVo7kFX6-u7.RA[f)!N<r+Xc^QAavCp5Y^\'G'07w ɳ1D9}(G BjPި +-hQ \\_)v9; ?Wo{Pq=aH.!x$䑀f^s$FKRފT^g=!#q£gD' Eނ^}ژaeJ9g *PcC_-~= oSAFfEq)T D>$kX$1N`=#Hb-@^4{qPC%E+**dG:JPRTtHN_posFIf)(֡J=} #u@l|VL!_[$j/#]_Hq >0+. )W682JeEEbɩkK2P=DZ=NC`41QҼqY9MMDwh:ls)vKfq>'x2ӣ|eYjѕ@O +:R8]ЖAOE_|0<ʉJwO-hLL jy_ɉ: tC]G;He\ыsN^ԀozS?L|N /.H[Oϝp+lkz>JKW[>xUY85G/vy ^YiBQ 猈>z?D cJjII-o?e\^8n.?33CoJO/jl)D#'Tmzk2ohAG;m#2e5dc*)F`|pf_kacT\*#4zIr;N6aU0,R.0GT;%;o"DBdW%& Wd\I4 vܧiwl\{bd+poN1(p^gZf<,Ji-҅\QƩ4{<C>ܱ}X;v̥ `C ʃ˙tڬU(Zl*!6"6ѷ$iB Yǁ3JiϻNL[O *[j ߰{k/3^5,=Y>/"^lR ^rDj zێ zҕpyzf>9"!Ҧ%G M$j:L +C^%*jeĨ˱4Ȃg$9} DcqUܐe D$I1@} D$G ۋzB} D$I1@}meyD$G̽v%#k M |ݰf9G:ZH1@1@} %1zHeH5^cOt)I1@} D1$ 60$ICRe$7R\0dag Yi\_ m"twYH>j-YUm:j:V*Dliz\B^HYv)X3z9 ÁJ?}/K7SժXkD(A &pmx׼5xO] ǭԄ}56!TLΈ])fxxRb<ЯdB9i+ (Nd'jOW,02po݅pļ`by L&a(fΝ f/ &0[ˀeS>K#;w^? sw HtNS Iw_a0T@tZ~ڢR+?O}+p୰m6v})Q \0jQ 1L4LN1Iq oC$yN;Jݮ4J?pîhӫ*2З !C4'+qhw`&IcgMԮv! vstzӤ,Oml4)G|7W_T/FbPy(:ݨbb -X&1}x1Im ^#8G81CCȃ-/g^\O+~A{i{ïI#;Faf,K&Ш*(u~MW&c00L;q#1Aa9t[#|S E+nۏEʱ ab,NۍNOOx;vY,5[d!)yV~GzBcbQ1)C:MnZ1eV,w bx%BȱH0 ޾6QĠAQ] M :5:q"+Š M\n5WKCHVF%TixjK+WW@.GM"tɂbGPYXX1J,.\":O|Dя~D)G➿th]b,q%8K: (X@2^_8tL`kSL6TG  ְe4>&QbtJ>͑-{]ZnîkNږ[H\bTG11l&5 t "ѣ(0{oGXf6Tӯq0 "c-oB:P$, sGފ4 ;%U gI1@-)]$bsoNO5ho4;Zq\i}CNa,f԰vʉii{_7leIIoRmxi |cÙa~1TӳeMPf!KH4EJ5]r9g~$8'mEW3#&!@=KuHHhI=(eORK) >3j]GBb\HI.F>Js)%6'FF6بʎ.!3&7$ Zy]+/Hl^H]bK@.[r0*QV㐌.Qx  !QLȅ ]b@%D(<u] $!0L8(~bRiu($u ĆGta^tӕ돵rQBHHyQb3#ռ(EnO ㎝,YTqWUB"kHt] D콘#>DQ!͋[EHl6H.-9K$Qx  gF%63VދEn_U:ZrH}EbS`MfF%$ay͋㮋AZy=uqD11JT% 93*!!S0?Gc8:hoeOrQfA"\HtDj-WTvCɝT2@+`ݠ`.|;aGwQQ1?s yvKJ`9ĊWocgMvuv6O?Ʈw5PUR"4c4 ;%U d)㹪4i>/ yyi6VW˲ՅUamk:|'>$N8My/t2W*gTN989b$lݺv A,DfJS{o SvzHMzt9%tO^vTҚ@zB%t }EÞ} QᠭZ#_).l, toNBֿ UJ:Rut`K  8,yyG$JY+/HDE%9W4kN RqAIj ?N )kʧ)\RQj .z Mj#*$m3iɏ>h(~g&>neY#Du:wm)R:cn@:nS(|uFyT7U 7HyNjJxe#̯%䱽<S_|#W^> e:umCfV^/go5FXx1zluyyN:u(q"e.cj~>|oDLEszAJU!Mޗ4ǒm>=gyI=Qt[Ii-[oqJ%P+ &{l۾/kѽOB,p88pE7@QfW:\m;+drUe̮*Z*D"+^]ّm_RB̎RɩZ [HD^yS?VM.R niA8j0鷳CQjPKKsPL79ZnJ40{4/'Ium;`,pfGIqmٝ5eAiNtۣFuߞnX_l4_=^-/.\GqB|%_v j5/%GѿS[ByGNVs?[!=h t%sAZ@0t`wQC\JDSܸ*%*=a[\7nנ95Ɩs<&7 KJᙗ/}򛙊}E|ܗ^:I`Ttރy1Wŭp"Y"ҞQ 1Qyȋyzȓ ੌ>n|u_F *a԰:5z`t;7 ^~TFEzV(ڝv,'- 17gtaeXjyj)E&_0vdѻ~[_*Ȇk]4SS>N6&b "e2̇sm<姙f(zRsK{DFY뀓F j3nnx žbπa00,"8 ji;r*<e =I["WS0I ڕJ%Hh j)! 5!4-YH)nĜ7t-Rp=M#3g2z2ޣRXy0K{wɀGId7bΥzѰaU>gGDJrD4Gr,42,ŘU&K$/.'DuL#?LCS&ZZ\:Ҡ)- _nh`$cCj?Z2o mt&/ }}a)̰츻UkQfz(?_/|SRY86E?VVFHIiddjZeekv|ww}xxynowﴉ»ɼšĞʦʬȬ˧̭ʭѹԺҺջӻҼշָgbtRNS@f IDATxڅkE4B'l|$pHV2"P"BWSLan[j+ѡJf}߻O⾈>۽y<.u? BP:B!)nZ N5[)H#bXG;@Lwc1툹TP z.^&:>݊ox"Ng28x&;^T*Ie@op0@4MTT:k p,յ;N'@/Π0h`NH`@ ,ݺ2T:Oa m{z=۟hkkn 28lis(܆ fᲹɹmS]3.mhkH YŌ6Ā&MԶ.КN8O777˹i++6` bAFBV_cl<X1RfsaxJ:*S+[9+>;k<\YD9y?{t8`Q 4\?.k\T~TmƘ"jm]̵ޘl kT17um3yѕg`HY[Sx,<ܢW 9v-Hyo%碄9‚Xq|wb1_j +Ȉ=vt!sO06љ B-FRg?Wѹ>mԿ<Û|8 62{n؟="`*o2׳ed-ґ0m]khl.{ "[!=SđdnS!=5z ,#_#W}_jpQ0+ 1 6Es*IOJ:RNnF;a} 9ѱϮҶ^7 "x^W5{+_HȪPX1(Ѐ=(3DeuAB T,rIyO#ϷS"F\t FfCxo˷EE[rY53ڍiC3ϗn4a1iI|1M$P -sOL?#>? !@A KcQ%#OM4hRg%J1v}6eh61|%L֒}uPփ{kjazBz#[ %^@e}=X5Uޚ66 7!`R³@J)tC xJ8 6Jq;^0/]q$Fn&q ߞ9IENDB`PK [&4'[h *content/browser/pageBlocking/doNotLoad.pngUT 0žCCUxPNG  IHDRh)"PLTE#hwcr'`p(aq"cx)br!fu"gv*eobq$hx&iyo}'jzm*ip~(k{ n+j)l|"o*m} r#p"r.l,n~$q#s-o&r0n%t.p's/q*r(ty0r*t3qz(w1s,v*x4u5v1z(9z,f`4g7h86A7BE:F9YDGEFKIpJHqSrnOYg~{]˂|b|ĉŠyҡ՚ƠƔѲʤѪШ˗ߕګїܺɱجٽ˾̤ԱկθչֻڽQ<tRNS@fIDATxڕV\Eңw۽˻dvM|s^PJc[)G 6rŽ]*]JE?ȵW=kP)G*EZ%B={yywx ξ7;|ߙH̴ܴZ?7=#hE+f_j=x5|_bV&BRx oPam_>`_X/~$~'|={W@&>2 X/\omwm{&Ͼ;\RP*RqkR*!XK~7V*~+Ry,>e$oRP:n@{oqpkP*c7Py/CGў?XrP ~}XQD7l{M?gp~7bcSl{RŁ3hF1"DΣ)O!ɅI 9BP!2$PSWm.,λW䶽 >ӻfŲ+ @F y\dF2AHC윒QJ@q#GNC4"'"%O{ꀞ@#>eu9؜ 9x(\PƙR(`KAsl"5# PW槮SHԒWqt|HQguKztTu(wm(_ b*qã&>ʫae!u@gL{rn:WS~aG3 5u2;W,k.>`NpnUvͩq)LXw"њJSw-\If1|g.痯8׷pNt3Wvq1E'&\1`pykgE:^ae#<ԣ''`MwGD[gzdgauFQ&1c&aJ- NFpU㞪>K|{S1:+ 7e@07ƴ j;\ c#5d$\GQв_&N[Ǥq]w{Y o;tHݛ_.-6@*k/(;V (r2A'~# @ 2. 6F< ¿tZ!T63$Т; <:Gk#/_7#3 1q1D6) $W d"2% 좠; 4 IvY: W%^]h \A ;XCZ g""g)0(C$5BFS  +ddZBW1ba{ |?=9#!,zH[ȰC~C"JHqÅT2j̘Ǐ CHRb(SQ"?0 Wfy(Р`;9bi֐jP:B=j\z=\\5WeoBԓQP_[E+f.6="zpf͛h9S[(B5I+JEZ.2uAtСM$jPG i)mU5@*OcL;2Z^+P*kaDVgO" U(ECXϾbjժV?Vt-V `r)4=-q{]/3B;XÎ8$ (ߊ,b?0C";f3?/|A ЂZ+VMW]-jX`G͓UdE-Vpg՘W@q1s8 r`vI>|`$р aG QH}l2э45  ZC,F8`aF?7aB>l#0gzJ^!hCK$ LH_}٤tTO!ߴx+37 b?8@_wI\(EtǶj9%ch&ZvZ2hzqS &3A ODuEKs#P"|ȖH'1OOM5*muƓo\p-l`bSJd"ES@#7J_~_=gW;x}rZ`OuZqa`L v:8X[rt:Dp4G H#D@ӵwWkܱwFD)A+knngO_Q'` rnl ;xZ@hH ztyw|`V+ap 9O׿rg)pO-\;Aq><|P55?E^xSxwi.'Y'_~z$^CjhE+`O/3H FOz;Ogd"8]p3#O $_pF _$r ,wY  ;zkwwtw(&' ;p Jq\p K@ <؃>@X 3p0u|* = RȃP؃'( m-N1&*p 8(؄hjlW sXuL( P.Pf؆lMPPPYpF w d f}~x؄ p(kF6zG.yQ؇. &oŅ0 `KP A˜zht Gutc (CV0TEFሹ8.`ȨʸXhHP.`Tב̨R(I@) P. q2 w`ÕE=dp c2FIuzg  Pyg) 0 PЏ@uDgZ 9`  < (9Yyckm9zؔ.@Yr0fy z9 vP{f~O    9ÉOӠZmw0 ȔIYycYPU #Gֹ6ɜyp) B0BPعɝx5,q10 ~0rٟ PIu G)5@pyt6j@X^iOР`m .i뉡F0 s˨ *$J&z1ZkDsQ H10ϰU`G? FʌG:@%NʞTڤtIʀ| DT\ ^ 1p3me:Z:BG榞J3 {JL@zyj*  C?m1`1pW3oip - JکJ89:J` P? T*isw!tt jVG~ɚJ:-&, u6q{` -z?  Z0&а?` X{rE30CPƀ ; Sz+ʱ +J=F`pP $P<:0V{XZX a0;ʱ_˵\˱ʱV 80 X*HK1n[{^Euc@gj+?ж??0}y;8N`OP p +S`-X*fx9{)8+` +;{J [;份[ V)^g1p+ ڋ`8ˌ0kVoYoyIkQZyp\ п8@[͐; {_ ,ol~` #|kj  /|V/ 0_ z`N>l@Zf"LŇ (,QCjlC^Q 0`FP&0&], m]5` 0F D = o{6 1sdK  }Һ`l.]D n3 )= mBmD|sPL s0TV}E z=e0/ ߐUo ? C *}ڥm/CM }0&a, T]9\Pը}}>}E)\`ɝ= \<0tۼwm0D]ܻmM F ѭmm}/ -Ұ~V00`0%%,% @ 2N  R0l' )DF 8pс9 `ۄ6VP  M(>]E3N(ȰȰ&>* d> 㝠E piCT,+P n6 0sDr~0^ 2C掾կ2.Լ'R.6 P3"!❎ Ā.+@~(4ì԰ <޵@ P =sֽ>Fp^0þ^ D J ފ~{P ٹ ^!®﹞ ` \\[ \ $CB^ `pl #E-¾%H?} Yp)6-Ѣh VO?D FS N N?qO//M^̣!p= հ  ~P " #N ❟ PO~0 ?| P" " ?O"^wߧfDPz~V(]9hP   >|H .T·N$HIăd:ub>.CLD!#J"+QƝ Qʐ! :Q Ċrapׄ~LR6D|5ǹ(j۩:ʢIX= PG&̏)8Ρ"Cˌ~h=F:0ӦN6zɼl _FX/rɔ&STА2c5Q: ذQ"o"v&8 x`}Nq.Ӯ2qx蠣JLk=D-X^CAiY-^.NPFR b,l2V!=#; ˺sZ|:@OD1w왑i[FTEGD~ ”DXzX,ʤ)MB CDU JcuVY;A3F\dGxd fIra FԈ;.WuTBHq?:1Vz W]wFFvE!a=em؁icLR0IRn6q3;5D[TQc^9:9a[ff`W)jYem2 '101in8cq!=Pԑ%h8 lpl Bf]~ef16 `fCZؖ:掩в!` EV4LAaF B}tҙ93[o "$o= ` A +(K~$C<!lf!}{e|Yg]]vHB xxXN+^()oKլ@%S!pOa_ѧWqkfE#\ fLYKK̶5J C@*"IHΐ@'= `3;ïEGXm@n@NFqg$.;C}x!y+ /`! 7|AhCqٙG8 Ȍ>KP 04G@d"GCwXA>hP cp qyR aʀ@80.l@Z::!S5CIE>,  / $=&(eR\qh@W(-4S*X2@!"qPsl@Am#}hHKF;E&A魠X<9u&!*nKF'#OLͼH)laaHG&@pMb{Px!pIS$VѹNvHd+[OHeCA~6G!ՈI y@ A)nI*Hy)K>hk[fc xHJ @!\ Ҡ,jX)N7';Ԥ0M~u谻~ᯬ`N R@n3[Cf SV3&D]Nx$V1 m(ֽ⒆4xX0 Ih'qGSH]|nֺ}sUY/Fѐcmr1cpk0;!zHf&@Dm`!Utu"%2`o¶8'3 3qp9ѸoxJ0\9qhR_ SwsT[H ̝|!=߁~3fBRtPBR#(ѻn}Mu18HA |'N?+@-QjɜZ;|N5|u p8-F!XHƠ@8:BǓ'ZnpfA rah'P"9V Ơgd^jȃFwVl,@}d"~f4}=Z2B PPxi~Vocaiŷ or,8$! OCd;tKch_x;8:ݍ93@I!pqeHn2K1OMZ2(!^B, "HPA āk5 !%V:`\9up+C 8|qK h|HS@: F"!/:^7Ñ?54b/AKѣqd3k7o+$^yt5Tz?J( xp05Clq8085H, @ `/Pȁ{ 8%&F8>cC=\ /=X?(PDA63ͳ4/0S@nZىĭ ,|op+4P%P CP@x6z[7NqCi8 ;= /K' 4q!5?EtCjV[<2 7ؿ0 @MmDo'E0O[)3WxVl#AGFA^\(̀/QH1&4{ h*jF9M9G$Ɂ#U9 (|z!ZhGwr5v"Rg'@[p:ZXHoGxqVأhĩʡ.;Ʌ,I<=؃2 :Ht6I\H E$ŨIaū6ʨ"ȁ%XE;PK [&4|II-content/browser/pageBlocking/pageBlocking.cssUT 0žCCUxbody { background-color: white; } body, td { font-family: Arial, sans-serif; font-size: 10pt; } #maintable { width: 100%; } .sidepadding { width: 50%; } #blackborder { width: 706px; background: black; -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; padding-top: 5px; } #whitearea { width: 696px; background: white; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; margin: 0px 5px; } #shield { margin: 15px 5px; } #content { width: 542px; } h1 { font-size: 12pt; font-weight: bold; padding: 5px; } .warning { color: red; } .greybox { width: 542px; background: #e6ebee; -moz-border-radius: 8px; padding: 10px 0px; } .greybox p { margin: 15px 10px; } .url { color: #009900; } .providers { font-weight: bold; } #footer { width: 706px; height: 75px; background: url("chrome://browser/content/pageBlocking/rnd_bttm.gif"); } #buttons { margin-top: 34px; margin-left: 473px; } #buttons img:hover { cursor: pointer; } #continueBtn { margin-left: 2px; }PK [&4 L0content/browser/pageBlocking/ParentalControl.cssUT 0žCCUxwindow { background-color: white; margin-top:20px; } .blockbox { width:706px; background: black; -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; padding-top: 5px; } .whitearea { width: 696px; background: white; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; margin: 0px 5px; padding-bottom:15px; } .shield { padding-top:5px; } .maintitle { padding-top:25px; font-weight:bold; font-size:x-large; } .title, .blockedsitedesc { font-size:large; } .title, .adminoptionslink, .blockedsitedesc { padding-top:10px; } .blockedsitedesc { max-width:563px !important; } .adminoptionslink { padding-left:4px; } .adminoptionsbox { margin-top:15px; margin-left:20px; } .adminoptionsdesc { width:200px; } .admincredlbl { margin-left:50px; width:100px; text-align:right; padding-top:5px; } .admincredval { width:150px; } .persistbox { margin-left:155px; } .framebtm { -moz-box-pack:end; -moz-box-align:center; padding-right:10px; width:600px; height:75px; background: url("chrome://browser/content/pageBlocking/rnd_bttm_pc.gif"); } .btncancel, .btncontinue { -moz-appearance:none; margin-right:8px; } .btncancel { list-style-image: url("chrome://browser/content/pageBlocking/bt_back.png"); } .btncontinue { list-style-image: url("chrome://browser/content/pageBlocking/bt_allowaccess.png"); } .btncancel:hover { list-style-image: url("chrome://browser/content/pageBlocking/bt_back_ovr.png"); } .btncontinue:hover { list-style-image: url("chrome://browser/content/pageBlocking/bt_allowaccess_ovr.png"); } .btncancel:active { list-style-image: url("chrome://browser/content/pageBlocking/bt_back_pr.png"); } .btncontinue:active { list-style-image: url("chrome://browser/content/pageBlocking/bt_allowaccess_pr.png"); } .btncontinue[disabled="true"] { list-style-image: url(""); } PK [&4l&&/content/browser/pageBlocking/ParentalControl.jsUT 0žCCUx// pageBlocking.js // CONSTANTS const DEBUG = true; // GLOBALS var gProfileName; var gBlockedSite; var gBundle; var gProfileMgr; var gParentalCtrlSvc; var debug; var promptService; if (!DEBUG) { debug = function(msg) {}; } else { debug = function(msg) { dump("~~~ pageBlocking.js: " + msg + "\n"); }; } /* ***************************************************************** * Function: Init * Arguments: None * Return: None * Description: Performs initialization code for startup routine * Author: Ryan Fransen ***************************************************************** */ function Init() { gBundle = document.getElementById("pageBlockingBundle"); var argsArray = getArgsArray(); gBlockedSite = unescape(argsArray['hostname']); try { gProfileMgr = Components.classes["@mozilla.org/toolkit/profile-service;1"] .getService(Components.interfaces.nsIToolkitProfileService); gParentalCtrlSvc = Components.classes["@mozilla.org/browser/parentalcontrols-service;1"] .getService(Components.interfaces.nsIParentalControlsService); } catch(e) { debug("Failed creating Provile Manager service. " + e.message); try { PopulateTextFields(); document.getElementById("adminOptionsLink").hidden = true; document.getElementById("blockedsite.buttons.continue").hidden = true; } catch(e) {debug(e.message);} return; } try { promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); } catch(e) { debug("Failed creating Prompt Service. " + e.message); try { PopulateTextFields(); } catch(e) {debug(e.message);} return; } gProfileName = getcurrentProfileName() try { PopulateTextFields(); } catch(e) {debug(e.message);} PopulateAdminNamesPopup(); } /* ***************************************************************** * Function: getcurrentProfileName * Arguments: None * Return: string * Description: Returns the name (displayName) of the currently * logged-in profile. * Author: Ryan Fransen ***************************************************************** */ function getcurrentProfileName() { try { var currentProfile = gProfileMgr.getProfileByName(gProfileMgr.selectedProfileName); if (currentProfile) { currentProfile.QueryInterface(Components.interfaces.nsIToolkitProfile); return currentProfile.displayName; } else { return ""; } } catch(e) { this.debug("getcurrentProfileName failed: " + e.message ); return ""; } } /* ***************************************************************** * Function: getArgsArray * Arguments: None * Return: Array * Description: Returns an array of the querystring paramaters * and the associated values * Author: Ryan Fransen ***************************************************************** */ function getArgsArray() { var qInd = document.location.href.indexOf('?'); var args = document.location.href.substring(qInd+1); var argsList = args.split("&"); var argsArray = new Array(); for (var i = 0; i < argsList.length; i++) { var argPair = argsList[i].split('='); argsArray[argPair[0]] = argPair[1]; } return argsArray; } /* ***************************************************************** * Function: PopulateTextFields * Arguments: None * Return: None * Description: Populates the text in the page with fields from * the .properties file via the xul string bundle. * Author: Ryan Fransen ***************************************************************** */ function PopulateTextFields() { var blockedSite = gBlockedSite; if (blockedSite.length > 60) { blockedSite = blockedSite.substring(0,59)+".."; } var btnContinueText = gBundle.getString("blockedsite.buttons.continue"); var btnBackText = gBundle.getString("blockedsite.buttons.cancel"); document.getElementById("blockedsite.title").value = unescape(gBundle.getString("blockedsite.title")); document.getElementById("blockedsite.description").appendChild(document.createTextNode(unescape(gBundle.getFormattedString("blockedsite.description", [blockedSite, btnBackText])))); document.getElementById("blockedsite.adminoptions.label").value = unescape(gBundle.getString("blockedsite.adminoptions.label")); document.getElementById("blockedsite.adminoptions.description").appendChild(document.createTextNode(unescape(gBundle.getFormattedString("blockedsite.adminoptions.description", [gProfileName, gBlockedSite, btnContinueText])))); document.getElementById("blockedsite.adminoptions.name.label").value = unescape(gBundle.getString("blockedsite.adminoptions.name.label")); document.getElementById("blockedsite.adminoptions.password.label").value = unescape(gBundle.getString("blockedsite.adminoptions.password.label")); document.getElementById("blockedsite.adminoptions.persistbox.label").label = unescape(gBundle.getFormattedString("blockedsite.adminoptions.persistbox.label", [gProfileName])); } /* ***************************************************************** * Function: PopulateAdminNamesPopup * Arguments: None * Return: None * Description: Populates the admin names popup with all of the * registered browser admin profile names. * Author: Ryan Fransen ***************************************************************** */ function PopulateAdminNamesPopup() { debug('PopulateAdminNamesPopup() start'); var popup = document.getElementById("adminNamesPopup"); try { var profiles = gProfileMgr.profiles; } catch(e) { debug("getProfiles failed" + e.message ); } while (profiles.hasMoreElements()) { var profile = profiles.getNext().QueryInterface(Components.interfaces.nsIToolkitProfile); if (profile.isAdmin) { var item = document.createElement('menuitem'); item.setAttribute("class", ""); item.setAttribute('label', profile.displayName); item.setAttribute('id', profile.name); item.setAttribute('value', profile.name); popup.appendChild(item); } } // Select the first entry in the list var list = document.getElementById("admin-names-text"); list.selectedItem = list.firstChild.childNodes[0]; debug('PopulateAdminNamesPopup() complete'); } /* ***************************************************************** * Function: Continue * Arguments: None * Return: None * Description: Event Handler for the OnClick event of the 'continue' * button. Attempts to authorize the aupplied credentials and * if successful will go ahead and load the blocked page. * Author: Ryan Fransen ***************************************************************** */ function Continue() { var adminctl = document.getElementById("admin-names-text").selectedItem; var admin; var adminfriendly; if (adminctl) { admin = adminctl.getAttribute('value'); adminfriendly = adminctl.getAttribute('label'); } var password = document.getElementById("adminPassword").value; if (!password) { password = ""; } if (admin) { // Always allow this site? if (document.getElementById("blockedsite.adminoptions.persistbox.label").checked) { // Always allow this profile access to this site. try { dump('AAM: allow site permanently\n'); gParentalCtrlSvc.adminAddAllowedSite(gBlockedSite, admin, password, false); } catch(e) { dump('AAM: allow site for this session\n'); // Fail gracefully, for retry debug("Exeption during site pref configuration. " + e.message); // Inform the user to try again promptService.alert(null, gBundle.getString("blockedsite.authentication.failure.title"), gBundle.getString("blockedsite.authentication.failure.message")); return; } } else { // Only allow this change for this session try { gParentalCtrlSvc.adminAddAllowedSite(gBlockedSite, admin, password, true); } catch(e) { // Fail gracefully, for retry debug("Exeption during site pref configuration. " + e.message); promptService.alert(null, gBundle.getString("blockedsite.authentication.failure.title"), gBundle.getString("blockedsite.authentication.failure.message")); return; } } // Reload site document.location.href = gBlockedSite; } else { // Not sure what to do here. We should never get here... To be here means that // there is no item selected in the admins select box. debug("Unable to determine admin from the list select box"); } } /* ***************************************************************** * Function: Cancel * Arguments: None * Return: None * Description: Event handler for the OnClick event of the 'Cancel' * button. auses the browser to go back one page in history. * Author: Ryan Fransen ***************************************************************** */ function Cancel() { history.go(-1); } /* ***************************************************************** * Function: ToggleAdminOptionsBox * Arguments: None * Return: None * Description: Toggles the visibility of the admin options * Author: Ryan Fransen ***************************************************************** */ function ToggleAdminOptionsBox() { var adminOptionsBox = document.getElementById("adminOptionsBox"); var adminOptionsLinkImg = document.getElementById("adminOptionsLinkImg"); if (adminOptionsBox.hidden) { adminOptionsBox.hidden = false; adminOptionsLinkImg.src = "chrome://browser/content/pageBlocking/up.png"; } else { adminOptionsBox.hidden = true; adminOptionsLinkImg.src = "chrome://browser/content/pageBlocking/down.png"; } document.getElementById("blockedsite.buttons.continue").disabled = adminOptionsBox.hidden; } PK [&49#content/browser/pageBlocking/up.pngUT 0žCCUxPNG  IHDRY=gAMA a@IDAT8O;KPӿ?]pXK'B,5`qzH uOx_O.Pz>߽yeYXp4[#0w6xN% 2dr14@Xߦ^.WݣN?+Rr#FNq ,Dnx#+u҃t=>jC`*5blI%%%+|8\ڊTW%3 p& ԦQQ"倔若^_N}z?0iŴlGIENDB`PK [&4e%content/browser/pageBlocking/down.pngUT 0žCCUxPNG  IHDRY=gAMA aJIDAT8OK@]Q K'SqրFT fK uh8½wwo(`<{}y~Ȳ",F:v0"&8V=8z(=D2SL*(LUO:$qΊ*tjeD4^-j& D̨Ujmqzq~L{>Ǐڥ*8l}[Vt(Ҫ u:j (.XԽ4"z`+/"tڬ;5y5j#5 ݽ2+G $alp o Ŵ6IENDB`PK [&4(2l8888,content/browser/pageBlocking/rnd_bttm_pc.gifUT 0žCCUxGIF89aK"mrttMOPIUd#+Vg(&hx+ 1 GVH)vN_fy.6cj?Hq|js>2~ '.'0VZ[6\n3Skt*@BVg@,s&,-]n$|-6H!yhq8.vO_|~#"#&.<<=頟;5@]\] -,, ^dr}M@AAEFF#6@deeF@1115-n5!,K-*\ȰÇ#JHŋ3jȱǏ CIɓ(Afr௔0cʜI͛8sɳ_-[RIѣH*]ʴS!իXjʵׅDH׳hӪ]˶mvĎ Zݻx߿LÈ Z̸ǩBHLeʠ2k̹ϠCƁ3ӨQKWװc˞M6Isޝ[ (c|KN:uسkË_ҫ_~#˟߅]TϿ?>G$H &`> 6 Fa VHf!v!(`(Ɗ,ŋ0nŌ4Hƍ8F;?!DbaF6KzhD%TV@Xb\r`ɘD`g*lf p)'yigÞYL!'z 2ע 92d w&٩^*fhڬ a뭸ZŮZ 'o=g*gݲtlvD+F;^*޷[ϸb!+/ //,K`'\ 70 0PAWL10g10&t p( ,,48猳<̳@ 4 Dm/H'/ 4cD=%TWm5%;d%\siKôMo"*mx睷#|y>`8 :&(G.@ӌ x馞5*_*zdꪫnΫ;,p%{2-r˭&obfH} G02*ǿ\2>,tF ȴPjQմu laKʶlsF{8=nOK\C90fHx2)P%0dJGɜtiVǺY.WUlC押('w2zgocD&׿< h@%PTcDP 6.alPnw#6'Da W! 0dD2Iժ*ә6@%:4f +o~'y(W xJg۩=m'< ^B5T`&:6j iF)U)[ҩj2M-5mg)ӸuЃBU@QExT`&pC1w̨2Vtr`n[&J!+hhZj!Y,vZVvѮbkw_Ǎf(:v#X>&菁 /T !C\d#QIIE%3(p2H(DJ&I*ʱL-qK9ǿq'L.ΘO &0ۗ,2xCS^wj]+[2H:;=Xm~Wjݳx+`%4E,X|5_}d#KA̲ 41zhGKڝjH-VZIlkk4j HpDqKԥH2KlF8Ȟaz^GXv4_]0frQDѬu9rowg|u ܳgZ^BݯDCvm!}1Ic!imzftIA-ꕲ|b+[wAZwuv-&W*\aS*ι!׍^0.鰜e-W4Lr_nӭ" ge\nY; wa6pb.=am^чAXG'CW,+ŧiJWRLcBӎ{L]N%\O(aHVֻ~Qb;C0ʯ:zlo{WN_ := C`v&=a~F'A{X>/3n~x"Ӻ%uKjt5AbS:S[@ (rkCv\/k83l7gl p `l@` z(l&t!{{8tmN7|w|:x=Ѓ=|nu}3<o}<e EPe/fho'>~gp> ~pg3gRZ@jS[$[T!r+gB58h81'sl5z M  l`p)@ `{V6mcutK{t$NGf8Pnauu[un;]gvb_kf`hvjwlv wq'wfwwv{a}W""Ib"#x$1Jg%%KOywKK,8 T'4U77]  q@ B)@ q Xx,(-@* mFtJ{۶n;x|>=.ْ.f;CHdyUXuoQHhVhWpf>Z~~_p7~axc3WZh8@pqk@mpxSrHAfcAkSr&yHB|؇p\,BI\(]bЈ) Y)2  ieFw$fw(ƒ+钠.rUQ6Woշg̳L}}#CoVxHCQŔ]~P9TYdqf4@^Ɇajpj G[iik \z8H}1lNe HUPqRR)Blp ٟa$f8Nmə烮|DhuX_dn4Qqxv(w(ЌΈw5ӘHhט(IhxIb.fJ(y騎JclKyyK,7z|z6TU0e`*ɘh aAi =(zfڧ}maF6n8I}}}ݧXyhEiWh~秅~)`y#X?j4. $cIv[J r6SYT(k/xYLb )ЬڬBqi  w^5hݦ`w{~~1QwOh@YPB9UʅN UYs˩Pê3q rZSqõo, 0'XYt Ȫ) Z6[Z䀉 tI׆itZ -)[g_ V$ZG&vo`* !.T04HkH6xԍ:#pg;qBSq4rȱfY6sc7 H>&U:WJl0TJ Q2 p;kкUJ/8'˧0͢WW.}G[z> iKiY 򇜥j廕JZ`q;slJʿpl-L4 䠹c ,u@  ,s-UF"̴), 'Ka|YF[˵_ jg'pwtv/ʶ6pv2B##FbzbCҷ+J[7`B&Ij&;&yNڸBf+*kIl3ZΛ y, έ + yPcp)캰ˑ{`f{¾. D079}9Ó8Z=øh)iӔ!ދ9ivOI#1qW,:S#6>& HTCbf<4GkƓS"Xp \\P` $: `,UZm$촡 j},ЀD@ n5}FX ~C !=u*}iYvY2 ]T|ҩ: KpAIAu(Ve<*wyjD𦯯g;Ñ?|YxپyY >R3C(۪JAa0}>[dCMz\x69`) 0 A쥰p  L03@L p @mA1  ޙr!`nuIy sv0v*=>~mCpG 9N<4驭e)^꧎ A_,TrNgl9Od0 0 <0ݤP pPԐJwpssƠ< Vh= \/x`A\o 0nUl)r=ޮN Mn_'j_ɡ,ʣһ7# ^ܸq\ʅ 7o2e26ԕ"WH} 0Ad0ӣLY7ϏӒϭ ߊ&o3tA#rD0`)ZHhCJ4RT1$ZLcteFk5qG5HG rȂ4r Rr&."2#,AHRK$^r&2˔@'4qI͠4M`R*jj*m4P35X[{f6rmߎNP^Ecq=(CR.yd c08f{.c돿 GA w_~`y 0g=!dD#D)^bcxc;c?q!K&``etecRkffsֹ!#g]zhh>f:z<@z;jcl0lv`m^;{ n[# bF @`r.2|s:sAbtK7S$[wc=j}wX_+wڰ-]yWa!]Crh"jV X6j\ϥ7eOh!'ܕa88 y|gFfP9܁@ 3l@' ;.∁,gX` *m`'6x` h A(`$tLzd2(HS4H$'eQNASK IJ/iLfbc'p*b)O{⣟@ PRKE1e{K_IRT4$Sd*Ca*3RU9BzUT3+ZŦ6#^z=8 b@>׸#K\A{Ѐ.Xd6)9E '?Ѱ ~qyŻ~ rg/4c)00Q @& ޸aTAo@txqTcKQȣ(攊VDRAx-U]&@ђGF%l,z8q QTiNԬb'[׾66*i6nCޜ72pKd,4q^"Qns[r'ptc&:4G`vkFnNwYk~Ɩp@: ݀(DaZ\ O?YnahԖ18:1Dy X)Kє{PZ,S gV:ʚ٘%Z,κ%i:343+zHA+d#z""&G8O*)bv9T{v.q*oP")tB X=1E1뱴1==YE\L&2Ƒ2_*+˲ɹ.;/KF!3f'@gT4{679<@[:?`LG3@+"vH )`y"(8c;Q)| |R¼{C'BR5Ze{Rz!<.4()T1(IBX=C̏C7"D > IDx#>FlġZk>胾J <@:\ʥ,DPcc8rc ˁ#i#. K%Y [K?S9 G+%I9ªD,[@c, :UZ%Pب@0  !@+ Xt$@`"؃=P9`@b""@h8#8 'tÎZq8Nq0^Kɳo(!wB6!w[_w 'rn@DB6\I<6I$rBɓ[&z{DIMʠ$ʢDʣdJmBxPBp P PT1U\EV !J)2#;Q QKlK39LG?KM)D\@RYSq@dXo,ϊ  r&l4I(I@M̆(P"0:8Cd=0! (B5ix/!7h8>}1̏d'4(p*DC-A}OS=[0 Pr~`"ACIJD%P#}3CСTPlPAfmzjAiVikkmVnV}ЇSWp W=(Ws-WYLLE\l]()`Fa$F9F~e23f<3[ijkF9c n,$3= 0]R%m25S3$m ٌPx`]:Yhfx=R]TE51/JH?!<[=hvjTN{.2Z:U= y!*8$0Iw]7_Pa-Pb7cMPTV] ܮq =ETu%"=(]2q+俺ѻKܔRP"RDSJRFԕ> Q8`Upi Y-I8k)#YYxE6X((=iЮ!Z'm9=w4sUuE${W]|2zW|FW~WeX|.؃EU؅e؆}%;(݊bH؃:hW4^2:hd"t&iXG]`!l4bѻdOTXH<&eiضf ݤe(#eaca.a<Ma.\T1} ѺἹa\aX!]$@ʤ4(޹O„zĤ]sL.RZL,ߍ2|XW`u~m~m~ |`8YfD6] tZn画x1jaOZ44;njoCA[V%ּfdkk%k ]Sk}u$kk+;4$l $L*!b´F~@E%-l\l1^ЂQpՆ4kAoІ ͛U0"/ry` vȆk>zR8dߗJU'f6 `_C/\(SSi^3I;/e4$*soD&`("6fBdvonihfllnVq^U/XDu=gZtWuV'W+WyWcgͱuƂ]~n6lF;5otw!f~¡T%ă %44%oX0 <=wy/h0xfItcx3f1:PB e9F3"y戀}6c 39*ڌSD*"<3Nʆ8 )P`@[Nc3фa,UNb P\ d*۸:;Ҷ,:Sb<ւ0ubםwg^{..N;/5kRC |0z0kl0s11qqk{1g<2%r)/-[b 1ǜ4+q3K3;sA 4AEPC =DUQF}G%Y]JY.IM8PA9D%mC=wu9A6K"<K%"j+K{K>9;e>I$Ih@t~ k /;֠+># ;\la<<Q`1gl2cL;, 5ی=mA%LKԴAuGSS}ZR׾@'99Sv6GamA=٭v#;!qnaC(Z.*p"[aNs#CNtaLwku}Z 11BR(E QN"/E1Bˆ#F:#)I4T9Ө)Kj48g{оI/Wzj촚YϊVZ^BC3IUKk=JT+y3AW5C [0^i)FӁ=H~ra=?^G4bg>(&5U BNѯWj5)yJV2d`=ۊͼMޛ8, U{2g<ј9!85S־6lwx# a!'mL~X>?*--oֵ֮С|ӶU"nsFb,\56׹ (AQ.ƱݍZ0(-M3qWf8Vf0 lV4/-hhэأIHSoXQma,޴^lU-D jQjZ?_=d0k=t-@N\"R^ B2QtC a?}|YUmhLZp oz=[;w%o}-WmC /35O rx^?\"3ş=ր:nZ Ak[V)<\HWEQUIa\h |x!\\t8tI4X?B9Y^!fC7X@ <;<*xC a! ah֡!o\` <tŠU\  "("4#>"$F$Nb#"!& !_ɕ"a,8C"l$i*"++m"-֢-".bP.܃.0#1*@d2.#363?BDC=5^#6f6.DC|#3T6#99j#.07h;#[mjކ+k;シ , 8<7[l'gO+|l>D/4H3PKuTgm0dg[[۸'>Inx:o: +eSAd0qSi 9VQNVl慼 C(sCzg<@yӞ"Q>HD~"DEYB0 q P(E-Jcd$;я|4:^HG(9iJRR.LӚ)79N🜬`:MO~B Nzb4RJY00`KÄ́q%l 'w9=▸-[ӊ\u9 svCjt0Vֹ.[EН6;8W0oysĢ=z^2 |2ȷL}cܧ4;?mD8m<`QF< 'CRNLcV)Vn敩,g9ZJLNoK]P$td&3Z̤VyoI3\,6Mu_8W74~4b6?PԶz`m{mqtQ{  o ,؂-op|ɇ| p8v#vb7oTKgaؗ}piop'p':gtp D pgDqD ʕqq q5Eyr"rBrer(r,F-FEGvds7ssO^U%XBHftAg_tme twmrIn% b+ P ( P|)u6dhG}m}8Lpx%w3~L'c:' ~bxGbW0gN0'y7y(y73yl Hz4%GfZzh6IX(@Fg"xg0r )[ ؊0$y =naewvXiHX6ySu0Hjw;c:d8kh>X"5gE6yINg{'PI0Uİ Z\𥊙4H* Аu膋hYSFpsZ5i9pɓ隯p酳IKd\ٛo8 s8v@Fe]/^pĜRHGlPYUb%i&20 B&E_pP@R:)d**[4;`av}rZ5xJ-0EvJWtdj= W P_eybDj?mMtU#$ ,۸,{ 5[,%tuӗa? 'D[F{H˴{j,F%I%סW H':xڢvXiy6\=^ٶ`y 8zrtiY?Wr·s@`)3 , 0[,pnnֹ i}C[wZLt'@_8jzhXm([F$gr&]*{rsD$G";Q<װHHؙEB&y˱Um0 dp0ŗ K [ܾYS+o{6趹;o:qzHkH˴|FPИw8M5MEYYkggKlוjo۩f)G 5ki5k۱ d#@T<Ŷ|ŋ œW|Ŷ@@_ ph,ࠃ6aS@;6IvZzxzF` ujKwFUZ;Jxb;WIi[Ok{l_3Lݯӈhȶ<Ϗ ɑ M&O{WF8ߜKB YmGr y7@٧ ` . pPy:: 脞 ɰ(<`nmA^$ 6.R&g観q]C~ }JFvpW_ ̮BqhkmZg +0׃ Á }H=;gc'M繉wp n膾( yi0i pP  (1nQn 4 6^ u5orz֪ʂ o@1p O` M 7@ byWŐ ˰  h )<)_7?-DNA{@`n0v@> JO=JL_QT_݌`Neo&kElkOg\r?u祜wWE AV*,Ұ\LQ$O<`}{Ϗ}$o3n(ӛrQ%MeN+PĝXڱ%hS+jP*]rAlYڠb}Drl j  P>D ϊ ) ۘR@+T&HWzGXbdX60vP ײVgn%4b`u.tKrA-q0g^< #vBNb+\ d +%t@gD;a}C QC + ``ĈĩaxE,f>:.poJp8}s(X q~!reچ,#(:]dthGaee^BSvT֧IxО0 h,9 5ŒO*#\INve|٫Kc=#0ZВH@|ƀ$iB2P\F7!g93h4G͙N;sx:N=SzG)z4 -T"С%4[AP [df P7~7܀:k u $imA rh/Q5d1 *Wbil`c{T%GrT`) OEUF!yZHn!_$A^R™eIkb39 F] .xY^6MNt>/ 5X !&EL, 7c#;NT! mo}[W%nqPT 'AjQfWnw]W.Dc[pd"AHk_@*GJZ_],-DLR+;ԑʬP1U Lc 5VEf(@ ``FÑf.hJAz09+Z1wnkr ^`_URSe,kǖKl-YnVzDL8B_-iGkZaemk]˱zld7!Hqt=iPZԣ&u?8utXum}k\Z׻u}k[7 @61X[h޸A%qmL`7*xDQR(4B JEYx+`mFɺ,  E@\ߢT<)#D" Or"`D&3%@ˠY@hPS5Yq~egb7,:S:Jha 7N1=2-] }e}Ty i(q_8- n1O+M~bk/G0aASsy5:svx?B'~M=:ctDF y~a @@,@<@L@\@4_ȃy@@ AA,A<Юb+ixXX7fa""p@hz7. O!T /$rPף؃X zPS `a$0))T[ D088;ĶvdG‚>>#99þ: ھ> ?+ES4?.ZEVT.~2[*c@` FaF4&VlDAiFjFil0b1 { $2\HxGHBn26%̴hy~dK8*ЊBY(dV2ԫ$j(*TAU<lȁ lhH+DIr(؀N`>3&،BT k L MDN˳OPQS4?t̻FJuJ K˱<"_?$FlKD@S@d@-bXfFkKKi4l(Ibwȅxpt9`Ax]y|8%LxP\G~!Z hHG7p+-!CH1%+7$1l෬ɬ6 ۜN0P.0I>z3n깥ħʩJUlUzX\Z[\OM4@SЇ!ء+@4fH8P @HP\Нp' НP7D5HF'ڀhm$лX 00`!nL1(Ń)Mn!)@0HXR+`1DS#/+͂0=$LmoPHx4oij|H0ͤj`C K ,w@x[ 8& $T U]U* 9MP? j #$㢹)SBTڡ6PL V]UCNfiANΣO8릥L<>cOW.ݒOW|~OtQ@(Pu\m Wu PW Xm@!WW HP'X=QDD{ lA0@9Q3I$R0(}Y1S*UYQ#]I019]RIR0`/E*d[ sXXTue\CЁC2aE(0~ ZhZՁ71$u膋ʭu[ %!uPW1l݊L}ɑixYriVۭ^arD",Jij%J;JJJsĦԾo BުJD7ްޯd$KX UQ!+'PYET_Q @5XXMXYd aJtlS3ӪY(ҚZҢ@%Z঍]Z`͂1 @Ɲ8Lk #bH`q:8V`؅.(>b)ۆs-W\`x ?CJ:Uz+ܱ?Ɇ\[Β=`лU @Nl-dr3!x!hUk=^m-nmo]OqS,WҭBWuEEZt }P{_^_0_@U5Qp!%_Xe'uBY݉њa Z3Z,-қY٠6:au ڦFuSe$wfSFpl wS WVx6m@-C# `8\\~C[*)[ִ(Cгi0 8NK B8>V" )ˆD鬨+Ci+Z!ԨDIVmdoQMdseuO[DWP(pee eաU0k %`>XgQ݁b(`%>g*uZnpҮ`>&!ډonj}Hn*Fj4nf`Jau$Pu͙* f `|a%\0 H+z (;^oLz o Bj0!`h I4d3V,[^;k^JPdS^(^ ^'KXXW؝߷^Xe`p_ @ سF@hFWH1l Ȃ1x5ٚ]omqSbKeZla,F3  FS+ m-F;Md YC@lp8f[p tJtwKEdjS(n!3%f aaDnpxCNCĪ @rH(nHθ$f͈MWL$jȦKD J6ϦvgRNF\W|Tk;pQJh. Xm%f^dVfwE`x%?Xor ,@l!% R -R:6g>Y4 Q,!!oR,Rnƾg<@;LS&s`ZIh(c ؇7zzI}RUVHԤХMM"[%ZRR1hJrE-+Mo֭{YHl/ x&vppOmeJK>Vu.wgE~RO{-w8pQl}Fleњa;L},zl(t YoQ)dqSz70ΒpIJ[ UjUJ"cդ(=no2jH_,h „ 2l`rl&:t@#HFF,ir䔔*W%̘/]Ьi&MK:w'PJ(RB*kQjZrE+_BYjײm-ܸre{Z4/[di㇁ć3n1Ȓ'Srb, O 3 o@r#VӮmvmh9Jr/ }&D,1 9uG`@8 0֝v+`;i3(GyyM;ᑶ :`Cb>X0L΄SN=ERL"'1X5X8c89$Hy$I&v8pH9%gXyY%]z%a9f^4Q&mfC]fuy'y'}ΙYD$1r n:m#uC$AlP"!jB7Z)B3QE,=kTtvwޠ%`8o4A99O?#zh \ps+VD"t1:]R'euCd vvлn:RBiAA L#p>:AF*1 =J5y_'EoVb1 QrU07hns<`R3(*AJ9: ˸#G /hp 588,")I6 $&/i'BiP$,RUR2+c)Y@%.qA(T)L+2Le!-JjըHx* -FtQҀO*p)s Q-Z؂9-ܝ!#aЅ!}h, щJ'EF(B6%eRR@z)LGCP4rӝ P*ԡF=*Rj_2&TYRuȼ2gB3Dj8H_6Y);ȀΉ}d# `\אC8 M|pA*azڳL鞥UK̄@zA B!PŨE5zEơ)IM4Ms{:)p*\(H%'\>Q}nPU^YjMiVfcMf5ld(G88ҷeP7اpl"`xsBx( /  OU#'9Lf&>)SbT~b-f%+i)5fsKLcŮv*Ys٠q 0& As-s^FH81$2r OŪ$1)A;x!mh!JӢ0k] H,mt[v>p3]TrLBu 钺>1UW%pmxx9Ёf` =2 ~>v]dWB:kH!PJj@"4,B@ :&th~!ePhHT54SMUR=iQC/?l5x{B@sn!~e7'%q9쑓Nŧl(_ xUмrΣ[da Rj8z!;E>#&M,ʱtq_ ϸD-m,v]z1U:w8!p5A;na~; 9: p<'"/Gĸ<条yX$'C@ڦ?=0Rz]էҕznEb=sXڃ/}v{AwR G"aSֿ>onDG>/ux.A @??rwP! 36>  .0X-D fnBr }>_;PK [&4P7/content/browser/pageBlocking/bt_allowaccess.pngUT 0žCCUxPNG  IHDRa!gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxY{lSUu} tnGp 2M0aL (F (bB/&!ƠHPL| 0kXx6Sv_9s^^S8F GJB\t 2r3rY%h]_L}]/:7-DGPN_O/~<ՄO5L{70!lʠL&$P,Yln},zL"sq[`p8`Zettl6+ܲ|Kƕb]r=g$%qڵ6[|5!Ȱdg[`hl)*i(Z?ր;}Y+A8Π6 py ~>۬UT^e2`ӁZ`<^@o iG[;^< -~H[wEa!a*ǃtuv'X?Pbfk~o/~틟SGAz}OK(`[EIRsD`28I8 J(:{TCO`@_"$CdOxӉy#B)˟]Qڗ I p!C{&F[mQ;5G}.EFn=3Fqa~}e+J>ΛPh`}7A䅳u3faV@TPo/x jy@@sk#27QHER@FO;Vsg 6RZxuH7%:|)}GaK^GhDQ.g" aJSWDU܍ ;j5MW#pCʝp՗hX 8PHR17p<17 `(}HYS"BBYza= V 5Inϛq|{*< [e53%1MPhhSϵÏ1~ktɛsקCN\FkoDHz\Y(*͇-7|+GƝ!乊P &K6vGU t0n}t]4&Xi\h1z33h9 eߌHXx&>efi8bp/ N]FHGX,(6Dڂ%Ϗ|klÒ;YyrU|>{1Ұyd862 yrpDڜc;'^w;z;ҭvFn)tB>o$̋XX0q&`3OzžX#CMBR K OJ׌|lVfC3زx}o)jOLYYj)Az0!v  aTD:_ta۷i )ȼKJ1ssgQ5y6ud>orC7k`ό7M`IENDB`PK [&4R3content/browser/pageBlocking/bt_allowaccess_ovr.pngUT 0žCCUxPNG  IHDRa!gAMAOX2tEXtSoftwareAdobe ImageReadyqe<-IDATxYYlTetvL[h(c(FTp#6]x˨Z}>*oS$EWe:#+QmeܱJSH+s:kUv# q vؽ&/4Q$(z3DSpm< #M_>galԷ}pM.++Ur rh:RU.150vgM>7r9"׎wNJjJ"}jKM:<Ғ}› ND'Is"\Y8n}Ǒk$S{%}_v 7{΍`Yᱦ?%+5)\u~xOۇTL@9Vm %ҙr`t#B9\ .\6 gtN# @}[*˗.t:>H}h*c:r*>7u^GHHꦡ "FH :JXƽhMFC%1]9(][ܩQSHc'ݤ29gB2] }n6u<$zљGɶ53 7 | 95. " <5w0}5-UPn-ny޾xl60fOo¥~ ai?tx3^MP8y][%wӋt@5Ss{"e7 Iv\*u|QRFMd%k:lƵh3Fkm=hvI?`\U5T_"N6DgUZQa&oh$a1j_bNB p>X%+$mƅmM}H ɡ#,|ѫj81ޱOKTY{]nQ=wp3_وoثŮ>@KKvK>EQDp- &L?Eݏ|6q|%OxI7Kb5 ~qvl>o_/ON6I ^]zB095N`x( IENDB`PK [&4ߏ2content/browser/pageBlocking/bt_allowaccess_pr.pngUT 0žCCUxPNG  IHDRa!gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxYKlTUuΣtfV$Ԍ$!) !#D7vabu ܸ uhdcjb(MbKKtJQ=s;3)?8uj,GXI,XibG,o<>TR{Y]kS7yZ+:Ra3Ct~2X̴2 ;K^>Oӳs4FZ3BE9nZD^~=܇,!beȞ_\RTbfP\H ͥii%KfРWN$5vRrY53#?c=Qz]v@y)JӷUJA'CS# ~ߧRjz[bfq~kҙ $+2礁iؘ]p`?SyN>{YD,?Z hecpj[|Pǔ{i}O`v=A(:0s-q=tzWf<[P8%즽ijXz1 @ryWug}D3R PG kWT'(,zb H y&];r./_/.(]Q^z^SJrIw/;.6DwغJѰ!)LrF@;y7j{$a<}\ ޅ`ivSsBz!KozҮx: +#q/`03HDr|#tE ot1Q'{xǂo19_SA1зժYHXt$FG4IeHGz"!zoY:!D@$o:Ȑq;E; ="jZ!$aX'DrGN7"$~|‘?GTD)n@#c >:#9UBh}κl;;=aƲΔӶG@ß:˚#>ƛ@D0т6IENDB`PK [&4~xHyy(content/browser/pageBlocking/bt_back.pngUT 0žCCUxPNG  IHDR<"gAMAOX2tEXtSoftwareAdobe ImageReadyqe< IDATxXmlSU~zvunCVdCi900ŒK#(Q@ ?1cP$.FCѩQ0\ǘ89MJ{}߳ކ1Ӥ<9sA4\n!4 ,='027J}}P#ahш {nNf: T+g}m!=Ks. )Tj&\%ש!n4yl'm_)y&V_ ( 6֥>[wvmY {m 'gA 0bؓczS%3o k*D_~LVW`78AҽȎlʤhM>j>Ԟ2ٓ2޵XD"/j1**3yAMwJDyu],%xGBBD~O꙯q%LNLأpMy$}-OY{H]oi}8;LES&Mٙ\(Sd\*m"q‚eqxbwY}]ng/&cʼ@^waP cϖyDyH%qn)q@͚?Toߐm9l% O96}XIN]iL,?G"ߩb CXToqђuu> ]8$m(^qV_וe&(t"[̱J֡0?*b^7b7Iҟ&fee|\WwWB1?OeBmIENDB`PK [&4..,content/browser/pageBlocking/bt_back_ovr.pngUT 0žCCUxPNG  IHDR<"gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxX[lTERv{JCiqSRLmH McLD>j5JbO>H@I)A @ R6ztgy~9ә9|}\Rb! MB 0T'aЌ@&d*$oKp` Gv7nڸqpc)L2Fv"w1CE&X4FIVYriVEZve rhAi#*@ $ DS탻E86mSJ35JI$fcYI?A( Lf+ Bw)DI4F.h$Y=dSaH:ԌoeI㹐Mt)rhe&Cਮww]\?ÿG$ $4VY19cjH"yWC]ZvEb:0D}{xCשڔr 7vGs6샌MówJ|R dyRfXϗ)D84Zp?#gYG9fR*٪"T~j˹XPՕꓟ>S]8U~Y7XtU4'UәCOՇ(='P[$PX]0s__K8IMw⫔ބgFa4+ R:JaZU("Т(|t:¡PY*hJ?Aَy%;/>mSZe!X56"zV@(fNٮNQRD|aBzQ)<5M/p# !wZeIENDB`PK [&48*C**+content/browser/pageBlocking/bt_back_pr.pngUT 0žCCUxPNG  IHDR<"gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxܘIL]#-8Q?W*+YQ׸qFVݸth`Dc~AP@'ZzޛV ( =q=ܡr9U%#)-%z!z*}e`$n):-JH-J obߗ!Lf2(IY-ZI1 c&lm[Ϊh6`¾'i|DORLa2]|٩)cZ]XYh6JQZ(LcXfclx ,@%xXY͡B%?ZcV@KO/Q$_iljfa ytArS nazz,gj|'0'_H5,= 5<|7>?0!|`dXr2 gM:ګAoڏƮkH\=Q)[Vm'Rs(cS+&!me2]V^1 )Tun a}Vvh!W["yےVSk7{P>˪:T,!kI8d L6>GyzxиJՕ+ְdAƽ1YI-%m,г3a]9}vK 8'IENDB`PK [&4uucontent/browser/search.jsUT 0žCCUxvar search = { // Set this to false to disable debug output SEARCH_DEBUG : true, // Constants MAX_HISTORY_SIZE : 10, SEARCH_PLUGINS_FOLDER : "searchplugins", SEARCH_PROVIDER_RDF_FILE : "search-providers.rdf", SEARCH_HISTORY_FILE : "search-history.txt", SEARCH_TAG : "search:", // File open flags (from prio.h) PR_RDONLY : 1, PR_WRONLY : 2, PR_TRUNCATE : 4, // RDF Predicates SPUI_NS : "http://home.netscape.com/NC-spui#", RES_NAME : null, RES_ICON : null, RES_SRC : null, // Globals profileDir : null, ioService : null, prefService : null, RDFService : null, httpService : null, localRDFLoadObserver : null, remoteRDFLoadObserver : null, remoteRDFFetchURL : null, searchProviderList : new Array(), mRemoteLoadError : false, mRemoteLoadErrorCount : null, Init : function() { this.mRemoteLoadErrorCount = 10; this.mRemoteLoadError = false; this.debug('Init()'); // Get the user's profile directory if (!this.profileDir) { this.profileDir = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get("ProfD", Components.interfaces.nsILocalFile); } this.debug('profileDir: '+this.profileDir.path); // IO Service if (!this.ioService) { this.ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); } // Pref Service if (!this.prefService) { this.prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); } // RDF Service if (!this.RDFService) { this.RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"] .getService(Components.interfaces.nsIRDFService); } // HTTP Service if (!this.httpService) { this.httpService = Components.classes["@mozilla.org/network/protocol;1?name=http"] .getService(Components.interfaces.nsIHttpProtocolHandler); } // RDF Predicates this.RES_NAME = this.RDFService.GetResource(this.SPUI_NS+'name'); this.RES_ICON = this.RDFService.GetResource(this.SPUI_NS+'icon'); this.RES_SRC = this.RDFService.GetResource(this.SPUI_NS+'src'); // Local RDF Load Observer // ... watches loading of the *local* search-providers.rdf file if (!this.localRDFLoadObserver) { this.debug(' instanciating local RDF load observer'); this.localRDFLoadObserver = { onBeginLoad : function(sink){}, onInterrupt : function(sink){}, onResume : function(sink){}, onError : function(sink,status,msg){}, onEndLoad : function(sink) { this.debug('onEndLoad()'); // Load datasource sink.removeXMLSinkObserver(this); sink.QueryInterface(Components.interfaces.nsIRDFDataSource); this.debug(' loaded local datasource: '+sink.URI); // Parse the datasource this.parent.ParseDataSource(sink); // Get the current search provider list to compare against the remote list this.parent.GetCurrentSearchProviderList(sink); // Now update from the server this.parent.LoadRemoteSearchProviders(); }, debug : function(msg) { this.parent.debug('localRDFLoadObserver: '+msg); } }; this.localRDFLoadObserver.parent = this; } // Remote RDF Load Observer // ... watches loading of the *remote* search-providers.rdf file if (!this.remoteRDFLoadObserver) { this.debug(' instanciating remote RDF load observer'); this.remoteRDFLoadObserver = { onBeginLoad : function(sink){}, onInterrupt : function(sink){}, onResume : function(sink){}, onError : function(sink,status,msg) { this.parent.mRemoteLoadError = true; this.parent.mRemoteLoadErrorCount = this.parent.mRemoteLoadErrorCount - 1; this.debug("remoteLoad Error: " + msg); }, onEndLoad : function(sink) { if (!this.parent.mRemoteLoadError){ this.debug('onEndLoad()'); // Load datasource sink.removeXMLSinkObserver(this); sink.QueryInterface(Components.interfaces.nsIRDFDataSource); this.debug(' loaded remote datasource: '+sink.URI); // Copy over top of the local file var localFile = this.parent.GetLocalSearchProviderRDFFile(); this.debug(' saving a local copy of the RDF file'); var localFileURI = this.parent.ioService.newFileURI(localFile); sink.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); sink.FlushTo(localFileURI.spec); // Parse the datasource this.parent.ParseDataSource(sink); } else if (this.parent.mRemoteLoadErrorCount) { this.parent.mRemoteLoadError = false; sink.removeXMLSinkObserver(this); this.parent.LoadRemoteSearchProviders(); } }, debug : function(msg) { this.parent.debug('remoteRDFLoadObserver: '+msg); } }; this.remoteRDFLoadObserver.parent = this; } // Construct URL to fetch the remote search provider RDF file if (!this.remoteRDFFetchURL) { var user_guid = this.prefService.getCharPref("browser.info.guid"); var partnerId; try { partnerId = this.prefService.getCharPref("browser.partnerId"); } catch (ex) { partnerId = 'chapera'; } this.remoteRDFFetchURL = this.prefService.getCharPref("browser.search.providers.url"); // + "?guid="+user_guid + "&partnerId="+partnerId; this.debug(' remote RDF URL: '+this.remoteRDFFetchURL); } this.LoadLocalSearchProviders(); }, // returns the array position if item is found in the list, otherwise returns -1 ExistsInList : function(list, name, bIgnoreCase) { for (var idx = 0; idx < list.length; idx++) { var item1 = list[idx]; var item2 = name; if (bIgnoreCase) { item1 = item1.toLowerCase(); item2 = item2.toLowerCase(); } if (item1 == item2) return idx; } return -1; }, GetCurrentSearchProviderList : function(datasource) { if (!this.searchProviderList) this.searchProviderList = new Array(); var pluginsFolder = this.EnsureSearchPluginsFolderExists(); var entries = pluginsFolder.directoryEntries; while (entries.hasMoreElements()) { var entry = entries.getNext(); entry.QueryInterface(Components.interfaces.nsILocalFile); var fileName = entry.leafName; var idx = fileName.lastIndexOf("."); if (idx >= 0) fileName = fileName.substring(0, idx); if (fileName.length > 0 && this.ExistsInList(this.searchProviderList, fileName, true) < 0) { this.debug(' Adding to the search provider list: ' + fileName); this.searchProviderList[this.searchProviderList.length] = fileName; } } }, LoadLocalSearchProviders : function() { this.debug('RefreshLocalSearchProviders()'); var file = this.GetLocalSearchProviderRDFFile(); var fileURI = this.ioService.newFileURI(file); try { // Start loading local RDF file of search providers var ds = this.RDFService.GetDataSource(fileURI.spec); // Register a listener to pick things up when the file is done // loading. (Control will go to the onEndLoad function...) ds.QueryInterface(Components.interfaces.nsIRDFXMLSink); ds.addXMLSinkObserver(this.localRDFLoadObserver); } catch (ex) { // If there was a problem loading the local file, just go // directly to the online one this.debug(' problem loading local '+this.SEARCH_PROVIDER_RDF_FILE); this.LoadRemoteSearchProviders(); } }, LoadRemoteSearchProviders : function() { this.debug('RefreshRemoteSearchProviders()'); try { ds = this.RDFService.GetDataSourceNoCache(this.remoteRDFFetchURL); ds.QueryInterface(Components.interfaces.nsIRDFXMLSink); ds.addXMLSinkObserver(this.remoteRDFLoadObserver); } catch (ex) { this.debug(' problem loading remote search providers file'); } }, ParseDataSource : function(datasource) { // Remove existing search providers that are not in the datasource this.ScrubSearchProviderDirectory(datasource); // Iterate through resources var resources = datasource.GetAllResources(); var res; while (resources.hasMoreElements()) { res = resources.getNext(); res.QueryInterface(Components.interfaces.nsIRDFResource); this.LoadSingleProviderResource(datasource, res); this.RDFService.UnregisterResource(res); } this.RDFService.UnregisterDataSource(datasource); }, ScrubSearchProviderDirectory : function(datasource) { if (!this.searchProviderList) return; if (this.prefService.getPrefType('browser.search.providers.preserve') && this.prefService.getBoolPref('browser.search.providers.preserve')) { this.searchProviderList = null; return; } if (datasource) { // Iterate through resources var resources = datasource.GetAllResources(); while (resources.hasMoreElements()) { var res = resources.getNext(); res.QueryInterface(Components.interfaces.nsIRDFResource); var resVal = res.Value; if (!resVal) continue; if (resVal.indexOf(this.SEARCH_TAG) < 0) continue; resVal = resVal.substring(this.SEARCH_TAG.length); this.debug('ScrubSearchProoviderDirectory: resVal: ' + resVal); var idx = this.ExistsInList(this.searchProviderList, resVal, true); if (idx > -1) { this.debug('ScrubSearchProoviderDirectory: Val: ' + resVal + ', InList: ' + this.searchProviderList[idx]); this.searchProviderList.splice(idx, 1); } } for (var idx = 0; idx < this.searchProviderList.length; idx++) this.RemoveSearchProvider(this.searchProviderList[idx]); } this.searchProviderList = null; }, RemoveSearchProvider : function(searchProvider) { if (!searchProvider) return; var pluginsFolder = this.EnsureSearchPluginsFolderExists(); const SearchProviderExt = [".src", ".gif", ".jpg", ".bmp", ".png"]; for (var idx = 0; idx < SearchProviderExt.length; idx++) { var filename = searchProvider + SearchProviderExt[idx]; var spFile = pluginsFolder.clone(); spFile.append(filename); if (spFile.exists()) { this.debug('(remove pre-existing file: '+spFile.path+')'); spFile.remove(false); } } }, LoadSingleProviderResource : function(datasource, resource) { this.debug('LoadSingleProviderResource('+resource.Value+')'); // See if this resource specifies an actual search provider if (datasource.hasArcOut(resource, this.RES_NAME) && datasource.hasArcOut(resource, this.RES_ICON) && datasource.hasArcOut(resource, this.RES_SRC)) { var name = datasource.GetTarget(resource, this.RES_NAME, true); name.QueryInterface(Components.interfaces.nsIRDFLiteral); this.debug(' name: '+name.Value); var icon = datasource.GetTarget(resource, this.RES_ICON, true); icon.QueryInterface(Components.interfaces.nsIRDFLiteral); this.debug(' icon: '+icon.Value); var src = datasource.GetTarget(resource, this.RES_SRC, true); src.QueryInterface(Components.interfaces.nsIRDFLiteral); this.debug(' src: '+src.Value); // Create the searchplugins folder if it doesn't exist var pluginsFolder = this.EnsureSearchPluginsFolderExists(); // Download the icon and src files and stick them in the // searchplugins folder this.DownloadToSearchPluginsFolder(icon.Value, ["gif", "jpg", "bmp", "png"]); this.DownloadToSearchPluginsFolder(src.Value); } }, DownloadToSearchPluginsFolder : function(urlSpec, clearFiles) { this.debug('DownloadToSearchPluginsFolder('+urlSpec+')'); // Create URL object var remoteURL = Components.classes["@mozilla.org/network/standard-url;1"] .createInstance(Components.interfaces.nsIStandardURL); remoteURL.init(Components.interfaces.nsIStandardURL.URLTYPE_STANDARD, null, urlSpec, null, null); remoteURL.QueryInterface(Components.interfaces.nsIURL); this.debug(' filename is: '+remoteURL.fileName); // Download var downloadObserver = { QueryInterface : function(iid) { if (!iid.equals(nsIDownloadObserver) && !iid.equals(nsISupports)) throw Components.results.NS_ERROR_NO_INTERFACE; return this; }, onDownloadComplete : function(downloader, request, ctxt, status, file) { // file.path now references a temporary cached copy of the file, // so copy it to the searchplugins folder this.debug('file is at: '+file.path); var pluginsFolder = this.parent.GetSearchPluginsFolder(); this.debug('copying to: '+pluginsFolder.path+' '+this.fileName); // BLT 152031 fix: replace the existing icon files if(!clearFiles) { clearFiles = [""]; } for(var i in clearFiles) { var ext = clearFiles[i]; var destFname = this.fileName; if(ext != "") { var ind = destFname.lastIndexOf("."); if(ind >= 0) { destFname = destFname.substring(0, ind); } destFname += "." + ext; } // Test if the file already exists var destinationFile = pluginsFolder.clone(); destinationFile.append(destFname); if (destinationFile.exists()) { this.debug(' (removing pre-existing file: '+destFname+')'); destinationFile.remove(false); file.copyTo(pluginsFolder, destFname); } else if(this.fileName == destFname) { file.copyTo(pluginsFolder, destFname); } } }, debug : function(msg) { this.parent.debug('downloadObserver: '+msg); } }; downloadObserver.parent = this; downloadObserver.fileName = remoteURL.fileName; var channel = this.ioService.newChannel(remoteURL.spec, null, null); var downloader = Components.classes["@mozilla.org/network/downloader;1"] .createInstance(Components.interfaces.nsIDownloader); downloader.init(downloadObserver, null); channel.asyncOpen(downloader, null); }, GetSearchPluginsFolder : function() { this.debug('GetSearchPluginsFolder()'); // Create file descriptor var folder = this.profileDir.clone(); folder.append(this.SEARCH_PLUGINS_FOLDER); return folder; // returns nsILocalFile }, EnsureSearchPluginsFolderExists : function() { this.debug('EnsureSearchPluginsFolderExists()'); var folder = this.GetSearchPluginsFolder(); if (!folder.exists()) { folder.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0); } return folder; // returns nsILocalFile }, GetLocalSearchProviderRDFFile : function() { this.debug('GetLocalSearchProviderRDFFile(): '+this.SEARCH_PROVIDER_RDF_FILE); // Create file descriptor var file = this.profileDir.clone(); file.append(this.SEARCH_PROVIDER_RDF_FILE); return file; // returns nsILocalFile }, GetSearchHistoryFile : function() { this.debug('GetSearchHistoryFile(): '+this.SEARCH_HISTORY_FILE); // Create file descriptor var file = this.profileDir.clone(); file.append(this.SEARCH_HISTORY_FILE); return file; // returns nsILocalFile }, EnsureSearchHistoryFileExists : function() { this.debug('EnsureSearchHistoryFileExists()'); var file = this.GetSearchHistoryFile(); if (!file.exists()) { this.debug(' creating file: '+this.SEARCH_HISTORY_FILE); file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0); } return file; // returns nsILocalFile }, ReadSearchHistory : function() { this.debug('ReadSearchHistory()'); var file = this.EnsureSearchHistoryFileExists(); // Init the file input stream var fis = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); fis.init(file, this.PR_RDONLY, 0, 0); // Init a scriptable input stream var sis = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance(Components.interfaces.nsIScriptableInputStream); sis.init(fis); // Read the file var fileContents = sis.read(sis.available()); // Close file fis.close(); // Return the lines as an array return fileContents.split('\n'); }, PopulateHistoryPopup : function(evt) { this.debug('PopulateHistoryPopup()'); // Purge the history menu var popup = evt.target; while (popup.lastChild) popup.removeChild(popup.lastChild); // Load in the fresh history items var entries = this.ReadSearchHistory(); for (var i = 0; i < entries.length; i++) { if (!entries[i].length) continue; var newItem = document.createElement('menuitem'); newItem.setAttribute('label', entries[i]); newItem.setAttribute('oncommand', 'search.HistoryCommand("'+entries[i]+'");'); popup.appendChild(newItem); } // Only add the separator if there were history items if (popup.lastChild) popup.appendChild(document.createElement('menuseparator')); // Always add the 'clear history' menu item var clearHist = document.createElement('menuitem'); clearHist.setAttribute('label', 'Clear Search History'); clearHist.setAttribute('oncommand', 'search.ClearSearchHistory();'); // ... but if there were no history items, then make it disabled if (!popup.lastChild) clearHist.setAttribute('disabled','true'); popup.appendChild(clearHist); }, HistoryCommand : function(value) { this.debug('HistoryCommand("'+value+'")'); var searchbar = document.getElementById('searchbar'); if (searchbar) { // Put the value into the text box searchbar.mTextbox.value = value; // Execute search searchbar.mTextbox.onTextEntered(); } }, AddToHistory : function(value) { this.debug('AddToHistory("'+value+'")'); // If it's whitespace, don't bother if (!this.trim(value).length) return; // Create the new list var oldList = this.ReadSearchHistory(); var newList = new Array(); newList[0] = value; for (var i = 0; i < oldList.length; i++) { if (oldList[i] != value) newList[newList.length] = oldList[i]; if (newList.length >= this.MAX_HISTORY_SIZE) break; } // Open the history file for writing var file = this.GetSearchHistoryFile(); file.remove(false); file = this.EnsureSearchHistoryFileExists(); var fos = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); fos.init(file, this.PR_WRONLY, 0, 0); var contents = newList.join('\n'); this.debug(' - writing contents:\n'+contents+'\n\n'); fos.write(contents, contents.length); fos.close(); }, ClearSearchHistory : function() { this.debug('ClearSearchHistory()'); var file = this.GetSearchHistoryFile(); if (file.exists()) { // Init the file input stream var fis = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); fis.init(file, this.PR_RDONLY, 0, Components.interfaces.nsIFileInputStream.DELETE_ON_CLOSE); fis.close(); } // MERC (rpaul) clear the searchbar text var searchbar = document.getElementById('searchbar'); if (searchbar) searchbar.clear(); // is the entries stored for search engine forms. Clear them. var formHistSvc = Components.classes["@mozilla.org/satchel/form-history;1"] .getService(Components.interfaces.nsIFormHistory); formHistSvc.removeEntriesForName("q"); }, debug : function(msg) { if (this.SEARCH_DEBUG) { dump('search.js: '+msg+'\n'); } }, trim : function(str) { if (!str) return ""; str = str.replace(/^\s+/, ""); return str.replace(/\s+$/, ""); }, /* MERC - RTOMASELLI Method to populate the search provider list */ PopulateEnginePopup : function(evt) { var DESKTOP_SEARCH_ID = "DesktopSearch"; var popup = evt.target; while (popup.lastChild) popup.removeChild(popup.lastChild); var ds = this.RDFService.GetDataSource("rdf:internetsearch"); var kNC_Root = this.RDFService.GetResource("NC:SearchEngineRoot"); var kNC_child = this.RDFService.GetResource("http://home.netscape.com/NC-rdf#child"); var kNC_Name = this.RDFService.GetResource("http://home.netscape.com/NC-rdf#Name"); var kNC_Icon = this.RDFService.GetResource("http://home.netscape.com/NC-rdf#Icon"); var kNC_Version = this.RDFService.GetResource("http://home.netscape.com/NC-rdf#Version"); var kNC_Description = this.RDFService.GetResource("http://home.netscape.com/NC-rdf#Description"); var arcs =ds.GetTargets(kNC_Root, kNC_child, true); // BC: Loading Search engine from a pref // Get preferences var prefServ = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); while (arcs.hasMoreElements()) { var engine = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource); var name = ds.GetTarget(engine, kNC_Name,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; var icon = ds.GetTarget(engine, kNC_Icon,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; var ver = ds.GetTarget(engine, kNC_Version,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; var desc = ds.GetTarget(engine, kNC_Description,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; var engineValue = engine.Value; var newEngineItem = document.createElement('menuitem'); var childBox = document.createElement('hbox'); var searchIcon = document.createElement('image'); var labelText = document.createElement('label'); var checkboxContainer = document.createElement('hbox'); var checkbox = document.createElement('image'); newEngineItem.setAttribute('id', engineValue); newEngineItem.setAttribute('value', engineValue); //newEngineItem.setAttribute('label', name); newEngineItem.setAttribute('type', 'checkbox'); newEngineItem.setAttribute('desc', desc); newEngineItem.setAttribute('ver', ver); newEngineItem.setAttribute('src', icon); // Set the icon for the search provider searchIcon.setAttribute('src', icon); // Set the text for the label labelText.setAttribute('value', name); labelText.setAttribute('class', 'searchbar-menu-iconic-text'); // Set the checked attribute checkboxContainer.setAttribute('class', 'searchbar-menu-iconic-left'); checkbox.setAttribute('class', 'searchbar-menu-iconic-icon'); // BC: If this element is the same as the saved pref, check it. // check that the pref exists if (prefServ.prefHasUserValue("browser.searchbar.lastSelectedEngine")) { loadedPref = prefServ.getCharPref("browser.searchbar.lastSelectedEngine"); // if the loadedPref setting is the same as the current engine value, lets check it if(loadedPref == engineValue) { checkbox.setAttribute('checked', 'true'); } } checkboxContainer.appendChild(checkbox); newEngineItem.appendChild(searchIcon); newEngineItem.appendChild(labelText); newEngineItem.appendChild(checkboxContainer); popup.appendChild(newEngineItem); } // 10.5.2005 NAJ : The following if statement was removed to expose desktop search // regardles of it's installed/uninstalled state per CCv3. A handler for the lack of // an installed Copernic will be required, this will be atached to the oncommand // in the UI. // if (desktopSearch.isDesktopSearchAvailable()) { if (popup.lastChild) popup.appendChild(document.createElement('menuseparator')); var desktopSearchItem = document.createElement('menuitem'); desktopSearchItem.setAttribute('id', DESKTOP_SEARCH_ID); desktopSearchItem.setAttribute('value', DESKTOP_SEARCH_ID); desktopSearchItem.setAttribute('type', 'checkbox'); desktopSearchItem.setAttribute('label', 'Desktop Search'); desktopSearchItem.setAttribute('src', 'chrome://browser/skin/search/copernic.png'); popup.appendChild(desktopSearchItem); //} }, /* MERC - BCharan * @param - ID of the selected element */ saveSelectionToPref : function(element) { // BC: Saving Search into a pref // Get preferences var prefServ = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); // Check if the pref exists first if (prefServ.prefHasUserValue("browser.searchbar.lastSelectedEngine")) { // Get the stored pref storedPref = prefServ.getCharPref("browser.searchbar.lastSelectedEngine"); // If the pref exists, then compare it to the current pref, // Overwrite if they are not equal if (storedPref != element.getAttribute('id')) { prefServ.setCharPref("browser.searchbar.lastSelectedEngine", element.getAttribute('id')); } } else { prefServ.setCharPref("browser.searchbar.lastSelectedEngine", element.getAttribute('id')); } }, /* MERC - RTOMASELLI This method is called when 'Web Search' is selected from the 'Tools' menu. Loop through the list of web providers and if one of them matches the browser default search provider then use it otherwise use any other web search provider. This also handles the case if the default provider is the desktop search. */ OnWebSearchSelected : function(){ var prefbranch = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); var defaultName = prefbranch.getComplexValue("browser.search.defaultenginename", Components.interfaces.nsIPrefLocalizedString).data; var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"] .getService(Components.interfaces.nsIRDFService); var ds = rdf.GetDataSource("rdf:internetsearch"); var kNC_Root = rdf.GetResource("NC:SearchEngineRoot"); var kNC_child = rdf.GetResource("http://home.netscape.com/NC-rdf#child"); var kNC_Name = rdf.GetResource("http://home.netscape.com/NC-rdf#Name"); var kNC_Icon = rdf.GetResource("http://home.netscape.com/NC-rdf#Icon"); var arcs =ds.GetTargets(kNC_Root, kNC_child, true); var engine; var name; var icon; var foundDefault = false; while (arcs.hasMoreElements() && !foundDefault) { engine = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource); name = ds.GetTarget(engine, kNC_Name,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; icon = ds.GetTarget(engine, kNC_Icon,true).QueryInterface(Components.interfaces.nsIRDFLiteral).Value; if (name == defaultName){foundDefault = true;} } if (engine) { var broadcaster = window.top.document.getElementById('searchEngineBroadcaster'); broadcaster.setAttribute("src",icon); broadcaster.setAttribute("searchengine", engine.Value); } focusSearchBar(); }, /* MERC - RTOMASELLI This method is called when 'Desktop Search' is selected from the 'Tools' menu */ OnDesktopSearchSelected: function(){ var broadcaster = window.top.document.getElementById('searchEngineBroadcaster'); broadcaster.setAttribute("src","chrome://browser/skin/search/copernic.png"); broadcaster.setAttribute("searchengine", "DesktopSearch"); }, logError : function(exceptionObject, optionalAdditionalText) { // logs (or otherwise handles) errors // do logging ?! // for now, just alert var output; var errSource = this.logError.caller; //Source function from the error output = "Function: " + errSource.name ; if (errSource.arity > 0){ output += "\nArguments: \n" for (i=0; i < errSource.arity; i++){ output += " (" + i + ") " + errSource.arguments[i] ; } } output += "\nException: " + exceptionObject.message ; if (optionalAdditionalText != null) { output += "\nNotes: " + optionalAdditionalText; } this.debug("\n" + output); alert (output); } }; PK [&4V8(xxcontent/browser/titlebar.jsUT 0žCCUxvar titlebar = { windowTitleListener : { onWindowTitleChange : function(xulwin, title) { //var thisWindow = document.getElementById('main-window'); //var thisWindow = window.QueryInterface(Components.interfaces.nsIXULWindow); //dump('>>>>>>>>>>>>>> onWindowTitleChange: window: '+xulwin+', '+title+'\n'); var docshell = xulwin.docShell; try { // Bin - if this (try & catch) affects performance, we should remove it var requestor = docshell.QueryInterface(Components.interfaces.nsIInterfaceRequestor); var domwin = requestor.getInterface(Components.interfaces.nsIDOMWindow); if (domwin != window) return; var lbl = document.getElementById('titlebar-title'); if(lbl)//JA lbl.value = title; } catch (e){} }, onOpenWindow : function(wnd) { }, onCloseWindow : function(wnd) { }, }, init : function() { var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] .getService(Components.interfaces.nsIWindowMediator); wm.addListener(this.windowTitleListener); }, debug : function(txt) { //dump('titlebar: '+txt+'\n'); }, menuState : 2, // 0=label 1=transition 2=menus 3=transition onmouseover : function(event) { if (this.menuState==0) { this.debug('onmouseover()'); this.animLabelToMenus(); } else { this.debug('onmouseover(): menuState: '+this.menuState); } }, onmousemove : function(event) { if (this.menuState==0) { this.debug('onmousemove()'); // The mouse cursor somehow got inside the titlebar without // initiating the transition to menus, so force the menus // display immediately this.forceLabelToMenus(); } }, onmouseout : function(event) { if (this.menuState==2) { this.debug('onmouseout()'); if (this.isOverTitlebar(event) || this.isMenuOpen()) { // Check again after a few seconds //setTimeout('titlebar.onmouseout();',5000); return; } this.animMenusToLabel(); } }, // Test if any menus are currently open isMenuOpen : function() { var menubar = document.getElementById('main-menubar'); var menus = menubar.childNodes; for (var i = 0; i < menus.length; i++) { if (menus[i].getAttribute('open')=='true') return true; } return false; }, // Test if the mouse is currently inside the titlebar isOverTitlebar : function(event) { var tb = document.getElementById('titlebar'); if ((tb.boxObject.screenX <= event.screenX) && (event.screenX - tb.boxObject.screenX <= tb.boxObject.width) && (tb.boxObject.screenY <= event.screenY) && (event.screenY - tb.boxObject.screenY <= tb.boxObject.height)) { return true; } return false; }, lastMouseDown : null, throbberMouseDown : function(event) { lastMouseDown = new Object(); lastMouseDown.x = event.screenX; lastMouseDown.y = event.screenY; }, throbberMouseUp : function(event) { // We want a single click on the throbber to go to the throbber URL, // but we DON'T want a click-and-drag action to do this. if (lastMouseDown && (lastMouseDown.x == event.screenX) && (lastMouseDown.y == event.screenY)) { goClickThrobber('browser.throbber.url', event); lastMouseDown = null; } }, animWait : 15, // milliseconds // Animate from label to menus animLabelToMenus : function(phase, iter) { this.menuState = 1; if (!phase) phase = 1; if (!iter) iter = 0; this.debug('animLabelToMenus('+phase+','+iter+')'); switch (phase) { case 1: // Fade out the label var label = document.getElementById('menu-label-box'); if (iter <= 10) { label.style.MozOpacity = 1 - (iter/10); setTimeout('titlebar.animLabelToMenus(1,'+(iter+1)+');',this.animWait); } else { label.setAttribute('hidden','true'); setTimeout('titlebar.animLabelToMenus(2,0);',this.animWait); } break; case 2: // Fade in menus if (iter <= 10) { var menus = document.getElementById('menubar-items'); menus.style.MozOpacity = iter / 10; if (iter == 0) menus.removeAttribute('hidden'); } if (iter < 10) setTimeout('titlebar.animLabelToMenus(2,'+(iter+1)+');',this.animWait); else if (iter == 10) this.menuState = 2; } }, // In some cases we may want to force the transition to menus more rapidly forceLabelToMenus : function() { this.menuState = 1; var label = document.getElementById('menu-label-box'); label.style.MozOpacity = 0; label.setAttribute('hidden','true'); var menus = document.getElementById('menubar-items'); menus.style.MozOpacity = 1; menus.removeAttribute('hidden'); this.menuState = 2; }, // Animate from menus to label animMenusToLabel : function(phase, iter) { this.menuState = 3; if (!phase) phase = 1; if (!iter) iter = 0; this.debug('animMenusToLabel('+phase+','+iter+')'); switch (phase) { case 1: // Fade out the menus var menus = document.getElementById('menubar-items'); if (iter <= 10) { menus.style.MozOpacity = 1 - (iter/10); setTimeout('titlebar.animMenusToLabel(1,'+(iter+1)+');',this.animWait); } else { menus.setAttribute('hidden','true'); setTimeout('titlebar.animMenusToLabel(2,0);',this.animWait); } break; case 2: // Fade in label if (iter <= 10) { var label = document.getElementById('menu-label-box'); label.style.MozOpacity = iter / 10; if (iter == 0) label.removeAttribute('hidden'); } if (iter < 10) setTimeout('titlebar.animMenusToLabel(2,'+(iter+1)+');',this.animWait); else if (iter == 10) this.menuState = 0; } }, menuKeydown : function(event) { this.debug(' KEY DOWN!!! '); } }; PK [&4ѕ#content/browser/navExtraOverlay.cssUT 1žCCUx/* #debugMenu, #qaMenu, #menu_translate, #menu_findTypeLinks { display: none; } #PersonalToolbar > #sidebar-button, tabbox .sidebar-button { -moz-binding: url("chrome://browser/skin/sidebarButtonBindings.xml#sidebar-button"); } hide "Get new themes" menu item menupopup#theme > menuitem:first-child { display: none } menupopup#theme > menuitem + menuseparator { display: none } */ PK [&4jg@::content/browser/urlbar.jsUT 0žCCUxvar focusedURLBar; var lastBrowserKeyPress = 0; var lastURLKeyPress = 0; var lastBrowserMouseDown = 0; var lastURLMouseDown = 0; var lastURLRightMouseDown = 0; var lastRegainFocus = 0; function URLBarFocusHandler(aEvent, aElt) { if (gIgnoreFocus) { gIgnoreFocus = false; } else if (gClickSelectsAll) { aElt.select(); } // Remember which url bar is in focus, and listen to window key and mouse events until the when we willingly loose the focus grip on url bar focusedURLBar = aElt; window.addEventListener("keypress", onBrowserKeyPressForUrlbar, false); window.addEventListener("mousedown", onBrowserMouseEventForUrlbar, false); window.addEventListener("mouseup", onBrowserMouseEventForUrlbar, false); } function URLBarBlurHandler(aEvent, aElt) { closeURLBarPopup(); if(focusedURLBar == aElt) { setTimeout("URLBarRegainFocus()", 10); } } // If the URLBar's focus is "stolen", regain the focus back if it should be. function URLBarRegainFocus() { var now = new Date().getTime(); var regain; if(now - Math.max(lastURLKeyPress, lastURLMouseDown) < 500) { // if url key or mouse event is recent (0.5 second), regain focus regain = true; } else { regain = false; /* var recentBrowserUserInput = Math.max(lastBrowserKeyPress, lastBrowserMouseDown); // get Trident plug in doc last mouse down event timestamp var hpDoc = getTridentDocument(); if (hpDoc) { recentBrowserUserInput = Math.max(recentBrowserUserInput, hpDoc.lastMouseDown); } // if last browser key or mouse event is recent, loose the grip on url bar // otherwise, always regain focus back to url bar regain = (now - recentBrowserUserInput > 200); */ } if(regain) { // Wanna steal the focus, no way! gIgnoreFocus = true; lastRegainFocus = new Date().getTime(); focusedURLBar.focus(); } else { // OK, give up the grip on the focus focusedURLBar = null; window.removeEventListener("keypress", onBrowserKeyPressForUrlbar, false); window.removeEventListener("mousedown", onBrowserMouseEventForUrlbar, false); window.removeEventListener("mouseup", onBrowserMouseEventForUrlbar, false); } } function onBrowserKeyPressForUrlbar(evt) { closeURLBarPopup(); lastBrowserKeyPress = new Date().getTime(); } function onBrowserMouseEventForUrlbar(evt) { lastBrowserMouseDown = new Date().getTime(); } function URLBarKeyPressHandler(aEvent, aElt) { if(aEvent.keyCode == 9 || aEvent.keyCode == 10 || aEvent.keyCode == 13) { lastURLKeyPress = 0; } else { lastURLKeyPress = new Date().getTime(); } } function URLBarMouseDownHandler(aEvent, aElt) { if(aEvent.which == 3) { lastURLRightMouseDown = new Date().getTime(); } if(focusedURLBar == aElt) { lastURLMouseDown = new Date().getTime(); } if (aElt.hasAttribute("focused")) { gIgnoreClick = true; } else { gIgnoreFocus = true; gIgnoreClick = false; aElt.setSelectionRange(0, 0); } } function URLBarClickHandler(aEvent, aElt) { if (!gIgnoreClick && gClickSelectsAll && aElt.selectionStart == aElt.selectionEnd) { aElt.select(); } } function handleURLBarCommand(aTriggeringEvent) { var postData = { }; canonizeUrl(aTriggeringEvent, postData); try { addToUrlbarHistory(); } catch (ex) { // Things may go wrong when adding url to session history, // but don't let that interfere with the loading of the url. } BrowserLoadURL(aTriggeringEvent, postData.value); // BrowserLoadURL(aTriggeringEvent, postData.value, "browser.tabs.history.open"); } // If "ESC" is pressed in the url bar, we replace the urlbar's value with the url of the page // and highlight it, unless it is about:blank, where we reset it to "". function handleURLBarRevert() { var url = getWebNavigation().currentURI.spec; var throbberElement = document.getElementById("throbberBroadcaster"); var isScrolling = gURLBar.popupOpen; // don't revert to last valid url unless page is NOT loading // and user is NOT key-scrolling through autocomplete list if ((!throbberElement || !throbberElement.hasAttribute("busy")) && !isScrolling) { if (url != "about:blank") { gURLBar.value = url; gURLBar.select(); SetPageProxyState("valid", null); // XXX Build a URI and pass it in here. } else { //if about:blank, urlbar becomes "" gURLBar.value = ""; } } gBrowser.userTypedValue = null; // tell widget to revert to last typed text only if the user // was scrolling when they hit escape return !isScrolling; } function closeURLBarPopup() { try { document.getElementById('URLBarPopup').hidePopup(); } catch(ex) { } } function openURLBarPopup() { //dump("\n\n BML MERC - urlbar.js openURLBarPopup called...\n\n"); // JMC - If there's a better Popup already open, just exit if (balloonhelp && balloonhelp.isHelpShown()) { return; } // BML - fixes bugzilla 2454 - check if nav history drop down is open and exit if so... if (document.getElementById('urlbar').popup.mPopupOpen) { return; } var now = new Date().getTime(); if(now - Math.max(lastURLRightMouseDown, lastRegainFocus) < 200) { return; } try { // check if URLBarPopup preference flag is set if (gPrefService === null){ throw ("No Prefservice..."); } var urlBarPopupOn = gPrefService.getBoolPref("browser.urlbar.topSitesPopup.enabled"); var theURLBar = document.getElementById('urlbar'); if (!theURLBar){ throw ("No urlbar found..."); } if (urlBarPopupOn) { // update the URLBarPopup setURLBarPopupButtons(); // show the popup var urlPopup = document.getElementById("URLBarPopup"); if (!urlPopup){ throw ("No urlPopup found..."); } // The urlbarpopup is not friendly with autocompletepopup. Make sure only one shows up var autocompletePopupId = document.getElementById("urlbar").getAttribute("autocompletepopup"); if (autocompletePopupId) { var autopopup = document.getElementById(autocompletePopupId); if(autopopup) { autopopup.hidePopup(); } } // show popup //dump("\n\n ~~~ BML change- urlbar.js - openURLBarPopup - showing top sites list\n\n"); urlPopup.showPopup(theURLBar, -1, -1, 'popup', 'bottomleft', 'topleft'); } } catch(ex) {dump("\n\nException thown - urlbar.js: openURLBarPopup:\n" + ex + "\n\n");} //dump("\n\n::::: openURLBarPopup finished...\n"); } var topSiteSelectedTime = 0; function urlPopupSelected(theURI, theCommand) { //dump("\n\n::::: urlPopupSelected called...\n"); topSiteSelectedTime = new Date().getTime(); var currentTopSite; if(theURI) { currentTopSite = "loadURI('" + theURI + "');"; } else { currentTopSite = theCommand; } closeURLBarPopup(); eval(currentTopSite); //dump("\n\n::::: urlPopupSelected finished...\n"); } function urlPopupClicked(theURI, theCommand) { //dump("\n\n::::: urlPopupClicked called...\n"); // onselect always happen before onclick. If the onselect is not called yet, // that is because the user clicked the currently selected item. We need to force to call it now. if(new Date().getTime() - topSiteSelectedTime > 200) { urlPopupSelected(theURI, theCommand); } } // MERC BML Sets the showHistory & showBookmarks menu items in URLBarPopup // to state of sidebar panels they open function setURLBarPopupButtons(){ try { // get popup checkboxes var showHistoryCheckbox = document.getElementById("showHistory-checkbox"); var showBookmarksCheckbox = document.getElementById("showBookmarks-checkbox"); if(!showHistoryCheckbox){ throw("No showHistoryCheckbox found..."); } if(!showBookmarksCheckbox){ throw("No showBookmarksCheckbox found..."); } // set showHistory if(isHistoryPanelOpen()){ showHistoryCheckbox.setAttribute('checked', true); } else { showHistoryCheckbox.setAttribute('checked', false); } // set showBookmarks if(isBookmarksPanelOpen()){ showBookmarksCheckbox.setAttribute('checked', true); } else { showBookmarksCheckbox.setAttribute('checked', false); } } catch(ex) { dump("Exception in urlbar.js: SetURLBarPopupButtons\n" + ex + "\n"); } } // when the popup is hidden destroy the list of topsites function destroyTopSitesList() { //dump("\n\n BML MERC - urlbar.js destroyTopSitesList called...\n\n"); try{ // hide label var topsitesLabel = document.getElementById("topsites-label"); topsitesLabel.setAttribute("hidden", "true"); // hide separator var endSeparator = document.getElementById("endTopSitesSeparator"); endSeparator.setAttribute("hidden", "true"); // Destroy the items. var urlPopup = document.getElementById("URLBarPopup-box"); var destroy = false; for (var i = 0; i < urlPopup.childNodes.length; i++) { var item = urlPopup.childNodes[i]; if (item == endSeparator) break; if (destroy) { i--; urlPopup.removeChild(item); } if (item == topsitesLabel) destroy = true; } }catch (ex) {dump("Exception thrown in destroyTopSitesList...\n"+ex);} //dump("\n\n BML MERC - urlbar.js destroyTopSitesList finished...\n\n"); } /* MERC BML : when the popup is shown get topsites from history rdf using xpcom service & add to urlpopup as menuitems */ function buildTopSitesList() { try{ //dump("\n\n BML MERC - urlbar.js buildtopSitesList called...\n\n"); var URLBarPopup = document.getElementById("URLBarPopup"); // In case the timer didn't fire. destroyTopSitesList(); // get a list of topsites from data source var siteList = getTopsites(); // should we display topsites? if(siteList.length === 0){ // no history so no topsites return; } // show label var topsitesLabel = document.getElementById("topsites-label"); topsitesLabel.setAttribute("hidden", "false"); // get the end of the topsites list as we'll be adding items in reverse var beforeItem = document.getElementById("endTopSitesSeparator"); // show separator while we've got it beforeItem.setAttribute("hidden", "false"); // get container for topsites list var urlBarPopup = document.getElementById("URLBarPopup-box"); // add menu items to topsites list from bottom to top for (var i = siteList.length - 1; i >= 0; i--) { //dump("\n\n siteList["+i+"] = "+siteList[i]); var aTopsite = siteList[i].split("|"); var aName = aTopsite[0]; var aURL = aTopsite[1]; //dump("\naURL" + i + "= " + aURL +" aName =" +aName+"...\n"); beforeItem = constructTopSitesMenuItem(urlBarPopup, beforeItem, aURL, aName); } } catch(ex){dump("\n\n Exception thrown in urlbar.js - buildTopSitesList:\n"+ ex +"...");} //dump("\n\n BML MERC - urlbar.js leaving buildTopSitesList...\n\n"); } /* MERC BML : this helps buildTopSitesList in creating a topsites menuitem and adding it to the urlBarpopup before returning the added menuitem. Have hard coded the width of the left column based on width of URLBar because using structures like listbox caused crashes when removed from popup */ function constructTopSitesMenuItem(urlBarPopup, beforeItem, aURL, aName) { //dump("\n\n BML MERC - urlbar.js constructTopSitesMenuItem called...\n\n"); // create a menuItem, 2 containers for labels & labels for a topSites entry var menuItem = document.createElementNS(XUL_NS, "menuitem"); var leftHbox = document.createElementNS(XUL_NS, "hbox"); var rightHbox = document.createElementNS(XUL_NS, "hbox"); var nameLabel = document.createElementNS(XUL_NS, "label"); var urlLabel = document.createElementNS(XUL_NS, "label"); // set the menuitem menuItem.setAttribute("class", "topsites-menuitem"); menuItem.setAttribute("flex", "1"); var theCommand = 'urlPopupSelected("'+ aURL +'", null);'; //dump("\n\ntheCommand = "+theCommand+"\n"); menuItem.setAttribute("oncommand", theCommand); // set name & it's container leftHbox.setAttribute("id", "topsites-nameBox"); leftHbox.setAttribute("class", "topsites-leftcolumn"); var leftColumnWidth = calcTopsitesLeftColumn(); leftHbox.setAttribute("width", leftColumnWidth); nameLabel.setAttribute("class", "topsitesName"); nameLabel.setAttribute("value", aName); nameLabel.setAttribute("crop", "end"); leftHbox.appendChild(nameLabel); // set url & it's container rightHbox.setAttribute("id", "topsites-urlBox"); rightHbox.setAttribute("class", "topsites-rightcolumn"); urlLabel.setAttribute("class", "topsitesURL"); urlLabel.setAttribute("value", aURL); urlLabel.setAttribute("crop", "end"); rightHbox.appendChild(urlLabel); // add contents to menuItem menuItem.appendChild(leftHbox); menuItem.appendChild(rightHbox); // add menuItem to urlPopup urlBarPopup.insertBefore(menuItem, beforeItem); //dump("\n\n BML MERC - urlbar.js constructTopSitesMenuItem finished...\n\n"); return menuItem; } /* MERC BML/AAM : helper function that retrieves an array of urls & names sorted by their visitcount from history rdf. the length of array should be based on pref : browser.urlbar.topSitesPopup.maxLines */ function getTopsites() { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); const cid = "@mozilla.org/browser/minihistory;1"; var obj = Components.classes[cid].createInstance(Components.interfaces.nsIMiniHistory); var count = {}; // ensure this is an object var aStrings = obj.getHistory(count); //dump('count=' + count.value); var i; var splitstr; for (i=0; i < count.value; i++) { splitstr = aStrings[i].split("|"); //dump('index=' + i + '\nName="' + splitstr[0] + '"\nURL=' + splitstr[1]); } } catch (err) {dump("Exception thrown in urlbar.js - getTopsitese\n" + err);return;} return aStrings; } // Helper function for dynamically controlling column width of topsites list function calcTopsitesLeftColumn(){ try{ var urlBarWidth = document.getElementById('urlbar').boxObject.width; // set width of left column to 40% of urlBar (and as an integer) var leftColWidth = Math.floor(urlBarWidth * 0.4); }catch(ex){dump("Exception thrown in urlbar.js - calcTopsitesLeftColumn\n" + ex);return;} return leftColWidth; }PK [&4K<2$aa$content/browser/sidebar/customize.jsUT 0žCCUx/* -*- Mode: Java; tab-width: 4; insert-tabs-mode: nil; c-basic-offset: 2 -*- * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998-1999 Netscape Communications Corporation. All * Rights Reserved. * */ ////////////////////////////////////////////////////////////// // Global variables ////////////////////////////////////////////////////////////// // Set to true for noise const CUST_DEBUG = true; // the rdf service var RDF = '@mozilla.org/rdf/rdf-service;1' RDF = Components.classes[RDF].getService(); RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService); var NC = "http://home.netscape.com/NC-rdf#"; var sidebarObj = new Object; var allPanelsObj = new Object; var original_panels = new Array(); ////////////////////////////////////////////////////////////// // Sidebar Init/Destroy ////////////////////////////////////////////////////////////// function sidebar_customize_init() { allPanelsObj.datasources = window.arguments[0]; allPanelsObj.resource = window.arguments[1]; sidebarObj.datasource_uri = window.arguments[2]; sidebarObj.resource = window.arguments[3]; debug("Init: all panels datasources = " + allPanelsObj.datasources); debug("Init: all panels resource = " + allPanelsObj.resource); debug("Init: sidebarObj.datasource_uri = " + sidebarObj.datasource_uri); debug("Init: sidebarObj.resource = " + sidebarObj.resource); var all_panels = document.getElementById('other-panels'); var current_panels = document.getElementById('current-panels'); debug("Adding observer to all panels database."); all_panels.database.AddObserver(panels_observer); allPanelsObj.datasources = allPanelsObj.datasources.replace(/^\s+/,''); allPanelsObj.datasources = allPanelsObj.datasources.replace(/\s+$/,''); allPanelsObj.datasources = allPanelsObj.datasources.split(/\s+/); for (var ii = 0; ii < allPanelsObj.datasources.length; ii++) { debug("Init: Adding "+allPanelsObj.datasources[ii]); // This will load the datasource, if it isn't already. var datasource = RDF.GetDataSource(allPanelsObj.datasources[ii]); all_panels.database.AddDataSource(datasource); } // Add the datasource for current list of panels. It selects panels out // of the other datasources. debug("Init: Adding current panels, "+sidebarObj.datasource_uri); sidebarObj.datasource = RDF.GetDataSource(sidebarObj.datasource_uri); // Root the customize dialog at the correct place. debug("Init: reset all panels ref, "+allPanelsObj.resource); all_panels.setAttribute('ref', allPanelsObj.resource); // Create a "container" wrapper around the current panels to // manipulate the RDF:Seq more easily. var panel_list = sidebarObj.datasource.GetTarget(RDF.GetResource(sidebarObj.resource), RDF.GetResource(NC + "panel-list"), true); sidebarObj.container = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer); sidebarObj.container.Init(sidebarObj.datasource, panel_list); // Add all the current panels to the tree current_panels = sidebarObj.container.GetElements(); while (current_panels.hasMoreElements()) { var panel = current_panels.getNext().QueryInterface(Components.interfaces.nsIRDFResource); if (add_node_to_current_list(sidebarObj.datasource, panel) >= 0) { original_panels.push(panel.Value); original_panels[panel.Value] = true; } } var links = all_panels.database.GetSources(RDF.GetResource(NC + "haslink"), RDF.GetLiteral("true"), true); while (links.hasMoreElements()) { var folder = links.getNext().QueryInterface(Components.interfaces.nsIRDFResource); var folder_name = folder.Value; debug("+++ fixing up remote container " + folder_name + "\n"); fixup_remote_container(folder_name); } sizeToContent(); } function sidebar_customize_destruct() { var all_panels = document.getElementById('other-panels'); debug("Removing observer from all_panels database."); all_panels.database.RemoveObserver(panels_observer); } ////////////////////////////////////////////////////////////////// // Panels' RDF Datasource Observer ////////////////////////////////////////////////////////////////// var panels_observer = { onAssert : function(ds,src,prop,target) { //debug ("observer: assert"); // "refresh" is asserted by select menu and by customize.js. if (prop == RDF.GetResource(NC + "link")) { setTimeout("fixup_remote_container('"+src.Value+"')",100); //fixup_remote_container(src.Value); } }, onUnassert : function(ds,src,prop,target) { //debug ("observer: unassert"); }, onChange : function(ds,src,prop,old_target,new_target) { //debug ("observer: change"); }, onMove : function(ds,old_src,new_src,prop,target) { //debug ("observer: move"); }, onBeginUpdateBatch : function(ds) { //debug ("observer: onBeginUpdateBatch"); }, onEndUpdateBatch : function(ds) { //debug ("observer: onEndUpdateBatch"); } }; function fixup_remote_container(id) { debug('fixup_remote_container('+id+')'); var container = document.getElementById(id); if (container) { container.setAttribute('container', 'true'); container.removeAttribute('open'); } } function fixup_children(id) { // Add container="true" on nodes with "link" attribute var treeitem = document.getElementById(id); var children = treeitem.childNodes.item(1).childNodes; for (var ii=0; ii < children.length; ii++) { var child = children.item(ii); if (child.getAttribute('link') != '' && child.getAttribute('container') != 'true' && child.getAttribute('livemark') != 'true') { child.setAttribute('container', 'true'); child.removeAttribute('open'); } } } function get_attr(registry,service,attr_name) { var attr = registry.GetTarget(service, RDF.GetResource(NC + attr_name), true); if (attr) attr = attr.QueryInterface(Components.interfaces.nsIRDFLiteral); if (attr) attr = attr.Value; return attr; } function SelectChangeForOtherPanels(event, target) { enable_buttons_for_other_panels(); } function ClickOnOtherPanels(event) { var tree = document.getElementById("other-panels"); var rowIndex = -1; if (event.type == "click" && event.button == 0) { var row = {}, col = {}, obj = {}; var b = tree.treeBoxObject; b.getCellAt(event.clientX, event.clientY, row, col, obj); if (obj.value == "twisty" || event.detail == 2) { rowIndex = row.value; } } if (rowIndex < 0) return; var treeitem = tree.contentView.getItemAtIndex(rowIndex); var res = RDF.GetResource(treeitem.id); if (treeitem.getAttribute('container') == 'true') { if (treeitem.getAttribute('open') == 'true') { var link = treeitem.getAttribute('link'); var loaded_link = treeitem.getAttribute('loaded_link'); if (link != '' && !loaded_link) { debug("Has remote datasource: "+link); add_datasource_to_other_panels(link); treeitem.setAttribute('loaded_link', 'true'); } else { setTimeout('fixup_children("'+ treeitem.getAttribute('id') +'")', 100); } } } // Remove the selection in the "current" panels list var current_panels = document.getElementById('current-panels'); current_panels.view.selection.clearSelection(); enable_buttons_for_current_panels(); } function add_datasource_to_other_panels(link) { // Convert the |link| attribute into a URL var url = document.location; debug("Current URL: " +url); debug("Current link: " +link); var uri = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(); uri = uri.QueryInterface(Components.interfaces.nsIURI); uri.spec = url; uri = uri.resolve(link); debug("New URL: " +uri); // Add the datasource to the tree var all_panels = document.getElementById('other-panels'); all_panels.database.AddDataSource(RDF.GetDataSource(uri)); // XXX This is a hack to force re-display //all_panels.setAttribute('ref', allPanelsObj.resource); } // Handle a selection change in the current panels. function SelectChangeForCurrentPanels() { // Remove the selection in the available panels list var all_panels = document.getElementById('other-panels'); all_panels.view.selection.clearSelection(); enable_buttons_for_current_panels(); } // Move the selected item up the the current panels list. function MoveUp() { var tree = document.getElementById('current-panels'); if (tree.view.selection.count == 1) { var index = tree.currentIndex; var selected = tree.contentView.getItemAtIndex(index); var before = selected.previousSibling; if (before) { before.parentNode.removeChild(selected); before.parentNode.insertBefore(selected, before); tree.view.selection.select(index-1); tree.treeBoxObject.ensureRowIsVisible(index-1); } } } // Move the selected item down the the current panels list. function MoveDown() { var tree = document.getElementById('current-panels'); if (tree.view.selection.count == 1) { var index = tree.currentIndex; var selected = tree.contentView.getItemAtIndex(index); if (selected.nextSibling) { if (selected.nextSibling.nextSibling) selected.parentNode.insertBefore(selected, selected.nextSibling.nextSibling); else selected.parentNode.appendChild(selected); tree.view.selection.select(index+1); tree.treeBoxObject.ensureRowIsVisible(index+1); } } } function PreviewPanel() { var tree = document.getElementById('other-panels'); var database = tree.database; var sel = tree.view.selection; var rangeCount = sel.getRangeCount(); for (var range = 0; range < rangeCount; ++range) { var min = {}, max = {}; sel.getRangeAt(range, min, max); for (var index = min.value; index <= max.value; ++index) { var item = tree.contentView.getItemAtIndex(index); var res = RDF.GetResource(item.id); var preview_name = get_attr(database, res, 'title'); var preview_URL = get_attr(database, res, 'content'); if (!preview_URL || !preview_name){ continue; } // BC: Changed location to browser from communicator // // window.sizeToWindow () doesn't work because preview pane contains an IFRAME // so the popup is created the same size as, and just offset from, the parent window. // var PREVIEW_WINDOW_OFFSET = 20; var SIDE_BAR_WIDTH = 180; // pixels var prnt = document.getElementById ('main-window'); var prvDlg = window.openDialog("chrome://browser/content/sidebar/preview.xul", "_blank", "top=" + (prnt.boxObject.screenY + PREVIEW_WINDOW_OFFSET)+ ",left=" + (prnt.boxObject.screenX + PREVIEW_WINDOW_OFFSET) + ",width=" + SIDE_BAR_WIDTH + ",height=" + prnt.boxObject.height + ",chrome,resizable,close,dependent,dialog=no", preview_name, preview_URL); } } } // Add the selected panel(s). function AddPanel() { var added = -1; var tree = document.getElementById('other-panels'); var database = tree.database; var sel = tree.view.selection; var ranges = sel.getRangeCount(); for (var range = 0; range < ranges; ++range) { var min = {}, max = {}; sel.getRangeAt(range, min, max); for (var index = min.value; index <= max.value; ++index) { var item = tree.contentView.getItemAtIndex(index); if (item.getAttribute("container") != "true") { var res = RDF.GetResource(item.id); // Add the panel to the current list. added = add_node_to_current_list(database, res); } } } if (added >= 0) { // Remove the selection in the other list. // Selection will move to "current" list. tree.view.selection.clearSelection(); var current_panels = document.getElementById('current-panels'); current_panels.view.selection.select(added); current_panels.treeBoxObject.ensureRowIsVisible(added); } } // Copy a panel node into a database such as the current panel list. function add_node_to_current_list(registry, service) { debug("Adding "+service.Value); // Copy out the attributes we want var option_title = get_attr(registry, service, 'title'); var option_customize = get_attr(registry, service, 'customize'); var option_content = get_attr(registry, service, 'content'); if (!option_title || !option_content) return -1; var tree = document.getElementById('current-panels'); var tree_root = tree.lastChild; // Check to see if the panel already exists... var i = 0; for (var treeitem = tree_root.firstChild; treeitem; treeitem = treeitem.nextSibling) { if (treeitem.id == service.Value) // The panel is already in the current panel list. // Avoid adding it twice. return i; ++i; } // Create a treerow for the new panel var item = document.createElement('treeitem'); var row = document.createElement('treerow'); var cell = document.createElement('treecell'); // Copy over the attributes item.setAttribute('id', service.Value); cell.setAttribute('label', option_title); // Add it to the current panels tree item.appendChild(row); row.appendChild(cell); tree_root.appendChild(item); return i; } // Remove the selected panel(s) from the current list tree. function RemovePanel() { var tree = document.getElementById('current-panels'); var sel = tree.view.selection; var nextNode = -1; var rangeCount = sel.getRangeCount(); for (var range = rangeCount-1; range >= 0; --range) { var min = {}, max = {}; sel.getRangeAt(range, min, max); for (var index = max.value; index >= min.value; --index) { var item = tree.contentView.getItemAtIndex(index); nextNode = item.nextSibling ? index : -1; item.parentNode.removeChild(item); } } if (nextNode >= 0) sel.select(nextNode); } // Bring up a new window with the customize url // for an individual panel. function CustomizePanel() { var tree = document.getElementById('current-panels'); var numSelected = tree.view.selection.count; if (numSelected == 1) { var index = tree.currentIndex; var selectedNode = tree.contentView.getItemAtIndex(index); var panel_id = selectedNode.getAttribute('id'); var customize_url = selectedNode.getAttribute('customize'); debug("url = " + customize_url); if (!customize_url) return; window.openDialog('chrome://communicator/content/sidebar/customize-panel.xul', '_blank', 'chrome,resizable,width=690,height=600,dialog=no,close', panel_id, customize_url, sidebarObj.datasource_uri, sidebarObj.resource); } } function BrowseMorePanels() { var url = ''; var browser_url = "chrome://navigator/content/navigator.xul"; var locale; try { var prefs = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); url = prefs.getCharPref("sidebar.customize.more_panels.url"); var temp = prefs.getCharPref("browser.chromeURL"); if (temp) browser_url = temp; } catch(ex) { debug("Unable to get prefs: "+ex); } window.openDialog(browser_url, "_blank", "chrome,all,dialog=no", url); } function customize_getBrowserURL() { return url; } // Serialize the new list of panels. function Save() { persist_dialog_dimensions(); var all_panels = document.getElementById('other-panels'); var current_panels = document.getElementById('current-panels'); // See if list membership has changed var panels = []; var tree_root = current_panels.lastChild.childNodes; var list_unchanged = (tree_root.length == original_panels.length); for (var i = 0; i < tree_root.length; i++) { var panel = tree_root[i].id; panels.push(panel); panels[panel] = true; if (list_unchanged && original_panels[i] != panel) list_unchanged = false; } if (list_unchanged) return; // Remove all the current panels from the datasource. current_panels = sidebarObj.container.GetElements(); while (current_panels.hasMoreElements()) { panel = current_panels.getNext().QueryInterface(Components.interfaces.nsIRDFResource); if (panel.Value in panels) { // This panel will remain in the sidebar. // Remove the resource, but keep all the other attributes. // Removing it will allow it to be added in the correct order. // Saving the attributes will preserve things such as the exclude state. sidebarObj.container.RemoveElement(panel, false); } else { // Kiss it goodbye. delete_resource_deeply(sidebarObj.container, panel); } } // Add the new list of panels for (var ii = 0; ii < panels.length; ++ii) { var id = panels[ii]; var resource = RDF.GetResource(id); if (id in original_panels) { sidebarObj.container.AppendElement(resource); } else { copy_resource_deeply(all_panels.database, resource, sidebarObj.container); } } refresh_all_sidebars(); // Write the modified panels out. sidebarObj.datasource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource).Flush(); } // Search for an element in an array function has_element(array, element) { for (var ii=0; ii < array.length; ii++) { if (array[ii] == element) { return true; } } return false; } // Search for targets from resource in datasource function has_targets(datasource, resource) { var arcs = datasource.ArcLabelsOut(resource); return arcs.hasMoreElements(); } // Use an assertion to pass a "refresh" event to all the sidebars. // They use observers to watch for this assertion (in sidebarOverlay.js). function refresh_all_sidebars() { sidebarObj.datasource.Assert(RDF.GetResource(sidebarObj.resource), RDF.GetResource(NC + "refresh"), RDF.GetLiteral("true"), true); sidebarObj.datasource.Unassert(RDF.GetResource(sidebarObj.resource), RDF.GetResource(NC + "refresh"), RDF.GetLiteral("true")); } // Remove a resource and all the arcs out from it. function delete_resource_deeply(container, resource) { var arcs = container.DataSource.ArcLabelsOut(resource); while (arcs.hasMoreElements()) { var arc = arcs.getNext(); var targets = container.DataSource.GetTargets(resource, arc, true); while (targets.hasMoreElements()) { var target = targets.getNext(); container.DataSource.Unassert(resource, arc, target, true); } } container.RemoveElement(resource, false); } // Copy a resource and all its arcs out to a new container. function copy_resource_deeply(source_datasource, resource, dest_container) { var arcs = source_datasource.ArcLabelsOut(resource); while (arcs.hasMoreElements()) { var arc = arcs.getNext(); var targets = source_datasource.GetTargets(resource, arc, true); while (targets.hasMoreElements()) { var target = targets.getNext(); dest_container.DataSource.Assert(resource, arc, target, true); } } dest_container.AppendElement(resource); } function enable_buttons_for_other_panels() { var add_button = document.getElementById('add_button'); var preview_button = document.getElementById('preview_button'); var all_panels = document.getElementById('other-panels'); var sel = all_panels.view.selection; var num_selected = sel ? sel.count : 0; if (sel) { var ranges = sel.getRangeCount(); for (var range = 0; range < ranges; ++range) { var min = {}, max = {}; sel.getRangeAt(range, min, max); for (var index = min; index <= max; ++index) { var node = all_panels.contentView.getItemAtIndex(index); if (node.getAttribute('container') != 'true') { ++num_selected; } } } } if (num_selected > 0) { add_button.removeAttribute('disabled'); preview_button.removeAttribute('disabled'); } else { add_button.setAttribute('disabled','true'); preview_button.setAttribute('disabled','true'); } } function enable_buttons_for_current_panels() { var up = document.getElementById('up'); var down = document.getElementById('down'); var tree = document.getElementById('current-panels'); var customize = document.getElementById('customize-button'); var remove = document.getElementById('remove-button'); var numSelected = tree.view.selection.count; var canMoveUp = false, canMoveDown = false, customizeURL = ''; if (numSelected == 1 && tree.view.selection.isSelected(tree.currentIndex)) { var selectedNode = tree.view.getItemAtIndex(tree.currentIndex); customizeURL = selectedNode.getAttribute('customize'); canMoveUp = selectedNode != selectedNode.parentNode.firstChild; canMoveDown = selectedNode != selectedNode.parentNode.lastChild; } up.disabled = !canMoveUp; down.disabled = !canMoveDown; customize.disabled = !customizeURL; remove.disabled = !numSelected; } function persist_dialog_dimensions() { // Stole this code from navigator.js to // insure the windows dimensions are saved. // Get the current window position/size. var x = window.screenX; var y = window.screenY; var h = window.outerHeight; var w = window.outerWidth; // Store these into the window attributes (for persistence). var win = document.getElementById( "main-window" ); win.setAttribute( "x", x ); win.setAttribute( "y", y ); win.setAttribute( "height", h ); win.setAttribute( "width", w ); } /////////////////////////////////////////////////////////////// // Handy Debug Tools ////////////////////////////////////////////////////////////// var debug = null; var dump_attributes = null; var dump_tree = null; var _dump_tree_recur = null; if (!CUST_DEBUG) { debug = function (s) {}; dump_attributes = function (node, depth) {}; dump_tree = function (node) {}; _dump_tree_recur = function (node, depth, index) {}; } else { debug = function (s) { dump("-*- sb customize: " + s + "\n"); }; dump_attributes = function (node, depth) { var attributes = node.attributes; var indent = "| | | | | | | | | | | | | | | | | | | | | | | | | | | | . "; if (!attributes || attributes.length == 0) { debug(indent.substr(indent.length - depth*2) + "no attributes"); } for (var ii=0; ii < attributes.length; ii++) { var attr = attributes.item(ii); debug(indent.substr(indent.length - depth*2) + attr.name + "=" + attr.value); } } dump_tree = function (node) { _dump_tree_recur(node, 0, 0); } _dump_tree_recur = function (node, depth, index) { if (!node) { debug("dump_tree: node is null"); } var indent = "| | | | | | | | | | | | | | | | | | | | | | | | | | | | + "; debug(indent.substr(indent.length - depth*2) + index + " " + node.nodeName); if (node.nodeName != "#text") { dump_attributes(node, depth); } var kids = node.childNodes; for (var ii=0; ii < kids.length; ii++) { _dump_tree_recur(kids[ii], depth + 1, ii); } } } ////////////////////////////////////////////////////////////// // Install the load/unload handlers ////////////////////////////////////////////////////////////// addEventListener("load", sidebar_customize_init, false); addEventListener("unload", sidebar_customize_destruct, false); PK [&46)%content/browser/sidebar/customize.xulUT 0žCCUx %customizeDTD; %brandDTD; ]>

WARNING: Netscape Browser has detected a potential security risk.

{url}

This site has been identified as a possible "Phishing" site by {providers}.

Please use caution when providing personal information to this site.

PK [&4- - !content/browser/aboutSpyware.htmlUT 1žCCUx Warning: Possible Spyware Site

WARNING: Netscape Browser has detected a potential security risk.

{url}

This site has been identified as a possible distributor of "Spyware" by {providers}.

Please use caution when downloading or installing files from this site.

PK [&4n< !content/browser/aboutBadHtml.htmlUT 0žCCUx Warning: HTML Tag Warning Page

WARNING: Netscape Browser has detected and prevented a system error on a web page.

{url}

This page has been identified as containing incorrect HTML tags that would result in a serious system error if viewed.

You may wish to contact the site webmaster to inform them of the HTML error on this page which could cause serious errors in other browsers.

PK [&4sIoT T %content/browser/aboutBlockedSite.htmlUT 0žCCUx Website Blocked

This Website is Blocked.

Your profile does not allow access to "{hostname}". Click the Back button to return to the previous page.

PK [&4 @  $content/browser/aboutBlockedSite.xulUT 1žCCUx PK [&4V >VV"content/browser/askUserAboutJar.jsUT 1žCCUxvar dialog; function onLoad() { dialog = new Object; dialog.whatToDo = document.getElementById("jar_whatToDo"); dialog.jarOpenTheme = document.getElementById("jar_openTheme"); dialog.jarDownload = document.getElementById("jar_download"); dialog.jarTrident = document.getElementById("jar_trident"); } function getTopWin() { var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); var windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator); var topWindowOfType = windowManagerInterface.getMostRecentWindow( "navigator:browser" ); if (topWindowOfType) { return topWindowOfType; } return null; } function onAccept() { var args = window.arguments[0]; // Check which option they selected. switch (dialog.whatToDo.selectedItem) { case dialog.jarOpenTheme: // Install the theme using the InstallTriger (from extensions.js) InstallTrigger.installChrome(InstallTrigger.SKIN, args.jarUrl, args.jarUrl); args.handled = 0; break; case dialog.jarDownload: // download the file args.handled = 1; break; case dialog.jarTrident: // pass back to trident args.handled = 2; break; } } function onCancel() { // Canceled so pretend we have handled it var args = window.arguments[0]; args.handled = 0; }PK [&4j/c#content/browser/askUserAboutJar.xulUT 0žCCUx %brandDTD; %askUserAboutJarDTD; ]>