From 41c686945ae72655660f6b19994077dc6375aa71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ntek=20S=C3=A1ndor?= Date: Sat, 18 Jun 2016 10:07:35 +0200 Subject: [PATCH] Initial commit --- .DS_Store | Bin 0 -> 10244 bytes api.php | 25 + config.php | 11 + core.php | 305 + data/.DS_Store | Bin 0 -> 8196 bytes data/imglist.json.php | 69 + data/imgs/coding_in_progress.jpg | Bin 0 -> 51556 bytes data/imgs/index.html | 0 data/imgs/pixel.gif | Bin 0 -> 67 bytes data/imgs/thumb.coding_in_progress.jpg | Bin 0 -> 13948 bytes data/imgs/thumb.pixel.gif | Bin 0 -> 185 bytes data/imgs/thumb.zuko_default.jpg | Bin 0 -> 4729 bytes data/imgs/zuko_default.jpg | Bin 0 -> 16593 bytes data/index.html | 0 data/profile_pics/.DS_Store | Bin 0 -> 6148 bytes data/profile_pics/index.html | 0 data/tmp/index.html | 0 data/upload.php | 9 + data/uploads/.DS_Store | Bin 0 -> 6148 bytes data/uploads/index.html | 0 favicon.ico | Bin 0 -> 1150 bytes includes/admin/dashboard.php | 7 + includes/admin/entry.php | 149 + includes/admin/main.php | 36 + includes/admin/page.php | 55 + includes/admin/plugins.php | 51 + includes/admin/tags.php | 0 includes/blog.class.php | 124 + includes/check.class.php | 65 + includes/comment.class.php | 45 + .../ui-lightness/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 418 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 312 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 205 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 348 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 5815 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 278 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 328 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_228ef1_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes .../css/ui-lightness/jquery-ui.custom.min.css | 7 + includes/filtr.class.php | 173 + includes/index.html | 0 includes/js/functions.js | 10 + includes/js/jquery-ui.custom.min.js | 7 + includes/js/jquery.js | 9789 +++++++++++++++++ includes/locale/hu_HU.lng | 128 + includes/main/entries.php | 29 + includes/main/entry.php | 37 + includes/main/login.php | 38 + includes/main/page.php | 16 + includes/main/profile.php | 126 + includes/main/profile_edit.php | 17 + includes/main/tag.php | 29 + includes/page.class.php | 92 + includes/rss.php | 28 + includes/sidebar/account.php | 9 + includes/sidebar/sidebar.php | 29 + includes/user.class.php | 68 + index.php | 101 + plugins/.DS_Store | Bin 0 -> 6148 bytes plugins/ckeditor/_plugin.php | 5 + plugins/ckeditor/adapters/jquery.js | 10 + plugins/ckeditor/build-config.js | 59 + plugins/ckeditor/ckeditor.js | 733 ++ plugins/ckeditor/config.js | 44 + plugins/ckeditor/config.old.js | 38 + plugins/ckeditor/contents.css | 134 + plugins/ckeditor/info.json | 5 + plugins/ckeditor/lang/en.js | 5 + plugins/ckeditor/lang/hu.js | 5 + .../plugins/autosave/css/autosave.min.css | 1 + .../plugins/autosave/js/extensions.min.js | 213 + plugins/ckeditor/plugins/button/lang/en.js | 8 + plugins/ckeditor/plugins/button/lang/hu.js | 8 + plugins/ckeditor/plugins/button/plugin.js | 379 + .../plugins/clipboard/dialogs/paste.js | 11 + .../ckeditor/plugins/contextmenu/lang/en.js | 7 + .../ckeditor/plugins/contextmenu/lang/hu.js | 7 + .../ckeditor/plugins/contextmenu/plugin.js | 143 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/filebrowser/plugin.js | 501 + plugins/ckeditor/plugins/floatpanel/plugin.js | 548 + plugins/ckeditor/plugins/format/lang/en.js | 18 + plugins/ckeditor/plugins/format/lang/hu.js | 18 + plugins/ckeditor/plugins/format/plugin.js | 244 + .../ckeditor/plugins/htmlbuttons/icon1.png | Bin 0 -> 827 bytes .../ckeditor/plugins/htmlbuttons/icon2.png | Bin 0 -> 767 bytes .../ckeditor/plugins/htmlbuttons/icon3.png | Bin 0 -> 819 bytes .../ckeditor/plugins/htmlbuttons/plugin.js | 71 + plugins/ckeditor/plugins/htmlwriter/plugin.js | 359 + .../assets/outputforflash/outputforflash.fla | Bin 0 -> 85504 bytes .../assets/outputforflash/outputforflash.swf | Bin 0 -> 15571 bytes .../assets/outputforflash/swfobject.js | 5 + .../htmlwriter/samples/outputforflash.html | 280 + .../htmlwriter/samples/outputhtml.html | 221 + plugins/ckeditor/plugins/icons.png | Bin 0 -> 6928 bytes plugins/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 21710 bytes .../ckeditor/plugins/image/dialogs/image.js | 1216 ++ .../plugins/image/icons/hidpi/image.png | Bin 0 -> 1745 bytes .../ckeditor/plugins/image/icons/image.png | Bin 0 -> 756 bytes .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 2115 bytes plugins/ckeditor/plugins/image/lang/en.js | 26 + plugins/ckeditor/plugins/image/lang/hu.js | 26 + plugins/ckeditor/plugins/image/plugin.js | 170 + .../plugins/imagebrowser/browser/browser.css | 62 + .../plugins/imagebrowser/browser/browser.html | 25 + .../plugins/imagebrowser/browser/browser.js | 6 + .../imagebrowser/browser/jquery-1.9.1.min.js | 181 + .../justify/icons/hidpi/justifyblock.png | Bin 0 -> 882 bytes .../justify/icons/hidpi/justifycenter.png | Bin 0 -> 1142 bytes .../justify/icons/hidpi/justifyleft.png | Bin 0 -> 1042 bytes .../justify/icons/hidpi/justifyright.png | Bin 0 -> 1048 bytes .../plugins/justify/icons/justifyblock.png | Bin 0 -> 496 bytes .../plugins/justify/icons/justifycenter.png | Bin 0 -> 609 bytes .../plugins/justify/icons/justifyleft.png | Bin 0 -> 558 bytes .../plugins/justify/icons/justifyright.png | Bin 0 -> 554 bytes plugins/ckeditor/plugins/justify/lang/en.js | 10 + plugins/ckeditor/plugins/justify/lang/hu.js | 10 + plugins/ckeditor/plugins/justify/plugin.js | 241 + .../ckeditor/plugins/link/dialogs/anchor.js | 7 + plugins/ckeditor/plugins/link/dialogs/link.js | 26 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 763 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1597 bytes plugins/ckeditor/plugins/listblock/plugin.js | 240 + plugins/ckeditor/plugins/panel/plugin.js | 402 + plugins/ckeditor/plugins/popup/plugin.js | 65 + .../ckeditor/plugins/readmorebtn/plugin.js | 21 + .../ckeditor/plugins/readmorebtn/readmore.gif | Bin 0 -> 54 bytes .../ckeditor/plugins/readmorebtn/readmore.png | Bin 0 -> 602 bytes plugins/ckeditor/plugins/richcombo/plugin.js | 441 + .../sourcedialog/dialogs/sourcedialog.js | 79 + .../icons/hidpi/sourcedialog-rtl.png | Bin 0 -> 1968 bytes .../sourcedialog/icons/hidpi/sourcedialog.png | Bin 0 -> 1999 bytes .../sourcedialog/icons/sourcedialog-rtl.png | Bin 0 -> 762 bytes .../sourcedialog/icons/sourcedialog.png | Bin 0 -> 764 bytes .../ckeditor/plugins/sourcedialog/lang/en.js | 9 + .../ckeditor/plugins/sourcedialog/lang/hu.js | 9 + .../ckeditor/plugins/sourcedialog/plugin.js | 27 + .../sourcedialog/samples/sourcedialog.html | 118 + .../ckeditor/plugins/table/dialogs/table.js | 555 + .../plugins/table/icons/hidpi/table.png | Bin 0 -> 1006 bytes .../ckeditor/plugins/table/icons/table.png | Bin 0 -> 535 bytes plugins/ckeditor/plugins/table/lang/en.js | 74 + plugins/ckeditor/plugins/table/lang/hu.js | 74 + plugins/ckeditor/plugins/table/plugin.js | 106 + .../plugins/tabletools/dialogs/tableCell.js | 493 + plugins/ckeditor/plugins/tabletools/plugin.js | 1037 ++ plugins/ckeditor/skins/moono/dialog.css | 5 + plugins/ckeditor/skins/moono/dialog_ie.css | 5 + plugins/ckeditor/skins/moono/dialog_ie7.css | 5 + plugins/ckeditor/skins/moono/dialog_ie8.css | 5 + .../ckeditor/skins/moono/dialog_iequirks.css | 5 + plugins/ckeditor/skins/moono/editor.css | 5 + plugins/ckeditor/skins/moono/editor_gecko.css | 5 + plugins/ckeditor/skins/moono/editor_ie.css | 5 + plugins/ckeditor/skins/moono/editor_ie7.css | 5 + plugins/ckeditor/skins/moono/editor_ie8.css | 5 + .../ckeditor/skins/moono/editor_iequirks.css | 5 + plugins/ckeditor/skins/moono/icons.png | Bin 0 -> 6928 bytes plugins/ckeditor/skins/moono/icons_hidpi.png | Bin 0 -> 21710 bytes plugins/ckeditor/skins/moono/images/arrow.png | Bin 0 -> 261 bytes plugins/ckeditor/skins/moono/images/close.png | Bin 0 -> 824 bytes .../skins/moono/images/hidpi/close.png | Bin 0 -> 1792 bytes .../skins/moono/images/hidpi/lock-open.png | Bin 0 -> 1503 bytes .../skins/moono/images/hidpi/lock.png | Bin 0 -> 1616 bytes .../skins/moono/images/hidpi/refresh.png | Bin 0 -> 2320 bytes .../ckeditor/skins/moono/images/lock-open.png | Bin 0 -> 736 bytes plugins/ckeditor/skins/moono/images/lock.png | Bin 0 -> 728 bytes .../ckeditor/skins/moono/images/refresh.png | Bin 0 -> 953 bytes plugins/ckeditor/skins/moono/readme.md | 51 + plugins/ckeditor/skins/office2013/dialog.css | 5 + plugins/ckeditor/skins/office2013/editor.css | 5 + plugins/ckeditor/skins/office2013/icons.png | Bin 0 -> 11839 bytes .../ckeditor/skins/office2013/icons_hidpi.png | Bin 0 -> 28937 bytes .../skins/office2013/images/arrow.png | Bin 0 -> 261 bytes .../skins/office2013/images/close.png | Bin 0 -> 176 bytes .../skins/office2013/images/hidpi/close.png | Bin 0 -> 243 bytes .../office2013/images/hidpi/lock-open.png | Bin 0 -> 1503 bytes .../skins/office2013/images/hidpi/lock.png | Bin 0 -> 1616 bytes .../skins/office2013/images/hidpi/refresh.png | Bin 0 -> 2320 bytes .../skins/office2013/images/lock-open.png | Bin 0 -> 736 bytes .../ckeditor/skins/office2013/images/lock.png | Bin 0 -> 728 bytes .../skins/office2013/images/refresh.png | Bin 0 -> 953 bytes plugins/ckeditor/skins/office2013/skin.js | 1 + plugins/ckeditor/styles.js | 111 + plugins/ckeditor_simple/_plugin.php | 5 + plugins/ckeditor_simple/adapters/jquery.js | 10 + plugins/ckeditor_simple/build-config.js | 54 + plugins/ckeditor_simple/ckeditor.js | 717 ++ plugins/ckeditor_simple/config.js | 34 + plugins/ckeditor_simple/contents.css | 134 + plugins/ckeditor_simple/info.json | 5 + plugins/ckeditor_simple/lang/en.js | 5 + plugins/ckeditor_simple/lang/hu.js | 5 + .../plugins/clipboard/dialogs/paste.js | 11 + .../plugins/dialog/dialogDefinition.js | 4 + plugins/ckeditor_simple/plugins/icons.png | Bin 0 -> 5952 bytes .../ckeditor_simple/plugins/icons_hidpi.png | Bin 0 -> 18019 bytes .../plugins/link/dialogs/anchor.js | 7 + .../plugins/link/dialogs/link.js | 26 + .../plugins/link/images/anchor.png | Bin 0 -> 763 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1597 bytes plugins/ckeditor_simple/samples/ajax.html | 82 + plugins/ckeditor_simple/samples/api.html | 207 + plugins/ckeditor_simple/samples/appendto.html | 57 + .../samples/assets/inlineall/logo.png | Bin 0 -> 4411 bytes .../assets/outputxhtml/outputxhtml.css | 204 + .../samples/assets/posteddata.php | 59 + .../ckeditor_simple/samples/assets/sample.css | 3 + .../ckeditor_simple/samples/assets/sample.jpg | Bin 0 -> 17932 bytes .../samples/assets/uilanguages/languages.js | 7 + .../samples/datafiltering.html | 401 + .../ckeditor_simple/samples/divreplace.html | 141 + plugins/ckeditor_simple/samples/index.html | 119 + .../ckeditor_simple/samples/inlineall.html | 311 + .../ckeditor_simple/samples/inlinebycode.html | 121 + .../samples/inlinetextarea.html | 110 + plugins/ckeditor_simple/samples/jquery.html | 100 + .../plugins/dialog/assets/my_dialog.js | 48 + .../samples/plugins/dialog/dialog.html | 187 + .../samples/plugins/enterkey/enterkey.html | 103 + .../samples/plugins/toolbar/toolbar.html | 232 + .../samples/plugins/wysiwygarea/fullpage.html | 77 + plugins/ckeditor_simple/samples/readonly.html | 73 + .../samples/replacebyclass.html | 57 + .../samples/replacebycode.html | 56 + plugins/ckeditor_simple/samples/sample.css | 365 + plugins/ckeditor_simple/samples/sample.js | 50 + .../samples/sample_posteddata.php | 16 + plugins/ckeditor_simple/samples/tabindex.html | 75 + plugins/ckeditor_simple/samples/uicolor.html | 69 + .../ckeditor_simple/samples/uilanguages.html | 119 + .../ckeditor_simple/samples/xhtmlstyle.html | 231 + .../ckeditor_simple/skins/moono/dialog.css | 5 + .../ckeditor_simple/skins/moono/dialog_ie.css | 5 + .../skins/moono/dialog_ie7.css | 5 + .../skins/moono/dialog_ie8.css | 5 + .../skins/moono/dialog_iequirks.css | 5 + .../ckeditor_simple/skins/moono/editor.css | 5 + .../skins/moono/editor_gecko.css | 5 + .../ckeditor_simple/skins/moono/editor_ie.css | 5 + .../skins/moono/editor_ie7.css | 5 + .../skins/moono/editor_ie8.css | 5 + .../skins/moono/editor_iequirks.css | 5 + plugins/ckeditor_simple/skins/moono/icons.png | Bin 0 -> 5952 bytes .../skins/moono/icons_hidpi.png | Bin 0 -> 18019 bytes .../skins/moono/images/arrow.png | Bin 0 -> 261 bytes .../skins/moono/images/close.png | Bin 0 -> 824 bytes .../skins/moono/images/hidpi/close.png | Bin 0 -> 1792 bytes .../skins/moono/images/hidpi/lock-open.png | Bin 0 -> 1503 bytes .../skins/moono/images/hidpi/lock.png | Bin 0 -> 1616 bytes .../skins/moono/images/hidpi/refresh.png | Bin 0 -> 2320 bytes .../skins/moono/images/lock-open.png | Bin 0 -> 736 bytes .../skins/moono/images/lock.png | Bin 0 -> 728 bytes .../skins/moono/images/refresh.png | Bin 0 -> 953 bytes plugins/ckeditor_simple/skins/moono/readme.md | 51 + plugins/ckeditor_simple/styles.js | 111 + plugins/disqus/_plugin.php | 13 + plugins/disqus/info.json | 5 + plugins/facebook-comments/_plugin.php | 11 + plugins/facebook-comments/info.json | 5 + plugins/facebook-root/_plugin.php | 10 + plugins/facebook-root/info.json | 5 + plugins/facebook-share/_plugin.php | 11 + plugins/facebook-share/info.json | 5 + plugins/filtr_stat/_plugin.php | 4 + plugins/filtr_stat/info.json | 5 + plugins/friendurl-jquery/_plugin.php | 4 + plugins/friendurl-jquery/info.json | 5 + .../friendurl-jquery/jquery.friendurl.min.js | 14 + plugins/galleria-io/_plugin.php | 4 + plugins/galleria-io/galleria.min.js | 3 + plugins/galleria-io/info.json | 5 + .../themes/classic/classic-loader.gif | Bin 0 -> 1849 bytes .../themes/classic/classic-map.png | Bin 0 -> 1840 bytes .../themes/classic/galleria.classic.css | 219 + .../themes/classic/galleria.classic.min.js | 1 + plugins/index.html | 0 plugins/twitter-root/_plugin.php | 3 + plugins/twitter-root/info.json | 5 + plugins/twitter-tweet/_plugin.php | 3 + plugins/twitter-tweet/info.json | 5 + themes/default/default.css | 256 + themes/default/font/typicons.eot | Bin 0 -> 102576 bytes themes/default/font/typicons.min.css | 1 + themes/default/font/typicons.svg | 1180 ++ themes/default/font/typicons.ttf | Bin 0 -> 102292 bytes themes/default/font/typicons.woff | Bin 0 -> 60464 bytes themes/default/footer.php | 12 + themes/default/header.php | 34 + themes/default/img/stripe.png | Bin 0 -> 133 bytes themes/default/template.php | 17 + themes/default/theme.js | 8 + themes/index.html | 0 themes/murkyhellyeah/components/entries.php | 24 + themes/murkyhellyeah/components/entry.php | 35 + themes/murkyhellyeah/components/page.php | 8 + themes/murkyhellyeah/components/profile.php | 46 + themes/murkyhellyeah/components/tag.php | 18 + themes/murkyhellyeah/font/typicons.eot | Bin 0 -> 102576 bytes themes/murkyhellyeah/font/typicons.min.css | 1 + themes/murkyhellyeah/font/typicons.svg | 1180 ++ themes/murkyhellyeah/font/typicons.ttf | Bin 0 -> 102292 bytes themes/murkyhellyeah/font/typicons.woff | Bin 0 -> 60464 bytes themes/murkyhellyeah/images/arrowDown.svg | 3 + themes/murkyhellyeah/images/dango.jpg | Bin 0 -> 71853 bytes themes/murkyhellyeah/images/img01.jpg | Bin 0 -> 3039 bytes themes/murkyhellyeah/images/img02.jpg | Bin 0 -> 41442 bytes themes/murkyhellyeah/images/img03.png | Bin 0 -> 5212 bytes themes/murkyhellyeah/images/img04.jpg | Bin 0 -> 316 bytes themes/murkyhellyeah/images/img05.jpg | Bin 0 -> 5909 bytes themes/murkyhellyeah/images/lightstripe.png | Bin 0 -> 2813 bytes .../murkyhellyeah/images/material-flatc.jpg | Bin 0 -> 218368 bytes .../murkyhellyeah/images/moto360-filter.jpg | Bin 0 -> 310901 bytes themes/murkyhellyeah/images/moto360.jpg | Bin 0 -> 152919 bytes themes/murkyhellyeah/images/record.jpg | Bin 0 -> 161128 bytes themes/murkyhellyeah/images/trollface.png | Bin 0 -> 9099 bytes themes/murkyhellyeah/style.css | 540 + themes/murkyhellyeah/template.php | 95 + themes/murkyhellyeah/theme.js | 70 + themes/murkymodern/components/entries.php | 19 + themes/murkymodern/components/entry.php | 31 + themes/murkymodern/components/page.php | 8 + themes/murkymodern/components/profile.php | 46 + themes/murkymodern/components/tag.php | 18 + themes/murkymodern/font/typicons.eot | Bin 0 -> 102576 bytes themes/murkymodern/font/typicons.min.css | 1 + themes/murkymodern/font/typicons.svg | 1180 ++ themes/murkymodern/font/typicons.ttf | Bin 0 -> 102292 bytes themes/murkymodern/font/typicons.woff | Bin 0 -> 60464 bytes themes/murkymodern/images/arrowDown.svg | 3 + themes/murkymodern/images/dango.jpg | Bin 0 -> 71853 bytes themes/murkymodern/images/img01.jpg | Bin 0 -> 3039 bytes themes/murkymodern/images/img02.jpg | Bin 0 -> 41442 bytes themes/murkymodern/images/img03.png | Bin 0 -> 5212 bytes themes/murkymodern/images/img04.jpg | Bin 0 -> 316 bytes themes/murkymodern/images/img05.jpg | Bin 0 -> 5909 bytes themes/murkymodern/images/lightstripe.png | Bin 0 -> 2813 bytes themes/murkymodern/images/moto360-filter.jpg | Bin 0 -> 310901 bytes themes/murkymodern/images/moto360.jpg | Bin 0 -> 152919 bytes themes/murkymodern/images/record.jpg | Bin 0 -> 161128 bytes themes/murkymodern/images/trollface.png | Bin 0 -> 9099 bytes themes/murkymodern/style.css | 549 + themes/murkymodern/template.php | 76 + themes/murkymodern/theme.js | 67 + themes/murkystairwell/components/entries.php | 19 + themes/murkystairwell/components/entry.php | 18 + themes/murkystairwell/components/page.php | 7 + themes/murkystairwell/components/profile.php | 45 + themes/murkystairwell/components/tag.php | 19 + themes/murkystairwell/font/typicons.eot | Bin 0 -> 102576 bytes themes/murkystairwell/font/typicons.min.css | 1 + themes/murkystairwell/font/typicons.svg | 1180 ++ themes/murkystairwell/font/typicons.ttf | Bin 0 -> 102292 bytes themes/murkystairwell/font/typicons.woff | Bin 0 -> 60464 bytes themes/murkystairwell/footer.php | 12 + themes/murkystairwell/header.php | 40 + themes/murkystairwell/images/dango.jpg | Bin 0 -> 71853 bytes themes/murkystairwell/images/img01.jpg | Bin 0 -> 3039 bytes themes/murkystairwell/images/img02.jpg | Bin 0 -> 41442 bytes themes/murkystairwell/images/img03.png | Bin 0 -> 5212 bytes themes/murkystairwell/images/img04.jpg | Bin 0 -> 316 bytes themes/murkystairwell/images/img05.jpg | Bin 0 -> 5909 bytes themes/murkystairwell/images/lightstripe.png | Bin 0 -> 2813 bytes themes/murkystairwell/images/trollface.png | Bin 0 -> 9099 bytes themes/murkystairwell/style.css | 529 + themes/murkystairwell/template.php | 25 + themes/murkystairwell/theme.js | 65 + themes/wooden/components/entries.php | 19 + themes/wooden/components/entry.php | 18 + themes/wooden/components/page.php | 7 + themes/wooden/components/profile.php | 45 + themes/wooden/components/tag.php | 19 + themes/wooden/default.css | 256 + themes/wooden/font/typicons.eot | Bin 0 -> 102576 bytes themes/wooden/font/typicons.min.css | 1 + themes/wooden/font/typicons.svg | 1180 ++ themes/wooden/font/typicons.ttf | Bin 0 -> 102292 bytes themes/wooden/font/typicons.woff | Bin 0 -> 60464 bytes themes/wooden/footer.php | 12 + themes/wooden/header.php | 39 + themes/wooden/images/dango.jpg | Bin 0 -> 71853 bytes themes/wooden/images/darkwood.jpg | Bin 0 -> 314083 bytes themes/wooden/images/img01.jpg | Bin 0 -> 3039 bytes themes/wooden/images/img02.jpg | Bin 0 -> 41442 bytes themes/wooden/images/img03.png | Bin 0 -> 5212 bytes themes/wooden/images/img04.jpg | Bin 0 -> 316 bytes themes/wooden/images/img05.jpg | Bin 0 -> 5909 bytes themes/wooden/images/trollface.png | Bin 0 -> 9099 bytes themes/wooden/style.css | 655 ++ themes/wooden/template.php | 19 + themes/wooden/theme.js | 65 + 398 files changed, 36832 insertions(+) create mode 100644 .DS_Store create mode 100644 api.php create mode 100644 config.php create mode 100644 core.php create mode 100644 data/.DS_Store create mode 100644 data/imglist.json.php create mode 100644 data/imgs/coding_in_progress.jpg create mode 100644 data/imgs/index.html create mode 100644 data/imgs/pixel.gif create mode 100644 data/imgs/thumb.coding_in_progress.jpg create mode 100644 data/imgs/thumb.pixel.gif create mode 100644 data/imgs/thumb.zuko_default.jpg create mode 100644 data/imgs/zuko_default.jpg create mode 100644 data/index.html create mode 100644 data/profile_pics/.DS_Store create mode 100644 data/profile_pics/index.html create mode 100644 data/tmp/index.html create mode 100644 data/upload.php create mode 100644 data/uploads/.DS_Store create mode 100644 data/uploads/index.html create mode 100644 favicon.ico create mode 100644 includes/admin/dashboard.php create mode 100644 includes/admin/entry.php create mode 100644 includes/admin/main.php create mode 100644 includes/admin/page.php create mode 100644 includes/admin/plugins.php create mode 100644 includes/admin/tags.php create mode 100644 includes/blog.class.php create mode 100644 includes/check.class.php create mode 100644 includes/comment.class.php create mode 100644 includes/css/ui-lightness/images/animated-overlay.gif create mode 100644 includes/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 includes/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 includes/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png create mode 100644 includes/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 includes/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 includes/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 includes/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 includes/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 includes/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 includes/css/ui-lightness/images/ui-icons_222222_256x240.png create mode 100644 includes/css/ui-lightness/images/ui-icons_228ef1_256x240.png create mode 100644 includes/css/ui-lightness/images/ui-icons_ef8c08_256x240.png create mode 100644 includes/css/ui-lightness/images/ui-icons_ffd27a_256x240.png create mode 100644 includes/css/ui-lightness/images/ui-icons_ffffff_256x240.png create mode 100644 includes/css/ui-lightness/jquery-ui.custom.min.css create mode 100644 includes/filtr.class.php create mode 100644 includes/index.html create mode 100644 includes/js/functions.js create mode 100644 includes/js/jquery-ui.custom.min.js create mode 100644 includes/js/jquery.js create mode 100644 includes/locale/hu_HU.lng create mode 100644 includes/main/entries.php create mode 100644 includes/main/entry.php create mode 100644 includes/main/login.php create mode 100644 includes/main/page.php create mode 100644 includes/main/profile.php create mode 100644 includes/main/profile_edit.php create mode 100644 includes/main/tag.php create mode 100644 includes/page.class.php create mode 100644 includes/rss.php create mode 100644 includes/sidebar/account.php create mode 100644 includes/sidebar/sidebar.php create mode 100644 includes/user.class.php create mode 100644 index.php create mode 100644 plugins/.DS_Store create mode 100644 plugins/ckeditor/_plugin.php create mode 100644 plugins/ckeditor/adapters/jquery.js create mode 100644 plugins/ckeditor/build-config.js create mode 100644 plugins/ckeditor/ckeditor.js create mode 100644 plugins/ckeditor/config.js create mode 100644 plugins/ckeditor/config.old.js create mode 100644 plugins/ckeditor/contents.css create mode 100644 plugins/ckeditor/info.json create mode 100644 plugins/ckeditor/lang/en.js create mode 100644 plugins/ckeditor/lang/hu.js create mode 100644 plugins/ckeditor/plugins/autosave/css/autosave.min.css create mode 100644 plugins/ckeditor/plugins/autosave/js/extensions.min.js create mode 100644 plugins/ckeditor/plugins/button/lang/en.js create mode 100644 plugins/ckeditor/plugins/button/lang/hu.js create mode 100644 plugins/ckeditor/plugins/button/plugin.js create mode 100644 plugins/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 plugins/ckeditor/plugins/contextmenu/lang/en.js create mode 100644 plugins/ckeditor/plugins/contextmenu/lang/hu.js create mode 100644 plugins/ckeditor/plugins/contextmenu/plugin.js create mode 100644 plugins/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 plugins/ckeditor/plugins/filebrowser/plugin.js create mode 100644 plugins/ckeditor/plugins/floatpanel/plugin.js create mode 100644 plugins/ckeditor/plugins/format/lang/en.js create mode 100644 plugins/ckeditor/plugins/format/lang/hu.js create mode 100644 plugins/ckeditor/plugins/format/plugin.js create mode 100644 plugins/ckeditor/plugins/htmlbuttons/icon1.png create mode 100644 plugins/ckeditor/plugins/htmlbuttons/icon2.png create mode 100644 plugins/ckeditor/plugins/htmlbuttons/icon3.png create mode 100644 plugins/ckeditor/plugins/htmlbuttons/plugin.js create mode 100644 plugins/ckeditor/plugins/htmlwriter/plugin.js create mode 100644 plugins/ckeditor/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.fla create mode 100644 plugins/ckeditor/plugins/htmlwriter/samples/assets/outputforflash/outputforflash.swf create mode 100644 plugins/ckeditor/plugins/htmlwriter/samples/assets/outputforflash/swfobject.js create mode 100644 plugins/ckeditor/plugins/htmlwriter/samples/outputforflash.html create mode 100644 plugins/ckeditor/plugins/htmlwriter/samples/outputhtml.html create mode 100644 plugins/ckeditor/plugins/icons.png create mode 100644 plugins/ckeditor/plugins/icons_hidpi.png create mode 100644 plugins/ckeditor/plugins/image/dialogs/image.js create mode 100644 plugins/ckeditor/plugins/image/icons/hidpi/image.png create mode 100644 plugins/ckeditor/plugins/image/icons/image.png create mode 100644 plugins/ckeditor/plugins/image/images/noimage.png create mode 100644 plugins/ckeditor/plugins/image/lang/en.js create mode 100644 plugins/ckeditor/plugins/image/lang/hu.js create mode 100644 plugins/ckeditor/plugins/image/plugin.js create mode 100644 plugins/ckeditor/plugins/imagebrowser/browser/browser.css create mode 100644 plugins/ckeditor/plugins/imagebrowser/browser/browser.html create mode 100644 plugins/ckeditor/plugins/imagebrowser/browser/browser.js create mode 100644 plugins/ckeditor/plugins/imagebrowser/browser/jquery-1.9.1.min.js create mode 100644 plugins/ckeditor/plugins/justify/icons/hidpi/justifyblock.png create mode 100644 plugins/ckeditor/plugins/justify/icons/hidpi/justifycenter.png create mode 100644 plugins/ckeditor/plugins/justify/icons/hidpi/justifyleft.png create mode 100644 plugins/ckeditor/plugins/justify/icons/hidpi/justifyright.png create mode 100644 plugins/ckeditor/plugins/justify/icons/justifyblock.png create mode 100644 plugins/ckeditor/plugins/justify/icons/justifycenter.png create mode 100644 plugins/ckeditor/plugins/justify/icons/justifyleft.png create mode 100644 plugins/ckeditor/plugins/justify/icons/justifyright.png create mode 100644 plugins/ckeditor/plugins/justify/lang/en.js create mode 100644 plugins/ckeditor/plugins/justify/lang/hu.js create mode 100644 plugins/ckeditor/plugins/justify/plugin.js create mode 100644 plugins/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 plugins/ckeditor/plugins/link/dialogs/link.js create mode 100644 plugins/ckeditor/plugins/link/images/anchor.png create mode 100644 plugins/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 plugins/ckeditor/plugins/listblock/plugin.js create mode 100644 plugins/ckeditor/plugins/panel/plugin.js create mode 100644 plugins/ckeditor/plugins/popup/plugin.js create mode 100644 plugins/ckeditor/plugins/readmorebtn/plugin.js create mode 100644 plugins/ckeditor/plugins/readmorebtn/readmore.gif create mode 100644 plugins/ckeditor/plugins/readmorebtn/readmore.png create mode 100644 plugins/ckeditor/plugins/richcombo/plugin.js create mode 100644 plugins/ckeditor/plugins/sourcedialog/dialogs/sourcedialog.js create mode 100644 plugins/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog-rtl.png create mode 100644 plugins/ckeditor/plugins/sourcedialog/icons/hidpi/sourcedialog.png create mode 100644 plugins/ckeditor/plugins/sourcedialog/icons/sourcedialog-rtl.png create mode 100644 plugins/ckeditor/plugins/sourcedialog/icons/sourcedialog.png create mode 100644 plugins/ckeditor/plugins/sourcedialog/lang/en.js create mode 100644 plugins/ckeditor/plugins/sourcedialog/lang/hu.js create mode 100644 plugins/ckeditor/plugins/sourcedialog/plugin.js create mode 100644 plugins/ckeditor/plugins/sourcedialog/samples/sourcedialog.html create mode 100644 plugins/ckeditor/plugins/table/dialogs/table.js create mode 100644 plugins/ckeditor/plugins/table/icons/hidpi/table.png create mode 100644 plugins/ckeditor/plugins/table/icons/table.png create mode 100644 plugins/ckeditor/plugins/table/lang/en.js create mode 100644 plugins/ckeditor/plugins/table/lang/hu.js create mode 100644 plugins/ckeditor/plugins/table/plugin.js create mode 100644 plugins/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 plugins/ckeditor/plugins/tabletools/plugin.js create mode 100644 plugins/ckeditor/skins/moono/dialog.css create mode 100644 plugins/ckeditor/skins/moono/dialog_ie.css create mode 100644 plugins/ckeditor/skins/moono/dialog_ie7.css create mode 100644 plugins/ckeditor/skins/moono/dialog_ie8.css create mode 100644 plugins/ckeditor/skins/moono/dialog_iequirks.css create mode 100644 plugins/ckeditor/skins/moono/editor.css create mode 100644 plugins/ckeditor/skins/moono/editor_gecko.css create mode 100644 plugins/ckeditor/skins/moono/editor_ie.css create mode 100644 plugins/ckeditor/skins/moono/editor_ie7.css create mode 100644 plugins/ckeditor/skins/moono/editor_ie8.css create mode 100644 plugins/ckeditor/skins/moono/editor_iequirks.css create mode 100644 plugins/ckeditor/skins/moono/icons.png create mode 100644 plugins/ckeditor/skins/moono/icons_hidpi.png create mode 100644 plugins/ckeditor/skins/moono/images/arrow.png create mode 100644 plugins/ckeditor/skins/moono/images/close.png create mode 100644 plugins/ckeditor/skins/moono/images/hidpi/close.png create mode 100644 plugins/ckeditor/skins/moono/images/hidpi/lock-open.png create mode 100644 plugins/ckeditor/skins/moono/images/hidpi/lock.png create mode 100644 plugins/ckeditor/skins/moono/images/hidpi/refresh.png create mode 100644 plugins/ckeditor/skins/moono/images/lock-open.png create mode 100644 plugins/ckeditor/skins/moono/images/lock.png create mode 100644 plugins/ckeditor/skins/moono/images/refresh.png create mode 100644 plugins/ckeditor/skins/moono/readme.md create mode 100644 plugins/ckeditor/skins/office2013/dialog.css create mode 100644 plugins/ckeditor/skins/office2013/editor.css create mode 100644 plugins/ckeditor/skins/office2013/icons.png create mode 100644 plugins/ckeditor/skins/office2013/icons_hidpi.png create mode 100644 plugins/ckeditor/skins/office2013/images/arrow.png create mode 100644 plugins/ckeditor/skins/office2013/images/close.png create mode 100644 plugins/ckeditor/skins/office2013/images/hidpi/close.png create mode 100644 plugins/ckeditor/skins/office2013/images/hidpi/lock-open.png create mode 100644 plugins/ckeditor/skins/office2013/images/hidpi/lock.png create mode 100644 plugins/ckeditor/skins/office2013/images/hidpi/refresh.png create mode 100644 plugins/ckeditor/skins/office2013/images/lock-open.png create mode 100644 plugins/ckeditor/skins/office2013/images/lock.png create mode 100644 plugins/ckeditor/skins/office2013/images/refresh.png create mode 100644 plugins/ckeditor/skins/office2013/skin.js create mode 100644 plugins/ckeditor/styles.js create mode 100644 plugins/ckeditor_simple/_plugin.php create mode 100644 plugins/ckeditor_simple/adapters/jquery.js create mode 100644 plugins/ckeditor_simple/build-config.js create mode 100644 plugins/ckeditor_simple/ckeditor.js create mode 100644 plugins/ckeditor_simple/config.js create mode 100644 plugins/ckeditor_simple/contents.css create mode 100644 plugins/ckeditor_simple/info.json create mode 100644 plugins/ckeditor_simple/lang/en.js create mode 100644 plugins/ckeditor_simple/lang/hu.js create mode 100644 plugins/ckeditor_simple/plugins/clipboard/dialogs/paste.js create mode 100644 plugins/ckeditor_simple/plugins/dialog/dialogDefinition.js create mode 100644 plugins/ckeditor_simple/plugins/icons.png create mode 100644 plugins/ckeditor_simple/plugins/icons_hidpi.png create mode 100644 plugins/ckeditor_simple/plugins/link/dialogs/anchor.js create mode 100644 plugins/ckeditor_simple/plugins/link/dialogs/link.js create mode 100644 plugins/ckeditor_simple/plugins/link/images/anchor.png create mode 100644 plugins/ckeditor_simple/plugins/link/images/hidpi/anchor.png create mode 100644 plugins/ckeditor_simple/samples/ajax.html create mode 100644 plugins/ckeditor_simple/samples/api.html create mode 100644 plugins/ckeditor_simple/samples/appendto.html create mode 100644 plugins/ckeditor_simple/samples/assets/inlineall/logo.png create mode 100644 plugins/ckeditor_simple/samples/assets/outputxhtml/outputxhtml.css create mode 100644 plugins/ckeditor_simple/samples/assets/posteddata.php create mode 100644 plugins/ckeditor_simple/samples/assets/sample.css create mode 100644 plugins/ckeditor_simple/samples/assets/sample.jpg create mode 100644 plugins/ckeditor_simple/samples/assets/uilanguages/languages.js create mode 100644 plugins/ckeditor_simple/samples/datafiltering.html create mode 100644 plugins/ckeditor_simple/samples/divreplace.html create mode 100644 plugins/ckeditor_simple/samples/index.html create mode 100644 plugins/ckeditor_simple/samples/inlineall.html create mode 100644 plugins/ckeditor_simple/samples/inlinebycode.html create mode 100644 plugins/ckeditor_simple/samples/inlinetextarea.html create mode 100644 plugins/ckeditor_simple/samples/jquery.html create mode 100644 plugins/ckeditor_simple/samples/plugins/dialog/assets/my_dialog.js create mode 100644 plugins/ckeditor_simple/samples/plugins/dialog/dialog.html create mode 100644 plugins/ckeditor_simple/samples/plugins/enterkey/enterkey.html create mode 100644 plugins/ckeditor_simple/samples/plugins/toolbar/toolbar.html create mode 100644 plugins/ckeditor_simple/samples/plugins/wysiwygarea/fullpage.html create mode 100644 plugins/ckeditor_simple/samples/readonly.html create mode 100644 plugins/ckeditor_simple/samples/replacebyclass.html create mode 100644 plugins/ckeditor_simple/samples/replacebycode.html create mode 100644 plugins/ckeditor_simple/samples/sample.css create mode 100644 plugins/ckeditor_simple/samples/sample.js create mode 100644 plugins/ckeditor_simple/samples/sample_posteddata.php create mode 100644 plugins/ckeditor_simple/samples/tabindex.html create mode 100644 plugins/ckeditor_simple/samples/uicolor.html create mode 100644 plugins/ckeditor_simple/samples/uilanguages.html create mode 100644 plugins/ckeditor_simple/samples/xhtmlstyle.html create mode 100644 plugins/ckeditor_simple/skins/moono/dialog.css create mode 100644 plugins/ckeditor_simple/skins/moono/dialog_ie.css create mode 100644 plugins/ckeditor_simple/skins/moono/dialog_ie7.css create mode 100644 plugins/ckeditor_simple/skins/moono/dialog_ie8.css create mode 100644 plugins/ckeditor_simple/skins/moono/dialog_iequirks.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor_gecko.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor_ie.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor_ie7.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor_ie8.css create mode 100644 plugins/ckeditor_simple/skins/moono/editor_iequirks.css create mode 100644 plugins/ckeditor_simple/skins/moono/icons.png create mode 100644 plugins/ckeditor_simple/skins/moono/icons_hidpi.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/arrow.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/close.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/hidpi/close.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/hidpi/lock-open.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/hidpi/lock.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/hidpi/refresh.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/lock-open.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/lock.png create mode 100644 plugins/ckeditor_simple/skins/moono/images/refresh.png create mode 100644 plugins/ckeditor_simple/skins/moono/readme.md create mode 100644 plugins/ckeditor_simple/styles.js create mode 100644 plugins/disqus/_plugin.php create mode 100644 plugins/disqus/info.json create mode 100644 plugins/facebook-comments/_plugin.php create mode 100644 plugins/facebook-comments/info.json create mode 100644 plugins/facebook-root/_plugin.php create mode 100644 plugins/facebook-root/info.json create mode 100644 plugins/facebook-share/_plugin.php create mode 100644 plugins/facebook-share/info.json create mode 100644 plugins/filtr_stat/_plugin.php create mode 100644 plugins/filtr_stat/info.json create mode 100644 plugins/friendurl-jquery/_plugin.php create mode 100644 plugins/friendurl-jquery/info.json create mode 100644 plugins/friendurl-jquery/jquery.friendurl.min.js create mode 100644 plugins/galleria-io/_plugin.php create mode 100644 plugins/galleria-io/galleria.min.js create mode 100644 plugins/galleria-io/info.json create mode 100644 plugins/galleria-io/themes/classic/classic-loader.gif create mode 100644 plugins/galleria-io/themes/classic/classic-map.png create mode 100644 plugins/galleria-io/themes/classic/galleria.classic.css create mode 100644 plugins/galleria-io/themes/classic/galleria.classic.min.js create mode 100644 plugins/index.html create mode 100644 plugins/twitter-root/_plugin.php create mode 100644 plugins/twitter-root/info.json create mode 100644 plugins/twitter-tweet/_plugin.php create mode 100644 plugins/twitter-tweet/info.json create mode 100644 themes/default/default.css create mode 100644 themes/default/font/typicons.eot create mode 100644 themes/default/font/typicons.min.css create mode 100644 themes/default/font/typicons.svg create mode 100644 themes/default/font/typicons.ttf create mode 100644 themes/default/font/typicons.woff create mode 100644 themes/default/footer.php create mode 100644 themes/default/header.php create mode 100644 themes/default/img/stripe.png create mode 100644 themes/default/template.php create mode 100644 themes/default/theme.js create mode 100644 themes/index.html create mode 100644 themes/murkyhellyeah/components/entries.php create mode 100644 themes/murkyhellyeah/components/entry.php create mode 100644 themes/murkyhellyeah/components/page.php create mode 100644 themes/murkyhellyeah/components/profile.php create mode 100644 themes/murkyhellyeah/components/tag.php create mode 100644 themes/murkyhellyeah/font/typicons.eot create mode 100644 themes/murkyhellyeah/font/typicons.min.css create mode 100644 themes/murkyhellyeah/font/typicons.svg create mode 100644 themes/murkyhellyeah/font/typicons.ttf create mode 100644 themes/murkyhellyeah/font/typicons.woff create mode 100644 themes/murkyhellyeah/images/arrowDown.svg create mode 100644 themes/murkyhellyeah/images/dango.jpg create mode 100644 themes/murkyhellyeah/images/img01.jpg create mode 100644 themes/murkyhellyeah/images/img02.jpg create mode 100644 themes/murkyhellyeah/images/img03.png create mode 100644 themes/murkyhellyeah/images/img04.jpg create mode 100644 themes/murkyhellyeah/images/img05.jpg create mode 100644 themes/murkyhellyeah/images/lightstripe.png create mode 100644 themes/murkyhellyeah/images/material-flatc.jpg create mode 100644 themes/murkyhellyeah/images/moto360-filter.jpg create mode 100644 themes/murkyhellyeah/images/moto360.jpg create mode 100644 themes/murkyhellyeah/images/record.jpg create mode 100644 themes/murkyhellyeah/images/trollface.png create mode 100644 themes/murkyhellyeah/style.css create mode 100644 themes/murkyhellyeah/template.php create mode 100644 themes/murkyhellyeah/theme.js create mode 100644 themes/murkymodern/components/entries.php create mode 100644 themes/murkymodern/components/entry.php create mode 100644 themes/murkymodern/components/page.php create mode 100644 themes/murkymodern/components/profile.php create mode 100644 themes/murkymodern/components/tag.php create mode 100644 themes/murkymodern/font/typicons.eot create mode 100644 themes/murkymodern/font/typicons.min.css create mode 100644 themes/murkymodern/font/typicons.svg create mode 100644 themes/murkymodern/font/typicons.ttf create mode 100644 themes/murkymodern/font/typicons.woff create mode 100644 themes/murkymodern/images/arrowDown.svg create mode 100644 themes/murkymodern/images/dango.jpg create mode 100644 themes/murkymodern/images/img01.jpg create mode 100644 themes/murkymodern/images/img02.jpg create mode 100644 themes/murkymodern/images/img03.png create mode 100644 themes/murkymodern/images/img04.jpg create mode 100644 themes/murkymodern/images/img05.jpg create mode 100644 themes/murkymodern/images/lightstripe.png create mode 100644 themes/murkymodern/images/moto360-filter.jpg create mode 100644 themes/murkymodern/images/moto360.jpg create mode 100644 themes/murkymodern/images/record.jpg create mode 100644 themes/murkymodern/images/trollface.png create mode 100644 themes/murkymodern/style.css create mode 100644 themes/murkymodern/template.php create mode 100644 themes/murkymodern/theme.js create mode 100644 themes/murkystairwell/components/entries.php create mode 100644 themes/murkystairwell/components/entry.php create mode 100644 themes/murkystairwell/components/page.php create mode 100644 themes/murkystairwell/components/profile.php create mode 100644 themes/murkystairwell/components/tag.php create mode 100644 themes/murkystairwell/font/typicons.eot create mode 100644 themes/murkystairwell/font/typicons.min.css create mode 100644 themes/murkystairwell/font/typicons.svg create mode 100644 themes/murkystairwell/font/typicons.ttf create mode 100644 themes/murkystairwell/font/typicons.woff create mode 100644 themes/murkystairwell/footer.php create mode 100644 themes/murkystairwell/header.php create mode 100644 themes/murkystairwell/images/dango.jpg create mode 100644 themes/murkystairwell/images/img01.jpg create mode 100644 themes/murkystairwell/images/img02.jpg create mode 100644 themes/murkystairwell/images/img03.png create mode 100644 themes/murkystairwell/images/img04.jpg create mode 100644 themes/murkystairwell/images/img05.jpg create mode 100644 themes/murkystairwell/images/lightstripe.png create mode 100644 themes/murkystairwell/images/trollface.png create mode 100644 themes/murkystairwell/style.css create mode 100644 themes/murkystairwell/template.php create mode 100644 themes/murkystairwell/theme.js create mode 100644 themes/wooden/components/entries.php create mode 100644 themes/wooden/components/entry.php create mode 100644 themes/wooden/components/page.php create mode 100644 themes/wooden/components/profile.php create mode 100644 themes/wooden/components/tag.php create mode 100644 themes/wooden/default.css create mode 100644 themes/wooden/font/typicons.eot create mode 100644 themes/wooden/font/typicons.min.css create mode 100644 themes/wooden/font/typicons.svg create mode 100644 themes/wooden/font/typicons.ttf create mode 100644 themes/wooden/font/typicons.woff create mode 100644 themes/wooden/footer.php create mode 100644 themes/wooden/header.php create mode 100644 themes/wooden/images/dango.jpg create mode 100644 themes/wooden/images/darkwood.jpg create mode 100644 themes/wooden/images/img01.jpg create mode 100644 themes/wooden/images/img02.jpg create mode 100644 themes/wooden/images/img03.png create mode 100644 themes/wooden/images/img04.jpg create mode 100644 themes/wooden/images/img05.jpg create mode 100644 themes/wooden/images/trollface.png create mode 100644 themes/wooden/style.css create mode 100644 themes/wooden/template.php create mode 100644 themes/wooden/theme.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6ea5ef47a052eaa8218a376c9960cf6fd5e5ce7d GIT binary patch literal 10244 zcmeI1TWl0n7{|YVDX>dNI^`m;(Ci{|uTm~eDF)cyKmvqHOD|B_&hCtK!gOZcnQf6; z?VGoN(fB}&njj$FpA@{j5loE4CkYYb?ZKG%q7NG7!3V!HXSV4DUJNlLp0hdUJGbwf zlmGm7Cg%(hp{Z!DCrS}fjI*%1#>GvN7#Dd;DvNrivjzK8cF50X9WTr68&hVh4yAxn zKq;UUPzopo?gRz+oh?$VLRwWS1(X6xfiVTd^C87q*mPt^r41h)T!dQyw&mO%Ca&wE z!ZsDzbYw@R@7cU#`$28(b(BpjpFU$|EIzA3{Pe0>54ZPwL+ybP6#XWn za42lqrj?EAZAQ>vs&{yvGgddUowhZU(dRXLZeZB1RT$^m+hx0^H`L@6UDNMvm+`u6 zGw9Fg^Vkd$%ti*q-ZmS_PkNMz8c4qFp)9jqYt%&U1{Y|2pgLEkF`&0(-^o8!w_ zdeOJ`TO8CLv|2c{uOt5U>;+3w%h#;iw0Y~*O1)~%+67_h2P6OV^p3l}A{UXw%a^-SSs>L14BNcEyb;*c0=E?8Weu~_J^ z^qz#);q%&cBbvBkrKWWpW&U+P3c9vNOB`^FtmWutT)Ne+*AiWWQa*im)LA!AOLXVF zfdO8$AN4hCNhA)7%kDA!U|-&Hc}br~*WSiU>Jej&rYRN_TUO$KS$dVMj_XOwo;bgo zt7!wZ&>rfe0u9p%Iz^}H1G+#L=@MO`YxFJsOuy3a^e6pAHvr6rjw;N-Vywg}ti}e^ zqXAp+09vpMyRip*(TQFhMh1Pb@hE%*DB=k`g{SchUc_mf!C9Qc`}hbS;}d*}%lH!4 z@Pk}bS?M3VQ?^Sbe&pJue=xHeolBOzbaPgdJ9a);x$6#Q_4;f{=={4Er0!jP|HjQ* zo5t>Y2;_LsLb@bAAyy@9CQ&hg+N;d*;w9Bu@&I#a9lI6$`bbfa?Hno=GAo)D zE0P*N>Bn*TFG>A^zM`+`C;Ekcqd(|xRA3>NGN1P`o7>UIWVT`l_TeGyM|;R-9}Hx1 z6a(;(XGV|XaVGRhj549m;RH_Nd7Q$_cm=QGHJry=cn9y|JzT)WklIVQf~)vWvN=ZV z?h>og;(N9;`2E{Y77cJ#ZyXBWI1^=3Ev0}`Kq;UUPzopoZifQXWRR3N|8KqZ_y5~* zDHTI0pcJ@66+n4QdrK29uC%3|yiRe}p5olcStK!URNBymiwPeBxFL??!)+Rm)p9*d hTu+M%+fiw`#_2!*7{KS66VIyD{$K6?|6lw6e*k9?GS&b9 literal 0 HcmV?d00001 diff --git a/api.php b/api.php new file mode 100644 index 0000000..91b0b23 --- /dev/null +++ b/api.php @@ -0,0 +1,25 @@ +entries) +{ + while ($data = $blog->entries()) + array_push($entries, array('entryTitle'=>$data['entryTitle'], 'entrySlug'=>$data['entrySlug'], 'entryPublished'=>show_date($data['entryPublished']), 'entryContent'=>entry_show_init($data['entryContent'], $data['entrySlug'], true))); + /*echo "
+
+

$data[entryTitle]

+

$data[publicName]".get_entry_admin($data)."

+
+
".entry_show_init($data['entryContent'], $data['entrySlug'])."
+
\n";*/ +} + +echo json_encode($entries); + +?> \ No newline at end of file diff --git a/config.php b/config.php new file mode 100644 index 0000000..f9ec316 --- /dev/null +++ b/config.php @@ -0,0 +1,11 @@ +Insanely

So bad...

'.$err.(isset($errno) ? ' ('.$errno.')' : '').'

'); +} +set_error_handler('nice_error'); + +// LOAD CONFIG +require_once 'config.php'; + +// FEEDBACK +$info = array(); +$error = array(); + +// SEO +if (isset($_GET['pathsec'])) +{ + $seo = explode('/', $_GET['pathsec']); + foreach ($seo AS $a=>$b) + $seo[$a] = htmlspecialchars($b); +} else + $seo = array(''); + +// DATABASE +$_sql = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME) or nice_error('Sorry, but we cant connect to the database server right now.'); +$_sql->query("SET NAMES ".DBCHAR); +$_sql->query("SET CHARACTER SET ".DBCHAR); + +// LANGUAGE +$_locale = (array)json_decode(file_get_contents('includes/locale/hu_HU.lng')); + +// OTHER CLEVER STUFFS +function clear_cache() { header("Cache-Control: no-cache, must-revalidate"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); } + +function redirect($url = '/', $status = false) { header('Location: '.$url.($status ? '?status='.$status : '')); exit; } +function isnum($in) { return is_numeric($in); } +function sqlprot($in) { global $_sql; return $_sql->real_escape_string($in); } + +function trimlink($in, $length = 140) { $in = html_entity_decode(strip_tags($in)); if (strlen($in) > $length) return substr($in, 0, $length-3).'...'; return $in; } + +$set = $_sql->query("SELECT * FROM settings"); +while ($data = $set->fetch_assoc()) + $_set[$data['variable']] = $data['value']; + + +// CLASSES +require_once 'includes/user.class.php'; +require_once 'includes/blog.class.php'; +require_once 'includes/page.class.php'; +require_once 'includes/check.class.php'; +require_once 'includes/comment.class.php'; + + +// FUNCTIONS +function get_page_link($slug, $p = false) { global $_set; $prefix = ($p ? $_set['url'] : ''); if ($_set['seo']) return $prefix."/$_set[subPage]/$slug"; return $prefix."/?pathsec=$_set[subPage]/$slug"; } +function get_entry_link($slug, $p = false, $admin = false) { global $_set; $prefix = ($p ? $_set['url'] : '').($admin ? '/admin' : null); if ($_set['seo']) return $prefix."/$_set[subEntry]/$slug"; return $prefix."/?pathsec=$_set[subEntry]/$slug"; } +function get_profile_link($slug = false, $p = false) { global $_set; $prefix = ($p ? $_set['url'] : ''); if (!$slug) { global $user; if (LOGGEDIN) $slug = $user['userName']; else $slug = ''; } if ($_set['seo']) return $prefix."/$_set[subProfile]/$slug"; return $prefix."/?pathsec=$_set[subProfile]/$slug"; } +function get_profile_picture($userData = false, $p = false) { global $_set; $prefix = ($p ? $_set['url'] : ''); if (!$userData) if (LOGGEDIN) { global $user; $userData = $user;} else $userData = array('userPic'=>0); return $prefix.($userData['userPic'] ? "/data/profile_pics/$userData[userId].jpg" : '/data/imgs/'.$_set['defaultProfilePic']); } +function get_current_link($p = false) { global $_set, $seo; $prefix = ($p ? $_set['url'] : ''); $link = ''; for ($i = 0; $i < sizeof($seo); $i++) $link .= '/'.$seo[$i]; return $prefix.($_set['seo'] ? $link : '/?pathsec='.$link); } + +function get_theme_lib() { global $_set; if (file_exists('themes/'.$_set['mainTheme'])) return 'themes/'.$_set['mainTheme']; return false; } +function get_theme() +{ + global $_set; + if (file_exists('themes/'.$_set['mainTheme'].'/template.php')) + return 'themes/'.$_set['mainTheme'].'/template.php'; + return false; +} +function get_site_link() { global $_set; return $_set['url']; } +function get_site_body() { global $output; return output_replacer($output); } + +function get_navigation($append = '') +{ + global $_locale, $_sql, $seo, $_title; + $navLinks = array(); + if ($seo[0] && isset($_title[0])) array_push($navLinks, array('link' => '/', 'title' => $_locale['home'])); + $navQuery = $_sql->query("SELECT pageSlug, pageTitle FROM pages ORDER BY pageTitle ASC"); + while ($navData = $navQuery->fetch_assoc()) + array_push($navLinks, array('link' => get_page_link($navData['pageSlug']), 'title' => $navData['pageTitle'])); + + for ($i = 0; $i < sizeof($navLinks); $i++) + { + $link = explode('/', $navLinks[$i]['link']); + for ($b = 1; $b < sizeof($link); $b++) + { + $active = true; + if (isset($seo[$b-1]) && $seo[$b-1] == $link[$b] && $active) + $active = true; else $active = false; + } + echo "
  • ".$navLinks[$i]['title']."
  • "; + } +} +function get_tags($append = '') +{ + global $_sql; + $tags = $_sql->query("SELECT tagId, tagName, COUNT(taggedId) AS taggedposts FROM tagged INNER JOIN tags ON tagId = taggedTag GROUP BY tagId ORDER BY tagName ASC"); + if ($tags->num_rows) + { + while ($data = $tags->fetch_assoc()) + echo "
  • $data[tagName] $data[taggedposts]
  • "; + } +} + +function get_entry_admin($d) +{ + global $user; + if (!LOGGEDIN) return ''; + + if ($user['userLevel'] > 3) return "".($d['entryPinned'] ? "{locale:unpin}":"{locale:pin}")."{locale:edit}{locale:delete}"; + if ($user['userLevel'] > 2 && $d['entryBy'] == $user['userId']) return "{locale:edit}"; +} + +function get_page_title() +{ + global $_title, $_set; + if (!empty($_title)) + { + $title2 = ''; + for ($i=sizeof($_title)-1; $i>=0; $i--) + $title2 .= $_title[$i].', '; + + $trepf = array('{title}', '{page}'); + $trept = array($_set['title'], rtrim($title2, ', ')); + echo str_replace($trepf, $trept, ($_set['titleFormat'] ? $_set['titleFormat'] : '{page} | {title}')); + } else + echo $_set['title']; +} +function get_page_extra_head() +{ + global $_head, $metaimage, $_set; + if (!empty($_head)) + { + for ($i=0; $i'."\n"; + if ($metaimage) + { + if (!strpos($metaimage, 'http')) $metaimage = $_set['url'].$metaimage; + echo ''."\n"; + echo ''; + } +} + +function get_page_extra_body() +{ + global $_body, $_set; + if (!empty($_body)) + for ($i=0; $i"; + for($i=0; $i$error[$i]"; + echo ""; + } +} + +function get_infos() +{ + global $info; + if (!empty($info)) + { + echo "
    "; + for($i=0; $i$info[$i]"; + echo "
    "; + } +} + +function set_pin($pin) { global $_SESSION; $_SESSION['entry_pin'] = $pin; } +function get_pin() { global $_SESSION; return isset($_SESSION['entry_pin']) ? $_SESSION['entry_pin'] : false; } + +function theme_component($comp) { + $cf = get_theme_lib().'/components/'.$comp.'.php'; + if (file_exists($cf)) + return $cf; + return false; +} + +function show_date($ts) { global $_set; return (!(int)date('Hi', $ts) ? date($_set['dateformatShort'], $ts) : date($_set['dateformat'], $ts)); } + +$_title = array(); +function addTitle($add) { global $_title; array_push($_title, htmlentities($add)); } + +$_head = array(); +$head_registered = array(); +function addHead($add, $register = false) { global $_head, $head_registered; if (($register && !in_array($register, $head_registered)) || !$register) array_push($_head, $add); } + +$_body = array(); +$body_registered = array(); +function addBody($add, $register = false) { global $_body, $body_registered; if (($register && !in_array($register, $body_registered)) || !$register) array_push($_body, $add); } + +$description = false; +function addDescription($add) { global $description; if (!$description) $description = ''; $description .= str_replace(array('"', '\'', "\n", "\r\n", '<', '>'), '', strip_tags($add)).' '; } + +function keywords() { global $description, $_set; $keywords = explode(' ', str_replace(array(',','?','.','!'), ' ', ($description ? $description : $_set['description']))); foreach($keywords AS $a => $b) { $val = trim($b); if (strlen($val) > 3) $keywords[$a] = $val; else unset($keywords[$a]); } return implode(',', array_unique($keywords)); } + +$metaimage = false; +function addImage($add) { global $metaimage; $metaimage = $add; } + +$headerimg = false; +function headerImage($url) { global $headerimg; if (strlen($url) > 3) $headerimg = $url; } + +/* POST FUCKER */ +function entry_replacer($in) +{ + global $_locale; + $pattern[] = '#\[music=(.*?)\]#'; + $replace[] = ''; + + $pattern[] = '#\[youtube=(.*?)\]#'; + $replace[] = ''; + + $pattern[] = '#\[spoiler\](.*?)\[/spoiler\]#'; + $replace[] = '
    '; + + $pattern[] = '#\[spoiler=(.*?)\](.*?)\[/spoiler\]#'; + $replace[] = '
    '; + + + return preg_replace($pattern, $replace, $in); +} + +function entry_show_init($in, $slug, $flink = false) +{ + global $_locale; + + $in = entry_replacer($in); + + $search = array('@]*?>.*?@si', // Strip out javascript + '@]*?>.*?@siU', // Strip style tags properly + '@@' // Strip multi-line comments including CDATA + ); + $in = preg_replace($search, '', $in); + + $in2 = explode('[[MORE]]', $in); + if (isset($in2[1]) && strlen(trim($in2[1]))) + return $in2[0]."\n

    $_locale[entry_read_more]

    \n"; + return $in; +} + +function entry_show_all($in) { return str_replace('[[MORE]]', '', entry_replacer($in)); } + + +/* OUTPUT FUCKER */ +function regexp_locale($a) +{ + global $_locale; + if (isset($_locale[$a[1]])) + return $_locale[$a[1]]; + return $a[0]; +} +function output_replacer($in) +{ + return preg_replace_callback('#\{locale:([a-zA-Z\-\_]+?)\}#', 'regexp_locale', $in); +} + + +/* LOGIN SYSTEM */ +if (isset($_COOKIE['filtr_token'])) +{ + require_once 'includes/filtr.class.php'; + + $filtr = new filtrLogin(); + $filtr->cache = '/tmp/'; + $filtr->setAppid($_set['filtr_appid']); + $filtr->setApptoken($_set['filtr_apptoken']); + $filtr->setToken($_COOKIE['filtr_token']); + $filtr->Login(); + + if ($filtr->status()) + { + $filtr = $filtr->getData(); + $user = new user($filtr['link'], $filtr); + if ($user) + { + $user = $user->data; + define('LOGGEDIN', true); + } + unset($filtr); + } +} + +if (isset($_GET['logout'])) +{ + setcookie('filtr_token', '', null, '/'); + redirect(); +} + +if (!defined('LOGGEDIN')) + define('LOGGEDIN', false); diff --git a/data/.DS_Store b/data/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9d3ac521c45813db101660ae0dd32579669aa7fb GIT binary patch literal 8196 zcmeI1&2G~`5XWbmK;4#u5g;mY*(*{G;iC$@nNW^Mk%C$wih_*|S;@p!>=2-D67LVMBUljR~A1C`Jn~%bacZx|Jn@Ki37J7JKCTTJ6 z7qdxP9S+^+9hkHpkHSlXY4!r4gLsndo6006H}%V4gRfC|d9m2JzT45ac9$K!==HiC zee*_dxeQ+i!Ii5!x9>eDm#^NuefR#u$4{TXI0VW+M(DyXNWP+dj!K$RK~KRYr;J8u z8+syqz=rv>sK$ONWw%%w>omju$gy8yN@b7uJ%am7!^JsnUmaK**MC;$F`YTr*576L-x&l6DXz2ROT>$szNbwSRxHOgZYHlEiwwIQf%Iu7N0 dg2#{kFodstU*xrMiV>K+2v`hK34y;#;0M=LRoMUl literal 0 HcmV?d00001 diff --git a/data/imglist.json.php b/data/imglist.json.php new file mode 100644 index 0000000..5bb440f --- /dev/null +++ b/data/imglist.json.php @@ -0,0 +1,69 @@ +cropThumbnailImage(260, 260); + $cthumb->writeImage($thumb); + $cthumb->destroy(); + } + + // ADD TO LIST + array_push($images, array( + 'image' => $outdir.rawurlencode($stuffs[$i]), + 'thumb' => $outdir.'thumb.'.$stuffs[$i], + 'folder' => ltrim($dir, './') + )); + } + } +} + +imagelist('./uploads'); +foreach(glob('./uploads/*', GLOB_ONLYDIR) as $dir) + imagelist($dir); + +echo str_replace('\/', '/', json_encode($images)); \ No newline at end of file diff --git a/data/imgs/coding_in_progress.jpg b/data/imgs/coding_in_progress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..425eb1f234481007270def3187a350629db3184b GIT binary patch literal 51556 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 Nfa*bPrVvI3YXHjL5YGSr literal 0 HcmV?d00001 diff --git a/data/imgs/thumb.coding_in_progress.jpg b/data/imgs/thumb.coding_in_progress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2d349dab5ad876d220400df9d826441cab2c5605 GIT binary patch literal 13948 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 i(I-YS={|^`_I7nD%c!-#&xX9S( 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 E1NqmwoB#j- literal 0 HcmV?d00001 diff --git a/data/imgs/zuko_default.jpg b/data/imgs/zuko_default.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27725e7b76ea6ebc934165a9a82964a96c50d09d GIT binary patch literal 16593 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 literal 0 HcmV?d00001 diff --git a/data/index.html b/data/index.html new file mode 100644 index 0000000..e69de29 diff --git a/data/profile_pics/.DS_Store b/data/profile_pics/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0O zMk_j7KMD}uRpc4DCONBy`;b}UTTGqr_^$rBW(&<=OM0JqX6gA}*CkHAGp^;Asxz)j poP08hr)L(+$`I$;_uOe`T;DP7kx}SB-2aJwa|g*z4cEFLy8^k8l$8Jg literal 0 HcmV?d00001 diff --git a/includes/admin/dashboard.php b/includes/admin/dashboard.php new file mode 100644 index 0000000..dc812c6 --- /dev/null +++ b/includes/admin/dashboard.php @@ -0,0 +1,7 @@ +

    {locale:dashboard}

    + +
    \ No newline at end of file diff --git a/includes/admin/entry.php b/includes/admin/entry.php new file mode 100644 index 0000000..f6f3c18 --- /dev/null +++ b/includes/admin/entry.php @@ -0,0 +1,149 @@ + 2) +{ + + if (isset($_POST['entryAdd'])) + { + if (blog::add($_POST['entryHeader'], $_POST['entryTitle'], $_POST['entrySlug'], $_POST['entryContent'], $_POST['entryPublished'], (isset($_POST['entryHidden']) ? true : false), $_POST['entryPIN'])) + redirect(get_entry_link($_POST['entrySlug']), 'added'); + else + array_push($error, $_locale['entry_not_added']); + } elseif (isset($_POST['entryUpdate'])) + { + if (blog::update($_POST['entryUpdate'], $_POST['entryHeader'], $_POST['entryTitle'], $_POST['entryContent'], $_POST['entryPublished'], (isset($_POST['entryHidden']) ? true : false), $_POST['entryPIN'])) + redirect(get_current_link(), 'updated'); + else + array_push($error, $_locale['entry_not_updated']); + } + +} + +if (isset($_POST['entryTag']) && $user['userLevel'] > 2) +{ + if (isset($_POST['tagIdRemove'])) + { + if (blog::tagRemove($_POST['tagIdRemove'], $_POST['entryId'])) + array_push($info, $_locale['entry_tag_removed']); + else + array_push($error, $_locale['entry_tag_not_removed']); + } elseif (blog::tag($_POST['tagId'], $_POST['entryId'])) + array_push($info, $_locale['entry_tag_added']); + else + array_push($error, $_locale['entry_tag_not_added']); +} + +if (isset($seo[2]) && $user['userLevel'] > 2) +{ + $entry = new blog($seo[2]); + if ($entry->entries) + { + $entryData = $entry->entry(); + if (isset($seo[3]) && $user['userLevel'] > 3) + switch ($seo[3]) + { + case 'delete': + if ($entry->delete($entryData['entryId'])) + redirect('/admin/entry'); + else + array_push($error, $_locale['entry_not_deleted']); + break; + + case 'pin': + if ($entry->pin($entryData['entryId'])) + redirect(); + else + array_push($error, $_locale['entry_not_pinned']); + break; + + case 'unpin': + if ($entry->unpin($entryData['entryId'])) + redirect(); + else + array_push($error, $_locale['entry_not_unpinned']); + break; + } + } +} else +{ + $timedQuery = $_sql->query("SELECT entrySlug, entryTitle, entryCreated, entryPublished FROM entries WHERE entryPublished > ".time().""); + if ($timedQuery->num_rows) + { + echo "

    {locale:timed_entries}

    "; + echo ""; + while ($data = $timedQuery->fetch_assoc()) + echo ""; + echo "
    {locale:entry_title}{locale:created_on}{locale:timed_pub_date}
    $data[entryTitle]".show_date($data['entryCreated'])."".show_date($data['entryPublished'])."
    "; + } + + $hiddenQuery = $_sql->query("SELECT entrySlug, entryTitle, entryCreated, entryPublished FROM entries WHERE entryHidden IS NOT NULL"); + if ($hiddenQuery->num_rows) + { + echo "

    {locale:hidden_entries}

    "; + echo ""; + while ($data = $hiddenQuery->fetch_assoc()) + echo ""; + echo "
    {locale:entry_title}{locale:created_on}{locale:timed_pub_date}
    $data[entryTitle]".show_date($data['entryCreated'])."".show_date($data['entryPublished'])."
    "; + } +} +?> +

    {locale:entry_editor}

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + +query("SELECT * FROM tags"); + if ($tags->num_rows) + { + echo "

    {locale:tags}

    "; + echo "" + ."" + ."" + .""; + + while ($tag = $tags->fetch_assoc()) + echo ""; + + echo "" + ."
    {locale:tag_name}{locale:add}
    $tag[tagName]".($_sql->query("SELECT taggedId FROM tagged WHERE taggedEntry = $entryData[entryId] AND taggedTag = $tag[tagId]")->num_rows ? "":"")."
    "; + } +} +?> + + diff --git a/includes/admin/main.php b/includes/admin/main.php new file mode 100644 index 0000000..8ac2b77 --- /dev/null +++ b/includes/admin/main.php @@ -0,0 +1,36 @@ + 3) +{ + $page = new page($_POST['pageSlug']); + if (isset($_POST['pageAdd'])) + { + if ($page->create($_POST['pageTitle'], $_POST['pageContent'])) + array_push($info, $_locale['page_added']); + else + array_push($error, $_locale['page_not_added']); + } elseif (isset($_POST['pageUpdate'])) + { + if ($page->update($_POST['pageTitle'], $_POST['pageContent'])) + array_push($info, $_locale['page_updated']); + else + array_push($error, $_locale['page_not_updated']); + } + +} + +if (isset($seo[2])) + $page = new page($seo[2]); +else +{ + $pagesQuery = $_sql->query("SELECT pageSlug, pageTitle FROM pages"); + if ($pagesQuery->num_rows) + { + echo "

    {locale:pages}

    "; + echo ""; + while ($data = $pagesQuery->fetch_assoc()) + echo ""; + echo "
    {locale:page_title}
    $data[pageTitle]
    "; + } +} +?> +

    {locale:page_editor}

    +
    + +data)) : addTitle($page->data['pageTitle']); ?> + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/includes/admin/plugins.php b/includes/admin/plugins.php new file mode 100644 index 0000000..1f09e78 --- /dev/null +++ b/includes/admin/plugins.php @@ -0,0 +1,51 @@ +query("UPDATE plugins SET pluginStatus = ".(isset($_POST['pluginEnable']) ? 1 : 0)." WHERE pluginId = $_POST[pluginId]")) + redirect(get_current_link()); + else + array_push($error, $_locale['plugin_not_updated']); +} + +echo "

    $_locale[plugins]

    "; + +$pluginsQuery = $_sql->query("SELECT * FROM plugins ORDER BY pluginStatus DESC"); +$plugins = array(); +if ($pluginsQuery->num_rows) +{ + echo ""; + echo ""; + while ($data = $pluginsQuery->fetch_assoc()) + { + $pinfo = './plugins/'.$data['pluginLib'].'/info.json'; + if (file_exists($pinfo)) + { + $pinfo = (array)json_decode(file_get_contents($pinfo)); + + if ($data['pluginStatus']) + $button = ""; + else $button = ""; + + echo ""; + } + array_push($plugins, $data['pluginLib']); + } + echo "
    {locale:plugin_name}{locale:description}{locale:scope}{locale:status}
    $pinfo[name]$pinfo[description]$pinfo[paths]
    $button
    "; +} else + echo "

    $_locale[plugins_empty]

    "; + + +if ($handle = opendir('./plugins')) { + + while (false !== ($entry = readdir($handle))) + { + if (!in_array($entry, $plugins) && file_exists('./plugins/'.$entry.'/info.json')) + if ($_sql->query("INSERT INTO plugins (pluginLib, pluginStatus) VALUES ('$entry', 0)")) + array_push($info, $_locale['plugin_added'].$entry); + else + array_push($error, $_locale['plugin_not_added'].$entry); + } + + closedir($handle); +} \ No newline at end of file diff --git a/includes/admin/tags.php b/includes/admin/tags.php new file mode 100644 index 0000000..e69de29 diff --git a/includes/blog.class.php b/includes/blog.class.php new file mode 100644 index 0000000..ff58b9b --- /dev/null +++ b/includes/blog.class.php @@ -0,0 +1,124 @@ +perpage = $_set['entriesPerPage']; + if ($entry) + { + $this->query = $_sql->query("SELECT entries.*, users.userName AS userName, users.userPublicName AS publicName FROM entries INNER JOIN users ON userId = entryBy WHERE entrySlug = '".sqlprot($entry)."' LIMIT 1"); + if ($this->query->num_rows) + { + $this->entries = 1; + } + } else + { + $this->query = $_sql->query("SELECT entries.*, users.userName AS userName, users.userPublicName AS publicName FROM entries INNER JOIN users ON userId = entryBy WHERE entryHidden IS NULL AND entryPublished <= ".time()." ORDER BY entryPinned DESC, entryPublished DESC, entryId DESC LIMIT ".$this->perpage." OFFSET ".(($page-1) * $this->perpage).""); + $this->entries = $this->query->num_rows; + } + } + + public function entries() + { + if ($this->entries) + return $this->query->fetch_assoc(); + return false; + } + + public function entry() + { + if ($this->entries == 1) + return $this->query->fetch_assoc(); + return false; + } + + public static function update($id, $header, $title, $text, $pub, $hidden = false, $pin = false) + { + global $_sql; + + $header = sqlprot($header); + $title = sqlprot($title); + $text = sqlprot($text); + $published = strtotime($pub); if (!$published) $published = time(); + + if (is_numeric($id) && Check::url($header, true) && Check::title($title) && $_sql->query("UPDATE entries SET entryHeader = '$header', entryTitle = '$title', entryContent = '$text', entryPublished = $published, entryUpdated = ".time().", entryHidden = ".($hidden ? '1' : 'NULL').", entryPIN = ".($pin && is_numeric($pin) ? $pin : 'NULL')." WHERE entryId = $id")) + return true; + return false; + } + + public static function add($header, $title, $slug, $text, $pub, $hidden = false, $pin = false) + { + global $_sql, $user; + + $header = sqlprot($header); + $title = sqlprot($title); + $text = sqlprot($text); + $slug = sqlprot($slug); + $published = strtotime($pub); if (!$published) $published = time(); + if (Check::url($header, true) && Check::title($title) && Check::slug($slug) && $_sql->query("INSERT INTO entries (entryHeader, entryTitle, entrySlug, entryContent, entryBy, entryCreated, entryPublished, entryHidden, entryPIN) VALUES ('$header', '$title', '$slug', '$text', $user[userId], ".time().", $published, ".($hidden ? '1' : 'NULL').", ".($pin && is_numeric($pin) ? $pin : 'NULL').")")) + return true; + //die($text); + return false; + } + + public static function delete($id) + { + global $_sql; + + if (is_numeric($id) && $_sql->query("DELETE FROM entries WHERE entryId = $id")) + return true; + return false; + } + + public static function pin($id) + { + global $_sql; + + if (is_numeric($id) && $_sql->query("UPDATE entries SET entryPinned = 1 WHERE entryId = $id")) + return true; + return false; + } + + public static function unpin($id) + { + global $_sql; + + if (is_numeric($id) && $_sql->query("UPDATE entries SET entryPinned = NULL WHERE entryId = $id")) + return true; + return false; + } + + public static function tag($cid, $id) + { + if (!is_numeric($cid) || !is_numeric($id)) return false; + + global $_sql; + + if (!$_sql->query("SELECT * FROM tags WHERE tagId = $cid")->num_rows) return false; + if ($_sql->query("SELECT * FROM tagged WHERE taggedTag = $cid AND taggedEntry = $id")->num_rows) return false; + if ($_sql->query("INSERT INTO tagged (taggedTag, taggedEntry) VALUES ($cid, $id)")) return true; + + return false; + } + + public static function tagRemove($cid, $id) + { + if (!is_numeric($cid) || !is_numeric($id)) return false; + + global $_sql; + + if ($_sql->query("DELETE FROM tagged WHERE taggedTag = $cid AND taggedEntry = $id")) return true; + + return false; + } +} diff --git a/includes/check.class.php b/includes/check.class.php new file mode 100644 index 0000000..642aebe --- /dev/null +++ b/includes/check.class.php @@ -0,0 +1,65 @@ +20) + return true; + + return false; + } + + public static function domain($str) { + + if (filter_var(gethostbyname($str), FILTER_VALIDATE_IP)) + return true; + + return false; + } + + public static function title($title) { + if (strlen($title) > 0 && strlen($title) < 250) + return true; + return false; + } + + public static function slug($str) { + + if(preg_match('/^[a-zA-Z\d_\- ]{1,100}$/i', $str)) + return true; + + return false; + } + + public static function url($url, $lazy = false) { + if (($lazy && !$url) || !filter_var($url, FILTER_VALIDATE_URL) === false) return true; + return false; + } + +} \ No newline at end of file diff --git a/includes/comment.class.php b/includes/comment.class.php new file mode 100644 index 0000000..8c9137c --- /dev/null +++ b/includes/comment.class.php @@ -0,0 +1,45 @@ +id = $id; + } + + public function get_comments($check = false) + { + if (!$this->comments) + { + global $_sql; + $query = $_sql->query("SELECT `comments`.*, users.userName AS bySlug, users.userPublicName AS byName, users.userPic FROM `comments` INNER JOIN users ON commentBy = userId WHERE commentEntry = ".$this->id." AND commentReply = 0 ORDER BY commentTime DESC"); + if ($check) + return $query->num_rows; + else + $this->comments = $query; + } + return $this->comments->fetch_assoc(); + } + + public function get_replies($check = false) + { + if (!$this->replies) + { + global $_sql; + $query = $_sql->query("SELECT `comments`.*, users.userName AS bySlug, users.userPublicName AS byName, users.userPic FROM `comments` INNER JOIN users ON commentBy = userId WHERE commentReply = ".$this->id." ORDER BY commentTime DESC"); + if ($check) + return $query->num_rows; + $this->replies = $query; + } + return $this->replies->fetch_assoc(); + } + + + +} \ No newline at end of file diff --git a/includes/css/ui-lightness/images/animated-overlay.gif b/includes/css/ui-lightness/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/includes/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..83ac32b0c96261b00a336ef819add24100eeb9c5 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^8Xzpd1SErbK34)Mwj^(Nm;YeE8S(uNP=vFJ#Am<$En9-cLebC{re^wgoll|t(`&s7)9J{YxO^N-aI z$5L3jD^ISzl+wQbw$Cm(|Mhq4jH=@2wI8o7+Gd%b|IIx5*Zn&?>lgCSXrXO^WskXw=UX3LH%8!s;k z#x%*aEGp*Jjm(QM&8zq~)!)n5QqVsS=vUPe*NBpo#FA922>S z4={E+nQaGTRC&5MhIkx*d-b$ng949h;3{8svn*F5o}?c;Kir+G=xvlfb9Ucnx!LzV zKYw1UzcGecb6t~6xWlB=3a51)dX2qx%p0t(H?ll;Xvl-Ua7M6%M)vm*~w}RD4lnZuhbmcl2i$G2U9fNc+T-xj%reP%UwdC`m~y zNwrEYN(E93Mh1o^x(24Yh87`)mR6>wRzS9axs`!I#n#+MC>nC}Q!>*kackgwaWxL8 Ofx*+&&t;ucLK6Vo#%h!R literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/includes/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..dd32db4571d67cb38cbdc2aec84b3e4a866c4f65 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8T_6ujv*T7lM^IZ7dQL@YKdTAEH!H@2TG}yxJHzuB$lLFB^RXvDF!10 zLla#CQ(Z%g5JO8VQ&TG-+rZq)z@TDl?jsZpx%nxXX_dG&aK5-22h_me>FVdQ&MBb@ E05v-?umAu6 literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/includes/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..041c0b215b94e2eddd548a9e109282df4f2160e6 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!{KIr+qDZgOs>S*DCH8q6)|^lLQ8(vdyV&7=Rv!DK5_Nv5 zKU5EWSl#{5ocZwkn6~@klK(Ue|8%DOm~7JJCTPgP@M)6!J>`Xd0YEcVOI#yLQW8s2 zt&)pUffR$0fuV`6fvK*cMTnuLm8q$f0g!8MWnggcP+Ay@hTQy=%(P0}8rILh_X?nc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12SfLx;Tb-9DjS>o|}bBPw4YFRSXO})J!^(4ctv-3U*RGnKs-FC}~_uKa;v7+PAHnpznEx#m^|2KNr7g`sH3%}>cptHiBg{rr2cfEpM)UHx3v IIVCg!04dirwg3PC literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/includes/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ea8f7c06ed43a369361ae5776e760e578ceada GIT binary patch literal 5815 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 literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/includes/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5fa8238541a113df1e8c0b95aa32ba363ecbae GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?szyu^`+!HJTQfx`y?k@kqfHUIz9iRwjfk$L9 zkoEv$x0Bg+Kt`LVi(`n!`KJ>Mxef&gxX1@bahq-QJ@-iVjABv8k}dz1cpvckAS5Q| zCa~sgnvR`g{(^+B71o<|biO4QZ((@QU$9to$Nb3+c9+^q0~7AA&s1G7ldW;K1nZSx z%@1{}Sk7(ZdA*`2jO&K2|NFg5Zyr%7kiMO>_`pxASP`akpQ9dh^WXn}$^S9yv#0i* zg_~-mfG$!kag8WRNi0dVN-jzTQVd20h9P#rlwXvwt=~ofkDOA+(#%H ca`RI%(<*Um;Cyj44yb{_)78&qol`;+0KEBhq5uE@ literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-icons_222222_256x240.png b/includes/css/ui-lightness/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cb1170c8b3795835b8831ab81fa9ae63b606b1 GIT binary patch literal 6922 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 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/includes/css/ui-lightness/images/ui-icons_228ef1_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0140cff67999e0b6daf269723e019335f5fee6 GIT binary patch literal 4549 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 F{Rh^YY-Iod literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/includes/css/ui-lightness/images/ui-icons_ef8c08_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..036ee072d4aea1db3a78cbede62f8a0ba31972dc GIT binary patch literal 4549 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 C(P9<= literal 0 HcmV?d00001 diff --git a/includes/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/includes/css/ui-lightness/images/ui-icons_ffd27a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6c05868b55d63ff932afa2efbd9d7cedd5909a GIT binary patch literal 4549 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 [ APPLICATION IDENTIFIER ] ); + $filtr->setApptoken( [ APPLICATION TOKEN HASH ] ); + + $filtr->setToken( [ USER'S TOKEN GENERATED BY FILTR. APL.REDIRECT ] ); + + - Advanced + $filtr->DataStorage( [ WAT TO DO (read, write, erase) ], [ KEY (only for writing) ], [ VALUE (only for writing) ]); + $filtr->cache = '/tmp/[ YOUR PROJECTS CODENAME ]/filtrd/'; + + Comments: + The Filtr. API has a geniune and valid SSL certificate, but it slows down the process. + Use it only if your connection is not trusted! + We're logging EVERY requests, so you will be able to monitor every access and you will be able to limit the APP's access by IP. + + Public UNAME/PASSWD authentication NEVER GONNA HAPPEN! + + The specified cache must end with '/'. Automatic detection just slows down the process and generates unnecessary load. + + That's it! Have fun! + Don't forget to go out and become black. This is important! And cool! You'll be less awesome, but eh. + + Just do it! Tomorrow. +--------- */ + + +class filtrLogin +{ + /* User authentication */ + private $token; + + /* Filtr. authentication */ + private $appid; + private $apptoken; + private $apiurl = 'http://filtr.sandros.hu/api.php'; + + /* This holds the response from Filtr. */ + private $apiResponse; + + // Cache + public $cache; + public $cachetimeout = 60; + + /* Hey! :) */ + public function __construct($apiurl = false, $cache = false) { + if ($apiurl) + $this->apiurl = $apiurl; // Override the class-default API url with the given one + } + + /* Data collectors */ + public function setToken($token = 0) { $this->token = $token; } + public function setAppid($user = 0) { $this->appid = $user; } + public function setApptoken($key = 0) { $this->apptoken = $key; } + + /* Data storage */ + private $datastorage = array(); + public function DataStorage($todo, $key = false, $value = false) { + switch($todo) + { + case 'read': + $this->datastorage = array('data_storage'=>'read'); + break; + + case 'write': + $this->datastorage = array('data_storage'=>'write', 'data_storage_key'=>$key, 'data_storage_value'=>$value); + break; + + case 'erase': + $this->datastorage = array('data_storage'=>'erase'); + break; + } + if ($this->status()) + { + $this->Login(); + return (isset($this->apiResponse->data_storage) ? true : false); + } + return true; + } + + /* Nasty things */ + public function Login($timeout = 6) { + + // Caching + if ($this->cache && file_exists($this->cache.$this->token) && filemtime($this->cache.$this->token) > time()-$this->cachetimeout) + { + $this->apiResponse = json_decode(file_get_contents($this->cache.$this->token)); + return true; + } + + // Collect the auth infos + // ! This looks pretty bad. In the next release, there will be a JSON encoder. + $array = array_merge(array( + 'appid' => $this->appid, + 'apptoken' => $this->apptoken, + 'token' => $this->token, + ), $this->datastorage); + + // Convert to GET like string + $fields = ''; + foreach($array as $key=>$value) + $fields .= $key.'='.$value.'&'; + $fields = rtrim($fields, '&'); + + + // Connect options and set data + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->apiurl); + curl_setopt($ch, CURLOPT_POST, count($array)); + curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + // Free up some memory + unset($fields); + unset($array); + $this->datastorage = false; + + // Do what we need to + $rawResponse = curl_exec($ch); + $this->apiResponse = json_decode($rawResponse); + + // Basic cache + if ($this->cache) + { + $cache = fopen($this->cache.$this->token, 'w'); + fwrite($cache, $rawResponse); + fclose($cache); + unset($cache); + } + unset($rawResponse); + + // Close the connection to the login server + curl_close($ch); + unset($ch); + + // '1' means the response has came from the remote server + // Not relevant for this script, but you can build an advanced cache control for better performance. + return 1; + } + + // Logged in? + public function status() { + if (isset($this->apiResponse->status) && $this->apiResponse->status == 'ok') + return true; + return false; + } + + // Return user's data + // Array mode is the default, because this could cause serious problems if someone auto-updating this script. + public function getData($array = true) { + if ($array) + return (array)$this->apiResponse; + return $this->apiResponse; + } + +} + +?> \ No newline at end of file diff --git a/includes/index.html b/includes/index.html new file mode 100644 index 0000000..e69de29 diff --git a/includes/js/functions.js b/includes/js/functions.js new file mode 100644 index 0000000..d5446f1 --- /dev/null +++ b/includes/js/functions.js @@ -0,0 +1,10 @@ +function set_comment_reply(cid) +{ + $("form[name='new-comment'] input[name='entryReply']").val(cid); + $("#new-comment-reply span").html('Reply'); +} + +function spoilerToggle(selem) +{ + selem.parent().children(".spoiler_c").stop().slideToggle(); +} \ No newline at end of file diff --git a/includes/js/jquery-ui.custom.min.js b/includes/js/jquery-ui.custom.min.js new file mode 100644 index 0000000..5a5b461 --- /dev/null +++ b/includes/js/jquery-ui.custom.min.js @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.10.4 - 2014-05-22 +* http://jqueryui.com +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.sortable.js, jquery.ui.datepicker.js, jquery.ui.effect.js, jquery.ui.effect-shake.js +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e,t){function i(t,i){var s,a,o,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,a=s.name,t.href&&a&&"map"===s.nodeName.toLowerCase()?(o=e("img[usemap=#"+a+"]")[0],!!o&&n(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,a=e(this[0]);a.length&&a[0]!==document;){if(n=a.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(a.css("zIndex"),10),!isNaN(s)&&0!==s))return s;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===n?["Left","Right"]:["Top","Bottom"],o=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(o,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(o,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,a=e.ui[t].prototype;for(s in n)a.plugins[s]=a.plugins[s]||[],a.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix||i:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),1===arguments.length)return o[i]===e?null:o[i];o[i]=s}else{if(1===arguments.length)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})})(jQuery);(function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var a,o=Math.max,r=Math.abs,l=Math.round,h=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(a!==e)return a;var i,s,n=t("
    "),o=n.children()[0];return t("body").append(n),i=o.offsetWidth,n.css("overflow","scroll"),s=o.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),a=i-s},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widths?"left":i>0?"right":"center",vertical:0>a?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(l.horizontal="center"),d>g&&g>r(n+a)&&(l.vertical="middle"),l.important=o(r(i),r(s))>o(r(n),r(a))?"horizontal":"vertical",e.using.call(this,t,l)}),c.offset(t.extend(M,{using:h}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,a=n.offset.left+n.scrollLeft,o=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-o-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-o-a,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,a=n.offset.top+n.scrollTop,o=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-o-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-o-a,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,a,o=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(o?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(a in s)e.style[a]=s[a];e.appendChild(r),i=o||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()})(jQuery);(function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t(" ",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.leftthis.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})})(jQuery);(function(e,t){function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.dpDiv=a(e("
    "))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){e.datepicker._isDisabledDatepicker(n.inline?t.parent()[0]:n.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))})}function s(t,i){e.extend(t,i);for(var a in i)null==i[a]&&(t[a]=i[a]);return t}e.extend(e.ui,{datepicker:{version:"1.10.4"}});var n,r="datepicker";e.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return s(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var a,s,n;a=t.nodeName.toLowerCase(),s="div"===a||"span"===a,t.id||(this.uuid+=1,t.id="dp"+this.uuid),n=this._newInst(e(t),s),n.settings=e.extend({},i||{}),"input"===a?this._connectDatepicker(t,n):s&&this._inlineDatepicker(t,n)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("
    ")):this.dpDiv}},_connectDatepicker:function(t,i){var a=e(t);i.append=e([]),i.trigger=e([]),a.hasClass(this.markerClassName)||(this._attachments(a,i),a.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,r,i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var a,s,n,r=this._get(i,"appendText"),o=this._get(i,"isRTL");i.append&&i.append.remove(),r&&(i.append=e(""+r+""),t[o?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),a=this._get(i,"showOn"),("focus"===a||"both"===a)&&t.focus(this._showDatepicker),("button"===a||"both"===a)&&(s=this._get(i,"buttonText"),n=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("").addClass(this._triggerClass).attr({src:n,alt:s,title:s}):e("").addClass(this._triggerClass).html(n?e("").attr({src:n,alt:s,title:s}):s)),t[o?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,a,s,n=new Date(2009,11,20),r=this._get(e,"dateFormat");r.match(/[DM]/)&&(t=function(e){for(i=0,a=0,s=0;e.length>s;s++)e[s].length>i&&(i=e[s].length,a=s);return a},n.setMonth(t(this._get(e,r.match(/MM/)?"monthNames":"monthNamesShort"))),n.setDate(t(this._get(e,r.match(/DD/)?"dayNames":"dayNamesShort"))+20-n.getDay())),e.input.attr("size",this._formatDate(e,n).length)}},_inlineDatepicker:function(t,i){var a=e(t);a.hasClass(this.markerClassName)||(a.addClass(this.markerClassName).append(i.dpDiv),e.data(t,r,i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,a,n,o){var u,c,h,l,d,p=this._dialogInst;return p||(this.uuid+=1,u="dp"+this.uuid,this._dialogInput=e(""),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},e.data(this._dialogInput[0],r,p)),s(p.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(p,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(c=document.documentElement.clientWidth,h=document.documentElement.clientHeight,l=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[c/2-100+l,h/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=a,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],r,p),this},_destroyDatepicker:function(t){var i,a=e(t),s=e.data(t,r);a.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,r),"input"===i?(s.append.remove(),s.trigger.remove(),a.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&a.removeClass(this.markerClassName).empty())},_enableDatepicker:function(t){var i,a,s=e(t),n=e.data(t,r);s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,n.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(a=s.children("."+this._inlineClass),a.children().removeClass("ui-state-disabled"),a.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,a,s=e(t),n=e.data(t,r);s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,n.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(a=s.children("."+this._inlineClass),a.children().addClass("ui-state-disabled"),a.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,r)}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(i,a,n){var r,o,u,c,h=this._getInst(i);return 2===arguments.length&&"string"==typeof a?"defaults"===a?e.extend({},e.datepicker._defaults):h?"all"===a?e.extend({},h.settings):this._get(h,a):null:(r=a||{},"string"==typeof a&&(r={},r[a]=n),h&&(this._curInst===h&&this._hideDatepicker(),o=this._getDateDatepicker(i,!0),u=this._getMinMaxDate(h,"min"),c=this._getMinMaxDate(h,"max"),s(h.settings,r),null!==u&&r.dateFormat!==t&&r.minDate===t&&(h.settings.minDate=this._formatDate(h,u)),null!==c&&r.dateFormat!==t&&r.maxDate===t&&(h.settings.maxDate=this._formatDate(h,c)),"disabled"in r&&(r.disabled?this._disableDatepicker(i):this._enableDatepicker(i)),this._attachments(e(i),h),this._autoSize(h),this._setDate(h,o),this._updateAlternate(h),this._updateDatepicker(h)),t)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,a,s,n=e.datepicker._getInst(t.target),r=!0,o=n.dpDiv.is(".ui-datepicker-rtl");if(n._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),r=!1;break;case 13:return s=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",n.dpDiv),s[0]&&e.datepicker._selectDay(t.target,n.selectedMonth,n.selectedYear,s[0]),i=e.datepicker._get(n,"onSelect"),i?(a=e.datepicker._formatDate(n),i.apply(n.input?n.input[0]:null,[a,n])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(n,"stepBigMonths"):-e.datepicker._get(n,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(n,"stepBigMonths"):+e.datepicker._get(n,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),r=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),r=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,o?1:-1,"D"),r=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(n,"stepBigMonths"):-e.datepicker._get(n,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),r=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,o?-1:1,"D"),r=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(n,"stepBigMonths"):+e.datepicker._get(n,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),r=t.ctrlKey||t.metaKey;break;default:r=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):r=!1;r&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(i){var a,s,n=e.datepicker._getInst(i.target);return e.datepicker._get(n,"constrainInput")?(a=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==i.charCode?i.keyCode:i.charCode),i.ctrlKey||i.metaKey||" ">s||!a||a.indexOf(s)>-1):t},_doKeyUp:function(t){var i,a=e.datepicker._getInst(t.target);if(a.input.val()!==a.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,e.datepicker._getFormatConfig(a)),i&&(e.datepicker._setDateFromField(a),e.datepicker._updateAlternate(a),e.datepicker._updateDatepicker(a))}catch(s){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,a,n,r,o,u,c;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),a=e.datepicker._get(i,"beforeShow"),n=a?a.apply(t,[t,i]):{},n!==!1&&(s(i.settings,n),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),r=!1,e(t).parents().each(function(){return r|="fixed"===e(this).css("position"),!r}),o={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),o=e.datepicker._checkOffset(i,o,r),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":r?"fixed":"absolute",display:"none",left:o.left+"px",top:o.top+"px"}),i.inline||(u=e.datepicker._get(i,"showAnim"),c=e.datepicker._get(i,"duration"),i.dpDiv.zIndex(e(t).zIndex()+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[u]?i.dpDiv.show(u,e.datepicker._get(i,"showOptions"),c):i.dpDiv[u||"show"](u?c:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,n=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t),t.dpDiv.find("."+this._dayOverClass+" a").mouseover();var i,a=this._getNumberOfMonths(t),s=a[1],r=17;t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),s>1&&t.dpDiv.addClass("ui-datepicker-multi-"+s).css("width",r*s+"em"),t.dpDiv[(1!==a[0]||1!==a[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,a){var s=t.dpDiv.outerWidth(),n=t.dpDiv.outerHeight(),r=t.input?t.input.outerWidth():0,o=t.input?t.input.outerHeight():0,u=document.documentElement.clientWidth+(a?0:e(document).scrollLeft()),c=document.documentElement.clientHeight+(a?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?s-r:0,i.left-=a&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=a&&i.top===t.input.offset().top+o?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+s>u&&u>s?Math.abs(i.left+s-u):0),i.top-=Math.min(i.top,i.top+n>c&&c>n?Math.abs(n+o):0),i},_findPos:function(t){for(var i,a=this._getInst(t),s=this._get(a,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[s?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,a,s,n,o=this._curInst;!o||t&&o!==e.data(t,r)||this._datepickerShowing&&(i=this._get(o,"showAnim"),a=this._get(o,"duration"),s=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),a,s):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?a:null,s),i||s(),this._datepickerShowing=!1,n=this._get(o,"onClose"),n&&n.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),a=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==a)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,a){var s=e(t),n=this._getInst(s[0]);this._isDisabledDatepicker(s[0])||(this._adjustInstDate(n,i+("M"===a?this._get(n,"showCurrentAtPos"):0),a),this._updateDatepicker(n))},_gotoToday:function(t){var i,a=e(t),s=this._getInst(a[0]);this._get(s,"gotoCurrent")&&s.currentDay?(s.selectedDay=s.currentDay,s.drawMonth=s.selectedMonth=s.currentMonth,s.drawYear=s.selectedYear=s.currentYear):(i=new Date,s.selectedDay=i.getDate(),s.drawMonth=s.selectedMonth=i.getMonth(),s.drawYear=s.selectedYear=i.getFullYear()),this._notifyChange(s),this._adjustDate(a)},_selectMonthYear:function(t,i,a){var s=e(t),n=this._getInst(s[0]);n["selected"+("M"===a?"Month":"Year")]=n["draw"+("M"===a?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(n),this._adjustDate(s)},_selectDay:function(t,i,a,s){var n,r=e(t);e(s).hasClass(this._unselectableClass)||this._isDisabledDatepicker(r[0])||(n=this._getInst(r[0]),n.selectedDay=n.currentDay=e("a",s).html(),n.selectedMonth=n.currentMonth=i,n.selectedYear=n.currentYear=a,this._selectDate(t,this._formatDate(n,n.currentDay,n.currentMonth,n.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var a,s=e(t),n=this._getInst(s[0]);i=null!=i?i:this._formatDate(n),n.input&&n.input.val(i),this._updateAlternate(n),a=this._get(n,"onSelect"),a?a.apply(n.input?n.input[0]:null,[i,n]):n.input&&n.input.trigger("change"),n.inline?this._updateDatepicker(n):(this._hideDatepicker(),this._lastInput=n.input[0],"object"!=typeof n.input[0]&&n.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,a,s,n=this._get(t,"altField");n&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),a=this._getDate(t),s=this.formatDate(i,a,this._getFormatConfig(t)),e(n).each(function(){e(this).val(s)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(i,a,s){if(null==i||null==a)throw"Invalid arguments";if(a="object"==typeof a?""+a:a+"",""===a)return null;var n,r,o,u,c=0,h=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,l="string"!=typeof h?h:(new Date).getFullYear()%100+parseInt(h,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,p=(s?s.dayNames:null)||this._defaults.dayNames,g=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,m=(s?s.monthNames:null)||this._defaults.monthNames,f=-1,_=-1,v=-1,k=-1,y=!1,b=function(e){var t=i.length>n+1&&i.charAt(n+1)===e;return t&&n++,t},D=function(e){var t=b(e),i="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,s=RegExp("^\\d{1,"+i+"}"),n=a.substring(c).match(s);if(!n)throw"Missing number at position "+c;return c+=n[0].length,parseInt(n[0],10)},w=function(i,s,n){var r=-1,o=e.map(b(i)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,i){var s=i[1];return a.substr(c,s.length).toLowerCase()===s.toLowerCase()?(r=i[0],c+=s.length,!1):t}),-1!==r)return r+1;throw"Unknown name at position "+c},M=function(){if(a.charAt(c)!==i.charAt(n))throw"Unexpected literal at position "+c;c++};for(n=0;i.length>n;n++)if(y)"'"!==i.charAt(n)||b("'")?M():y=!1;else switch(i.charAt(n)){case"d":v=D("d");break;case"D":w("D",d,p);break;case"o":k=D("o");break;case"m":_=D("m");break;case"M":_=w("M",g,m);break;case"y":f=D("y");break;case"@":u=new Date(D("@")),f=u.getFullYear(),_=u.getMonth()+1,v=u.getDate();break;case"!":u=new Date((D("!")-this._ticksTo1970)/1e4),f=u.getFullYear(),_=u.getMonth()+1,v=u.getDate();break;case"'":b("'")?M():y=!0;break;default:M()}if(a.length>c&&(o=a.substr(c),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===f?f=(new Date).getFullYear():100>f&&(f+=(new Date).getFullYear()-(new Date).getFullYear()%100+(l>=f?0:-100)),k>-1)for(_=1,v=k;;){if(r=this._getDaysInMonth(f,_-1),r>=v)break;_++,v-=r}if(u=this._daylightSavingAdjust(new Date(f,_-1,v)),u.getFullYear()!==f||u.getMonth()+1!==_||u.getDate()!==v)throw"Invalid date";return u},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var a,s=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,n=(i?i.dayNames:null)||this._defaults.dayNames,r=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,o=(i?i.monthNames:null)||this._defaults.monthNames,u=function(t){var i=e.length>a+1&&e.charAt(a+1)===t;return i&&a++,i},c=function(e,t,i){var a=""+t;if(u(e))for(;i>a.length;)a="0"+a;return a},h=function(e,t,i,a){return u(e)?a[t]:i[t]},l="",d=!1;if(t)for(a=0;e.length>a;a++)if(d)"'"!==e.charAt(a)||u("'")?l+=e.charAt(a):d=!1;else switch(e.charAt(a)){case"d":l+=c("d",t.getDate(),2);break;case"D":l+=h("D",t.getDay(),s,n);break;case"o":l+=c("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":l+=c("m",t.getMonth()+1,2);break;case"M":l+=h("M",t.getMonth(),r,o);break;case"y":l+=u("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":l+=t.getTime();break;case"!":l+=1e4*t.getTime()+this._ticksTo1970;break;case"'":u("'")?l+="'":d=!0;break;default:l+=e.charAt(a)}return l},_possibleChars:function(e){var t,i="",a=!1,s=function(i){var a=e.length>t+1&&e.charAt(t+1)===i;return a&&t++,a};for(t=0;e.length>t;t++)if(a)"'"!==e.charAt(t)||s("'")?i+=e.charAt(t):a=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":s("'")?i+="'":a=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,i){return e.settings[i]!==t?e.settings[i]:this._defaults[i]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),a=e.lastVal=e.input?e.input.val():null,s=this._getDefaultDate(e),n=s,r=this._getFormatConfig(e);try{n=this.parseDate(i,a,r)||s}catch(o){a=t?"":a}e.selectedDay=n.getDate(),e.drawMonth=e.selectedMonth=n.getMonth(),e.drawYear=e.selectedYear=n.getFullYear(),e.currentDay=a?n.getDate():0,e.currentMonth=a?n.getMonth():0,e.currentYear=a?n.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,a){var s=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},n=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(a){}for(var s=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,n=s.getFullYear(),r=s.getMonth(),o=s.getDate(),u=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,c=u.exec(i);c;){switch(c[2]||"d"){case"d":case"D":o+=parseInt(c[1],10);break;case"w":case"W":o+=7*parseInt(c[1],10);break;case"m":case"M":r+=parseInt(c[1],10),o=Math.min(o,e.datepicker._getDaysInMonth(n,r));break;case"y":case"Y":n+=parseInt(c[1],10),o=Math.min(o,e.datepicker._getDaysInMonth(n,r))}c=u.exec(i)}return new Date(n,r,o)},r=null==i||""===i?a:"string"==typeof i?n(i):"number"==typeof i?isNaN(i)?a:s(i):new Date(i.getTime());return r=r&&"Invalid Date"==""+r?a:r,r&&(r.setHours(0),r.setMinutes(0),r.setSeconds(0),r.setMilliseconds(0)),this._daylightSavingAdjust(r)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var a=!t,s=e.selectedMonth,n=e.selectedYear,r=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=r.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=r.getMonth(),e.drawYear=e.selectedYear=e.currentYear=r.getFullYear(),s===e.selectedMonth&&n===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(a?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),a="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(a,-i,"M")},next:function(){e.datepicker._adjustDate(a,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(a)},selectDay:function(){return e.datepicker._selectDay(a,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(a,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(a,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,a,s,n,r,o,u,c,h,l,d,p,g,m,f,_,v,k,y,b,D,w,M,C,x,I,N,T,A,E,S,Y,F,P,O,j,K,R,H=new Date,W=this._daylightSavingAdjust(new Date(H.getFullYear(),H.getMonth(),H.getDate())),L=this._get(e,"isRTL"),U=this._get(e,"showButtonPanel"),B=this._get(e,"hideIfNoPrevNext"),z=this._get(e,"navigationAsDateFormat"),q=this._getNumberOfMonths(e),G=this._get(e,"showCurrentAtPos"),J=this._get(e,"stepMonths"),Q=1!==q[0]||1!==q[1],V=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),$=this._getMinMaxDate(e,"min"),X=this._getMinMaxDate(e,"max"),Z=e.drawMonth-G,et=e.drawYear;if(0>Z&&(Z+=12,et--),X)for(t=this._daylightSavingAdjust(new Date(X.getFullYear(),X.getMonth()-q[0]*q[1]+1,X.getDate())),t=$&&$>t?$:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=z?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-J,1)),this._getFormatConfig(e)):i,a=this._canAdjustMonth(e,-1,et,Z)?"
    "+i+"":B?"":""+i+"",s=this._get(e,"nextText"),s=z?this.formatDate(s,this._daylightSavingAdjust(new Date(et,Z+J,1)),this._getFormatConfig(e)):s,n=this._canAdjustMonth(e,1,et,Z)?""+s+"":B?"":""+s+"",r=this._get(e,"currentText"),o=this._get(e,"gotoCurrent")&&e.currentDay?V:W,r=z?this.formatDate(r,o,this._getFormatConfig(e)):r,u=e.inline?"":"",c=U?"
    "+(L?u:"")+(this._isInRange(e,o)?"":"")+(L?"":u)+"
    ":"",h=parseInt(this._get(e,"firstDay"),10),h=isNaN(h)?0:h,l=this._get(e,"showWeek"),d=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),g=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),f=this._get(e,"beforeShowDay"),_=this._get(e,"showOtherMonths"),v=this._get(e,"selectOtherMonths"),k=this._getDefaultDate(e),y="",D=0;q[0]>D;D++){for(w="",this.maxRows=4,M=0;q[1]>M;M++){if(C=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),x=" ui-corner-all",I="",Q){if(I+="
    "}for(I+="
    "+(/all|left/.test(x)&&0===D?L?n:a:"")+(/all|right/.test(x)&&0===D?L?a:n:"")+this._generateMonthYearHeader(e,Z,et,$,X,D>0||M>0,g,m)+"
    "+"",N=l?"":"",b=0;7>b;b++)T=(b+h)%7,N+="=5?" class='ui-datepicker-week-end'":"")+">"+""+p[T]+"";for(I+=N+"",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),E=(this._getFirstDayOfMonth(et,Z)-h+7)%7,S=Math.ceil((E+A)/7),Y=Q?this.maxRows>S?this.maxRows:S:S,this.maxRows=Y,F=this._daylightSavingAdjust(new Date(et,Z,1-E)),P=0;Y>P;P++){for(I+="",O=l?"":"",b=0;7>b;b++)j=f?f.apply(e.input?e.input[0]:null,[F]):[!0,""],K=F.getMonth()!==Z,R=K&&!v||!j[0]||$&&$>F||X&&F>X,O+="",F.setDate(F.getDate()+1),F=this._daylightSavingAdjust(F);I+=O+""}Z++,Z>11&&(Z=0,et++),I+="
    "+this._get(e,"weekHeader")+"
    "+this._get(e,"calculateWeek")(F)+""+(K&&!_?" ":R?""+F.getDate()+"":""+F.getDate()+"")+"
    "+(Q?"
    "+(q[0]>0&&M===q[1]-1?"
    ":""):""),w+=I}y+=w}return y+=c,e._keyEvent=!1,y},_generateMonthYearHeader:function(e,t,i,a,s,n,r,o){var u,c,h,l,d,p,g,m,f=this._get(e,"changeMonth"),_=this._get(e,"changeYear"),v=this._get(e,"showMonthAfterYear"),k="
    ",y="";if(n||!f)y+=""+r[t]+"";else{for(u=a&&a.getFullYear()===i,c=s&&s.getFullYear()===i,y+=""}if(v||(k+=y+(!n&&f&&_?"":" ")),!e.yearshtml)if(e.yearshtml="",n||!_)k+=""+i+"";else{for(l=this._get(e,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?d+parseInt(e,10):parseInt(e,10); +return isNaN(t)?d:t},g=p(l[0]),m=Math.max(g,p(l[1]||"")),g=a?Math.max(g,a.getFullYear()):g,m=s?Math.min(m,s.getFullYear()):m,e.yearshtml+="",k+=e.yearshtml,e.yearshtml=null}return k+=this._get(e,"yearSuffix"),v&&(k+=(!n&&f&&_?"":" ")+y),k+="
    "},_adjustInstDate:function(e,t,i){var a=e.drawYear+("Y"===i?t:0),s=e.drawMonth+("M"===i?t:0),n=Math.min(e.selectedDay,this._getDaysInMonth(a,s))+("D"===i?t:0),r=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(a,s,n)));e.selectedDay=r.getDate(),e.drawMonth=e.selectedMonth=r.getMonth(),e.drawYear=e.selectedYear=r.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),s=i&&i>t?i:t;return a&&s>a?a:s},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,a){var s=this._getNumberOfMonths(e),n=this._daylightSavingAdjust(new Date(i,a+(0>t?t:s[0]*s[1]),1));return 0>t&&n.setDate(this._getDaysInMonth(n.getFullYear(),n.getMonth())),this._isInRange(e,n)},_isInRange:function(e,t){var i,a,s=this._getMinMaxDate(e,"min"),n=this._getMinMaxDate(e,"max"),r=null,o=null,u=this._get(e,"yearRange");return u&&(i=u.split(":"),a=(new Date).getFullYear(),r=parseInt(i[0],10),o=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(r+=a),i[1].match(/[+\-].*/)&&(o+=a)),(!s||t.getTime()>=s.getTime())&&(!n||t.getTime()<=n.getTime())&&(!r||t.getFullYear()>=r)&&(!o||o>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,a){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var s=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(a,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),s,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new i,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.10.4"})(jQuery);(function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,a){var o,r=a.re.exec(i),l=r&&a.parse(r),h=a.space||"rgba";return l?(o=s[h](l),s[c[h].cache]=o[c[h].cache],n=s._rgba=o._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,a.transparent),s):a[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("

    ")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,o,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(o),o=e);var u=this,d=t.type(n),p=this._rgba=[];return o!==e&&(n=[n,o,r,l],d="array"),"string"===d?this.parse(s(n)||a._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var a=s.cache;f(s.props,function(t,e){if(!u[a]&&s.to){if("alpha"===t||null==n[t])return;u[a]=s.to(u._rgba)}u[a][e.idx]=i(n[t],e,!0)}),u[a]&&0>t.inArray(null,u[a].slice(0,3))&&(u[a][3]=1,s.from&&(u._rgba=s.from(u[a])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),a=c[n],o=0===this.alpha()?h("transparent"):this,r=o[a.cache]||a.to(o._rgba),l=r.slice();return s=s[a.cache],f(a.props,function(t,n){var a=n.idx,o=r[a],h=s[a],c=u[n.type]||{};null!==h&&(null===o?l[a]=h:(c.mod&&(h-o>c.mod/2?o+=c.mod:o-h>c.mod/2&&(o-=c.mod)),l[a]=i((h-o)*e+o,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,a=t[2]/255,o=t[3],r=Math.max(s,n,a),l=Math.min(s,n,a),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-a)/h+360:n===r?60*(a-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==o?1:o]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],a=t[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,e+1/3)),Math.round(255*n(r,o,e)),Math.round(255*n(r,o,e-1/3)),a]},f(c,function(s,n){var a=n.props,o=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[o]&&(this[o]=l(this._rgba)),s===e)return this[o].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[o].slice();return f(a,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[o]=d,n):h(d)},f(a,function(e,i){h.fn[e]||(h.fn[e]=function(n){var a,o=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===o?c:("function"===o&&(n=n.call(this,c),o=t.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=c+parseFloat(a[2])*("+"===a[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var a,o,r="";if("transparent"!==n&&("string"!==t.type(n)||(a=s(n)))){if(n=h(a||n),!d.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&o&&o.style;)try{r=t.css(o,"backgroundColor"),o=o.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(o),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},a=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function s(e,i){var s,n,o={};for(s in i)n=i[s],e[s]!==n&&(a[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(o[s]=n));return o}var n=["add","remove","toggle"],a={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,a,o,r){var l=t.speed(a,o,r);return this.queue(function(){var a,o=t(this),r=o.attr("class")||"",h=l.children?o.find("*").addBack():o;h=h.map(function(){var e=t(this);return{el:e,start:i(this)}}),a=function(){t.each(n,function(t,i){e[i]&&o[i+"Class"](e[i])})},a(),h=h.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),o.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){a(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(o[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,a){return s?t.effects.animateClass.call(this,{add:i},s,n,a):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,a){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,a):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,a,o,r){return"boolean"==typeof n||n===e?a?t.effects.animateClass.call(this,n?{add:s}:{remove:s},a,o,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,a,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,a){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,a)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.4",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,a;for(a=0;s.length>a;a++)null!==s[a]&&(n=t.data(i+s[a]),n===e&&(n=""),t.css(s[a],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

    ").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return e.wrap(s),(e[0]===a||t.contains(e[0],a))&&t(a).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var a=e.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(a)&&a.call(n[0]),t.isFunction(e)&&e()}var n=t(this),a=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):o.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,a=i.queue,o=t.effects.effect[i.effect];return t.fx.off||!o?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):a===!1?this.each(e):this.queue(a||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()})(jQuery);(function(t){t.effects.effect.shake=function(e,i){var s,n=t(this),a=["position","top","bottom","left","right","height","width"],o=t.effects.setMode(n,e.mode||"effect"),r=e.direction||"left",l=e.distance||20,h=e.times||3,c=2*h+1,u=Math.round(e.duration/c),d="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},g={},m={},v=n.queue(),_=v.length;for(t.effects.save(n,a),n.show(),t.effects.createWrapper(n),f[d]=(p?"-=":"+=")+l,g[d]=(p?"+=":"-=")+2*l,m[d]=(p?"-=":"+=")+2*l,n.animate(f,u,e.easing),s=1;h>s;s++)n.animate(g,u,e.easing).animate(m,u,e.easing);n.animate(g,u,e.easing).animate(f,u/2,e.easing).queue(function(){"hide"===o&&n.hide(),t.effects.restore(n,a),t.effects.removeWrapper(n),i()}),_>1&&v.splice.apply(v,[1,0].concat(v.splice(_,c+1))),n.dequeue()}})(jQuery); \ No newline at end of file diff --git a/includes/js/jquery.js b/includes/js/jquery.js new file mode 100644 index 0000000..c5c6482 --- /dev/null +++ b/includes/js/jquery.js @@ -0,0 +1,9789 @@ +/*! + * jQuery JavaScript Library v1.10.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2013-07-03T13:48Z + */ +(function( window, undefined ) { + +// Can't do this because several apps including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// Support: Firefox 18+ +//"use strict"; +var + // The deferred used on DOM ready + readyList, + + // A central reference to the root jQuery(document) + rootjQuery, + + // Support: IE<10 + // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` + core_strundefined = typeof undefined, + + // Use the correct document accordingly with window argument (sandbox) + location = window.location, + document = window.document, + docElem = document.documentElement, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // [[Class]] -> 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("');return b.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= +a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var h=[],g=c.html;"<"!=g.charAt(0)&&(g=""+g+"");var k=c.focus;if(k){var j=this.focus;this.focus=function(){("function"== +typeof k?k:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,e,c,h,"span",null,null,"");h=h.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",h[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push(""+f+"");for(var b=0;ba.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b= +CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()}, +isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype= +CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0< +b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8','