From e0c5d07c5e9a45cecab3d22d71cf95039bbf29cf Mon Sep 17 00:00:00 2001 From: Alaguraj0361 Date: Tue, 26 Aug 2025 13:45:05 +0530 Subject: [PATCH] first commit --- .gitignore | 39 + app/about-us/page.js | 306 + app/appointment/page.js | 252 + app/blog-2/page.js | 199 + app/blog-details/page.js | 267 + app/blog/page.js | 172 + app/chooseus/page.js | 345 + app/contact/page.js | 133 + app/faq/page.js | 186 + app/favicon.ico | Bin 0 -> 15086 bytes app/gallery/page.js | 136 + app/index-2/page.js | 41 + app/index-3/page.js | 39 + app/layout.js | 21 + app/loading.js | 9 + app/not-found.js | 53 + app/onepage/page.js | 41 + app/page.js | 37 + app/pricing-table/page.js | 149 + app/service-details-2/page.js | 131 + app/service-details-3/page.js | 130 + app/service-details-4/page.js | 130 + app/service-details-5/page.js | 130 + app/service-details-6/page.js | 130 + app/service-details/page.js | 131 + app/service/page.js | 170 + app/team-details/page.js | 132 + app/team/page.js | 212 + app/tesmonial/page.js | 95 + app/works/page.js | 228 + components/elements/BackToTop.js | 14 + components/elements/Counter.js | 56 + components/elements/CounterUp.js | 31 + components/elements/DataBg.js | 16 + components/elements/PortfolioFilter1.js | 134 + components/elements/PortfolioFilter3.js | 199 + components/elements/PortfolioFilter4.js | 173 + components/elements/PortfolioFilter5.js | 120 + components/elements/Preloader.js | 14 + components/elements/QuantityInput.js | 31 + components/elements/ServiceTabs1.js | 63 + components/elements/ThemeSwitch.js | 27 + components/elements/VideoPopup.js | 54 + components/layout/Breadcrumb.js | 29 + components/layout/Layout.js | 70 + components/layout/Menu.js | 72 + components/layout/MobileMenu.js | 127 + components/layout/MobileMenu2.js | 85 + components/layout/OnepageMenu.js | 33 + components/layout/SearchPopup.js | 33 + components/layout/Sidebar.js | 59 + components/layout/footer/Footer1.js | 98 + components/layout/footer/Footer2.js | 100 + components/layout/header/Header1.js | 110 + components/layout/header/Header2.js | 98 + components/layout/header/Header3.js | 98 + components/layout/header/Header4.js | 92 + components/sections/home1/About.js | 58 + components/sections/home1/Banner.js | 35 + components/sections/home1/Features.js | 50 + components/sections/home1/Funfacts.js | 61 + components/sections/home1/News.js | 73 + components/sections/home1/Pricing.js | 92 + components/sections/home1/Process.js | 54 + components/sections/home1/Services.js | 59 + components/sections/home1/Subscribe.js | 35 + components/sections/home1/Team.js | 54 + components/sections/home1/Testimonial.js | 29 + components/sections/home1/Video.js | 33 + components/sections/home1/WhyChooseUs.js | 61 + components/sections/home2/About.js | 60 + components/sections/home2/Banner.js | 85 + components/sections/home2/Chooseus.js | 61 + components/sections/home2/Client.js | 18 + components/sections/home2/Contact.js | 45 + components/sections/home2/Cta.js | 29 + components/sections/home2/Faq.js | 100 + components/sections/home2/Features.js | 55 + components/sections/home2/Funfacts.js | 61 + components/sections/home2/News.js | 129 + components/sections/home2/Order.js | 42 + components/sections/home2/Service.js | 63 + components/sections/home2/Solution.js | 49 + components/sections/home2/Subscribe.js | 37 + components/sections/home2/Team.js | 86 + components/sections/home2/Testmonial.js | 36 + components/sections/home2/Video.js | 33 + components/sections/home2/Working.js | 60 + components/sections/home3/About.js | 59 + components/sections/home3/Banner.js | 47 + components/sections/home3/Contact.js | 71 + components/sections/home3/Faq.js | 97 + components/sections/home3/Features.js | 51 + components/sections/home3/Gallery.js | 30 + components/sections/home3/Map.js | 17 + components/sections/home3/News.js | 74 + components/sections/home3/Process.js | 54 + components/sections/home3/Subscribe.js | 36 + components/sections/home3/Team.js | 102 + components/sections/home3/Testmonial.js | 36 + components/sections/home3/Video.js | 34 + components/sections/onepage/About.js | 58 + components/sections/onepage/Banner.js | 35 + components/sections/onepage/Features.js | 50 + components/sections/onepage/Funfacts.js | 61 + components/sections/onepage/News.js | 129 + components/sections/onepage/Pricing.js | 92 + components/sections/onepage/Process.js | 54 + components/sections/onepage/Services.js | 60 + components/sections/onepage/Subscribe.js | 36 + components/sections/onepage/Team.js | 93 + components/sections/onepage/Testimonial.js | 30 + components/sections/onepage/Video.js | 34 + components/sections/onepage/WhyChooseUs.js | 60 + components/slider/ClientSlider1.js | 125 + components/slider/ProjectSlider0.js | 180 + components/slider/TestimonialSlider1.js | 183 + components/slider/TestmonialSlider2.js | 182 + components/slider/TestmonialSlider3.js | 182 + jsconfig.json | 7 + lib/font.js | 8 + next.config.js | 4 + package-lock.json | 1133 ++ package.json | 25 + public/assets/css/animate.css | 3782 ++++ public/assets/css/bootstrap.css | 10907 +++++++++++ public/assets/css/color.css | 10 + public/assets/css/color/crimson.css | 81 + public/assets/css/color/orange.css | 83 + public/assets/css/color/pink.css | 82 + public/assets/css/color/theme-color.css | 81 + public/assets/css/color/violet.css | 82 + public/assets/css/elpath.css | 4413 +++++ public/assets/css/flaticon.css | 141 + public/assets/css/font-awesome-all.css | 6193 ++++++ public/assets/css/jquery-ui.css | 1471 ++ public/assets/css/jquery.fancybox.min.css | 1 + public/assets/css/module-css/about.css | 620 + public/assets/css/module-css/appointments.css | 161 + public/assets/css/module-css/banner.css | 705 + public/assets/css/module-css/blog-details.css | 351 + public/assets/css/module-css/chooseus.css | 232 + public/assets/css/module-css/contact.css | 250 + public/assets/css/module-css/cta.css | 129 + public/assets/css/module-css/error.css | 95 + public/assets/css/module-css/faq.css | 152 + public/assets/css/module-css/feature.css | 260 + public/assets/css/module-css/funfact.css | 146 + public/assets/css/module-css/gallery.css | 194 + public/assets/css/module-css/news.css | 260 + public/assets/css/module-css/page-title.css | 180 + public/assets/css/module-css/pricing.css | 204 + public/assets/css/module-css/process.css | 209 + .../assets/css/module-css/service-details.css | 127 + public/assets/css/module-css/service.css | 219 + public/assets/css/module-css/sidebar.css | 389 + public/assets/css/module-css/solutions.css | 161 + public/assets/css/module-css/subscribe.css | 182 + public/assets/css/module-css/team-details.css | 216 + public/assets/css/module-css/team.css | 362 + public/assets/css/module-css/testimonial.css | 364 + public/assets/css/module-css/video.css | 193 + public/assets/css/nice-select.css | 114 + public/assets/css/owl.css | 252 + public/assets/css/responsive.css | 0 public/assets/css/rtl.css | 169 + public/assets/css/style.css | 2666 +++ public/assets/css/switcher-style.css | 170 + public/assets/css/timePicker.css | 187 + public/assets/fonts/fa-brands-400.eot | Bin 0 -> 129924 bytes public/assets/fonts/fa-brands-400.ttf | Bin 0 -> 129620 bytes public/assets/fonts/fa-brands-400.woff | Bin 0 -> 87688 bytes public/assets/fonts/fa-brands-400.woff2 | Bin 0 -> 74700 bytes public/assets/fonts/fa-light-300.woff | Bin 0 -> 207100 bytes public/assets/fonts/fa-light-300.woff2 | Bin 0 -> 156896 bytes public/assets/fonts/fa-regular-400.eot | Bin 0 -> 369628 bytes public/assets/fonts/fa-regular-400.woff | Bin 0 -> 191300 bytes public/assets/fonts/fa-regular-400.woff2 | Bin 0 -> 145152 bytes public/assets/fonts/fa-solid-900.woff | Bin 0 -> 155948 bytes public/assets/fonts/fa-solid-900.woff2 | Bin 0 -> 117452 bytes public/assets/fonts/icomoon.eot | Bin 0 -> 22360 bytes public/assets/fonts/icomoon.svg | 48 + public/assets/fonts/icomoon.ttf | Bin 0 -> 22196 bytes public/assets/fonts/icomoon.woff | Bin 0 -> 22272 bytes .../images/background/appointment-bg.jpg | Bin 0 -> 29155 bytes .../images/background/chooseus-bg-2.jpg | Bin 0 -> 12929 bytes .../assets/images/background/chooseus-bg.jpg | Bin 0 -> 12551 bytes public/assets/images/background/cta-bg.jpg | Bin 0 -> 27520 bytes .../assets/images/background/page-title.jpg | Bin 0 -> 24672 bytes .../images/background/testimonial-bg.jpg | Bin 0 -> 14248 bytes public/assets/images/background/video-bg.jpg | Bin 0 -> 28604 bytes public/assets/images/banner/banner-1.jpg | Bin 0 -> 35513 bytes public/assets/images/banner/banner-img-1.png | Bin 0 -> 5582 bytes public/assets/images/banner/banner-img-2.png | Bin 0 -> 5635 bytes public/assets/images/banner/banner-img-3.png | Bin 0 -> 4656 bytes public/assets/images/favicon.ico | Bin 0 -> 15086 bytes public/assets/images/footer-logo.png | Bin 0 -> 3847 bytes public/assets/images/gallery/gallery-1.jpg | Bin 0 -> 4945 bytes public/assets/images/gallery/gallery-10.jpg | Bin 0 -> 5848 bytes public/assets/images/gallery/gallery-11.jpg | Bin 0 -> 5848 bytes public/assets/images/gallery/gallery-2.jpg | Bin 0 -> 5183 bytes public/assets/images/gallery/gallery-3.jpg | Bin 0 -> 5183 bytes public/assets/images/gallery/gallery-4.jpg | Bin 0 -> 5183 bytes public/assets/images/gallery/gallery-5.jpg | Bin 0 -> 5183 bytes public/assets/images/gallery/gallery-6.jpg | Bin 0 -> 4853 bytes public/assets/images/gallery/gallery-7.jpg | Bin 0 -> 4853 bytes public/assets/images/gallery/gallery-8.jpg | Bin 0 -> 4853 bytes public/assets/images/gallery/gallery-9.jpg | Bin 0 -> 5848 bytes public/assets/images/icons/cross-out.png | Bin 0 -> 413 bytes public/assets/images/icons/error-1.png | Bin 0 -> 410591 bytes public/assets/images/icons/icon-1.png | Bin 0 -> 365 bytes public/assets/images/icons/icon-2.png | Bin 0 -> 499 bytes public/assets/images/icons/map-marker.png | Bin 0 -> 1449 bytes public/assets/images/icons/signature-1.png | Bin 0 -> 2245 bytes .../images/icons/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/icons/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../images/icons/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes public/assets/images/logo-2.png | Bin 0 -> 3847 bytes public/assets/images/logo.png | Bin 0 -> 4304 bytes public/assets/images/news/comment-1.jpg | Bin 0 -> 763 bytes public/assets/images/news/comment-2.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-1.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-2.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-3.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-4.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-5.jpg | Bin 0 -> 763 bytes public/assets/images/news/gallery-6.jpg | Bin 0 -> 763 bytes public/assets/images/news/news-1.jpg | Bin 0 -> 5422 bytes public/assets/images/news/news-10.jpg | Bin 0 -> 4692 bytes public/assets/images/news/news-11.jpg | Bin 0 -> 15546 bytes public/assets/images/news/news-12.jpg | Bin 0 -> 4029 bytes public/assets/images/news/news-13.jpg | Bin 0 -> 4087 bytes public/assets/images/news/news-2.jpg | Bin 0 -> 5422 bytes public/assets/images/news/news-3.jpg | Bin 0 -> 5422 bytes public/assets/images/news/news-4.jpg | Bin 0 -> 4926 bytes public/assets/images/news/news-5.jpg | Bin 0 -> 4926 bytes public/assets/images/news/news-6.jpg | Bin 0 -> 4926 bytes public/assets/images/news/news-7.jpg | Bin 0 -> 4692 bytes public/assets/images/news/news-8.jpg | Bin 0 -> 4692 bytes public/assets/images/news/news-9.jpg | Bin 0 -> 4692 bytes public/assets/images/news/post-1.jpg | Bin 0 -> 768 bytes public/assets/images/news/post-2.jpg | Bin 0 -> 768 bytes public/assets/images/news/post-3.jpg | Bin 0 -> 768 bytes public/assets/images/resource/about-1.jpg | Bin 0 -> 10174 bytes public/assets/images/resource/about-1.png | Bin 0 -> 5303 bytes public/assets/images/resource/about-2.jpg | Bin 0 -> 4195 bytes public/assets/images/resource/about-3.jpg | Bin 0 -> 4892 bytes public/assets/images/resource/author-1.jpg | Bin 0 -> 855 bytes public/assets/images/resource/contact-1.jpg | Bin 0 -> 6086 bytes public/assets/images/resource/cta-1.png | Bin 0 -> 6521 bytes public/assets/images/resource/faq-1.png | Bin 0 -> 4468 bytes public/assets/images/resource/process-1.jpg | Bin 0 -> 3950 bytes public/assets/images/resource/process-2.jpg | Bin 0 -> 3950 bytes public/assets/images/resource/process-3.jpg | Bin 0 -> 3950 bytes public/assets/images/resource/skills-1.jpg | Bin 0 -> 7396 bytes public/assets/images/resource/skills-2.jpg | Bin 0 -> 5080 bytes .../assets/images/resource/testimonial-1.png | Bin 0 -> 582 bytes .../assets/images/resource/testimonial-2.png | Bin 0 -> 582 bytes .../assets/images/resource/testimonial-3.png | Bin 0 -> 593 bytes .../assets/images/resource/testimonial-4.png | Bin 0 -> 593 bytes .../assets/images/resource/testimonial-5.png | Bin 0 -> 593 bytes .../assets/images/resource/testimonial-6.png | Bin 0 -> 593 bytes public/assets/images/resource/thumb-1.png | Bin 0 -> 500 bytes public/assets/images/resource/thumb-2.png | Bin 0 -> 500 bytes public/assets/images/resource/thumb-3.png | Bin 0 -> 500 bytes public/assets/images/resource/thumb-4.png | Bin 0 -> 542 bytes public/assets/images/resource/thumb-5.png | Bin 0 -> 500 bytes public/assets/images/resource/thumb-6.png | Bin 0 -> 771 bytes public/assets/images/resource/video-1.png | Bin 0 -> 3517 bytes public/assets/images/resource/video-2.png | Bin 0 -> 4383 bytes public/assets/images/resource/video-3.png | Bin 0 -> 3586 bytes public/assets/images/service/service-1.jpg | Bin 0 -> 4819 bytes public/assets/images/service/service-10.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-11.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-12.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-13.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-14.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-2.jpg | Bin 0 -> 4819 bytes public/assets/images/service/service-3.jpg | Bin 0 -> 4819 bytes public/assets/images/service/service-4.jpg | Bin 0 -> 4904 bytes public/assets/images/service/service-5.jpg | Bin 0 -> 4904 bytes public/assets/images/service/service-6.jpg | Bin 0 -> 4904 bytes public/assets/images/service/service-7.jpg | Bin 0 -> 14131 bytes public/assets/images/service/service-8.jpg | Bin 0 -> 4667 bytes public/assets/images/service/service-9.jpg | Bin 0 -> 4667 bytes public/assets/images/shape/shape-1.png | Bin 0 -> 122369 bytes public/assets/images/shape/shape-10.png | Bin 0 -> 40663 bytes public/assets/images/shape/shape-11.png | Bin 0 -> 2871 bytes public/assets/images/shape/shape-12.png | Bin 0 -> 76859 bytes public/assets/images/shape/shape-13.png | Bin 0 -> 59251 bytes public/assets/images/shape/shape-14.png | Bin 0 -> 60034 bytes public/assets/images/shape/shape-15.png | Bin 0 -> 864 bytes public/assets/images/shape/shape-16.png | Bin 0 -> 907 bytes public/assets/images/shape/shape-17.png | Bin 0 -> 3140 bytes public/assets/images/shape/shape-18.png | Bin 0 -> 6247 bytes public/assets/images/shape/shape-19.png | Bin 0 -> 84790 bytes public/assets/images/shape/shape-2.png | Bin 0 -> 2803 bytes public/assets/images/shape/shape-20.png | Bin 0 -> 891 bytes public/assets/images/shape/shape-21.png | Bin 0 -> 154566 bytes public/assets/images/shape/shape-22.png | Bin 0 -> 14118 bytes public/assets/images/shape/shape-23.png | Bin 0 -> 151985 bytes public/assets/images/shape/shape-24.png | Bin 0 -> 2100 bytes public/assets/images/shape/shape-25.png | Bin 0 -> 2618 bytes public/assets/images/shape/shape-26.png | Bin 0 -> 834250 bytes public/assets/images/shape/shape-27.png | Bin 0 -> 95187 bytes public/assets/images/shape/shape-28.png | Bin 0 -> 79626 bytes public/assets/images/shape/shape-29.png | Bin 0 -> 1804071 bytes public/assets/images/shape/shape-3.png | Bin 0 -> 1602 bytes public/assets/images/shape/shape-30.png | Bin 0 -> 2978 bytes public/assets/images/shape/shape-31.png | Bin 0 -> 220943 bytes public/assets/images/shape/shape-32.png | Bin 0 -> 1343 bytes public/assets/images/shape/shape-33.png | Bin 0 -> 333 bytes public/assets/images/shape/shape-34.png | Bin 0 -> 7942 bytes public/assets/images/shape/shape-35.png | Bin 0 -> 19713 bytes public/assets/images/shape/shape-4.png | Bin 0 -> 5260 bytes public/assets/images/shape/shape-5.png | Bin 0 -> 2120 bytes public/assets/images/shape/shape-6.png | Bin 0 -> 56020 bytes public/assets/images/shape/shape-7.png | Bin 0 -> 3672 bytes public/assets/images/shape/shape-8.png | Bin 0 -> 627 bytes public/assets/images/shape/shape-9.png | Bin 0 -> 612 bytes public/assets/images/team/team-1.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-10.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-11.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-12.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-13.jpg | Bin 0 -> 6955 bytes public/assets/images/team/team-2.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-3.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-4.jpg | Bin 0 -> 3279 bytes public/assets/images/team/team-5.jpg | Bin 0 -> 3778 bytes public/assets/images/team/team-6.jpg | Bin 0 -> 3778 bytes public/assets/images/team/team-7.jpg | Bin 0 -> 3778 bytes public/assets/images/team/team-8.jpg | Bin 0 -> 3778 bytes public/assets/images/team/team-9.jpg | Bin 0 -> 3279 bytes public/assets/js/appear.js | 151 + public/assets/js/bootstrap.min.js | 7 + public/assets/js/gmaps.js | 2 + public/assets/js/isotope.js | 8 + public/assets/js/jQuery.style.switcher.min.js | 1 + public/assets/js/jquery-ui.js | 16159 ++++++++++++++++ public/assets/js/jquery.fancybox.js | 5238 +++++ public/assets/js/jquery.js | 5 + public/assets/js/jquery.nice-select.min.js | 4 + public/assets/js/map-helper.js | 138 + public/assets/js/nav-tool.js | 1 + public/assets/js/owl.js | 3448 ++++ public/assets/js/pagenav.js | 223 + public/assets/js/parallax-scroll.js | 185 + public/assets/js/script.js | 615 + public/assets/js/timePicker.js | 535 + public/assets/js/validation.js | 49 + public/assets/js/wow.js | 2 + public/next.svg | 1 + public/vercel.svg | 1 + 353 files changed, 75419 insertions(+) create mode 100644 .gitignore create mode 100644 app/about-us/page.js create mode 100644 app/appointment/page.js create mode 100644 app/blog-2/page.js create mode 100644 app/blog-details/page.js create mode 100644 app/blog/page.js create mode 100644 app/chooseus/page.js create mode 100644 app/contact/page.js create mode 100644 app/faq/page.js create mode 100644 app/favicon.ico create mode 100644 app/gallery/page.js create mode 100644 app/index-2/page.js create mode 100644 app/index-3/page.js create mode 100644 app/layout.js create mode 100644 app/loading.js create mode 100644 app/not-found.js create mode 100644 app/onepage/page.js create mode 100644 app/page.js create mode 100644 app/pricing-table/page.js create mode 100644 app/service-details-2/page.js create mode 100644 app/service-details-3/page.js create mode 100644 app/service-details-4/page.js create mode 100644 app/service-details-5/page.js create mode 100644 app/service-details-6/page.js create mode 100644 app/service-details/page.js create mode 100644 app/service/page.js create mode 100644 app/team-details/page.js create mode 100644 app/team/page.js create mode 100644 app/tesmonial/page.js create mode 100644 app/works/page.js create mode 100644 components/elements/BackToTop.js create mode 100644 components/elements/Counter.js create mode 100644 components/elements/CounterUp.js create mode 100644 components/elements/DataBg.js create mode 100644 components/elements/PortfolioFilter1.js create mode 100644 components/elements/PortfolioFilter3.js create mode 100644 components/elements/PortfolioFilter4.js create mode 100644 components/elements/PortfolioFilter5.js create mode 100644 components/elements/Preloader.js create mode 100644 components/elements/QuantityInput.js create mode 100644 components/elements/ServiceTabs1.js create mode 100644 components/elements/ThemeSwitch.js create mode 100644 components/elements/VideoPopup.js create mode 100644 components/layout/Breadcrumb.js create mode 100644 components/layout/Layout.js create mode 100644 components/layout/Menu.js create mode 100644 components/layout/MobileMenu.js create mode 100644 components/layout/MobileMenu2.js create mode 100644 components/layout/OnepageMenu.js create mode 100644 components/layout/SearchPopup.js create mode 100644 components/layout/Sidebar.js create mode 100644 components/layout/footer/Footer1.js create mode 100644 components/layout/footer/Footer2.js create mode 100644 components/layout/header/Header1.js create mode 100644 components/layout/header/Header2.js create mode 100644 components/layout/header/Header3.js create mode 100644 components/layout/header/Header4.js create mode 100644 components/sections/home1/About.js create mode 100644 components/sections/home1/Banner.js create mode 100644 components/sections/home1/Features.js create mode 100644 components/sections/home1/Funfacts.js create mode 100644 components/sections/home1/News.js create mode 100644 components/sections/home1/Pricing.js create mode 100644 components/sections/home1/Process.js create mode 100644 components/sections/home1/Services.js create mode 100644 components/sections/home1/Subscribe.js create mode 100644 components/sections/home1/Team.js create mode 100644 components/sections/home1/Testimonial.js create mode 100644 components/sections/home1/Video.js create mode 100644 components/sections/home1/WhyChooseUs.js create mode 100644 components/sections/home2/About.js create mode 100644 components/sections/home2/Banner.js create mode 100644 components/sections/home2/Chooseus.js create mode 100644 components/sections/home2/Client.js create mode 100644 components/sections/home2/Contact.js create mode 100644 components/sections/home2/Cta.js create mode 100644 components/sections/home2/Faq.js create mode 100644 components/sections/home2/Features.js create mode 100644 components/sections/home2/Funfacts.js create mode 100644 components/sections/home2/News.js create mode 100644 components/sections/home2/Order.js create mode 100644 components/sections/home2/Service.js create mode 100644 components/sections/home2/Solution.js create mode 100644 components/sections/home2/Subscribe.js create mode 100644 components/sections/home2/Team.js create mode 100644 components/sections/home2/Testmonial.js create mode 100644 components/sections/home2/Video.js create mode 100644 components/sections/home2/Working.js create mode 100644 components/sections/home3/About.js create mode 100644 components/sections/home3/Banner.js create mode 100644 components/sections/home3/Contact.js create mode 100644 components/sections/home3/Faq.js create mode 100644 components/sections/home3/Features.js create mode 100644 components/sections/home3/Gallery.js create mode 100644 components/sections/home3/Map.js create mode 100644 components/sections/home3/News.js create mode 100644 components/sections/home3/Process.js create mode 100644 components/sections/home3/Subscribe.js create mode 100644 components/sections/home3/Team.js create mode 100644 components/sections/home3/Testmonial.js create mode 100644 components/sections/home3/Video.js create mode 100644 components/sections/onepage/About.js create mode 100644 components/sections/onepage/Banner.js create mode 100644 components/sections/onepage/Features.js create mode 100644 components/sections/onepage/Funfacts.js create mode 100644 components/sections/onepage/News.js create mode 100644 components/sections/onepage/Pricing.js create mode 100644 components/sections/onepage/Process.js create mode 100644 components/sections/onepage/Services.js create mode 100644 components/sections/onepage/Subscribe.js create mode 100644 components/sections/onepage/Team.js create mode 100644 components/sections/onepage/Testimonial.js create mode 100644 components/sections/onepage/Video.js create mode 100644 components/sections/onepage/WhyChooseUs.js create mode 100644 components/slider/ClientSlider1.js create mode 100644 components/slider/ProjectSlider0.js create mode 100644 components/slider/TestimonialSlider1.js create mode 100644 components/slider/TestmonialSlider2.js create mode 100644 components/slider/TestmonialSlider3.js create mode 100644 jsconfig.json create mode 100644 lib/font.js create mode 100644 next.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/assets/css/animate.css create mode 100644 public/assets/css/bootstrap.css create mode 100644 public/assets/css/color.css create mode 100644 public/assets/css/color/crimson.css create mode 100644 public/assets/css/color/orange.css create mode 100644 public/assets/css/color/pink.css create mode 100644 public/assets/css/color/theme-color.css create mode 100644 public/assets/css/color/violet.css create mode 100644 public/assets/css/elpath.css create mode 100644 public/assets/css/flaticon.css create mode 100644 public/assets/css/font-awesome-all.css create mode 100644 public/assets/css/jquery-ui.css create mode 100644 public/assets/css/jquery.fancybox.min.css create mode 100644 public/assets/css/module-css/about.css create mode 100644 public/assets/css/module-css/appointments.css create mode 100644 public/assets/css/module-css/banner.css create mode 100644 public/assets/css/module-css/blog-details.css create mode 100644 public/assets/css/module-css/chooseus.css create mode 100644 public/assets/css/module-css/contact.css create mode 100644 public/assets/css/module-css/cta.css create mode 100644 public/assets/css/module-css/error.css create mode 100644 public/assets/css/module-css/faq.css create mode 100644 public/assets/css/module-css/feature.css create mode 100644 public/assets/css/module-css/funfact.css create mode 100644 public/assets/css/module-css/gallery.css create mode 100644 public/assets/css/module-css/news.css create mode 100644 public/assets/css/module-css/page-title.css create mode 100644 public/assets/css/module-css/pricing.css create mode 100644 public/assets/css/module-css/process.css create mode 100644 public/assets/css/module-css/service-details.css create mode 100644 public/assets/css/module-css/service.css create mode 100644 public/assets/css/module-css/sidebar.css create mode 100644 public/assets/css/module-css/solutions.css create mode 100644 public/assets/css/module-css/subscribe.css create mode 100644 public/assets/css/module-css/team-details.css create mode 100644 public/assets/css/module-css/team.css create mode 100644 public/assets/css/module-css/testimonial.css create mode 100644 public/assets/css/module-css/video.css create mode 100644 public/assets/css/nice-select.css create mode 100644 public/assets/css/owl.css create mode 100644 public/assets/css/responsive.css create mode 100644 public/assets/css/rtl.css create mode 100644 public/assets/css/style.css create mode 100644 public/assets/css/switcher-style.css create mode 100644 public/assets/css/timePicker.css create mode 100644 public/assets/fonts/fa-brands-400.eot create mode 100644 public/assets/fonts/fa-brands-400.ttf create mode 100644 public/assets/fonts/fa-brands-400.woff create mode 100644 public/assets/fonts/fa-brands-400.woff2 create mode 100644 public/assets/fonts/fa-light-300.woff create mode 100644 public/assets/fonts/fa-light-300.woff2 create mode 100644 public/assets/fonts/fa-regular-400.eot create mode 100644 public/assets/fonts/fa-regular-400.woff create mode 100644 public/assets/fonts/fa-regular-400.woff2 create mode 100644 public/assets/fonts/fa-solid-900.woff create mode 100644 public/assets/fonts/fa-solid-900.woff2 create mode 100644 public/assets/fonts/icomoon.eot create mode 100644 public/assets/fonts/icomoon.svg create mode 100644 public/assets/fonts/icomoon.ttf create mode 100644 public/assets/fonts/icomoon.woff create mode 100644 public/assets/images/background/appointment-bg.jpg create mode 100644 public/assets/images/background/chooseus-bg-2.jpg create mode 100644 public/assets/images/background/chooseus-bg.jpg create mode 100644 public/assets/images/background/cta-bg.jpg create mode 100644 public/assets/images/background/page-title.jpg create mode 100644 public/assets/images/background/testimonial-bg.jpg create mode 100644 public/assets/images/background/video-bg.jpg create mode 100644 public/assets/images/banner/banner-1.jpg create mode 100644 public/assets/images/banner/banner-img-1.png create mode 100644 public/assets/images/banner/banner-img-2.png create mode 100644 public/assets/images/banner/banner-img-3.png create mode 100644 public/assets/images/favicon.ico create mode 100644 public/assets/images/footer-logo.png create mode 100644 public/assets/images/gallery/gallery-1.jpg create mode 100644 public/assets/images/gallery/gallery-10.jpg create mode 100644 public/assets/images/gallery/gallery-11.jpg create mode 100644 public/assets/images/gallery/gallery-2.jpg create mode 100644 public/assets/images/gallery/gallery-3.jpg create mode 100644 public/assets/images/gallery/gallery-4.jpg create mode 100644 public/assets/images/gallery/gallery-5.jpg create mode 100644 public/assets/images/gallery/gallery-6.jpg create mode 100644 public/assets/images/gallery/gallery-7.jpg create mode 100644 public/assets/images/gallery/gallery-8.jpg create mode 100644 public/assets/images/gallery/gallery-9.jpg create mode 100644 public/assets/images/icons/cross-out.png create mode 100644 public/assets/images/icons/error-1.png create mode 100644 public/assets/images/icons/icon-1.png create mode 100644 public/assets/images/icons/icon-2.png create mode 100644 public/assets/images/icons/map-marker.png create mode 100644 public/assets/images/icons/signature-1.png create mode 100644 public/assets/images/icons/ui-icons_222222_256x240.png create mode 100644 public/assets/images/icons/ui-icons_454545_256x240.png create mode 100644 public/assets/images/icons/ui-icons_888888_256x240.png create mode 100644 public/assets/images/logo-2.png create mode 100644 public/assets/images/logo.png create mode 100644 public/assets/images/news/comment-1.jpg create mode 100644 public/assets/images/news/comment-2.jpg create mode 100644 public/assets/images/news/gallery-1.jpg create mode 100644 public/assets/images/news/gallery-2.jpg create mode 100644 public/assets/images/news/gallery-3.jpg create mode 100644 public/assets/images/news/gallery-4.jpg create mode 100644 public/assets/images/news/gallery-5.jpg create mode 100644 public/assets/images/news/gallery-6.jpg create mode 100644 public/assets/images/news/news-1.jpg create mode 100644 public/assets/images/news/news-10.jpg create mode 100644 public/assets/images/news/news-11.jpg create mode 100644 public/assets/images/news/news-12.jpg create mode 100644 public/assets/images/news/news-13.jpg create mode 100644 public/assets/images/news/news-2.jpg create mode 100644 public/assets/images/news/news-3.jpg create mode 100644 public/assets/images/news/news-4.jpg create mode 100644 public/assets/images/news/news-5.jpg create mode 100644 public/assets/images/news/news-6.jpg create mode 100644 public/assets/images/news/news-7.jpg create mode 100644 public/assets/images/news/news-8.jpg create mode 100644 public/assets/images/news/news-9.jpg create mode 100644 public/assets/images/news/post-1.jpg create mode 100644 public/assets/images/news/post-2.jpg create mode 100644 public/assets/images/news/post-3.jpg create mode 100644 public/assets/images/resource/about-1.jpg create mode 100644 public/assets/images/resource/about-1.png create mode 100644 public/assets/images/resource/about-2.jpg create mode 100644 public/assets/images/resource/about-3.jpg create mode 100644 public/assets/images/resource/author-1.jpg create mode 100644 public/assets/images/resource/contact-1.jpg create mode 100644 public/assets/images/resource/cta-1.png create mode 100644 public/assets/images/resource/faq-1.png create mode 100644 public/assets/images/resource/process-1.jpg create mode 100644 public/assets/images/resource/process-2.jpg create mode 100644 public/assets/images/resource/process-3.jpg create mode 100644 public/assets/images/resource/skills-1.jpg create mode 100644 public/assets/images/resource/skills-2.jpg create mode 100644 public/assets/images/resource/testimonial-1.png create mode 100644 public/assets/images/resource/testimonial-2.png create mode 100644 public/assets/images/resource/testimonial-3.png create mode 100644 public/assets/images/resource/testimonial-4.png create mode 100644 public/assets/images/resource/testimonial-5.png create mode 100644 public/assets/images/resource/testimonial-6.png create mode 100644 public/assets/images/resource/thumb-1.png create mode 100644 public/assets/images/resource/thumb-2.png create mode 100644 public/assets/images/resource/thumb-3.png create mode 100644 public/assets/images/resource/thumb-4.png create mode 100644 public/assets/images/resource/thumb-5.png create mode 100644 public/assets/images/resource/thumb-6.png create mode 100644 public/assets/images/resource/video-1.png create mode 100644 public/assets/images/resource/video-2.png create mode 100644 public/assets/images/resource/video-3.png create mode 100644 public/assets/images/service/service-1.jpg create mode 100644 public/assets/images/service/service-10.jpg create mode 100644 public/assets/images/service/service-11.jpg create mode 100644 public/assets/images/service/service-12.jpg create mode 100644 public/assets/images/service/service-13.jpg create mode 100644 public/assets/images/service/service-14.jpg create mode 100644 public/assets/images/service/service-2.jpg create mode 100644 public/assets/images/service/service-3.jpg create mode 100644 public/assets/images/service/service-4.jpg create mode 100644 public/assets/images/service/service-5.jpg create mode 100644 public/assets/images/service/service-6.jpg create mode 100644 public/assets/images/service/service-7.jpg create mode 100644 public/assets/images/service/service-8.jpg create mode 100644 public/assets/images/service/service-9.jpg create mode 100644 public/assets/images/shape/shape-1.png create mode 100644 public/assets/images/shape/shape-10.png create mode 100644 public/assets/images/shape/shape-11.png create mode 100644 public/assets/images/shape/shape-12.png create mode 100644 public/assets/images/shape/shape-13.png create mode 100644 public/assets/images/shape/shape-14.png create mode 100644 public/assets/images/shape/shape-15.png create mode 100644 public/assets/images/shape/shape-16.png create mode 100644 public/assets/images/shape/shape-17.png create mode 100644 public/assets/images/shape/shape-18.png create mode 100644 public/assets/images/shape/shape-19.png create mode 100644 public/assets/images/shape/shape-2.png create mode 100644 public/assets/images/shape/shape-20.png create mode 100644 public/assets/images/shape/shape-21.png create mode 100644 public/assets/images/shape/shape-22.png create mode 100644 public/assets/images/shape/shape-23.png create mode 100644 public/assets/images/shape/shape-24.png create mode 100644 public/assets/images/shape/shape-25.png create mode 100644 public/assets/images/shape/shape-26.png create mode 100644 public/assets/images/shape/shape-27.png create mode 100644 public/assets/images/shape/shape-28.png create mode 100644 public/assets/images/shape/shape-29.png create mode 100644 public/assets/images/shape/shape-3.png create mode 100644 public/assets/images/shape/shape-30.png create mode 100644 public/assets/images/shape/shape-31.png create mode 100644 public/assets/images/shape/shape-32.png create mode 100644 public/assets/images/shape/shape-33.png create mode 100644 public/assets/images/shape/shape-34.png create mode 100644 public/assets/images/shape/shape-35.png create mode 100644 public/assets/images/shape/shape-4.png create mode 100644 public/assets/images/shape/shape-5.png create mode 100644 public/assets/images/shape/shape-6.png create mode 100644 public/assets/images/shape/shape-7.png create mode 100644 public/assets/images/shape/shape-8.png create mode 100644 public/assets/images/shape/shape-9.png create mode 100644 public/assets/images/team/team-1.jpg create mode 100644 public/assets/images/team/team-10.jpg create mode 100644 public/assets/images/team/team-11.jpg create mode 100644 public/assets/images/team/team-12.jpg create mode 100644 public/assets/images/team/team-13.jpg create mode 100644 public/assets/images/team/team-2.jpg create mode 100644 public/assets/images/team/team-3.jpg create mode 100644 public/assets/images/team/team-4.jpg create mode 100644 public/assets/images/team/team-5.jpg create mode 100644 public/assets/images/team/team-6.jpg create mode 100644 public/assets/images/team/team-7.jpg create mode 100644 public/assets/images/team/team-8.jpg create mode 100644 public/assets/images/team/team-9.jpg create mode 100644 public/assets/js/appear.js create mode 100644 public/assets/js/bootstrap.min.js create mode 100644 public/assets/js/gmaps.js create mode 100644 public/assets/js/isotope.js create mode 100644 public/assets/js/jQuery.style.switcher.min.js create mode 100644 public/assets/js/jquery-ui.js create mode 100644 public/assets/js/jquery.fancybox.js create mode 100644 public/assets/js/jquery.js create mode 100644 public/assets/js/jquery.nice-select.min.js create mode 100644 public/assets/js/map-helper.js create mode 100644 public/assets/js/nav-tool.js create mode 100644 public/assets/js/owl.js create mode 100644 public/assets/js/pagenav.js create mode 100644 public/assets/js/parallax-scroll.js create mode 100644 public/assets/js/script.js create mode 100644 public/assets/js/timePicker.js create mode 100644 public/assets/js/validation.js create mode 100644 public/assets/js/wow.js create mode 100644 public/next.svg create mode 100644 public/vercel.svg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6db9066 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + + +.zip \ No newline at end of file diff --git a/app/about-us/page.js b/app/about-us/page.js new file mode 100644 index 0000000..94a9c0e --- /dev/null +++ b/app/about-us/page.js @@ -0,0 +1,306 @@ +'use client' +import Layout from "@/components/layout/Layout" +import TestimonialSlider3 from '@/components/slider/TestmonialSlider3' +import Link from "next/link" +import { useState } from 'react' + +export default function Home() { + const [isOpen, setOpen] = useState(false) + const [isActive, setIsActive] = useState({ + status: false, + key: 1, + }) + + const handleToggle = (key) => { + if (isActive.key === key) { + setIsActive({ + status: false, + }) + } else { + setIsActive({ + status: true, + key, + }) + } + } + return ( + <> + + {/* about-section */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Wade Warren

+ Medical Assistant +
+
+
+
+
+
+
+
+ About Us +

Medical services & diagnostics

+
+
+

Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.

+
    +
  • Refresing to get such a personal touch.
  • +
  • Duis aute irure dolor in reprehenrit in voluptate.
  • +
  • Velit esse cillum dolore eu fugiat nua pariatur.
  • +
+
+
+
+
+

32 Years

+ Of Medical Experience +
+
+
+
+
+
+
+
+
+
+ {/* about-section end */} + + + {/* process */} +
+
+
+
+
+
+
+
+ Process +

How it Helps You to
Keep Healthy

+
+
+
+
+
+ 01 +
+
+

Get Appointment

+

Lorem ipsum dolor sit amet, conse ctetur adipiscing elit.

+
+
+
+
+
+ 02 +
+
+

Start Check-Up

+

Lorem ipsum dolor sit amet, conse ctetur adipiscing elit.

+
+
+
+
+
+ 03 +
+
+

Enjoy Healthy Life

+

Lorem ipsum dolor sit amet, conse ctetur adipiscing elit.

+
+
+
+
+
+
+ {/* process end */} + + + {/* testimonial-section */} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TESTIMONIALS +

What Our Client Say About medimart

+
+
+ {/*Theme Carousel*/} + +
+
+ +
+
+
+
+ {/* testimonial-section */} + + + + + + {/* team-section-style-two */} +
+
+
+
+
+
+
+
+ Our Team +

Meet our experienced doctors
for the best treatment

+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Black Marvin

+ Medical Assistant +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Eleanor Pena

+ Doctor +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Arlene Maccy

+ Nursing Assistant +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Jenny Wilson

+ Senior Doctor +
+
+
+
+
+
+
+ {/* team-section-style-two end */} + {/* subscibe */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscibe end */} + + + +
+ + ) +} + + diff --git a/app/appointment/page.js b/app/appointment/page.js new file mode 100644 index 0000000..abeabe6 --- /dev/null +++ b/app/appointment/page.js @@ -0,0 +1,252 @@ +'use client' +import Layout from "@/components/layout/Layout" + +import Link from "next/link" +import { useState } from 'react' +import ModalVideo from 'react-modal-video' +export default function Home() { + const [isOpen, setOpen] = useState(false) + const [isActive, setIsActive] = useState({ + status: false, + key: 1, + }) + + const handleToggle = (key) => { + if (isActive.key === key) { + setIsActive({ + status: false, + }) + } else { + setIsActive({ + status: true, + key, + }) + } + } + return ( + <> + + {/* Appointments-section */} +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ {/* Appointments-section end */} + + + {/* video */} +
+
+
+
+
+
+ +

Online Consultations With
Qualified Doctors

+
+ Make an Appointment +
+
+
+
+ {/* video end */} + + + {/* team-section */} +
+
+
+
+
+
+
+
+ Our Team +

Meet our experienced doctors
for the best treatment

+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Black Marvin

+ Medical Assistant +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Eleanor Pena

+ Doctor +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Arlene Maccy

+ Nursing Assistant +
+
+
+
+
+
+
+
+
+
    +
  • +
  • +
  • +
  • +
+
+
+

Jenny Wilson

+ Senior Doctor +
+
+
+
+
+
+
+ {/* team-section */} + + + + + + + {/* subscibe */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscibe end */} + + setOpen(false)} /> + + +
+ + ) +} + + diff --git a/app/blog-2/page.js b/app/blog-2/page.js new file mode 100644 index 0000000..1916c3d --- /dev/null +++ b/app/blog-2/page.js @@ -0,0 +1,199 @@ + +import Layout from "@/components/layout/Layout" +import Link from "next/link" +export default function Home() { + + return ( + <> + +
+ {/* sidebar-page-container */} +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Categories

+
+
+
    +
  • Cardiology
  • +
  • Dental Clinic
  • +
  • Neurosurgery
  • +
  • Medical
  • +
  • Pediatrics
  • +
  • Modern Laboratory
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Archives

+
+
+
    +
  • December 2021
  • +
  • October 2021
  • +
  • January 2022
  • +
  • October 2022
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Tags

+
+
+
    +
  • Adventures
  • +
  • Health
  • +
  • Care
  • +
  • Cardiac
  • +
  • Doctors
  • +
  • Cardiac
  • +
  • Hospital
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 12 Jan 2022
  • +
  • 03 Comt
  • +
+

How do Inherited Retinal of Diseases Happen?

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+ {/* Repeat similar blocks for other news items */} +
+
+
+
+
    +
  • Admin
  • +
  • 11 Jan 2022
  • +
  • 05 Comt
  • +
+

Prepare to Speak with Your Eye Specialist.

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+ {/* Repeat similar blocks for other news items */} +
+
+
+
+
    +
  • Admin
  • +
  • 10 Jan 2022
  • +
  • 0 Comt
  • +
+

How reliece can help you manage diabetes

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+ {/* Repeat similar blocks for other news items */} +
+
+
+
+
    +
  • Admin
  • +
  • 09 Jan 2022
  • +
  • 03 Comt
  • +
+

What Causes Inherited Retinal Diseases?

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
    +
  • 1
  • +
  • 2
  • +
  • 3
  • +
  • +
+
+
+
+
+
+
+ {/* sidebar-page-container end */} + {/* subscribe-two */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscribe end */} +
+ +
+ + ) +} diff --git a/app/blog-details/page.js b/app/blog-details/page.js new file mode 100644 index 0000000..4e97979 --- /dev/null +++ b/app/blog-details/page.js @@ -0,0 +1,267 @@ + +import Layout from "@/components/layout/Layout" +import Link from "next/link" +export default function Home() { + + return ( + <> + + {/* sidebar-page-container */} +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Categories

+
+
+
    +
  • Cardiology
  • +
  • Dental Clinic
  • +
  • Neurosurgery
  • +
  • Medical
  • +
  • Pediatrics
  • +
  • Modern Laboratory
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Archives

+
+
+
    +
  • December 2021
  • +
  • October 2021
  • +
  • January 2022
  • +
  • October 2022
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Latest Post

+
+
+
+
+
What Causes Inherited Retinal Diseases?
+
    +
  • 09 Jan 2022
  • +
  • 03 Comt
  • +
+
+
+
+
How reliece can help you manage diabetes
+
    +
  • 10 Jan 2022
  • +
  • 05 Comt
  • +
+
+
+
+
Prepare to Speak with Your Eye Specialist.
+
    +
  • 11 Jan 2022
  • +
  • 01 Comt
  • +
+
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Gallery

+
+
+
    +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
  • +
    +
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+

Tags

+
+
+
    +
  • Adventures
  • +
  • Health
  • +
  • Care
  • +
  • Cardiac
  • +
  • Doctors
  • +
  • Cardiac
  • +
  • Hospital
  • +
+
+
+ {/* Add more sidebar widgets as needed */} +
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 15 Jan 2022
  • +
  • 03 Comt
  • +
+

What Causes Inherited Retinal Diseases?

+

The abbreviation IRD refers to a group of hereditary conditions called retinal diseases...

+

of the retinal cells in our bodies. A “mistake” or alteration in one or more genes causes IRDs. Because of this, retinal cells don’t function properly, which eventually results in vision loss. Already, 250 genes have been linked to IRD.

+

There are many more genes, but they haven’t all been discovered. Each IRD may be passed down differently within a family from one generation to the next. It’s possible that you or a member of your family has an IRD. You might be the oldest member of your family.

+

Results Are Easy To Obtain

+

Nullam elit elit, vehicula sit amet lobortis quis, luctus vitae purus. Etiam vitae leo non magna venenatis congue. Ut commodo, tellus id gravida ultricies, libero mauris aliquam enim, in luctus nunc nisi eu neque. Aenean lacinia, tortor ac sagittis venenatis, massa velit fringilla tortor, a venenatis mi sapien. Maecenas a tellus at justo molestie pulvinar

+
+
+
+
+
+
+
+
+
+
+

Nullam elit elit, vehicula sit amet lobortis quis, luctus vitae purus. Etiam vitae leo non magna venenatis congue. Ut commodo, tellus id gravida ultricies, libero mauris aliquam enim, in luctus nunc nisi eu neque. Aenean lacinia, tortor ac sagittis venenatis, massa velit fringilla tortor, a venenatis mi sapien. Maecenas a tellus at justo molestie pulvinar

+
+
+

“It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.“

+

Ralph Edwards

+ Dog Trainer +
+

Nullam elit elit, vehicula sit amet lobortis quis, luctus vitae purus. Etiam vitae leo non magna venenatis congue. Ut commodo, tellus id gravida ultricies, libero mauris aliquam enim, in luctus nunc nisi eu neque. Aenean lacinia, tortor ac sagittis venenatis, massa velit fringilla tortor, a venenatis mi sapien. Maecenas a tellus at justo molestie pulvinar

+
+
+
+ {/* Repeat similar blocks for other content */} +
+
    +
  • Popular Tags:

  • +
  • Adventures
  • +
  • Health
  • +
  • Care
  • +
  • Hospital
  • +
+
+
+

Leave A Comment

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+

2 Comments

+
+
+
+
+ 08 Jan 2023 +
+

Jane Cooper

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus ornare non non massa elit rutrum. Eros proin nibh neque interdum accumsan, neque vitae. Tortor etiam sed suspendisse.

+ Reply +
+ {/* Additional comments if any */} +
+
+
+
+ 07 Jan 2023 +
+

Marvin McKinney

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cursus ornare non non massa elit rutrum. Eros proin nibh neque interdum accumsan, neque vitae. Tortor etiam sed suspendisse.

+ Reply +
+
+
+
+
+
+
+ {/* sidebar-page-container end */} + {/* subscribe-two */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscribe end */} + +
+ + ) +} diff --git a/app/blog/page.js b/app/blog/page.js new file mode 100644 index 0000000..7e5b77c --- /dev/null +++ b/app/blog/page.js @@ -0,0 +1,172 @@ + +import Layout from "@/components/layout/Layout" +import Link from "next/link" +export default function Home() { + + return ( + <> + +
+ {/* news-style-two */} +
+
+
+ Our Blog +

Take a look at our most
recent articles

+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 12 Jan 2022
  • +
  • 03 Comt
  • +
+

How do Inherited Retinal of Diseases Happen?

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 11 Jan 2022
  • +
  • 0 Comt
  • +
+

Prepare to Speak with Your Eye Specialist.

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 11 Jan 2022
  • +
  • 02 Comt
  • +
+

How reliece can help you manage diabetes

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 12 Jan 2022
  • +
  • 03 Comt
  • +
+

What Causes Inherited Retinal Diseases?

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 10 Jan 2022
  • +
  • 7 Comt
  • +
+

Get The Exercise Limited Mobility

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+
+
+
    +
  • Admin
  • +
  • 08 Jan 2022
  • +
  • 02 Comt
  • +
+

What Leads to Inherited Eye Conditions?

+

Tincidunt Maur nemi sit Interdum praesento eget morbi lacinia volutpat pellentesque Tincidunt aurna suspit.

+
+ Read More +
+
+
+
+
+
+
+
+ {/* news-style-two end */} + {/* subscribe-two */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscribe end */} +
+ +
+ + ) +} \ No newline at end of file diff --git a/app/chooseus/page.js b/app/chooseus/page.js new file mode 100644 index 0000000..bb115bf --- /dev/null +++ b/app/chooseus/page.js @@ -0,0 +1,345 @@ +'use client' +import CounterUp from "@/components/elements/CounterUp" +import Layout from "@/components/layout/Layout" + +import Link from "next/link" +import { useState } from 'react' +import ModalVideo from 'react-modal-video' +const ProgressBar = ({ label, percent }) => ( +
+

{label}

+
+
+
{`${percent}%`}
+
+
+ ); +export default function Home() { + const [isOpen, setOpen] = useState(false) + const [isActive, setIsActive] = useState({ + status: false, + key: 1, + }) + + const handleToggle = (key) => { + if (isActive.key === key) { + setIsActive({ + status: false, + }) + } else { + setIsActive({ + status: true, + key, + }) + } + } + + return ( + <> + + {/* chooseus-section */} +
+
+
+
+
+
+
+
+ Why Choose Us +

Choose The Best For Your
Health

+
+
+
+
+
+
+

Professional Staff

+

Amet minim mollit non deserunt aliqua dolor do amet sint.

+
+
+
+
+
+
+
+

Emergency Case

+

Amet minim mollit non deserunt aliqua dolor do amet sint.

+
+
+
+
+
+
+
+

Online Appointment

+

Amet minim mollit non deserunt aliqua dolor do amet sint.

+
+
+
+
+
+
+
+

24/7 Services

+

Amet minim mollit non deserunt aliqua dolor do amet sint.

+
+
+
+
+
+
+
+
+
+ {/* chooseus-section end */} + + + {/* cta */} +
+
+
+
+
+
+ Need a Doctor for Check-up? +

Call for an emergency service when you have a need!

+
+ Make an Appointment +
+
+
+
+
+ {/* cta end */} + + + {/* funfact-section */} +
+
+
+
+
+
+
+ +
+ + +
+ Expert Doctors +
+
+
+
+
+
+ +
+ k +
+ Happy Patients +
+
+
+
+
+
+ +
+ +
+ Modern Rooms +
+
+
+
+
+
+ +
+ +
+ Awards Win +
+
+
+
+
+
+
+ {/* funfact-section */} + + {/* */} +
+
+
+
+
+
+ Better Solutions +

Quality Medical Service with Experts

+
+
+ + + + +
+
+ Discover More +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + {/* */} + {/* */} +
+
+
+
+
+
+
+
+ Our Team +

Meet our experienced doctors
for the best treatment

+
+
+
+
+
+
+
+
+
+

Black Marvin

+ Medical Assistant +
    +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
+
+
+
+
+

Eleanor Pena

+ Doctor +
    +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
+
+
+
+
+

Arlene Maccy

+ Nursing Assistant +
    +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
+
+
+
+
+

Jenny Wilson

+ Senior Doctor +
    +
  • +
  • +
  • +
  • +
+
+
+
+
+
+
+
+ + {/* */} + + + + + {/* subscibe */} +
+
+
+
+
+
+

Subscribe for the exclusive updates!

+
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+ {/* subscibe end */} + + setOpen(false)} /> + + +
+ + ) +} + + diff --git a/app/contact/page.js b/app/contact/page.js new file mode 100644 index 0000000..702b8bd --- /dev/null +++ b/app/contact/page.js @@ -0,0 +1,133 @@ + +import Layout from "@/components/layout/Layout" +import Link from "next/link" +export default function Home() { + + return ( + <> + +
+ {/* Contact Form Section */} +
+
+
+
+
+

Quick Contact

+
+
+

Main Office:
(+233)456-789-01, +10456-789-01

+
+
+
+
+
+

Email Address

+
+
+

Mail:
info@example.com

+
+
+
+
+
+

Mailing Address

+
+
+

3891 Ranchview Dr. Richardson,
California 62639

+
+
+
+
+
+
+ {/* Contact Form Section End */} + {/* Contact Form Section2 */} +
+
+
+
+
+
+

Send a Message

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ {/* Contact Form Section2 End */} + + {/* Google Map Section */} +
+ {/*Map Outer*/} +
+ ', + + // Preload iframe before displaying it + // This allows to calculate iframe content width and height + // (note: Due to "Same Origin Policy", you can't get cross domain data). + preload : true, + + // Custom CSS styling for iframe wrapping element + // You can use this to set custom iframe dimensions + css : {}, + + // Iframe tag attributes + attr : { + scrolling : 'auto' + } + + }, + + // Default content type if cannot be detected automatically + defaultType : 'image', + + // Open/close animation type + // Possible values: + // false - disable + // "zoom" - zoom images from/to thumbnail + // "fade" + // "zoom-in-out" + // + animationEffect : "zoom", + + // Duration in ms for open/close animation + animationDuration : 500, + + // Should image change opacity while zooming + // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios + zoomOpacity : "auto", + + // Transition effect between slides + // + // Possible values: + // false - disable + // "fade' + // "slide' + // "circular' + // "tube' + // "zoom-in-out' + // "rotate' + // + transitionEffect : "fade", + + // Duration in ms for transition animation + transitionDuration : 366, + + // Custom CSS class for slide element + slideClass : '', + + // Custom CSS class for layout + baseClass : '', + + // Base template for layout + baseTpl : + '', + + // Loading indicator template + spinnerTpl : '
', + + // Error message template + errorTpl : '

{{ERROR}}

', + + btnTpl : { + + download : '' + + '' + + '' + + '' + + '', + + zoom : '', + + close : '', + + // This small close button will be appended to your html/inline/ajax content by default, + // if "smallBtn" option is not set to false + smallBtn : '', + + // Arrows + arrowLeft : '', + + arrowRight : '' + }, + + // Container is injected into this element + parentEl : 'body', + + + // Focus handling + // ============== + + // Try to focus on the first focusable element after opening + autoFocus : false, + + // Put focus back to active element after closing + backFocus : true, + + // Do not let user to focus on element outside modal content + trapFocus : true, + + + // Module specific options + // ======================= + + fullScreen : { + autoStart : false, + }, + + // Set `touch: false` to disable dragging/swiping + touch : { + vertical : true, // Allow to drag content vertically + momentum : true // Continue movement after releasing mouse/touch when panning + }, + + // Hash value when initializing manually, + // set `false` to disable hash change + hash : null, + + // Customize or add new media types + // Example: + /* + media : { + youtube : { + params : { + autoplay : 0 + } + } + } + */ + media : {}, + + slideShow : { + autoStart : false, + speed : 4000 + }, + + thumbs : { + autoStart : false, // Display thumbnails on opening + hideOnClose : true, // Hide thumbnail grid when closing animation starts + parentEl : '.fancybox-container', // Container is injected into this element + axis : 'y' // Vertical (y) or horizontal (x) scrolling + }, + + // Use mousewheel to navigate gallery + // If 'auto' - enabled for images only + wheel : 'auto', + + // Callbacks + //========== + + // See Documentation/API/Events for more information + // Example: + /* + afterShow: function( instance, current ) { + console.info( 'Clicked element:' ); + console.info( current.opts.$orig ); + } + */ + + onInit : $.noop, // When instance has been initialized + + beforeLoad : $.noop, // Before the content of a slide is being loaded + afterLoad : $.noop, // When the content of a slide is done loading + + beforeShow : $.noop, // Before open animation starts + afterShow : $.noop, // When content is done loading and animating + + beforeClose : $.noop, // Before the instance attempts to close. Return false to cancel the close. + afterClose : $.noop, // After instance has been closed + + onActivate : $.noop, // When instance is brought to front + onDeactivate : $.noop, // When other instance has been activated + + + // Interaction + // =========== + + // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, + // each option can be string or method that returns value. + // + // Possible values: + // "close" - close instance + // "next" - move to next gallery item + // "nextOrClose" - move to next gallery item or close if gallery has only one item + // "toggleControls" - show/hide controls + // "zoom" - zoom image (if loaded) + // false - do nothing + + // Clicked on the content + clickContent : function( current, event ) { + return current.type === 'image' ? 'zoom' : false; + }, + + // Clicked on the slide + clickSlide : 'close', + + // Clicked on the background (backdrop) element + clickOutside : 'close', + + // Same as previous two, but for double click + dblclickContent : false, + dblclickSlide : false, + dblclickOutside : false, + + + // Custom options when mobile device is detected + // ============================================= + + mobile : { + idleTime : false, + margin : 0, + + clickContent : function( current, event ) { + return current.type === 'image' ? 'toggleControls' : false; + }, + clickSlide : function( current, event ) { + return current.type === 'image' ? 'toggleControls' : 'close'; + }, + dblclickContent : function( current, event ) { + return current.type === 'image' ? 'zoom' : false; + }, + dblclickSlide : function( current, event ) { + return current.type === 'image' ? 'zoom' : false; + } + }, + + + // Internationalization + // ============ + + lang : 'en', + i18n : { + 'en' : { + CLOSE : 'Close', + NEXT : 'Next', + PREV : 'Previous', + ERROR : 'The requested content cannot be loaded.
Please try again later.', + PLAY_START : 'Start slideshow', + PLAY_STOP : 'Pause slideshow', + FULL_SCREEN : 'Full screen', + THUMBS : 'Thumbnails', + DOWNLOAD : 'Download', + SHARE : 'Share', + ZOOM : 'Zoom' + }, + 'de' : { + CLOSE : 'Schliessen', + NEXT : 'Weiter', + PREV : 'Zurück', + ERROR : 'Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.', + PLAY_START : 'Diaschau starten', + PLAY_STOP : 'Diaschau beenden', + FULL_SCREEN : 'Vollbild', + THUMBS : 'Vorschaubilder', + DOWNLOAD : 'Herunterladen', + SHARE : 'Teilen', + ZOOM : 'Maßstab' + } + } + + }; + + // Few useful variables and methods + // ================================ + + var $W = $(window); + var $D = $(document); + + var called = 0; + + + // Check if an object is a jQuery object and not a native JavaScript object + // ======================================================================== + + var isQuery = function ( obj ) { + return obj && obj.hasOwnProperty && obj instanceof $; + }; + + + // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" + // =============================================================================== + + var requestAFrame = (function () { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + + + // Detect the supported transition-end event property name + // ======================================================= + + var transitionEnd = (function () { + var t, el = document.createElement("fakeelement"); + + var transitions = { + "transition" : "transitionend", + "OTransition" : "oTransitionEnd", + "MozTransition" : "transitionend", + "WebkitTransition": "webkitTransitionEnd" + }; + + for (t in transitions) { + if (el.style[t] !== undefined){ + return transitions[t]; + } + } + + return 'transitionend'; + })(); + + + // Force redraw on an element. + // This helps in cases where the browser doesn't redraw an updated element properly. + // ================================================================================= + + var forceRedraw = function( $el ) { + return ( $el && $el.length && $el[0].offsetHeight ); + }; + + + // Class definition + // ================ + + var FancyBox = function( content, opts, index ) { + var self = this; + + self.opts = $.extend( true, { index : index }, $.fancybox.defaults, opts || {} ); + + if ( $.fancybox.isMobile ) { + self.opts = $.extend( true, {}, self.opts, self.opts.mobile ); + } + + // Exclude buttons option from deep merging + if ( opts && $.isArray( opts.buttons ) ) { + self.opts.buttons = opts.buttons; + } + + self.id = self.opts.id || ++called; + self.group = []; + + self.currIndex = parseInt( self.opts.index, 10 ) || 0; + self.prevIndex = null; + + self.prevPos = null; + self.currPos = 0; + + self.firstRun = null; + + // Create group elements from original item collection + self.createGroup( content ); + + if ( !self.group.length ) { + return; + } + + // Save last active element and current scroll position + self.$lastFocus = $(document.activeElement).blur(); + + // Collection of gallery objects + self.slides = {}; + + self.init(); + }; + + $.extend(FancyBox.prototype, { + + // Create DOM structure + // ==================== + + init : function() { + var self = this, + firstItem = self.group[ self.currIndex ], + firstItemOpts = firstItem.opts, + scrollbarWidth = $.fancybox.scrollbarWidth, + $scrollDiv, + $container, + buttonStr; + + self.scrollTop = $D.scrollTop(); + self.scrollLeft = $D.scrollLeft(); + + + // Hide scrollbars + // =============== + + if ( !$.fancybox.getInstance() ) { + + $( 'body' ).addClass( 'fancybox-active' ); + + // iOS hack + if ( /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream ) { + + // iOS has problems for input elements inside fixed containers, + // the workaround is to apply `position: fixed` to `` element, + // unfortunately, this makes it lose the scrollbars and forces address bar to appear. + + if ( firstItem.type !== 'image' ) { + $( 'body' ).css( 'top', $( 'body' ).scrollTop() * -1 ).addClass( 'fancybox-iosfix' ); + } + + } else if ( !$.fancybox.isMobile && document.body.scrollHeight > window.innerHeight ) { + + if ( scrollbarWidth === undefined ) { + $scrollDiv = $('
').appendTo( 'body' ); + + scrollbarWidth = $.fancybox.scrollbarWidth = $scrollDiv[0].offsetWidth - $scrollDiv[0].clientWidth; + + $scrollDiv.remove(); + } + + $( 'head' ).append( '' ); + $( 'body' ).addClass( 'compensate-for-scrollbar' ); + } + } + + + // Build html markup and set references + // ==================================== + + // Build html code for buttons and insert into main template + buttonStr = ''; + + $.each( firstItemOpts.buttons, function( index, value ) { + buttonStr += ( firstItemOpts.btnTpl[ value ] || '' ); + }); + + // Create markup from base template, it will be initially hidden to + // avoid unnecessary work like painting while initializing is not complete + $container = $( + self.translate( self, + firstItemOpts.baseTpl + .replace( '\{\{buttons\}\}', buttonStr ) + .replace( '\{\{arrows\}\}', firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight ) + ) + ) + .attr( 'id', 'fancybox-container-' + self.id ) + .addClass( 'fancybox-is-hidden' ) + .addClass( firstItemOpts.baseClass ) + .data( 'FancyBox', self ) + .appendTo( firstItemOpts.parentEl ); + + // Create object holding references to jQuery wrapped nodes + self.$refs = { + container : $container + }; + + [ 'bg', 'inner', 'infobar', 'toolbar', 'stage', 'caption', 'navigation' ].forEach(function(item) { + self.$refs[ item ] = $container.find( '.fancybox-' + item ); + }); + + self.trigger( 'onInit' ); + + // Enable events, deactive previous instances + self.activate(); + + // Build slides, load and reveal content + self.jumpTo( self.currIndex ); + }, + + + // Simple i18n support - replaces object keys found in template + // with corresponding values + // ============================================================ + + translate : function( obj, str ) { + var arr = obj.opts.i18n[ obj.opts.lang ]; + + return str.replace(/\{\{(\w+)\}\}/g, function(match, n) { + var value = arr[n]; + + if ( value === undefined ) { + return match; + } + + return value; + }); + }, + + // Create array of gally item objects + // Check if each object has valid type and content + // =============================================== + + createGroup : function ( content ) { + var self = this; + var items = $.makeArray( content ); + + $.each(items, function( i, item ) { + var obj = {}, + opts = {}, + $item, + type, + found, + src, + srcParts; + + // Step 1 - Make sure we have an object + // ==================================== + + if ( $.isPlainObject( item ) ) { + + // We probably have manual usage here, something like + // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) + + obj = item; + opts = item.opts || item; + + } else if ( $.type( item ) === 'object' && $( item ).length ) { + + // Here we probably have jQuery collection returned by some selector + $item = $( item ); + + opts = $item.data(); + opts = $.extend( {}, opts, opts.options || {} ); + + // Here we store clicked element + opts.$orig = $item; + + obj.src = opts.src || $item.attr( 'href' ); + + // Assume that simple syntax is used, for example: + // `$.fancybox.open( $("#test"), {} );` + if ( !obj.type && !obj.src ) { + obj.type = 'inline'; + obj.src = item; + } + + } else { + + // Assume we have a simple html code, for example: + // $.fancybox.open( '

Hi!

' ); + + obj = { + type : 'html', + src : item + '' + }; + + } + + // Each gallery object has full collection of options + obj.opts = $.extend( true, {}, self.opts, opts ); + + // Do not merge buttons array + if ( $.isArray( opts.buttons ) ) { + obj.opts.buttons = opts.buttons; + } + + + // Step 2 - Make sure we have content type, if not - try to guess + // ============================================================== + + type = obj.type || obj.opts.type; + src = obj.src || ''; + + if ( !type && src ) { + if ( src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i) ) { + type = 'image'; + + } else if ( src.match(/\.(pdf)((\?|#).*)?$/i) ) { + type = 'pdf'; + + } else if ( found = src.match(/\.(mp4|mov|ogv)((\?|#).*)?$/i) ) { + type = 'video'; + + if ( !obj.opts.videoFormat ) { + obj.opts.videoFormat = 'video/' + ( found[1] === 'ogv' ? 'ogg' : found[1] ); + } + + } else if ( src.charAt(0) === '#' ) { + type = 'inline'; + } + } + + if ( type ) { + obj.type = type; + + } else { + self.trigger( 'objectNeedsType', obj ); + } + + + // Step 3 - Some adjustments + // ========================= + + obj.index = self.group.length; + + // Check if $orig and $thumb objects exist + if ( obj.opts.$orig && !obj.opts.$orig.length ) { + delete obj.opts.$orig; + } + + if ( !obj.opts.$thumb && obj.opts.$orig ) { + obj.opts.$thumb = obj.opts.$orig.find( 'img:first' ); + } + + if ( obj.opts.$thumb && !obj.opts.$thumb.length ) { + delete obj.opts.$thumb; + } + + // "caption" is a "special" option, it can be used to customize caption per gallery item .. + if ( $.type( obj.opts.caption ) === 'function' ) { + obj.opts.caption = obj.opts.caption.apply( item, [ self, obj ] ); + } + + if ( $.type( self.opts.caption ) === 'function' ) { + obj.opts.caption = self.opts.caption.apply( item, [ self, obj ] ); + } + + // Make sure we have caption as a string or jQuery object + if ( !( obj.opts.caption instanceof $ ) ) { + obj.opts.caption = obj.opts.caption === undefined ? '' : obj.opts.caption + ''; + } + + // Check if url contains "filter" used to filter the content + // Example: "ajax.html #something" + if ( type === 'ajax' ) { + srcParts = src.split(/\s+/, 2); + + if ( srcParts.length > 1 ) { + obj.src = srcParts.shift(); + + obj.opts.filter = srcParts.shift(); + } + } + + if ( obj.opts.smallBtn == 'auto' ) { + + if ( $.inArray( type, ['html', 'inline', 'ajax'] ) > -1 ) { + obj.opts.toolbar = false; + obj.opts.smallBtn = true; + + } else { + obj.opts.smallBtn = false; + } + + } + + // If the type is "pdf", then simply load file into iframe + if ( type === 'pdf' ) { + obj.type = 'iframe'; + + obj.opts.iframe.preload = false; + } + + // Hide all buttons and disable interactivity for modal items + if ( obj.opts.modal ) { + + obj.opts = $.extend(true, obj.opts, { + // Remove buttons + infobar : 0, + toolbar : 0, + + smallBtn : 0, + + // Disable keyboard navigation + keyboard : 0, + + // Disable some modules + slideShow : 0, + fullScreen : 0, + thumbs : 0, + touch : 0, + + // Disable click event handlers + clickContent : false, + clickSlide : false, + clickOutside : false, + dblclickContent : false, + dblclickSlide : false, + dblclickOutside : false + }); + + } + + // Step 4 - Add processed object to group + // ====================================== + + self.group.push( obj ); + + }); + + }, + + + // Attach an event handler functions for: + // - navigation buttons + // - browser scrolling, resizing; + // - focusing + // - keyboard + // - detect idle + // ====================================== + + addEvents : function() { + var self = this; + + self.removeEvents(); + + // Make navigation elements clickable + self.$refs.container.on('click.fb-close', '[data-fancybox-close]', function(e) { + e.stopPropagation(); + e.preventDefault(); + + self.close( e ); + + }).on( 'click.fb-prev touchend.fb-prev', '[data-fancybox-prev]', function(e) { + e.stopPropagation(); + e.preventDefault(); + + self.previous(); + + }).on( 'click.fb-next touchend.fb-next', '[data-fancybox-next]', function(e) { + e.stopPropagation(); + e.preventDefault(); + + self.next(); + + }).on( 'click.fb', '[data-fancybox-zoom]', function(e) { + // Click handler for zoom button + self[ self.isScaledDown() ? 'scaleToActual' : 'scaleToFit' ](); + }); + + + // Handle page scrolling and browser resizing + $W.on('orientationchange.fb resize.fb', function(e) { + + if ( e && e.originalEvent && e.originalEvent.type === "resize" ) { + + requestAFrame(function() { + self.update(); + }); + + } else { + + self.$refs.stage.hide(); + + setTimeout(function() { + self.$refs.stage.show(); + + self.update(); + }, 600); + + } + + }); + + // Trap keyboard focus inside of the modal, so the user does not accidentally tab outside of the modal + // (a.k.a. "escaping the modal") + $D.on('focusin.fb', function(e) { + var instance = $.fancybox ? $.fancybox.getInstance() : null; + + if ( instance.isClosing || !instance.current || !instance.current.opts.trapFocus || $( e.target ).hasClass( 'fancybox-container' ) || $( e.target ).is( document ) ) { + return; + } + + if ( instance && $( e.target ).css( 'position' ) !== 'fixed' && !instance.$refs.container.has( e.target ).length ) { + e.stopPropagation(); + + instance.focus(); + + // Sometimes page gets scrolled, set it back + $W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft ); + } + }); + + + // Enable keyboard navigation + $D.on('keydown.fb', function (e) { + var current = self.current, + keycode = e.keyCode || e.which; + + if ( !current || !current.opts.keyboard ) { + return; + } + + if ( $(e.target).is('input') || $(e.target).is('textarea') ) { + return; + } + + // Backspace and Esc keys + if ( keycode === 8 || keycode === 27 ) { + e.preventDefault(); + + self.close( e ); + + return; + } + + // Left arrow and Up arrow + if ( keycode === 37 || keycode === 38 ) { + e.preventDefault(); + + self.previous(); + + return; + } + + // Righ arrow and Down arrow + if ( keycode === 39 || keycode === 40 ) { + e.preventDefault(); + + self.next(); + + return; + } + + self.trigger('afterKeydown', e, keycode); + }); + + + // Hide controls after some inactivity period + if ( self.group[ self.currIndex ].opts.idleTime ) { + self.idleSecondsCounter = 0; + + $D.on('mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle', function(e) { + self.idleSecondsCounter = 0; + + if ( self.isIdle ) { + self.showControls(); + } + + self.isIdle = false; + }); + + self.idleInterval = window.setInterval(function() { + self.idleSecondsCounter++; + + if ( self.idleSecondsCounter >= self.group[ self.currIndex ].opts.idleTime && !self.isDragging ) { + self.isIdle = true; + self.idleSecondsCounter = 0; + + self.hideControls(); + } + + }, 1000); + } + + }, + + + // Remove events added by the core + // =============================== + + removeEvents : function() { + var self = this; + + $W.off( 'orientationchange.fb resize.fb' ); + $D.off( 'focusin.fb keydown.fb .fb-idle' ); + + this.$refs.container.off( '.fb-close .fb-prev .fb-next' ); + + if ( self.idleInterval ) { + window.clearInterval( self.idleInterval ); + + self.idleInterval = null; + } + }, + + + // Change to previous gallery item + // =============================== + + previous : function( duration ) { + return this.jumpTo( this.currPos - 1, duration ); + }, + + + // Change to next gallery item + // =========================== + + next : function( duration ) { + return this.jumpTo( this.currPos + 1, duration ); + }, + + + // Switch to selected gallery item + // =============================== + + jumpTo : function ( pos, duration, slide ) { + var self = this, + firstRun, + loop, + current, + previous, + canvasWidth, + currentPos, + transitionProps; + + var groupLen = self.group.length; + + if ( self.isDragging || self.isClosing || ( self.isAnimating && self.firstRun ) ) { + return; + } + + pos = parseInt( pos, 10 ); + loop = self.current ? self.current.opts.loop : self.opts.loop; + + if ( !loop && ( pos < 0 || pos >= groupLen ) ) { + return false; + } + + firstRun = self.firstRun = ( self.firstRun === null ); + + if ( groupLen < 2 && !firstRun && !!self.isDragging ) { + return; + } + + previous = self.current; + + self.prevIndex = self.currIndex; + self.prevPos = self.currPos; + + // Create slides + current = self.createSlide( pos ); + + if ( groupLen > 1 ) { + if ( loop || current.index > 0 ) { + self.createSlide( pos - 1 ); + } + + if ( loop || current.index < groupLen - 1 ) { + self.createSlide( pos + 1 ); + } + } + + self.current = current; + self.currIndex = current.index; + self.currPos = current.pos; + + self.trigger( 'beforeShow', firstRun ); + + self.updateControls(); + + currentPos = $.fancybox.getTranslate( current.$slide ); + + current.isMoved = ( currentPos.left !== 0 || currentPos.top !== 0 ) && !current.$slide.hasClass( 'fancybox-animated' ); + current.forcedDuration = undefined; + + if ( $.isNumeric( duration ) ) { + current.forcedDuration = duration; + } else { + duration = current.opts[ firstRun ? 'animationDuration' : 'transitionDuration' ]; + } + + duration = parseInt( duration, 10 ); + + // Fresh start - reveal container, current slide and start loading content + if ( firstRun ) { + + if ( current.opts.animationEffect && duration ) { + self.$refs.container.css( 'transition-duration', duration + 'ms' ); + } + + self.$refs.container.removeClass( 'fancybox-is-hidden' ); + + forceRedraw( self.$refs.container ); + + self.$refs.container.addClass( 'fancybox-is-open' ); + + // Make first slide visible (to display loading icon, if needed) + current.$slide.addClass( 'fancybox-slide--current' ); + + self.loadSlide( current ); + + self.preload( 'image' ); + + return; + } + + // Clean up + $.each(self.slides, function( index, slide ) { + $.fancybox.stop( slide.$slide ); + }); + + // Make current that slide is visible even if content is still loading + current.$slide.removeClass( 'fancybox-slide--next fancybox-slide--previous' ).addClass( 'fancybox-slide--current' ); + + // If slides have been dragged, animate them to correct position + if ( current.isMoved ) { + canvasWidth = Math.round( current.$slide.width() ); + + $.each(self.slides, function( index, slide ) { + var pos = slide.pos - current.pos; + + $.fancybox.animate( slide.$slide, { + top : 0, + left : ( pos * canvasWidth ) + ( pos * slide.opts.gutter ) + }, duration, function() { + + slide.$slide.removeAttr('style').removeClass( 'fancybox-slide--next fancybox-slide--previous' ); + + if ( slide.pos === self.currPos ) { + current.isMoved = false; + + self.complete(); + } + }); + }); + + } else { + self.$refs.stage.children().removeAttr( 'style' ); + } + + // Start transition that reveals current content + // or wait when it will be loaded + + if ( current.isLoaded ) { + self.revealContent( current ); + + } else { + self.loadSlide( current ); + } + + self.preload( 'image' ); + + if ( previous.pos === current.pos ) { + return; + } + + // Handle previous slide + // ===================== + + transitionProps = 'fancybox-slide--' + ( previous.pos > current.pos ? 'next' : 'previous' ); + + previous.$slide.removeClass( 'fancybox-slide--complete fancybox-slide--current fancybox-slide--next fancybox-slide--previous' ); + + previous.isComplete = false; + + if ( !duration || ( !current.isMoved && !current.opts.transitionEffect ) ) { + return; + } + + if ( current.isMoved ) { + previous.$slide.addClass( transitionProps ); + + } else { + + transitionProps = 'fancybox-animated ' + transitionProps + ' fancybox-fx-' + current.opts.transitionEffect; + + $.fancybox.animate( previous.$slide, transitionProps, duration, function() { + previous.$slide.removeClass( transitionProps ).removeAttr( 'style' ); + }); + + } + + }, + + + // Create new "slide" element + // These are gallery items that are actually added to DOM + // ======================================================= + + createSlide : function( pos ) { + + var self = this; + var $slide; + var index; + + index = pos % self.group.length; + index = index < 0 ? self.group.length + index : index; + + if ( !self.slides[ pos ] && self.group[ index ] ) { + $slide = $('
').appendTo( self.$refs.stage ); + + self.slides[ pos ] = $.extend( true, {}, self.group[ index ], { + pos : pos, + $slide : $slide, + isLoaded : false, + }); + + self.updateSlide( self.slides[ pos ] ); + } + + return self.slides[ pos ]; + }, + + + // Scale image to the actual size of the image + // =========================================== + + scaleToActual : function( x, y, duration ) { + + var self = this; + + var current = self.current; + var $what = current.$content; + + var imgPos, posX, posY, scaleX, scaleY; + + var canvasWidth = parseInt( current.$slide.width(), 10 ); + var canvasHeight = parseInt( current.$slide.height(), 10 ); + + var newImgWidth = current.width; + var newImgHeight = current.height; + + if ( !( current.type == 'image' && !current.hasError) || !$what || self.isAnimating ) { + return; + } + + $.fancybox.stop( $what ); + + self.isAnimating = true; + + x = x === undefined ? canvasWidth * 0.5 : x; + y = y === undefined ? canvasHeight * 0.5 : y; + + imgPos = $.fancybox.getTranslate( $what ); + + scaleX = newImgWidth / imgPos.width; + scaleY = newImgHeight / imgPos.height; + + // Get center position for original image + posX = ( canvasWidth * 0.5 - newImgWidth * 0.5 ); + posY = ( canvasHeight * 0.5 - newImgHeight * 0.5 ); + + // Make sure image does not move away from edges + if ( newImgWidth > canvasWidth ) { + posX = imgPos.left * scaleX - ( ( x * scaleX ) - x ); + + if ( posX > 0 ) { + posX = 0; + } + + if ( posX < canvasWidth - newImgWidth ) { + posX = canvasWidth - newImgWidth; + } + } + + if ( newImgHeight > canvasHeight) { + posY = imgPos.top * scaleY - ( ( y * scaleY ) - y ); + + if ( posY > 0 ) { + posY = 0; + } + + if ( posY < canvasHeight - newImgHeight ) { + posY = canvasHeight - newImgHeight; + } + } + + self.updateCursor( newImgWidth, newImgHeight ); + + $.fancybox.animate( $what, { + top : posY, + left : posX, + scaleX : scaleX, + scaleY : scaleY + }, duration || 330, function() { + self.isAnimating = false; + }); + + // Stop slideshow + if ( self.SlideShow && self.SlideShow.isActive ) { + self.SlideShow.stop(); + } + }, + + + // Scale image to fit inside parent element + // ======================================== + + scaleToFit : function( duration ) { + + var self = this; + + var current = self.current; + var $what = current.$content; + var end; + + if ( !( current.type == 'image' && !current.hasError) || !$what || self.isAnimating ) { + return; + } + + $.fancybox.stop( $what ); + + self.isAnimating = true; + + end = self.getFitPos( current ); + + self.updateCursor( end.width, end.height ); + + $.fancybox.animate( $what, { + top : end.top, + left : end.left, + scaleX : end.width / $what.width(), + scaleY : end.height / $what.height() + }, duration || 330, function() { + self.isAnimating = false; + }); + + }, + + // Calculate image size to fit inside viewport + // =========================================== + + getFitPos : function( slide ) { + var self = this; + var $what = slide.$content; + + var imgWidth = slide.width; + var imgHeight = slide.height; + + var margin = slide.opts.margin; + + var canvasWidth, canvasHeight, minRatio, width, height; + + if ( !$what || !$what.length || ( !imgWidth && !imgHeight) ) { + return false; + } + + // Convert "margin to CSS style: [ top, right, bottom, left ] + if ( $.type( margin ) === "number" ) { + margin = [ margin, margin ]; + } + + if ( margin.length == 2 ) { + margin = [ margin[0], margin[1], margin[0], margin[1] ]; + } + + // We can not use $slide width here, because it can have different diemensions while in transiton + canvasWidth = parseInt( self.$refs.stage.width(), 10 ) - ( margin[ 1 ] + margin[ 3 ] ); + canvasHeight = parseInt( self.$refs.stage.height(), 10 ) - ( margin[ 0 ] + margin[ 2 ] ); + + minRatio = Math.min(1, canvasWidth / imgWidth, canvasHeight / imgHeight ); + + width = Math.floor( minRatio * imgWidth ); + height = Math.floor( minRatio * imgHeight ); + + // Use floor rounding to make sure it really fits + return { + top : Math.floor( ( canvasHeight - height ) * 0.5 ) + margin[ 0 ], + left : Math.floor( ( canvasWidth - width ) * 0.5 ) + margin[ 3 ], + width : width, + height : height + }; + + }, + + + // Update content size and position for all slides + // ============================================== + + update : function() { + var self = this; + + $.each( self.slides, function( key, slide ) { + self.updateSlide( slide ); + }); + }, + + + // Update slide content position and size + // ====================================== + + updateSlide : function( slide, duration ) { + var self = this, + $what = slide && slide.$content; + + if ( $what && ( slide.width || slide.height ) ) { + self.isAnimating = false; + + $.fancybox.stop( $what ); + + $.fancybox.setTranslate( $what, self.getFitPos( slide ) ); + + if ( slide.pos === self.currPos ) { + self.updateCursor(); + } + } + + slide.$slide.trigger( 'refresh' ); + + self.trigger( 'onUpdate', slide ); + + }, + + + // Horizontally center slide + // ========================= + + centerSlide : function( slide, duration ) { + var self = this, canvasWidth, pos; + + if ( self.current ) { + canvasWidth = Math.round( slide.$slide.width() ); + pos = slide.pos - self.current.pos; + + $.fancybox.animate( slide.$slide, { + top : 0, + left : ( pos * canvasWidth ) + ( pos * slide.opts.gutter ), + opacity : 1 + }, duration === undefined ? 0 : duration, null, false); + } + }, + + + // Update cursor style depending if content can be zoomed + // ====================================================== + + updateCursor : function( nextWidth, nextHeight ) { + + var self = this; + var isScaledDown; + + var $container = self.$refs.container.removeClass( 'fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-drag fancybox-can-zoomOut' ); + + if ( !self.current || self.isClosing ) { + return; + } + + if ( self.isZoomable() ) { + + $container.addClass( 'fancybox-is-zoomable' ); + + if ( nextWidth !== undefined && nextHeight !== undefined ) { + isScaledDown = nextWidth < self.current.width && nextHeight < self.current.height; + + } else { + isScaledDown = self.isScaledDown(); + } + + if ( isScaledDown ) { + + // If image is scaled down, then, obviously, it can be zoomed to full size + $container.addClass( 'fancybox-can-zoomIn' ); + + } else { + + if ( self.current.opts.touch ) { + + // If image size ir largen than available available and touch module is not disable, + // then user can do panning + $container.addClass( 'fancybox-can-drag' ); + + } else { + $container.addClass( 'fancybox-can-zoomOut' ); + } + + } + + } else if ( self.current.opts.touch ) { + $container.addClass( 'fancybox-can-drag' ); + } + + }, + + + // Check if current slide is zoomable + // ================================== + + isZoomable : function() { + + var self = this; + + var current = self.current; + var fitPos; + + if ( !current || self.isClosing ) { + return; + } + + // Assume that slide is zoomable if + // - image is loaded successfuly + // - click action is "zoom" + // - actual size of the image is smaller than available area + if ( current.type === 'image' && current.isLoaded && !current.hasError && + ( current.opts.clickContent === 'zoom' || ( $.isFunction( current.opts.clickContent ) && current.opts.clickContent( current ) === "zoom" ) ) + ) { + + fitPos = self.getFitPos( current ); + + if ( current.width > fitPos.width || current.height > fitPos.height ) { + return true; + } + + } + + return false; + + }, + + + // Check if current image dimensions are smaller than actual + // ========================================================= + + isScaledDown : function() { + + var self = this; + + var current = self.current; + var $what = current.$content; + + var rez = false; + + if ( $what ) { + rez = $.fancybox.getTranslate( $what ); + rez = rez.width < current.width || rez.height < current.height; + } + + return rez; + + }, + + + // Check if image dimensions exceed parent element + // =============================================== + + canPan : function() { + + var self = this; + + var current = self.current; + var $what = current.$content; + + var rez = false; + + if ( $what ) { + rez = self.getFitPos( current ); + rez = Math.abs( $what.width() - rez.width ) > 1 || Math.abs( $what.height() - rez.height ) > 1; + } + + return rez; + + }, + + + // Load content into the slide + // =========================== + + loadSlide : function( slide ) { + + var self = this, type, $slide; + var ajaxLoad; + + if ( slide.isLoading ) { + return; + } + + if ( slide.isLoaded ) { + return; + } + + slide.isLoading = true; + + self.trigger( 'beforeLoad', slide ); + + type = slide.type; + $slide = slide.$slide; + + $slide + .off( 'refresh' ) + .trigger( 'onReset' ) + .addClass( 'fancybox-slide--' + ( type || 'unknown' ) ) + .addClass( slide.opts.slideClass ); + + // Create content depending on the type + + switch ( type ) { + + case 'image': + + self.setImage( slide ); + + break; + + case 'iframe': + + self.setIframe( slide ); + + break; + + case 'html': + + self.setContent( slide, slide.src || slide.content ); + + break; + + case 'inline': + + if ( $( slide.src ).length ) { + self.setContent( slide, $( slide.src ) ); + + } else { + self.setError( slide ); + } + + break; + + case 'ajax': + + self.showLoading( slide ); + + ajaxLoad = $.ajax( $.extend( {}, slide.opts.ajax.settings, { + url : slide.src, + success : function ( data, textStatus ) { + + if ( textStatus === 'success' ) { + self.setContent( slide, data ); + } + + }, + error : function ( jqXHR, textStatus ) { + + if ( jqXHR && textStatus !== 'abort' ) { + self.setError( slide ); + } + + } + })); + + $slide.one( 'onReset', function () { + ajaxLoad.abort(); + }); + + break; + + case 'video' : + + self.setContent( slide, + '' + ); + + break; + + default: + + self.setError( slide ); + + break; + + } + + return true; + + }, + + + // Use thumbnail image, if possible + // ================================ + + setImage : function( slide ) { + + var self = this; + var srcset = slide.opts.srcset || slide.opts.image.srcset; + + var found, temp, pxRatio, windowWidth; + + // If we have "srcset", then we need to find matching "src" value. + // This is necessary, because when you set an src attribute, the browser will preload the image + // before any javascript or even CSS is applied. + if ( srcset ) { + pxRatio = window.devicePixelRatio || 1; + windowWidth = window.innerWidth * pxRatio; + + temp = srcset.split(',').map(function ( el ) { + var ret = {}; + + el.trim().split(/\s+/).forEach(function ( el, i ) { + var value = parseInt( el.substring(0, el.length - 1), 10 ); + + if ( i === 0 ) { + return ( ret.url = el ); + } + + if ( value ) { + ret.value = value; + ret.postfix = el[ el.length - 1 ]; + } + + }); + + return ret; + }); + + // Sort by value + temp.sort(function (a, b) { + return a.value - b.value; + }); + + // Ok, now we have an array of all srcset values + for ( var j = 0; j < temp.length; j++ ) { + var el = temp[ j ]; + + if ( ( el.postfix === 'w' && el.value >= windowWidth ) || ( el.postfix === 'x' && el.value >= pxRatio ) ) { + found = el; + break; + } + } + + // If not found, take the last one + if ( !found && temp.length ) { + found = temp[ temp.length - 1 ]; + } + + if ( found ) { + slide.src = found.url; + + // If we have default width/height values, we can calculate height for matching source + if ( slide.width && slide.height && found.postfix == 'w' ) { + slide.height = ( slide.width / slide.height ) * found.value; + slide.width = found.value; + } + } + } + + // This will be wrapper containing both ghost and actual image + slide.$content = $('
') + .addClass( 'fancybox-is-hidden' ) + .appendTo( slide.$slide ); + + + // If we have a thumbnail, we can display it while actual image is loading + // Users will not stare at black screen and actual image will appear gradually + if ( slide.opts.preload !== false && slide.opts.width && slide.opts.height && ( slide.opts.thumb || slide.opts.$thumb ) ) { + + slide.width = slide.opts.width; + slide.height = slide.opts.height; + + slide.$ghost = $('') + .one('error', function() { + + $(this).remove(); + + slide.$ghost = null; + + self.setBigImage( slide ); + + }) + .one('load', function() { + + self.afterLoad( slide ); + + self.setBigImage( slide ); + + }) + .addClass( 'fancybox-image' ) + .appendTo( slide.$content ) + .attr( 'src', slide.opts.thumb || slide.opts.$thumb.attr( 'src' ) ); + + } else { + + self.setBigImage( slide ); + + } + + }, + + + // Create full-size image + // ====================== + + setBigImage : function ( slide ) { + var self = this; + var $img = $(''); + + slide.$image = $img + .one('error', function() { + + self.setError( slide ); + + }) + .one('load', function() { + + // Clear timeout that checks if loading icon needs to be displayed + clearTimeout( slide.timouts ); + + slide.timouts = null; + + if ( self.isClosing ) { + return; + } + + slide.width = slide.opts.width || this.naturalWidth; + slide.height = slide.opts.height || this.naturalHeight; + + if ( slide.opts.image.srcset ) { + $img.attr( 'sizes', '100vw' ).attr( 'srcset', slide.opts.image.srcset ); + } + + self.hideLoading( slide ); + + if ( slide.$ghost ) { + + slide.timouts = setTimeout(function() { + slide.timouts = null; + + slide.$ghost.hide(); + + }, Math.min( 300, Math.max( 1000, slide.height / 1600 ) ) ); + + } else { + self.afterLoad( slide ); + } + + }) + .addClass( 'fancybox-image' ) + .attr('src', slide.src) + .appendTo( slide.$content ); + + if ( ( $img[0].complete || $img[0].readyState == "complete" ) && $img[0].naturalWidth && $img[0].naturalHeight ) { + $img.trigger( 'load' ); + + } else if( $img[0].error ) { + $img.trigger( 'error' ); + + } else { + + slide.timouts = setTimeout(function() { + if ( !$img[0].complete && !slide.hasError ) { + self.showLoading( slide ); + } + + }, 100); + + } + + }, + + + // Create iframe wrapper, iframe and bindings + // ========================================== + + setIframe : function( slide ) { + var self = this, + opts = slide.opts.iframe, + $slide = slide.$slide, + $iframe; + + slide.$content = $('
') + .css( opts.css ) + .appendTo( $slide ); + + $iframe = $( opts.tpl.replace(/\{rnd\}/g, new Date().getTime()) ) + .attr( opts.attr ) + .appendTo( slide.$content ); + + if ( opts.preload ) { + + self.showLoading( slide ); + + // Unfortunately, it is not always possible to determine if iframe is successfully loaded + // (due to browser security policy) + + $iframe.on('load.fb error.fb', function(e) { + this.isReady = 1; + + slide.$slide.trigger( 'refresh' ); + + self.afterLoad( slide ); + }); + + // Recalculate iframe content size + // =============================== + + $slide.on('refresh.fb', function() { + var $wrap = slide.$content, + frameWidth = opts.css.width, + frameHeight = opts.css.height, + scrollWidth, + $contents, + $body; + + if ( $iframe[0].isReady !== 1 ) { + return; + } + + // Check if content is accessible, + // it will fail if frame is not with the same origin + + try { + $contents = $iframe.contents(); + $body = $contents.find('body'); + + } catch (ignore) {} + + // Calculate dimensions for the wrapper + if ( $body && $body.length ) { + + if ( frameWidth === undefined ) { + scrollWidth = $iframe[0].contentWindow.document.documentElement.scrollWidth; + + frameWidth = Math.ceil( $body.outerWidth(true) + ( $wrap.width() - scrollWidth ) ); + frameWidth += $wrap.outerWidth() - $wrap.innerWidth(); + } + + if ( frameHeight === undefined ) { + frameHeight = Math.ceil( $body.outerHeight(true) ); + frameHeight += $wrap.outerHeight() - $wrap.innerHeight(); + } + + // Resize wrapper to fit iframe content + if ( frameWidth ) { + $wrap.width( frameWidth ); + } + + if ( frameHeight ) { + $wrap.height( frameHeight ); + } + } + + $wrap.removeClass( 'fancybox-is-hidden' ); + + }); + + } else { + + this.afterLoad( slide ); + + } + + $iframe.attr( 'src', slide.src ); + + if ( slide.opts.smallBtn === true ) { + slide.$content.prepend( self.translate( slide, slide.opts.btnTpl.smallBtn ) ); + } + + // Remove iframe if closing or changing gallery item + $slide.one( 'onReset', function () { + + // This helps IE not to throw errors when closing + try { + + $( this ).find( 'iframe' ).hide().attr( 'src', '//about:blank' ); + + } catch ( ignore ) {} + + $( this ).empty(); + + slide.isLoaded = false; + + }); + + }, + + + // Wrap and append content to the slide + // ====================================== + + setContent : function ( slide, content ) { + + var self = this; + + if ( self.isClosing ) { + return; + } + + self.hideLoading( slide ); + + slide.$slide.empty(); + + if ( isQuery( content ) && content.parent().length ) { + + // If content is a jQuery object, then it will be moved to the slide. + // The placeholder is created so we will know where to put it back. + // If user is navigating gallery fast, then the content might be already inside fancyBox + // ===================================================================================== + + // Make sure content is not already moved to fancyBox + content.parent( '.fancybox-slide--inline' ).trigger( 'onReset' ); + + // Create temporary element marking original place of the content + slide.$placeholder = $( '
' ).hide().insertAfter( content ); + + // Make sure content is visible + content.css('display', 'inline-block'); + + } else if ( !slide.hasError ) { + + // If content is just a plain text, try to convert it to html + if ( $.type( content ) === 'string' ) { + content = $('
').append( $.trim( content ) ).contents(); + + // If we have text node, then add wrapping element to make vertical alignment work + if ( content[0].nodeType === 3 ) { + content = $('
').html( content ); + } + } + + // If "filter" option is provided, then filter content + if ( slide.opts.filter ) { + content = $('
').html( content ).find( slide.opts.filter ); + } + + } + + slide.$slide.one('onReset', function () { + + // Pause all html5 video/audio + $( this ).find( 'video,audio' ).trigger( 'pause' ); + + // Put content back + if ( slide.$placeholder ) { + slide.$placeholder.after( content.hide() ).remove(); + + slide.$placeholder = null; + } + + // Remove custom close button + if ( slide.$smallBtn ) { + slide.$smallBtn.remove(); + + slide.$smallBtn = null; + } + + // Remove content and mark slide as not loaded + if ( !slide.hasError ) { + $(this).empty(); + + slide.isLoaded = false; + } + + }); + + slide.$content = $( content ).appendTo( slide.$slide ); + + this.afterLoad( slide ); + }, + + // Display error message + // ===================== + + setError : function ( slide ) { + + slide.hasError = true; + + slide.$slide.removeClass( 'fancybox-slide--' + slide.type ); + + this.setContent( slide, this.translate( slide, slide.opts.errorTpl ) ); + + }, + + + // Show loading icon inside the slide + // ================================== + + showLoading : function( slide ) { + + var self = this; + + slide = slide || self.current; + + if ( slide && !slide.$spinner ) { + slide.$spinner = $( self.opts.spinnerTpl ).appendTo( slide.$slide ); + } + + }, + + // Remove loading icon from the slide + // ================================== + + hideLoading : function( slide ) { + + var self = this; + + slide = slide || self.current; + + if ( slide && slide.$spinner ) { + slide.$spinner.remove(); + + delete slide.$spinner; + } + + }, + + + // Adjustments after slide content has been loaded + // =============================================== + + afterLoad : function( slide ) { + + var self = this; + + if ( self.isClosing ) { + return; + } + + slide.isLoading = false; + slide.isLoaded = true; + + self.trigger( 'afterLoad', slide ); + + self.hideLoading( slide ); + + if ( slide.opts.smallBtn && !slide.$smallBtn ) { + slide.$smallBtn = $( self.translate( slide, slide.opts.btnTpl.smallBtn ) ).appendTo( slide.$content.filter('div,form').first() ); + } + + if ( slide.opts.protect && slide.$content && !slide.hasError ) { + + // Disable right click + slide.$content.on( 'contextmenu.fb', function( e ) { + if ( e.button == 2 ) { + e.preventDefault(); + } + + return true; + }); + + // Add fake element on top of the image + // This makes a bit harder for user to select image + if ( slide.type === 'image' ) { + $( '
' ).appendTo( slide.$content ); + } + + } + + self.revealContent( slide ); + + }, + + + // Make content visible + // This method is called right after content has been loaded or + // user navigates gallery and transition should start + // ============================================================ + + revealContent : function( slide ) { + + var self = this; + var $slide = slide.$slide; + + var effect, effectClassName, duration, opacity, end, start = false; + + effect = slide.opts[ self.firstRun ? 'animationEffect' : 'transitionEffect' ]; + duration = slide.opts[ self.firstRun ? 'animationDuration' : 'transitionDuration' ]; + + duration = parseInt( slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10 ); + + if ( slide.isMoved || slide.pos !== self.currPos || !duration ) { + effect = false; + } + + // Check if can zoom + if ( effect === 'zoom' && !( slide.pos === self.currPos && duration && slide.type === 'image' && !slide.hasError && ( start = self.getThumbPos( slide ) ) ) ) { + effect = 'fade'; + } + + // Zoom animation + // ============== + + if ( effect === 'zoom' ) { + end = self.getFitPos( slide ); + + end.scaleX = end.width / start.width; + end.scaleY = end.height / start.height; + + delete end.width; + delete end.height; + + // Check if we need to animate opacity + opacity = slide.opts.zoomOpacity; + + if ( opacity == 'auto' ) { + opacity = Math.abs( slide.width / slide.height - start.width / start.height ) > 0.1; + } + + if ( opacity ) { + start.opacity = 0.1; + end.opacity = 1; + } + + // Draw image at start position + $.fancybox.setTranslate( slide.$content.removeClass( 'fancybox-is-hidden' ), start ); + + forceRedraw( slide.$content ); + + // Start animation + $.fancybox.animate( slide.$content, end, duration, function() { + self.complete(); + }); + + return; + } + + self.updateSlide( slide ); + + + // Simply show content + // =================== + + if ( !effect ) { + forceRedraw( $slide ); + + slide.$content.removeClass( 'fancybox-is-hidden' ); + + if ( slide.pos === self.currPos ) { + self.complete(); + } + + return; + } + + $.fancybox.stop( $slide ); + + effectClassName = 'fancybox-animated fancybox-slide--' + ( slide.pos >= self.prevPos ? 'next' : 'previous' ) + ' fancybox-fx-' + effect; + + $slide.removeAttr( 'style' ).removeClass( 'fancybox-slide--current fancybox-slide--next fancybox-slide--previous' ).addClass( effectClassName ); + + slide.$content.removeClass( 'fancybox-is-hidden' ); + + //Force reflow for CSS3 transitions + forceRedraw( $slide ); + + $.fancybox.animate( $slide, 'fancybox-slide--current', duration, function(e) { + $slide.removeClass( effectClassName ).removeAttr( 'style' ); + + if ( slide.pos === self.currPos ) { + self.complete(); + } + + }, true); + + }, + + + // Check if we can and have to zoom from thumbnail + //================================================ + + getThumbPos : function( slide ) { + + var self = this; + var rez = false; + + // Check if element is inside the viewport by at least 1 pixel + var isElementVisible = function( $el ) { + var element = $el[0]; + + var elementRect = element.getBoundingClientRect(); + var parentRects = []; + + var visibleInAllParents; + + while ( element.parentElement !== null ) { + if ( $(element.parentElement).css('overflow') === 'hidden' || $(element.parentElement).css('overflow') === 'auto' ) { + parentRects.push(element.parentElement.getBoundingClientRect()); + } + + element = element.parentElement; + } + + visibleInAllParents = parentRects.every(function(parentRect){ + var visiblePixelX = Math.min(elementRect.right, parentRect.right) - Math.max(elementRect.left, parentRect.left); + var visiblePixelY = Math.min(elementRect.bottom, parentRect.bottom) - Math.max(elementRect.top, parentRect.top); + + return visiblePixelX > 0 && visiblePixelY > 0; + }); + + return visibleInAllParents && + elementRect.bottom > 0 && elementRect.right > 0 && + elementRect.left < $(window).width() && elementRect.top < $(window).height(); + }; + + var $thumb = slide.opts.$thumb; + var thumbPos = $thumb ? $thumb.offset() : 0; + var slidePos; + + if ( thumbPos && $thumb[0].ownerDocument === document && isElementVisible( $thumb ) ) { + slidePos = self.$refs.stage.offset(); + + rez = { + top : thumbPos.top - slidePos.top + parseFloat( $thumb.css( "border-top-width" ) || 0 ), + left : thumbPos.left - slidePos.left + parseFloat( $thumb.css( "border-left-width" ) || 0 ), + width : $thumb.width(), + height : $thumb.height(), + scaleX : 1, + scaleY : 1 + }; + } + + return rez; + }, + + + // Final adjustments after current gallery item is moved to position + // and it`s content is loaded + // ================================================================== + + complete : function() { + var self = this, + current = self.current, + slides = {}, + promise; + + if ( current.isMoved || !current.isLoaded || current.isComplete ) { + return; + } + + current.isComplete = true; + + current.$slide.siblings().trigger( 'onReset' ); + + self.preload( 'inline' ); + + // Trigger any CSS3 transiton inside the slide + forceRedraw( current.$slide ); + + current.$slide.addClass( 'fancybox-slide--complete' ); + + // Remove unnecessary slides + $.each( self.slides, function( key, slide ) { + if ( slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1 ) { + slides[ slide.pos ] = slide; + + } else if ( slide ) { + $.fancybox.stop( slide.$slide ); + + slide.$slide.off().remove(); + } + }); + + self.slides = slides; + + self.updateCursor(); + + self.trigger( 'afterShow' ); + + // Play first html5 video/audio + current.$slide.find( 'video,audio' ).first().trigger( 'play' ); + + // Try to focus on the first focusable element + if ( $( document.activeElement ).is( '[disabled]' ) || ( current.opts.autoFocus && !( current.type == 'image' || current.type === 'iframe' ) ) ) { + self.focus(); + } + + }, + + + // Preload next and previous slides + // ================================ + + preload : function( type ) { + var self = this, + next = self.slides[ self.currPos + 1 ], + prev = self.slides[ self.currPos - 1 ]; + + if ( next && next.type === type ) { + self.loadSlide( next ); + } + + if ( prev && prev.type === type ) { + self.loadSlide( prev ); + } + }, + + + // Try to find and focus on the first focusable element + // ==================================================== + + focus : function() { + var current = this.current; + var $el; + + if ( this.isClosing ) { + return; + } + + if ( current && current.isComplete ) { + + // Look for first input with autofocus attribute + $el = current.$slide.find('input[autofocus]:enabled:visible:first'); + + if ( !$el.length ) { + $el = current.$slide.find('button,:input,[tabindex],a').filter(':enabled:visible:first'); + } + } + + $el = $el && $el.length ? $el : this.$refs.container; + + $el.focus(); + }, + + + // Activates current instance - brings container to the front and enables keyboard, + // notifies other instances about deactivating + // ================================================================================= + + activate : function () { + var self = this; + + // Deactivate all instances + $( '.fancybox-container' ).each(function () { + var instance = $(this).data( 'FancyBox' ); + + // Skip self and closing instances + if (instance && instance.id !== self.id && !instance.isClosing) { + instance.trigger( 'onDeactivate' ); + + instance.removeEvents(); + + instance.isVisible = false; + } + + }); + + self.isVisible = true; + + if ( self.current || self.isIdle ) { + self.update(); + + self.updateControls(); + } + + self.trigger( 'onActivate' ); + + self.addEvents(); + }, + + + // Start closing procedure + // This will start "zoom-out" animation if needed and clean everything up afterwards + // ================================================================================= + + close : function( e, d ) { + + var self = this; + var current = self.current; + + var effect, duration; + var $what, opacity, start, end; + + var done = function() { + self.cleanUp( e ); + }; + + if ( self.isClosing ) { + return false; + } + + self.isClosing = true; + + // If beforeClose callback prevents closing, make sure content is centered + if ( self.trigger( 'beforeClose', e ) === false ) { + self.isClosing = false; + + requestAFrame(function() { + self.update(); + }); + + return false; + } + + // Remove all events + // If there are multiple instances, they will be set again by "activate" method + self.removeEvents(); + + if ( current.timouts ) { + clearTimeout( current.timouts ); + } + + $what = current.$content; + effect = current.opts.animationEffect; + duration = $.isNumeric( d ) ? d : ( effect ? current.opts.animationDuration : 0 ); + + // Remove other slides + current.$slide.off( transitionEnd ).removeClass( 'fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated' ); + + current.$slide.siblings().trigger( 'onReset' ).remove(); + + // Trigger animations + if ( duration ) { + self.$refs.container.removeClass( 'fancybox-is-open' ).addClass( 'fancybox-is-closing' ); + } + + // Clean up + self.hideLoading( current ); + + self.hideControls(); + + self.updateCursor(); + + // Check if possible to zoom-out + if ( effect === 'zoom' && !( e !== true && $what && duration && current.type === 'image' && !current.hasError && ( end = self.getThumbPos( current ) ) ) ) { + effect = 'fade'; + } + + if ( effect === 'zoom' ) { + $.fancybox.stop( $what ); + + start = $.fancybox.getTranslate( $what ); + + start.width = start.width * start.scaleX; + start.height = start.height * start.scaleY; + + // Check if we need to animate opacity + opacity = current.opts.zoomOpacity; + + if ( opacity == 'auto' ) { + opacity = Math.abs( current.width / current.height - end.width / end.height ) > 0.1; + } + + if ( opacity ) { + end.opacity = 0; + } + + start.scaleX = start.width / end.width; + start.scaleY = start.height / end.height; + + start.width = end.width; + start.height = end.height; + + $.fancybox.setTranslate( current.$content, start ); + + forceRedraw( current.$content ); + + $.fancybox.animate( current.$content, end, duration, done ); + + return true; + } + + if ( effect && duration ) { + + // If skip animation + if ( e === true ) { + setTimeout( done, duration ); + + } else { + $.fancybox.animate( current.$slide.removeClass( 'fancybox-slide--current' ), 'fancybox-animated fancybox-slide--previous fancybox-fx-' + effect, duration, done ); + } + + } else { + done(); + } + + return true; + }, + + + // Final adjustments after removing the instance + // ============================================= + + cleanUp : function( e ) { + var self = this, + $body = $( 'body' ), + instance, + offset; + + self.current.$slide.trigger( 'onReset' ); + + self.$refs.container.empty().remove(); + + self.trigger( 'afterClose', e ); + + // Place back focus + if ( self.$lastFocus && !!self.current.opts.backFocus ) { + self.$lastFocus.focus(); + } + + self.current = null; + + // Check if there are other instances + instance = $.fancybox.getInstance(); + + if ( instance ) { + instance.activate(); + + } else { + + $W.scrollTop( self.scrollTop ).scrollLeft( self.scrollLeft ); + + $body.removeClass( 'fancybox-active compensate-for-scrollbar' ); + + if ( $body.hasClass( 'fancybox-iosfix' ) ) { + offset = parseInt(document.body.style.top, 10); + + $body.removeClass( 'fancybox-iosfix' ).css( 'top', '' ).scrollTop( offset * -1 ); + } + + $( '#fancybox-style-noscroll' ).remove(); + + } + + }, + + + // Call callback and trigger an event + // ================================== + + trigger : function( name, slide ) { + var args = Array.prototype.slice.call(arguments, 1), + self = this, + obj = slide && slide.opts ? slide : self.current, + rez; + + if ( obj ) { + args.unshift( obj ); + + } else { + obj = self; + } + + args.unshift( self ); + + if ( $.isFunction( obj.opts[ name ] ) ) { + rez = obj.opts[ name ].apply( obj, args ); + } + + if ( rez === false ) { + return rez; + } + + if ( name === 'afterClose' || !self.$refs ) { + $D.trigger( name + '.fb', args ); + + } else { + self.$refs.container.trigger( name + '.fb', args ); + } + + }, + + + // Update infobar values, navigation button states and reveal caption + // ================================================================== + + updateControls : function ( force ) { + + var self = this; + + var current = self.current, + index = current.index, + caption = current.opts.caption, + $container = self.$refs.container, + $caption = self.$refs.caption; + + // Recalculate content dimensions + current.$slide.trigger( 'refresh' ); + + self.$caption = caption && caption.length ? $caption.html( caption ) : null; + + if ( !self.isHiddenControls && !self.isIdle ) { + self.showControls(); + } + + // Update info and navigation elements + $container.find('[data-fancybox-count]').html( self.group.length ); + $container.find('[data-fancybox-index]').html( index + 1 ); + + $container.find('[data-fancybox-prev]').prop( 'disabled', ( !current.opts.loop && index <= 0 ) ); + $container.find('[data-fancybox-next]').prop( 'disabled', ( !current.opts.loop && index >= self.group.length - 1 ) ); + + if ( current.type === 'image' ) { + + // Update download button source + $container.find('[data-fancybox-download]').attr( 'href', current.opts.image.src || current.src ).show(); + + } else { + $container.find('[data-fancybox-download],[data-fancybox-zoom]').hide(); + } + }, + + // Hide toolbar and caption + // ======================== + + hideControls : function () { + + this.isHiddenControls = true; + + this.$refs.container.removeClass( 'fancybox-show-infobar fancybox-show-toolbar fancybox-show-caption fancybox-show-nav' ); + + }, + + showControls : function() { + var self = this; + var opts = self.current ? self.current.opts : self.opts; + var $container = self.$refs.container; + + self.isHiddenControls = false; + self.idleSecondsCounter = 0; + + $container + .toggleClass( 'fancybox-show-toolbar', !!( opts.toolbar && opts.buttons ) ) + .toggleClass( 'fancybox-show-infobar', !!( opts.infobar && self.group.length > 1 ) ) + .toggleClass( 'fancybox-show-nav', !!( opts.arrows && self.group.length > 1 ) ) + .toggleClass( 'fancybox-is-modal', !!opts.modal ); + + if ( self.$caption ) { + $container.addClass( 'fancybox-show-caption '); + + } else { + $container.removeClass( 'fancybox-show-caption' ); + } + + }, + + + // Toggle toolbar and caption + // ========================== + + toggleControls : function() { + if ( this.isHiddenControls ) { + this.showControls(); + + } else { + this.hideControls(); + } + + }, + + + }); + + + $.fancybox = { + + version : "3.2.10", + defaults : defaults, + + + // Get current instance and execute a command. + // + // Examples of usage: + // + // $instance = $.fancybox.getInstance(); + // $.fancybox.getInstance().jumpTo( 1 ); + // $.fancybox.getInstance( 'jumpTo', 1 ); + // $.fancybox.getInstance( function() { + // console.info( this.currIndex ); + // }); + // ====================================================== + + getInstance : function ( command ) { + var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data( 'FancyBox' ); + var args = Array.prototype.slice.call(arguments, 1); + + if ( instance instanceof FancyBox ) { + + if ( $.type( command ) === 'string' ) { + instance[ command ].apply( instance, args ); + + } else if ( $.type( command ) === 'function' ) { + command.apply( instance, args ); + } + + return instance; + } + + return false; + + }, + + + // Create new instance + // =================== + + open : function ( items, opts, index ) { + return new FancyBox( items, opts, index ); + }, + + + // Close current or all instances + // ============================== + + close : function ( all ) { + var instance = this.getInstance(); + + if ( instance ) { + instance.close(); + + // Try to find and close next instance + + if ( all === true ) { + this.close(); + } + } + + }, + + // Close instances and unbind all events + // ============================== + + destroy : function() { + + this.close( true ); + + $D.off( 'click.fb-start' ); + + }, + + + // Try to detect mobile devices + // ============================ + + isMobile : document.createTouch !== undefined && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), + + + // Detect if 'translate3d' support is available + // ============================================ + + use3d : (function() { + var div = document.createElement('div'); + + return window.getComputedStyle && window.getComputedStyle( div ).getPropertyValue('transform') && !(document.documentMode && document.documentMode < 11); + }()), + + // Helper function to get current visual state of an element + // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] + // ===================================================================== + + getTranslate : function( $el ) { + var matrix; + + if ( !$el || !$el.length ) { + return false; + } + + matrix = $el.eq( 0 ).css('transform'); + + if ( matrix && matrix.indexOf( 'matrix' ) !== -1 ) { + matrix = matrix.split('(')[1]; + matrix = matrix.split(')')[0]; + matrix = matrix.split(','); + } else { + matrix = []; + } + + if ( matrix.length ) { + + // If IE + if ( matrix.length > 10 ) { + matrix = [ matrix[13], matrix[12], matrix[0], matrix[5] ]; + + } else { + matrix = [ matrix[5], matrix[4], matrix[0], matrix[3]]; + } + + matrix = matrix.map(parseFloat); + + } else { + matrix = [ 0, 0, 1, 1 ]; + + var transRegex = /\.*translate\((.*)px,(.*)px\)/i; + var transRez = transRegex.exec( $el.eq( 0 ).attr('style') ); + + if ( transRez ) { + matrix[ 0 ] = parseFloat( transRez[2] ); + matrix[ 1 ] = parseFloat( transRez[1] ); + } + } + + return { + top : matrix[ 0 ], + left : matrix[ 1 ], + scaleX : matrix[ 2 ], + scaleY : matrix[ 3 ], + opacity : parseFloat( $el.css('opacity') ), + width : $el.width(), + height : $el.height() + }; + + }, + + + // Shortcut for setting "translate3d" properties for element + // Can set be used to set opacity, too + // ======================================================== + + setTranslate : function( $el, props ) { + var str = ''; + var css = {}; + + if ( !$el || !props ) { + return; + } + + if ( props.left !== undefined || props.top !== undefined ) { + str = ( props.left === undefined ? $el.position().left : props.left ) + 'px, ' + ( props.top === undefined ? $el.position().top : props.top ) + 'px'; + + if ( this.use3d ) { + str = 'translate3d(' + str + ', 0px)'; + + } else { + str = 'translate(' + str + ')'; + } + } + + if ( props.scaleX !== undefined && props.scaleY !== undefined ) { + str = (str.length ? str + ' ' : '') + 'scale(' + props.scaleX + ', ' + props.scaleY + ')'; + } + + if ( str.length ) { + css.transform = str; + } + + if ( props.opacity !== undefined ) { + css.opacity = props.opacity; + } + + if ( props.width !== undefined ) { + css.width = props.width; + } + + if ( props.height !== undefined ) { + css.height = props.height; + } + + return $el.css( css ); + }, + + + // Simple CSS transition handler + // ============================= + + animate : function ( $el, to, duration, callback, leaveAnimationName ) { + if ( $.isFunction( duration ) ) { + callback = duration; + duration = null; + } + + if ( !$.isPlainObject( to ) ) { + $el.removeAttr( 'style' ); + } + + $el.on( transitionEnd, function(e) { + + // Skip events from child elements and z-index change + if ( e && e.originalEvent && ( !$el.is( e.originalEvent.target ) || e.originalEvent.propertyName == 'z-index' ) ) { + return; + } + + $.fancybox.stop( $el ); + + if ( $.isPlainObject( to ) ) { + + if ( to.scaleX !== undefined && to.scaleY !== undefined ) { + $el.css( 'transition-duration', '' ); + + to.width = Math.round( $el.width() * to.scaleX ); + to.height = Math.round( $el.height() * to.scaleY ); + + to.scaleX = 1; + to.scaleY = 1; + + $.fancybox.setTranslate( $el, to ); + } + + if ( leaveAnimationName === false ) { + $el.removeAttr( 'style' ); + } + + } else if ( leaveAnimationName !== true ) { + $el.removeClass( to ); + } + + if ( $.isFunction( callback ) ) { + callback( e ); + } + + }); + + if ( $.isNumeric( duration ) ) { + $el.css( 'transition-duration', duration + 'ms' ); + } + + if ( $.isPlainObject( to ) ) { + $.fancybox.setTranslate( $el, to ); + + } else { + $el.addClass( to ); + } + + if ( to.scaleX && $el.hasClass( 'fancybox-image-wrap' ) ) { + $el.parent().addClass( 'fancybox-is-scaling' ); + } + + // Make sure that `transitionend` callback gets fired + $el.data("timer", setTimeout(function() { + $el.trigger( 'transitionend' ); + }, duration + 16)); + + }, + + stop : function( $el ) { + clearTimeout( $el.data("timer") ); + + $el.off( 'transitionend' ).css( 'transition-duration', '' ); + + if ( $el.hasClass( 'fancybox-image-wrap' ) ) { + $el.parent().removeClass( 'fancybox-is-scaling' ); + } + } + + }; + + + // Default click handler for "fancyboxed" links + // ============================================ + + function _run( e ) { + var $target = $( e.currentTarget ), + opts = e.data ? e.data.options : {}, + value = $target.attr( 'data-fancybox' ) || '', + index = 0, + items = []; + + // Avoid opening multiple times + if ( e.isDefaultPrevented() ) { + return; + } + + e.preventDefault(); + + // Get all related items and find index for clicked one + if ( value ) { + items = opts.selector ? $( opts.selector ) : ( e.data ? e.data.items : [] ); + items = items.length ? items.filter( '[data-fancybox="' + value + '"]' ) : $( '[data-fancybox="' + value + '"]' ); + + index = items.index( $target ); + + // Sometimes current item can not be found + // (for example, when slider clones items) + if ( index < 0 ) { + index = 0; + } + + } else { + items = [ $target ]; + } + + $.fancybox.open( items, opts, index ); + } + + + // Create a jQuery plugin + // ====================== + + $.fn.fancybox = function (options) { + var selector; + + options = options || {}; + selector = options.selector || false; + + if ( selector ) { + + $( 'body' ).off( 'click.fb-start', selector ).on( 'click.fb-start', selector, { + options : options + }, _run ); + + } else { + + this.off( 'click.fb-start' ).on( 'click.fb-start', { + items : this, + options : options + }, _run); + + } + + return this; + }; + + + // Self initializing plugin + // ======================== + + $D.on( 'click.fb-start', '[data-fancybox]', _run ); + +}( window, document, window.jQuery || jQuery )); + +// ========================================================================== +// +// Media +// Adds additional media type support +// +// ========================================================================== +;(function ($) { + + 'use strict'; + + // Formats matching url to final form + + var format = function (url, rez, params) { + if ( !url ) { + return; + } + + params = params || ''; + + if ( $.type(params) === "object" ) { + params = $.param(params, true); + } + + $.each(rez, function (key, value) { + url = url.replace('$' + key, value || ''); + }); + + if (params.length) { + url += (url.indexOf('?') > 0 ? '&' : '?') + params; + } + + return url; + }; + + // Object containing properties for each media type + + var defaults = { + youtube : { + matcher : /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, + params : { + autoplay : 1, + autohide : 1, + fs : 1, + rel : 0, + hd : 1, + wmode : 'transparent', + enablejsapi : 1, + html5 : 1 + }, + paramPlace : 8, + type : 'iframe', + url : '//www.youtube.com/embed/$4', + thumb : '//img.youtube.com/vi/$4/hqdefault.jpg' + }, + + vimeo : { + matcher : /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, + params : { + autoplay : 1, + hd : 1, + show_title : 1, + show_byline : 1, + show_portrait : 0, + fullscreen : 1, + api : 1 + }, + paramPlace : 3, + type : 'iframe', + url : '//player.vimeo.com/video/$2' + }, + + metacafe : { + matcher : /metacafe.com\/watch\/(\d+)\/(.*)?/, + type : 'iframe', + url : '//www.metacafe.com/embed/$1/?ap=1' + }, + + dailymotion : { + matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, + params : { + additionalInfos : 0, + autoStart : 1 + }, + type : 'iframe', + url : '//www.dailymotion.com/embed/video/$1' + }, + + vine : { + matcher : /vine.co\/v\/([a-zA-Z0-9\?\=\-]+)/, + type : 'iframe', + url : '//vine.co/v/$1/embed/simple' + }, + + instagram : { + matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type : 'image', + url : '//$1/p/$2/media/?size=l' + }, + + // Examples: + // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z + // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 + gmap_place : { + matcher : /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, + type : 'iframe', + url : function (rez) { + return '//maps.google.' + rez[2] + '/?ll=' + ( rez[9] ? rez[9] + '&z=' + Math.floor( rez[10] ) + ( rez[12] ? rez[12].replace(/^\//, "&") : '' ) : rez[12] ) + '&output=' + ( rez[12] && rez[12].indexOf('layer=c') > 0 ? 'svembed' : 'embed' ); + } + }, + + // Examples: + // https://www.google.com/maps/search/Empire+State+Building/ + // https://www.google.com/maps/search/?api=1&query=centurylink+field + // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 + gmap_search : { + matcher : /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, + type : 'iframe', + url : function (rez) { + return '//maps.google.' + rez[2] + '/maps?q=' + rez[5].replace('query=', 'q=').replace('api=1', '') + '&output=embed'; + } + } + }; + + $(document).on('objectNeedsType.fb', function (e, instance, item) { + + var url = item.src || '', + type = false, + media, + thumb, + rez, + params, + urlParams, + paramObj, + provider; + + media = $.extend( true, {}, defaults, item.opts.media ); + + // Look for any matching media type + $.each(media, function ( providerName, providerOpts ) { + rez = url.match( providerOpts.matcher ); + + if ( !rez ) { + return; + } + + type = providerOpts.type; + paramObj = {}; + + if ( providerOpts.paramPlace && rez[ providerOpts.paramPlace ] ) { + urlParams = rez[ providerOpts.paramPlace ]; + + if ( urlParams[ 0 ] == '?' ) { + urlParams = urlParams.substring(1); + } + + urlParams = urlParams.split('&'); + + for ( var m = 0; m < urlParams.length; ++m ) { + var p = urlParams[ m ].split('=', 2); + + if ( p.length == 2 ) { + paramObj[ p[0] ] = decodeURIComponent( p[1].replace(/\+/g, " ") ); + } + } + } + + params = $.extend( true, {}, providerOpts.params, item.opts[ providerName ], paramObj ); + + url = $.type( providerOpts.url ) === "function" ? providerOpts.url.call( this, rez, params, item ) : format( providerOpts.url, rez, params ); + thumb = $.type( providerOpts.thumb ) === "function" ? providerOpts.thumb.call( this, rez, params, item ) : format( providerOpts.thumb, rez ); + + if ( providerName === 'vimeo' ) { + url = url.replace('&%23', '#'); + } + + return false; + }); + + // If it is found, then change content type and update the url + + if ( type ) { + item.src = url; + item.type = type; + + if ( !item.opts.thumb && !( item.opts.$thumb && item.opts.$thumb.length ) ) { + item.opts.thumb = thumb; + } + + if ( type === 'iframe' ) { + $.extend(true, item.opts, { + iframe : { + preload : false, + attr : { + scrolling : "no" + } + } + }); + + item.contentProvider = provider; + + item.opts.slideClass += ' fancybox-slide--' + ( provider == 'gmap_place' || provider == 'gmap_search' ? 'map' : 'video' ); + } + + } else if ( url ) { + item.type = item.opts.defaultType; + } + + }); + +}( window.jQuery || jQuery )); + +// ========================================================================== +// +// Guestures +// Adds touch guestures, handles click and tap events +// +// ========================================================================== +;(function (window, document, $) { + 'use strict'; + + var requestAFrame = (function () { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + + var cancelAFrame = (function () { + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + function (id) { + window.clearTimeout(id); + }; + })(); + + var pointers = function( e ) { + var result = []; + + e = e.originalEvent || e || window.e; + e = e.touches && e.touches.length ? e.touches : ( e.changedTouches && e.changedTouches.length ? e.changedTouches : [ e ] ); + + for ( var key in e ) { + + if ( e[ key ].pageX ) { + result.push( { x : e[ key ].pageX, y : e[ key ].pageY } ); + + } else if ( e[ key ].clientX ) { + result.push( { x : e[ key ].clientX, y : e[ key ].clientY } ); + } + } + + return result; + }; + + var distance = function( point2, point1, what ) { + if ( !point1 || !point2 ) { + return 0; + } + + if ( what === 'x' ) { + return point2.x - point1.x; + + } else if ( what === 'y' ) { + return point2.y - point1.y; + } + + return Math.sqrt( Math.pow( point2.x - point1.x, 2 ) + Math.pow( point2.y - point1.y, 2 ) ); + }; + + var isClickable = function( $el ) { + if ( $el.is('a,area,button,[role="button"],input,label,select,summary,textarea') || $.isFunction( $el.get(0).onclick ) || $el.data('selectable') ) { + return true; + } + + // Check for attributes like data-fancybox-next or data-fancybox-close + for ( var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++ ) { + if ( atts[i].nodeName.substr(0, 14) === 'data-fancybox-' ) { + return true; + } + } + + return false; + }; + + var hasScrollbars = function( el ) { + var overflowY = window.getComputedStyle( el )['overflow-y']; + var overflowX = window.getComputedStyle( el )['overflow-x']; + + var vertical = (overflowY === 'scroll' || overflowY === 'auto') && el.scrollHeight > el.clientHeight; + var horizontal = (overflowX === 'scroll' || overflowX === 'auto') && el.scrollWidth > el.clientWidth; + + return vertical || horizontal; + }; + + var isScrollable = function ( $el ) { + var rez = false; + + while ( true ) { + rez = hasScrollbars( $el.get(0) ); + + if ( rez ) { + break; + } + + $el = $el.parent(); + + if ( !$el.length || $el.hasClass( 'fancybox-stage' ) || $el.is( 'body' ) ) { + break; + } + } + + return rez; + }; + + + var Guestures = function ( instance ) { + var self = this; + + self.instance = instance; + + self.$bg = instance.$refs.bg; + self.$stage = instance.$refs.stage; + self.$container = instance.$refs.container; + + self.destroy(); + + self.$container.on( 'touchstart.fb.touch mousedown.fb.touch', $.proxy(self, 'ontouchstart') ); + }; + + Guestures.prototype.destroy = function() { + this.$container.off( '.fb.touch' ); + }; + + Guestures.prototype.ontouchstart = function( e ) { + var self = this; + + var $target = $( e.target ); + var instance = self.instance; + var current = instance.current; + var $content = current.$content; + + var isTouchDevice = ( e.type == 'touchstart' ); + + // Do not respond to both (touch and mouse) events + if ( isTouchDevice ) { + self.$container.off( 'mousedown.fb.touch' ); + } + + // Ignore right click + if ( e.originalEvent && e.originalEvent.button == 2 ) { + return; + } + + // Ignore taping on links, buttons, input elements + if ( !$target.length || isClickable( $target ) || isClickable( $target.parent() ) ) { + return; + } + + // Ignore clicks on the scrollbar + if ( !$target.is('img') && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left ) { + return; + } + + // Ignore clicks while zooming or closing + if ( !current || self.instance.isAnimating || self.instance.isClosing ) { + e.stopPropagation(); + e.preventDefault(); + + return; + } + + self.realPoints = self.startPoints = pointers( e ); + + if ( !self.startPoints ) { + return; + } + + e.stopPropagation(); + + self.startEvent = e; + + self.canTap = true; + self.$target = $target; + self.$content = $content; + self.opts = current.opts.touch; + + self.isPanning = false; + self.isSwiping = false; + self.isZooming = false; + self.isScrolling = false; + + self.sliderStartPos = self.sliderLastPos || { top: 0, left: 0 }; + self.contentStartPos = $.fancybox.getTranslate( self.$content ); + self.contentLastPos = null; + + self.startTime = new Date().getTime(); + self.distanceX = self.distanceY = self.distance = 0; + + self.canvasWidth = Math.round( current.$slide[0].clientWidth ); + self.canvasHeight = Math.round( current.$slide[0].clientHeight ); + + $(document) + .off( '.fb.touch' ) + .on( isTouchDevice ? 'touchend.fb.touch touchcancel.fb.touch' : 'mouseup.fb.touch mouseleave.fb.touch', $.proxy(self, "ontouchend")) + .on( isTouchDevice ? 'touchmove.fb.touch' : 'mousemove.fb.touch', $.proxy(self, "ontouchmove")); + + if ( $.fancybox.isMobile ) { + document.addEventListener('scroll', self.onscroll, true); + } + + if ( !(self.opts || instance.canPan() ) || !( $target.is( self.$stage ) || self.$stage.find( $target ).length ) ) { + + // Prevent image ghosting while dragging + if ( $target.is('img') ) { + e.preventDefault(); + } + + return; + } + + if ( !( $.fancybox.isMobile && ( isScrollable( $target ) || isScrollable( $target.parent() ) ) ) ) { + e.preventDefault(); + } + + if ( self.startPoints.length === 1 ) { + if ( current.type === 'image' && ( self.contentStartPos.width > self.canvasWidth + 1 || self.contentStartPos.height > self.canvasHeight + 1 ) ) { + $.fancybox.stop( self.$content ); + + self.$content.css( 'transition-duration', '' ); + + self.isPanning = true; + + } else { + self.isSwiping = true; + } + + self.$container.addClass( 'fancybox-controls--isGrabbing' ); + } + + if ( self.startPoints.length === 2 && !instance.isAnimating && !current.hasError && current.type === 'image' && ( current.isLoaded || current.$ghost ) ) { + self.canTap = false; + self.isSwiping = false; + self.isPanning = false; + + self.isZooming = true; + + $.fancybox.stop( self.$content ); + + self.$content.css( 'transition-duration', '' ); + + self.centerPointStartX = ( ( self.startPoints[0].x + self.startPoints[1].x ) * 0.5 ) - $(window).scrollLeft(); + self.centerPointStartY = ( ( self.startPoints[0].y + self.startPoints[1].y ) * 0.5 ) - $(window).scrollTop(); + + self.percentageOfImageAtPinchPointX = ( self.centerPointStartX - self.contentStartPos.left ) / self.contentStartPos.width; + self.percentageOfImageAtPinchPointY = ( self.centerPointStartY - self.contentStartPos.top ) / self.contentStartPos.height; + + self.startDistanceBetweenFingers = distance( self.startPoints[0], self.startPoints[1] ); + } + + }; + + Guestures.prototype.onscroll = function(e) { + self.isScrolling = true; + }; + + Guestures.prototype.ontouchmove = function( e ) { + var self = this, + $target = $(e.target); + + if ( self.isScrolling || !( $target.is( self.$stage ) || self.$stage.find( $target ).length ) ) { + self.canTap = false; + + return; + } + + self.newPoints = pointers( e ); + + if ( !( self.opts || self.instance.canPan() ) || !self.newPoints || !self.newPoints.length ) { + return; + } + + if ( !(self.isSwiping && self.isSwiping === true) ) { + e.preventDefault(); + } + + self.distanceX = distance( self.newPoints[0], self.startPoints[0], 'x' ); + self.distanceY = distance( self.newPoints[0], self.startPoints[0], 'y' ); + + self.distance = distance( self.newPoints[0], self.startPoints[0] ) + + // Skip false ontouchmove events (Chrome) + if ( self.distance > 0 ) { + if ( self.isSwiping ) { + self.onSwipe(e); + + } else if ( self.isPanning ) { + self.onPan(); + + } else if ( self.isZooming ) { + self.onZoom(); + } + } + + }; + + Guestures.prototype.onSwipe = function(e) { + var self = this, + swiping = self.isSwiping, + left = self.sliderStartPos.left || 0, + angle; + + // If direction is not yet determined + if ( swiping === true ) { + + // We need at least 10px distance to correctly calculate an angle + if ( Math.abs( self.distance ) > 10 ) { + self.canTap = false; + + if ( self.instance.group.length < 2 && self.opts.vertical ) { + self.isSwiping = 'y'; + + } else if ( self.instance.isDragging || self.opts.vertical === false || ( self.opts.vertical === 'auto' && $( window ).width() > 800 ) ) { + self.isSwiping = 'x'; + + } else { + angle = Math.abs( Math.atan2( self.distanceY, self.distanceX ) * 180 / Math.PI ); + + self.isSwiping = ( angle > 45 && angle < 135 ) ? 'y' : 'x'; + } + + self.canTap = false; + + if ( self.isSwiping === 'y' && $.fancybox.isMobile && ( isScrollable( self.$target ) || isScrollable( self.$target.parent() ) ) ) { + self.isScrolling = true; + + return; + } + + self.instance.isDragging = self.isSwiping; + + // Reset points to avoid jumping, because we dropped first swipes to calculate the angle + self.startPoints = self.newPoints; + + $.each(self.instance.slides, function( index, slide ) { + $.fancybox.stop( slide.$slide ); + + slide.$slide.css( 'transition-duration', '' ); + + slide.inTransition = false; + + if ( slide.pos === self.instance.current.pos ) { + self.sliderStartPos.left = $.fancybox.getTranslate( slide.$slide ).left; + } + }); + + // Stop slideshow + if ( self.instance.SlideShow && self.instance.SlideShow.isActive ) { + self.instance.SlideShow.stop(); + } + } + + return; + } + + // Sticky edges + if ( swiping == 'x' ) { + if ( self.distanceX > 0 && ( self.instance.group.length < 2 || ( self.instance.current.index === 0 && !self.instance.current.opts.loop ) ) ) { + left = left + Math.pow( self.distanceX, 0.8 ); + + } else if ( self.distanceX < 0 && ( self.instance.group.length < 2 || ( self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop ) ) ) { + left = left - Math.pow( -self.distanceX, 0.8 ); + + } else { + left = left + self.distanceX; + } + } + + self.sliderLastPos = { + top : swiping == 'x' ? 0 : self.sliderStartPos.top + self.distanceY, + left : left + }; + + if ( self.requestId ) { + cancelAFrame( self.requestId ); + + self.requestId = null; + } + + self.requestId = requestAFrame(function() { + + if ( self.sliderLastPos ) { + $.each(self.instance.slides, function( index, slide ) { + var pos = slide.pos - self.instance.currPos; + + $.fancybox.setTranslate( slide.$slide, { + top : self.sliderLastPos.top, + left : self.sliderLastPos.left + ( pos * self.canvasWidth ) + ( pos * slide.opts.gutter ) + }); + }); + + self.$container.addClass( 'fancybox-is-sliding' ); + } + + }); + + }; + + Guestures.prototype.onPan = function() { + var self = this; + + // Sometimes, when tapping causally, image can move a bit and that breaks double tapping + if ( distance( self.newPoints[0], self.realPoints[0] ) < ($.fancybox.isMobile ? 10 : 5) ) { + self.startPoints = self.newPoints; + return; + } + + self.canTap = false; + + self.contentLastPos = self.limitMovement(); + + if ( self.requestId ) { + cancelAFrame( self.requestId ); + + self.requestId = null; + } + + self.requestId = requestAFrame(function() { + $.fancybox.setTranslate( self.$content, self.contentLastPos ); + }); + }; + + // Make panning sticky to the edges + Guestures.prototype.limitMovement = function() { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + var distanceX = self.distanceX; + var distanceY = self.distanceY; + + var contentStartPos = self.contentStartPos; + + var currentOffsetX = contentStartPos.left; + var currentOffsetY = contentStartPos.top; + + var currentWidth = contentStartPos.width; + var currentHeight = contentStartPos.height; + + var minTranslateX, minTranslateY, + maxTranslateX, maxTranslateY, + newOffsetX, newOffsetY; + + if ( currentWidth > canvasWidth ) { + newOffsetX = currentOffsetX + distanceX; + + } else { + newOffsetX = currentOffsetX; + } + + newOffsetY = currentOffsetY + distanceY; + + // Slow down proportionally to traveled distance + minTranslateX = Math.max( 0, canvasWidth * 0.5 - currentWidth * 0.5 ); + minTranslateY = Math.max( 0, canvasHeight * 0.5 - currentHeight * 0.5 ); + + maxTranslateX = Math.min( canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5 ); + maxTranslateY = Math.min( canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5 ); + + if ( currentWidth > canvasWidth ) { + + // -> + if ( distanceX > 0 && newOffsetX > minTranslateX ) { + newOffsetX = minTranslateX - 1 + Math.pow( -minTranslateX + currentOffsetX + distanceX, 0.8 ) || 0; + } + + // <- + if ( distanceX < 0 && newOffsetX < maxTranslateX ) { + newOffsetX = maxTranslateX + 1 - Math.pow( maxTranslateX - currentOffsetX - distanceX, 0.8 ) || 0; + } + + } + + if ( currentHeight > canvasHeight ) { + + // \/ + if ( distanceY > 0 && newOffsetY > minTranslateY ) { + newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8 ) || 0; + } + + // /\ + if ( distanceY < 0 && newOffsetY < maxTranslateY ) { + newOffsetY = maxTranslateY + 1 - Math.pow ( maxTranslateY - currentOffsetY - distanceY, 0.8 ) || 0; + } + + } + + return { + top : newOffsetY, + left : newOffsetX, + scaleX : contentStartPos.scaleX, + scaleY : contentStartPos.scaleY + }; + + }; + + Guestures.prototype.limitPosition = function( newOffsetX, newOffsetY, newWidth, newHeight ) { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + if ( newWidth > canvasWidth ) { + newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; + newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; + + } else { + + // Center horizontally + newOffsetX = Math.max( 0, canvasWidth / 2 - newWidth / 2 ); + + } + + if ( newHeight > canvasHeight ) { + newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; + newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; + + } else { + + // Center vertically + newOffsetY = Math.max( 0, canvasHeight / 2 - newHeight / 2 ); + + } + + return { + top : newOffsetY, + left : newOffsetX + }; + + }; + + Guestures.prototype.onZoom = function() { + var self = this; + + // Calculate current distance between points to get pinch ratio and new width and height + + var currentWidth = self.contentStartPos.width; + var currentHeight = self.contentStartPos.height; + + var currentOffsetX = self.contentStartPos.left; + var currentOffsetY = self.contentStartPos.top; + + var endDistanceBetweenFingers = distance( self.newPoints[0], self.newPoints[1] ); + + var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; + + var newWidth = Math.floor( currentWidth * pinchRatio ); + var newHeight = Math.floor( currentHeight * pinchRatio ); + + // This is the translation due to pinch-zooming + var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; + var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; + + //Point between the two touches + + var centerPointEndX = ((self.newPoints[0].x + self.newPoints[1].x) / 2) - $(window).scrollLeft(); + var centerPointEndY = ((self.newPoints[0].y + self.newPoints[1].y) / 2) - $(window).scrollTop(); + + // And this is the translation due to translation of the centerpoint + // between the two fingers + + var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; + var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; + + // The new offset is the old/current one plus the total translation + + var newOffsetX = currentOffsetX + ( translateFromZoomingX + translateFromTranslatingX ); + var newOffsetY = currentOffsetY + ( translateFromZoomingY + translateFromTranslatingY ); + + var newPos = { + top : newOffsetY, + left : newOffsetX, + scaleX : self.contentStartPos.scaleX * pinchRatio, + scaleY : self.contentStartPos.scaleY * pinchRatio + }; + + self.canTap = false; + + self.newWidth = newWidth; + self.newHeight = newHeight; + + self.contentLastPos = newPos; + + if ( self.requestId ) { + cancelAFrame( self.requestId ); + + self.requestId = null; + } + + self.requestId = requestAFrame(function() { + $.fancybox.setTranslate( self.$content, self.contentLastPos ); + }); + + }; + + Guestures.prototype.ontouchend = function( e ) { + var self = this; + var dMs = Math.max( (new Date().getTime() ) - self.startTime, 1); + + var swiping = self.isSwiping; + var panning = self.isPanning; + var zooming = self.isZooming; + var scrolling = self.isScrolling; + + self.endPoints = pointers( e ); + + self.$container.removeClass( 'fancybox-controls--isGrabbing' ); + + $(document).off( '.fb.touch' ); + + document.removeEventListener('scroll', self.onscroll, true); + + if ( self.requestId ) { + cancelAFrame( self.requestId ); + + self.requestId = null; + } + + self.isSwiping = false; + self.isPanning = false; + self.isZooming = false; + self.isScrolling = false; + + self.instance.isDragging = false; + + if ( self.canTap ) { + return self.onTap( e ); + } + + self.speed = 366; + + // Speed in px/ms + self.velocityX = self.distanceX / dMs * 0.5; + self.velocityY = self.distanceY / dMs * 0.5; + + self.speedX = Math.max( self.speed * 0.5, Math.min( self.speed * 1.5, ( 1 / Math.abs( self.velocityX ) ) * self.speed ) ); + + if ( panning ) { + self.endPanning(); + + } else if ( zooming ) { + self.endZooming(); + + } else { + self.endSwiping( swiping, scrolling ); + } + + return; + }; + + Guestures.prototype.endSwiping = function( swiping, scrolling ) { + var self = this, + ret = false, + len = self.instance.group.length; + + self.sliderLastPos = null; + + // Close if swiped vertically / navigate if horizontally + if ( swiping == 'y' && !scrolling && Math.abs( self.distanceY ) > 50 ) { + + // Continue vertical movement + $.fancybox.animate( self.instance.current.$slide, { + top : self.sliderStartPos.top + self.distanceY + ( self.velocityY * 150 ), + opacity : 0 + }, 150 ); + + ret = self.instance.close( true, 300 ); + + } else if ( swiping == 'x' && self.distanceX > 50 && len > 1 ) { + ret = self.instance.previous( self.speedX ); + + } else if ( swiping == 'x' && self.distanceX < -50 && len > 1 ) { + ret = self.instance.next( self.speedX ); + } + + if ( ret === false && ( swiping == 'x' || swiping == 'y' ) ) { + if ( scrolling || len < 2 ) { + self.instance.centerSlide( self.instance.current, 150 ); + } else { + self.instance.jumpTo( self.instance.current.index ); + } + } + + self.$container.removeClass( 'fancybox-is-sliding' ); + + }; + + // Limit panning from edges + // ======================== + + Guestures.prototype.endPanning = function() { + + var self = this; + var newOffsetX, newOffsetY, newPos; + + if ( !self.contentLastPos ) { + return; + } + + if ( self.opts.momentum === false ) { + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + + } else { + + // Continue movement + newOffsetX = self.contentLastPos.left + ( self.velocityX * self.speed ); + newOffsetY = self.contentLastPos.top + ( self.velocityY * self.speed ); + } + + newPos = self.limitPosition( newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height ); + + newPos.width = self.contentStartPos.width; + newPos.height = self.contentStartPos.height; + + $.fancybox.animate( self.$content, newPos, 330 ); + }; + + + Guestures.prototype.endZooming = function() { + var self = this; + + var current = self.instance.current; + + var newOffsetX, newOffsetY, newPos, reset; + + var newWidth = self.newWidth; + var newHeight = self.newHeight; + + if ( !self.contentLastPos ) { + return; + } + + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + + reset = { + top : newOffsetY, + left : newOffsetX, + width : newWidth, + height : newHeight, + scaleX : 1, + scaleY : 1 + }; + + // Reset scalex/scaleY values; this helps for perfomance and does not break animation + $.fancybox.setTranslate( self.$content, reset ); + + if ( newWidth < self.canvasWidth && newHeight < self.canvasHeight ) { + self.instance.scaleToFit( 150 ); + + } else if ( newWidth > current.width || newHeight > current.height ) { + self.instance.scaleToActual( self.centerPointStartX, self.centerPointStartY, 150 ); + + } else { + + newPos = self.limitPosition( newOffsetX, newOffsetY, newWidth, newHeight ); + + // Switch from scale() to width/height or animation will not work correctly + $.fancybox.setTranslate( self.content, $.fancybox.getTranslate( self.$content ) ); + + $.fancybox.animate( self.$content, newPos, 150 ); + } + + }; + + Guestures.prototype.onTap = function(e) { + var self = this; + var $target = $( e.target ); + + var instance = self.instance; + var current = instance.current; + + var endPoints = ( e && pointers( e ) ) || self.startPoints; + + var tapX = endPoints[0] ? endPoints[0].x - self.$stage.offset().left : 0; + var tapY = endPoints[0] ? endPoints[0].y - self.$stage.offset().top : 0; + + var where; + + var process = function ( prefix ) { + + var action = current.opts[ prefix ]; + + if ( $.isFunction( action ) ) { + action = action.apply( instance, [ current, e ] ); + } + + if ( !action) { + return; + } + + switch ( action ) { + + case "close" : + + instance.close( self.startEvent ); + + break; + + case "toggleControls" : + + instance.toggleControls( true ); + + break; + + case "next" : + + instance.next(); + + break; + + case "nextOrClose" : + + if ( instance.group.length > 1 ) { + instance.next(); + + } else { + instance.close( self.startEvent ); + } + + break; + + case "zoom" : + + if ( current.type == 'image' && ( current.isLoaded || current.$ghost ) ) { + + if ( instance.canPan() ) { + instance.scaleToFit(); + + } else if ( instance.isScaledDown() ) { + instance.scaleToActual( tapX, tapY ); + + } else if ( instance.group.length < 2 ) { + instance.close( self.startEvent ); + } + } + + break; + } + + }; + + // Ignore right click + if ( e.originalEvent && e.originalEvent.button == 2 ) { + return; + } + + // Skip if clicked on the scrollbar + if ( !$target.is('img') && tapX > $target[0].clientWidth + $target.offset().left ) { + return; + } + + // Check where is clicked + if ( $target.is( '.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container' ) ) { + where = 'Outside'; + + } else if ( $target.is( '.fancybox-slide' ) ) { + where = 'Slide'; + + } else if ( instance.current.$content && instance.current.$content.find( $target ).addBack().filter( $target ).length ) { + where = 'Content'; + + } else { + return; + } + + // Check if this is a double tap + if ( self.tapped ) { + + // Stop previously created single tap + clearTimeout( self.tapped ); + self.tapped = null; + + // Skip if distance between taps is too big + if ( Math.abs( tapX - self.tapX ) > 50 || Math.abs( tapY - self.tapY ) > 50 ) { + return this; + } + + // OK, now we assume that this is a double-tap + process( 'dblclick' + where ); + + } else { + + // Single tap will be processed if user has not clicked second time within 300ms + // or there is no need to wait for double-tap + self.tapX = tapX; + self.tapY = tapY; + + if ( current.opts[ 'dblclick' + where ] && current.opts[ 'dblclick' + where ] !== current.opts[ 'click' + where ] ) { + + self.tapped = setTimeout(function() { + self.tapped = null; + + process( 'click' + where ); + + }, 500); + + } else { + process( 'click' + where ); + } + + } + + return this; + }; + + $(document).on('onActivate.fb', function (e, instance) { + if ( instance && !instance.Guestures ) { + instance.Guestures = new Guestures( instance ); + } + }); + +}( window, document, window.jQuery || jQuery )); + +// ========================================================================== +// +// SlideShow +// Enables slideshow functionality +// +// Example of usage: +// $.fancybox.getInstance().SlideShow.start() +// +// ========================================================================== +;(function (document, $) { + 'use strict'; + + $.extend(true, $.fancybox.defaults, { + btnTpl : { + slideShow : + '' + }, + slideShow : { + autoStart : false, + speed : 3000 + } + }); + + var SlideShow = function( instance ) { + this.instance = instance; + this.init(); + }; + + $.extend( SlideShow.prototype, { + timer : null, + isActive : false, + $button : null, + + init : function() { + var self = this; + + self.$button = self.instance.$refs.toolbar.find('[data-fancybox-play]').on('click', function() { + self.toggle(); + }); + + if ( self.instance.group.length < 2 || !self.instance.group[ self.instance.currIndex ].opts.slideShow ) { + self.$button.hide(); + } + }, + + set : function( force ) { + var self = this; + + // Check if reached last element + if ( self.instance && self.instance.current && (force === true || self.instance.current.opts.loop || self.instance.currIndex < self.instance.group.length - 1 )) { + self.timer = setTimeout(function() { + if ( self.isActive ) { + self.instance.jumpTo( (self.instance.currIndex + 1) % self.instance.group.length ); + } + + }, self.instance.current.opts.slideShow.speed); + + } else { + self.stop(); + self.instance.idleSecondsCounter = 0; + self.instance.showControls(); + } + }, + + clear : function() { + var self = this; + + clearTimeout( self.timer ); + + self.timer = null; + }, + + start : function() { + var self = this; + var current = self.instance.current; + + if ( current ) { + self.isActive = true; + + self.$button + .attr( 'title', current.opts.i18n[ current.opts.lang ].PLAY_STOP ) + .removeClass( 'fancybox-button--play' ) + .addClass( 'fancybox-button--pause' ); + + self.set( true ); + } + }, + + stop : function() { + var self = this; + var current = self.instance.current; + + self.clear(); + + self.$button + .attr( 'title', current.opts.i18n[ current.opts.lang ].PLAY_START ) + .removeClass( 'fancybox-button--pause' ) + .addClass( 'fancybox-button--play' ); + + self.isActive = false; + }, + + toggle : function() { + var self = this; + + if ( self.isActive ) { + self.stop(); + + } else { + self.start(); + } + } + + }); + + $(document).on({ + 'onInit.fb' : function(e, instance) { + if ( instance && !instance.SlideShow ) { + instance.SlideShow = new SlideShow( instance ); + } + }, + + 'beforeShow.fb' : function(e, instance, current, firstRun) { + var SlideShow = instance && instance.SlideShow; + + if ( firstRun ) { + + if ( SlideShow && current.opts.slideShow.autoStart ) { + SlideShow.start(); + } + + } else if ( SlideShow && SlideShow.isActive ) { + SlideShow.clear(); + } + }, + + 'afterShow.fb' : function(e, instance, current) { + var SlideShow = instance && instance.SlideShow; + + if ( SlideShow && SlideShow.isActive ) { + SlideShow.set(); + } + }, + + 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { + var SlideShow = instance && instance.SlideShow; + + // "P" or Spacebar + if ( SlideShow && current.opts.slideShow && ( keycode === 80 || keycode === 32 ) && !$(document.activeElement).is( 'button,a,input' ) ) { + keypress.preventDefault(); + + SlideShow.toggle(); + } + }, + + 'beforeClose.fb onDeactivate.fb' : function(e, instance) { + var SlideShow = instance && instance.SlideShow; + + if ( SlideShow ) { + SlideShow.stop(); + } + } + }); + + // Page Visibility API to pause slideshow when window is not active + $(document).on("visibilitychange", function() { + var instance = $.fancybox.getInstance(); + var SlideShow = instance && instance.SlideShow; + + if ( SlideShow && SlideShow.isActive ) { + if ( document.hidden ) { + SlideShow.clear(); + + } else { + SlideShow.set(); + } + } + }); + +}( document, window.jQuery || jQuery )); + +// ========================================================================== +// +// FullScreen +// Adds fullscreen functionality +// +// ========================================================================== +;(function (document, $) { + 'use strict'; + + // Collection of methods supported by user browser + var fn = (function () { + + var fnMap = [ + [ + 'requestFullscreen', + 'exitFullscreen', + 'fullscreenElement', + 'fullscreenEnabled', + 'fullscreenchange', + 'fullscreenerror' + ], + // new WebKit + [ + 'webkitRequestFullscreen', + 'webkitExitFullscreen', + 'webkitFullscreenElement', + 'webkitFullscreenEnabled', + 'webkitfullscreenchange', + 'webkitfullscreenerror' + + ], + // old WebKit (Safari 5.1) + [ + 'webkitRequestFullScreen', + 'webkitCancelFullScreen', + 'webkitCurrentFullScreenElement', + 'webkitCancelFullScreen', + 'webkitfullscreenchange', + 'webkitfullscreenerror' + + ], + [ + 'mozRequestFullScreen', + 'mozCancelFullScreen', + 'mozFullScreenElement', + 'mozFullScreenEnabled', + 'mozfullscreenchange', + 'mozfullscreenerror' + ], + [ + 'msRequestFullscreen', + 'msExitFullscreen', + 'msFullscreenElement', + 'msFullscreenEnabled', + 'MSFullscreenChange', + 'MSFullscreenError' + ] + ]; + + var val; + var ret = {}; + var i, j; + + for ( i = 0; i < fnMap.length; i++ ) { + val = fnMap[ i ]; + + if ( val && val[ 1 ] in document ) { + for ( j = 0; j < val.length; j++ ) { + ret[ fnMap[ 0 ][ j ] ] = val[ j ]; + } + + return ret; + } + } + + return false; + })(); + + // If browser does not have Full Screen API, then simply unset default button template and stop + if ( !fn ) { + + if ( $ && $.fancybox ) { + $.fancybox.defaults.btnTpl.fullScreen = false; + } + + return; + } + + var FullScreen = { + + request : function ( elem ) { + + elem = elem || document.documentElement; + + elem[ fn.requestFullscreen ]( elem.ALLOW_KEYBOARD_INPUT ); + + }, + exit : function () { + + document[ fn.exitFullscreen ](); + + }, + toggle : function ( elem ) { + + elem = elem || document.documentElement; + + if ( this.isFullscreen() ) { + this.exit(); + + } else { + this.request( elem ); + } + + }, + isFullscreen : function() { + + return Boolean( document[ fn.fullscreenElement ] ); + + }, + enabled : function() { + + return Boolean( document[ fn.fullscreenEnabled ] ); + + } + }; + + $.extend(true, $.fancybox.defaults, { + btnTpl : { + fullScreen : + '' + }, + fullScreen : { + autoStart : false + } + }); + + $(document).on({ + 'onInit.fb' : function(e, instance) { + var $container; + + if ( instance && instance.group[ instance.currIndex ].opts.fullScreen ) { + $container = instance.$refs.container; + + $container.on('click.fb-fullscreen', '[data-fancybox-fullscreen]', function(e) { + + e.stopPropagation(); + e.preventDefault(); + + FullScreen.toggle( $container[ 0 ] ); + + }); + + if ( instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true ) { + FullScreen.request( $container[ 0 ] ); + } + + // Expose API + instance.FullScreen = FullScreen; + + } else if ( instance ) { + instance.$refs.toolbar.find('[data-fancybox-fullscreen]').hide(); + } + + }, + + 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { + + // "P" or Spacebar + if ( instance && instance.FullScreen && keycode === 70 ) { + keypress.preventDefault(); + + instance.FullScreen.toggle( instance.$refs.container[ 0 ] ); + } + + }, + + 'beforeClose.fb' : function( instance ) { + if ( instance && instance.FullScreen ) { + FullScreen.exit(); + } + } + }); + + $(document).on(fn.fullscreenchange, function() { + var isFullscreen = FullScreen.isFullscreen(), + instance = $.fancybox.getInstance(); + + if ( instance ) { + + // If image is zooming, then force to stop and reposition properly + if ( instance.current && instance.current.type === 'image' && instance.isAnimating ) { + instance.current.$content.css( 'transition', 'none' ); + + instance.isAnimating = false; + + instance.update( true, true, 0 ); + } + + instance.trigger( 'onFullscreenChange', isFullscreen ); + + instance.$refs.container.toggleClass( 'fancybox-is-fullscreen', isFullscreen ); + } + + }); + +}( document, window.jQuery || jQuery )); + +// ========================================================================== +// +// Thumbs +// Displays thumbnails in a grid +// +// ========================================================================== +;(function (document, $) { + 'use strict'; + + // Make sure there are default values + $.fancybox.defaults = $.extend(true, { + btnTpl : { + thumbs : + '' + }, + thumbs : { + autoStart : false, // Display thumbnails on opening + hideOnClose : true, // Hide thumbnail grid when closing animation starts + parentEl : '.fancybox-container', // Container is injected into this element + axis : 'y' // Vertical (y) or horizontal (x) scrolling + } + }, $.fancybox.defaults); + + var FancyThumbs = function( instance ) { + this.init( instance ); + }; + + $.extend( FancyThumbs.prototype, { + + $button : null, + $grid : null, + $list : null, + isVisible : false, + isActive : false, + + init : function( instance ) { + var self = this; + + self.instance = instance; + + instance.Thumbs = self; + + // Enable thumbs if at least two group items have thumbnails + var first = instance.group[0], + second = instance.group[1]; + + self.opts = instance.group[ instance.currIndex ].opts.thumbs; + + self.$button = instance.$refs.toolbar.find( '[data-fancybox-thumbs]' ); + + if ( self.opts && first && second && ( + ( first.type == 'image' || first.opts.thumb || first.opts.$thumb ) && + ( second.type == 'image' || second.opts.thumb || second.opts.$thumb ) + )) { + + self.$button.show().on('click', function() { + self.toggle(); + }); + + self.isActive = true; + + } else { + self.$button.hide(); + } + }, + + create : function() { + var self = this, + instance = self.instance, + parentEl = self.opts.parentEl, + list, + src; + + self.$grid = $('
').appendTo( instance.$refs.container.find( parentEl ).addBack().filter( parentEl ) ); + + // Build list HTML + list = '
    '; + + $.each(instance.group, function( i, item ) { + src = item.opts.thumb || ( item.opts.$thumb ? item.opts.$thumb.attr( 'src' ) : null ); + + if ( !src && item.type === 'image' ) { + src = item.src; + } + + if ( src && src.length ) { + list += '
  • '; + } + }); + + list += '
'; + + self.$list = $( list ).appendTo( self.$grid ).on('click', 'li', function() { + instance.jumpTo( $(this).data('index') ); + }); + + self.$list.find( 'img' ).hide().one('load', function() { + var $parent = $(this).parent().removeClass( 'fancybox-thumbs-loading' ), + thumbWidth = $parent.outerWidth(), + thumbHeight = $parent.outerHeight(), + width, + height, + widthRatio, + heightRatio; + + width = this.naturalWidth || this.width; + height = this.naturalHeight || this.height; + + // Calculate thumbnail dimensions; center vertically and horizontally + widthRatio = width / thumbWidth; + heightRatio = height / thumbHeight; + + if (widthRatio >= 1 && heightRatio >= 1) { + if (widthRatio > heightRatio) { + width = width / heightRatio; + height = thumbHeight; + + } else { + width = thumbWidth; + height = height / widthRatio; + } + } + + $(this).css({ + width : Math.floor(width), + height : Math.floor(height), + 'margin-top' : height > thumbHeight ? ( Math.floor(thumbHeight * 0.3 - height * 0.3 ) ) : Math.floor(thumbHeight * 0.5 - height * 0.5 ), + 'margin-left' : Math.floor(thumbWidth * 0.5 - width * 0.5 ) + }).show(); + + }) + .each(function() { + this.src = $( this ).data( 'src' ); + }); + + if ( self.opts.axis === 'x' ) { + self.$list.width( parseInt( self.$grid.css("padding-right") ) + ( instance.group.length * self.$list.children().eq(0).outerWidth(true) ) + 'px' ); + } + }, + + focus : function( duration ) { + var self = this, + $list = self.$list, + thumb, + thumbPos; + + if ( self.instance.current ) { + thumb = $list.children() + .removeClass( 'fancybox-thumbs-active' ) + .filter('[data-index="' + self.instance.current.index + '"]') + .addClass('fancybox-thumbs-active'); + + thumbPos = thumb.position(); + + // Check if need to scroll to make current thumb visible + if ( self.opts.axis === 'y' && ( thumbPos.top < 0 || thumbPos.top > ( $list.height() - thumb.outerHeight() ) ) ) { + $list.stop().animate({ 'scrollTop' : $list.scrollTop() + thumbPos.top }, duration); + + } else if ( self.opts.axis === 'x' && ( + thumbPos.left < $list.parent().scrollLeft() || + thumbPos.left > ( $list.parent().scrollLeft() + ( $list.parent().width() - thumb.outerWidth() ) ) + ) + ) { + $list.parent().stop().animate({ 'scrollLeft' : thumbPos.left }, duration); + } + } + }, + + update : function() { + this.instance.$refs.container.toggleClass( 'fancybox-show-thumbs', this.isVisible ); + + if ( this.isVisible ) { + if ( !this.$grid ) { + this.create(); + } + + this.instance.trigger( 'onThumbsShow' ); + + this.focus( 0 ); + + } else if ( this.$grid ) { + this.instance.trigger( 'onThumbsHide' ); + } + + // Update content position + this.instance.update(); + }, + + hide : function() { + this.isVisible = false; + this.update(); + }, + + show : function() { + this.isVisible = true; + this.update(); + }, + + toggle : function() { + this.isVisible = !this.isVisible; + this.update(); + } + }); + + $(document).on({ + + 'onInit.fb' : function(e, instance) { + var Thumbs; + + if ( instance && !instance.Thumbs ) { + Thumbs = new FancyThumbs( instance ); + + if ( Thumbs.isActive && Thumbs.opts.autoStart === true ) { + Thumbs.show(); + } + } + }, + + 'beforeShow.fb' : function(e, instance, item, firstRun) { + var Thumbs = instance && instance.Thumbs; + + if ( Thumbs && Thumbs.isVisible ) { + Thumbs.focus( firstRun ? 0 : 250 ); + } + }, + + 'afterKeydown.fb' : function(e, instance, current, keypress, keycode) { + var Thumbs = instance && instance.Thumbs; + + // "G" + if ( Thumbs && Thumbs.isActive && keycode === 71 ) { + keypress.preventDefault(); + + Thumbs.toggle(); + } + }, + + 'beforeClose.fb' : function( e, instance ) { + var Thumbs = instance && instance.Thumbs; + + if ( Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false ) { + Thumbs.$grid.hide(); + } + } + + }); + +}(document, window.jQuery)); + +//// ========================================================================== +// +// Share +// Displays simple form for sharing current url +// +// ========================================================================== +;(function (document, $) { + 'use strict'; + + $.extend(true, $.fancybox.defaults, { + btnTpl : { + share : + '' + }, + share : { + tpl : + '
' + + '

{{SHARE}}

' + + '' + + '

' + + '
' + } + }); + + function escapeHtml(string) { + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + $(document).on('click', '[data-fancybox-share]', function() { + var f = $.fancybox.getInstance(), + url, + tpl; + + if ( f ) { + url = f.current.opts.hash === false ? f.current.src : window.location; + tpl = f.current.opts.share.tpl + .replace( /\{\{media\}\}/g, f.current.type === 'image' ? encodeURIComponent( f.current.src ) : '' ) + .replace( /\{\{url\}\}/g, encodeURIComponent( url ) ) + .replace( /\{\{url_raw\}\}/g, escapeHtml( url ) ) + .replace( /\{\{descr\}\}/g, f.$caption ? encodeURIComponent( f.$caption.text() ) : '' ); + + $.fancybox.open({ + src : f.translate( f, tpl ), + type : 'html', + opts : { + animationEffect : "fade", + animationDuration : 250, + afterLoad : function(instance, current) { + // Opening links in a popup window + current.$content.find('.fancybox-share__links a').click(function() { + window.open(this.href, "Share", "width=550, height=450"); + return false; + }); + } + } + }); + } + + }); + +}( document, window.jQuery || jQuery )); + +// ========================================================================== +// +// Hash +// Enables linking to each modal +// +// ========================================================================== +;(function (document, window, $) { + 'use strict'; + + // Simple $.escapeSelector polyfill (for jQuery prior v3) + if ( !$.escapeSelector ) { + $.escapeSelector = function( sel ) { + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + var fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }; + + return ( sel + "" ).replace( rcssescape, fcssescape ); + }; + } + + // Create new history entry only once + var shouldCreateHistory = true; + + // Variable containing last hash value set by fancyBox + // It will be used to determine if fancyBox needs to close after hash change is detected + var currentHash = null; + + // Throttling the history change + var timerID = null; + + // Get info about gallery name and current index from url + function parseUrl() { + var hash = window.location.hash.substr( 1 ); + var rez = hash.split( '-' ); + var index = rez.length > 1 && /^\+?\d+$/.test( rez[ rez.length - 1 ] ) ? parseInt( rez.pop( -1 ), 10 ) || 1 : 1; + var gallery = rez.join( '-' ); + + // Index is starting from 1 + if ( index < 1 ) { + index = 1; + } + + return { + hash : hash, + index : index, + gallery : gallery + }; + } + + // Trigger click evnt on links to open new fancyBox instance + function triggerFromUrl( url ) { + var $el; + + if ( url.gallery !== '' ) { + + // If we can find element matching 'data-fancybox' atribute, then trigger click event for that .. + $el = $( "[data-fancybox='" + $.escapeSelector( url.gallery ) + "']" ).eq( url.index - 1 ); + + if ( !$el.length ) { + // .. if not, try finding element by ID + $el = $( "#" + $.escapeSelector( url.gallery ) + "" ); + } + + if ( $el.length ) { + shouldCreateHistory = false; + + $el.trigger( 'click' ); + } + + } + } + + // Get gallery name from current instance + function getGalleryID( instance ) { + var opts; + + if ( !instance ) { + return false; + } + + opts = instance.current ? instance.current.opts : instance.opts; + + return opts.hash || ( opts.$orig ? opts.$orig.data( 'fancybox' ) : '' ); + } + + // Start when DOM becomes ready + $(function() { + + // Check if user has disabled this module + if ( $.fancybox.defaults.hash === false ) { + return; + } + + // Update hash when opening/closing fancyBox + $(document).on({ + 'onInit.fb' : function( e, instance ) { + var url, gallery; + + if ( instance.group[ instance.currIndex ].opts.hash === false ) { + return; + } + + url = parseUrl(); + gallery = getGalleryID( instance ); + + // Make sure gallery start index matches index from hash + if ( gallery && url.gallery && gallery == url.gallery ) { + instance.currIndex = url.index - 1; + } + }, + + 'beforeShow.fb' : function( e, instance, current ) { + var gallery; + + if ( !current || current.opts.hash === false ) { + return; + } + + gallery = getGalleryID( instance ); + + // Update window hash + if ( gallery && gallery !== '' ) { + + if ( window.location.hash.indexOf( gallery ) < 0 ) { + instance.opts.origHash = window.location.hash; + } + + currentHash = gallery + ( instance.group.length > 1 ? '-' + ( current.index + 1 ) : '' ); + + if ( 'replaceState' in window.history ) { + if ( timerID ) { + clearTimeout( timerID ); + } + + timerID = setTimeout(function() { + window.history[ shouldCreateHistory ? 'pushState' : 'replaceState' ]( {} , document.title, window.location.pathname + window.location.search + '#' + currentHash ); + + timerID = null; + + shouldCreateHistory = false; + + }, 300); + + } else { + window.location.hash = currentHash; + } + + } + + }, + + 'beforeClose.fb' : function( e, instance, current ) { + var gallery, origHash; + + if ( timerID ) { + clearTimeout( timerID ); + } + + if ( current.opts.hash === false ) { + return; + } + + gallery = getGalleryID( instance ); + origHash = instance && instance.opts.origHash ? instance.opts.origHash : ''; + + // Remove hash from location bar + if ( gallery && gallery !== '' ) { + + if ( 'replaceState' in history ) { + window.history.replaceState( {} , document.title, window.location.pathname + window.location.search + origHash ); + + } else { + window.location.hash = origHash; + + // Keep original scroll position + $( window ).scrollTop( instance.scrollTop ).scrollLeft( instance.scrollLeft ); + } + } + + currentHash = null; + } + }); + + // Check if need to close after url has changed + $(window).on('hashchange.fb', function() { + var url = parseUrl(); + + if ( $.fancybox.getInstance() ) { + if ( currentHash && currentHash !== url.gallery + '-' + url.index && !( url.index === 1 && currentHash == url.gallery ) ) { + currentHash = null; + + $.fancybox.close(); + } + + } else if ( url.gallery !== '' ) { + triggerFromUrl( url ); + } + }); + + // Check current hash and trigger click event on matching element to start fancyBox, if needed + setTimeout(function() { + triggerFromUrl( parseUrl() ); + }, 50); + }); + +}( document, window, window.jQuery || jQuery )); + +;(function (document, $) { + 'use strict'; + + var prevTime = new Date().getTime(); + + $(document).on({ + 'onInit.fb' : function( e, instance, current ) { + instance.$refs.stage.on('mousewheel DOMMouseScroll wheel MozMousePixelScroll', function(e) { + var current = instance.current, + currTime = new Date().getTime(); + + if ( instance.group.length < 1 || current.opts.wheel === false || ( current.opts.wheel === 'auto' && current.type !== 'image' ) ) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + if ( current.$slide.hasClass( 'fancybox-animated' ) ) { + return; + } + + e = e.originalEvent || e; + + if ( currTime - prevTime < 250 ) { + return; + } + + prevTime = currTime; + + instance[ ( -e.deltaY || -e.deltaX || e.wheelDelta || -e.detail ) < 0 ? 'next' : 'previous' ](); + + }); + } + }); + +}( document, window.jQuery || jQuery )); diff --git a/public/assets/js/jquery.js b/public/assets/js/jquery.js new file mode 100644 index 0000000..e836475 --- /dev/null +++ b/public/assets/js/jquery.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("' ); + html.attr( 'height', height ); + html.attr( 'width', width ); + if (video.type === 'youtube') { + html.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id ); + } else if (video.type === 'vimeo') { + html.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' ); + } else if (video.type === 'vzaar') { + html.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' ); + } + + iframe = $(html).wrap( '
' ).insertAfter(item.find('.owl-video')); + + this._playing = item.addClass('owl-video-playing'); + }; + + /** + * Checks whether an video is currently in full screen mode or not. + * @todo Bad style because looks like a readonly method but changes members. + * @protected + * @returns {Boolean} + */ + Video.prototype.isInFullScreen = function() { + var element = document.fullscreenElement || document.mozFullScreenElement || + document.webkitFullscreenElement; + + return element && $(element).parent().hasClass('owl-video-frame'); + }; + + /** + * Destroys the plugin. + */ + Video.prototype.destroy = function() { + var handler, property; + + this._core.$element.off('click.owl.video'); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Video = Video; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Animate Plugin + * @version 2.3.4 + * @author Bartosz Wojciechowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the animate plugin. + * @class The Navigation Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Animate = function(scope) { + this.core = scope; + this.core.options = $.extend({}, Animate.Defaults, this.core.options); + this.swapping = true; + this.previous = undefined; + this.next = undefined; + + this.handlers = { + 'change.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.previous = this.core.current(); + this.next = e.property.value; + } + }, this), + 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) { + if (e.namespace) { + this.swapping = e.type == 'translated'; + } + }, this), + 'translate.owl.carousel': $.proxy(function(e) { + if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) { + this.swap(); + } + }, this) + }; + + this.core.$element.on(this.handlers); + }; + + /** + * Default options. + * @public + */ + Animate.Defaults = { + animateOut: false, + animateIn: false + }; + + /** + * Toggles the animation classes whenever an translations starts. + * @protected + * @returns {Boolean|undefined} + */ + Animate.prototype.swap = function() { + + if (this.core.settings.items !== 1) { + return; + } + + if (!$.support.animation || !$.support.transition) { + return; + } + + this.core.speed(0); + + var left, + clear = $.proxy(this.clear, this), + previous = this.core.$stage.children().eq(this.previous), + next = this.core.$stage.children().eq(this.next), + incoming = this.core.settings.animateIn, + outgoing = this.core.settings.animateOut; + + if (this.core.current() === this.previous) { + return; + } + + if (outgoing) { + left = this.core.coordinates(this.previous) - this.core.coordinates(this.next); + previous.one($.support.animation.end, clear) + .css( { 'left': left + 'px' } ) + .addClass('animated owl-animated-out') + .addClass(outgoing); + } + + if (incoming) { + next.one($.support.animation.end, clear) + .addClass('animated owl-animated-in') + .addClass(incoming); + } + }; + + Animate.prototype.clear = function(e) { + $(e.target).css( { 'left': '' } ) + .removeClass('animated owl-animated-out owl-animated-in') + .removeClass(this.core.settings.animateIn) + .removeClass(this.core.settings.animateOut); + this.core.onTransitionEnd(); + }; + + /** + * Destroys the plugin. + * @public + */ + Animate.prototype.destroy = function() { + var handler, property; + + for (handler in this.handlers) { + this.core.$element.off(handler, this.handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.Animate = Animate; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Autoplay Plugin + * @version 2.3.4 + * @author Bartosz Wojciechowski + * @author Artus Kolanowski + * @author David Deutsch + * @author Tom De Caluwé + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + + /** + * Creates the autoplay plugin. + * @class The Autoplay Plugin + * @param {Owl} scope - The Owl Carousel + */ + var Autoplay = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * The autoplay timeout id. + * @type {Number} + */ + this._call = null; + + /** + * Depending on the state of the plugin, this variable contains either + * the start time of the timer or the current timer value if it's + * paused. Since we start in a paused state we initialize the timer + * value. + * @type {Number} + */ + this._time = 0; + + /** + * Stores the timeout currently used. + * @type {Number} + */ + this._timeout = 0; + + /** + * Indicates whenever the autoplay is paused. + * @type {Boolean} + */ + this._paused = true; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name === 'settings') { + if (this._core.settings.autoplay) { + this.play(); + } else { + this.stop(); + } + } else if (e.namespace && e.property.name === 'position' && this._paused) { + // Reset the timer. This code is triggered when the position + // of the carousel was changed through user interaction. + this._time = 0; + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.autoplay) { + this.play(); + } + }, this), + 'play.owl.autoplay': $.proxy(function(e, t, s) { + if (e.namespace) { + this.play(t, s); + } + }, this), + 'stop.owl.autoplay': $.proxy(function(e) { + if (e.namespace) { + this.stop(); + } + }, this), + 'mouseover.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'mouseleave.owl.autoplay': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.play(); + } + }, this), + 'touchstart.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) { + this.pause(); + } + }, this), + 'touchend.owl.core': $.proxy(function() { + if (this._core.settings.autoplayHoverPause) { + this.play(); + } + }, this) + }; + + // register event handlers + this._core.$element.on(this._handlers); + + // set default options + this._core.options = $.extend({}, Autoplay.Defaults, this._core.options); + }; + + /** + * Default options. + * @public + */ + Autoplay.Defaults = { + autoplay: false, + autoplayTimeout: 5000, + autoplayHoverPause: false, + autoplaySpeed: false + }; + + /** + * Transition to the next slide and set a timeout for the next transition. + * @private + * @param {Number} [speed] - The animation speed for the animations. + */ + Autoplay.prototype._next = function(speed) { + this._call = window.setTimeout( + $.proxy(this._next, this, speed), + this._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read() + ); + + if (this._core.is('interacting') || document.hidden) { + return; + } + this._core.next(speed || this._core.settings.autoplaySpeed); + } + + /** + * Reads the current timer value when the timer is playing. + * @public + */ + Autoplay.prototype.read = function() { + return new Date().getTime() - this._time; + }; + + /** + * Starts the autoplay. + * @public + * @param {Number} [timeout] - The interval before the next animation starts. + * @param {Number} [speed] - The animation speed for the animations. + */ + Autoplay.prototype.play = function(timeout, speed) { + var elapsed; + + if (!this._core.is('rotating')) { + this._core.enter('rotating'); + } + + timeout = timeout || this._core.settings.autoplayTimeout; + + // Calculate the elapsed time since the last transition. If the carousel + // wasn't playing this calculation will yield zero. + elapsed = Math.min(this._time % (this._timeout || timeout), timeout); + + if (this._paused) { + // Start the clock. + this._time = this.read(); + this._paused = false; + } else { + // Clear the active timeout to allow replacement. + window.clearTimeout(this._call); + } + + // Adjust the origin of the timer to match the new timeout value. + this._time += this.read() % timeout - elapsed; + + this._timeout = timeout; + this._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed); + }; + + /** + * Stops the autoplay. + * @public + */ + Autoplay.prototype.stop = function() { + if (this._core.is('rotating')) { + // Reset the clock. + this._time = 0; + this._paused = true; + + window.clearTimeout(this._call); + this._core.leave('rotating'); + } + }; + + /** + * Pauses the autoplay. + * @public + */ + Autoplay.prototype.pause = function() { + if (this._core.is('rotating') && !this._paused) { + // Pause the clock. + this._time = this.read(); + this._paused = true; + + window.clearTimeout(this._call); + } + }; + + /** + * Destroys the plugin. + */ + Autoplay.prototype.destroy = function() { + var handler, property; + + this.stop(); + + for (handler in this._handlers) { + this._core.$element.off(handler, this._handlers[handler]); + } + for (property in Object.getOwnPropertyNames(this)) { + typeof this[property] != 'function' && (this[property] = null); + } + }; + + $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay; + +})(window.Zepto || window.jQuery, window, document); + +/** + * Navigation Plugin + * @version 2.3.4 + * @author Artus Kolanowski + * @author David Deutsch + * @license The MIT License (MIT) + */ +;(function($, window, document, undefined) { + 'use strict'; + + /** + * Creates the navigation plugin. + * @class The Navigation Plugin + * @param {Owl} carousel - The Owl Carousel. + */ + var Navigation = function(carousel) { + /** + * Reference to the core. + * @protected + * @type {Owl} + */ + this._core = carousel; + + /** + * Indicates whether the plugin is initialized or not. + * @protected + * @type {Boolean} + */ + this._initialized = false; + + /** + * The current paging indexes. + * @protected + * @type {Array} + */ + this._pages = []; + + /** + * All DOM elements of the user interface. + * @protected + * @type {Object} + */ + this._controls = {}; + + /** + * Markup for an indicator. + * @protected + * @type {Array.} + */ + this._templates = []; + + /** + * The carousel element. + * @type {jQuery} + */ + this.$element = this._core.$element; + + /** + * Overridden methods of the carousel. + * @protected + * @type {Object} + */ + this._overrides = { + next: this._core.next, + prev: this._core.prev, + to: this._core.to + }; + + /** + * All event handlers. + * @protected + * @type {Object} + */ + this._handlers = { + 'prepared.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.push('
' + + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '
'); + } + }, this), + 'added.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 0, this._templates.pop()); + } + }, this), + 'remove.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._core.settings.dotsData) { + this._templates.splice(e.position, 1); + } + }, this), + 'changed.owl.carousel': $.proxy(function(e) { + if (e.namespace && e.property.name == 'position') { + this.draw(); + } + }, this), + 'initialized.owl.carousel': $.proxy(function(e) { + if (e.namespace && !this._initialized) { + this._core.trigger('initialize', null, 'navigation'); + this.initialize(); + this.update(); + this.draw(); + this._initialized = true; + this._core.trigger('initialized', null, 'navigation'); + } + }, this), + 'refreshed.owl.carousel': $.proxy(function(e) { + if (e.namespace && this._initialized) { + this._core.trigger('refresh', null, 'navigation'); + this.update(); + this.draw(); + this._core.trigger('refreshed', null, 'navigation'); + } + }, this) + }; + + // set default options + this._core.options = $.extend({}, Navigation.Defaults, this._core.options); + + // register event handlers + this.$element.on(this._handlers); + }; + + /** + * Default options. + * @public + * @todo Rename `slideBy` to `navBy` + */ + Navigation.Defaults = { + nav: false, + navText: [ + '', + '' + ], + navSpeed: false, + navElement: 'button type="button" role="presentation"', + navContainer: false, + navContainerClass: 'owl-nav', + navClass: [ + 'owl-prev', + 'owl-next' + ], + slideBy: 1, + dotClass: 'owl-dot', + dotsClass: 'owl-dots', + dots: true, + dotsEach: false, + dotsData: false, + dotsSpeed: false, + dotsContainer: false + }; + + /** + * Initializes the layout of the plugin and extends the carousel. + * @protected + */ + Navigation.prototype.initialize = function() { + var override, + settings = this._core.settings; + + // create DOM structure for relative navigation + this._controls.$relative = (settings.navContainer ? $(settings.navContainer) + : $('
').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled'); + + this._controls.$previous = $('<' + settings.navElement + '>') + .addClass(settings.navClass[0]) + .html(settings.navText[0]) + .prependTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.prev(settings.navSpeed); + }, this)); + this._controls.$next = $('<' + settings.navElement + '>') + .addClass(settings.navClass[1]) + .html(settings.navText[1]) + .appendTo(this._controls.$relative) + .on('click', $.proxy(function(e) { + this.next(settings.navSpeed); + }, this)); + + // create DOM structure for absolute navigation + if (!settings.dotsData) { + this._templates = [ $('