From 389b7f33e7f11786f5d3dcc5ad9f3115bf96cc6b Mon Sep 17 00:00:00 2001 From: David Date: Sun, 6 May 2012 00:05:46 +0200 Subject: [PATCH] Merge with @h5bp Merge with HTML5 Boilerplate Mobile :) Add of Bookmark bubble with cookie fallback instead of parameter, which used to screw up with jQuery Mobile ! Add of Startup Images for iDevices. --- images/startup-retina.png | Bin 0 -> 15694 bytes images/startup-tablet-landscape.png | Bin 0 -> 16657 bytes images/startup-tablet-portrait.png | Bin 0 -> 16638 bytes images/startup.png | Bin 0 -> 13035 bytes index.html | 36 +- js/bookmark_bubble.js | 559 ++++++++++++++++++++++++++++ js/example.js | 56 +++ js/jqm.autoComplete.min-1.3.js | 10 + js/jquery.cookie.js | 47 +++ 9 files changed, 701 insertions(+), 7 deletions(-) create mode 100755 images/startup-retina.png create mode 100755 images/startup-tablet-landscape.png create mode 100755 images/startup-tablet-portrait.png create mode 100755 images/startup.png create mode 100644 js/bookmark_bubble.js create mode 100644 js/example.js create mode 100644 js/jqm.autoComplete.min-1.3.js create mode 100644 js/jquery.cookie.js diff --git a/images/startup-retina.png b/images/startup-retina.png new file mode 100755 index 0000000000000000000000000000000000000000..752d8c7fbbdfe65fecec579e353bfa66c6ac13a8 GIT binary patch literal 15694 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 T?FxQj1@c@`{b|V)vylG*5=L>) literal 0 HcmV?d00001 diff --git a/images/startup-tablet-landscape.png b/images/startup-tablet-landscape.png new file mode 100755 index 0000000000000000000000000000000000000000..b2751859d49eeae34715b349e371a96d7e44f127 GIT binary patch literal 16657 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 MB|WWN4U5440|@`eFaQ7m literal 0 HcmV?d00001 diff --git a/images/startup-tablet-portrait.png b/images/startup-tablet-portrait.png new file mode 100755 index 0000000000000000000000000000000000000000..9ce45408bff07534fbb96d605cd047150f457ffb GIT binary patch literal 16638 zcmeHucTkkywq+v-NREOaK~O=Ipd?8R2#92mEEyD#C^@NBFzoGyYE)LH?L;qzWc|WS5spZ)oOp=3H$7`_S$Q2KB+3p5);r7Kp+rexfjwe zArNfvSL_}9Yv2R+Mv)nO+<5mw*9ih4q{RGSK@z^xLLdYxZ>6MERW0qE?VT*`-!aQc zNin~3v^Rfi^9BNOpGi`;&`{sJDRw%Kc%~5iK3c*4B{e?t%V(kQsUq)l+_^y}AABcm znp&-uTt)_m{%2}1c6j*v&(vyGWNO*=n%YsNe$9kXi?Y=rB6$fJ6 zXJ)z#QRRdfv-z%#Lf$8x#d~2v^rG)jW2Htym?_@`OG7M0AO(Y3AuCs)7IuxsT}8>GAKTrMrGl z4E$tq&VIN3LMUe59{hUaqv_mQgzQx{A^M78l%+$?v{r|MYFUlKAzV7)^U;$`mQT;V zKIptRf_}ZU@aPg7y1)-9v4UcGMRMjCm|>qNu#xFFw=A7PAcyt#tz+!?*zYYrEDpM% z_r;O2srMl7&E>v2Kp=+Fceylr%f-9#ArR?QKaLVfdPFPjqZZuTt=H#T39pO=K0dqK z(e{k&8NuuKw;hci6!<@559}{t;4tPMlVIR$QL_w;dPl<5rddNG_Kx(z1V6czy}|DW zj^s~#N|QS?!C0mtI;`RNH1PpvcUoWIP=wxP?g^$+V^N6YfARQbhz7If3x-26$7@1C z`p@ekMSen__+JG!$UcttD^n92BdV0D%@L&g_&l9(=(Y3XgovA|i9?PRbYhDX+r)D4HiPp0LD z0FK);W)nuq7dnbM%2O|Lm~Y?ZBcHh;cmw;RS{oZnRE|Q${W|jV4qDSEkArkxJYt=o zh@j*q^9q*g5WGwAN$Lq(?U!qEr9U)AC`O)-*u7-ke3YBW_kxZ!s%Pf4bs3&e^dshn zKLb{hR@zs1SLj#n9O@AynMyePI8$F@f7xp#e`}R&m2VaI&9^6#ni&Z%;W=p<%Aw?QNf7G)a8phpvoJkol+KdI^7L)-hI1V`Jcdy@Zb*BiZ&P+7ZUY

S9g8fz^Egr4KEjQZYZ;DyBMni9PYw!p@-u|{8Pa1Epsl!pl;Y}UcOAsR; zb3cZjgIgmvFDq|8k5KbSvri);*H9f+^jwoyeL45WSZuy#UXtpzI=#9@u1HQ$o<)wm zhWHO3UF0WR-FC%x6{#O;sij8C4PDHHX1B`SAKkGg&JT3)%2EFf$xt6E zmY16*B*iPwt6l!`DB4^cZ~2?U*>`8<8|&=ZaYsHO^Hlo}mLAY&@hR3mexq-l7aJF= zlm8-LEnjxKQJ`oyJ1MJCre62bk3_Oto=u-k)*@oydeXZ3v^qSSAp540nDB8CSDtky zeOkS=TeDsE-nZl?!}rOG_Sy3ujq4Y;VcbX!r0qrau`H1eZaL9i+*zUlTG38^2YXQl z?(W$GH7SF338_qz7?ZfgkCC;*q8a1Q!=96Ve%qzLe0SNl%eE`yKJNWH_Z5`3l=c!{ zD%EB^$P!T$QS9#j)t}x!5zn6}_IUEidg6NGWa2`#@hkUNkE(L2YTn3|t-Q+8-K%P_ z3wR}@o2jGu%AovtVN&6}iTc9&Z1U_{ZC96}ovqe?5RWK6^ zQyPov&Z73csKzK*9V`qfhDRJUO_I;>iowUJ!jVc?OL#tE;QO99tP>Ht$!(!CNH#dd zyIe)t_n_l#l6vB(tObolt<#62;LuMB{(W3=P_9J!F8I&J6?x}l2ZKe=k>jMq^2D~? zoY~?%fxWkTL31g;_);Du>+(7cwf~g*t+qNWPM8wIW4%z|qavl^XHmJ%%5BCSsa-f( zQl06RcWSav13iH{rYu93MFr=d%317Zl7!vups5jihhmuL=Qu<-`~Ts z!2aYX>8E$?^32owPII`p@a&tDvguvP&#ASN)RGbYh5oCpg?B7}?tCe{bGrU*AadX> zNr0-)#>5bw$(l)MyAKgtKu~~opm_MZU>&;Q$8r2_!*fzj3(^rP|?zsKE9-pogbN{Daq1gQ7 zhyA<1%6n(O2!7vBLGMzuQ7nF~$_!M{=48-WYb>x5Did|^m?c=IzWy*!3%5YDCZvkP zc3dTYS39oAr}4h0lC_^CuOa<|RR>kh| ziOei_TtEA4{f8>4+Kgt=nua&oJp=tB;u=3R5E>U60(&FyN|VVmyWu^0uZ9!8o$*<{ zhEpW8r)gFbOH*mweEiL&+-3Qxc+sc4&9m4`TZ2MnTZi3l>=A4v9xF-JWbN2E!-$y1 z%ZQ1G+p;9xOiieyeK$^G0biS#?4sIG_nkw(wknN9!ED2v0v&q*;!Fdwe- zIpf*%DzA03fdwm4`~5mH=fx2jbm+QBgUEpXVU6=)+3YH%c8zvIv9OWtmh+Y0b?u&KW2Kk*=_Y-$-~b%a=y7lpJu#jvBnEFh^0YtgJUw2x3HNbiLk{%S zPrI@06*j0e7$GEfC8wp}LF3|jsJW^AIbW+5x74HIIoVU(fDePH$m0l7sp}E(5q*Kg zf!oPXp+Z7S;*QA8t8A&k*Ms+yX;A5?z9O2N+&*XH+mi#s--grT4&$PlZM`#*TP@qS zif6mpx)_^!+<6}xBD5}dTixc|81^$3NL5z6nSI&Omgl9%>ONeq0_%OHBnk+Gi0wKF7KHgd1cE~bc@Mb;Ap?}` z8a_k?R+g) z=nhMS+Rg}34hmT;bui=i_VuPW--S=n;Iegl6|&UAOUa&lVtv05vDZY5LlTB7}sDmLCvj+Z^L zpMeK1W5vVWBeXtX=N=<#>?rrr%h+l|5UNQDQ1srJ@=nt;P_uHj9J1DO`2B)=e zSKDlf{m>-&@$9WpV&Z8VQtc;-cPUbG^Eisxiwp9$w6KvY(-uwju3<*E!EP86czmwJ zxoSnwh+LISfw973l}zO&3$Vx-P0h)HW;?4V@fO&-;w9+q>bV`<$Kd?ot_N&f7l(00 zgV{c1(>sB6b(Q&(ub;#>U5bJgI_0kq{&>9; zV}dk0Slt~1H8pY=o^E;t;_AV=z0cdD{c=~0>o{aX+ZR3N<%H-I`n~$~`JD$=p=*lf zyIcH{JS?8v!^G%_2kn(Dl6XYAq-r}xZ`5K(YOpJqg;Pl>jNW}Lr zdKQhU+PKgywK)%Y)93kT?UQsmU*u2Xsk;=J-LdE3T%!A{R$}pc3#rH8ZsFa_q+(@H zJlQvL$L^m7V5Ygl8nR3Z+nyahc2d|)KX!3}%SZL*K8FcO=W(UTn3|Bh#_4aIS*<{r#y)McsABGflXEnwRq*74@LYwBKlsf8VNw zziR)}v47^wQE7ghaMiq7d9?1k96sBgT=|@3h~^iTzvNC9{Y}FoZC{s{TNZXM$L$dX z4Ov;{BR}LC&tH`4*jPO|4@gKj3<+6NbaG;RNMs8y%M=>Dt!40OWMuSta+URDk>G;o zsQqm+37$En%bx*G=*#aVoXSVVDPR-)3wk2ib#0k0zYW2;VN~8MR)RvT2 zEpoppXo;Yqc6p7DUaw>cMa829C!ceFciJDh1dDD)i@QF$nW$#~|Nb`oTm0C}OkLsI z*|{(D%aoa!v(@|Vw(HviSQ3!dKTmd9X$%jh2Lt(rEVAD06h ziR!Vjo;jJv>wDPiME?fyn|NQ>)98NGjl{$6{pR*X1{Hh5OwJcO0N#pbOVSz};pc$7 z(B3Qp2pIsssssxNUUlWj&$HV=1yay&ZEdL^1BVWFQ@%@qx&C?Uu0pNnPrIr(OpEH- zm5sD$oqJio@o+?YMp*&OrsUXC7by<1O9) z%*1puHoB;tyL8~5tnTaR6;!xCz+Zq54re8HM&`WX$pvK=Jzd*`%y+15f($u80x5kN z505FtI{#vIlaYw857h0gi}k{pXkl@FU%B6!hPEuxwE(0ua95MiJD6EmpdQ1WNznQ4 zJ<=chDvydq?j4W9aYJZvJcVOIf}gSBf~)W|gr>Va7M)AF|Dkq#{CwxcUg@& ze|vlDu$KRkDH%JZp}UD1K6se@oAX|+$z=1yWFcvBNUcGWQ(fAf6c6$8?r`tl{%V5; zhbYbzsMzUXmr8@LgX7re#{mXDy9RDtZwJh@Tsm07j&m=RnJ|v1^JonLh#Qd-6Y7sg z5;VEry#2YX<2I%1`GA38dV-ki%3nh~5y=0MQ)Agt+T9&S_t?v3IBzpUTZxGwNwQWm zpzi9fQ@a!A4)px6tjr0@H@u12bOP7e5uq?lbZKPV;#pOwZ!xip3%OeZ4NaKN_uG|E zZ_x`{Np~dvqE)Z4y4XlKU}ZJLcu}8Z>WH+d)syK$2!X$GI^-Hyo2Ch&1aJuxqnC!m z$2g0@e(_7`%2iEx&i#EZ#SQ2;{hw-htLEmzYeFx z+B&?@1_m-c%XW3Nk#{&nd4ChDvOJj@a!BQ>9t#eyDoH`8^I8Z=fru?Nl%tl>W-bv# z{cG%XS>I)IoB2&VNggvr6O@^_Z-P>Gqg(Qj*PHU`;D@?GJzo@zCCOfwbN&qwUJ7#| zI8-`_HnxXW^lZ4H1BsA*x}@19u0+=*V5Qz2o9qSols& zeYLbjaMz_1>sY0m1J^>_Yi-R%rnH&;!*orxm&lx{UooV zD4f4hQreOEbGQh}HDINj>4U9&IPz<&$eX7&=58ICrPz2r`**Q`;ra1M8Fvr|!IjCp z@oSP7?ScI}d;Jx5nAJavOH?M(fiu+03kqDgU|+)zObr&|GI^9Kp?#DD->Dm37T z17L}*Llx*2lrodbUHNu1(?7)5WW3i(6pZT=-9*GNhcp^ns3!swHN~-n!7o~mdCkkG zOCa(e_bJeTvkLw7i277O@`yBxDI?k!4UV1Mk^u!lfu<&>>``nmIUoQ2G^GIP z1+S*2i4lJdt{)3@*CLOjJ=u|v7IPszy%uIoR08@*Nc@eZ4B*D+Sk?Ue0S4$0z`*WA zo<>=uIM@Li8dz3>p3>IR4Cs&OdHv)=rr$)7A?1n2n=`UFy%x+`=R(CVb*I#w^77l0 zUjgiFK@TVJ#vd=H31oZPO{pt2&#!f0uHYLHLoa?Cx*?aNV#3Qj#rwQ}=r=&fG*JO$ zELa3y)U?I%7gDfW+uM`Y6KEy8kk)4dLGxImiJ<@*6QYA!4-61|?!5~F1nQ)0^}sY# z8gnp37fj*|0{G6hXUwVq%xO)9Dgim9oU+iQMw-0SZH|y8E4%`b(B% z_2$3%h5%&+&&xD0C-xhpG12*ZgWzL&45Tb2I17P$8A~mH|xc z=cyTx4=-e8yXPD2eJtBPf^^~2;C+fuHdSw|&nS8d3k&I)d`$tZ1B|Lx*@(w$=chx4 z*Rgg+97%=k{KCYhI_8Usi3!GLCxJw`YBd!9xwImwd~|H`v0wSlR}6Go&3kY6Z_+4V z9*JL;E2kgB4vv5B!j3}LxR)(fXKQvE$B$Q(`1OdE~*v&R$?LZIS{-b^yY z2XqjGSg`hVyvamd6u#;J$ZvujQo;U;0bzozZ!1%$s-psNK8%xYZ-H<~Cq!v(; zmGUpYTh#RVOuN3dT^Thu6>*vRb)(hP&B*Y_7f zBQ`NX$_#zjay`R5f?;|!u2`o^)F!(exRi>9_nh1{=iYlfv>mTVtM_IqAMS*gFyqV1 z%R@bS?hT?5wO4WI%|QiY{$*L{pGdWG`H=9-@KS&B^@e6+ExF+x2UfS+HVaNUtO)#y zDgldxVxsArsG&3|+3?%BSBUIvqo=zyzW(9AD@LC)TG`rKTRX9|^6;6CXoLo~{ysV1 z0wD6;z)b)W{PvB)>U{K~DlW1Z7bL1@LjD215Pmcmue1al$Vf^JsB$)&nv7S*U@{=#K z=J)U6a3k|s5tyr<`Y6axPR+44^lu=mr_1}yy?5Z^4fRK122b#D$atjbEP(@0j*VTp zF4(hj1s%IU`Z*q49M)zZ|F%UheQr~-udKYii+?%n=}NuRK~Z;Ao`U@2vAzqx%*v#a zgkVYi@G~vdd84Vx5}Bhip7IrPvHmtAH1s**x2@TA))3in{CcvR5h=sv`Nm1Y_9Grl z2|SCyFpB7u=Tee9cWa3m1EVkF#Lqx9AV2L|k4{c^NwCa3n=(@8poUs5xDjvxd6yM)QVL}ccq@35Q zu1vQlZ;sD9%-Y6j8VD2lUR`KxZEC;(8(A8e0tBNWeW~tz(#1paPb0B2*oFFi6|R3% zR+5GHI%`X-k$5Ne({;zIoO%g9jfHq3WdI2`(yC7z8{ceCEZ&p=L|^NXUh-gcDo9{~ zmI1<#fuWj1dmDX5_eTJJI|~^`@t1LPkt%`$d!EZ-O2@f0zNqq(6W8o}fJ;U_fDgR` z`7qx9&8{&=Xm2?oM~k1h~qaYJkbyg;^4zo$RqwvY}G zHI$!!!LVvB>CHQ8_oQyV(LPR38_q`@{o%h{y15!W^O6als$h8zNwz~!Q{n_tzA{pV9MjNPK3l~HDFc47i%ii^N$02JBH zFP!veO^5|O<7H3mpNFk~Jypg9c^)_+3@31{*A+-q66E{w!5C&>K=vrFATL2(th&$O zmD92W9sWg>f^iF3#Z#dzKf>oS_6@>dT)@5UPo^Tti*=2(C$CZpF%nHYje+-MlEPv0 zbQ3h@0_3dbhRzNMtv9vSCMm^5C!yF_I73pT`aD)AQ{F+!Tb^PY`06 z+Ly=GxaWHnw!jLkW~cLR;H}tY8zAufl+RDv*?yUq4-+GD zv#KMbf?S910Q6SI?;-yffM9lRIenQPr}Hab^JN9V^k9{kp4S3nuX!~+i3lbpDlMDdRAvMi_2RaS_>6A8AGY*Y1Wed?sdkp_V z;~^S8%YJT|b@lEzho>%d{&g}|JD$?3e#8SQS*!U6#En`#@` zk>!vfwQz^^Jx~^jB#`Al$%gE00pYq(UwI||ABexxQjkj>TpI_#z5nuR9f*(h^X_Iy^i0VrjUIy{Cg)*><*om!z3828 ztUao2C@28V2sGvo%FEvW-pVd6qKs}fnCwb=T_yRe3KFPm0KXY0#JXRXPhV){L1XFwa|Q~Y zy^i~G3ln9+@HVFmmNEgMkA(Oq8c@?dZUFi-fL=g-H_Lp&LDszYHI%C<({?meyzZ20d8q7A2mC3nPFNZAG zV@<8ATHPJk;K-%&qKW}vkF7%4oKM$RnvcNUs@sf_;*=E$7kgr-(Yo~dS3E9QjRaKC z%}yE#1RnM}pRO>DZvZGV&zife1^4Y|=SNWU*Paev)YZ)qn@a7w574TgS)N~N?TI$5 zt9tGE`j}k(G;VB9LPFpfY$h!E`rwL4T)pi!SuaxqAuB4auG921;x&b}{ zVdwpop&-0}CFZjm!M4;Rd2!%T8AS0YASm#dhngPnm(Oe7+AOIl3vU4UrATp{$+31W@A78_P zS+<=Wn5fu-Sc(Wg?d(x2?{?isf9sS%JBV$RHp;fqvGb5bpQOCsq zJHDU&-YI3R*Aw4=kgbDwIwYaPWci*@@AXe2YcdH5L5xVI%(O5u=Dd_-wEX7+eO9o^psB)H;~r1(67mHE#Bgz0b1DMM8#n^IO@qSRdBGtAB;TD zBa-H6Vy#nMB2X>%Y`>zH{AK%O#mkFr_tQ?8@u8mPX~g;fL*efx@PHb;)nW22swPSb zN~~e1wn#(e0J&UBn4D63K4$_s@O`oI5TjOkOsJ6IFp1^16V>8|)Z8?G=8W!hGQbAz z{#(o2(?Q1<(eBHTL5~mME8EaWk*|mUi(U=p;&Ib~|7&fbu8P;*S9-uTBmuH`-1OKC z2H5Eu<||2Yj3kl-h4ROX9<+kI?RYb&r`%7P0#s!Th1~xbXGe4cK6rH|lb$l|R#7aj z0wo4OZ`u45OeJ=DF_5&`)uo&w?7+~r%ek9)T77&h3#4Rlns$kJpd#{cI@V@NJw`Kz z4O-(kx#)AI0Yc18HnXIO2u^XJFMh`Xke4yqEv~NVvZPr8A{67SR|OMv955L$$QB+r z(Ud8Th4XMA5CKFv{uIFtAD(eLZEv33DMgPDN~S@6Rq;8hlN4gABWsYLzx#^pYc3+B$Eh<}3`;7y zG3HpYoTW{2Jm}2~Zqaw|=J`?>DA<_{La%=IQgVM>^)3flI`E&0rh0RwDQ4BTETtej zl;#^6VJIX4G|<1*qK~^Oupb8qdsa_w4NGjhGM$@8;bMd!d{B@YDUnR&qQ`i7)AZO( zc6}y5<=-oPRj-*0k6+l+Z76V~)&82`b+Ye4KwP!WC->H|*N4+I$@_>VkRDc5S6E|~ z_F?eD!Yh=9m3jx^(!p7stS{NH#L)<{LXidFwQ@Mn5Q-NZo$To>2h&b`^f>6ip|QzY zTU#d+Yv^i@ZwpbiwpIa5u};O>Ha=sCHOXg$z`8*a%}$I! zx@@Nx2lVF_`G73dB;)$uR>e+l*&{y30GAln3)JQCWZrJwUybm+%2>w5h%H9@Q$E|f z)yG+WkEq3r1BeG=v^74$dXgKx7zDwV9$lHA?s?N~fa*@5((O_WM9UbQBMgcMEF)Fo z*Ho1w;936}Bf$0XD9DgXn6OHa^QM+_>UI+YyRzEvd)3FyX5q$$Fuq{HU1=*a2gS(1 zjCuRS1nbn8dJ>Uu+4?}*T%}%3f}%hg7)}qY+C+@lAoZPEwpGUj`*jlqnG{EnHa18= z*y66;{BDgO#D8&CV&Tkpe`B>OH)6NapzFa+*Bg%_UwkyU<^}l4ZOp<8j(ujwx=$G6 zC(nxBP^f$o3lcuLz2%L=Zga*4pE?8AmxKYIc}T)QP!&;?8yf=EWC3!p5`PrD&6DE!`~!075Ju=RJ{gFcfdGzV>@T{gESd;!6{ z>Z(tQfN<8W#(w?!m6FMKv6II4aEF(K0l|=%)@D3%X{!#h0F0>p(gsqK@-Yn3xqJW= zPws}Z^krOFZ_0b%L+mNG>a10LKRKf;>p!Coel=x?P2ps0PAXv*{QC@d%W-xLR1i0C z6aL!TWo!B6Gd75(mZs~4dtK?{(Yc)=KtaPN!DQG9GN+9I@*;M{C{A`Po@tfL0Y=;*dUx|kE!l#WsP+u$&fNP{UZh-F$_*4VvYD!J7P_OX0eIK z=mn97Ln1*U&0oL0xVxuYS23DB5*9{U_-cB1k>W1cR5tNgpRGD+HJ(eqY*!dp$r~NF z!dckL!Jk#%CWr1_lXh{m^L}G-6Dk24=mHzHldetkeYgbvzo%ic{HoOzw|8p*G3>m`Z;kuxC3m$_KPPqL`WM^_Zs3!3cBhfSG?avW8W1~ekXsLEynizkmX>wjw4O*ohABT~!`i<#;d7^H67+Jv`Qns%;k?R; z0(h4SF+zhwQ$uGgk+U5LC|WjWTv1bw6=sHJG`#6rzV^F6wSyy_nUH!-k zXs}HHoB}nl8=Y#*M)hP*8Mi=|`p%N*`mWH}L1rBKtlVwJ(?}e|z1e-AQxOX~kO8;w zt0G_~=a~3AOIl^`nQtra&{{M6!HXTE%T}W<)3~ZpKeK(Bn(g2UdWNpyU<%yylx%t^ zzms`~@UVvfxJ%(c3lej$Smqv}jh2!GtDQsirq!*n2G!3Tv8G&{gHDI5*+5|n8ZhDS zEyv=|`q-JEwPMfgxX)Bi`%~E>dWu39T4rDu&$Ewu8 zLt546iV4D^6Wh~w8Ui>;@{Jlr=zrScNs(y>ZNumJ}bXs$R19XGO%C=6b{bW~F6cM^x~ zRbQUCoCkuPh=NQe{KGEgf;JCNwJOYfVOY=CC8y~81>%W#_pibtLu6y6Nj}4xXv~cB zq&V`!Y!iU^4_*7^(_Hj9eX!+-qptd0fN7Xxw;O{bFd?VrGio=X`?m+&>_Y&Nacgf2 z7%ukUsN4iyNOP;2&oJ*7`}s5H0Cfwf(CE?i!>b6G9pA=5qim>bIIW;(M{WX3BXIHN zJ*ea8!yti17rsHY6lQ$jv(`=3CsA?w=|0A)ymDrJJuhktS^|AKw@~V#lteYno z^sQa)*H&X-*LZhp9CRoQI+-IJ%t6}r=s^N-wYi)q@%t5xnXn_jD&P{I<~zj{St4sJ zHesMLGR)mK9-%u3ASi8AqI$t|7Ia5EU!VikGpGAbK#$u}&t>#2cE}(Aij?95t}{@K z1*|?K)N@1%oP&-1+gXPa7>H*eBRDr&5grCTHin=jVZ$%wx457%(j@8F2bfN(Z_@s1 z2Jv>Z&Iah9pg9B6BQn@CY|slA_ub*T=*dRQQG@$XdaCM0hQlcm>{xlT$}3KoD%C98`G4kB*opIieFpaNQbOm-*jdYgeuOo7%p(4+!14hy%C;{a)v z$JuqBcE@wxYZtc_Qh?6A;Bg8E#Bla4NXTeiJ$b02%hQUApqdMbiJhJg7$ZQH)y4Yf zx(?FY7hadWC3wF30j#9*EmQ3u`{H^ow65g7W{SL6Ql5$+A7b!sT5iv45Z30lYRUC# zWPc163C`D?qB5sr3yg$;j0n`GRL_C$pwt70r=^;Kn(SZNFMMpwxoj_G@Ii6Tw*eLDmoWCpx3V6dcx+sQ>z(d)ev76!`tY&x!RNjq5SS!2&4Ytp)dXB)%>>B zn7V3s!w4m@=RbFG4jw(bC}~Akeq-Pads~{ajgO6Ys)hUyt+m19nhwe)9R14505em8{F2hkok%KgB% z0KsdwGc}wc>voag=5spWhusXshvRqoSd7fCBBdZi-rXnjWjAQvy`*}I0|9USGkvt6 zvm03RzuJ@huWaJ~S2jLljQIcCv;Vz2{F814jQCHu6*y`D?*GKE8vK*1{Fgfa7b(a; ru`>Yi|ID@if7$;3m%JqK2ig}Rr7F@${=HQM0{+O!C`%VTGxq-<-W_*e literal 0 HcmV?d00001 diff --git a/images/startup.png b/images/startup.png new file mode 100755 index 0000000000000000000000000000000000000000..d9bba031d56202bd1a557b2c4a2a0caea085df55 GIT binary patch literal 13035 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 nEu?=Jv;Fr20J1V4dm#sX%Hj + + + + + + + + + + + + + + + + + - - - - + - - + + - + + + + + + + + +

diff --git a/js/bookmark_bubble.js b/js/bookmark_bubble.js new file mode 100644 index 0000000..90c839e --- /dev/null +++ b/js/bookmark_bubble.js @@ -0,0 +1,559 @@ +/* + Copyright 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @fileoverview Bookmark bubble library. This is meant to be included in the + * main JavaScript binary of a mobile web application. + * + * Supported browsers: iPhone / iPod / iPad Safari 3.0+ + */ + +var google = google || {}; +google.bookmarkbubble = google.bookmarkbubble || {}; + + +/** + * Binds a context object to the function. + * @param {Function} fn The function to bind to. + * @param {Object} context The "this" object to use when the function is run. + * @return {Function} A partially-applied form of fn. + */ +google.bind = function(fn, context) { + return function() { + return fn.apply(context, arguments); + }; +}; + + +/** + * Function used to define an abstract method in a base class. If a subclass + * fails to override the abstract method, then an error will be thrown whenever + * that method is invoked. + */ +google.abstractMethod = function() { + throw Error('Unimplemented abstract method.'); +}; + + + +/** + * The bubble constructor. Instantiating an object does not cause anything to + * be rendered yet, so if necessary you can set instance properties before + * showing the bubble. + * @constructor + */ +google.bookmarkbubble.Bubble = function() { + /** + * Handler for the scroll event. Keep a reference to it here, so it can be + * unregistered when the bubble is destroyed. + * @type {function()} + * @private + */ + this.boundScrollHandler_ = google.bind(this.setPosition, this); + + /** + * The bubble element. + * @type {Element} + * @private + */ + this.element_ = null; + + /** + * Whether the bubble has been destroyed. + * @type {boolean} + * @private + */ + this.hasBeenDestroyed_ = false; +}; + + +/** + * Shows the bubble if allowed. It is not allowed if: + * - The browser is not Mobile Safari, or + * - The user has dismissed it too often already, or + * - The hash parameter is present in the location hash, or + * - The application is in fullscreen mode, which means it was already loaded + * from a homescreen bookmark. + * @return {boolean} True if the bubble is being shown, false if it is not + * allowed to show for one of the aforementioned reasons. + */ +google.bookmarkbubble.Bubble.prototype.showIfAllowed = function() { + if (!this.isAllowedToShow_()) { + return false; + } + + this.show_(); + return true; +}; + + +/** + * Shows the bubble if allowed after loading the icon image. This method creates + * an image element to load the image into the browser's cache before showing + * the bubble to ensure that the image isn't blank. Use this instead of + * showIfAllowed if the image url is http and cacheable. + * This hack is necessary because Mobile Safari does not properly render + * image elements with border-radius CSS. + * @param {function()} opt_callback Closure to be called if and when the bubble + * actually shows. + * @return {boolean} True if the bubble is allowed to show. + */ +google.bookmarkbubble.Bubble.prototype.showIfAllowedWhenLoaded = + function(opt_callback) { + if (!this.isAllowedToShow_()) { + return false; + } + + var self = this; + // Attach to self to avoid garbage collection. + var img = self.loadImg_ = document.createElement('img'); + img.src = self.getIconUrl_(); + img.onload = function() { + if (img.complete) { + delete self.loadImg_; + img.onload = null; // Break the circular reference. + + self.show_(); + opt_callback && opt_callback(); + } + }; + img.onload(); + + return true; +}; + + +/** + * Sets the parameter in the location hash. As it is + * unpredictable what hash scheme is to be used, this method must be + * implemented by the host application. + * + * This gets called automatically when the bubble is shown. The idea is that if + * the user then creates a bookmark, we can later recognize on application + * startup whether it was from a bookmark suggested with this bubble. + */ +google.bookmarkbubble.Bubble.prototype.setHashParameter = google.abstractMethod; + + +/** + * Whether the parameter is present in the location hash. As it is + * unpredictable what hash scheme is to be used, this method must be + * implemented by the host application. + * + * Call this method during application startup if you want to log whether the + * application was loaded from a bookmark with the bookmark bubble promotion + * parameter in it. + * + * @return {boolean} Whether the bookmark bubble parameter is present in the + * location hash. + */ +google.bookmarkbubble.Bubble.prototype.hasHashParameter = google.abstractMethod; + + +/** + * The number of times the user must dismiss the bubble before we stop showing + * it. This is a public property and can be changed by the host application if + * necessary. + * @type {number} + */ +google.bookmarkbubble.Bubble.prototype.NUMBER_OF_TIMES_TO_DISMISS = 2; + + +/** + * Time in milliseconds. If the user does not dismiss the bubble, it will auto + * destruct after this amount of time. + * @type {number} + */ +google.bookmarkbubble.Bubble.prototype.TIME_UNTIL_AUTO_DESTRUCT = 15000; + + +/** + * The prefix for keys in local storage. This is a public property and can be + * changed by the host application if necessary. + * @type {string} + */ +google.bookmarkbubble.Bubble.prototype.LOCAL_STORAGE_PREFIX = 'BOOKMARK_'; + + +/** + * The key name for the dismissed state. + * @type {string} + * @private + */ +google.bookmarkbubble.Bubble.prototype.DISMISSED_ = 'DISMISSED_COUNT'; + + +/** + * The arrow image in base64 data url format. + * @type {string} + * @private + */ +google.bookmarkbubble.Bubble.prototype.IMAGE_ARROW_DATA_URL_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAMAAABSrFY3AAABKVBMVEUAAAD///8AAAAAAAAAAAAAAAAAAADf398AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD09PQAAAAAAAAAAAC9vb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD19fUAAAAAAAAAAAAAAADq6uoAAAAAAAAAAAC8vLzU1NTT09MAAADg4OAAAADs7OwAAAAAAAAAAAD///+cueenwerA0vC1y+3a5fb5+/3t8vr4+v3w9PuwyOy3zO3h6vfh6vjq8Pqkv+mat+fE1fHB0/Cduuifu+iuxuuivemrxOvC1PDz9vzJ2fKpwuqmwOrb5vapw+q/0vDf6ffK2vLN3PPprJISAAAAQHRSTlMAAAEGExES7FM+JhUoQSxIRwMbNfkJUgXXBE4kDQIMHSA0Tw4xIToeTSc4Chz4OyIjPfI3QD/X5OZR6zzwLSUPrm1y3gAAAQZJREFUeF5lzsVyw0AURNE3IMsgmZmZgszQZoeZOf//EYlG5Yrhbs+im4Dj7slM5wBJ4OJ+undAUr68gK/Hyb6Bcp5yBR/w8jreNeAr5Eg2XE7g6e2/0z6cGw1JQhpmHP3u5aiPPnTTkIK48Hj9Op7bD3btAXTfgUdwYjwSDCVXMbizO0O4uDY/x4kYC5SWFnfC6N1a9RCO7i2XEmQJj2mHK1Hgp9Vq3QBRl9shuBLGhcNtHexcdQCnDUoUGetxDD+H2DQNG2xh6uAWgG2/17o1EmLqYH0Xej0UjHAaFxZIV6rJ/WK1kg7QZH8HU02zmdJinKZJaDV3TVMjM5Q9yiqYpUwiMwa/1apDXTNESjsAAAAASUVORK5CYII='; + + +/** + * The close image in base64 data url format. + * @type {string} + * @private + */ +google.bookmarkbubble.Bubble.prototype.IMAGE_CLOSE_DATA_URL_ = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEXM3fm+1Pfb5/rF2fjw9f23z/aavPOhwfTp8PyTt/L3+v7T4vqMs/K7zP////+qRWzhAAAAXElEQVQIW2O4CwUM996BwVskxtOqd++2rwMyPI+ve31GD8h4Madqz2mwms5jZ/aBGS/mHIDoen3m+DowY8/hOVUgxusz+zqPg7SvPA1UxQfSvu/du0YUK2AMmDMA5H1qhVX33T8AAAAASUVORK5CYII='; + + +/** + * The link used to locate the application's home screen icon to display inside + * the bubble. The default link used here is for an iPhone home screen icon + * without gloss. If your application uses a glossy icon, change this to + * 'apple-touch-icon'. + * @type {string} + * @private + */ +google.bookmarkbubble.Bubble.prototype.REL_ICON_ = + 'apple-touch-icon-precomposed'; + + +/** + * Regular expression for detecting an iPhone or iPod or iPad. + * @type {!RegExp} + * @private + */ +google.bookmarkbubble.Bubble.prototype.MOBILE_SAFARI_USERAGENT_REGEX_ = + /iPhone|iPod|iPad/; + + +/** + * Regular expression for detecting an iPad. + * @type {!RegExp} + * @private + */ +google.bookmarkbubble.Bubble.prototype.IPAD_USERAGENT_REGEX_ = /iPad/; + + +/** + * Determines whether the bubble should be shown or not. + * @return {boolean} Whether the bubble should be shown or not. + * @private + */ +google.bookmarkbubble.Bubble.prototype.isAllowedToShow_ = function() { + return this.isMobileSafari_() && + !this.hasBeenDismissedTooManyTimes_() && + !this.isFullscreen_() && + !this.hasHashParameter(); +}; + + +/** + * Builds and shows the bubble. + * @private + */ +google.bookmarkbubble.Bubble.prototype.show_ = function() { + this.element_ = this.build_(); + + document.body.appendChild(this.element_); + this.element_.style.WebkitTransform = + 'translateY(' + this.getHiddenYPosition_() + 'px)'; + + this.setHashParameter(); + + window.setTimeout(this.boundScrollHandler_, 1); + window.addEventListener('scroll', this.boundScrollHandler_, false); + + // If the user does not dismiss the bubble, slide out and destroy it after + // some time. + window.setTimeout(google.bind(this.autoDestruct_, this), + this.TIME_UNTIL_AUTO_DESTRUCT); +}; + + +/** + * Destroys the bubble by removing its DOM nodes from the document. + */ +google.bookmarkbubble.Bubble.prototype.destroy = function() { + if (this.hasBeenDestroyed_) { + return; + } + window.removeEventListener('scroll', this.boundScrollHandler_, false); + if (this.element_ && this.element_.parentNode == document.body) { + document.body.removeChild(this.element_); + this.element_ = null; + } + this.hasBeenDestroyed_ = true; +}; + + +/** + * Remember that the user has dismissed the bubble once more. + * @private + */ +google.bookmarkbubble.Bubble.prototype.rememberDismissal_ = function() { + if (window.localStorage) { + try { + var key = this.LOCAL_STORAGE_PREFIX + this.DISMISSED_; + var value = Number(window.localStorage[key]) || 0; + window.localStorage[key] = String(value + 1); + } catch (ex) { + // Looks like we've hit the storage size limit. Currently we have no + // fallback for this scenario, but we could use cookie storage instead. + // This would increase the code bloat though. + } + } +}; + + +/** + * Whether the user has dismissed the bubble often enough that we will not + * show it again. + * @return {boolean} Whether the user has dismissed the bubble often enough + * that we will not show it again. + * @private + */ +google.bookmarkbubble.Bubble.prototype.hasBeenDismissedTooManyTimes_ = + function() { + if (!window.localStorage) { + // If we can not use localStorage to remember how many times the user has + // dismissed the bubble, assume he has dismissed it. Otherwise we might end + // up showing it every time the host application loads, into eternity. + return true; + } + try { + var key = this.LOCAL_STORAGE_PREFIX + this.DISMISSED_; + + // If the key has never been set, localStorage yields undefined, which + // Number() turns into NaN. In that case we'll fall back to zero for + // clarity's sake. + var value = Number(window.localStorage[key]) || 0; + + return value >= this.NUMBER_OF_TIMES_TO_DISMISS; + } catch (ex) { + // If we got here, something is wrong with the localStorage. Make the same + // assumption as when it does not exist at all. Exceptions should only + // occur when setting a value (due to storage limitations) but let's be + // extra careful. + return true; + } +}; + + +/** + * Whether the application is running in fullscreen mode. + * @return {boolean} Whether the application is running in fullscreen mode. + * @private + */ +google.bookmarkbubble.Bubble.prototype.isFullscreen_ = function() { + return !!window.navigator.standalone; +}; + + +/** + * Whether the application is running inside Mobile Safari. + * @return {boolean} True if the current user agent looks like Mobile Safari. + * @private + */ +google.bookmarkbubble.Bubble.prototype.isMobileSafari_ = function() { + return this.MOBILE_SAFARI_USERAGENT_REGEX_.test(window.navigator.userAgent); +}; + + +/** + * Whether the application is running on an iPad. + * @return {boolean} True if the current user agent looks like an iPad. + * @private + */ +google.bookmarkbubble.Bubble.prototype.isIpad_ = function() { + return this.IPAD_USERAGENT_REGEX_.test(window.navigator.userAgent); +}; + + + +/** + * Positions the bubble at the bottom of the viewport using an animated + * transition. + */ +google.bookmarkbubble.Bubble.prototype.setPosition = function() { + this.element_.style.WebkitTransition = '-webkit-transform 0.7s ease-out'; + this.element_.style.WebkitTransform = + 'translateY(' + this.getVisibleYPosition_() + 'px)'; +}; + + +/** + * Destroys the bubble by removing its DOM nodes from the document, and + * remembers that it was dismissed. + * @private + */ +google.bookmarkbubble.Bubble.prototype.closeClickHandler_ = function() { + this.destroy(); + this.rememberDismissal_(); +}; + + +/** + * Gets called after a while if the user ignores the bubble. + * @private + */ +google.bookmarkbubble.Bubble.prototype.autoDestruct_ = function() { + if (this.hasBeenDestroyed_) { + return; + } + this.element_.style.WebkitTransition = '-webkit-transform 0.7s ease-in'; + this.element_.style.WebkitTransform = + 'translateY(' + this.getHiddenYPosition_() + 'px)'; + window.setTimeout(google.bind(this.destroy, this), 700); +}; + + +/** + * Gets the y offset used to show the bubble (i.e., position it on-screen). + * @return {number} The y offset. + * @private + */ +google.bookmarkbubble.Bubble.prototype.getVisibleYPosition_ = function() { + return this.isIpad_() ? window.pageYOffset + 17 : + window.pageYOffset - this.element_.offsetHeight + window.innerHeight - 17; +}; + + +/** + * Gets the y offset used to hide the bubble (i.e., position it off-screen). + * @return {number} The y offset. + * @private + */ +google.bookmarkbubble.Bubble.prototype.getHiddenYPosition_ = function() { + return this.isIpad_() ? window.pageYOffset - this.element_.offsetHeight : + window.pageYOffset + window.innerHeight; +}; + + +/** + * The url of the app's bookmark icon. + * @type {string|undefined} + * @private + */ +google.bookmarkbubble.Bubble.prototype.iconUrl_; + + +/** + * Scrapes the document for a link element that specifies an Apple favicon and + * returns the icon url. Returns an empty data url if nothing can be found. + * @return {string} A url string. + * @private + */ +google.bookmarkbubble.Bubble.prototype.getIconUrl_ = function() { + if (!this.iconUrl_) { + var link = this.getLink(this.REL_ICON_); + if (!link || !(this.iconUrl_ = link.href)) { + this.iconUrl_ = 'data:image/png;base64,'; + } + } + return this.iconUrl_; +}; + + +/** + * Gets the requested link tag if it exists. + * @param {string} rel The rel attribute of the link tag to get. + * @return {Element} The requested link tag or null. + */ +google.bookmarkbubble.Bubble.prototype.getLink = function(rel) { + rel = rel.toLowerCase(); + var links = document.getElementsByTagName('link'); + for (var i = 0; i < links.length; ++i) { + var currLink = /** @type {Element} */ (links[i]); + if (currLink.getAttribute('rel').toLowerCase() == rel) { + return currLink; + } + } + return null; +}; + + +/** + * Creates the bubble and appends it to the document. + * @return {Element} The bubble element. + * @private + */ +google.bookmarkbubble.Bubble.prototype.build_ = function() { + var bubble = document.createElement('div'); + var isIpad = this.isIpad_(); + + bubble.style.position = 'absolute'; + bubble.style.zIndex = 1000; + bubble.style.width = '100%'; + bubble.style.left = '0'; + bubble.style.top = '0'; + + var bubbleInner = document.createElement('div'); + bubbleInner.style.position = 'relative'; + bubbleInner.style.width = '214px'; + bubbleInner.style.margin = isIpad ? '0 0 0 82px' : '0 auto'; + bubbleInner.style.border = '2px solid #fff'; + bubbleInner.style.padding = '20px 20px 20px 10px'; + bubbleInner.style.WebkitBorderRadius = '8px'; + bubbleInner.style.WebkitBoxShadow = '0 0 8px rgba(0, 0, 0, 0.7)'; + bubbleInner.style.WebkitBackgroundSize = '100% 8px'; + bubbleInner.style.backgroundColor = '#b0c8ec'; + bubbleInner.style.background = '#cddcf3 -webkit-gradient(linear, ' + + 'left bottom, left top, ' + isIpad ? + 'from(#cddcf3), to(#b3caed)) no-repeat top' : + 'from(#b3caed), to(#cddcf3)) no-repeat bottom'; + bubbleInner.style.font = '13px/17px sans-serif'; + bubble.appendChild(bubbleInner); + + // The "Add to Home Screen" text is intended to be the exact same size text + // that is displayed in the menu of Mobile Safari on iPhone. + bubbleInner.innerHTML = 'Install this web app on your phone: tap ' + + '+ and then \'Add to Home Screen\''; + + var icon = document.createElement('div'); + icon.style['float'] = 'left'; + icon.style.width = '55px'; + icon.style.height = '55px'; + icon.style.margin = '-2px 7px 3px 5px'; + icon.style.background = + '#fff url(' + this.getIconUrl_() + ') no-repeat -1px -1px'; + icon.style.WebkitBackgroundSize = '57px'; + icon.style.WebkitBorderRadius = '10px'; + icon.style.WebkitBoxShadow = '0 2px 5px rgba(0, 0, 0, 0.4)'; + bubbleInner.insertBefore(icon, bubbleInner.firstChild); + + var arrow = document.createElement('div'); + arrow.style.backgroundImage = 'url(' + this.IMAGE_ARROW_DATA_URL_ + ')'; + arrow.style.width = '25px'; + arrow.style.height = '19px'; + arrow.style.position = 'absolute'; + arrow.style.left = '111px'; + if (isIpad) { + arrow.style.WebkitTransform = 'rotate(180deg)'; + arrow.style.top = '-19px'; + } else { + arrow.style.bottom = '-19px'; + } + bubbleInner.appendChild(arrow); + + var close = document.createElement('a'); + close.onclick = google.bind(this.closeClickHandler_, this); + close.style.position = 'absolute'; + close.style.display = 'block'; + close.style.top = '-3px'; + close.style.right = '-3px'; + close.style.width = '16px'; + close.style.height = '16px'; + close.style.border = '10px solid transparent'; + close.style.background = + 'url(' + this.IMAGE_CLOSE_DATA_URL_ + ') no-repeat'; + bubbleInner.appendChild(close); + + return bubble; +}; diff --git a/js/example.js b/js/example.js new file mode 100644 index 0000000..cf0a89d --- /dev/null +++ b/js/example.js @@ -0,0 +1,56 @@ +/* + Copyright 2010 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** @fileoverview Example of how to use the bookmark bubble. */ + +window.addEventListener('load', function() { + window.setTimeout(function() { + var bubble = new google.bookmarkbubble.Bubble(); + + + bubble.hasHashParameter = function() { + return $.cookie('bubble'); + }; + + bubble.setHashParameter = function() { + if (!this.hasHashParameter()) { + $.cookie('bubble', true, { expires: 365 }); + } + }; + + bubble.getViewportHeight = function() { + window.console.log('Example of how to override getViewportHeight.'); + return window.innerHeight; + }; + + bubble.getViewportScrollY = function() { + window.console.log('Example of how to override getViewportScrollY.'); + return window.pageYOffset; + }; + + bubble.registerScrollHandler = function(handler) { + window.console.log('Example of how to override registerScrollHandler.'); + window.addEventListener('scroll', handler, false); + }; + + bubble.deregisterScrollHandler = function(handler) { + window.console.log('Example of how to override deregisterScrollHandler.'); + window.removeEventListener('scroll', handler, false); + }; + + bubble.showIfAllowed(); + }, 1000); +}, false); diff --git a/js/jqm.autoComplete.min-1.3.js b/js/jqm.autoComplete.min-1.3.js new file mode 100644 index 0000000..e9e2516 --- /dev/null +++ b/js/jqm.autoComplete.min-1.3.js @@ -0,0 +1,10 @@ +/* + Name: autoComplete + Author: Raymond Camden & Andy Matthews + Contributors: Jim Pease (@jmpease) + Website: http://raymondcamden.com/ + http://andyMatthews.net + Packed With: http://jsutility.pjoneil.net/ + Version: 1.3 + */ +(function($){"use strict";var defaults={target:$(),source:null,callback:null,link:null,minLength:0,transition:'fade'},buildItems=function($this,data,settings){var str=[];$.each(data,function(index,value){if($.isPlainObject(value)){str.push('
  • '+value.label+'
  • ')}else{str.push('
  • '+value+'
  • ')}});$(settings.target).html(str.join('')).listview("refresh");if(settings.callback!=null&&$.isFunction(settings.callback)){attachCallback(settings)}if(str.length>0){$this.trigger("targetUpdated.autocomplete")}else{$this.trigger("targetCleared.autocomplete")}},attachCallback=function(settings){$('li a',$(settings.target)).bind('click.autocomplete',function(e){e.stopPropagation();e.preventDefault();settings.callback(e)})},clearTarget=function($this,$target){$target.html('').listview('refresh');$this.trigger("targetCleared.autocomplete")},handleInput=function(e){var $this=$(this),text,data,settings=$this.jqmData("autocomplete");if(settings){text=$this.val();if(text.length 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) { + options = $.extend({}, options); + + if (value === null || value === undefined) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + value = String(value); + + return (document.cookie = [ + encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // key and possibly options given, get cookie... + options = value || {}; + var decode = options.raw ? function(s) { return s; } : decodeURIComponent; + + var pairs = document.cookie.split('; '); + for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { + if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined + } + return null; + }; +})(jQuery); -- 2.20.1