bplist00S_WebMainResource_WebSubresources_WebSubframeArchives ^WebResourceURL_WebResourceTextEncodingName_WebResourceMIMEType_WebResourceData_WebResourceFrameName_!http://itp-physcomp.blogspot.com/UUTF-8Ytext/htmlOu& ITP-PhysComp

11 Eylül 2008 Perşembe

PhysComp Lab1

Welcome to my PhysComp Blog!

Here, I will post the pictures and descriptions of my Lab assignments every week.

Our first Lab was to creat a digital input and output circuit.

1st step: Set up the circuit on the arduino and breadboard using a on & off switch and 2 LED lights.











2nd step: Program the arduino on the computer and connect it to the board. When the switch is off, the red LED light is turned on.











3rd step: When the switch is on, the yellow LED light is turned on.












GETTING CREATIVE

For the creative section, I used a good old clothes-peg as a switch!














When there is no fabric hanging, the red LED is turned on.















When you hang a fabric, the yellow LED is turned on!
















PS: I really have to improve my photography / documenting skills!
P#(-159=AEIN_WebResourceResponse_9http://www.blogger.com/widgets/3319451950-blogarchive.cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_9http://www.blogger.com/widgets/3319451950-blogarchive.css./01X$classesZ$classname12UNSURLXNSObject#AGOQ 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Sat, 11 Oct 2008 13:30:14 GMTTgzipXtext/cssWGFE/1.3S570_Thu, 11 Sep 2008 13:30:14 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd FKT_bhqz|)0PU^fjdXtext/cssO/** * Copyright 2005 Google Inc. * Author: Lexi Baugher * * CSS for collapsible hierarchy of archive links */ #ArchiveList .toggle { cursor: pointer; font-family: Arial, sans-serif; /* this font has support for the dingbats */ } #ArchiveList .toggle-open { /* Work around IE's differently-sized dingbat by resizing up to look like the rest of the characters for this font size. */ _font-size: 1.7em; line-height: 0.6em; } #ArchiveList { text-align: left; } #ArchiveList a.post-count-link, #ArchiveList a.post-count-link:link, #ArchiveList a.post-count-link:visited { text-decoration: none; } #ArchiveList a.toggle, #ArchiveList a.toggle:link, #ArchiveList a.toggle:visited, #ArchiveList a.toggle:hover { color: inherit; /* done in JS for IE */ text-decoration: none; } .BlogArchive #ArchiveList ul li { background: none; list-style: none; list-style-image: none; list-style-position: outside; border-width: 0; padding-left: 15px; text-indent: -15px; margin-left: 0; background-image: none; } .BlogArchive #ArchiveList ul ul li { padding-left: 1.2em; } .BlogArchive #ArchiveList ul { margin: 0; padding: 0; list-style: none; list-style-image: none; border-width: 0; } .BlogArchive #ArchiveList ul ul { margin-top: 5px; } .BlogArchive #ArchiveList ul.posts li { padding-left: 1.3em; } #ArchiveList .collapsed ul { display: none; } _9http://www.blogger.com/v-css/3727950723-blog_controls.cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_9http://www.blogger.com/v-css/3727950723-blog_controls.css./01X$classesZ$classname12UNSURLXNSObject#AEY. 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Fri, 16 Oct 2009 13:30:14 GMTTgzipXtext/cssWGFE/1.3S420_Thu, 11 Sep 2008 13:30:14 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionaryM./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd FKT_bhqz|)0PU^fjdOM /* ----------------------------------------------- Quick Edit and Delete Comment Icons ----------------------------------------------- */ /* Hide it now, show it later with dynamically-generated CSS */ .item-control { display:none; } .item-control a, .item-action a { text-decoration:none !important; } .widget-item-control { float: right; } .icon-action { border-style: none !important; margin: 0 0 -5px 0.5em !important; } .delete-comment-icon { background: url("/img/icon_delete13.gif") no-repeat left; /* makes a 14x14 box */ padding:7px; } /* Mobile video tags shown on handhelds only. All others get regular video tags. */ @media all { .BLOG_mobile_video_class { display:none; } } @media handheld { .BLOG_mobile_video_class { display:inline; } .BLOG_video_class { display:none; } } _yhttp://www.blogger.com/dyn-css/authorization.css?targetBlogID=8561867230230501415&zx=f6a39c90-9fe6-43a8-a4a4-e6bd670e9fc0Uutf-8O3bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_yhttp://www.blogger.com/dyn-css/authorization.css?targetBlogID=8561867230230501415&zx=f6a39c90-9fe6-43a8-a4a4-e6bd670e9fc0./01X$classesZ$classname12UNSURLXNSObject#AMv 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlVPragma_Content-Encoding\Content-TypeVServerTDate^Content-Length]Last-Modified_max-age=1800 privateXno-cacheTgzip_text/css; charset=UTF-8WGFE/1.3_Thu, 18 Sep 2008 15:11:22 GMTR87_Thu, 18 Sep 2008 15:11:21 GMT./\]]^2_NSMutableDictionary\NSDictionary[./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd  2?FKZh %)=dKO[ span.following-not-admin { display:inline; } div.following-follow-this { display:block; }  !"_2http://www.blogger.com/widgets/1326023001-blog.cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_2http://www.blogger.com/widgets/1326023001-blog.css./01X$classesZ$classname12UNSURLXNSObject#AE4Y 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Sat, 11 Oct 2008 13:30:14 GMTTgzipXtext/cssWGFE/1.3S718_Thu, 11 Sep 2008 13:30:14 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd ?DMX[ajsu|")INW_cdO/* backlinks controls */ .backlink-toggle-zippy { padding-right: 11px; margin-right: 0.1em; cursor: pointer; cursor: hand; background: url(http://www.blogger.com/img/triangle_ltr.gif) no-repeat left center; } .expanded-backlink .backlink-toggle-zippy { background-image: url("http://www.blogger.com/img/triangle_open.gif") } .collapsed-backlink .collapseable { display: none; } .status-msg-wrap { font-size: 110%; width: 90%; margin: 10px auto; position: relative; } .status-msg-border { border: 1px solid #000000; filter:alpha(opacity=40); -moz-opacity:.40; opacity:.40; width: 100%; position: relative; } .status-msg-bg { background-color: #cccccc; opacity:.80; filter:alpha(opacity=30); -moz-opacity:.80; width: 100%; position: relative; z-index: 1; } .status-msg-body { text-align: center; padding: .3em 0; width: 100%; position: absolute; z-index: 4; } .status-msg-hidden { visibility: hidden; padding: .3em 0; } .status-msg-wrap a { padding-left: .4em; text-decoration: underline; } /* Reactions -----------------------------*/ .reactions-label { margin: 3px 0 0 0; } /* styling for the iframe */ .reactions-iframe { background: transparent; height: 2.3em; width: 100%; border: 0; } /* Comments -----------------------------*/ #comments .blogger-comment-icon, .blogger-comment-icon { line-height:16px; background:url(/img/b16-rounded.gif) left no-repeat; padding-left:20px; } #comments .openid-comment-icon, .openid-comment-icon { line-height:16px; background:url(/img/openid16-rounded.gif) left no-repeat; padding-left:20px; } #comments .anon-comment-icon, .anon-comment-icon { line-height:16px; background:url(/img/anon16-rounded.gif) left no-repeat; padding-left:20px; } /* Paging Controls for comments -----------------------------*/ .paging-control-container { float: right; margin: 0px 6px 0px 0px; font-size: 80%; } .unneeded-paging-control { visibility: hidden; } $%&'_5http://img1.blogblog.com/img/icon18_wrench_allbkg.pngObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345IJKLMNOPQRSTUVW[\U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_5http://img1.blogblog.com/img/icon18_wrench_allbkg.png./01X$classesZ$classname12UNSURLXNSObject#A2 6789AWNS.keysZNS.objects:;<=>?@ BCDEFGH]Cache-ControlWExpires\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Sun, 17 Jan 2038 19:14:07 GMTYimage/pngSgwsS475_Thu, 11 Sep 2008 13:30:16 GMT_Fri, 09 May 2008 15:04:46 GMT./XYYZ2_NSMutableDictionary\NSDictionary./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd@ENY\bktv} 1;?Cc`Yimage/pngOۉPNG  IHDRa~ePLTE J4eulec{韟Y}T|`v`w̰[qEq__^bYtRNS@fIDATx^MU1 @؁A(33CfqRϣز"@*v&g X="6Xz$/"3;R\Mb((JRpKOY0Qӆqr3rvbΆj+hr<_l}lY݀o%bd,l/ ȂN igKIENDB`)*+,_[http://3.bp.blogspot.com/_EMQIqdr0Lj4/SMlibOnbZyI/AAAAAAAAASU/sNZ9NZgVxvU/s200/DSC_0372.JPGO&bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_[http://3.bp.blogspot.com/_EMQIqdr0Lj4/SMlibOnbZyI/AAAAAAAAASU/sNZ9NZgVxvU/s200/DSC_0372.JPG./01X$classesZ$classname12UNSURLXNSObject#AMwC5 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0372.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT7328V"1250"./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>Zimage/jpegOJFIFC  !"$"$C"C !1AQ"aq2BR#b$3rCc%4S. !1Aa"q2Q ?jʓ2"rOF3Qސ$U9y|(S03G,J}h.Z_EUob<@6#V #N}EHQF$L}*r:oPsSҮP87Q¡CS)Ru'nOr=Z`9Ok y{-Bw9#A<觸kcqX}\=rJJls|[]шw(y".VV(r@%QԂL|Ŭ_^[+8s?8秖~޺֢k_>>W4QxR7]b XT8ZㅒFԏUg R̜ ):g-R3&(|+^3m-25J񢄙xP_fYIE*Yy$[.H1 :P_5sRNMu#QJ*-$xM5cykt:󞇺:25TI_'٥AGOpv8ߣaန:YTΆ@J!εFxUiKd\aaSv H&ucJOm<ȧ dSrb)tFHjA V^.rPT%^B NQ=KD iVm{U]<R:h~qUWe3UW{Y֮vVnYnHH~*^'# f/2Vђ9s/JIBv8$zXr+Ʋg!]i`:m5ԩylv8'-*Ŷ+.7dy*:mbص\  aO*,0#P~uM0Wť̒>$ :s,NK,Z;z󛴶%%P*=Ĉ;O Ϥw0w-nVT2 f.n1:Frk!:BÜl_zkSe0JA]mF{" a&®һҽ HJ׌0T$Kqs Dn7gmmU9YaCEIR`ʁyq퟾jŻumc0HDDFG -8)] q*li#Ee !9ƀfZ6ų/Iaj*V5:U`A^(>6hF&VE#i-_T(XŅ+ƯlK8^]۞Zgwk7ًG77 V%2u2a KDkkr$t0:WŨƴ(5=fьq{# ,?jS6 I{&|4a躴uzcta*ƤJOV>!*;gԤ(H1\vbVٺpVU (<NAxi"vޢkSي= n0/Ca<SnIe@6Dd/C~n JTUhI"5:pX{= a qemAmNb$Aj@]]mU5}e6TD`LAԑC9Gk0%RٌĎE^];;_Un[k)Z`: ^Rx~GyBǿo٣bHE흣%!k,)C4/> - PqI0 0Uß)8حh PTفm% W ݌ -%<@*& :eW"Q06۸]V,on]i`<PęDŽ Ķv8QpQrRI NXH jn76YmI(z7kTB`2 8.ʳͳjVhMȓMu<(gMoYѳQm/{3CxY[ܬٞ y*&N9]j}hc}ڂV$|Ϭb`BDnFa$H3%Kk"ϤlOC6iuSqgN)Ge; KWh[0 S!tqkZƤ{9t9Wwcs8m?M'|h2#I4>hoS we!K*>Š(?"hhjh~1-.ɻͦwBq2J0N]|)ܱnw-JQ']Nùr q w[~VE[3|#az~PU\wJ8;xM]eyyeDWyٛpLL+]0JZROwOMxRN4s/e:RrrMn#)`xePÞ lT}לq'Ƒ$]h$}MԲLg]ZҞHY3˯ʬgP֊#:|_tyx훒Q!F$?0|ZI )j ih3hp{j*ʡ5Jd똩]vrFW` ˶{Bdj⮤Vl,aěo|@l +i,-00|Ia)Ji*uy1eO+V`x\Z7$-@Nbk5c6mkv.ݸ)j&R5d<j+^&>:QHcBp+0T%K{$o١YJiCun-}O2,@Ԁ uŋwv 6"h,|S6b(zx@vip|Cl0y$2l(0k(ˤ [:y^^*U\⦷[ǰվ#/*sJ{BG0u9D~XE)RKO)K*I0I+bO{>M!m0 ʢצ}ɸE԰[nS2}TFz_ƮX.N׳À-r^n@'PooB)b\쭜$+\cvk@sėp[-/IjV8:[ڧ 'e2/x3rDe:j:}'ut< nˎj%J(*'^2>+VV -JIR{u?3\?,Mj7Wx},rF]uKZ 8ǟJ"xן'm/3b(ZOW Kob5IIJ6l*:R6YyG\~]vm/R2"ciSIv6mEmQmH#λViZ;k;s)ħ~O {;v}y=aO`xZnl2ow $ȉWFܠ(\IN#|JY-[ѓ*UgVSz/֙V@bHgքe c/uPnkgeЫ4FSĒ ~F~5ЯAʹ-e[|<9Rf(i>}$G0NHKHZPP* Z.<ˁ(y|2RAʭu0YQ EeO:3Lr[n{M6|Km$"AL(@ʆ>𥸫#^PƝUᨱ:qOT,T¹5z' S+|ڀb{h$TaQ r)C DQ1 ZLH:( m{iTl$eHJA@[Brʓ  #30(y0h$*@P*Wh:CIPHpju9H[i9<4T42ɢ>vAiPԓk%l9G^)A R$Zb9- "xҥ(3h9J LG t }̜:A^LoO x(GBp=#ґ˴)2#=KdAuE)2 MRtIޭ/8MR6-ȼZձ*⣠ՖlqKvm иHȎgX*<>41Y}ڲ-(\iT)Q'C4•7UTc2A=Bbd Q)_$39P7`F|D*4e]W҆S@jWLrDwjPْΥyћ ƄY=?՛DW*6#:m(N_dai Rd09s1] eF\ь_iJW6?e='n^O\.*qi R Nt[Hޔߤx!i0++ĝM,vy[(R$N` ySJ{:ې\Yޙ֬O3;&W!oEe-Eⷆm*۶$AZI$$+A86HNOԨ,v7fݛw)aRc<& t/ ”QiE)$tx*b.69="xx<\t*⬞oCX20q $LֺWS`8:oU5yGҵm1 )$8(Hwʢh).9 SiVbm>"hYVAUQ@(Uv*(Q>\Q"? DTe*$+Dk$x^ uB"Yac*TYJ҈~жJEi=DT7 bIi>C~ #M](=R:"`~m(+x ӾJtEI"+ԑ&!fw(ڔ?JR{CvΚP$5*T$)@$]RêyԩI؀qnekiWYZJ)3nJԢGݩRh%)cyPVD) 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0374.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT5564V"1270"./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>OJFIFC  !"$"$C"D!1A"2QaqBRb#3S$5rT1!1AQ"2aRBq ?q#1bBOK.c^/AY,r$ Ǿ)Uo+[X2K7:|9 +n4bbk%/,:&'Hk*maJI`-*7<ƕ-f-DuC|J`Jcҿ L9qOKC&I&׈N3LIasf1"B5,953)"% k9+L=WSa&DLb;LmYlOJĚ_+`6`(}!ƃKJ*,o H$D\DH,V3q nج2sHȨ c}s)ywn#(dHc[_+Ɯ[%u}2P]AvU'pg<>P`ȗhhH6A _9ozv 㥒\]z~75ᑭ/)KGu}j d>1QG8.bg\_Wq)([LX$f,ؖ?כM-ԫeab(ϦjE9Ґs:wzE^۳*Z S[T;!aA(M.EI̾~q vJ"d4Ƣ"<`'rA=`e1‘P 1 !H$ۗ+ 浻˔X'͋D|A Q22vxD‚u`l) XY8*mauhpbFX"wU^P%۬<Ʌ+yļ0E\h{Iki'VME7ʊ8@A\"6EN2b@xsMm;ROi멱*y:\̷4aKŰjz>:K7 FqTyls z sQQY=k&7P!rǗw&(2%m+*JVIkTbnYGe8,gL  &Dy'Z_P4JԮIYd}Md.o}<&W*6Z|"mx=f I-*[0ğXǏ&fT/Il@|\n<- R`9‹ 45(#x$4!&UvAz>)A*`)KKomIf.XF`C0 ҁpEnB, mF3-K!["eji c`$' ,LYPv^a|JUU5$ډD`/ LӥV<%[Ɩ9X3 lypXL@]o߼a+TMe9DWXs+S)M*mK8*{zu[uM2ȟV:ɓ3 ؞.NԹ.>TɒMeUe*%cgT Ul6᪳0J0pxm:B40 z,Q? jBY_V?.N卾|_Zd;iTm{XULBm-ZqȀm'Q9kE#lR[e+3eR׶glfJ|L3$e \NZZ9a4^ = .V9&ڱHi\: r-Pʲ_u*r9fT097~ۏsf[Y `v­tcW2{uWCl9)d}4@u/=ƅ2ѵ4ĔY|Tiш"wS%fl۬8;uݕ R-k£Xp-&#j%T.l/XtZqVb-u>ieI0cf}? -htXQRq4-Q+ 'Zʉ"JfDs?[HZ5,|@Z4ٲ9 aaoLhd7qt+e}cҡebK48ᒈр9QboC v+f4X0Q4L+9.okC_?6Mdl0z?/&/l*4춽VԳ&ؒX-{Bx?1$BU.BsJe'-1MkWyo29"Q:mG18%2^lIIUEm1_Lue8B{OIXrB:L_ip&^lC'Xޜc/gvDZ 45 w[ \J]34-I P<#JݥqJ ҰyL %(É1~Ǐr:NIE@eA̶$ʚ؉C{eXƗY9Lx,wųe'XjuNp {HK1UrJFјsnŦ30PF)U~qE<M",s0ke7k(rjd[^BtŒ7L1aBʑhs%&;+` vK}yĔVkiC>ѼG0?lK_G79i,JPtNp%VPA@ǓÒ$|s'6Ҍ r-MWHeG ?q18`xcUFcrWH k,խr|t v^9eS<d [P% XofO߉&i5PHj5ڍBˀӐz#5EK\zCUOHb[3 fX@n{8Pu{ijB&W(P?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0375.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT5782V"1290"./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>OJFIFC  !"$"$C"@!1"AQa2qBRb#3r$Tc1!1AQa"q2#R ?ʞEEȧQi`sDL{T뾰jBxBXKpQ3#AH2c=(]XUU\>򧘸HκI b0)+2=F)x uIJ Pe2db6i=ԊKrݔ6}^{w,~tЀpǟ!Y^"=X;җ G[ijO+sLd[b 瑏3#'^+qUEw7ʍn0?#| p7Db< MRd SY;ϺPyLhFƈXIV$瘡m}OhGƆȬ;E 1!TΕ)#|RTDc ~ExF98SdvFN*Ƀ:p/W#fagPfLN)avDPvnƄ1Ur9)DŽWX2f8_3ݚewyi}X}0ք1¼d2Ob{T:HygoS9gfVE,wFiznn2.2+^"`2Is`Q埴,zԯ1 A9D[e?˵}яʪotB[6[{wl6LmSFCfԭ2ځ~Д/V6vHkxAL+b>(|T{[NM-T}V*^^KFUu$a5(F"^[O C,~@g%فG: >UqĀ{g'ʪupȭlS`ubC\ eֆ uPpG0E<ϻβTǩd@7/euc?*3*{8U n<(EFH-U waOXu8ukw,ɘ*庎`jI6 U=C̼ȼCE/4q-˞pkx(DᰲvD9'2vk+9noXJI$Xg›Z7IC,B Mjv2q׵#rcƭ9X-wim,HÉ8jDB  *ѩף&E5b?8zJ.8񏷏Ibc^58=z]ܱQ1E:@t];' v7OT(YcNgyl7Kkq $21{-{KZiD}^;+4.y0.nat+Z1(NM%=FֿG&.&pmo꠶ӴHԌi,6p n Bq<k:P39N(0 (vTvυ0÷'c9"\ LrEʌb!ޕ6N ꃡX##p099xAWxQ<]I_Eڜ`S*jՏ/gmj>i.I@Ѵ%`f[Y9aGYR3Ԁ ~~.-۷n%IwsSr('#J+ξ푎JU 1n;Q^2=) 1b1ޏ^݅D`3tiYє"g87;]ө}mW_פqĜ)FEOG5W}uuHѣ$1Km>u֦oA,1o+zW|Ԛ9!RF^k<';z}Vi ~XIe,V12k1Fwj]- xqho: BAxI@Ey$zתgF8;񫇆"iZuohγĺoo{mqvV8 ðl98ۤ,тc90^0Tv ;,p91Om2vR![>gڰ,_ĒyCc;{m|6y\j̱0lN_l c;{Dt iEKZ-\lr`Gb~ǰ~;oh1+srT7 -A5槧0"ac%?EvX^5@7{]Ni(竜\lE?wOIqr%MK{{+U ԪU·:< vq7"".Xf>c 8pE;I'aXrĒv>$֧i5ܑqSGƇ􎤫>3[Ep}.H?*fr bLIQͱ cہR#xrͨcuԫPa26Đ@s24 `6#I/-¦{IxZUVq~AkVmgI PO9P¯7K緹IL G/5eĵBv`lT)PC̚kO}|M51*zܲ4{=.mXx ϾC;~b\5fRV3>5eQl҅Fbon`{c3R)V0nռljH5?Xչ+Rd2ߕkumZ`sZiȱ!VFZ_~0}<~2v3][=Ux'S^QhV;.qCuf06٪ZKdYȎ]ji[Tc>tCm>%,[VVz8即:Ю'gX>4,6ͤ@絕%gh!ɳ`&UG(bSxRw}✟YmaAժ8?CY06;Ϩ.H< 61]i>*i*i`Ú0%D췦(yXxi-A4߇DeH*$HR8pJ!&y)ޕ*bFFIr1Gk?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0377.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT3004V"12b0"./\]]^2_NSMutableDictionary\NSDictionary ./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>O JFIFC  !"$"$C"? !1A"Qaq2br#3B$CDR%4*!AQ12"q#B ?c!;xY~$`l +{xAaQj<¨zzi+rur2о7-:i!lG8]l ZUթ 26Yk^X&ݖOt~ B<)16_t(u'5T*S5dQBr5At1翤sZJ9zhCC]VJqr˹,hX-P EC+$5ִ?%J\8>nt>87^\G>Eu_S"¤tx[R[JhAD|O(aR^7ufTAaؔG(pծszt+ .5jqE$zvi1q檂`vcxpb=4p4mWAL&tΐet^5gowz*.%azx뉸ZF 0{d~Xrɕ ů:z,EՋm48MY`hJL&`v\9XJVZV8,kZo~F%II+ҤIJR )R* d TzJstuhW5Zt.dS\:ꦉݗ]6U8oZGi@&lV4d+qwp VG>3/qQ!įj`5AC)@ 0H0-kq&Vfc{FTѺGFJ38<4Hݩ!wR׹oT>Do=|RNZp;G1w)dإ-utb)N;HS%(c %IP* A* @(v@6Ne+85oҌY]Va3ςƿk]7gˑ͋NwqGrlI٫>Y̴cDmR rP M52,^;?!]>s~XIt7dz+ ] RR%(IPR Wh) ;Z]o+MU6#!uҌAqЬX`#ivTc w,5̢6*1O&j]SԱRLNi\wTHdE7HĩiIu aƤ$;tHTut׹3dݠ6$cjfc]BV<"IZMJ) Qt]*@EvJJ`+oPc`]ɚyGpBqeOaJwBR\G)H` `P kBĀ~EUKS, 7Boe">BIBlЂB@)6JP(B:;+<_[http://2.bp.blogspot.com/_EMQIqdr0Lj4/SMllPF9S1kI/AAAAAAAAAS0/RmJzUiLDpBA/s200/DSC_0379.JPGO&bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_[http://2.bp.blogspot.com/_EMQIqdr0Lj4/SMllPF9S1kI/AAAAAAAAAS0/RmJzUiLDpBA/s200/DSC_0379.JPG./01X$classesZ$classname12UNSURLXNSObject#AMw9 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0379.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT6920V"12d0"./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>OJFIFC  !"$"$C"A!1AQa"q#2B3Rbr$Scs)!1AQ2#a ?[R(O5X~vM![@[gTج[kWA𬲕 %{Ỉ)NRD:eEh) ?Wy10AnI <ֆj,CxY :dtfٵRԐBPyoQ.2m$@珍sڛjuRJHELgT>pvJuܐVc QX$<0fF3\h`%AD*ji"YJ 񪎮O}KnI5?w[bL7>&>S6$J?e/ǿv|eN[aeyBG@(}TtA=ړϕ\4U-x:VNqKCvГϩcJ*"/5~Z΄W&\L: Ucیjm,c $>xP5;j)WR596hύO%tUusxx %$w9[OLM-Z l+'m^~,P䛚I|(t%(5&rɎZRU.78Em VmuоR"[RH6}kـSя5lyl)ZSgBބ4ͻ% < zs.Il%JDu-_eiۊ]x S1ҳnUg(Iv1uAkN W - [QSo | ck"S0Ch˛ TD)u> %\=sSnvunLLhmJ7 u櫺*<67bcI +;TsއnorQh'Nk|Sv蛔7&VȌvRN<@q.o>ۢV!(gyZFճka or<*>mwSjfE)h#$Gޢk,O،պstdjm&면p8*7PƠ2[/Huwn7':WZj/”F=Ҭaĕ$c4 p0cG\pځ$xUŚu%M3n>f/&3~Zv`z\՗)wǏ)อ4A򧗍>Ѥl8J'8:i}ұ^+L:Z_qQ G;BRF雫_St)fRafrC2Z}3xUevd%R D+n3ʙק>ݼCEĞcȍȓQGM@eʃ16mx_x#-SM-Ca-Y?S4^ft])ܬg9P=kZ4xn4*T[P@N}y59aˌ\|v>i4ł#\u*k)tfȎ V`}RRe6>Ӟ#Sz|=jڦZn>+@q*ӆ2ស13~LU02_Twʗ, NEKHqi2Xe,Yc8l7Gyv ~![)h~R<9gBwHi+hnNԖ TsQV8v-?>{w =*$*C?rX(Ϯb ^DƊWݥBTy#hW(j˄JܴzK{FjPIo옱ޮ6;AHڥq9JUњP#έ@'냧N1[;z[YBzt[{yxo*zsy$AJTdyW!is&.LY1ZTS<‡iח#-ݸqb .Wh!HҢ}OZc&jIГi6!Be!)#Ƃƴ^qFˁV)It$HUBN{aYHiC2iɶ##ֈ W Cq! V77'NX^?˕˂ǕZN3ZȂߑha)Ra~ÊV/:}r#d:RiA?kN\RΠMҤ%A|*\ZZ\%),Wy]xLfRs4*1QFE9S7/ qp(WB/qRU1 ~֟$`֟!*# ~4R|H-Bv}$H7z:Wia]BD)@^כOCQe['\4z?*IUts)QjHm z:_$(cPqG׮qRg'DR=)5'AM үN z.Β>T|~"HK(1f;{JmG, t1K qRlE+WM:jIal ׈ʙ4sQJT]U1V󬛶۫9xvg):OyZk[;̤8]!w XLI*A}ANvZW} ֵ6ɩxe ds+~́iN ;4_ѻ6q(b38l? uk^6ɠ5h?o3cڍiJE9n b?Q $ARWH&PR&nIbʻJmM) YdJc'p5MQ ~{NC*m)mX$|sT-AGfJ(֜.$'ךsTAxU%^O(.rj@z#E8vҝ~Tfґ^/`FKЧv󮱻) -D-< q:$P38ﯮz79@HBWG)N>Tͥ98* vT >ޙ`j>95J銂=ҝ%s4mZ3QW (6fFcIB~k%W]3vd lJRr}ӑ:51μc䆖˜{q'_ /]@zܛТp}2T=kQۑlD 0kb @Sw|U.ҵZ6DGJ JG$#891M-Ma7pm#]C giŒf{r/qT,@*'v1B BRݝk.*+'#RSI)/ԥ,s+ƚ[?2W|PVcG+J3CI$b6oFÏ-+-v~+ci$JôMcw.ArBRSORδD92HCHBp JnI'95k@nHnnC a*ڽ I !?:u3-m]9lo%GN2wpO< ]ijiRc&, iq)ʑϗʥJe!;(vq>UZWN90R`@]K< a).0u3tK^}b @䷃HaŒvH<$$uܓ(6i$C  SpO>W.WܶrBO KQ,/׹ӚnC+R<$z9v|:}*hJ'mJ–ʟTCl% '*1:J=ּ݆ 3y1hIJIܡQRR ij)%xF_2{3%A˃ Y_ip$@/:?ڍ+T<Pc՚՞:@rS2ʟGG'Ci$rKVU󪴞!}2jomr{Yj͖d TQZU}N(آGb{f+wݣ ڞxORAj~6,8jzPaŅ @Q2nt ,0RrT㻔O'&9RJ9r?zts;+:VրgDm)%Qz250ܥAَy#¹e/뼳U ,Q`ۏk^JǠa?X)IC6\ƹFjخ]\1)ӵ%0Vs^R:E~\.99agxK'sGPi .D?9Q䨚4<((P~`RJǕNA򢕫&^(i5@RDCpvy&M?+@_[http://3.bp.blogspot.com/_EMQIqdr0Lj4/SMlllqttMMI/AAAAAAAAAS8/_vcbgJwQJuU/s200/DSC_0384.JPGO&bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_[http://3.bp.blogspot.com/_EMQIqdr0Lj4/SMlllqttMMI/AAAAAAAAAS8/_vcbgJwQJuU/s200/DSC_0384.JPG./01X$classesZ$classname12UNSURLXNSObject#AMw," 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0384.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT5062V"12f0"./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>OJFIFC  !"$"$C"@!1AQa"q#2R$bBr35Cs.!1A"Q#2aRqb ? 'Nh6As sJ}}[Hg<.O4dBiRb29 _ }ۆxɎ*&-xQwgQ8UK#ZpY B^ D@D9|+gت0cb  >d+ :{KNܲ*8)bE軪$}įxmd3@NCv7$yԥؑ<()Pn-9 ےt"{!*XS l~N3d͢me#Cpkuj#igi%Fz;uΏq7ĩoLi8M:sIFigטec[g;t}JFOlU8/T[tk_`K;wֳ6Yc-7-ݜ[y%,0h̤i}b{6O\'Ne R>&߬珽gDh1 X9K `uG 4 ­LrDctуyn5 ]W;K?+E%h,Z 縙0n +ZeΝ1l"{F#.йϥC@n@ZIsqdd\x֕Rl ԞM_Σ4#)!`U^+F{H}>aO+{B^vvofnl3ҡM}_ڠCEgU6)5 ; @_XӜ䠗3S&cLD\LSi<_*ܥmKڪ5'1aq6HӃK Ҝڲjݯ6.@QNe08n$Rm~;;n0*ߴC83}r =dw{9*r]Q\!-])/HS x'O>4ۋW^U4+jw6"jq$S{UmR] Kʷz^ꟉZ݌m i^q=*<:u7lc17]{_Ӌت,}Ɏv` r )s!6O--i&2_cld㡮~ɚdջyi׭ 0?J[+hܘP85gO r|bm;LncIF0|j5 QMx 2>Hӵ^\fUa|'op|L8? 4GXحDx V|O ̭%y w2\GܹnK)ع8ˌtyVړ9'9jvYnacL|'LI<֫ګ]/W,Ge<\X <]2X߬jNv!`U@P2U/d6&1n,S*W8TKlfZ7+^kpp3##΅taH42`2=qyYq(xcm~]in)5p^2@ '8eu8U9><1]ݙд&G{x@sׂVtOMn-n4{pdF #dv[]h$Lp0F@oAsd|$];IuKKL+Y5=Է3D]#]D7wC]98[PwfvyW6:{K5=V6''s`] D}ZK}ݤ@f䟖Ps^;͑OݨRs4<zh"&TLmx*!S. 5-!MW7RG>x\Ճi'P4nW,|*dB-۶>Y8yZMF^@>D]"ui*Oy^IVc㕪G]J²[R@|riRQT1iRFB5U]̠ ҥ^Qi9"#fH *TiI?BC+D_[http://2.bp.blogspot.com/_EMQIqdr0Lj4/SMlmVn3QtXI/AAAAAAAAATE/B2qMDwLiz1U/s200/DSC_0382.JPGO&bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_[http://2.bp.blogspot.com/_EMQIqdr0Lj4/SMlmVn3QtXI/AAAAAAAAATE/B2qMDwLiz1U/s200/DSC_0382.JPG./01X$classesZ$classname12UNSURLXNSObject#AMw 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0382.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT6448V"1310"./\]]^2_NSMutableDictionary\NSDictionary0./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>O0JFIFC  !"$"$C" C !1AQ"aq#2B$3Rb 4Ccrs3!1A"Qaq2B3b ?]Yddzd陃7y_x?U zgRpͬ`SM84zH96?^u jL*cU&N2 ڲ޶sI{2T^H>ӿh2Z(dfSi>IWFM{w33d{M;Y2ȪLyۿ~|Yu˶(\>:~}YuXdÙnBHz扃me5ʹZ]]uk}m$-嚪/l'9mV[ƻYtk^K6pjo:jZ]#=˩L*l# {KNe?Ҥ$-hHD9ԅ†ХsYvszay'U?_OtJV&\WQU*? >TE8= #4GǩDgwOIs4[Jk=6I-SwbEq}v]H\"?.:Y$S$l|з:KAԴ>Wh1Տ-= $qm=)G /u$g )wHP*w抪 eQ2JM.9- F7yiq޴Ȁ%o6=z]J(|gf|D9S$K;S pC ![ekcp*:{LI4ʼn'-gmpnuC,ԏNw65̈́mx\ڧ~㽵M2(PYȨ]qDOvs\zOk:r>Na^3Uu B9i%F^9/E)ĿY4B{Y0X) רn`Y]%QipV:JuzV/ '>jQzEZP{j5I5$֞B.Z 'R9;dH:Ri|aaEYh3|y:䂒¡fTԊ#{f]{%%20ovii/^IYd~8huŝ#y\~'¨e'{ -}5o z]׈lC$2rxm^oWEgw4vȲ* ''VG2B)c{ՂTMfK|qǯI#+u2ضTt՟A9OeNVVNjzVmn%GQ=9]M\)aOjihR@<p;qdZiؽg7tEq j[#krHTt[Ϛ81!=z֥8`x'r|kGԧ6UmJ$dOIȯ IocoMy]ߙy5D46;qP'?rkνg 42TΪͨuWѐG_.!=]?cZLP3*Oqo; !mF~ڎ$v嘓^䵳 ~An8I?[`+6caSr 7#!9e ydS<Ry̕j%Ďo£]<@']`ұcZ3W7Y(B!ǩWDiiz]iE5⍢ҭH}Ǒ0naǞ 3?3&.Aǟ}-{]&NkMAj8gwc|,m~k{GSVoqs8 ُT*Rgqx7_{]8`:m35Ev@5302$` ;_ H*sĥeBpE7vH&9)Һy<< W?.1}($ N0>40J|>jnSTn+BN3&_YY1j#n$[\ҵWG"+ 2sNyO#Ko{!DVgDO"%\$$cڬy 6әSķvҜS9wHj:&}GßiwYk^4|ϫW!cqy'a)(?EK^&Mb QQr^-U彸Gb69۴/}m/YӚܽ@|G#jGnFy"E?ֺ{k[g.w!+|*]ce^oqu8`tJ~a+I~ݽlRS"gv#^Т1ldRIK+EjZCG{?0;4Spc7yR:1X>u^ }5`23#=i&^x4hskPi#|T Fa&8",&Fm j=A$7ׯfJlSO2A6؅iZѡc!wϟS,=*?*kZ.T)39M28LMN2MFZ_Hz|)1S\BdB xY8e#wUuq9 Vr%ߤEƋRJ|EI4cΪ:ɇ#zU q=z[~g=1,#W-rw`m>tv'Μ5ڼvc$ ұE.y/{SvzRW r']8AG%#.?>s"̣t!\|8~ѝyT+Md:Cͽ5)LtA36$OEXO=uKVǙc_1{u4Nx2g`fGo'hgã؊g+'Y8&/Lq*%I՝%EaWs^@8\So G86ӫtaಷ rXO{=R{bwv(b2xw:ebKd-$тq$k摦ᬠ!$H<۟R ^t1twaf=Q~[s&sT5^&OC'Jzq*WHDڎr;xų nKn٧|wi[ex_!u"u1_Zuz?YH6tE QWPiŝ3@Fx$57-=vIѮt*ߑsp7G'>(tYac*iy^D^;l=R&j*Q4f!B~:2Ij\C7'ϞcVYb۽b'۴Ia~t:0T|{bLc '|j=s/(ϥ8U{}A j i i{yV{9BJ 4T=DS3)ى z\ 9?2t}}-jW:h1ו &nx C\oTiպc5;;--NޕߔQ~7JkwtWK{:ok^;pC7Sk^B1Mɸ4cwÏ*U#_Ñ?ΐUFJO[ 4:I?RzMYu,@|X= -JGW/=428v u={MQcc|&{l[:$< \w)e[sj~y_U?Oh b,K#kӺfGZZOՙM\pG%cE$s)ضi$z&iaYu{b-D n8A#87Ll2_E sĊnXIgYIXC6Ɣ 3Ouؑ*1փV$w1-<$L X l}H ѷE[$AE.f]h$(!fͧ@R5] UU~U aI}v5grq?Ć#D@DUOp{QPOg=N[E)Hnw"6N98P:W "򈭁Cl #ƹBGR_m&27c-69a]( ;_jJjDu j3-f ]&8'$N_MAS>:Rk9zm1𮘢ftwfW*c萬v0H$|9#QFtS˜ZQE6I (O,0IϘTQD!EQQEBQEQD!EQQEBQEQD!EQQEBQEQD!EQQEBQEQD!EQ FG+H_[http://4.bp.blogspot.com/_EMQIqdr0Lj4/SMlmgk6OZpI/AAAAAAAAATM/pj6yFlETMvM/s200/DSC_0385.JPGO&bplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_[http://4.bp.blogspot.com/_EMQIqdr0Lj4/SMlmgk6OZpI/AAAAAAAAATM/pj6yFlETMvM/s200/DSC_0385.JPG./01X$classesZ$classname12UNSURLXNSObject#AMwKh 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Disposition\Content-TypeVServerTDate^Content-LengthTEtag_Fri, 19 Sep 2008 15:11:22 GMT_max-age=86400, no-transform_"attachment;filename="DSC_0385.JPG"Zimage/jpegTfife_Thu, 18 Sep 2008 15:11:22 GMTT5446V"1330"./\]]^2_NSMutableDictionary\NSDictionaryF./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd hmv%,1@Ee0d>OFJFIFC  !"$"$C"F !1"AQaq2B#Rrb$34CDSs/!1AQa"q2#B ?ՕN _ޥ Y;xϵ5QwN$tѽ; w* %{YI5|$(,rǻAix nj%HcԵe&jqz>V{c7RY2yuhߵgMhUH ڠUQ]ռKnNshƟovg6$DrUDZ5pլ[fQcUNi6,rtnjG]+IcvȥvUpr{[+"Tqqp2o!S#*+}[b6[uY?g{T^ .Bな* SJ)ƳȈ%نOWTnER7M&+)h*-6FjH@4(o֣ӬR8-FlzV1 ÿ5ln}r c2HHvgu&K{u\GME^emT hQT).so# x;  Qi$wTX(Yۚ:%n[HVN*k,ՙAc\⢴ VOԸSug }05Heeä#5Son7 orXֽ?gԚ< y[>ǵrM'II-;Jw㿧Y(u$22`FIr; zWHޟ8ἾO`g_P`!*=Rkʧ mGhq= pps(o~D[iU`g9<׋'H75!vJÁMap;UB xL߆%]ʝũQ*MlT!1k&T;zwٳrkF@<ݨ$^Q Ps00 '4F6j*2{)u9u+֕ϔQ_>x@{ֿ]D޷n֌;2kIS$2R Ӻ][V [n yZc6gS*ɥ ܴReǥtqrxO%HDi"tZ#if'?<U儚\=;@ݷP}qtN*?yD~ͥOengV2W}}? 0[:dvv69v4q&Ouېpe5c;xp X,GobWO?ȏ wݹ N*M[Qw0KeǭD'%G5 3ڢM)$Bq*V;f5݁JcCǜSD 2kmʟCqy٩Hsǚ0qdG9w8kuQEz,okgzޕ!%L_[ }j6/#= 29>ޮ4 fU =$Q F洍Eg~SUJsSBH6Ȣr54^lCrХȲ̼n%mKWVFIOrjWm7- Ա|RˆIS!N1n5Sly%%oDzkFHGS$w2~O?e~iqf{ 9 0;U=5-0E짏sAȭ&y4D3PucHQ,NM**Aɺ6 ;s]cҞTcxRrsځ,8fB0?I+ȥ 6E@²N#wF1/SL+Pm~KcčOX|G\[*hdbC,Osp[t6ii* IԬnYe;as{kEwӺe #' +b-4_K{5m H7 #TˁkR6|5rBS p-|?Ƣv z?ğsÝ9$UkIIp5ު]/[KȦIʻ*Uv1xMMMSӖ[w2;I(WB2:4۞6ܤlB4MFĎOE8Id\ܓL[>M`w#V[I5<ז +jRj> JO;kU"_\'#q}~n֢dXMEmN42Bc A5zb֗qu8·=zNRm _~?F"W{"^!.19<j6@}};6 V(升*?9d#{sxwHU2۱)Q :$*#-#n۝#8=cꯠVdeHڧanHaV_u֪UyVT2f֧ԵkyK7qҠYF |۱IzFGzm{!=wmSmw$~NZ<[ [l=+XtʐNAdתl>iIStcu^AӋK3.Sf&֭$k{H4~!W evݷAhI$f2Nۥ3(s@N? (=DN5(YAHt-i;{ZUxSE٬>TUSdSRJɩDTB)䉶F &&NZ:Ǟ4o h,yl>?7oJ+{ K'ѰHu0(|GQQhD!WjX˺࢓L̀֒L hרRJD[JYxUY=M٢BF1 ŀ䂼Άk~0i @sD6T4ҡ1byY*}1Yi>t⹔wTj'AC= QRog 4~uqY~08O`qޕQ JJP1JdrjTҥ@p'RiJ +ȧ iR ӶJ4 P_M*T9&*w PeJ#P0=R XwJ?JKLM_1http://www.blogger.com/img/icon18_edit_allbkg.gifObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345IJKLMNOPQRSTUVW[\U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_1http://www.blogger.com/img/icon18_edit_allbkg.gif./01X$classesZ$classname12UNSURLXNSObject#Ae 6789AWNS.keysZNS.objects:;<=>?@ BCDEFGH]Cache-ControlWExpires\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Sun, 17 Jan 2038 19:14:07 GMTYimage/gifSgwsS162_Thu, 11 Sep 2008 13:30:15 GMT_Fri, 09 May 2008 15:04:46 GMT./XYYZ2_NSMutableDictionary\NSDictionary./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd<AJUX^gpry -7;?_`Yimage/gifOGIF89aǻj4TSP% Џ)I5S(3&1#ǻ!,OI`(1 "N(‡!3 wH@ 1憐 ra R/yL `MJ;OPQR_3http://www.blogger.com/widgets/517042800-widgets.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_3http://www.blogger.com/widgets/517042800-widgets.js./01X$classesZ$classname12UNSURLXNSObject#AB 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Last-Modified]Cache-ControlWExpires_Content-Encoding\Content-TypeVServerTDate_Transfer-Encoding_Wed, 03 Sep 2008 19:03:47 GMTVpublic_Sat, 11 Oct 2008 13:30:18 GMTTgzip_text/javascriptWGFE/1.3_Thu, 11 Sep 2008 13:30:18 GMTXIdentity./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd @ENY\bktv}(HOotd_text/javascriptOvar w_a=false;function w_b(a){try{throw a;}catch(b){w_c(b)}}function w_c(a,b){var c="Javascript exception: "+(b?b:"")+" "+a;if(w_d())c+=" "+a.name+": "+a.message+" ("+a.number+")";var d="";if(typeof a=="string")d=a+"\n";else for(var e in a)try{d+=e+": "+a[e]+"\n"}catch(f){}d+=w_e(w_c.caller);w_aa(c+"\n"+d,1)}var w_ba=/function (\w+)/;function w_ca(a){var b=w_ba.exec(String(a));if(b)return b[1];return""}function w_e(a){try{if(!w_d()&&!(w_f("safari")||w_f("konqueror"))&&w_f("mozilla"))return Error().stack; if(!a)return"";var b="- "+w_ca(a)+"(";for(var c=0;c0)b+=", ";var d=String(a.arguments[c]);if(d.length>40)d=d.substr(0,40)+"...";b+=d}b+=")\n";b+=w_e(a.caller);return b}catch(e){return"[Cannot get stack trace]: "+e+"\n"}}var w_da,w_g=null,w_h=false;function w_ea(){if((w_g==null||w_g.closed)&&!w_h)try{w_h=true;w_g=window.open("","debug","width=700,height=500,toolbar=no,resizable=yes,scrollbars=yes,left=16,top=16,screenx=16,screeny=16");w_g.blur();w_g.document.open();w_h= false;var a="To turn off this debugging window,hit 'D' inside the main caribou window, then close this window.
";w_i(a)}catch(b){}}function w_aa(a,b){if(!w_a){typeof w_j!="undefined"&&w_j(w_k(a));return}try{var c=(new Date).getTime()-w_da,d="["+c+"] "+w_k(a).replace(/\n/g,"
")+"
";if(b==1){d="Error: "+d+"";w_g.focus()}}catch(e){}w_i(d)}function w_i(a){if(!w_a)return;try{w_ea();w_g.document.write(a);w_g.scrollTo(0,1000000)}catch(b){}} ;function w_f(a){if(a in w_l)return w_l[a];return w_l[a]=navigator.userAgent.toLowerCase().indexOf(a)!=-1}var w_l={};function w_d(){return w_f("msie")&&!window.opera}function w_fa(a){if(typeof Error!="undefined")throw new Error(a||"Assertion Failed");else throw a;}function w_ga(a){a=a||"Assertion failed";typeof w_b!="undefined"&&w_b(a+"\n");w_fa(a)}function w_m(a,b){if(!a){b=b||"Assertion failed";w_ga(b)}}function w_ha(a,b){a.style.display=b?"":"none"}function w_ia(a,b){a.style.display=b?"block":"none"} function w_n(a,b){a.style.display=b?"inline":"none"}function w_o(a,b){if(a==null||a.className==null)return false;if(a.className==b)return true;var c=a.className.split(" ");for(var d=0;d/g;function w_k(a){if(!a)return"";return a.replace(w_ka,"&").replace(w_la,"<").replace(w_ma,">").replace(w_na,""")}var w_na=/\"/g;function w_oa(a){return document.getElementById(a)}function w_pa(a){return document.all[a]}var w_qa=document.getElementById?w_oa: w_pa;function w_j(a){try{if(window.parent!=window&&window.parent.log){window.parent.log(window.name+"::"+a);return}}catch(b){}var c=w_qa("log");if(c){var d="

"+new Date+""+a+"

";c.innerHTML=d+c.innerHTML}else window.status=a};function w_s(){}w_s.raise=function(a){if(typeof Error!="undefined")throw new Error(a||"Assertion Failed");else throw a;};w_s.fail=function(a){a=a||"Assertion failed";typeof w_b=="undefined"||w_b(a+"\n");w_s.raise(a)};w_s.isTrue=function(a,b){if(!a){if(b===undefined)b="Assertion failed";w_s.fail(b)}};w_s.equals=function(a,b,c){if(a!=b){if(c===undefined)c="AS_Assert.equals failed: <"+a+"> != <"+b+">";w_s.fail(c)}};w_s.typeOf=function(a,b,c){if(typeof a==b)return;if(a||a=="")try{if(b==w_s.TYPE_MAP[typeof a]|| a instanceof b)return}catch(d){}if(c===undefined){if(typeof b=="function"){var e=b.toString().match(/^\s*function\s+([^\s\{]+)/);if(e)b=e[1]}c="AS_Assert.typeOf failed: <"+a+"> not typeof "+b}w_s.fail(c)};w_s.TYPE_MAP={string:String,number:Number,"boolean":Boolean};w_s.numArgs=function(a,b){var c=w_s.numArgs.caller;if(c&&c.arguments.length!=a){if(b===undefined)b=c.name+" expected "+a+" arguments but received "+c.arguments.length;w_s.fail(b)}};var w_t;function w_ra(){var a=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest=="undefined"&&typeof ActiveXObject!="undefined"){for(var b=0;b"+c.stack);throw c;}};var w_ua=0,w_u=0;if("undefined"==typeof w_j)w_j=function(){};function w_va(a){var b=-1;try{b=a.status}catch(c){}return b}function w_wa(a){var b=null;try{b=a.statusText}catch(c){}return b}function w_xa(a,b,c,d){if(a.readyState==4)try{var e=true;if(d)try{e=!(false===d(a))}catch(f){w_j("Message ("+b+") handling failed: "+f);throw f;}var g=w_va(a);if(200===g){w_j("Message ("+b+") received after "+((new Date).getTime()-c)+" ms");try{var h=(new Date).getTime();e&&a.responseText.length&&eval(a.responseText); w_j("Message ("+b+") processing took "+((new Date).getTime()-h)+" ms")}catch(f){w_j("Message ("+b+") processing failed: "+f);alert(f+"\n"+f.stack+"\n\n"+a.responseText);throw f;}}else 204==g?w_j("Message ("+b+") received after "+((new Date).getTime()-c)+" ms"):w_j("Message ("+b+") failed with response "+g+" "+w_wa(a)+" after "+((new Date).getTime()-c)+" ms.")}finally{--w_u}}function w_ya(a,b,c){var d="";if(b){var e="";for(var f=0;f=0;)m=m.substring(0,n)+"&"+m.substring(n+1);w_j("Message ("+i+") sent: POST "+m+".");++w_u;w_sa(j,a,d,l)};var w_za=this;if(!Function.prototype.apply)Function.prototype.apply=function(a,b){var c=[],d,e;a||(a=w_za);var f=b||[];for(var g=0;g=0;b--)this[b+a]=this[b];for(var c=0;c"+a.template+"\n",c=this.Eb(b);a.parsedTemplate=this.P(c);return a};w_x.ConfigureWidget=function(a,b){b||(b="config");var c=document.forms[b].widgetId.value,d=document.forms[b].widgetType.value,e=w_A.ProcessForm(document.forms[b],a);e.success&&w_.SaveWidget(e.values,c,d)};function w_(){}w_.Init=function(a,b,c){w_.M={};w_.cc=a;w_.Ka= b;w_.Uc=c;w_.hc=null;if(!w_.cb)w_.cb={}};w_.TrapClicks=function(a){var b=w_.CreateTransparentClickTrappingDiv(a.document);document.body.appendChild(b)};w_._SetupPreview=function(){w_.TrapClicks(window)};w_.NEW_WIDGET_WINDOW_NAME="chooseWidget";w_.CHOOSE_WIDGET_ACTION="chooseWidget";w_.EDIT_WIDGET_ACTION="editWidget";w_.GetCallbackUrl=function(){return w_.Ka};w_.SetPageActionUrl=function(a,b){w_.Wa=a;w_.Mc=b};w_.GetPageActionUrl=function(){return w_.Wa};w_.SetWidgetRefreshUrl=function(a){w_.Rc=a}; w_.GetWidgetRefreshUrl=function(){return w_.Rc};w_._SetDataContext=function(a){w_.hc=a};w_._SetSystemMarkup=function(a){w_.cb=a};w_._RegisterWidget=function(a,b,c){var d=new w_x(b);c||(c=window[a]);var e=new c(d);d.Qb(e);w_.M[b.instanceId]=e;w_.DisplayWidget(e);return e};w_._RegisterNewWidget=function(a,b,c){var d=w_._RegisterWidget(a,b,c),e=d.b();e.Pb(true);return d};w_.DisplayWidget=function(a,b){var c=a.b();if(c.O()==w_w.DISPLAY_MODE_NONE)return;if(b||a.g&&a.g())c.jb();c.O()==w_w.DISPLAY_MODE_FULL&& a.h&&a.h();a.b().Hc=false};w_.GetWidget=function(a){if(w_.M)return w_.M[a];return null};w_._PopupPaneFromParams=function(a,b,c,d,e){var f="";if(d)f="&widgetId="+d;var g=w_.cc+"&action="+a+"§ionId="+b+"&widgetType="+c+f;if(window.name==e){window.location.replace(g);window.focus();return window}var h=window.open(g,e,"width=570,height=600,left=75,top=20,resizable=yes,scrollbars=yes");h.focus();return h};w_._PopupConfig=function(a){var b=a.getAttribute("id"),c=w_.GetWidget(b);if(c){var d=c.b().configWin; if(d!=null&&!d.closed){d.focus();return false}}var e="config"+b,f=w_._PopupPaneFromParams(w_.EDIT_WIDGET_ACTION,a.parentNode.getAttribute("id"),a.getAttribute("widgetType"),b,e);if(c)c.b().configWin=f;return false};w_._PopupToolbox=function(a){w_._PopupPaneFromParams(w_.CHOOSE_WIDGET_ACTION,a.parentNode.getAttribute("id"),a.getAttribute("widgetType"),a.getAttribute("id"),w_.NEW_WIDGET_WINDOW_NAME);return false};w_.DeleteWidgetFromPage=function(a,b){w_.q(b,b.LayoutsMessages.DELETING,w_.STATUS_MESSAGE_PENDING_CLASS); w_.RunPageAction("delete",{},a,b)};w_x.prototype.Ob=function(a,b){w_.q(b,b.LayoutsMessages.SAVING,w_.STATUS_MESSAGE_PENDING_CLASS);this.z("configure",a)};w_.SaveNewWidget=function(a,b,c){var d=document.getElementById("sectionId").value;a.sectionid=d;w_.q(c,c.LayoutsMessages.SAVING,w_.STATUS_MESSAGE_PENDING_CLASS);w_.RunPageAction("addnew",a,"",b)};w_.SaveWidget=function(a,b,c){w_m(c!=null,"no type");var d=_WidgetManager._GetWidget(b);w_m(d!=null,"no widget for "+b);d.b().Bb()?w_.SaveNewWidget(a,c, window):d.a.Ob(a,window)};w_._RunInitialAction=function(a){var b=w_._GetWidget(a);b&&b.b().z("initial")};w_.z=function(a,b,c,d,e){w_.RunAction(w_.Ka,a,b,c,d,e)};w_.RunPageAction=function(a,b,c,d,e){if(!w_.Wa){w_j("RunPageAction error: pageActionUrl_ is undefined. widgetid: "+c+" action: "+a);return}b.pageToken=w_.Mc;w_.RunAction(w_.Wa,a,b,c,d,e)};w_.RunAction=function(a,b,c,d,e,f){var g=["action",b,"widgetId",d,"widgetType",e,"responseType","js"];for(var h in c)if(typeof c[h]=="object")for(var i= 0;i0&&a.substring(0,4)!="http")a="http://"+a;return a};w_.GetFirstElementInElementWithClass=function(a,b){if(w_o(a,b))return a;if(a){var c=a.childNodes.length;for(var d=0;db)return LayoutsMessages.NUMBER_TOO_LARGE+" "+b;return undefined}};function w_z(){this.r=[];for(var a in w_.hc)this.r[this.r.length]=a}w_z.DEFAULT_DICTIONARY_KEY="";w_z.MAX_DICTIONARY_DEPTH=50;w_z.SEPARATOR_CHAR=".";w_z.prototype.N=function(a,b){this.r.length>=w_z.MAX_DICTIONARY_DEPTH&&w_s.raise("Cannot add another dictionary: "+ a);a.indexOf(w_z.SEPARATOR_CHAR)>-1&&w_s.raise("Cannot add dictionary name containing '.': "+a);var c={};c.name=a;c.data=b;this.r[this.r.length]=c};w_z.prototype.za=function(a){var b=this.r[this.r.length-1];b.name!=a&&w_s.raise("Dictionary "+a+" is not the last one, and can't be deleted: "+b.name);this.r.splice(this.r.length-1,1)};w_z.prototype.X=function(a){if(a==null)a=w_z.DEFAULT_DICTIONARY_KEY;for(var b=this.r.length-1;b>=0;--b)if(this.r[b].name==a)return this.r[b].data;return null};w_z.prototype.na= function(){return this.X(w_z.DEFAULT_DICTIONARY_KEY)};w_z.prototype.fb=function(a){this.N(w_z.DEFAULT_DICTIONARY_KEY,a)};w_z.prototype.k=function(a){var b=this.X(a);if(b)return b;var c=a.split(w_z.SEPARATOR_CHAR);if(c.length==1){b=this.na();return b[a]}b=this.X(c[0]);var d=0;if(b)d=1;else b=this.na();for(var e=d;e=500){if(b.responseText.length)document.body.innerHTML=b.responseText;else alert(LayoutsMessages.SERVER_ERROR);return false}return a?a(b):true}};function w_C(a){this.a=a}w_C.WIDGET_TYPE_NAME="AdSense";w_C.prototype.d=function(){return w_C.WIDGET_TYPE_NAME};w_C.prototype.b=function(){return this.a};w_C.prototype.c=function(a,b){this.a.i(b)};var _AdSenseView=w_C;function w_D(a){this.a=a;this.e=a.l()}w_D.WIDGET_TYPE_NAME="BlogArchive";w_D.POST_LIST_CLASS="posts";w_D.INTERVAL_EXPANDED_VALUE="expanded";w_D.INTERVAL_COLLAPSED_VALUE="collapsed";w_D.LOADING_MSG="loading...";w_D.POST_COUNT_CLASS="post-count";w_D.POST_COUNT_LINK_CLASS="post-count-link";w_D.MENU_ROOT_ID="ArchiveMenu";w_D.TOGGLE_OPEN_CLASS="toggle-open";w_D.Gc="▼ ";w_D.dc="► ";w_D.prototype.d=function(){return w_D.WIDGET_TYPE_NAME};w_D.prototype.b=function(){return this.a};w_D.prototype.g= function(){return false};w_D.prototype.c=function(a,b){if(a=="configure")this.a.i(b);else if(a=="getTitles")this.Vb(b);else{this.widgetInfo.data=b;w_.DisplayWidget(this)}};w_D.prototype.h=function(){var a={};a.select=function(i){return i&&w_o(i,"toggle")};var b=this.a.t("ArchiveList");if(!b)return;var c=w_r(this.e.rootElement,a),d;if(c.length>0&&c[0].currentStyle)d=c[0].parentNode.currentStyle.color;for(var e=0;e"+e.title+"";c.appendChild(f)}};w_D.prototype.rb=function(a){var b=this.e.rootElement.getElementsByTagName("A");for(var c in b){var d=b[c];if(d.href==a)return d.parentNode}};w_D.prototype.Cb=function(a){var b=a.getElementsByTagName("UL");if(b.length>0&&!w_o(b[0],"posts"))return;var c=this.tb(a),d=a.getElementsByTagName("LI"),e=d.length;return e-1};w_E.prototype.ta=function(a){a=a||window.event;var b=a.target||a.srcElement;this.a.z("nextposts",{path:b.href}); return false};w_E.prototype.hb=function(a){var b="";if(document.selection)b=document.selection.createRange().text;else if(window.getSelection)b=window.getSelection();else if(document.getSelection)b=document.getSelection();window.open(a+"?t="+encodeURIComponent(b)+"&u="+encodeURIComponent(window.location.href)+"&n="+encodeURIComponent(document.title),"bloggerForm","scrollbars=no,width=475,height=300,top=175,left=75,status=yes,resizable=yes");return false};var _BlogView=w_E;w_F.Id={BLOGS:"blogs",CONTAINER:"container",SHOW_ALL:"show-all",SHOW_N:"show-n"};function w_F(a){this.a=a;this.e=a.l()}w_F.WIDGET_TYPE_NAME="BlogList";w_F.prototype.ia=null;w_F.prototype.T=null;w_F.prototype.d=function(){return w_F.WIDGET_TYPE_NAME};w_F.prototype.b=function(){return this.a};w_F.prototype.g=function(){return false};w_F.prototype.c=function(a,b){a=="configure"&&this.a.i(b)};w_F.prototype.h=function(){var a=this.a.k();this.ia=a.totalItems;this.T=a.numItemsToShow;if(this.T!=0&&this.ia> this.T){var b=this.a.p(w_F.Id.SHOW_ALL);b.onclick=this.db.bind(this);var c=this.a.p(w_F.Id.SHOW_N);c.onclick=this.db.bind(this)}var d=this.ec.bind(this),e=window;if(e.addEventListener)e.addEventListener("load",d,false);else if(e.attachEvent)e.attachEvent("onload",d);else e.onload=d};w_F.prototype.db=function(){var a=this.a.p(w_F.Id.BLOGS),b=a.getElementsByTagName("li");for(var c=this.T;cc){a.height=Math.round(c/a.width*a.height);a.width=c}a.style.visibility="visible"};w_L.prototype.c=function(a,b){a=="configure"&&this.a.i(b)};var _ImageView=w_L;function w_M(a,b,c,d,e,f,g,h){this.o=a;this.$b=b!="null"?b:null;this.mc=c;this.kc=d;this.lc=e;this.xc=f;this.nc=g;this.Nc=h;this.w=-1;this.C=-1;this.D=null;this.s=document.getElementById(this.o+"_picImg");this.ba=document.getElementById(this.o+"_changeImageLink");this.fa=document.getElementById(this.o+"_imageChoiceTable");this.ic=document.getElementById(this.o+"_imgSrcFromPCRadio");this.jc=document.getElementById(this.o+"_imgSrcFromWebRadio");this.j=document.getElementById(this.o+"_imgFileNameInput"); this.S=document.getElementById(this.o+"_imgUrlTextInput");this.Yb=window.frames[this.o+"_asynchronousFileUploadIframe"];this.Pa=0;this.m=new Image;this.m.onload=this.hitch(this,this.uc);this.m.onerror=this.hitch(this,this.tc);this.fc=false;this.Ta=null;this.n=null;this.I=null;this.Xa=false}w_M.prototype.Sa=function(){return this.ic.checked};w_M.prototype.uc=function(){this.Pa=0;w_A.ClearError(this.o+"_imgUrlTextError");w_A.ClearError(this.o+"_imgFileNameError");if(!this.Sa()||this.w==0){this.w=this.m.width; this.C=this.m.height;this.D=this.m.src}var a=1,b=1;if(this.m.width>300)a=300/this.m.width;if(this.m.height>300)b=300/this.m.height;var c=Math.min(a,b);this.s.style.width=Math.round(this.m.width*c)+"px";this.s.style.height=Math.round(this.m.height*c)+"px";this.s.src=this.m.src;this.s.style.display="";this.fa.style.display="none";this.ba.style.display="";this.j.disabled=true;this.mc&&this.mc.call({},this.s.src,this.D,this.w,this.C)};w_M.prototype.K=function(a,b,c,d){if(a){w_A.SetError(this.o+"_imgFileNameError", b);w_A.ClearError(this.o+"_imgUrlTextError")}else{w_A.SetError(this.o+"_imgUrlTextError",b);w_A.ClearError(this.o+"_imgFileNameError")}this.s.style.display="none";this.fa.style.display="";this.ba.style.display="none";this.j.disabled=false;this.kc&&this.kc.call({},c,d)};w_M.prototype.tc=function(){if(this.Pa<2){this.Pa++;var a=this.m.src;this.m.src="";this.F(a)}else this.K(this.Sa(),WidgetMessages.SIV_INVALID_URL,this.s.src)};w_M.prototype.hitch=function(a,b){return function(){b.apply(a,arguments)}}; w_M.prototype.F=function(a){this.ab();this.m.src=a};w_M.prototype.La=function(a){var b=a||window.event;if(window.event){b.returnValue=false;b.cancelBubble=true}else{b.preventDefault();b.stopPropagation()}this.s.style.display="none";this.ba.style.display="none";this.fa.style.display="";this.j.disabled=false;this.S.value="";this.Ya();this.Xa=true;this.lc&&this.lc.call({})};w_M.prototype.Qa=function(){this.ic.checked="true";this.S.value="";this.ab();this.pc();this.fc=true;try{this.n.submit()}catch(a){this.K(true, WidgetMessages.SIV_INVALID_URL,this.n.value)}this.oc()};w_M.prototype.H=function(){var a=this.Yb.document.result;a||this.K(true,WidgetMessages.SIV_INVALID_URL,this.j.value);if(a.hasErrors)a.errors.length>0?this.K(true,a.errors[0].message,this.j.value,a.Ic):this.K(true,WidgetMessages.SIV_INVALID_URL,this.j.value,a.Ic);else{var b=Math.max(a.origWidth,a.origHeight),c=this.Oa();if(this.w!=0&&c!=-1&&b>c){var d=c/b;this.w=Math.round(a.origWidth*d);this.C=Math.round(a.origHeight*d)}else{this.w=a.origWidth; this.C=a.origHeight}this.D=a.mainSrc;this.F(a.thumbSrc)}};w_M.prototype.Ra=function(a){var b=a||window.event;if(b.keyCode==9)return;this.jc.checked="true";this.Ta!=null&&window.clearTimeout(this.Ta);var c=this.hitch(this,function(){if(this.Xa||this.m.src!=this.S.value.toLowerCase()){this.Ya();this.F(this.S.value.toLowerCase())}this.Xa=false});this.Ta=window.setTimeout(c,1000)};w_M.prototype.Ua=function(a){this.jc.checked=true;this.S.value=a;this.F(a)};w_M.prototype.ab=function(){this.s.src="img/icon_inprogress.gif"; this.s.style.width="200px";this.s.style.height="200px";this.s.style.display="";this.fa.style.display="none";this.ba.style.display="none"};w_M.prototype.pc=function(){if(!this.n){this.n=document.createElement("form");this.n.action="imageUpload.do";this.n.method="POST";this.n.target=this.Yb.name;this.n.encoding="multipart/form-data";this.n.style.display="none";if(this.$b){var a=document.createElement("input");a.type="hidden";a.name="blogID";a.value=this.$b;this.n.appendChild(a)}var b=document.createElement("input"); b.type="hidden";b.name="sectionWidth";b.id="sectionWidth";this.n.appendChild(b);var c=document.createElement("input");c.type="hidden";c.name="photoUploadSecurityToken";c.value=this.Nc;this.n.appendChild(c);document.body.appendChild(this.n)}var d=this.Oa();if(d==-1)d=1600;document.getElementById("sectionWidth").value=d;this.I={parent:this.j.parentNode,nextSibling:this.j.nextSibling};this.j.parentNode.removeChild(this.j);this.n.appendChild(this.j)};w_M.prototype.oc=function(){this.n.removeChild(this.j); this.I&&this.I.nextSibling?this.I.parent.insertBefore(this.j,this.I.nextSibling):this.I.parent.appendChild(this.j)};w_M.prototype.Ya=function(){var a=document.createElement("input");a.type="file";a.name=this.j.name;a.id=this.j.id;a.onchange=this.j.onchange;var b=this.j.nextSibling;b==null?this.j.parentNode.appendChild(a):this.j.parentNode.insertBefore(a,b);this.j.parentNode.removeChild(this.j);this.j=a};w_M.prototype.Oa=function(){return this.xc==-1&&this.nc?this.nc():this.xc};function w_N(){this.usiContainers= []}var w_Ga=new w_N;w_N.prototype.Ma=function(a,b,c,d,e,f,g,h){this.usiContainers[a]=new w_M(a,b,eval(c),eval(d),eval(e),f,eval(g),h);return this.usiContainers[a]};w_N.prototype.ea=function(a){return this.usiContainers[a]};w_N.prototype.H=function(a){var b=this.ea(a);b&&b.fc&&b.H()};var _UploadSimpleImage=w_Ga;w_N.prototype._createUsiContainer=w_N.prototype.Ma;w_N.prototype._getUsiContainer=w_N.prototype.ea;w_N.prototype._channelResultArrived=w_N.prototype.H;w_M.prototype._changeImage=w_M.prototype.La; w_M.prototype._imgUrlFileOnChange=w_M.prototype.Qa;w_M.prototype._imgUrlTextOnKeyUp=w_M.prototype.Ra;w_M.prototype._loadInitialUrl=w_M.prototype.Ua;w_M.prototype._loadImageFromUrl=w_M.prototype.F;function _singleImageConfig_successfulUploadCallback(a,b,c,d){window.singleImageConfig_thumbImageUrl=a;window.singleImageConfig_imageUrl=b;window.singleImageConfig_imageWidth=c;window.singleImageConfig_imageHeight=d;var e=document.getElementById("shrinkToFitRow");if(e)e.style.visibility="hidden"}function _singleImageConfig_resetCallback(){window.singleImageConfig_imageUrl=null;var a=document.getElementById("shrinkToFitRow");if(a)a.style.visibility="visible"}function _SIV_getScaledContainerWidth(){return document.getElementById("checkShrink").checked? _SIV_getContainerWidth():-1}function _SIV_getContainerWidth(){var a=document.getElementById("sectionId").value,b=150;if(w_.IsOpenerReachable(window)&&window.opener.document.getElementById(a)&&window.opener.document.getElementById(a).clientWidth>0)b=window.opener.document.getElementById(a).clientWidth;return b}function _SIV_setConfigurationOptions(){if(window.singleImageConfig_imageUrl==null){w_.q(window,WidgetMessages.SIV_NO_IMAGE,w_.STATUS_MESSAGE_BAD_CLASS);return}var a=document.forms.config.widgetId.value, b=_SIV_getContainerWidth(),c=document.getElementById("checkShrink").checked,d=window.singleImageConfig_imageWidth,e=window.singleImageConfig_imageHeight;if(c){var f=1;if(d>b){f=b/d;d=b;e=Math.round(e*f)}}var g={originalUrl:window.singleImageConfig_imageUrl,originalWidth:window.singleImageConfig_imageWidth,originalHeight:window.singleImageConfig_imageHeight,displayUrl:window.singleImageConfig_thumbImageUrl,displayWidth:d,displayHeight:e,sectionWidth:b,shrinkToFit:c,title:document.getElementById("title").value, caption:document.getElementById("imageCaption").value,link:document.getElementById("link").value,securityToken:document.forms.config.securityToken.value};w_.SaveWidget(g,a,w_L.WIDGET_TYPE_NAME)};function w_O(a){this.a=a;this.e=a.l()}w_O.successfulUploadCallback=function(a,b,c,d){w_O.Oc=a;w_O.D=b;w_O.w=c;w_O.C=d;var e=document.getElementById("shrinkToFitRow");if(e)e.style.visibility="hidden";e=document.getElementById("shrinkToFitMessageRow");if(e)e.style.visibility="hidden"};w_O.resetCallback=function(){w_O.D=null;var a=document.getElementById("shrinkToFitRow");if(a)a.style.visibility="visible";a=document.getElementById("shrinkToFitMessageRow");if(a)a.style.visibility="visible"};w_O.getScaledContainerWidth= function(){return document.getElementById("checkShrink").checked?w_O.getContainerWidth():-1};w_O.getContainerWidth=function(){var a=document.getElementById("sectionId").value,b=600;if(w_.IsOpenerReachable(window)&&window.opener.document.getElementById(a))b=window.opener.document.getElementById(a).clientWidth;return b};w_O.WIDGET_TYPE_NAME="Header";w_O.prototype.d=function(){return w_O.WIDGET_TYPE_NAME};w_O.prototype.g=function(){return false};w_O.prototype.b=function(){return this.a};w_O.prototype.c= function(a,b){this.a.i(b)};w_O.FilterMap={title:w_A.GetRequiredStringFilter(),description:null,imagePlacement:null,useImage:null,securityToken:null};w_O.ConfigureWidget=function(){var a=document.forms.config.widgetId.value,b=document.forms.config.widgetType.value,c=w_A.ProcessForm(document.forms.config,w_O.FilterMap),d=w_O.getContainerWidth();if(c.success){if(w_O.D){var e=w_O.w,f=w_O.C,g=document.getElementById("checkShrink").checked;if(g){var h=1;if(e>d){h=d/e;e=d;f=Math.round(f*h)}}c.values.originalUrl= w_O.D;c.values.originalWidth=w_O.w;c.values.originalHeight=w_O.C;c.values.displayUrl=w_O.Oc;c.values.displayWidth=e;c.values.displayHeight=f;c.values.sectionWidth=d;c.values.shrinkToFit=g}c.values.securityToken=document.forms.config.securityToken.value;w_.SaveWidget(c.values,a,b);return true}else return false};w_O.hideImageOptions=function(){document.getElementById("imageOptions").style.display="none";return false};w_O.showImageOptions=function(){document.getElementById("imageOptions").style.display= "";return false};var _HeaderView=w_O;_HeaderView.prototype=w_O.prototype;_HeaderView._ConfigureWidget=_HeaderView.ConfigureWidget;_HeaderView._hideImageOptions=_HeaderView.hideImageOptions;_HeaderView._showImageOptions=_HeaderView.showImageOptions;_HeaderView._successfulUploadCallback=_HeaderView.successfulUploadCallback;_HeaderView._resetCallback=_HeaderView.resetCallback;_HeaderView._getScaledContainerWidth=_HeaderView.getScaledContainerWidth;_HeaderView._getContainerWidth=_HeaderView.getContainerWidth;function w_P(a,b){this.a=a;this.e=a.l();this.Qc=b}w_P.prototype.b=function(){return this.a};w_P.prototype.d=function(){return this.Qc};w_P.prototype.c=function(a,b){a=="configure"&&this.a.i(b)};w_P.ConfigureWidget=function(a){setFormAndSubmit();var b=document.forms.stuffform.widgetId.value,c=document.forms.stuffform.securityToken.value,d=document.getElementById("textarea"),e=document.getElementById("title"),f=d.value;if(a=="Text")f=f.replace(/\n/g,"
");var g={content:f,title:e.value,securityToken:c}; w_.SaveWidget(g,b,a)};function w_Q(a){w_P.call(this,a,"Text")}w_Q.inherits(w_P);w_Q.ConfigureWidget=function(){w_P.ConfigureWidget("Text")};function w_R(a){w_P.call(this,a,"HTML")}w_R.inherits(w_P);w_R.ConfigureWidget=function(){w_P.ConfigureWidget("HTML")};var _TextView=w_Q;_TextView.prototype=w_Q.prototype;_TextView._ConfigureWidget=_TextView.ConfigureWidget;var _HTMLView=w_R;_HTMLView.prototype=w_R.prototype;_HTMLView._ConfigureWidget=_HTMLView.ConfigureWidget;function w_H(a){document.write('
Notify Blogger about objectionable content on this page.
You flagged this blog as having objectionable content.
]navbar-iframeZ^bgkos[\]_9http://www.blogger.com/v-css/navbar/3328360018-navbar.cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_9http://www.blogger.com/v-css/navbar/3328360018-navbar.css./01X$classesZ$classname12UNSURLXNSObject#A+ 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Fri, 16 Oct 2009 13:30:15 GMTTgzipXtext/cssWGFE/1.3S897_Thu, 11 Sep 2008 13:30:15 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd FKT_bhqz|)0PU^fjdO/* Copyright 2008 Google, Inc. All rights reserved. */ body { padding:0; margin:0; font-family:"Trebuchet MS",Verdana,Arial,Sans-serif; font-size:100%; white-space:nowrap; } a { text-decoration:none; } #b-navbar { height:29px; border-bottom:1px solid #024; font-size:.85em; line-height:.85em; } #b-navbar #b-logo { position:absolute; top:.15em; left:5px; } #b-navbar #b-logo #navbar-logo { width:24px; height:24px; } /* Hide visually, leave in for screenreaders */ #b-navbar #b-logo span { display:block; position:absolute; left:-9000px; } #b-search { margin:0 0 0 34px; padding:4px 1em 3px .5em; } #b-search td { vertical-align:middle; } #b-query { margin:0 .5em 0 0; } .btn { border-top:1px solid; border-bottom:1px solid; margin:0 .5em 0 1px; padding:0; font-size:.80em; line-height:.85em; text-transform:uppercase; white-space:nowrap; cursor:pointer; cursor:hand; } .btn div { border-left:1px solid; border-right:1px solid; margin:0 -1px; padding:.21em .3em; height:.85em; position:relative; } .btn div img { /* can't leave it in the flow because IE will screw up the line-height */ position:absolute; top:.2em; left:.3em; } #bt-flag-body, #bt-unflag-body { padding-left:1em; } #bt-unflag-body { display:none; } .flagged #bt-flag-body { display:none; } .flagged #bt-unflag-body { display:block; } /* drop down for the flag as objectionable button */ #flagi, #unflagi { display:none; top:3px; color:#000; background-color:#ff9; border:1px solid #333; z-index:300; padding:4px; font-size:.7em; line-height:.8em; } #flagi a, #unflagi a { color:#3366cc; text-decoration:underline; } .b-mobile { display:none; } #b-sms { margin:0 0 0 100px; padding:4px 7px; line-height:1em; font-size:100%; text-align:left; } #b-sms a { margin-right:.5em; line-height:1em; } #b-sms a:hover { text-decoration:underline; } @media handheld { body .b-mobile { display:block; } body #b-search, body #flagi, body #unflagi { display:none; } /* Some phones can't handle the positioning hack, so hide this */ body #b-navbar #b-logo span { display:none; } }_`a_4http://www.blogger.com/v-css/navbar/1297325411-1.cssObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_4http://www.blogger.com/v-css/navbar/1297325411-1.css./01X$classesZ$classname12UNSURLXNSObject#AMyq 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJWExpires]Cache-Control_Content-Encoding\Content-TypeVServerTDate^Content-Length]Last-Modified_Fri, 23 Oct 2009 15:10:25 GMTVpublicTgzipXtext/cssWGFE/1.3_Thu, 18 Sep 2008 15:10:25 GMTS282_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd AFOZ]cluw~$DKPYadO/* Copyright 2008 Google, Inc. All rights reserved. */ body { color:#fff; } a, .btn div { color:#9cf; } a:hover { color:#fff; } #navbar-logo { background-image:url("../../img/navbar/1/logobar.png"); } #b-navbar { background-color:#036; border-bottom:1px solid #024; } #b-search { background:#147 url("../../img/navbar/1/corner.gif") no-repeat left bottom; } #b-query { border:1px solid #47a; } .btn, .btn div { border-color: #47a; } .btn div:hover { background-color: #47a; }cdef_8http://www.blogger.com/v-js/3625575137-cookies.common.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_8http://www.blogger.com/v-js/3625575137-cookies.common.js./01X$classesZ$classname12UNSURLXNSObject#Au 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Fri, 16 Oct 2009 13:30:15 GMTTgzip_application/x-javascriptWGFE/1.3S685_Thu, 11 Sep 2008 13:30:15 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionary:./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd EJS^agpy{(/OTow{d_application/x-javascriptO:// Copyright 2005, Google Inc. // // Operations on cookies that are common across our pages. // // Original Author: Pal Takacsi-Nagy (pal@google.com) /** * Sets a Cookie with the given name and value. * * name Name of the cookie * value Value of the cookie * [expires] Expiration date of the cookie (default: end of current session) * [path] Path where the cookie is valid (default: path of calling document) * [domain] Domain where the cookie is valid * (default: domain of calling document) * [secure] Boolean value indicating if the cookie transmission requires a * secure transmission */ function setCookie(name, value, domain, expires, path, secure) { document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } /** * Gets the value of the specified cookie. * * name Name of the desired cookie. * * Returns a string containing value of specified cookie, * or null if cookie does not exist. */ function getCookie(name) { var dc = document.cookie; var prefix = name + "="; var begin = dc.indexOf("; " + prefix); if (begin == -1) { begin = dc.indexOf(prefix); if (begin != 0) return null; } else { begin += 2; } var end = document.cookie.indexOf(";", begin); if (end == -1) { end = dc.length; } return unescape(dc.substring(begin + prefix.length, end)); } hiej_9http://www.blogger.com/v-app/scripts/1019856700-common.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345KLMNOPQRSTUVWXYZ[_`U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_9http://www.blogger.com/v-app/scripts/1019856700-common.js./01X$classesZ$classname12UNSURLXNSObject#Ag 6789BWNS.keysZNS.objects:;<=>?@A CDEFGHIJ]Last-Modified]Cache-ControlWExpires_Content-Encoding\Content-TypeVServerTDate_Transfer-Encoding_Wed, 03 Sep 2008 19:03:47 GMTVpublic_Fri, 16 Oct 2009 13:30:15 GMTTgzip_application/x-javascriptWGFE/1.3_Thu, 11 Sep 2008 13:30:15 GMTXIdentity./\]]^2_NSMutableDictionary\NSDictionary./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd FKT_bhqz|.NUuzd O// Copied from .../google3/javascript/common.js //------------------------------------------------------------------------ // This file contains common utilities and basic javascript infrastructure. // // Notes: // * Press 'D' to toggle debug mode. // // Functions: // // - Assertions // DEPRECATED: Use assert.js // AssertTrue(): assert an expression. Throws an exception if false. // Fail(): Throws an exception. (Mark block of code that should be unreachable) // AssertEquals(): assert that two values are equal. // AssertNumArgs(): assert number of arguments for the function // AssertType(): assert that a value has a particular type // // - Cookies // SetCookie(): Sets a cookie. // ExpireCookie(): Expires a cookie. // GetCookie(): Gets a cookie value. // // - Dynamic HTML/DOM utilities // MaybeGetElement(): get an element by its id // GetElement(): get an element by its id // GetParentNode(): Get the parent of an element // GetAttribute(): Get attribute value of a DOM node // SetInnerHTML(): set the inner HTML of a node // GetInnerHTML(): get the inner HTML of a node // ClearInnerHTML(): clear the inner HTML of a node // SetCssStyle(): Sets a CSS property of a node. // GetStyleProperty(): Get CSS property from a style attribute string // ShowElement(): Show/hide element by setting the "display" css property. // ShowBlockElement(): Show/hide block element // SetButtonText(): Set the text of a button element. // AppendNewElement(): Create and append a html element to a parent node. // CreateDIV(): Create a DIV element and append to the document. // CreateIFRAME(): Create an IFRAME and append to the document. // HasClass(): check if element has a given class // AddClass(): add a class to an element // RemoveClass(): remove a class from an element // // - Window/Screen utiltiies // GetPageOffsetLeft(): get the X page offset of an element // GetPageOffsetTop(): get the Y page offset of an element // GetPageOffset(): get the X and Y page offsets of an element // GetPageOffsetRight() : get X page offset of the right side of an element // GetPageOffsetRight() : get Y page offset of the bottom of an element // GetScrollTop(): get the vertical scrolling pos of a window. // GetScrollLeft(): get the horizontal scrolling pos of a window // IsScrollAtEnd(): check if window scrollbar has reached its maximum offset // ScrollTo(): scroll window to a position // ScrollIntoView(): scroll window so that an element is in view. // GetWindowWidth(): get width of a window. // GetWindowHeight(): get height of a window // GetAvailScreenWidth(): get available screen width // GetAvailScreenHeight(): get available screen height // GetNiceWindowHeight(): get a nice height for a new browser window. // Open{External/Internal}Window(): open a separate window // CloseWindow(): close a window // // - DOM walking utilities // AnnotateTerms(): find terms in a node and decorate them with some tag // AnnotateText(): find terms in a text node and decorate them with some tag // // - String utilties // HtmlEscape(): html escapes a string // HtmlUnescape(): remove html-escaping. // QuoteEscape(): escape " quotes. // CollapseWhitespace(): collapse multiple whitespace into one whitespace. // Trim(): trim whitespace on ends of string // IsEmpty(): check if CollapseWhiteSpace(String) == "" // IsLetterOrDigit(): check if a character is a letter or a digit // ConvertEOLToLF(): normalize the new-lines of a string. // HtmlEscapeInsertWbrs(): HtmlEscapes and inserts s (word break tags) // after every n non-space chars and/or after or before certain special chars // // - TextArea utilities // GetCursorPos(): finds the cursor position of a textfield // SetCursorPos(): sets the cursor position in a textfield // // - Array utilities // FindInArray(): do a linear search to find an element value. // DeleteArrayElement(): return a new array with a specific value removed. // CloneObject(): clone an object, copying its values recursively. // CloneEvent(): clone an event; cannot use CloneObject because it // suffers from infinite recursion // // - Formatting utilities // PrintArray(): used to print/generate HTML by combining static text // and dynamic strings. // ImageHtml(): create html for an img tag // FormatJSLink(): formats a link that invokes js code when clicked. // MakeId3(): formats an id that has two id numbers, eg, foo_3_7 // // - Miscellaneous // IsDefined(): returns true if argument is not undefined //------------------------------------------------------------------------ // browser detection var agent = navigator.userAgent.toLowerCase(); var is_ie = (agent.indexOf('msie') != -1); //var is_ie5 = (agent.indexOf('msie 5') != -1 && document.all); var is_konqueror = (agent.indexOf('konqueror') != -1); var is_safari = (agent.indexOf('safari') != -1) || is_konqueror; var is_nav = !is_ie && !is_safari && (agent.indexOf('mozilla') != -1); var is_win = (agent.indexOf('win') != -1); delete agent; var BACKSPACE_KEYCODE = 8; var COMMA_KEYCODE = 188; // ',' key var DEBUG_KEYCODE = 68; // 'D' key var DELETE_KEYCODE = 46; var DOWN_KEYCODE = 40; // DOWN arrow key var ENTER_KEYCODE = 13; // ENTER key var ESC_KEYCODE = 27; // ESC key var LEFT_KEYCODE = 37; // LEFT arrow key var RIGHT_KEYCODE = 39; // RIGHT arrow key var SPACE_KEYCODE = 32; // space bar var TAB_KEYCODE = 9; // TAB key var UP_KEYCODE = 38; // UP arrow key var SHIFT_KEYCODE = 16; // This is a "constant" but has different values depending on the browser var semicolon_keycode = (is_ie ? 186 : 59); var MAX_EMAIL_ADDRESS_LENGTH = 320; // 64 + '@' + 255 var MAX_SIGNATURE_LENGTH = 1000; // 1000 chars of maximum signature //------------------------------------------------------------------------ // Assertions // DEPRECATED: Use assert.js //------------------------------------------------------------------------ /** * DEPRECATED: Use assert.js */ function raise(msg) { if (typeof Error != 'undefined') { throw new Error(msg || 'Assertion Failed'); } else { throw (msg); } } /** * DEPRECATED: Use assert.js * * Fail() is useful for marking logic paths that should * not be reached. For example, if you have a class that uses * ints for enums: * * MyClass.ENUM_FOO = 1; * MyClass.ENUM_BAR = 2; * MyClass.ENUM_BAZ = 3; * * And a switch statement elsewhere in your code that * has cases for each of these enums, then you can * "protect" your code as follows: * * switch(type) { * case MyClass.ENUM_FOO: doFooThing(); break; * case MyClass.ENUM_BAR: doBarThing(); break; * case MyClass.ENUM_BAZ: doBazThing(); break; * default: * Fail("No enum in MyClass with value: " + type); * } * * This way, if someone introduces a new value for this enum * without noticing this switch statement, then the code will * fail if the logic allows it to reach the switch with the * new value, alerting the developer that he should add a * case to the switch to handle the new value he has introduced. * * @param {string} opt_msg to display for failure * DEFAULT: "Assertion failed" */ function Fail(opt_msg) { if (opt_msg === undefined) opt_msg = 'Assertion failed'; if (IsDefined(DumpError)) DumpError(opt_msg + '\n'); raise(opt_msg); } /** * DEPRECATED: Use assert.js * * Asserts that an expression is true (non-zero and non-null). * * Note that it is critical not to pass logic * with side-effects as the expression for AssertTrue * because if the assertions are removed by the * JSCompiler, then the expression will be removed * as well, in which case the side-effects will * be lost. So instead of this: * * AssertTrue( criticalComputation() ); * * Do this: * * var result = criticalComputation(); * AssertTrue(result); * * @param {anything} expression to evaluate * @param {string} opt_msg to display if the assertion fails * */ function AssertTrue(expression, opt_msg) { if (!expression) { if (opt_msg === undefined) opt_msg = 'Assertion failed'; Fail(opt_msg); } } /** * DEPRECATED: Use assert.js * * Asserts that two values are the same. * * @param {anything} val1 * @param {anything} val2 * @param {string} opt_msg to display if the assertion fails */ function AssertEquals(val1, val2, opt_msg) { if (val1 != val2) { if (opt_msg === undefined) { opt_msg = "AssertEquals failed: <" + val1 + "> != <" + val2 + ">"; } Fail(opt_msg); } } /** * DEPRECATED: Use assert.js * * Asserts that a value is of the provided type. * * AssertType(6, Number); * AssertType("ijk", String); * AssertType([], Array); * AssertType({}, Object); * AssertType(ICAL_Date.now(), ICAL_Date); * * @param {anything} value * @param {constructor function} type * @param {string} opt_msg to display if the assertion fails */ function AssertType(value, type, opt_msg) { // for backwards compatability only if (typeof value == type) return; if (value || value == "") { try { if (type == AssertTypeMap[typeof value] || value instanceof type) return; } catch (e) { /* failure, type was an illegal argument to instanceof */ } } if (opt_msg === undefined) { if (typeof type == 'function') { var match = type.toString().match(/^\s*function\s+([^\s\{]+)/); if (match) type = match[1]; } opt_msg = "AssertType failed: <" + value + "> not typeof "+ type; } Fail(opt_msg); } var AssertTypeMap = { 'string' : String, 'number' : Number, 'boolean' : Boolean }; /** * DEPRECATED: Use assert.js * * Asserts that the number of arguments to a * function is num. For example: * * function myFunc(one, two, three) [ * AssertNumArgs(3); * ... * } * * myFunc(1, 2); // assertion fails! * * Note that AssertNumArgs does not take the function * as an argument; it is simply used in the context * of the function. * * @param {int} number of arguments expected * @param {string} opt_msg to display if the assertion fails */ function AssertNumArgs(num, opt_msg) { var caller = AssertNumArgs.caller; // This is not supported in safari 1.0 if (caller && caller.arguments.length != num) { if (opt_msg === undefined) { opt_msg = caller.name + ' expected ' + num + ' arguments ' + ' but received ' + caller.arguments.length; } Fail(opt_msg); } } //------------------------------------------------------------------------ // Cookies //------------------------------------------------------------------------ var ILLEGAL_COOKIE_CHARS_RE = /[\s;]/ /** * Sets a cookie. * The max_age can be -1 to set a session cookie. To expire cookies, use * ExpireCookie() instead. * * @param name The cookie name. * @param value The cookie value. * @param opt_max_age The max age in seconds (from now). Use -1 to set a * session cookie. If not provided, the default is -1 (i.e. set a session * cookie). * @param opt_path The path of the cookie, or null to not specify a path * attribute (browser will use the full request path). If not provided, the * default is '/' (i.e. path=/). * @param opt_domain The domain of the cookie, or null to not specify a domain * attribute (brower will use the full request host name). If not provided, * the default is null (i.e. let browser use full request host name). * @return Void. */ function SetCookie(name, value, opt_max_age, opt_path, opt_domain) { value = '' + value; AssertTrue((typeof name == 'string' && typeof value == 'string' && !name.match(ILLEGAL_COOKIE_CHARS_RE) && !value.match(ILLEGAL_COOKIE_CHARS_RE)), 'trying to set an invalid cookie'); if (!IsDefined(opt_max_age)) opt_max_age = -1; if (!IsDefined(opt_path)) opt_path = '/'; if (!IsDefined(opt_domain)) opt_domain = null; var domain_str = (opt_domain == null) ? '' : ';domain=' + opt_domain; var path_str = (opt_path == null) ? '' : ';path=' + opt_path; var expires_str; // Case 1: Set a session cookie. if (opt_max_age < 0) { expires_str = ''; // Case 2: Expire the cookie. // Note: We don't tell people about this option in the function doc because // we prefer people to use ExpireCookie() to expire cookies. } else if (opt_max_age == 0) { // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to convert // it to local time, and if the local time is before Jan 1, 1970, then the // browser will ignore the Expires attribute altogether. var pastDate = new Date(1970, 1 /*Feb*/, 1); // Feb 1, 1970 expires_str = ';expires=' + pastDate.toUTCString(); // Case 3: Set a persistent cookie. } else { var futureDate = new Date(Now() + opt_max_age * 1000); expires_str = ';expires=' + futureDate.toUTCString(); } document.cookie = name + '=' + value + domain_str + path_str + expires_str; } var EXPIRED_COOKIE_VALUE = 'EXPIRED'; /** * Expires a cookie. * * @param name The cookie name. * @param opt_path The path of the cookie, or null to expire a cookie set at * the full request path. If not provided, the default is '/' (i.e. path=/). * @param opt_domain The domain of the cookie, or null to expire a cookie set * at the full request host name. If not provided, the default is null (i.e. * cookie at full request host name). * @return Void. */ function ExpireCookie(name, opt_path, opt_domain) { SetCookie(name, EXPIRED_COOKIE_VALUE, 0, opt_path, opt_domain); } /** Returns the value for the first cookie with the given name * @param name : string * @return a string or the empty string if no cookie found. */ function GetCookie(name) { var nameeq = name + "="; var cookie = String(document.cookie); for (var pos = -1; (pos = cookie.indexOf(nameeq, pos + 1)) >= 0;) { var i = pos; // walk back along string skipping whitespace and looking for a ; before // the name to make sure that we don't match cookies whose name contains // the given name as a suffix. while (--i >= 0) { var ch = cookie.charAt(i); if (ch == ';') { i = -1; // indicate success break; } else if (' \t'.indexOf(ch) < 0) { break; } } if (-1 === i) { // first cookie in the string or we found a ; var end = cookie.indexOf(';', pos); if (end < 0) { end = cookie.length; } return cookie.substring(pos + nameeq.length, end); } } return ""; } //------------------------------------------------------------------------ // Time //------------------------------------------------------------------------ function Now() { return (new Date()).getTime(); } //------------------------------------------------------------------------ // Dynamic HTML/DOM utilities //------------------------------------------------------------------------ // Gets a element by its id, may return null function MaybeGetElement(win, id) { return win.document.getElementById(id); } // Same as MaybeGetElement except that it throws an exception if it's null function GetElement(win, id) { var el = win.document.getElementById(id); if (!el) { DumpError("Element " + id + " not found."); } return el; } // Gets elements by its id/name // IE treats getElementsByName as searching over ids, while Moz use names. // so tags must have both id and name as the same string function GetElements(win, id) { return win.document.getElementsByName(id); } // Gets the parent of a html element. function GetParentNode(n) { try { return n.parentNode; } catch (e) { // n.parentNode may throw a permission-denied exception on mozilla // (e.g. on text element), ignore this exception. return n; } } function IsDescendant(parent, child) { do { if (parent === child) return true; child = GetParentNode(child); } while (child && child !== document.body); return false; } // Get attribute value of a DOM node function GetAttribute(node, attribute) { if (!node.getAttribute) { return null; } var attr = node.getAttribute(attribute); if (is_ie && attribute == "style") { return attr.value; } else { return attr; } } // Sets inner html of a html element function SetInnerHTML(win, id, html) { try { GetElement(win, id).innerHTML = html; } catch (ex) { DumpException(ex); } } // Gets inner-html of a html element function GetInnerHTML(win, id) { try { return GetElement(win, id).innerHTML; } catch (ex) { DumpException(ex); return ""; } } // Clears inner html of a html element function ClearInnerHTML(win, id) { try { GetElement(win, id).innerHTML = ""; } catch (ex) { DumpException(ex); } } // Sets a CSS style of an element function SetCssStyle(win, id, name, value) { try { var elem = GetElement(win, id); elem.style[name] = value; } catch (ex) { DumpException(ex); } } // Get CSS property from a style attribute string function GetStyleProperty(style, name) { var i = style.indexOf(name); if (i != -1) { var j = style.indexOf(";", i); if (j == -1) { j = style.length; } // the +1 below is for the colon following the attribute name return CollapseWhitespace(style.substring(i + name.length + 1, j)); } return null; } // Show/hide an element. function ShowElement(el, show) { el.style.display = show ? "" : "none"; } // Show/hide a block element. // ShowElement() doesn't work if object has an initial class with display:none function ShowBlockElement(el, show) { el.style.display = show ? "block" : "none"; } // Show/hide an inline element. // ShowElement() doesn't work when an element starts off display:none. function ShowInlineElement(el, show) { el.style.display = show ? "inline" : "none"; } // Set the text of a button. This is to get around a bug in mozilla, // where we can't set the text of a button by setting innerHTML. function SetButtonText(button, text) { button.childNodes[0].nodeValue = text; } // Append a new HTML element to a HTML node. function AppendNewElement(win, parent, tag) { var e = win.document.createElement(tag); parent.appendChild(e); return e; } // Finds the child with the given ID, or null if there is node. // This does not search the children's children. function FindChildWithID(parent, id) { var el; for (el = parent.firstChild; el && el.id != id; el = el.nextSibling) { // skip } return el; } // Adds a disabled option to the given menu function AddMenuDisabledOption(win, menu, html) { var op = AppendNewElement(win, menu, 'OPTION'); op.disabled = true; op.innerHTML = html; return op; } // Adds a option to the given menu function AddMenuOption(win, menu, value, html) { var op = AppendNewElement(win, menu, 'OPTION'); op.value = value; op.innerHTML = html; return op; } // Create a new DIV (append it to the end of the document) function CreateDIV(win, id) { var div = MaybeGetElement(win, id); if (!div) { div = AppendNewElement(win, win.document.body, "div"); div.id = id; } return div; } // Create a new IFRAME (append it to the end of the document) function CreateIFRAME(win, id, url) { var iframe = MaybeGetElement(win, id); if (!iframe) { // We cannot create an IFRAME directly (IE doesn't allow it), so we // create a DIV and then insert an IFRAME. // We also give the IFRAME a name (same as id) var div = AppendNewElement(win, win.document.body, "div"); div.innerHTML = ""; iframe = GetElement(win, id); } return iframe; } // Create a new TR containing the given td's function Tr(win, tds) { var tr = win.document.createElement("TR"); for (var i = 0; i < tds.length; i++) { tr.appendChild(tds[i]); } return tr; } // Create a new TD, with an optional colspan function Td(win, opt_colspan) { var td = win.document.createElement("TD"); if (opt_colspan) { td.colSpan = opt_colspan; } return td; } // Check if an element has a given class function HasClass(el, cl) { if (el == null || el.className == null) return false; var classes = el.className.split(" "); for (var i = 0; i < classes.length; i++) { if (classes[i] == cl) { return true; } } return false; } // Add a class to element function AddClass(el, cl) { if (HasClass(el, cl)) return; el.className += " " + cl; } // Remove a class from an element function RemoveClass(el, cl) { if (el.className == null) return; var classes = el.className.split(" "); var result = []; var changed = false; for (var i = 0; i < classes.length; i++) { if (classes[i] != cl) { if (classes[i]) { result.push(classes[i]); } } else { changed = true; } } if (changed) { el.className = result.join(" "); } } // Performs an in-order traversal of the tree rooted at the given node // (excluding the root node) and returns an array of nodes that match the // given selector. The selector must implement the method: // // boolean select(node); // // This method is a generalization of the DOM method "getElementsByTagName" // function GetElementsBySelector(root, selector) { var nodes = []; for (var child = root.firstChild; child; child = child.nextSibling) { AddElementBySelector_(child, selector, nodes); } return nodes; } // Recursive helper for GetElemnetsBySelector() function AddElementBySelector_(root, selector, nodes) { // First test the parent if (selector.select(root)) { nodes.push(root); } // Then recurse through the children for (var child = root.firstChild; child; child = child.nextSibling) { AddElementBySelector_(child, selector, nodes); } } //------------------------------------------------------------------------ // Window/screen utilities // TODO: these should be renamed (e.g. GetWindowWidth to GetWindowInnerWidth // and moved to geom.js) //------------------------------------------------------------------------ // Get page offset of an element function GetPageOffsetLeft(el) { var x = el.offsetLeft; if (el.offsetParent != null) x += GetPageOffsetLeft(el.offsetParent); return x; } // Get page offset of an element function GetPageOffsetTop(el) { var y = el.offsetTop; if (el.offsetParent != null) y += GetPageOffsetTop(el.offsetParent); return y; } // Get page offset of an element function GetPageOffset(el) { var x = el.offsetLeft; var y = el.offsetTop; if (el.offsetParent != null) { var pos = GetPageOffset(el.offsetParent); x += pos.x; y += pos.y; } return {x: x, y: y}; } function GetPageOffsetRight(el) { return GetPageOffsetLeft(el) + el.offsetWidth; } function GetPageOffsetBottom(el) { return GetPageOffsetTop(el) + el.offsetHeight; } // Get the y position scroll offset. function GetScrollTop(win) { // all except Explorer if ("pageYOffset" in win) { return win.pageYOffset; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "scrollTop" in win.document.documentElement) { return win.document.documentElement.scrollTop; } // other Explorers else if ("scrollTop" in win.document.body) { return win.document.body.scrollTop; } return 0; } // Get the x position scroll offset. function GetScrollLeft(win) { // all except Explorer if ("pageXOffset" in win) { return win.pageXOffset; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "scrollLeft" in win.document.documentElement) { return win.document.documentElement.scrollLeft; } // other Explorers else if ("scrollLeft" in win.document.body) { return win.document.body.scrollLeft; } return 0; } /** * Checks if window scrollbar has reached its maximum offset * * @param win a window object * @param opt_isHoriz true if horizontal bar, false if vertical */ function IsScrollAtEnd(win, opt_isHoriz) { var total = (opt_isHoriz) ? document.body.offsetWidth : document.body.offsetHeight; var inner = (opt_isHoriz) ? GetWindowWidth(win) : GetWindowHeight(win); var offset = (opt_isHoriz) ? GetScrollLeft(win) : GetScrollTop(win); return (inner + offset >= total || total < inner); } // Scroll window to pos // position: 0 = top, 0.5 = middle, 1 = bottom function ScrollTo(win, el, position) { var y = GetPageOffsetTop(el); y -= GetWindowHeight(win) * position; win.scrollTo(0, y); } // Scroll so that as far as possible the entire element is in view. var ALIGN_BOTTOM = 'b'; var ALIGN_MIDDLE = 'm'; var ALIGN_TOP = 't'; function ScrollIntoView(win, el, alignment) { var el_top = GetPageOffsetTop(el); var el_bottom = el_top + el.offsetHeight; var win_top = GetScrollTop(win); var win_height = GetWindowHeight(win); var win_bottom = win_top + win_height; // Out of view? if (el_top < win_top || el_bottom > win_bottom) { var scrollto_y; if (alignment == ALIGN_BOTTOM) { scrollto_y = el_bottom - win_height + 5; } else if (alignment == ALIGN_MIDDLE) { scrollto_y = (el_top + el_bottom) / 2 - win_height/2; } else { scrollto_y = el_top - 5; // ALIGN_TOP } Debug("Scrolling to " + scrollto_y); win.scrollTo(0, scrollto_y); } } function IsElementVisible(win, id) { var el = MaybeGetElement(win, id); if (el == null) { return false; } var el_top = GetPageOffsetTop(el); var el_bottom = el_top + el.offsetHeight; var win_top = GetScrollTop(win); var win_bottom = win_top + GetWindowHeight(win); if (el_top >= win_top && el_bottom <= win_bottom) { return true; } return false; } function GetWindowWidth(win) { // all except Explorer if ("innerWidth" in win) { return win.innerWidth; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "clientWidth" in win.document.documentElement) { return win.document.documentElement.clientWidth; } // other Explorers else if ("clientWidth" in win.document.body) { return win.document.body.clientWidth; } return 0; } function GetWindowHeight(win) { // all except Explorer if ("innerHeight" in win) { return win.innerHeight; } // Explorer 6 Strict Mode else if ("documentElement" in win.document && "clientHeight" in win.document.documentElement) { return win.document.documentElement.clientHeight; } // other Explorers else if ("clientHeight" in win.document.body) { return win.document.body.clientHeight; } return 0; } function GetAvailScreenWidth(win) { return win.screen.availWidth; } function GetAvailScreenHeight(win) { return win.screen.availHeight; } // Returns a "nice" window height. // Use the screen height. (Or should we use the height of the current window?) function GetNiceWindowHeight(win) { return Math.floor(0.8 * GetAvailScreenHeight(win)); } // Used for horizontally centering a new window of the given width in the // available screen. Set the new window's distance from the left of the screen // equal to this function's return value. // Params: width: the width of the new window // Returns: the distance from the left edge of the screen for the new window to // be horizontally centered function GetCenteringLeft(win, width) { return (win.screen.availWidth - width) >> 1; } // Used for vertically centering a new window of the given height in the // available screen. Set the new window's distance from the top of the screen // equal to this function's return value. // Params: height: the height of the new window // Returns: the distance from the top edge of the screen for the new window to // be vertically aligned. function GetCenteringTop(win, height) { return (win.screen.availHeight - height) >> 1; } /* * Opens a child popup window that has no browser toolbar/decorations. * (Copied from caribou's common.js library with small modifications.) * * @param url the URL for the new window (Note: this will be unique-ified) * @param opt_name the name of the new window * @param opt_width the width of the new window * @param opt_height the height of the new window * @param opt_center if true, the new window is centered in the available screen * @param opt_hide_scrollbars if true, the window hides the scrollbars * @param opt_noresize if true, makes window unresizable * @param opt_blocked_msg message warning that the popup has been blocked * @return a reference to the new child window */ function Popup(url, opt_name, opt_width, opt_height, opt_center, opt_hide_scrollbars, opt_noresize, opt_blocked_msg) { if (!opt_height) { opt_height = Math.floor(GetWindowHeight(window.top) * 0.8); } if (!opt_width) { opt_width = Math.min(GetAvailScreenWidth(window), opt_height); } var features = "resizable=" + (opt_noresize ? "no" : "yes") + "," + "scrollbars=" + (opt_hide_scrollbars ? "no" : "yes") + "," + "width=" + opt_width + ",height=" + opt_height; if (opt_center) { features += ",left=" + GetCenteringLeft(window, opt_width) + "," + "top=" + GetCenteringTop(window, opt_height); } return OpenWindow(window, url, opt_name, features, opt_blocked_msg); } /* * Opens a new window. Returns the new window handle. Tries to open the new * window using top.open() first. If that doesn't work, then tries win.open(). * If that still doesn't work, prints an alert. * (Copied from caribou's common.js library with small modifications.) * * @param win the parent window from which to open the new child window * @param url the URL for the new window (Note: this will be unique-ified) * @param opt_name the name of the new window * @param opt_features the properties of the new window * @param opt_blocked_msg message warning that the popup has been blocked * @return a reference to the new child window */ function OpenWindow(win, url, opt_name, opt_features, opt_blocked_msg) { var newwin = OpenWindowHelper(top, url, opt_name, opt_features); if (!newwin || newwin.closed || !newwin.focus) { newwin = OpenWindowHelper(win, url, opt_name, opt_features); } if (!newwin || newwin.closed || !newwin.focus) { if (opt_blocked_msg) alert(opt_blocked_msg); } else { // Make sure that the window has the focus newwin.focus(); } return newwin; } /* * Helper for OpenWindow(). * (Copied from caribou's common.js library with small modifications.) */ function OpenWindowHelper(win, url, name, features) { var newwin; if (features) { newwin = win.open(url, name, features); } else if (name) { newwin = win.open(url, name); } else { newwin = win.open(url); } return newwin; } //------------------------------------------------------------------------ // DOM walking utilities //------------------------------------------------------------------------ function MaybeEscape(str, escape) { return escape ? HtmlEscape(str) : str; } //------------------------------------------------------------------------ // Window data //------------------------------------------------------------------------ // Gets an array, which can store data for the window. This data // is deleted when the window is unloaded. var windata = []; function GetWindowData(win) { var data = windata[win.name]; if (!data) { windata[win.name] = data = []; } return data; } // Clear js data for a window. function ClearWindowData(win_name) { if (windata[win_name]) { windata[win_name] = null; } } //------------------------------------------------------------------------ // String utilities //------------------------------------------------------------------------ // Do html escaping var amp_re_ = /&/g; var lt_re_ = //g; // Convert text to HTML format. For efficiency, we just convert '&', '<', '>' // characters. // Note: Javascript >= 1.3 supports lambda expression in the replacement // argument. But it's slower on IE. // Note: we can also implement HtmlEscape by setting the value // of a textnode and then reading the 'innerHTML' value, but that // that turns out to be slower. // Params: str: String to be escaped. // Returns: The escaped string. function HtmlEscape(str) { if (!str) return ""; return str.replace(amp_re_, "&").replace(lt_re_, "<"). replace(gt_re_, ">").replace(quote_re_, """); } /** converts html entities to plain text. It covers the most common named * entities and numeric entities. * It does not cover all named entities -- it covers &{lt,gt,amp,quot,nbsp}; but * does not handle some of the more obscure ones like &{ndash,eacute};. */ function HtmlUnescape(str) { if (!str) return ""; return str. replace(/&#(\d+);/g, function (_, n) { return String.fromCharCode(parseInt(n, 10)); }). replace(/&#x([a-f0-9]+);/gi, function (_, n) { return String.fromCharCode(parseInt(n, 16)); }). replace(/&(\w+);/g, function (_, entity) { entity = entity.toLowerCase(); return entity in HtmlUnescape.unesc ? HtmlUnescape.unesc[entity] : '?'; }); } HtmlUnescape.unesc = { lt: '<', gt: '>', quot: '"', nbsp: ' ', amp: '&' }; // Replace multiple spaces with   to retain whitespace formatting // in addition to escaping '&', '<', and '>'. var dbsp_re_ = / /g; var ret_re_ = /\r/g; var nl_re_ = /\n/g; function HtmlWhitespaceEscape(str) { str = HtmlEscape(str); str = str.replace(dbsp_re_, "  "); str = str.replace(ret_re_, ""); str = str.replace(nl_re_, "
"); return str; } // Escape double quote '"' characters in addition to '&', '<', '>' so that a // string can be included in an HTML tag attribute value within double quotes. // Params: str: String to be escaped. // Returns: The escaped string. var quote_re_ = /\"/g; function QuoteEscape(str) { return HtmlEscape(str).replace(quote_re_, """); } var JS_SPECIAL_RE_ = /[\'\\\r\n\b\"<>&]/g; function JSEscOne_(s) { if (!JSEscOne_.js_escs_) { var escapes = {}; escapes['\\'] = '\\\\'; escapes['\''] = '\\047'; escapes['\n'] = '\\n'; escapes['\r'] = '\\r'; escapes['\b'] = '\\b'; escapes['\"'] = '\\042'; escapes['<'] = '\\074'; escapes['>'] = '\\076'; escapes['&'] = '\\046'; JSEscOne_.js_escs_ = escapes; } return JSEscOne_.js_escs_[s]; } /** convert a string to a javascript string literal. This function has the * property that the return value is also already html escaped, so the output * can be embedded in an html handler attribute. */ function ToJSString(s) { return "'" + s.toString().replace(JS_SPECIAL_RE_, JSEscOne_) + "'"; } // converts multiple ws chars to a single space, and strips // leading and trailing ws var spc_re_ = /\s+/g; var beg_spc_re_ = /^ /; var end_spc_re_ = / $/; function CollapseWhitespace(str) { if (!str) return ""; return str.replace(spc_re_, " ").replace(beg_spc_re_, ""). replace(end_spc_re_, ""); } var newline_re_ = /\r?\n/g; var spctab_re_ = /[ \t]+/g; var nbsp_re_ = /\xa0/g; function StripNewlines(str) { if (!str) return ""; return str.replace(newline_re_, " "); } function CanonicalizeNewlines(str) { if (!str) return ""; return str.replace(newline_re_, '\n'); } function HtmlifyNewlines(str) { if (!str) return ""; return str.replace(newline_re_, "
"); } function NormalizeSpaces(str) { if (!str) return ""; return str.replace(spctab_re_, " ").replace(nbsp_re_, " "); } // URL encodes the string. function UrlEncode(str) { return encodeURIComponent(str); } function Trim(str) { if (!str) return ""; return str.replace(/^\s+/, "").replace(/\s+$/, ""); } function EndsWith(str, suffix) { if (!str) return !suffix; return (str.lastIndexOf(suffix) == (str.length - suffix.length)); } // Check if a string is empty function IsEmpty(str) { return CollapseWhitespace(str) == ""; } // Check if a character is a letter function IsLetterOrDigit(ch) { return ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z") || (ch >= '0' && ch <= '9')); } // Check if a character is a space character function IsSpace(ch) { return (" \t\r\n".indexOf(ch) >= 0); } // Converts any instances of "\r" or "\r\n" style EOLs into "\n" (Line Feed), // and also trim the extra newlines and whitespaces at the end. var eol_re_ = /\r\n?/g; var trailingspc_re_ = /[\n\t ]+$/; function NormalizeText(str) { return str.replace(eol_re_, "\n").replace(trailingspc_re_, ""); } // Inserts s (word break tag) after every n non-space chars and/or // after or before certain special chars. The input string should be plain // text that has not yet been HTML-escaped. // Params: // str: The string to insert s into. // n: The maximum number of consecutive non-space characters to allow before // adding a . To turn off this rule (i.e. if you only want to add // breaks based on special characters), pass in the value -1. // chars_to_break_after: The list of special characters (concatenated into a // string) after which a should be added, if there is no natural // break at that point. To turn off this rule, pass in the empty string. // chars_to_break_before: The list of special characters (concatenated into a // string) before which a should be added, if there is no natural // break at that point. To turn off this rule, pass in the empty string. // Returns: The string str htmlescaped, and with s inserted according to // the rules specified by the other arguments. function HtmlEscapeInsertWbrs(str, n, chars_to_break_after, chars_to_break_before) { AssertNumArgs(4); var out = ''; var strpos = 0; var spc = 0; for (var i = 1; i < str.length; ++i) { var prev_char = str.charAt(i - 1); var next_char = str.charAt(i); if (IsSpace(next_char)) { spc = i; } else if (i - spc == n || chars_to_break_after.indexOf(prev_char) != -1 || chars_to_break_before.indexOf(next_char) != -1) { out += HtmlEscape(str.substring(strpos, i)) + ''; strpos = i; spc = i; } } out += HtmlEscape(str.substr(strpos)); return out; } // Converts a string to its canonicalized label form. var illegal_chars_re_ = /[ \/(){}&|\\\"\000]/g; function CanonicalizeLabel(str, lowercase) { var uppercase = str.replace(illegal_chars_re_, '-'); return lowercase ? uppercase.toLowerCase() : uppercase; } // Case-insensitive string comparator function CompareStringsIgnoreCase(s1, s2) { s1 = s1.toLowerCase(); s2 = s2.toLowerCase(); if (s1 < s2) { return -1; } else if (s1 == s2) { return 0; } else { return 1; } } //------------------------------------------------------------------------ // TextArea utilities //------------------------------------------------------------------------ // Gets the cursor pos in a text area. Returns -1 if the cursor pos cannot // be determined or if the cursor out of the textfield. function GetCursorPos(win, textfield) { try { if (IsDefined(textfield.selectionEnd)) { // Mozilla directly supports this return textfield.selectionEnd; } else if (win.document.selection && win.document.selection.createRange) { // IE doesn't export an accessor for the endpoints of a selection. // Instead, it uses the TextRange object, which has an extremely obtuse // API. Here's what seems to work: // (1) Obtain a textfield from the current selection (cursor) var tr = win.document.selection.createRange(); // Check if the current selection is in the textfield if (tr.parentElement() != textfield) { return -1; } // (2) Make a text range encompassing the textfield var tr2 = tr.duplicate(); tr2.moveToElementText(textfield); // (3) Move the end of the copy to the beginning of the selection tr2.setEndPoint("EndToStart", tr); // (4) The span of the textrange copy is equivalent to the cursor pos var cursor = tr2.text.length; // Finally, perform a sanity check to make sure the cursor is in the // textfield. IE sometimes screws this up when the window is activated if (cursor > textfield.value.length) { return -1; } return cursor; } else { Debug("Unable to get cursor position for: " + navigator.userAgent); // Just return the size of the textfield // TODO: Investigate how to get cursor pos in Safari! return textfield.value.length; } } catch (e) { DumpException(e, "Cannot get cursor pos"); } return -1; } function SetCursorPos(win, textfield, pos) { if (IsDefined(textfield.selectionEnd) && IsDefined(textfield.selectionStart)) { // Mozilla directly supports this textfield.selectionStart = pos; textfield.selectionEnd = pos; } else if (win.document.selection && textfield.createTextRange) { // IE has textranges. A textfield's textrange encompasses the // entire textfield's text by default var sel = textfield.createTextRange(); sel.collapse(true); sel.move("character", pos); sel.select(); } } //------------------------------------------------------------------------ // Array utilities //------------------------------------------------------------------------ // Find an item in an array, returns the key, or -1 if not found function FindInArray(array, x) { for (var i = 0; i < array.length; i++) { if (array[i] == x) { return i; } } return -1; } // Inserts an item into an array, if it's not already in the array function InsertArray(array, x) { if (FindInArray(array, x) == -1) { array[array.length] = x; } } // Delete an element from an array function DeleteArrayElement(array, x) { var i = 0; while (i < array.length && array[i] != x) i++; array.splice(i, 1); } // Copies a flat array function CopyArray(array) { var copy = []; for (var i = 0; i < array.length; i++) { copy[i] = array[i]; } return copy; } // Clone an object (recursively) function CloneObject(x) { if ((typeof x) == "object") { var y = []; for (var i in x) { y[i] = CloneObject(x[i]); } return y; } return x; } /** * Clone an event; cannot use CloneObject(event) * because it suffers from infinite recursion. * Thus, only a subset of the event properties are * cloned -- if you need others, just add them * to this function (just don't remove any!) */ function CloneEvent(ev) { var clone = {}; clone.clientX = ev.clientX; clone.clientY = ev.clientY; clone.pageX = ev.pageX; clone.pageY = ev.pageY; clone.type = ev.type; clone.srcElement = ev.srcElement; clone.target = ev.target; clone.cancelBubble = ev.cancelBubble; clone.explicitOriginalTarget = ev.explicitOriginalTarget; // add more properties here return clone; } function GetEventTarget(/*Event*/ ev) { // Event is not a type in IE; IE uses Object for events // AssertType(ev, Event, 'arg passed to GetEventTarget not an Event'); return ev.srcElement || ev.target; } /** cancels the event */ // from http://www.quirksmode.org/js/events_order.html function CancelEvent(/*Event*/ ev) { if (is_ie) { ev.cancelBubble = true; } else if (ev.stopPropagation) { ev.stopPropagation(); } } //------------------------------------------------------------------------ // Formatting utilities //------------------------------------------------------------------------ // A simple printf type function that takes in a template array, and a data // array. e.g. PrintArray(["a",,"b",,"c"], ["x", "y"]) => axbyc function PrintArray(array, data) { // Check that the argument count is correct. AssertEquals(array.length, data.length * 2 + 1); for (var i = 0, idx = 1; i < data.length; i++, idx += 2) { array[idx] = data[i]; } return array.join(""); } function ImageHtml(url, attributes) { return ""; } // Formats an object id that has two id numbers, eg, foo_3_7 function MakeId3(idprefix, m, n) { return idprefix + m + "_" + n; } //------------------------------------------------------------------------ // Email address parsing //------------------------------------------------------------------------ // Parse an email address of the form "name"
into [name, address] function ParseAddress(addr) { var name = ""; var address = ""; for (var i = 0; i < addr.length;) { var token = GetEmailToken(addr, i); if (token.charAt(0) == '<') { var end = token.indexOf(">"); address = token.substring(1, (end != -1) ? end : token.length); } else if (address == "") { name += token; } i += token.length; } // Check if it's a simple email address of the form "jlim@google.com" if (address == "" && name.indexOf("@") != -1) { address = name; name = ""; } name = CollapseWhitespace(name); name = StripQuotes(name, "'"); name = StripQuotes(name, "\""); address = CollapseWhitespace(address); return [name, address]; } // Given an email address, get the address part function GetAddress(address) { return ParseAddress(address)[1]; } // Get the username part of an email address function GetAddressUsername(address) { address = GetAddress(address); var at = address.indexOf("@"); return (at == -1) ? address : address.substr(0, at); } // Given an email address, get the personal part function GetPersonal(address) { return ParseAddress(address)[0]; } // Given an address, get a short name function GetPersonalElseUsername(address) { var personal = GetPersonal(address); if (personal != "") { return personal; } else { return GetAddressUsername(address); } } // Strip ' or " chars around a string function StripQuotes(str, quotechar) { var len = str.length; if (str.charAt(0) == quotechar && str.charAt(len - 1) == quotechar) { return str.substring(1, len - 1); } return str; } // Convert a string containing list of email addresses into an array // of strings function EmailsToArray(str) { var result = []; var email = ""; var token; for (var i = 0; i < str.length; ) { token = GetEmailToken(str, i); if (token == ",") { AddEmailAddress(result, email); email = ""; i++; continue; } email += token; i += token.length; } // Add last if (email !="" || token == ",") { AddEmailAddress(result, email); } return result; } // Get the next token from a position in an address string var openers_ = "\"<(["; var closers_ = "\">)]"; function GetEmailToken(str, pos) { var ch = str.charAt(pos); var p = openers_.indexOf(ch); if (p == -1) return ch; var end_pos = str.indexOf(closers_.charAt(p), pos + 1); var token = (end_pos >= 0) ? str.substring(pos, end_pos + 1) : str.substr(pos); return token; } // Add an email address to the result array. function AddEmailAddress(result, email) { email = CleanEmailAddress(email); result[result.length] = email; } // Clean up email address: // - remove extra spaces // - Surround name with quotes if it contains special characters // to check if we need " quotes // Note: do not use /g in the regular expression, otherwise the // regular expression cannot be reusable. var specialchars_re_ = /[()<>@,;:\\\".\[\]]/; function CleanEmailAddress(str) { var name_address = ParseAddress(str); var name = name_address[0]; var address = name_address[1]; if (name.indexOf("\"") == -1) { // If there's no " var quote_needed = specialchars_re_.test(name); if (quote_needed) { name = "\"" + name + "\""; } } if (name == "") return address; else if (address == "") return name; else return name + " <" + address + ">"; } //------------------------------------------------------------------------ // Misc //------------------------------------------------------------------------ // Compare long hex strings function CompareID(a, b) { if (a.length != b.length) { return (a.length - b.length); } else { return (a < b) ? -1 : (a > b) ? 1 : 0; } } // Check if a value is defined function IsDefined(value) { return (typeof value) != 'undefined'; } function GetKeyCode(event) { var code; if (event.keyCode) { code = event.keyCode; } else if (event.which) { code = event.which; } return code; } // define a forid function to fetch a DOM node by id. function forid_1(id) { return document.getElementById(id); } function forid_2(id) { return document.all[id]; } /** * Fetch an HtmlElement by id. * DEPRECATED: use $ in dom.js */ var forid = document.getElementById ? forid_1 : forid_2; function log(msg) { /* a top level window is its own parent. Use != or else fails on IE with * infinite loop. */ try { if (window.parent != window && window.parent.log) { window.parent.log(window.name + '::' + msg); return; } } catch (e) { // Error: uncaught exception: Permission denied to get property Window.log } var logPane = forid('log'); if (logPane) { var logText = '

' + new Date() + '' + msg + '

'; logPane.innerHTML = logText + logPane.innerHTML; } else { window.status = msg; } } lmen_?@A CDEFGHIJ]Cache-ControlWExpires_Content-Encoding\Content-TypeVServer^Content-LengthTDate]Last-ModifiedVpublic_Fri, 16 Oct 2009 13:30:15 GMTTgzip_application/x-javascriptWGFE/1.3T2066_Thu, 11 Sep 2008 13:30:15 GMT_Wed, 03 Sep 2008 19:03:47 GMT./\]]^2_NSMutableDictionary\NSDictionaryV./abbc2_NSHTTPURLResponse]NSURLResponse)27:PRd INWbekt} ,3SXs{ dOV // Commonly-used functions, reduced. function d(s) {return document.getElementById(s);} function dE(o,s) {return o.getElementsByTagName(s);} /** * toggleDisplay() * * Will toggle the display property of the style object for any * DOM element or object that supports style as a property. * * Warning: This'll wreak havoc if applied to elements. Those * babies got different types "table-row" | "block" dependant on * what browser's being used. * * Warning: Written in Texas. Yeehaw. * * Typical usage: * toggleDisplay(document.getElementById("foo")); */ function toggleDisplay(o) { var display = getStyle(o, "display"); if (o.style) o.style.display = (display != "none") ? "none" : getDisplayStyleByTagName(o); } function getDisplayStyleByTagName(o) { var n = o.nodeName.toLowerCase(); return ( n == "span" || n == "img" || n == "a" ) ? "inline" : "block"; } /** * hideElement() * * Hides an element from view. * * Typical usage: * hideElement(getElement("the-id-of-the-element")); */ function hideElement(o) { if (o && o.style) o.style.display = "none"; } /** * showElement() * * Shows an element that was hidden from view. * * Typical usage: * showElement(getElement("the-id-of-the-element")); */ function showElement(o) { if (o && o.style) o.style.display = getDisplayStyleByTagName(o); } /** * getElement() * * Returns an element by its ID or shows an alert if it can't be found. * * Typical usage: * getElement("the-id-of-the-element"); */ function getElement(id) { var e = d(id); if (!e) { alert("Cannot get element: " + id); } return e; } /** * setInnerHTML() * * Sets the innerHTML of an element or shows an alert if can't be set. * * Typical usage: * setInnerHTML("the-id-of-the-element"); */ function setInnerHTML(id, html) { try { getElement(id).innerHTML = html; } catch (ex) { alert("Cannot set inner HTML: " + id); } } /** * setCssStyle() * * Sets the style of an element by its id or shows an alert if can't be set. * * Typical usage: * setCssStyle("the-id-of-the-element", "display", "block"); */ function setCssStyle(id, name, value) { try { getElement(id).style[name] = value; } catch (ex) { alert("Cannot set style: " + id); } } /** * getStyle() * * Gets the computed style of any object. * * WARNING: Produces unexpected results in Safari. To achieve best * results, explicitly set the style property for that browser when the * element is rendered. * * Typical usage: * getStyle(object, "display"); */ function getStyle(el, style) { if (!document.getElementById || !el) return; if (document.defaultView && document.defaultView.getComputedStyle) { return document.defaultView. getComputedStyle(el, "").getPropertyValue(style); } else if (el.currentStyle) { return el.currentStyle[style]; } else { return el.style.display; } } /** * getStyleAttribute() * * Returns the style attribute of the specified node. */ function getStyleAttribute(node) { if (Detect.IE()) { return node.getAttribute('style').value; }else { return node.getAttribute('style'); } } /* * showProps() * * Displays all the properties for a given element */ function showProps(o) { var s=""; for (var p in o) { s+=p+": "+o[p]+"\n
"; } document.write(s); } function setIFrameEvent(iframe, eventName, func) { if (document.all) { eval('getIFrameDocument(iframe).on' + eventName + ' = func;'); } else { iframe.contentWindow.addEventListener(eventName, func, true); } } function setIFrameBody(iframe, strStyle, innerHtml) { if (!innerHtml) innerHtml = ''; if (innerHtml == '' && Detect.IE()) { innerHtml = '
'; } var doc = getIFrameDocument(iframe); doc.open(); doc.write('' + innerHtml + ''); doc.close(); } function getIFrameDocument(iframe) { if (Detect.IE()) { return iframe.document; } else { return iframe.contentDocument; } } function getIFrame(strId) { if (Detect.IE()) { return document.frames[strId]; } else { return document.getElementById(strId); } } function createElementandAppend(nodeName, strId, appendTo) { var el = document.createElement(nodeName); el.setAttribute("id", strId); if (appendTo) { appendTo.appendChild(el); } else { document.body.appendChild(el); } return el; } function createElementandInsertBefore(nodeName, strId, appendTo, sibling) { var el = document.createElement(nodeName); el.setAttribute("id", strId); if (appendTo) { appendTo.insertBefore(el, sibling); } else { document.body.insertBefore(el, sibling); } return el; } /** * getXY() * * Returns the position of any element as an object. * * Typical usage: * var pos = getXY(object); * alert(pos.x + " " +pos.y); */ function getXY(el) { var x = el.offsetLeft; var y = el.offsetTop; if (el.offsetParent != null) { var pos = getXY(el.offsetParent); x += pos.x; y += pos.y; } return {x: x, y: y} } // The following 3 functions are taken from common.js function hasClass(el, cl) { if (el == null || el.className == null) return false; var classes = el.className.split(" "); for (var i = 0; i < classes.length; i++) { if (classes[i] == cl) { return true; } } return false; } // Add a class to element function addClass(el, cl) { if (hasClass(el, cl)) return; el.className += " " + cl; } // Remove a class from an element function removeClass(el, cl) { if (el.className == null) return; var classes = el.className.split(" "); var result = []; var changed = false; for (var i = 0; i < classes.length; i++) { if (classes[i] != cl) { if (classes[i]) { result.push(classes[i]); } } else { changed = true; } } if (changed) { el.className = result.join(" "); } } function toggleClass(el, cl) { if (hasClass(el, cl)) { removeClass(el, cl); } else { addClass(el, cl); } } /* Constants for node types, since IE doesn't support Node.TEXT_NODE */ var TEXT_NODE = 3; var ELEMENT_NODE = 1; pqLr_,http://www.blogger.com/img/navbar/1/flag.gifObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-345IJKLMNOPQRSTUVW[\U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_,http://www.blogger.com/img/navbar/1/flag.gif./01X$classesZ$classname12UNSURLXNSObject#AMxv 6789AWNS.keysZNS.objects:;<=>?@ BCDEFGHWExpires]Cache-Control\Content-TypeVServerTDate^Content-Length]Last-Modified_Sun, 17 Jan 2038 19:14:07 GMTVpublicYimage/gifSgws_Thu, 18 Sep 2008 15:10:25 GMTR52_Fri, 09 May 2008 15:04:46 GMT./XYYZ2_NSMutableDictionary\NSDictionary4./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd7<EPSYbkmt|!(26VYy~`O4GIF89a!, ˭g ;tuQv_*https://ssl.google-analytics.com/urchin.jsObplist00 X$versionT$topY$archiverX$objects_WebResourceResponse_NSKeyedArchiver &,-3%45IJKLMNOPQRSTUVW[\U$null  !"#$%V$classR$3R$8S$10S$11R$5R$6R$4R$7R$2R$9R$0R$1 '()$+WNS.base[NS.relative_*https://ssl.google-analytics.com/urchin.js./01X$classesZ$classname12UNSURLXNSObject#AMH 6789AWNS.keysZNS.objects:;<=>?@ BCDEFGH]Cache-Control_Content-Encoding\Content-TypeVServerTDate^Content-Length]Last-Modified_max-age=604800, publicTgzip_text/javascriptTucfe_Thu, 18 Sep 2008 15:10:25 GMTT6846_Tue, 17 Jun 2008 17:20:41 GMT./XYYZ2_NSMutableDictionary\NSDictionaryXu./]^^_2_NSHTTPURLResponse]NSURLResponse)27:PRd5:CNQW`ikrz #(:?_d`OXu//-- Google Analytics Urchin Module //-- Copyright 2007 Google, All Rights Reserved. //-- Urchin On Demand Settings ONLY var _uacct=""; // set up the Urchin Account var _userv=1; // service mode (0=local,1=remote,2=both) //-- UTM User Settings var _ufsc=1; // set client info flag (1=on|0=off) var _udn="auto"; // (auto|none|domain) set the domain name for cookies var _uhash="on"; // (on|off) unique domain hash for cookies var _utimeout="1800"; // set the inactive session timeout in seconds var _ugifpath="/__utm.gif"; // set the web path to the __utm.gif file var _utsp="|"; // transaction field separator var _uflash=1; // set flash version detect option (1=on|0=off) var _utitle=1; // set the document title detect option (1=on|0=off) var _ulink=0; // enable linker functionality (1=on|0=off) var _uanchor=0; // enable use of anchors for campaign (1=on|0=off) var _utcp="/"; // the cookie path for tracking var _usample=100; // The sampling % of visitors to track (1-100). //-- UTM Campaign Tracking Settings var _uctm=1; // set campaign tracking module (1=on|0=off) var _ucto="15768000"; // set timeout in seconds (6 month default) var _uccn="utm_campaign"; // name var _ucmd="utm_medium"; // medium (cpc|cpm|link|email|organic) var _ucsr="utm_source"; // source var _uctr="utm_term"; // term/keyword var _ucct="utm_content"; // content var _ucid="utm_id"; // id number var _ucno="utm_nooverride"; // don't override //-- Auto/Organic Sources and Keywords var _uOsr=new Array(); var _uOkw=new Array(); _uOsr[0]="google"; _uOkw[0]="q"; _uOsr[1]="yahoo"; _uOkw[1]="p"; _uOsr[2]="msn"; _uOkw[2]="q"; _uOsr[3]="aol"; _uOkw[3]="query"; _uOsr[4]="aol"; _uOkw[4]="encquery"; _uOsr[5]="lycos"; _uOkw[5]="query"; _uOsr[6]="ask"; _uOkw[6]="q"; _uOsr[7]="altavista"; _uOkw[7]="q"; _uOsr[8]="netscape"; _uOkw[8]="query"; _uOsr[9]="cnn"; _uOkw[9]="query"; _uOsr[10]="looksmart"; _uOkw[10]="qt"; _uOsr[11]="about"; _uOkw[11]="terms"; _uOsr[12]="mamma"; _uOkw[12]="query"; _uOsr[13]="alltheweb"; _uOkw[13]="q"; _uOsr[14]="gigablast"; _uOkw[14]="q"; _uOsr[15]="voila"; _uOkw[15]="rdata"; _uOsr[16]="virgilio"; _uOkw[16]="qs"; _uOsr[17]="live"; _uOkw[17]="q"; _uOsr[18]="baidu"; _uOkw[18]="wd"; _uOsr[19]="alice"; _uOkw[19]="qs"; _uOsr[20]="yandex"; _uOkw[20]="text"; _uOsr[21]="najdi"; _uOkw[21]="q"; _uOsr[22]="aol"; _uOkw[22]="q"; _uOsr[23]="club-internet"; _uOkw[23]="query"; _uOsr[24]="mama"; _uOkw[24]="query"; _uOsr[25]="seznam"; _uOkw[25]="q"; _uOsr[26]="search"; _uOkw[26]="q"; _uOsr[27]="wp"; _uOkw[27]="szukaj"; _uOsr[28]="onet"; _uOkw[28]="qt"; _uOsr[29]="netsprint"; _uOkw[29]="q"; _uOsr[30]="google.interia"; _uOkw[30]="q"; _uOsr[31]="szukacz"; _uOkw[31]="q"; _uOsr[32]="yam"; _uOkw[32]="k"; _uOsr[33]="pchome"; _uOkw[33]="q"; _uOsr[34]="kvasir"; _uOkw[34]="searchExpr"; _uOsr[35]="sesam"; _uOkw[35]="q"; _uOsr[36]="ozu"; _uOkw[36]="q"; _uOsr[37]="terra"; _uOkw[37]="query"; _uOsr[38]="nostrum"; _uOkw[38]="query"; _uOsr[39]="mynet"; _uOkw[39]="q"; _uOsr[40]="ekolay"; _uOkw[40]="q"; _uOsr[41]="search.ilse"; _uOkw[41]="search_for"; //-- Auto/Organic Keywords to Ignore var _uOno=new Array(); //_uOno[0]="urchin"; //_uOno[1]="urchin.com"; //_uOno[2]="www.urchin.com"; //-- Referral domains to Ignore var _uRno=new Array(); //_uRno[0]=".urchin.com"; //-- **** Don't modify below this point *** var _uff,_udh,_udt,_ubl=0,_udo="",_uu,_ufns=0,_uns=0,_ur="-",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh="",_uwv="1.3"; var _ugifpath2="http://www.google-analytics.com/__utm.gif"; if (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#')); if (_udl.protocol=="https:") _ugifpath2="https://ssl.google-analytics.com/__utm.gif"; if (!_utcp || _utcp=="") _utcp="/"; function urchinTracker(page) { if (_udl.protocol=="file:") return; if (_uff && (!page || page=="")) return; var a,b,c,xx,v,z,k,x="",s="",f=0,nv=0; var nx=" expires="+_uNx()+";"; var dc=_ubd.cookie; _udh=_uDomain(); if (!_uVG()) return; _uu=Math.round(Math.random()*2147483647); _udt=new Date(); _ust=Math.round(_udt.getTime()/1000); a=dc.indexOf("__utma="+_udh+"."); b=dc.indexOf("__utmb="+_udh); c=dc.indexOf("__utmc="+_udh); if (_udn && _udn!="") { _udo=" domain="+_udn+";"; } if (_utimeout && _utimeout!="") { x=new Date(_udt.getTime()+(_utimeout*1000)); x=" expires="+x.toGMTString()+";"; } if (_ulink) { if (_uanchor && _udlh && _udlh!="") s=_udlh+"&"; s+=_udl.search; if(s && s!="" && s.indexOf("__utma=")>=0) { if (!(_uIN(a=_uGC(s,"__utma=","&")))) a="-"; if (!(_uIN(b=_uGC(s,"__utmb=","&")))) b="-"; if (!(_uIN(c=_uGC(s,"__utmc=","&")))) c="-"; v=_uGC(s,"__utmv=","&"); z=_uGC(s,"__utmz=","&"); k=_uGC(s,"__utmk=","&"); xx=_uGC(s,"__utmx=","&"); if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a="-";b="-";c="-";xx="-";z="-";v="-";} if (a!="-" && b!="-" && c!="-") f=1; else if(a!="-") f=2; } } if(f==1) { _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo; _ubd.cookie="__utmc="+c+"; path="+_utcp+";"+_udo; } else if (f==2) { a=_uFixA(s,"&",_ust); _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo; _ufns=1; } else if (a>=0 && b>=0 && c>=0) { b = _uGC(dc,"__utmb="+_udh,";"); b = ("-" == b) ? _udh : b; _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo; } else { if (a>=0) a=_uFixA(_ubd.cookie,";",_ust); else { a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1"; nv=1; } _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo; _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo; _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo; _ufns=1; } if (_ulink && xx && xx!="" && xx!="-") { xx=_uUES(xx); if (xx.indexOf(";")==-1) _ubd.cookie="__utmx="+xx+"; path="+_utcp+";"+nx+_udo; } if (_ulink && v && v!="" && v!="-") { v=_uUES(v); if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo; } var wc=window; var c=_ubd.cookie; if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){ var g=wc.gaGlobal; var ua=c.split("__utma="+_udh+".")[1].split(";")[0].split("."); if(g.sid)ua[3]=g.sid; if(nv>0){ ua[2]=ua[3]; if(g.vid){ var v=g.vid.split("."); ua[0]=v[0]; ua[1]=v[1]; } } _ubd.cookie="__utma="+_udh+"."+ua.join(".")+"; path="+_utcp+";"+nx+_udo; } _uInfo(page); _ufns=0; _ufno=0; if (!page || page=="") _uff=1; } function _uGH() { var hid; var wc=window; if (wc && wc.gaGlobal && wc.gaGlobal.hid) { hid=wc.gaGlobal.hid; } else { hid=Math.round(Math.random()*0x7fffffff); if (!wc.gaGlobal) wc.gaGlobal={}; wc.gaGlobal.hid=hid; } return hid; } function _uInfo(page) { var p,s="",dm="",pg=_udl.pathname+_udl.search; if (page && page!="") pg=_uES(page,1); _ur=_ubd.referrer; if (!_ur || _ur=="") { _ur="-"; } else { dm=_ubd.domain; if(_utcp && _utcp!="/") dm+=_utcp; p=_ur.indexOf(dm); if ((p>=0) && (p<=8)) { _ur="0"; } if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; } } s+="&utmn="+_uu; if (_ufsc) s+=_uBInfo(); if (_uctm) s+=_uCInfo(); if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+_uES(_ubd.title); if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname); if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample); s+="&utmhid="+_uGH(); s+="&utmr="+_ur; s+="&utmp="+pg; if ((_userv==0 || _userv==2) && _uSP()) { var i=new Image(1,1); i.src=_ugifpath+"?"+"utmwv="+_uwv+s; i.onload=function() { _uVoid(); } } if ((_userv==1 || _userv==2) && _uSP()) { var i2=new Image(1,1); i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS(); i2.onload=function() { _uVoid(); } } return; } function _uVoid() { return; } function _uCInfo() { if (!_ucto || _ucto=="") { _ucto="15768000"; } if (!_uVG()) return; var c="",t="-",t2="-",t3="-",o=0,cs=0,cn=0,i=0,z="-",s=""; if (_uanchor && _udlh && _udlh!="") s=_udlh+"&"; s+=_udl.search; var x=new Date(_udt.getTime()+(_ucto*1000)); var dc=_ubd.cookie; x=" expires="+x.toGMTString()+";"; if (_ulink && !_ubl) { z=_uUES(_uGC(s,"__utmz=","&")); if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; } } z=dc.indexOf("__utmz="+_udh+"."); if (z>-1) { z=_uGC(dc,"__utmz="+_udh+".",";"); } else { z="-"; } t=_uGC(s,_ucid+"=","&"); t2=_uGC(s,_ucsr+"=","&"); t3=_uGC(s,"gclid=","&"); if ((t!="-" && t!="") || (t2!="-" && t2!="") || (t3!="-" && t3!="")) { if (t!="-" && t!="") c+="utmcid="+_uEC(t); if (t2!="-" && t2!="") { if (c != "") c+="|"; c+="utmcsr="+_uEC(t2); } if (t3!="-" && t3!="") { if (c != "") c+="|"; c+="utmgclid="+_uEC(t3); } t=_uGC(s,_uccn+"=","&"); if (t!="-" && t!="") c+="|utmccn="+_uEC(t); else c+="|utmccn=(not+set)"; t=_uGC(s,_ucmd+"=","&"); if (t!="-" && t!="") c+="|utmcmd="+_uEC(t); else c+="|utmcmd=(not+set)"; t=_uGC(s,_uctr+"=","&"); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); } t=_uGC(s,_ucct+"=","&"); if (t!="-" && t!="") c+="|utmcct="+_uEC(t); t=_uGC(s,_ucno+"=","&"); if (t=="1") o=1; if (z!="-" && o==1) return ""; } if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1) return ""; } if (c=="-" || c=="") { if (_ufns==1) c=_uRef(); if (z!="-" && _ufno==1) return ""; } if (c=="-" || c=="") { if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; } if (c=="-" || c=="") return ""; } if (z!="-") { i=z.indexOf("."); if (i>-1) i=z.indexOf(".",i+1); if (i>-1) i=z.indexOf(".",i+1); if (i>-1) i=z.indexOf(".",i+1); t=z.substring(i+1,z.length); if (t.toLowerCase()==c.toLowerCase()) cs=1; t=z.substring(0,i); if ((i=t.lastIndexOf(".")) > -1) { t=t.substring(i+1,t.length); cn=(t*1); } } if (cs==0 || _ufns==1) { t=_uGC(dc,"__utma="+_udh+".",";"); if ((i=t.lastIndexOf(".")) > 9) { _uns=t.substring(i+1,t.length); _uns=(_uns*1); } cn++; if (_uns==0) _uns=1; _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo; } if (cs==0 || _ufns==1) return "&utmcn=1"; else return "&utmcr=1"; } function _uRef() { if (_ur=="0" || _ur=="" || _ur=="-") return ""; var i=0,h,k,n; if ((i=_ur.indexOf("://"))<0 || _uGCse()) return ""; h=_ur.substring(i+3,_ur.length); if (h.indexOf("/") > -1) { k=h.substring(h.indexOf("/"),h.length); if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?")); h=h.substring(0,h.indexOf("/")); } h=h.toLowerCase(); n=h; if ((i=n.indexOf(":")) > -1) n=n.substring(0,i); for (var ii=0;ii<_uRno.length;ii++) { if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; } } if (h.indexOf("www.")==0) h=h.substring(4,h.length); return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral"; } function _uOrg(t) { if (_ur=="0" || _ur=="" || _ur=="-") return ""; var i=0,h,k; if ((i=_ur.indexOf("://"))<0 || _uGCse()) return ""; h=_ur.substring(i+3,_ur.length); if (h.indexOf("/") > -1) { h=h.substring(0,h.indexOf("/")); } for (var ii=0;ii<_uOsr.length;ii++) { if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) { if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) { k=_ur.substring(i+_uOkw[ii].length+2,_ur.length); if ((i=k.indexOf("&")) > -1) k=k.substring(0,i); for (var yy=0;yy<_uOno.length;yy++) { if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; } } if (t) return _uEC(k); else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic"; } } } return ""; } function _uGCse() { var h,p; h=p=_ur.split("://")[1]; if(h.indexOf("/")>-1) { h=h.split("/")[0]; p=p.substring(p.indexOf("/")+1,p.length); } if(p.indexOf("?")>-1) { p=p.split("?")[0]; } if(h.toLowerCase().indexOf("google")>-1) { if(_ur.indexOf("?q=")>-1 || _ur.indexOf("&q=")>-1) { if (p.toLowerCase().indexOf("cse")>-1) { return true; } } } } function _uBInfo() { var sr="-",sc="-",ul="-",fl="-",cs="-",je=1; var n=navigator; if (self.screen) { sr=screen.width+"x"+screen.height; sc=screen.colorDepth+"-bit"; } else if (self.java) { var j=java.awt.Toolkit.getDefaultToolkit(); var s=j.getScreenSize(); sr=s.width+"x"+s.height; } if (n.language) { ul=n.language.toLowerCase(); } else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); } je=n.javaEnabled()?1:0; if (_uflash) fl=_uFlash(); if (_ubd.characterSet) cs=_uES(_ubd.characterSet); else if (_ubd.charset) cs=_uES(_ubd.charset); return "&utmcs="+cs+"&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmfl="+fl; } function __utmSetTrans() { var e; if (_ubd.getElementById) e=_ubd.getElementById("utmtrans"); else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans; if (!e) return; var l=e.value.split("UTM:"); var i,i2,c; if (_userv==0 || _userv==2) i=new Array(); if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); } for (var ii=0;ii -1) { i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; } c=l.substring((i+i3),i2); } return c; } function _uDomain() { if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; } if (_udn=="auto") { var d=_ubd.domain; if (d.substring(0,4)=="www.") { d=d.substring(4,d.length); } _udn=d; } _udn = _udn.toLowerCase(); if (_uhash=="off") return 1; return _uHash(_udn); } function _uHash(d) { if (!d || d=="") return 1; var h=0,g=0; for (var i=d.length-1;i>=0;i--) { var c=parseInt(d.charCodeAt(i)); h=((h << 6) & 0xfffffff) + c + (c << 14); if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21)); } return h; } function _uFixA(c,s,t) { if (!c || c=="" || !s || s=="" || !t || t=="") return "-"; var a=_uGC(c,"__utma="+_udh+".",s); var lt=0,i=0; if ((i=a.lastIndexOf(".")) > 9) { _uns=a.substring(i+1,a.length); _uns=(_uns*1)+1; a=a.substring(0,i); if ((i=a.lastIndexOf(".")) > 7) { lt=a.substring(i+1,a.length); a=a.substring(0,i); } if ((i=a.lastIndexOf(".")) > 5) { a=a.substring(0,i); } a+="."+lt+"."+t+"."+_uns; } return a; } function _uTrim(s) { if (!s || s=="") return ""; while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length); while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1); return s; } function _uEC(s) { var n=""; if (!s || s=="") return ""; for (var i=0;i0) r=a.substring(i+1,i2); else return ""; if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return ""; if (f) { return r; } else { var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9'); return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m]; } } function _uIN(n) { if (!n) return false; for (var i=0;i"9") && (c!=".")) return false; } return true; } function _uES(s,u) { if (typeof(encodeURIComponent) == 'function') { if (u) return encodeURI(s); else return encodeURIComponent(s); } else { return escape(s); } } function _uUES(s) { if (typeof(decodeURIComponent) == 'function') { return decodeURIComponent(s); } else { return unescape(s); } } function _uVG() { if((_udn.indexOf("www.google.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) { return false; } return true; } function _uSP() { var s=100; if (_usample) s=_usample; if(s>=100 || s<=0) return true; return ((__utmVisitorCode(1)%10000)<(s*100)); } function urchinPathCopy(p){ var d=document,nx,tx,sx,i,c,cs,t,h,o; cs=new Array("a","b","c","v","x","z"); h=_uDomain(); if (_udn && _udn!="") o=" domain="+_udn+";"; nx=_uNx()+";"; tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000)); tx=tx.toGMTString()+";"; sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000)); sx=sx.toGMTString()+";"; for (i=0;i<6;i++){ t=" expires="; if (i==1) t+=tx; else if (i==2) t=""; else if (i==5) t+=sx; else t+=nx; c=_uGC(d.cookie,"__utm"+cs[i]+"="+h,";"); if (c!="-") d.cookie="__utm"+cs[i]+"="+c+"; path="+p+";"+t+o; } } function _uCO() { if (!_utk || _utk=="" || _utk.length<10) return; var d='www.google.com'; if (_utk.charAt(0)=='!') d='analytics.corp.google.com'; _ubd.cookie="GASO="+_utk+"; path="+_utcp+";"+_udo; var sc=document.createElement('script'); sc.type='text/javascript'; sc.id="_gasojs"; sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random(); document.getElementsByTagName('head')[0].appendChild(sc); } function _uGT() { var h=location.hash, a; if (h && h!="" && h.indexOf("#gaso=")==0) { a=_uGC(h,"gaso=","&"); } else { a=_uGC(_ubd.cookie,"GASO=",";"); } return a; } var _utk=_uGT(); if (_utk && _utk!="" && _utk.length>10 && _utk.indexOf("=")==-1) { if (window.addEventListener) { window.addEventListener('load', _uCO, false); } else if (window.attachEvent) { window.attachEvent('onload', _uCO); } } function _uNx() { return (new Date((new Date()).getTime()+63072000000)).toGMTString(); } !3ITcvvv1v:vPvz|zUE#Z 4?Jt4=ڛ_h A%M%V%)==>B9[m[v[_uHuQuyAyKyyz/~.~@>@EP`  (foЫԷ=Fu+bkZw