From 7dfe8fff6ea6a0925769dbf691351f6c381c6be2 Mon Sep 17 00:00:00 2001 From: Kim CHOUARD Date: Tue, 24 Dec 2013 18:29:32 +0100 Subject: [PATCH 1/9] Initial commit --- .DS_Store | Bin 6148 -> 6148 bytes .gitignore | 4 + config.rb | 25 + img/github_logo.svg | 21 + img/logo.jpg | Bin 0 -> 100177 bytes img/logo_m.jpg | Bin 0 -> 16500 bytes index.html | 215 +- javascripts/main.js | 1 - javascripts/scale.fix.js | 20 - javascripts/script.js | 52 - js/counter.js | 57 + js/custom.modernizr.js | 4 + js/jquery.js | 9789 ++++++++++++++++++++++++++++ stylesheets/app.css | 7510 +++++++++++++++++++++ stylesheets/print.css | 226 - stylesheets/pygment_trac.css | 69 - stylesheets/sass/_normalize.scss | 402 ++ stylesheets/sass/_settings.scss | 1301 ++++ stylesheets/sass/app.scss | 293 + stylesheets/styles.css | 413 -- stylesheets/stylesheet.css | 371 -- stylesheets/tektonpro-regular.eot | Bin 0 -> 114606 bytes stylesheets/tektonpro-regular.otf | Bin 0 -> 79500 bytes stylesheets/tektonpro-regular.svg | Bin 0 -> 79500 bytes stylesheets/tektonpro-regular.ttf | Bin 0 -> 114348 bytes stylesheets/tektonpro-regular.woff | Bin 0 -> 54596 bytes stylesheets/tektonpro-regular.zip | Bin 0 -> 206321 bytes stylesheets/tektonproregular.ttf | Bin 0 -> 114368 bytes 28 files changed, 19509 insertions(+), 1264 deletions(-) create mode 100644 .gitignore create mode 100644 config.rb create mode 100644 img/github_logo.svg create mode 100644 img/logo.jpg create mode 100644 img/logo_m.jpg delete mode 100644 javascripts/main.js delete mode 100644 javascripts/scale.fix.js delete mode 100644 javascripts/script.js create mode 100644 js/counter.js create mode 100644 js/custom.modernizr.js create mode 100644 js/jquery.js create mode 100644 stylesheets/app.css delete mode 100644 stylesheets/print.css delete mode 100644 stylesheets/pygment_trac.css create mode 100644 stylesheets/sass/_normalize.scss create mode 100644 stylesheets/sass/_settings.scss create mode 100644 stylesheets/sass/app.scss delete mode 100644 stylesheets/styles.css delete mode 100644 stylesheets/stylesheet.css create mode 100755 stylesheets/tektonpro-regular.eot create mode 100644 stylesheets/tektonpro-regular.otf create mode 100755 stylesheets/tektonpro-regular.svg create mode 100755 stylesheets/tektonpro-regular.ttf create mode 100755 stylesheets/tektonpro-regular.woff create mode 100644 stylesheets/tektonpro-regular.zip create mode 100644 stylesheets/tektonproregular.ttf diff --git a/.DS_Store b/.DS_Store index 16e4043ad10a0b8e57fe3e0d67a0cc2c145f36fb..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 100644 GIT binary patch delta 67 zcmZoMXfc=|&Zs)EP;8=}A_oHyFfuR*Y&_`3KJh} + + + + + diff --git a/img/logo.jpg b/img/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5742c40b25dedf5d53aa5f574598c594323fd33e GIT binary patch literal 100177 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 literal 0 HcmV?d00001 diff --git a/img/logo_m.jpg b/img/logo_m.jpg new file mode 100644 index 0000000000000000000000000000000000000000..48e90a086911a208ba9076c5eb20198af52be98b GIT binary patch literal 16500 zcmeHuc|4Tu*Z4gKLw2dOA(A$RL6$IyNF}nSO=D&-VTPGO)~TnSR75C3QA(RiNR+J- zLXxbh2-#)dmznpv$I|lje4poif4}$l&#!wv_qCjJu5+DpuI0Y2<6zaY8U?tv9VOXA zkg+ke9)chqh#vt#NKis>l!62?Q|5dK1K4F47mMJYfkPYsE;?HV4H1iG%YX{84B~?M zfcFMs`F!~vV(oWrm0%8#BzPYoFzm7zC|3lKAWo3OZQDU61>}N%3#N`ikeu*bu1lcU z5v5EWDRc_Wk>V<)rzf@67>6g3;rcoVqo|~;si>}rQI=BF&{R^?#9#nF&hrq2f^$U- zM(OITek>LQUFDeXlW-L|U%mxs;fEW6oRypVd)*M^Z@M8ozSoTdF~ zI*dd}LmVOqqzHob2`I_UdWpaSDY+2r2M7#5NHAkKxwuh0ybJgcKO+$k2XYQ63?VoX zNDfX8E)+Kp7m{BYAVrXzt3;K!bobyEO1mA$aEparOWrE8dXd?4J7pE>ALV)|*)a3I z#(q3ab#Z*ki8cD+7KCjtuG2Ryd1u)~97sKxSK;0~Xdrjt#-EQazO4K*l#rHR)iP{l z?{O;P=Hr6u))6&BYX{GO$Xn@!HEp9J5C;d4mXj?LiknN7Ey5}#QBEL%oAg31%<)h$ zSc2zf<$cPl?HZ|ngz1?t!qZgxWw~JiP-|3QyaPg9UqaYsxrt6}nit{kC6N0j0;>+< zN3#1Afv`}UsFCd132K

I*l*jAYlX4l~+ev^vZzJiSBc^sXzp+kLn0*ob3}4b{d8^xk)%%~FJ|Su%#)5WESz1~~?yb9vODQ~GtrUO2sPVp|HTJN3 z!_@r}7W8-{3wpKQ(uQb-srzU{Bn#pLq)t3}z*pz3W|nl9{@S;7%kU+>y3JZXE)FAy zL|gg_*GYx(RAHBl1(OZb+xXpzc*B=26;*ebz&7g`P9h($pcb<2bg~0e*IHfUT0~a) zVHd%Tk0Q>Cw@z=unmD~5@A_yRKD;~CA8p!sDF|<*VWS(dG$Qbj4dt=N=63%OCi6;6 zGsaSjt@ftFW2mDxS_Mk%2Tk6RX#f~jH`^2Y&8}n zP|kwl#IqBQrf*?Ek=_*M^6M-}N6AM!0(1A1OR&I$hX+O_ASCUwWzWu*$e3bA!EvuX z#AE<7JdY9dAQ35fqq>J-;_LfiC!@1ILy=bsvAP|y)+{q)Saf0({loSWwvU zqVS3L#Lf$hg6RVXICxfza60N9tQkw|eENkRv$CwC9rdLoh6S0jpuuW%P3#44#=*x0 zC)!)z=1El~|DEFx4;lXu2(IlStaaWhM0rk$O<-zK(rc>*_qIv1;@qypvZtu2%nC-|C&}^tvn;4)_g(MELz$## zH->fMBOTEa6v-u<}AAVovwvtO%8CoXG7AVKC88lS|v%1oPAm zt1CC}PpD);F^er((EdY=8nBS+6IjrxUKUgqV(ov^-S+(zj{x<24Q%2kEofj9_M^e4 zhzT++x4hTlDGQp)tjz8E#Dd2AJGG+J`<|_AI?6cVbfHD3w_nG8&m#W5rTFP)Y_;K( z$9KbMs#)m3s+ipd4>$+9Q8yIbIPRh#bT3q~wX;Tdx^i`-afQyEJyFBtp8GCk_FIV6 z&6TyQUfSzUufV? z#~spLXPDlZaWo^h(C{rY&0QzJ_)*h>hJ$Z}HtFQvY`8V8FZiS;<>{xY zhDgg@j~{n`GT*uLWY6-^oU&`)zbuFt__P8?|{vmM)nP)qAiBm(jw4X9t>9Htg$2S(CaUEdk!5i>pVhKx7sx2nWI4KjT&CYhQfaeYm=2@0FPSnRR|2rt7a))=~`??|zJD z%J&WBuiTWIjkr6Lkx0(fAiN!jJIZbKB=DziGdyv~XTD2VgLY|BtJg2dEaR6z5 zY-w!A$k!wm#I^s4JD7Ny4biQ9@_8Np3H;dH&VxOa5x=b!CP#{|DL{p1erzzu=e}6O086vrcv!5-oQLZ z)nM$$3}6%+4r!~`X6ux@i__Cxe4aOCPvSpiQWYF($k#5Oxws|%tjn9tRE(4Thn2SF zLrnpu<%|iP$#p zJ=jx1aayYzb=>&eoWyU=gv_79bt%~5U;@X4CsjRBm$@NbM zn(BW^SMx9FW)DdJc#wL}`YIOu?HZx1pa`jNH8SReuOJX4v;wgYLN1pzTmh~s@NI>S zlV#(COUowwZWre8a=CguNaD)d&Bkf6aV;Pf1}}Wbhaf&zD!7-JxYJ$T>7WYVj384Q z-Q12sab{B(k?BMt+1&+3z-2hsbEd*|A$D7H(ovXVD~S%bfzdNOiPYUV7ox?sy%qp8 z)7eY|Q!0gGZ%(AUyPDV?!2={eWC~Fs3i#PWQjj@Bgy@hvUA=AHAcG)@8<}te+=pOTxZ7$CG^A%vnZ>+cCog8KjF=Hjj z%y6q7kOtgUA;^p%B}JgP+ijtIhO6wykV^gwY^(EM>9$e{7M5hXfsC0mJht=CR%e3L zui$1hXF3~hdenJ~**y6I4 z{y7XR!gp|iIk*|g!SQat3>a19)Mr|N49ngX!m7CG(Wu6U+g>Z4eOI z-5K7;;60Vwj^a)x(0*EyLD&I{)yAU>pBOh%wFK$Il2i&Y5n3 zbNGQu5KnY=wjds*8_~8~81I_fsCeeUKM?aeQmEd#&LoF9O9{;=zkLo2G)EDL_BeO; z#>wkJq|$#uZZ!w~k(|%YL6720p?+svks1D54d)S{3ACF+hHcGDr?`R-Fpc>A&a}W8 zY+-+a^4qbuyuZNtzz{qBOwL|)YvGQ-7ZyxsY#+Nkv%*B!W#C6;Q^C&7nF-C_dpKcw zh%W{t@KQMp-m9P}1-zjUfHNR*;QIUR8vN}V{Oub2?Hc^;8vN}V{Oub2?Hc^;8vN}V z{Oub2o4<+vUv~}8oZDA{<2VF7X5erRAJl~)U2s9BKz6`|CIy^oj-X5jFO6LS*M4x7 z{Ld6pkRJHK$A0#`VCMFXVqbMZ4CrP<*JQhSX}rSvFNqLiwFsytp% zNkvLcLqSPZNkv_0qZAxqfmT#TD=Et>VKm_w3stGvM;i1-CD?14=^M=U1!~&Tvr2h- zdMbD-D^REoXeA8|4YVQ#jlswR3VE6rnT|UuPo~MtanL8y@Kh4pe<%fW1imqMy0$cs zbVdai*Lk+TwACCT0Y6XY3NFL!&Ix!l(V6H%B-3fYu1c`_b4-nm=gEJ`*2QI>nnvH| z0VMiQ14e`IsAw}Hjp9zl6SsMQ9%be_bDfJ{`8A7qG<)RXMy{HAR3Z*|3N3(_aBiRs zNK~RHh3Z6;(lb|;QUbFC{8ZFcq^wC~0>zW|T|*-9FcP(;!RRTM z6;<}lP#IGQBzv!UDrI>^b$JY+nhl}>jWiV%XGy`VApnQvKN1u0n)Vc`3l12HZ*#$ zDsyd&$TT{Rj3>fvfK3!gB!Z@$hLR%2PHmGsM%`XrUd7IiAdkb@YslLv;fZP*0HdO~ zX|DZ@w+83@-|KsRG&I>B24E>*No9Dh0vUiN+etJqFkZ8>-<;?+TXH5zv8Rb94i9_6 zwWVn|4Sdl6GtWLIsjYGO&rs?>GxCk)EsZTBaZAq1Um~_8vQ?3=HCs>jFkTm zl|jQB%FH04e;z+J?z_zg=*|X#9SttdZ>2hOTi);dw*`J%;I{>STi~|^ep}%GBMW@H zj1kG;oa70vTHnQQgG=6Q{5CfyCnpytHy0N-FE@Dkc(}QF`1ltr;9IbOUznf$%w{u{ zpHl=1g%aQw5Em8}|38V}z6BAG2oUi6Eq+@7#Bav~F;U-#Z$q41NDgiUG#kIo!GZi9 z3;rPSUHmo&0tv@&bEA+T;h-TnkRqHA7YN|i-NU^Q2LiaoFrn8_i)P}d8ncW z#7w+5l8Xz(pmXvdkuK~%u)rbbx?FpJ#N2MjLowHq`^27?H_B{XWM)V0S6;26_s8Ne zbJ=)&$_o_joobW*i6s`{Ai76%U3mdO$5mTCjnQ}foYt7slPdEv&RA4N9!F82KU z(DNT;{tqJm6e4a@h~1vK$YXuCWo=@zwcUgKgJ)-|=1grC^qvLrYm0->?&ly%{9lun z&y(I6_6ZrSU_s9=tL*JB%xCj@WKH{l zFz4gyj>*j-K8zoTNvABO#18K#a;{|VU8f)5U2SD%d7RT(w<}P}rS|TvDIXS;$`toj zVxmugu-zF^ZBe5jV)`ETkVt9J_>xcfn;t@M1oLgB{GG-Vr*^jaOx8ABxsvH;_9{5` z!s=kXY0oyf$&Ib5QCYiA4*6BQfAePQX0R~!K(1H##2^bg6T*)zwOe|&*LDw6cRXpR zEG*n4s>>_>;bXUtFSg+*V-kBnD63X`=4Les%`Q}-c1m|IaxYcr`ku+M@pVjVCVFZ# zq1ESAme1g%MaYgyt@{k=rJ~CIe_9<6xU*tssZ+Wv3&OUR+B%kao6z1+Dh2nLw6pN-myqPBR(W z5Iw|I))Uhnc{*tz)t-Dpja&BF~ZB-KvUhelFjan;y*mBCK&He1^l{O#yO?3#ZS$rxIg==(qqINpIbTjIR zyPO-*H*Qs?`!sc%aCVAKgQnFvPvI}`B*$L!F1C^7xi6|?t>kOe$vcb-UN8@#ewA|!gP9_+qM>4Pf=h&NuCqeN*PYn zkisEt#*|Rbz4~s(Q2%GIn||^?FO;fZny@bC$RJm4WY!bLy^p2|m*u6eskF&$ub7Ux zc%XBTAbdQueQNT3-MS-b!g-PdVc=gdB%340lYRGldAj*{X}6R_DJTHH&-q~os!hnd z-PEwqH6=rW8}}3=O->J-c;(|%cStbu#hKwwZS24ftSy)}H+>3Q(HA3MGfgU0u3r6^<$pg)`&LL( z2xB1R8KcPgW2fubrPsEbx^>=a8e3q%zfAOfVL^YEfyn=}zRtz3^7k$xst`8|8{#h~ z_HLp)v=`1MLCapWGN(MP)g8JIv;MN!% zFH;p*jvYI|j2jAPK{wCjPPL#WOIsR-dsvW#h6CH?>exP=iBz9t7F1Dqyftbl-R^E& ze=oCa4A)*bmLtTf{-w<`SwNHKEYi)MF&!^Wjg&XC(2r zTo0zKRCRO5ZBpNL;m$5Hs9&C*9a-r#jFLOU^GuN6ZP*Vx6t@s;^Js?Rqq5DUbhQZ6 z?9{rF4r9tXvuBI=llqt?6c)tsKCR-2f$4Uzn9^&bHe*-gFmiqc0r%N04QW%9U#YC*&?v^&5RK(9tqypfQ}p@(P3ipk_Mv6jDzv7Eb$%MshexpEug+Oj zSiSYVey2`tgHwJ+v`l^Q`DjVE@>EhCO*Dw7i*fDq^y!KcZa)K!>Aho8j8Y8=$>@Oc zm1pn%uou?M*&nejR(aJbB*#nl1kV>5$(OX&Jh{oF53a5!3>sX&S7NG=utp4Ec>{<>{Pgicq*Jg$d>Qs(srPaAAh154kieW##!S?2s+Dl%xy(AeK zOBpEMcB}qXU0P85e#O2W*Q(mXZb?7dmsH4nP4DfsFmdk`E^FI59+@^6)9WltWKV6C*7qhf;=Zm}s=Sk*=;g-nS`c}wyKx6K zT~)QpH!-P0lN@*F$l_Cc@_V#*@&;b_KC`7NJ{8klGV-D&Ja6r>?RB<0|GWvBrjTWUQ^{yyCS1)W)pbmM3yP zQMl$#%qfqcb%&q%f8|Sm)=)BOb1r1NtVaK`Q)-^~M*`N!E5yAxU39zZw5x%wNnbxW zt3(P_7W)of-FL(`Qeu0#Z?{Ax zQhQ3NVM&g8P1f~sPh9JU@$UTm8?Ji`$tVr`2%ck!DNo~r*XxwMeDfrHqv>U(GtnQ0 zG zwtnzWQ#DyDg3LuP-vicDX?ejxygN@%C}nS=kmR(~wRm23s>bbdn6B3m+PxdyG?6R$ zBHSN8F0*@JwEfCXgN*2|tu^vFsf1C8*YsFI=-8j;sn;eqOy#DQtg9luT>J8){R-xb zug=j)3nd&2mJU_)4FGFZhfLTgzRvgT`Dv!l9Tz>;kNWAAJv9vX&Hi$3P4x$psxPNj zXJmyPQdYeeWEmB|p5cj>iv()Psfkt^is6K1(4$E)jor>qrzY;DL>%BSQ!LDz%$3kd z>cz%|RGiby$QfuUi_z-3%Dk9%7OP6?+liyg>hWB}`FM$C$a)R%$qA(uMjRj_H3|xQ zWja_8wW~2;kAOl9HULAnaai%NF;Wt>f~Hq7)$qA#$M8x|-GRagtw70+od@;Xy)PMW zyZ1%Z)b%2faPUf~#*}Q=`BPeE zjVwr2GPD?Iq zKk__KCu!g*g>Q}WjmRQpY~%i` z{&>>9xG1eI(yh+7BYSoQ_%{ZB5!!ljy#rjpD<5F0>*VF%z=P ze9ij2l0cK25xc0R{L;3U@c1eJJB - - - - - Adobe Open Source by adobe - - - - - - - - -

-
-

Adobe Open Source

-

Advancing technology through open initiatives

- - - -
- -
-
-

-Welcome to Adobe's open source on Github Adobe standard logo -

- -

-New and Noteworthy:

- -

Cordova 3.1.0: Cordova 3.1 released (leaves the github site)

- -

Experience Manager SDK (email): SDK for Adobe Experience Manager (Adobe CQ) to integrate an external Email Service Provider

- -

CQ Secure Maven plugin: A simple Maven Plugin integration of the Cognifide's SecureCQ, a tool to find the most popular security problems in your CQ instance.

- -

ShaderDSL: is a compiler from a subset of JavaScript to GLSL. ShaderDSL.js allows you to write GLSL shaders in plain JavaScript, instead of the C like (GLSL) language used today.

- -

-Organizations: -

- -

(Adobe groups that are releasing technology under open source. There may be multiple projects under each organization)

- -

Adobe: Repository for certain Adobe Open Source releases

- -

Adobe Muse: Repository for releases from the Adobe Muse team

- -

Adobe Marketing Cloud: Open source SDKs. samples and boilerplate from the Adobe Marketing Cloud

- -

Adobe Security: Tools and techniques from Adobe Security

- -

Adobe Research: Technology and cool stuff from Adobe Research

-

Adobe Web Platform: Technology relating to the web from Adobe Web Platform

+ + + -

Adobe Fonts: Open fonts and related technology from the Adobe Font teams

- -

Adobe CloudOps: Techniques and technology from the Adobe Cloud Operations

- -

Brackets: An open source code editor for the web, written in JavaScript, HTML and CSS

- -

Edge Code: The source for Edge code related technology

- -

Topcoat: UI Library for creating beautiful and responsive applications using web standards

- -

Adobe Flash: Technology releases relating to Adobe Flash

- -

Adobe Photoshop: Adobe Photoshop teams open source technology releases

- -

-Popular Projects:

- -

Brackets: An open source code editor for the web, written in JavaScript, HTML and CSS

- -

Source Sans Pro: OpenType fonts that have been designed to work well in user interface (UI) environments

- -

Source Code Pro: OpenType fonts that have been designed to work well in code environments

- -

CSS Filterlab: Browser-based tool that lets you use and modify CSS filters and see the effects in real time

- -

Balanced Text: jQuery plugin for implementing balancing of wrapping text in a web page

- -

Phonegap: Web platform that exposes native mobile device apis and data to JavaScript. PhoneGap is a distribution of Apache Cordova

- -

Generator: is a JavaScript-based extensibility technology for Adobe Photoshop CC.

- -

Theseus: is a new type of JavaScript debugger for Node.js, Chrome, and both simultaneously. It is an extension for the Brackets code editor. Theseus is part of a collaboration between the User Interface Design Group at MIT CSAIL and Adobe Research.

- -
-
- -
- - - - - + + + + Adobe Open Source | Advancing technology through open initiatives + + + + + + +
+
+
+
Browse Adobe Github projects like never before...
+
+
+ + + +
+
+
+
+
+ + + + + + +
+
+
MONTHS
+
+
+
+
+ + + + + + +
+
+
DAYS
+
+
+
+
+ + + + + + +
+
+
MINUTES
+
+
+
+
+ + + + + + +
+
+
SECONDS
+
+
+
+
+ + + + + + + diff --git a/javascripts/main.js b/javascripts/main.js deleted file mode 100644 index d8135d3..0000000 --- a/javascripts/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log('This would be the main JS file.'); diff --git a/javascripts/scale.fix.js b/javascripts/scale.fix.js deleted file mode 100644 index 08716c0..0000000 --- a/javascripts/scale.fix.js +++ /dev/null @@ -1,20 +0,0 @@ -fixScale = function(doc) { - - var addEvent = 'addEventListener', - type = 'gesturestart', - qsa = 'querySelectorAll', - scales = [1, 1], - meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; - - function fix() { - meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; - doc.removeEventListener(type, fix, true); - } - - if ((meta = meta[meta.length - 1]) && addEvent in doc) { - fix(); - scales = [.25, 1.6]; - doc[addEvent](type, fix, true); - } - -}; \ No newline at end of file diff --git a/javascripts/script.js b/javascripts/script.js deleted file mode 100644 index 2f08550..0000000 --- a/javascripts/script.js +++ /dev/null @@ -1,52 +0,0 @@ -(function($) { -$(document).ready(function(){ - - // putting lines by the pre blocks - $("pre").each(function(){ - var pre = $(this).text().split("\n"); - var lines = new Array(pre.length+1); - for(var i = 0; i < pre.length; i++) { - var wrap = Math.floor(pre[i].split("").length / 70) - if (pre[i]==""&&i==pre.length-1) { - lines.splice(i, 1); - } else { - lines[i] = i+1; - for(var j = 0; j < wrap; j++) { - lines[i] += "\n"; - } - } - } - $(this).before("
" + lines.join("\n") + "
"); - }); - - var headings = []; - - var collectHeaders = function(){ - headings.push({"top":$(this).offset().top - 15,"text":$(this).text()}); - } - - if($(".markdown-body h1").length > 1) $(".markdown-body h1").each(collectHeaders) - else if($(".markdown-body h2").length > 1) $(".markdown-body h2").each(collectHeaders) - else if($(".markdown-body h3").length > 1) $(".markdown-body h3").each(collectHeaders) - - $(window).scroll(function(){ - if(headings.length==0) return true; - var scrolltop = $(window).scrollTop() || 0; - if(headings[0] && scrolltop < headings[0].top) { - $(".current-section").css({"opacity":0,"visibility":"hidden"}); - return false; - } - $(".current-section").css({"opacity":1,"visibility":"visible"}); - for(var i in headings) { - if(scrolltop >= headings[i].top) { - $(".current-section .name").text(headings[i].text); - } - } - }); - - $(".current-section a").click(function(){ - $(window).scrollTop(0); - return false; - }) -}); -})(jQuery) \ No newline at end of file diff --git a/js/counter.js b/js/counter.js new file mode 100644 index 0000000..6e5222b --- /dev/null +++ b/js/counter.js @@ -0,0 +1,57 @@ +calc("sec", getSec); +calc("min", getMin); +var intSec = setInterval('calc("sec", getSec)', 1000); + +function calc(type, func) { + $('.counter.'+type+' .to') + .addClass('hide') + .removeClass('to') + .addClass('from') + .removeClass('hide') + .addClass('n') + .find('span:not(.shadow)').each(function (i, el) { + $(el).text(func(true)); + }); + $('.counter.'+type+' .from:not(.n)') + .addClass('hide') + .addClass('to') + .removeClass('from') + .removeClass('hide') + .find('span:not(.shadow)').each(function (i, el) { + $(el).text(func(false)); + }); + $('.counter.'+type+' .n').removeClass('n'); +} + + +function getSec(next) { + var d = new Date(); + var sec = 60-d.getSeconds(); + if (next) { + sec--; + if (sec < 0) { + sec = 59; + } + } else if(sec == 60) { + sec = 0; + calc('min', getMin); + } + + return (sec < 10 ? '0' + sec : sec); +} + +function getMin(next) { + var d = new Date(); + var sec = 60-d.getMinutes(); + if (next) { + sec--; + if (sec < 0) { + sec = 59; + } + } else if(sec == 60) { + sec = 0; +// calcMin(); + } + + return (sec < 10 ? '0' + sec : sec); +} \ No newline at end of file diff --git a/js/custom.modernizr.js b/js/custom.modernizr.js new file mode 100644 index 0000000..4eb3d06 --- /dev/null +++ b/js/custom.modernizr.js @@ -0,0 +1,4 @@ +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-inlinesvg-svg-svgclippaths-touch-shiv-mq-cssclasses-teststyles-prefixes-ie8compat-load + */ +;window.Modernizr=function(a,b,c){function y(a){j.cssText=a}function z(a,b){return y(m.join(a+";")+(b||""))}function A(a,b){return typeof a===b}function B(a,b){return!!~(""+a).indexOf(b)}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:A(f,"function")?f.bind(d||b):f}return!1}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n={svg:"http://www.w3.org/2000/svg"},o={},p={},q={},r=[],s=r.slice,t,u=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},v=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return u("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},w={}.hasOwnProperty,x;!A(w,"undefined")&&!A(w.call,"undefined")?x=function(a,b){return w.call(a,b)}:x=function(a,b){return b in a&&A(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=s.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(s.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(s.call(arguments)))};return e}),o.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:u(["@media (",m.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},o.svg=function(){return!!b.createElementNS&&!!b.createElementNS(n.svg,"svg").createSVGRect},o.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==n.svg},o.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(l.call(b.createElementNS(n.svg,"clipPath")))};for(var D in o)x(o,D)&&(t=D.toLowerCase(),e[t]=o[D](),r.push((e[t]?"":"no-")+t));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)x(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},y(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=m,e.mq=v,e.testStyles=u,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+r.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f type pairs + class2type = {}, + + // List of deleted data cache ids, so we can reuse them + core_deletedIds = [], + + core_version = "1.10.2", + + // Save a reference to some core methods + core_concat = core_deletedIds.concat, + core_push = core_deletedIds.push, + core_slice = core_deletedIds.slice, + core_indexOf = core_deletedIds.indexOf, + core_toString = class2type.toString, + core_hasOwn = class2type.hasOwnProperty, + core_trim = core_version.trim, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Used for matching numbers + core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + + // Used for splitting on whitespace + core_rnotwhite = /\S+/g, + + // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, + rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }, + + // The ready event handler + completed = function( event ) { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { + detach(); + jQuery.ready(); + } + }, + // Clean-up method for dom ready events + detach = function() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: core_version, + + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + 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 = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // scripts is true for back-compat + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // 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: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // 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 default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return core_slice.call( this ); + }, + + // 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 ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // 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 ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; + }, + + slice: function() { + return this.pushStack( core_slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + 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: core_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 src, copyIsArray, copy, name, options, 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({ + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), + + 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 ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready ); + } + + // 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").off("ready"); + } + }, + + // 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"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + if ( obj == null ) { + return String( obj ); + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ core_toString.call(obj) ] || "object" : + typeof obj; + }, + + isPlainObject: function( obj ) { + var key; + + // 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 && + !core_hasOwn.call(obj, "constructor") && + !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( jQuery.support.ownLast ) { + for ( key in obj ) { + return core_hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || core_hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + // data: string of html + // context (optional): If specified, the fragment will be created in this context, defaults to document + // keepScripts (optional): If true, will include scripts passed in the html string + parseHTML: function( data, context, keepScripts ) { + if ( !data || typeof data !== "string" ) { + return null; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + context = context || document; + + var parsed = rsingleTag.exec( data ), + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[1] ) ]; + } + + parsed = jQuery.buildFragment( [ data ], context, scripts ); + if ( scripts ) { + jQuery( scripts ).remove(); + } + return jQuery.merge( [], parsed.childNodes ); + }, + + parseJSON: function( data ) { + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + if ( data === null ) { + return data; + } + + if ( typeof data === "string" ) { + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + if ( 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; + if ( !data || typeof data !== "string" ) { + return null; + } + 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 && jQuery.trim( 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.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Use native String.trim function wherever possible + trim: core_trim && !core_trim.call("\uFEFF\xA0") ? + function( text ) { + return text == null ? + "" : + core_trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + core_push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( core_indexOf ) { + return core_indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var l = second.length, + i = first.length, + j = 0; + + if ( typeof l === "number" ) { + for ( ; 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 retVal, + ret = [], + i = 0, + length = elems.length; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; 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, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // 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 ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return core_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 ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + 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 + args = core_slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( core_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 || jQuery.guid++; + + return proxy; + }, + + // Multifunctional method to get and set values of a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations. + // Note: this method belongs to the css module but it's needed here for the support module. + // If support gets modularized, this method should be moved back to the css module. + swap: function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; + } +}); + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // we once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + + // If IE event model is used + } else { + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch(e) {} + + if ( top && top.doScroll ) { + (function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll("left"); + } catch(e) { + return setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + })(); + } + } + } + return readyList.promise( obj ); +}; + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || type !== "function" && + ( length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj ); +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); +/*! + * Sizzle CSS Selector Engine v1.10.2 + * http://sizzlejs.com/ + * + * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03 + */ +(function( window, undefined ) { + +var i, + support, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + return 0; + }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + + "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", + + // Prefer arguments quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rsibling = new RegExp( whitespace + "*[+~]" ), + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + if ( (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // 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, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType === 9 && selector; + + // 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 + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Detect xml + * @param {Element|Object} elem An element or a document + */ +isXML = 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).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc, + parent = doc.defaultView; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent.attachEvent && parent !== parent.top ) { + parent.attachEvent( "onbeforeunload", function() { + setDocument(); + }); + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if getElementsByClassName can be trusted + support.getElementsByClassName = assert(function( div ) { + div.innerHTML = "
"; + + // Support: Safari<4 + // Catch class over-caching + div.firstChild.className = "i"; + // Support: Opera<10 + // Catch gEBCN failure to find non-leading classes + return div.getElementsByClassName("i").length === 2; + }); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + div.innerHTML = ""; + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Support: Opera 10-12/IE8 + // ^= $= *= and empty values + // Should not select anything + // Support: Windows 8 Native Apps + // The type attribute is restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "t", "" ); + + if ( div.querySelectorAll("[t^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch(e) {} + } + + return Sizzle( expr, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val === undefined ? + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null : + val; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (see #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] && match[4] !== undefined ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "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; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), + // not comment, processing instructions, or others + // Thanks to Diego Perini for the nodeName shortcut + // Greater than "@" means alpha characters (specifically not starting with "#" or "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + // 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" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, expandContext ) { + var elem, j, matcher, + setMatched = [], + matchedCount = 0, + i = "0", + unmatched = seed && [], + outermost = expandContext != null, + contextBackup = outermostContext, + // We must always have either seed elements or context + elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !group ) { + group = tokenize( selector ); + } + i = group.length; + while ( i-- ) { + cached = matcherFromTokens( group[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + } + return cached; +}; + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + if ( !seed ) { + // Try to minimize operations if there is only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + } + + // Compile and execute a filtering function + // Provide `match` to avoid retokenization if we modified the selector above + compile( selector, match )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome<14 +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + elem[ name ] === true ? name.toLowerCase() : null; + } + }); +} + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})( window ); +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // First callback to fire (used internally by add and fireWith) + firingStart, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var action = tuple[ 0 ], + fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = core_slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; + if( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); +jQuery.support = (function( support ) { + + var all, a, input, select, fragment, opt, eventName, isSupported, i, + div = document.createElement("div"); + + // Setup + div.setAttribute( "className", "t" ); + div.innerHTML = "
a"; + + // Finish early in limited (non-browser) environments + all = div.getElementsByTagName("*") || []; + a = div.getElementsByTagName("a")[ 0 ]; + if ( !a || !a.style || !all.length ) { + return support; + } + + // First batch of tests + select = document.createElement("select"); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName("input")[ 0 ]; + + a.style.cssText = "top:1px;float:left;opacity:.5"; + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + support.getSetAttribute = div.className !== "t"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName("tbody").length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName("link").length; + + // Get the style information from getAttribute + // (IE uses .cssText instead) + support.style = /top/.test( a.getAttribute("style") ); + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + support.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 + support.opacity = /^0.5/.test( a.style.opacity ); + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + support.cssFloat = !!a.style.cssFloat; + + // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) + support.checkOn = !!input.value; + + // 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) + support.optSelected = opt.selected; + + // Tests for enctype support on a form (#6743) + support.enctype = !!document.createElement("form").enctype; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; + + // Will be defined later + support.inlineBlockNeedsLayout = false; + support.shrinkWrapBlocks = false; + support.pixelPosition = false; + support.deleteExpando = true; + support.noCloneEvent = true; + support.reliableMarginRight = true; + support.boxSizingReliable = 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; + + // Support: IE<9 + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + // Check if we can trust getAttribute("value") + input = document.createElement("input"); + input.setAttribute( "value", "" ); + support.input = input.getAttribute( "value" ) === ""; + + // Check if an input maintains its value after becoming a radio + input.value = "t"; + input.setAttribute( "type", "radio" ); + support.radioValue = input.value === "t"; + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "checked", "t" ); + input.setAttribute( "name", "t" ); + + fragment = document.createDocumentFragment(); + fragment.appendChild( input ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Opera does not clone events (and typeof div.attachEvent === undefined). + // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() + if ( div.attachEvent ) { + div.attachEvent( "onclick", function() { + support.noCloneEvent = false; + }); + + div.cloneNode( true ).click(); + } + + // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + for ( i in { submit: true, change: true, focusin: true }) { + div.setAttribute( eventName = "on" + i, "t" ); + + support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; + } + + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + // Support: IE<9 + // Iteration over object's inherited properties before its own. + for ( i in jQuery( support ) ) { + break; + } + support.ownLast = i !== "0"; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, marginDiv, tds, + divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + container = document.createElement("div"); + container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; + + body.appendChild( container ).appendChild( div ); + + // Support: IE8 + // 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). + div.innerHTML = "
t
"; + tds = div.getElementsByTagName("td"); + tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Support: IE8 + // Check if empty table cells still have offsetWidth/Height + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check box-sizing and margin behavior. + div.innerHTML = ""; + div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; + + // Workaround failing boxSizing test due to offsetWidth returning wrong value + // with some non-1 values of body zoom, ticket #13543 + jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { + support.boxSizing = div.offsetWidth === 4; + }); + + // Use window.getComputedStyle because jsdom on node.js will break without it. + if ( window.getComputedStyle ) { + support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; + support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. (#3333) + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + marginDiv = div.appendChild( document.createElement("div") ); + marginDiv.style.cssText = div.style.cssText = divReset; + marginDiv.style.marginRight = marginDiv.style.width = "0"; + div.style.width = "1px"; + + support.reliableMarginRight = + !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); + } + + if ( typeof div.style.zoom !== core_strundefined ) { + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.innerHTML = ""; + div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + div.style.display = "block"; + div.innerHTML = "
"; + div.firstChild.style.width = "5px"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + + if ( support.inlineBlockNeedsLayout ) { + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); + + // Null elements to avoid leaks in IE + container = div = tds = marginDiv = null; + }); + + // Null elements to avoid leaks in IE + all = select = fragment = opt = a = input = null; + + return support; +})({}); + +var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, + rmultiDash = /([A-Z])/g; + +function internalData( elem, name, data, pvt /* Internal Use Only */ ){ + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // 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[ internalKey ] : elem[ internalKey ] && internalKey; + + // 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 || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { + 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 ) { + id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { 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 ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // 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; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + 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 ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split(" "); + } + } + } else { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( jQuery.support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, null + } else { + cache[ id ] = null; + } +} + +jQuery.extend({ + cache: {}, + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "applet": true, + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + // Do not set data on non-element because it will not be cleared (#8335). + if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { + return false; + } + + var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; + + // nodes accept data unless otherwise specified; rejection can be conditional + return !noData || noData !== true && elem.getAttribute("classid") === noData; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var attrs, name, + data = null, + i = 0, + elem = this[0]; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attrs = elem.attributes; + for ( ; i < attrs.length; i++ ) { + name = attrs[i].name; + + if ( name.indexOf("data-") === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + return arguments.length > 1 ? + + // Sets one value + this.each(function() { + jQuery.data( this, key, value ); + }) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; + }, + + 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 : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +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; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray(data) ) { + queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + 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( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + 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, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var nodeHook, boolHook, + rclass = /[\t\r\n\f]/g, + rreturn = /\r/g, + rfocusable = /^(?:input|select|textarea|button|object)$/i, + rclickable = /^(?:a|area)$/i, + ruseDefault = /^(?:checked|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + getSetInput = jQuery.support.input; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + 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 classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call( this, j, this.className ) ); + }); + } + + if ( proceed ) { + // The disjunction here is for better compressibility (see removeClass) + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + " " + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + elem.className = jQuery.trim( cur ); + + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, clazz, j, + i = 0, + len = this.length, + proceed = arguments.length === 0 || typeof value === "string" && value; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call( this, j, this.className ) ); + }); + } + if ( proceed ) { + classes = ( value || "" ).match( core_rnotwhite ) || []; + + for ( ; i < len; i++ ) { + elem = this[ i ]; + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( elem.className ? + ( " " + elem.className + " " ).replace( rclass, " " ) : + "" + ); + + if ( cur ) { + j = 0; + while ( (clazz = classes[j++]) ) { + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + elem.className = value ? jQuery.trim( cur ) : ""; + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + 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 ), + classNames = value.match( core_rnotwhite ) || []; + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( type === core_strundefined || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // If the element has a class name or if we're passed "false", + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var ret, hooks, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + 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; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).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.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // 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 ) { + // Use proper attribute retrieval(#6932, #12072) + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + elem.text; + } + }, + select: { + get: function( elem ) { + var value, option, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one" || index < 0, + values = one ? null : [], + max = one ? index + 1 : options.length, + i = index < 0 ? + max : + one ? index : 0; + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // oldIE doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + // Don't return options that are disabled or in a disabled optgroup + ( 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 ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { + optionSet = true; + } + } + + // force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attr: function( elem, name, value ) { + var hooks, ret, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === core_strundefined ) { + return jQuery.prop( elem, name, value ); + } + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + + } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, value + "" ); + return value; + } + + } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var name, propName, + i = 0, + attrNames = value && value.match( core_rnotwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( (name = attrNames[i++]) ) { + propName = jQuery.propFix[ name ] || name; + + // Boolean attributes get special treatment (#10870) + if ( jQuery.expr.match.bool.test( name ) ) { + // Set corresponding property to false + if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + elem[ propName ] = false; + // Support: IE<9 + // Also clear defaultChecked/defaultSelected (if appropriate) + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = + elem[ propName ] = false; + } + + // See #9699 for explanation of this approach (setting first, then removal) + } else { + jQuery.attr( elem, name, "" ); + } + + elem.removeAttribute( getSetAttribute ? name : propName ); + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + 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 default in case type is set after value during creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + 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 ) { + return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? + ret : + ( elem[ name ] = value ); + + } else { + return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? + ret : + 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/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + return tabindex ? + parseInt( tabindex, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + -1; + } + } + } +}); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { + // IE<8 needs the *property* name + elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); + + // Use defaultChecked and defaultSelected for oldIE + } else { + elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; + } + + return name; + } +}; +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; + + jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? + function( elem, name, isXML ) { + var fn = jQuery.expr.attrHandle[ name ], + ret = isXML ? + undefined : + /* jshint eqeqeq: false */ + (jQuery.expr.attrHandle[ name ] = undefined) != + getter( elem, name, isXML ) ? + + name.toLowerCase() : + null; + jQuery.expr.attrHandle[ name ] = fn; + return ret; + } : + function( elem, name, isXML ) { + return isXML ? + undefined : + elem[ jQuery.camelCase( "default-" + name ) ] ? + name.toLowerCase() : + null; + }; +}); + +// fix oldIE attroperties +if ( !getSetInput || !getSetAttribute ) { + jQuery.attrHooks.value = { + set: function( elem, value, name ) { + if ( jQuery.nodeName( elem, "input" ) ) { + // Does not return so that setAttribute is also used + elem.defaultValue = value; + } else { + // Use nodeHook if defined (#1954); otherwise setAttribute is fine + return nodeHook && nodeHook.set( elem, value, name ); + } + } + }; +} + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = { + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + elem.setAttributeNode( + (ret = elem.ownerDocument.createAttribute( name )) + ); + } + + ret.value = value += ""; + + // Break association with cloned elements by also using setAttribute (#9646) + return name === "value" || value === elem.getAttribute( name ) ? + value : + undefined; + } + }; + jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = + // Some attributes are constructed with empty-string values when not defined + function( elem, name, isXML ) { + var ret; + return isXML ? + undefined : + (ret = elem.getAttributeNode( name )) && ret.value !== "" ? + ret.value : + null; + }; + jQuery.valHooks.button = { + get: function( elem, name ) { + var ret = elem.getAttributeNode( name ); + return ret && ret.specified ? + ret.value : + undefined; + }, + set: nodeHook.set + }; + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + set: function( elem, value, name ) { + nodeHook.set( elem, value === "" ? false : value, name ); + } + }; + + // 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 ] = { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }; + }); +} + + +// Some attributes require a special call on IE +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !jQuery.support.hrefNormalized ) { + // href/src property should get the full normalized URL (#10299/#12915) + jQuery.each([ "href", "src" ], function( i, name ) { + jQuery.propHooks[ name ] = { + get: function( elem ) { + return elem.getAttribute( name, 4 ); + } + }; + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Note: IE uppercases css property names, but if we were to .toLowerCase() + // .cssText, that would destroy case senstitivity in URL's, like in "background" + return elem.style.cssText || 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 = { + 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; + } + }; +} + +jQuery.each([ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +}); + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }; + if ( !jQuery.support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + // Support: Webkit + // "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + }; + } +}); +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = 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 !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // 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 to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( core_rnotwhite ) || [""]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = core_hasOwn.call( event, "type" ) ? event.type : event, + namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + 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. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, ret, handleObj, matched, j, + handlerQueue = [], + args = core_slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var sel, handleObj, matches, i, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Chrome 23+, Safari? + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Even when returnValue equals to undefined Firefox will still show alert + if ( event.result !== undefined ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // 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. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, to properly expose it to GC + if ( typeof elem[ name ] === core_strundefined ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + 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 ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = 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 = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + if ( !e ) { + return; + } + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !jQuery._data( form, "submitBubbles" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + jQuery._data( form, "submitBubbles", true ); + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + } + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event, true ); + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + jQuery._data( elem, "changeBubbles", true ); + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// 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, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var type, origFn; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); +var isSimple = /^.[^:#\[\.,]*$/, + rparentsprev = /^(?:parents|prev(?:Until|All))/, + rneedsContext = jQuery.expr.match.needsContext, + // 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 i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + ret = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + cur = ret.push( cur ); + break; + } + } + } + + return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); + }, + + // 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.first().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( jQuery.unique(all) ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +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 sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "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.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.unique( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); + }, + + 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; + }, + + 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, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( isSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + }); +} +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rtbody = /\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
", "
" ], + area: [ 1, "", "" ], + param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + col: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] + }, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +jQuery.fn.extend({ + text: function( value ) { + return jQuery.access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return jQuery.access( this, function( value ) { + var elem = this[0] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for (; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + elem = this[i] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch(e) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var + // Snapshot the DOM in case .domManip sweeps something relevant into its fragment + args = jQuery.map( this, function( elem ) { + return [ elem.nextSibling, elem.parentNode ]; + }), + i = 0; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + var next = args[ i++ ], + parent = args[ i++ ]; + + if ( parent ) { + // Don't use the snapshot next if it has moved (#13810) + if ( next && next.parentNode !== parent ) { + next = this.nextSibling; + } + jQuery( this ).remove(); + parent.insertBefore( elem, next ); + } + // Allow new content to include elements from the context set + }, true ); + + // Force removal if there was no new content (e.g., from empty arguments) + return i ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback, allowIntersection ) { + + // Flatten any nested arrays + args = core_concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[0], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[0] = value.call( this, index, self.html() ); + } + self.domManip( args, callback, allowIntersection ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[i], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Hope ajax is available... + jQuery._evalUrl( node.src ); + } else { + jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return this; + } +}); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[1]; + } else { + elem.removeAttribute("type"); + } + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; (elem = elems[i]) != null; i++ ) { + jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + } +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone(true); + jQuery( insert[i] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + core_push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + +// Used in buildFragment, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( manipulation_rcheckableType.test( elem.type ) ) { + elem.defaultChecked = elem.checked; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; (node = srcElements[i]) != null; ++i ) { + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[i] ) { + fixCloneNodeIssues( node, destElements[i] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; (node = srcElements[i]) != null; i++ ) { + cloneCopyEvent( node, destElements[i] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var j, elem, contains, + tmp, tag, tbody, wrap, + l = elems.length, + + // Ensure a safe fragment + safe = createSafeFragment( context ), + + nodes = [], + i = 0; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || safe.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + + tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + + // Descend through wrappers to the right content + j = wrap[0]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Manually add leading whitespace removed by IE + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); + } + + // Remove IE's autoinserted from table fragments + if ( !jQuery.support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[1] === "
" && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !jQuery.support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; + }, + + cleanData: function( elems, /* internal */ acceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + deleteExpando = jQuery.support.deleteExpando, + special = jQuery.event.special; + + for ( ; (elem = elems[i]) != null; i++ ) { + + if ( acceptData || jQuery.acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // 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 ( deleteExpando ) { + delete elem[ internalKey ]; + + } else if ( typeof elem.removeAttribute !== core_strundefined ) { + elem.removeAttribute( internalKey ); + + } else { + elem[ internalKey ] = null; + } + + core_deletedIds.push( id ); + } + } + } + } + }, + + _evalUrl: function( url ) { + return jQuery.ajax({ + url: url, + type: "GET", + dataType: "script", + async: false, + global: false, + "throws": true + }); + } +}); +jQuery.fn.extend({ + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each(function(i) { + jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + } +}); +var iframe, getStyles, curCSS, + ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity\s*=\s*([^)]*)/, + rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rmargin = /^margin/, + rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), + rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), + rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), + elemdisplay = { BODY: "block" }, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: 0, + fontWeight: 400 + }, + + cssExpand = [ "Top", "Right", "Bottom", "Left" ], + cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; + +// return a css property mapped to a potentially vendor prefixed property +function vendorPropName( style, name ) { + + // shortcut for names that are not vendor prefixed + if ( name in style ) { + return name; + } + + // check for vendor prefixed names + var capName = name.charAt(0).toUpperCase() + name.slice(1), + origName = name, + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in style ) { + return name; + } + } + + return origName; +} + +function isHidden( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); +} + +function showHide( elements, show ) { + var display, elem, hidden, + values = [], + index = 0, + length = elements.length; + + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + values[ index ] = jQuery._data( elem, "olddisplay" ); + display = elem.style.display; + if ( show ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !values[ index ] && display === "none" ) { + elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( elem.style.display === "" && isHidden( elem ) ) { + values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); + } + } else { + + if ( !values[ index ] ) { + hidden = isHidden( elem ); + + if ( display && display !== "none" || !hidden ) { + jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); + } + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( index = 0; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + if ( !show || elem.style.display === "none" || elem.style.display === "" ) { + elem.style.display = show ? values[ index ] || "" : "none"; + } + } + + return elements; +} + +jQuery.fn.extend({ + css: function( name, value ) { + return jQuery.access( this, function( elem, name, value ) { + var len, styles, + map = {}, + i = 0; + + if ( jQuery.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + }, + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each(function() { + if ( isHidden( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + }); + } +}); + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "columnCount": true, + "fillOpacity": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + style = elem.style; + + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && (ret = rrelNum.exec( value )) ) { + value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); + // Fixes bug #9237 + type = "number"; + } + + // Make sure that NaN and null values aren't set. See: #7116 + if ( value == null || type === "number" && isNaN( value ) ) { + return; + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, + // but it would mean to define eight (for every problematic property) identical functions + if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { + + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var num, val, hooks, + origName = jQuery.camelCase( name ); + + // Make sure that we're working with the right name + name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); + + // gets hook for the prefixed version + // followed by the unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + //convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Return, converting to number if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; + } + return val; + } +}); + +// NOTE: we've included the "window" in window.getComputedStyle +// because jsdom on node.js will break without it. +if ( window.getComputedStyle ) { + getStyles = function( elem ) { + return window.getComputedStyle( elem, null ); + }; + + curCSS = function( elem, name, _computed ) { + var width, minWidth, maxWidth, + computed = _computed || getStyles( elem ), + + // getPropertyValue is only needed for .css('filter') in IE9, see #12537 + ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, + style = elem.style; + + if ( computed ) { + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right + // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels + // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values + if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret; + }; +} else if ( document.documentElement.currentStyle ) { + getStyles = function( elem ) { + return elem.currentStyle; + }; + + curCSS = function( elem, name, _computed ) { + var left, rs, rsLeft, + computed = _computed || getStyles( elem ), + ret = computed ? computed[ name ] : undefined, + style = elem.style; + + // Avoid setting ret to empty string here + // so we don't default to auto + if ( ret == null && style && style[ name ] ) { + ret = style[ name ]; + } + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + // but not position css attributes, as those are proportional to the parent element instead + // and we can't measure the parent instead because it might trigger a "stacking dolls" problem + if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { + + // Remember the original values + left = style.left; + rs = elem.runtimeStyle; + rsLeft = rs && rs.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + rs.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : ret; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + rs.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +function setPositiveNumber( elem, value, subtract ) { + var matches = rnumsplit.exec( value ); + return matches ? + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i = extra === ( isBorderBox ? "border" : "content" ) ? + // If we already have the right measurement, avoid augmentation + 4 : + // Otherwise initialize for horizontal or vertical properties + name === "width" ? 1 : 0, + + val = 0; + + for ( ; i < 4; i += 2 ) { + // both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // at this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + // at this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // at this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with offset property, which is equivalent to the border-box value + var valueIsBorderBox = true, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight, + styles = getStyles( elem ), + isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // some non-html elements return undefined for offsetWidth, so check for null/undefined + // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 + // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 + if ( val <= 0 || val == null ) { + // Fall back to computed then uncomputed css if necessary + val = curCSS( elem, name, styles ); + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + } + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test(val) ) { + return val; + } + + // we need the check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + } + + // use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +// Try to determine the default display value of an element +function css_defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + // Use the already-created iframe if possible + iframe = ( iframe || + jQuery("