From 61c83b5a757db74236e5ad16eab7cdc117ee5e1f Mon Sep 17 00:00:00 2001 From: bachy Date: Wed, 21 Nov 2012 09:56:38 +0100 Subject: [PATCH] removed history.js Signed-off-by: bachy --- js/libraries/balupton-history.js-e84ad00.zip | Bin 307716 -> 0 bytes js/libraries/balupton-history/.gitignore | 1 - js/libraries/balupton-history/History.md | 76 - js/libraries/balupton-history/README.md | 245 - js/libraries/balupton-history/buildr.coffee | 281 - .../balupton-history/demo/bcherry-orig.html | 58 - .../balupton-history/demo/bcherry.html | 62 - .../balupton-history/demo/chrome.html | 37 - js/libraries/balupton-history/demo/index.html | 86 - .../balupton-history/demo/native-auto.html | 43 - .../balupton-history/demo/native.html | 62 - .../balupton-history/demo/navigator.html | 23 - .../balupton-history/demo/safari.html | 61 - js/libraries/balupton-history/license.txt | 10 - js/libraries/balupton-history/package.json | 57 - .../bundled/html4+html5/jquery.history.js | 1 - .../bundled/html4+html5/mootools.history.js | 1 - .../bundled/html4+html5/native.history.js | 1 - .../bundled/html4+html5/right.history.js | 1 - .../bundled/html4+html5/zepto.history.js | 1 - .../scripts/bundled/html5/jquery.history.js | 1 - .../scripts/bundled/html5/mootools.history.js | 1 - .../scripts/bundled/html5/native.history.js | 1 - .../scripts/bundled/html5/right.history.js | 1 - .../scripts/bundled/html5/zepto.history.js | 1 - .../compressed/history.adapter.jquery.js | 1 - .../compressed/history.adapter.mootools.js | 1 - .../compressed/history.adapter.native.js | 1 - .../compressed/history.adapter.right.js | 1 - .../compressed/history.adapter.zepto.js | 1 - .../scripts/compressed/history.html4.js | 1 - .../scripts/compressed/history.js | 1 - .../scripts/compressed/json2.js | 1 - .../uncompressed/history.adapter.jquery.js | 77 - .../uncompressed/history.adapter.mootools.js | 84 - .../uncompressed/history.adapter.native.js | 121 - .../uncompressed/history.adapter.right.js | 78 - .../uncompressed/history.adapter.zepto.js | 74 - .../scripts/uncompressed/history.html4.js | 621 -- .../scripts/uncompressed/history.js | 1943 ---- .../scripts/uncompressed/json2.js | 480 - .../balupton-history/tests.src/_header.php | 22 - .../balupton-history/tests.src/all.php | 45 - .../balupton-history/tests.src/each.php | 51 - .../balupton-history/tests.src/index.php | 23 - js/libraries/balupton-history/tests/.htaccess | 13 - .../tests/html4+html5.jquery.html | 43 - .../tests/html4+html5.mootools.html | 43 - .../tests/html4+html5.native.html | 43 - .../tests/html4+html5.right.html | 43 - .../tests/html4+html5.zepto.html | 43 - .../balupton-history/tests/html5.jquery.html | 43 - .../tests/html5.mootools.html | 43 - .../balupton-history/tests/html5.native.html | 43 - .../balupton-history/tests/html5.right.html | 43 - .../balupton-history/tests/html5.zepto.html | 43 - js/libraries/balupton-history/tests/image.php | 3 - .../balupton-history/tests/index.html | 25 - js/libraries/balupton-history/tests/tests.js | 254 - .../balupton-history/vendor/jquery.js | 9046 ----------------- .../balupton-history/vendor/mootools.js | 5815 ----------- .../balupton-history/vendor/qunit/.gitignore | 6 - .../balupton-history/vendor/qunit/README.md | 27 - .../vendor/qunit/package.json | 21 - .../vendor/qunit/qunit/qunit.css | 225 - .../vendor/qunit/qunit/qunit.js | 1442 --- .../vendor/qunit/test/headless.html | 24 - .../vendor/qunit/test/index.html | 19 - .../vendor/qunit/test/logs.html | 17 - .../vendor/qunit/test/logs.js | 150 - .../vendor/qunit/test/same.js | 1421 --- .../vendor/qunit/test/test.js | 324 - js/libraries/balupton-history/vendor/right.js | 6014 ----------- js/libraries/balupton-history/vendor/zepto.js | 1193 --- js/libraries/jquery.history.js | 1 - 75 files changed, 31209 deletions(-) delete mode 100644 js/libraries/balupton-history.js-e84ad00.zip delete mode 100755 js/libraries/balupton-history/.gitignore delete mode 100755 js/libraries/balupton-history/History.md delete mode 100755 js/libraries/balupton-history/README.md delete mode 100755 js/libraries/balupton-history/buildr.coffee delete mode 100755 js/libraries/balupton-history/demo/bcherry-orig.html delete mode 100755 js/libraries/balupton-history/demo/bcherry.html delete mode 100755 js/libraries/balupton-history/demo/chrome.html delete mode 100755 js/libraries/balupton-history/demo/index.html delete mode 100755 js/libraries/balupton-history/demo/native-auto.html delete mode 100755 js/libraries/balupton-history/demo/native.html delete mode 100755 js/libraries/balupton-history/demo/navigator.html delete mode 100755 js/libraries/balupton-history/demo/safari.html delete mode 100755 js/libraries/balupton-history/license.txt delete mode 100755 js/libraries/balupton-history/package.json delete mode 100755 js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html5/native.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html5/right.history.js delete mode 100755 js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.adapter.native.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.adapter.right.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.adapter.zepto.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.html4.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/history.js delete mode 100755 js/libraries/balupton-history/scripts/compressed/json2.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.adapter.jquery.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.adapter.right.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.html4.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/history.js delete mode 100755 js/libraries/balupton-history/scripts/uncompressed/json2.js delete mode 100755 js/libraries/balupton-history/tests.src/_header.php delete mode 100755 js/libraries/balupton-history/tests.src/all.php delete mode 100755 js/libraries/balupton-history/tests.src/each.php delete mode 100755 js/libraries/balupton-history/tests.src/index.php delete mode 100755 js/libraries/balupton-history/tests/.htaccess delete mode 100755 js/libraries/balupton-history/tests/html4+html5.jquery.html delete mode 100755 js/libraries/balupton-history/tests/html4+html5.mootools.html delete mode 100755 js/libraries/balupton-history/tests/html4+html5.native.html delete mode 100755 js/libraries/balupton-history/tests/html4+html5.right.html delete mode 100755 js/libraries/balupton-history/tests/html4+html5.zepto.html delete mode 100755 js/libraries/balupton-history/tests/html5.jquery.html delete mode 100755 js/libraries/balupton-history/tests/html5.mootools.html delete mode 100755 js/libraries/balupton-history/tests/html5.native.html delete mode 100755 js/libraries/balupton-history/tests/html5.right.html delete mode 100755 js/libraries/balupton-history/tests/html5.zepto.html delete mode 100755 js/libraries/balupton-history/tests/image.php delete mode 100755 js/libraries/balupton-history/tests/index.html delete mode 100755 js/libraries/balupton-history/tests/tests.js delete mode 100755 js/libraries/balupton-history/vendor/jquery.js delete mode 100755 js/libraries/balupton-history/vendor/mootools.js delete mode 100755 js/libraries/balupton-history/vendor/qunit/.gitignore delete mode 100755 js/libraries/balupton-history/vendor/qunit/README.md delete mode 100755 js/libraries/balupton-history/vendor/qunit/package.json delete mode 100755 js/libraries/balupton-history/vendor/qunit/qunit/qunit.css delete mode 100755 js/libraries/balupton-history/vendor/qunit/qunit/qunit.js delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/headless.html delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/index.html delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/logs.html delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/logs.js delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/same.js delete mode 100755 js/libraries/balupton-history/vendor/qunit/test/test.js delete mode 100755 js/libraries/balupton-history/vendor/right.js delete mode 100755 js/libraries/balupton-history/vendor/zepto.js delete mode 100755 js/libraries/jquery.history.js diff --git a/js/libraries/balupton-history.js-e84ad00.zip b/js/libraries/balupton-history.js-e84ad00.zip deleted file mode 100644 index a2df40c43c95bd9179cd0082d7f41750eeb76dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 307716 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
  • mTREVnVkZlNJ+@$~;WJ|E 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

    m@OU_%^!P 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%0D=G=4Evl8ZZ82n5;+g^R0?rf)4XEXchX1n$r z*|-lZU%=FKD_2r1XoxURJqSV5Uxv*u(lOhg;&s@-1_7rTbo1pqhOtI8JdZN$<)hXa zRTBX;N?-itMqLnA*Q2Hbqq$RdM0WY{LtfHBe|+mt!!QpVTv>+<)OIL%ut8UtLH&3K zt%;K7zU*hys3sD2_*eKl%0nO}XeFT3Z-T+~tRg${dje~gvOMp~K)AL-1@8qVg+f|=p^w}BoN2Ck zTV4RnR$La+shODEZCznB&RG>+_Y8Te zb(4EBDZ_RYOY_s9z0QK%L=O;@J`T|B1w|XvCz>uvL3)>Xst^|5p%8te!BynIMHeEd zdyBe9CPX=pVqfBUxn9VVih1RM(g6|MdE|b&uchXPLSc2dG8hw|!~^B{n)s!D9cBzp zO>DrPYH9w81XEOqurqOskx@Jc-zOh>rm~RD#DITw5VMcAh6DZrQmH?MPTgwo{hpz$ z5BR91PL)(EBM|@Z!@hB5Z$1k;KxpElkm$EGRUr}9=MI!ZJr=_Ie4@+A#g+^mt(a*iOtf6`4*@#;?!a zvEimVjXL)g7BSUOty8h-L}h1-j-=w}mQhT8noa#gm|43D)h^eMaa8N8wpt zy)d5GT&!k?qn~r08OBGFGAGsGZv@yTC37UT5niW0 z5LC@M^7b=%=`40gH2FAvLB%Hxw@@ynkaJeZqWA5fPY^7B4NT*dElt?OvFI!Q1cq&9t&|&1tv2+-qDg8;EH5JzH4MWBk-rPb2l>qy{~qj{ zzR>*x{x946C%AzOgWTFY7PUTkcR6f${MZ(TMCm1WJ4_Kumxe2?_yEGI4xU;EZI#CqqKiHgIQuZ#H%ke+xu05A({Uw!|MpO6rd<_={|uH9SI29epvkp?~#xF7hwMiaC5BHR)mr? zGxE~V@^7`s6C#Kd6AH+rCuI8e`m(GVgOatUwF{^qTJF~A(8r>V!%c?EEkk9s#6Q1& z@`vLCR&|>B%cJiHv^Z)Rx|}F&zzDQhOnqXF`4^pjl&bn$Gnlb82!!<|mxfmp@3a?T zri@u^S@<$__lCE%FNZEW!)43ubgSsc?s}m=YSv#8*v(PiFDu_zC<1-k*n{J+RodE= zc9jjgI1ItM!J$d|RUqcB!$>~(K3UW>J{x_bL7_{HfgcYUG)KhG^MyqhGB>te2kq^j z_W2M0V^d;4B24L2ZzSFC_v8$S;DjlL9JgJxq!U^NaPe-jkCS3do<_E?7@y+@J3Z%& zMRme92dyR^w;seRYT$90_5pU*9_g~$M}>ekVvOMybnsG|#}Ul0(v4-^U2TJEohR7q zb~C2gv+YlZj(N~#dbXjZ1acLoIEARZNhb{>FU#A*C~8q0^|oo{FOH$|x#5*=Wk4*%P+JhQEYk&a zUrC@qjzm;L*%MjD=bmc67-znfxYgy;)@)M558b;r2BZZkLO|mC?xB0=jrE6$DEn-Y zAD-6k2O&NkLC{bDa|=$F#4|;7e^%FTd*0s(SS|x|`7*X&!t71FKg`sj+$sgWvVCCt zvYhb9Gg%qIlSE?$S@nh*;8Tku^k-u2Ok=$p2Lj?c&i6V!Zbn7>`~ zu5J56H@K9k;RmU^8`4PM`sz4HTv)~=QVup>w!(18W?gpg23mtF zD5(wzGGOWl;5W4HKzYLwf(@1KiXYDTH>)n)I(5`(EgGmPwcR1CO@B19uLlNuKm>OK zPgJi>;v0@x>9{x@di93!%N5tYjl}er1rhfAm{u1W{)i1AzUVD zGuvqys4F18M|cMUnb;wGHyr~tSlQlvxD}>&5XI{Zx$7C9fbjI z@{W~Tk%>RY53aVNM_Ssw6G*#WBYV~npfnkPqarxP@X%S!#N653%a(9Ds1jfrh*B1Z z6*5S0ZdlMWiJvV`8)sE{Rf9_G^B-@r3*P1ILvfM8>+IU}_yoSvW%Lb=F?nh3{tOul z_yei+mEqsYE5F){WB6sNWldw)73AntWi%=Gx-@(q|5h4N_XYO+g^^6%KQ|JLjC~x0 zW!!U;{FI;lsc57e7i;Zb(llnef#G7@2HFK z%d=vhzs}CHsyImYag6bO`Z~T(-}fo5BzA(0{!}jivCb=SU22bO3t@mAGU*5R)}?ji zwNgDJge23b@_(!gjt5i%4^0n=0JiU*DVW}wl~d%P#xT&$>l_TO>5;!G_B{(P;Wv?r6tTZn511W@#DwjQ8P#%70cDS+5ehi zVKO?64YbVc4t?UXCtU%ZvAQM$d_BPXUu_%|m0E;57`Fdfka(E_Pw%rdO^gUxB;Sf&^cWB)g z{}qGMJA2+1+P;E+TU*r0fwLrw2Yl~+@E}D9xP?Kad;)T(uWIxe#I&7g+X#LMnV5yS zBIToJ)|X$eO8a~`HFPhBO)47RpEJs5yjst*hHdmIr_J&gu0K zG(|Rf@w8D7W^`WwvShNaj!B95#Q2Z$0#w0>G*FHYSxrL#{Zn~=TpmKm^px=6;3X=Is(!(klYP}%jKjk1w!Fc zcr9nof;pR+{BuB%9d{ywXlF`?-+} z5vdmj^kwo6{vSG7&DS;bbcLs9Uc5)M9zcr)I2L0!bpz=ta5wpJz6$K{ga+9BlSECM z?7|t`#WB|5>#u|F4iS8F;^sG%{d1DH!CA4n=35$Y^Fj-={pZp1&}}p;(W{ z)hT&lEuIt*sEGsPxj1%0FIuldzsdEGtn>Li!67ahFt1>OiHEF>ggY9jS}g^4h-ak? zAI1iaeqd=-w%C%;$E{B%x(#fBPU3#(PS=O7vo(VAFe{g7!{@6cP6t|vU8tD~oPtqM z@3LsTJD)EoI5p;y!Z0S0W3wl3bO1p0^spD4oii{-C30ksS+;aiOmi7KS8W4DT)Lbj z5}mQ@3HR${W>Rv=D-V#ilqQ%8j)~|>W?E366+WNBPPHkFk*C2|oTa|;+4}4Zj5Cjp zv=Yt}+x@4l(;-9sFwhd7s}rHMc=fhrhb6 z8gupKjq3_-NaznxmUtD4V= z7El1jbv2dSyQNj?!K1Tv({PmduMB1Ttp%wn_?;>E$`m}*JXsW%sHvL@y3KosL><0V)?#$Y9y?A9n9jYSPq6`E*p3(DQ&z= zaXK%|fBu^6N=M`CL%;6dg1UcGb#Gd#q93c`1HAYd0e||QNISX)*z01wM8x=C_x=}D zXATUm1-cx;@b<+syadR7#gwlNy(1YFY4y9cxd&HZiEd?AJ%mV>5sr&RTTAUlGE_3K zPyBJqLVI++LYPeGr>-k2X(~>~z8wVo0_!7%-3cyVOVXv!DBokRey-JW7+^J~&v3U| z1K%X72H(oPzo*|vdwRw?j7?p!=IuySv(e6e!b+W86}3Na#(zA$tul4G;~@CZp0!+w z;VYd*_$OlSFRGiwVbbkY7=T3rKc&J@pPUYZ@o6L)CT(5Au&r{GA<@G3sxJcp1neC2}8~Bf%MjcOXfK<>d z&nY4}3#_01}nSU~V+GsmBbnE~YEV`7nk*EkNNz3yvC)1Ly}Y`b1KnzLK4S1ZWQ32(nSX|qI3v}e3C;VbLoAbd1y%7Cxo zhh+Cb%biwI6}8RG>z8|kprO(}rnx-7jw>&jO8S+)}CwIeLEtO9)NIeaR`(tb>W(?N2NK3FzpkO%rILwb(2{0#pPphwdCSRgU* z(=;hD7sqhzWwtzhVos%FwJzasKUv2n{WfFv3cS=V8G>kT3hz~hm{Y70Jp%_vP|Ua= zaBUj&hf^XK>zFQ@CrMUyono2rQ7REg54%kpUb8nL3^TUf?I64YJFpds;Sr;F@x~ zc)BZPcc?C3crMOsyqZv}naySen+*CUh(a5YcVaJn-@6(0+K~O@Hhstg4BqbV>b;8+ zEbCTPsqE+4ZZ>KJKI>$sW>}a1Ztgb6AAAl^es{BX;ak=F{040eYhf%+i$o+PYwIS8v0Pkj(p_axK<``HtY4_q&J!L$d(J0|?R;{|0B1!?d5 znx`K0O5jOWq;PzU21#1Tj892BAK{c15F_HL*DhO)f&pB@t}QJB2QLvGM~VIi&cqrO zd+dJ?mKqU8!^ajlyN=+S-V8b$aN;~7{Dw`sJ{bp$ZU97x%-8CiWLJGdt4h z?6>kOeZGe0_u9vs+oQ>b%n7Z{kFKyMD>I?9$H_$bWw_wR<1yZC=D(lZ=5W*Qi9%DS z&7#}UDy(9>VQYTynn8Rq5-ea8Io=HG2Q`7%YWflq!!CpRkK)!qYa;uYBDgDfCKCZm zpzG6&61Ng4S(eQMm$~@DF2~o7z4Krht9!#$KZSghVRA1na?B05ZZKEmVD4 z*L&4^9`S*eM1Q(M>j74A`QF~2`{{m6CzDDA|FYDjjRK;SG`wR(5!|lm<4P0NNxRKW zM9+E@>3s~dwsWG(KksmTw@XtyPg%G65kCG`M1%MI&-;iK%vKy&hs^ zM_pEorj&w}QA83r$^!{ehsFl`piO>pocxc`|2z86WB^(Jet&1^EIL``dbZ}cH7K{A zmDfn~t87+4L`X0-IZ2jJjJ_~8mD)Wd>pA7C^x$r5{F^Tpf#A2 zCKk+)iFjyhr~6;0F}}A4aatB%7%EA?ng-ILK2}0UiPeD0t$59K=<2VUGeU`YJJbMzKaB`yT{CEzhk7 zMAjk82xfKhA)nt&IMILvD{=r!M|SZ#Ly_5~nW?gQ5CoSe^0nRDJS#`lR$giJ22#Fc z+*ZEaZKwm8TwS1wa|;M?H0S)oYi^<@3F@c{6L9O$+>q9;U0DsTEBvA@P#wkhK+pS^ zZMNyCDA#rGXfU14quj9vMKlW&1R0-X9>M1ftQn)W4{0~DR&4PtFbB{F&F4*4U~%gS z#~a#7$C1pNv@#D^lpk`Zjsh-m&G&_&(M+;{E=2T(a)WvgwbWyWd4LlD#6-Z7Py0+7 zs6{YLte03s$j+FCdJ6Qxo@;03v`P7Vse-~3Ntj4hw$z2(~ z=%cyfN2ikJ#e8b(LP&~$Wl(Mc08LC;V)eMT7Cv6@pOsBhF80rI!-nVk7<_skmYrv_ zEf9%%(npIXIqraG=u5@4S*r=TMp z3_M6$=m8tz6&Q?2{d5G*^5P(J{6{iL+X5(@{-y;%fjI03o3Y9+jPnoK{5AbO7=|I= zI;g`71fs8}H-LpV0F`=V2`ORJhu9mDcb0N+fgu*SWuOx~S~jpzU`G=i9Pdet_TMv= zu_APMbnaQgIi_ZOQQLakylg&kF@p>RfT-@^@&Y^!_|h&hnck8gqav?RA+e#)?75Eu00uZcMGaFz`&M99A_Lb*G zA&Nrd7#O6Bf!qlrxH@FXXn|$JCo!ELZb4FMmTi*iDc-gsaE=zGX|gLn?bC|*iSsXF zTeR-OHlP~XpW8Om+l7fO1{O(uI;yg!2wn4!eDI7YXxw_#-g?AOZ4CIStlrnoSl0P( zx@C)MRu~DDCjlFuftl7-c2nPBoq}8nXeso;&>p@wQL9iimM^?KSRO@-GrMULI)H+4FOf}hB|B4we1iS@iz_>FQZeelHl zA|m#Rl>wa>WHWH$Ewd{v&9-ab!m7#-J1x5is=j5Z7aLhwZ-nQ3v1)EM*jfR-H;4Uf zo-N-;?W&$45vVb14~{ffva`l|p^t1dM`4c0(Yol{6!e*&qqnu)8S|@q-r8AAECB6u zuFHJbVSk00NoM(VxC9CVg8_jkEegWjy^{yV4)UTqE!S+->AgSPi7fbqp(q#l{AY$& z%)j~7p?z7hW3oNamepc4CP>ewjyl!~1zl}gF!b|)St~~JTB)$0BR}9Qm$sevDEq8g zxUv?Y)XBk+ySu)rjGnmd-Kp$iX9hb`2IBnk^vbC$B@u2NF`i3nF$cEKMv;eEB=*-j zN-aJlhX+yngQ1V%X>Y9Rx$EQp!{9yrn~xb}d; z6Oo8hrZ^3_R^G$BPKw>#Q*ph+CW=en*=a?Equ>>C^{clk`@Sf!L;DCip%4_-f4*~i zIWR|}97tCFn>LcmEM#G{(Uj8Fa11t5pJ+Y}5zs0_tRp!Yk?EVT%@6ywu^l~;wFR5Y z$zj)e6uG9T4$b%*)ag04rqw}*)o}l;wP1zn!p*bypWs5vx{)Ff64xN44~jHJR?YlL zeAV16zE;VrzQtNeL%Q{*EArg88wwGa>HM4#JkBgS0>zNt4^?HXN4GX+m<~u=o(amo z`R3&_@R&GBAH8|<&3DINr=vvuOCRmWJ_rB4!kE5qUXi(i?dlPBE={2;{N3B-Z>g(i z@va`dc?Hd&t5;ud>hE{h)zg<0sLyp}zWm|U%Rm2!4NO<|_aob1*e@;cyW>9`|L_bF zXFhuV;`qB~uaDp8K}}b&&rw)Cd3F5cfM&JGR;}u$tJvpgS1*5j^Wx6>S% zjVWhv`U9$Zf!oB#4pdfVq~Ne`;}~lJsEz&7vI`V1aH}Qfa8b=-HGz}UZAq9ud+`^L z2-^l$f!>{2i{RYG^mZ}(Dl(|PND|S&UE5emj=M9n#R@WOR|0#1C1hCXpJhK5Q!Qqd zCn+2j^FJ4K8%&E<%_U#hCtsaPG>^r~(-C6ngVSW!AW*uCqnbazR{BOP+7HUG*~3$x zGsO}2_K?6oP?$zp)1sYsh3HV# zqlEi*k3aNbge(^4>x>1kW=2fL3#JNK!hb$CeH(a5A)ouLUGG<%NjBJ^aml|fW1Y;nvas+D7s_eJSV@R7Omwa0qV zQcLpswD0IsLy0IqFvN}nXZ8wyjYu^P7LAyn0-_ay%3Mpuo((I{idg(ggee-amD0s4 zrHJV&pao(P5Ql_nTP1F*w?6Gqoj0$czT&_DP9qvm(`U4=oKEmRGz1#mTdyVgW<48k z<~m{;%|A4UrJhb;ND!2;(jo2C5tT{gaek3@4`Y~P&5;xMIj&dcI1SRnG|ZJj;;Mec zAw^x)(0kf`oE*iWgA2XRgvm$pb^~pzr_-1!vVe6IsC9h|6Xj*cZN}aolCS zByVfkVhvu_via&V8*mG-REHU&&8PiWSdzz%jkFSEuQN>-)9h(884 z!3_KyD}!OXk+kVY>v_$a=?QiQJ7DK^3oWGtCLw(8)VUJ9KtY@75LSHp`n9>YKIHR+ ze8`=b< zkL1moaAy^${TBI_oq4sr&NehGuMA)L%*N|+5uwIrTc7Gx4&<=|^#He0ud9bC^pfxO zFbk?|r-C=5pgWyfuTD=So=<6#?pjqgI}Gfak3&bv63SYHUm^6{-owaJ4f=EVt;K14!65hBE3imMK6a_Tdx+JRhw$82lkc8{b3y0naV4tEmX zM9_XWaa($u=e;j-8hcD!``{PB&YnXlnZq>PM!5Jfa7Tl!jIf&W;$q&h?7;o?%Rqrg z>;r?I@(H~UG6CaiW}g)>amxiW(^IO0Yp1o!VmnUDUdL%+A9}$HBTQo6a(Vt03NEJn z)Px)M!KVj63?X#k>;(`7s1RdqW~V)vP@XzrWi>q!NNG5Ek6OrT)DTK1(@ah@T_5ug zz*n?Ac(HH~`KJgygxd;h_|Hz7(a}5*tlY8I0r%{&uOY8251)>+er%JK4fcgk9=x6H z4)=>OSVs>$mfA23V9NLN&)kM|Q-+aFPlrZ=7&qk$P}(K?z+7XU;V#f2;&y?*bw_ms zO~<>ur2ac=aCLm#oDNB%Wgn$5G?lLbcwo5`|BneRLrxr5O$Uasz zFv9dWxGUysAd1q^_+OXX@b3NvsPo*i#X}S&O0Cv;N^vAx?tFcko9}&JHAFpjA0qpHJ6}&uGiq$-O7@Dc^?C>eojoy)p^Mfl^tJ z6jc<5@K=Y5!Thpz*H+2VHqpoOZjszOVt6Jz*_LQ2OKAfulR6_&|9uY65e0*Dum#^p z5d5+aSuw|423akpf(31voyr}VrI;Z3Y6`KDGBbK21CaM@n(nq|r$dEs)04P(9S;<; zMX1yOLoD~+%Nbc@^bv}1&S4t!!9DzB+nh{jj4YQDl^QB7pu5nZQ`ev-I)n|Wi`B@a z=vH!DrViL`A@R)yfvsOwLs*z~a+y3pN9J#6ckS_aZacdz*0xzdls4dK{oE~aDSaEX zwSgKLIbRmDS+0F2l=6q5YpzLF`-F;*rYs{eTfZ=k!)*}SMC&t1XGLu;!JCw+;Idri z>DFjwR`;O*J})L&_Rf-k3`Dou1Y#$E-0xM$x42Gc$ITKP6*`q_RCh6eDT$@51aAh}W4PGV}YlwQF0}ZAg2vVl~1})zksa;z@tGo6N z4QU9nqO=G(ebeDIz`FNXY;omHS)3={lmpQ9sjE)bf^GZukGp4DGjMmgTK2iQs_X3B zz1qOKA-iUB22s_P+1fC3H)>sdtC5+dXY+FUzEcC7}>Tt^Hq@P)E&vR-=L zhicSiKRr9~j}%BEa2!zv0aP_ocZ`Iz(4P`oAYrl2svyN)^l0J#HPi)V?#<*SE_fp> zMoHMFb*YU3AOo8=;BbrAZ0Cbw7K>6&D|Muy{3|mYY>nm3X2pVY1R%)8FRun>3+!e0 zYx?hJMZM^iT(pAJOB8@h6g&`vmI#uD$sX($nKs*HZt%4Bo1%1f&av(ebnj#oS)U@9C*x#Yb&v5bxsubeYyO{_+1S#Y#jPRI!<$nB`a(Y{^r&&=n14s z$*QNA2g$yUn?v#q=S_Qxi4tCc@$=AGBB70!Yay;mK_UWWDDP({il-$CqLrG(z{JKF z4_@UZO7?UL2h0n=EpE641kl&niToCC$`#!=+hQPf^Es&3ne!oneL)Dm5xC+n8a?1u0yWFy3t| z&~1P?Xuch^9p6ZQu*!q5)P}vq)pIdS)s+xH4qS=t(Shi|VX0sE2B%~ZvJ?NFMx`K3 zXdy0cn>^-ucP-GO*twkyCF8d2pFJz`vTkq8i1yvvbAPkgV){Dy8hSAQg#a(|?GZ*t zFn{dwCV-;V;zMHXt#7#XjcR=(t#71t)GENe(PDm?zzxZ;#H->upSL}ZD4HtfB4cAN z=HmVt@}DElv5amQRB)Y1E@FpaY@dOOhUE<`hd7zDvYLVYH?l8~(SYAr{M{CBCR&9* z?TuQ@p9tBVGb8+-tggND8?~Fl$s;RI10N;Q7VJq^*J-TE;4ARelzMxSYj^0i-XL23 z-?f26UT(XC-!f5h+GzZ6%RS_=j}qHDvWvD7ZlkLi>?6(SvoZC4%?+~sAn_4 zVQb?eP={!~UK+p~1&b!ywo`xCWe2km+Ee6&Gjqajc*Le;e))<4VRb-@u55CG5KTnEs0!erv+3!H9pRxUtA7RIN zP;jL~nGe|8&;yuZ@qnoU}JYMGx{2Xt+UO@_)q2XAM3m-D-AIPmK0HXIxm#6 z+%raRZNSxKp3l88{$ND5va5e{z`loOlw7VoMzmG9Syp`?+cz&kH~o{u_AZMqei>0~ zo!>)2@*F&+<~Q`i)TKYF$0w%;C)oVd#&^Y%Y&djD@BQ&5&pM3gqHs}!99N(}Dg-#H#7gDoP$W$GOSST(Yp zwP>8zPI7qoZ6ZW(<96F^0vhdYcG9uit-ZEg(4*UJHv7|Uw)08V6z9dXpjPP=}5x&(=t1u#)q1>AuxKMuZZHGE( z4_@;hC3zt+WS`uu{18E4+e9xzl1kCfyW~ZkWNPErIO2W73iKj#Pp&P@2zqiFx_`B? zR8fB#0}b?)4$PyRbP8@oH@PFvohm{)88L1AZh;ZKPZ<0=yIFzoEy+zN3m4tZysHqW z$SetbQON@l^Bd-NYg^&n0g2$}9XFwsPEMh!@f~!F_v1{`v`bRKyjnnHQDD(*T42Lx zUzR20E50N*vUiE939kPoqBUO-j zI^bDfOT7Vcx?^j=X^{VFkeWkCW-lGC9V&gTL!6_gz=#2ZY1@2sGN zP;O2D8nhx+u}~RE?a#=HfI2yv>8M^oKAt*C zREcvph_a-=453RQBMj zwkk-NrgD{uadMqN?hb=_7%u^*K~|Q?q(6QAdXIVoW9@STt#y^VOd#@_TFz(n{4dElMcq2%QH4P-j%uM#ub~=F3?oX>YoCe!ZaV%TFGEG z-r2n;18f)%@r0)8DmEI2;RqsdxG-flNE!BNeuw;tck@fQvMo(aT_#Y-o7m0*>LM># zg8=4Zaxc0fu{;;IO(5E9290y;Id@>i#}_jO-2+{9=EZ#-cuPeh2X^{r*0)VeHii~y zHpee@XmXytrzl~Z!WcW@=q}8ssk|^^rLCAf6*0@kwS#I8ABGH{%>>knp6Xb4yhTwn z2Q$m%(xbS-%RJ{J%E1zNnMcxbWW=txL$l(8Gq#LGEc2tQCJs)mtl0J#=!8Mh1gzFi zR66IZs_InIFtsnzfMZg|UkY5P7;^Qx`-F)kzes)DKxA%t2wvM-+$uY40_!6Nwe@3(Q&x{L9%Mc?Ja=|8_I;liR&|&C!*uEFL61pwo0KX8(jY{#1!)aG=cHxgd`~ z@~WkTHVqqL{gQL|uk{Y>J%Jc7?m4W~Wk=?pI$9dUM;t$Y`Re;br%bl&xyOXxDrNH2 zT*xjyDO#T{&G1HkP_b&g?il?r-7<$BmmHfAkaq-^;`EY?7T{ga^oSF0tLcbLoYQJy zRj_d2wsyV$q1d#8}uunzfzTrRC_}5Cv_F_+pZlCC~_gG zzwBqFKD2$M07m;@;$}xs8FP^Bft`g+&A(C=W$4YsN{s^_9sI~fb3*)jOh0kot<0UF zu0ONF0}uy8?kJ;7L}S%0X2^#PM%~D)P{QHS*}7@U<%q=W5inndv}Dn!{dxr=gNeZ9 zr*9Ts71nvH1z$61xCn}`{r-%l1j-QH!5d%_+gyXJE z>YwGTsKG(I4g+~?I%Vw%a!*^&k?U_a&3yTV zW=S1wJxQv*-5g^S%4UNITDqvFkCHT5Ld~_xa5}@3mpAvn7V~B=L}*rD~vrABxPdkMtU81i(7xL?$mQ zMjFm2GH8Hrwxs)ZWQM0H|0n7VDXt|sLSkQoXoinx{9?j7DY_}UU6(OnQ^d`1JE-#$stRIYMSS)jatQ z-jscDl1q@*3q6L(A$SL=VWW|YHq#rA$De$muU)@OX-Q0ZI`l-omX08~KOzlPNOQ!N!-B?ZpRo#4a zc5E=hzKB{s(=P8*j4EzQ{4d4vibT+L0yI{1Hy*rxH@VkKx9Uwv(6k59N16?Cai>RS z7CI`kkeJrJtRS8HnX5zMMz!d^_OvH8)QrvQC3wb_nSFV2wj<}oHAP1%>Kg8Gwl+mQ z-Sg*dJoi%Wc_sB$sceY?dso)>8KCuMv@1o-eefP~cRQjQL>*s=dj!~yyRJzyK&2al zUUQ&pbHPiuN6DQ#{1rm|q*9P7`FRT_pkuShG&q|BeHOBfOu}ynfH5|qd(XPJV^j86 zt&8Z%o*HJ(T^4w|XQ(a++yT0U4>9r7_3TWApY991!m>1m62tA-TNttnI_0z_eaCPB zf|vKiJ?EBfTzKrh5%+#z13nQdU_j_>YMHT~9JSmvfe+Py@*QA=qhhevF@6ozVChrBH_=)A_sPZi|k@R%$!KXfT@( z_BWFF7o&RQ6$bUlD{J#Z-Qv!eYpiN-R~U^g2-Ai5%p9E@HkFe` z0c7OI>A(T)-=}o5S0CxV6g9^=%)I9?9Vhd}G3d_hE9M}@2EetF$tMg3FKwTOhg)s$ zzfhkx8AEBuYT347<8o04_t~orcGw0I!JP1vSP?S9M{@V}Qy6I4BTQp?M1a-%|L@Wu zPMms4V*i5gAUhC5y;|F+ z+#=BVdz4OW%`7(=A$r8SpyY~VbOAOy(y&-EkqtL*wt)=BDPRb*15GXsfs`Eu`p5u_ zhuGQ?L7AqSIc@-iw6k%Y*4O9E{tc}RDnx8w-@F0ag^ARgbTz+YBS?viO!mx<(LtG z|2jzMg0k_#to4|SE&aQW+o!yKrDL7cb8qan}#ofqB$?L(v`^kb` zA|4Ghwt8?g zAA|}Y*VR;BJs5hJ-h;4n%n2jerx6=KanM59W(0R#4Wg6asec95L_hc&9V1w&&Vw#5 zysez~JKP3*49tIgjHY|dCsrq>)@c_*<)807INcVhqCFyhauwh7E3_^Lz-gQ8IuxS0 z9fN1QTC3*)UYLWlfX26ix4ATM6X8jL#*uLuu2`zg@Zm!wqr6N-jvX!GD9A~q_5mws z`+ykC!t{!50Lwl=cflrfZG-L5)@)ny;<9NYBHjau$Lu^c+z1?6O@UFP1Og;e2*a-M zl^05r-IlMX%a6{S$Ukki-#1TJ_8&No0Eg0d_n#&KxJla_Xd0no+lS%RF7T9nix z5&7KuO_@{k_c5;F?BVzNh7XO>Wfombqd%3%Hg0knRs4ryk5bS2+zEg9`qP-HX4OnK z-?_>nFIJsr(=HFoevb3j4wg^I4GTm>nS|WLt%xyvVD}>dnE(9x$sdjn=k`T9hHA)D${Cgan#_zIh}i-t&eBM$wR9I ze%5{^KQKxxG={({43FW(VO|q+ubj^D)4;itj1tEn7o+6e2oaplIl5I^mrlcCVq-@J zv78(`!C3K#%1@+)xM7;IaWo}5iwwSzk2-L2)NFMQoFIWX&ep|zHgOFm(m*l&@ad#D z<$x2;>j}rE;ERd&l}62ijXYyb1nh&T5sa$b_JN^5f{+|zgF_J8I{BE)ssjby+4MlB z16h?nDYil}7yU~8SNw$0N0^W~iHB_Irbxi`_y;h4%-i+6gZ^2Ke1g|O?KbwYHND%| z)0Px(b3dDCUaW`z%c&lkUi~7%=YZBl`V_gdr*fb|*dZwhL*@h?Gk#bo3biyo7Y4|W zU(2boEbJrG2Z|a;why=IRUhu6kM8TW0;8b`8j5(DU%YYg6C|9Zx&Ua zNo;A>)LbF;5Z4f*6ZdVzh-e%nNYh3UB5cVMSr_(X)#7%!*m)!^?X+BZy6xv8cy}(` zm(RE1)lBQ^W<+B-wWFC@O%Xt_eCXoxnXgbdHlp4+n;b|StWK6VcvAD?A_PVYTr+%V zrq2g*Sx{O|7hX`O=2UuQYIY*^PQ|;M)SS4Eq3txWOAM-U95!(&!B#`oMJtUH8Volo zh+n;@gz0Qm=m@d*LAov>kQt_UHFc)pA-o?&Ag_ff6_R+pb7BxGWkl-SCfO$Oe)2T%vL(}uYS3_r&Q`G1NI#87j*RJE6 zd%gJ8&^%6?&1ubv*5~l-v7uGFV%Rp^LJq80-C*=f*(d=n93iwl5NrW@*%I1xFhHE8 zmCr)cKEITw+-l+h#ufl<%;^Yfn`_Jea%vap1t0ySBF42{;36U+Cku5E_zl2jMWaF% zw9plzBKaswHJq7K?!5wf&cLmhPIe-l$nD)F5dH~IM*D3K@%h0iir>(NHPn5wdp*>Z z%ufJcUmT=?UVS$}%!XlIi53`^dP20`gMN+Mm3k3c9 zwA1xV#U*jN3NO5)Xbpw~9gEC=(SHpd1Iz`G#e@q*XlMv2g&|WphtsQlclWrGb(3Wc z4!SI+u}G7m9^Iqav{k%8JUIm;y_BP_<&JmL zN@j@!hSiAUS|Q8zaP(l5rn{_8AzH@)%tGsl6PlE;&S5b#(Y{VbIy-82$3~;cfeur4 zh_W3#!&3&*FQD#P=o%NgJBe_wZ(O~DR>lQS3I0|a#;{?%V3)g>;SQC zIXekE2ZgWgwJV{Z7;5dIX%wx!DZI}pWL_+GL(2J`fmzs`FY ziol>L5q<`wWv^{>lK8I^EIM^?HmB=jKXs8KA_|3p6oSnO1;Q(qt^HGS*!JW}NEC%! zJp$`6+D5btQ!z@h0<(N0@{KuyI?A5M(G2>B=eaBHs5ZAjyEz;{#~oFK&za;fb`iqa zk@X=~twCr66&T8i=g3^7_)e5H*`7h+s>nZ}PAH=|y!;PMd|-hg152@_a7JKeW4((* zHn$b((f#w8Tyilw@|jq_n&NoPawuDiJ$<=2uoev@84~Bvk!~W2N|l%;wtlp(A*n>M zz#+HoxdR3UEb2`E_51I>ZJO093Y{U538I1XkU^H1E;{S_cX- zy;xCjw0+1+JOYYQO!02qzc#ANNm@{kSY&PRki`lUTNH&iDS) z7H0L$a%%Zeq>s|I@%2GRe}8=a@`r;~Nu3+EE|)T0 zvaaUGF#CKKmY9>aT!J`+|KOAdCC{(1EIrR=xm_(Pi-dXhS{3Ku4=ND!mh{dXLYF(( zCCd0DXhV;L@SY*jJ3&0BkP%JJ&U)tmvSsquZ(p&rXf|Y?D?)Dj@U{O20zpALW`%x9 zf%BvS0Pzz_f>|BZ`-$nc6}H0BOmiCHPNiCuDa8hjyvUnWCrTN^(t1J?QjF1fpv~w~ z`+{?HhT@2=hXY;}%~R2=LeMrKBB�m5NonstDe02>5wk@{^5WXDg+qb%U7E!REA@ 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 Kp}wIp_x}JkmbU}| diff --git a/js/libraries/balupton-history/.gitignore b/js/libraries/balupton-history/.gitignore deleted file mode 100755 index b7f13992..00000000 --- a/js/libraries/balupton-history/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.build \ No newline at end of file diff --git a/js/libraries/balupton-history/History.md b/js/libraries/balupton-history/History.md deleted file mode 100755 index 7a2d9ff4..00000000 --- a/js/libraries/balupton-history/History.md +++ /dev/null @@ -1,76 +0,0 @@ -## History - -- v1.7.1 - October 4 2011 - - Added a new native adapter which is framework agnostic (can be used with, or without any framework) - - Provided bundled files - - Added RightJS adapter - - Updated supported browser listing - - Added sessionStorage support in core instead of optional Amplify.js Store support - - Fixed issue with state id generation growing slower over time - - Closes #104, #95, #102, #92, #81, #90, #94, #93, #91, #67, #83, #54, #45 - -- v1.7.0 - April 1 2011 - - Added `History.enabled` property (refer to usage section). This reflects whether or not History.js is enabled for our particular browser. For instance, if we have not included support for a HTML4 browser and we are accessing through a HTML4 browser then `History.enabled` will be `false`. - - Added (optional but recommended) Data Persistance and Synchronisation Support thanks to [AppendTo's](http://appendto.com/) [Amplify.js](http://amplifyjs.com/) (refer to installation and compatibility sections for details) - - Made HTML5 SUIDs more transparent - [Reported](https://github.com/balupton/history.js/issues#issue/34) by [azago](https://github.com/azago) and [Mark Jaquith](http://markjaquith.com/) - - Fixed Session Storage Issue - Reported by a whole bunch of different people; [one](https://github.com/balupton/history.js/issues#issue/36), [two](https://github.com/balupton/history.js/issues#issue/37), [three](http://getsatisfaction.com/balupton/topics/history_js_1_6_losing_state_after_manual_page_reload) - - Fixed URL Encoding Issue - [Reported](https://github.com/balupton/history.js/issues/#issue/33) by [Rob Madole](http://robmadole.com/) - - Disabled support for IE6,7,8 when using the Prototype Adapter (there is nothing we can do about this, it is due to a bug in the prototype library) - [Reported](https://github.com/balupton/history.js/issues#issue/39) by [Sindre Wimberger](http://sindre.at/) - - URLs in the State Hashes for HTML4 Browsers are now even shorter - [Discussion](https://github.com/balupton/history.js/issues#issue/28) - - Fixed a issue with the MooTools Adapter and JSON with IE7 and IE8 - -- v1.6.0 - March 22 2011 - - Added Zepto adapter thanks to [Matt Garrett](http://twitter.com/#!/matthewgarrett) - - The readme now references the supported versions of the libraries we use - - Updated vendors to the most recent versions. jQuery 1.5.1 and Mootools 1.3.1 - - Reverted versions of Safari iOS prior to version 4.3 to be HTML4 browsers, Safari iOS 4.3 is a HTML5 browser - - Refined code in History.js and its adapters - - Fixed issue with extra state being inserted on Safari 5 requiring an extra click on the back button to go home - [Reported](https://github.com/balupton/history.js/issues#issue/17) by [Rob Madole](http://robmadole.com/) - - Fixed issue with Safari 5 and Safari iOS 4 sometimes failing to apply the state change under busy conditions - Solution conceived with [Matt Garrett](http://twitter.com/matthewgarrett) - - Fixed issue with HTML4 browsers requiring a query-string in the urls of states - [Reported](https://github.com/balupton/history.js/issues#issue/26) by [azago](https://github.com/azago) - - Fixed issue with HTML4 browsers requiring title in the states in order to use state data - [Reported](https://github.com/balupton/history.js/issues#issue/25) by [Jonathan McLaughlin](http://system-werks.com/) - - Fixed issue with HTML4 browsers failing is a state is pushed/replaced twice in a row - [Reported](https://github.com/balupton/history.js/issues#issue/17) by [Joey Baker](http://byjoeybaker.com/) - - **B/C BREAK:** The `statechange` event now only fires if the state has changed; it no longer fires on page initialisation. This is following the [Firefox 4 History API Changes](http://hacks.mozilla.org/2011/03/history-api-changes-in-firefox-4/) which we agree with - this breaks standard, but makes more sense. - -- v1.5.0 - February 12 2011 - - Moved to UglifyJS instead of Google Closure - - Split HTML4 functionality from HTML5 functionality - - Installation details have changed (the filenames are different) - -- v1.4.1 - February 10 2011 - - Added HTML History API Support for Safari 5 and Safari iOS 4.2.1 - - Cleaned code a bit (mostly with unit tests) - -- v1.4.0 - February 10 2011 - - Unit Testing now uses [QUnit](http://docs.jquery.com/Qunit) - - Corrected Safari 5 Support - - Now uses queues instead of timeouts - - This means the API works exactly as expected, no more need to wrap calls in timeouts - - Included a Subscribe Form in the Demo for Version Updates via Email - - Small updates to Documentation - -- v1.3.1 - February 4 2011 - - Improved Documentation - -- v1.3.0 - January 31 2011 - - Support for cleaner HTML4 States - -- v1.2.1 - January 30 2011 - - Fixed History.log always being called - [reported by dlee](https://github.com/balupton/history.js/issues/#issue/2) - - Re-Added `History.go(index)` support - -- v1.2.0 - January 25 2011 - - Support for HTML4 States in HTML5 Browsers (added test) - - Updates of Documentation - -- v1.1.0 - January 24 2011 - - Developed a series of automated test cases - - Fixed issue with traditional anchors - - Fixed issue with differing replaceState functionality in HTML4 Browsers - - Fixed issue with Google Chrome artefacts being carried over to the initial state - - Provided `onstatechange` and `onanchorchange` events - -- v1.0.0 - January 22 2011 - - Supported `History.pushState` and `History.replaceState` degradation - - Supported jQuery, MooTools and Prototype Frameworks - diff --git a/js/libraries/balupton-history/README.md b/js/libraries/balupton-history/README.md deleted file mode 100755 index 05678c56..00000000 --- a/js/libraries/balupton-history/README.md +++ /dev/null @@ -1,245 +0,0 @@ -Welcome to History.js (v1.7.1 - October 4 2011) -================== - -[![Flattr this project](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=balupton&url=https://github.com/balupton/history.js&title=History.js&language=&tags=github&category=software) - - -This project is the successor of [jQuery History](http://balupton.com/projects/jquery-history), it aims to: - -- Follow the [HTML5 History API](https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history) as much as possible -- Provide a cross-compatible experience for all HTML5 Browsers (they all implement the HTML5 History API a little bit differently causing different behaviours and sometimes bugs - History.js fixes this ensuring the experience is as expected / the same / great throughout the HTML5 browsers) -- Provide a backwards-compatible experience for all HTML4 Browsers using a hash-fallback (including continued support for the HTML5 History API's `data`, `title`, `pushState` and `replaceState`) with the option to [remove HTML4 support if it is not right for your application](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) -- Provide a forwards-compatible experience for HTML4 States to HTML5 States (so if a hash-fallbacked url is accessed by a HTML5 browser it is naturally transformed into its non-hashed url equivalent) -- Provide support for as many javascript frameworks as possible via adapters; especially [jQuery](http://jquery.com/), [MooTools](http://mootools.net/), [Prototype](http://www.prototypejs.org/) and [Zepto](http://zeptojs.com/) - - -## Usage - -### Working with History.js: - -``` javascript -(function(window,undefined){ - - // Prepare - var History = window.History; // Note: We are using a capital H instead of a lower h - if ( !History.enabled ) { - // History.js is disabled for this browser. - // This is because we can optionally choose to support HTML4 browsers or not. - return false; - } - - // Bind to StateChange Event - History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate - var State = History.getState(); // Note: We are using History.getState() instead of event.state - History.log(State.data, State.title, State.url); - }); - - // Change our States - History.pushState({state:1}, "State 1", "?state=1"); // logs {state:1}, "State 1", "?state=1" - History.pushState({state:2}, "State 2", "?state=2"); // logs {state:2}, "State 2", "?state=2" - History.replaceState({state:3}, "State 3", "?state=3"); // logs {state:3}, "State 3", "?state=3" - History.pushState(null, null, "?state=4"); // logs {}, '', "?state=4" - History.back(); // logs {state:3}, "State 3", "?state=3" - History.back(); // logs {state:1}, "State 1", "?state=1" - History.back(); // logs {}, "Home Page", "?" - History.go(2); // logs {state:3}, "State 3", "?state=3" - -})(window); -``` - -To ajaxify your entire website with the HTML5 History API, History.js and jQuery [this snippet of code](https://gist.github.com/854622) is all you need. It's that easy. - -### How would the above operations look in a HTML5 Browser? - -1. www.mysite.com -1. www.mysite.com/?state=1 -1. www.mysite.com/?state=2 -1. www.mysite.com/?state=3 -1. www.mysite.com/?state=4 -1. www.mysite.com/?state=3 -1. www.mysite.com/?state=1 -1. www.mysite.com -1. www.mysite.com/?state=3 - -> Note: These urls also work in HTML4 browsers and Search Engines. So no need for the hashbang (`#!`) fragment-identifier that google ["recommends"](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling). - -### How would they look in a HTML4 Browser? - -1. www.mysite.com -1. www.mysite.com/#?state=1&_suid=1 -1. www.mysite.com/#?state=2&_suid=2 -1. www.mysite.com/#?state=3&_suid=3 -1. www.mysite.com/#?state=4 -1. www.mysite.com/#?state=3&_suid=3 -1. www.mysite.com/#?state=1&_suid=1 -1. www.mysite.com -1. www.mysite.com/#?state=3&_suid=3 - -> Note 1: These urls also work in HTML5 browsers - we use `replaceState` to transform these HTML4 states into their HTML5 equivalents so the user won't even notice :-) -> -> Note 2: These urls will be automatically url-encoded in IE6 to prevent certain browser-specific bugs. -> -> Note 3: Support for HTML4 browsers (this hash fallback) is optional [- why supporting HTML4 browsers could be either good or bad based on my app's use cases](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) - -### What's the deal with the SUIDs used in the HTML4 States? - -- SUIDs (State Unique Identifiers) are used when we utilise a `title` and/or `data` in our state. Adding a SUID allows us to associate particular states with data and titles while keeping the urls as simple as possible (don't worry it's all tested, working and a lot smarter than I'm making it out to be). -- If you aren't utilising `title` or `data` then we don't even include a SUID (as there is no need for it) - as seen by State 4 above :-) -- We also shrink the urls to make sure that the smallest url will be used. For instance we will adjust `http://www.mysite.com/#http://www.mysite.com/projects/History.js` to become `http://www.mysite.com/#/projects/History.js` automatically. (again tested, working, and smarter). -- It works with domains, subdomains, subdirectories, whatever - doesn't matter where you put it. It's smart. -- Safari 5 will also have a SUID appended to the URL, it is entirely transparent but just a visible side-effect. It is required to fix a bug with Safari 5. - -### Is there a working demo? - -- Sure is, give it a download and navigate to the demo directory in your browser :-) -- If you are after something a bit more adventurous than a end-user demo, open up the tests directory in your browser and editor - it'll rock your world and show all the vast use cases that History.js supports. - - -## Download & Installation - -- Download History.js and upload it to your webserver. Download links: [tar.gz](https://github.com/balupton/history.js/tarball/master) or [zip](https://github.com/balupton/history.js/zipball/master) - -- Include History.js - - - For [jQuery](http://jquery.com/) v1.3+ - - ``` html - - ``` - - - For [Mootools](http://mootools.net/) v1.3+ - - ``` html - - ``` - - - For [Right.js](http://rightjs.org/) v2.2+ - - ``` html - - ``` - - - For [Zepto](http://zeptojs.com/) v0.5+ - - ``` html - - ``` - - - For everything else - - ``` html - - ``` - -> Note: If you want to only support HTML5 Browsers and not HTML4 Browsers (so no hash fallback support) then just change the `/html4+html5/` part in the urls to just `/html5/`. [Why supporting HTML4 browsers could be either good or bad based on my app's use cases](https://github.com/balupton/history.js/wiki/Intelligent-State-Handling) - - -## Get Updates - -- For Commit RSS/Atom Updates: - - You can subscribe via the [GitHub Commit Atom Feed](http://feeds.feedburner.com/historyjs) -- For GitHub News Feed Updates: - - You can click the "watch" button up the top right of History.js's [GitHub Project Page](https://github.com/balupton/history.js) - - -## Get Support - -- History.js is maintained by people like you. If you find a bug, report it to the [GitHub Issue Tracker](https://github.com/balupton/history.js/issues). If you've fixed a bug submit a [Pull Request](https://github.com/balupton/history.js/pulls) and add your fork to the [Network Wiki Page](https://github.com/balupton/history.js/wiki/Network). - -- If you would like paid support and trainings, or have job offers, then refer to the [Network Wiki Page](https://github.com/balupton/history.js/wiki/Network). If you are qualified with History.js, then be sure to add your details to that page too. - -- If your company uses History.js on your projects, and would like to see it grow and prosper (better documentation, bugfixes, upgrades, maintenance, etc.) and would love to become a corporate sponsor then do email sponsor@bevry.me - -- If you would like free support for History.js, then [post your question](http://stackoverflow.com/questions/ask) on [Stackoverflow](http://stackoverflow.com/about) and be sure to use the `history.js` tag when asking your question. - -- If you've created a website that uses History.js, or know of one. Then be sure to add it to the [Showcase Wiki Page](https://github.com/balupton/history.js/wiki/Showcase). - -- If you'd love to +1 or like this project, then be sure to tweet about it and click the "watch" button up the top of its [Project Page](https://github.com/balupton/history.js). - -- For anything else, refer to the [History.js GitHub Wiki Site](https://github.com/balupton/history.js/wiki). - -Thanks! every bit of help really does make a difference! - - -## Browsers: Tested and Working In - -### HTML5 Browsers - -- Firefox 4+ -- Chrome 8+ -- Opera 11.5 -- Safari 5.0+ -- Safari iOS 4.3+ - -### HTML4 Browsers - -- IE 6, 7, 8, 9 -- Firefox 3 -- Opera 10, 11.0 -- Safari 4 -- Safari iOS 4.2, 4.1, 4.0, 3.2 - - -## Exposed API - -### Functions - -- `History.pushState(data,title,url)`
    Pushes a new state to the browser; `data` can be null or an object, `title` can be null or a string, `url` must be a string -- `History.replaceState(data,title,url)`
    Replaces the existing state with a new state to the browser; `data` can be null or an object, `title` can be null or a string, `url` must be a string -- `History.getState()`
    Gets the current state of the browser, returns an object with `data`, `title` and `url` -- `History.getHash()`
    Gets the current hash of the browser -- `History.Adapter.bind(element,event,callback)`
    A framework independent event binder, you may either use this or your framework's native event binder. -- `History.Adapter.trigger(element,event)`
    A framework independent event trigger, you may either use this or your framework's native event trigger. -- `History.Adapter.onDomLoad(callback)`
    A framework independent onDomLoad binder, you may either use this or your framework's native onDomLoad binder. -- `History.back()`
    Go back once through the history (same as hitting the browser's back button) -- `History.forward()`
    Go forward once through the history (same as hitting the browser's forward button) -- `History.go(X)`
    If X is negative go back through history X times, if X is positive go forwards through history X times -- `History.log(...)`
    Logs messages to the console, the log element, and fallbacks to alert if neither of those two exist -- `History.debug(...)`
    Same as `History.log` but only runs if `History.debug.enable === true` - -### Events - -- `window.onstatechange`
    Fired when the state of the page changes (does not include hash changes) -- `window.onanchorchange`
    Fired when the anchor of the page changes (does not include state hashes) - - -## Notes on Compatibility - -- History.js **solves** the following browser bugs: - - HTML5 Browsers - - Chrome 8 sometimes does not contain the correct state data when traversing back to the initial state - - Safari 5, Safari iOS 4 and Firefox 3 and 4 do not fire the `onhashchange` event when the page is loaded with a hash - - Safari 5 and Safari iOS 4 do not fire the `onpopstate` event when the hash has changed unlike the other browsers - - Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call / [bug report](https://bugs.webkit.org/show_bug.cgi?id=56249) - - Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions / [bug report](https://bugs.webkit.org/show_bug.cgi?id=42940) - - Google Chrome 8,9,10 and Firefox 4 prior to the RC will always fire `onpopstate` once the page has loaded / [change recommendation](http://hacks.mozilla.org/2011/03/history-api-changes-in-firefox-4/) - - Safari iOS 4.0, 4.1, 4.2 have a working HTML5 History API - although the actual back buttons of the browsers do not work, therefore we treat them as HTML4 browsers - - None of the HTML5 browsers actually utilise the `title` argument to the `pushState` and `replaceState` calls - - HTML4 Browsers - - Old browsers like MSIE 6,7 and Firefox 2 do not have a `onhashchange` event - - MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function) - - Non-Opera HTML4 browsers sometimes do not apply the hash when the hash is not `urlencoded` - - All Browsers - - State data and titles do not persist once the site is left and then returned (includes page refreshes) - - State titles are never applied to the `document.title` -- ReplaceState functionality is emulated in HTML4 browsers by discarding the replaced state, so when the discarded state is accessed it is skipped using the appropriate `History.back()` / `History.forward()` call -- Data persistance and synchronisation works like so: Every second or so, the SUIDs and URLs of the states will synchronise between the store and the local session. When a new session opens a familiar state (via the SUID or the URL) and it is not found locally then it will attempt to load the last known stored state with that information. -- URLs will be unescaped to the maximum, so for instance the URL `?key=a%20b%252c` will become `?key=a b c`. This is to ensure consistency between browser url encodings. -- Changing the hash of the page causes `onpopstate` to fire (this is expected/standard functionality). To ensure correct compatibility between HTML5 and HTML4 browsers the following events have been created: - - `window.onstatechange`: this is the same as the `onpopstate` event except it does not fire for traditional anchors - - `window.onanchorchange`: this is the same as the `onhashchange` event except it does not fire for states -- Known Issues - - Opera 11 fails to create history entries when under stressful loads (events fire perfectly, just the history events fail) - there is nothing we can do about this - - Mercury iOS fails to apply url changes (hashes and HTML5 History API states) - there is nothing we can do about this - - - -## History - -You can discover the history inside the [History.md](https://github.com/balupton/history.js/blob/master/History.md#files) file - - -## License - -Licensed under the [New BSD License](http://opensource.org/licenses/BSD-3-Clause) -
    Copyright © 2011-2012 [Benjamin Arthur Lupton](http://balupton.com) \ No newline at end of file diff --git a/js/libraries/balupton-history/buildr.coffee b/js/libraries/balupton-history/buildr.coffee deleted file mode 100755 index 60910ae7..00000000 --- a/js/libraries/balupton-history/buildr.coffee +++ /dev/null @@ -1,281 +0,0 @@ -# Requires -buildr = require 'buildr' -util = require 'util' - -# Options -options = - watch: false - compress: true - -# Configs -configs = - standard: - # Options - name: 'standard' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - outPath: __dirname+'/scripts/compressed' - - # Checking - checkScripts: true - jshintOptions: - browser: true - laxbreak: true - boss: true - undef: true - onevar: true - strict: true - noarg: true - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - other: [ - - # ----------------------------- - # JQUERY - - { - # Options - name: 'html4+html5+jquery' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'json2.js' - 'history.adapter.jquery.js' - 'history.html4.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/jquery.history.js' - } - { - # Options - name: 'html5+jquery' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'history.adapter.jquery.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html5/jquery.history.js' - } - - - # ----------------------------- - # MOOTOOLS - - { - # Options - name: 'html4+html5+mootools' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'json2.js' - 'history.adapter.mootools.js' - 'history.html4.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/mootools.history.js' - } - { - # Options - name: 'html5+mootools' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'history.adapter.mootools.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html5/mootools.history.js' - } - - - # ----------------------------- - # NATIVE - - { - # Options - name: 'html4+html5+native' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'json2.js' - 'history.adapter.native.js' - 'history.html4.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/native.history.js' - } - { - # Options - name: 'html5+native' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'history.adapter.native.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html5/native.history.js' - } - - - # ----------------------------- - # RIGHT.JS - - { - # Options - name: 'html4+html5+right' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'json2.js' - 'history.adapter.right.js' - 'history.html4.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/right.history.js' - } - { - # Options - name: 'html5+right' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'history.adapter.right.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html5/right.history.js' - } - - - # ----------------------------- - # ZEPTO - - { - # Options - name: 'html4+html5+zepto' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'json2.js' - 'history.adapter.zepto.js' - 'history.html4.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html4+html5/zepto.history.js' - } - { - # Options - name: 'html5+zepto' - watch: options.watch - - # Paths - srcPath: __dirname+'/scripts/uncompressed' - - # Compression (without outPath only the generated bundle files are compressed) - compressScripts: options.compress # Array or true or false - - # Order - scriptsOrder: [ - 'history.adapter.zepto.js' - 'history.js' - ] - - # Bundling - bundleScriptPath: __dirname+'/scripts/bundled/html5/zepto.history.js' - } - ] - -# Standard -standardConfig = configs.standard -standardConfig.successHandler = -> - for config in configs.other - buildrInstance = buildr.createInstance config - buildrInstance.process() - -# Process -standardBuildr = buildr.createInstance configs.standard -standardBuildr.process() diff --git a/js/libraries/balupton-history/demo/bcherry-orig.html b/js/libraries/balupton-history/demo/bcherry-orig.html deleted file mode 100755 index 43672f49..00000000 --- a/js/libraries/balupton-history/demo/bcherry-orig.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - WebKit is Dropping HTML5 "popstate" Events - - - - - - - - - - - - - -

    -

    There's a bug in the HTML5 "popstate" event, as implemented in WebKit (Safari and Chrome). View this page in one of those browsers. Your browser has had history entries added from #0 to #19 (you should start at #19). Hitting back/forward will navigate through these. On each URL, the large number above should reflect the hash value. If you hit back/forward quickly, you'll notice that your number gets out of sync with the URL. This is because WebKit is dropping popstate events (they are not firing). It seems to happen when outbound network requests are in progress when the user navigates in their browser happens. In this case, your browser is downloading an image that takes 1s to serve on every popstate, so you'll have to wait 1s between backs/forwards to have the feature work correctly. You could also cause constant network traffic by putting an image download in a setInterval, in which case your popstate events will never fire. This implementation simulates an AJAX application that makes a network request when you navigate between URLs using pushState/popstate. View the source for more info.

    -

    This was filed as Bug 42940 with WebKit on July 24, 2010. The Firefox 4 beta does not have this bug, which is good news.

    -

    This is put together by Ben Cherry. Ben is a front-end engineer at Twitter, and you can follow him at @bcherry.

    - - - diff --git a/js/libraries/balupton-history/demo/bcherry.html b/js/libraries/balupton-history/demo/bcherry.html deleted file mode 100755 index 309f4d44..00000000 --- a/js/libraries/balupton-history/demo/bcherry.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - WebKit is Dropping HTML5 "popstate" Events - - - - - - - - - - - - - -
    -

    There's a bug in the HTML5 "popstate" event, as implemented in WebKit (Safari and Chrome). View this page in one of those browsers. Your browser has had history entries added from #0 to #19 (you should start at #19). Hitting back/forward will navigate through these. On each URL, the large number above should reflect the hash value. If you hit back/forward quickly, you'll notice that your number gets out of sync with the URL. This is because WebKit is dropping popstate events (they are not firing). It seems to happen when outbound network requests are in progress when the user navigates in their browser happens. In this case, your browser is downloading an image that takes 1s to serve on every popstate, so you'll have to wait 1s between backs/forwards to have the feature work correctly. You could also cause constant network traffic by putting an image download in a setInterval, in which case your popstate events will never fire. This implementation simulates an AJAX application that makes a network request when you navigate between URLs using pushState/popstate. View the source for more info.

    -

    This was filed as Bug 42940 with WebKit on July 24, 2010. The Firefox 4 beta does not have this bug, which is good news.

    -

    This is put together by Ben Cherry. Ben is a front-end engineer at Twitter, and you can follow him at @bcherry.

    -

    This bug was fixed in History.js by Benjamin Lupton. Benjamin is a freelance web 2.0 consultant, and you can follow him at @balupton.

    - - - diff --git a/js/libraries/balupton-history/demo/chrome.html b/js/libraries/balupton-history/demo/chrome.html deleted file mode 100755 index a2791a31..00000000 --- a/js/libraries/balupton-history/demo/chrome.html +++ /dev/null @@ -1,37 +0,0 @@ - - - Chrome History API Data Artifact - - -

    This demo demonstrates an issue with Google Chrome versions 8-10 (possibly 11) where if you push a state with data, then do history.back to the initial state, the event.state will contain the pushed states data instead of being null.

    -

    Note: The issue requires a clean history list, as such this should always be opened in a new tab/window where there are no prior history items.

    -

    Reported by Benjamin Lupton author of History.js

    - - - - - - diff --git a/js/libraries/balupton-history/demo/index.html b/js/libraries/balupton-history/demo/index.html deleted file mode 100755 index e13510ef..00000000 --- a/js/libraries/balupton-history/demo/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - History.js - - - - - - - - - -
    - -

    History.js by Benjamin Lupton

    -

    History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.

    - - - - - -

    Click through the buttons in order and you'll get the results demonstrated in the README.md file.

    - - -
      -
    - - - -
    - - - diff --git a/js/libraries/balupton-history/demo/native-auto.html b/js/libraries/balupton-history/demo/native-auto.html deleted file mode 100755 index 1ea10ffa..00000000 --- a/js/libraries/balupton-history/demo/native-auto.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - diff --git a/js/libraries/balupton-history/demo/native.html b/js/libraries/balupton-history/demo/native.html deleted file mode 100755 index 010f89a0..00000000 --- a/js/libraries/balupton-history/demo/native.html +++ /dev/null @@ -1,62 +0,0 @@ - - - HTML5 History API Demo - - - -
    -
    - - - diff --git a/js/libraries/balupton-history/demo/navigator.html b/js/libraries/balupton-history/demo/navigator.html deleted file mode 100755 index f9b15844..00000000 --- a/js/libraries/balupton-history/demo/navigator.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - Navigator Output - - - - - - - - diff --git a/js/libraries/balupton-history/demo/safari.html b/js/libraries/balupton-history/demo/safari.html deleted file mode 100755 index 5da17755..00000000 --- a/js/libraries/balupton-history/demo/safari.html +++ /dev/null @@ -1,61 +0,0 @@ - - - Safari Hash ReplaceState History Traversal Bug - - -

    This demo demonstrates an issue with Safari 5.0.4 (6533.20.27) handing of hashes and replace state. When a hash is set, and then replaced using replaceState the history list are then broken, when traversing back the hash does not change.

    -

    Note: The issue requires a clean history list, as such this should always be opened in a new tab/window where there are no prior history items.

    -

    Reported by Benjamin Lupton author of History.js

    - - - - - - - diff --git a/js/libraries/balupton-history/license.txt b/js/libraries/balupton-history/license.txt deleted file mode 100755 index 647bfd26..00000000 --- a/js/libraries/balupton-history/license.txt +++ /dev/null @@ -1,10 +0,0 @@ -Copyright (c) 2011, Benjamin Arthur Lupton -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - • Neither the name of Benjamin Arthur Lupton nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/js/libraries/balupton-history/package.json b/js/libraries/balupton-history/package.json deleted file mode 100755 index ce50c66b..00000000 --- a/js/libraries/balupton-history/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "history.js", - "version": "1.7.1-r2", - "description": "History.js gracefully supports the HTML5 History/State APIs (pushState, replaceState, onPopState) in all browsers. Including continued support for data, titles, replaceState. Supports jQuery, MooTools and Prototype. For HTML5 browsers this means that you can modify the URL directly, without needing to use hashes anymore. For HTML4 browsers it will revert back to using the old onhashchange functionality.", - "homepage": "https://github.com/balupton/history.js", - "keywords": [ - "javascript", - "html5 history api", - "hashchange", - "popstate", - "pushstate", - "replacestate", - "hashes", - "hashbang" - ], - "author": { - "name": "Benjamin Lupton", - "email": "b@lupton.cc", - "web": "http://balupton.com" - }, - "maintainers": [ - { - "name": "Benjamin Lupton", - "email": "b@lupton.cc", - "web": "http://balupton.com" - } - ], - "contributors": [ - { - "name": "Benjamin Lupton", - "email": "b@lupton.cc", - "web": "http://balupton.com" - } - ], - "bugs": { - "web": "https://github.com/balupton/history.js/issues" - }, - "licenses": [ - { - "type": "New-BSD", - "url": "http://creativecommons.org/licenses/BSD/" - } - ], - "repository": { - "type": "git", - "url": "http://github.com/balupton/history.js.git" - }, - "dependencies": { - "buildr": "0.8.x" - }, - "engines": { - }, - "directories": { - "out": "./scripts/compressed", - "src": "./scripts/uncompressed" - } -} \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js deleted file mode 100755 index 8d4edcd2..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html4+html5/jquery.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js deleted file mode 100755 index e82ec7d9..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html4+html5/mootools.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js deleted file mode 100755 index 3d341662..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html4+html5/native.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js deleted file mode 100755 index 770b4657..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html4+html5/right.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js b/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js deleted file mode 100755 index c1e0baf9..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html4+html5/zepto.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js b/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js deleted file mode 100755 index 628d41d1..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html5/jquery.history.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js b/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js deleted file mode 100755 index 9213b325..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html5/mootools.history.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.MooTools,e=a.Element;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");Object.append(e.NativeEvents,{popstate:2,hashchange:2}),c.Adapter={bind:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.addEvent(b,c)},trigger:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.fireEvent(b,c)},extractEventData:function(a,c){var d=c&&c.event&&c.event[a]||c&&c[a]||b;return d},onDomLoad:function(b){a.addEvent("domready",b)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/native.history.js b/js/libraries/balupton-history/scripts/bundled/html5/native.history.js deleted file mode 100755 index c2f0153d..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html5/native.history.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{};if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={handlers:{},_uid:1,uid:function(a){return a._uid||(a._uid=c.Adapter._uid++)},bind:function(a,b,d){var e=c.Adapter.uid(a);c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[],c.Adapter.handlers[e][b].push(d),a["on"+b]=function(a,b){return function(d){c.Adapter.trigger(a,b,d)}}(a,b)},trigger:function(a,b,d){d=d||{};var e=c.Adapter.uid(a),f,g;c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[];for(f=0,g=c.Adapter.handlers[e][b].length;f")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/right.history.js b/js/libraries/balupton-history/scripts/bundled/html5/right.history.js deleted file mode 100755 index ebec1e47..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html5/right.history.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.document,e=a.RightJS,f=e.$;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){f(a).on(b,c)},trigger:function(a,b,c){f(a).fire(b,c)},extractEventData:function(a,c){var d=c&&c._&&c._[a]||b;return d},onDomLoad:function(a){f(d).onReady(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js b/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js deleted file mode 100755 index d00681e4..00000000 --- a/js/libraries/balupton-history/scripts/bundled/html5/zepto.history.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.Zepto;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){(new d(a)).bind(b,c)},trigger:function(a,b){(new d(a)).trigger(b)},extractEventData:function(a,c){var d=c&&c[a]||b;return d},onDomLoad:function(a){new d(a)}},typeof c.init!="undefined"&&c.init()})(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js deleted file mode 100755 index 4eb82aea..00000000 --- a/js/libraries/balupton-history/scripts/compressed/history.adapter.jquery.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js deleted file mode 100755 index 806937d0..00000000 --- a/js/libraries/balupton-history/scripts/compressed/history.adapter.mootools.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{},d=a.MooTools,e=a.Element;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");Object.append(e.NativeEvents,{popstate:2,hashchange:2}),c.Adapter={bind:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.addEvent(b,c)},trigger:function(a,b,c){var d=typeof a=="string"?document.id(a):a;d.fireEvent(b,c)},extractEventData:function(a,c){var d=c&&c.event&&c.event[a]||c&&c[a]||b;return d},onDomLoad:function(b){a.addEvent("domready",b)}},typeof c.init!="undefined"&&c.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js b/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js deleted file mode 100755 index 67ba7af2..00000000 --- a/js/libraries/balupton-history/scripts/compressed/history.adapter.native.js +++ /dev/null @@ -1 +0,0 @@ -(function(a,b){"use strict";var c=a.History=a.History||{};if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={handlers:{},_uid:1,uid:function(a){return a._uid||(a._uid=c.Adapter._uid++)},bind:function(a,b,d){var e=c.Adapter.uid(a);c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[],c.Adapter.handlers[e][b].push(d),a["on"+b]=function(a,b){return function(d){c.Adapter.trigger(a,b,d)}}(a,b)},trigger:function(a,b,d){d=d||{};var e=c.Adapter.uid(a),f,g;c.Adapter.handlers[e]=c.Adapter.handlers[e]||{},c.Adapter.handlers[e][b]=c.Adapter.handlers[e][b]||[];for(f=0,g=c.Adapter.handlers[e][b].length;f")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()})(window) \ No newline at end of file diff --git a/js/libraries/balupton-history/scripts/compressed/json2.js b/js/libraries/balupton-history/scripts/compressed/json2.js deleted file mode 100755 index 8ae5a757..00000000 --- a/js/libraries/balupton-history/scripts/compressed/json2.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -// Closure -(function(window,undefined){ - "use strict"; - - // Localise Globals - var - History = window.History = window.History||{}, - jQuery = window.jQuery; - - // Check Existence - if ( typeof History.Adapter !== 'undefined' ) { - throw new Error('History.js Adapter has already been loaded...'); - } - - // Add the Adapter - History.Adapter = { - /** - * History.Adapter.bind(el,event,callback) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @param {function} callback - * @return {void} - */ - bind: function(el,event,callback){ - jQuery(el).bind(event,callback); - }, - - /** - * History.Adapter.trigger(el,event) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @param {Object=} extra - a object of extra event data (optional) - * @return {void} - */ - trigger: function(el,event,extra){ - jQuery(el).trigger(event,extra); - }, - - /** - * History.Adapter.extractEventData(key,event,extra) - * @param {string} key - key for the event data to extract - * @param {string} event - custom and standard events - * @param {Object=} extra - a object of extra event data (optional) - * @return {mixed} - */ - extractEventData: function(key,event,extra){ - // jQuery Native then jQuery Custom - var result = (event && event.originalEvent && event.originalEvent[key]) || (extra && extra[key]) || undefined; - - // Return - return result; - }, - - /** - * History.Adapter.onDomLoad(callback) - * @param {function} callback - * @return {void} - */ - onDomLoad: function(callback) { - jQuery(callback); - } - }; - - // Try and Initialise History - if ( typeof History.init !== 'undefined' ) { - History.init(); - } - -})(window); - diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js deleted file mode 100755 index 404425c4..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.mootools.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * History.js MooTools Adapter - * @author Benjamin Arthur Lupton - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -// Closure -(function(window,undefined){ - "use strict"; - - // Localise Globals - var - History = window.History = window.History||{}, - MooTools = window.MooTools, - Element = window.Element; - - // Check Existence - if ( typeof History.Adapter !== 'undefined' ) { - throw new Error('History.js Adapter has already been loaded...'); - } - - // Make MooTools aware of History.js Events - Object.append(Element.NativeEvents,{ - 'popstate':2, - 'hashchange':2 - }); - - // Add the Adapter - History.Adapter = { - /** - * History.Adapter.bind(el,event,callback) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @param {function} callback - * @return {void} - */ - bind: function(el,event,callback){ - var El = typeof el === 'string' ? document.id(el) : el; - El.addEvent(event,callback); - }, - - /** - * History.Adapter.trigger(el,event) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @param {Object=} extra - a object of extra event data (optional) - * @return void - */ - trigger: function(el,event,extra){ - var El = typeof el === 'string' ? document.id(el) : el; - El.fireEvent(event,extra); - }, - - /** - * History.Adapter.extractEventData(key,event,extra) - * @param {string} key - key for the event data to extract - * @param {string} event - custom and standard events - * @return {mixed} - */ - extractEventData: function(key,event){ - // MooTools Native then MooTools Custom - var result = (event && event.event && event.event[key]) || (event && event[key]) || undefined; - - // Return - return result; - }, - - /** - * History.Adapter.onDomLoad(callback) - * @param {function} callback - * @return {void} - */ - onDomLoad: function(callback) { - window.addEvent('domready',callback); - } - }; - - // Try and Initialise History - if ( typeof History.init !== 'undefined' ) { - History.init(); - } - -})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js deleted file mode 100755 index 6797f1dd..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.native.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * History.js Native Adapter - * @author Benjamin Arthur Lupton - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -// Closure -(function(window,undefined){ - "use strict"; - - // Localise Globals - var History = window.History = window.History||{}; - - // Check Existence - if ( typeof History.Adapter !== 'undefined' ) { - throw new Error('History.js Adapter has already been loaded...'); - } - - // Add the Adapter - History.Adapter = { - /** - * History.Adapter.handlers[uid][eventName] = Array - */ - handlers: {}, - - /** - * History.Adapter._uid - * The current element unique identifier - */ - _uid: 1, - - /** - * History.Adapter.uid(element) - * @param {Element} element - * @return {String} uid - */ - uid: function(element){ - return element._uid || (element._uid = History.Adapter._uid++); - }, - - /** - * History.Adapter.bind(el,event,callback) - * @param {Element} element - * @param {String} eventName - custom and standard events - * @param {Function} callback - * @return - */ - bind: function(element,eventName,callback){ - // Prepare - var uid = History.Adapter.uid(element); - - // Apply Listener - History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; - History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; - History.Adapter.handlers[uid][eventName].push(callback); - - // Bind Global Listener - element['on'+eventName] = (function(element,eventName){ - return function(event){ - History.Adapter.trigger(element,eventName,event); - }; - })(element,eventName); - }, - - /** - * History.Adapter.trigger(el,event) - * @param {Element} element - * @param {String} eventName - custom and standard events - * @param {Object} event - a object of event data - * @return - */ - trigger: function(element,eventName,event){ - // Prepare - event = event || {}; - var uid = History.Adapter.uid(element), - i,n; - - // Apply Listener - History.Adapter.handlers[uid] = History.Adapter.handlers[uid] || {}; - History.Adapter.handlers[uid][eventName] = History.Adapter.handlers[uid][eventName] || []; - - // Fire Listeners - for ( i=0,n=History.Adapter.handlers[uid][eventName].length; i - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -// Closure -(function(window,undefined){ - "use strict"; - - // Localise Globals - var - History = window.History = window.History||{}, - document = window.document, - RightJS = window.RightJS, - $ = RightJS.$; - - // Check Existence - if ( typeof History.Adapter !== 'undefined' ) { - throw new Error('History.js Adapter has already been loaded...'); - } - - // Add the Adapter - History.Adapter = { - /** - * History.Adapter.bind(el,event,callback) - * @param {Element|Selector} el - * @param {String} event - custom and standard events - * @param {Function} callback - * @return - */ - bind: function(el,event,callback){ - $(el).on(event,callback); - }, - - /** - * History.Adapter.trigger(el,event) - * @param {Element|Selector} el - * @param {String} event - custom and standard events - * @param {Object} extraEventData - a object of extra event data - * @return - */ - trigger: function(el,event,extraEventData){ - $(el).fire(event,extraEventData); - }, - - /** - * History.Adapter.extractEventData(key,event,extra) - * @param {String} key - key for the event data to extract - * @param {String} event - custom and standard events - * @return {mixed} - */ - extractEventData: function(key,event){ - // Right.js Native - // Right.js Custom - var result = (event && event._ && event._[key]) || undefined; - - // Return - return result; - }, - - /** - * History.Adapter.onDomLoad(callback) - * @param {Function} callback - * @return - */ - onDomLoad: function(callback) { - $(document).onReady(callback); - } - }; - - // Try and Initialise History - if ( typeof History.init !== 'undefined' ) { - History.init(); - } - -})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js b/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js deleted file mode 100755 index f1295f9d..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/history.adapter.zepto.js +++ /dev/null @@ -1,74 +0,0 @@ -/** - * History.js Zepto Adapter - * @author Benjamin Arthur Lupton - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -// Closure -(function(window,undefined){ - "use strict"; - - // Localise Globals - var - History = window.History = window.History||{}, - Zepto = window.Zepto; - - // Check Existence - if ( typeof History.Adapter !== 'undefined' ) { - throw new Error('History.js Adapter has already been loaded...'); - } - - // Add the Adapter - History.Adapter = { - /** - * History.Adapter.bind(el,event,callback) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @param {function} callback - * @return {void} - */ - bind: function(el,event,callback){ - new Zepto(el).bind(event,callback); - }, - - /** - * History.Adapter.trigger(el,event) - * @param {Element|string} el - * @param {string} event - custom and standard events - * @return {void} - */ - trigger: function(el,event){ - new Zepto(el).trigger(event); - }, - - /** - * History.Adapter.extractEventData(key,event,extra) - * @param {string} key - key for the event data to extract - * @param {string} event - custom and standard events - * @return {mixed} - */ - extractEventData: function(key,event){ - // Zepto Native - var result = (event && event[key]) || undefined; - - // Return - return result; - }, - - /** - * History.Adapter.onDomLoad(callback) - * @param {function} callback - * @return {void} - */ - onDomLoad: function(callback) { - new Zepto(callback); - } - }; - - // Try and Initialise History - if ( typeof History.init !== 'undefined' ) { - History.init(); - } - -})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.html4.js b/js/libraries/balupton-history/scripts/uncompressed/history.html4.js deleted file mode 100755 index 6d8d4274..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/history.html4.js +++ /dev/null @@ -1,621 +0,0 @@ -/** - * History.js HTML4 Support - * Depends on the HTML5 Support - * @author Benjamin Arthur Lupton - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -(function(window,undefined){ - "use strict"; - - // ======================================================================== - // Initialise - - // Localise Globals - var - document = window.document, // Make sure we are using the correct document - setTimeout = window.setTimeout||setTimeout, - clearTimeout = window.clearTimeout||clearTimeout, - setInterval = window.setInterval||setInterval, - History = window.History = window.History||{}; // Public History Object - - // Check Existence - if ( typeof History.initHtml4 !== 'undefined' ) { - throw new Error('History.js HTML4 Support has already been loaded...'); - } - - - // ======================================================================== - // Initialise HTML4 Support - - // Initialise HTML4 Support - History.initHtml4 = function(){ - // Initialise - if ( typeof History.initHtml4.initialized !== 'undefined' ) { - // Already Loaded - return false; - } - else { - History.initHtml4.initialized = true; - } - - - // ==================================================================== - // Properties - - /** - * History.enabled - * Is History enabled? - */ - History.enabled = true; - - - // ==================================================================== - // Hash Storage - - /** - * History.savedHashes - * Store the hashes in an array - */ - History.savedHashes = []; - - /** - * History.isLastHash(newHash) - * Checks if the hash is the last hash - * @param {string} newHash - * @return {boolean} true - */ - History.isLastHash = function(newHash){ - // Prepare - var oldHash = History.getHashByIndex(), - isLast; - - // Check - isLast = newHash === oldHash; - - // Return isLast - return isLast; - }; - - /** - * History.saveHash(newHash) - * Push a Hash - * @param {string} newHash - * @return {boolean} true - */ - History.saveHash = function(newHash){ - // Check Hash - if ( History.isLastHash(newHash) ) { - return false; - } - - // Push the Hash - History.savedHashes.push(newHash); - - // Return true - return true; - }; - - /** - * History.getHashByIndex() - * Gets a hash by the index - * @param {integer} index - * @return {string} - */ - History.getHashByIndex = function(index){ - // Prepare - var hash = null; - - // Handle - if ( typeof index === 'undefined' ) { - // Get the last inserted - hash = History.savedHashes[History.savedHashes.length-1]; - } - else if ( index < 0 ) { - // Get from the end - hash = History.savedHashes[History.savedHashes.length+index]; - } - else { - // Get from the beginning - hash = History.savedHashes[index]; - } - - // Return hash - return hash; - }; - - - // ==================================================================== - // Discarded States - - /** - * History.discardedHashes - * A hashed array of discarded hashes - */ - History.discardedHashes = {}; - - /** - * History.discardedStates - * A hashed array of discarded states - */ - History.discardedStates = {}; - - /** - * History.discardState(State) - * Discards the state by ignoring it through History - * @param {object} State - * @return {true} - */ - History.discardState = function(discardedState,forwardState,backState){ - //History.debug('History.discardState', arguments); - // Prepare - var discardedStateHash = History.getHashByState(discardedState), - discardObject; - - // Create Discard Object - discardObject = { - 'discardedState': discardedState, - 'backState': backState, - 'forwardState': forwardState - }; - - // Add to DiscardedStates - History.discardedStates[discardedStateHash] = discardObject; - - // Return true - return true; - }; - - /** - * History.discardHash(hash) - * Discards the hash by ignoring it through History - * @param {string} hash - * @return {true} - */ - History.discardHash = function(discardedHash,forwardState,backState){ - //History.debug('History.discardState', arguments); - // Create Discard Object - var discardObject = { - 'discardedHash': discardedHash, - 'backState': backState, - 'forwardState': forwardState - }; - - // Add to discardedHash - History.discardedHashes[discardedHash] = discardObject; - - // Return true - return true; - }; - - /** - * History.discardState(State) - * Checks to see if the state is discarded - * @param {object} State - * @return {bool} - */ - History.discardedState = function(State){ - // Prepare - var StateHash = History.getHashByState(State), - discarded; - - // Check - discarded = History.discardedStates[StateHash]||false; - - // Return true - return discarded; - }; - - /** - * History.discardedHash(hash) - * Checks to see if the state is discarded - * @param {string} State - * @return {bool} - */ - History.discardedHash = function(hash){ - // Check - var discarded = History.discardedHashes[hash]||false; - - // Return true - return discarded; - }; - - /** - * History.recycleState(State) - * Allows a discarded state to be used again - * @param {object} data - * @param {string} title - * @param {string} url - * @return {true} - */ - History.recycleState = function(State){ - //History.debug('History.recycleState', arguments); - // Prepare - var StateHash = History.getHashByState(State); - - // Remove from DiscardedStates - if ( History.discardedState(State) ) { - delete History.discardedStates[StateHash]; - } - - // Return true - return true; - }; - - - // ==================================================================== - // HTML4 HashChange Support - - if ( History.emulated.hashChange ) { - /* - * We must emulate the HTML4 HashChange Support by manually checking for hash changes - */ - - /** - * History.hashChangeInit() - * Init the HashChange Emulation - */ - History.hashChangeInit = function(){ - // Define our Checker Function - History.checkerFunction = null; - - // Define some variables that will help in our checker function - var lastDocumentHash = '', - iframeId, iframe, - lastIframeHash, checkerRunning; - - // Handle depending on the browser - if ( History.isInternetExplorer() ) { - // IE6 and IE7 - // We need to use an iframe to emulate the back and forward buttons - - // Create iFrame - iframeId = 'historyjs-iframe'; - iframe = document.createElement('iframe'); - - // Adjust iFarme - iframe.setAttribute('id', iframeId); - iframe.style.display = 'none'; - - // Append iFrame - document.body.appendChild(iframe); - - // Create initial history entry - iframe.contentWindow.document.open(); - iframe.contentWindow.document.close(); - - // Define some variables that will help in our checker function - lastIframeHash = ''; - checkerRunning = false; - - // Define the checker function - History.checkerFunction = function(){ - // Check Running - if ( checkerRunning ) { - return false; - } - - // Update Running - checkerRunning = true; - - // Fetch - var documentHash = History.getHash()||'', - iframeHash = History.unescapeHash(iframe.contentWindow.document.location.hash)||''; - - // The Document Hash has changed (application caused) - if ( documentHash !== lastDocumentHash ) { - // Equalise - lastDocumentHash = documentHash; - - // Create a history entry in the iframe - if ( iframeHash !== documentHash ) { - //History.debug('hashchange.checker: iframe hash change', 'documentHash (new):', documentHash, 'iframeHash (old):', iframeHash); - - // Equalise - lastIframeHash = iframeHash = documentHash; - - // Create History Entry - iframe.contentWindow.document.open(); - iframe.contentWindow.document.close(); - - // Update the iframe's hash - iframe.contentWindow.document.location.hash = History.escapeHash(documentHash); - } - - // Trigger Hashchange Event - History.Adapter.trigger(window,'hashchange'); - } - - // The iFrame Hash has changed (back button caused) - else if ( iframeHash !== lastIframeHash ) { - //History.debug('hashchange.checker: iframe hash out of sync', 'iframeHash (new):', iframeHash, 'documentHash (old):', documentHash); - - // Equalise - lastIframeHash = iframeHash; - - // Update the Hash - History.setHash(iframeHash,false); - } - - // Reset Running - checkerRunning = false; - - // Return true - return true; - }; - } - else { - // We are not IE - // Firefox 1 or 2, Opera - - // Define the checker function - History.checkerFunction = function(){ - // Prepare - var documentHash = History.getHash(); - - // The Document Hash has changed (application caused) - if ( documentHash !== lastDocumentHash ) { - // Equalise - lastDocumentHash = documentHash; - - // Trigger Hashchange Event - History.Adapter.trigger(window,'hashchange'); - } - - // Return true - return true; - }; - } - - // Apply the checker function - History.intervalList.push(setInterval(History.checkerFunction, History.options.hashChangeInterval)); - - // Done - return true; - }; // History.hashChangeInit - - // Bind hashChangeInit - History.Adapter.onDomLoad(History.hashChangeInit); - - } // History.emulated.hashChange - - - // ==================================================================== - // HTML5 State Support - - // Non-Native pushState Implementation - if ( History.emulated.pushState ) { - /* - * We must emulate the HTML5 State Management by using HTML4 HashChange - */ - - /** - * History.onHashChange(event) - * Trigger HTML5's window.onpopstate via HTML4 HashChange Support - */ - History.onHashChange = function(event){ - //History.debug('History.onHashChange', arguments); - - // Prepare - var currentUrl = ((event && event.newURL) || document.location.href), - currentHash = History.getHashByUrl(currentUrl), - currentState = null, - currentStateHash = null, - currentStateHashExits = null, - discardObject; - - // Check if we are the same state - if ( History.isLastHash(currentHash) ) { - // There has been no change (just the page's hash has finally propagated) - //History.debug('History.onHashChange: no change'); - History.busy(false); - return false; - } - - // Reset the double check - History.doubleCheckComplete(); - - // Store our location for use in detecting back/forward direction - History.saveHash(currentHash); - - // Expand Hash - if ( currentHash && History.isTraditionalAnchor(currentHash) ) { - //History.debug('History.onHashChange: traditional anchor', currentHash); - // Traditional Anchor Hash - History.Adapter.trigger(window,'anchorchange'); - History.busy(false); - return false; - } - - // Create State - currentState = History.extractState(History.getFullUrl(currentHash||document.location.href,false),true); - - // Check if we are the same state - if ( History.isLastSavedState(currentState) ) { - //History.debug('History.onHashChange: no change'); - // There has been no change (just the page's hash has finally propagated) - History.busy(false); - return false; - } - - // Create the state Hash - currentStateHash = History.getHashByState(currentState); - - // Check if we are DiscardedState - discardObject = History.discardedState(currentState); - if ( discardObject ) { - // Ignore this state as it has been discarded and go back to the state before it - if ( History.getHashByIndex(-2) === History.getHashByState(discardObject.forwardState) ) { - // We are going backwards - //History.debug('History.onHashChange: go backwards'); - History.back(false); - } else { - // We are going forwards - //History.debug('History.onHashChange: go forwards'); - History.forward(false); - } - return false; - } - - // Push the new HTML5 State - //History.debug('History.onHashChange: success hashchange'); - History.pushState(currentState.data,currentState.title,currentState.url,false); - - // End onHashChange closure - return true; - }; - History.Adapter.bind(window,'hashchange',History.onHashChange); - - /** - * History.pushState(data,title,url) - * Add a new State to the history object, become it, and trigger onpopstate - * We have to trigger for HTML4 compatibility - * @param {object} data - * @param {string} title - * @param {string} url - * @return {true} - */ - History.pushState = function(data,title,url,queue){ - //History.debug('History.pushState: called', arguments); - - // Check the State - if ( History.getHashByUrl(url) ) { - throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); - } - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.pushState: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.pushState, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy - History.busy(true); - - // Fetch the State Object - var newState = History.createStateObject(data,title,url), - newStateHash = History.getHashByState(newState), - oldState = History.getState(false), - oldStateHash = History.getHashByState(oldState), - html4Hash = History.getHash(); - - // Store the newState - History.storeState(newState); - History.expectedStateId = newState.id; - - // Recycle the State - History.recycleState(newState); - - // Force update of the title - History.setTitle(newState); - - // Check if we are the same State - if ( newStateHash === oldStateHash ) { - //History.debug('History.pushState: no change', newStateHash); - History.busy(false); - return false; - } - - // Update HTML4 Hash - if ( newStateHash !== html4Hash && newStateHash !== History.getShortUrl(document.location.href) ) { - //History.debug('History.pushState: update hash', newStateHash, html4Hash); - History.setHash(newStateHash,false); - return false; - } - - // Update HTML5 State - History.saveState(newState); - - // Fire HTML5 Event - //History.debug('History.pushState: trigger popstate'); - History.Adapter.trigger(window,'statechange'); - History.busy(false); - - // End pushState closure - return true; - }; - - /** - * History.replaceState(data,title,url) - * Replace the State and trigger onpopstate - * We have to trigger for HTML4 compatibility - * @param {object} data - * @param {string} title - * @param {string} url - * @return {true} - */ - History.replaceState = function(data,title,url,queue){ - //History.debug('History.replaceState: called', arguments); - - // Check the State - if ( History.getHashByUrl(url) ) { - throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); - } - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.replaceState: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.replaceState, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy - History.busy(true); - - // Fetch the State Objects - var newState = History.createStateObject(data,title,url), - oldState = History.getState(false), - previousState = History.getStateByIndex(-2); - - // Discard Old State - History.discardState(oldState,newState,previousState); - - // Alias to PushState - History.pushState(newState.data,newState.title,newState.url,false); - - // End replaceState closure - return true; - }; - - } // History.emulated.pushState - - - - // ==================================================================== - // Initialise - - // Non-Native pushState Implementation - if ( History.emulated.pushState ) { - /** - * Ensure initial state is handled correctly - */ - if ( History.getHash() && !History.emulated.hashChange ) { - History.Adapter.onDomLoad(function(){ - History.Adapter.trigger(window,'hashchange'); - }); - } - - } // History.emulated.pushState - - }; // History.initHtml4 - - // Try and Initialise History - if ( typeof History.init !== 'undefined' ) { - History.init(); - } - -})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/history.js b/js/libraries/balupton-history/scripts/uncompressed/history.js deleted file mode 100755 index 0e7cb1ec..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/history.js +++ /dev/null @@ -1,1943 +0,0 @@ -/** - * History.js Core - * @author Benjamin Arthur Lupton - * @copyright 2010-2011 Benjamin Arthur Lupton - * @license New BSD License - */ - -(function(window,undefined){ - "use strict"; - - // ======================================================================== - // Initialise - - // Localise Globals - var - console = window.console||undefined, // Prevent a JSLint complain - document = window.document, // Make sure we are using the correct document - navigator = window.navigator, // Make sure we are using the correct navigator - sessionStorage = window.sessionStorage||false, // sessionStorage - setTimeout = window.setTimeout, - clearTimeout = window.clearTimeout, - setInterval = window.setInterval, - clearInterval = window.clearInterval, - JSON = window.JSON, - alert = window.alert, - History = window.History = window.History||{}, // Public History Object - history = window.history; // Old History Object - - // MooTools Compatibility - JSON.stringify = JSON.stringify||JSON.encode; - JSON.parse = JSON.parse||JSON.decode; - - // Check Existence - if ( typeof History.init !== 'undefined' ) { - throw new Error('History.js Core has already been loaded...'); - } - - // Initialise History - History.init = function(){ - // Check Load Status of Adapter - if ( typeof History.Adapter === 'undefined' ) { - return false; - } - - // Check Load Status of Core - if ( typeof History.initCore !== 'undefined' ) { - History.initCore(); - } - - // Check Load Status of HTML4 Support - if ( typeof History.initHtml4 !== 'undefined' ) { - History.initHtml4(); - } - - // Return true - return true; - }; - - - // ======================================================================== - // Initialise Core - - // Initialise Core - History.initCore = function(){ - // Initialise - if ( typeof History.initCore.initialized !== 'undefined' ) { - // Already Loaded - return false; - } - else { - History.initCore.initialized = true; - } - - - // ==================================================================== - // Options - - /** - * History.options - * Configurable options - */ - History.options = History.options||{}; - - /** - * History.options.hashChangeInterval - * How long should the interval be before hashchange checks - */ - History.options.hashChangeInterval = History.options.hashChangeInterval || 100; - - /** - * History.options.safariPollInterval - * How long should the interval be before safari poll checks - */ - History.options.safariPollInterval = History.options.safariPollInterval || 500; - - /** - * History.options.doubleCheckInterval - * How long should the interval be before we perform a double check - */ - History.options.doubleCheckInterval = History.options.doubleCheckInterval || 500; - - /** - * History.options.storeInterval - * How long should we wait between store calls - */ - History.options.storeInterval = History.options.storeInterval || 1000; - - /** - * History.options.busyDelay - * How long should we wait between busy events - */ - History.options.busyDelay = History.options.busyDelay || 250; - - /** - * History.options.debug - * If true will enable debug messages to be logged - */ - History.options.debug = History.options.debug || false; - - /** - * History.options.initialTitle - * What is the title of the initial state - */ - History.options.initialTitle = History.options.initialTitle || document.title; - - - // ==================================================================== - // Interval record - - /** - * History.intervalList - * List of intervals set, to be cleared when document is unloaded. - */ - History.intervalList = []; - - /** - * History.clearAllIntervals - * Clears all setInterval instances. - */ - History.clearAllIntervals = function(){ - var i, il = History.intervalList; - if (typeof il !== "undefined" && il !== null) { - for (i = 0; i < il.length; i++) { - clearInterval(il[i]); - } - History.intervalList = null; - } - }; - - - // ==================================================================== - // Debug - - /** - * History.debug(message,...) - * Logs the passed arguments if debug enabled - */ - History.debug = function(){ - if ( (History.options.debug||false) ) { - History.log.apply(History,arguments); - } - }; - - /** - * History.log(message,...) - * Logs the passed arguments - */ - History.log = function(){ - // Prepare - var - consoleExists = !(typeof console === 'undefined' || typeof console.log === 'undefined' || typeof console.log.apply === 'undefined'), - textarea = document.getElementById('log'), - message, - i,n, - args,arg - ; - - // Write to Console - if ( consoleExists ) { - args = Array.prototype.slice.call(arguments); - message = args.shift(); - if ( typeof console.debug !== 'undefined' ) { - console.debug.apply(console,[message,args]); - } - else { - console.log.apply(console,[message,args]); - } - } - else { - message = ("\n"+arguments[0]+"\n"); - } - - // Write to log - for ( i=1,n=arguments.length; i - * @author James Padolsey - */ - History.getInternetExplorerMajorVersion = function(){ - var result = History.getInternetExplorerMajorVersion.cached = - (typeof History.getInternetExplorerMajorVersion.cached !== 'undefined') - ? History.getInternetExplorerMajorVersion.cached - : (function(){ - var v = 3, - div = document.createElement('div'), - all = div.getElementsByTagName('i'); - while ( (div.innerHTML = '') && all[0] ) {} - return (v > 4) ? v : false; - })() - ; - return result; - }; - - /** - * History.isInternetExplorer() - * Are we using Internet Explorer? - * @return {boolean} - * @license Public Domain - * @author Benjamin Arthur Lupton - */ - History.isInternetExplorer = function(){ - var result = - History.isInternetExplorer.cached = - (typeof History.isInternetExplorer.cached !== 'undefined') - ? History.isInternetExplorer.cached - : Boolean(History.getInternetExplorerMajorVersion()) - ; - return result; - }; - - /** - * History.emulated - * Which features require emulating? - */ - History.emulated = { - pushState: !Boolean( - window.history && window.history.pushState && window.history.replaceState - && !( - (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent) /* disable for versions of iOS before version 4.3 (8F190) */ - || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent) /* disable for the mercury iOS browser, or at least older versions of the webkit engine */ - ) - ), - hashChange: Boolean( - !(('onhashchange' in window) || ('onhashchange' in document)) - || - (History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8) - ) - }; - - /** - * History.enabled - * Is History enabled? - */ - History.enabled = !History.emulated.pushState; - - /** - * History.bugs - * Which bugs are present - */ - History.bugs = { - /** - * Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call - * https://bugs.webkit.org/show_bug.cgi?id=56249 - */ - setHash: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)), - - /** - * Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions - * https://bugs.webkit.org/show_bug.cgi?id=42940 - */ - safariPoll: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)), - - /** - * MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function) - */ - ieDoubleCheck: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8), - - /** - * MSIE 6 requires the entire hash to be encoded for the hashes to trigger the onHashChange event - */ - hashEscape: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 7) - }; - - /** - * History.isEmptyObject(obj) - * Checks to see if the Object is Empty - * @param {Object} obj - * @return {boolean} - */ - History.isEmptyObject = function(obj) { - for ( var name in obj ) { - return false; - } - return true; - }; - - /** - * History.cloneObject(obj) - * Clones a object and eliminate all references to the original contexts - * @param {Object} obj - * @return {Object} - */ - History.cloneObject = function(obj) { - var hash,newObj; - if ( obj ) { - hash = JSON.stringify(obj); - newObj = JSON.parse(hash); - } - else { - newObj = {}; - } - return newObj; - }; - - - // ==================================================================== - // URL Helpers - - /** - * History.getRootUrl() - * Turns "http://mysite.com/dir/page.html?asd" into "http://mysite.com" - * @return {String} rootUrl - */ - History.getRootUrl = function(){ - // Create - var rootUrl = document.location.protocol+'//'+(document.location.hostname||document.location.host); - if ( document.location.port||false ) { - rootUrl += ':'+document.location.port; - } - rootUrl += '/'; - - // Return - return rootUrl; - }; - - /** - * History.getBaseHref() - * Fetches the `href` attribute of the `` element if it exists - * @return {String} baseHref - */ - History.getBaseHref = function(){ - // Create - var - baseElements = document.getElementsByTagName('base'), - baseElement = null, - baseHref = ''; - - // Test for Base Element - if ( baseElements.length === 1 ) { - // Prepare for Base Element - baseElement = baseElements[0]; - baseHref = baseElement.href.replace(/[^\/]+$/,''); - } - - // Adjust trailing slash - baseHref = baseHref.replace(/\/+$/,''); - if ( baseHref ) baseHref += '/'; - - // Return - return baseHref; - }; - - /** - * History.getBaseUrl() - * Fetches the baseHref or basePageUrl or rootUrl (whichever one exists first) - * @return {String} baseUrl - */ - History.getBaseUrl = function(){ - // Create - var baseUrl = History.getBaseHref()||History.getBasePageUrl()||History.getRootUrl(); - - // Return - return baseUrl; - }; - - /** - * History.getPageUrl() - * Fetches the URL of the current page - * @return {String} pageUrl - */ - History.getPageUrl = function(){ - // Fetch - var - State = History.getState(false,false), - stateUrl = (State||{}).url||document.location.href, - pageUrl; - - // Create - pageUrl = stateUrl.replace(/\/+$/,'').replace(/[^\/]+$/,function(part,index,string){ - return (/\./).test(part) ? part : part+'/'; - }); - - // Return - return pageUrl; - }; - - /** - * History.getBasePageUrl() - * Fetches the Url of the directory of the current page - * @return {String} basePageUrl - */ - History.getBasePageUrl = function(){ - // Create - var basePageUrl = document.location.href.replace(/[#\?].*/,'').replace(/[^\/]+$/,function(part,index,string){ - return (/[^\/]$/).test(part) ? '' : part; - }).replace(/\/+$/,'')+'/'; - - // Return - return basePageUrl; - }; - - /** - * History.getFullUrl(url) - * Ensures that we have an absolute URL and not a relative URL - * @param {string} url - * @param {Boolean} allowBaseHref - * @return {string} fullUrl - */ - History.getFullUrl = function(url,allowBaseHref){ - // Prepare - var fullUrl = url, firstChar = url.substring(0,1); - allowBaseHref = (typeof allowBaseHref === 'undefined') ? true : allowBaseHref; - - // Check - if ( /[a-z]+\:\/\//.test(url) ) { - // Full URL - } - else if ( firstChar === '/' ) { - // Root URL - fullUrl = History.getRootUrl()+url.replace(/^\/+/,''); - } - else if ( firstChar === '#' ) { - // Anchor URL - fullUrl = History.getPageUrl().replace(/#.*/,'')+url; - } - else if ( firstChar === '?' ) { - // Query URL - fullUrl = History.getPageUrl().replace(/[\?#].*/,'')+url; - } - else { - // Relative URL - if ( allowBaseHref ) { - fullUrl = History.getBaseUrl()+url.replace(/^(\.\/)+/,''); - } else { - fullUrl = History.getBasePageUrl()+url.replace(/^(\.\/)+/,''); - } - // We have an if condition above as we do not want hashes - // which are relative to the baseHref in our URLs - // as if the baseHref changes, then all our bookmarks - // would now point to different locations - // whereas the basePageUrl will always stay the same - } - - // Return - return fullUrl.replace(/\#$/,''); - }; - - /** - * History.getShortUrl(url) - * Ensures that we have a relative URL and not a absolute URL - * @param {string} url - * @return {string} url - */ - History.getShortUrl = function(url){ - // Prepare - var shortUrl = url, baseUrl = History.getBaseUrl(), rootUrl = History.getRootUrl(); - - // Trim baseUrl - if ( History.emulated.pushState ) { - // We are in a if statement as when pushState is not emulated - // The actual url these short urls are relative to can change - // So within the same session, we the url may end up somewhere different - shortUrl = shortUrl.replace(baseUrl,''); - } - - // Trim rootUrl - shortUrl = shortUrl.replace(rootUrl,'/'); - - // Ensure we can still detect it as a state - if ( History.isTraditionalAnchor(shortUrl) ) { - shortUrl = './'+shortUrl; - } - - // Clean It - shortUrl = shortUrl.replace(/^(\.\/)+/g,'./').replace(/\#$/,''); - - // Return - return shortUrl; - }; - - - // ==================================================================== - // State Storage - - /** - * History.store - * The store for all session specific data - */ - History.store = {}; - - /** - * History.idToState - * 1-1: State ID to State Object - */ - History.idToState = History.idToState||{}; - - /** - * History.stateToId - * 1-1: State String to State ID - */ - History.stateToId = History.stateToId||{}; - - /** - * History.urlToId - * 1-1: State URL to State ID - */ - History.urlToId = History.urlToId||{}; - - /** - * History.storedStates - * Store the states in an array - */ - History.storedStates = History.storedStates||[]; - - /** - * History.savedStates - * Saved the states in an array - */ - History.savedStates = History.savedStates||[]; - - /** - * History.noramlizeStore() - * Noramlize the store by adding necessary values - */ - History.normalizeStore = function(){ - History.store.idToState = History.store.idToState||{}; - History.store.urlToId = History.store.urlToId||{}; - History.store.stateToId = History.store.stateToId||{}; - }; - - /** - * History.getState() - * Get an object containing the data, title and url of the current state - * @param {Boolean} friendly - * @param {Boolean} create - * @return {Object} State - */ - History.getState = function(friendly,create){ - // Prepare - if ( typeof friendly === 'undefined' ) { friendly = true; } - if ( typeof create === 'undefined' ) { create = true; } - - // Fetch - var State = History.getLastSavedState(); - - // Create - if ( !State && create ) { - State = History.createStateObject(); - } - - // Adjust - if ( friendly ) { - State = History.cloneObject(State); - State.url = State.cleanUrl||State.url; - } - - // Return - return State; - }; - - /** - * History.getIdByState(State) - * Gets a ID for a State - * @param {State} newState - * @return {String} id - */ - History.getIdByState = function(newState){ - - // Fetch ID - var id = History.extractId(newState.url), - str; - - if ( !id ) { - // Find ID via State String - str = History.getStateString(newState); - if ( typeof History.stateToId[str] !== 'undefined' ) { - id = History.stateToId[str]; - } - else if ( typeof History.store.stateToId[str] !== 'undefined' ) { - id = History.store.stateToId[str]; - } - else { - // Generate a new ID - while ( true ) { - id = (new Date()).getTime() + String(Math.random()).replace(/\D/g,''); - if ( typeof History.idToState[id] === 'undefined' && typeof History.store.idToState[id] === 'undefined' ) { - break; - } - } - - // Apply the new State to the ID - History.stateToId[str] = id; - History.idToState[id] = newState; - } - } - - // Return ID - return id; - }; - - /** - * History.normalizeState(State) - * Expands a State Object - * @param {object} State - * @return {object} - */ - History.normalizeState = function(oldState){ - // Variables - var newState, dataNotEmpty; - - // Prepare - if ( !oldState || (typeof oldState !== 'object') ) { - oldState = {}; - } - - // Check - if ( typeof oldState.normalized !== 'undefined' ) { - return oldState; - } - - // Adjust - if ( !oldState.data || (typeof oldState.data !== 'object') ) { - oldState.data = {}; - } - - // ---------------------------------------------------------------- - - // Create - newState = {}; - newState.normalized = true; - newState.title = oldState.title||''; - newState.url = History.getFullUrl(History.unescapeString(oldState.url||document.location.href)); - newState.hash = History.getShortUrl(newState.url); - newState.data = History.cloneObject(oldState.data); - - // Fetch ID - newState.id = History.getIdByState(newState); - - // ---------------------------------------------------------------- - - // Clean the URL - newState.cleanUrl = newState.url.replace(/\??\&_suid.*/,''); - newState.url = newState.cleanUrl; - - // Check to see if we have more than just a url - dataNotEmpty = !History.isEmptyObject(newState.data); - - // Apply - if ( newState.title || dataNotEmpty ) { - // Add ID to Hash - newState.hash = History.getShortUrl(newState.url).replace(/\??\&_suid.*/,''); - if ( !/\?/.test(newState.hash) ) { - newState.hash += '?'; - } - newState.hash += '&_suid='+newState.id; - } - - // Create the Hashed URL - newState.hashedUrl = History.getFullUrl(newState.hash); - - // ---------------------------------------------------------------- - - // Update the URL if we have a duplicate - if ( (History.emulated.pushState || History.bugs.safariPoll) && History.hasUrlDuplicate(newState) ) { - newState.url = newState.hashedUrl; - } - - // ---------------------------------------------------------------- - - // Return - return newState; - }; - - /** - * History.createStateObject(data,title,url) - * Creates a object based on the data, title and url state params - * @param {object} data - * @param {string} title - * @param {string} url - * @return {object} - */ - History.createStateObject = function(data,title,url){ - // Hashify - var State = { - 'data': data, - 'title': title, - 'url': url - }; - - // Expand the State - State = History.normalizeState(State); - - // Return object - return State; - }; - - /** - * History.getStateById(id) - * Get a state by it's UID - * @param {String} id - */ - History.getStateById = function(id){ - // Prepare - id = String(id); - - // Retrieve - var State = History.idToState[id] || History.store.idToState[id] || undefined; - - // Return State - return State; - }; - - /** - * Get a State's String - * @param {State} passedState - */ - History.getStateString = function(passedState){ - // Prepare - var State, cleanedState, str; - - // Fetch - State = History.normalizeState(passedState); - - // Clean - cleanedState = { - data: State.data, - title: passedState.title, - url: passedState.url - }; - - // Fetch - str = JSON.stringify(cleanedState); - - // Return - return str; - }; - - /** - * Get a State's ID - * @param {State} passedState - * @return {String} id - */ - History.getStateId = function(passedState){ - // Prepare - var State, id; - - // Fetch - State = History.normalizeState(passedState); - - // Fetch - id = State.id; - - // Return - return id; - }; - - /** - * History.getHashByState(State) - * Creates a Hash for the State Object - * @param {State} passedState - * @return {String} hash - */ - History.getHashByState = function(passedState){ - // Prepare - var State, hash; - - // Fetch - State = History.normalizeState(passedState); - - // Hash - hash = State.hash; - - // Return - return hash; - }; - - /** - * History.extractId(url_or_hash) - * Get a State ID by it's URL or Hash - * @param {string} url_or_hash - * @return {string} id - */ - History.extractId = function ( url_or_hash ) { - // Prepare - var id,parts,url; - - // Extract - parts = /(.*)\&_suid=([0-9]+)$/.exec(url_or_hash); - url = parts ? (parts[1]||url_or_hash) : url_or_hash; - id = parts ? String(parts[2]||'') : ''; - - // Return - return id||false; - }; - - /** - * History.isTraditionalAnchor - * Checks to see if the url is a traditional anchor or not - * @param {String} url_or_hash - * @return {Boolean} - */ - History.isTraditionalAnchor = function(url_or_hash){ - // Check - var isTraditional = !(/[\/\?\.]/.test(url_or_hash)); - - // Return - return isTraditional; - }; - - /** - * History.extractState - * Get a State by it's URL or Hash - * @param {String} url_or_hash - * @return {State|null} - */ - History.extractState = function(url_or_hash,create){ - // Prepare - var State = null, id, url; - create = create||false; - - // Fetch SUID - id = History.extractId(url_or_hash); - if ( id ) { - State = History.getStateById(id); - } - - // Fetch SUID returned no State - if ( !State ) { - // Fetch URL - url = History.getFullUrl(url_or_hash); - - // Check URL - id = History.getIdByUrl(url)||false; - if ( id ) { - State = History.getStateById(id); - } - - // Create State - if ( !State && create && !History.isTraditionalAnchor(url_or_hash) ) { - State = History.createStateObject(null,null,url); - } - } - - // Return - return State; - }; - - /** - * History.getIdByUrl() - * Get a State ID by a State URL - */ - History.getIdByUrl = function(url){ - // Fetch - var id = History.urlToId[url] || History.store.urlToId[url] || undefined; - - // Return - return id; - }; - - /** - * History.getLastSavedState() - * Get an object containing the data, title and url of the current state - * @return {Object} State - */ - History.getLastSavedState = function(){ - return History.savedStates[History.savedStates.length-1]||undefined; - }; - - /** - * History.getLastStoredState() - * Get an object containing the data, title and url of the current state - * @return {Object} State - */ - History.getLastStoredState = function(){ - return History.storedStates[History.storedStates.length-1]||undefined; - }; - - /** - * History.hasUrlDuplicate - * Checks if a Url will have a url conflict - * @param {Object} newState - * @return {Boolean} hasDuplicate - */ - History.hasUrlDuplicate = function(newState) { - // Prepare - var hasDuplicate = false, - oldState; - - // Fetch - oldState = History.extractState(newState.url); - - // Check - hasDuplicate = oldState && oldState.id !== newState.id; - - // Return - return hasDuplicate; - }; - - /** - * History.storeState - * Store a State - * @param {Object} newState - * @return {Object} newState - */ - History.storeState = function(newState){ - // Store the State - History.urlToId[newState.url] = newState.id; - - // Push the State - History.storedStates.push(History.cloneObject(newState)); - - // Return newState - return newState; - }; - - /** - * History.isLastSavedState(newState) - * Tests to see if the state is the last state - * @param {Object} newState - * @return {boolean} isLast - */ - History.isLastSavedState = function(newState){ - // Prepare - var isLast = false, - newId, oldState, oldId; - - // Check - if ( History.savedStates.length ) { - newId = newState.id; - oldState = History.getLastSavedState(); - oldId = oldState.id; - - // Check - isLast = (newId === oldId); - } - - // Return - return isLast; - }; - - /** - * History.saveState - * Push a State - * @param {Object} newState - * @return {boolean} changed - */ - History.saveState = function(newState){ - // Check Hash - if ( History.isLastSavedState(newState) ) { - return false; - } - - // Push the State - History.savedStates.push(History.cloneObject(newState)); - - // Return true - return true; - }; - - /** - * History.getStateByIndex() - * Gets a state by the index - * @param {integer} index - * @return {Object} - */ - History.getStateByIndex = function(index){ - // Prepare - var State = null; - - // Handle - if ( typeof index === 'undefined' ) { - // Get the last inserted - State = History.savedStates[History.savedStates.length-1]; - } - else if ( index < 0 ) { - // Get from the end - State = History.savedStates[History.savedStates.length+index]; - } - else { - // Get from the beginning - State = History.savedStates[index]; - } - - // Return State - return State; - }; - - - // ==================================================================== - // Hash Helpers - - /** - * History.getHash() - * Gets the current document hash - * @return {string} - */ - History.getHash = function(){ - var hash = History.unescapeHash(document.location.hash); - return hash; - }; - - /** - * History.unescapeString() - * Unescape a string - * @param {String} str - * @return {string} - */ - History.unescapeString = function(str){ - // Prepare - var result = str, - tmp; - - // Unescape hash - while ( true ) { - tmp = window.unescape(result); - if ( tmp === result ) { - break; - } - result = tmp; - } - - // Return result - return result; - }; - - /** - * History.unescapeHash() - * normalize and Unescape a Hash - * @param {String} hash - * @return {string} - */ - History.unescapeHash = function(hash){ - // Prepare - var result = History.normalizeHash(hash); - - // Unescape hash - result = History.unescapeString(result); - - // Return result - return result; - }; - - /** - * History.normalizeHash() - * normalize a hash across browsers - * @return {string} - */ - History.normalizeHash = function(hash){ - // Prepare - var result = hash.replace(/[^#]*#/,'').replace(/#.*/, ''); - - // Return result - return result; - }; - - /** - * History.setHash(hash) - * Sets the document hash - * @param {string} hash - * @return {History} - */ - History.setHash = function(hash,queue){ - // Prepare - var adjustedHash, State, pageUrl; - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.setHash: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.setHash, - args: arguments, - queue: queue - }); - return false; - } - - // Log - //History.debug('History.setHash: called',hash); - - // Prepare - adjustedHash = History.escapeHash(hash); - - // Make Busy + Continue - History.busy(true); - - // Check if hash is a state - State = History.extractState(hash,true); - if ( State && !History.emulated.pushState ) { - // Hash is a state so skip the setHash - //History.debug('History.setHash: Hash is a state so skipping the hash set with a direct pushState call',arguments); - - // PushState - History.pushState(State.data,State.title,State.url,false); - } - else if ( document.location.hash !== adjustedHash ) { - // Hash is a proper hash, so apply it - - // Handle browser bugs - if ( History.bugs.setHash ) { - // Fix Safari Bug https://bugs.webkit.org/show_bug.cgi?id=56249 - - // Fetch the base page - pageUrl = History.getPageUrl(); - - // Safari hash apply - History.pushState(null,null,pageUrl+'#'+adjustedHash,false); - } - else { - // Normal hash apply - document.location.hash = adjustedHash; - } - } - - // Chain - return History; - }; - - /** - * History.escape() - * normalize and Escape a Hash - * @return {string} - */ - History.escapeHash = function(hash){ - // Prepare - var result = History.normalizeHash(hash); - - // Escape hash - result = window.escape(result); - - // IE6 Escape Bug - if ( !History.bugs.hashEscape ) { - // Restore common parts - result = result - .replace(/\%21/g,'!') - .replace(/\%26/g,'&') - .replace(/\%3D/g,'=') - .replace(/\%3F/g,'?'); - } - - // Return result - return result; - }; - - /** - * History.getHashByUrl(url) - * Extracts the Hash from a URL - * @param {string} url - * @return {string} url - */ - History.getHashByUrl = function(url){ - // Extract the hash - var hash = String(url) - .replace(/([^#]*)#?([^#]*)#?(.*)/, '$2') - ; - - // Unescape hash - hash = History.unescapeHash(hash); - - // Return hash - return hash; - }; - - /** - * History.setTitle(title) - * Applies the title to the document - * @param {State} newState - * @return {Boolean} - */ - History.setTitle = function(newState){ - // Prepare - var title = newState.title, - firstState; - - // Initial - if ( !title ) { - firstState = History.getStateByIndex(0); - if ( firstState && firstState.url === newState.url ) { - title = firstState.title||History.options.initialTitle; - } - } - - // Apply - try { - document.getElementsByTagName('title')[0].innerHTML = title.replace('<','<').replace('>','>').replace(' & ',' & '); - } - catch ( Exception ) { } - document.title = title; - - // Chain - return History; - }; - - - // ==================================================================== - // Queueing - - /** - * History.queues - * The list of queues to use - * First In, First Out - */ - History.queues = []; - - /** - * History.busy(value) - * @param {boolean} value [optional] - * @return {boolean} busy - */ - History.busy = function(value){ - // Apply - if ( typeof value !== 'undefined' ) { - //History.debug('History.busy: changing ['+(History.busy.flag||false)+'] to ['+(value||false)+']', History.queues.length); - History.busy.flag = value; - } - // Default - else if ( typeof History.busy.flag === 'undefined' ) { - History.busy.flag = false; - } - - // Queue - if ( !History.busy.flag ) { - // Execute the next item in the queue - clearTimeout(History.busy.timeout); - var fireNext = function(){ - var i, queue, item; - if ( History.busy.flag ) return; - for ( i=History.queues.length-1; i >= 0; --i ) { - queue = History.queues[i]; - if ( queue.length === 0 ) continue; - item = queue.shift(); - History.fireQueueItem(item); - History.busy.timeout = setTimeout(fireNext,History.options.busyDelay); - } - }; - History.busy.timeout = setTimeout(fireNext,History.options.busyDelay); - } - - // Return - return History.busy.flag; - }; - - /** - * History.busy.flag - */ - History.busy.flag = false; - - /** - * History.fireQueueItem(item) - * Fire a Queue Item - * @param {Object} item - * @return {Mixed} result - */ - History.fireQueueItem = function(item){ - return item.callback.apply(item.scope||History,item.args||[]); - }; - - /** - * History.pushQueue(callback,args) - * Add an item to the queue - * @param {Object} item [scope,callback,args,queue] - */ - History.pushQueue = function(item){ - // Prepare the queue - History.queues[item.queue||0] = History.queues[item.queue||0]||[]; - - // Add to the queue - History.queues[item.queue||0].push(item); - - // Chain - return History; - }; - - /** - * History.queue (item,queue), (func,queue), (func), (item) - * Either firs the item now if not busy, or adds it to the queue - */ - History.queue = function(item,queue){ - // Prepare - if ( typeof item === 'function' ) { - item = { - callback: item - }; - } - if ( typeof queue !== 'undefined' ) { - item.queue = queue; - } - - // Handle - if ( History.busy() ) { - History.pushQueue(item); - } else { - History.fireQueueItem(item); - } - - // Chain - return History; - }; - - /** - * History.clearQueue() - * Clears the Queue - */ - History.clearQueue = function(){ - History.busy.flag = false; - History.queues = []; - return History; - }; - - - // ==================================================================== - // IE Bug Fix - - /** - * History.stateChanged - * States whether or not the state has changed since the last double check was initialised - */ - History.stateChanged = false; - - /** - * History.doubleChecker - * Contains the timeout used for the double checks - */ - History.doubleChecker = false; - - /** - * History.doubleCheckComplete() - * Complete a double check - * @return {History} - */ - History.doubleCheckComplete = function(){ - // Update - History.stateChanged = true; - - // Clear - History.doubleCheckClear(); - - // Chain - return History; - }; - - /** - * History.doubleCheckClear() - * Clear a double check - * @return {History} - */ - History.doubleCheckClear = function(){ - // Clear - if ( History.doubleChecker ) { - clearTimeout(History.doubleChecker); - History.doubleChecker = false; - } - - // Chain - return History; - }; - - /** - * History.doubleCheck() - * Create a double check - * @return {History} - */ - History.doubleCheck = function(tryAgain){ - // Reset - History.stateChanged = false; - History.doubleCheckClear(); - - // Fix IE6,IE7 bug where calling history.back or history.forward does not actually change the hash (whereas doing it manually does) - // Fix Safari 5 bug where sometimes the state does not change: https://bugs.webkit.org/show_bug.cgi?id=42940 - if ( History.bugs.ieDoubleCheck ) { - // Apply Check - History.doubleChecker = setTimeout( - function(){ - History.doubleCheckClear(); - if ( !History.stateChanged ) { - //History.debug('History.doubleCheck: State has not yet changed, trying again', arguments); - // Re-Attempt - tryAgain(); - } - return true; - }, - History.options.doubleCheckInterval - ); - } - - // Chain - return History; - }; - - - // ==================================================================== - // Safari Bug Fix - - /** - * History.safariStatePoll() - * Poll the current state - * @return {History} - */ - History.safariStatePoll = function(){ - // Poll the URL - - // Get the Last State which has the new URL - var - urlState = History.extractState(document.location.href), - newState; - - // Check for a difference - if ( !History.isLastSavedState(urlState) ) { - newState = urlState; - } - else { - return; - } - - // Check if we have a state with that url - // If not create it - if ( !newState ) { - //History.debug('History.safariStatePoll: new'); - newState = History.createStateObject(); - } - - // Apply the New State - //History.debug('History.safariStatePoll: trigger'); - History.Adapter.trigger(window,'popstate'); - - // Chain - return History; - }; - - - // ==================================================================== - // State Aliases - - /** - * History.back(queue) - * Send the browser history back one item - * @param {Integer} queue [optional] - */ - History.back = function(queue){ - //History.debug('History.back: called', arguments); - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.back: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.back, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy + Continue - History.busy(true); - - // Fix certain browser bugs that prevent the state from changing - History.doubleCheck(function(){ - History.back(false); - }); - - // Go back - history.go(-1); - - // End back closure - return true; - }; - - /** - * History.forward(queue) - * Send the browser history forward one item - * @param {Integer} queue [optional] - */ - History.forward = function(queue){ - //History.debug('History.forward: called', arguments); - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.forward: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.forward, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy + Continue - History.busy(true); - - // Fix certain browser bugs that prevent the state from changing - History.doubleCheck(function(){ - History.forward(false); - }); - - // Go forward - history.go(1); - - // End forward closure - return true; - }; - - /** - * History.go(index,queue) - * Send the browser history back or forward index times - * @param {Integer} queue [optional] - */ - History.go = function(index,queue){ - //History.debug('History.go: called', arguments); - - // Prepare - var i; - - // Handle - if ( index > 0 ) { - // Forward - for ( i=1; i<=index; ++i ) { - History.forward(queue); - } - } - else if ( index < 0 ) { - // Backward - for ( i=-1; i>=index; --i ) { - History.back(queue); - } - } - else { - throw new Error('History.go: History.go requires a positive or negative integer passed.'); - } - - // Chain - return History; - }; - - - // ==================================================================== - // HTML5 State Support - - // Non-Native pushState Implementation - if ( History.emulated.pushState ) { - /* - * Provide Skeleton for HTML4 Browsers - */ - - // Prepare - var emptyFunction = function(){}; - History.pushState = History.pushState||emptyFunction; - History.replaceState = History.replaceState||emptyFunction; - } // History.emulated.pushState - - // Native pushState Implementation - else { - /* - * Use native HTML5 History API Implementation - */ - - /** - * History.onPopState(event,extra) - * Refresh the Current State - */ - History.onPopState = function(event,extra){ - // Prepare - var stateId = false, newState = false, currentHash, currentState; - - // Reset the double check - History.doubleCheckComplete(); - - // Check for a Hash, and handle apporiatly - currentHash = History.getHash(); - if ( currentHash ) { - // Expand Hash - currentState = History.extractState(currentHash||document.location.href,true); - if ( currentState ) { - // We were able to parse it, it must be a State! - // Let's forward to replaceState - //History.debug('History.onPopState: state anchor', currentHash, currentState); - History.replaceState(currentState.data, currentState.title, currentState.url, false); - } - else { - // Traditional Anchor - //History.debug('History.onPopState: traditional anchor', currentHash); - History.Adapter.trigger(window,'anchorchange'); - History.busy(false); - } - - // We don't care for hashes - History.expectedStateId = false; - return false; - } - - // Ensure - stateId = History.Adapter.extractEventData('state',event,extra) || false; - - // Fetch State - if ( stateId ) { - // Vanilla: Back/forward button was used - newState = History.getStateById(stateId); - } - else if ( History.expectedStateId ) { - // Vanilla: A new state was pushed, and popstate was called manually - newState = History.getStateById(History.expectedStateId); - } - else { - // Initial State - newState = History.extractState(document.location.href); - } - - // The State did not exist in our store - if ( !newState ) { - // Regenerate the State - newState = History.createStateObject(null,null,document.location.href); - } - - // Clean - History.expectedStateId = false; - - // Check if we are the same state - if ( History.isLastSavedState(newState) ) { - // There has been no change (just the page's hash has finally propagated) - //History.debug('History.onPopState: no change', newState, History.savedStates); - History.busy(false); - return false; - } - - // Store the State - History.storeState(newState); - History.saveState(newState); - - // Force update of the title - History.setTitle(newState); - - // Fire Our Event - History.Adapter.trigger(window,'statechange'); - History.busy(false); - - // Return true - return true; - }; - History.Adapter.bind(window,'popstate',History.onPopState); - - /** - * History.pushState(data,title,url) - * Add a new State to the history object, become it, and trigger onpopstate - * We have to trigger for HTML4 compatibility - * @param {object} data - * @param {string} title - * @param {string} url - * @return {true} - */ - History.pushState = function(data,title,url,queue){ - //History.debug('History.pushState: called', arguments); - - // Check the State - if ( History.getHashByUrl(url) && History.emulated.pushState ) { - throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); - } - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.pushState: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.pushState, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy + Continue - History.busy(true); - - // Create the newState - var newState = History.createStateObject(data,title,url); - - // Check it - if ( History.isLastSavedState(newState) ) { - // Won't be a change - History.busy(false); - } - else { - // Store the newState - History.storeState(newState); - History.expectedStateId = newState.id; - - // Push the newState - history.pushState(newState.id,newState.title,newState.url); - - // Fire HTML5 Event - History.Adapter.trigger(window,'popstate'); - } - - // End pushState closure - return true; - }; - - /** - * History.replaceState(data,title,url) - * Replace the State and trigger onpopstate - * We have to trigger for HTML4 compatibility - * @param {object} data - * @param {string} title - * @param {string} url - * @return {true} - */ - History.replaceState = function(data,title,url,queue){ - //History.debug('History.replaceState: called', arguments); - - // Check the State - if ( History.getHashByUrl(url) && History.emulated.pushState ) { - throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).'); - } - - // Handle Queueing - if ( queue !== false && History.busy() ) { - // Wait + Push to Queue - //History.debug('History.replaceState: we must wait', arguments); - History.pushQueue({ - scope: History, - callback: History.replaceState, - args: arguments, - queue: queue - }); - return false; - } - - // Make Busy + Continue - History.busy(true); - - // Create the newState - var newState = History.createStateObject(data,title,url); - - // Check it - if ( History.isLastSavedState(newState) ) { - // Won't be a change - History.busy(false); - } - else { - // Store the newState - History.storeState(newState); - History.expectedStateId = newState.id; - - // Push the newState - history.replaceState(newState.id,newState.title,newState.url); - - // Fire HTML5 Event - History.Adapter.trigger(window,'popstate'); - } - - // End replaceState closure - return true; - }; - - } // !History.emulated.pushState - - - // ==================================================================== - // Initialise - - /** - * Load the Store - */ - if ( sessionStorage ) { - // Fetch - try { - History.store = JSON.parse(sessionStorage.getItem('History.store'))||{}; - } - catch ( err ) { - History.store = {}; - } - - // Normalize - History.normalizeStore(); - } - else { - // Default Load - History.store = {}; - History.normalizeStore(); - } - - /** - * Clear Intervals on exit to prevent memory leaks - */ - History.Adapter.bind(window,"beforeunload",History.clearAllIntervals); - History.Adapter.bind(window,"unload",History.clearAllIntervals); - - /** - * Create the initial State - */ - History.saveState(History.storeState(History.extractState(document.location.href,true))); - - /** - * Bind for Saving Store - */ - if ( sessionStorage ) { - // When the page is closed - History.onUnload = function(){ - // Prepare - var currentStore, item; - - // Fetch - try { - currentStore = JSON.parse(sessionStorage.getItem('History.store'))||{}; - } - catch ( err ) { - currentStore = {}; - } - - // Ensure - currentStore.idToState = currentStore.idToState || {}; - currentStore.urlToId = currentStore.urlToId || {}; - currentStore.stateToId = currentStore.stateToId || {}; - - // Sync - for ( item in History.idToState ) { - if ( !History.idToState.hasOwnProperty(item) ) { - continue; - } - currentStore.idToState[item] = History.idToState[item]; - } - for ( item in History.urlToId ) { - if ( !History.urlToId.hasOwnProperty(item) ) { - continue; - } - currentStore.urlToId[item] = History.urlToId[item]; - } - for ( item in History.stateToId ) { - if ( !History.stateToId.hasOwnProperty(item) ) { - continue; - } - currentStore.stateToId[item] = History.stateToId[item]; - } - - // Update - History.store = currentStore; - History.normalizeStore(); - - // Store - sessionStorage.setItem('History.store',JSON.stringify(currentStore)); - }; - - // For Internet Explorer - History.intervalList.push(setInterval(History.onUnload,History.options.storeInterval)); - - // For Other Browsers - History.Adapter.bind(window,'beforeunload',History.onUnload); - History.Adapter.bind(window,'unload',History.onUnload); - - // Both are enabled for consistency - } - - // Non-Native pushState Implementation - if ( !History.emulated.pushState ) { - // Be aware, the following is only for native pushState implementations - // If you are wanting to include something for all browsers - // Then include it above this if block - - /** - * Setup Safari Fix - */ - if ( History.bugs.safariPoll ) { - History.intervalList.push(setInterval(History.safariStatePoll, History.options.safariPollInterval)); - } - - /** - * Ensure Cross Browser Compatibility - */ - if ( navigator.vendor === 'Apple Computer, Inc.' || (navigator.appCodeName||'') === 'Mozilla' ) { - /** - * Fix Safari HashChange Issue - */ - - // Setup Alias - History.Adapter.bind(window,'hashchange',function(){ - History.Adapter.trigger(window,'popstate'); - }); - - // Initialise Alias - if ( History.getHash() ) { - History.Adapter.onDomLoad(function(){ - History.Adapter.trigger(window,'hashchange'); - }); - } - } - - } // !History.emulated.pushState - - - }; // History.initCore - - // Try and Initialise History - History.init(); - -})(window); diff --git a/js/libraries/balupton-history/scripts/uncompressed/json2.js b/js/libraries/balupton-history/scripts/uncompressed/json2.js deleted file mode 100755 index 47bcc320..00000000 --- a/js/libraries/balupton-history/scripts/uncompressed/json2.js +++ /dev/null @@ -1,480 +0,0 @@ -/* - http://www.JSON.org/json2.js - 2011-01-18 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!window.JSON) { - window.JSON = {}; -} - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var JSON = window.JSON, - cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : gap ? - '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : gap ? - '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : - '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ - .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') - .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') - .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); diff --git a/js/libraries/balupton-history/tests.src/_header.php b/js/libraries/balupton-history/tests.src/_header.php deleted file mode 100755 index 9b085101..00000000 --- a/js/libraries/balupton-history/tests.src/_header.php +++ /dev/null @@ -1,22 +0,0 @@ - - - - History.js Test Suite - - - -

    History.js Test Suite

    -

    HTML5 Browsers must pass the HTML4+HTML5 tests

    -

    HTML4 Browsers must pass the HTML4 tests and should fail the HTML5 tests

    - '; - foreach ( $adapters as $adapter ) : - echo '
    '; - # Url - $url = "${browser}.${adapter}.html"; - - # Title - $Browser = ucwords($browser); - $Adapter = ucwords($adapter); - $title = "History.js ${Browser} ${Adapter} Test Suite"; - - # Render - ?>'; - endforeach; - echo '
    '; - endforeach; - ?> - - diff --git a/js/libraries/balupton-history/tests.src/each.php b/js/libraries/balupton-history/tests.src/each.php deleted file mode 100755 index 22f7b683..00000000 --- a/js/libraries/balupton-history/tests.src/each.php +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - <?=$title?> - - - - - - - - - - - - - -

    -

    -
    -

    -
      -
      test markup
      - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests.src/index.php b/js/libraries/balupton-history/tests.src/index.php deleted file mode 100755 index 44495d3e..00000000 --- a/js/libraries/balupton-history/tests.src/index.php +++ /dev/null @@ -1,23 +0,0 @@ -Tests diff --git a/js/libraries/balupton-history/tests/.htaccess b/js/libraries/balupton-history/tests/.htaccess deleted file mode 100755 index 2f7dbdde..00000000 --- a/js/libraries/balupton-history/tests/.htaccess +++ /dev/null @@ -1,13 +0,0 @@ -Options +FollowSymlinks -RewriteEngine On - -# Clean Adapter -RewriteCond %{REQUEST_FILENAME} !-f -RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule ([^\.]+)$ $1.html [NC,L,QSA] - -# Can someone smarter than me make it so: -# http://localhost/history.js/tests/uncompressed-html5-persistant-jquery -# Does not redirect to: -# http://localhost/history.js/tests/uncompressed-html5-persistant-jquery.html -# But still accesses that url diff --git a/js/libraries/balupton-history/tests/html4+html5.jquery.html b/js/libraries/balupton-history/tests/html4+html5.jquery.html deleted file mode 100755 index a99b9569..00000000 --- a/js/libraries/balupton-history/tests/html4+html5.jquery.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML4+HTML5 Jquery Test Suite - - - - - - - - - - - - - -

      History.js HTML4+HTML5 Jquery Test Suite

      -

      -
      -

      -
        -
        test markup
        - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.mootools.html b/js/libraries/balupton-history/tests/html4+html5.mootools.html deleted file mode 100755 index 792f9752..00000000 --- a/js/libraries/balupton-history/tests/html4+html5.mootools.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML4+HTML5 Mootools Test Suite - - - - - - - - - - - - - -

        History.js HTML4+HTML5 Mootools Test Suite

        -

        -
        -

        -
          -
          test markup
          - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.native.html b/js/libraries/balupton-history/tests/html4+html5.native.html deleted file mode 100755 index c4fd8522..00000000 --- a/js/libraries/balupton-history/tests/html4+html5.native.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML4+HTML5 Native Test Suite - - - - - - - - - - - - - -

          History.js HTML4+HTML5 Native Test Suite

          -

          -
          -

          -
            -
            test markup
            - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.right.html b/js/libraries/balupton-history/tests/html4+html5.right.html deleted file mode 100755 index ae4fb036..00000000 --- a/js/libraries/balupton-history/tests/html4+html5.right.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML4+HTML5 Right Test Suite - - - - - - - - - - - - - -

            History.js HTML4+HTML5 Right Test Suite

            -

            -
            -

            -
              -
              test markup
              - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html4+html5.zepto.html b/js/libraries/balupton-history/tests/html4+html5.zepto.html deleted file mode 100755 index 71a6b7c9..00000000 --- a/js/libraries/balupton-history/tests/html4+html5.zepto.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML4+HTML5 Zepto Test Suite - - - - - - - - - - - - - -

              History.js HTML4+HTML5 Zepto Test Suite

              -

              -
              -

              -
                -
                test markup
                - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.jquery.html b/js/libraries/balupton-history/tests/html5.jquery.html deleted file mode 100755 index 977b8fed..00000000 --- a/js/libraries/balupton-history/tests/html5.jquery.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML5 Jquery Test Suite - - - - - - - - - - - - - -

                History.js HTML5 Jquery Test Suite

                -

                -
                -

                -
                  -
                  test markup
                  - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.mootools.html b/js/libraries/balupton-history/tests/html5.mootools.html deleted file mode 100755 index 30ee7892..00000000 --- a/js/libraries/balupton-history/tests/html5.mootools.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML5 Mootools Test Suite - - - - - - - - - - - - - -

                  History.js HTML5 Mootools Test Suite

                  -

                  -
                  -

                  -
                    -
                    test markup
                    - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.native.html b/js/libraries/balupton-history/tests/html5.native.html deleted file mode 100755 index 8ffc4c34..00000000 --- a/js/libraries/balupton-history/tests/html5.native.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML5 Native Test Suite - - - - - - - - - - - - - -

                    History.js HTML5 Native Test Suite

                    -

                    -
                    -

                    -
                      -
                      test markup
                      - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.right.html b/js/libraries/balupton-history/tests/html5.right.html deleted file mode 100755 index 7a2c08b5..00000000 --- a/js/libraries/balupton-history/tests/html5.right.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML5 Right Test Suite - - - - - - - - - - - - - -

                      History.js HTML5 Right Test Suite

                      -

                      -
                      -

                      -
                        -
                        test markup
                        - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/html5.zepto.html b/js/libraries/balupton-history/tests/html5.zepto.html deleted file mode 100755 index d6657091..00000000 --- a/js/libraries/balupton-history/tests/html5.zepto.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - History.js HTML5 Zepto Test Suite - - - - - - - - - - - - - -

                        History.js HTML5 Zepto Test Suite

                        -

                        -
                        -

                        -
                          -
                          test markup
                          - - - - - - - - - - \ No newline at end of file diff --git a/js/libraries/balupton-history/tests/image.php b/js/libraries/balupton-history/tests/image.php deleted file mode 100755 index 5e7bfc9e..00000000 --- a/js/libraries/balupton-history/tests/image.php +++ /dev/null @@ -1,3 +0,0 @@ - - - - History.js Test Suite - - - -

                          History.js Test Suite

                          -

                          HTML5 Browsers must pass the HTML4+HTML5 tests

                          -

                          HTML4 Browsers must pass the HTML4 tests and should fail the HTML5 tests

                          - - diff --git a/js/libraries/balupton-history/tests/tests.js b/js/libraries/balupton-history/tests/tests.js deleted file mode 100755 index 47a16eeb..00000000 --- a/js/libraries/balupton-history/tests/tests.js +++ /dev/null @@ -1,254 +0,0 @@ -(function(){ - -var - History = window.History, - document = window.document, - test = window.test, - same = window.same; - -// Check -if ( !History.enabled ) { - throw new Error('History.js is disabled'); -} - -// Prepare -History.options.debug = false; - -// Variables -var - States = { - // Home - 0: { - 'url': document.location.href.replace(/#.*$/,''), - 'title': '' - }, - // One - 1: { - 'data': { - 'state': 1, - 'rand': Math.random() - }, - 'title': 'State 1', - 'url': '?state=1' - }, - // Two - 2: { - 'data': { - 'state': 2, - 'rand': Math.random() - }, - 'title': 'State 2', - 'url': '?state=2&asd=%20asd%2520asd' - }, - // Three - 3: { - 'url': '?state=3' - }, - // Four - 4: { - 'data': { - 'state': 4, - 'trick': true, - 'rand': Math.random() - }, - 'title': 'State 4', - 'url': '?state=3' - }, - // Log - 5: { - 'url': '?state=1#log' - }, - // Six - 6: { - 'data': { - 'state': 6, - 'rand': Math.random() - }, - 'url': 'six.html' - }, - // Seven - 7: { - 'url': 'seven' - }, - // Eight - 8: { - 'url': '/eight' - } - }, - stateOrder = [0,1,2,3,4,3,1,0,1,3,4,3,1,0,6,7,8,1,8,7,6,0], - currentTest = 0; - -// Original Title -var title = document.title; - -var banner; - -var checkStatus = function(){ - banner = banner || document.getElementById('qunit-banner'); - var status = banner.className !== 'qunit-fail'; - return status; -}; - -// Check State -var checkState = function(){ - if ( !checkStatus() ) { - throw new Error('A test has failed'); - } - - var - stateIndex = stateOrder[currentTest], - expectedState = History.normalizeState(States[stateIndex]), - actualState = History.getState(false); - - ++currentTest; - - document.title = title+': '+actualState.url; - - var - testName = 'Test '+currentTest, - stateName = 'State '+stateIndex; - - test(testName,function(){ - History.log('Completed: '+testName +' / '+ stateName); - same(actualState,expectedState,stateName); - }); - - // Image Load to Stress Test Safari and Opera - (new Image()).src = "image.php"; -}; - -// Check the Initial State -checkState(); - -// State Change -History.Adapter.bind(window,'statechange',checkState); - -// Log -var addLog = function(){ - var args = arguments; - History.queue(function(){ - History.log.apply(History,args); - }); -}; - -// Dom Load -History.Adapter.onDomLoad(function(){ - setTimeout(function(){ - - // ---------------------------------------------------------------------- - // Test State Functionality: Adding - - // Test 2 / State 1 (0 -> 1) - // Tests HTML4 -> HTML5 Graceful Upgrade - addLog('Test 2',History.queues.length,History.busy.flag); - History.setHash(History.getHashByState(States[1])); - - // Test 3 / State 2 (1 -> 2) - addLog('Test 3',History.queues.length,History.busy.flag); - History.pushState(States[2].data, States[2].title, States[2].url); - - // Test 3-2 / State 2 (2 -> 2) / No Change - addLog('Test 3-2',History.queues.length,History.busy.flag); - History.pushState(States[2].data, States[2].title, States[2].url); - - // Test 3-3 / State 2 (2 -> 2) / No Change - addLog('Test 3-3',History.queues.length,History.busy.flag); - History.replaceState(States[2].data, States[2].title, States[2].url); - - // Test 4 / State 3 (2 -> 3) - addLog('Test 4',History.queues.length,History.busy.flag); - History.replaceState(States[3].data, States[3].title, States[3].url); - - // Test 5 / State 4 (3 -> 4) - addLog('Test 5',History.queues.length,History.busy.flag); - History.pushState(States[4].data, States[4].title, States[4].url); - - // ---------------------------------------------------------------------- - // Test State Functionality: Traversing - - // Test 6 / State 3 (4 -> 3) - // Test 7 / State 1 (3 -> 2 -> 1) - addLog('Test 6,7',History.queues.length,History.busy.flag); - History.go(-2); - - // Test 8 / State 0 (1 -> 0) - // Tests Default State - addLog('Test 8',History.queues.length,History.busy.flag); - History.back(); - - // Test 9 / State 1 (0 -> 1) - // Test 10 / State 3 (1 -> 2 -> 3) - addLog('Test 9,10',History.queues.length,History.busy.flag); - History.go(2); - - // Test 11 / State 4 (3 -> 4) - addLog('Test 11',History.queues.length,History.busy.flag); - History.forward(); - - // Test 12 / State 3 (4 -> 3) - addLog('Test 12',History.queues.length,History.busy.flag); - History.back(); - - // Test 13 / State 1 (3 -> 2 -> 1) - addLog('Test 13',History.queues.length,History.busy.flag); - History.back(); - - // ---------------------------------------------------------------------- - // Test State Functionality: Traditional Anchors - - // Test 13-2 / State 1 (1 -> #log) / No Change - addLog('Test 13-2',History.queues.length,History.busy.flag); - History.setHash('log'); - - // Test 13-3 / State 1 (#log -> 1) / No Change - addLog('Test 13-3',History.queues.length,History.busy.flag); - History.back(); - - // Test 14 / State 0 (1 -> 0) - addLog('Test 14',History.queues.length,History.busy.flag); - History.back(); - - // ---------------------------------------------------------------------- - // Test URL Handling: Adding - - // Test 15 / State 6 (1 -> 6) - // Also tests data with no title - addLog('Test 15',History.queues.length,History.busy.flag); - History.pushState(States[6].data, States[6].title, States[6].url); - - // Test 16 / State 7 (6 -> 7) - addLog('Test 16',History.queues.length,History.busy.flag); - History.pushState(States[7].data, States[7].title, States[7].url); - - // Test 17 / State 7 (7 -> 8) - addLog('Test 17',History.queues.length,History.busy.flag); - History.pushState(States[8].data, States[8].title, States[8].url); - - // Test 18 / State 1 (8 -> 1) - // Should be /eight?state=1 - addLog('Test 18',History.queues.length,History.busy.flag); - History.pushState(States[1].data, States[1].title, States[1].url); - - // ---------------------------------------------------------------------- - // Test URL Handling: Traversing - - // Test 19 / State 8 (1 -> 8) - addLog('Test 19',History.queues.length,History.busy.flag); - History.back(); - - // Test 20 / State 7 (8 -> 7) - addLog('Test 20',History.queues.length,History.busy.flag); - History.back(); - - // Test 21 / State 6 (7 -> 6) - addLog('Test 21',History.queues.length,History.busy.flag); - History.back(); - - // Test 22 / State 0 (6 -> 0) - addLog('Test 22',History.queues.length,History.busy.flag); - History.back(); - - },1000); // wait for test one to complete -}); - -})(); diff --git a/js/libraries/balupton-history/vendor/jquery.js b/js/libraries/balupton-history/vendor/jquery.js deleted file mode 100755 index 719e1d4e..00000000 --- a/js/libraries/balupton-history/vendor/jquery.js +++ /dev/null @@ -1,9046 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.4 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Mon Sep 12 18:54:48 2011 -0400 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return (context || rootjQuery).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.6.4", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( i ) { - return i === -1 ? - this.slice( i ) : - this.slice( i, +i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery._Deferred(); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return (new Function( "return " + data ))(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - if ( !array ) { - return -1; - } - - if ( indexOf ) { - return indexOf.call( array, elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -var // Promise methods - promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), - // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - // make sure args are available (#8421) - args = args || []; - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - always: function() { - return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - pipe: function( fnDone, fnFail ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - }); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = arguments, - i = 0, - length = args.length, - count = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - // Strange bug in FF4: - // Values changed onto the arguments object sometimes end up as undefined values - // outside the $.when method. Cloning the object into a fresh array solves the issue - deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); - } - }; - } - if ( length > 1 ) { - for( ; i < length; i++ ) { - if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return deferred.promise(); - } -}); - - - -jQuery.support = (function() { - - var div = document.createElement( "div" ), - documentElement = document.documentElement, - all, - a, - select, - opt, - input, - marginDiv, - support, - fragment, - body, - testElementParent, - testElement, - testElementStyle, - tds, - events, - eventName, - i, - isSupported; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
                          a"; - - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName( "tbody" ).length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName( "link" ).length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55$/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains it's value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - div.innerHTML = ""; - - // Figure out if the W3C box model works as expected - div.style.width = div.style.paddingLeft = "1px"; - - body = document.getElementsByTagName( "body" )[ 0 ]; - // We use our own, invisible, body unless the body is already present - // in which case we use a div (#9239) - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - jQuery.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
                          "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.innerHTML = "
                          t
                          "; - tds = div.getElementsByTagName( "td" ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( document.defaultView && document.defaultView.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Remove the body element we added - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - } ) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - // Null connected elements to avoid leaks in IE - testElement = fragment = select = opt = body = marginDiv = div = input = null; - - return support; -})(); - -// Keep track of boxModel -jQuery.boxModel = jQuery.support.boxModel; - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - - // Support interoperable removal of hyphenated or camelcased keys - if ( !thisCache[ name ] ) { - name = jQuery.camelCase( name ); - } - - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery.data( elem, deferDataKey, undefined, true ); - if ( defer && - ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && - ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery.data( elem, queueDataKey, undefined, true ) && - !jQuery.data( elem, markDataKey, undefined, true ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.resolve(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = (type || "fx") + "mark"; - jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); - if ( count ) { - jQuery.data( elem, key, count, true ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - if ( elem ) { - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type, undefined, true ); - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data), true ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - defer; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift("inprogress"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue( type, function() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { - count++; - tmp.done( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - nodeHook, boolHook; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = (value || "").split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return undefined; - } - - var isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attrFix: { - // Always normalize to ensure hook usage - tabindex: "tabIndex" - }, - - attr: function( elem, name, value, pass ) { - var nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( !("getAttribute" in elem) ) { - return jQuery.prop( elem, name, value ); - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // Normalize the name if needed - if ( notxml ) { - name = jQuery.attrFix[ name ] || name; - - hooks = jQuery.attrHooks[ name ]; - - if ( !hooks ) { - // Use boolHook for boolean attributes - if ( rboolean.test( name ) ) { - hooks = boolHook; - - // Use nodeHook if available( IE6/7 ) - } else if ( nodeHook ) { - hooks = nodeHook; - } - } - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return undefined; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, name ) { - var propName; - if ( elem.nodeType === 1 ) { - name = jQuery.attrFix[ name ] || name; - - jQuery.attr( elem, name, "" ); - elem.removeAttribute( name ); - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { - elem[ propName ] = false; - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return (elem[ name ] = value); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabindex propHook to attrHooks for back-compat -jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode; - return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !jQuery.support.getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - // Return undefined if nodeValue is empty string - return ret && ret.nodeValue !== "" ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return (ret.nodeValue = value + ""); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return (elem.style.cssText = "" + value); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); - } - } - }); -}); - - - - -var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspaces = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, true ); - } - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Event object or event type - var type = event.type || event, - namespaces = [], - exclusive; - - if ( type.indexOf("!") >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.exclusive = exclusive; - event.namespace = namespaces.join("."); - event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); - - // triggerHandler() and global events don't bubble or run the default action - if ( onlyHandlers || !elem ) { - event.preventDefault(); - event.stopPropagation(); - } - - // Handle a global trigger - if ( !elem ) { - // TODO: Stop taunting the data cache; remove global events and always attach to document - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - return; - } - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - event.target = elem; - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - var cur = elem, - // IE doesn't like method names with a colon (#3533, #8272) - ontype = type.indexOf(":") < 0 ? "on" + type : ""; - - // Fire event on the current element, then bubble up the DOM tree - do { - var handle = jQuery._data( cur, "handle" ); - - event.currentTarget = cur; - if ( handle ) { - handle.apply( cur, data ); - } - - // Trigger an inline bound script - if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { - event.result = false; - event.preventDefault(); - } - - // Bubble up to document, then to window - cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; - } while ( cur && !event.isPropagationStopped() ); - - // If nobody prevented the default action, do it now - if ( !event.isDefaultPrevented() ) { - var old, - special = jQuery.event.special[ type ] || {}; - - if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction)() check here because IE6/7 fails that test. - // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. - try { - if ( ontype && elem[ type ] ) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - jQuery.event.triggered = type; - elem[ type ](); - } - } catch ( ieError ) {} - - if ( old ) { - elem[ ontype ] = old; - } - - jQuery.event.triggered = undefined; - } - } - - return event.result; - }, - - handle: function( event ) { - event = jQuery.event.fix( event || window.event ); - // Snapshot the handlers list since a called handler may add/remove events. - var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), - run_all = !event.exclusive && !event.namespace, - args = Array.prototype.slice.call( arguments, 0 ); - - // Use the fix-ed Event rather than the (read-only) native event - args[0] = event; - event.currentTarget = this; - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Triggered event must 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event. - if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var eventDocument = event.target.ownerDocument || document, - doc = eventDocument.documentElement, - body = eventDocument.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - - // Check if mouse(over|out) are still within the same parent element - var related = event.relatedTarget, - inside = false, - eventType = event.type; - - event.type = event.data; - - if ( related !== this ) { - - if ( related ) { - inside = jQuery.contains( this, related ); - } - - if ( !inside ) { - - jQuery.event.handle.apply( this, arguments ); - - event.type = eventType; - } - } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; -}); - -// submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( !jQuery.nodeName( this, "form" ) ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - // Avoid triggering error on non-existent type attribute in IE VML (#7071) - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - -} - -// change delegation, happens here so we have bind. -if ( !jQuery.support.changeBubbles ) { - - var changeFilters, - - getVal = function( elem ) { - var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", - val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( jQuery.nodeName( elem, "select" ) ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - - function handler( donor ) { - // Donor event is always a native one; fix it and switch its type. - // Let focusin/out handler cancel the donor focus/blur event. - var e = jQuery.event.fix( donor ); - e.type = fix; - e.originalEvent = {}; - jQuery.event.trigger( e, null, e.target ); - if ( e.isDefaultPrevented() ) { - donor.preventDefault(); - } - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - var handler; - - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( arguments.length === 2 || data === false ) { - fn = data; - data = undefined; - } - - if ( name === "one" ) { - handler = function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }; - handler.guid = fn.guid || jQuery.guid++; - } else { - handler = fn; - } - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); - -jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - - return this; - } - - if ( name === "die" && !types && - origSelector && origSelector.charAt(0) === "." ) { - - context.unbind( origSelector ); - - return this; - } - - if ( data === false || jQuery.isFunction( data ) ) { - fn = data || returnFalse; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( liveMap[ type ] ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; -}); - -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - - // Make sure not to accidentally match a child element with the same selector - if ( related && jQuery.contains( elem, related ) ) { - related = elem; - } - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); -} - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

                          "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
                          "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( typeof selector === "string" ? - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[ selector ] ) { - matches[ selector ] = POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[ selector ]; - - if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, args.join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return (elem === qualifier) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return (jQuery.inArray( elem, qualifier ) >= 0) === keep; - }); -} - - - - -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
                          ", "
                          " ], - thead: [ 1, "", "
                          " ], - tr: [ 2, "", "
                          " ], - td: [ 3, "", "
                          " ], - col: [ 2, "", "
                          " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - -
                          test markup
                          - - diff --git a/js/libraries/balupton-history/vendor/qunit/test/index.html b/js/libraries/balupton-history/vendor/qunit/test/index.html deleted file mode 100755 index 64ccfcce..00000000 --- a/js/libraries/balupton-history/vendor/qunit/test/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - QUnit Test Suite - - - - - - -

                          QUnit Test Suite

                          -

                          -
                          -

                          -
                            -
                            test markup
                            - - diff --git a/js/libraries/balupton-history/vendor/qunit/test/logs.html b/js/libraries/balupton-history/vendor/qunit/test/logs.html deleted file mode 100755 index bd135074..00000000 --- a/js/libraries/balupton-history/vendor/qunit/test/logs.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - QUnit Test Suite - - - - - -

                            QUnit Test Suite

                            -

                            -
                            -

                            -
                              -
                              test markup
                              - - diff --git a/js/libraries/balupton-history/vendor/qunit/test/logs.js b/js/libraries/balupton-history/vendor/qunit/test/logs.js deleted file mode 100755 index 64dc203b..00000000 --- a/js/libraries/balupton-history/vendor/qunit/test/logs.js +++ /dev/null @@ -1,150 +0,0 @@ -// TODO disable reordering for this suite! - - -var begin = 0, - moduleStart = 0, - moduleDone = 0, - testStart = 0, - testDone = 0, - log = 0, - moduleContext, - moduleDoneContext, - testContext, - testDoneContext, - logContext; - -QUnit.begin = function() { - begin++; -}; -QUnit.done = function() { -}; -QUnit.moduleStart = function(context) { - moduleStart++; - moduleContext = context; -}; -QUnit.moduleDone = function(context) { - moduleDone++; - moduleDoneContext = context; -}; -QUnit.testStart = function(context) { - testStart++; - testContext = context; -}; -QUnit.testDone = function(context) { - testDone++; - testDoneContext = context; -}; -QUnit.log = function(context) { - log++; - logContext = context; -}; - -var logs = ["begin", "testStart", "testDone", "log", "moduleStart", "moduleDone", "done"]; -for (var i = 0; i < logs.length; i++) { - (function() { - var log = logs[i], - logger = QUnit[log]; - QUnit[log] = function() { - console.log(log, arguments); - logger.apply(this, arguments); - }; - })(); -} - -module("logs1"); - -test("test1", 13, function() { - equal(begin, 1); - equal(moduleStart, 1); - equal(testStart, 1); - equal(testDone, 0); - equal(moduleDone, 0); - - deepEqual(logContext, { - result: true, - message: undefined, - actual: 0, - expected: 0 - }); - equal("foo", "foo", "msg"); - deepEqual(logContext, { - result: true, - message: "msg", - actual: "foo", - expected: "foo" - }); - strictEqual(testDoneContext, undefined); - deepEqual(testContext, { - name: "test1" - }); - strictEqual(moduleDoneContext, undefined); - deepEqual(moduleContext, { - name: "logs1" - }); - - equal(log, 12); -}); -test("test2", 10, function() { - equal(begin, 1); - equal(moduleStart, 1); - equal(testStart, 2); - equal(testDone, 1); - equal(moduleDone, 0); - - deepEqual(testDoneContext, { - name: "test1", - failed: 0, - passed: 13, - total: 13 - }); - deepEqual(testContext, { - name: "test2" - }); - strictEqual(moduleDoneContext, undefined); - deepEqual(moduleContext, { - name: "logs1" - }); - - equal(log, 22); -}); - -module("logs2"); - -test("test1", 9, function() { - equal(begin, 1); - equal(moduleStart, 2); - equal(testStart, 3); - equal(testDone, 2); - equal(moduleDone, 1); - - deepEqual(testContext, { - name: "test1" - }); - deepEqual(moduleDoneContext, { - name: "logs1", - failed: 0, - passed: 23, - total: 23 - }); - deepEqual(moduleContext, { - name: "logs2" - }); - - equal(log, 31); -}); -test("test2", 8, function() { - equal(begin, 1); - equal(moduleStart, 2); - equal(testStart, 4); - equal(testDone, 3); - equal(moduleDone, 1); - - deepEqual(testContext, { - name: "test2" - }); - deepEqual(moduleContext, { - name: "logs2" - }); - - equal(log, 39); -}); diff --git a/js/libraries/balupton-history/vendor/qunit/test/same.js b/js/libraries/balupton-history/vendor/qunit/test/same.js deleted file mode 100755 index fa7e3eb9..00000000 --- a/js/libraries/balupton-history/vendor/qunit/test/same.js +++ /dev/null @@ -1,1421 +0,0 @@ -module("equiv"); - - -test("Primitive types and constants", function () { - equals(QUnit.equiv(null, null), true, "null"); - equals(QUnit.equiv(null, {}), false, "null"); - equals(QUnit.equiv(null, undefined), false, "null"); - equals(QUnit.equiv(null, 0), false, "null"); - equals(QUnit.equiv(null, false), false, "null"); - equals(QUnit.equiv(null, ''), false, "null"); - equals(QUnit.equiv(null, []), false, "null"); - - equals(QUnit.equiv(undefined, undefined), true, "undefined"); - equals(QUnit.equiv(undefined, null), false, "undefined"); - equals(QUnit.equiv(undefined, 0), false, "undefined"); - equals(QUnit.equiv(undefined, false), false, "undefined"); - equals(QUnit.equiv(undefined, {}), false, "undefined"); - equals(QUnit.equiv(undefined, []), false, "undefined"); - equals(QUnit.equiv(undefined, ""), false, "undefined"); - - // Nan usually doest not equal to Nan using the '==' operator. - // Only isNaN() is able to do it. - equals(QUnit.equiv(0/0, 0/0), true, "NaN"); // NaN VS NaN - equals(QUnit.equiv(1/0, 2/0), true, "Infinity"); // Infinity VS Infinity - equals(QUnit.equiv(-1/0, 2/0), false, "-Infinity, Infinity"); // -Infinity VS Infinity - equals(QUnit.equiv(-1/0, -2/0), true, "-Infinity, -Infinity"); // -Infinity VS -Infinity - equals(QUnit.equiv(0/0, 1/0), false, "NaN, Infinity"); // Nan VS Infinity - equals(QUnit.equiv(1/0, 0/0), false, "NaN, Infinity"); // Nan VS Infinity - equals(QUnit.equiv(0/0, null), false, "NaN"); - equals(QUnit.equiv(0/0, undefined), false, "NaN"); - equals(QUnit.equiv(0/0, 0), false, "NaN"); - equals(QUnit.equiv(0/0, false), false, "NaN"); - equals(QUnit.equiv(0/0, function () {}), false, "NaN"); - equals(QUnit.equiv(1/0, null), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, undefined), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, 0), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, 1), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, false), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, true), false, "NaN, Infinity"); - equals(QUnit.equiv(1/0, function () {}), false, "NaN, Infinity"); - - equals(QUnit.equiv(0, 0), true, "number"); - equals(QUnit.equiv(0, 1), false, "number"); - equals(QUnit.equiv(1, 0), false, "number"); - equals(QUnit.equiv(1, 1), true, "number"); - equals(QUnit.equiv(1.1, 1.1), true, "number"); - equals(QUnit.equiv(0.0000005, 0.0000005), true, "number"); - equals(QUnit.equiv(0, ''), false, "number"); - equals(QUnit.equiv(0, '0'), false, "number"); - equals(QUnit.equiv(1, '1'), false, "number"); - equals(QUnit.equiv(0, false), false, "number"); - equals(QUnit.equiv(1, true), false, "number"); - - equals(QUnit.equiv(true, true), true, "boolean"); - equals(QUnit.equiv(true, false), false, "boolean"); - equals(QUnit.equiv(false, true), false, "boolean"); - equals(QUnit.equiv(false, 0), false, "boolean"); - equals(QUnit.equiv(false, null), false, "boolean"); - equals(QUnit.equiv(false, undefined), false, "boolean"); - equals(QUnit.equiv(true, 1), false, "boolean"); - equals(QUnit.equiv(true, null), false, "boolean"); - equals(QUnit.equiv(true, undefined), false, "boolean"); - - equals(QUnit.equiv('', ''), true, "string"); - equals(QUnit.equiv('a', 'a'), true, "string"); - equals(QUnit.equiv("foobar", "foobar"), true, "string"); - equals(QUnit.equiv("foobar", "foo"), false, "string"); - equals(QUnit.equiv('', 0), false, "string"); - equals(QUnit.equiv('', false), false, "string"); - equals(QUnit.equiv('', null), false, "string"); - equals(QUnit.equiv('', undefined), false, "string"); - - // Short annotation VS new annotation - equals(QUnit.equiv(0, new Number()), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Number(), 0), true, "short annotation VS new annotation"); - equals(QUnit.equiv(1, new Number(1)), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Number(1), 1), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Number(0), 1), false, "short annotation VS new annotation"); - equals(QUnit.equiv(0, new Number(1)), false, "short annotation VS new annotation"); - - equals(QUnit.equiv(new String(), ""), true, "short annotation VS new annotation"); - equals(QUnit.equiv("", new String()), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new String("My String"), "My String"), true, "short annotation VS new annotation"); - equals(QUnit.equiv("My String", new String("My String")), true, "short annotation VS new annotation"); - equals(QUnit.equiv("Bad String", new String("My String")), false, "short annotation VS new annotation"); - equals(QUnit.equiv(new String("Bad String"), "My String"), false, "short annotation VS new annotation"); - - equals(QUnit.equiv(false, new Boolean()), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Boolean(), false), true, "short annotation VS new annotation"); - equals(QUnit.equiv(true, new Boolean(true)), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Boolean(true), true), true, "short annotation VS new annotation"); - equals(QUnit.equiv(true, new Boolean(1)), true, "short annotation VS new annotation"); - equals(QUnit.equiv(false, new Boolean(false)), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Boolean(false), false), true, "short annotation VS new annotation"); - equals(QUnit.equiv(false, new Boolean(0)), true, "short annotation VS new annotation"); - equals(QUnit.equiv(true, new Boolean(false)), false, "short annotation VS new annotation"); - equals(QUnit.equiv(new Boolean(false), true), false, "short annotation VS new annotation"); - - equals(QUnit.equiv(new Object(), {}), true, "short annotation VS new annotation"); - equals(QUnit.equiv({}, new Object()), true, "short annotation VS new annotation"); - equals(QUnit.equiv(new Object(), {a:1}), false, "short annotation VS new annotation"); - equals(QUnit.equiv({a:1}, new Object()), false, "short annotation VS new annotation"); - equals(QUnit.equiv({a:undefined}, new Object()), false, "short annotation VS new annotation"); - equals(QUnit.equiv(new Object(), {a:undefined}), false, "short annotation VS new annotation"); -}); - -test("Objects Basics.", function() { - equals(QUnit.equiv({}, {}), true); - equals(QUnit.equiv({}, null), false); - equals(QUnit.equiv({}, undefined), false); - equals(QUnit.equiv({}, 0), false); - equals(QUnit.equiv({}, false), false); - - // This test is a hard one, it is very important - // REASONS: - // 1) They are of the same type "object" - // 2) [] instanceof Object is true - // 3) Their properties are the same (doesn't exists) - equals(QUnit.equiv({}, []), false); - - equals(QUnit.equiv({a:1}, {a:1}), true); - equals(QUnit.equiv({a:1}, {a:"1"}), false); - equals(QUnit.equiv({a:[]}, {a:[]}), true); - equals(QUnit.equiv({a:{}}, {a:null}), false); - equals(QUnit.equiv({a:1}, {}), false); - equals(QUnit.equiv({}, {a:1}), false); - - // Hard ones - equals(QUnit.equiv({a:undefined}, {}), false); - equals(QUnit.equiv({}, {a:undefined}), false); - equals(QUnit.equiv( - { - a: [{ bar: undefined }] - }, - { - a: [{ bat: undefined }] - } - ), false); -}); - - -test("Arrays Basics.", function() { - - equals(QUnit.equiv([], []), true); - - // May be a hard one, can invoke a crash at execution. - // because their types are both "object" but null isn't - // like a true object, it doesn't have any property at all. - equals(QUnit.equiv([], null), false); - - equals(QUnit.equiv([], undefined), false); - equals(QUnit.equiv([], false), false); - equals(QUnit.equiv([], 0), false); - equals(QUnit.equiv([], ""), false); - - // May be a hard one, but less hard - // than {} with [] (note the order) - equals(QUnit.equiv([], {}), false); - - equals(QUnit.equiv([null],[]), false); - equals(QUnit.equiv([undefined],[]), false); - equals(QUnit.equiv([],[null]), false); - equals(QUnit.equiv([],[undefined]), false); - equals(QUnit.equiv([null],[undefined]), false); - equals(QUnit.equiv([[]],[[]]), true); - equals(QUnit.equiv([[],[],[]],[[],[],[]]), true); - equals(QUnit.equiv( - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), - true); - equals(QUnit.equiv( - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // shorter - false); - equals(QUnit.equiv( - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], - [[],[],[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]), // deepest element not an array - false); - - // same multidimensional - equals(QUnit.equiv( - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,4,[ - 1,2,[ - 1,2,3,4,[ - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]], - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,4,[ - 1,2,[ - 1,2,3,4,[ - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]]), - true, "Multidimensional"); - - // different multidimensional - equals(QUnit.equiv( - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,4,[ - 1,2,[ - 1,2,3,4,[ - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]], - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,4,[ - 1,2,[ - '1',2,3,4,[ // string instead of number - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]]), - false, "Multidimensional"); - - // different multidimensional - equals(QUnit.equiv( - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,4,[ - 1,2,[ - 1,2,3,4,[ - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]], - [1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,6,7,8,9, [ - 1,2,3,4,5,[ - [6,7,8,9, [ - [ - 1,2,3,4,[ - 2,3,[ // missing an element (4) - 1,2,[ - 1,2,3,4,[ - 1,2,3,4,5,6,7,8,9,[ - 0 - ],1,2,3,4,5,6,7,8,9 - ],5,6,7,8,9 - ],4,5,6,7,8,9 - ],5,6,7,8,9 - ],5,6,7 - ] - ] - ] - ] - ]]]), - false, "Multidimensional"); -}); - -test("Functions.", function() { - var f0 = function () {}; - var f1 = function () {}; - - // f2 and f3 have the same code, formatted differently - var f2 = function () {var i = 0;}; - var f3 = function () { - var i = 0 // this comment and no semicoma as difference - }; - - equals(QUnit.equiv(function() {}, function() {}), false, "Anonymous functions"); // exact source code - equals(QUnit.equiv(function() {}, function() {return true;}), false, "Anonymous functions"); - - equals(QUnit.equiv(f0, f0), true, "Function references"); // same references - equals(QUnit.equiv(f0, f1), false, "Function references"); // exact source code, different references - equals(QUnit.equiv(f2, f3), false, "Function references"); // equivalent source code, different references - equals(QUnit.equiv(f1, f2), false, "Function references"); // different source code, different references - equals(QUnit.equiv(function() {}, true), false); - equals(QUnit.equiv(function() {}, undefined), false); - equals(QUnit.equiv(function() {}, null), false); - equals(QUnit.equiv(function() {}, {}), false); -}); - - -test("Date instances.", function() { - // Date, we don't need to test Date.parse() because it returns a number. - // Only test the Date instances by setting them a fix date. - // The date use is midnight January 1, 1970 - - var d1 = new Date(); - d1.setTime(0); // fix the date - - var d2 = new Date(); - d2.setTime(0); // fix the date - - var d3 = new Date(); // The very now - - // Anyway their types differs, just in case the code fails in the order in which it deals with date - equals(QUnit.equiv(d1, 0), false); // d1.valueOf() returns 0, but d1 and 0 are different - // test same values date and different instances equality - equals(QUnit.equiv(d1, d2), true); - // test different date and different instances difference - equals(QUnit.equiv(d1, d3), false); -}); - - -test("RegExp.", function() { - // Must test cases that imply those traps: - // var a = /./; - // a instanceof Object; // Oops - // a instanceof RegExp; // Oops - // typeof a === "function"; // Oops, false in IE and Opera, true in FF and Safari ("object") - - // Tests same regex with same modifiers in different order - var r = /foo/; - var r5 = /foo/gim; - var r6 = /foo/gmi; - var r7 = /foo/igm; - var r8 = /foo/img; - var r9 = /foo/mig; - var r10 = /foo/mgi; - var ri1 = /foo/i; - var ri2 = /foo/i; - var rm1 = /foo/m; - var rm2 = /foo/m; - var rg1 = /foo/g; - var rg2 = /foo/g; - - equals(QUnit.equiv(r5, r6), true, "Modifier order"); - equals(QUnit.equiv(r5, r7), true, "Modifier order"); - equals(QUnit.equiv(r5, r8), true, "Modifier order"); - equals(QUnit.equiv(r5, r9), true, "Modifier order"); - equals(QUnit.equiv(r5, r10), true, "Modifier order"); - equals(QUnit.equiv(r, r5), false, "Modifier"); - - equals(QUnit.equiv(ri1, ri2), true, "Modifier"); - equals(QUnit.equiv(r, ri1), false, "Modifier"); - equals(QUnit.equiv(ri1, rm1), false, "Modifier"); - equals(QUnit.equiv(r, rm1), false, "Modifier"); - equals(QUnit.equiv(rm1, ri1), false, "Modifier"); - equals(QUnit.equiv(rm1, rm2), true, "Modifier"); - equals(QUnit.equiv(rg1, rm1), false, "Modifier"); - equals(QUnit.equiv(rm1, rg1), false, "Modifier"); - equals(QUnit.equiv(rg1, rg2), true, "Modifier"); - - // Different regex, same modifiers - var r11 = /[a-z]/gi; - var r13 = /[0-9]/gi; // oops! different - equals(QUnit.equiv(r11, r13), false, "Regex pattern"); - - var r14 = /0/ig; - var r15 = /"0"/ig; // oops! different - equals(QUnit.equiv(r14, r15), false, "Regex pattern"); - - var r1 = /[\n\r\u2028\u2029]/g; - var r2 = /[\n\r\u2028\u2029]/g; - var r3 = /[\n\r\u2028\u2028]/g; // differs from r1 - var r4 = /[\n\r\u2028\u2029]/; // differs from r1 - - equals(QUnit.equiv(r1, r2), true, "Regex pattern"); - equals(QUnit.equiv(r1, r3), false, "Regex pattern"); - equals(QUnit.equiv(r1, r4), false, "Regex pattern"); - - // More complex regex - var regex1 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; - var regex2 = "^[-_.a-z0-9]+@([-_a-z0-9]+\\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; - // regex 3 is different: '.' not escaped - var regex3 = "^[-_.a-z0-9]+@([-_a-z0-9]+.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$"; - - var r21 = new RegExp(regex1); - var r22 = new RegExp(regex2); - var r23 = new RegExp(regex3); // diff from r21, not same pattern - var r23a = new RegExp(regex3, "gi"); // diff from r23, not same modifier - var r24a = new RegExp(regex3, "ig"); // same as r23a - - equals(QUnit.equiv(r21, r22), true, "Complex Regex"); - equals(QUnit.equiv(r21, r23), false, "Complex Regex"); - equals(QUnit.equiv(r23, r23a), false, "Complex Regex"); - equals(QUnit.equiv(r23a, r24a), true, "Complex Regex"); - - // typeof r1 is "function" in some browsers and "object" in others so we must cover this test - var re = / /; - equals(QUnit.equiv(re, function () {}), false, "Regex internal"); - equals(QUnit.equiv(re, {}), false, "Regex internal"); -}); - - -test("Complex Objects.", function() { - - function fn1() { - return "fn1"; - } - function fn2() { - return "fn2"; - } - - // Try to invert the order of some properties to make sure it is covered. - // It can failed when properties are compared between unsorted arrays. - equals(QUnit.equiv( - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - q: [], - p: 1/0, - o: 99 - }, - l: undefined, - m: null - } - }, - d: 0, - i: true, - h: "false" - } - }, - e: undefined, - g: "", - h: "h", - f: {}, - i: [] - }, - { - a: 1, - b: null, - c: [{}], - d: { - b: false, - a: 3.14159, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - t: undefined, - u: 0, - s: [1,2,3], - v: { - w: { - x: { - z: null, - y: "Yahoo!" - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - i: true, - h: "false" - } - }, - e: undefined, - g: "", - f: {}, - h: "h", - i: [] - } - ), true); - - equals(QUnit.equiv( - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - //r: "r", // different: missing a property - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - }, - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - } - ), false); - - equals(QUnit.equiv( - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - }, - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - //t: undefined, // different: missing a property with an undefined value - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - } - ), false); - - equals(QUnit.equiv( - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - }, - { - a: 1, - b: null, - c: [{}], - d: { - a: 3.14159, - b: false, - c: { - d: 0, - e: fn1, - f: [[[]]], - g: { - j: { - k: { - n: { - r: "r", - s: [1,2,3], - t: undefined, - u: 0, - v: { - w: { - x: { - y: "Yahoo!", - z: null - } - } - } - }, - o: 99, - p: 1/0, - q: {} // different was [] - }, - l: undefined, - m: null - } - }, - h: "false", - i: true - } - }, - e: undefined, - f: {}, - g: "", - h: "h", - i: [] - } - ), false); - - var same1 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3]], - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var same2 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3]], - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var diff1 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3,4]], // different: 4 was add to the array - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var diff2 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3]], - newprop: undefined, // different: newprop was added - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var diff3 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3]], - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ α" // different: missing last char - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var diff4 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,undefined,{}, [], [1,2,3]], // different: undefined instead of null - bar: undefined - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - var diff5 = { - a: [ - "string", null, 0, "1", 1, { - prop: null, - foo: [1,2,null,{}, [], [1,2,3]], - bat: undefined // different: property name not "bar" - }, 3, "Hey!", "Κάνε πάντα γνωρίζουμε ας των, μηχανής επιδιόρθωσης επιδιορθώσεις ώς μια. Κλπ ας" - ], - unicode: "老 汉语中存在 港澳和海外的华人圈中 贵州 我去了书店 现在尚有争", - b: "b", - c: fn1 - }; - - equals(QUnit.equiv(same1, same2), true); - equals(QUnit.equiv(same2, same1), true); - equals(QUnit.equiv(same2, diff1), false); - equals(QUnit.equiv(diff1, same2), false); - - equals(QUnit.equiv(same1, diff1), false); - equals(QUnit.equiv(same1, diff2), false); - equals(QUnit.equiv(same1, diff3), false); - equals(QUnit.equiv(same1, diff3), false); - equals(QUnit.equiv(same1, diff4), false); - equals(QUnit.equiv(same1, diff5), false); - equals(QUnit.equiv(diff5, diff1), false); -}); - - -test("Complex Arrays.", function() { - - function fn() { - } - - equals(QUnit.equiv( - [1, 2, 3, true, {}, null, [ - { - a: ["", '1', 0] - }, - 5, 6, 7 - ], "foo"], - [1, 2, 3, true, {}, null, [ - { - a: ["", '1', 0] - }, - 5, 6, 7 - ], "foo"]), - true); - - equals(QUnit.equiv( - [1, 2, 3, true, {}, null, [ - { - a: ["", '1', 0] - }, - 5, 6, 7 - ], "foo"], - [1, 2, 3, true, {}, null, [ - { - b: ["", '1', 0] // not same property name - }, - 5, 6, 7 - ], "foo"]), - false); - - var a = [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn, - f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 - ], [], [[[], "foo", null, { - n: 1/0, - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]; - - equals(QUnit.equiv(a, - [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn, - f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 - ], [], [[[], "foo", null, { - n: 1/0, - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]), true); - - equals(QUnit.equiv(a, - [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn, - f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[2]]]], "3"], {}, 1/0 // different: [[[[[2]]]]] instead of [[[[[3]]]]] - ], [], [[[], "foo", null, { - n: 1/0, - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]), false); - - equals(QUnit.equiv(a, - [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn, - f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 - ], [], [[[], "foo", null, { - n: -1/0, // different, -Infinity instead of Infinity - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]), false); - - equals(QUnit.equiv(a, - [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn, - f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 - ], [], [[[], "foo", { // different: null is missing - n: 1/0, - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]), false); - - equals(QUnit.equiv(a, - [{ - b: fn, - c: false, - "do": "reserved word", - "for": { - ar: [3,5,9,"hey!", [], { - ar: [1,[ - 3,4,6,9, null, [], [] - ]], - e: fn - // different: missing property f: undefined - }] - }, - e: 0.43445 - }, 5, "string", 0, fn, false, null, undefined, 0, [ - 4,5,6,7,8,9,11,22,33,44,55,"66", null, [], [[[[[3]]]], "3"], {}, 1/0 - ], [], [[[], "foo", null, { - n: 1/0, - z: { - a: [3,4,5,6,"yep!", undefined, undefined], - b: {} - } - }, {}]]]), false); -}); - - -test("Prototypal inheritance", function() { - function Gizmo(id) { - this.id = id; - } - - function Hoozit(id) { - this.id = id; - } - Hoozit.prototype = new Gizmo(); - - var gizmo = new Gizmo("ok"); - var hoozit = new Hoozit("ok"); - - // Try this test many times after test on instances that hold function - // to make sure that our code does not mess with last object constructor memoization. - equals(QUnit.equiv(function () {}, function () {}), false); - - // Hoozit inherit from Gizmo - // hoozit instanceof Hoozit; // true - // hoozit instanceof Gizmo; // true - equals(QUnit.equiv(hoozit, gizmo), true); - - Gizmo.prototype.bar = true; // not a function just in case we skip them - - // Hoozit inherit from Gizmo - // They are equivalent - equals(QUnit.equiv(hoozit, gizmo), true); - - // Make sure this is still true !important - // The reason for this is that I forgot to reset the last - // caller to where it were called from. - equals(QUnit.equiv(function () {}, function () {}), false); - - // Make sure this is still true !important - equals(QUnit.equiv(hoozit, gizmo), true); - - Hoozit.prototype.foo = true; // not a function just in case we skip them - - // Gizmo does not inherit from Hoozit - // gizmo instanceof Gizmo; // true - // gizmo instanceof Hoozit; // false - // They are not equivalent - equals(QUnit.equiv(hoozit, gizmo), false); - - // Make sure this is still true !important - equals(QUnit.equiv(function () {}, function () {}), false); -}); - - -test("Instances", function() { - function A() {} - var a1 = new A(); - var a2 = new A(); - - function B() { - this.fn = function () {}; - } - var b1 = new B(); - var b2 = new B(); - - equals(QUnit.equiv(a1, a2), true, "Same property, same constructor"); - - // b1.fn and b2.fn are functions but they are different references - // But we decided to skip function for instances. - equals(QUnit.equiv(b1, b2), true, "Same property, same constructor"); - equals(QUnit.equiv(a1, b1), false, "Same properties but different constructor"); // failed - - function Car(year) { - var privateVar = 0; - this.year = year; - this.isOld = function() { - return year > 10; - }; - } - - function Human(year) { - var privateVar = 1; - this.year = year; - this.isOld = function() { - return year > 80; - }; - } - - var car = new Car(30); - var carSame = new Car(30); - var carDiff = new Car(10); - var human = new Human(30); - - var diff = { - year: 30 - }; - - var same = { - year: 30, - isOld: function () {} - }; - - equals(QUnit.equiv(car, car), true); - equals(QUnit.equiv(car, carDiff), false); - equals(QUnit.equiv(car, carSame), true); - equals(QUnit.equiv(car, human), false); -}); - - -test("Complex Instances Nesting (with function value in literals and/or in nested instances)", function() { - function A(fn) { - this.a = {}; - this.fn = fn; - this.b = {a: []}; - this.o = {}; - this.fn1 = fn; - } - function B(fn) { - this.fn = fn; - this.fn1 = function () {}; - this.a = new A(function () {}); - } - - function fnOutside() { - } - - function C(fn) { - function fnInside() { - } - this.x = 10; - this.fn = fn; - this.fn1 = function () {}; - this.fn2 = fnInside; - this.fn3 = { - a: true, - b: fnOutside // ok make reference to a function in all instances scope - }; - this.o1 = {}; - - // This function will be ignored. - // Even if it is not visible for all instances (e.g. locked in a closures), - // it is from a property that makes part of an instance (e.g. from the C constructor) - this.b1 = new B(function () {}); - this.b2 = new B({ - x: { - b2: new B(function() {}) - } - }); - } - - function D(fn) { - function fnInside() { - } - this.x = 10; - this.fn = fn; - this.fn1 = function () {}; - this.fn2 = fnInside; - this.fn3 = { - a: true, - b: fnOutside, // ok make reference to a function in all instances scope - - // This function won't be ingored. - // It isn't visible for all C insances - // and it is not in a property of an instance. (in an Object instances e.g. the object literal) - c: fnInside - }; - this.o1 = {}; - - // This function will be ignored. - // Even if it is not visible for all instances (e.g. locked in a closures), - // it is from a property that makes part of an instance (e.g. from the C constructor) - this.b1 = new B(function () {}); - this.b2 = new B({ - x: { - b2: new B(function() {}) - } - }); - } - - function E(fn) { - function fnInside() { - } - this.x = 10; - this.fn = fn; - this.fn1 = function () {}; - this.fn2 = fnInside; - this.fn3 = { - a: true, - b: fnOutside // ok make reference to a function in all instances scope - }; - this.o1 = {}; - - // This function will be ignored. - // Even if it is not visible for all instances (e.g. locked in a closures), - // it is from a property that makes part of an instance (e.g. from the C constructor) - this.b1 = new B(function () {}); - this.b2 = new B({ - x: { - b1: new B({a: function() {}}), - b2: new B(function() {}) - } - }); - } - - - var a1 = new A(function () {}); - var a2 = new A(function () {}); - equals(QUnit.equiv(a1, a2), true); - - equals(QUnit.equiv(a1, a2), true); // different instances - - var b1 = new B(function () {}); - var b2 = new B(function () {}); - equals(QUnit.equiv(b1, b2), true); - - var c1 = new C(function () {}); - var c2 = new C(function () {}); - equals(QUnit.equiv(c1, c2), true); - - var d1 = new D(function () {}); - var d2 = new D(function () {}); - equals(QUnit.equiv(d1, d2), false); - - var e1 = new E(function () {}); - var e2 = new E(function () {}); - equals(QUnit.equiv(e1, e2), false); - -}); - - -test('object with references to self wont loop', function(){ - var circularA = { - abc:null - }, circularB = { - abc:null - }; - circularA.abc = circularA; - circularB.abc = circularB; - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)"); - - circularA.def = 1; - circularB.def = 1; - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object (ambigous test)"); - - circularA.def = 1; - circularB.def = 0; - equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object (unambigous test)"); -}); - -test('array with references to self wont loop', function(){ - var circularA = [], - circularB = []; - circularA.push(circularA); - circularB.push(circularB); - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)"); - - circularA.push( 'abc' ); - circularB.push( 'abc' ); - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on array (ambigous test)"); - - circularA.push( 'hello' ); - circularB.push( 'goodbye' ); - equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on array (unambigous test)"); -}); - -test('mixed object/array with references to self wont loop', function(){ - var circularA = [{abc:null}], - circularB = [{abc:null}]; - circularA[0].abc = circularA; - circularB[0].abc = circularB; - - circularA.push(circularA); - circularB.push(circularB); - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)"); - - circularA[0].def = 1; - circularB[0].def = 1; - equals(QUnit.equiv(circularA, circularB), true, "Should not repeat test on object/array (ambigous test)"); - - circularA[0].def = 1; - circularB[0].def = 0; - equals(QUnit.equiv(circularA, circularB), false, "Should not repeat test on object/array (unambigous test)"); -}); - -test("Test that must be done at the end because they extend some primitive's prototype", function() { - // Try that a function looks like our regular expression. - // This tests if we check that a and b are really both instance of RegExp - Function.prototype.global = true; - Function.prototype.multiline = true; - Function.prototype.ignoreCase = false; - Function.prototype.source = "my regex"; - var re = /my regex/gm; - equals(QUnit.equiv(re, function () {}), false, "A function that looks that a regex isn't a regex"); - // This test will ensures it works in both ways, and ALSO especially that we can make differences - // between RegExp and Function constructor because typeof on a RegExpt instance is "function" - equals(QUnit.equiv(function () {}, re), false, "Same conversely, but ensures that function and regexp are distinct because their constructor are different"); -}); diff --git a/js/libraries/balupton-history/vendor/qunit/test/test.js b/js/libraries/balupton-history/vendor/qunit/test/test.js deleted file mode 100755 index 3f942d2d..00000000 --- a/js/libraries/balupton-history/vendor/qunit/test/test.js +++ /dev/null @@ -1,324 +0,0 @@ -test("module without setup/teardown (default)", function() { - expect(1); - ok(true); -}); - -test("expect in test", 3, function() { - ok(true); - ok(true); - ok(true); -}); - -test("expect in test", 1, function() { - ok(true); -}); - -module("setup test", { - setup: function() { - ok(true); - } -}); - -test("module with setup", function() { - expect(2); - ok(true); -}); - -test("module with setup, expect in test call", 2, function() { - ok(true); -}); - -var state; - -module("setup/teardown test", { - setup: function() { - state = true; - ok(true); - }, - teardown: function() { - ok(true); - } -}); - -test("module with setup/teardown", function() { - expect(3); - ok(true); -}); - -module("setup/teardown test 2"); - -test("module without setup/teardown", function() { - expect(1); - ok(true); -}); - -if (typeof setTimeout !== 'undefined') { -state = 'fail'; - -module("teardown and stop", { - teardown: function() { - equal(state, "done", "Test teardown."); - } -}); - -test("teardown must be called after test ended", function() { - expect(1); - stop(); - setTimeout(function() { - state = "done"; - start(); - }, 13); -}); - -module("async setup test", { - setup: function() { - stop(); - setTimeout(function(){ - ok(true); - start(); - }, 500); - } -}); - -asyncTest("module with async setup", function() { - expect(2); - ok(true); - start(); -}); - -module("async teardown test", { - teardown: function() { - stop(); - setTimeout(function(){ - ok(true); - start(); - }, 500); - } -}); - -asyncTest("module with async teardown", function() { - expect(2); - ok(true); - start(); -}); - -module("asyncTest"); - -asyncTest("asyncTest", function() { - expect(2); - ok(true); - setTimeout(function() { - state = "done"; - ok(true); - start(); - }, 13); -}); - -asyncTest("asyncTest", 2, function() { - ok(true); - setTimeout(function() { - state = "done"; - ok(true); - start(); - }, 13); -}); - -test("sync", 2, function() { - stop(); - setTimeout(function() { - ok(true); - start(); - }, 13); - stop(); - setTimeout(function() { - ok(true); - start(); - }, 125); -}); -} - -module("save scope", { - setup: function() { - this.foo = "bar"; - }, - teardown: function() { - deepEqual(this.foo, "bar"); - } -}); -test("scope check", function() { - expect(2); - deepEqual(this.foo, "bar"); -}); - -module("simple testEnvironment setup", { - foo: "bar", - bugid: "#5311" // example of meta-data -}); -test("scope check", function() { - deepEqual(this.foo, "bar"); -}); -test("modify testEnvironment",function() { - this.foo="hamster"; -}); -test("testEnvironment reset for next test",function() { - deepEqual(this.foo, "bar"); -}); - -module("testEnvironment with object", { - options:{ - recipe:"soup", - ingredients:["hamster","onions"] - } -}); -test("scope check", function() { - deepEqual(this.options, {recipe:"soup",ingredients:["hamster","onions"]}) ; -}); -test("modify testEnvironment",function() { - // since we do a shallow copy, the testEnvironment can be modified - this.options.ingredients.push("carrots"); -}); -test("testEnvironment reset for next test",function() { - deepEqual(this.options, {recipe:"soup",ingredients:["hamster","onions","carrots"]}, "Is this a bug or a feature? Could do a deep copy") ; -}); - - -module("testEnvironment tests"); - -function makeurl() { - var testEnv = QUnit.current_testEnvironment; - var url = testEnv.url || 'http://example.com/search'; - var q = testEnv.q || 'a search test'; - return url + '?q='+encodeURIComponent(q); -} - -test("makeurl working",function() { - equal( QUnit.current_testEnvironment, this, 'The current testEnvironment is global'); - equal( makeurl(), 'http://example.com/search?q=a%20search%20test', 'makeurl returns a default url if nothing specified in the testEnvironment'); -}); - -module("testEnvironment with makeurl settings", { - url: 'http://google.com/', - q: 'another_search_test' -}); -test("makeurl working with settings from testEnvironment", function() { - equal( makeurl(), 'http://google.com/?q=another_search_test', 'rather than passing arguments, we use test metadata to form the url'); -}); -test("each test can extend the module testEnvironment", { - q:'hamstersoup' -}, function() { - equal( makeurl(), 'http://google.com/?q=hamstersoup', 'url from module, q from test'); -}); - -module("jsDump"); -test("jsDump output", function() { - equals( QUnit.jsDump.parse([1, 2]), "[\n 1,\n 2\n]" ); - equals( QUnit.jsDump.parse({top: 5, left: 0}), "{\n \"top\": 5,\n \"left\": 0\n}" ); - if (typeof document !== 'undefined' && document.getElementById("qunit-header")) { - equals( QUnit.jsDump.parse(document.getElementById("qunit-header")), "

                              " ); - equals( QUnit.jsDump.parse(document.getElementsByTagName("h1")), "[\n

                              \n]" ); - } -}); - -module("assertions"); -test("raises",function() { - function CustomError( message ) { - this.message = message; - } - - CustomError.prototype.toString = function() { - return this.message; - }; - - raises( - function() { - throw "error" - } - ); - - raises( - function() { - throw "error" - }, - 'raises with just a message, no expected' - ); - - raises( - function() { - throw new CustomError(); - }, - CustomError, - 'raised error is an instance of CustomError' - ); - - raises( - function() { - throw new CustomError("some error description"); - }, - /description/, - "raised error message contains 'description'" - ); - - raises( - function() { - throw new CustomError("some error description"); - }, - function( err ) { - if ( (err instanceof CustomError) && /description/.test(err) ) { - return true; - } - }, - "custom validation function" - ); - -}); - -if (typeof document !== "undefined") { - -module("fixture"); -test("setup", function() { - document.getElementById("qunit-fixture").innerHTML = "foobar"; -}); -test("basics", function() { - equal( document.getElementById("qunit-fixture").innerHTML, "test markup", "automatically reset" ); -}); - -} - -module("custom assertions"); -(function() { - function mod2(value, expected, message) { - var actual = value % 2; - QUnit.push(actual == expected, actual, expected, message); - } - test("mod2", function() { - mod2(2, 0, "2 % 2 == 0"); - mod2(3, 1, "3 % 2 == 1"); - }) -})(); - -(function() { - var reset = QUnit.reset; - function afterTest() { - ok( false, "reset should not modify test status" ); - } - module("reset"); - test("reset runs assertions", function() { - QUnit.reset = function() { - afterTest(); - reset.apply( this, arguments ); - }; - }); - test("reset runs assertions2", function() { - QUnit.reset = reset; - }); -})(); - -module("noglobals", { - teardown: function() { - delete window.badGlobalVariableIntroducedInTest; - } -}); -test("let teardown clean up globals", function() { - // this test will always pass if run without ?noglobals=true - window.badGlobalVariableIntroducedInTest = true; -}); diff --git a/js/libraries/balupton-history/vendor/right.js b/js/libraries/balupton-history/vendor/right.js deleted file mode 100755 index 8c91d9f5..00000000 --- a/js/libraries/balupton-history/vendor/right.js +++ /dev/null @@ -1,6014 +0,0 @@ -/** - * RightJS v2.2.3 - http://rightjs.org - * Released under the terms of MIT license - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -/** - * The basic layout for RightJS builds - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var RightJS = (function(window, document, Object, Array, String, Function, Number, Math, undefined) { - -/** - * The framework description object - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var RightJS = function(value) { - return value; // <- a dummy method to emulate the safe-mode -}; - -RightJS.version = "2.2.3"; -RightJS.modules =["core", "dom", "form", "events", "xhr", "fx", "cookie"]; - - - -/** - * There are some util methods - * - * Credits: - * Some of the functionality and names are inspired or copied from - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ - -/** - * Some top-level variables to shortify the things - */ -var A_proto = Array.prototype, -to_s = Object.prototype.toString, slice = A_proto.slice, -HTML = document.documentElement, UID = 1, // !#server -Wrappers_Cache = [], UID_KEY = 'uniqueNumber', // DON'T change the UID_KEY! - -/** - * extends the first object with the keys and values of the second one - * - * NOTE: the third optional argument tells if the existing values - * of the first object should _NOT_ get updated by the values of the second object - * - * @param oritinal Object destintation object - * @param source Object source object - * @param Boolean flag if the function should not overwrite intersecting values - * @return Object extended destination object - */ -$ext = RightJS.$ext = function(dest, source, dont_overwrite) { - var src = source || {}, key; - - for (key in src) { - if (!dont_overwrite || !(key in dest)) { - dest[key] = src[key]; - } - } - - return dest; -}, - -/** !#server - * evals the given javascript text in the context of the current window - * - * @param String javascript - * @return void - */ -$eval = RightJS.$eval = function(text) { - if (text) { - if ('execScript' in window) { - current_Document.win()._.execScript(text); - } else { - $E('script', {text: text}).insertTo(HTML); - } - } -}, - -/** - * throws an exception to break iterations throw a callback - * - * @return void - * @throws Break - */ -$break = RightJS.$break = function() { - throw new Break(); -}, - -/** - * generates aliases for the object properties - * - * @param object Object object - * @param names Object aliases hash - * @return Object the extended objects - */ -$alias = RightJS.$alias = function(object, names) { - for (var new_name in names) { - object[new_name] = object[names[new_name]]; - } - return object; -}, - -/** - * checks if the given value or a reference points - * to a really defined value - * - * NOTE: will return true for variables equal to null, false, 0, and so one. - * - * EXAMPLE: - * - * var smth = null; - * defined(smth); <- will return true - * - * var obj = {}; - * defined(obj['smth']); <- will return false - * - * @param mixed value - * @return boolean check result - */ -defined = RightJS.defined = function(value) { - return typeof(value) !== 'undefined'; -}, - - -/** - * checks if the given value is a function - * - * @param mixed value - * @return boolean check result - */ -isFunction = RightJS.isFunction = function(value) { - return typeof(value) === 'function'; -}, - -/** - * checks if the given value is a string - * - * @param mixed value - * @return boolean check result - */ -isString = RightJS.isString = function(value) { - return typeof(value) === 'string'; -}, - - -/** - * checks if the given value is a number - * - * @param mixed value to check - * @return boolean check result - */ -isNumber = RightJS.isNumber = function(value) { - return typeof(value) === 'number'; -}, - -/** - * checks if the given value is a hash-like object - * - * @param mixed value - * @return boolean check result - */ -isHash = RightJS.isHash = function(value) { - return to_s.call(value) === '[object Object]'; -}, - -/** - * checks if the given value is an array - * - * @param mixed value to check - * @return boolean check result - */ -isArray = RightJS.isArray = function(value) { - return to_s.call(value) === '[object Array]'; -}, - -/** !#server - * checks if the given value is an element - * - * @param mixed value to check - * @return boolean check result - */ -isElement = RightJS.isElement = function(value) { - return value != null && value.nodeType === 1; -}, - -/** !#server - * checks if the given value is a DOM-node - * - * @param mixed value to check - * @return boolean check result - */ -isNode = RightJS.isNode = function(value) { - return value != null && value.nodeType != null; -}, - -/** !#server - * searches an element by id and/or extends it with the framework extentions - * - * @param String element id or Element to extend - * @return Element or null - */ -$ = RightJS.$ = function(object) { - if (object instanceof Wrapper) { - return object; - } else if (typeof object === 'string') { - object = document.getElementById(object); - } - - return wrap(object); -}, - -/** !#server - * Finds all the elements in the document by the given css_rule - * - * @param String element - * @param Boolean raw search marker - * @return Array search result - */ -$$ = RightJS.$$ = function(css_rule, raw) { - return current_Document.find(css_rule, raw); -}, - -/** !#server - * shortcut to instance new elements - * - * @param String tag name - * @param object options - * @return Element instance - */ -$E = RightJS.$E = function(tag_name, options) { - return new Element(tag_name, options); -}, - -/** - * shortcut, generates an array of words from a given string - * - * @param String string - * @return Array of words - */ -$w = RightJS.$w = function(string) { - return string.trim().split(/\s+/); -}, - -/** - * generates an unique id for an object - * - * @param Object object - * @return Integer uniq id - */ -$uid = RightJS.$uid = function(item) { - return UID_KEY in item ? item[UID_KEY] : (item[UID_KEY] = UID++); -}, - -/** - * converts any iterables into an array - * - * @param Object iterable - * @return Array list - */ -$A = RightJS.$A = function(it) { - return slice.call(it, 0); -}; - -/** !#server - * IE needs a patch for the $A function - * because it doesn't handle all the cases - */ -if (!A_proto.map) { - $A = RightJS.$A = function(it) { - try { - return slice.call(it, 0); - } catch(e) { - for (var a=[], i=0, length = it.length; i < length; i++) { - a[i] = it[i]; - } - return a; - } - }; -} - -/** !#server - * Internet Explorer needs some additional mumbo-jumbo in here - */ -if (isHash(HTML)) { - isHash = RightJS.isHash = function(value) { - return to_s.call(value) === '[object Object]' && - value != null && value.hasOwnProperty != null; - }; -} - - -/** - * Generating methods for native units extending - */ -// adds a standard '.include' method to the native unit -function extend_native(klass) { - return $ext(klass, { - Methods: {}, - include: function() { - for (var i=0, l = arguments.length; i < l; i++) { - if (isHash(arguments[i])) { - $ext(klass.prototype, arguments[i]); - $ext(klass.Methods, arguments[i]); - } - } - } - }); -} - -for (var i=0, natives = 'Array Function Number String Date RegExp'.split(' '); i < natives.length; i++) { - RightJS[natives[i]] = extend_native(new Function('return '+ natives[i])()); -} - -// referring those two as well -RightJS.Object = Object; -RightJS.Math = Math; - - -/** - * Checks if the data is an array and if not, - * then makes an array out of it - * - * @param mixed in data - * @return Array data - */ -function ensure_array(data) { - return isArray(data) ? data : [data]; -} - - -/** - * The Object class extentions - * - * Credits: - * Some functionality is inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -$ext(Object, { - /** - * extracts the list of the attribute names of the given object - * - * @param Object object - * @return Array keys list - */ - keys: function(object) { - var keys = [], key; - for (key in object) { - keys.push(key); - } - return keys; - }, - - /** - * extracts the list of the attribute values of the given object - * - * @param Object object - * @return Array values list - */ - values: function(object) { - var values = [], key; - for (key in object) { - values.push(object[key]); - } - return values; - }, - - /** - * Calls the function with every key/value pair on the hash - * - * @param in Object the data hash - * @param Function the callback - * @param scope Object an optional scope - * @return Object the original hash - */ - each: function(object, callback, scope) { - for (var key in object) { - callback.call(scope, key, object[key]); - } - - return object; - }, - - /** - * checks if the object-hash has no keys - * - * @param Object object - * @return check result - */ - empty: function(object) { - for (var key in object) { return false; } - return true; - }, - - /** - * A simple cloning method - * NOTE: does not clone the things recoursively! - * - * @param Object object - * @return Object clone - */ - clone: function(object) { - return Object.merge(object); - }, - - /** - * returns a copy of the object which contains - * all the same keys/values except the key-names - * passed the the method arguments - * - * @param Object object - * @param String key-name to exclude - * ..... - * @return Object filtered copy - */ - without: function() { - var filter = $A(arguments), object = filter.shift(), copy = {}, key; - - for (key in object) { - if (!filter.include(key)) { - copy[key] = object[key]; - } - } - - return copy; - }, - - /** - * returns a copy of the object which contains all the - * key/value pairs from the specified key-names list - * - * NOTE: if some key does not exists in the original object, it will be just skipped - * - * @param Object object - * @param String key name to exclude - * ..... - * @return Object filtered copy - */ - only: function() { - var filter = $A(arguments), object = filter.shift(), copy = {}, - i=0, length = filter.length; - - for (; i < length; i++) { - if (filter[i] in object) { - copy[filter[i]] = object[filter[i]]; - } - } - - return copy; - }, - - /** - * merges the given objects and returns the result - * - * NOTE this method _DO_NOT_ change the objects, it creates a new object - * which conatins all the given ones. - * if there is some keys introspections, the last object wins. - * all non-object arguments will be omitted - * - * @param first Object object - * @param second Object mixing - * ...... - * @return Object merged object - */ - merge: function() { - var object = {}, i=0, args=arguments, key; - for (l = args.length; i < l; i++) { - if (isHash(args[i])) { - for (key in args[i]) { - object[key] = isHash(args[i][key]) && !(args[i][key] instanceof Class) ? - Object.merge(key in object ? object[key] : {}, args[i][key]) : args[i][key]; - } - } - } - return object; - }, - - /** - * converts a hash-object into an equivalent url query string - * - * @param Object object - * @return String query - */ - toQueryString: function(object) { - var tokens = [], key, value, encode = encodeURIComponent; - for (key in object) { - value = ensure_array(object[key]); - for (var i=0, l = value.length; i < l; i++) { - tokens.push(encode(key) +'='+ encode(value[i])); - } - } - return tokens.join('&'); - } -}, true); - - -/** - * here are the starndard Math object extends - * - * Credits: - * The idea of random mehtod is taken from - * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto - * - * Copyright (C) 2008-2010 Nikolay Nemshilov - */ -var Math_old_random = Math.random; - -/** - * the standard random method replacement, to make it more useful - * - * USE: - * Math.random(); // original functionality, returns a float between 0 and 1 - * Math.random(10); // returns an integer between 0 and 10 - * Math.random(1,4); // returns an integer between 1 and 4 - * - * @param min Integer minimum value if there's two arguments and maximum value if there's only one - * @param max Integer maximum value - * @return Float random between 0 and 1 if there's no arguments or an integer in the given range - */ -Math.random = function(min, max) { - - if (arguments.length === 0) { - return Math_old_random(); - } else if (arguments.length === 1) { - max = min; - min = 0; - } - - return ~~(Math_old_random() * (max-min+1) + ~~min); -}; - - -/** - * The Array class extentions - * - * Credits: - * Some of the functionality is inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto - * - * Copyright (C) 2008-2010 Nikolay Nemshilov - */ -var original_sort = A_proto.sort, - -// JavaScript 1.6 methods recatching up or faking -for_each = A_proto.forEach || function(callback, scope) { - for (var i=0, l=this.length; i < l; i++) { - callback.call(scope, this[i], i, this); - } -}, - -filter = A_proto.filter || function(callback, scope) { - for (var result=[], j=0, i=0, l=this.length; i < l; i++) { - if (callback.call(scope, this[i], i, this)) { - result[j++] = this[i]; - } - } - return result; -}, - -reject = function(callback, scope) { - for (var result=[], j=0, i=0, l=this.length; i < l; i++) { - if (!callback.call(scope, this[i], i, this)) { - result[j++] = this[i]; - } - } - return result; -}, - -map = A_proto.map || function(callback, scope) { - for (var result=[], i=0, l=this.length; i < l; i++) { - result[i] = callback.call(scope, this[i], i, this); - } - return result; -}, - -some = A_proto.some || function(callback, scope) { - for (var i=0, l=this.length; i < l; i++) { - if (callback.call(scope, this[i], i, this)) { - return true; - } - } - return false; -}, - -every = A_proto.every || function(callback, scope) { - for (var i=0, l=this.length; i < l; i++) { - if (!callback.call(scope, this[i], i, this)) { - return false; - } - } - return true; -}, - -first = function(callback, scope) { - for (var i=0, l=this.length; i < l; i++) { - if (callback.call(scope, this[i], i, this)) { - return this[i]; - } - } - return undefined; -}, - -last = function(callback, scope) { - for (var i=this.length-1; i > -1; i--) { - if (callback.call(scope, this[i], i, this)) { - return this[i]; - } - } - return undefined; -}; - - -// -// RightJS callbacks magick preprocessing -// - -// prepares a correct callback function -function guess_callback(argsi, array) { - var callback = argsi[0], args = slice.call(argsi, 1), scope = array, attr; - - if (typeof(callback) === 'string') { - attr = callback; - if (array.length !== 0 && typeof(array[0][attr]) === 'function') { - callback = function(object) { return object[attr].apply(object, args); }; - } else { - callback = function(object) { return object[attr]; }; - } - } else { - scope = args[0]; - } - - return [callback, scope]; -} - -// defining the manual break errors class -function Break() {} - -// calls the given method with preprocessing the arguments -function call_method(func, scope, args) { - try { - return func.apply(scope, guess_callback(args, scope)); - } catch(e) { if (!(e instanceof Break)) { throw(e); } } - - return undefined; -} - -// checks the value as a boolean -function boolean_check(i) { - return !!i; -} - -// default sorting callback -function default_sort(a, b) { - return a > b ? 1 : a < b ? -1 : 0; -} - -Array.include({ - /** - * IE fix - * returns the index of the value in the array - * - * @param mixed value - * @param Integer optional offset - * @return Integer index or -1 if not found - */ - indexOf: A_proto.indexOf || function(value, from) { - for (var i=(from<0) ? Math.max(0, this.length+from) : from || 0, l=this.length; i < l; i++) { - if (this[i] === value) { - return i; - } - } - return -1; - }, - - /** - * IE fix - * returns the last index of the value in the array - * - * @param mixed value - * @return Integer index or -1 if not found - */ - lastIndexOf: A_proto.lastIndexOf || function(value) { - for (var i=this.length-1; i > -1; i--) { - if (this[i] === value) { - return i; - } - } - return -1; - }, - - /** - * returns the first element of the array - * - * @return mixed first element of the array - */ - first: function() { - return arguments.length ? call_method(first, this, arguments) : this[0]; - }, - - /** - * returns the last element of the array - * - * @return mixed last element of the array - */ - last: function() { - return arguments.length ? call_method(last, this, arguments) : this[this.length-1]; - }, - - /** - * returns a random item of the array - * - * @return mixed a random item - */ - random: function() { - return this.length === 0 ? undefined : this[Math.random(this.length-1)]; - }, - - /** - * returns the array size - * - * @return Integer the array size - */ - size: function() { - return this.length; - }, - - /** - * cleans the array - * @return Array this - */ - clean: function() { - this.length = 0; - return this; - }, - - /** - * checks if the array has no elements in it - * - * @return boolean check result - */ - empty: function() { - return this.length === 0; - }, - - /** - * creates a copy of the given array - * - * @return Array copy of the array - */ - clone: function() { - return this.slice(0); - }, - - /** - * calls the given callback function in the given scope for each element of the array - * - * @param Function callback - * @param Object scope - * @return Array this - */ - each: function() { - call_method(for_each, this, arguments); - return this; - }, - forEach: for_each, - - /** - * creates a list of the array items converted in the given callback function - * - * @param Function callback - * @param Object optional scope - * @return Array collected - */ - map: function() { - return call_method(map, this, arguments); - }, - - /** - * creates a list of the array items which are matched in the given callback function - * - * @param Function callback - * @param Object optional scope - * @return Array filtered copy - */ - filter: function() { - return call_method(filter, this, arguments); - }, - - /** - * creates a list of the array items that are not matching the give callback function - * - * @param Function callback - * @param Object optionl scope - * @return Array filtered copy - */ - reject: function() { - return call_method(reject, this, arguments); - }, - - /** - * checks if any of the array elements is logically true - * - * @param Function optional callback for checks - * @param Object optional scope for the callback - * @return boolean check result - */ - some: function(value) { - return call_method(some, this, value ? arguments : [boolean_check]); - }, - - /** - * checks if all the array elements are logically true - * - * @param Function optional callback for checks - * @param Object optional scope for the callback - * @return Boolean check result - */ - every: function(value) { - return call_method(every, this, value ? arguments : [boolean_check]); - }, - - /** - * applies the given lambda to each element in the array - * - * NOTE: changes the array by itself - * - * @param Function callback - * @param Object optional scope - * @return Array this - */ - walk: function() { - this.map.apply(this, arguments).forEach(function(value, i) { this[i] = value; }, this); - return this; - }, - - /** - * similar to the concat function but it adds only the values which are not on the list yet - * - * @param Array to merge - * .................... - * @return Array new merged - */ - merge: function() { - for (var copy = this.clone(), arg, i=0; i < arguments.length; i++) { - arg = ensure_array(arguments[i]); - - for (var j=0; j < arg.length; j++) { - if (copy.indexOf(arg[j]) == -1) { - copy.push(arg[j]); - } - } - } - return copy; - }, - - /** - * flats out complex array into a single dimension array - * - * @return Array flatten copy - */ - flatten: function() { - var copy = []; - this.forEach(function(value) { - if (isArray(value)) { - copy = copy.concat(value.flatten()); - } else { - copy.push(value); - } - }); - return copy; - }, - - /** - * returns a copy of the array whithout any null or undefined values - * - * @return Array filtered version - */ - compact: function() { - return this.without(null, undefined); - }, - - /** - * returns a copy of the array which contains only the unique values - * - * @return Array filtered copy - */ - uniq: function() { - return [].merge(this); - }, - - /** - * checks if all of the given values - * exists in the given array - * - * @param mixed value - * .... - * @return boolean check result - */ - includes: function() { - for (var i=0; i < arguments.length; i++) { - if (this.indexOf(arguments[i]) === -1) { - return false; - } - } - return true; - }, - - /** - * returns a copy of the array without the items passed as the arguments - * - * @param mixed value - * ...... - * @return Array filtered copy - */ - without: function() { - var filter = slice.call(arguments); - return this.filter(function(value) { - return filter.indexOf(value) === -1; - }); - }, - - /** - * Shuffles the array items in a random order - * - * @return Array shuffled version - */ - shuffle: function() { - var shuff = this.clone(), j, x, i = shuff.length; - - for (; i > 0; j = Math.random(i-1), x = shuff[--i], shuff[i] = shuff[j], shuff[j] = x) {} - - return shuff; - }, - - /** - * Default sort fix for numeric values - * - * @param Function callback - * @return Array self - */ - sort: function(callback) { - return original_sort.apply(this, (callback || !isNumber(this[0])) ? arguments : [default_sort]); - }, - - /** - * sorts the array by running its items though a lambda or calling their attributes - * - * @param Function callback or attribute name - * @param Object scope or attribute argument - * @return Array sorted copy - */ - sortBy: function() { - var pair = guess_callback(arguments, this); - - return this.sort(function(a, b) { - return default_sort( - pair[0].call(pair[1], a), - pair[0].call(pair[1], b) - ); - }); - }, - - /** - * Returns the minimal value on the list - * - * @return Number minimal value - */ - min: function() { - return Math.min.apply(Math, this); - }, - - /** - * Returns the maximal value - * - * @return Number maximal value - */ - max: function() { - return Math.max.apply(Math, this); - }, - - /** - * Returns a summ of all the items on the list - * - * @return Number a summ of values on the list - */ - sum: function() { - for(var sum=0, i=0, l=this.length; i < l; sum += this[i++]) {} - return sum; - } -}); - -A_proto.include = A_proto.includes; - - -/** - * The String class extentions - * - * Credits: - * Some of the functionality inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * The trim function taken from work of Steven Levithan - * - http://blog.stevenlevithan.com/archives/faster-trim-javascript - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -String.include({ - /** - * checks if the string is an empty string - * - * @return boolean check result - */ - empty: function() { - return this == ''; - }, - - /** - * checks if the string contains only white-spaces - * - * @return boolean check result - */ - blank: function() { - return this == false; - }, - - /** - * removes trailing whitespaces - * - * @return String trimmed version - */ - trim: String.prototype.trim || function() { - var str = this.replace(/^\s\s*/, ''), i = str.length; - while ((/\s/).test(str.charAt(--i))) {} - return str.slice(0, i + 1); - }, - - /** - * returns a copy of the string with all the tags removed - * @return String without tags - */ - stripTags: function() { - return this.replace(/<\/?[^>]+>/ig, ''); - }, - - /** - * removes all the scripts declarations out of the string - * @param mixed option. If it equals true the scrips will be executed, - * if a function the scripts will be passed in it - * @return String without scripts - */ - stripScripts: function(option) { - var scripts = '', text = this.replace( - /]*>([\s\S]*?)<\/script>/img, - function(match, source) { - scripts += source + "\n"; - return ''; - } - ); - - if (option === true) { - $eval(scripts); - } else if (isFunction(option)) { - option(scripts, text); - } - - return text; - }, - - /** - * extracts all the scripts out of the string - * - * @return String the extracted stcripts - */ - extractScripts: function() { - var scripts = ''; - this.stripScripts(function(s) { scripts = s; }); - return scripts; - }, - - /** - * evals all the scripts in the string - * - * @return String self (unchanged version with scripts still in their place) - */ - evalScripts: function() { - this.stripScripts(true); - return this; - }, - - /** - * converts underscored or dasherized string to a camelized one - * @returns String camelized version - */ - camelize: function() { - return this.replace(/(\-|_)+(.)?/g, function(match, dash, chr) { - return chr ? chr.toUpperCase() : ''; - }); - }, - - /** - * converts a camelized or dasherized string into an underscored one - * @return String underscored version - */ - underscored: function() { - return this.replace(/([a-z\d])([A-Z]+)/g, '$1_$2').replace(/\-/g, '_').toLowerCase(); - }, - - /** - * returns a capitalised version of the string - * - * @return String captialised version - */ - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - /** - * checks if the string contains the given substring - * - * @param String string - * @return boolean check result - */ - includes: function(string) { - return this.indexOf(string) != -1; - }, - - /** - * checks if the string starts with the given substring - * - * @param String string - * @param boolean ignore the letters case - * @return boolean check result - */ - startsWith: function(string, ignorecase) { - return (ignorecase !== true ? this.indexOf(string) : - this.toLowerCase().indexOf(string.toLowerCase()) - ) === 0; - }, - - /** - * checks if the string ends with the given substring - * - * @param String substring - * @param boolean ignore the letters case - * @return boolean check result - */ - endsWith: function(string, ignorecase) { - return this.length - ( - ignorecase !== true ? this.lastIndexOf(string) : - this.toLowerCase().lastIndexOf(string.toLowerCase()) - ) === string.length; - }, - - /** - * converts the string to an integer value - * @param Integer base - * @return Integer or NaN - */ - toInt: function(base) { - return parseInt(this, base === undefined ? 10 : base); - }, - - /** - * converts the string to a float value - * @param boolean flat if the method should not use a flexible matching - * @return Float or NaN - */ - toFloat: function(strict) { - return parseFloat(strict === true ? this : - this.replace(',', '.').replace(/(\d)-(\d)/, '$1.$2')); - } - -}); - -String.prototype.include = String.prototype.includes; - - -/** - * The Function class extentions - * - * Credits: - * Some of the functionality inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Function.include({ - /** - * binds the function to be executed in the given scope - * - * @param Object scope - * @param mixed optional curry (left) argument - * .... - * @return Function binded function - */ - bind: function() { - var args = $A(arguments), scope = args.shift(), func = this; - return function() { - return func.apply(scope, - (args.length !== 0 || arguments.length !== 0) ? - args.concat($A(arguments)) : args - ); - }; - }, - - /** - * binds the function as an event listener to the given scope object - * - * @param Object scope - * @param mixed optional curry (left) argument - * ....... - * @return Function binded function - */ - bindAsEventListener: function() { - var args = $A(arguments), scope = args.shift(), func = this; - return function(event) { - return func.apply(scope, [event].concat(args).concat($A(arguments))); - }; - }, - - /** - * allows you to put some curry in your cookery - * - * @param mixed value to curry - * .... - * @return Function curried function - */ - curry: function() { - return this.bind.apply(this, [this].concat($A(arguments))); - }, - - /** - * The right side curry feature - * - * @param mixed value to curry - * .... - * @return Function curried function - */ - rcurry: function() { - var curry = $A(arguments), func = this; - return function() { - return func.apply(func, $A(arguments).concat(curry)); - }; - }, - - /** - * delays the function execution - * - * @param Integer delay ms - * @param mixed value to curry - * ..... - * @return Integer timeout marker - */ - delay: function() { - var args = $A(arguments), timeout = args.shift(), - timer = new Number(setTimeout(this.bind.apply(this, [this].concat(args)), timeout)); - - timer.cancel = function() { clearTimeout(this); }; - - return timer; - }, - - /** - * creates a periodical execution of the function with the given timeout - * - * @param Integer delay ms - * @param mixed value to curry - * ... - * @return Ineger interval marker - */ - periodical: function() { - var args = $A(arguments), timeout = args.shift(), - timer = new Number(setInterval(this.bind.apply(this, [this].concat(args)), timeout)); - - timer.stop = function() { clearInterval(this); }; - - return timer; - }, - - /** - * Chains the given function after the current one - * - * @param Function the next function - * @param mixed optional value to curry - * ...... - * @return Function chained function - */ - chain: function() { - var args = $A(arguments), func = args.shift(), current = this; - return function() { - var result = current.apply(current, arguments); - func.apply(func, args); - return result; - }; - } -}); - - -/** - * The Number class extentions - * - * Credits: - * Some methods inspired by - * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto - * - * Copyright (C) 2008-2010 Nikolay V. Nemshilov - */ -Number.include({ - /** - * executes the given callback the given number of times - * - * @param Function callback - * @param Object optional callback execution scope - * @return void - */ - times: function(callback, scope) { - for (var i=0; i < this; i++) { - callback.call(scope, i); - } - return this; - }, - - upto: function(number, callback, scope) { - for (var i=this+0; i <= number; i++) { - callback.call(scope, i); - } - return this; - }, - - downto: function(number, callback, scope) { - for (var i=this+0; i >= number; i--) { - callback.call(scope, i); - } - return this; - }, - - abs: function() { - return Math.abs(this); - }, - - round: function(size) { - return size ? parseFloat(this.toFixed(size)) : Math.round(this); - }, - - ceil: function() { - return Math.ceil(this); - }, - - floor: function() { - return Math.floor(this); - }, - - min: function(value) { - return this < value ? value : this + 0; - }, - - max: function(value) { - return this > value ? value : this + 0; - } -}); - - -/** - * The Regexp class extentions - * - * Credits: - * Inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2010 Nikolay V. Nemshilov - */ - - - /** - * Escapes the string for safely use as a regular expression - * - * @param String raw string - * @return String escaped string - */ -RegExp.escape = function(string) { - return (''+string).replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, '\\$1'); -}; - - -/** - * The basic Class unit - * - * Credits: - * The Class unit is inspired by its implementation in - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - Ruby (http://www.ruby-lang.org) Copyright (C) Yukihiro Matsumoto - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var Class = RightJS.Class = function() { - var args = $A(arguments).slice(0,2), - props = args.pop() || {}, - parent = args.pop(), - klass = arguments[2], // you can send your own klass as the third argument - SKlass = function() {}; - - // if the parent class only was specified - if (!args.length && !isHash(props)) { - parent = props; props = {}; - } - -// !#server:begin - if (!klass && parent && (parent === Wrapper || parent.ancestors.include(Wrapper))) { - klass = Wrapper_makeKlass(); - } -// !#server:end - - // defining the basic klass function - klass = $ext(klass || function() { - Class_checkPrebind(this); - return 'initialize' in this ? - this.initialize.apply(this, arguments) : - this; - }, Class_Methods); - - // handling the inheritance - parent = parent || Class; - - SKlass.prototype = parent.prototype; - klass.prototype = new SKlass(); - klass.parent = parent; - klass.prototype.constructor = klass; - - // collecting the list of ancestors - klass.ancestors = []; - while (parent) { - klass.ancestors.push(parent); - parent = parent.parent; - } - - // handling the module injections - ['extend', 'include'].each(function(name) { - if (name in props) { - klass[name].apply(klass, ensure_array(props[name])); - } - }); - - return klass.include(props); -}, - -/** - * Class utility methods - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -Class_Methods = { - /** - * this method will extend the class-level with the given objects - * - * NOTE: this method _WILL_OVERWRITE_ the existing itercecting entries - * - * NOTE: this method _WILL_NOT_OVERWRITE_ the class prototype and - * the class 'name' and 'parent' attributes. If one of those - * exists in one of the received modeuls, the attribute will be - * skipped - * - * @param Object module to extend - * .... - * @return Class the klass - */ - extend: function() { - $A(arguments).filter(isHash).each(function(module) { - $ext(this, Class_clean_module(module, true)); - Class_handle_module_callbacks(this, module, true); - }, this); - - return this; - }, - - /** - * extends the class prototype with the given objects - * NOTE: this method _WILL_OVERWRITE_ the existing itercecting entries - * NOTE: this method _WILL_NOT_OVERWRITE_ the 'klass' attribute of the klass.prototype - * - * @param Object module to include - * .... - * @return Class the klass - */ - include: function() { - var klasses = [this].concat(this.ancestors); - - $A(arguments).filter(isHash).each(function(module) { - Object.each(Class_clean_module(module, false), function(name, method) { - // searching for the super-method - for (var super_method, i=0, l = klasses.length; i < l; i++) { - if (name in klasses[i].prototype) { - super_method = klasses[i].prototype[name]; - break; - } - } - - this.prototype[name] = isFunction(method) && isFunction(super_method) ? - function() { - this.$super = super_method; - return method.apply(this, arguments); - } : method; - }, this); - - Class_handle_module_callbacks(this, module, false); - }, this); - - return this; - } -}, - -Class_module_callback_names = $w( - 'selfExtended self_extended selfIncluded self_included extend include' -); - -// hooking up the class-methods to the root class -$ext(Class, Class_Methods); -Class.prototype.$super = undefined; - -function Class_clean_module(module, extend) { - return Object.without.apply(Object, [module].concat( - Class_module_callback_names.concat( extend ? - $w('prototype parent ancestors') : ['constructor'] - ) - )); -} - -function Class_handle_module_callbacks(klass, module, extend) { - (module[Class_module_callback_names[extend ? 0 : 2]] || - module[Class_module_callback_names[extend ? 1 : 3]] || - function() {} - ).call(module, klass); -} - -/** - * This method gets through a list of the object its class and all the ancestors - * and finds a hash named after property, used for configuration purposes with - * the Observer and Options modules - * - * NOTE: this method will look for capitalized and uppercased versions of the - * property name - * - * @param Object a class instance - * @param String property name - * @return Object hash or null if nothing found - */ -function Class_findSet(object, property) { - var upcased = property.toUpperCase(), - constructor = object.constructor, - candidates = [object, constructor].concat(constructor.ancestors || []), - i = 0; - - for (l = candidates.length; i < l; i++) { - if (upcased in candidates[i]) { - return candidates[i][upcased]; - } else if (property in candidates[i]) { - return candidates[i][property]; - } - } - - return null; -} - -/** - * Handles the 'prebind' feature for Class instances - * - * @param Class instance - * @return void - */ -function Class_checkPrebind(object) { - if ('prebind' in object && isArray(object.prebind)) { - object.prebind.each(function(method) { - object[method] = object[method].bind(object); - }); - } -} - -/** - * This is a simple mix-in module to be included in other classes - * - * Basically it privdes the setOptions method which processes - * an instance options assigment and merging with the default options - * - * Credits: - * The idea of the module is inspired by - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -var Options = RightJS.Options = { - /** - * assigns the options by merging them with the default ones - * - * @param Object options - * @return Object current instance - */ - setOptions: function(opts) { - var options = this.options = $ext($ext({}, - Object.clone(Class_findSet(this, 'Options'))), opts - ), match, key; - - // hooking up the observer options - if (isFunction(this.on)) { - for (key in options) { - if ((match = key.match(/on([A-Z][A-Za-z]+)/))) { - this.on(match[1].toLowerCase(), options[key]); - delete(options[key]); - } - } - } - - return this; - }, - - /** - * Cuts of an options hash from the end of the arguments list - * assigns them using the #setOptions method and then - * returns the list of other arguments as an Array instance - * - * @param mixed iterable - * @return Array of the arguments - */ - cutOptions: function(in_args) { - var args = $A(in_args); - this.setOptions(isHash(args.last()) ? args.pop() : {}); - return args; - } -}; - - -/** - * standard Observer class. - * - * Might be used as a usual class or as a builder over another objects - * - * Credits: - * The naming principle is inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var Observer = RightJS.Observer = new Class({ - include: Options, - - /** - * general constructor - * - * @param Object options - */ - initialize: function(options) { - this.setOptions(options); - Observer_createShortcuts(this, Class_findSet(this, 'Events')); - return this; - }, - - /** - * binds an event listener - * - * USAGE: - * on(String event, Function callback[, arguments, ...]); - * on(String event, String method_name[, arguments, ...]); - * on(Object events_hash); - * - * @return Observer self - */ - on: function() { - Observer_on(this, arguments, function(h) { return h; }); - return this; - }, - - /** - * checks if the observer observes given event and/or callback - * - * USAGE: - * observes(String event) - * observes(Function callback) - * observes(String event, Function callback) - * - * @retun boolean check result - */ - observes: function(event, callback) { - if (!isString(event)) { callback = event; event = null; } - if (isString(callback)) { callback = callback in this ? this[callback] : null; } - - return (this.$listeners || []).some(function(i) { - return (event && callback) ? i.e === event && i.f === callback : - event ? i.e === event : i.f === callback; - }); - }, - - /** - * stops observing an event or/and function - * - * USAGE: - * stopObserving(String event) - * stopObserving(Function callback) - * stopObserving(String event, Function callback) - * - * @return Observer self - */ - stopObserving: function(event, callback) { - Observer_stopObserving(this, event, callback, function() {}); - return this; - }, - - /** - * returns the listeners list for the event - * - * NOTE: if no event was specified the method will return _all_ - * event listeners for _all_ the events - * - * @param String event name - * @return Array of listeners - */ - listeners: function(event) { - return (this.$listeners || []).filter(function(i) { - return !event || i.e === event; - }).map(function(i) { return i.f; }).uniq(); - }, - - /** - * initiates the event handling - * - * @param String event name - * @param mixed optional argument - * ........ - * @return Observer self - */ - fire: function() { - var args = $A(arguments), event = args.shift(); - - (this.$listeners || []).each(function(i) { - if (i.e === event) { - i.f.apply(this, i.a.concat(args)); - } - }, this); - - return this; - } -}), - -/** - * adds an observer functionality to any object - * - * @param Object object - * @param Array optional events list to build shortcuts - * @return Object extended object - */ -Observer_create = Observer.create = function(object, events) { - $ext(object, Object.without(Observer.prototype, 'initialize', 'setOptions'), true); - return Observer_createShortcuts(object, events || Class_findSet(object, 'Events')); -}, - -/** - * builds shortcut methods to wire/fire events on the object - * - * @param Object object to extend - * @param Array list of event names - * @return Object extended object - */ -Observer_createShortcuts = Observer.createShortcuts = function(object, names) { - (names || []).each(function(name) { - var method_name = 'on'+name.replace(/(^|_|:)([a-z])/g, - function(match, pre, chr) { return chr.toUpperCase(); } - ); - - if (!(method_name in object)) { - object[method_name] = function() { - return this.on.apply(this, [name].concat($A(arguments))); - }; - } - }); - - return object; -}; - -function Observer_on(object, o_args, preprocess) { - var args = slice.call(o_args, 2), - event = o_args[0], - callback = o_args[1], - name = false; - - if (isString(event)) { - switch (typeof callback) { - case "string": - name = callback; - callback = callback in object ? object[callback] : function() {}; - - case "function": - ('$listeners' in object ? object.$listeners : ( - object.$listeners = [] - )).push(preprocess({ - e: event, f: callback, a: args, r: name || false, t: object - })); - break; - - default: - if (isArray(callback)) { - for (var i=0; i < callback.length; i++) { - object.on.apply(object, [event].concat( - ensure_array(callback[i]) - ).concat(args)); - } - } - } - - } else { - // assuming it's a hash of key-value pairs - args = slice.call(o_args, 1); - - for (name in event) { - object.on.apply(object, [name].concat( - ensure_array(event[name]) - ).concat(args)); - } - } -} - -function Observer_stopObserving(object, event, callback, preprocess) { - if (isHash(event)) { - for (var key in event) { - object.stopObserving(key, event[key]); - } - } else { - if (!isString(event)) { callback = event; event = null; } - if (isString(callback)){ callback = object[callback]; } - - object.$listeners = (object.$listeners || []).filter(function(i) { - var result = (event && callback) ? - (i.e !== event || i.f !== callback) : - (event ? i.e !== event : i.f !== callback); - - if (!result) { preprocess(i); } - - return result; - }); - } -} - - -/** - * this object will contain info about the current browser - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -var agent = navigator.userAgent, - Browser_Opera = 'opera' in window, - Browser_IE = 'attachEvent' in window && !Browser_Opera, - -Browser = RightJS.Browser = { - IE: Browser_IE, - Opera: Browser_Opera, - WebKit: agent.include('AppleWebKit/'), - Gecko: agent.include('Gecko') && !agent.include('KHTML'), - MobileSafari: /Apple.*Mobile.*Safari/.test(agent), - Konqueror: agent.include('Konqueror'), - - // internal marker for the browsers which require the olds module - OLD: !document.querySelector, - // internal marker for IE browsers version <= 8 - IE8L: false -}, - -IE8_OR_LESS = false, -IE_OPACITY = !('opacity' in HTML.style) && ('filter' in HTML.style); - -try { - // checking if that an IE version <= 8 - document.createElement(''); - Browser.OLD = Browser.IE8L = IE8_OR_LESS = true; -} catch(e) {} - - -/** - * The dom-wrapper main unit - * - * This unit is basically for the internal use - * so that we could control the common functionality - * among all the wrappers - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ - -var Wrapper = RightJS.Wrapper = new Class({ - // predefining the property in the prototype - _: undefined, - - /** - * Default constructor - * - * @param mixed raw dom unit - * @return void - */ - initialize: function(raw_object) { - this._ = raw_object; - } -}); - -// exposing the cache so it could be manupulated externally -Wrapper.Cache = Wrappers_Cache; - -// instantiating the actual class object for a wrapper -function Wrapper_makeKlass() { - /** - * Default wrappers Klass function - * - * @param mixed the raw object - * @param Object options - * @return void - */ - return function(object, options) { - Class_checkPrebind(this); - - this.initialize.apply(this, arguments); // <- there might be a different number of args in a subclass - - var item = this._, uid = UID_KEY in item ? item[UID_KEY] : - // NOTE we use positive indexes for dom-elements and negative for everything else - (item[UID_KEY] = (item.nodeType === 1 ? 1 : -1) * UID++); - - Wrappers_Cache[uid] = this; - }; -} - -/** - * Element's own Klass function - * we need that because it does some dynamic typecasting mumbo jumbo - * plus we would like to optimize some stuff here and there - * - * @param raw dom element or the tag name - * @param Object options - * @return Element instance - */ -function Element_Klass(element, options) { - Element_initialize(this, element, options); - - var inst = this, raw = inst._, cast = Wrapper.Cast(raw), - uid = UID_KEY in raw ? raw[UID_KEY] : (raw[UID_KEY] = UID++); - - if (cast !== undefined) { - inst = new cast(raw, options); - if ('$listeners' in this) { - inst.$listeners = this.$listeners; - } - } - - Wrappers_Cache[uid] = inst; - - return inst; -} - -// searches for a suitable class for dynamic typecasting -Wrapper.Cast = function(unit) { - return unit.tagName in Element_wrappers ? Element_wrappers[unit.tagName] : undefined; -}; - -/** - * Event's own Klass function, we don't need to check - * nothing in here, don't need to hit the wrappers cache and so one - * - * @param raw dom-event or a string event-name - * @param bounding element or an object with options - * @return void - */ -function Event_Klass(event, bound_element) { - if (typeof(event) === 'string') { - event = $ext({type: event}, bound_element); - this.stopped = event.bubbles === false; - - if (isHash(bound_element)) { - $ext(this, bound_element); - } - } - - this._ = event; - this.type = event.type; - - this.which = event.which; - this.keyCode = event.keyCode; - - this.target = wrap( - // Webkit throws events on textual nodes as well, gotta fix that - event.target != null && 'nodeType' in event.target && event.target.nodeType === 3 ? - event.target.parentNode : event.target - ); - - this.currentTarget = wrap(event.currentTarget); - this.relatedTarget = wrap(event.relatedTarget); - - this.pageX = event.pageX; - this.pageY = event.pageY; - - // making old IE attrs looks like w3c standards - if (IE8_OR_LESS && 'srcElement' in event) { - this.which = event.button === 2 ? 3 : event.button === 4 ? 2 : 1; - - this.target = wrap(event.srcElement) || bound_element; - this.relatedTarget = this.target._ === event.fromElement ? wrap(event.toElement) : this.target; - this.currentTarget = bound_element; - - var scrolls = this.target.win().scrolls(); - - this.pageX = event.clientX + scrolls.x; - this.pageY = event.clientY + scrolls.y; - } -} - - -/** - * Private quick wrapping function, unlike `$` - * it doesn't search by ID and handle double-wrapps - * just pure dom-wrapping functionality - * - * @param raw dom unit - * @return Wrapper dom-wrapper - */ -function wrap(object) { - if (object != null) { - var wrapper = UID_KEY in object ? Wrappers_Cache[object[UID_KEY]] : undefined; - - if (wrapper !== undefined) { - return wrapper; - } else if (object.nodeType === 1) { - return new Element(object); - } else if (object.nodeType === 9) { - return new Document(object); - } else if (object.window == object) { - return new Window(object); - } else if (isElement(object.target) || isElement(object.srcElement)) { - return new Event(object); - } - } - - return object; -} - -/** - * A simple document wrapper - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -var Document = RightJS.Document = new Class(Wrapper, { - // returns the window reference - win: function() { - return wrap(this._.defaultView || this._.parentWindow); - } -}), - -// a common local wrapped document reference -current_Document = wrap(document); - - -/** - * the window object extensions - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var Window = RightJS.Window = new Class(Wrapper, { - /** - * Selfreference to have a common interface with the rest of the wrappers - * in case of events handling - * - * @return Window - */ - win: function() { - return this; - }, - - /** - * returns the inner-size of the window - * - * @return Object x: d+, y: d+ - */ - size: function() { - var win = this._, html = win.document.documentElement; - return win.innerWidth ? {x: win.innerWidth, y: win.innerHeight} : - {x: html.clientWidth, y: html.clientHeight}; - }, - - /** - * returns the scrolls for the window - * - * @return Object x: d+, y: d+ - */ - scrolls: function() { - var win = this._, doc = win.document, body = doc.body, html = doc.documentElement; - - return (win.pageXOffset || win.pageYOffset) ? {x: win.pageXOffset, y: win.pageYOffset} : - (body && (body.scrollLeft || body.scrollTop)) ? {x: body.scrollLeft, y: body.scrollTop} : - {x: html.scrollLeft, y: html.scrollTop}; - }, - - /** - * overloading the native scrollTo method to support hashes and element references - * - * @param mixed number left position, a hash position, element or a string element id - * @param number top position - * @param Object fx options - * @return window self - */ - scrollTo: function(left, top, fx_options) { - var left_pos = left, top_pos = top, - element = isNumber(left) ? null : $(left); - - if(element instanceof Element) { - left = element.position(); - } - - if (isHash(left)) { - top_pos = left.y; - left_pos = left.x; - } - - // checking if a smooth scroll was requested - if (isHash(fx_options = fx_options || top) && RightJS.Fx) { - new Fx.Scroll(this, fx_options).start({x: left_pos, y: top_pos}); - } else { - this._.scrollTo(left_pos, top_pos); - } - - return this; - } -}); - - -/** - * represents some additional functionality for the Event class - * - * NOTE: there more additional functionality for the Event class in the rightjs-goods project - * - * Credits: - * The additional method names are inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -var Event = RightJS.Event = new Class(Wrapper, { - // predefining the keys to spped up the assignments - type: null, - - which: null, - keyCode: null, - - target: null, - currentTarget: null, - relatedTarget: null, - - pageX: null, - pageY: null, - - /** - * the class constructor - * - * @param raw dom-event - * @param HTMLElement the bound element - * @return void - */ - initialize: Event_Klass, // the actual initialization happens in the Klass function - - /** - * Stops the event bubbling process - * - * @return RightJS.Event this - */ - stopPropagation: function() { - if (this._.stopPropagation) { - this._.stopPropagation(); - } else { - this._.cancelBubble = true; - } - - this.stopped = true; - return this; - }, - - /** - * Prevents the default browser action on the event - * - * @return RightJS.Event this - */ - preventDefault: function() { - if (this._.preventDefault) { - this._.preventDefault(); - } else { - this._.returnValue = false; - } - - return this; - }, - - /** - * Fully stops the event - * - * @return RightJS.Event this - */ - stop: function() { - return this.stopPropagation().preventDefault(); - }, - - /** - * Returns the event position - * - * @return Object {x: ..., y: ...} - */ - position: function() { - return {x: this.pageX, y: this.pageY}; - }, - - /** - * Returns the event's offset relative to the target element - * - * @return Object {x: ..., y: ...} or null - */ - offset: function() { - if(this.target instanceof Element) { - var element_position = this.target.position(); - - return { - x: this.pageX - element_position.x, - y: this.pageY - element_position.y - }; - } - - // triggered outside browser window (at toolbar etc.) - return null; - }, - - /** - * Finds the element between the event target - * and the boundary element that matches the - * css-rule - * - * @param String css-rule - * @return Element element or null - */ - find: function(css_rule) { - if (this.target instanceof Wrapper && this.currentTarget instanceof Wrapper) { - var target = this.target._, - search = this.currentTarget.find(css_rule, true); - - while (target) { - if (search.indexOf(target) !== -1) { - return wrap(target); - } - target = target.parentNode; - } - } - - return undefined; - } -}, Event_Klass), - -Event_delegation_shortcuts = []; - - -/** - * The DOM Element unit handling - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ - -var Element = RightJS.Element = new Class(Wrapper, { - /** - * constructor - * - * NOTE: this constructor will dynamically typecast - * the wrappers depending on the element tag-name - * - * @param String element tag name or an HTMLElement instance - * @param Object options - * @return Element element - */ - initialize: function(element, options) { - Element_initialize(this, element, options); - } - -}, Element_Klass), - -Element_wrappers = Element.Wrappers = {}, -elements_cache = {}, - -/** - * bulds dom-elements - * - * @param String element tag name - * @param Object options - * @return HTMLElement - */ -make_element = function (tag, options) { - return (tag in elements_cache ? elements_cache[tag] : ( - elements_cache[tag] = document.createElement(tag) - )).cloneNode(false); -}; - -// -// IE 6,7,8 (not 9!) browsers have a bug with checkbox and radio input elements -// it doesn't place the 'checked' property correctly, plus there are some issues -// with clonned SELECT objects, so we are replaceing the elements maker in here -// -if (IE8_OR_LESS) { - make_element = function(tag, options) { - if (tag === 'input' && options !== undefined) { - tag = ''; - } - - return document.createElement(tag); - }; -} - -/** - * Basic element's constructor - * - * @param Element wrapper instance - * @param mixed raw dom element of a string tag name - * @param Object options - * @return void - */ -function Element_initialize(inst, element, options) { - if (typeof element === 'string') { - inst._ = make_element(element, options); - - if (options !== undefined) { - for (var key in options) { - switch (key) { - case 'id': inst._.id = options[key]; break; - case 'html': inst._.innerHTML = options[key]; break; - case 'class': inst._.className = options[key]; break; - case 'on': inst.on(options[key]); break; - default: inst.set(key, options[key]); - } - } - } - } else { - inst._ = element; - } -} - - -/** - * The DOM Element unit structures handling module - * - * NOTE: all the methods will process and return only the Element nodes - * all the textual nodes will be skipped - * - * NOTE: if a css-rule was specified then the result of the method - * will be filtered/adjusted depends on the rule - * - * Credits: - * The naming principle and most of the names are taken from - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * The insertions system implementation is inspired by - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ - -Element.include({ - parent: function(css_rule) { - var parent = this._.parentNode, parent_type = parent && parent.nodeType; - - return css_rule ? this.parents(css_rule)[0] : - (parent_type === 1 || parent_type === 9) ? // <- IE6 sometimes has a fragment node in there - wrap(parent) : null; - }, - - parents: function(css_rule) { - return recursively_collect(this, 'parentNode', css_rule); - }, - - children: function(css_rule) { - return this.find(css_rule).filter(function(element) { - return element._.parentNode === this._; - }, this); - }, - - siblings: function(css_rule) { - return this.prevSiblings(css_rule).reverse().concat(this.nextSiblings(css_rule)); - }, - - nextSiblings: function(css_rule) { - return recursively_collect(this, 'nextSibling', css_rule); - }, - - prevSiblings: function(css_rule) { - return recursively_collect(this, 'previousSibling', css_rule); - }, - - next: function(css_rule) { - return !css_rule && this._.nextElementSibling !== undefined ? - wrap(this._.nextElementSibling) : this.nextSiblings(css_rule)[0]; - }, - - prev: function(css_rule) { - return !css_rule && this._.previousElementSibling !== undefined ? - wrap(this._.previousElementSibling) : this.prevSiblings(css_rule)[0]; - }, - - /** - * removes the elemnt out of this parent node - * - * @return Element self - */ - remove: function() { - var element = this._, parent = element.parentNode; - if (parent) { - parent.removeChild(element); - } - return this; - }, - - /** - * handles the elements insertion functionality - * - * The content might be one of the following data - * - * o) an element instance - * o) a String (all the scripts will be parsed out and executed) - * o) a list of Elements - * o) a hash like {position: content} - * - * @param mixed data to insert - * @param String position to insert top/bottom/before/after/instead - * @return Element self - */ - insert: function(content, position) { - var scripts = null, element = this._; - position = position === undefined ? 'bottom' : position; - - if (typeof(content) !== 'object') { - scripts = content = (''+content); - } else if (content instanceof Element) { - content = content._; - } - - Element_insertions[position](element, - content.nodeType === undefined ? - Element_createFragment( - (position === 'bottom' || position === 'top') ? - element : element.parentNode, content - ) : content - ); - - if (scripts !== null) { scripts.evalScripts(); } - - return this; - }, - - /** - * Inserts the element inside the given one at the given position - * - * @param mixed destination element reference - * @param String optional position - * @return Element this - */ - insertTo: function(element, position) { - $(element).insert(this, position); - return this; - }, - - /** - * A shortcut to uppend several units into the element - * - * @param mixed data - * .................. - * @return Element this - */ - append: function(first) { - return this.insert(isString(first) ? $A(arguments).join('') : arguments); - }, - - /** - * updates the content of the element by the given content - * - * @param mixed content (a String, an Element or a list of elements) - * @return Element self - */ - update: function(content) { - if (typeof(content) !== 'object') { - content = '' + content; - - try { - this._.innerHTML = content; - } catch(e) { - return this.clean().insert(content); - } - - content.evalScripts(); - - return this; - } else { - return this.clean().insert(content); - } - }, - - /** - * Works with the Element's innerHTML property - * This method works both ways! if a content is provided - * then it will be assigned, otherwise will return - * the innerHTML property - * - * @param String html content - * @return String html content or Element this - */ - html: function(content) { - return content === undefined ? this._.innerHTML : this.update(content); - }, - - /** - * Works with the Element's innerHTML property as a text - * when set something, it will appear as is with everything quoted - * when get, will return a string without any tags in it - * - * @param String text content - * @return String text content or Element this - */ - text: function(text) { - return text === undefined ? (this._.textContent || this._.innerText) : - this.update(this.doc()._.createTextNode(text)); - }, - - /** - * replaces the current element by the given content - * - * @param mixed content (a String, an Element or a list of elements) - * @return Element self - */ - replace: function(content) { - return this.insert(content, 'instead'); - }, - - /** - * wraps the element with the given element - * - * @param Element wrapper - * @return Element self - */ - wrap: function(wrapper) { - var element = this._, parent = element.parentNode; - if (parent) { - wrapper = $(wrapper)._; - parent.replaceChild(wrapper, element); - wrapper.appendChild(element); - } - return this; - }, - - /** - * removes all the child nodes out of the element - * - * @return Element self - */ - clean: function() { - while (this._.firstChild) { - this._.removeChild(this._.firstChild); - } - - return this; - }, - - /** - * checks if the element has no child nodes - * - * @return boolean check result - */ - empty: function() { - return this.html().blank(); - }, - - /** - * Creates a clean clone of the element without any events attached to it - * - * @return Element new clone - */ - clone: function() { - return new Element(this._.cloneNode(true)); - }, - - /** - * Returns an index of the element among the other child elements - * - * NOTE: doesn't count the textual nodes! - * - * @return Integer index - */ - index: function() { - var node = this._, - sibling = node.parentNode.firstChild, - index = 0; - - while (sibling !== node) { - if (sibling.nodeType === 1) { // counting elements only - index ++; - } - sibling = sibling.nextSibling; - } - - return index; - } -}); - -/** - * Recursively collects the target element's related nodes - * - * @param Element context - * @param name String pointer attribute name - * @param rule String optional css-atom rule - * @return Array found elements - */ -function recursively_collect(where, attr, css_rule) { - var node = where._, result = [], i=0, no_rule = !css_rule; - - while ((node = node[attr])) { - if (node.nodeType === 1 && (no_rule || wrap(node).match(css_rule))) { - result[i++] = wrap(node); - } - } - - return result; -} - -// list of insertions handling functions -// NOTE: each of the methods will be called in the contects of the current element -var Element_insertions = { - bottom: function(target, content) { - target.appendChild(content); - }, - - top: function(target, content) { - if (target.firstChild !== null) { - target.insertBefore(content, target.firstChild); - } else { - target.appendChild(content); - } - }, - - after: function(target, content) { - var parent = target.parentNode, sibling = target.nextSibling; - if (sibling !== null) { - parent.insertBefore(content, sibling); - } else { - parent.appendChild(content); - } - }, - - before: function(target, content) { - target.parentNode.insertBefore(content, target); - }, - - instead: function(target, content) { - target.parentNode.replaceChild(content, target); - } -}, - -// the element insertion wrappers list -Element_wraps = { - TBODY: ['', '
                              ', 2], - TR: ['', '
                              ', 3], - TD: ['', '
                              ', 4], - COL: ['', '
                              ', 2], - LEGEND: ['
                              ', '
                              ', 2], - AREA: ['', '', 2], - OPTION: ['', 2] -}; - -$alias(Element_wraps, { - OPTGROUP: 'OPTION', - THEAD: 'TBODY', - TFOOT: 'TBODY', - TH: 'TD' -}); - -// converts any data into a html fragment unit -var fragment = document.createDocumentFragment(), - tmp_cont = document.createElement('DIV'); - -function Element_createFragment(context, content) { - if (typeof(content) === 'string') { - var tag = context.tagName, - tmp = tmp_cont, - wrap = tag in Element_wraps ? Element_wraps[tag] : ['', '', 1], - depth = wrap[2]; - - tmp.innerHTML = wrap[0] + '<'+ tag + '>' + content + '' + wrap[1]; - - while (depth-- !== 0) { - tmp = tmp.firstChild; - } - - content = tmp.childNodes; - - while (content.length !== 0) { - fragment.appendChild(content[0]); - } - - } else { - for (var i=0, length = content.length, node; i < length; i++) { - node = content[content.length === length ? i : 0]; - fragment.appendChild(node instanceof Element ? node._ : node); - } - } - - return fragment; -} - - -/** - * this module contains the element unit styles related methods - * - * Credits: - * Some of the functionality is inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - Dojo (www.dojotoolkit.org) Copyright (C) The Dojo Foundation - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Element.include({ - /** - * assigns styles out of the hash to the element - * - * NOTE: the style keys might be camelized or dasherized, both cases should work - * - * @param Object styles list or String style name - * @param String style value in case of the first param a string style name - * @return Element self - */ - setStyle: function(hash, value) { - var key, c_key, style = {}, element_style = this._.style; - - if (value !== undefined) { style[hash] = value; hash = style; } - else if(isString(hash)) { - hash.split(';').each(function(option) { - var els = option.split(':').map('trim'); - if (els[0] && els[1]) { - style[els[0]] = els[1]; - } - }); - hash = style; - } - - - for (key in hash) { - c_key = key.indexOf('-') < 0 ? key : key.camelize(); - - if (IE_OPACITY && key === 'opacity') { - element_style.filter = 'alpha(opacity='+ hash[key] * 100 +')'; - } else if (key === 'float') { - c_key = Browser_IE ? 'styleFloat' : 'cssFloat'; - } - - element_style[c_key] = hash[key]; - } - - return this; - }, - - /** - * returns style of the element - * - * NOTE: will include the CSS level definitions - * - * @param String style key - * @return String style value or null if not set - */ - getStyle: function(key) { - return clean_style(this._.style, key) || clean_style(this.computedStyles(), key); - }, - - /** - * returns the hash of computed styles for the element - * - * @return Object/CSSDefinition computed styles - */ - computedStyles: HTML.currentStyle ? function() { - return this._.currentStyle || {}; - } : HTML.runtimeStyle ? function() { - return this._.runtimeStyle || {}; - } : function() { - return this._.ownerDocument.defaultView.getComputedStyle(this._, null); - }, - - /** - * checks if the element has the given class name - * - * @param String class name - * @return boolean check result - */ - hasClass: function(name) { - return (' '+this._.className+' ').indexOf(' '+name+' ') != -1; - }, - - /** - * sets the whole class-name string for the element - * - * @param String class-name - * @return Element self - */ - setClass: function(class_name) { - this._.className = class_name; - return this; - }, - - /** - * Returns the current class-name - * - * @return String class-name - */ - getClass: function() { - return this._.className; - }, - - /** - * adds the given class name to the element - * - * @param String class name - * @return Element self - */ - addClass: function(name) { - var testee = ' '+this._.className+' '; - if (testee.indexOf(' '+name+' ') == -1) { - this._.className += (testee === ' ' ? '' : ' ') + name; - } - return this; - }, - - /** - * removes the given class name - * - * @param String class name - * @return Element self - */ - removeClass: function(name) { - this._.className = (' '+this._.className+' ').replace(' '+name+' ', ' ').trim(); - return this; - }, - - /** - * toggles the given class name on the element - * - * @param String class name - * @return Element self - */ - toggleClass: function(name) { - return this[this.hasClass(name) ? 'removeClass' : 'addClass'](name); - }, - - /** - * adds the given class-name to the element - * and removes it from all the element siblings - * - * @param String class name - * @return Element self - */ - radioClass: function(name) { - this.siblings().each('removeClass', name); - return this.addClass(name); - } -}); - -/** - * cleans up a style value - * - * @param Object styles hash - * @param String style-key - * @return String clean style - */ -function clean_style(style, key) { - key = key.camelize(); - - if (key === 'opacity') { - return IE_OPACITY ? ( - (/opacity=(\d+)/i.exec(style.filter || '') || - ['', '100'])[1].toInt() / 100 - )+'' :style[key].replace(',', '.'); - } - - if (key === 'float') { - key = Browser_IE ? 'styleFloat' : 'cssFloat'; - } - - var value = style[key]; - - // Opera returns named colors with quotes - if (Browser_Opera && /color/i.test(key) && value) { - value = value.replace(/"/g, ''); - } - - return value; -} - - -/** - * Common DOM Element unit methods - * - * Credits: - * Most of the naming system in the module inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Element.include({ - /** - * sets the element attributes - * - * @param String attr name or Object attributes hash - * @param mixed attribute value - * @return Element self - */ - set: function(hash, value) { - if (typeof(hash) === 'string') { var val = {}; val[hash] = value; hash = val; } - - var key, element = this._; - - for (key in hash) { - if (key === 'style') { - this.setStyle(hash[key]); - } else { - // some attributes are not available as properties - if (!(key in element)) { - element.setAttribute(key, ''+hash[key]); - } - element[key] = hash[key]; - } - } - - return this; - }, - - /** - * returns the attribute value for the name - * - * @param String attr name - * @return mixed value - */ - get: function(name) { - var element = this._, value = element[name] || element.getAttribute(name); - return value === '' ? null : value; - }, - - /** - * checks if the element has that attribute - * - * @param String attr name - * @return Boolean check result - */ - has: function(name) { - return this.get(name) !== null; - }, - - /** - * erases the given attribute of the element - * - * @param String attr name - * @return Element self - */ - erase: function(name) { - this._.removeAttribute(name); - return this; - }, - - /** - * checks if the elemnt is hidden - * - * NOTE: will check css level computed styles too - * - * @return boolean check result - */ - hidden: function() { - return this.getStyle('display') === 'none'; - }, - - /** - * checks if the element is visible - * - * @return boolean check result - */ - visible: function() { - return !this.hidden(); - }, - - /** - * hides the element - * - * @param String optional effect name - * @param Object the optional effect options - * @return Element self - */ - hide: function(effect, options) { - if (this.visible()) { - this._d = this.getStyle('display'); - this._.style.display = 'none'; - } - - return this; - }, - - /** - * shows the element - * - * @return Element self - */ - show: function() { - if (this.hidden()) { - var element = this._, value = this._d, dummy; - - // trying to guess the default 'style.display' for this kind of elements - if (!value || value === 'none') { - dummy = $E(element.tagName).insertTo(HTML); - value = dummy.getStyle('display'); - dummy.remove(); - } - - // failsafe in case the user been naughty - if (value === 'none') { - value = 'block'; - } - - element.style.display = value; - } - - return this; - }, - - /** - * toggles the visibility state of the element - * - * @return Element self - */ - toggle: function() { - return this[this.visible() ? 'hide' : 'show'](); - }, - - /** - * shows the element and hides all the sibligns - * - * @param String optional effect name - * @param Object the optional effect options - * @return Element self - */ - radio: function(effect, options) { - this.siblings().each('hide', effect, options); - return this.show(); - } -}); - - -/** - * this module contains the Element's part of functionality - * responsible for the dimensions and positions getting/setting - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -Element.include({ - /** - * Returns the reference to this element document - * - * @return RightJS.Document - */ - doc: function() { - return wrap(this._.ownerDocument); - }, - - /** - * Returns the reference to this elements window - * - * @return RightJS.Window - */ - win: function() { - return this.doc().win(); - }, - - /** - * Returns the element size as a hash - * - * @return Object {x: NNN, y: NNN} - */ - size: function() { - return { x: this._.offsetWidth, y: this._.offsetHeight }; - }, - - /** - * Returns the element absolute position - * - * NOTE: see the konq.js file for the manual version of the method - * - * @return Object {x: NNN, y: NNN} - */ - position: function() { - var rect = this._.getBoundingClientRect(), - html = this.doc()._.documentElement, - scrolls = this.win().scrolls(); - - return { - x: rect.left + scrolls.x - html.clientLeft, - y: rect.top + scrolls.y - html.clientTop - }; - }, - - /** - * Returns the element scrolls - * - * @return Object {x: NNN, y: NNN} - */ - scrolls: function() { - return { x: this._.scrollLeft, y: this._.scrollTop }; - }, - - /** - * returns the element dimensions hash - * - * @return Object dimensions (top, left, width, height, scrollLeft, scrollTop) - */ - dimensions: function() { - var size = this.size(), - scrolls = this.scrolls(), - position = this.position(); - - return { - top: position.y, - left: position.x, - width: size.x, - height: size.y, - scrollLeft: scrolls.x, - scrollTop: scrolls.y - }; - }, - - /** - * Checks if the element overlaps the given position - * - * @param Object position {x: NNN, y: NNN} - * @return boolean check result - */ - overlaps: function(target) { - var pos = this.position(), size = this.size(); - - return target.x > pos.x && target.x < (pos.x + size.x) && - target.y > pos.y && target.y < (pos.y + size.y); - }, - - /** - * sets the width of the element in pixels - * - * NOTE: will double assign the size of the element, so it match the exact - * size including any possible borders and paddings - * - * @param Integer width in pixels - * @return Element self - */ - setWidth: function(width_px) { - var style = this._.style; - style.width = width_px + 'px'; - style.width = (2 * width_px - this._.offsetWidth) + 'px'; - return this; - }, - - /** - * sets the width of the element in pixels - * - * NOTE: will double assign the size of the element, so it match the exact - * size including any possible borders and paddings - * - * @param Integer height in pixels - * @return Element self - */ - setHeight: function(height_px) { - var style = this._.style; - style.height = height_px + 'px'; - style.height = (2 * height_px - this._.offsetHeight) + 'px'; - return this; - }, - - /** - * sets the size of the element in pixels - * - * NOTE: will double assign the size of the element, so it match the exact - * size including any possible borders and paddings - * - * @param width Integer width in pixels or {x: 10, y: 20} like object - * @param height Integer height - * @return Element self - */ - resize: function(width, height) { - if (isHash(width)) { - height = width.y; - width = width.x; - } - return this.setWidth(width).setHeight(height); - }, - - /** - * sets the element position (against the window corner) - * - * @param left Number left position in pixels or an object like {x: 10, y: 20} - * @param top Number top position in pixels - * @return Element self - */ - moveTo: function(left, top) { - if (isHash(left)) { - top = left.y; - left = left.x; - } - - return this.setStyle({ - left: left + 'px', - top: top + 'px' - }); - }, - - /** - * sets the scroll position - * - * @param left Integer left scroll px or an object like {x: 22, y: 33} - * @param top Integer top scroll px - * @return Element self - */ - scrollTo: function(left, top) { - if (isHash(left)) { - top = left.y; - left = left.x; - } - - this._.scrollLeft = left; - this._.scrollTop = top; - - return this; - }, - - /** - * makes the window be scrolled to the element - * - * @param Object fx options - * @return Element self - */ - scrollThere: function(options) { - this.win().scrollTo(this, options); - return this; - } -}); - - -/** - * DOM Element events handling methods - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -[Element, Document, Window].each('include', $ext(Observer_create({}), { - /** - * The basic events handling attachment method - * SEE Observer#on for more details about supported arguments - * - * @returnt this - */ - on: function() { - Observer_on(this, arguments, function(hash) { - - if (hash.e === 'mouseenter' || hash.e === 'mouseleave') { - mouse_io_activate(); - hash.n = hash.e; - hash.w = function() {}; - // NOTE: we don't attach this listener to the actual element! - // so it didn't screw with IE's native enter/leave handlers - } else { - if (hash.e === 'contextmenu' && Browser.Konqueror) { - hash.n = 'rightclick'; - } else if (hash.e === 'mousewheel' && Browser.Gecko) { - hash.n = 'DOMMouseScroll'; - } else { - hash.n = hash.e; - } - - hash.w = function(event) { - event = new Event(event, hash.t); - if (hash.f.apply(hash.t, (hash.r?[]:[event]).concat(hash.a)) === false) { - event.stop(); - } - }; - - if (IE8_OR_LESS) { - hash.t._.attachEvent('on'+hash.n, hash.w); - } else { - hash.t._.addEventListener(hash.n, hash.w, false); - } - } - - return hash; - }); - - return this; - }, - - /** - * Stops an event handling - * - * @param String event name or a function callback - * @param function callback or nothing - * @return this - */ - stopObserving: function(event, callback) { - Observer_stopObserving(this, event, callback, function(hash) { - if (IE8_OR_LESS) { - hash.t._.detachEvent('on'+ hash.n, hash.w); - } else { - hash.t._.removeEventListener(hash.n, hash.w, false); - } - }); - - return this; - }, - - /** - * Artificially trigers the event on the element - * - * @param string event name or an Event instance - * @param Object options - * @return this - */ - fire: function(event, options) { - var parent = this.parent && this.parent(); - - if (!(event instanceof Event)) { - event = new Event(event, $ext({target: this._}, options)); - } - - // setting up the currentTarget reference - event.currentTarget = this; - - (this.$listeners || []).each(function(hash) { - if (hash.e === event.type && - hash.f.apply(this, (hash.r?[]:[event]).concat(hash.a)) === false - ) { - event.stop(); - } - }, this); - - // manually bypassing the event to the parent one if it should bubble - if (parent && parent.fire && !event.stopped) { - parent.fire(event); - } - - return this; - }, - - /** - * a simple events terminator method to be hooked like this.onClick('stopEvent'); - * - * @return false - */ - stopEvent: function() { return false; } -})); - -// couple more shortcuts for the window -Observer_createShortcuts(Window.prototype, $w('blur focus scroll resize load')); - -/** - * Registers a list of event-binding shortcuts like - * $(element).onClick - * $(element).onMouseover - * - * @param String space separated event names - * @return void - */ -function Element_add_event_shortcuts(tokens) { - tokens = $w(tokens); - Event_delegation_shortcuts = Event_delegation_shortcuts.concat(tokens); - - Observer_createShortcuts(Element.prototype, tokens); - Observer_createShortcuts(Document.prototype, tokens); -} - -Element_add_event_shortcuts( - 'click rightclick contextmenu mousedown mouseup '+ - 'mouseover mouseout mousemove keypress keydown keyup' -); - - -/** - * The DOM elements selection handling - * - * NOTE: this module is just a wrap over the native CSS-selectors feature - * see the olds/css.js file for the manual selector code - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ - -[Element, Document].each('include', { - /** - * Extracts the first element matching the css-rule, - * or just any first element if no css-rule was specified - * - * @param String css-rule - * @return Element matching node or null - */ - first: function(css_rule) { - return wrap( - css_rule === undefined && this._.firstElementChild !== undefined ? - this._.firstElementChild : this._.querySelector(css_rule || '*') - ); - }, - - /** - * Finds a list of matching nodes, or all the descendant nodes if no css-rule provided - * - * @param String css-rule - * @param boolean raw-search - * @return Array of elements - */ - find: function(css_rule, raw) { - var query = this._.querySelectorAll(css_rule || '*'), result, i=0, l = query.length; - - if (raw === true) { - result = $A(query); - } else { - for (result = []; i < l; i++) { - result[i] = wrap(query[i]); - } - } - - return result; - }, - - /** - * checks if the element matches this css-rule - * - * NOTE: the element should be attached to the page - * - * @param String css-rule - * @return Boolean check result - */ - match: function(css_rule) { - // finding the top parent element (the element might not be on the document) - var element = this._, parent = element, result, faking = false; - - while (parent.parentNode !== null && parent.parentNode.nodeType !== 11) { - parent = parent.parentNode; - } - - // creating a fake context when needed - if (element === parent) { - parent = document.createElement('div'); - parent.appendChild(element); - faking = true; - } - - result = wrap(parent).find(css_rule, true).indexOf(element) !== -1; - - if (faking) { - parent.removeChild(element); - } - - return result; - } -}); - - -/** - * The dom-ready event handling code - * - * Credits: - * The basic principles of the module are originated from - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2009-2011 Nikolay Nemshilov - */ -Document.include({ - on: function(name) { - if (name === 'ready' && !this._iR) { - var document = this._, ready = this.fire.bind(this, 'ready'); - - // IE and Konqueror browsers - if ('readyState' in document) { - (function() { - if (['loaded','complete'].include(document.readyState)) { - ready(); - } else { - arguments.callee.delay(50); - } - })(); - } else { - document.addEventListener('DOMContentLoaded', ready, false); - } - - this._iR = true; - } - - return this.$super.apply(this, arguments); - } -}); - -Observer_createShortcuts(Document.prototype, ['ready']); - -/** - * The form unit class and extensions - * - * Credits: - * The basic principles of the module are inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - * Copyright (C) 2009-2011 Nikolay Nemshilov - */ - -var Form = RightJS.Form = Element_wrappers.FORM = new Class(Element, { - /** - * constructor - * - * NOTE: this constructor can be called as a normal Element constructor - * or with the options only, which will make a FORM element - * - * var form = new Form(raw_form_object_element); - * var form = new Form({method: 'post', action: '/boo/hoo'}); - * - * @param Object options or HTMLFormElement object - * @return void - */ - initialize: function(in_options) { - var options = in_options || {}, remote = 'remote' in options, element = options; - - if (isHash(options) && !isElement(options)) { - element = 'form'; - options = Object.without(options, 'remote'); - } - - this.$super(element, options); - - if (remote) { - this.remotize(); - } - }, - - /** - * returns the form elements as an array of extended units - * - * @return Array of elements - */ - elements: function() { - return this.find('input,button,select,textarea'); - }, - - /** - * returns the list of all the input elements on the form - * - * @return Array of elements - */ - inputs: function() { - return this.elements().filter(function(input) { - return !['submit', 'button', 'reset', 'image', null].include(input._.type); - }); - }, - - /** - * Accessing an input by name - * - * @param String name - * @return Input field - */ - input: function(name) { - return wrap(this._[name]); - }, - - /** - * focuses on the first input element on the form - * - * @return Form this - */ - focus: function() { - var element = this.inputs().first(function(input) { - return input._.type !== 'hidden'; - }); - - if (element) { element.focus(); } - - return this; - }, - - /** - * removes focus out of all the form elements - * - * @return Form this - */ - blur: function() { - this.elements().each('blur'); - return this; - }, - - /** - * disables all the elements on the form - * - * @return Form this - */ - disable: function() { - this.elements().each('disable'); - return this; - }, - - /** - * enables all the elements on the form - * - * @return Form this - */ - enable: function() { - this.elements().each('enable'); - return this; - }, - - /** - * returns the list of the form values - * - * @return Object values - */ - values: function() { - var values = {}, value, name, element, input; - - this.inputs().each(function(element) { - input = element._; - name = input.name; - if (!input.disabled && name && ( - !['checkbox', 'radio'].include(input.type) || input.checked - )) { - value = element.getValue(); - if (name.endsWith('[]')) { - value = (values[name] || []).concat([value]); - } - - values[name] = value; - } - }); - - return values; - }, - - /** - * returns the key/values organized ready to be sent via a get request - * - * @return String serialized values - */ - serialize: function() { - return Object.toQueryString(this.values()); - }, - - /** - * Delegating the submit method - * - * @return Form this - */ - submit: function() { - this._.submit(); - return this; - }, - - /** - * Delegating the 'reset' method - * - * @return Form this - */ - reset: function() { - this._.reset(); - return this; - } -}); - -// creating the event shortcuts -Element_add_event_shortcuts('submit reset focus blur disable enable change'); - - -/** - * The form input element class - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -var Input = RightJS.Input = - -// retgistering the typecasted wrappers -Element_wrappers.INPUT = -Element_wrappers.BUTTON = -Element_wrappers.SELECT = -Element_wrappers.TEXTAREA = -Element_wrappers.OPTGROUP = - -new Class(Element, { - /** - * Constructor - * - * NOTE: this constructor can be called in several ways - * - * Like normal Element - * var input = new Input('texarea', {...}); - * var input = new Input(document.createElement('select')); - * - * Or with options only which will make an INPUT element by default - * var input = new Input({type: 'password', name: 'password'}); - * - * @param HTMLElement or a String tag name or Options for default 'input' tag - * @param Object options - * @return void - */ - initialize: function(element, options) { - // type to tag name conversion - if (!element || (isHash(element) && !isElement(element))) { - options = element || {}; - - if (/textarea|select/.test(options.type || '')) { - element = options.type; - delete(options.type); - } else { - element = 'input'; - } - } - - this.$super(element, options); - }, - - /** - * Returns a reference to the input's form - * - * @return Form wrapped form - */ - form: function() { - return wrap(this._.form); - }, - - /** - * Overloading the method to fix some issues with IE and FF - * - * @param mixed content - * @param string optional position - * @return Input this - */ - insert: function(content, position) { - this.$super(content, position); - - // manually resetting the selected option in here - this.find('option').each(function(option) { - option._.selected = !!option.get('selected'); - }); - - return this; - }, - - /** - * Overloading the method so it always called the '#insert' method - * - * @param mixed content - * @return Input this - */ - update: function(content) { - return this.clean().insert(content); - }, - - /** - * uniform access to the element values - * - * @return String element value - */ - getValue: function() { - if (this._.type == 'select-multiple') { - return this.find('option').map(function(option) { - return option._.selected ? option._.value : null; - }).compact(); - } else { - return this._.value; - } - }, - - /** - * uniform accesss to set the element value - * - * @param String value - * @return Element this - */ - setValue: function(value) { - if (this._.type == 'select-multiple') { - value = ensure_array(value).map(String); - this.find('option').each(function(option) { - option._.selected = value.include(option._.value); - }); - } else { - this._.value = value; - } - return this; - }, - - /** - * Both ways getter/setter for the value parameter - * - * @param mixed value - * @return mixed this or the value - */ - value: function(value) { - return this[value === undefined ? 'getValue' : 'setValue'](value); - }, - - /** - * focuses on the first input element on the form - * - * @return Form this - */ - focus: function() { - this._.focus(); - this.focused = true; - if (Browser_IE) { this.fire('focus', {bubbles: false}); } - return this; - }, - - /** - * removes focus out of all the form elements - * - * @return Form this - */ - blur: function() { - this._.blur(); - this.focused = false; - if (Browser_IE) { this.fire('blur', {bubbles: false}); } - return this; - }, - - /** - * focuses on the element and selects its content - * - * @return Element this - */ - select: function() { - this._.select(); - return this.focus(); - }, - - /** - * disables all the elements on the form - * - * @return Form this - */ - disable: function() { - this._.disabled = true; - return this.fire('disable'); - }, - - /** - * enables all the elements on the form - * - * @return Form this - */ - enable: function() { - this._.disabled = false; - return this.fire('enable'); - }, - - /** - * A bidirectional method to set/get the disabled status of the input field - * - * @param boolean optional value - * @return Input in setter mode boolean in getter - */ - disabled: function(value) { - return value === undefined ? this._.disabled : this[value ? 'disable' : 'enable'](); - }, - - /** - * A bidirectional method to set/get the checked status of the input field - * - * @param boolean optional value - * @return Input in setter mode boolean in getter - */ - checked: function(value) { - if (value === undefined) { - value = this._.checked; - } else { - this._.checked = value; - value = this; - } - - return value; - } -}); - - -/** - * This module provides correct focus/blur events bubbling - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ - -/** - * Triggers a manual focus/blur events bubbling - * - * @param raw dom-event - * @return void - */ -function focus_boobler(raw_event) { - var event = new Event(raw_event), - target = event.target, - parent = target.parent && target.parent(); - - event.type = raw_event.type === 'focusin' || raw_event.type === 'focus' ? 'focus' : 'blur'; - - if (parent) { parent.fire(event); } -} - -/** - * Hooking up the 'focus' and 'blur' events - * at the document level and then rebooble them - * manually like they were normal events - * - */ -if (IE8_OR_LESS) { - document.attachEvent('onfocusin', focus_boobler); - document.attachEvent('onfocusout', focus_boobler); -} else { - document.addEventListener('focus', focus_boobler, true); - document.addEventListener('blur', focus_boobler, true); -} - - -/** - * Provides the mouse enter/leave events handling emulation - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -var mouse_io_index = [], mouse_io_inactive = true; - -/** - * Fires the actual mouseenter/mouseleave event - * - * @param original event - * @param raw dom element - * @param integer uid - * @param boolean mouseenter or mouseleave - * @return void - */ -function mouse_io_fire(raw, element, uid, enter) { - var event = new Event(raw); - event.type = enter === true ? 'mouseenter' : 'mouseleave'; - event.bubbles = false; - event.stopped = true; - event.target = wrap(element); - - // replacing the #find method so that UJS didn't - // get broke with trying to find nested elements - event.find = function(css_rule) { - return $$(css_rule, true) - .indexOf(this.target._) === -1 ? - undefined : this.target; - }; - - event.target.fire(event); - current_Document.fire(event); -} - -/** - * Figures out the enter/leave events by listening the - * mouseovers in the document - * - * @param raw dom event - * @return void - */ -function mouse_io_handler(e) { - var target = e.target || e.srcElement, - from = e.relatedTarget || e.fromElement, - element = target, - passed = false, - parents = [], - uid, event; - - while (element.nodeType === 1) { - uid = $uid(element); - - if (mouse_io_index[uid] === undefined) { - mouse_io_fire(e, element, uid, - mouse_io_index[uid] = true - ); - } - - if (element === from) { - passed = true; - } - - parents.push(element); - - element = element.parentNode; - } - - if (from && !passed) { - while (from !== null && from.nodeType === 1 && parents.indexOf(from) === -1) { - uid = $uid(from); - if (mouse_io_index[uid] !== undefined) { - mouse_io_fire(e, from, uid, - mouse_io_index[uid] = undefined - ); - } - - from = from.parentNode; - } - } -} - -/** - * Calling 'mouseleave' for all currently active elements on the page - * - * @return void - */ -function mouse_io_reset(e) { - mouse_io_index.each(function(value, uid) { - if (value && Wrappers_Cache[uid]) { - mouse_io_fire(e, Wrappers_Cache[uid]._, uid, false); - } - }); -} - -/** - * Activating the mouse-io events emulation - * - * @return void - */ -function mouse_io_activate() { - if (mouse_io_inactive) { - mouse_io_inactive = false; - - if (Browser_IE) { - document.attachEvent('onmouseover', mouse_io_handler); - window.attachEvent('blur', mouse_io_reset); - } else { - document.addEventListener('mouseover', mouse_io_handler, false); - window.addEventListener('blur', mouse_io_reset, false); - } - } -} - -Element_add_event_shortcuts('mouseenter mouseleave'); - -/** - * This module the standard events delegation interface - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -[Element, Document].each('include', { - /** - * Attaches a delegative event listener to the element/document - * - * USAGE: - * $(element).delegate('click', '#css.rule', function() {...}); - * $(element).delegate('click', '#css.rule', [func1, func2, ...]); - * $(element).delegate('click', '#css.rule', 'addClass', 'boo'); - * $(element).delegate('click', '#css.rule', 'hide'); - * - * $(element).delegate('click', { - * '#css.rule1': function() {}, - * '#css.rule2': [func1, func2, ...], - * '#css.rule3': ['addClass', 'boo'], - * '#css.rule4': 'hide' - * }); - * - * @param event name - * @param css-rule a hash or rules - * @param callback - * @return this - */ - delegate: function(event) { - var rules = delegation_rules(arguments), css_rule, i, j, list; - for (css_rule in rules) { - for (i=0, list = rules[css_rule]; i < list.length; i++) { - // registering the delegative listener - this.on(event, build_delegative_listener(css_rule, list[i], this)); - - // adding the css-rule and callback references to the store - $ext(this.$listeners.last(), { dr: css_rule, dc: list[i][0] }); - } - } - - return this; - }, - - /** - * Removes a delegative event listener from the element - * - * USAGE: - * $(element).undelegate('click'); - * $(element).undelegate('click', '#css.rule'); - * $(element).undelegate('click', '#css.rule', function() {}); - * $(element).undelegate('click', '#css.rule', [func1, func2, ...]); - * $(element).undelegate('click', '#css.rule', 'addClass', 'boo'); - * $(element).undelegate('click', '#css.rule', 'hide'); - * - * $(element).undelegate('click', { - * '#css.rule1': function() {}, - * '#css.rule2': [func1, func2, ...], - * '#css.rule3': ['addClass', 'boo'], - * '#css.rule4': 'hide' - * }); - * - * @param event name - * @param css-rule or a hash or rules - * @param callback - * @return this - */ - undelegate: function(event) { - delegation_listeners(arguments, this).each(function(h) { - this.stopObserving(h.n, h.f); - }, this); - - return this; - }, - - /** - * Checks if there is sucha delegative event listener - * - * USAGE: - * $(element).delegates('click'); - * $(element).delegates('click', '#css.rule'); - * $(element).delegates('click', '#css.rule', function() {}); - * $(element).delegates('click', '#css.rule', [func1, func2, ...]); - * $(element).delegates('click', '#css.rule', 'addClass', 'boo'); - * $(element).delegates('click', '#css.rule', 'hide'); - * - * $(element).delegates('click', { - * '#css.rule1': function() {}, - * '#css.rule2': [func1, func2, ...], - * '#css.rule3': ['addClass', 'boo'], - * '#css.rule4': 'hide' - * }); - * - * NOTE: - * if several rules are specified then it will check if - * _any_ of them are delegateed - * - * @param event name - * @param css-rule or a hash of rules - * @param callback - * @return boolean check result - */ - delegates: function() { - return !!delegation_listeners(arguments, this).length; - } -}); - -/** - * Builds the actual event listener that will delegate stuff - * to other elements as they reach the element where the listener - * attached - * - * @param String css rule - * @param Arguments the original arguments list - * @param Object scope - * @return Function the actual event listener - */ -function build_delegative_listener(css_rule, entry, scope) { - var args = $A(entry), callback = args.shift(); - return function(event) { - var target = event.find(css_rule); - return target === undefined ? target : - typeof(callback) === 'string' ? - target[callback].apply(target, args) : - callback.apply(target, [event].concat(args)); - }; -} - -/** - * Converts the events-delegation api arguments - * into a systematic hash of rules - * - * @param Arguments arguments - * @return Object hash of rules - */ -function delegation_rules(raw_args) { - var args = $A(raw_args), rules = args[1] || {}, hash = {}, css_rule; - - if (isString(rules)) { - hash[rules] = args.slice(2); - if (isArray(hash[rules][0])) { - hash[rules] = hash[rules][0].map(ensure_array); - } - } else { - hash = rules; - } - - // converting everything into a hash of lists of callbacks - for (css_rule in hash) { - hash[css_rule] = ensure_array(hash[css_rule]); - hash[css_rule] = isArray(hash[css_rule][0]) ? hash[css_rule] : [hash[css_rule]]; - } - - return hash; -} - -/** - * Returns the list of delegative listeners that match the conditions - * - * @param Arguments raw-arguments - * @param Element the element - * @return Array list of matching listeners - */ -function delegation_listeners(args, object) { - var event = args[0], i, list, - rules = delegation_rules(args), - rules_are_empty = !Object.keys(rules).length; - - return (object.$listeners || []).filter(function(hash) { - return hash.dr && hash.n === event && ( - rules_are_empty || (function() { - for (var css_rule in rules) { - if (hash.dr === css_rule) { - for (i=0, list = rules[css_rule]; i < list.length; i++) { - if (!list[i].length || list[i][0] === hash.dc) { - return true; - } - } - } - } - - return false; - })() - ); - }); -} - - -/** - * Some String level shortcuts to handle collections of elements - * - * Copyright (C) 2011 Nikolay Nemshilov - */ - -/** - * Some nice shortcuts for the document-level events delegation handling - * - * USAGE: - * - * "ul#main-menu li".on("click", function() { alert('clicked'); }); - * "ul#main-menu li".on("mouseover", "addClass", "hovered"); - * "ul#main-menu li".on("mouseout", "removeClass", "hovered"); - * - * // or like that in a shash - * "ul#main-menu li".on({ - * click: function() { alert('clicked'); }, - * mouseover: ['addClass', 'hovered'], - * mouseout: ['removeClass', 'hovered'], - * dblclick: 'hide' - * }); - * - * - * "#css.rule".observes('click'); - * "#css.rule".observes('click', function() {}); - * "#css.rule".observes('click', 'method_name'); - * .... - * - * "#css.rule".stopObserving('click'); - * "#css.rule".stopObserving('click', function() {}); - * "#css.rule".stopObserving('click', 'method_name'); - * .... - */ -Object.each({ - on: 'delegate', - stopObserving: 'undelegate', - observes: 'delegates' -}, function(name, method) { - String.prototype[name] = function() { - var args = $A(arguments), result; - - args.splice(1,0,''+this); - result = current_Document[method].apply(current_Document, args); - - return result === current_Document ? this : result; - }; -}); -var old_on = String.prototype.on; -String.prototype.on = function(hash) { - if (isHash(hash)) { - for (var key in hash) { - old_on.apply(this, [key].concat([hash[key]])); - } - } else { - old_on.apply(this, arguments); - } - return this; -}; - -/** - * building the list of String#onEvent shortucts - * - * USAGE: - * - * "#css.rule".onClick(function() {...}); - * "#css.rule".onMouseover('method_name'); - */ -Event_delegation_shortcuts.each(function(name) { - String.prototype['on'+name.capitalize()] = function() { - return this.on.apply(this, [name].concat($A(arguments))); - }; -}); - -/** - * The rest of the DOM methods access - * - * USAGE: - * "#css.rule".addClass('boo-hoo'); - * "#css.rule".setStyle({color: 'red'}); - * - */ -$w('Element Input Form').each(function(klass) { - Object.each(klass in RightJS ? RightJS[klass].prototype : {}, function(name, method) { - if (isFunction(method) && !(name in String.prototype)) { - String.prototype[name] = function() { - var nodes = $$(this, true), i=0, l = nodes.length, first=true, element, result; - for (; i < l; i++) { - element = wrap(nodes[i]); - result = element[name].apply(element, arguments); - - // checking if that's a data-retrieving call - if (first) { - if (result !== element) { - return result; - } - first = false; - } - } - - // don't return the string itself in here, - // it will screw with data-retrieving calls on empty collections - return null; - }; - } - }); -}); - -/** - * XMLHttpRequest wrapper - * - * Credits: - * Some of the functionality inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - jQuery (http://jquery.com) Copyright (C) John Resig - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -var Xhr = RightJS.Xhr = new Class(Observer, { - extend: { - // supported events list - EVENTS: $w('success failure complete request cancel create'), - - // default options - Options: { - headers: { - 'X-Requested-With': 'XMLHttpRequest', - 'Accept': 'text/javascript,text/html,application/xml,text/xml,*/*' - }, - method: 'post', - encoding: 'utf-8', - async: true, - evalScripts: false, - evalResponse: false, - evalJS: true, - evalJSON: true, - secureJSON: true, - urlEncoded: true, - spinner: null, - spinnerFx: 'fade', - params: null, - iframed: false, - jsonp: false - }, - - /** - * Shortcut to initiate and send an XHR in a single call - * - * @param String url - * @param Object options - * @return Xhr request - */ - load: function(url, options) { - return new this(url, $ext({method: 'get'}, options)).send(); - } - }, - - /** - * basic constructor - * - * @param String url - * @param Object options - */ - initialize: function(url, options) { - this.initCallbacks(); // system level callbacks should be initialized before the user callbacks - - this.url = url; - - // copying some options to the instance level attributes - $ext(this.$super(options), this.options); - - // merging in the global params - if (this.params != Xhr.Options.params) { - this.params = this.prepareData(Xhr.Options.params, this.params); - } - - // removing the local spinner if it's the same as the global one - if (Xhr.Options.spinner && $(this.spinner) === $(Xhr.Options.spinner)) { - this.spinner = null; - } - }, - - /** - * sets a header - * - * @param name String header name - * @param value String header value - * @return Xhr self - */ - setHeader: function(name, value) { - this.headers[name] = value; - return this; - }, - - /** - * tries to get a response header - * - * @return mixed String header value or undefined - */ - getHeader: function(name) { - var value; - try { - value = this.xhr.getResponseHeader(name); - } catch(e) {} - return value; - }, - - /** - * checks if the request was successful - * - * @return boolean check result - */ - successful: function() { - return (this.status >= 200) && (this.status < 300); - }, - - /** - * performs the actual request sending - * - * @param Object options - * @return Xhr self - */ - send: function(params) { - var add_params = {}, - url = this.url, - method = this.method.toLowerCase(), - headers = this.headers, - key, xhr; - - if (method == 'put' || method == 'delete') { - add_params._method = method; - method = 'post'; - } - - var data = this.prepareData(this.params, this.prepareParams(params), add_params); - - if (this.urlEncoded && method == 'post' && !headers['Content-type']) { - this.setHeader('Content-type', 'application/x-www-form-urlencoded;charset='+this.encoding); - } - - if (method == 'get') { - if (data) { url += (url.include('?') ? '&' : '?') + data; } - data = null; - } - - xhr = this.xhr = this.createXhr(); - this.fire('create'); - - xhr.open(method, url, this.async); - - xhr.onreadystatechange = this.stateChanged.bind(this); - - for (key in headers) { - xhr.setRequestHeader(key, headers[key]); - } - - xhr.send(data); - this.fire('request'); - - if (!this.async) { this.stateChanged(); } - - return this; - }, - - /** - * elements automaticall update method, creates an Xhr request - * and updates the element innerHTML value onSuccess. - * - * @param Element element - * @param Object optional request params - * @return Xhr self - */ - update: function(element, params) { - return this.onSuccess(function(r) { element.update(r.text); }).send(params); - }, - - /** - * stops the request processing - * - * @return Xhr self - */ - cancel: function() { - var xhr = this.xhr; - - if (!xhr || xhr.canceled) { return this; } - - xhr.abort(); - xhr.onreadystatechange = function() {}; - xhr.canceled = true; - - return this.fire('cancel'); - }, - -// protected - // wrapping the original method to send references to the xhr objects - fire: function(name) { - return this.$super(name, this, this.xhr); - }, - - // creates new request instance - createXhr: function() { - if (this.jsonp) { - return new Xhr.JSONP(this); - } else if (this.form && this.form.first('input[type=file]')) { - return new Xhr.IFramed(this.form); - } else if ('ActiveXObject' in window){ - return new ActiveXObject('MSXML2.XMLHTTP'); - } else { - return new XMLHttpRequest(); - } - }, - - // prepares user sending params - prepareParams: function(params) { - if (params && params instanceof Form) { - this.form = params; - params = params.values(); - } - return params; - }, - - // converts all the params into a url params string - prepareData: function() { - return $A(arguments).map(function(param) { - if (!isString(param)) { - param = Object.toQueryString(param); - } - return param.blank() ? null : param; - }).compact().join('&'); - }, - - // handles the state change - stateChanged: function() { - var xhr = this.xhr; - - if (xhr.readyState != 4 || xhr.canceled) { return; } - - try { this.status = xhr.status; - } catch(e) { this.status = 0; } - - this.text = this.responseText = xhr.responseText; - this.xml = this.responseXML = xhr.responseXML; - - this.fire('complete').fire(this.successful() ? 'success' : 'failure'); - }, - - // called on success - tryScripts: function(response) { - var content_type = this.getHeader('Content-type'); - - if (this.evalResponse || (this.evalJS && /(ecma|java)script/i.test(content_type))) { - $eval(this.text); - } else if (/json/.test(content_type) && this.evalJSON) { - this.json = this.responseJSON = this.sanitizedJSON(); - } else if (this.evalScripts) { - this.text.evalScripts(); - } - }, - - // sanitizes the json-response texts - sanitizedJSON: function() { - if (!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test( - this.text.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '') - )) { - if (this.secureJSON) { - throw "JSON error: "+this.text; - } - return null; - } - - return 'JSON' in window ? JSON.parse(this.text) : - (new Function("return "+this.text))(); - }, - - // initializes the request callbacks - initCallbacks: function() { - // connecting basic callbacks - this.on({ - success: 'tryScripts', - create: 'showSpinner', - complete: 'hideSpinner', - cancel: 'hideSpinner' - }); - - // wiring the global xhr callbacks - Xhr.EVENTS.each(function(name) { - this.on(name, function() { Xhr.fire(name, this, this.xhr); }); - }, this); - }, - - showSpinner: function() { Xhr.showSpinner.call(this, this); }, - hideSpinner: function() { Xhr.hideSpinner.call(this, this); } -}); - -// attaching the common spinner handling -$ext(Observer_create(Xhr), { - counter: 0, - - // shows the spinner - showSpinner: function(context) { - Xhr.trySpinner(context, 'show'); - }, - - // hides the spinner - hideSpinner: function(context) { - Xhr.trySpinner(context, 'hide'); - }, - - trySpinner: function(context, method) { - var object = context || Xhr.Options, spinner = $(object.spinner); - if (spinner) { spinner[method](object.spinnerFx, {duration: 100}); } - }, - - // counts a request in - countIn: function() { - Xhr.counter ++; - Xhr.showSpinner(); - }, - - // counts a request out - countOut: function() { - Xhr.counter --; - if (Xhr.counter < 1) { - Xhr.hideSpinner(); - } - } -}).on({ - create: 'countIn', - complete: 'countOut', - cancel: 'countOut' -}); - - -/** - * Here are the Form unit Xhr extensions - * - * Credits: - * Some of the functionality inspired by - * - Prototype (http://prototypejs.org) Copyright (C) Sam Stephenson - * - jQuery (http://jquery.com) Copyright (C) John Resig - * - * Copyright (C) 2009-2011 Nikolay V. Nemshilov - */ -Form.include({ - /** - * sends the form via xhr request - * - * @param Options xhr request options - * @return Form this - */ - send: function(options) { - options = options || {}; - options.method = options.method || this._.method || 'post'; - - this.xhr = new Xhr( - this._.action || document.location.href, - $ext({spinner: this.first('.spinner')}, options) - ) - .onComplete(this.enable.bind(this)) - .onCancel(this.enable.bind(this)) - .send(this); - - this.disable.bind(this).delay(1); // webkit needs this async call with iframed calls - return this; - }, - - /** - * Cancels current Xhr request (if there are any) - * - * @return Form this - */ - cancelXhr: function() { - if (this.xhr instanceof Xhr) { - this.xhr.cancel(); - } - - return this; - }, - - /** - * makes the form be remote by default - * - * @param Object default options - * @return Form this - */ - remotize: function(options) { - if (!this.remote) { - this.on('submit', Form_remote_send, options); - this.remote = true; - } - - return this; - }, - - /** - * removes the remote call hook - * - * @return Form this - */ - unremotize: function() { - this.stopObserving('submit', Form_remote_send); - this.remote = false; - return this; - } -}); - -/** - * Catches the form submit events and sends the form remotely - * - * @param Event submit - * @param Object xhr options - * @return void - */ -function Form_remote_send(event, options) { - event.stop(); - this.send(options); -} - - -/** - * this module contains the Element unit XHR related extensions - * - * Credits: - * - jQuery (http://jquery.com) Copyright (C) John Resig - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Element.include({ - /** - * performs an Xhr request to the given url - * and updates the element internals with the responseText - * - * @param String url address - * @param Object xhr options - * @return Element this - */ - load: function(url, options) { - new Xhr(url, $ext({method: 'get'}, options)).update(this); - return this; - } -}); - - -/** - * A dummy XmlHTTPRequest interface to be used in other - * fake requests - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -Xhr.Dummy = { - open: function() {}, - setRequestHeader: function() {}, - onreadystatechange: function() {} -}; - - -/** - * This unit presents a fake drop in replacement for the XmlHTTPRequest unit - * but works with an iframe targeting in the background - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ -Xhr.IFramed = new Class({ - include: Xhr.Dummy, - - /** - * constructor - * - * @param Form form which will be submitted via the frame - * @return void - */ - initialize: function(form) { - this.form = form; - this.id = 'xhr_'+ new Date().getTime(); - - this.form.doc().first('body').append('', - 'after'); - - $(this.id).on('load', this.onLoad.bind(this)); - }, - - send: function() { - this.form.set('target', this.id).submit(); - }, - - onLoad: function() { - this.status = 200; - this.readyState = 4; - - this.form.set('target', ''); - - try { - this.responseText = window[this.id].document.documentElement.innerHTML; - } catch(e) { } - - this.onreadystatechange(); - }, - - abort: function() { - $(this.id).set('src', 'about:blank'); - } -}); - - -/** - * The JSONP Xhr request tonnel - * - * Copyright (C) 2010-2011 Nikolay Nemshilov - */ -Xhr.JSONP = new Class({ - include: Xhr.Dummy, - - prefix: 'jsonp', - - /** - * Constructor - * - * @param Xhr the actual xhr request object - * @return void - */ - initialize: function(xhr) { - this.xhr = xhr; - this.name = this.prefix + new Date().getTime(); - this.param = (isString(xhr.jsonp) ? - xhr.jsonp : 'callback') + "=" + this.name; - - this.script = $E('script', { - charset: xhr.encoding, - async: xhr.async - }); - }, - - /** - * saving the url and method for the further use - * - * @param method String request method - * @param address String request url address - * @param Boolean async request marker - * @return void - */ - open: function(method, url, async) { - this.url = url; - this.method = method; - }, - - /** - * Sends the actual request by inserting the script into the document body - * - * @param String data - * @return void - */ - send: function(data) { - window[this.name] = this.finish.bind(this); - - this.script.set('src', this.url + (this.url.include('?') ? '&' : '?') + this.param + "&" + data) - .insertTo($$('script').last(), 'after'); - }, - - /** - * Receives the actual JSON data from the server - * - * @param Object JSON data - * @return void - */ - finish: function(data) { - this.status = 200; - this.readyState = 4; - - this.xhr.json = this.xhr.responseJSON = data; - - this.onreadystatechange(); - }, - - /** - * We can't really cancel a JSONP request - * but we can prevent the default handler to ckick in - * - * @return void - */ - abort: function() { - window[this.name] = function() {}; - } -}); - - -/** - * Basic visual effects class - * - * Credits: - * The basic principles, structures and naming system are inspired by - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -var Fx = RightJS.Fx = new Class(Observer, { - extend: { - EVENTS: $w('start finish cancel'), - - // named durations - Durations: { - 'short': 200, - 'normal': 400, - 'long': 800 - }, - - // default options - Options: { - fps: IE8_OR_LESS ? 40 : 60, - duration: 'normal', - transition: 'Sin', - queue: true - }, - - // list of basic transitions - Transitions: { - Sin: function(i) { - return -(Math.cos(Math.PI * i) - 1) / 2; - }, - - Cos: function(i) { - return Math.asin((i-0.5) * 2)/Math.PI + 0.5; - }, - - Exp: function(i) { - return Math.pow(2, 8 * (i - 1)); - }, - - Log: function(i) { - return 1 - Math.pow(2, - 8 * i); - }, - - Lin: function(i) { - return i; - } - } - }, - - /** - * Basic constructor - * - * @param Object options - */ - initialize: function(element, options) { - this.$super(options); - this.element = $(element); - fx_register(this); - }, - - /** - * starts the transition - * - * @return Fx this - */ - start: function() { - if (fx_add_to_queue(this, arguments)) { return this; } - - var options = this.options, - duration = Fx.Durations[options.duration] || options.duration, - transition = Fx.Transitions[options.transition] || options.transition, - steps = (duration / 1000 * this.options.fps).ceil(), - interval = (1000 / this.options.fps).round(); - - fx_mark_current(this); - - this.prepare.apply(this, arguments); - - fx_start_timer(this, transition, interval, steps); - - return this.fire('start', this); - }, - - /** - * finishes the transition - * - * @return Fx this - */ - finish: function() { - fx_stop_timer(this); - fx_remove_from_queue(this); - this.fire('finish'); - fx_run_next(this); - return this; - }, - - /** - * interrupts the transition - * - * NOTE: - * this method cancels all the scheduled effects - * in the element chain - * - * @return Fx this - */ - cancel: function() { - fx_stop_timer(this); - fx_remove_from_queue(this); - return this.fire('cancel'); - }, - -// protected - // dummy method, should be implemented in a subclass - prepare: function() {}, - - // dummy method, processes the element properties - render: function() {} -}), - -// global effects registry -scheduled_fx = [], running_fx = []; - -/** - * Registers the element in the effects queue - * - * @param Fx effect - * @return void - */ -function fx_register(fx) { - var uid = $uid((fx.element || {})._ || {}); - fx.ch = (scheduled_fx[uid] = scheduled_fx[uid] || []); - fx.cr = (running_fx[uid] = running_fx[uid] || []); -} - -/** - * Registers the effect in the effects queue - * - * @param Fx fx - * @param Arguments original arguments list - * @return boolean true if it queued and false if it's ready to go - */ -function fx_add_to_queue(fx, args) { - var chain = fx.ch, queue = fx.options.queue; - - if (!chain || fx.$ch) { - return (fx.$ch = false); - } - - if (queue) { - chain.push([args, fx]); - } - - return queue && chain[0][1] !== fx; -} - -/** - * Puts the fx into the list of currently running effects - * - * @param Fx fx - * @return void - */ -function fx_mark_current(fx) { - if (fx.cr) { - fx.cr.push(fx); - } -} - -/** - * Removes the fx from the queue - * - * @param Fx fx - * @return void - */ -function fx_remove_from_queue(fx) { - var currents = fx.cr; - if (currents) { - currents.splice(currents.indexOf(fx), 1); - } -} - -/** - * Tries to invoke the next effect in the queue - * - * @param Fx fx - * @return void - */ -function fx_run_next(fx) { - var chain = fx.ch, next = chain.shift(); - if ((next = chain[0])) { - next[1].$ch = true; - next[1].start.apply(next[1], next[0]); - } -} - -/** - * Cancels all currently running and scheduled effects - * on the element - * - * @param Element element - * @return void - */ -function fx_cancel_all(element) { - var uid = $uid(element._); - - (running_fx[uid] || []).each('cancel'); - (scheduled_fx[uid] || []).splice(0); -} - -/** - * Initializes the fx rendering timer - * - * @param Fx fx - * @param Function transition stops calculator - * @param Float interval - * @param Integer number of steps - * @return void - */ -function fx_start_timer(fx, transition, interval, steps) { - var number = 1; - fx._timer = setInterval(function() { - if (number > steps) { - fx.finish(); - } else { - fx.render(transition(number/steps)); - number ++; - } - }, interval); -} - -/** - * Cancels the Fx rendering timer (if any) - * - * @param Fx fx - * @return void - */ -function fx_stop_timer(fx) { - if (fx._timer) { - clearInterval(fx._timer); - } -} - - -/** - * There are the String unit extensions for the effects library - * - * Copyright (C) 2008-2009 Nikolay V. Nemshilov - */ -String.COLORS = { - maroon: '#800000', - red: '#ff0000', - orange: '#ffA500', - yellow: '#ffff00', - olive: '#808000', - purple: '#800080', - fuchsia: '#ff00ff', - white: '#ffffff', - lime: '#00ff00', - green: '#008000', - navy: '#000080', - blue: '#0000ff', - aqua: '#00ffff', - teal: '#008080', - black: '#000000', - silver: '#c0c0c0', - gray: '#808080', - brown: '#a52a2a' -}; - -String.include({ - /** - * converts a #XXX or rgb(X, X, X) sring into standard #XXXXXX color string - * - * @return String hex color - */ - toHex: function() { - var match = /^#(\w)(\w)(\w)$/.exec(this); - - if (match) { - match = "#"+ match[1]+match[1]+match[2]+match[2]+match[3]+match[3]; - } else if ((match = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(this))) { - match = "#"+ match.slice(1).map(function(bit) { - bit = (bit-0).toString(16); - return bit.length == 1 ? '0'+bit : bit; - }).join(''); - } else { - match = String.COLORS[this] || this; - } - - return match; - }, - - /** - * converts a hex string into an rgb array - * - * @param boolean flag if need an array - * @return String rgb(R,G,B) or Array [R,G,B] - */ - toRgb: function(array) { - var match = /#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})/i.exec(this.toHex()||''); - - if (match) { - match = match.slice(1).map('toInt', 16); - match = array ? match : 'rgb('+match+')'; - } - - return match; - } -}); - - -/** - * This block contains additional Element shortcuts for effects easy handling - * - * Credits: - * Some ideas are inspired by - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Element.include({ - /** - * Stops all the visual effects on the element - * - * @return Element this - */ - stop: function() { - fx_cancel_all(this); - return this; - }, - - /** - * hides the element with given visual effect - * - * @param String fx name - * @param Object fx options - * @return Element this - */ - hide: function(fx, options) { - return (fx && this.visible()) ? call_fx(this, fx, ['out', options]) : this.$super(); - }, - - /** - * shows the element with the given visual effect - * - * @param String fx name - * @param Object fx options - * @return Element this - */ - show: function(fx, options) { - return (fx && !this.visible()) ? call_fx(this, fx, ['in', options]) : this.$super(); - }, - - /** - * Toggles the element state with visual effect - * - * @param String fx name - * @param Object fx options - * @return Element this - */ - toggle: function(fx, options) { - return fx ? call_fx(this, fx, ['toggle', options]) : this.$super(); - }, - - /** - * Removes the element out of the DOM structure - * - * @param String fx name - * @param Object fx options - * @return Element this - */ - remove: function(fx, options) { - return (fx && this.visible()) ? call_fx(this, fx, ['out', $ext(options || {}, { - onFinish: this.$super.bind(this) - })]) : this.$super(); - }, - - /** - * runs the Fx.Morth effect to the given style - * - * @param style Object style - * @param options Object optional effect options - * @return Element self - */ - morph: function(style, options) { - return call_fx(this, 'morph', [style, options || {}]); // <- don't replace with arguments - }, - - /** - * highlights the element - * - * @param start String start color - * @param end String optional end color - * @param Object effect options - * @return Element self - */ - highlight: function() { - return call_fx(this, 'highlight', arguments); - }, - - /** - * runs the Fx.Fade effect on the element - * - * @param mixed fade direction 'in' 'out' or a float number - * @return Element self - */ - fade: function() { - return call_fx(this, 'fade', arguments); - }, - - /** - * runs the Fx.Slide effect on the element - * - * @param String 'in' or 'out' - * @param Object effect options - * @return Element self - */ - slide: function() { - return call_fx(this, 'slide', arguments); - }, - - /** - * Starts the smooth scrolling effect - * - * @param position Object {x: NNN, y: NNN} where to scroll - * @param options Object fx-options - * @return Element this - */ - scroll: function(value, options) { - return call_fx(this, 'scroll', [value, options||{}]); - }, - - /** - * wraps the old scroll to be able to run it with fxes - * - * If you send two hashes then will start a smooth scrolling - * otherwise will just jump over with the usual method - * - * @return Element this - */ - scrollTo: function(value, options) { - return isHash(options) ? this.scroll(value, options) : this.$super.apply(this, arguments); - } -}); - -/** - * Calls the visual effect on the element - * - * @param Element context - * @param String fx-name - * @param Object fx-options - * @return Element context - */ -function call_fx(element, name, params) { - var args = $A(params).compact(), - options = isHash(args.last()) ? args.pop() : {}, - fx = new Fx[name.capitalize()](element, options); - - fx.start.apply(fx, args); - - return element; -} - - -/** - * This class provides the basic effect for styles manipulation - * - * Copyright (C) 2008-2011 Nikolay Nemshilov - */ - -///////////////////////////////////////////////////////////////////////////// -// Native css-transitions based implementation -///////////////////////////////////////////////////////////////////////////// - -var native_fx_prefix = ['WebkitT', 'OT', 'MozT', 'MsT', 't'].first(function(name) { - return name + 'ransition' in HTML.style; -}), -native_fx_transition = native_fx_prefix + 'ransition', -native_fx_property = native_fx_transition + 'Property', -native_fx_duration = native_fx_transition + 'Duration', -native_fx_function = native_fx_transition + 'TimingFunction', - -// basic transition algorithm replacements -native_fx_functions = { - Sin: 'cubic-bezier(.3,0,.6,1)', - Cos: 'cubic-bezier(0,.3,.6,0)', - Log: 'cubic-bezier(0.6,.3,.8)', - Exp: 'cubic-bezier(.6,0,.8,.3)', - Lin: 'cubic-bezier(0,0,1,1)' -}; - -function native_fx_prepare(style) { - var options = this.options, - element = this.element, - element_style = element._.style, - old_style = Object.only( - element.computedStyles(), - native_fx_property, - native_fx_duration, - native_fx_function - ); - - function reset_transitions_style() { - for (var key in old_style) { - element_style[key] = old_style[key]; - } - } - - this - .onFinish(reset_transitions_style) - .onCancel(function() { - element_style[native_fx_property] = 'none'; - setTimeout(reset_transitions_style, 1); - }); - - // setting up the transition - element_style[native_fx_property] = 'all'; - element_style[native_fx_duration] = (Fx.Durations[options.duration] || options.duration) +'ms'; - element_style[native_fx_function] = native_fx_functions[options.transition] || options.transition; - - setTimeout(function() { element.setStyle(style); }, 0); -} - -// NOTE: OPERA's css-transitions are a bit jerky so we disable them by default -Fx.Options.engine = native_fx_prefix === undefined || Browser_Opera ? 'javascript' : 'native'; - -//////////////////////////////////////////////////////////////////////////// -// Manual version -//////////////////////////////////////////////////////////////////////////// - -Fx.Morph = new Class(Fx, { -// protected - - // parepares the effect - prepare: function(style) { - if (this.options.engine === 'native' && native_fx_prefix !== undefined) { - this.render = this.transition = function() {}; - native_fx_prepare.call(this, style); - } else { - var keys = style_keys(style), - before = clone_style(this.element, keys), - after = end_style(this.element, style, keys); - - clean_styles(this.element, before, after); - - this.before = parse_style(before); - this.after = parse_style(after); - } - }, - - render: function(delta) { - var before, after, value, style = this.element._.style, key, i, l; - for (key in this.after) { - before = this.before[key]; - after = this.after[key]; - - for (i=0, l = after.length; i < l; i++) { - value = before[i] + (after[i] - before[i]) * delta; - if (after.r) { - value = Math.round(value); - } - after.t[i*2 + 1] = value; - } - - style[key] = after.t.join(''); - } - } -}); - -// a list of common style names to compact the code a bit -var directions = $w('Top Left Right Bottom'); - -// adds variants to the style names list -function add_variants(keys, key, variants) { - for (var i=0; i < variants.length; i++) { - keys.push(key + variants[i]); - } -} - -// creates an appropriate style-keys list out of the user styles -function style_keys(style) { - var keys = [], border_types = ['Style', 'Color', 'Width'], key, i, j; - - for (key in style) { - if (key.startsWith('border')) { - for (i=0; i < 3; i++) { - for (j=0; j < 4; j++) { - keys.push('border' + directions[j] + border_types[i]); - } - } - } else if (key === 'margin' || key === 'padding') { - add_variants(keys, key, directions); - } else if (key.startsWith('background')) { - add_variants(keys, 'background', ['Color', 'Position', 'PositionX', 'PositionY']); - } else if (key === 'opacity' && IE_OPACITY) { - keys.push('filter'); - } else { - keys.push(key); - } - } - - return keys; -} - - -// checks if the color is transparent -function is_transparent(color) { - return color === 'transparent' || color === 'rgba(0, 0, 0, 0)'; -} - -// adjusts the border-styles -function check_border_styles(element, before, after) { - for (var i=0; i < 4; i++) { - var - bd_style = 'border' + directions[i] + 'Style', - bd_width = 'border' + directions[i] + 'Width', - bd_color = 'border' + directions[i] + 'Color'; - - if (bd_style in before && before[bd_style] != after[bd_style]) { - var style = element._.style; - - if (before[bd_style] == 'none') { - style[bd_width] = '0px'; - } - - style[bd_style] = after[bd_style]; - if (is_transparent(before[bd_color])) { - style[bd_color] = element.getStyle('Color'); - } - } - } -} - -// parses the style hash into a processable format -function parse_style(values) { - var result = {}, re = /[\d\.\-]+/g, m, key, value, i; - - for (key in values) { - m = values[key].match(re); - value = m.map('toFloat'); - value.t = values[key].split(re); - value.r = value.t[0] === 'rgb('; - - if (value.t.length == 1) { value.t.unshift(''); } - - for (i=0; i < value.length; i++) { - value.t.splice(i*2 + 1, 0, value[i]); - } - result[key] = value; - } - - return result; -} - -// cleans up and optimizies the styles -function clean_styles(element, before, after) { - var key; - - for (key in after) { - // checking the height/width options - if ((key == 'width' || key == 'height') && before[key] == 'auto') { - before[key] = element._['offset'+key.capitalize()] + 'px'; - } - } - - // IE opacity filter fix - if (IE_OPACITY && after.filter && !before.filter) { - before.filter = 'alpha(opacity=100)'; - } - - // adjusting the border style - check_border_styles(element, before, after); - - // cleaing up the list - for (key in after) { - // proprocessing colors - if (after[key] !== before[key] && /color/i.test(key)) { - if (Browser_Opera) { - after[key] = after[key].replace(/"/g, ''); - before[key] = before[key].replace(/"/g, ''); - } - - if (!is_transparent(after[key])) { after[key] = after[key].toRgb(); } - if (!is_transparent(before[key])) { before[key] = before[key].toRgb(); } - - if (!after[key] || !before[key]) { after[key] = before[key] = ''; } - } - - // filling up the missing size - if (/\d/.test(after[key]) && !/\d/.test(before[key])) { - before[key] = after[key].replace(/[\d\.\-]+/g, '0'); - } - - // removing unprocessable keys - if (after[key] === before[key] || !/\d/.test(before[key]) || !/\d/.test(after[key])) { - delete(after[key]); - delete(before[key]); - } - } -} - -// cloning the element current styles hash -function clone_style(element, keys) { - var i=0, len = keys.length, style = element.computedStyles(), clean = {}, key; - - for (; i < len; i++) { - key = keys[i]; - - if (key in style) { - clean[key] = ''+ style[key]; - - // libwebkit bug fix for in case of languages pack applied - if (key === 'opacity') { - clean[key] = clean[key].replace(',', '.'); - } - } - } - - return clean; -} - -// calculating the end styles hash -function end_style(element, style, keys) { - var dummy = element.clone() - .setStyle('position:absolute;z-index:-1;visibility:hidden') - .setWidth(element.size().x) - .setStyle(style), after; - - if (element.parent()) { - element.insert(dummy, 'before'); - } - - after = clone_style(dummy, keys); - dummy.remove(); - - return after; -} - - -/** - * the elements hightlighting effect - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Fx.Highlight = new Class(Fx.Morph, { - extend: { - Options: Object.merge(Fx.Options, { - color: '#FF8', - transition: 'Exp' - }) - }, - -// protected - - /** - * starts the transition - * - * @param high String the hightlight color - * @param back String optional fallback color - * @return self - */ - prepare: function(start, end) { - var element = this.element, - element_style = element._.style, - style_name = 'backgroundColor', - end_color = end || element.getStyle(style_name); - - if (is_transparent(end_color)) { - this.onFinish(function() { element_style[style_name] = 'transparent'; }); - - // trying to find the end color - end_color = [element].concat(element.parents()) - .map('getStyle', style_name) - .reject(is_transparent) - .compact().first() || '#FFF'; - } - - element_style[style_name] = (start || this.options.color); - - return this.$super({backgroundColor: end_color}); - } -}); - - -/** - * this is a superclass for the bidirectional effects - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Fx.Twin = new Class(Fx.Morph, { - - /** - * hides the element if it meant to be switched off - * - * @return Fx self - */ - finish: function() { - if (this.how === 'out') { - // calling 'prototype' to prevent circular calls from subclasses - Element.prototype.hide.call(this.element); - } - - return this.$super(); - }, - -// protected - - /** - * assigns the direction of the effect in or out - * - * @param String 'in', 'out' or 'toggle', 'toggle' by default - */ - setHow: function(how) { - this.how = how || 'toggle'; - - if (this.how === 'toggle') { - this.how = this.element.visible() ? 'out' : 'in'; - } - } - -}); - - -/** - * the slide effects wrapper - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Fx.Slide = new Class(Fx.Twin, { - extend: { - Options: Object.merge(Fx.Options, { - direction: 'top' - }) - }, - -// protected - prepare: function(how) { - this.setHow(how); - - // calling 'prototype' to prevent circular calls from subclasses - var element = Element.prototype.show.call(this.element), - element_style = element._.style, - old_styles = Object.only( - element_style, - 'overflow', 'width', 'height', - 'marginTop', 'marginLeft' - ); - - function restore_styles() { - for (var key in old_styles) { - element_style[key] = old_styles[key]; - } - } - - this.onFinish(restore_styles).onCancel(restore_styles); - - element_style.overflow = 'hidden'; - - return this.$super(fx_slide_prepare_styles( - element_style, - element.size(), - this.options.direction, - this.how - )); - } -}); - -function fx_slide_prepare_styles(element_style, size, direction, how) { - var style = {}, - margin_left = element_style.marginLeft.toFloat() || 0, - margin_top = element_style.marginTop.toFloat() || 0, - to_right = direction === 'right', - to_bottom = direction === 'bottom', - vertical = direction === 'top' || to_bottom; - - if (how === 'out') { - style[vertical ? 'height' : 'width'] = '0px'; - - if (to_right) { - style.marginLeft = margin_left + size.x+'px'; - } else if (to_bottom) { - style.marginTop = margin_top + size.y +'px'; - } - } else { - if (vertical) { - style.height = size.y + 'px'; - element_style.height = '0px'; - } else { - style.width = size.x + 'px'; - element_style.width = '0px'; - } - - if (to_right) { - style.marginLeft = margin_left + 'px'; - element_style.marginLeft = margin_left + size.x + 'px'; - } else if (to_bottom) { - style.marginTop = margin_top + 'px'; - element_style.marginTop = margin_top + size.y + 'px'; - } - } - - return style; -} - - -/** - * The opacity effects wrapper - * - * Copyright (C) 2008-2011 Nikolay V. Nemshilov - */ -Fx.Fade = new Class(Fx.Twin, { - prepare: function(how) { - this.setHow(how); - - if (this.how === 'in') { - // calling 'prototype' to prevent circular calls from subclasses - Element.prototype.show.call(this.element.setStyle({opacity: 0})); - } - - return this.$super({opacity: this.how === 'in' ? 1 : 0}); - } -}); - - -/** - * An abstract attributes based Fx - * - * Copyright (C) 2010 Nikolay Nemshilov - */ -Fx.Attr = new Class(Fx, { - - prepare: function(attrs) { - this.before = {}; - this.after = attrs; - var key, element = this.element._; - - for (key in attrs) { - this.before[key] = element[key]; - } - }, - - render: function(delta) { - var key, element = this.element._, before = this.before; - for (key in before) { - element[key] = before[key] + (this.after[key] - before[key]) * delta; - } - } - -}); - -/** - * A smooth scrolling visual effect - * - * Copyright (C) 2009-2011 Nikolay Nemshilov - */ -Fx.Scroll = new Class(Fx.Attr, { - - initialize: function(element, options) { - element = $(element); - // swapping the actual scrollable when it's the window - this.$super( - element instanceof Window ? - element._.document[ - 'body' in element._.document ? 'body' : 'documentElement' - ] : element, - options - ); - }, - - prepare: function(value) { - var attrs = {}; - - if ('x' in value) { attrs.scrollLeft = value.x; } - if ('y' in value) { attrs.scrollTop = value.y; } - - this.$super(attrs); - } - -}); - - -/** - * this module handles the work with cookies - * - * Credits: - * Most things in the unit are take from - * - MooTools (http://mootools.net) Copyright (C) Valerio Proietti - * - * Copyright (C) 2008-2010 Nikolay V. Nemshilov - */ -var Cookie = RightJS.Cookie = new Class({ - include: Options, - - extend: { - // sets the cookie - set: function(name, value, options) { - return new this(name, options).set(value); - }, - // gets the cookie - get: function(name) { - return new this(name).get(); - }, - // deletes the cookie - remove: function(name) { - return new this(name).remove(); - }, - - // checks if the cookies are enabled - enabled: function() { - document.cookie = "__t=1"; - return document.cookie.indexOf("__t=1")!=-1; - }, - - // some basic options - Options: { - secure: false, - document: document - } - }, - - /** - * constructor - * @param String cookie name - * @param Object options - * @return void - */ - initialize: function(name, options) { - this.name = name; - this.setOptions(options); - }, - - /** - * sets the cookie with the name - * - * @param mixed value - * @return Cookie this - */ - set: function(data) { - var value = encodeURIComponent(data), options = this.options; - if (options.domain) { value += '; domain=' + options.domain; } - if (options.path) { value += '; path=' + options.path; } - if (options.duration) { - var date = new Date(); - date.setTime(date.getTime() + options.duration * 24 * 60 * 60 * 1000); - value += '; expires=' + date.toGMTString(); - } - if (options.secure) { value += '; secure'; } - options.document.cookie = this.name + '=' + value; - return this; - }, - - /** - * searches for a cookie with the name - * - * @return mixed saved value or null if nothing found - */ - get: function() { - var value = this.options.document.cookie.match( - '(?:^|;)\\s*' + RegExp.escape(this.name) + '=([^;]*)' - ); - return value ? decodeURIComponent(value[1]) : null; - }, - - /** - * removes the cookie - * - * @return Cookie this - */ - remove: function() { - this.options.duration = -1; - return this.set(''); - } -}); - - -// globalizing the top-level variables -$ext(window, Object.without(RightJS, 'version', 'modules')); - -return RightJS; -})(window, document, Object, Array, String, Function, Number, Math); -/** - * The old browsers support patch loading script - * will be included in the core file when it's built - * with the no-olds option - * - * Basically it just checks all the script tags on the page - * finds the core inclusion tag and uses it's src attribute - * to dynamically load the olds patch - * - * Copyright (C) 2009-2011 Nikolay V. Nemshilov - */ -if (RightJS.Browser.OLD) { - (function(d) { - var script = d.createElement('script'), - scripts = d.getElementsByTagName('script'), - rjs_spt = scripts[scripts.length - 1]; - - script.src = rjs_spt.src.replace(/(^|\/)(right)([^\/]+)$/, '$1$2-olds$3'); - - rjs_spt.parentNode.appendChild(script); - })(document); -} diff --git a/js/libraries/balupton-history/vendor/zepto.js b/js/libraries/balupton-history/vendor/zepto.js deleted file mode 100755 index 01e7cb26..00000000 --- a/js/libraries/balupton-history/vendor/zepto.js +++ /dev/null @@ -1,1193 +0,0 @@ -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function(undefined){ - if (String.prototype.trim === undefined) // fix for iOS 3.2 - String.prototype.trim = function(){ return this.replace(/^\s+/, '').replace(/\s+$/, '') }; - - // For iOS 3.x - // from https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduce - if (Array.prototype.reduce === undefined) - Array.prototype.reduce = function(fun){ - if(this === void 0 || this === null) throw new TypeError(); - var t = Object(this), len = t.length >>> 0, k = 0, accumulator; - if(typeof fun != 'function') throw new TypeError(); - if(len == 0 && arguments.length == 1) throw new TypeError(); - - if(arguments.length >= 2) - accumulator = arguments[1]; - else - do{ - if(k in t){ - accumulator = t[k++]; - break; - } - if(++k >= len) throw new TypeError(); - } while (true); - - while (k < len){ - if(k in t) accumulator = fun.call(undefined, accumulator, t[k], k, t); - k++; - } - return accumulator; - }; - -})(); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -var Zepto = (function() { - var undefined, key, $$, classList, emptyArray = [], slice = emptyArray.slice, - document = window.document, - elementDisplay = {}, classCache = {}, - getComputedStyle = document.defaultView.getComputedStyle, - cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, - fragmentRE = /^\s*<(\w+)[^>]*>/, - elementTypes = [1, 9, 11], - adjacencyOperators = ['prepend', 'after', 'before', 'append'], - reverseAdjacencyOperators = ['append', 'prepend'], - table = document.createElement('table'), - tableRow = document.createElement('tr'), - containers = { - 'tr': document.createElement('tbody'), - 'tbody': table, 'thead': table, 'tfoot': table, - 'td': tableRow, 'th': tableRow, - '*': document.createElement('div') - }; - - function isF(value) { return ({}).toString.call(value) == "[object Function]" } - function isO(value) { return value instanceof Object } - function isA(value) { return value instanceof Array } - function likeArray(obj) { return typeof obj.length == 'number' } - - function compact(array) { return array.filter(function(item){ return item !== undefined && item !== null }) } - function flatten(array) { return array.length > 0 ? [].concat.apply([], array) : array } - function camelize(str) { return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } - function dasherize(str){ - return str.replace(/::/g, '/') - .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') - .replace(/([a-z\d])([A-Z])/g, '$1_$2') - .replace(/_/g, '-') - .toLowerCase(); - } - function uniq(array) { return array.filter(function(item,index,array){ return array.indexOf(item) == index }) } - - function classRE(name){ - return name in classCache ? - classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')); - } - - function maybeAddPx(name, value) { return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value; } - - function defaultDisplay(nodeName) { - var element, display; - if (!elementDisplay[nodeName]) { - element = document.createElement(nodeName); - document.body.appendChild(element); - display = getComputedStyle(element, '').getPropertyValue("display"); - element.parentNode.removeChild(element); - display == "none" && (display = "block"); - elementDisplay[nodeName] = display; - } - return elementDisplay[nodeName]; - } - - function fragment(html, name) { - if (name === undefined) fragmentRE.test(html) && RegExp.$1; - if (!(name in containers)) name = '*'; - var container = containers[name]; - container.innerHTML = '' + html; - return slice.call(container.childNodes); - } - - function Z(dom, selector){ - dom = dom || emptyArray; - dom.__proto__ = Z.prototype; - dom.selector = selector || ''; - return dom; - } - - function $(selector, context){ - if (!selector) return Z(); - if (context !== undefined) return $(context).find(selector); - else if (isF(selector)) return $(document).ready(selector); - else if (selector instanceof Z) return selector; - else { - var dom; - if (isA(selector)) dom = compact(selector); - else if (elementTypes.indexOf(selector.nodeType) >= 0 || selector === window) - dom = [selector], selector = null; - else if (fragmentRE.test(selector)) - dom = fragment(selector, RegExp.$1), selector = null; - else if (selector.nodeType && selector.nodeType == 3) dom = [selector]; - else dom = $$(document, selector); - return Z(dom, selector); - } - } - - $.extend = function(target){ - slice.call(arguments, 1).forEach(function(source) { - for (key in source) target[key] = source[key]; - }) - return target; - } - $.qsa = $$ = function(element, selector){ return slice.call(element.querySelectorAll(selector)) } - - function filtered(nodes, selector){ - return selector === undefined ? $(nodes) : $(nodes).filter(selector); - } - - function funcArg(context, arg, idx, payload){ - return isF(arg) ? arg.call(context, idx, payload) : arg; - } - - $.isFunction = isF; - $.isObject = isO; - $.isArray = isA; - - $.map = function(elements, callback) { - var value, values = [], i, key; - if (likeArray(elements)) - for (i = 0; i < elements.length; i++) { - value = callback(elements[i], i); - if (value != null) values.push(value); - } - else - for (key in elements) { - value = callback(elements[key], key); - if (value != null) values.push(value); - } - return flatten(values); - } - - $.each = function(elements, callback) { - var i, key; - if (likeArray(elements)) - for(i = 0; i < elements.length; i++) { - if(callback(i, elements[i]) === false) return elements; - } - else - for(key in elements) { - if(callback(key, elements[key]) === false) return elements; - } - return elements; - } - - $.fn = { - forEach: emptyArray.forEach, - reduce: emptyArray.reduce, - push: emptyArray.push, - indexOf: emptyArray.indexOf, - concat: emptyArray.concat, - map: function(fn){ - return $.map(this, function(el, i){ return fn.call(el, i, el) }); - }, - slice: function(){ - return $(slice.apply(this, arguments)); - }, - ready: function(callback){ - if (document.readyState == 'complete' || document.readyState == 'loaded') callback(); - document.addEventListener('DOMContentLoaded', callback, false); - return this; - }, - get: function(idx){ return idx === undefined ? this : this[idx] }, - size: function(){ return this.length }, - remove: function () { - return this.each(function () { - if (this.parentNode != null) { - this.parentNode.removeChild(this); - } - }); - }, - each: function(callback){ - this.forEach(function(el, idx){ callback.call(el, idx, el) }); - return this; - }, - filter: function(selector){ - return $([].filter.call(this, function(element){ - return $$(element.parentNode, selector).indexOf(element) >= 0; - })); - }, - end: function(){ - return this.prevObject || $(); - }, - add:function(selector,context){ - return $(uniq(this.concat($(selector,context)))); - }, - is: function(selector){ - return this.length > 0 && $(this[0]).filter(selector).length > 0; - }, - not: function(selector){ - var nodes=[]; - if (isF(selector) && selector.call !== undefined) - this.each(function(idx){ - if (!selector.call(this,idx)) nodes.push(this); - }); - else { - var excludes = typeof selector == 'string' ? this.filter(selector) : - (likeArray(selector) && isF(selector.item)) ? slice.call(selector) : $(selector); - this.forEach(function(el){ - if (excludes.indexOf(el) < 0) nodes.push(el); - }); - } - return $(nodes); - }, - eq: function(idx){ - return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1); - }, - first: function(){ return $(this[0]) }, - last: function(){ return $(this[this.length - 1]) }, - find: function(selector){ - var result; - if (this.length == 1) result = $$(this[0], selector); - else result = this.map(function(){ return $$(this, selector) }); - return $(result); - }, - closest: function(selector, context){ - var node = this[0], nodes = $$(context !== undefined ? context : document, selector); - if (nodes.length === 0) node = null; - while(node && node !== document && nodes.indexOf(node) < 0) node = node.parentNode; - return $(node !== document && node); - }, - parents: function(selector){ - var ancestors = [], nodes = this; - while (nodes.length > 0) - nodes = $.map(nodes, function(node){ - if ((node = node.parentNode) && node !== document && ancestors.indexOf(node) < 0) { - ancestors.push(node); - return node; - } - }); - return filtered(ancestors, selector); - }, - parent: function(selector){ - return filtered(uniq(this.pluck('parentNode')), selector); - }, - children: function(selector){ - return filtered(this.map(function(){ return slice.call(this.children) }), selector); - }, - siblings: function(selector){ - return filtered(this.map(function(i, el){ - return slice.call(el.parentNode.children).filter(function(child){ return child!==el }); - }), selector); - }, - empty: function(){ return this.each(function(){ this.innerHTML = '' }) }, - pluck: function(property){ return this.map(function(){ return this[property] }) }, - show: function(){ - return this.each(function() { - this.style.display == "none" && (this.style.display = null); - if (getComputedStyle(this, '').getPropertyValue("display") == "none") { - this.style.display = defaultDisplay(this.nodeName) - } - }) - }, - replaceWith: function(newContent) { - return this.each(function() { - var par=this.parentNode,next=this.nextSibling; - $(this).remove(); - next ? $(next).before(newContent) : $(par).append(newContent); - }); - }, - wrap: function(newContent) { - return this.each(function() { - $(this).wrapAll($(newContent)[0].cloneNode(false)); - }); - }, - wrapAll: function(newContent) { - if (this[0]) { - $(this[0]).before(newContent = $(newContent)); - newContent.append(this); - } - return this; - }, - unwrap: function(){ - this.parent().each(function(){ - $(this).replaceWith($(this).children()); - }); - return this; - }, - hide: function(){ - return this.css("display", "none") - }, - toggle: function(setting){ - return (setting === undefined ? this.css("display") == "none" : setting) ? this.show() : this.hide(); - }, - prev: function(){ return $(this.pluck('previousElementSibling')) }, - next: function(){ return $(this.pluck('nextElementSibling')) }, - html: function(html){ - return html === undefined ? - (this.length > 0 ? this[0].innerHTML : null) : - this.each(function (idx) { - var originHtml = this.innerHTML; - $(this).empty().append( funcArg(this, html, idx, originHtml) ); - }); - }, - text: function(text){ - return text === undefined ? - (this.length > 0 ? this[0].textContent : null) : - this.each(function(){ this.textContent = text }); - }, - attr: function(name, value){ - return (typeof name == 'string' && value === undefined) ? - (this.length > 0 && this[0].nodeName == 'INPUT' && this[0].type == 'text' && name == 'value') ? (this.val()) : - (this.length > 0 ? this[0].getAttribute(name) || (name in this[0] ? this[0][name] : undefined) : undefined) : - this.each(function(idx){ - if (isO(name)) for (key in name) this.setAttribute(key, name[key]) - else this.setAttribute(name, funcArg(this, value, idx, this.getAttribute(name))); - }); - }, - removeAttr: function(name) { - return this.each(function() { this.removeAttribute(name); }); - }, - data: function(name, value){ - return this.attr('data-' + name, value); - }, - val: function(value){ - return (value === undefined) ? - (this.length > 0 ? this[0].value : null) : - this.each(function(){ - this.value = value; - }); - }, - offset: function(){ - if(this.length==0) return null; - var obj = this[0].getBoundingClientRect(); - return { - left: obj.left + document.body.scrollLeft, - top: obj.top + document.body.scrollTop, - width: obj.width, - height: obj.height - }; - }, - css: function(property, value){ - if (value === undefined && typeof property == 'string') - return this[0].style[camelize(property)] || getComputedStyle(this[0], '').getPropertyValue(property); - var css = ''; - for (key in property) css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'; - if (typeof property == 'string') css = dasherize(property) + ":" + maybeAddPx(property, value); - return this.each(function() { this.style.cssText += ';' + css }); - }, - index: function(element){ - return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]); - }, - hasClass: function(name){ - if (this.length < 1) return false; - else return classRE(name).test(this[0].className); - }, - addClass: function(name){ - return this.each(function(idx) { - classList = []; - var cls = this.className, newName = funcArg(this, name, idx, cls); - newName.split(/\s+/g).forEach(function(klass) { - if (!$(this).hasClass(klass)) { - classList.push(klass) - } - }, this); - classList.length && (this.className += (cls ? " " : "") + classList.join(" ")) - }); - }, - removeClass: function(name){ - return this.each(function(idx) { - if(name === undefined) - return this.className = ''; - classList = this.className; - funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass) { - classList = classList.replace(classRE(klass), " ") - }); - this.className = classList.trim() - }); - }, - toggleClass: function(name, when){ - return this.each(function(idx){ - var cls = this.className, newName = funcArg(this, name, idx, cls); - ((when !== undefined && !when) || $(this).hasClass(newName)) ? - $(this).removeClass(newName) : $(this).addClass(newName) - }); - } - }; - - 'filter,add,not,eq,first,last,find,closest,parents,parent,children,siblings'.split(',').forEach(function(property){ - var fn = $.fn[property]; - $.fn[property] = function() { - var ret = fn.apply(this, arguments); - ret.prevObject = this; - return ret; - } - }); - - ['width', 'height'].forEach(function(property){ - $.fn[property] = function(value) { - var offset; - if (value === undefined) { return (offset = this.offset()) && offset[property] } - else return this.css(property, value); - } - }); - - function insert(operator, target, node) { - var parent = (!operator || operator == 3) ? target : target.parentNode; - parent.insertBefore(node, - !operator ? parent.firstChild : // prepend - operator == 1 ? target.nextSibling : // after - operator == 2 ? target : // before - null); // append - } - - function traverseNode (node, fun) { - fun(node); - for (key in node.childNodes) { - traverseNode(node.childNodes[key], fun); - } - } - - adjacencyOperators.forEach(function(key, operator) { - $.fn[key] = function(html){ - var nodes = typeof(html) == 'object' ? html : fragment(html); - if (!('length' in nodes)) nodes = [nodes]; - if (nodes.length < 1) return this; - var size = this.length, copyByClone = size > 1, inReverse = operator < 2; - - return this.each(function(index, target){ - for (var i = 0; i < nodes.length; i++) { - var node = nodes[inReverse ? nodes.length-i-1 : i]; - traverseNode(node, function (node) { - if (node.nodeName != null && node.nodeName.toUpperCase() === 'SCRIPT') { - window['eval'].call(window, node.innerHTML); - } - }); - if (copyByClone && index < size - 1) node = node.cloneNode(true); - insert(operator, target, node); - } - }); - }; - }); - - reverseAdjacencyOperators.forEach(function(key) { - $.fn[key+'To'] = function(html){ - if (typeof(html) != 'object') html = $(html); - html[key](this); - return this; - }; - }); - - Z.prototype = $.fn; - - return $; -})(); - -'$' in window || (window.$ = Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function($){ - var $$ = $.qsa, handlers = {}, _zid = 1; - function zid(element) { - return element._zid || (element._zid = _zid++); - } - function findHandlers(element, event, fn, selector) { - event = parse(event); - if (event.ns) var matcher = matcherFor(event.ns); - return (handlers[zid(element)] || []).filter(function(handler) { - return handler - && (!event.e || handler.e == event.e) - && (!event.ns || matcher.test(handler.ns)) - && (!fn || handler.fn == fn) - && (!selector || handler.sel == selector); - }); - } - function parse(event) { - var parts = ('' + event).split('.'); - return {e: parts[0], ns: parts.slice(1).sort().join(' ')}; - } - function matcherFor(ns) { - return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)'); - } - - function add(element, events, fn, selector, delegate){ - var id = zid(element), set = (handlers[id] || (handlers[id] = [])); - events.split(/\s/).forEach(function(event){ - var callback = delegate || fn; - var proxyfn = function (event) { - var result = callback.apply(element, [event].concat(event.data)); - if (result === false) { - event.preventDefault(); - } - return result; - }; - var handler = $.extend(parse(event), {fn: fn, proxy: proxyfn, sel: selector, del: delegate, i: set.length}); - set.push(handler); - element.addEventListener(handler.e, proxyfn, false); - }); - } - function remove(element, events, fn, selector){ - var id = zid(element); - (events || '').split(/\s/).forEach(function(event){ - findHandlers(element, event, fn, selector).forEach(function(handler){ - delete handlers[id][handler.i]; - element.removeEventListener(handler.e, handler.proxy, false); - }); - }); - } - - $.event = { add: add, remove: remove } - - $.fn.bind = function(event, callback){ - return this.each(function(){ - add(this, event, callback); - }); - }; - $.fn.unbind = function(event, callback){ - return this.each(function(){ - remove(this, event, callback); - }); - }; - $.fn.one = function(event, callback){ - return this.each(function(){ - var self = this; - add(this, event, function wrapper(evt){ - callback.call(self, evt); - remove(self, event, arguments.callee); - }); - }); - }; - - var returnTrue = function(){return true}, - returnFalse = function(){return false}, - eventMethods = { - preventDefault: 'isDefaultPrevented', - stopImmediatePropagation: 'isImmediatePropagationStopped', - stopPropagation: 'isPropagationStopped' - }; - function createProxy(event) { - var proxy = $.extend({originalEvent: event}, event); - $.each(eventMethods, function(name, predicate) { - proxy[name] = function(){ - this[predicate] = returnTrue; - return event[name].apply(event, arguments); - }; - proxy[predicate] = returnFalse; - }) - return proxy; - } - - $.fn.delegate = function(selector, event, callback){ - return this.each(function(i, element){ - add(element, event, callback, selector, function(e, data){ - var target = e.target, nodes = $$(element, selector); - while (target && nodes.indexOf(target) < 0) target = target.parentNode; - if (target && !(target === element) && !(target === document)) { - callback.call(target, $.extend(createProxy(e), { - currentTarget: target, liveFired: element - }), data); - } - }); - }); - }; - $.fn.undelegate = function(selector, event, callback){ - return this.each(function(){ - remove(this, event, callback, selector); - }); - } - - $.fn.live = function(event, callback){ - $(document.body).delegate(this.selector, event, callback); - return this; - }; - $.fn.die = function(event, callback){ - $(document.body).undelegate(this.selector, event, callback); - return this; - }; - - $.fn.trigger = function(event, data){ - if (typeof event == 'string') event = $.Event(event); - event.data = data; - return this.each(function(){ this.dispatchEvent(event) }); - }; - - // triggers event handlers on current element just as if an event occurred, - // doesn't trigger an actual event, doesn't bubble - $.fn.triggerHandler = function(event, data){ - var e, result; - this.each(function(i, element){ - e = createProxy(typeof event == 'string' ? $.Event(event) : event); - e.data = data; e.target = element; - $.each(findHandlers(element, event.type || event), function(i, handler){ - result = handler.proxy(e); - if (e.isImmediatePropagationStopped()) return false; - }); - }); - return result; - }; - - // shortcut methods for `.bind(event, fn)` for each event type - ('focusin focusout load resize scroll unload click dblclick '+ - 'mousedown mouseup mousemove mouseover mouseout '+ - 'change select keydown keypress keyup error').split(' ').forEach(function(event) { - $.fn[event] = function(callback){ return this.bind(event, callback) }; - }); - - ['focus', 'blur'].forEach(function(name) { - $.fn[name] = function(callback) { - if (callback) this.bind(name, callback); - else if (this.length) try { this.get(0)[name]() } catch(e){}; - return this; - }; - }); - - $.Event = function(type, props) { - var event = document.createEvent('Events'); - if (props) $.extend(event, props); - event.initEvent(type, !(props && props.bubbles === false), true); - return event; - }; - -})(Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function($){ - function detect(ua){ - var ua = ua, os = {}, - android = ua.match(/(Android)\s+([\d.]+)/), - ipad = ua.match(/(iPad).*OS\s([\d_]+)/), - iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/), - webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/), - touchpad = webos && ua.match(/TouchPad/), - blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); - if (android) os.android = true, os.version = android[2]; - if (iphone) os.ios = true, os.version = iphone[2].replace(/_/g, '.'), os.iphone = true; - if (ipad) os.ios = true, os.version = ipad[2].replace(/_/g, '.'), os.ipad = true; - if (webos) os.webos = true, os.version = webos[2]; - if (touchpad) os.touchpad = true; - if (blackberry) os.blackberry = true, os.version = blackberry[2]; - return os; - } - - // ### $.os - // - // Object contains information about running environmental - // - // *Example:* - // - // $.os.ios // => true if running on Apple iOS - // $.os.android // => true if running on Android - // $.os.webos // => true if running on HP/Palm WebOS - // $.os.touchpad // => true if running on a HP TouchPad - // $.os.version // => string with version number, - // "4.0", "3.1.1", "2.1", etc. - // $.os.iphone // => true if running on iPhone - // $.os.ipad // => true if running on iPad - // $.os.blackberry // => true if running on BlackBerry - // - $.os = detect(navigator.userAgent); - $.__detect = detect; - - var v = navigator.userAgent.match(/WebKit\/([\d.]+)/); - $.browser = v ? { webkit: true, version: v[1] } : { webkit: false }; - -})(Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function($, undefined){ - var supportedTransforms = [ - 'scale', 'scaleX', 'scaleY', - 'translate', 'translateX', 'translateY', 'translate3d', - 'skew', 'skewX', 'skewY', - 'rotate', 'rotateX', 'rotateY', 'rotateZ', 'rotate3d', - 'matrix' - ]; - - $.fn.anim = function(properties, duration, ease, callback){ - var transforms = [], cssProperties = {}, key, that = this, wrappedCallback; - - for (key in properties) - if (supportedTransforms.indexOf(key)>=0) - transforms.push(key + '(' + properties[key] + ')'); - else - cssProperties[key] = properties[key]; - - wrappedCallback = function(){ - that.css({'-webkit-transition':'none'}); - callback && callback(); - } - - if (duration > 0) - this.one('webkitTransitionEnd', wrappedCallback); - else - setTimeout(wrappedCallback, 0); - - if (transforms.length > 0) { - cssProperties['-webkit-transform'] = transforms.join(' ') - } - - cssProperties['-webkit-transition'] = 'all ' + (duration !== undefined ? duration : 0.5) + 's ' + (ease || ''); - - setTimeout(function () { - that.css(cssProperties); - }, 0); - - return this; - } -})(Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function($){ - var jsonpID = 0, - isObject = $.isObject, - key; - - // Empty function, used as default callback - function empty() {} - - // ### $.ajaxJSONP - // - // Load JSON from a server in a different domain (JSONP) - // - // *Arguments:* - // - // options — object that configure the request, - // see avaliable options below - // - // *Avaliable options:* - // - // url — url to which the request is sent - // success — callback that is executed if the request succeeds - // - // *Example:* - // - // $.ajaxJSONP({ - // url: 'http://example.com/projects?callback=?', - // success: function (data) { - // projects.push(json); - // } - // }); - // - $.ajaxJSONP = function(options){ - var jsonpString = 'jsonp' + ++jsonpID, - script = document.createElement('script'); - window[jsonpString] = function(data){ - options.success(data); - delete window[jsonpString]; - }; - script.src = options.url.replace(/=\?/, '=' + jsonpString); - $('head').append(script); - }; - - // ### $.ajaxSettings - // - // AJAX settings - // - $.ajaxSettings = { - // Default type of request - type: 'GET', - // Callback that is executed before request - beforeSend: empty, - // Callback that is executed if the request succeeds - success: empty, - // Callback that is executed the the server drops error - error: empty, - // Callback that is executed on request complete (both: error and success) - complete: empty, - // MIME types mapping - accepts: { - script: 'text/javascript, application/javascript', - json: 'application/json', - xml: 'application/xml, text/xml', - html: 'text/html', - text: 'text/plain' - } - }; - - // ### $.ajax - // - // Perform AJAX request - // - // *Arguments:* - // - // options — object that configure the request, - // see avaliable options below - // - // *Avaliable options:* - // - // type ('GET') — type of request GET / POST - // url (window.location) — url to which the request is sent - // data — data to send to server, - // can be string or object - // dataType ('json') — what response type you accept from - // the server: - // 'json', 'xml', 'html', or 'text' - // success — callback that is executed if - // the request succeeds - // error — callback that is executed if - // the server drops error - // - // *Example:* - // - // $.ajax({ - // type: 'POST', - // url: '/projects', - // data: { name: 'Zepto.js' }, - // dataType: 'html', - // success: function (data) { - // $('body').append(data); - // }, - // error: function (xhr, type) { - // alert('Error!'); - // } - // }); - // - $.ajax = function(options){ - options = options || {}; - var settings = $.extend({}, options); - for (key in $.ajaxSettings) if (!settings[key]) settings[key] = $.ajaxSettings[key]; - - if (/=\?/.test(settings.url)) return $.ajaxJSONP(settings); - - if (!settings.url) settings.url = window.location.toString(); - if (settings.data && !settings.contentType) settings.contentType = 'application/x-www-form-urlencoded'; - if (isObject(settings.data)) settings.data = $.param(settings.data); - - if (settings.type.match(/get/i) && settings.data) { - var queryString = settings.data; - if (settings.url.match(/\?.*=/)) { - queryString = '&' + queryString; - } else if (queryString[0] != '?') { - queryString = '?' + queryString; - } - settings.url += queryString; - } - - var mime = settings.accepts[settings.dataType], - xhr = new XMLHttpRequest(); - - settings.headers = $.extend({'X-Requested-With': 'XMLHttpRequest'}, settings.headers || {}); - if (mime) settings.headers['Accept'] = mime; - - xhr.onreadystatechange = function(){ - if (xhr.readyState == 4) { - var result, error = false; - if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 0) { - if (mime == 'application/json' && !(xhr.responseText == '')) { - try { result = JSON.parse(xhr.responseText); } - catch (e) { error = e; } - } - else result = xhr.responseText; - if (error) settings.error(xhr, 'parsererror', error); - else settings.success(result, 'success', xhr); - } else { - error = true; - settings.error(xhr, 'error'); - } - settings.complete(xhr, error ? 'error' : 'success'); - } - }; - - xhr.open(settings.type, settings.url, true); - if (settings.beforeSend(xhr, settings) === false) { - xhr.abort(); - return false; - } - - if (settings.contentType) settings.headers['Content-Type'] = settings.contentType; - for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]); - xhr.send(settings.data); - - return xhr; - }; - - // ### $.get - // - // Load data from the server using a GET request - // - // *Arguments:* - // - // url — url to which the request is sent - // success — callback that is executed if the request succeeds - // - // *Example:* - // - // $.get( - // '/projects/42', - // function (data) { - // $('body').append(data); - // } - // ); - // - $.get = function(url, success){ $.ajax({ url: url, success: success }) }; - - // ### $.post - // - // Load data from the server using POST request - // - // *Arguments:* - // - // url — url to which the request is sent - // [data] — data to send to server, can be string or object - // [success] — callback that is executed if the request succeeds - // [dataType] — type of expected response - // 'json', 'xml', 'html', or 'text' - // - // *Example:* - // - // $.post( - // '/projects', - // { name: 'Zepto.js' }, - // function (data) { - // $('body').append(data); - // }, - // 'html' - // ); - // - $.post = function(url, data, success, dataType){ - if ($.isFunction(data)) dataType = dataType || success, success = data, data = null; - $.ajax({ type: 'POST', url: url, data: data, success: success, dataType: dataType }); - }; - - // ### $.getJSON - // - // Load JSON from the server using GET request - // - // *Arguments:* - // - // url — url to which the request is sent - // success — callback that is executed if the request succeeds - // - // *Example:* - // - // $.getJSON( - // '/projects/42', - // function (json) { - // projects.push(json); - // } - // ); - // - $.getJSON = function(url, success){ $.ajax({ url: url, success: success, dataType: 'json' }) }; - - // ### $.fn.load - // - // Load data from the server into an element - // - // *Arguments:* - // - // url — url to which the request is sent - // [success] — callback that is executed if the request succeeds - // - // *Examples:* - // - // $('#project_container').get( - // '/projects/42', - // function () { - // alert('Project was successfully loaded'); - // } - // ); - // - // $('#project_comments').get( - // '/projects/42 #comments', - // function () { - // alert('Comments was successfully loaded'); - // } - // ); - // - $.fn.load = function(url, success){ - if (!this.length) return this; - var self = this, parts = url.split(/\s/), selector; - if (parts.length > 1) url = parts[0], selector = parts[1]; - $.get(url, function(response){ - self.html(selector ? - $(document.createElement('div')).html(response).find(selector).html() - : response); - success && success(); - }); - return this; - }; - - // ### $.param - // - // Encode object as a string for submission - // - // *Arguments:* - // - // obj — object to serialize - // [v] — root node - // - // *Example:* - // - // $.param( { name: 'Zepto.js', version: '0.6' } ); - // - $.param = function(obj, v){ - var result = [], add = function(key, value){ - result.push(encodeURIComponent(v ? v + '[' + key + ']' : key) - + '=' + encodeURIComponent(value)); - }, - isObjArray = $.isArray(obj); - - for(key in obj) - if(isObject(obj[key])) - result.push($.param(obj[key], (v ? v + '[' + key + ']' : key))); - else - add(isObjArray ? '' : key, obj[key]); - - return result.join('&').replace('%20', '+'); - }; -})(Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function ($) { - - // ### $.fn.serializeArray - // - // Encode a set of form elements as an array of names and values - // - // *Example:* - // - // $('#login_form').serializeArray(); - // - // returns - // - // [ - // { - // name: 'email', - // value: 'koss@nocorp.me' - // }, - // { - // name: 'password', - // value: '123456' - // } - // ] - // - $.fn.serializeArray = function () { - var result = [], el; - $( Array.prototype.slice.call(this.get(0).elements) ).each(function () { - el = $(this); - if ( (el.attr('type') !== 'radio' || el.is(':checked')) && !(el.attr('type') === 'checkbox' && !el.is(':checked'))) { - result.push({ - name: el.attr('name'), - value: el.val() - }); - } - }); - return result; - }; - - // ### $.fn.serialize - // - // - // Encode a set of form elements as a string for submission - // - // *Example:* - // - // $('#login_form').serialize(); - // - // returns - // - // "email=koss%40nocorp.me&password=123456" - // - $.fn.serialize = function () { - var result = []; - this.serializeArray().forEach(function (elm) { - result.push( encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value) ); - }); - return result.join('&'); - }; - - // ### $.fn.submit - // - // Bind or trigger the submit event for a form - // - // *Examples:* - // - // To bind a handler for the submit event: - // - // $('#login_form').submit(function (e) { - // alert('Form was submitted!'); - // e.preventDefault(); - // }); - // - // To trigger form submit: - // - // $('#login_form').submit(); - // - $.fn.submit = function (callback) { - if (callback) this.bind('submit', callback) - else if (this.length) { - var event = $.Event('submit'); - this.eq(0).trigger(event); - if (!event.defaultPrevented) this.get(0).submit() - } - return this; - } - -})(Zepto); -// Zepto.js -// (c) 2010, 2011 Thomas Fuchs -// Zepto.js may be freely distributed under the MIT license. - -(function($){ - var touch = {}, touchTimeout; - - function parentIfText(node){ - return 'tagName' in node ? node : node.parentNode; - } - - function swipeDirection(x1, x2, y1, y2){ - var xDelta = Math.abs(x1 - x2), yDelta = Math.abs(y1 - y2); - if (xDelta >= yDelta) { - return (x1 - x2 > 0 ? 'Left' : 'Right'); - } else { - return (y1 - y2 > 0 ? 'Up' : 'Down'); - } - } - - var longTapDelay = 750; - function longTap(){ - if (touch.last && (Date.now() - touch.last >= longTapDelay)) { - $(touch.target).trigger('longTap'); - touch = {}; - } - } - - $(document).ready(function(){ - $(document.body).bind('touchstart', function(e){ - var now = Date.now(), delta = now - (touch.last || now); - touch.target = parentIfText(e.touches[0].target); - touchTimeout && clearTimeout(touchTimeout); - touch.x1 = e.touches[0].pageX; - touch.y1 = e.touches[0].pageY; - if (delta > 0 && delta <= 250) touch.isDoubleTap = true; - touch.last = now; - setTimeout(longTap, longTapDelay); - }).bind('touchmove', function(e){ - touch.x2 = e.touches[0].pageX; - touch.y2 = e.touches[0].pageY; - }).bind('touchend', function(e){ - if (touch.isDoubleTap) { - $(touch.target).trigger('doubleTap'); - touch = {}; - } else if (touch.x2 > 0 || touch.y2 > 0) { - (Math.abs(touch.x1 - touch.x2) > 30 || Math.abs(touch.y1 - touch.y2) > 30) && - $(touch.target).trigger('swipe') && - $(touch.target).trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2))); - touch.x1 = touch.x2 = touch.y1 = touch.y2 = touch.last = 0; - } else if ('last' in touch) { - touchTimeout = setTimeout(function(){ - touchTimeout = null; - $(touch.target).trigger('tap') - touch = {}; - }, 250); - } - }).bind('touchcancel', function(){ touch = {} }); - }); - - ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'longTap'].forEach(function(m){ - $.fn[m] = function(callback){ return this.bind(m, callback) } - }); -})(Zepto); diff --git a/js/libraries/jquery.history.js b/js/libraries/jquery.history.js deleted file mode 100755 index 8d4edcd2..00000000 --- a/js/libraries/jquery.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file