From 8ab15f7225f662494455d86ca5eba67a10118730 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 29 Nov 2016 13:29:31 -0700 Subject: [PATCH] Initial migration of codebase (#2) * Initial migration of codebase Signed-off-by: Dan Cunningham Also-by: Victor Belov Also-by: Mehmet Arziman --- .gitignore | 48 + CONTRIBUTING.md | 161 + app.js | 1360 ++++ aps-helper.js | 50 + auth.js | 44 + config-development.json | 25 + config-production.json | 48 + date_util.js | 42 + etc/nginx_openhabcloud.conf | 64 + etc/openhabcloud.service | 17 + gcm-xmpp.js | 121 + gcmsender.js | 8 + jobs/checkopenhabsoffline.js | 64 + jobs/every5minstat.js | 55 + logger.js | 19 + mailchimp-export.js | 18 + mailchimp-myohversion.js | 28 + mailer.js | 56 + makeadmin.js | 38 + makeinvites.js | 33 + models/accesslog.js | 17 + models/emailverification.js | 59 + models/enrollment.js | 14 + models/event.js | 40 + models/invitation.js | 58 + models/item.js | 27 + models/lostpassword.js | 15 + models/myohstat.js | 18 + models/notification.js | 16 + models/oauth2client.js | 19 + models/oauth2code.js | 19 + models/oauth2scope.js | 14 + models/oauth2token.js | 17 + models/openhab.js | 42 + models/openhabaccesslog.js | 16 + models/openhabconfig.js | 13 + models/requestlog.js | 16 + models/user.js | 103 + models/useraccount.js | 16 + models/userdevice.js | 32 + models/userdevicelocationhistory.js | 17 + oauth2.js | 234 + package.json | 52 + public/bootstrap/css/bootstrap.css | 5502 ++++++++++++++++ public/bootstrap/css/bootstrap.min.css | 731 +++ .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes public/bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes public/bootstrap/js/bootstrap-carousel.js | 62 + public/bootstrap/js/bootstrap.js | 2287 +++++++ public/bootstrap/js/bootstrap.min.js | 7 + .../bootstrap/js/with carousel/bootstrap.js | 2036 ++++++ .../js/with carousel/bootstrap.min.js | 7 + public/css/black-white.css | 669 ++ public/css/blue.css | 642 ++ public/css/bootstrap-theme.min.css | 1 + public/css/bootstrap.min.css | 9 + public/css/codemirror.css | 246 + public/css/coffee.css | 639 ++ public/css/colors.css | 701 +++ public/css/dark-black-white.css | 708 +++ public/css/dark-blue.css | 718 +++ public/css/dark-coffee.css | 721 +++ public/css/dark-green.css | 723 +++ public/css/dark-light.css | 710 +++ public/css/dark-orange.css | 722 +++ public/css/dark-pink.css | 720 +++ public/css/dark-red.css | 721 +++ public/css/dark-sea-green.css | 719 +++ public/css/dark-yellow.css | 721 +++ public/css/green.css | 682 ++ public/css/icon-demo.css | 58 + public/css/layout.css | 2743 ++++++++ public/css/light.css | 630 ++ public/css/orange.css | 681 ++ public/css/pink.css | 641 ++ public/css/red.css | 643 ++ public/css/sea-green.css | 640 ++ public/css/social.css | 375 ++ public/css/style.css | 7 + public/css/style.less | 8 + public/css/yellow.css | 642 ++ ...rg.openhab.io.myopenhab-1.3.0-SNAPSHOT.jar | Bin 0 -> 2572498 bytes .../custom-icons/BCk-safari-pc/LICENSE.txt | 48 + .../custom-icons/BCk-safari-pc/README.txt | 75 + .../custom-icons/BCk-safari-pc/config.json | 3045 +++++++++ .../BCk-safari-pc/css/animation.css | 85 + .../BCk-safari-pc/css/custom-icons-codes.css | 230 + .../css/custom-icons-embedded.css | 263 + .../css/custom-icons-ie7-codes.css | 228 + .../BCk-safari-pc/css/custom-icons-ie7.css | 238 + .../BCk-safari-pc/css/custom-icons.css | 259 + .../custom-icons/BCk-safari-pc/demo.html | 1018 +++ .../BCk-safari-pc/font/custom-icons.eot | Bin 0 -> 77274 bytes .../BCk-safari-pc/font/custom-icons.svg | 788 +++ .../BCk-safari-pc/font/custom-icons.ttf | Bin 0 -> 77084 bytes .../BCk-safari-pc/font/custom-icons.woff | Bin 0 -> 42424 bytes public/font-icons/custom-icons/LICENSE.txt | 48 + public/font-icons/custom-icons/README.txt | 48 + public/font-icons/custom-icons/config.json | 1829 ++++++ .../custom-icons/css/custom-icons-codes.css | 231 + .../css/custom-icons-ie7-codes.css | 229 + .../custom-icons/css/custom-icons-ie7.css | 239 + .../custom-icons/css/custom-icons.css | 257 + public/font-icons/custom-icons/demo.html | 1018 +++ .../custom-icons/font/custom-icons.eot | Bin 0 -> 82672 bytes .../custom-icons/font/custom-icons.svg | 788 +++ .../custom-icons/font/custom-icons.ttf | Bin 0 -> 82404 bytes .../custom-icons/font/custom-icons.woff | Bin 0 -> 44996 bytes public/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20290 bytes public/fonts/glyphicons-halflings-regular.svg | 229 + public/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41236 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23292 bytes public/img/Sans-titre-2.png | Bin 0 -> 163 bytes public/img/apps/openhab-iphone.png | Bin 0 -> 263038 bytes public/img/apps/openhab-iphone.pxm | Bin 0 -> 793074 bytes public/img/big-logo.png | Bin 0 -> 5179 bytes public/img/demo/dash1.png | Bin 0 -> 45886 bytes public/img/demo/dash2.png | Bin 0 -> 29467 bytes public/img/demo/dash3.png | Bin 0 -> 18125 bytes public/img/designer-rules.png | Bin 0 -> 325039 bytes public/img/favicon.ico | Bin 0 -> 1150 bytes public/img/features.png | Bin 0 -> 326254 bytes public/img/icon-map.png | Bin 0 -> 902 bytes public/img/icons/ajax-loader.gif | Bin 0 -> 723 bytes public/img/icons/main-nav-hoverstate.png | Bin 0 -> 180 bytes public/img/icons/main-nav-normalstate.png | Bin 0 -> 185 bytes public/img/img-404.jpg | Bin 0 -> 3993 bytes public/img/img-fullwidth.jpg | Bin 0 -> 13034 bytes public/img/map-trigger.png | Bin 0 -> 10030 bytes public/img/oauth2/alexa.png | Bin 0 -> 13437 bytes public/img/oauth2/ifttt-icon.png | Bin 0 -> 772 bytes public/img/oauth2/instagram-icon.jpg | Bin 0 -> 2002 bytes public/img/oauth2/twitter-icon.png | Bin 0 -> 3715 bytes public/img/openhab-automation-rules.jpg | Bin 0 -> 43123 bytes public/img/openhab-graphs.jpg | Bin 0 -> 38971 bytes public/img/openhab-logo-small.png | Bin 0 -> 6993 bytes public/img/openhab-logo-square.png | Bin 0 -> 80621 bytes public/img/openhab-logo-top.png | Bin 0 -> 14390 bytes public/img/openhab-raspberry.jpg | Bin 0 -> 39800 bytes public/img/rs-arrows.png | Bin 0 -> 1194 bytes public/img/slider/rs/thumb.png | Bin 0 -> 166 bytes public/img/slides/accordionswitch.png | Bin 0 -> 1621 bytes public/img/slides/badge.png | Bin 0 -> 1127 bytes public/img/slides/bg-floor.jpg | Bin 0 -> 2644 bytes public/img/slides/bgtile.jpg | Bin 0 -> 4718 bytes public/img/slides/bullets_boxed.png | Bin 0 -> 950 bytes public/img/slides/bullets_round.png | Bin 0 -> 2379 bytes public/img/slides/bullets_square.png | Bin 0 -> 881 bytes public/img/slides/burger.png | Bin 0 -> 463 bytes public/img/slides/buynow.png | Bin 0 -> 13088 bytes public/img/slides/check.png | Bin 0 -> 1713 bytes public/img/slides/coke.png | Bin 0 -> 753 bytes public/img/slides/coloredbg.png | Bin 0 -> 184 bytes public/img/slides/company1.png | Bin 0 -> 831 bytes public/img/slides/company2.png | Bin 0 -> 831 bytes public/img/slides/company3.png | Bin 0 -> 831 bytes public/img/slides/dragnotch.png | Bin 0 -> 364 bytes public/img/slides/dragsliderbg.png | Bin 0 -> 479 bytes public/img/slides/dude1.png | Bin 0 -> 1468 bytes public/img/slides/dude2.png | Bin 0 -> 2125 bytes public/img/slides/floor.png | Bin 0 -> 2510 bytes public/img/slides/girl1.png | Bin 0 -> 1468 bytes public/img/slides/glare.png | Bin 0 -> 18177 bytes public/img/slides/glare2.png | Bin 0 -> 27322 bytes public/img/slides/image1.jpg | Bin 0 -> 18327 bytes public/img/slides/image16.jpg | Bin 0 -> 18327 bytes public/img/slides/image17.jpg | Bin 0 -> 18327 bytes public/img/slides/image18.jpg | Bin 0 -> 18327 bytes public/img/slides/image20.jpg | Bin 0 -> 18327 bytes public/img/slides/image21.jpg | Bin 0 -> 18327 bytes public/img/slides/image22.jpg | Bin 0 -> 18327 bytes public/img/slides/logo.png | Bin 0 -> 6070 bytes public/img/slides/mainBg.png | Bin 0 -> 2174 bytes public/img/slides/minishadow.png | Bin 0 -> 300 bytes public/img/slides/minishadow2.png | Bin 0 -> 406 bytes public/img/slides/minishadow3.png | Bin 0 -> 370 bytes public/img/slides/preview1.png | Bin 0 -> 1339 bytes public/img/slides/preview2.png | Bin 0 -> 1412 bytes public/img/slides/preview3.png | Bin 0 -> 1369 bytes public/img/slides/radio.png | Bin 0 -> 1018 bytes public/img/slides/selectpreview.png | Bin 0 -> 6095 bytes public/img/slides/shadow3_large.png | Bin 0 -> 4648 bytes public/img/slides/sliderconfigheadline.png | Bin 0 -> 6977 bytes public/img/slides/space.jpg | Bin 0 -> 18327 bytes public/img/slides/strawberries.png | Bin 0 -> 1780 bytes public/img/slides/thumb1.jpg | Bin 0 -> 3924 bytes public/img/slides/thumb2.jpg | Bin 0 -> 3922 bytes public/img/slides/thumb3.jpg | Bin 0 -> 352 bytes public/img/slides/thumb4.jpg | Bin 0 -> 355 bytes public/img/slides/transition_bg.png | Bin 0 -> 600 bytes public/img/slides/transition_boxes.png | Bin 0 -> 247 bytes public/img/slides/transition_curtainone.png | Bin 0 -> 219 bytes public/img/slides/transition_curtainthree.png | Bin 0 -> 215 bytes public/img/slides/transition_curtaintwo.png | Bin 0 -> 218 bytes public/img/slides/transition_fade.png | Bin 0 -> 186 bytes public/img/slides/transition_mixed.png | Bin 0 -> 586 bytes public/img/slides/transition_slidedown.png | Bin 0 -> 190 bytes public/img/slides/transition_slideleft.png | Bin 0 -> 189 bytes public/img/slides/transition_slideright.png | Bin 0 -> 191 bytes public/img/slides/transition_slideup.png | Bin 0 -> 188 bytes .../slides/transition_slotfadehorizontal.png | Bin 0 -> 248 bytes .../slides/transition_slotfadevertical.png | Bin 0 -> 256 bytes .../slides/transition_slotslidehorizontal.png | Bin 0 -> 746 bytes .../slides/transition_slotslidevertical.png | Bin 0 -> 716 bytes .../slides/transition_slotzoomhorizontal.png | Bin 0 -> 192 bytes .../slides/transition_slotzoomvertical.png | Bin 0 -> 192 bytes public/img/slides/transparent.png | Bin 0 -> 48513 bytes public/img/slides/wideimage.jpg | Bin 0 -> 14725 bytes public/img/slides/wideimage2.jpg | Bin 0 -> 14725 bytes public/img/subtle-noise.png | Bin 0 -> 164 bytes ...ttle-Neko-_0003_BOKEY-blue-green-light.jpg | Bin 0 -> 27528 bytes .../Little-Neko-_0008_BOKEY-blue5.jpg | Bin 0 -> 22377 bytes .../Little-Neko-_0017_BOKEY-orange8.jpg | Bin 0 -> 29925 bytes .../Little-Neko-_0026_BOKEY-light7- (2).jpg | Bin 0 -> 180205 bytes .../Little-Neko-_0026_BOKEY-light7.jpg | Bin 0 -> 124848 bytes .../img/textures/Little-Neko_0000_BLUR1.jpg | Bin 0 -> 19322 bytes .../img/textures/Little-Neko_0003_woody4.jpg | Bin 0 -> 61791 bytes .../img/textures/Little-Neko_0007_tree8.jpg | Bin 0 -> 21746 bytes public/img/textures/Little-Neko_pixel.jpg | Bin 0 -> 149008 bytes public/img/textures/bg-footer.png | Bin 0 -> 164 bytes public/img/textures/bg-texture-grey-dark.png | Bin 0 -> 34351 bytes public/img/textures/bg-texture-grey.png | Bin 0 -> 19768 bytes public/img/textures/bg-texture-light-grey.png | Bin 0 -> 113800 bytes public/img/textures/bg-texture-orange.png | Bin 0 -> 41943 bytes public/img/textures/bg-texture-video.png | Bin 0 -> 30854 bytes ...ttle-Neko-_0003_BOKEY-blue-green-light.jpg | Bin 0 -> 222083 bytes .../Little-Neko-_0008_BOKEY-blue5.jpg | Bin 0 -> 149629 bytes .../Little-Neko-_0017_BOKEY-orange8.jpg | Bin 0 -> 229857 bytes .../Little-Neko-_0026_BOKEY-light7.jpg | Bin 0 -> 113075 bytes .../full-size/Little-Neko_0000_BLUR1.jpg | Bin 0 -> 105077 bytes .../full-size/Little-Neko_0003_woody4.jpg | Bin 0 -> 404733 bytes .../full-size/Little-Neko_0007_tree8.jpg | Bin 0 -> 142792 bytes .../textures/full-size/Little-Neko_pixel.jpg | Bin 0 -> 149008 bytes .../img/textures/full-size/texture-pixel.png | Bin 0 -> 22413 bytes public/img/textures/texture-pixel.png | Bin 0 -> 10039 bytes .../assets/css/contact.css | 44 + .../assets/img/ajax-loader.gif | Bin 0 -> 847 bytes .../ajax-contact-extend/assets/img/error.gif | Bin 0 -> 355 bytes .../assets/img/success.gif | Bin 0 -> 560 bytes .../assets/img/verify/1.png | Bin 0 -> 4350 bytes .../assets/img/verify/2.png | Bin 0 -> 5309 bytes .../assets/img/verify/3.png | Bin 0 -> 5178 bytes .../assets/js/jquery.jigowatt.js | 34 + .../ajax-contact-extend/classes/contact.php | 204 + .../ajax-contact-extend/classes/image.php | 36 + .../ajax-contact-extend/classes/twitter.php | 38 + .../classes/twitter/EpiCurl.php | 128 + .../classes/twitter/EpiOAuth.php | 234 + .../classes/twitter/EpiTwitter.php | 49 + public/js-plugin/bootstrap-select/README.md | 53 + .../bootstrap-select/bootstrap-select.css | 50 + .../bootstrap-select/bootstrap-select.js | 280 + .../bootstrap-select/bootstrap-select.min.css | 1 + .../bootstrap-select/bootstrap-select.min.js | 1 + .../js-plugin/bootstrap-select/package.json | 25 + public/js-plugin/camera/camera.js | 2549 ++++++++ public/js-plugin/camera/camera.min.js | 4 + public/js-plugin/camera/css/camera.css | 1067 ++++ .../js-plugin/camera/images/_notes/dwsync.xml | 1 + public/js-plugin/camera/images/blank.gif | Bin 0 -> 1093 bytes .../js-plugin/camera/images/camera-loader.gif | Bin 0 -> 9289 bytes .../js-plugin/camera/images/camera_skins.png | Bin 0 -> 24198 bytes .../camera/images/patterns/_notes/dwsync.xml | 1 + .../camera/images/patterns/overlay1.png | Bin 0 -> 937 bytes .../camera/images/patterns/overlay10.png | Bin 0 -> 923 bytes .../camera/images/patterns/overlay2.png | Bin 0 -> 935 bytes .../camera/images/patterns/overlay3.png | Bin 0 -> 938 bytes .../camera/images/patterns/overlay4.png | Bin 0 -> 924 bytes .../camera/images/patterns/overlay5.png | Bin 0 -> 924 bytes .../camera/images/patterns/overlay6.png | Bin 0 -> 959 bytes .../camera/images/patterns/overlay7.png | Bin 0 -> 97 bytes .../camera/images/patterns/overlay8.png | Bin 0 -> 948 bytes .../camera/images/patterns/overlay9.png | Bin 0 -> 926 bytes .../camera/images/slides/_notes/dwsync.xml | 1 + .../camera/images/slides/big_bunny_fake.jpg | Bin 0 -> 121104 bytes .../js-plugin/camera/images/slides/bridge.jpg | Bin 0 -> 261677 bytes .../js-plugin/camera/images/slides/leaf.jpg | Bin 0 -> 178309 bytes .../js-plugin/camera/images/slides/road.jpg | Bin 0 -> 259821 bytes public/js-plugin/camera/images/slides/sea.jpg | Bin 0 -> 107620 bytes .../camera/images/slides/shelter.jpg | Bin 0 -> 357930 bytes .../images/slides/thumbs/_notes/dwsync.xml | 1 + .../images/slides/thumbs/big_bunny_fake.jpg | Bin 0 -> 5089 bytes .../camera/images/slides/thumbs/bridge.jpg | Bin 0 -> 4744 bytes .../camera/images/slides/thumbs/header_bg.png | Bin 0 -> 986 bytes .../camera/images/slides/thumbs/leaf.jpg | Bin 0 -> 5672 bytes .../camera/images/slides/thumbs/road.jpg | Bin 0 -> 3957 bytes .../camera/images/slides/thumbs/sea.jpg | Bin 0 -> 3151 bytes .../camera/images/slides/thumbs/shelter.jpg | Bin 0 -> 5141 bytes .../camera/images/slides/thumbs/tree.jpg | Bin 0 -> 5007 bytes .../js-plugin/camera/images/slides/tree.jpg | Bin 0 -> 298017 bytes public/js-plugin/easing/jquery.easing.1.3.js | 206 + public/js-plugin/flexslider/flexslider.css | 75 + .../flexslider/images/bg_direction_nav.png | Bin 0 -> 292 bytes .../flexslider/jquery.flexslider-min.js | 37 + .../js-plugin/flexslider/jquery.flexslider.js | 882 +++ .../themes/himalaya-flexslider-theme.css | 13 + .../flexslider/themes/slider-overlay.png | Bin 0 -> 129 bytes public/js-plugin/hoverdir/css/style.css | 85 + public/js-plugin/hoverdir/jquery.hoverdir.js | 179 + public/js-plugin/isotope/css/style.css | 179 + public/js-plugin/isotope/jquery.isotope.js | 1401 +++++ .../js-plugin/isotope/jquery.isotope.min.js | 11 + .../js-plugin/jquery-cookie/jquery.cookie.js | 72 + .../jquery-ui/jquery-ui-1.8.23.custom.min.js | 5 + .../js-plugin/jquery.sharrre-1.3.4/README.md | 60 + .../js-plugin/jquery.sharrre-1.3.4/index.html | 106 + .../jquery.sharrre-1.3.4.js | 587 ++ .../jquery.sharrre-1.3.4.min.js | 7 + .../jquery.sharrre-1.3.4/sharrre.php | 78 + .../pretty-photo/css/prettyPhoto.css | 170 + .../pretty-photo/images/fullscreen/1.jpg | Bin 0 -> 61924 bytes .../pretty-photo/images/fullscreen/2.jpg | Bin 0 -> 84412 bytes .../pretty-photo/images/fullscreen/3.jpg | Bin 0 -> 35532 bytes .../pretty-photo/images/fullscreen/4.jpg | Bin 0 -> 98304 bytes .../pretty-photo/images/fullscreen/5.jpg | Bin 0 -> 44257 bytes .../pretty-photo/images/fullscreen/6.jpg | Bin 0 -> 962237 bytes .../pretty-photo/images/fullscreen/high.gif | Bin 0 -> 4053 bytes .../pretty-photo/images/fullscreen/huge.gif | Bin 0 -> 7006 bytes .../pretty-photo/images/fullscreen/wide.gif | Bin 0 -> 4053 bytes .../prettyPhoto/dark_rounded/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/dark_rounded/btnPrevious.png | Bin 0 -> 1442 bytes .../dark_rounded/contentPattern.png | Bin 0 -> 130 bytes .../dark_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes .../prettyPhoto/dark_rounded/loader.gif | Bin 0 -> 2545 bytes .../prettyPhoto/dark_rounded/sprite.png | Bin 0 -> 4076 bytes .../prettyPhoto/dark_square/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/dark_square/btnPrevious.png | Bin 0 -> 1442 bytes .../dark_square/contentPattern.png | Bin 0 -> 121 bytes .../dark_square/default_thumbnail.gif | Bin 0 -> 227 bytes .../images/prettyPhoto/dark_square/loader.gif | Bin 0 -> 2545 bytes .../images/prettyPhoto/dark_square/sprite.png | Bin 0 -> 3507 bytes .../prettyPhoto/default/default_thumb.png | Bin 0 -> 1537 bytes .../images/prettyPhoto/default/loader.gif | Bin 0 -> 6331 bytes .../images/prettyPhoto/default/sprite.png | Bin 0 -> 6682 bytes .../prettyPhoto/default/sprite_next.png | Bin 0 -> 1358 bytes .../prettyPhoto/default/sprite_prev.png | Bin 0 -> 1376 bytes .../images/prettyPhoto/default/sprite_x.png | Bin 0 -> 1097 bytes .../images/prettyPhoto/default/sprite_y.png | Bin 0 -> 1162 bytes .../images/prettyPhoto/facebook/btnNext.png | Bin 0 -> 845 bytes .../prettyPhoto/facebook/btnPrevious.png | Bin 0 -> 828 bytes .../facebook/contentPatternBottom.png | Bin 0 -> 142 bytes .../facebook/contentPatternLeft.png | Bin 0 -> 137 bytes .../facebook/contentPatternRight.png | Bin 0 -> 136 bytes .../facebook/contentPatternTop.png | Bin 0 -> 142 bytes .../facebook/default_thumbnail.gif | Bin 0 -> 227 bytes .../images/prettyPhoto/facebook/loader.gif | Bin 0 -> 2545 bytes .../images/prettyPhoto/facebook/sprite.png | Bin 0 -> 4227 bytes .../prettyPhoto/light_rounded/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/light_rounded/btnPrevious.png | Bin 0 -> 1442 bytes .../light_rounded/default_thumbnail.gif | Bin 0 -> 227 bytes .../prettyPhoto/light_rounded/loader.gif | Bin 0 -> 2545 bytes .../prettyPhoto/light_rounded/sprite.png | Bin 0 -> 4099 bytes .../prettyPhoto/light_square/btnNext.png | Bin 0 -> 1411 bytes .../prettyPhoto/light_square/btnPrevious.png | Bin 0 -> 1442 bytes .../light_square/default_thumbnail.gif | Bin 0 -> 227 bytes .../prettyPhoto/light_square/loader.gif | Bin 0 -> 2545 bytes .../prettyPhoto/light_square/sprite.png | Bin 0 -> 3507 bytes .../images/thumbnails/flash-logo.png | Bin 0 -> 6410 bytes .../images/thumbnails/quicktime-logo.gif | Bin 0 -> 8769 bytes .../pretty-photo/images/thumbnails/t_1.jpg | Bin 0 -> 3002 bytes .../pretty-photo/images/thumbnails/t_2.jpg | Bin 0 -> 2379 bytes .../pretty-photo/images/thumbnails/t_3.jpg | Bin 0 -> 1937 bytes .../pretty-photo/images/thumbnails/t_4.jpg | Bin 0 -> 3341 bytes .../pretty-photo/images/thumbnails/t_5.jpg | Bin 0 -> 2534 bytes .../pretty-photo/js/jquery.prettyPhoto.js | 83 + public/js-plugin/respond/respond.min.js | 6 + public/js-plugin/respond/respond.src.js | 326 + .../rs-plugin/assets/arrow_large_left.png | Bin 0 -> 2686 bytes .../rs-plugin/assets/arrow_large_right.png | Bin 0 -> 2674 bytes .../js-plugin/rs-plugin/assets/arrow_left.png | Bin 0 -> 807 bytes .../rs-plugin/assets/arrow_left2.png | Bin 0 -> 348 bytes .../rs-plugin/assets/arrow_right.png | Bin 0 -> 820 bytes .../rs-plugin/assets/arrow_right2.png | Bin 0 -> 343 bytes .../js-plugin/rs-plugin/assets/arrowleft.png | Bin 0 -> 43543 bytes .../js-plugin/rs-plugin/assets/arrowright.png | Bin 0 -> 43719 bytes public/js-plugin/rs-plugin/assets/arrows.psd | Bin 0 -> 49804 bytes public/js-plugin/rs-plugin/assets/black50.png | Bin 0 -> 259 bytes .../rs-plugin/assets/boxed_bgtile.png | Bin 0 -> 2746 bytes public/js-plugin/rs-plugin/assets/bullet.png | Bin 0 -> 2254 bytes .../rs-plugin/assets/bullet_boxed.png | Bin 0 -> 924 bytes public/js-plugin/rs-plugin/assets/bullets.png | Bin 0 -> 1153 bytes public/js-plugin/rs-plugin/assets/bullets.psd | Bin 0 -> 35372 bytes .../js-plugin/rs-plugin/assets/bullets2.png | Bin 0 -> 278 bytes .../js-plugin/rs-plugin/assets/coloredbg.png | Bin 0 -> 184 bytes public/js-plugin/rs-plugin/assets/grain.png | Bin 0 -> 16323 bytes .../js-plugin/rs-plugin/assets/large_left.png | Bin 0 -> 1517 bytes .../rs-plugin/assets/large_right.png | Bin 0 -> 1561 bytes public/js-plugin/rs-plugin/assets/loader.gif | Bin 0 -> 723 bytes public/js-plugin/rs-plugin/assets/loader2.gif | Bin 0 -> 3208 bytes .../js-plugin/rs-plugin/assets/navigdots.png | Bin 0 -> 743 bytes .../rs-plugin/assets/navigdots_bgtile.png | Bin 0 -> 149 bytes public/js-plugin/rs-plugin/assets/shadow1.png | Bin 0 -> 4289 bytes public/js-plugin/rs-plugin/assets/shadow2.png | Bin 0 -> 5661 bytes public/js-plugin/rs-plugin/assets/shadow3.png | Bin 0 -> 6428 bytes .../rs-plugin/assets/small_arrows.psd | Bin 0 -> 44620 bytes .../js-plugin/rs-plugin/assets/small_left.png | Bin 0 -> 670 bytes .../rs-plugin/assets/small_left_boxed.png | Bin 0 -> 846 bytes .../rs-plugin/assets/small_right.png | Bin 0 -> 668 bytes .../rs-plugin/assets/small_right_boxed.png | Bin 0 -> 807 bytes public/js-plugin/rs-plugin/assets/timer.png | Bin 0 -> 125 bytes .../js-plugin/rs-plugin/assets/timerdot.png | Bin 0 -> 122 bytes public/js-plugin/rs-plugin/assets/white50.png | Bin 0 -> 260 bytes .../js-plugin/rs-plugin/css/settings-bck.css | 472 ++ public/js-plugin/rs-plugin/css/settings.css | 635 ++ .../rs-plugin/images/decor_inside.png | Bin 0 -> 2734 bytes .../rs-plugin/images/decor_inside_white.png | Bin 0 -> 2749 bytes .../rs-plugin/images/decor_testimonial.png | Bin 0 -> 2749 bytes .../rs-plugin/images/gradient/g30.png | Bin 0 -> 42935 bytes .../rs-plugin/images/gradient/g40.png | Bin 0 -> 42464 bytes .../js/jquery.themepunch.plugins.min.js | 78 + .../js/jquery.themepunch.revolution.js | 4368 +++++++++++++ .../js/jquery.themepunch.revolution.min.js | 1 + public/js-plugin/sequence/css/sequence.css | 325 + .../js-plugin/sequence/images/bg-sequence.jpg | Bin 0 -> 8788 bytes public/js-plugin/sequence/images/bt-next.png | Bin 0 -> 743 bytes public/js-plugin/sequence/images/bt-prev.png | Bin 0 -> 760 bytes public/js-plugin/sequence/images/model1.png | Bin 0 -> 116536 bytes public/js-plugin/sequence/images/model2.png | Bin 0 -> 128037 bytes public/js-plugin/sequence/images/model3.png | Bin 0 -> 89463 bytes .../js-plugin/sequence/images/pause-icon.png | Bin 0 -> 389 bytes .../sequence/images/sequence-logo.png | Bin 0 -> 2656 bytes .../js-plugin/sequence/images/tn-model1.png | Bin 0 -> 8907 bytes .../js-plugin/sequence/images/tn-model2.png | Bin 0 -> 9953 bytes .../js-plugin/sequence/images/tn-model3.png | Bin 0 -> 7913 bytes .../sequence/js/sequence.jquery-min.js | 26 + .../js-plugin/sequence/js/sequence.jquery.js | 1236 ++++ public/js/Chart.min.js | 11 + public/js/bootstrap.min.js | 6 + public/js/codemirror.js | 5524 +++++++++++++++++ public/js/custom.js | 1146 ++++ public/js/javascript.js | 437 ++ public/js/jquery.js | 5 + public/js/modernizr-2.6.1.min.js | 4 + public/js/styleswitcher.js | 64 + public/stylesheets/style.less | 8 + redis-helper.js | 26 + routes/account.js | 411 ++ routes/api.js | 25 + routes/applications.js | 43 + routes/configsystem.js | 29 + routes/devices.js | 109 + routes/events.js | 50 + routes/ifttt.js | 347 ++ routes/index.js | 43 + routes/invitations.js | 34 + routes/items.js | 32 + routes/notifications.js | 29 + routes/staff.js | 163 + routes/user.js | 8 + routes/users.js | 114 + sendmail.js | 106 + templates/activation-email/html.ejs | 22 + templates/enroll-email/html.ejs | 22 + templates/invitation-email/html.ejs | 65 + templates/invitation-inactive/html.ejs | 19 + templates/lostpassword-email/html.ejs | 30 + templates/new-version/html.ejs | 46 + templates/openhaboffline/html.ejs | 20 + test/openhabconsole.js | 67 + test/openhabimitator.js | 63 + testclient/testclient.js | 113 + views/account.ejs | 70 + views/accountdelete.ejs | 32 + views/alerts.ejs | 20 + views/applications.ejs | 66 + views/configsystem.ejs | 42 + views/devices.ejs | 82 + views/docs/documentation.ejs | 95 + views/docs/ifttt.ejs | 56 + views/docs/notifications.ejs | 108 + views/docs/persistence.ejs | 61 + views/enroll.ejs | 63 + views/events.ejs | 63 + views/footer.ejs | 89 + views/header.ejs | 218 + views/index.ejs | 67 + views/invitations.ejs | 31 + views/items.ejs | 48 + views/itemsdelete.ejs | 31 + views/login.ejs | 67 + views/lostpassword.ejs | 40 + views/lostpasswordreset.ejs | 43 + views/notifications.ejs | 62 + views/oauth2dialog.ejs | 47 + views/staff/invitations.ejs | 81 + views/staff/oauthclients.ejs | 66 + views/staff/staff.ejs | 73 + views/staff/stats.ejs | 62 + views/users.ejs | 80 + 489 files changed, 70452 insertions(+) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 app.js create mode 100644 aps-helper.js create mode 100644 auth.js create mode 100644 config-development.json create mode 100644 config-production.json create mode 100644 date_util.js create mode 100644 etc/nginx_openhabcloud.conf create mode 100644 etc/openhabcloud.service create mode 100644 gcm-xmpp.js create mode 100644 gcmsender.js create mode 100644 jobs/checkopenhabsoffline.js create mode 100644 jobs/every5minstat.js create mode 100644 logger.js create mode 100644 mailchimp-export.js create mode 100644 mailchimp-myohversion.js create mode 100644 mailer.js create mode 100644 makeadmin.js create mode 100644 makeinvites.js create mode 100644 models/accesslog.js create mode 100644 models/emailverification.js create mode 100644 models/enrollment.js create mode 100644 models/event.js create mode 100644 models/invitation.js create mode 100644 models/item.js create mode 100644 models/lostpassword.js create mode 100644 models/myohstat.js create mode 100644 models/notification.js create mode 100644 models/oauth2client.js create mode 100644 models/oauth2code.js create mode 100644 models/oauth2scope.js create mode 100644 models/oauth2token.js create mode 100644 models/openhab.js create mode 100644 models/openhabaccesslog.js create mode 100644 models/openhabconfig.js create mode 100644 models/requestlog.js create mode 100644 models/user.js create mode 100644 models/useraccount.js create mode 100644 models/userdevice.js create mode 100644 models/userdevicelocationhistory.js create mode 100644 oauth2.js create mode 100644 package.json create mode 100755 public/bootstrap/css/bootstrap.css create mode 100755 public/bootstrap/css/bootstrap.min.css create mode 100755 public/bootstrap/img/glyphicons-halflings-white.png create mode 100755 public/bootstrap/img/glyphicons-halflings.png create mode 100755 public/bootstrap/js/bootstrap-carousel.js create mode 100755 public/bootstrap/js/bootstrap.js create mode 100755 public/bootstrap/js/bootstrap.min.js create mode 100755 public/bootstrap/js/with carousel/bootstrap.js create mode 100755 public/bootstrap/js/with carousel/bootstrap.min.js create mode 100755 public/css/black-white.css create mode 100755 public/css/blue.css create mode 100644 public/css/bootstrap-theme.min.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/css/codemirror.css create mode 100755 public/css/coffee.css create mode 100755 public/css/colors.css create mode 100755 public/css/dark-black-white.css create mode 100755 public/css/dark-blue.css create mode 100755 public/css/dark-coffee.css create mode 100755 public/css/dark-green.css create mode 100755 public/css/dark-light.css create mode 100755 public/css/dark-orange.css create mode 100755 public/css/dark-pink.css create mode 100755 public/css/dark-red.css create mode 100755 public/css/dark-sea-green.css create mode 100755 public/css/dark-yellow.css create mode 100755 public/css/green.css create mode 100755 public/css/icon-demo.css create mode 100755 public/css/layout.css create mode 100755 public/css/light.css create mode 100755 public/css/orange.css create mode 100755 public/css/pink.css create mode 100755 public/css/red.css create mode 100755 public/css/sea-green.css create mode 100644 public/css/social.css create mode 100644 public/css/style.css create mode 100644 public/css/style.less create mode 100755 public/css/yellow.css create mode 100644 public/downloads/org.openhab.io.myopenhab-1.3.0-SNAPSHOT.jar create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/LICENSE.txt create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/README.txt create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/config.json create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/animation.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/custom-icons-codes.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/custom-icons-embedded.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/custom-icons-ie7-codes.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/custom-icons-ie7.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/css/custom-icons.css create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/demo.html create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.eot create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.svg create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.ttf create mode 100755 public/font-icons/custom-icons/BCk-safari-pc/font/custom-icons.woff create mode 100755 public/font-icons/custom-icons/LICENSE.txt create mode 100755 public/font-icons/custom-icons/README.txt create mode 100755 public/font-icons/custom-icons/config.json create mode 100755 public/font-icons/custom-icons/css/custom-icons-codes.css create mode 100755 public/font-icons/custom-icons/css/custom-icons-ie7-codes.css create mode 100755 public/font-icons/custom-icons/css/custom-icons-ie7.css create mode 100755 public/font-icons/custom-icons/css/custom-icons.css create mode 100755 public/font-icons/custom-icons/demo.html create mode 100755 public/font-icons/custom-icons/font/custom-icons.eot create mode 100755 public/font-icons/custom-icons/font/custom-icons.svg create mode 100755 public/font-icons/custom-icons/font/custom-icons.ttf create mode 100755 public/font-icons/custom-icons/font/custom-icons.woff create mode 100644 public/fonts/glyphicons-halflings-regular.eot create mode 100644 public/fonts/glyphicons-halflings-regular.svg create mode 100644 public/fonts/glyphicons-halflings-regular.ttf create mode 100644 public/fonts/glyphicons-halflings-regular.woff create mode 100755 public/img/Sans-titre-2.png create mode 100644 public/img/apps/openhab-iphone.png create mode 100644 public/img/apps/openhab-iphone.pxm create mode 100755 public/img/big-logo.png create mode 100644 public/img/demo/dash1.png create mode 100644 public/img/demo/dash2.png create mode 100644 public/img/demo/dash3.png create mode 100644 public/img/designer-rules.png create mode 100644 public/img/favicon.ico create mode 100644 public/img/features.png create mode 100755 public/img/icon-map.png create mode 100755 public/img/icons/ajax-loader.gif create mode 100755 public/img/icons/main-nav-hoverstate.png create mode 100755 public/img/icons/main-nav-normalstate.png create mode 100755 public/img/img-404.jpg create mode 100755 public/img/img-fullwidth.jpg create mode 100755 public/img/map-trigger.png create mode 100644 public/img/oauth2/alexa.png create mode 100644 public/img/oauth2/ifttt-icon.png create mode 100644 public/img/oauth2/instagram-icon.jpg create mode 100644 public/img/oauth2/twitter-icon.png create mode 100644 public/img/openhab-automation-rules.jpg create mode 100644 public/img/openhab-graphs.jpg create mode 100644 public/img/openhab-logo-small.png create mode 100644 public/img/openhab-logo-square.png create mode 100644 public/img/openhab-logo-top.png create mode 100644 public/img/openhab-raspberry.jpg create mode 100755 public/img/rs-arrows.png create mode 100755 public/img/slider/rs/thumb.png create mode 100755 public/img/slides/accordionswitch.png create mode 100755 public/img/slides/badge.png create mode 100755 public/img/slides/bg-floor.jpg create mode 100755 public/img/slides/bgtile.jpg create mode 100755 public/img/slides/bullets_boxed.png create mode 100755 public/img/slides/bullets_round.png create mode 100755 public/img/slides/bullets_square.png create mode 100755 public/img/slides/burger.png create mode 100755 public/img/slides/buynow.png create mode 100755 public/img/slides/check.png create mode 100755 public/img/slides/coke.png create mode 100755 public/img/slides/coloredbg.png create mode 100755 public/img/slides/company1.png create mode 100755 public/img/slides/company2.png create mode 100755 public/img/slides/company3.png create mode 100755 public/img/slides/dragnotch.png create mode 100755 public/img/slides/dragsliderbg.png create mode 100755 public/img/slides/dude1.png create mode 100755 public/img/slides/dude2.png create mode 100755 public/img/slides/floor.png create mode 100755 public/img/slides/girl1.png create mode 100755 public/img/slides/glare.png create mode 100755 public/img/slides/glare2.png create mode 100755 public/img/slides/image1.jpg create mode 100755 public/img/slides/image16.jpg create mode 100755 public/img/slides/image17.jpg create mode 100755 public/img/slides/image18.jpg create mode 100755 public/img/slides/image20.jpg create mode 100755 public/img/slides/image21.jpg create mode 100755 public/img/slides/image22.jpg create mode 100755 public/img/slides/logo.png create mode 100755 public/img/slides/mainBg.png create mode 100755 public/img/slides/minishadow.png create mode 100755 public/img/slides/minishadow2.png create mode 100755 public/img/slides/minishadow3.png create mode 100755 public/img/slides/preview1.png create mode 100755 public/img/slides/preview2.png create mode 100755 public/img/slides/preview3.png create mode 100755 public/img/slides/radio.png create mode 100755 public/img/slides/selectpreview.png create mode 100755 public/img/slides/shadow3_large.png create mode 100755 public/img/slides/sliderconfigheadline.png create mode 100755 public/img/slides/space.jpg create mode 100755 public/img/slides/strawberries.png create mode 100755 public/img/slides/thumb1.jpg create mode 100755 public/img/slides/thumb2.jpg create mode 100755 public/img/slides/thumb3.jpg create mode 100755 public/img/slides/thumb4.jpg create mode 100755 public/img/slides/transition_bg.png create mode 100755 public/img/slides/transition_boxes.png create mode 100755 public/img/slides/transition_curtainone.png create mode 100755 public/img/slides/transition_curtainthree.png create mode 100755 public/img/slides/transition_curtaintwo.png create mode 100755 public/img/slides/transition_fade.png create mode 100755 public/img/slides/transition_mixed.png create mode 100755 public/img/slides/transition_slidedown.png create mode 100755 public/img/slides/transition_slideleft.png create mode 100755 public/img/slides/transition_slideright.png create mode 100755 public/img/slides/transition_slideup.png create mode 100755 public/img/slides/transition_slotfadehorizontal.png create mode 100755 public/img/slides/transition_slotfadevertical.png create mode 100755 public/img/slides/transition_slotslidehorizontal.png create mode 100755 public/img/slides/transition_slotslidevertical.png create mode 100755 public/img/slides/transition_slotzoomhorizontal.png create mode 100755 public/img/slides/transition_slotzoomvertical.png create mode 100755 public/img/slides/transparent.png create mode 100755 public/img/slides/wideimage.jpg create mode 100755 public/img/slides/wideimage2.jpg create mode 100755 public/img/subtle-noise.png create mode 100755 public/img/textures/Little-Neko-_0003_BOKEY-blue-green-light.jpg create mode 100755 public/img/textures/Little-Neko-_0008_BOKEY-blue5.jpg create mode 100755 public/img/textures/Little-Neko-_0017_BOKEY-orange8.jpg create mode 100755 public/img/textures/Little-Neko-_0026_BOKEY-light7- (2).jpg create mode 100755 public/img/textures/Little-Neko-_0026_BOKEY-light7.jpg create mode 100755 public/img/textures/Little-Neko_0000_BLUR1.jpg create mode 100755 public/img/textures/Little-Neko_0003_woody4.jpg create mode 100755 public/img/textures/Little-Neko_0007_tree8.jpg create mode 100755 public/img/textures/Little-Neko_pixel.jpg create mode 100755 public/img/textures/bg-footer.png create mode 100755 public/img/textures/bg-texture-grey-dark.png create mode 100755 public/img/textures/bg-texture-grey.png create mode 100755 public/img/textures/bg-texture-light-grey.png create mode 100755 public/img/textures/bg-texture-orange.png create mode 100755 public/img/textures/bg-texture-video.png create mode 100755 public/img/textures/full-size/Little-Neko-_0003_BOKEY-blue-green-light.jpg create mode 100755 public/img/textures/full-size/Little-Neko-_0008_BOKEY-blue5.jpg create mode 100755 public/img/textures/full-size/Little-Neko-_0017_BOKEY-orange8.jpg create mode 100755 public/img/textures/full-size/Little-Neko-_0026_BOKEY-light7.jpg create mode 100755 public/img/textures/full-size/Little-Neko_0000_BLUR1.jpg create mode 100755 public/img/textures/full-size/Little-Neko_0003_woody4.jpg create mode 100755 public/img/textures/full-size/Little-Neko_0007_tree8.jpg create mode 100755 public/img/textures/full-size/Little-Neko_pixel.jpg create mode 100755 public/img/textures/full-size/texture-pixel.png create mode 100755 public/img/textures/texture-pixel.png create mode 100644 public/js-plugin/ajax-contact-extend/assets/css/contact.css create mode 100644 public/js-plugin/ajax-contact-extend/assets/img/ajax-loader.gif create mode 100755 public/js-plugin/ajax-contact-extend/assets/img/error.gif create mode 100755 public/js-plugin/ajax-contact-extend/assets/img/success.gif create mode 100755 public/js-plugin/ajax-contact-extend/assets/img/verify/1.png create mode 100755 public/js-plugin/ajax-contact-extend/assets/img/verify/2.png create mode 100755 public/js-plugin/ajax-contact-extend/assets/img/verify/3.png create mode 100755 public/js-plugin/ajax-contact-extend/assets/js/jquery.jigowatt.js create mode 100755 public/js-plugin/ajax-contact-extend/classes/contact.php create mode 100755 public/js-plugin/ajax-contact-extend/classes/image.php create mode 100755 public/js-plugin/ajax-contact-extend/classes/twitter.php create mode 100755 public/js-plugin/ajax-contact-extend/classes/twitter/EpiCurl.php create mode 100755 public/js-plugin/ajax-contact-extend/classes/twitter/EpiOAuth.php create mode 100644 public/js-plugin/ajax-contact-extend/classes/twitter/EpiTwitter.php create mode 100644 public/js-plugin/bootstrap-select/README.md create mode 100644 public/js-plugin/bootstrap-select/bootstrap-select.css create mode 100644 public/js-plugin/bootstrap-select/bootstrap-select.js create mode 100755 public/js-plugin/bootstrap-select/bootstrap-select.min.css create mode 100644 public/js-plugin/bootstrap-select/bootstrap-select.min.js create mode 100644 public/js-plugin/bootstrap-select/package.json create mode 100755 public/js-plugin/camera/camera.js create mode 100755 public/js-plugin/camera/camera.min.js create mode 100755 public/js-plugin/camera/css/camera.css create mode 100755 public/js-plugin/camera/images/_notes/dwsync.xml create mode 100755 public/js-plugin/camera/images/blank.gif create mode 100644 public/js-plugin/camera/images/camera-loader.gif create mode 100644 public/js-plugin/camera/images/camera_skins.png create mode 100644 public/js-plugin/camera/images/patterns/_notes/dwsync.xml create mode 100755 public/js-plugin/camera/images/patterns/overlay1.png create mode 100755 public/js-plugin/camera/images/patterns/overlay10.png create mode 100755 public/js-plugin/camera/images/patterns/overlay2.png create mode 100755 public/js-plugin/camera/images/patterns/overlay3.png create mode 100755 public/js-plugin/camera/images/patterns/overlay4.png create mode 100755 public/js-plugin/camera/images/patterns/overlay5.png create mode 100755 public/js-plugin/camera/images/patterns/overlay6.png create mode 100755 public/js-plugin/camera/images/patterns/overlay7.png create mode 100755 public/js-plugin/camera/images/patterns/overlay8.png create mode 100755 public/js-plugin/camera/images/patterns/overlay9.png create mode 100755 public/js-plugin/camera/images/slides/_notes/dwsync.xml create mode 100755 public/js-plugin/camera/images/slides/big_bunny_fake.jpg create mode 100755 public/js-plugin/camera/images/slides/bridge.jpg create mode 100644 public/js-plugin/camera/images/slides/leaf.jpg create mode 100755 public/js-plugin/camera/images/slides/road.jpg create mode 100755 public/js-plugin/camera/images/slides/sea.jpg create mode 100644 public/js-plugin/camera/images/slides/shelter.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/_notes/dwsync.xml create mode 100755 public/js-plugin/camera/images/slides/thumbs/big_bunny_fake.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/bridge.jpg create mode 100644 public/js-plugin/camera/images/slides/thumbs/header_bg.png create mode 100755 public/js-plugin/camera/images/slides/thumbs/leaf.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/road.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/sea.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/shelter.jpg create mode 100755 public/js-plugin/camera/images/slides/thumbs/tree.jpg create mode 100755 public/js-plugin/camera/images/slides/tree.jpg create mode 100755 public/js-plugin/easing/jquery.easing.1.3.js create mode 100755 public/js-plugin/flexslider/flexslider.css create mode 100644 public/js-plugin/flexslider/images/bg_direction_nav.png create mode 100755 public/js-plugin/flexslider/jquery.flexslider-min.js create mode 100755 public/js-plugin/flexslider/jquery.flexslider.js create mode 100644 public/js-plugin/flexslider/themes/himalaya-flexslider-theme.css create mode 100644 public/js-plugin/flexslider/themes/slider-overlay.png create mode 100755 public/js-plugin/hoverdir/css/style.css create mode 100755 public/js-plugin/hoverdir/jquery.hoverdir.js create mode 100755 public/js-plugin/isotope/css/style.css create mode 100755 public/js-plugin/isotope/jquery.isotope.js create mode 100755 public/js-plugin/isotope/jquery.isotope.min.js create mode 100755 public/js-plugin/jquery-cookie/jquery.cookie.js create mode 100755 public/js-plugin/jquery-ui/jquery-ui-1.8.23.custom.min.js create mode 100755 public/js-plugin/jquery.sharrre-1.3.4/README.md create mode 100644 public/js-plugin/jquery.sharrre-1.3.4/index.html create mode 100644 public/js-plugin/jquery.sharrre-1.3.4/jquery.sharrre-1.3.4.js create mode 100755 public/js-plugin/jquery.sharrre-1.3.4/jquery.sharrre-1.3.4.min.js create mode 100755 public/js-plugin/jquery.sharrre-1.3.4/sharrre.php create mode 100644 public/js-plugin/pretty-photo/css/prettyPhoto.css create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/1.jpg create mode 100644 public/js-plugin/pretty-photo/images/fullscreen/2.jpg create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/3.jpg create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/4.jpg create mode 100644 public/js-plugin/pretty-photo/images/fullscreen/5.jpg create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/6.jpg create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/high.gif create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/huge.gif create mode 100755 public/js-plugin/pretty-photo/images/fullscreen/wide.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnNext.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/btnPrevious.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/contentPattern.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/default_thumbnail.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_rounded/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnNext.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/btnPrevious.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/contentPattern.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/default_thumbnail.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/dark_square/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/default_thumb.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_next.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_prev.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_x.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/default/sprite_y.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnNext.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/btnPrevious.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternBottom.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternLeft.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternRight.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/contentPatternTop.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/default_thumbnail.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/facebook/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnNext.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/btnPrevious.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/default_thumbnail.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_rounded/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnNext.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_square/btnPrevious.png create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_square/default_thumbnail.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_square/loader.gif create mode 100755 public/js-plugin/pretty-photo/images/prettyPhoto/light_square/sprite.png create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/flash-logo.png create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/quicktime-logo.gif create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/t_1.jpg create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/t_2.jpg create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/t_3.jpg create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/t_4.jpg create mode 100755 public/js-plugin/pretty-photo/images/thumbnails/t_5.jpg create mode 100755 public/js-plugin/pretty-photo/js/jquery.prettyPhoto.js create mode 100755 public/js-plugin/respond/respond.min.js create mode 100755 public/js-plugin/respond/respond.src.js create mode 100644 public/js-plugin/rs-plugin/assets/arrow_large_left.png create mode 100644 public/js-plugin/rs-plugin/assets/arrow_large_right.png create mode 100644 public/js-plugin/rs-plugin/assets/arrow_left.png create mode 100644 public/js-plugin/rs-plugin/assets/arrow_left2.png create mode 100644 public/js-plugin/rs-plugin/assets/arrow_right.png create mode 100755 public/js-plugin/rs-plugin/assets/arrow_right2.png create mode 100755 public/js-plugin/rs-plugin/assets/arrowleft.png create mode 100644 public/js-plugin/rs-plugin/assets/arrowright.png create mode 100755 public/js-plugin/rs-plugin/assets/arrows.psd create mode 100755 public/js-plugin/rs-plugin/assets/black50.png create mode 100644 public/js-plugin/rs-plugin/assets/boxed_bgtile.png create mode 100644 public/js-plugin/rs-plugin/assets/bullet.png create mode 100755 public/js-plugin/rs-plugin/assets/bullet_boxed.png create mode 100755 public/js-plugin/rs-plugin/assets/bullets.png create mode 100755 public/js-plugin/rs-plugin/assets/bullets.psd create mode 100755 public/js-plugin/rs-plugin/assets/bullets2.png create mode 100755 public/js-plugin/rs-plugin/assets/coloredbg.png create mode 100755 public/js-plugin/rs-plugin/assets/grain.png create mode 100755 public/js-plugin/rs-plugin/assets/large_left.png create mode 100755 public/js-plugin/rs-plugin/assets/large_right.png create mode 100755 public/js-plugin/rs-plugin/assets/loader.gif create mode 100755 public/js-plugin/rs-plugin/assets/loader2.gif create mode 100755 public/js-plugin/rs-plugin/assets/navigdots.png create mode 100755 public/js-plugin/rs-plugin/assets/navigdots_bgtile.png create mode 100755 public/js-plugin/rs-plugin/assets/shadow1.png create mode 100755 public/js-plugin/rs-plugin/assets/shadow2.png create mode 100755 public/js-plugin/rs-plugin/assets/shadow3.png create mode 100755 public/js-plugin/rs-plugin/assets/small_arrows.psd create mode 100755 public/js-plugin/rs-plugin/assets/small_left.png create mode 100755 public/js-plugin/rs-plugin/assets/small_left_boxed.png create mode 100755 public/js-plugin/rs-plugin/assets/small_right.png create mode 100755 public/js-plugin/rs-plugin/assets/small_right_boxed.png create mode 100755 public/js-plugin/rs-plugin/assets/timer.png create mode 100755 public/js-plugin/rs-plugin/assets/timerdot.png create mode 100644 public/js-plugin/rs-plugin/assets/white50.png create mode 100755 public/js-plugin/rs-plugin/css/settings-bck.css create mode 100755 public/js-plugin/rs-plugin/css/settings.css create mode 100644 public/js-plugin/rs-plugin/images/decor_inside.png create mode 100644 public/js-plugin/rs-plugin/images/decor_inside_white.png create mode 100644 public/js-plugin/rs-plugin/images/decor_testimonial.png create mode 100755 public/js-plugin/rs-plugin/images/gradient/g30.png create mode 100755 public/js-plugin/rs-plugin/images/gradient/g40.png create mode 100755 public/js-plugin/rs-plugin/js/jquery.themepunch.plugins.min.js create mode 100644 public/js-plugin/rs-plugin/js/jquery.themepunch.revolution.js create mode 100644 public/js-plugin/rs-plugin/js/jquery.themepunch.revolution.min.js create mode 100755 public/js-plugin/sequence/css/sequence.css create mode 100755 public/js-plugin/sequence/images/bg-sequence.jpg create mode 100644 public/js-plugin/sequence/images/bt-next.png create mode 100644 public/js-plugin/sequence/images/bt-prev.png create mode 100755 public/js-plugin/sequence/images/model1.png create mode 100755 public/js-plugin/sequence/images/model2.png create mode 100755 public/js-plugin/sequence/images/model3.png create mode 100755 public/js-plugin/sequence/images/pause-icon.png create mode 100755 public/js-plugin/sequence/images/sequence-logo.png create mode 100644 public/js-plugin/sequence/images/tn-model1.png create mode 100755 public/js-plugin/sequence/images/tn-model2.png create mode 100755 public/js-plugin/sequence/images/tn-model3.png create mode 100644 public/js-plugin/sequence/js/sequence.jquery-min.js create mode 100755 public/js-plugin/sequence/js/sequence.jquery.js create mode 100644 public/js/Chart.min.js create mode 100644 public/js/bootstrap.min.js create mode 100644 public/js/codemirror.js create mode 100755 public/js/custom.js create mode 100644 public/js/javascript.js create mode 100644 public/js/jquery.js create mode 100755 public/js/modernizr-2.6.1.min.js create mode 100755 public/js/styleswitcher.js create mode 100644 public/stylesheets/style.less create mode 100644 redis-helper.js create mode 100644 routes/account.js create mode 100644 routes/api.js create mode 100644 routes/applications.js create mode 100644 routes/configsystem.js create mode 100644 routes/devices.js create mode 100644 routes/events.js create mode 100644 routes/ifttt.js create mode 100644 routes/index.js create mode 100644 routes/invitations.js create mode 100644 routes/items.js create mode 100644 routes/notifications.js create mode 100644 routes/staff.js create mode 100644 routes/user.js create mode 100644 routes/users.js create mode 100644 sendmail.js create mode 100644 templates/activation-email/html.ejs create mode 100644 templates/enroll-email/html.ejs create mode 100644 templates/invitation-email/html.ejs create mode 100644 templates/invitation-inactive/html.ejs create mode 100644 templates/lostpassword-email/html.ejs create mode 100644 templates/new-version/html.ejs create mode 100644 templates/openhaboffline/html.ejs create mode 100644 test/openhabconsole.js create mode 100644 test/openhabimitator.js create mode 100644 testclient/testclient.js create mode 100644 views/account.ejs create mode 100644 views/accountdelete.ejs create mode 100644 views/alerts.ejs create mode 100644 views/applications.ejs create mode 100644 views/configsystem.ejs create mode 100644 views/devices.ejs create mode 100644 views/docs/documentation.ejs create mode 100644 views/docs/ifttt.ejs create mode 100644 views/docs/notifications.ejs create mode 100644 views/docs/persistence.ejs create mode 100644 views/enroll.ejs create mode 100644 views/events.ejs create mode 100644 views/footer.ejs create mode 100644 views/header.ejs create mode 100644 views/index.ejs create mode 100644 views/invitations.ejs create mode 100644 views/items.ejs create mode 100644 views/itemsdelete.ejs create mode 100644 views/login.ejs create mode 100644 views/lostpassword.ejs create mode 100644 views/lostpasswordreset.ejs create mode 100644 views/notifications.ejs create mode 100644 views/oauth2dialog.ejs create mode 100644 views/staff/invitations.ejs create mode 100644 views/staff/oauthclients.ejs create mode 100644 views/staff/staff.ejs create mode 100644 views/staff/stats.ejs create mode 100644 views/users.ejs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a439fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..704f122 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,161 @@ +## Contribution guidelines + +### Pull requests are always welcome + +We are always thrilled to receive pull requests, and do our best to +process them as fast as possible. Not sure if that typo is worth a pull +request? Do it! We will appreciate it. + +If your pull request is not accepted on the first try, don't be +discouraged! If there's a problem with the implementation, hopefully you +received feedback on what to improve. + +We're trying very hard to keep openHAB Cloud lean and focused. We don't want it +to do everything for everybody. This means that we might decide against +incorporating a new feature. However, there might be a way to implement +that feature *on top of* openHAB Cloud. + +### Discuss your design on the mailing list + +We recommend discussing your plans [in the discussion forum](https://community.openhab.org/) +before starting to code - especially for more ambitious contributions. +This gives other contributors a chance to point you in the right +direction, give feedback on your design, and maybe point out if someone +else is working on the same thing. + +### Create issues... + +Any significant improvement should be documented as [a GitHub +issue](https://github.com/openhab/openhab-cloud/issues?labels=enhancement&page=1&state=open) before anybody +starts working on it. + +### ...but check for existing issues first! + +Please take a moment to check that an issue doesn't already exist +documenting your bug report or improvement proposal. If it does, it +never hurts to add a quick "+1" or "I have this problem too". This will +help prioritize the most common problems and requests. + +### Conventions + +Fork the repo and make changes on your fork in a feature branch. + +Update the documentation when creating or modifying features. Test +your documentation changes for clarity, concision, and correctness, as +well as a clean documentation build. + +Write clean code. Universally formatted code promotes ease of writing, reading, +and maintenance. + +Pull requests descriptions should be as clear as possible and include a +reference to all the issues that they address. + +Pull requests must not contain commits from other users or branches. + +Commit messages must start with a capitalized and short summary (max. 50 +chars) written in the imperative, followed by an optional, more detailed +explanatory text which is separated from the summary by an empty line. + +Code review comments may be added to your pull request. Discuss, then make the +suggested modifications and push additional commits to your feature branch. Be +sure to post a comment after pushing. The new commits will show up in the pull +request automatically, but the reviewers will not be notified unless you +comment. + +Before the pull request is merged, make sure that you squash your commits into +logical units of work using `git rebase -i` and `git push -f`. After every +commit the test suite should be passing. Include documentation changes in the +same commit so that a revert would remove all traces of the feature or fix. + +Commits that fix or close an issue should include a reference like `Closes #XXX` +or `Fixes #XXX`, which will automatically close the issue when merged. + +### Merge approval + +openHAB Cloud maintainers use LGTM (Looks Good To Me) in comments on the code review +to indicate acceptance. + +### Sign your work + +The sign-off is a simple line at the end of the explanation for the +patch, which certifies that you wrote it or otherwise have the right to +pass it on as an open-source patch. The rules are pretty simple: if you +can certify the below (from +[developercertificate.org](http://developercertificate.org/)): + +``` +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. +``` + +then you just add a line to every git commit message: + + Signed-off-by: Joe Smith (github: github_handle) + +using your real name (sorry, no pseudonyms or anonymous contributions.) + +#### Small patch exception + +There are several exceptions to the signing requirement. Currently these are: + +* Your patch fixes spelling or grammar errors. +* Your patch is a single line change to documentation. + +## Community Guidelines + +We want to keep the openHAB Cloud community awesome, growing and collaborative. We +need your help to keep it that way. To help with this we've come up with some +general guidelines for the community as a whole: + +* Be nice: Be courteous, respectful and polite to fellow community members: no + regional, racial, gender, or other abuse will be tolerated. We like nice people + way better than mean ones! + +* Encourage diversity and participation: Make everyone in our community + feel welcome, regardless of their background and the extent of their + contributions, and do everything possible to encourage participation in + our community. + +* Keep it legal: Basically, don't get us in trouble. Share only content that + you own, do not share private or sensitive information, and don't break the + law. + +* Stay on topic: Make sure that you are posting to the correct channel + and avoid off-topic discussions. Remember when you update an issue or + respond to an email you are potentially sending to a large number of + people. Please consider this before you update. Also remember that + nobody likes spam. diff --git a/app.js b/app.js new file mode 100644 index 0000000..7e45bd1 --- /dev/null +++ b/app.js @@ -0,0 +1,1360 @@ + +/** + * Copyright (c) 2014-2016 by the respective copyright holders. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +/** + * This is the main application of the openHAB-cloud service + * + * @author Victor Belov - Initial contribution + * @author Dan Cunningham - Extended Features + * @author Mehmet Arziman - Extended Features + * + */ + + // TODO: Move all request handlers out of here, move authentication to auth.js + +// Main Logging setup +var logger = require('./logger.js'); + +logger.info('openHAB-cloud: Backend service is starting up...'); + +process.on('uncaughtException', function(err){ + logger.error(err); +}); + +logger.info('openHAB-cloud: Backend logging initialized...'); + +// Initialize the main configuration +var taskEnv = process.env.TASK || 'main'; +var config = require('./config.json'); + +// If Google Cloud Messaging is configured set it up +if(config.gcm) { + var gcmXmpp = require('./gcm-xmpp'); +} + +module.exports.config = config; + +// Setup all routes +var flash = require('connect-flash') + , express = require('express') + , routes = require('./routes') + , user = require('./routes/user') + , http = require('http') + , path = require('path') + , fs = require("fs") + , passport = require('passport') + , LocalStrategy = require('passport-local').Strategy + , account_routes = require('./routes/account') + , devices_routes = require('./routes/devices') + , applications_routes = require('./routes/applications') + , events_routes = require('./routes/events') + , items_routes = require('./routes/items') + , notifications_routes = require('./routes/notifications') + , configsystem_routes = require('./routes/configsystem') + , invitations_routes = require('./routes/invitations') + , users_routes = require('./routes/users') + , staff_routes = require('./routes/staff') + , api_routes = require('./routes/api') + , ifttt_routes = require('./routes/ifttt') + , session = require('express-session') + , RedisStore = require('connect-redis')(session) + , redis = require('./redis-helper') + , moment = require('moment') + , date_util = require('./date_util.js') + , cronJob = require('cron').CronJob + , appleSender = require('./aps-helper') + , oauth2 = require('./oauth2') + , Limiter = require('ratelimiter'); + + +// Setup Google Cloud Messaging component +var gcm = require('node-gcm'); +var gcmSender = require('./gcmsender.js'); + +var form = require('express-form'), + field = form.field; + +// MongoDB connection settings +var mongoose = require('mongoose'); +var cacheOpts = { + max:5000, + maxAge:1000*60*10 +}; + +var ObjectId = mongoose.SchemaTypes.ObjectId; + +require('mongoose-cache').install(mongoose, cacheOpts); + +var mongoUri = 'mongodb://' ; +for (host in config.mongodb.hosts) { + mongoUri += config.mongodb.hosts[host]; + if (host < config.mongodb.hosts.length - 1) { + mongoUri += ","; + } +} + +mongoUri += "/" + config.mongodb.db + '?poolSize=100'; +var mongoOptions = { + replset: { poolSize: 100 }, + db: {safe: false} +}; + +// Try to setup a mongodb connection, otherwise stopping +logger.info("opneHAB-cloud: Trying to connect to mongodb at: " + mongoUri); +mongoose.connect(mongoUri, function(err) { + if (err) { + logger.error("openHAB-cloud: Error while connecting from openHAB-cloud to mongodb: " + err); + logger.error("openHAB-cloud: Stopping openHAB-cloud due to error with mongodb"); + process.exit(1); + } else { + logger.info("openHAB-cloud: Successfully connected to mongodb"); + } +}); + +var mongooseTypes = require("mongoose-types"); +mongooseTypes.loadTypes(mongoose); + +var app = express(); + +// A request counter for issuing a uniqe ID to every request when sending them to openHABs +var requestCounter = 0; + +// A list of requests which are awaiting for responses from openHABs +var restRequests = {}; + +// A list of openHABs which lost their socket.io connection and are due for offline notification +// key is openHAB UUID, value is Date when openHAB was disconnected +var offlineOpenhabs = {}; + +// This timer runs every minute and checks if there are any openHABs in offline status for more then 300 sec +// Then it sends notifications to openHAB's owner if it is offline for more then 300 sec +// This timer only runs on the main task + +if (taskEnv == 'main') { + setInterval(function () { + logger.debug("openHAB-cloud: Checking for offline openHABs (" + Object.keys(offlineOpenhabs).length + ")"); + for (var offlineOpenhabUuid in offlineOpenhabs) { + // logger.debug(Date.now() - offlineOpenhabs[offlineOpenhabUuid]); + if (Date.now() - offlineOpenhabs[offlineOpenhabUuid] > 5 * 60 * 1000) { + logger.debug("openHAB-cloud: openHAB with "+offlineOpenhabUuid + " is offline > 300 sec, time to notify the owner"); + Openhab.findOne({uuid: offlineOpenhabUuid}).cache().exec(function (error, openhab) { + if (openhab && !error) { + openhab.status = 'offline'; + openhab.last_online = new Date; + openhab.save(function (error) { + if (error) { + logger.error("openHAB-cloud: Error saving openHAB status: " + error); + } + }); + var disconnectevent = new Event({ + openhab: openhab.id, + source: "openhab", + status: "offline", + color: "bad" + }); + disconnectevent.save(function (error) { + if (error) { + logger.error("openHAB-cloud: Error saving disconnect event: " + error); + } + }); + notifyOpenHABStatusChange(openhab, "offline") + delete offlineOpenhabs[openhab.uuid]; + } + }); + } + } + }, 60000); +} + +// Setup mongoose data models +var User = require('./models/user'); +var Openhab = require('./models/openhab'); +var OpenhabConfig = require('./models/openhabconfig'); +var Event = require('./models/event'); +var Item = require('./models/item'); +var UserDevice = require('./models/userdevice'); +var UserAccount = require('./models/useraccount'); +var Notification = require('./models/notification'); +var AccessLog = require('./models/accesslog'); +var OpenhabAccessLog = require('./models/openhabaccesslog'); +var Invitation = require('./models/invitation'); +var Myohstat = require('./models/myohstat'); + +logger.info("openHAB-cloud: Scheduling a statistics job (every 5 min)"); +var every5MinStatJob = require('./jobs/every5minstat'); +every5MinStatJob.start(); + + +// Create http server +var server = http.createServer(app); + + +// Local authentication strategy for passportjs +passport.use(new LocalStrategy({ + usernameField: 'username'}, + function(username, password, done){ + User.authenticate(username, password, function(err, user, params) { + // console.log(params); + return done(err, user, params); + }); + })); + +passport.serializeUser(function(user, done) { + done(null, user._id); +}); + +passport.deserializeUser(function(id, done) { + User.findById(id, function (err, user) { + done(err, user); + }); +}); + +// Configure the openHAB-cloud for development or productive mode +app.configure('development', function() { + app.use(express.errorHandler()); +}); + +app.configure('production', function() { +}); + +// App configuration for all environments +app.configure(function(){ + app.set('port', process.env.PORT || 3000); + app.set('views', __dirname + '/views'); + app.set('view engine', 'ejs'); + app.use(express.favicon()); + if (config.system.logging && config.system.logging == "debug") + app.use(express.logger('dev')); + app.use(express.bodyParser()); + app.use(express.methodOverride()); + app.use(express.cookieParser(config.express.key)); + app.use(express.session({ + secret: config.express.key, + store: new RedisStore({ host: 'localhost', port: 6379, client: redis, logErrors:true }) + })); + app.use(flash()); + app.use(passport.initialize()); + app.use(passport.session()); + app.use(function(req, res, next) { + var csrf = express.csrf(); + // Check if url needs csrf + if (!req.path.match('/rest*') && !req.path.match('/oauth2/token') && !req.path.match('/ifttt/*')) + csrf(req, res, next); + else + next(); + }); + app.use(function(req, res, next){ + if(typeof req.csrfToken === 'function') { + res.locals.token = req.csrfToken(); + } + next(); + }); + app.use(function(req, res, next) { + if (req.user) { + Openhab.findOne({account: req.user.account}).lean().exec(function(error, openhab) { + if (!error && openhab) { + res.locals.openhab = openhab; + res.locals.openhabstatus = openhab.status; + res.locals.openhablastonline = openhab.last_online; + if (openhab.openhabVersion != undefined) { + res.locals.openhabMajorVersion = openhab.openhabVersion.split('.')[0]; + } else { + res.locals.openhabMajorVersion = 0; + } + } else { + res.locals.openhab = undefined; + res.locals.openhabstatus = undefined; + res.locals.openhablastonline = undefined; + res.locals.openhabMajorVersion = undefined; + } + next(); + }); + } else { + next(); + } + }); + + // Add global usable locals for templates + app.use(function(req, res, next) { + if (req.session.timezone) { + res.locals.timeZone = req.session.timezone; + } else { + res.locals.timeZone = 'undefined'; + } + res.locals.moment = moment; + res.locals.date_util = date_util; + next(); + }); + app.use(function(req, res, next) { + var host = req.headers.host; + // console.log(host); + if (!host) { + next(); // No host in header, just go ahead + } + // If host matches names for full /* proxying, go ahead and just proxy it. + if (host.indexOf('remote.') == 0 || host.indexOf('home.') == 0) { + // app.all('/rest/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); + // console.log('vhost detected'); + req.url = '/remote' + req.url; + } + next(); + }); + app.use(app.router); + // app.use(require('less-middleware')({ src: __dirname + '/public' })); + app.use(express.static(path.join(__dirname, 'public'))); +}); + +server.listen(app.get('port'), function(){ + logger.info('openHAB-cloud: express server listening on port ' + app.get('port')); +}); + +var io = require('socket.io').listen(server, {logger : logger}); +// var ioredis = require('socket.io-redis'); +// io.adapter(ioredis({ host: 'localhost', port: 6379 })); + +// Ensure user is authenticated +function ensureAuthenticated(req, res, next) { + if (req.isAuthenticated()) { + return next(); + } + req.session.returnTo = req.originalUrl || req.url; + res.redirect('/login') +} + +// Ensure user have 'master' role for certain routes +function ensureMaster(req, res, next) { + if (req.user.role == 'master') { + return next(); + } + res.redirect('/'); +} + +// Ensure user is from 'staff' group for certain routes +function ensureStaff(req, res, next) { + if (req.user.group == 'staff') { + return next(); + } + res.redirect('/'); +} + +// General routes +app.get('/', routes.index); +app.get('/docs', routes.docs); +app.get('/docs/notifications', routes.docsnotifications); +app.get('/docs/persistence', routes.docspersistence); +if(config.ifttt){ + logger.info('openHAB-cloud: IFTTT is configured, app adding IFTTT documentation...'); + app.get('/docs/ifttt', routes.docsifttt); +} + +// V2 route - response to this route means this openHAB-cloud is using v2 transport based on socket.io 1.0 +app.get('/v2', routes.getv2); + +app.get('/logout', function(req, res){ + req.logout(); + res.redirect('/'); +}); + +app.get('/login', function(req, res) { + errormessages = req.flash('error'); + if (req.query['invitationCode'] != null) { + invitationCode = req.query['invitationCode']; + } else { + invitationCode = ""; + } + // console.log(errormessages); + // console.log(errormessages.length); + res.render('login', {title: "Log in", user: req.user, errormessages: errormessages, + infomessages: req.flash('info'), invitationCode: invitationCode}); +}); + +app.post('/login', passport.authenticate('local', { successReturnToOrRedirect: '/', + failureRedirect: '/login', failureFlash: true })); + +// My account +app.get('/account', ensureAuthenticated, account_routes.accountget); +app.post('/account', ensureAuthenticated, ensureMaster, account_routes.accountpostvalidate, account_routes.accountpost); +app.post('/accountpassword', ensureAuthenticated, account_routes.accountpasswordpostvalidate, account_routes.accountpasswordpost); +app.get('/accountdelete', ensureAuthenticated, ensureMaster, account_routes.accountdeleteget); +app.post('/accountdelete', ensureAuthenticated, ensureMaster, account_routes.accountdeletepost); +app.get('/itemsdelete', ensureAuthenticated, ensureMaster, account_routes.itemsdeleteget); +app.post('/itemsdelete', ensureAuthenticated, ensureMaster, account_routes.itemsdeletepost); + +// My devices +app.get('/devices', ensureAuthenticated, devices_routes.devicesget); +app.get('/devices/:id', ensureAuthenticated, devices_routes.devicesget); +app.get('/devices/:id/delete', ensureAuthenticated, devices_routes.devicesdelete); +app.post('/devices/:id/sendmessage', ensureAuthenticated, devices_routes.devicessendmessagevalidate, devices_routes.devicessendmessage); + +// Applications +app.get('/applications', ensureAuthenticated, applications_routes.applicationsget); +app.get('/applications/:id/delete', ensureAuthenticated, applications_routes.applicationsdelete); + +// New user registration +app.post('/register', account_routes.registerpostvalidate, account_routes.registerpost); +app.get('/verify', account_routes.verifyget); + +// Enroll for beta - old URLs, both of them respond with redirects to /login +app.get('/enroll', account_routes.enrollget); +app.post('/enroll', account_routes.enrollpost); + +// Events +app.get('/events', ensureAuthenticated, events_routes.eventsget); + +// Items +app.get('/items', ensureAuthenticated, items_routes.itemsget); + +// Notifications +app.get('/notifications', ensureAuthenticated, notifications_routes.notificationsget); + +// Invitations +app.get('/invitations', ensureAuthenticated, invitations_routes.invitationsget); +app.post('/invitations', ensureAuthenticated, invitations_routes.invitationspostvalidate, invitations_routes.invitationspost); +app.get('/lostpassword', account_routes.lostpasswordget); +app.post('/lostpassword', account_routes.lostpasswordpostvalidate, account_routes.lostpasswordpost); +app.get('/lostpasswordreset', account_routes.lostpasswordresetget); +app.post('/lostpasswordreset', account_routes.lostpasswordresetpostvalidate, account_routes.lostpasswordresetpost); + +// Users management for 'master' users +app.get('/users', ensureAuthenticated, ensureMaster, users_routes.usersget); +app.get('/users/add', ensureAuthenticated, ensureMaster, users_routes.usersaddget); +app.post('/users/add', ensureAuthenticated, ensureMaster, users_routes.usersaddpostvalidate, users_routes.usersaddpost); +app.get('/users/delete/:id', ensureAuthenticated, ensureMaster, users_routes.usersdeleteget); +app.get('/users/:id', ensureAuthenticated, ensureMaster, users_routes.usersget); + +// System Configuration +app.get('/config/system', ensureAuthenticated, configsystem_routes.get); +app.get('/config/system/:id', ensureAuthenticated, configsystem_routes.get); + +// OAuth2 routes +app.get('/oauth2/authorize', ensureAuthenticated, oauth2.authorization); +app.post('/oauth2/authorize/decision', ensureAuthenticated, oauth2.decision); +app.post('/oauth2/token', oauth2.token); + +// Staff route +app.get('/staff', ensureAuthenticated, ensureStaff, staff_routes.staffget); +app.get('/staff/processenroll/:id', ensureAuthenticated, ensureStaff, staff_routes.processenroll); +app.get('/staff/stats', ensureAuthenticated, ensureStaff, staff_routes.statsget); +app.get('/staff/invitations', ensureAuthenticated, ensureStaff, staff_routes.invitationsget); +app.get('/staff/resendinvitation/:id', ensureAuthenticated, ensureStaff, staff_routes.resendinvitation); +app.get('/staff/deleteinvitation/:id', ensureAuthenticated, ensureStaff, staff_routes.deleteinvitation); +app.get('/staff/oauthclients', ensureAuthenticated, ensureStaff, staff_routes.oauthclientsget); + + +// IFTTT routes +if(config.ifttt){ + logger.info('openHAB-cloud: IFTTT is configured, app handling IFTTT capabilities...'); + app.get('/ifttt/v1/user/info', ifttt_routes.userinfo); + app.get('/ifttt/v1/status', ifttt_routes.v1status); + app.post('/ifttt/v1/test/setup', ifttt_routes.v1testsetup); + app.post('/ifttt/v1/actions/command', ifttt_routes.v1actioncommand); + app.post('/ifttt/v1/actions/command/fields/item/options', ifttt_routes.v1actioncommanditemoptions); + app.post('/ifttt/v1/triggers/itemstate', ifttt_routes.v1triggeritemstate); + app.post('/ifttt/v1/triggers/itemstate/fields/item/options', ifttt_routes.v1actioncommanditemoptions); + app.post('/ifttt/v1/triggers/item_raised_above', ifttt_routes.v1triggeritem_raised_above); + app.post('/ifttt/v1/triggers/item_raised_above/fields/item/options', ifttt_routes.v1actioncommanditemoptions); + app.post('/ifttt/v1/triggers/item_dropped_below', ifttt_routes.v1triggeritem_dropped_below); + app.post('/ifttt/v1/triggers/item_dropped_below/fields/item/options', ifttt_routes.v1actioncommanditemoptions); +} + +// A route to set session timezone automatically detected in browser +app.all('/setTimezone', setSessionTimezone); +function setSessionTimezone(req, res) { + req.session.timezone = req.query['tz']; + // console.log("Timezone set to " + req.session.timezone); + res.send(200, "Timezone set"); +} + +// REST routes +app.get('/api/events', ensureAuthenticated, events_routes.eventsvaluesget); + +// Functions to process proxy requests to openHABs + +// If the request contains a bearer token then do oauth2, otherwise try basic auth +var restAuth = function (req, res, next) { + if (req.headers['authorization'] && req.headers['authorization'].indexOf('Bearer') == 0) { + passport.authenticate('bearer', { + session: false + }, function (error, user, info) { + if (error) { + return res.status(401).json({ + errors: [{ + message: error + }] + }); + } + if (!user) { + return res.status(401).json({ + errors: [{ + message: "Authentication failed" + }] + }); + } + req.logIn(user, function (error) { + if (error) { + return res.status(401).json({ + errors: [{ + message: error + }] + }); + } + return next(); + }); + })(req, res, next); + } else { + var ba = express.basicAuth(function (username, password, callback) { + User.authenticate(username, password, callback); + }); + ba(req, res, next); + } +} + +function setOpenhab(req, res, next) { + req.user.openhab(function(error, openhab) { + if (!error && openhab) { + req.openhab = openhab; + } else { + if (error) { + logger.error("openHAB-cloud: openHAB lookup error: " + error); + } else { + logger.warn("openHAB-cloud: Can't find the openHAB of user which is unbelievable"); + } + } + next(); + }); +} + +function preassembleBody(req, res, next) { + var data = ''; + req.on('data', function(chunk) { + data += chunk; + }); + req.on('end', function() { + req.rawBody = data; + next(); + }); +} + +function proxyRouteOpenhab(req, res) { + req.connection.setTimeout(600000); + // console.log(req.method + " " + req.path + " from openhab " + req.openhab.uuid + " for " + req.user.username); + if (req.openhab.status == 'offline') { + res.writeHead(500, 'openHAB is offline', {'content-type': 'text/plain'}); + res.end('openHAB is offline'); + return; + } + + // TODO: migrate this to redis incr? + // increment request id and fix it + requestCounter++; + var requestId = requestCounter; + // make a local copy of request headers to modify + var requestHeaders = req.headers; + // get remote hose from either x-forwarded-for or request + var remoteHost = req.headers['x-forwarded-for'] || req.connection.remoteAddress; + // We need to remove and modify some headers here + delete requestHeaders['cookie']; + delete requestHeaders['cookie2']; + delete requestHeaders['authorization']; + delete requestHeaders['x-real-ip']; + delete requestHeaders['x-forwarded-for']; + delete requestHeaders['x-forwarded-proto']; + delete requestHeaders['connection']; + requestHeaders['host'] = req.headers.host || config.system.baseurl; + requestHeaders['user-agent'] = "openhab-cloud/0.0.1"; + // console.log(req.path); + // Strip off path prefix for remote vhosts hack + var requestPath = req.path; + if (requestPath.indexOf('/remote/') == 0) { + requestPath = requestPath.replace('/remote', ''); + // TODO: this is too dirty :-( + delete requestHeaders['host']; + requestHeaders['host'] = "home.openhab.org:443"; + } + // console.log(requestPath); + // Send a message with request to openhab agent module + // newAccessLog = new AccessLog({openhab: req.openhab.id, user: req.user.id, path: requestPath, method: req.method, + // remoteHost: remoteHost}); + // newAccessLog.save(); + io.sockets.in(req.openhab.uuid).emit('request', {id:requestId, method: req.method, + headers: requestHeaders, path:requestPath, query: req.query, body: req.rawBody}); + res.openhab = req.openhab; + restRequests[requestId] = res; + res.on('close', function() { + // console.log("Request " + requestId + " was closed before serving"); + io.sockets.in(req.openhab.uuid).emit('cancel', {id:requestId}); + }); +} + +function addAppleRegistration(req, res) { + if (!req.query.hasOwnProperty('regId')) { + res.send(404, "Parameters missing"); + return; + } + var registrationId = req.query['regId']; + if (req.query.hasOwnProperty('deviceId')) { + var deviceId = req.query['deviceId']; + } else { + var deviceId = 'unknown'; + } + if (req.query.hasOwnProperty('deviceModel')) { + var deviceModel = req.query['deviceModel']; + } else { + var deviceModel = 'unknown'; + } + UserDevice.findOne({owner: req.user.id, deviceType: 'ios', deviceId: deviceId}, function(error, userDevice) { + if (!error) { + if (userDevice) { + // If found, update device token and save + logger.info("openHAB-cloud: Found iOS device for user " + req.user.username + ", updating"); + userDevice.iosDeviceToken = registrationId; + userDevice.lastUpdate = new Date; + userDevice.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving user device: " + error); + } + }); + res.send(200, "Updated"); + } else { + // If not found, add new device registration + logger.info("openHAB-cloud: Registering new iOS device for user " + req.user.username); + var userDevice = new UserDevice({owner: req.user.id, deviceType: 'ios', deviceId: deviceId, + iosDeviceToken: registrationId, deviceModel: deviceModel, lastUpdate: new Date, + registered: new Date}); + userDevice.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving user device: " + error); + } + }); + res.send(200, "Added"); + } + } else { + logger.warn("openHAB-cloud: Error looking up device: " + error); + res.send(500, "Internal server error"); + } + }); + +} + +function addAndroidRegistration(req, res) { + // if (!req.query.hasOwnProperty('regId') || !req.query.hasOwnProperty('deviceId') + // || !req.query.hasOwnProperty('deviceModel')) { + // res.send(404, "Parameters missing"); + // return; + // } + if (!req.query.hasOwnProperty('regId')) { + res.send(404, "Parameters missing"); + return; + } + var registrationId = req.query['regId']; + if (req.query.hasOwnProperty('deviceId')) { + var deviceId = req.query['deviceId']; + } else { + var deviceId = 'unknown'; + } + if (req.query.hasOwnProperty('deviceModel')) { + var deviceModel = req.query['deviceModel']; + } else { + var deviceModel = 'unknown'; + } + // Try to find user device by device Id + UserDevice.findOne({owner: req.user.id, deviceType: 'android', deviceId: deviceId}, function(error, userDevice) { + if (!error) { + if (userDevice) { + // If found, update the changed registration id + logger.info("openHAB-cloud: Found an Android device for user " + req.user.username + ", updating"); + userDevice.androidRegistration = registrationId; + userDevice.lastUpdate = new Date; + userDevice.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving user device: " + error); + } + }); + res.send(200, "Updated"); + } else { + // If not found, try to find device by registration id. Sometimes android devices change their + // ids dynamically, while google play services continue to return the same registration id + // so this is still the same device and we don't want any duplicates + UserDevice.findOne({owner: req.user.id, deviceType: 'android', androidRegistration: registrationId}, + function(error, userDevice) { + if (!error) { + if (userDevice) { + // If found, update the changed device id + userDevice.deviceId = deviceId; + userDevice.lastUpdate = new Date; + userDevice.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving user device: " + error); + } + }); + res.send(200, "Updated"); + } else { + // If not found, finally register a new one + var userDevice = new UserDevice({owner: req.user.id, deviceType: 'android', deviceId: deviceId, + androidRegistration: registrationId, deviceModel: deviceModel, lastUpdate: new Date, + registered: new Date}); + userDevice.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving user device: " + error); + } + }); + res.send(200, "Added"); + } + } else { + logger.warn("openHAB-cloud: Error looking up device: " + error); + res.send(500, "Internal server error"); + } + }); + } + } else { + logger.warn("openHAB-cloud: Error looking up device: " + error); + res.send(500, "Internal server error"); + } + }); +} + +// Process all requests from mobile apps to openHAB +app.all('/rest*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/images/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/static/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/rrdchart.png*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/chart*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/openhab.app*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/WebApp*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/CMD*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/cometVisu*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/proxy*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/greent*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/jquery.*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/classicui/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/ui/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/basicui/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/doc/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/start/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/icon*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/habmin/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/remote*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); +app.all('/habpanel/*', restAuth, preassembleBody, setOpenhab, proxyRouteOpenhab); + +// myOH API for mobile apps +app.all('/api/v1/notifications*', restAuth, preassembleBody, setOpenhab, api_routes.notificationsget); + +// Android app registration +app.all('/addAndroidRegistration*', restAuth, preassembleBody, setOpenhab, addAndroidRegistration); +app.all('/addAppleRegistration*', restAuth, preassembleBody, setOpenhab, addAppleRegistration); + +function sendSimpleNotificationToUser(user, message) { + sendNotificationToUser(user, message, '', ''); +} + +function sendNotificationToUser(user, message, icon, severity) { + var androidRegistrations = []; + var iosDeviceTokens = []; + newNotification = new Notification({user: user.id, message: message, icon: icon, severity: severity}); + newNotification.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving notification: " + error); + } + }); + UserDevice.find({owner: user.id}, function(error, userDevices) { + if (!error) { + if (userDevices) { + for (var i=0; i 0) { + sendAndroidNotifications(androidRegistrations, message); + } + // If we found any ios devices, send notification + if (iosDeviceTokens.length > 0) { + sendIosNotifications(iosDeviceTokens, message); + } + } else { + // User don't have any registered devices, so we will skip it. + } + } else { + logger.warn("openHAB-cloud: Error fetching devices for user: " + error); + } + }); +} + +function sendIosNotifications(iosDeviceTokens, message) { + for (var i=0; i 50) { + // itemToUpdate.states.splice(0, 1); + // } + // Save the updated item + itemToUpdate.save(function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving item: " + error); + } + }); + // Check if the new state is int or float to store it to Number and create new item update event + if (!isNaN(parseFloat(itemStatus))) { + // This is silly, but we need to check if previous status was int or float + if (!isNaN(parseFloat(itemToUpdate.prev_status))) { + Event.collection.insert({openhab: mongoose.Types.ObjectId(openhab.id), + source: itemName, + status: itemStatus, + oldStatus: itemToUpdate.prev_status, + numericStatus: parseFloat(itemStatus), + oldNumericStatus: parseFloat(itemToUpdate.prev_status), + color: "info", + when: new Date + }, function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving event: " + error); + } + }); + /* Event.create({openhab: openhab.id, + source: itemName, + status: itemStatus, + oldStatus: itemToUpdate.prev_status, + numericStatus: parseFloat(itemStatus), + oldNumericStatus: parseFloat(itemToUpdate.prev_status), + color: "info" + }, function(error) { + if (error) { + logger.error("Error saving event: " + error); + } + });*/ + } else { + Event.collection.insert({ + openhab: mongoose.Types.ObjectId(openhab.id), + source: itemName, + status: itemStatus, + oldStatus: itemToUpdate.prev_status, + numericStatus: parseFloat(itemStatus), + color: "info", + when: new Date + }, function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving event: " + error); + } + }); + } + } else { + Event.collection.insert({openhab: mongoose.Types.ObjectId(openhab.id), source: itemName, + status: itemStatus, oldStatus: itemToUpdate.prev_status, + color: "info", when: new Date}, function(error) { + if (error) { + logger.error("openHAB-cloud: Error saving event: " + error); + } + }); + } + // Thus if item status didn't change, there will be no event... + } + } else { + logger.warn("openHAB-cloud: Unable to find item for itemUpdate: " + error); + } + }); + } else { + if (error) { + logger.warn("openHAB-cloud: Unable to find openHAB for itemUpdate: " + error); + } else { + logger.info("openHAB-cloud: Unable to find openHAB for itemUpdate: openHAB doesn't exist"); + } + } + }); + } else { + logger.info("openHAB-cloud: Item " + itemName + " status.length (" + itemStatus.length + ") is too big, ignoring update"); + } + }); + }); + socket.on('updateConfig', function(data) { + var self = this; + Openhab.findOne({uuid: self.handshake.uuid}, function(error, openhab) { + if (!error && openhab) { + logger.info("openHAB-cloud: openHAB " + self.handshake.uuid + " requested to update " + data.type + " config " + + data.name + " with timestamp = " + data.timestamp); + OpenhabConfig.findOne({openhab: openhab.id, type: data.type, name: data.name}, + function(error, openhabConfig) { + if (!error) { + if (!openhabConfig) { + logger.info("openHAB-cloud: No config found, creating new one"); + openhabConfig = new OpenhabConfig({type: data.type, name: data.name, + timestamp: new Date(data.timestamp), config: data.config, openhab: openhab.id}); + openhabConfig.markModified(); + openhabConfig.save(function(error) { + if (error != null) { + logger.warn("openHAB-cloud: Error saving new openhab config: " + error); + } + }); + } else { + logger.info("openHAB-cloud: My timestamp = " + openhabConfig.timestamp + ", remote timestamp = " + + new Date(data.timestamp)); + if (openhabConfig.timestamp > new Date(data.timestamp)) { + logger.info("openHAB-cloud: My config is newer"); + io.sockets.in(openhab.uuid).emit('updateConfig', {timestamp: openhabConfig.timestamp, + name: openhabConfig.name, type: openhabConfig.type, + config: openhabConfig.config}); + } else { + if (openhabConfig.timestamp < new Date(data.timestamp)) { + logger.info("openHAB-cloud: Remote config is newer, updating"); + openhabConfig.config = data.config; + openhabConfig.timestamp = new Date(data.timestamp); + openhabConfig.markModified(); + openhabConfig.save(); + io.sockets.in(openhab.uuid).emit('updateConfig', {timestamp: openhabConfig.timestamp, + config: openhabConfig.config}); + } else { + logger.info("openHAB-cloud: My config = remote config"); + io.sockets.in(openhab.uuid).emit('updateConfig', {timestamp: openhabConfig.timestamp, + config: openhabConfig.config}); + } + } + } + } else { + logger.warn("openHAB-cloud: Failed to find " + self.openhab.uuid + " config: " + error); + } + }); + } else { + if (error) { + logger.warn(error); + } else { + logger.warn("openHAB-cloud: Unable to find openhab " + self.handshake.uuid); + } + } + }); + }); + socket.on('disconnect', function() { + var self = this; + // Find any other sockets for this openHAB and if any, don't mark openHAB as offline + for (var connectedSocketId in io.sockets.connected) { + var connectedSocket = io.sockets.connected[connectedSocketId]; + if (connectedSocket != self && connectedSocket.openhabUuid == self.handshake.uuid) { + logger.info("openHAB-cloud: Found another connected socket for " + self.handshake.uuid + ", will not mark offline"); + return; + } + } + Openhab.findById(self.openhabId, function(error, openhab) { + if (!error && openhab) { + offlineOpenhabs[openhab.uuid] = Date.now(); + logger.info("openHAB-cloud: Disconnected " + openhab.uuid); + } + }); + }); +}); + +function notifyOpenHABStatusChange(openhab, status) { + User.find({account: openhab.account, role: 'master'}, function(error, users) { + if (!error && users) { + for (var i=0; i" + } +} diff --git a/config-production.json b/config-production.json new file mode 100644 index 0000000..7276e11 --- /dev/null +++ b/config-production.json @@ -0,0 +1,48 @@ +{ + "system": { + "baseurl": ":443", + "logging": "info" + }, + "express":{ + "key" : "some express key" + }, + "apn" : { + "gateway": "gateway.push.apple.com", + "cert": "certs/aps/aps_production_cert.pem", + "key": "certs/aps/aps_production_key.pem", + "passphrase": "passphrase" + }, + "gcm" : { + "jid": "something@gcm.googleapis.com", + "password": "password" + }, + "ifttt" : { + "iftttChannelKey" : "key", + "iftttTestToken" : "token" + }, + "mail": { + "host" : "smtp", + "port" : 465, + "user" : "foo@bar.com", + "pass" : "password" + }, + "mongodb": { + "hosts": ["127.0.0.1"], + "db": "openhab", + "user": "openhab", + "password": "password" + }, + "redis": { + "host": "127.0.0.1", + "port": "6379", + "password": "password" + }, + "mailer": { + "host" : "smtp", + "port": 465, + "secureConnection": true, + "user": "foo@bar.com", + "password": "password", + "from": "openHAB Cloud " + } +} diff --git a/date_util.js b/date_util.js new file mode 100644 index 0000000..186cc7c --- /dev/null +++ b/date_util.js @@ -0,0 +1,42 @@ +var moment = require('moment'); +var tz = require('timezone/loaded'); +var time = require('time'); + +module.exports = function(date, timezone) { + var strftime_format = '%F %T %z'; // used to convert a date into a normalized strftime format with timezone + var moment_format = 'YYYY-MM-DD HH:mm:ss zz'; // moment.js LDML format for parsing date strings + + /** + * Convert a Javascript Date into node-time wrapper with the appropriate timezone. + * @param date {Date} Javascript Date object + * @param timezone {String} Olson timezone for this date (e.g. 'America/New_York') + * @return node-time object with the appropriate timezone + */ + var to_local = function(date, timezone) { + if (timezone == 'undefined') { + timezone = 'UTC'; + } + var tz_date = new time.Date(date); + tz_date.setTimezone(timezone); // localize the date into the specified timezone + return local_datetime = tz(tz_date, strftime_format, timezone); // localized format w timezone offset + } + + /** + * Convert a Javascript Date into a Moment.js moment obj with the appropriate timezone. + * Using the returned moment, you can call for example 'moment.calendar()' to get a + * human readable relative time such as 'last Friday at 3:52 PM'. + * @param date {Date} Javascript Date object + * @param timezone {String} Olson timezone for this date (e.g. 'America/New_York') + * @return moment with the appropriate timezone + */ + var to_moment = function(date, timezone) { + var local_datetime = to_local(date, timezone); + return moment(local_datetime, moment_format); + } + +// return { +// to_local: to_local, +// to_moment: to_moment +// } + return to_moment(date, timezone); +} diff --git a/etc/nginx_openhabcloud.conf b/etc/nginx_openhabcloud.conf new file mode 100644 index 0000000..1f64aab --- /dev/null +++ b/etc/nginx_openhabcloud.conf @@ -0,0 +1,64 @@ +server { +listen *:443; +listen *:80; +ssl on; +ssl_certificate /etc/nginx/ssl/openhabcloud.crt; +ssl_certificate_key /etc/nginx/ssl/openhabcloud.key; +server_name your-openhab-cloud-host; + +if ( $scheme = "http" ) { + rewrite ^/(.*)$ https://$host/$1 permanent; +} + +charset utf-8; + +access_log /var/log/nginx/openhab-cloud.org-access.log; +error_log /var/log/nginx/openhab-cloud.org-error.log; +client_max_body_size 300m; + + +location /css { + alias /opt/openhabcloud/public/css; + } +location /js { + alias /opt/openhabcloud/public/js; + } +location /img { + alias /opt/openhabcloud/public/img; + } +location /bootstrap { + alias /opt/openhabcloud/public/bootstrap; + } +location /font-icons { + alias /opt/openhabcloud/public/font-icons; + } +location /fonts { + alias /opt/openhabcloud/public/fonts; + } +location /js-plugin { + alias /opt/openhabcloud/public/js-plugin; + } +location /downloads { + alias /opt/openhabcloud/public/downloads; + } +location / { + proxy_pass http://localhost:3000; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-Real-IP $remote_addr ; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ; + proxy_set_header X-Forwarded-Proto https; +} + +#error_page 404 /404.html; + +# redirect server error pages to the static page /50x.html +# +error_page 500 502 503 504 /50x.html; +location = /50x.html { +root html; +} +} diff --git a/etc/openhabcloud.service b/etc/openhabcloud.service new file mode 100644 index 0000000..a3a972f --- /dev/null +++ b/etc/openhabcloud.service @@ -0,0 +1,17 @@ +[Unit] +Description=node.js openhab cloud server + +[Service] +User=openhabcloud +Group=openhabcloud +Environment=NODE_ENV=production +#Environment=DEBUG=oath2orize +Restart=always +RestartSec=10 # Restart service after 10 seconds if node service crashes +StandardOutput=syslog # Output to syslog +StandardError=syslog # Output to syslog +SyslogIdentifier=openhabcloud +WorkingDirectory=/home/openhabcloud/openhabcloud +ExecStart=/home/openhabcloud/.nvm/v0.10.48/bin/node /home/openhabcloud/openhabcloud/app.js +[Install] +WantedBy=multi-user.target diff --git a/gcm-xmpp.js b/gcm-xmpp.js new file mode 100644 index 0000000..2468ba7 --- /dev/null +++ b/gcm-xmpp.js @@ -0,0 +1,121 @@ +var config = require("./config.json"); + +/* + This module maintains XMPP connection to GCM to receive messages from Android + app. + */ + +var UserDevice = require("./models/userdevice") + , UserDeviceLocationHistory = require("./models/userdevicelocationhistory"); + +var xmpp = require('node-xmpp') + , logger = require('./logger.js'); + +var xmppOptions = { + type: 'client', + jid: config.gcm.jid, + password: config.gcm.password, + port: 5235, + host: 'gcm.googleapis.com', + legacySSL: true, + preferredSaslMechanism : 'PLAIN' +}; + +logger.info('openHAB-cloud: Initializing XMPP connection to GCM'); + +var xmppClient = new xmpp.Client(xmppOptions); +var gcmSender = require('./gcmsender.js'); +var gcm = require('node-gcm'); + +xmppClient.on('online', function() { + logger.info("openHAB-cloud: GCM XMPP connection is online"); +}); + + +xmppClient.on('stanza', function(stanza) { + if (stanza.is('message') && stanza.attrs.type !== 'error') { + logger.info('openHAB-cloud: GCM XMPP received message'); + var messageData = JSON.parse(stanza.getChildText("gcm")); +// console.log(messageData); + if (messageData && messageData.message_type != "ack" && messageData.message_type != "nack") { + var ackMsg = new xmpp.Element('message').c('gcm', { xmlns: 'google:mobile:data' }).t(JSON.stringify({ + "to":messageData.from, + "message_id": messageData.message_id, + "message_type":"ack" + })); + xmppClient.send(ackMsg); + logger.info('openHAB-cloud: GCM XMPP ack sent'); + if (messageData.data.type == "location") { + logger.info("openHAB-cloud: This is a location message"); + UserDevice.findOne({androidRegistration: messageData.from}, function(error, userDevice) { + if (!error && userDevice) { + userDevice.globalLocation = [messageData.data.latitude, messageData.data.longitude]; + userDevice.globalAccuracy = messageData.data.accuracy; + userDevice.globalAltitude = messageData.data.altitude; + userDevice.lastGlobalLocation = new Date(messageData.data.timestamp); + userDevice.save(); + var newLocation = new UserDeviceLocationHistory({userDevice: userDevice.id}); + newLocation.globalLocation = [messageData.data.latitude, messageData.data.longitude]; + newLocation.when = new Date(messageData.data.timestamp); + newLocation.globalAltitude = messageData.data.altitude; + newLocation.globalAccuracy = messageData.data.accuracy; + newLocation.save(); + } else { + if (error) { + logger.warn("openHAB-cloud: Error finding user device: " + error); + } else { + logger.warn("openHAB-cloud: Unable to find user device with reg id = " + messageData.from); + } + } + }); + } else if (messageData.data.type == "hideNotification") { + logger.info("openHAB-cloud: This is hideNotification message"); + UserDevice.findOne({androidRegistration: messageData.from}, function(error, userDevice) { + if (!error && userDevice) { + UserDevice.find({owner: userDevice.owner}, function(error, userDevices) { + // TODO: now send hideNotification message to all devices except the source one + var registrationIds = []; + for (var i=0; i 0) { + var gcmMessage = new gcm.Message({ + delayWhileIdle: false, + data: { + type: 'hideNotification', + notificationId: messageData.data.notificationId + } + }); + gcmSender.send(gcmMessage, registrationIds, 4, function (err, result) { + if (err) { + logger.err("mopenHAB-cloud: GCM send error: " + result); + } + }); + } + }); + } else { + if (error) { + logger.warn("openHAB-cloud: Error finding user device: " + error); + } else { + logger.warn("openHAB-cloud: Unable to find user device with reg id = " + messageData.from); + } + } + }); + } + } else { + logger.info("openHAB-cloud: GCM XMPP message is ack or nack, ignoring"); + } + } else { +// console.log(stanza); + } +}); + +xmppClient.on('error', function(error) { + logger.warn("openHAB-cloud: GCM XMPP error: " + error); +}); + +module.exports = xmppClient; diff --git a/gcmsender.js b/gcmsender.js new file mode 100644 index 0000000..4c21f76 --- /dev/null +++ b/gcmsender.js @@ -0,0 +1,8 @@ +var config = require("./config.json") +/* + This module maintains GCM sender for openhab-cloud application and it's components + */ + +var gcm = require('node-gcm'); +var gcmSender = new gcm.Sender(config.gcm.password); +module.exports = gcmSender; diff --git a/jobs/checkopenhabsoffline.js b/jobs/checkopenhabsoffline.js new file mode 100644 index 0000000..7a63ef5 --- /dev/null +++ b/jobs/checkopenhabsoffline.js @@ -0,0 +1,64 @@ +var cronJob = require('cron').CronJob + , logger = require('../logger') + , mailer = require('../mailer') + // Mongoose models + , User = require('../models/user') + , Openhab = require('../models/openhab') + , OpenhabConfig = require('../models/openhabconfig') + , Event = require('../models/event') + , UserAccount = require('../models/useraccount'); + +// This job checks for openhabs which has been offline for more then 3 days and sends warning emails to their +// owners, pointing out that we didn't see their openhabs for quite long time, not more then one email per 3 days + +module.exports = new cronJob('00 00 00 * * *', function() { + logger.info("openHAB-cloud: checkopenhabsoffline job started"); +// openhabs.find({status:'offline',last_online: {$lte:ISODate("2014-02-24T16:00:00.000X")}}).count() + date3DaysAgo = new Date; + date3DaysAgo.setDate(date3DaysAgo.getDate()-3); + logger.info("openHAB-cloud: date3DaysAgo = " + date3DaysAgo); + Openhab.find({status:'offline', last_online: {"$lt":date3DaysAgo}}, function(error, openhabs) { + if (!error && openhabs) { + logger.info("openHAB-cloud: Found " + openhabs.length + " openhabs"); + // console.log(openhabs); + for (var i in openhabs) { + var openhab = openhabs[i]; + if (!openhab.last_email_notification || openhab.last_email_notification < date3DaysAgo) { + openhab.last_email_notification = new Date; + openhab.save(); +// console.log(openhab.uuid + ":"); + UserAccount.findOne({_id:openhab.account}, function(error, userAccount) { + if (!error && userAccount) { + User.find({account: userAccount.id, role:"master"}, function(error, users) { + if (!error && users) { + for (var i in users) { + var user = users[i]; + var locals = { + email: user.username + }; + mailer.sendEmail(user.username, "We are worried about your openHAB", + "openhaboffline", locals, function(error) { + if (!error) { +// logger.info("mail sent"); + } else + logger.error("openHAB-cloud: Error sending email: " + error); + }); + } + } + }); + } else if (error) { + logger.error("openHAB-cloud: Error finding user account for openhab: " + error); + } else { + logger.error("openHAB-cloud: Unable to find user account for openhab which is nonsense"); + } + }); + } + } + } else if (error) { + logger.error("openHAB-cloud: Error finding offline openHABs: " + error); + } else { + logger.info("openHAB-cloud: No offline openHABs found"); + } + }); + logger.info("openHAB-cloud: checkopenhabsoffline job finished"); +}); diff --git a/jobs/every5minstat.js b/jobs/every5minstat.js new file mode 100644 index 0000000..c14efcb --- /dev/null +++ b/jobs/every5minstat.js @@ -0,0 +1,55 @@ +var cronJob = require('cron').CronJob + , logger = require('../logger') + , redis = require('../redis-helper'); +// Mongoose models +var User = require('../models/user'); +var Openhab = require('../models/openhab'); +var OpenhabConfig = require('../models/openhabconfig'); +var Event = require('../models/event'); +var Item = require('../models/item'); +var UserDevice = require('../models/userdevice'); +var UserAccount = require('../models/useraccount'); +var Notification = require('../models/notification'); +var AccessLog = require('../models/accesslog'); +var OpenhabAccessLog = require('../models/openhabaccesslog'); +var Invitation = require('../models/invitation'); +var Myohstat = require('../models/myohstat'); + +module.exports = new cronJob('00 */5 * * * *', function() { + logger.info("openHAB-cloud: every5min statistics collection job started"); + Openhab.count({}, function(err, openhabCount) { + if (!err) { + Openhab.count({status: 'online'}, function(err, openhabOnlineCount) { + if (!err) { + User.count({}, function(err, userCount) { + if (!err) { + Invitation.count({used:true}, function(err, invitationUsedCount) { + if (!err) { + Invitation.count({used:false}, function(err, invitationUnusedCount) { + if (!err) { + UserDevice.count({}, function(err, userDeviceCount) { + if (!err) { + var newStat = new Myohstat({uC: userCount, oC: openhabCount, + ooC: openhabOnlineCount, iuC: invitationUsedCount, + iuuC: invitationUnusedCount, udC: userDeviceCount}); + newStat.save(); + // Set current statistics to redis + redis.mset(["openhabCount", openhabCount, "openhabOnlineCount", openhabOnlineCount, + "userCount", userCount, "invitationUsedCount", invitationUsedCount, + "invitationUnusedCount", invitationUnusedCount, + "userDeviceCount", userDeviceCount, "last5MinStatTimestamp", new Date()], function(err, result) { + logger.info("openHAB-cloud: every5min statistics collection job finished"); + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); +}); diff --git a/logger.js b/logger.js new file mode 100644 index 0000000..afba882 --- /dev/null +++ b/logger.js @@ -0,0 +1,19 @@ +/* + This module maintains logger for openhab-cloud application and it's components + Logging is sent to console (with timestamp) and openhab Loggly (without timestamp) + as plain text. + */ + +var winston = require('winston'); + +var logger = new (winston.Logger)({ + transports: [ + new (winston.transports.Console)({json: false, timestamp: true, level: "debug"}) + ], + exceptionHandlers : [ + new (winston.transports.Console)({json: false, timestamp: true, level: "debug"}) + ], + exitOnError : false +}); + +module.exports = logger; diff --git a/mailchimp-export.js b/mailchimp-export.js new file mode 100644 index 0000000..1559c19 --- /dev/null +++ b/mailchimp-export.js @@ -0,0 +1,18 @@ +var mongoose = require('mongoose') + , logger = require('./logger.js'); +var User = require('./models/user'); +var config = require('./config.json'); + +mongoose.connect('mongodb://' + config.mongodb.user + ':' + config.mongodb.password + '@' + config.mongodb.hosts[0] + '/openhab', function(err) { + if (err) { + logger.error("openHAB-cloud: mongo connection error: " + err); + } else { + logger.info("openHAB-cloud: connected to mongodb"); + User.find({role:'master'}, function(error, users) { + for (var i=0; i") + process.exit(0); +} diff --git a/makeinvites.js b/makeinvites.js new file mode 100644 index 0000000..2ee8c8c --- /dev/null +++ b/makeinvites.js @@ -0,0 +1,33 @@ +var config = require('./config.json'); + +// MongoDB connection +var mongoose = require('mongoose'); +var uuid = require('uuid'); +mongoose.connect('mongodb://' + config.mongodb.user + ':' + config.mongodb.password + '@' + config.mongodb.hosts[0] + '/openhab'); +var mongooseTypes = require("mongoose-types"); +mongooseTypes.loadTypes(mongoose); + +// Mongoose models +var User = require('./models/user'); +var Openhab = require('./models/openhab'); +var Event = require('./models/event'); +var Invitation = require('./models/invitation'); + +console.log("Making 10 invitations!"); +for (i=0; i<10; i++) { + invitationCode = uuid.v1(); + invite = new Invitation({code: invitationCode, email: "openhab@openhab.org"}); + console.log("openHAB-cloud: New invitation code " + invitationCode); + invite.save(function(err, invitation) { + console.log("callback"); + if (err) { + console.log("Error"); + } else { + console.log("Saved: " + invitation); + } + }); +} + +//mongoose.disconnect(); +console.log("Complete!"); +//process.exit(); diff --git a/models/accesslog.js b/models/accesslog.js new file mode 100644 index 0000000..7578903 --- /dev/null +++ b/models/accesslog.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var AccessLogSchema = new Schema({ + openhab: ObjectId, + user: ObjectId, + path: String, + method: String, + remoteHost: String, + whenStarted: { type: Date, default: Date.now }, + whenFinished: Date +}); + +AccessLogSchema.index({openhab:1, user:1, path:1, whenStarted:1}); + +module.exports = mongoose.model('AccessLog', AccessLogSchema); diff --git a/models/emailverification.js b/models/emailverification.js new file mode 100644 index 0000000..c6177f3 --- /dev/null +++ b/models/emailverification.js @@ -0,0 +1,59 @@ +var mongoose = require('mongoose') + ,Schema = mongoose.Schema + ,ObjectId = mongoose.SchemaTypes.ObjectId + ,logger = require('../logger.js') + ,uuid = require('uuid') + ,mailer = require('../mailer'); + +var EmailVerificationSchema = new Schema({ + code: String, + email: String, + user: {type: ObjectId, ref: 'User'}, + used: {type: Boolean, default: false}, + created: { type: Date, default: Date.now } +}); + +// This is a static method to create and send a new invitation in one shot! + +EmailVerificationSchema.static('send', function(user, cb) { + var emailVerification = new this; + emailVerification.code = uuid.v1(); + emailVerification.user = user.id; + emailVerification.email = user.username; + emailVerification.save(function(err, emailVerificationSaved) { + if (err) { + logger.error('Error: ' + err); + cb(err, null); + } else { + var locals = { + email: emailVerificationSaved.email, + code: emailVerificationSaved.code + }; + mailer.sendEmail(emailVerificationSaved.email, 'My openHAB account activation', 'activation-email', locals, function(error) { + if (error) { + logger.error('Error: ' + error); + cb(error, null); + } else { + cb(null, emailVerificationSaved); + } + }); + } + }); +}); + +EmailVerificationSchema.method('resend', function (cb) { + var locals = { + email: this.email, + code: this.code + }; + mailer.sendEmail(this.email, 'My openHAB account activation', 'activation-email', locals, function(error) { + if (error) { + logger.error('Error: ' + error); + cb(error); + } else { + cb(null); + } + }); +}); + +module.exports = mongoose.model('EmailVerification', EmailVerificationSchema); diff --git a/models/enrollment.js b/models/enrollment.js new file mode 100644 index 0000000..ee27f1c --- /dev/null +++ b/models/enrollment.js @@ -0,0 +1,14 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var EnrollmentSchema = new Schema({ + email: String, + platform: String, + javaExp: String, + description: String, + created: { type: Date, default: Date.now }, + invited: { type: Date } +}); + +module.exports = mongoose.model('Enrollment', EnrollmentSchema); diff --git a/models/event.js b/models/event.js new file mode 100644 index 0000000..e6411d1 --- /dev/null +++ b/models/event.js @@ -0,0 +1,40 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +const goodColor = "#e0f0d5"; +const badColor = "#f1dede"; +const infoColor = "#daedf8"; + +var EventSchema = new Schema({ + openhab: ObjectId, + source: String, + oldStatus: String, + status: String, + numericStatus: Number, + oldNumericStatus: Number, + color: String, + when: {type: Date, default: Date.now} +}, { + versionKey: false, + safe: false, + validateBeforeSave: false, + strict: false +}); + +// Index for event list reads +EventSchema.index({openhab: 1, when: 1}); +EventSchema.index({openhab: 1, source: 1}); +EventSchema.index({openhab: 1, source: 1, numericStatus: 1, oldNumericStatus: 1}); + +// Returns #xxxxxx color code based on event color +EventSchema.virtual('colorHex').get(function () { + if (this.color == 'good') + return goodColor; + else if (this.color == 'bad') + return badColor; + else if (this.color == 'info') + return infoColor; +}); + +module.exports = mongoose.model('Event', EventSchema); diff --git a/models/invitation.js b/models/invitation.js new file mode 100644 index 0000000..8f48a0b --- /dev/null +++ b/models/invitation.js @@ -0,0 +1,58 @@ +var mongoose = require('mongoose') + ,Schema = mongoose.Schema + ,ObjectId = mongoose.SchemaTypes.ObjectId + ,logger = require('../logger.js') + ,uuid = require('uuid') + ,mailer = require('../mailer'); + +var InvitationSchema = new Schema({ + code: String, + email: String, + used: {type: Boolean, default: false}, + lastNotified: {type: Date}, + created: { type: Date, default: Date.now }, + activated: { type: Date } +}); + +// This is a static method to create and send a new invitation in one shot! + +InvitationSchema.static('send', function(email, cb) { + var invite = new this(); + invite.code = uuid.v1(); + invite.email = email; + invite.save(function(err, invitation) { + if (err) { + logger.error('Error: ' + err); + cb(err, null); + } else { + var locals = { + email: invite.email, + invitationCode: invite.code + }; + mailer.sendEmail(invite.email, 'My openHAB invitation', 'invitation-email', locals, function(error) { + if (error) { + cb(error, null); + } else { + cb(null, invite); + } + }); + } + }); + +}); + +InvitationSchema.method('resend', function (cb) { + var locals = { + email: this.email, + invitationCode: this.code + }; + mailer.sendEmail(this.email, 'My openHAB invitation', 'invitation-email', locals, function(error) { + if (error) { + cb(error); + } else { + cb(null); + } + }); +}); + +module.exports = mongoose.model('Invitation', InvitationSchema); diff --git a/models/item.js b/models/item.js new file mode 100644 index 0000000..172c553 --- /dev/null +++ b/models/item.js @@ -0,0 +1,27 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var ItemSchema = new Schema({ + openhab: ObjectId, // openHAB this item belongs to + name: String, // Item name + type: String, // Item type (Group, Switch, Number, etc) + label: String, // Item label ("Dinner lights") + groups: [ObjectId], // An array of ObjectIds of Group typed Items this Item belongs to + icon: String, // icon name for this Item + status: String, // Current Item status + prev_status: String, // Previous status value + last_update: Date, // Date/time of last Item status update + last_change: Date, // Date/time of last Item change + states: [Schema.Types.Mixed] // We cache last X (50?) states of the item in this array + // in a form of {when: Date, value: String}, latest values first in array +}, { + versionKey: false, + safe: false, + validateBeforeSave: false, + strict: false +}); + +ItemSchema.index({openhab:1, name:1}, { unique: true }); + +module.exports = mongoose.model('Item', ItemSchema); diff --git a/models/lostpassword.js b/models/lostpassword.js new file mode 100644 index 0000000..95c6324 --- /dev/null +++ b/models/lostpassword.js @@ -0,0 +1,15 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + + +var LostPasswordSchema = new Schema({ + user: ObjectId, + recoveryCode: String, + used: { type: Boolean, default: false }, + created: { type: Date, default: Date.now } +}); + +LostPasswordSchema.index({user:1, created:1}); + +module.exports = mongoose.model('LostPassword', LostPasswordSchema); diff --git a/models/myohstat.js b/models/myohstat.js new file mode 100644 index 0000000..96aabf0 --- /dev/null +++ b/models/myohstat.js @@ -0,0 +1,18 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var MyohstatSchema = new Schema({ + w: { type: Date, default: Date.now }, // Date/Time of the record + uC: Number, // Users count + oC: Number, // openHABs count + ooC: Number, // openHABs online count + iuC: Number, // Used invitations count + iuuC: Number, // Unused invitations count + udC: Number, // User devices count + ioS: Number // Number of connected socket.io sockets +}); + +MyohstatSchema.index({w:1}); + +module.exports = mongoose.model('Myohstat', MyohstatSchema); diff --git a/models/notification.js b/models/notification.js new file mode 100644 index 0000000..64d7062 --- /dev/null +++ b/models/notification.js @@ -0,0 +1,16 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var NotificationSchema = new Schema({ + user: {type: ObjectId, ref: 'User'}, + message: String, + icon: String, + severity: String, + acknowledged: Boolean, + created: { type: Date, default: Date.now } +}); + +NotificationSchema.index({user:1, created:1}); + +module.exports = mongoose.model('Notification', NotificationSchema); diff --git a/models/oauth2client.js b/models/oauth2client.js new file mode 100644 index 0000000..065d191 --- /dev/null +++ b/models/oauth2client.js @@ -0,0 +1,19 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OAuth2ClientSchema = new Schema({ + name: String, // Client name + description: String, + homeUrl: String, + icon: String, + clientId: String, // Client oauth2 id + clientSecret: String, // Client oauth2 secret + active: { type: Boolean, default: true}, // If this client is active? + created: { type: Date, default: Date.now }, // When client was created + last_change: Date // Date/time of last client change +}); + +OAuth2ClientSchema.index({clientId:1}, { unique: true }); // to find client by client id + +module.exports = mongoose.model('OAuth2Client', OAuth2ClientSchema); diff --git a/models/oauth2code.js b/models/oauth2code.js new file mode 100644 index 0000000..d6dfae7 --- /dev/null +++ b/models/oauth2code.js @@ -0,0 +1,19 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OAuth2CodeSchema = new Schema({ + user: ObjectId, // openhab-cloud user this code belongs to + oAuthClient: ObjectId, // openhab-cloud OAuth2 Client this code was created for + code: String, // code itself + scope: [String], // code scope (what can be done with this code?) + redirectURI: String, // redirect URI + valid: { type: Boolean, default: true}, // Is this code is active? + created: { type: Date, default: Date.now } // When code was created +}); + +OAuth2CodeSchema.index({code: 1, oAuthClient:1}, { unique: false }); // to find code by code and client +OAuth2CodeSchema.index({code: 1, oAuthClient:1, redirectURI:1}, { unique: false }); // to find token by token, client and URI +OAuth2CodeSchema.index({user: 1}, { unique: false }); // to find token by user + +module.exports = mongoose.model('OAuth2Code', OAuth2CodeSchema); diff --git a/models/oauth2scope.js b/models/oauth2scope.js new file mode 100644 index 0000000..451d089 --- /dev/null +++ b/models/oauth2scope.js @@ -0,0 +1,14 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OAuth2ScopeSchema = new Schema({ + name: String, // name of the scope + description: String, // description of what does this scope permits to do for user + valid: { type: Boolean, default: true}, // Is this scope is active? + created: { type: Date, default: Date.now } // When scope was created +}); + +OAuth2ScopeSchema.index({name: 1}, { unique: true }); // to find token by token and client + +module.exports = mongoose.model('OAuth2Scope', OAuth2ScopeSchema); diff --git a/models/oauth2token.js b/models/oauth2token.js new file mode 100644 index 0000000..e7348f0 --- /dev/null +++ b/models/oauth2token.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OAuth2TokenSchema = new Schema({ + user: ObjectId, // openhab-cloud user this token belongs to + oAuthClient: {type: ObjectId, ref: 'OAuth2Client'}, // openhab-cloud OAuth2 Client this token was created for + token: String, // token + scope: [String], // token scope (what can be done with this token?) + valid: { type: Boolean, default: true}, // Is this token is active? + created: { type: Date, default: Date.now } // When token was created +}); + +OAuth2TokenSchema.index({token: 1, oAuthClient:1}, { unique: false }); // to find token by token and client +OAuth2TokenSchema.index({user: 1}, { unique: false }); // to find token by user + +module.exports = mongoose.model('OAuth2Token', OAuth2TokenSchema); diff --git a/models/openhab.js b/models/openhab.js new file mode 100644 index 0000000..dc04676 --- /dev/null +++ b/models/openhab.js @@ -0,0 +1,42 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema, + ObjectId = mongoose.SchemaTypes.ObjectId, + OpenhabConfig = require('./openhabconfig') + +var OpenhabSchema = new Schema({ + name: String, // A meaningfull name of openHAB + uuid: {type: String, unique: true}, // openHAB generated UUID + secret: String, // openHAB generated secret + config: Schema.Types.Mixed, // openhab.cfg + owner: {type: ObjectId }, // obsolate + account: {type: ObjectId}, // An account openHAB belongs to + openhabVersion: String, // openHAB version + myohVersion: String, // myopenhab bundle version + global_location: {type: [Number], index: '2d'}, // openHAB's global location + last_online: { type: Date }, // last seen this openHAB online + last_email_notification: {type: Date}, // last notification about openHAB being offline for long time + status: {type: String, default: "offline"} // current openHAB status (online/offline) +}); + +// Index for lookups by uuid +OpenhabSchema.index({uuid:1}); +// Index for lookups by owner +OpenhabSchema.index({account:1}); +// Index for lookups by status +OpenhabSchema.index({status:1, last_online:1}); + +OpenhabSchema.methods.authenticate = function(openhabUuid, openhabSecret, callback) { + this.model('Openhab').findOne({uuid: openhabUuid, secret: openhabSecret}, function(error, openhab) { + if (error) { + callback(error, false); + } else { + if (openhab) { + callback(null, true); + } else { + callback(null, false); + } + } + }); +} + +module.exports = mongoose.model('Openhab', OpenhabSchema); diff --git a/models/openhabaccesslog.js b/models/openhabaccesslog.js new file mode 100644 index 0000000..8ee92a7 --- /dev/null +++ b/models/openhabaccesslog.js @@ -0,0 +1,16 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OpenhabAccessLogSchema = new Schema({ + openhab: ObjectId, + remoteHost: String, + remoteVersion: String, + remoteMyohVersion: String, + whenStarted: { type: Date, default: Date.now }, + whenFinished: Date +}); + +OpenhabAccessLogSchema.index({openhab:1, whenStarted:1}); + +module.exports = mongoose.model('OpenhabAccessLog', OpenhabAccessLogSchema); diff --git a/models/openhabconfig.js b/models/openhabconfig.js new file mode 100644 index 0000000..652a162 --- /dev/null +++ b/models/openhabconfig.js @@ -0,0 +1,13 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var OpenhabConfigSchema = new Schema({ + openhab: ObjectId, + type: String, + name: String, + timestamp: Date, + config: Schema.Types.Mixed +}); + +module.exports = mongoose.model('OpenhabConfig', OpenhabConfigSchema); diff --git a/models/requestlog.js b/models/requestlog.js new file mode 100644 index 0000000..3155fe9 --- /dev/null +++ b/models/requestlog.js @@ -0,0 +1,16 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var RequestLogSchema = new Schema({ + id: Number, // Request uniq id + url: String, // Request url + openhab: ObjectId, // openHAB of the request + requestReceived: Date, // when request was received from mobile app + requestSent: Date, // when request was sent to openHAB + responseReceived: Date, // when response to request was received from openHAB + responseSent: Date, // when response to request was sent to mobile app + responseStatus: Number // Response HTTP response code +}); + +module.exports = mongoose.model('RequestLog', RequestLogSchema); diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..fd26fd8 --- /dev/null +++ b/models/user.js @@ -0,0 +1,103 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema, + bcrypt = require('bcrypt'), + Openhab = require('./openhab'), + Email = mongoose.SchemaTypes.Email, + UserAccount = require('./useraccount'), + ObjectId = mongoose.SchemaTypes.ObjectId; + +var UserSchema = new Schema({ + username: {type: String, unique: true}, + firstName: {type: String}, + lastName: {type: String}, + salt: { type: String, required: true }, + hash: { type: String, required: true }, + created: {type: Date, default: Date.now }, + active: {type: Boolean, default: true, required: true}, + role: {type: String}, + account: {type: ObjectId, ref: 'UserAccount'}, + group: {type: String}, + verifiedEmail: {type: Boolean, default: false}, + registered: { type: Date, default: Date.now }, + last_online: { type: Date, default: Date.now } +}); + +/*userSchema.plugin(passportLocalMongoose);*/ + +UserSchema.method('checkPassword', function (password, callback) { + bcrypt.compare(password, this.hash, callback); +}); + +UserSchema.virtual('password').get(function () { + return this._password; +}).set(function (password) { + this._password = password; + var salt = this.salt = bcrypt.genSaltSync(10); + this.hash = bcrypt.hashSync(password, salt); + }); + +UserSchema.static('register', function(username, password, cb) { + var newAccount = new UserAccount(); + var self = this; + newAccount.registered = new Date; + newAccount.modified = new Date; + newAccount.save(function(error) { + if (!error) { + var user = new self(); + user.username = username; + user.password = password; + user.role = 'master'; + user.account = newAccount.id; + user.save(function(error) { + if (!error) { + cb(null, user); + } else { + cb(error); + } + }); + } else { + cb(error); + } + }); +}); + +UserSchema.static('registerToAccount', function(username, password, account, role, cb) { + var newUser = new this(); + newUser.username = username; + newUser.password = password; + newUser.role = role; + newUser.account = account; + newUser.save(function(error) { + if (!error) { + cb(null, newUser); + } else { + cb(error); + } + }); +}); + +UserSchema.static('authenticate', function (username, password, callback) { + this.findOne({ username: username }).cache().exec(function(err, user) { + if (err) + return callback(err, false, {message: 'Authentication error'}); + if (!user) + return callback(null, false, {message: 'Unknown user or incorrect password'}); + user.checkPassword(password, function(err, passwordCorrect) { + if (err) + return callback(err, false, {message: 'Authentication error'}); + if (!passwordCorrect) + return callback(null, false, {message: 'Unknown user or incorrect password'}); + if (!user.active) + return callback(null, false, {message: 'User is not active'}); + return callback(null, user); + }); + }); +}); + +UserSchema.methods.openhab = function(callback) { + Openhab.findOne({account: this.account}).cache().exec(callback); +} + +UserSchema.index({account:1, role:1}); + +module.exports = mongoose.model('User', UserSchema); diff --git a/models/useraccount.js b/models/useraccount.js new file mode 100644 index 0000000..fbdafed --- /dev/null +++ b/models/useraccount.js @@ -0,0 +1,16 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema, + bcrypt = require('bcrypt'), + Openhab = require('./openhab'), + Email = mongoose.SchemaTypes.Email, + ObjectId = mongoose.SchemaTypes.ObjectId; + +var UserAccountSchema = new Schema({ + modified: {type: Date}, + registered: { type: Date } +}); + +// Index for lookups by owner, type and uniq id +UserAccountSchema.index({owner:1, deviceType:1, deviceId:1}); + +module.exports = mongoose.model('UserAccount', UserAccountSchema); diff --git a/models/userdevice.js b/models/userdevice.js new file mode 100644 index 0000000..242a5ca --- /dev/null +++ b/models/userdevice.js @@ -0,0 +1,32 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema, + bcrypt = require('bcrypt'), + Openhab = require('./openhab'), + Email = mongoose.SchemaTypes.Email, + ObjectId = mongoose.SchemaTypes.ObjectId; + +var UserDeviceSchema = new Schema({ + owner: {type: ObjectId, required: true}, + androidRegistration: {type: String}, + iosDeviceToken: {type: String}, + deviceType: {type: String}, + deviceModel: {type: String}, + deviceId: {type: String}, + globalLocation: {type: [Number], index: '2d'}, + globalAltitude: {type: Number}, + globalAccuracy: {type: Number}, + lastGlobalLocation: {type: Date}, + indoorLocation: {type: [Number], index: '2d'}, + lastIndoorLocation: {type: Date}, + lastUpdate: { type: Date }, + registered: { type: Date } +}); + +// Index for lookups by owner, type and uniq id +UserDeviceSchema.index({owner:1, deviceType:1, deviceId:1}); +// Index for lookups by android registration +UserDeviceSchema.index({androidRegistration:1}); +// Index for lookups by ios device token +UserDeviceSchema.index({iosDeviceToken:1}); + +module.exports = mongoose.model('UserDevice', UserDeviceSchema); diff --git a/models/userdevicelocationhistory.js b/models/userdevicelocationhistory.js new file mode 100644 index 0000000..d4db0a7 --- /dev/null +++ b/models/userdevicelocationhistory.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'), + Schema = mongoose.Schema; +var ObjectId = mongoose.SchemaTypes.ObjectId; + +var UserLocationHistorySchema = new Schema({ + userDevice: ObjectId, + when: {type: Date, default: Date.now}, + globalLocation: {type: [Number], index: '2d'}, + globalAccuracy: {type: Number}, + globalAltitude: {type: Number}, + indoorLocation: {type: [Number], index: '2d'} +}); + +// Index for event list reads +UserLocationHistorySchema.index({userDevice: 1, when: 1}); + +module.exports = mongoose.model('UserLocationHistory', UserLocationHistorySchema); diff --git a/oauth2.js b/oauth2.js new file mode 100644 index 0000000..2329f14 --- /dev/null +++ b/oauth2.js @@ -0,0 +1,234 @@ +var oauth2orize = require('oauth2orize') + , passport = require('passport') + , OAuth2Client = require('./models/oauth2client') + , OAuth2Code = require('./models/oauth2code') + , OAuth2Token = require('./models/oauth2token') + , OAuth2Scope = require('./models/oauth2scope') + , User = require('./models/user') + , BasicStrategy = require('passport-http').BasicStrategy + , ClientPasswordStrategy = require('passport-oauth2-client-password').Strategy + , BearerStrategy = require('passport-http-bearer').Strategy; + +var logger = require('./logger.js'); +var server = oauth2orize.createServer(); + +// A basic passport stategy for authorizing oauth2 client's requests + +passport.use(new BasicStrategy( + function(username, password, done) { + OAuth2Client.findOne({clientId: username}, function(error, client) { + if (error) { + return done(error); + } + if (!client) { + return done(null, false); + } + if (client.clientSecret != password) { + return done(null, false); + } + return done(null, client); + }); + } +)); + +// A client-password strategy for authorizing requests for tokens + +passport.use(new ClientPasswordStrategy( + function(clientId, clientSecret, done) { + OAuth2Client.findOne({clientId: clientId}, function(error, client) { + if (error) { + return done(error); + } + if (!client) { + return done(null, false); + } + if (client.clientSecret != clientSecret) { + return done(null, false); + } + return done(null, client); + }); + } +)); + +// A bearer strategy to authorize API requests by oauth2code + +passport.use(new BearerStrategy( + function(accessToken, done) { + OAuth2Token.findOne({token: accessToken}, function(error, oauth2token) { + if (error) { + return done(error); + } + if (!oauth2token) { + return done(null, false); + } + User.findOne({_id:oauth2token.user}, function(error, openhabUser) { + if (error) { + return done(error); + } + if (!openhabUser) { + return done(null, false); + } + var info = {scope: oauth2token.scope}; + done(null, openhabUser, info); + }); + }); + } +)); + + +// An application must supply serialization functions, which determine how the +// client object is serialized into the session. Typically this will be a +// simple matter of serializing the client's ID, and deserializing by finding +// the client by ID from the database. + +server.serializeClient(function(client, done) { + return done(null, client._id); +}); + +server.deserializeClient(function(id, done) { + OAuth2Client.findOne({_id: id}, function(error, client) { + if (error) { + logger.error("openHAB-cloud: deserializeClient: " + error); + return done(error); + } + return done(null, client); + }); +}); + +// Grant authorization codes. The callback takes the `client` requesting +// authorization, the `redirectURI` (which is used as a verifier in the +// subsequent exchange), the authenticated `user` granting access, and +// their response, which contains approved scope, duration, etc. as parsed by +// the application. The application issues a code, which is bound to these +// values, and will be exchanged for an access token. + +server.grant(oauth2orize.grant.code(function(client, redirectURI, user, ares, done) { + var code = uid(16) + var newOAuthCode = new OAuth2Code({user: user._id, oAuthClient: client._id, code: code, redirectURI: redirectURI, + scope: ares.scope}); + newOAuthCode.save(function(error) { + if (error) { + logger.error("openHAB-cloud: server.grant: " + error); + return done(error); + } + done(null, code); + }); +})); + +// Exchange authorization codes for access tokens. The callback accepts the +// `client`, which is exchanging `code` and any `redirectURI` from the +// authorization request for verification. If these values are validated, the +// application issues an access token on behalf of the user who authorized the +// code. + +server.exchange(oauth2orize.exchange.code(function(client, code, redirectURI, done) { + // Instead of finding the code and then checking client and redirectURI match + // we do all that in a single shot by looking code by code, client and redirectURI + OAuth2Code.findOne({code: code, oAuthClient: client._id, redirectURI: redirectURI}, function(error, oauth2code) { + if (error) { + logger.error("openHAB-cloud: server.exchange: " + error); + return done(error); + } + if (oauth2code == undefined) { + return done(null, false); + } + // Create new token + var token = uid(256); + var newOAuthToken = new OAuth2Token({token: token, user: oauth2code.user, oAuthClient: oauth2code.oAuthClient, + scope: oauth2code.scope}); + newOAuthToken.save(function(error) { + if (error) { + return done(error); + } + // Invalidate access code which was exchanged for token + oauth2code.valid = false; + oauth2code.save(function(error) { + if (error) { + return done(error); + } + done(null, token); + }); + }); + }); +})); + +exports.authorization = [ + server.authorization(function(clientId, redirectURI, done) { + OAuth2Client.findOne({clientId: clientId}, function(error, client) { + if (error) { + logger.error("openHAB-cloud: server.authorization " + error); + return done(error); + } +// if (redirectURI !== client.redirectURI) { +// return done(null, false); +// } + return done(null, client, redirectURI); + }); + }), + function(req, res){ + errormessages = req.flash('error'); + infomessages = req.flash('info'); + var scope = req.oauth2.req.scope; + OAuth2Scope.findOne({name: scope}, function(error, scope) { + if (error) { + req.flash('error', 'There was an error while processing your request'); + res.redirect('/'); + } else if (!scope) { + req.flash('info', 'The application requested access to unknown scope'); + res.redirect('/'); + } else { + res.render('oauth2dialog', {title: "openHAB", user: req.user, errormessages: errormessages, + infomessages: infomessages, transactionID: req.oauth2.transactionID, user: req.user, client: req.oauth2.client, + scope: scope}); + } + }); + } +] + +exports.decision = [ + server.decision(function(req, done) { + return done(null, { scope: req.oauth2.req.scope }) + }) +] + +exports.token = [ + passport.authenticate(['basic', 'oauth2-client-password'], { session: false }), + server.token(), + server.errorHandler() +] + +/** + * Return a unique identifier with the given `len`. + * + * utils.uid(10); + * // => "FDaS435D2z" + * + * @param {Number} len + * @return {String} + * @api private + */ + +function uid(len) { + var buf = [] + , chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + , charlen = chars.length; + + for (var i = 0; i < len; ++i) { + buf.push(chars[getRandomInt(0, charlen - 1)]); + } + + return buf.join(''); +}; + +/** + * Return a random int, used by `utils.uid()` + * + * @param {Number} min + * @param {Number} max + * @return {Number} + * @api private + */ + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..8607889 --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "openhabcloud", + "description": "openHAB cloud service main package", + "version": "0.0.2", + "private": true, + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "3.20.2", + "ejs": "0.8.4", + "less-middleware": "0.1.11", + "socket.io": "1.3.7", + "socket.io-client": "1.1.0", + "request": "2.16.6", + "mongoose": "4.4.8", + "mongoose-types": "1.0.3", + "passport": "0.1.18", + "passport-local": "1.0.0", + "bcrypt": "0.8.3", + "connect-mongodb": "1.1.5", + "redis": "2.6.2", + "hiredis": "0.4", + "ejs-locals": "1.0.2", + "express-form": "0.8.x", + "connect-flash": "0.1.1", + "chokidar": "0.6.2", + "uuid": "1.4.1", + "node-gcm": "0.14.4", + "winston": "0.7.2", + "nodemailer": "0.5.2", + "connect-redis": "3.1.0", + "email-templates": "1.3.0", + "moment": "2.3.1", + "timezone": "0.0.23", + "time": "0.11.3", + "node-xmpp": "0.8.0", + "cron": "1.0.3", + "apn": "1.7.6", + "oauth2orize": "1.0.1", + "passport-http": "0.2.2", + "passport-oauth2-client-password": "0.1.2", + "passport-http-bearer": "1.0.1", + "socket.io-redis": "0.1.4", + "memwatch": "0.2.2", + "heapdump": "0.3.7", + "socket.io-redis": "1.0.0", + "mongoose-cache": "0.1.4", + "ratelimiter":"2.1.3", + "express-session":"1.14.1" + } +} diff --git a/public/bootstrap/css/bootstrap.css b/public/bootstrap/css/bootstrap.css new file mode 100755 index 0000000..410904d --- /dev/null +++ b/public/bootstrap/css/bootstrap.css @@ -0,0 +1,5502 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, +a:active { + outline: 0; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + /* Responsive images (ensure images don't scale beyond their parents) */ + + max-width: 100%; + /* Part 1: Set a maxium relative to the parent */ + + width: auto\9; + /* IE7-8 need help adjusting responsive images */ + + height: auto; + /* Part 2: Scale the height according to the width, otherwise you get stretching */ + + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} +#map_canvas img, +.google-maps img { + max-width: none; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; + line-height: 0; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; + line-height: 0; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} +small { + font-size: 85%; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: #999999; +} +a.muted:hover, +a.muted:focus { + color: #808080; +} +.text-warning { + color: #c09853; +} +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} +.text-error { + color: #b94a48; +} +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} +.text-info { + color: #3a87ad; +} +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} +.text-success { + color: #468847; +} +a.text-success:hover, +a.text-success:focus { + color: #356635; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +h2, +h3 { + line-height: 40px; +} +h1 { + font-size: 38.5px; +} +h2 { + font-size: 31.5px; +} +h3 { + font-size: 24.5px; +} +h4 { + font-size: 17.5px; +} +h5 { + font-size: 14px; +} +h6 { + font-size: 11.9px; +} +h1 small { + font-size: 24.5px; +} +h2 small { + font-size: 17.5px; +} +h3 small { + font-size: 14px; +} +h4 small { + font-size: 14px; +} +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: 20px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 20px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 10px; +} +.dl-horizontal { + *zoom: 1; +} +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + content: ""; + line-height: 0; +} +.dl-horizontal:after { + clear: both; +} +.dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 180px; +} +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + white-space: nowrap; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding-left: 9px; + padding-right: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +.label:empty, +.badge:empty { + display: none; +} +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #b94a48; +} +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} +.label-warning, +.badge-warning { + background-color: #f89406; +} +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} +.label-success, +.badge-success { + background-color: #468847; +} +.label-success[href], +.badge-success[href] { + background-color: #356635; +} +.label-info, +.badge-info { + background-color: #3a87ad; +} +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} +.btn-mini .label, +.btn-mini .badge { + top: 0; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; +} +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} +.table tbody tr.success > td { + background-color: #dff0d8; +} +.table tbody tr.error > td { + background-color: #f2dede; +} +.table tbody tr.warning > td { + background-color: #fcf8e3; +} +.table tbody tr.info > td { + background-color: #d9edf7; +} +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} +form { + margin: 0 0 20px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 15px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + vertical-align: middle; +} +input, +textarea, +.uneditable-input { + width: 206px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; + /* IE7 */ + + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} +select { + width: 220px; + border: 1px solid #cccccc; + background-color: #ffffff; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.uneditable-input, +.uneditable-textarea { + color: #999999; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} +.uneditable-textarea { + width: auto; + height: auto; +} +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} +.controls-row { + *zoom: 1; +} +.controls-row:before, +.controls-row:after { + display: table; + content: ""; + line-height: 0; +} +.controls-row:after { + clear: both; +} +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; + line-height: 0; +} +.form-actions:after { + clear: both; +} +.help-block, +.help-inline { + color: #595959; +} +.help-block { + display: block; + margin-bottom: 10px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + vertical-align: middle; + font-size: 0; + white-space: nowrap; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 10px; +} +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 180px; +} +.form-horizontal .help-block { + margin-bottom: 0; +} +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} +.form-horizontal .form-actions { + padding-left: 180px; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 12px; + margin-bottom: 0; + font-size: 14px; + line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #cccccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f89406; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: #0088cc; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} +.btn-group { + position: relative; + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + font-size: 0; + vertical-align: middle; + white-space: nowrap; + *margin-left: .3em; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + font-size: 0; + margin-top: 10px; + margin-bottom: 10px; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} +.btn-group > .btn-mini { + font-size: 10.5px; +} +.btn-group > .btn-small { + font-size: 11.9px; +} +.btn-group > .btn-large { + font-size: 17.5px; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} +.dropup .btn-large .caret { + border-bottom-width: 5px; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group-vertical > .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.nav { + margin-left: 0; + margin-bottom: 20px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li > a > img { + max-width: none; +} +.nav > .pull-right { + float: right; +} +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; + line-height: 0; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.nav .dropdown-toggle .caret { + border-top-color: #0088cc; + border-bottom-color: #0088cc; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; + line-height: 0; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.nav > .disabled > a { + color: #999999; +} +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.navbar { + overflow: visible; + margin-bottom: 20px; + *position: relative; + *z-index: 2; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + *zoom: 1; +} +.navbar-inner:before, +.navbar-inner:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-inner:after { + clear: both; +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; + overflow: visible; +} +.navbar .brand { + float: left; + display: block; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} +.navbar-link { + color: #777777; +} +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-left: 1px solid #f2f2f2; + border-right: 1px solid #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-search .search-query { + margin-bottom: 0; + padding: 4px 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.navbar-static-top { + position: static; + margin-bottom: 0; +} +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); + box-shadow: 0 1px 10px rgba(0,0,0,.1); +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + box-shadow: 0 -1px 10px rgba(0,0,0,.1); +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} +.navbar .nav > li { + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: transparent; + color: #333333; + text-decoration: none; +} +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e5e5e5; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .nav > li > .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .nav > li > .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + border-top: 6px solid #ffffff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555555; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); + border-color: #252525; +} +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} +.navbar-inverse .brand { + color: #999999; +} +.navbar-inverse .navbar-text { + color: #999999; +} +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + background-color: transparent; + color: #ffffff; +} +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} +.navbar-inverse .divider-vertical { + border-left-color: #111111; + border-right-color: #222222; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #111111; + color: #ffffff; +} +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #040404; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #999999; +} +.pagination { + margin: 20px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination ul > li { + display: inline; +} +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-top-left-radius: 3px; + -moz-border-radius-topleft: 3px; + border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + border-bottom-left-radius: 3px; +} +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topright: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; +} +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} +.pager { + margin: 20px 0; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, +.pager:after { + display: table; + content: ""; + line-height: 0; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: #fff; + cursor: default; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; + line-height: 0; +} +.thumbnails:after { + clear: both; +} +.row-fluid .thumbnails { + margin-left: 0; +} +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #555555; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, +.alert h4 { + color: #c09853; +} +.alert h4 { + margin: 0; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-success h4 { + color: #468847; +} +.alert-danger, +.alert-error { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-info h4 { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 100%; + color: #ffffff; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: inherit; + letter-spacing: -1px; +} +.hero-unit li { + line-height: 30px; +} +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media-list { + margin-left: 0; + list-style: none; +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.popover-title:empty { + display: none; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; + outline: none; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 10%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-header h3 { + margin: 0; + line-height: 30px; +} +.modal-body { + position: relative; + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; + line-height: 0; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + text-decoration: none; + color: #ffffff; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: default; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} +.dropdown-submenu.pull-left { + float: none; +} +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion { + margin-bottom: 20px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-toggle { + cursor: pointer; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} +.carousel-indicators .active { + background-color: #fff; +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; + line-height: 20px; +} +.carousel-caption h4 { + margin: 0 0 5px; +} +.carousel-caption p { + margin-bottom: 0; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +@-ms-viewport { + width: device-width; +} +.hidden { + display: none; + visibility: hidden; +} +.visible-phone { + display: none !important; +} +.visible-tablet { + display: none !important; +} +.hidden-desktop { + display: none !important; +} +.visible-desktop { + display: inherit !important; +} +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} +@media (max-width: 767px) { + body { + padding-left: 20px; + padding-right: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-left: -20px; + margin-right: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + clear: none; + width: auto; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + float: none; + display: block; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + left: 20px; + right: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; + } + .media .pull-left, + .media .pull-right { + float: none; + display: block; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + left: 10px; + right: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + line-height: 0; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + line-height: 0; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + margin-top: 5px; + padding: 0; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: none; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + overflow: hidden; + height: 0; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } +} +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/public/bootstrap/css/bootstrap.min.css b/public/bootstrap/css/bootstrap.min.css new file mode 100755 index 0000000..e87c187 --- /dev/null +++ b/public/bootstrap/css/bootstrap.min.css @@ -0,0 +1,731 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} +.clearfix:after{clear:both;} +.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} +.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} +#map_canvas img,.google-maps img{max-width:none;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} +label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;} +input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover,a:focus{color:#005580;text-decoration:underline;} +.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} +.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} +.row:after{clear:both;} +[class*="span"]{float:left;min-height:1px;margin-left:20px;} +.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.span12{width:940px;} +.span11{width:860px;} +.span10{width:780px;} +.span9{width:700px;} +.span8{width:620px;} +.span7{width:540px;} +.span6{width:460px;} +.span5{width:380px;} +.span4{width:300px;} +.span3{width:220px;} +.span2{width:140px;} +.span1{width:60px;} +.offset12{margin-left:980px;} +.offset11{margin-left:900px;} +.offset10{margin-left:820px;} +.offset9{margin-left:740px;} +.offset8{margin-left:660px;} +.offset7{margin-left:580px;} +.offset6{margin-left:500px;} +.offset5{margin-left:420px;} +.offset4{margin-left:340px;} +.offset3{margin-left:260px;} +.offset2{margin-left:180px;} +.offset1{margin-left:100px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} +.row-fluid:after{clear:both;} +.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} +.row-fluid [class*="span"]:first-child{margin-left:0;} +.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} +.row-fluid .span12{width:100%;*width:99.94680851063829%;} +.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} +.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} +.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} +.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} +.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} +.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} +.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} +.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} +.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} +.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} +.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} +.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} +.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} +.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} +.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} +.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} +.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} +.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} +.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} +.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} +.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} +.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} +.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} +.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} +.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} +.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} +.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} +.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} +.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} +.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} +.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} +.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} +.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} +.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} +.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} +[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} +[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} +.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} +.container:after{clear:both;} +.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} +.container-fluid:after{clear:both;} +p{margin:0 0 10px;} +.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} +small{font-size:85%;} +strong{font-weight:bold;} +em{font-style:italic;} +cite{font-style:normal;} +.muted{color:#999999;} +a.muted:hover,a.muted:focus{color:#808080;} +.text-warning{color:#c09853;} +a.text-warning:hover,a.text-warning:focus{color:#a47e3c;} +.text-error{color:#b94a48;} +a.text-error:hover,a.text-error:focus{color:#953b39;} +.text-info{color:#3a87ad;} +a.text-info:hover,a.text-info:focus{color:#2d6987;} +.text-success{color:#468847;} +a.text-success:hover,a.text-success:focus{color:#356635;} +.text-left{text-align:left;} +.text-right{text-align:right;} +.text-center{text-align:center;} +h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} +h1,h2,h3{line-height:40px;} +h1{font-size:38.5px;} +h2{font-size:31.5px;} +h3{font-size:24.5px;} +h4{font-size:17.5px;} +h5{font-size:14px;} +h6{font-size:11.9px;} +h1 small{font-size:24.5px;} +h2 small{font-size:17.5px;} +h3 small{font-size:14px;} +h4 small{font-size:14px;} +.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} +ul,ol{padding:0;margin:0 0 10px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +li{line-height:20px;} +ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} +ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;} +dl{margin-bottom:20px;} +dt,dd{line-height:20px;} +dt{font-weight:bold;} +dd{margin-left:10px;} +.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} +.dl-horizontal:after{clear:both;} +.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.dl-horizontal dd{margin-left:180px;} +hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} +abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} +abbr.initialism{font-size:90%;text-transform:uppercase;} +blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25;} +blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +blockquote.pull-right small:before{content:'';} +blockquote.pull-right small:after{content:'\00A0 \2014';} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} +code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;} +pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} +pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;} +.pre-scrollable{max-height:340px;overflow-y:scroll;} +.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} +.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} +.label:empty,.badge:empty{display:none;} +a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;} +.label-important,.badge-important{background-color:#b94a48;} +.label-important[href],.badge-important[href]{background-color:#953b39;} +.label-warning,.badge-warning{background-color:#f89406;} +.label-warning[href],.badge-warning[href]{background-color:#c67605;} +.label-success,.badge-success{background-color:#468847;} +.label-success[href],.badge-success[href]{background-color:#356635;} +.label-info,.badge-info{background-color:#3a87ad;} +.label-info[href],.badge-info[href]{background-color:#2d6987;} +.label-inverse,.badge-inverse{background-color:#333333;} +.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} +.btn .label,.btn .badge{position:relative;top:-1px;} +.btn-mini .label,.btn-mini .badge{top:0;} +table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} +.table th{font-weight:bold;} +.table thead th{vertical-align:bottom;} +.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} +.table tbody+tbody{border-top:2px solid #dddddd;} +.table .table{background-color:#ffffff;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} +.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} +.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;} +.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;} +.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} +.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;} +.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;} +table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} +.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} +.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} +.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} +.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} +.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} +.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} +.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} +.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} +.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} +.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} +.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} +.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} +.table tbody tr.success>td{background-color:#dff0d8;} +.table tbody tr.error>td{background-color:#f2dede;} +.table tbody tr.warning>td{background-color:#fcf8e3;} +.table tbody tr.info>td{background-color:#d9edf7;} +.table-hover tbody tr.success:hover>td{background-color:#d0e9c6;} +.table-hover tbody tr.error:hover>td{background-color:#ebcccc;} +.table-hover tbody tr.warning:hover>td{background-color:#faf2cc;} +.table-hover tbody tr.info:hover>td{background-color:#c4e3f3;} +form{margin:0 0 20px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} +label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} +input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +label{display:block;margin-bottom:5px;} +select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} +input,textarea,.uneditable-input{width:206px;} +textarea{height:auto;} +textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} +input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;} +input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} +select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} +select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +.uneditable-input{overflow:hidden;white-space:nowrap;} +.uneditable-textarea{width:auto;height:auto;} +input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} +input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} +input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} +.radio,.checkbox{min-height:20px;padding-left:20px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} +.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} +input,textarea,.uneditable-input{margin-left:0;} +.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} +input.span12,textarea.span12,.uneditable-input.span12{width:926px;} +input.span11,textarea.span11,.uneditable-input.span11{width:846px;} +input.span10,textarea.span10,.uneditable-input.span10{width:766px;} +input.span9,textarea.span9,.uneditable-input.span9{width:686px;} +input.span8,textarea.span8,.uneditable-input.span8{width:606px;} +input.span7,textarea.span7,.uneditable-input.span7{width:526px;} +input.span6,textarea.span6,.uneditable-input.span6{width:446px;} +input.span5,textarea.span5,.uneditable-input.span5{width:366px;} +input.span4,textarea.span4,.uneditable-input.span4{width:286px;} +input.span3,textarea.span3,.uneditable-input.span3{width:206px;} +input.span2,textarea.span2,.uneditable-input.span2{width:126px;} +input.span1,textarea.span1,.uneditable-input.span1{width:46px;} +.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} +.controls-row:after{clear:both;} +.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} +.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} +input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} +.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} +.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} +.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} +.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} +input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} +.form-actions:after{clear:both;} +.help-block,.help-inline{color:#595959;} +.help-block{display:block;margin-bottom:10px;} +.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} +.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px;} +.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} +.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} +.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} +.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} +.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .btn-group:first-child{margin-left:0;} +input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} +.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} +.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} +.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} +.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} +.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} +.control-group{margin-bottom:10px;} +legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} +.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} +.form-horizontal .help-block{margin-bottom:0;} +.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;} +.form-horizontal .form-actions{padding-left:180px;} +.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} +.btn:active,.btn.active{background-color:#cccccc \9;} +.btn:first-child{*margin-left:0;} +.btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;} +.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} +.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;} +.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +.btn-block+.btn-block{margin-top:5px;} +input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} +.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} +button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} +button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} +button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} +.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;} +.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;} +.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;} +.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group>.btn+.btn{margin-left:-1px;} +.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px;} +.btn-group>.btn-mini{font-size:10.5px;} +.btn-group>.btn-small{font-size:11.9px;} +.btn-group>.btn-large{font-size:17.5px;} +.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} +.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} +.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} +.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} +.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} +.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} +.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} +.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} +.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} +.btn .caret{margin-top:8px;margin-left:0;} +.btn-large .caret{margin-top:6px;} +.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} +.btn-mini .caret,.btn-small .caret{margin-top:8px;} +.dropup .btn-large .caret{border-bottom-width:5px;} +.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} +.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;} +.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} +.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav{margin-left:0;margin-bottom:20px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;} +.nav>li>a>img{max-width:none;} +.nav>.pull-right{float:right;} +.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} +.nav li+.nav-header{margin-top:9px;} +.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list>li>a{padding:3px 15px;} +.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} +.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} +.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580;} +.nav-tabs .dropdown-toggle .caret{margin-top:8px;} +.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} +.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} +.tabbable:after{clear:both;} +.tab-content{overflow:auto;} +.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below>.nav-tabs{border-top:1px solid #ddd;} +.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;} +.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} +.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.nav>.disabled>a{color:#999999;} +.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;} +.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;} +.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} +.navbar-inner:after{clear:both;} +.navbar .container{width:auto;} +.nav-collapse.collapse{height:auto;overflow:visible;} +.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;} +.navbar-text{margin-bottom:0;line-height:40px;color:#777777;} +.navbar-link{color:#777777;}.navbar-link:hover,.navbar-link:focus{color:#333333;} +.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} +.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} +.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} +.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.navbar-fixed-top{top:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} +.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;margin-right:0;} +.navbar .nav>li{float:left;} +.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} +.navbar .nav .dropdown-toggle .caret{margin-top:8px;} +.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} +.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} +.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} +.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} +.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} +.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;} +.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} +.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} +.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} +.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} +.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} +.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;} +.navbar-inverse .brand{color:#999999;} +.navbar-inverse .navbar-text{color:#999999;} +.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} +.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} +.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;} +.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} +.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} +.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} +.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;} +.breadcrumb>.active{color:#999999;} +.pagination{margin:20px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination ul>li{display:inline;} +.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} +.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} +.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} +.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;} +.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} +.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} +.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} +.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} +.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px;} +.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;} +.pager .next>a,.pager .next>span{float:right;} +.pager .previous>a,.pager .previous>span{float:left;} +.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} +.thumbnails:after{clear:both;} +.row-fluid .thumbnails{margin-left:0;} +.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} +.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} +a.thumbnail:hover,a.thumbnail:focus{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;color:#555555;} +.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert h4{color:#c09853;} +.alert h4{margin:0;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} +.alert-success h4{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} +.alert-danger h4,.alert-error h4{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} +.alert-info h4{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} +.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);} +.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);} +.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);} +.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);} +.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} +.hero-unit li{line-height:30px;} +.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} +.media,.media .media{margin-top:15px;} +.media:first-child{margin-top:0;} +.media-object{display:block;} +.media-heading{margin:0 0 5px;} +.media>.pull-left{margin-right:10px;} +.media>.pull-right{margin-left:10px;} +.media-list{margin-left:0;list-style:none;} +.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-3px;padding:5px 0;} +.tooltip.right{margin-left:3px;padding:0 5px;} +.tooltip.bottom{margin-top:3px;padding:5px 0;} +.tooltip.left{margin-left:-3px;padding:0 5px;} +.tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;} +.popover.right{margin-left:10px;} +.popover.bottom{margin-top:10px;} +.popover.left{margin-left:-10px;} +.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;} +.popover-content{padding:9px 14px;} +.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;} +.popover .arrow{border-width:11px;} +.popover .arrow:after{border-width:10px;content:"";} +.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;} +.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;} +.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;} +.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:10%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-header h3{margin:0;line-height:30px;} +.modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;} +.modal-form{margin-bottom:0;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} +.modal-footer:after{clear:both;} +.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} +.modal-footer .btn-group .btn+.btn{margin-left:-1px;} +.modal-footer .btn-block+.btn-block{margin-left:0;} +.dropup,.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} +.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} +.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} +.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} +.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;} +.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;} +.open{*z-index:1000;}.open>.dropdown-menu{display:block;} +.pull-right>.dropdown-menu{right:0;left:auto;} +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} +.dropdown-submenu{position:relative;} +.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.dropdown-submenu:hover>.dropdown-menu{display:block;} +.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;} +.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} +.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} +.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} +.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion{margin-bottom:20px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-toggle{cursor:pointer;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:20px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;} +.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;} +.carousel-inner>.active{left:0;} +.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;} +.carousel-inner>.next{left:100%;} +.carousel-inner>.prev{left:-100%;} +.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;} +.carousel-inner>.active.left{left:-100%;} +.carousel-inner>.active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;} +.carousel-indicators .active{background-color:#fff;} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} +.carousel-caption h4{margin:0 0 5px;} +.carousel-caption p{margin-bottom:0;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} +button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} +.affix{position:fixed;} +.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} +.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} +@-ms-viewport{width:device-width;}.hidden{display:none;visibility:hidden;} +.visible-phone{display:none !important;} +.visible-tablet{display:none !important;} +.hidden-desktop{display:none !important;} +.visible-desktop{display:inherit !important;} +@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}.visible-print{display:none !important;} +@media print{.visible-print{display:inherit !important;} .hidden-print{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12,textarea.span12,.uneditable-input.span12{width:710px;} input.span11,textarea.span11,.uneditable-input.span11{width:648px;} input.span10,textarea.span10,.uneditable-input.span10{width:586px;} input.span9,textarea.span9,.uneditable-input.span9{width:524px;} input.span8,textarea.span8,.uneditable-input.span8{width:462px;} input.span7,textarea.span7,.uneditable-input.span7{width:400px;} input.span6,textarea.span6,.uneditable-input.span6{width:338px;} input.span5,textarea.span5,.uneditable-input.span5{width:276px;} input.span4,textarea.span4,.uneditable-input.span4{width:214px;} input.span3,textarea.span3,.uneditable-input.span3{width:152px;} input.span2,textarea.span2,.uneditable-input.span2{width:90px;} input.span1,textarea.span1,.uneditable-input.span1{width:28px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/public/bootstrap/img/glyphicons-halflings-white.png b/public/bootstrap/img/glyphicons-halflings-white.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/public/bootstrap/img/glyphicons-halflings.png b/public/bootstrap/img/glyphicons-halflings.png new file mode 100755 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/public/bootstrap/js/bootstrap-carousel.js b/public/bootstrap/js/bootstrap-carousel.js new file mode 100755 index 0000000..2fa6939 --- /dev/null +++ b/public/bootstrap/js/bootstrap-carousel.js @@ -0,0 +1,62 @@ +var extensionMethods = { + + slide: function (type, next) { + if(!$.support.transition && this.$element.hasClass('slide')) { + this.$element.find('.item').stop(true, true); //Finish animation and jump to end. + } + var $active = this.$element.find('.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e = $.Event('slide') + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + if ($next.hasClass('active')) return + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + }else if(!$.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.animate({left: (direction == 'right' ? '100%' : '-100%')}, 600, function(){ + $active.removeClass('active') + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + $next.addClass(type).css({left: (direction == 'right' ? '-100%' : '100%')}).animate({left: '0'}, 600, function(){ + $next.removeClass(type).addClass('active') + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + }; + + $.extend(true, $[ "fn" ][ "carousel" ][ "Constructor" ].prototype, extensionMethods); \ No newline at end of file diff --git a/public/bootstrap/js/bootstrap.js b/public/bootstrap/js/bootstrap.js new file mode 100755 index 0000000..13dd90c --- /dev/null +++ b/public/bootstrap/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery); +/* ========================================================= + * bootstrap-modal.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(''); + actli.find('.tp-half-one').clone(true).appendTo(actli).addClass("tp-half-two"); + actli.find('.tp-half-two').removeClass('tp-half-one'); + actli.find('.tp-half-two').wrapInner('
'); + + // ANIMATE THE CUTS + actli.find('.tp-half-one').css({ + 'width':opt.width+"px", + 'height':opt.height/2+"px", + 'overflow':'hidden', + 'position':'absolute', + 'top':'0px', + 'left':'0px' + }); + actli.find('.tp-half-two').css({ + 'width':opt.width+"px", + 'height':opt.height/2+"px", + 'overflow':'hidden', + 'position':'absolute', + 'top':opt.height/2+'px', + 'left':'0px' + }); + actli.find('.tp-half-two .tp-offset').css({ + 'position':'absolute', + 'top':(0-opt.height/2)+'px', + 'left':'0px' + }); + + // Delegate .transition() calls to .animate() + // if the browser can't do CSS transitions. + if (!$.support.transition) { + + actli.find('.tp-half-one').animate({ + 'opacity':0, + 'top':(0-opt.height/2)+"px" + },{ + duration: 500, + queue:false + }); + actli.find('.tp-half-two').animate({ + 'opacity':0, + 'top':(opt.height)+"px" + },{ + duration: 500, + queue:false + }); + } else { + var ro1=Math.round(Math.random()*40-20); + var ro2=Math.round(Math.random()*40-20); + var sc1=Math.random()*1+1; + var sc2=Math.random()*1+1; + actli.find('.tp-half-one').transition({ + opacity:1, + scale:sc1, + rotate:ro1, + y:(0-opt.height/1.4)+"px" + },800,'in'); + actli.find('.tp-half-two').transition({ + opacity:1, + scale:sc2, + rotate:ro2, + y:(0+opt.height/1.4)+"px" + },800,'in'); + + if (actli.html()!=null) nextli.transition({ + scale:0.8, + x:opt.width*0.1, + y:opt.height*0.1, + rotate:ro1 + },0).transition({ + rotate:0, + scale:1, + x:0, + y:0 + },600,'snap'); + } + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + setTimeout(function() { + + + // CLEAN UP BEFORE WE START + actli.css({ + 'position':'absolute', + 'z-index':18 + }); + nextli.css({ + 'position':'absolute', + 'z-index':20 + }); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + actsh.find('.defaultimg').css({ + 'opacity':0 + }); + if (actli.find('.tp-half-one').length>0) { + actli.find('.tp-half-one >img, .tp-half-one >div').unwrap(); + + } + actli.find('.tp-half-two').remove(); + opt.transition = 0; + opt.act = opt.next; + + },800); + nextli.css({ + 'opacity':1 + }); + + } + + //////////////////////////////////////// + // THE SLOTSLIDE - TRANSITION XVII. // + /////////////////////////////////////// + if (nexttrans==17) { // 3D CURTAIN HORIZONTAL + + masterspeed = masterspeed + 100; + if (opt.slots>10) opt.slots=10; + + nextli.css({ + 'opacity':1 + }); + + // PREPARE THE SLOTS HERE + prepareOneSlideV(actsh,opt,true); + prepareOneSlideV(nextsh,opt,false); + + //SET DEFAULT IMG UNVISIBLE + nextsh.find('.defaultimg').css({ + 'opacity':0 + }); + //actsh.find('.defaultimg').css({'opacity':0}); + + + // ALL NEW SLOTS SHOULD BE SLIDED FROM THE LEFT TO THE RIGHT + + + nextsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.transition({ + opacity:0, + rotateY:350 , + rotateX:40, + perspective:'1400px' + },0); + setTimeout(function() { + ss.transition({ + opacity:1, + top:0, + left:0, + scale:1, + perspective:'150px', + rotate:0, + rotateY:0, + rotateX:0 + },masterspeed*2,function() { + + if (j==opt.slots-1) { + removeSlots(container,opt); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + + if (nextli.index()!=actli.index()) actsh.find('.defaultimg').css({ + 'opacity':0 + }); + opt.act=opt.next; + moveSelectedThumb(container); + + } + }); + },j*100); + }); + } + + + + //////////////////////////////////////// + // THE SLOTSLIDE - TRANSITION XVIII. // + /////////////////////////////////////// + if (nexttrans==18) { // 3D CURTAIN VERTICAL + + masterspeed = masterspeed + 100; + if (opt.slots>10) opt.slots=10; + + nextli.css({ + 'opacity':1 + }); + + // PREPARE THE SLOTS HERE + prepareOneSlide(actsh,opt,true); + prepareOneSlide(nextsh,opt,false); + + //SET DEFAULT IMG UNVISIBLE + nextsh.find('.defaultimg').css({ + 'opacity':0 + }); + //actsh.find('.defaultimg').css({'opacity':0}); + + + // ALL NEW SLOTS SHOULD BE SLIDED FROM THE LEFT TO THE RIGHT + + + nextsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.transition({ + rotateX:10 , + rotateY:310, + perspective:'1400px', + rotate:0, + opacity:0 + },0); + setTimeout(function() { + ss.transition({ + top:0, + left:0, + scale:1, + perspective:'150px', + rotate:0, + rotateY:0, + rotateX:0, + opacity:1 + },masterspeed*2,function() { + + if (j==opt.slots-1) { + removeSlots(container,opt); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + + if (nextli.index()!=actli.index()) actsh.find('.defaultimg').css({ + 'opacity':0 + }); + opt.act=opt.next; + moveSelectedThumb(container); + + } + }); + },j*100); + }); + } + + //////////////////////////////////////// + // THE SLOTSLIDE - TRANSITION XIX. // + /////////////////////////////////////// + if (nexttrans==19) { // CUBIC VERTICAL + masterspeed = masterspeed + 100; + if (opt.slots>10) opt.slots=10; + nextli.css({ + 'opacity':1 + }); + + // PREPARE THE SLOTS HERE + prepareOneSlide(actsh,opt,true); + prepareOneSlide(nextsh,opt,false); + + //SET DEFAULT IMG UNVISIBLE + nextsh.find('.defaultimg').css({ + 'opacity':0 + }); + //actsh.find('.defaultimg').css({'opacity':0}); + var chix=nextli.css('z-index'); + var chix2=actli.css('z-index'); + + //actli.css({'z-index':22}); + + + + // ALL NEW SLOTS SHOULD BE SLIDED FROM THE LEFT TO THE RIGHT + + + nextsh.find('.slotslide').each(function(j) { + var ss=$(this); + //ss.css({'overflow':'visible'}); + ss.parent().css({ + 'overflow':'visible' + }); + ss.css({ + 'background':'#333' + }); + if (direction==1) + ss.transition({ + opacity:0, + left:0, + top:opt.height/2, + perspective:opt.height*100, + rotate3d:'1, 0, 0, -90deg ' + },0); + else + ss.transition({ + opacity:0, + left:0, + top:0-opt.height/2, + perspective:opt.height*100, + rotate3d:'1, 0, 0, 90deg ' + },0); + + setTimeout(function() { + + ss.transition({ + opacity:1, + top:0, + rotate3d:' 1, 0, 0, 0deg ' + },masterspeed*2,function() { + + if (j==opt.slots-1) { + removeSlots(container,opt); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + + if (nextli.index()!=actli.index()) actsh.find('.defaultimg').css({ + 'opacity':0 + }); + opt.act=opt.next; + moveSelectedThumb(container); + + } + }); + },j*150); + + }); + + actsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.parent().css({ + 'overflow':'visible' + }); + ss.css({ + 'background':'#333' + }); + ss.transition({ + top:0, + perspective: opt.height*100, + rotate3d: '1, 0, 0, 0deg' + },0); + actsh.find('.defaultimg').css({ + 'opacity':0 + }); + setTimeout(function() { + if (direction==1) + ss.transition({ + opacity:0.6, + left:0, + top:0-opt.height/2, + rotate3d: '1, 0, 0, 90deg' + },masterspeed*2,function() {}); + else + ss.transition({ + opacity:0.6, + left:0, + top:(0+opt.height/2), + rotate3d: '1, 0, 0, -90deg' + },masterspeed*2,function() {}); + },j*150); + }); + } + + //////////////////////////////////////// + // THE SLOTSLIDE - TRANSITION XX. // + /////////////////////////////////////// + if (nexttrans==20) { // FLYIN + masterspeed = masterspeed + 100; + if (opt.slots>10) opt.slots=10; + + + + nextli.css({ + 'opacity':1 + }); + + // PREPARE THE SLOTS HERE + prepareOneSlideV(actsh,opt,true); + prepareOneSlideV(nextsh,opt,false); + + //SET DEFAULT IMG UNVISIBLE + nextsh.find('.defaultimg').css({ + 'opacity':0 + }); + //actsh.find('.defaultimg').css({'opacity':0}); + + + // ALL NEW SLOTS SHOULD BE SLIDED FROM THE LEFT TO THE RIGHT + + + nextsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.parent().css({ + 'overflow':'visible' + }); + + if (direction==1) + ss.transition({ + scale:0.8, + top:0, + left:0-opt.width, + perspective:opt.width, + rotate3d: '2, 5, 0, 110deg' + },0); + else + ss.transition({ + scale:0.8, + top:0, + left:0+opt.width, + perspective:opt.width, + rotate3d: '2, 5, 0, -110deg' + },0); + setTimeout(function() { + ss.transition({ + scale:0.8, + left:0, + perspective: opt.width, + rotate3d: '1, 5, 0, 0deg' + },masterspeed*2,'ease').transition({ + scale:1 + },200,'out',function() { + + if (j==opt.slots-1) { + removeSlots(container,opt); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + + if (nextli.index()!=actli.index()) actsh.find('.defaultimg').css({ + 'opacity':0 + }); + opt.act=opt.next; + moveSelectedThumb(container); + + } + }); + },j*100); + }); + + actsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.transition({ + scale:0.5, + left:0, + perspective: 500, + rotate3d: '1, 5, 0, 5deg' + },300,'in-out'); + actsh.find('.defaultimg').css({ + 'opacity':0 + }); + setTimeout(function() { + if (direction==1) + ss.transition({ + top:0, + left:opt.width/2, + perspective: opt.width, + rotate3d: '0, -3, 0, 70deg', + opacity:0 + },masterspeed*2,'out',function() {}); + else + ss.transition({ + top:0, + left:0-opt.width/2, + perspective: opt.width, + rotate3d: '0, -3, 0, -70deg', + opacity:0 + },masterspeed*2,'out',function() {}); + },j*100); + }); + } + + + //////////////////////////////////////// + // THE SLOTSLIDE - TRANSITION XX. // + /////////////////////////////////////// + if (nexttrans==21) { // TURNOFF + masterspeed = masterspeed + 100; + if (opt.slots>10) opt.slots=10; + + nextli.css({ + 'opacity':1 + }); + + // PREPARE THE SLOTS HERE + prepareOneSlideV(actsh,opt,true); + prepareOneSlideV(nextsh,opt,false); + + //SET DEFAULT IMG UNVISIBLE + nextsh.find('.defaultimg').css({ + 'opacity':0 + }); + //actsh.find('.defaultimg').css({'opacity':0}); + + + // ALL NEW SLOTS SHOULD BE SLIDED FROM THE LEFT TO THE RIGHT + + + nextsh.find('.slotslide').each(function(j) { + var ss=$(this); + if (direction==1) + ss.transition({ + top:0, + left:0-(opt.width/2), + perspective: opt.width*2, + rotate3d: '0, 100, 0, 90deg' + },0); + else + ss.transition({ + top:0, + left:0+(opt.width/2), + perspective: opt.width*2, + rotate3d: '0, 100, 0, -90deg' + },0); + setTimeout(function() { + ss.transition({ + left:0, + perspective: opt.width*2, + rotate3d: '0, 0, 0, 0deg' + },masterspeed*2,function() { + + if (j==opt.slots-1) { + removeSlots(container,opt); + nextsh.find('.defaultimg').css({ + 'opacity':1 + }); + + if (nextli.index()!=actli.index()) actsh.find('.defaultimg').css({ + 'opacity':0 + }); + opt.act=opt.next; + moveSelectedThumb(container); + + } + }); + },j*100); + }); + + actsh.find('.slotslide').each(function(j) { + var ss=$(this); + ss.transition({ + left:0, + perspective: opt.width*2, + rotate3d: '0, 0, 0, 0deg' + },0); + actsh.find('.defaultimg').css({ + 'opacity':0 + }); + setTimeout(function() { + if (direction==1) + ss.transition({ + top:0, + left:(opt.width/2), + perspective: opt.width, + rotate3d: '0, 1000, 0, -90deg' + },masterspeed*1.5,function() {}); + else + ss.transition({ + top:0, + left:(0-opt.width/2), + perspective: opt.width, + rotate3d: '0, 1000, 0, +90deg' + },masterspeed*1.5,function() {}); + + },j*100); + }); + } + + + var data={}; + data.slideIndex=opt.next+1; + container.trigger('revolution.slide.onchange',data); + container.trigger('revolution.slide.onvideostop'); + + + } + + ////////////////////////// + // REMOVE THE CAPTIONS // + ///////////////////////// + function removeTheCaptions(actli,opt) { + actli.find('.tp-caption').each(function(i) { + var nextcaption=actli.find('.tp-caption:eq('+i+')'); + nextcaption.stop(true,true); + clearTimeout(nextcaption.data('timer')); + clearTimeout(nextcaption.data('timer-end')); + + var easetype=nextcaption.data('easing'); + easetype="easeInOutSine"; + var ll = nextcaption.data('repx'); + var tt = nextcaption.data('repy'); + var oo = nextcaption.data('repo'); + var rot = nextcaption.data('rotate'); + var sca = nextcaption.data('scale'); + + + if (nextcaption.find('iframe').length>0) { + // VIMEO VIDEO PAUSE + try { + var ifr = nextcaption.find('iframe'); + var id = ifr.attr('id'); + var froogaloop = $f(id); + froogaloop.api("pause"); + } catch(e) {} + //YOU TUBE PAUSE + try { + var player=nextcaption.data('player'); + player.stopVideo(); + } catch(e) {} + + } + try { + if (rot!=undefined || sca!=undefined) + { + if (rot==undefined) rot=0; + if (sca==undefined) sca=1; + nextcaption.transition({ + 'rotate':rot, + 'scale':sca, + 'opacity':0, + 'left':ll+'px', + 'top':tt+"px" + },(nextcaption.data('speed')+10), function() { + nextcaption.removeClass('noFilterClass'); + nextcaption.css({ + 'visibility':'hidden' + }) + }); + } else { + + nextcaption.animate({ + 'opacity':0, + 'left':ll+'px', + 'top':tt+"px" + },{ + duration:(nextcaption.data('speed')+10), + easing:easetype, + complete:function() { + nextcaption.removeClass('noFilterClass'); + nextcaption.css({ + 'visibility':'hidden' + }) + } + }); + } + } catch(e) {} + + + + }); +} + + + +function onYouTubePlayerAPIReady() { + + } + + + ////////////////////////////////////////// + // CHANG THE YOUTUBE PLAYER STATE HERE // + //////////////////////////////////////// + function onPlayerStateChange(event) { + if (event.data == YT.PlayerState.PLAYING) { + + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + bt.stop(); + opt.videoplaying=true; + opt.videostartednow=1; + + } else { + + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + if (opt.conthover==0) + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + opt.videoplaying=false; + opt.videostoppednow=1; + } + } + + /////////////////////////////// + // YOUTUBE VIDEO AUTOPLAY // + /////////////////////////////// + function onPlayerReady(event) { + event.target.playVideo(); + } + + //////////////////////// + // VIMEO ADD EVENT ///// + //////////////////////// + function addEvent(element, eventName, callback) { + + if (element.addEventListener) { + + element.addEventListener(eventName, callback, false); + } + else { + + element.attachEvent(eventName, callback, false); + } + + + } + + ////////////////////////////////////////// + // CHANG THE YOUTUBE PLAYER STATE HERE // + //////////////////////////////////////// + function vimeoready(player_id) { + + var froogaloop = $f(player_id); + + //$('#debug').html($('#debug').html()+"
Frooga Func"+Math.round(Math.random()*100)); + + froogaloop.addEvent('ready', function(data) { + //$('#debug').html($('#debug').html()+"
Ready"+Math.round(Math.random()*100)); + froogaloop.addEvent('play', function(data) { + //$('#debug').html($('#debug').html()+"
Play"+Math.round(Math.random()*100)); + + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + bt.stop(); + opt.videoplaying=true; + }); + + froogaloop.addEvent('finish', function(data) { + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + if (opt.conthover==0) + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + opt.videoplaying=false; + opt.videostartednow=1; + }); + + froogaloop.addEvent('pause', function(data) { + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + if (opt.conthover==0) + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + opt.videoplaying=false; + opt.videostoppednow=1; + }); + }); + + + + + } + + + function vimeoready_auto(player_id) { + + var froogaloop = $f(player_id); + + + froogaloop.addEvent('ready', function(data) { + froogaloop.api('play'); + }); + + froogaloop.addEvent('play', function(data) { + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + bt.stop(); + opt.videoplaying=true; + }); + + froogaloop.addEvent('finish', function(data) { + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + if (opt.conthover==0) + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + opt.videoplaying=false; + opt.videostartednow=1; + }); + + froogaloop.addEvent('pause', function(data) { + var bt = $('body').find('.tp-bannertimer'); + var opt = bt.data('opt'); + if (opt.conthover==0) + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + opt.videoplaying=false; + opt.videostoppednow=1; + }); + + + } + + + + + //////////////////////// + // SHOW THE CAPTION // + /////////////////////// + function animateTheCaptions(nextli, opt,actli) { + + + //if ($("body").find('#debug').length==0) + // $("body").append('
'); + + + + nextli.find('.tp-caption').each(function(i) { + + offsetx = opt.width/2 - opt.startwidth/2; + + if (opt.bh>1) { + opt.bw=1; + opt.bh=1; + } + + if (opt.bw>1) { + opt.bw=1; + opt.bh=1; + } + + var xbw = opt.bw; + var xbh = opt.bh; + + + + var nextcaption=nextli.find('.tp-caption:eq('+i+')'); + nextcaption.stop(true,true); + + if (nextcaption.data('linktoslide')!=undefined) { + nextcaption.css({ + 'cursor':'pointer' + }); + nextcaption.click(function() { + var nextcaption=$(this); + var dir = nextcaption.data('linktoslide'); + if (dir!="next" && dir!="prev") { + opt.container.data('showus',dir); + opt.container.parent().find('.tp-rightarrow').click(); + } else + if (dir=="next") + opt.container.parent().find('.tp-rightarrow').click(); + else + if (dir=="prev") + opt.container.parent().find('.tp-leftarrow').click(); + }); + } + + + if (nextcaption.hasClass("coloredbg")) offsetx=0; + if (offsetx<0) offsetx=0; + + var offsety = 0; //opt.height/2 - (opt.startheight*xbh)/2; + + clearTimeout(nextcaption.data('timer')); + clearTimeout(nextcaption.data('timer-end')); + + + + // YOUTUBE AND VIMEO LISTENRES INITIALISATION + + var frameID = "iframe"+Math.round(Math.random()*1000+1); + + if (nextcaption.find('iframe').length>0) { + + nextcaption.find('iframe').each(function() { + var ifr=$(this); + + if (ifr.attr('src').toLowerCase().indexOf('youtube')>=0) { + if (!ifr.hasClass("HasListener")) { + try { + ifr.attr('id',frameID); + + var player; + if (nextcaption.data('autoplay')==true) + player = new YT.Player(frameID, { + events: { + "onStateChange": onPlayerStateChange, + 'onReady': onPlayerReady, + } + }); + else + player = new YT.Player(frameID, { + events: { + "onStateChange": onPlayerStateChange, + } + }); + ifr.addClass("HasListener"); + + nextcaption.data('player',player); + + } catch(e) {} + } + } else { + if (ifr.attr('src').toLowerCase().indexOf('vimeo')>=0) { + + if (!ifr.hasClass("HasListener")) { + ifr.addClass("HasListener"); + ifr.attr('id',frameID); + var isrc = ifr.attr('src'); + var queryParameters = {}, queryString = isrc, + re = /([^&=]+)=([^&]*)/g, m; + // Creates a map with the query string parameters + while (m = re.exec(queryString)) { + queryParameters[decodeURIComponent(m[1])] = decodeURIComponent(m[2]); + } + + + if (queryParameters['player_id']!=undefined) { + + isrc = isrc.replace(queryParameters['player_id'],frameID); + } else { + isrc=isrc+"&player_id="+frameID; + } + + try{ + isrc = isrc.replace('api=0','api=1'); + } catch(e) {} + + isrc=isrc+"&api=1"; + + + + ifr.attr('src',isrc); + var player = nextcaption.find('iframe')[0]; + if (nextcaption.data('autoplay')==true) + $f(player).addEvent('ready', vimeoready_auto); + else + $f(player).addEvent('ready', vimeoready); + + + } + + } + } + }); + } + + + + if (nextcaption.hasClass("randomrotate") && (opt.ie || opt.ie9)) nextcaption.removeClass("randomrotate").addClass("sfb"); + nextcaption.removeClass('noFilterClass'); + + + + var imw =0; + var imh = 0; + + if (nextcaption.find('img').length>0) { + var im = nextcaption.find('img'); + if (im.data('ww') == undefined) im.data('ww',im.width()); + if (im.data('hh') == undefined) im.data('hh',im.height()); + + var ww = im.data('ww'); + var hh = im.data('hh'); + + + im.width(ww*opt.bw); + im.height(hh*opt.bh); + imw = im.width(); + imh = im.height(); + } else { + + if (nextcaption.find('iframe').length>0) { + + var im = nextcaption.find('iframe'); + if (nextcaption.data('ww') == undefined) { + nextcaption.data('ww',im.width()); + } + if (nextcaption.data('hh') == undefined) nextcaption.data('hh',im.height()); + + var ww = nextcaption.data('ww'); + var hh = nextcaption.data('hh'); + + var nc =nextcaption; + if (nc.data('fsize') == undefined) nc.data('fsize',parseInt(nc.css('font-size'),0) || 0); + if (nc.data('pt') == undefined) nc.data('pt',parseInt(nc.css('paddingTop'),0) || 0); + if (nc.data('pb') == undefined) nc.data('pb',parseInt(nc.css('paddingBottom'),0) || 0); + if (nc.data('pl') == undefined) nc.data('pl',parseInt(nc.css('paddingLeft'),0) || 0); + if (nc.data('pr') == undefined) nc.data('pr',parseInt(nc.css('paddingRight'),0) || 0); + + if (nc.data('mt') == undefined) nc.data('mt',parseInt(nc.css('marginTop'),0) || 0); + if (nc.data('mb') == undefined) nc.data('mb',parseInt(nc.css('marginBottom'),0) || 0); + if (nc.data('ml') == undefined) nc.data('ml',parseInt(nc.css('marginLeft'),0) || 0); + if (nc.data('mr') == undefined) nc.data('mr',parseInt(nc.css('marginRight'),0) || 0); + + if (nc.data('bt') == undefined) nc.data('bt',parseInt(nc.css('borderTop'),0) || 0); + if (nc.data('bb') == undefined) nc.data('bb',parseInt(nc.css('borderBottom'),0) || 0); + if (nc.data('bl') == undefined) nc.data('bl',parseInt(nc.css('borderLeft'),0) || 0); + if (nc.data('br') == undefined) nc.data('br',parseInt(nc.css('borderRight'),0) || 0); + + if (nc.data('lh') == undefined) nc.data('lh',parseInt(nc.css('lineHeight'),0) || 0); + + var fvwidth=opt.width; + var fvheight=opt.height; + if (fvwidth>opt.startwidth) fvwidth=opt.startwidth; + if (fvheight>opt.startheight) fvheight=opt.startheight; + + if (!nextcaption.hasClass('fullscreenvideo')) + nextcaption.css({ + 'font-size': (nc.data('fsize') * opt.bw)+"px", + + 'padding-top': (nc.data('pt') * opt.bh) + "px", + 'padding-bottom': (nc.data('pb') * opt.bh) + "px", + 'padding-left': (nc.data('pl') * opt.bw) + "px", + 'padding-right': (nc.data('pr') * opt.bw) + "px", + + 'margin-top': (nc.data('mt') * opt.bh) + "px", + 'margin-bottom': (nc.data('mb') * opt.bh) + "px", + 'margin-left': (nc.data('ml') * opt.bw) + "px", + 'margin-right': (nc.data('mr') * opt.bw) + "px", + + 'border-top': (nc.data('bt') * opt.bh) + "px", + 'border-bottom': (nc.data('bb') * opt.bh) + "px", + 'border-left': (nc.data('bl') * opt.bw) + "px", + 'border-right': (nc.data('br') * opt.bw) + "px", + + 'line-height': (nc.data('lh') * opt.bh) + "px", + 'height':(hh*opt.bh)+'px', + 'white-space':"nowrap" + }); + else + nextcaption.css({ + 'width':opt.startwidth*opt.bw, + 'height':opt.startheight*opt.bh + }); + + + im.width(ww*opt.bw); + im.height(hh*opt.bh); + imw = im.width(); + imh = im.height(); + } else { + + var nc =nextcaption; + if (nc.data('fsize') == undefined) nc.data('fsize',parseInt(nc.css('font-size'),0) || 0); + if (nc.data('pt') == undefined) nc.data('pt',parseInt(nc.css('paddingTop'),0) || 0); + if (nc.data('pb') == undefined) nc.data('pb',parseInt(nc.css('paddingBottom'),0) || 0); + if (nc.data('pl') == undefined) nc.data('pl',parseInt(nc.css('paddingLeft'),0) || 0); + if (nc.data('pr') == undefined) nc.data('pr',parseInt(nc.css('paddingRight'),0) || 0); + + if (nc.data('mt') == undefined) nc.data('mt',parseInt(nc.css('marginTop'),0) || 0); + if (nc.data('mb') == undefined) nc.data('mb',parseInt(nc.css('marginBottom'),0) || 0); + if (nc.data('ml') == undefined) nc.data('ml',parseInt(nc.css('marginLeft'),0) || 0); + if (nc.data('mr') == undefined) nc.data('mr',parseInt(nc.css('marginRight'),0) || 0); + + if (nc.data('bt') == undefined) nc.data('bt',parseInt(nc.css('borderTop'),0) || 0); + if (nc.data('bb') == undefined) nc.data('bb',parseInt(nc.css('borderBottom'),0) || 0); + if (nc.data('bl') == undefined) nc.data('bl',parseInt(nc.css('borderLeft'),0) || 0); + if (nc.data('br') == undefined) nc.data('br',parseInt(nc.css('borderRight'),0) || 0); + + if (nc.data('lh') == undefined) nc.data('lh',parseInt(nc.css('lineHeight'),0) || 0); + + + nextcaption.css({ + 'font-size': (nc.data('fsize') * opt.bw)+"px", + + 'padding-top': (nc.data('pt') * opt.bh) + "px", + 'padding-bottom': (nc.data('pb') * opt.bh) + "px", + 'padding-left': (nc.data('pl') * opt.bw) + "px", + 'padding-right': (nc.data('pr') * opt.bw) + "px", + + 'margin-top': (nc.data('mt') * opt.bh) + "px", + 'margin-bottom': (nc.data('mb') * opt.bh) + "px", + 'margin-left': (nc.data('ml') * opt.bw) + "px", + 'margin-right': (nc.data('mr') * opt.bw) + "px", + + 'border-top': (nc.data('bt') * opt.bh) + "px", + 'border-bottom': (nc.data('bb') * opt.bh) + "px", + 'border-left': (nc.data('bl') * opt.bw) + "px", + 'border-right': (nc.data('br') * opt.bw) + "px", + + 'line-height': (nc.data('lh') * opt.bh) + "px", + 'white-space':"nowrap" + + + }); + imh=nextcaption.outerHeight(true); + imw=nextcaption.outerWidth(true); + } + } + + + + if (nextcaption.hasClass('fade')) { + + nextcaption.css({ + 'opacity':0, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':(opt.bh*nextcaption.data('y'))+"px" + }); + } + + if (nextcaption.hasClass("randomrotate")) { + + nextcaption.css({ + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':((xbh*nextcaption.data('y'))+offsety)+"px" + }); + var sc=Math.random()*2+1; + var ro=Math.round(Math.random()*200-100); + var xx=Math.round(Math.random()*200-100); + var yy=Math.round(Math.random()*200-100); + nextcaption.data('repx',xx); + nextcaption.data('repy',yy); + nextcaption.data('repo',nextcaption.css('opacity')); + nextcaption.data('rotate',ro); + nextcaption.data('scale',sc); + + nextcaption.transition({ + opacity:0, + scale:sc, + rotate:ro, + x:xx, + y: yy, + duration: '0ms' + }); + } else { + if (opt.ie || opt.ie9) + {} + else + nextcaption.transition({ + scale:1, + rotate:0 + }); + } + + if (nextcaption.hasClass('lfr')) { + + nextcaption.css({ + 'opacity':1, + 'left':(15+opt.width)+'px', + 'top':(opt.bh*nextcaption.data('y'))+"px" + }); + + } + + if (nextcaption.hasClass('lfl')) { + + nextcaption.css({ + 'opacity':1, + 'left':(-15-imw)+'px', + 'top':(opt.bh*nextcaption.data('y'))+"px" + }); + + } + + if (nextcaption.hasClass('sfl')) { + + nextcaption.css({ + 'opacity':0, + 'left':((xbw*nextcaption.data('x'))-50+offsetx)+'px', + 'top':(opt.bh*nextcaption.data('y'))+"px" + }); + } + + if (nextcaption.hasClass('sfr')) { + nextcaption.css({ + 'opacity':0, + 'left':((xbw*nextcaption.data('x'))+50+offsetx)+'px', + 'top':(opt.bh*nextcaption.data('y'))+"px" + }); + } + + + + + if (nextcaption.hasClass('lft')) { + + nextcaption.css({ + 'opacity':1, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':(-25 - imh)+"px" + }); + + } + + if (nextcaption.hasClass('lfb')) { + nextcaption.css({ + 'opacity':1, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':(25+opt.height)+"px" + }); + + } + + if (nextcaption.hasClass('sft')) { + nextcaption.css({ + 'opacity':0, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':((opt.bh*nextcaption.data('y'))-50)+"px" + }); + } + + if (nextcaption.hasClass('sfb')) { + nextcaption.css({ + 'opacity':0, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':((opt.bh*nextcaption.data('y'))+50)+"px" + }); + } + + + + + nextcaption.data('timer',setTimeout(function() { + nextcaption.css({ + 'visibility':'visible' + }); + if (nextcaption.hasClass('fade')) { + nextcaption.data('repo',nextcaption.css('opacity')); + nextcaption.animate({ + 'opacity':1 + },{ + duration:nextcaption.data('speed') + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + if (nextcaption.hasClass("randomrotate")) { + + nextcaption.transition({ + opacity:1, + scale:1, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':(xbh*(nextcaption.data('y'))+offsety)+"px", + rotate:0, + x:0, + y:0, + duration: nextcaption.data('speed') + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + if (nextcaption.hasClass('lfr') || + nextcaption.hasClass('lfl') || + nextcaption.hasClass('sfr') || + nextcaption.hasClass('sfl') || + nextcaption.hasClass('lft') || + nextcaption.hasClass('lfb') || + nextcaption.hasClass('sft') || + nextcaption.hasClass('sfb') + ) + { + var easetype=nextcaption.data('easing'); + if (easetype==undefined) easetype="linear"; + nextcaption.data('repx',nextcaption.position().left); + nextcaption.data('repy',nextcaption.position().top); + + nextcaption.data('repo',nextcaption.css('opacity')); + nextcaption.animate({ + 'opacity':1, + 'left':(xbw*nextcaption.data('x')+offsetx)+'px', + 'top':opt.bh*(nextcaption.data('y'))+"px" + },{ + duration:nextcaption.data('speed'), + easing:easetype + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + },nextcaption.data('start'))); + + + // IF THERE IS ANY EXIT ANIM DEFINED + if (nextcaption.data('end')!=undefined) + + nextcaption.data('timer-end',setTimeout(function() { + + if ((opt.ie || opt.ie9) && (nextcaption.hasClass("randomrotate") || nextcaption.hasClass("randomrotateout"))) { + nextcaption.removeClass("randomrotate").removeClass("randomrotateout").addClass('fadeout'); + } + var endspeed=nextcaption.data('endspeed'); + if (endspeed==undefined) endspeed=nextcaption.data('speed'); + + var xx=nextcaption.data('repx'); + var yy=nextcaption.data('repy'); + var oo=nextcaption.data('repo'); + + if (nextcaption.hasClass('ltr') || + nextcaption.hasClass('ltl') || + nextcaption.hasClass('str') || + nextcaption.hasClass('stl') || + nextcaption.hasClass('ltt') || + nextcaption.hasClass('ltb') || + nextcaption.hasClass('stt') || + nextcaption.hasClass('stb') + ) + { + + xx=nextcaption.position().left; + yy=nextcaption.position().top; + + if (nextcaption.hasClass('ltr')) + xx=opt.width+20; + else if (nextcaption.hasClass('ltl')) + xx=0-nextcaption.width()-20; + else if (nextcaption.hasClass('ltt')) + yy=0-nextcaption.height()-20; + else if (nextcaption.hasClass('ltb')) + yy=opt.height+20; + else if (nextcaption.hasClass('str')) { + xx=xx+50; + oo=0; + } else if (nextcaption.hasClass('stl')) { + xx=xx-50; + oo=0; + } else if (nextcaption.hasClass('stt')) { + yy=yy-50; + oo=0; + } else if (nextcaption.hasClass('stb')) { + yy=yy+50; + oo=0; + } + + var easetype=nextcaption.data('endeasing'); + if (easetype==undefined) easetype="linear"; + + nextcaption.animate({ + 'opacity':oo, + 'left':xx+'px', + 'top':yy+"px" + },{ + duration:nextcaption.data('endspeed'), + easing:easetype + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + else + + if (nextcaption.hasClass("randomrotate") || nextcaption.hasClass("randomrotateout")) { + + nextcaption.transition({ + opacity:0, + scale:Math.random()*2+0.3, + 'left':Math.random()*opt.width+'px', + 'top':Math.random()*opt.height+"px", + rotate:Math.random()*40, + duration: endspeed + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + else + + if (nextcaption.hasClass('lfr') || + nextcaption.hasClass('lfl') || + nextcaption.hasClass('sfr') || + nextcaption.hasClass('sfl') || + nextcaption.hasClass('lft') || + nextcaption.hasClass('lfb') || + nextcaption.hasClass('sft') || + nextcaption.hasClass('sfb') + ) + { + + if (nextcaption.hasClass('lfr')) + xx=opt.width+20; + else if (nextcaption.hasClass('lfl')) + xx=0-nextcaption.width()-20; + else if (nextcaption.hasClass('lft')) + yy=0-nextcaption.height()-20; + else if (nextcaption.hasClass('lfb')) + yy=opt.height+20; + + + var easetype=nextcaption.data('endeasing'); + if (easetype==undefined) easetype="linear"; + + nextcaption.animate({ + 'opacity':oo, + 'left':xx+'px', + 'top':yy+"px" + },{ + duration:nextcaption.data('endspeed'), + easing:easetype + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + else + + if (nextcaption.hasClass('fade') || nextcaption.hasClass('fadeout')) { + + nextcaption.animate({ + 'opacity':0 + },{ + duration:endspeed + }); + if (opt.ie) nextcaption.addClass('noFilterClass'); + } + + },nextcaption.data('end'))); + + }) + } + + + + /////////////////////////// + // - COUNTDOWN - // + ///////////////////////// + function countDown(container,opt) { + opt.cd=0; + opt.loop=0; + if (opt.stopAfterLoops!=undefined && opt.stopAfterLoops>-1) + opt.looptogo=opt.stopAfterLoops; + else + opt.looptogo=9999999; + + if (opt.stopAtSlide!=undefined && opt.stopAtSlide>-1) + opt.lastslidetoshow=opt.stopAtSlide; + else + opt.lastslidetoshow=999; + + if (opt.looptogo==0) opt.stopLoop="on"; + + + + if (opt.slideamount >1 && !(opt.stopAfterLoops==0 && opt.stopAtSlide==1) ) { + var bt=container.find('.tp-bannertimer'); + if (bt.length>0) { + bt.css({ + 'width':'0%' + }); + bt.animate({ + 'width':"100%" + },{ + duration:(opt.delay-100), + queue:false, + easing:"linear" + }); + } + + bt.data('opt',opt); + opt.cdint=setInterval(function() { + + if (container.data('conthover-changed') == 1) { + opt.conthover= container.data('conthover'); + container.data('conthover-changed',0); + } + + if (opt.conthover!=1 && opt.videoplaying!=true) opt.cd=opt.cd+100; + + // EVENT TRIGGERING IN CASE VIDEO HAS BEEN STARTED + if (opt.videostartednow==1) { + container.trigger('revolution.slide.onvideoplay'); + opt.videostartednow=0; + } + + // EVENT TRIGGERING IN CASE VIDEO HAS BEEN STOPPED + if (opt.videostoppednow==1) { + container.trigger('revolution.slide.onvideostop'); + opt.videostoppednow=0; + } + + + if (opt.cd>=opt.delay) { + opt.cd=0; + // SWAP TO NEXT BANNER + opt.act=opt.next; + opt.next=opt.next+1; + if (opt.next>container.find('>ul >li').length-1) { + opt.next=0; + opt.looptogo=opt.looptogo-1; + if (opt.loop<=0) { + opt.stopLoop="on"; + + } + } + + // STOP TIMER IF NO LOOP NO MORE NEEDED. + if (opt.stopLoop=="on" && opt.next==opt.lastslidetoshow-1) { + clearInterval(opt.cdint); + container.find('.tp-bannertimer').css({ + 'visibility':'hidden' + }); + container.trigger('revolution.slide.onstop'); + } + + // SWAP THE SLIDES + swapSlide(container,opt); + + + // Clear the Timer + if (bt.length>0) { + bt.css({ + 'width':'0%' + }); + bt.animate({ + 'width':"100%" + },{ + duration:(opt.delay-100), + queue:false, + easing:"linear" + }); + } + } + },100); + + + container.hover( + function() { + + if (opt.onHoverStop=="on") { + opt.conthover=1; + bt.stop(); + container.trigger('revolution.slide.onpause'); + } + }, + function() { + if (container.data('conthover')!=1) { + container.trigger('revolution.slide.onresume'); + opt.conthover=0; + if (opt.onHoverStop=="on" && opt.videoplaying!=true) { + bt.animate({ + 'width':"100%" + },{ + duration:((opt.delay-opt.cd)-100), + queue:false, + easing:"linear" + }); + } + } + }); + } + } + + + +})(jQuery); + + + + diff --git a/public/js-plugin/rs-plugin/js/jquery.themepunch.revolution.min.js b/public/js-plugin/rs-plugin/js/jquery.themepunch.revolution.min.js new file mode 100644 index 0000000..ed3ace1 --- /dev/null +++ b/public/js-plugin/rs-plugin/js/jquery.themepunch.revolution.min.js @@ -0,0 +1 @@ +(function(d,h){d.fn.extend({revolution:function(E){var F={delay:9000,startheight:490,startwidth:890,hideThumbs:200,thumbWidth:100,thumbHeight:50,thumbAmount:5,navigationType:"both",navigationArrows:"nexttobullets",navigationStyle:"round",touchenabled:"on",onHoverStop:"on",navOffsetHorizontal:0,navOffsetVertical:20,stopAtSlide:4,stopAfterLoops:1,shadow:1,stopLoop:"off",wrapper:"#sliderWrapperRS",wrapperheight:432};E=d.extend({},F,E);return this.each(function(){var H=E;var G=d(this);H.firefox13=(d.browser.mozilla)&&(parseInt(d.browser.version,0)==13||parseInt(d.browser.version,0)==14||parseInt(d.browser.version,0)==15||parseInt(d.browser.version,0)==16);H.ie=d.browser.msie&&parseInt(d.browser.version,0)<9;H.ie9=d.browser.msie&&parseInt(d.browser.version,0)==9;var K=d.fn.jquery.split("."),L=parseFloat(K[0]),N=parseFloat(K[1]),I=parseFloat(K[2]||"0");if(L==1&&N<7){G.html('
The Current Version of jQuery:'+K+"
Please update your jQuery Version to min. 1.7 in Case you wish to use the Revolution Slider Plugin
")}if(!d.support.transition){d.fn.transition=d.fn.animate}d.cssEase.bounce="cubic-bezier(0,1,0.5,1.3)";G.find(".caption").each(function(){d(this).addClass("tp-caption")});G.find(".tp-caption iframe").each(function(){try{if(d(this).attr("src").indexOf("you")>0){var P=document.createElement("script");P.src="http://www.youtube.com/player_api";var Q=document.getElementsByTagName("script")[0];Q.parentNode.insertBefore(P,Q)}}catch(R){}});G.find(".tp-caption iframe").each(function(){try{if(d(this).attr("src").indexOf("vim")>0){var Q=document.createElement("script");Q.src="http://a.vimeocdn.com/js/froogaloop2.min.js";var P=document.getElementsByTagName("script")[0];P.parentNode.insertBefore(Q,P)}}catch(R){}});if(H.shuffle=="on"){for(var O=0;Oul:first-child >li").length;O++){var J=Math.round(Math.random()*G.find(">ul:first-child >li").length);G.find(">ul:first-child >li:eq("+J+")").prependTo(G.find(">ul:first-child"))}}H.slots=4;H.act=-1;H.next=0;H.origcd=H.delay;H.firststart=1;if(H.navOffsetHorizontal==h){H.navOffsetHorizontal=0}if(H.navOffsetVertical==h){H.navOffsetVertical=0}H.navOH=H.navOffsetHorizontal;H.navOV=H.navOffsetVertical;G.append('
');if(G.find(".tp-bannertimer").length==0){G.append('')}var M=G.find(".tp-bannertimer");if(M.length>0){M.css({width:"0%"})}G.addClass("tp-simpleresponsive");H.container=G;H.slideamount=G.find(">ul:first >li").length;if(G.height()==0){G.height(H.startheight)}if(H.startwidth==h||H.startwidth==0){H.startwidth=G.width()}if(H.startheight==h||H.startheight==0){H.startheight=G.height()}H.width=G.width();H.height=G.height();H.bw=H.startwidth/G.width();H.bh=H.startheight/G.height();if(H.width!=H.startwidth){H.height=Math.round(H.startheight*(H.width/H.startwidth));G.height(H.height)}if(H.shadow!=0){G.parent().append('
');G.parent().find(".tp-bannershadow").css({width:H.width})}G.waitForImages(function(){k(G,H);if(H.slideamount>1){w(G,H)}if(H.slideamount>1){z(G,H)}if(H.slideamount>1){j(G,H)}A(G,H);if(H.hideThumbs>0){l(G,H)}G.waitForImages(function(){G.find(".tp-loader").fadeOut(600);setTimeout(function(){n(G,H);if(H.slideamount>1){y(G,H)}$finalHeight=(H.height>H.wrapperheight)?H.wrapperheight:H.height;d(H.wrapper).animate({height:$finalHeight},{duration:700,queue:false},function(){})},600)})});d(window).resize(function(){if(G.outerWidth(true)!=H.width){C(G,H)}})})},revpause:function(E){return this.each(function(){var F=d(this);F.data("conthover",1);F.data("conthover-changed",1);F.trigger("revolution.slide.onpause");var G=F.parent().find(".tp-bannertimer");G.stop()})},revresume:function(E){return this.each(function(){var F=d(this);F.data("conthover",0);F.data("conthover-changed",1);F.trigger("revolution.slide.onresume");var G=F.parent().find(".tp-bannertimer");var H=G.data("opt");G.animate({width:"100%"},{duration:((H.delay-H.cd)-100),queue:false,easing:"linear"})})},revnext:function(E){return this.each(function(){var F=d(this);F.parent().find(".tp-rightarrow").click()})},revprev:function(E){return this.each(function(){var F=d(this);F.parent().find(".tp-leftarrow").click()})},revmaxslide:function(E){return d(this).find(">ul:first-child >li").length},revshowslide:function(E){return this.each(function(){var F=d(this);F.data("showus",E);F.parent().find(".tp-rightarrow").click()})}});function C(E,F){E.find(".defaultimg").each(function(I){D(d(this),F);F.height=Math.round(F.startheight*(F.width/F.startwidth));E.height(F.height);D(d(this),F);try{E.parent().find(".tp-bannershadow").css({width:F.width})}catch(K){}var G=E.find(">ul >li:eq("+F.act+") .slotholder");var J=E.find(">ul >li:eq("+F.next+") .slotholder");o(E,F);J.find(".defaultimg").css({opacity:0});G.find(".defaultimg").css({opacity:1});c(E,F);var H=E.find(">ul >li:eq("+F.next+")");E.find(".tp-caption").each(function(){d(this).stop(true,true)});r(H,F);g(F,E);$finalHeight=(F.height>F.wrapperheight)?F.wrapperheight:F.height;d(F.wrapper).height($finalHeight)})}function g(G,E){G.cd=0;if(G.videoplaying!=true){var F=E.find(".tp-bannertimer");if(F.length>0){F.stop();F.css({width:"0%"});F.animate({width:"100%"},{duration:(G.delay-100),queue:false,easing:"linear"})}clearTimeout(G.thumbtimer);G.thumbtimer=setTimeout(function(){f(E);q(E,G)},200)}}function x(G,E){G.cd=0;n(E,G);var F=E.find(".tp-bannertimer");if(F.length>0){F.stop();F.css({width:"0%"});F.animate({width:"100%"},{duration:(G.delay-100),queue:false,easing:"linear"})}}function z(H,K){var J=H.parent();if(K.navigationType=="thumb"||K.navsecond=="both"){J.append('
')}var G=J.find(".tp-bullets.tp-thumbs .tp-mask .tp-thumbcontainer");var I=G.parent();I.width(K.thumbWidth*K.thumbAmount);I.height(K.thumbHeight);I.parent().width(K.thumbWidth*K.thumbAmount);I.parent().height(K.thumbHeight);H.find(">ul:first >li").each(function(O){var M=H.find(">ul:first >li:eq("+O+")");if(M.data("thumb")!=h){var P=M.data("thumb")}else{var P=M.find("img:first").attr("src")}G.append('
');var N=G.find(".bullet:first")});G.append('
');var L=1000;G.find(".bullet").each(function(M){var N=d(this);if(M==K.slideamount-1){N.addClass("last")}if(M==0){N.addClass("first")}N.width(K.thumbWidth);N.height(K.thumbHeight);if(L>N.outerWidth(true)){L=N.outerWidth(true)}N.click(function(){if(K.transition==0&&N.index()!=K.act){K.next=N.index();x(K,H)}})});var F=L*H.find(">ul:first >li").length;var E=G.parent().width();K.thumbWidth=L;if(Eul:first >li").length;var U=(S-M)+15;var R=U/M;T=T-30;var Q=(0-((T)*R));if(Q>0){Q=0}if(Q<0-S+M){Q=0-S+M}p(P,Q,200)});G.parent().mousemove(function(){var P=d(this);var O=P.offset();var T=d("body").data("mousex")-O.left;var M=P.width();var N=P.find(".bullet:first").outerWidth(true);var S=N*H.find(">ul:first >li").length;var U=(S-M)+15;var R=U/M;T=T-30;var Q=(0-((T)*R));if(Q>0){Q=0}if(Q<0-S+M){Q=0-S+M}p(P,Q,0)});G.parent().mouseleave(function(){var M=d(this);M.removeClass("over");f(H)})}}function f(E){var F=E.parent().find(".tp-bullets.tp-thumbs .tp-mask .tp-thumbcontainer");var J=F.parent();var I=J.offset();var H=J.find(".bullet:first").outerWidth(true);var N=J.find(".bullet.selected").index()*H;var G=J.width();var H=J.find(".bullet:first").outerWidth(true);var M=H*E.find(">ul:first >li").length;var O=(M-G);var L=O/G;var K=0-N;if(K>0){K=0}if(K<0-M+G){K=0-M+G}if(!J.hasClass("over")){p(J,K,200)}}function p(F,G,E){F.stop();F.find(".tp-thumbcontainer").animate({left:G+"px"},{duration:E,queue:false})}function w(F,G){if(G.navigationType=="bullet"||G.navigationType=="both"){F.parent().append('
')}var E=F.parent().find(".tp-bullets");F.find(">ul:first >li").each(function(I){var J=F.find(">ul:first >li:eq("+I+") img:first").attr("src");E.append('
');var H=E.find(".bullet:first")});E.find(".bullet").each(function(H){var I=d(this);if(H==G.slideamount-1){I.addClass("last")}if(H==0){I.addClass("first")}I.click(function(){if(G.transition==0&&I.index()!=G.act){G.next=I.index();x(G,F)}})});E.append('
');q(F,G);d("#unvisible_button").click(function(){G.navigationArrows=d(".selectnavarrows").val();G.navigationType=d(".selectnavtype").val();q(F,G);setTimeout(function(){q(F,G)},100)})}function j(F,G){var E=F.find(".tp-bullets");var H="";if(G.navigationArrow=="none"){H="visibility:none"}F.parent().append('
');F.parent().append('
');F.parent().find(".tp-rightarrow").click(function(){if(G.transition==0){if(F.data("showus")!=h&&F.data("showus")!=-1){G.next=F.data("showus")-1}else{G.next=G.next+1}F.data("showus",-1);if(G.next>=G.slideamount){G.next=0}if(G.next<0){G.next=0}if(G.act!=G.next){x(G,F)}}});F.parent().find(".tp-leftarrow").click(function(){if(G.transition==0){G.next=G.next-1;G.leftarrowpressed=1;if(G.next<0){G.next=G.slideamount-1}x(G,F)}});q(F,G)}function A(E,F){if(F.touchenabled=="on"){E.swipe({data:E,swipeRight:function(){if(F.transition==0){F.next=F.next-1;F.leftarrowpressed=1;if(F.next<0){F.next=F.slideamount-1}x(F,E)}},swipeLeft:function(){if(F.transition==0){F.next=F.next+1;if(F.next==F.slideamount){F.next=0}x(F,E)}},allowPageScroll:"auto"})}}function l(G,H){var F=G.parent().find(".tp-bullets");var E=G.parent().find(".tparrows");if(F==null){G.append('
');var F=G.parent().find(".tp-bullets")}if(E==null){G.append('
');var E=G.parent().find(".tparrows")}G.data("hidethumbs",H.hideThumbs);if(H.ie){F.css({visibility:"hidden"});E.css({visibility:"hidden"})}else{try{F.css({opacity:0})}catch(I){}try{E.css({opacity:0})}catch(I){}}F.hover(function(){F.addClass("hovered");clearTimeout(G.data("hidethumbs"));F.animate({opacity:1},{duration:200,queue:false});E.animate({opacity:1},{duration:200,queue:false})},function(){F.removeClass("hovered");if(!G.hasClass("hovered")&&!F.hasClass("hovered")){G.data("hidethumbs",setTimeout(function(){if(H.ie){F.css({visibility:"hidden"});E.css({visibility:"hidden"})}else{F.animate({opacity:0},{duration:200,queue:false});E.animate({opacity:0},{duration:200,queue:false})}},H.hideThumbs))}});E.hover(function(){F.addClass("hovered");clearTimeout(G.data("hidethumbs"));if(H.ie){F.css({visibility:"visible"});E.css({visibility:"visible"})}else{F.animate({opacity:1},{duration:200,queue:false});E.animate({opacity:1},{duration:200,queue:false})}},function(){F.removeClass("hovered");if(!G.hasClass("hovered")&&!F.hasClass("hovered")){G.data("hidethumbs",setTimeout(function(){if(H.ie){F.css({visibility:"hidden"});E.css({visibility:"hidden"})}else{F.animate({opacity:0},{duration:200,queue:false});E.animate({opacity:0},{duration:200,queue:false})}},H.hideThumbs))}});G.live("mouseenter",function(){G.addClass("hovered");clearTimeout(G.data("hidethumbs"));if(H.ie){F.css({visibility:"visible"});E.css({visibility:"visible"})}else{F.animate({opacity:1},{duration:200,queue:false});E.animate({opacity:1},{duration:200,queue:false})}});G.live("mouseleave",function(){G.removeClass("hovered");if(!G.hasClass("hovered")&&!F.hasClass("hovered")){G.data("hidethumbs",setTimeout(function(){if(H.ie){F.css({visibility:"hidden"});E.css({visibility:"hidden"})}else{F.animate({opacity:0},{duration:200,queue:false});E.animate({opacity:0},{duration:200,queue:false})}},H.hideThumbs))}})}function q(H,J){if(J.navigationType=="both"){J.navigationType="bullet";J.navsecond="both"}if(J.navigationType=="none"&&J.navigationArrows!="none"){J.navigationArrows="verticalcentered"}J.navOH=J.navOffsetHorizontal*J.bw;J.navOV=J.navOffsetVertical*J.bh;if(J.bw!=1){J.navOH=0}var Q=H.parent();var K=Q.find(".tp-leftarrow");var I=Q.find(".tp-rightarrow");if(J.navigationType=="bullet"){var L=Q.find(".tp-bullets.simplebullets");var G=Q.find(".tp-bullets.simplebullets.navbar");L.css({visibility:"visible"});try{Q.find(".tp-thumbs").css({visibility:"hidden"});if(J.ie){Q.find(".tp-thumbs").remove()}}catch(O){}var F=L.width();if(!L.hasClass("tp-thumbs")){F=0;L.find(".bullet").each(function(){F=F+d(this).outerWidth(true)});L.css({width:(F)+"px"})}var M=Q.outerWidth()-J.width;L.css({left:(J.navOH)+(M/2)+(J.width/2-F/2)+"px",bottom:J.navOV+"px"});if(J.navigationArrows=="nexttobullets"){K.removeClass("large");I.removeClass("large");K.removeClass("thumbswitharrow");I.removeClass("thumbswitharrow");K.css({visibility:"visible"});I.css({visibility:"visible"});var P=0;K.css({position:"absolute",left:(L.position().left-K.outerWidth(true))+"px",top:L.position().top+"px"});I.css({position:"absolute",left:(L.outerWidth(true)+L.position().left)+"px",top:L.position().top+"px"});try{G.css({paddingLeft:"40px",paddingRight:"40px","margin-left":"-40px"})}catch(O){}}else{if(J.navigationArrows=="verticalcentered"){K.addClass("large");I.addClass("large");K.css({visibility:"visible"});I.css({visibility:"visible"});var E=Q.outerHeight();K.css({position:"absolute",left:(M/2)+"px",top:(E/2)+"px"});I.css({position:"absolute",left:(J.width-I.outerWidth()+M/2)+"px",top:(E/2)+"px"});try{G.css({paddingLeft:"10px",paddingRight:"10px","margin-left":"-10px"})}catch(O){}}else{K.css({visibility:"hidden"});I.css({visibility:"hidden"});try{G.css({paddingLeft:"10px",paddingRight:"10px","margin-left":"-10px"})}catch(O){}}}}else{if(J.navigationType=="thumb"){var N=Q.find(".tp-thumbs");try{Q.find(".tp-bullets").css({visibility:"hidden"})}catch(O){}N.css({visibility:"visible"});var E=N.parent().outerHeight();var M=Q.outerWidth()-J.width;N.css({left:(J.navOH)+(J.width/2-N.width()/2)+"px"});N.css({bottom:(0-N.outerHeight(true)+(J.navOV))+"px"});if(J.navigationArrows=="verticalcentered"){K.css({visibility:"visible"});I.css({visibility:"visible"});K.addClass("large");I.addClass("large");K.css({position:"absolute",left:(M/2)+"px",top:(Q.outerHeight()/2)+"px"});I.css({position:"absolute",left:(J.width-I.outerWidth()+M/2)+"px",top:(Q.outerHeight()/2)+"px"})}else{K.css({visibility:"hidden"});I.css({visibility:"hidden"})}}else{if(J.navigationType=="none"){try{Q.find(".tp-bullets").css({visibility:"hidden"})}catch(O){}try{Q.find(".tp-thumbs").css({visibility:"hidden"})}catch(O){}if(J.navigationArrows!="none"){var M=Q.outerWidth()-J.width;K.css({visibility:"visible"});I.css({visibility:"visible"});K.addClass("large");I.addClass("large");K.css({position:"absolute",left:(M/2)+"px",top:(Q.outerHeight()/2)+"px"});I.css({position:"absolute",left:(J.width-I.outerWidth()+M/2)+"px",top:(Q.outerHeight()/2)+"px"})}else{K.css({visibility:"hidden"});I.css({visibility:"hidden"})}}}}}function D(F,H){H.width=parseInt(H.container.width(),0);H.height=parseInt(H.container.height(),0);H.bw=H.width/H.startwidth;H.bh=H.height/H.startheight;if(H.bh>1){H.bw=1;H.bh=1}if(F.data("orgw")!=h){F.width(F.data("orgw"));F.height(F.data("orgh"))}var K=H.width/F.width();var E=H.height/F.height();H.fw=K;H.fh=E;if(F.data("orgw")==h){F.data("orgw",F.width());F.data("orgh",F.height())}if(H.fullWidth=="on"){var G=H.container.parent().width();var J=H.container.parent().height();var L=J/F.data("orgh");var I=G/F.data("orgw");F.width(F.width()*L);F.height(J);if(F.width()G){F.data("fxof",(G/2-F.width()/2));F.css({position:"absolute",left:F.data("fxof")+"px"})}}else{F.width(H.width);F.height(F.height()*K);if(F.height()ul:first >li").each(function(H){var G=d(this);if(G.data("link")!=h){var I=G.data("link");var J="_self";if(G.data("target")!=h){J=G.data("target")}G.append('')}});E.find(">ul:first >li >img").each(function(H){var G=d(this);G.addClass("defaultimg");D(G,F);D(G,F);G.wrap('
');G.css({opacity:0});G.data("li-id",H)})}function B(N,F,H){var L=N;var J=L.find("img");D(J,F);var E=J.attr("src");var O=J.data("neww");var K=J.data("newh");var M=J.data("fxof");if(M==h){M=0}var G=0;if(!H){var G=0-F.slotw}for(var I=0;I
')}}function m(N,F,H){var L=N;var J=L.find("img");D(J,F);var E=J.attr("src");var O=J.data("neww");var K=J.data("newh");var M=J.data("fxof");if(M==h){M=0}var G=0;if(!H){var G=0-F.sloth}for(var I=0;I
')}}function s(R,G,I){var N=R;var L=N.find("img");D(L,G);var F=L.attr("src");var S=L.data("neww");var M=L.data("newh");var Q=L.data("fxof");if(Q==h){Q=0}var H=0;var E=0;if(G.sloth>G.slotw){E=G.sloth}else{E=G.slotw}if(!I){var H=0-E}G.slotw=E;G.sloth=E;var P=0;var O=0;for(var J=0;J
');O=O+E}P=P+E}}function o(E,F,G){if(G==h){G==80}setTimeout(function(){E.find(".slotholder .slot").each(function(){clearTimeout(d(this).data("tout"));d(this).remove()});F.transition=0},G)}function c(E,G){var I=E.find(">li:eq("+G.act+")");var F=E.find(">li:eq("+G.next+")");var H=F.find(".tp-caption");if(H.find("iframe")==0){if(H.hasClass("hcenter")){H.css({height:G.height+"px",top:"0px",left:(G.width/2-H.outerWidth()/2)+"px"})}else{if(H.hasClass("vcenter")){H.css({width:G.width+"px",left:"0px",top:(G.height/2-H.outerHeight()/2)+"px"})}}}}function n(O,E){E.transition=1;E.videoplaying=false;try{var I=O.find(">ul:first-child >li:eq("+E.act+")")}catch(W){var I=O.find(">ul:first-child >li:eq(1)")}var K=O.find(">ul:first-child >li:eq("+E.next+")");var S=I.find(".slotholder");var U=K.find(".slotholder");I.css({visibility:"visible"});K.css({visibility:"visible"});if(E.ie){if(K.data("transition")=="boxfade"){K.data("transition","boxslide")}if(K.data("transition")=="slotfade-vertical"){K.data("transition","slotzoom-vertical")}if(K.data("transition")=="slotfade-horizontal"){K.data("transition","slotzoom-horizontal")}}if(K.data("delay")!=h){E.cd=0;E.delay=K.data("delay")}else{E.delay=E.origcd}I.css({left:"0px",top:"0px"});K.css({left:"0px",top:"0px"});var F=0;if(K.data("transition")=="boxslide"){F=0}else{if(K.data("transition")=="boxfade"){F=1}else{if(K.data("transition")=="slotslide-horizontal"){F=2}else{if(K.data("transition")=="slotslide-vertical"){F=3}else{if(K.data("transition")=="curtain-1"){F=4}else{if(K.data("transition")=="curtain-2"){F=5}else{if(K.data("transition")=="curtain-3"){F=6}else{if(K.data("transition")=="slotzoom-horizontal"){F=7}else{if(K.data("transition")=="slotzoom-vertical"){F=8}else{if(K.data("transition")=="slotfade-horizontal"){F=9}else{if(K.data("transition")=="slotfade-vertical"){F=10}else{if(K.data("transition")=="fade"){F=11}else{if(K.data("transition")=="slideleft"){F=12}else{if(K.data("transition")=="slideup"){F=13}else{if(K.data("transition")=="slidedown"){F=14}else{if(K.data("transition")=="slideright"){F=15}else{if(K.data("transition")=="papercut"){F=16}else{if(K.data("transition")=="3dcurtain-horizontal"){F=17}else{if(K.data("transition")=="3dcurtain-vertical"){F=18}else{if(K.data("transition")=="cubic"){F=19}else{if(K.data("transition")=="flyin"){F=20}else{if(K.data("transition")=="turnoff"){F=21}else{F=Math.round(Math.random()*21);K.data("slotamount",Math.round(Math.random()*12+4))}}}}}}}}}}}}}}}}}}}}}}if(K.data("transition")=="random-static"){F=Math.round(Math.random()*16);if(F>15){F=15}if(F<0){F=0}}if(K.data("transition")=="random-premium"){F=Math.round(Math.random()*6+16);if(F>21){F=21}if(F<16){F=16}}var X=-1;if(E.leftarrowpressed==1||E.act>E.next){X=1}if(K.data("transition")=="slidehorizontal"){F=12;if(E.leftarrowpressed==1){F=15}}if(K.data("transition")=="slidevertical"){F=13;if(E.leftarrowpressed==1){F=14}}E.leftarrowpressed=0;if(F>21){F=21}if(F<0){F=0}if(!d.support.transition&&F>16){F=Math.round(Math.random()*16);K.data("slotamount",Math.round(Math.random()*12+4))}if(E.ie&&(F==17||F==16||F==2||F==3||F==9||F==10)){F=Math.round(Math.random()*3+12)}if(E.ie9&&(F==3)){F=4}var P=300;if(K.data("masterspeed")!=h&&K.data("masterspeed")>99&&K.data("masterspeed")<4001){P=K.data("masterspeed")}O.parent().find(".bullet").each(function(){var aa=d(this);aa.removeClass("selected");if(aa.index()==E.next){aa.addClass("selected")}});O.find(">li").each(function(){var aa=d(this);if(aa.index!=E.act&&aa.index!=E.next){aa.css({"z-index":16})}});I.css({"z-index":18});K.css({"z-index":20});K.css({opacity:0});b(I,E);r(K,E);if(K.data("slotamount")==h||K.data("slotamount")<1){E.slots=Math.round(Math.random()*12+4);if(K.data("transition")=="boxslide"){E.slots=Math.round(Math.random()*6+3)}}else{E.slots=K.data("slotamount")}if(K.data("rotate")==h){E.rotate=0}else{if(K.data("rotate")==999){E.rotate=Math.round(Math.random()*360)}else{E.rotate=K.data("rotate")}}if(!d.support.transition||E.ie||E.ie9){E.rotate=0}if(E.firststart==1){I.css({opacity:0});E.firststart=0}if(F==0){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});s(S,E,true);s(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);if(!d.support.transition){ab.transition({top:(0-E.sloth),left:(0-E.slotw)},0)}else{ab.transition({top:(0-E.sloth),left:(0-E.slotw),rotate:E.rotate},0)}setTimeout(function(){if(!d.support.transition){ab.transition({top:0,left:0,scale:1,rotate:0},P*1.5,function(){if(aa==(E.slots*E.slots)-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})}},aa*15)})}if(F==1){if(E.slots>5){E.slots=5}K.css({opacity:1});s(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);ab.css({opacity:0});ab.find("img").css({opacity:0});if(E.ie9){ab.find("img").transition({top:(Math.random()*E.slotw-E.slotw)+"px",left:(Math.random()*E.slotw-E.slotw)+"px"},0)}else{ab.find("img").transition({top:(Math.random()*E.slotw-E.slotw)+"px",left:(Math.random()*E.slotw-E.slotw)+"px",rotate:E.rotate},0)}var ac=Math.random()*1000+(P+200);if(aa==(E.slots*E.slots)-1){ac=1500}ab.find("img").transition({opacity:1,top:(0-ab.data("y"))+"px",left:(0-ab.data("x"))+"px",rotate:0},ac);ab.transition({opacity:1},ac,function(){if(aa==(E.slots*E.slots)-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})})}if(F==2){P=P+200;K.css({opacity:1});B(S,E,true);B(U,E,false);U.find(".defaultimg").css({opacity:0});S.find(".slotslide").each(function(){var aa=d(this);aa.transit({left:E.slotw+"px",rotate:(0-E.rotate)},P,function(){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)})});U.find(".slotslide").each(function(){var aa=d(this);if(E.ie9){aa.transit({left:(0-E.slotw)+"px"},0)}else{aa.transit({left:(0-E.slotw)+"px",rotate:E.rotate},0)}aa.transit({left:"0px",rotate:0},P,function(){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}if(E.ie){S.find(".defaultimg").css({opacity:1})}E.act=E.next;f(O)})})}if(F==3){P=P+200;K.css({opacity:1});m(S,E,true);m(U,E,false);U.find(".defaultimg").css({opacity:0});S.find(".slotslide").each(function(){var aa=d(this);aa.transit({top:E.sloth+"px",rotate:E.rotate},P,function(){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)})});U.find(".slotslide").each(function(){var aa=d(this);if(E.ie9){aa.transit({top:(0-E.sloth)+"px"},0)}else{aa.transit({top:(0-E.sloth)+"px",rotate:E.rotate},0)}aa.transit({top:"0px",rotate:0},P,function(){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)})})}if(F==4){K.css({opacity:1});B(S,E,true);B(U,E,true);U.find(".defaultimg").css({opacity:0});S.find(".defaultimg").css({opacity:0});S.find(".slotslide").each(function(ab){var aa=d(this);aa.transit({top:(0+(E.height))+"px",opacity:1,rotate:E.rotate},P+(ab*(70-E.slots)))});U.find(".slotslide").each(function(ab){var aa=d(this);if(E.ie9){aa.transition({top:(0-(E.height))+"px",opacity:0},0)}else{aa.transition({top:(0-(E.height))+"px",opacity:0,rotate:E.rotate},0)}aa.transition({top:"0px",opacity:1,rotate:0},P+(ab*(70-E.slots)),function(){if(ab==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})})}if(F==5){K.css({opacity:1});B(S,E,true);B(U,E,true);U.find(".defaultimg").css({opacity:0});S.find(".defaultimg").css({opacity:0});S.find(".slotslide").each(function(ab){var aa=d(this);aa.transition({top:(0+(E.height))+"px",opacity:1,rotate:E.rotate},P+((E.slots-ab)*(70-E.slots)))});U.find(".slotslide").each(function(ab){var aa=d(this);if(E.ie9){aa.transition({top:(0-(E.height))+"px",opacity:0},0)}else{aa.transition({top:(0-(E.height))+"px",opacity:0,rotate:E.rotate},0)}aa.transition({top:"0px",opacity:1,rotate:0},P+((E.slots-ab)*(70-E.slots)),function(){if(ab==0){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})})}if(F==6){K.css({opacity:1});if(E.slots<2){E.slots=2}B(S,E,true);B(U,E,true);U.find(".defaultimg").css({opacity:0});S.find(".defaultimg").css({opacity:0});S.find(".slotslide").each(function(ac){var ab=d(this);if(ac');I.find(".tp-half-one").clone(true).appendTo(I).addClass("tp-half-two");I.find(".tp-half-two").removeClass("tp-half-one");I.find(".tp-half-two").wrapInner('
');I.find(".tp-half-one").css({width:E.width+"px",height:E.height/2+"px",overflow:"hidden",position:"absolute",top:"0px",left:"0px"});I.find(".tp-half-two").css({width:E.width+"px",height:E.height/2+"px",overflow:"hidden",position:"absolute",top:E.height/2+"px",left:"0px"});I.find(".tp-half-two .tp-offset").css({position:"absolute",top:(0-E.height/2)+"px",left:"0px"});if(!d.support.transition){I.find(".tp-half-one").animate({opacity:0,top:(0-E.height/2)+"px"},{duration:500,queue:false});I.find(".tp-half-two").animate({opacity:0,top:(E.height)+"px"},{duration:500,queue:false})}else{var V=Math.round(Math.random()*40-20);var T=Math.round(Math.random()*40-20);var H=Math.random()*1+1;var G=Math.random()*1+1;I.find(".tp-half-one").transition({opacity:1,scale:H,rotate:V,y:(0-E.height/1.4)+"px"},800,"in");I.find(".tp-half-two").transition({opacity:1,scale:G,rotate:T,y:(0+E.height/1.4)+"px"},800,"in");if(I.html()!=null){K.transition({scale:0.8,x:E.width*0.1,y:E.height*0.1,rotate:V},0).transition({rotate:0,scale:1,x:0,y:0},600,"snap")}}U.find(".defaultimg").css({opacity:1});setTimeout(function(){I.css({position:"absolute","z-index":18});K.css({position:"absolute","z-index":20});U.find(".defaultimg").css({opacity:1});S.find(".defaultimg").css({opacity:0});if(I.find(".tp-half-one").length>0){I.find(".tp-half-one >img, .tp-half-one >div").unwrap()}I.find(".tp-half-two").remove();E.transition=0;E.act=E.next},800);K.css({opacity:1})}if(F==17){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});m(S,E,true);m(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);ab.transition({opacity:0,rotateY:350,rotateX:40,perspective:"1400px"},0);setTimeout(function(){ab.transition({opacity:1,top:0,left:0,scale:1,perspective:"150px",rotate:0,rotateY:0,rotateX:0},P*2,function(){if(aa==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})},aa*100)})}if(F==18){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});B(S,E,true);B(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);ab.transition({rotateX:10,rotateY:310,perspective:"1400px",rotate:0,opacity:0},0);setTimeout(function(){ab.transition({top:0,left:0,scale:1,perspective:"150px",rotate:0,rotateY:0,rotateX:0,opacity:1},P*2,function(){if(aa==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})},aa*100)})}if(F==19){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});B(S,E,true);B(U,E,false);U.find(".defaultimg").css({opacity:0});var N=K.css("z-index");var M=I.css("z-index");U.find(".slotslide").each(function(aa){var ab=d(this);ab.parent().css({overflow:"visible"});ab.css({background:"#333"});if(X==1){ab.transition({opacity:0,left:0,top:E.height/2,perspective:E.height*100,rotate3d:"1, 0, 0, -90deg "},0)}else{ab.transition({opacity:0,left:0,top:0-E.height/2,perspective:E.height*100,rotate3d:"1, 0, 0, 90deg "},0)}setTimeout(function(){ab.transition({opacity:1,top:0,rotate3d:" 1, 0, 0, 0deg "},P*2,function(){if(aa==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})},aa*150)});S.find(".slotslide").each(function(aa){var ab=d(this);ab.parent().css({overflow:"visible"});ab.css({background:"#333"});ab.transition({top:0,perspective:E.height*100,rotate3d:"1, 0, 0, 0deg"},0);S.find(".defaultimg").css({opacity:0});setTimeout(function(){if(X==1){ab.transition({opacity:0.6,left:0,top:0-E.height/2,rotate3d:"1, 0, 0, 90deg"},P*2,function(){})}else{ab.transition({opacity:0.6,left:0,top:(0+E.height/2),rotate3d:"1, 0, 0, -90deg"},P*2,function(){})}},aa*150)})}if(F==20){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});m(S,E,true);m(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);ab.parent().css({overflow:"visible"});if(X==1){ab.transition({scale:0.8,top:0,left:0-E.width,perspective:E.width,rotate3d:"2, 5, 0, 110deg"},0)}else{ab.transition({scale:0.8,top:0,left:0+E.width,perspective:E.width,rotate3d:"2, 5, 0, -110deg"},0)}setTimeout(function(){ab.transition({scale:0.8,left:0,perspective:E.width,rotate3d:"1, 5, 0, 0deg"},P*2,"ease").transition({scale:1},200,"out",function(){if(aa==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})},aa*100)});S.find(".slotslide").each(function(aa){var ab=d(this);ab.transition({scale:0.5,left:0,perspective:500,rotate3d:"1, 5, 0, 5deg"},300,"in-out");S.find(".defaultimg").css({opacity:0});setTimeout(function(){if(X==1){ab.transition({top:0,left:E.width/2,perspective:E.width,rotate3d:"0, -3, 0, 70deg",opacity:0},P*2,"out",function(){})}else{ab.transition({top:0,left:0-E.width/2,perspective:E.width,rotate3d:"0, -3, 0, -70deg",opacity:0},P*2,"out",function(){})}},aa*100)})}if(F==21){P=P+100;if(E.slots>10){E.slots=10}K.css({opacity:1});m(S,E,true);m(U,E,false);U.find(".defaultimg").css({opacity:0});U.find(".slotslide").each(function(aa){var ab=d(this);if(X==1){ab.transition({top:0,left:0-(E.width/2),perspective:E.width*2,rotate3d:"0, 100, 0, 90deg"},0)}else{ab.transition({top:0,left:0+(E.width/2),perspective:E.width*2,rotate3d:"0, 100, 0, -90deg"},0)}setTimeout(function(){ab.transition({left:0,perspective:E.width*2,rotate3d:"0, 0, 0, 0deg"},P*2,function(){if(aa==E.slots-1){o(O,E);U.find(".defaultimg").css({opacity:1});if(K.index()!=I.index()){S.find(".defaultimg").css({opacity:0})}E.act=E.next;f(O)}})},aa*100)});S.find(".slotslide").each(function(aa){var ab=d(this);ab.transition({left:0,perspective:E.width*2,rotate3d:"0, 0, 0, 0deg"},0);S.find(".defaultimg").css({opacity:0});setTimeout(function(){if(X==1){ab.transition({top:0,left:(E.width/2),perspective:E.width,rotate3d:"0, 1000, 0, -90deg"},P*1.5,function(){})}else{ab.transition({top:0,left:(0-E.width/2),perspective:E.width,rotate3d:"0, 1000, 0, +90deg"},P*1.5,function(){})}},aa*100)})}var Y={};Y.slideIndex=E.next+1;O.trigger("revolution.slide.onchange",Y);O.trigger("revolution.slide.onvideostop")}function b(F,E){F.find(".tp-caption").each(function(L){var R=F.find(".tp-caption:eq("+L+")");R.stop(true,true);clearTimeout(R.data("timer"));clearTimeout(R.data("timer-end"));var P=R.data("easing");P="easeInOutSine";var Q=R.data("repx");var O=R.data("repy");var M=R.data("repo");var H=R.data("rotate");var J=R.data("scale");if(R.find("iframe").length>0){try{var K=R.find("iframe");var G=K.attr("id");var I=$f(G);I.api("pause")}catch(N){}try{var S=R.data("player");S.stopVideo()}catch(N){}}try{if(H!=h||J!=h){if(H==h){H=0}if(J==h){J=1}R.transition({rotate:H,scale:J,opacity:0,left:Q+"px",top:O+"px"},(R.data("speed")+10),function(){R.removeClass("noFilterClass");R.css({visibility:"hidden"})})}else{R.animate({opacity:0,left:Q+"px",top:O+"px"},{duration:(R.data("speed")+10),easing:P,complete:function(){R.removeClass("noFilterClass");R.css({visibility:"hidden"})}})}}catch(N){}})}function t(){}function e(G){if(G.data==YT.PlayerState.PLAYING){var E=d("body").find(".tp-bannertimer");var F=E.data("opt");E.stop();F.videoplaying=true;F.videostartednow=1}else{var E=d("body").find(".tp-bannertimer");var F=E.data("opt");if(F.conthover==0){E.animate({width:"100%"},{duration:((F.delay-F.cd)-100),queue:false,easing:"linear"})}F.videoplaying=false;F.videostoppednow=1}}function v(E){E.target.playVideo()}function u(F,E,G){if(F.addEventListener){F.addEventListener(E,G,false)}else{F.attachEvent(E,G,false)}}function i(F){var E=$f(F);E.addEvent("ready",function(G){E.addEvent("play",function(J){var H=d("body").find(".tp-bannertimer");var I=H.data("opt");H.stop();I.videoplaying=true});E.addEvent("finish",function(J){var H=d("body").find(".tp-bannertimer");var I=H.data("opt");if(I.conthover==0){H.animate({width:"100%"},{duration:((I.delay-I.cd)-100),queue:false,easing:"linear"})}I.videoplaying=false;I.videostartednow=1});E.addEvent("pause",function(J){var H=d("body").find(".tp-bannertimer");var I=H.data("opt");if(I.conthover==0){H.animate({width:"100%"},{duration:((I.delay-I.cd)-100),queue:false,easing:"linear"})}I.videoplaying=false;I.videostoppednow=1})})}function a(F){var E=$f(F);E.addEvent("ready",function(G){E.api("play")});E.addEvent("play",function(I){var G=d("body").find(".tp-bannertimer");var H=G.data("opt");G.stop();H.videoplaying=true});E.addEvent("finish",function(I){var G=d("body").find(".tp-bannertimer");var H=G.data("opt");if(H.conthover==0){G.animate({width:"100%"},{duration:((H.delay-H.cd)-100),queue:false,easing:"linear"})}H.videoplaying=false;H.videostartednow=1});E.addEvent("pause",function(I){var G=d("body").find(".tp-bannertimer");var H=G.data("opt");if(H.conthover==0){G.animate({width:"100%"},{duration:((H.delay-H.cd)-100),queue:false,easing:"linear"})}H.videoplaying=false;H.videostoppednow=1})}function r(F,E,G){F.find(".tp-caption").each(function(U){offsetx=E.width/2-E.startwidth/2;if(E.bh>1){E.bw=1;E.bh=1}if(E.bw>1){E.bw=1;E.bh=1}var K=E.bw;var Q=E.bh;var W=F.find(".tp-caption:eq("+U+")");W.stop(true,true);if(W.data("linktoslide")!=h){W.css({cursor:"pointer"});W.click(function(){var aa=d(this);var Z=aa.data("linktoslide");if(Z!="next"&&Z!="prev"){E.container.data("showus",Z);E.container.parent().find(".tp-rightarrow").click()}else{if(Z=="next"){E.container.parent().find(".tp-rightarrow").click()}else{if(Z=="prev"){E.container.parent().find(".tp-leftarrow").click()}}}})}if(W.hasClass("coloredbg")){offsetx=0}if(offsetx<0){offsetx=0}var I=0;clearTimeout(W.data("timer"));clearTimeout(W.data("timer-end"));var V="iframe"+Math.round(Math.random()*1000+1);if(W.find("iframe").length>0){W.find("iframe").each(function(){var ag=d(this);if(ag.attr("src").toLowerCase().indexOf("youtube")>=0){if(!ag.hasClass("HasListener")){try{ag.attr("id",V);var ac;if(W.data("autoplay")==true){ac=new YT.Player(V,{events:{onStateChange:e,onReady:v,}})}else{ac=new YT.Player(V,{events:{onStateChange:e,}})}ag.addClass("HasListener");W.data("player",ac)}catch(ae){}}}else{if(ag.attr("src").toLowerCase().indexOf("vimeo")>=0){if(!ag.hasClass("HasListener")){ag.addClass("HasListener");ag.attr("id",V);var ab=ag.attr("src");var aa={},af=ab,ad=/([^&=]+)=([^&]*)/g,Z;while(Z=ad.exec(af)){aa[decodeURIComponent(Z[1])]=decodeURIComponent(Z[2])}if(aa.player_id!=h){ab=ab.replace(aa.player_id,V)}else{ab=ab+"&player_id="+V}try{ab=ab.replace("api=0","api=1")}catch(ae){}ab=ab+"&api=1";ag.attr("src",ab);var ac=W.find("iframe")[0];if(W.data("autoplay")==true){$f(ac).addEvent("ready",a)}else{$f(ac).addEvent("ready",i)}}}}})}if(W.hasClass("randomrotate")&&(E.ie||E.ie9)){W.removeClass("randomrotate").addClass("sfb")}W.removeClass("noFilterClass");var T=0;var Y=0;if(W.find("img").length>0){var N=W.find("img");if(N.data("ww")==h){N.data("ww",N.width())}if(N.data("hh")==h){N.data("hh",N.height())}var X=N.data("ww");var J=N.data("hh");N.width(X*E.bw);N.height(J*E.bh);T=N.width();Y=N.height()}else{if(W.find("iframe").length>0){var N=W.find("iframe");if(W.data("ww")==h){W.data("ww",N.width())}if(W.data("hh")==h){W.data("hh",N.height())}var X=W.data("ww");var J=W.data("hh");var M=W;if(M.data("fsize")==h){M.data("fsize",parseInt(M.css("font-size"),0)||0)}if(M.data("pt")==h){M.data("pt",parseInt(M.css("paddingTop"),0)||0)}if(M.data("pb")==h){M.data("pb",parseInt(M.css("paddingBottom"),0)||0)}if(M.data("pl")==h){M.data("pl",parseInt(M.css("paddingLeft"),0)||0)}if(M.data("pr")==h){M.data("pr",parseInt(M.css("paddingRight"),0)||0)}if(M.data("mt")==h){M.data("mt",parseInt(M.css("marginTop"),0)||0)}if(M.data("mb")==h){M.data("mb",parseInt(M.css("marginBottom"),0)||0)}if(M.data("ml")==h){M.data("ml",parseInt(M.css("marginLeft"),0)||0)}if(M.data("mr")==h){M.data("mr",parseInt(M.css("marginRight"),0)||0)}if(M.data("bt")==h){M.data("bt",parseInt(M.css("borderTop"),0)||0)}if(M.data("bb")==h){M.data("bb",parseInt(M.css("borderBottom"),0)||0)}if(M.data("bl")==h){M.data("bl",parseInt(M.css("borderLeft"),0)||0)}if(M.data("br")==h){M.data("br",parseInt(M.css("borderRight"),0)||0)}if(M.data("lh")==h){M.data("lh",parseInt(M.css("lineHeight"),0)||0)}var R=E.width;var P=E.height;if(R>E.startwidth){R=E.startwidth}if(P>E.startheight){P=E.startheight}if(!W.hasClass("fullscreenvideo")){W.css({"font-size":(M.data("fsize")*E.bw)+"px","padding-top":(M.data("pt")*E.bh)+"px","padding-bottom":(M.data("pb")*E.bh)+"px","padding-left":(M.data("pl")*E.bw)+"px","padding-right":(M.data("pr")*E.bw)+"px","margin-top":(M.data("mt")*E.bh)+"px","margin-bottom":(M.data("mb")*E.bh)+"px","margin-left":(M.data("ml")*E.bw)+"px","margin-right":(M.data("mr")*E.bw)+"px","border-top":(M.data("bt")*E.bh)+"px","border-bottom":(M.data("bb")*E.bh)+"px","border-left":(M.data("bl")*E.bw)+"px","border-right":(M.data("br")*E.bw)+"px","line-height":(M.data("lh")*E.bh)+"px",height:(J*E.bh)+"px","white-space":"nowrap"})}else{W.css({width:E.startwidth*E.bw,height:E.startheight*E.bh})}N.width(X*E.bw);N.height(J*E.bh);T=N.width();Y=N.height()}else{var M=W;if(M.data("fsize")==h){M.data("fsize",parseInt(M.css("font-size"),0)||0)}if(M.data("pt")==h){M.data("pt",parseInt(M.css("paddingTop"),0)||0)}if(M.data("pb")==h){M.data("pb",parseInt(M.css("paddingBottom"),0)||0)}if(M.data("pl")==h){M.data("pl",parseInt(M.css("paddingLeft"),0)||0)}if(M.data("pr")==h){M.data("pr",parseInt(M.css("paddingRight"),0)||0)}if(M.data("mt")==h){M.data("mt",parseInt(M.css("marginTop"),0)||0)}if(M.data("mb")==h){M.data("mb",parseInt(M.css("marginBottom"),0)||0)}if(M.data("ml")==h){M.data("ml",parseInt(M.css("marginLeft"),0)||0)}if(M.data("mr")==h){M.data("mr",parseInt(M.css("marginRight"),0)||0)}if(M.data("bt")==h){M.data("bt",parseInt(M.css("borderTop"),0)||0)}if(M.data("bb")==h){M.data("bb",parseInt(M.css("borderBottom"),0)||0)}if(M.data("bl")==h){M.data("bl",parseInt(M.css("borderLeft"),0)||0)}if(M.data("br")==h){M.data("br",parseInt(M.css("borderRight"),0)||0)}if(M.data("lh")==h){M.data("lh",parseInt(M.css("lineHeight"),0)||0)}W.css({"font-size":(M.data("fsize")*E.bw)+"px","padding-top":(M.data("pt")*E.bh)+"px","padding-bottom":(M.data("pb")*E.bh)+"px","padding-left":(M.data("pl")*E.bw)+"px","padding-right":(M.data("pr")*E.bw)+"px","margin-top":(M.data("mt")*E.bh)+"px","margin-bottom":(M.data("mb")*E.bh)+"px","margin-left":(M.data("ml")*E.bw)+"px","margin-right":(M.data("mr")*E.bw)+"px","border-top":(M.data("bt")*E.bh)+"px","border-bottom":(M.data("bb")*E.bh)+"px","border-left":(M.data("bl")*E.bw)+"px","border-right":(M.data("br")*E.bw)+"px","line-height":(M.data("lh")*E.bh)+"px","white-space":"nowrap"});Y=W.outerHeight(true);T=W.outerWidth(true)}}if(W.hasClass("fade")){W.css({opacity:0,left:(K*W.data("x")+offsetx)+"px",top:(E.bh*W.data("y"))+"px"})}if(W.hasClass("randomrotate")){W.css({left:(K*W.data("x")+offsetx)+"px",top:((Q*W.data("y"))+I)+"px"});var H=Math.random()*2+1;var O=Math.round(Math.random()*200-100);var L=Math.round(Math.random()*200-100);var S=Math.round(Math.random()*200-100);W.data("repx",L);W.data("repy",S);W.data("repo",W.css("opacity"));W.data("rotate",O);W.data("scale",H);W.transition({opacity:0,scale:H,rotate:O,x:L,y:S,duration:"0ms"})}else{if(E.ie||E.ie9){}else{W.transition({scale:1,rotate:0})}}if(W.hasClass("lfr")){W.css({opacity:1,left:(15+E.width)+"px",top:(E.bh*W.data("y"))+"px"})}if(W.hasClass("lfl")){W.css({opacity:1,left:(-15-T)+"px",top:(E.bh*W.data("y"))+"px"})}if(W.hasClass("sfl")){W.css({opacity:0,left:((K*W.data("x"))-50+offsetx)+"px",top:(E.bh*W.data("y"))+"px"})}if(W.hasClass("sfr")){W.css({opacity:0,left:((K*W.data("x"))+50+offsetx)+"px",top:(E.bh*W.data("y"))+"px"})}if(W.hasClass("lft")){W.css({opacity:1,left:(K*W.data("x")+offsetx)+"px",top:(-25-Y)+"px"})}if(W.hasClass("lfb")){W.css({opacity:1,left:(K*W.data("x")+offsetx)+"px",top:(25+E.height)+"px"})}if(W.hasClass("sft")){W.css({opacity:0,left:(K*W.data("x")+offsetx)+"px",top:((E.bh*W.data("y"))-50)+"px"})}if(W.hasClass("sfb")){W.css({opacity:0,left:(K*W.data("x")+offsetx)+"px",top:((E.bh*W.data("y"))+50)+"px"})}W.data("timer",setTimeout(function(){W.css({visibility:"visible"});if(W.hasClass("fade")){W.data("repo",W.css("opacity"));W.animate({opacity:1},{duration:W.data("speed")});if(E.ie){W.addClass("noFilterClass")}}if(W.hasClass("randomrotate")){W.transition({opacity:1,scale:1,left:(K*W.data("x")+offsetx)+"px",top:(Q*(W.data("y"))+I)+"px",rotate:0,x:0,y:0,duration:W.data("speed")});if(E.ie){W.addClass("noFilterClass")}}if(W.hasClass("lfr")||W.hasClass("lfl")||W.hasClass("sfr")||W.hasClass("sfl")||W.hasClass("lft")||W.hasClass("lfb")||W.hasClass("sft")||W.hasClass("sfb")){var Z=W.data("easing");if(Z==h){Z="linear"}W.data("repx",W.position().left);W.data("repy",W.position().top);W.data("repo",W.css("opacity"));W.animate({opacity:1,left:(K*W.data("x")+offsetx)+"px",top:E.bh*(W.data("y"))+"px"},{duration:W.data("speed"),easing:Z});if(E.ie){W.addClass("noFilterClass")}}},W.data("start")));if(W.data("end")!=h){W.data("timer-end",setTimeout(function(){if((E.ie||E.ie9)&&(W.hasClass("randomrotate")||W.hasClass("randomrotateout"))){W.removeClass("randomrotate").removeClass("randomrotateout").addClass("fadeout")}var aa=W.data("endspeed");if(aa==h){aa=W.data("speed")}var ac=W.data("repx");var ad=W.data("repy");var Z=W.data("repo");if(W.hasClass("ltr")||W.hasClass("ltl")||W.hasClass("str")||W.hasClass("stl")||W.hasClass("ltt")||W.hasClass("ltb")||W.hasClass("stt")||W.hasClass("stb")){ac=W.position().left;ad=W.position().top;if(W.hasClass("ltr")){ac=E.width+20}else{if(W.hasClass("ltl")){ac=0-W.width()-20}else{if(W.hasClass("ltt")){ad=0-W.height()-20}else{if(W.hasClass("ltb")){ad=E.height+20}else{if(W.hasClass("str")){ac=ac+50;Z=0}else{if(W.hasClass("stl")){ac=ac-50;Z=0}else{if(W.hasClass("stt")){ad=ad-50;Z=0}else{if(W.hasClass("stb")){ad=ad+50;Z=0}}}}}}}}var ab=W.data("endeasing");if(ab==h){ab="linear"}W.animate({opacity:Z,left:ac+"px",top:ad+"px"},{duration:W.data("endspeed"),easing:ab});if(E.ie){W.addClass("noFilterClass")}}else{if(W.hasClass("randomrotate")||W.hasClass("randomrotateout")){W.transition({opacity:0,scale:Math.random()*2+0.3,left:Math.random()*E.width+"px",top:Math.random()*E.height+"px",rotate:Math.random()*40,duration:aa});if(E.ie){W.addClass("noFilterClass")}}else{if(W.hasClass("lfr")||W.hasClass("lfl")||W.hasClass("sfr")||W.hasClass("sfl")||W.hasClass("lft")||W.hasClass("lfb")||W.hasClass("sft")||W.hasClass("sfb")){if(W.hasClass("lfr")){ac=E.width+20}else{if(W.hasClass("lfl")){ac=0-W.width()-20}else{if(W.hasClass("lft")){ad=0-W.height()-20}else{if(W.hasClass("lfb")){ad=E.height+20}}}}var ab=W.data("endeasing");if(ab==h){ab="linear"}W.animate({opacity:Z,left:ac+"px",top:ad+"px"},{duration:W.data("endspeed"),easing:ab});if(E.ie){W.addClass("noFilterClass")}}else{if(W.hasClass("fade")||W.hasClass("fadeout")){W.animate({opacity:0},{duration:aa});if(E.ie){W.addClass("noFilterClass")}}}}}},W.data("end")))}})}function y(E,G){G.cd=0;G.loop=0;if(G.stopAfterLoops!=h&&G.stopAfterLoops>-1){G.looptogo=G.stopAfterLoops}else{G.looptogo=9999999}if(G.stopAtSlide!=h&&G.stopAtSlide>-1){G.lastslidetoshow=G.stopAtSlide}else{G.lastslidetoshow=999}if(G.looptogo==0){G.stopLoop="on"}if(G.slideamount>1&&!(G.stopAfterLoops==0&&G.stopAtSlide==1)){var F=E.find(".tp-bannertimer");if(F.length>0){F.css({width:"0%"});F.animate({width:"100%"},{duration:(G.delay-100),queue:false,easing:"linear"})}F.data("opt",G);G.cdint=setInterval(function(){if(E.data("conthover-changed")==1){G.conthover=E.data("conthover");E.data("conthover-changed",0)}if(G.conthover!=1&&G.videoplaying!=true){G.cd=G.cd+100}if(G.videostartednow==1){E.trigger("revolution.slide.onvideoplay");G.videostartednow=0}if(G.videostoppednow==1){E.trigger("revolution.slide.onvideostop");G.videostoppednow=0}if(G.cd>=G.delay){G.cd=0;G.act=G.next;G.next=G.next+1;if(G.next>E.find(">ul >li").length-1){G.next=0;G.looptogo=G.looptogo-1;if(G.loop<=0){G.stopLoop="on"}}if(G.stopLoop=="on"&&G.next==G.lastslidetoshow-1){clearInterval(G.cdint);E.find(".tp-bannertimer").css({visibility:"hidden"});E.trigger("revolution.slide.onstop")}n(E,G);if(F.length>0){F.css({width:"0%"});F.animate({width:"100%"},{duration:(G.delay-100),queue:false,easing:"linear"})}}},100);E.hover(function(){if(G.onHoverStop=="on"){G.conthover=1;F.stop();E.trigger("revolution.slide.onpause")}},function(){if(E.data("conthover")!=1){E.trigger("revolution.slide.onresume");G.conthover=0;if(G.onHoverStop=="on"&&G.videoplaying!=true){F.animate({width:"100%"},{duration:((G.delay-G.cd)-100),queue:false,easing:"linear"})}}})}}})(jQuery); \ No newline at end of file diff --git a/public/js-plugin/sequence/css/sequence.css b/public/js-plugin/sequence/css/sequence.css new file mode 100755 index 0000000..fa9a36e --- /dev/null +++ b/public/js-plugin/sequence/css/sequence.css @@ -0,0 +1,325 @@ + +/* THEME STYLES */ + +#sequence { + margin: 0 auto; + position: relative; + overflow: hidden; + width: 100%; + /*max-width: 1280px;*/ + + background-repeat: no-repeat; + background-position: 50% 100%; + color: white; + font-size: 0.625em; + margin: 0 auto; + position: relative; + height: 550px; } + #sequence > .sequence-canvas { + height: 100%; + width: 100%; } + #sequence > .sequence-canvas > li { + position: absolute; + width: 100%; + height: 100%; + z-index: 1; + top: -50%; } + #sequence > .sequence-canvas > li img { + height: 74% !important; } + #sequence > .sequence-canvas li > * { + position: absolute; + /* only cause the left and opacity properties to transition */ + -webkit-transition-property: left, opacity; + -moz-transition-property: left, opacity; + -ms-transition-property: left, opacity; + -o-transition-property: left, opacity; + transition-property: left, opacity; } + +.sequence-next, +.sequence-prev { + color: white; + cursor: pointer; + display: none; + font-weight: bold; + padding: 10px 15px; + position: absolute; + top: 50%; + z-index: 1000; + height: 75px; + margin-top: -47.5px; } + +.sequence-pause { + bottom: 0; + cursor: pointer; + position: absolute; + z-index: 1000; } + +.sequence-paused { + opacity: 0.3; } + +.sequence-prev { + left: 3%; } + +.sequence-next { + right: 3%; } + +.sequence-prev img, +.sequence-next img { + height: 100%; + width: auto; } + +#sequence-preloader { + background: #d9d9d9; } + +.sequence-pagination { + bottom: 1%; + display: none; + right: 6%; + position: absolute; + z-index: 10; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + .sequence-pagination li { + display: inline-block; + *display: inline; + /* Hack for IE7 and below as they don't support inline-block */ + height: 140px; } + .sequence-pagination li img { + cursor: pointer; + opacity: 0.5; + -webkit-transition-duration: 1s; + -moz-transition-duration: 1s; + -ms-transition-duration: 1s; + -o-transition-duration: 1s; + transition-duration: 1s; + -webkit-transition-property: margin-bottom, opacity; + -moz-transition-property: margin-bottom, opacity; + -ms-transition-property: margin-bottom, opacity; + -o-transition-property: margin-bottom, opacity; + transition-property: margin-bottom, opacity; } + .sequence-pagination li img:hover { + margin-bottom: 4px; + -webkit-transition-duration: 0.3s; + -moz-transition-duration: 0.3s; + -ms-transition-duration: 0.3s; + -o-transition-duration: 0.3s; + transition-duration: 0.3s; } + .sequence-pagination li.current img { + opacity: 1; } + +h2 { + color: white; + font-weight: bold; + text-transform: uppercase; } + + +.sequence-next, +.sequence-prev { + position: absolute; + opacity: 0.6; + -webkit-transition-duration: 1s; + -moz-transition-duration: 1s; + -ms-transition-duration: 1s; + -o-transition-duration: 1s; + transition-duration: 1s; } + +.sequence-next:hover, +.sequence-prev:hover { + opacity: 1; + -webkit-transition-duration: 1s; + -moz-transition-duration: 1s; + -ms-transition-duration: 1s; + -o-transition-duration: 1s; + transition-duration: 1s; } + +.title { + font-size: 3.4em; + left: 65%; + width: 35%; + opacity: 0; + bottom: 1%; + z-index: 50; } + +.animate-in .title { + left: 50%; + opacity: 1; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + +.animate-out .title { + left: 35%; + opacity: 0; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + +.subtitle { + color: black; + font-size: 2em; + left: 35%; + width: 35%; + opacity: 0; + top: 101%; } + +.animate-in .subtitle { + left: 50%; + opacity: 1; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + +.animate-out .subtitle { + left: 65%; + opacity: 0; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + +.model { + left: 30%; + bottom: -48%; + opacity: 0; + position: relative; + height: auto !important; + max-height: 568px !important; + + /*min-width: 225px; + /* prevents the model from shrinking when the browser is resized */ + /* max-width: 266px;*/ } + +.animate-in .model { + left: 15%; + opacity: 1; + -webkit-transition-duration: 1s; + -moz-transition-duration: 1s; + -ms-transition-duration: 1s; + -o-transition-duration: 1s; + transition-duration: 1s; } + +.animate-out .model { + left: 15%; + opacity: 0; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + transition-duration: 0.5s; } + + + +@media only screen and (min-width: 992px) { + #sequence .title { + width: 42%; } } +@media only screen and (max-width: 838px) { + #sequence { + height: 550px; } + #sequence .model { + max-height: 530px !important; + width: auto; } } +@media only screen and (max-width: 768px) { + #sequence { + height: 250px; } + #sequence .title { + font-size: 2.8em; } + #sequence .subtitle { + font-size: 1.6em; } + #sequence .sequence-next, + #sequence .sequence-prev { + height: 60px; + margin-top: -40px; } + #sequence .model { + max-height: 480px !important; + width: auto; } } + #sequence .sequence-pagination { + opacity: 0; + visibility: hidden; } } +@media only screen and (max-width: 568px) { + #sequence .model { + left: 50%; + /*min-width: 40%;*/ + /*prevents the model from shrinking when the browser is resized*/ + /*width: 40%;*/ } + #sequence .animate-in .model { + left: 50%; + margin-left: -20%; } + #sequence .animate-out .model { + left: 50%; + margin-left: -20%; } + + #sequence .title { + background: #a1a1a1; + background: rgba(0, 0, 0, 0.3); + bottom: 0; + left: 100%; + padding: 4%; + bottom: -50% !important; + width: 100%; + z-index: 10; } + + #sequence .animate-in .title { + left: 0%; } + #sequence .animate-out .title { + left: -100%; } + #sequence .subtitle { + visibility: hidden; } + #sequence .sequence-pagination { + bottom: 40px; } + #sequence .sequence-pagination li img { + height: 100px; } } +@media only screen and (max-width: 518px) { + #sequence { + height: 450px; } } +@media only screen and (max-width: 468px) { + #sequence { + height: 415px; } + #sequence .sequence-pagination { + opacity: 0; + visibility: hidden; } } +@media only screen and (max-width: 418px) { + #sequence { + height: 375px; } } +@media only screen and (max-width: 368px) { + #sequence { + height: 175px; } + #sequence .title { + font-size: 2.2em; } } +@media only screen and (max-width: 320px) and (orientation: portrait) { + /*iphone portrait*/ + #sequence { + height: 210px; } + #sequence .model { + /*min-width: 45%;*/ + /*width: 45%;*/ } + #sequence .animate-in .model { + margin-left: -22.5%; } + #sequence .animate-out .model { + margin-left: -22.5%; } } +@media only screen and (min-width: 321px) and (max-width: 480px) and (orientation: landscape) { + #sequence { + height: 260px; } + #sequence .model { + /*min-width: 24%;*/ + /*width: 24%;*/ } + #sequence .animate-in .model { + left: 17.5%; + margin-left: 0; } + #sequence .animate-out .model { + left: 17.5%; + margin-left: 0; } + #sequence .sequence-pagination { + right: 17.5%; } } + + + diff --git a/public/js-plugin/sequence/images/bg-sequence.jpg b/public/js-plugin/sequence/images/bg-sequence.jpg new file mode 100755 index 0000000000000000000000000000000000000000..aff5fefa90fbaef7ec8178dc491cf5a065076057 GIT binary patch literal 8788 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 Zk$-ujw7L~rF=GG#002ovPDHLkV1k#LEHeNA literal 0 HcmV?d00001 diff --git a/public/js-plugin/sequence/images/bt-prev.png b/public/js-plugin/sequence/images/bt-prev.png new file mode 100644 index 0000000000000000000000000000000000000000..8a85e785199fd192378e1db14a0caa943db5d487 GIT binary patch literal 760 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≤im1G4ovBjzMF7s?ghVJLn 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

9(T&y9yz$ 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 Tw7TMjf&LU^RHT1OngsqIc5o<^ literal 0 HcmV?d00001 diff --git a/public/js-plugin/sequence/images/model2.png b/public/js-plugin/sequence/images/model2.png new file mode 100755 index 0000000000000000000000000000000000000000..28d47033d358306760fa9a901642d1df65a6b82b GIT binary patch literal 128037 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 literal 0 HcmV?d00001 diff --git a/public/js-plugin/sequence/images/model3.png b/public/js-plugin/sequence/images/model3.png new file mode 100755 index 0000000000000000000000000000000000000000..cfd37c0c82960ece83ba14e0a33659e957532d25 GIT binary patch literal 89463 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

BuW{o!2oMD+6XwzIY(J`hFun;NFkzA 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

)O0Zd3%LL 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

PRV{XLhoIs%u=^7;yglxs$_K&hNIp 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 literal 0 HcmV?d00001 diff --git a/public/js-plugin/sequence/images/sequence-logo.png b/public/js-plugin/sequence/images/sequence-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..4b2b833f8736e7518858ab5901bff833ec622c3e GIT binary patch literal 2656 zcmV-m3ZM0fP)V>IRB3Hx05LT$F)uMPuuMN#000TM zNkl>vog)o*7XFH<;vPVel-=D-IuXwlFVq6E znk{(cJOH?*zc!o$Xu?>Fh)^u(P-klZ-IZ=1o9H!K(Cxvw#^P*|H53pipm)giWk6fQ>61b4*)7h zT3Y~nO}Xp+5fKxN7PMfl?_8}P)vJ`^L$sa|b1*8XF8B@zpVS$&)Zf$31H=X@A|ebcy4$6dV2<2F zo&8eoyH3ikcm)0$JghbxJ|$(hwa{r1IKJa1sWC9{3PSrA2U)8YJoA7f*8o01e}DkkH-TqFx3$#s!UA%u_xVmtBgkt0gk3oSU}d0_V&?e10Dz?IT8Ly2 z4)4iAEsX|d=0{x8Oq_r^L5;Vrld{_-W!IB?a)F2VtV*|XXn(@vP-hoIo$ZD?Yo*VQ zmR}nh9ZiP6-?~wC$gA){gPC&5VWthtDRhe}DRl%Ff4v6qNh#w7euL9axTOhq1T7ys z!~G#x1Gt2cVf6j|JpB zDkwR+g{9s1L!I532EYRqQ+|__T|s`0+!;AjzfgX2?g(dz&H}AeZ@88ku2oFAuiPwX zv-k}n4e~1-a&k$Db@i^3vRfx*cSkznI$x~ha@;`J@e%BDp~WMc`rZN`E6M2%#)xC&cL`*LzzO-gEV2NxS( zKy#8r+x~0IeP;lEIQnlo6im6AoMLm*bLICvv+GSU?XYc9b~$~Pj!^VWdBK$X$emi+ zZkTe`@{#q_ZL}(;Z{#+5&Gmw5%6EMAN1YV1uqi13d=6alxz1|FFPa(OYU=08Z!Q$1 zvmUdQ(qxegalxhJ=6EW=$Foh~_|p3Aw9^zjNifPWes&?;I#1=v9R16LN|Q6$#!oFz$az5P0DU!VV9QEm@Gnm z);riAkUN9ey}HCpQ>I*Hu#mnVpv*8&tDSq)or_zhJY~wg~yEnpH05&CML6$)EYbwXvbwcJLd^jLol9-3wobM~U zSlr3kq)l3hbiwrAg@!MD$Jdr_cLZtpdZ@DvL~PB3a|k8X?U30Hrp}TR3IO1XCYhsQ zXy}%u+`?-pQl^}fZz;LCcIA63OatyGeM4642YC0bXUc6@O3pSZyUNLe%Af%28`%9) z?u?bQtmhD+4mAm)QtB0WIJr@gJC-ehlqu(q_Lh>{woAWW+ zg=@HomhK#OC9M>Hv}Njjkv^~0G&l)9?~BSk>KdVm8nApYr)(`#eQCM5oC6i(ICJCY zV?lQSeoC)R(!p2GTL5?|C6kUP3F;v}i=^y+(O|UTE!7!>**1otToRL&$#aeA>4!Rt za~n+$q@bnK!CG8^21@E*EiVCbo3KyHu4h7UGEW5_mf99#`Bx`E?$RKQ|9CH})B$q# zfUuxFP6xViVN7axw4|n;quj7IzUH_@$aGpwn<@?0ftArS<#Oj278>&P3Zj3tzGHyg zCbWiYDYdu4>8`nfeoW3CW6d(H9YZU0eDMOOPU}A8T$=7F3{~XW*)nyEzADYsaUzYG z?rLYe8aqO<5}z zA^BLN;@{KKrIY(BPQ!6~EFiamKPcB!o?bzOl`f^S3OJ6PZUy{o;H|)^d>f**Ej)yigJK>&ugO+7{VSr)auJpzvX#-|xgm@D^CXLp#&dXtphWHUt;>!`RU znFDy6JQX{GmUes-1Ch~D-9hu8JIG?>5EjG4!~x>51JXOBs`9Vu2bJiII_hcNRgL!(FhFLM!(1U4U( z6s^U=uYHM#@Ig?z-Cu&0y-LJW<2fs+OY%a*6XQ86XvF^j&qYD!{!`qDC&F`4P#w~z zW+1|j=d7S>F8wRw&%tw1&?}}q#%%v^B=#zQ2h?-rc+43Q5fKsbcjG@yYmLdv>acqN O0000<{99&|-mbW?9;ba!ELWdK2BZ(?O2Mrm?o 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

@ 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.frames.eq(l.settings.preloadTheseFrames[i-1]-1).find("img").each(function(){r.push(e(this)[0])});else for(var s=t;s>0;s--)r.push(e("body").find('img[src="'+l.settings.preloadTheseImages[s-1]+'"]'));return r}function y(t,n){function c(){var t=e(f),r=e(l);s&&(l.length?s.reject(u,t,r):s.resolve(u));e.isFunction(n)&&n.call(i,u,t,r)}function h(t,n){if(t.src===r||e.inArray(t,a)!==-1)return;a.push(t);n?l.push(t):f.push(t);e.data(t,"imagesLoaded",{isBroken:n,src:t.src});o&&s.notifyWith(e(t),[n,u,e(f),e(l)]);if(u.length===a.length){setTimeout(c);u.unbind(".imagesLoaded")}}var r="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",i=t,s=e.isFunction(e.Deferred)?e.Deferred():0,o=e.isFunction(s.notify),u=i.find("img").add(i.filter("img")),a=[],f=[],l=[];e.isPlainObject(n)&&e.each(n,function(e,t){e==="callback"?n=t:s&&s[e](t)});u.length?u.bind("load.imagesLoaded error.imagesLoaded",function(e){h(e.target,e.type==="error")}).each(function(t,n){var i=n.src,s=e.data(n,"imagesLoaded");if(s&&s.src===i){h(n,s.isBroken);return}if(n.complete&&n.naturalWidth!==undefined){h(n,n.naturalWidth===0||n.naturalHeight===0);return}if(n.readyState||n.complete){n.src=r;n.src=i}}):c()}function S(){function t(e,t){var i,s;for(s in t){s==="left"||s==="right"?i=n[s]:i=s;e===parseFloat(i)&&r(l,t[s])}}function s(){l.canvas.on("touchmove.sequence",o);c=null;p=!1}function o(e){l.settings.swipePreventsDefault&&e.preventDefault();if(p){var t=e.originalEvent.touches[0].pageX,n=e.originalEvent.touches[0].pageY,i=c-t,o=h-n;if(Math.abs(i)>=l.settings.swipeThreshold){s();i>0?r(l,l.settings.swipeEvents.left):r(l,l.settings.swipeEvents.right)}else if(Math.abs(o)>=l.settings.swipeThreshold){s();o>0?r(l,l.settings.swipeEvents.down):r(l,l.settings.swipeEvents.up)}}}function f(e){if(e.originalEvent.touches.length===1){c=e.originalEvent.touches[0].pageX;h=e.originalEvent.touches[0].pageY;p=!0;l.canvas.on("touchmove.sequence",o)}}e(l.settings.preloader).remove();l.nextButton=a(l,l.settings.nextButton,".sequence-next");l.prevButton=a(l,l.settings.prevButton,".sequence-prev");l.pauseButton=a(l,l.settings.pauseButton,".sequence-pause");l.pagination=a(l,l.settings.pagination,".sequence-pagination");l.nextButton!==undefined&&l.nextButton!==!1&&l.settings.showNextButtonOnInit===!0&&l.nextButton.show();l.prevButton!==undefined&&l.prevButton!==!1&&l.settings.showPrevButtonOnInit===!0&&l.prevButton.show();l.pauseButton!==undefined&&l.pauseButton!==!1&&l.settings.showPauseButtonOnInit===!0&&l.pauseButton.show();if(l.settings.pauseIcon!==!1){l.pauseIcon=a(l,l.settings.pauseIcon,".sequence-pause-icon");l.pauseIcon!==undefined&&l.pauseIcon.hide()}else l.pauseIcon=undefined;if(l.pagination!==undefined&&l.pagination!==!1){l.paginationLinks=l.pagination.children();l.paginationLinks.on("click.sequence",function(){var t=e(this).index()+1;l.goTo(t)});l.settings.showPaginationOnInit===!0&&l.pagination.show()}l.nextFrameID=l.settings.startingFrameID;if(l.settings.hashTags===!0){l.frames.each(function(){l.frameHashID.push(e(this).prop(l.getHashTagFrom))});l.currentHashTag=location.hash.replace("#","");if(l.currentHashTag===undefined||l.currentHashTag==="")l.nextFrameID=l.settings.startingFrameID;else{l.frameHashIndex=e.inArray(l.currentHashTag,l.frameHashID);l.frameHashIndex!==-1?l.nextFrameID=l.frameHashIndex+1:l.nextFrameID=l.settings.startingFrameID}}l.nextFrame=l.frames.eq(l.nextFrameID-1);l.nextFrameChildren=l.nextFrame.children();l.pagination!==undefined&&e(l.paginationLinks[l.settings.startingFrameID-1]).addClass("current");if(l.transitionsSupported)if(!l.settings.animateStartingFrameIn){l.currentFrameID=l.nextFrameID;l.settings.moveActiveFrameToTop&&l.nextFrame.css("z-index",l.numberOfFrames);i(l.prefix,l.nextFrameChildren,"0s");l.nextFrame.addClass("animate-in");if(l.settings.hashTags&&l.settings.hashChangesOnFirstFrame){l.currentHashTag=l.nextFrame.prop(l.getHashTagFrom);document.location.hash="#"+l.currentHashTag}setTimeout(function(){i(l.prefix,l.nextFrameChildren,"")},100);u(l,!0,l.settings.autoPlayDelay)}else if(l.settings.reverseAnimationsWhenNavigatingBackwards&&l.settings.autoPlayDirection-1&&l.settings.animateStartingFrameIn){i(l.prefix,l.nextFrameChildren,"0s");l.nextFrame.addClass("animate-out");l.goTo(l.nextFrameID,-1,!0)}else l.goTo(l.nextFrameID,1,!0);else{l.container.addClass("sequence-fallback");l.currentFrameID=l.nextFrameID;if(l.settings.hashTags&&l.settings.hashChangesOnFirstFrame){l.currentHashTag=l.nextFrame.prop(l.getHashTagFrom);document.location.hash="#"+l.currentHashTag}l.frames.addClass("animate-in");l.frames.not(":eq("+(l.nextFrameID-1)+")").css({display:"none",opacity:0});u(l,!0,l.settings.autoPlayDelay)}l.nextButton!==undefined&&l.nextButton.bind("click.sequence",function(){l.next()});l.prevButton!==undefined&&l.prevButton.bind("click.sequence",function(){l.prev()});l.pauseButton!==undefined&&l.pauseButton.bind("click.sequence",function(){l.pause(!0)});if(l.settings.keyNavigation){var n={left:37,right:39};e(document).bind("keydown.sequence",function(e){var n=String.fromCharCode(e.keyCode);if(n>0&&n<=l.numberOfFrames&&l.settings.numericKeysGoToFrames){l.nextFrameID=n;l.goTo(l.nextFrameID)}t(e.keyCode,l.settings.keyEvents);t(e.keyCode,l.settings.customKeyEvents)})}l.settings.pauseOnHover&&l.settings.autoPlay&&!l.hasTouch&&l.canvas.on({"mouseenter.sequence":function(){l.isBeingHoveredOver=!0;l.isHardPaused||l.pause()},"mouseleave.sequence":function(){l.isBeingHoveredOver=!1;l.isHardPaused||l.unpause()}});l.settings.hashTags&&e(window).bind("hashchange.sequence",function(){var t=location.hash.replace("#","");if(l.currentHashTag!==t){l.currentHashTag=t;l.frameHashIndex=e.inArray(l.currentHashTag,l.frameHashID);if(l.frameHashIndex!==-1){l.nextFrameID=l.frameHashIndex+1;l.goTo(l.nextFrameID)}}});if(l.settings.swipeNavigation&&l.hasTouch){var c,h,p=!1;l.canvas.on("touchstart.sequence",f)}}var l=this;l.container=e(n);l.canvas=l.container.children(".sequence-canvas");l.frames=l.canvas.children("li");try{Modernizr.prefixed;if(Modernizr.prefixed===undefined)throw"undefined"}catch(c){f.modernizr()}var h={WebkitTransition:"-webkit-",MozTransition:"-moz-",OTransition:"-o-",msTransition:"-ms-",transition:""},p={WebkitTransition:"webkitTransitionEnd.sequence webkitAnimationEnd.sequence",MozTransition:"transitionend.sequence animationend.sequence",OTransition:"otransitionend.sequence oanimationend.sequence",msTransition:"MSTransitionEnd.sequence MSAnimationEnd.sequence",transition:"transitionend.sequence animationend.sequence"};l.prefix=h[Modernizr.prefixed("transition")],l.transitionProperties={},l.transitionEnd=p[Modernizr.prefixed("transition")],l.numberOfFrames=l.frames.length,l.transitionsSupported=l.prefix!==undefined?!0:!1,l.hasTouch="ontouchstart"in window?!0:!1,l.isPaused=!1,l.isBeingHoveredOver=!1,l.container.removeClass("sequence-destroyed");l.paused=function(){},l.unpaused=function(){},l.beforeNextFrameAnimatesIn=function(){},l.afterNextFrameAnimatesIn=function(){},l.beforeCurrentFrameAnimatesOut=function(){},l.afterCurrentFrameAnimatesOut=function(){},l.afterLoaded=function(){};l.destroyed=function(){};l.settings=e.extend({},o,s);l.settings.preloader=a(l,l.settings.preloader,".sequence-preloader");l.isStartingFrame=l.settings.animateStartingFrameIn?!0:!1;l.settings.unpauseDelay=l.settings.unpauseDelay===null?l.settings.autoPlayDelay:l.settings.unpauseDelay;l.getHashTagFrom=l.settings.hashDataAttribute?"data-sequence-hashtag":"id";l.frameHashID=[];l.direction=l.settings.autoPlayDirection;l.settings.hideFramesUntilPreloaded&&l.settings.preloader!==undefined&&l.settings.preloader!==!1&&l.frames.hide();l.prefix==="-o-"&&(l.transitionsSupported=f.operaTest());l.frames.removeClass("animate-in");var v=l.settings.preloadTheseFrames.length,m=l.settings.preloadTheseImages.length;if(l.settings.preloader===undefined||l.settings.preloader===!1||v===0&&m===0)if(t===!0){d();e(this).unbind("load.sequence")}else e(window).bind("load.sequence",function(){d();e(this).unbind("load.sequence")});else{var b=g(v),w=g(m,!0),E=e(b.concat(w));y(E,d)}}var t=!1;e(window).bind("load",function(){t=!0});n.prototype={startAutoPlay:function(e){var t=this;e=e===undefined?t.settings.autoPlayDelay:e;t.unpause();u(t);t.autoPlayTimer=setTimeout(function(){t.settings.autoPlayDirection===1?t.next():t.prev()},e)},stopAutoPlay:function(){var e=this;e.pause(!0);clearTimeout(e.autoPlayTimer)},pause:function(e){var t=this;if(!t.isSoftPaused){if(t.pauseButton!==undefined){t.pauseButton.addClass("paused");t.pauseIcon!==undefined&&t.pauseIcon.show()}t.paused();t.isSoftPaused=!0;t.isHardPaused=e?!0:!1;t.isPaused=!0;u(t)}else t.unpause()},unpause:function(e){var t=this;if(t.pauseButton!==undefined){t.pauseButton.removeClass("paused");t.pauseIcon!==undefined&&t.pauseIcon.hide()}t.isSoftPaused=!1;t.isHardPaused=!1;t.isPaused=!1;if(!t.active){e!==!1&&t.unpaused();u(t,!0,t.settings.unpauseDelay)}else t.delayUnpause=!0},next:function(){var e=this;e.nextFrameID=e.currentFrameID!==e.numberOfFrames?e.currentFrameID+1:1;e.goTo(e.nextFrameID,1)},prev:function(){var e=this;e.nextFrameID=e.currentFrameID===1?e.numberOfFrames:e.currentFrameID-1;e.goTo(e.nextFrameID,-1)},goTo:function(t,n,r){var o=this;t=parseFloat(t);var a=r===!0?0:o.settings.transitionThreshold;if(t===o.currentFrameID||o.settings.navigationSkip&&o.navigationSkipThresholdActive||!o.settings.navigationSkip&&o.active||!o.transitionsSupported&&o.active||!o.settings.cycle&&n===1&&o.currentFrameID===o.numberOfFrames||!o.settings.cycle&&n===-1&&o.currentFrameID===1||o.settings.preventReverseSkipping&&o.direction!==n&&o.active)return!1;if(o.settings.navigationSkip&&o.active){o.navigationSkipThresholdActive=!0;o.settings.fadeFrameWhenSkipped&&o.nextFrame.stop().animate({opacity:0},o.settings.fadeFrameTime);clearTimeout(o.transitionThresholdTimer);setTimeout(function(){o.navigationSkipThresholdActive=!1},o.settings.navigationSkipThreshold)}if(!o.active||o.settings.navigationSkip){o.active=!0;u(o);n===undefined?o.direction=t>o.currentFrameID?1:-1:o.direction=n;o.currentFrame=o.canvas.children(".animate-in");o.nextFrame=o.frames.eq(t-1);o.currentFrameChildren=o.currentFrame.children();o.nextFrameChildren=o.nextFrame.children();if(o.pagination!==undefined){o.paginationLinks.removeClass("current");e(o.paginationLinks[t-1]).addClass("current")}if(o.transitionsSupported){if(o.currentFrame.length!==undefined){o.beforeCurrentFrameAnimatesOut();o.settings.moveActiveFrameToTop&&o.currentFrame.css("z-index",1);i(o.prefix,o.nextFrameChildren,"0s");if(!o.settings.reverseAnimationsWhenNavigatingBackwards||o.direction===1){o.nextFrame.removeClass("animate-out");i(o.prefix,o.currentFrameChildren,"")}else if(o.settings.reverseAnimationsWhenNavigatingBackwards&&o.direction===-1){o.nextFrame.addClass("animate-out");s(o)}}else o.isStartingFrame=!1;o.active=!0;o.currentFrame.unbind(o.transitionEnd);o.nextFrame.unbind(o.transitionEnd);o.settings.fadeFrameWhenSkipped&&o.nextFrame.css("opacity",1);o.beforeNextFrameAnimatesIn();o.settings.moveActiveFrameToTop&&o.nextFrame.css("z-index",o.numberOfFrames);if(!o.settings.reverseAnimationsWhenNavigatingBackwards||o.direction===1){setTimeout(function(){i(o.prefix,o.nextFrameChildren,"");f(o,o.nextFrame,o.nextFrameChildren,"in");(o.afterCurrentFrameAnimatesOut!=="function () {}"||o.settings.transitionThreshold===!0&&r!==!0)&&f(o,o.currentFrame,o.currentFrameChildren,"out",!0,1)},50);setTimeout(function(){o.currentFrame.toggleClass("animate-out animate-in");if(o.settings.transitionThreshold!==!0||r===!0)o.transitionThresholdTimer=setTimeout(function(){o.nextFrame.addClass("animate-in")},a)},50)}else if(o.settings.reverseAnimationsWhenNavigatingBackwards&&o.direction===-1){setTimeout(function(){i(o.prefix,o.currentFrameChildren,"");i(o.prefix,o.nextFrameChildren,"");s(o);f(o,o.nextFrame,o.nextFrameChildren,"in");(o.afterCurrentFrameAnimatesOut!=="function () {}"||o.settings.transitionThreshold===!0&&r!==!0)&&f(o,o.currentFrame,o.currentFrameChildren,"out",!0,-1)},50);setTimeout(function(){o.currentFrame.removeClass("animate-in");if(o.settings.transitionThreshold!==!0||r===!0)o.transitionThresholdTimer=setTimeout(function(){o.nextFrame.toggleClass("animate-out animate-in")},a)},50)}}else{function c(){l(o);o.active=!1;u(o,!0,o.settings.autoPlayDelay)}switch(o.settings.fallback.theme){case"fade":o.frames.css({position:"relative"});o.beforeCurrentFrameAnimatesOut();o.currentFrame=o.frames.eq(o.currentFrameID-1);o.currentFrame.animate({opacity:0},o.settings.fallback.speed,function(){o.currentFrame.css({display:"none","z-index":"1"});o.afterCurrentFrameAnimatesOut();o.beforeNextFrameAnimatesIn();o.nextFrame.css({display:"block","z-index":o.numberOfFrames}).animate({opacity:1},500,function(){o.afterNextFrameAnimatesIn()});c()});o.frames.css({position:"relative"});break;case"slide":default:var h={},p={},d={};if(o.direction===1){h.left="-100%";p.left="100%"}else{h.left="100%";p.left="-100%"}d.left="0";d.opacity=1;o.currentFrame=o.frames.eq(o.currentFrameID-1);o.beforeCurrentFrameAnimatesOut();o.currentFrame.animate(h,o.settings.fallback.speed,function(){o.afterCurrentFrameAnimatesOut()});o.beforeNextFrameAnimatesIn();o.nextFrame.show().css(p);o.nextFrame.animate(d,o.settings.fallback.speed,function(){c();o.afterNextFrameAnimatesIn()})}}o.currentFrameID=t}},destroy:function(t){var n=this;n.container.addClass("sequence-destroyed");n.nextButton!==undefined&&n.nextButton.unbind("click.sequence");n.prevButton!==undefined&&n.prevButton.unbind("click.sequence");n.pauseButton!==undefined&&n.pauseButton.unbind("click.sequence");n.pagination!==undefined&&n.paginationLinks.unbind("click.sequence");e(document).unbind("keydown.sequence");n.canvas.unbind("mouseenter.sequence, mouseleave.sequence, touchstart.sequence, touchmove.sequence");e(window).unbind("hashchange.sequence");n.stopAutoPlay();clearTimeout(n.transitionThresholdTimer);n.canvas.children("li").remove();n.canvas.prepend(n.frames);n.frames.removeClass("animate-in animate-out").removeAttr("style");n.frames.eq(n.currentFrameID-1).addClass("animate-in");n.nextButton!==undefined&&n.nextButton!==!1&&n.nextButton.hide();n.prevButton!==undefined&&n.prevButton!==!1&&n.prevButton.hide();n.pauseButton!==undefined&&n.pauseButton!==!1&&n.pauseButton.hide();n.pauseIcon!==undefined&&n.pauseIcon!==!1&&n.pauseIcon.hide();n.pagination!==undefined&&n.pagination!==!1&&n.pagination.hide();t!==undefined&&t();n.destroyed();n.container.removeData()}};var r=function(e,t){switch(t){case"next":e.next();break;case"prev":e.prev();break;case"pause":e.pause(!0)}},i=function(e,t,n){t.css(o(e,{"transition-duration":n,"transition-delay":n,"transition-timing-function":""}))},s=function(t){var n=[],r=[];t.currentFrameChildren.each(function(){n.push(parseFloat(e(this).css(t.prefix+"transition-duration").replace("s",""))+parseFloat(e(this).css(t.prefix+"transition-delay").replace("s","")))});t.nextFrameChildren.each(function(){r.push(parseFloat(e(this).css(t.prefix+"transition-duration").replace("s",""))+parseFloat(e(this).css(t.prefix+"transition-delay").replace("s","")))});var i=Math.max.apply(Math,n),s=Math.max.apply(Math,r),u=i-s,a=0,f=0;u<0&&!t.settings.preventDelayWhenReversingAnimations?a=Math.abs(u):u>0&&(f=Math.abs(u));var l=function(n,r,i,s){r.each(function(){var r=parseFloat(e(this).css(t.prefix+"transition-duration").replace("s","")),u=parseFloat(e(this).css(t.prefix+"transition-delay").replace("s","")),a=e(this).css(t.prefix+"transition-timing-function");if(a.indexOf("cubic-bezier")>=0){var f=a.replace("cubic-bezier(","").replace(")","").split(",");e.each(f,function(e,t){f[e]=parseFloat(t)});var l=[1-f[2],1-f[3],1-f[0],1-f[1]];a="cubic-bezier("+l+")"}else a="linear";var c=r+u;n["transition-duration"]=r+"s";n["transition-delay"]=i-c+s+"s";n["transition-timing-function"]=a;e(this).css(o(t.prefix,n))})};l(t.transitionProperties,t.currentFrameChildren,i,a);l(t.transitionProperties,t.nextFrameChildren,s,f)},o=function(e,t){var n={};for(var r in t)n[e+r]=t[r];return n},u=function(e,t,n){if(t===!0){if(e.settings.autoPlay&&!e.isSoftPaused){clearTimeout(e.autoPlayTimer);e.autoPlayTimer=setTimeout(function(){e.settings.autoPlayDirection===1?e.next():e.prev()},n)}}else clearTimeout(e.autoPlayTimer)},a=function(t,n,r){switch(n){case!1:return undefined;case!0:r===".sequence-preloader"&&c.defaultPreloader(t.container,t.transitionsSupported,t.prefix);return e(r);default:return e(n)}},f=function(t,n,r,i,s,o){if(i==="out")var u=function(){t.afterCurrentFrameAnimatesOut();t.settings.transitionThreshold===!0&&(o===1?t.nextFrame.addClass("animate-in"):o===-1&&t.nextFrame.toggleClass("animate-out animate-in"))};else if(i==="in")var u=function(){t.afterNextFrameAnimatesIn();l(t);t.active=!1;if(!t.isHardPaused&&!t.isBeingHoveredOver)if(!t.delayUnpause)t.unpause(!1);else{t.delayUnpause=!1;t.unpause()}};r.data("animationEnded",!1);n.bind(t.transitionEnd,function(i){e(i.target).data("animationEnded",!0);var s=!0;r.each(function(){if(e(this).data("animationEnded")===!1){s=!1;return!1}});if(s){n.unbind(t.transitionEnd);u()}})},l=function(t){if(t.settings.hashTags){t.currentHashTag=t.nextFrame.prop(t.getHashTagFrom);t.frameHashIndex=e.inArray(t.currentHashTag,t.frameHashID);if(t.frameHashIndex!==-1&&(t.settings.hashChangesOnFirstFrame||!t.isStartingFrame||!t.transitionsSupported)){t.nextFrameID=t.frameHashIndex+1;document.location.hash="#"+t.currentHashTag}else{t.nextFrameID=t.settings.startingFrameID;t.isStartingFrame=!1}}},c={modernizr:function(){window.Modernizr=function(e,t,n){function r(e){v.cssText=e}function i(e,t){return r(prefixes.join(e+";")+(t||""))}function s(e,t){return typeof e===t}function o(e,t){return!!~(""+e).indexOf(t)}function u(e,t){for(var r in e){var i=e[r];if(!o(i,"-")&&v[i]!==n)return t=="pfx"?i:!0}return!1}function a(e,t,r){for(var i in e){var o=t[e[i]];if(o!==n)return r===!1?e[i]:s(o,"function")?o.bind(r||t):o}return!1}function f(e,t,n){var r=e.charAt(0).toUpperCase()+e.slice(1),i=(e+" "+b.join(r+" ")+r).split(" ");return s(t,"string")||s(t,"undefined")?u(i,t):(i=(e+" "+w.join(r+" ")+r).split(" "),a(i,t,n))}var l="2.6.1",c={},h=t.documentElement,p="modernizr",d=t.createElement(p),v=d.style,m,g={}.toString,y="Webkit Moz O ms",b=y.split(" "),w=y.toLowerCase().split(" "),E={svg:"http://www.w3.org/2000/svg"},S={},x={},T={},N=[],C=N.slice,k,L={}.hasOwnProperty,A;!s(L,"undefined")&&!s(L.call,"undefined")?A=function(e,t){return L.call(e,t)}:A=function(e,t){return t in e&&s(e.constructor.prototype[t],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(e){var t=self;if(typeof t!="function")throw new TypeError;var n=C.call(arguments,1),r=function(){if(self instanceof r){var i=function(){};i.prototype=t.prototype;var s=new i,o=t.apply(s,n.concat(C.call(arguments)));return Object(o)===o?o:s}return t.apply(e,n.concat(C.call(arguments)))};return r}),S.svg=function(){return!!t.createElementNS&&!!t.createElementNS(E.svg,"svg").createSVGRect};for(var O in S)A(S,O)&&(k=O.toLowerCase(),c[k]=S[O](),N.push((c[k]?"":"no-")+k));return c.addTest=function(e,t){if(typeof e=="object")for(var r in e)A(e,r)&&c.addTest(r,e[r]);else{e=e.toLowerCase();if(c[e]!==n)return c;t=typeof t=="function"?t():t,enableClasses&&(h.className+=" "+(t?"":"no-")+e),c[e]=t}return c},r(""),d=m=null,c._version=l,c._domPrefixes=w,c._cssomPrefixes=b,c.testProp=function(e){return u([e])},c.testAllProps=f,c.prefixed=function(e,t,n){return t?f(e,t,n):f(e,"pfx")},c}(self,self.document)},defaultPreloader:function(t,n,r){var i='

';e("head").append("");t.prepend(i);if(!Modernizr.svg&&!n){e(".sequence-preloader").prepend('
');setInterval(function(){e(".sequence-preloader .circle").fadeToggle(500)},500)}else n||setInterval(function(){e(".sequence-preloader").fadeToggle(500)},500)},operaTest:function(){e("body").append('');var t=e("#sequence-opera-test");t.css("-o-transition","1s");return t.css("-o-transition")!=="1s"?!1:!0}},h={startingFrameID:1,cycle:!0,animateStartingFrameIn:!1,transitionThreshold:!1,reverseAnimationsWhenNavigatingBackwards:!0,preventDelayWhenReversingAnimations:!1,moveActiveFrameToTop:!0,autoPlay:!0,autoPlayDirection:1,autoPlayDelay:5e3,navigationSkip:!0,navigationSkipThreshold:250,fadeFrameWhenSkipped:!0,fadeFrameTime:150,preventReverseSkipping:!1,nextButton:!1,showNextButtonOnInit:!0,prevButton:!1,showPrevButtonOnInit:!0,pauseButton:!1,unpauseDelay:null,pauseOnHover:!0,pauseIcon:!1,showPauseButtonOnInit:!0,pagination:!1,showPaginationOnInit:!0,preloader:!1,preloadTheseFrames:[1],preloadTheseImages:[],hideFramesUntilPreloaded:!0,prependPreloadingComplete:!0,hidePreloaderUsingCSS:!0,hidePreloaderDelay:0,keyNavigation:!0,numericKeysGoToFrames:!0,keyEvents:{left:"prev",right:"next"},customKeyEvents:{},swipeNavigation:!0,swipeThreshold:20,swipePreventsDefault:!1,swipeEvents:{left:"prev",right:"next",up:!1,down:!1},hashTags:!1,hashDataAttribute:!1,hashChangesOnFirstFrame:!1,fallback:{theme:"slide",speed:500}};e.fn.sequence=function(t){return this.each(function(){e.data(this,"sequence")||e.data(this,"sequence",new n(e(this),t,h,c))})}})(jQuery); \ No newline at end of file diff --git a/public/js-plugin/sequence/js/sequence.jquery.js b/public/js-plugin/sequence/js/sequence.jquery.js new file mode 100755 index 0000000..17c1e9f --- /dev/null +++ b/public/js-plugin/sequence/js/sequence.jquery.js @@ -0,0 +1,1236 @@ +/* +Sequence.js (http://www.sequencejs.com) +Version: 0.9 Release Candidate +Author: Ian Lunn @IanLunn +Author URL: http://www.ianlunn.co.uk/ +Github: https://github.com/IanLunn/Sequence + +This is a FREE script and is available under a MIT License: +http://www.opensource.org/licenses/mit-license.php + +Sequence.js and its dependencies are (c) Ian Lunn Design 2012 unless otherwise stated. + +Sequence also relies on the following open source scripts: + +- jQuery imagesLoaded 2.1.0 (http://github.com/desandro/imagesloaded) + Paul Irish et al + Available under a MIT License: http://www.opensource.org/licenses/mit-license.php + +- jQuery TouchWipe 1.1.1 (http://www.netcu.de/jquery-touchwipe-iphone-ipad-library) + Andreas Waltl, netCU Internetagentur (http://www.netcu.de) + Available under a MIT License: http://www.opensource.org/licenses/mit-license.php + +- Modernizr 2.6.1 Custom Build (http://modernizr.com/) + Copyright (c) Faruk Ates, Paul Irish, Alex Sexton + Available under the BSD and MIT licenses: www.modernizr.com/license/ + */ + +;(function($) { + var windowLoaded = false; + $(window).bind("load", function() { + windowLoaded = true; + }); + + function Sequence(element, options, defaults, get) { + var self = this; + self.container = $(element); //the Sequence containing element + self.canvas = self.container.children('.sequence-canvas'); //the Sequence canvas which holds Sequence's frames (
  • elements) + self.frames = self.canvas.children('li'); //the Sequence frames (top level
  • elements within the Sequence canvas) + + try { //is Modernizr.prefixed installed? + Modernizr.prefixed; + if(Modernizr.prefixed === undefined){ + throw "undefined"; + } + } + catch(err) { //if not...get the custom build necessary for Sequence + get.modernizr(); + } + + var prefixes = { //convert JS transition names to CSS names + 'WebkitTransition' : '-webkit-', + 'MozTransition' : '-moz-', + 'OTransition' : '-o-', + 'msTransition' : '-ms-', + 'transition' : '' + }, + transitions = { //convert JS transition names to JS transition end and animation end event names (also apply a classname of .sequence to the event) + 'WebkitTransition' : 'webkitTransitionEnd.sequence webkitAnimationEnd.sequence', + 'MozTransition' : 'transitionend.sequence animationend.sequence', + 'OTransition' : 'otransitionend.sequence oanimationend.sequence', + 'msTransition' : 'MSTransitionEnd.sequence MSAnimationEnd.sequence', + 'transition' : 'transitionend.sequence animationend.sequence' + }; + + self.prefix = prefixes[Modernizr.prefixed('transition')], //work out the CSS prefix for the browser being used (-webkit- for example) + self.transitionProperties = {}, + self.transitionEnd = transitions[Modernizr.prefixed('transition')], //work out the JS transitionEnd name for the browser being used (webkitTransitionEnd webkitAnimationEnd for example) + self.numberOfFrames = self.frames.length, //number of frames (
  • ) Sequence consists of + + self.transitionsSupported = (self.prefix !== undefined) ? true : false, //determine if transitions are supported + self.hasTouch = ("ontouchstart" in window) ? true : false, //determine if this is a touch enabled device + self.isPaused = false, //whether Sequence is paused + self.isBeingHoveredOver = false, //whether the Sequence canvas is currently being hovered over + + self.container.removeClass('sequence-destroyed'); //if Sequence is destroyed using .destroy(), it is given a clas of "destroy", remove that now if present + + //CALLBACKS + self.paused = function() {}, //executes when Sequence is paused + self.unpaused = function() {}, //executes when Sequence is unpaused + + self.beforeNextFrameAnimatesIn = function() {}, //executes before the next frame animates in + self.afterNextFrameAnimatesIn = function() {}, //executes after the next frame animates in + self.beforeCurrentFrameAnimatesOut = function() {}, //executes before the current frame animates out + self.afterCurrentFrameAnimatesOut = function() {}, //executes after the current frame animates out + + self.afterLoaded = function() {}; //executes after Sequence is initiated + self.destroyed = function() {}; //executes when Sequence is destroyed via the destory() function + + //INIT + self.settings = $.extend({}, defaults, options); //combine default options with developer defined ones + self.settings.preloader = renderUiElements(self, self.settings.preloader, '.sequence-preloader'); //set up the preloader and save it + self.isStartingFrame = (self.settings.animateStartingFrameIn) ? true : false; //determine if the first frame should animate in + self.settings.unpauseDelay = (self.settings.unpauseDelay === null) ? self.settings.autoPlayDelay : self.settings.unpauseDelay; //if the unpauseDelay is not specified, make it the same as the autoPlayDelay speed + self.getHashTagFrom = (self.settings.hashDataAttribute) ? "data-sequence-hashtag": "id"; //get the hashtag from the ID or data attribute? + self.frameHashID = []; //array that matches frames with has IDs + self.direction = self.settings.autoPlayDirection; + + if(self.settings.hideFramesUntilPreloaded && self.settings.preloader !== undefined && self.settings.preloader !== false) { //if using a preloader and hiding frames until preloading has completed... + self.frames.hide(); //hide Sequence's frames + } + + if(self.prefix === "-o-") { //if Opera prefixes are required... + self.transitionsSupported = get.operaTest(); //run a test to see if Opera correctly supports transitions (Opera 11 has bugs relating to transitions) + } + + self.frames.removeClass("animate-in"); //remove any instance of "animate-in", which should be used incase JS is disabled + + //functionality to run once Sequence has preloaded + function oncePreloaded() { + self.afterLoaded(); //callback + if(self.settings.hideFramesUntilPreloaded && self.settings.preloader !== undefined && self.settings.preloader !== false) { + self.frames.show(); + } + if(self.settings.preloader !== undefined && self.settings.preloader !== false){ + if(self.settings.hidePreloaderUsingCSS && self.transitionsSupported) { + self.prependPreloadingCompleteTo = (self.settings.prependPreloadingComplete === true) ? self.settings.preloader : $(self.settings.prependPreloadingComplete); + self.prependPreloadingCompleteTo.addClass("preloading-complete"); + setTimeout(init, self.settings.hidePreloaderDelay); + }else{ + self.settings.preloader.fadeOut(self.settings.hidePreloaderDelay, function() { + clearInterval(self.defaultPreloader); + init(); + }); + } + }else{ + init(); + } + } + + var preloadTheseFramesLength = self.settings.preloadTheseFrames.length; //how many frames to preload? + var preloadTheseImagesLength = self.settings.preloadTheseImages.length; //how many single images to load? + + function saveImagesToArray(length, srcOnly) { + var imagesToPreload = []; //saves the images that are to be preloaded + if(!srcOnly){ + for(var i = length; i > 0; i--){ //for each frame to be preloaded... + self.frames.eq(self.settings.preloadTheseFrames[i-1]-1).find("img").each(function() { //find 's in specific frames, and for each found... + imagesToPreload.push($(this)[0]); //add it to the array of images to be preloaded + }); + } + }else{ + for(var j = length; j > 0; j--) { //for each frame to be preloaded... + imagesToPreload.push($("body").find('img[src="'+self.settings.preloadTheseImages[j-1]+'"]')); //find any with the given source and add it to the array of images to be preloaded + } + } + return imagesToPreload; + } + + //jQuery imagesLoaded plugin v2.1.0 (http://github.com/desandro/imagesloaded) + function imagesLoaded(imagesToPreload, callback) { + var BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; + var $this = imagesToPreload, + deferred = $.isFunction($.Deferred) ? $.Deferred() : 0, + hasNotify = $.isFunction(deferred.notify), + $images = $this.find('img').add( $this.filter('img') ), + loaded = [], + proper = [], + broken = []; + + //Register deferred callbacks + if($.isPlainObject(callback)) { + $.each(callback, function(key, value) { + if(key === 'callback') { + callback = value; + }else if(deferred) { + deferred[key](value); + } + }); + } + + function doneLoading() { + var $proper = $(proper), + $broken = $(broken); + + if(deferred) { + if(broken.length) { + deferred.reject($images, $proper, $broken); + }else{ + deferred.resolve($images); + } + } + + if($.isFunction(callback)) { + callback.call($this, $images, $proper, $broken); + } + } + + function imgLoaded( img, isBroken ) { + if(img.src === BLANK || $.inArray(img, loaded) !== -1) { // don't proceed if BLANK image, or image is already loaded + return; + } + + loaded.push(img); // store element in loaded images array + + if(isBroken) { // keep track of broken and properly loaded images + broken.push(img); + }else{ + proper.push(img); + } + + $.data(img, 'imagesLoaded', {isBroken: isBroken, src: img.src }); // cache image and its state for future calls + + if(hasNotify) { // trigger deferred progress method if present + deferred.notifyWith($(img), [isBroken, $images, $(proper), $(broken)]); + } + + if($images.length === loaded.length) { // call doneLoading and clean listeners if all images are loaded + setTimeout(doneLoading); + $images.unbind('.imagesLoaded'); + } + } + + if(!$images.length) { // if no images, trigger immediately + doneLoading(); + }else{ + $images.bind('load.imagesLoaded error.imagesLoaded', function(event) { + imgLoaded(event.target, event.type === 'error'); // trigger imgLoaded + }).each(function(i, el) { + var src = el.src; + var cached = $.data(el, 'imagesLoaded'); // find out if this image has been already checked for status if it was, and src has not changed, call imgLoaded on it + if(cached && cached.src === src) { + imgLoaded(el, cached.isBroken); + return; + } + + if(el.complete && el.naturalWidth !== undefined) { // if complete is true and browser supports natural sizes, try to check for image status manually + imgLoaded(el, el.naturalWidth === 0 || el.naturalHeight === 0); + return; + } + + // cached images don't fire load sometimes, so we reset src, but only when dealing with IE, or image is complete (loaded) and failed manual check webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f + if(el.readyState || el.complete) { + el.src = BLANK; + el.src = src; + } + }); + } + } + + if(self.settings.preloader !== undefined && self.settings.preloader !== false && (preloadTheseFramesLength !== 0 || preloadTheseImagesLength !== 0)) { //if using the preloader and the dev has specified some images should preload... + var frameImagesToPreload = saveImagesToArray(preloadTheseFramesLength); //get images from particular Sequence frames to be preloaded + var individualImagesToPreload = saveImagesToArray(preloadTheseImagesLength, true); //get images with specific source values to be preloaded + var imagesToPreload = $(frameImagesToPreload.concat(individualImagesToPreload)); //combine frame images and individual images + + imagesLoaded(imagesToPreload, oncePreloaded); + }else{ //if not using the preloader... + if(windowLoaded === true) { //if the window has already loaded... + oncePreloaded(); //run the init functionality when the preloader has finished + $(this).unbind("load.sequence"); //unbind the load event as it's no longer needed + }else{ //if the window hasn't already loaded... + $(window).bind("load.sequence", function() { //when the window loads... + oncePreloaded(); //run the init functionality when the preloader has finished + $(this).unbind("load.sequence"); //unbind the load event as it's no longer needed + }); + } + } + + function init() { + $(self.settings.preloader).remove(); //remove the preloader element + + self.nextButton = renderUiElements(self, self.settings.nextButton, ".sequence-next"); //set up the next button + self.prevButton = renderUiElements(self, self.settings.prevButton, ".sequence-prev"); //set up the previous button + self.pauseButton = renderUiElements(self, self.settings.pauseButton, ".sequence-pause"); //set up the pause button + self.pagination = renderUiElements(self, self.settings.pagination, ".sequence-pagination"); //set up the pagination + + if((self.nextButton !== undefined && self.nextButton !== false) && self.settings.showNextButtonOnInit === true){self.nextButton.show();} //if using a next button, show it + if((self.prevButton !== undefined && self.prevButton !== false) && self.settings.showPrevButtonOnInit === true){self.prevButton.show();} //if using a previous button, show it + if((self.pauseButton !== undefined && self.pauseButton !== false) && self.settings.showPauseButtonOnInit === true){self.pauseButton.show();} //if using a pause button, show it + + if(self.settings.pauseIcon !== false) { + self.pauseIcon = renderUiElements(self, self.settings.pauseIcon, ".sequence-pause-icon"); + if(self.pauseIcon !== undefined) { + self.pauseIcon.hide(); + } + }else{ + self.pauseIcon = undefined; + } + + if(self.pagination !== undefined && self.pagination !== false) { + self.paginationLinks = self.pagination.children(); //get each pagination link + + self.paginationLinks.on('click.sequence', function() { //when a pagination link is clicked... + var associatedFrameNumber = $(this).index() + 1; //get the number of the frame this link is associated with + self.goTo(associatedFrameNumber); //go to the associate frame + }); + + if(self.settings.showPaginationOnInit === true) { + self.pagination.show(); + } + } + + self.nextFrameID = self.settings.startingFrameID; + + if(self.settings.hashTags === true) { //if using hashtags... + self.frames.each(function() { //for each frame... + self.frameHashID.push($(this).prop(self.getHashTagFrom)); //add the hashtag to an array + }); + + self.currentHashTag = location.hash.replace("#", ""); //get the current hashtag + if(self.currentHashTag === undefined || self.currentHashTag === "") { //if there is no hashtag... + self.nextFrameID = self.settings.startingFrameID; //use the startingFrameID + }else{ + self.frameHashIndex = $.inArray(self.currentHashTag, self.frameHashID); //get the index of the frame that matches the hashtag + if(self.frameHashIndex !== -1){ //if the hashtag matches a Sequence frame ID... + self.nextFrameID = self.frameHashIndex + 1; //use the frame associated to the hashtag + }else{ + self.nextFrameID = self.settings.startingFrameID; //use the startingFrameID + } + } + } + + self.nextFrame = self.frames.eq(self.nextFrameID-1); //get the next frame + self.nextFrameChildren = self.nextFrame.children(); //get the elements within the next frame to be animated + + if(self.pagination !== undefined) { //if using pagination, make the starting frame the current one in pagination + $(self.paginationLinks[self.settings.startingFrameID-1]).addClass('current'); //add the 'current' class to the current frame + } + + if(self.transitionsSupported) { //initiate the full featured Sequence if transitions are supported... + if(!self.settings.animateStartingFrameIn) { //start first frame in animated in position + self.currentFrameID = self.nextFrameID; + + if(self.settings.moveActiveFrameToTop) { + self.nextFrame.css('z-index', self.numberOfFrames); + } + + resetElements(self.prefix, self.nextFrameChildren, "0s"); + self.nextFrame.addClass("animate-in"); + if(self.settings.hashTags && self.settings.hashChangesOnFirstFrame) { + self.currentHashTag = self.nextFrame.prop(self.getHashTagFrom); + document.location.hash = "#"+self.currentHashTag; + } + + setTimeout(function() { + resetElements(self.prefix, self.nextFrameChildren, ""); + }, 100); + + resetAutoPlay(self, true, self.settings.autoPlayDelay); + }else if(self.settings.reverseAnimationsWhenNavigatingBackwards && self.settings.autoPlayDirection -1 && self.settings.animateStartingFrameIn) { //animate in backwards + resetElements(self.prefix, self.nextFrameChildren, "0s"); + self.nextFrame.addClass("animate-out"); + self.goTo(self.nextFrameID, -1, true); + }else{ //animate in forwards + self.goTo(self.nextFrameID, 1, true); + } + }else{ //initiate a basic slider for browsers that don't support CSS3 transitions + self.container.addClass("sequence-fallback"); + self.currentFrameID = self.nextFrameID; + if(self.settings.hashTags && self.settings.hashChangesOnFirstFrame){ + self.currentHashTag = self.nextFrame.prop(self.getHashTagFrom); + document.location.hash = "#"+self.currentHashTag; + } + + self.frames.addClass("animate-in"); //move each frame into its animate-in position + self.frames.not(':eq('+(self.nextFrameID-1)+')').css({"display": "none", "opacity": 0}); //set all frames (except the next one) to display: none, opacity: 0 + resetAutoPlay(self, true, self.settings.autoPlayDelay); + } + //END INIT + //EVENTS + if(self.nextButton !== undefined) { //if a next button is defined... + self.nextButton.bind('click.sequence', function() { //when the next button is clicked... + self.next(); //go to the next frame + }); + } + + if(self.prevButton !== undefined) { //if a previous button is defined... + self.prevButton.bind('click.sequence', function() { //when the previous button is clicked... + self.prev(); //go to the previous frame + }); + } + + if(self.pauseButton !== undefined) { //if a pause button is defined... + self.pauseButton.bind('click.sequence', function() { //when the pause button is clicked... + self.pause(true); //pause Sequence and set hardPause to true + }); + } + + function keyEvents(keyPressed, keyDirections) { + var keyCode; + var keyCodes; + + for(keyCodes in keyDirections) { + if(keyCodes === "left" || keyCodes === "right") { + keyCode = defaultKeys[keyCodes]; + }else{ + keyCode = keyCodes; + } + + if(keyPressed === parseFloat(keyCode)) { //if the key pressed is associated with a function... + initCustomKeyEvent(self, keyDirections[keyCodes]); //initiate the function + } + } + } + + if(self.settings.keyNavigation) { + var defaultKeys = { + 'left' : 37, + 'right' : 39 + }; + + $(document).bind('keydown.sequence', function(e) { //when a key is pressed... + var keyCodeChar = String.fromCharCode(e.keyCode); + if((keyCodeChar > 0 && keyCodeChar <= self.numberOfFrames) && (self.settings.numericKeysGoToFrames)) { + self.nextFrameID = keyCodeChar; + self.goTo(self.nextFrameID); //go to specified frame + } + + keyEvents(e.keyCode, self.settings.keyEvents); //run default keyevents + keyEvents(e.keyCode, self.settings.customKeyEvents); //run custom keyevents + }); + } + + if(self.settings.pauseOnHover && self.settings.autoPlay && !self.hasTouch) { //if using pauseOnHover and autoPlay on non touch devices + self.canvas.on({ + 'mouseenter.sequence': function() { //when the mouse enter the Sequence element... + self.isBeingHoveredOver = true; + if(!self.isHardPaused) { //if Sequence is hard paused (via a pause button)... + self.pause(); //pause autoPlay + } + }, + 'mouseleave.sequence': function() { //when the mouse leaves the Sequence element... + self.isBeingHoveredOver = false; + if(!self.isHardPaused) { //if Sequence is not hard paused (via a pause button)... + self.unpause(); //unpause autoPlay + } + } + }); + } + + if(self.settings.hashTags) { //if hashchange is enabled in the settings... + $(window).bind('hashchange.sequence', function() { //when the hashtag changes... + var newTag = location.hash.replace("#", ""); //grab the new hashtag + + if(self.currentHashTag !== newTag) { //if the last hashtag is not the same as the current one... + self.currentHashTag = newTag; //save the new tag + self.frameHashIndex = $.inArray(self.currentHashTag, self.frameHashID); //get the index of the frame that matches the hashtag + if(self.frameHashIndex !== -1) { //if the hashtag matches a Sequence frame ID... + self.nextFrameID = self.frameHashIndex + 1; //set that frame as the next one + self.goTo(self.nextFrameID); //go to the next frame + } + } + }); + } + + function cancelTouch() { + self.canvas.on("touchmove.sequence", onTouchMove); + startX = null; + isMoving = false; + } + + function onTouchMove(e) { + if(self.settings.swipePreventsDefault) { + e.preventDefault(); + } + if(isMoving) { + var x = e.originalEvent.touches[0].pageX; + var y = e.originalEvent.touches[0].pageY; + var dx = startX - x; + var dy = startY - y; + if(Math.abs(dx) >= self.settings.swipeThreshold) { + cancelTouch(); + if(dx > 0) { + initCustomKeyEvent(self, self.settings.swipeEvents.left); + }else{ + initCustomKeyEvent(self, self.settings.swipeEvents.right); + } + }else if(Math.abs(dy) >= self.settings.swipeThreshold) { + cancelTouch(); + if(dy > 0) { + initCustomKeyEvent(self, self.settings.swipeEvents.down); + }else{ + initCustomKeyEvent(self, self.settings.swipeEvents.up); + } + } + } + } + + function onTouchStart(e) { + if(e.originalEvent.touches.length === 1) { + startX = e.originalEvent.touches[0].pageX; + startY = e.originalEvent.touches[0].pageY; + isMoving = true; + self.canvas.on("touchmove.sequence", onTouchMove); + } + } + + if(self.settings.swipeNavigation && self.hasTouch) { //if using swipeNavigation and the device has touch capabilities... + //jQuery TouchWipe v1.1.1 (http://www.netcu.de/jquery-touchwipe-iphone-ipad-library) + var startX; + var startY; + var isMoving = false; + + self.canvas.on("touchstart.sequence", onTouchStart); + } + //END EVENTS + } + } //END CONSTRUCTOR + + Sequence.prototype = { + + //PUBLIC METHODS + /* + start autoPlay -- causing Sequence to automatically change frame every x amount of milliseconds + + delay: a time in ms before starting the autoPlay feature (if unspecified, the default will be used) + */ + startAutoPlay: function(delay) { + var self = this; + delay = (delay === undefined) ? self.settings.autoPlayDelay : delay; //if a delay isn't specified, use the default + self.unpause(); + + resetAutoPlay(self); //stop autoPlay before starting it again + self.autoPlayTimer = setTimeout(function() { //start a new autoPlay timer and... + if(self.settings.autoPlayDirection === 1) { //go to either the next or previous frame + self.next(); + }else{ + self.prev(); + } + }, delay); //after a specified delay + }, + + //stop causing Sequence to automatically change frame every x amount of seconds + stopAutoPlay: function() { + var self = this; + self.pause(true); + clearTimeout(self.autoPlayTimer); //stop the autoPlay timer + }, + + /* + Toggle startAutoPlay (unpausing autoPlay) and stopAutoPlay (pausing autoPlay) + + hardPause: if true, Sequence's pauseOnHover will not execute. Useful for pause buttons. + + Note: Sequence 0.7.3 and below didn't have an .unpause() function -- .pause() would pause/unpause + based on the current state. .unpause() is now included for clarity but the .pause() function will + still toggle between paused and unpaused states. + */ + pause: function(hardPause) { + var self = this; + if(!self.isSoftPaused) { //if pausing Sequence... + if(self.pauseButton !== undefined) { //if a pause button is defined... + self.pauseButton.addClass("paused"); //add the class of "paused" to the pause button + if(self.pauseIcon !== undefined) { //if a pause icon is defined... + self.pauseIcon.show(); //show the pause icon + } + } + self.paused(); //callback when Sequence is paused + self.isSoftPaused = true; + self.isHardPaused = (hardPause) ? true : false; //if hardPausing, set hardPause to true + self.isPaused = true; + resetAutoPlay(self); //stop autoPlay + }else{ //if unpausing Sequence... + self.unpause(); + } + }, + + /* + Start the autoPlay feature, as well as deal with any changes to pauseButtons, pauseIcons and public variables etc + + callback: if false, the unpause callback will not be initiated (this is because unpause is used internally during the stop and start of each frame) + */ + unpause: function(callback) { + var self = this; + if(self.pauseButton !== undefined) { //if a pause button is defined... + self.pauseButton.removeClass("paused"); //remove the class of "paused" from the pause button + if(self.pauseIcon !== undefined) { //if a pause icon is defined... + self.pauseIcon.hide(); //hide the pause icon + } + } + + self.isSoftPaused = false; + self.isHardPaused = false; + self.isPaused = false; + + if(!self.active) { + if(callback !== false) { + self.unpaused(); //callback when Sequence is unpaused + } + resetAutoPlay(self, true, self.settings.unpauseDelay); //start autoPlay after a delay specified via the unpauseDelay setting + }else{ + self.delayUnpause = true; //Sequence is animating so delay the unpause event until the animation completes + } + }, + + //Go to the frame ahead of the current one + next: function() { + var self = this; + self.nextFrameID = (self.currentFrameID !== self.numberOfFrames) ? self.currentFrameID + 1 : 1; //work out the next frame + self.goTo(self.nextFrameID, 1); //go to the next frame + }, + + //Go to the frame prior to the current one + prev: function() { + var self = this; + self.nextFrameID = (self.currentFrameID === 1) ? self.numberOfFrames : self.currentFrameID - 1; //work out the prev frame + self.goTo(self.nextFrameID, -1); //go to the prev frame + }, + + /* + Go to a specific frame + + id: number of the frame to go to + direction: direction to get to that frame (1 = forward, -1 = reverse) + ignoreTransitionThreshold: if true, ignore the transitionThreshold setting and immediately go to the specified frame + */ + goTo: function(id, direction, ignoreTransitionThreshold) { + var self = this; + id = parseFloat(id); //convert the id to a number just in case + var transitionThreshold = (ignoreTransitionThreshold === true) ? 0 : self.settings.transitionThreshold; //if transitionThreshold is to be ignored, set it to zero + + if((id === self.currentFrameID) //if the id of the frame the user is trying to go to is the same as the currently active one... + || (self.settings.navigationSkip && self.navigationSkipThresholdActive) //or navigationSkip is enabled and the navigationSkipThreshold is active (which prevents frame from being navigated too fast)... + || (!self.settings.navigationSkip && self.active) //or navigationSkip is disbaled but Sequence is animating... + || (!self.transitionsSupported && self.active) //or Sequence is in fallback mode and Sequence is animating... + || (!self.settings.cycle && direction === 1 && self.currentFrameID === self.numberOfFrames) //or cycling is disabled, the user is navigating forward and this is the last frame... + || (!self.settings.cycle && direction === -1 && self.currentFrameID === 1) //or cycling is disabled, the user is navigating backwards and this is the first frame... + || (self.settings.preventReverseSkipping && self.direction !== direction && self.active)) { //or Sequence is animating and the user is trying to change the direction of navigation... + return false; //don't go to another frame + }else if(self.settings.navigationSkip && self.active) { //if navigationSkip is enabled and Sequence is animating (a frame is being skipped before it has finished animating)... + self.navigationSkipThresholdActive = true; //the navigationSkipThreshold is now active + if(self.settings.fadeFrameWhenSkipped) { //if a frame should fade when skipped... + self.nextFrame.stop().animate({"opacity": 0}, self.settings.fadeFrameTime); //fade + } + + clearTimeout(self.transitionThresholdTimer); + + setTimeout(function() { //start the navigationSkipThreshold timer to prevent being able to navigate too quickly + self.navigationSkipThresholdActive = false; //once the timer is complete, navigationSkip can occur again + }, self.settings.navigationSkipThreshold); + } + + if(!self.active || self.settings.navigationSkip) { //if there are no animations running or navigationSkip is enabled... + self.active = true; //Sequence is now animating + resetAutoPlay(self); //stop any autoPlay timer that may be running + + if(direction === undefined) { //if no direction to navigate was defined... + self.direction = (id > self.currentFrameID) ? 1 : -1; //work out which way to go based on what frame is currently active + }else{ + self.direction = direction; //go to the developer defined frame + } + + self.currentFrame = self.canvas.children(".animate-in"); //find which frame is active -- the frame currently being viewed (and about to be animated out) + self.nextFrame = self.frames.eq(id-1); //grab the next frame + self.currentFrameChildren = self.currentFrame.children(); //save the child elements of the current frame + self.nextFrameChildren = self.nextFrame.children(); //save the child elements of the next frame + + if(self.pagination !== undefined) { //if using pagination... + self.paginationLinks.removeClass('current'); //remove the 'current' class from all pagination links + $(self.paginationLinks[id-1]).addClass('current'); //add the 'current' class to the current frame + } + + if(self.transitionsSupported) { //if the browser supports CSS3 transitions... + if(self.currentFrame.length !== undefined) { //if there is a current frame (one that is in it's animate-in position)... + self.beforeCurrentFrameAnimatesOut(); //callback + if(self.settings.moveActiveFrameToTop) { //if the active frame should move to the top... + self.currentFrame.css("z-index", 1); //move this frame to the bottom as it is now inactive + } + resetElements(self.prefix, self.nextFrameChildren, "0s"); //give the next frame elements a transition-duration and transition-delay of 0s so they don't transition to their reset position + if(!self.settings.reverseAnimationsWhenNavigatingBackwards || self.direction === 1) { //if user hit next button... + self.nextFrame.removeClass("animate-out"); //reset the next frame back to its starting position + resetElements(self.prefix, self.currentFrameChildren, ""); //remove any inline styles from the elements to be animated so styles via the "animate-out" class can take full effect + }else if(self.settings.reverseAnimationsWhenNavigatingBackwards && self.direction === -1) { //if the user hit prev button + self.nextFrame.addClass("animate-out"); //reset the next frame back to its animate-out position + reverseTransitionProperties(self); //reverse the transition-duration, transition-delay and transition-timing-function + } + }else{ + self.isStartingFrame = false; //no longer the first frame + } + + self.active = true; //Sequence is now animating + self.currentFrame.unbind(self.transitionEnd); //remove the animation end event + self.nextFrame.unbind(self.transitionEnd); //remove the animation end event + + if(self.settings.fadeFrameWhenSkipped) { //if a frame may have faded out when it was previously skipped... + self.nextFrame.css("opacity", 1); //show it again + } + + self.beforeNextFrameAnimatesIn(); //callback + if(self.settings.moveActiveFrameToTop) { //if an active frame should be moved to the top... + self.nextFrame.css('z-index', self.numberOfFrames); + } + + //modifications to the current and next frame's elements to get them ready to animate + if(!self.settings.reverseAnimationsWhenNavigatingBackwards || self.direction === 1) { //if user hit next button... + setTimeout(function() { //50ms timeout to give the browser a chance to modify the DOM sequentially + resetElements(self.prefix, self.nextFrameChildren, ""); //remove any inline styles from the elements to be animated so styles via the "animate-in" class can take full effect + waitForAnimationsToComplete(self, self.nextFrame, self.nextFrameChildren, "in"); //wait for the next frame to animate in + if(self.afterCurrentFrameAnimatesOut !== "function () {}" || (self.settings.transitionThreshold === true && ignoreTransitionThreshold !== true)) { //if the afterCurrentFrameAnimatesOut is being used... + waitForAnimationsToComplete(self, self.currentFrame, self.currentFrameChildren, "out", true, 1); //wait for the current frame to animate out as well + } + }, 50); + + //final class changes to make animations happen + setTimeout(function() { //50ms timeout to give the browser a chance to modify the DOM sequentially + self.currentFrame.toggleClass("animate-out animate-in"); + + if(self.settings.transitionThreshold !== true || ignoreTransitionThreshold === true) { //if there's no transitionThreshold or the dev specified a transitionThreshold in milliseconds + self.transitionThresholdTimer = setTimeout(function() { //cause the next frame to animate in after a certain period + self.nextFrame.addClass("animate-in"); //add the "animate-in" class + }, transitionThreshold); + } + }, 50); + }else if(self.settings.reverseAnimationsWhenNavigatingBackwards && self.direction === -1) { //if the user hit prev button + setTimeout(function() { //50ms timeout to give the browser a chance to modify the DOM sequentially + //remove any inline styles from the elements so styles via the "animate-in" and "animate-out" class can take full effect + resetElements(self.prefix, self.currentFrameChildren, ""); + resetElements(self.prefix, self.nextFrameChildren, ""); + reverseTransitionProperties(self); //reverse the transition-duration, transition-delay and transition-timing-function + + waitForAnimationsToComplete(self, self.nextFrame, self.nextFrameChildren, "in"); //wait for the next frame to animate in + if(self.afterCurrentFrameAnimatesOut !== "function () {}" || (self.settings.transitionThreshold === true && ignoreTransitionThreshold !== true)) { //if the afterCurrentFrameAnimatesOut is being used... + waitForAnimationsToComplete(self, self.currentFrame, self.currentFrameChildren, "out", true, -1); //wait for the current frame to animate out as well + } + }, 50); + + //final class changes to make animations happen + setTimeout(function() { //50ms timeout to give the browser a chance to modify the DOM sequentially + self.currentFrame.removeClass("animate-in"); + + if(self.settings.transitionThreshold !== true || ignoreTransitionThreshold === true) { //if there's no transitionThreshold or the dev specified a transitionThreshold in milliseconds + self.transitionThresholdTimer = setTimeout(function() { //cause the next frame to animate in after a certain period + self.nextFrame.toggleClass("animate-out animate-in"); //add the "animate-in" class and remove the "animate-out" class + }, transitionThreshold); + } + }, 50); + } + }else{ //if the browser doesn't support CSS3 transitions... + function animationComplete() { + setHashTag(self); + self.active = false; + resetAutoPlay(self, true, self.settings.autoPlayDelay); + } + + switch(self.settings.fallback.theme) { + case "fade": //if using the fade fallback theme... + self.frames.css({"position": "relative"}); //this allows for fadein/out in IE + self.beforeCurrentFrameAnimatesOut(); + self.currentFrame = self.frames.eq(self.currentFrameID-1); + self.currentFrame.animate({"opacity": 0}, self.settings.fallback.speed, function() { //hide the current frame + self.currentFrame.css({"display": "none", "z-index": "1"}); + self.afterCurrentFrameAnimatesOut(); + self.beforeNextFrameAnimatesIn(); + self.nextFrame.css({"display": "block", "z-index": self.numberOfFrames}).animate({"opacity": 1}, 500, function() { + self.afterNextFrameAnimatesIn(); + }); //make the next frame the current one and show it + animationComplete(); + }); + + self.frames.css({"position": "relative"}); //this allows for fadein/out in IE + break; + + case "slide": //if using the slide fallback theme... + default: + //create objects which will save the .css() and .animation() objects + var animateOut = {}; + var animateIn = {}; + var moveIn = {}; + + //construct the .css() and .animation() objects + if(self.direction === 1) { + animateOut.left = "-100%"; + animateIn.left = "100%"; + }else{ + animateOut.left = "100%"; + animateIn.left = "-100%"; + } + + moveIn.left = "0"; + moveIn.opacity = 1; + + self.currentFrame = self.frames.eq(self.currentFrameID-1); + self.beforeCurrentFrameAnimatesOut(); + self.currentFrame.animate(animateOut, self.settings.fallback.speed, function() { + self.afterCurrentFrameAnimatesOut(); + }); //cause the current frame to animate out + self.beforeNextFrameAnimatesIn(); //callback + self.nextFrame.show().css(animateIn); + self.nextFrame.animate(moveIn, self.settings.fallback.speed, function() { //cause the next frame to animate in + animationComplete(); + self.afterNextFrameAnimatesIn(); //callback + }); + break; + } + } + self.currentFrameID = id; //make the currentFrameID the same as the one that is to animate in + } + }, + + /* + removes Sequence from the element it's attached to + + callback: a callback to run once .destroy() has finished (or see the sequence.destroyed() callback) + */ + destroy: function(callback) { + var self = this; + + self.container.addClass('sequence-destroyed'); //add a class of "destroyed" in case the developer wants to animate opacity etc + + //REMOVE EVENTS + if(self.nextButton !== undefined) { //remove the next button click event if a next button is defined + self.nextButton.unbind('click.sequence'); + } + if(self.prevButton !== undefined) { //remove the previous button click event if a previous button is defined + self.prevButton.unbind('click.sequence'); + } + if(self.pauseButton !== undefined) { //remove the pause button click event if a pause button is defined + self.pauseButton.unbind('click.sequence'); + } + + if(self.pagination !== undefined) { + self.paginationLinks.unbind('click.sequence'); + } + + $(document).unbind('keydown.sequence'); //unbind key events + self.canvas.unbind('mouseenter.sequence, mouseleave.sequence, touchstart.sequence, touchmove.sequence'); //unbind mouse and touch events + $(window).unbind('hashchange.sequence'); //unbind hashchange + + //CLEAR TIMERS + self.stopAutoPlay(); + clearTimeout(self.transitionThresholdTimer); + + //TIDY UP THE DOM + self.canvas.children('li').remove(); //because Sequence rearranges frames so the active one is always on top, remove them all... + self.canvas.prepend(self.frames); //then add them back in, in their original order + self.frames.removeClass('animate-in animate-out').removeAttr('style'); //remove classes and inline styles from all frames + self.frames.eq(self.currentFrameID-1).addClass('animate-in'); //keep the current frame in it's animate-in position + + //HIDE UI ELEMENTS + if(self.nextButton !== undefined && self.nextButton !== false) { //if a next button is defined and was shown on initiation, hide it + self.nextButton.hide(); + } + if(self.prevButton !== undefined && self.prevButton !== false) { //if a prev button is defined and was shown on initiation, hide it + self.prevButton.hide(); + } + if(self.pauseButton !== undefined && self.pauseButton !== false) { //if a pause button is defined and was shown on initiation, hide it + self.pauseButton.hide(); + } + if(self.pauseIcon !== undefined && self.pauseIcon !== false) { //if a pause icon is defined, hide it + self.pauseIcon.hide(); + } + if(self.pagination !== undefined && self.pagination !== false) { //if pagination is defined and was shown on initiation, hide it + self.pagination.hide(); + } + + //CALLBACKS - a callback can either be passed into the destroy() function or by using the sequence.destroyed() publc method + if(callback !== undefined) { + callback(); //callback past into the function + } + + self.destroyed(); //callback + self.container.removeData(); //remove data + } + //END PUBLIC METHODS + }; //END PROTOTYPE + + //PRIVATE METHODS + + //trigger keyEvents, customKeyEvents and swipeEvents + var initCustomKeyEvent = function(sequence, event) { + switch(event) { + case "next": + sequence.next(); + break; + case "prev": + sequence.prev(); + break; + case "pause": + sequence.pause(true); + break; + } + }; + + /* + reset the transition-duration and transition-delay properties of an element + + elementToReset = the element that is to have it's properties reset + cssValue = the value to be given to the transition-duration and transition-delay properties + */ + var resetElements = function(prefix, elementToReset, cssValue) { + elementToReset.css( + prefixCSS(prefix, { + "transition-duration": cssValue, + "transition-delay": cssValue, + "transition-timing-function": "" + }) + ); + }; + + /* + when navigating backwards and reverseAnimationsWhenNavigatingBackwards is true, take the transition properties for forward animation and manipulate the animated elements to create a perfect reversal + */ + var reverseTransitionProperties = function(sequence) { + var currentFrameChildrenDurations = []; //saves the duration for each of the current frame's element + var nextFrameChildrenDurations = []; //saves the duration for each of the next frame's element + + sequence.currentFrameChildren.each(function() { //get the overall duration (including delay) for each animated element in the current frame + currentFrameChildrenDurations.push(parseFloat($(this).css(sequence.prefix+'transition-duration').replace('s', '')) + parseFloat($(this).css(sequence.prefix+'transition-delay').replace('s', ''))); + }); + + sequence.nextFrameChildren.each(function() { //get the overall duration (including delay) for each animated element in the current frame + nextFrameChildrenDurations.push(parseFloat($(this).css(sequence.prefix+'transition-duration').replace('s', '')) + parseFloat($(this).css(sequence.prefix+'transition-delay').replace('s', ''))); + }); + + var maximumCurrentFrameDuration = Math.max.apply(Math, currentFrameChildrenDurations); //find which transition duration is the longest + var maximumNextFrameDuration = Math.max.apply(Math, nextFrameChildrenDurations); //find which transition duration is the longest + var transitionDifference = maximumCurrentFrameDuration - maximumNextFrameDuration; //get the overal transition difference between the current and next frame + var currentDelay = 0; + var nextDelay = 0; + + if(transitionDifference < 0 && !sequence.settings.preventDelayWhenReversingAnimations) { //if the current frame has a greater duration than the next frame... + /* note: because the current frame will take longer to animate out than the next to animate in, when this animation is reversed, the current frame will have a delay applied before it animates out. By default, Sequence will aim to avoid this (via the preventDelayWhenReversingAnimations option) because a delay on the current frame may confuse the user. The delay is removed, which means the reversal of animation is slightly out of sync */ + currentDelay = Math.abs(transitionDifference); + }else if(transitionDifference > 0) { //if the next frame has a greater duration than the current frame, add the difference on as a delay + nextDelay = Math.abs(transitionDifference); + } + + var reverseEachProperty = function(transitionProperties, currentFrameChildren, maximumFrameDuration, frameDelay) { + currentFrameChildren.each(function() { + var duration = parseFloat($(this).css(sequence.prefix+'transition-duration').replace('s', '')); //get the elements transition-duration + var delay = parseFloat($(this).css(sequence.prefix+'transition-delay').replace('s', '')); //get the elements transition-delay + var transitionFunction = $(this).css(sequence.prefix+'transition-timing-function'); //get the elements transiion-timing-function + if(transitionFunction.indexOf("cubic-bezier") >= 0) { //if the transition is a cubic-bezier... + var cubicBezier = transitionFunction.replace('cubic-bezier(', '').replace(')', '').split(','); //remove the CSS function and just get the array + $.each(cubicBezier, function(index, value) { //for each point that makes up the cubic bezier... + cubicBezier[index] = parseFloat(value); //turn the point into a number (rather than text) + }); + + //reverse the cubic bezier + var reversedCubicBezier = [ + 1 - cubicBezier[2], + 1 - cubicBezier[3], + 1 - cubicBezier[0], + 1 - cubicBezier[1] + ]; + transitionFunction = 'cubic-bezier('+reversedCubicBezier+')'; //add the reversed cubic bezier back into a CSS function + }else{ //if the function isn't a cubic-bezier (WebKit returns "linear" as a text string rather than a cubic-bezier) + transitionFunction = 'linear'; //use a linear transition function + } + var frameDuration = duration + delay; //get the overall duration of the element + + transitionProperties["transition-duration"] = duration + 's'; //reapply the element's transition-duration (to override any inline styles) + transitionProperties["transition-delay"] = (maximumFrameDuration - frameDuration + frameDelay) + 's'; //add a delay if required + transitionProperties["transition-timing-function"] = transitionFunction; //reapply the reversed transition function + $(this).css( + prefixCSS(sequence.prefix, transitionProperties) //set the new transition properties + ); + }); + }; + + reverseEachProperty(sequence.transitionProperties, sequence.currentFrameChildren, maximumCurrentFrameDuration, currentDelay); //reverse properties for each of the current frame's elements + reverseEachProperty(sequence.transitionProperties, sequence.nextFrameChildren, maximumNextFrameDuration, nextDelay); //reverse properties for each of the next frame's elements + }; + + /* + adds the browser vendors prefix onto multiple CSS properties + + prefix = the prefix for the browser Sequence is being viewed in (-webkit- for example) + properties = the properties to be prefixed (transition-duration for example) + */ + var prefixCSS = function(prefix, properties) { + var css = {}; + for(var property in properties) { //for each property to be modified... + css[prefix + property] = properties[property]; //add the prefix to the property name + } + return css; //return the prefixed CSS + }; + + /* + internal function used to start and stop autoPlay + start: if true, autoPlay will be started, else it'll be stopped + delay: a time in ms before starting the autoPlay feature (if unspecified, the default will be used) + */ + var resetAutoPlay = function(sequence, start, delay) { + if(start === true) { //if starting autoPlay + if(sequence.settings.autoPlay && !sequence.isSoftPaused) { //if using autoPlay and Sequence isn't paused... + clearTimeout(sequence.autoPlayTimer); //stop the autoPlay timer + sequence.autoPlayTimer = setTimeout(function() { //start a new autoPlay timer and... + if(sequence.settings.autoPlayDirection === 1) { //go to either the next or previous frame + sequence.next(); + }else{ + sequence.prev(); + } + }, delay); //after a specified delay + } + }else{ //if stopping autoPlay + clearTimeout(sequence.autoPlayTimer); //stop the autoPlay timer + } + }; + + /*functionality to initiate the preloader, next/previous buttons and so on + + devOption: true = the developer wants to use the default selector. false = don't use a uiElement. string = the developer defined selector to use for the UI element + defaultOption: the default selector to use for the UI element, when the developer specifies false for devOption + */ + var renderUiElements = function(sequence, devOption, defaultOption) { + switch(devOption) { + case false: //don't set up a uiElement + return undefined; + + case true: //use the default uiElement + if(defaultOption === ".sequence-preloader") { //if setting up the preloader... + get.defaultPreloader(sequence.container, sequence.transitionsSupported, sequence.prefix); //get the default preloader + } + return $(defaultOption); //return the default element + + default: //if using a developer defined selector... + return $(devOption); //return the developer defined element + } + }; + + /* + prevents the next frame from animating until the current frame has finished animating + + frame: the frame
  • which is animating + self.currentFrameChildren: the animated direct child elements of the frame + transitionPhase: whether the elements are animating "in" to an active position or "out" of an active position + inAfterwards: whether the next frame should animate in afterwards + direction: the direction of animation + */ + var waitForAnimationsToComplete = function(sequence, frame, currentFrameChildren, transitionPhase, inAfterwards, direction) { + + if(transitionPhase === "out") { //if waiting on a frame's element to animate out... + var onceComplete = function() { + sequence.afterCurrentFrameAnimatesOut(); //callback + + if(sequence.settings.transitionThreshold === true) { + if(direction === 1) { + sequence.nextFrame.addClass("animate-in"); //add the "animate-in" class + }else if(direction === -1) { + sequence.nextFrame.toggleClass("animate-out animate-in"); + } + } + }; + }else if(transitionPhase === "in") { //if waiting on a frame's element to animate in... + var onceComplete = function() { + sequence.afterNextFrameAnimatesIn(); //callback + setHashTag(sequence); //set the hashtag to represent the newly active frame + + sequence.active = false; //Sequence is not animating + + if(!sequence.isHardPaused && !sequence.isBeingHoveredOver) { //if Sequence isn't hard paused (via a pause button for example) or being hovered over... + if(!sequence.delayUnpause) { //if unpausing isn't delayed (Sequence wasn't animating when unpause was invoked)... + sequence.unpause(false); //unpause Sequence but don't run the unpause callback + }else{ //if unpausing was delay because Sequence was animating when unpause was invoked... + sequence.delayUnpause = false; + sequence.unpause(); //unpause Sequence + } + } + }; + } + + currentFrameChildren.data('animationEnded', false); // set the data attribute of each animated element to indicate that the animation has not yet ended + frame.bind(sequence.transitionEnd, function(e) { //when an element finishes animating... + $(e.target).data('animationEnded', true); // set the data attrbiute to indicate that the element has finished it's animation + + // now check if all elements have finished animating + var allAnimationsEnded = true; + currentFrameChildren.each(function() { //for each element being animated within a frame... + if($(this).data('animationEnded') === false) { //if the animation hasn't ended... + allAnimationsEnded = false; //not all animations have ended yet + return false; //break out of the animationEnded check early + } + }); + + if(allAnimationsEnded) { //if all animations have ended... + frame.unbind(sequence.transitionEnd); //stop waiting for animations to end + onceComplete(); + } + }); + }; + + var setHashTag = function(sequence) { + if(sequence.settings.hashTags) { //if hashTags is enabled... + sequence.currentHashTag = sequence.nextFrame.prop(sequence.getHashTagFrom); //get the hashtag name + sequence.frameHashIndex = $.inArray(sequence.currentHashTag, sequence.frameHashID); //get the index of the frame that matches the hashtag + if(sequence.frameHashIndex !== -1 && (sequence.settings.hashChangesOnFirstFrame || (!sequence.isStartingFrame || !sequence.transitionsSupported))) { //if the hashtag matches a Sequence frame ID... + sequence.nextFrameID = sequence.frameHashIndex + 1; + document.location.hash = "#"+sequence.currentHashTag; + }else{ + sequence.nextFrameID = sequence.settings.startingFrameID; + sequence.isStartingFrame = false; + } + } + }; + + var get = { + /* Modernizr 2.6.1 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-svg-prefixed-testprop-testallprops-domprefixes + */ + modernizr: function() { + ;window.Modernizr=function(a,b,c){function x(a){i.cssText=a}function y(a,b){return x(prefixes.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&i[e]!==c)return b=="pfx"?e:!0}return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+m.join(d+" ")+d).split(" ");return z(b,"string")||z(b,"undefined")?B(e,b):(e=(a+" "+n.join(d+" ")+d).split(" "),C(e,b,c))}var d="2.6.1",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l="Webkit Moz O ms",m=l.split(" "),n=l.toLowerCase().split(" "),o={svg:"http://www.w3.org/2000/svg"},p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=self;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(self instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.svg=function(){return!!b.createElementNS&&!!b.createElementNS(o.svg,"svg").createSVGRect};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,enableClasses&&(f.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),h=j=null,e._version=d,e._domPrefixes=n,e._cssomPrefixes=m,e.testProp=function(a){return B([a])},e.testAllProps=D,e.prefixed=function(a,b,c){return b?D(a,b,c):D(a,"pfx")},e}(self,self.document); + }, + + defaultPreloader: function(prependTo, transitions, prefix) { + var icon = '
    '; + + $("head").append(""); + prependTo.prepend(icon); + if(!Modernizr.svg && !transitions) { //if SVG isn't supported, remain calm and add this fallback instead... + $(".sequence-preloader").prepend('
    '); + setInterval(function() { + $(".sequence-preloader .circle").fadeToggle(500); + }, 500); + }else if(!transitions) { //if transitions aren't supported, toggle the opacity instead + setInterval(function() { + $(".sequence-preloader").fadeToggle(500); + }, 500); + } + }, + + //a quick test to work out if Opera supports transitions properly (to work around the fact that Opera 11 supports transitions but doesn't return a transition value properly) + operaTest: function() { + $("body").append(''); + var $operaTest = $("#sequence-opera-test"); + $operaTest.css("-o-transition", "1s"); + //if the expected value isn't returned... + if($operaTest.css("-o-transition") !== "1s") { + //cause Opera to go into the fallback theme + return false; + }else{ + return true; + } + $operaTest.remove(); + } + }; + //END PRIVATE METHODS + + //PRIVATE VARIABLES + + var defaults = { + //General Settings + startingFrameID: 1, //The frame (the list item `
  • `) that should first be displayed when Sequence loads + cycle: true, //Whether Sequence should navigate to the first frame after the last frame and vice versa + animateStartingFrameIn: false, //Whether the first frame should animate in to its active position + transitionThreshold: false, //The delay between a frame animating out and the next animating in (false = no delay, true = the next frame will animate in only once the current frame has animated out) + reverseAnimationsWhenNavigatingBackwards: true, //Whether animations should be reversed when a user navigates backwards by clicking a previous button/swiping/pressing the left key + preventDelayWhenReversingAnimations: false, //Whether a delay should be removed when animations are reversed. This delay is removed by default to prevent user confusion + moveActiveFrameToTop: true, //Whether a frame should be given a higher `z-index` than other frames whilst it is active, to bring it above the others + + //Autoplay Settings + autoPlay: true, //Cause Sequence to automatically change between frames over a period of time, as defined in autoPlayDelay + autoPlayDirection: 1, //The direction in which Sequence should auto play + autoPlayDelay: 5000, //The duration in milliseconds at which frames should remain on screen before animating to the next + + //Frame Skipping Settings + navigationSkip: true, //Whether the user can navigate through frames before each frame has finished animating + navigationSkipThreshold: 250, //Amount of time that must pass before the next frame can be navigated to + fadeFrameWhenSkipped: true, //If a frame is skipped before it finishes animating, it will quickly fade out + fadeFrameTime: 150, //If fadeFrameWhenSkipped is true, how quickly a frame should fade out when skipped (in milliseconds) + preventReverseSkipping: false, //Whether the user can change the direction of navigation during frames animating (if navigating forward, the user can only skip forwards when other frames are animating). + + //Next/Prev Button Settings + nextButton: false, //if true, Sequence will use an element with class ".sequence-next" as the next button, else specify your own selector. false = don't use an in-built next button + showNextButtonOnInit: true, //if true, Sequence will make the next button display: block; once Sequence has loaded (give the next button selector display: none; in the CSS to hide it until its usable) + prevButton: false, //if true, Sequence will use an element with class ".sequence-prev" as the previous button, else specify your own selector. false = don't use an in-built previous button + showPrevButtonOnInit: true, //if true, Sequence will make the previous button display: block; once Sequence has loaded (give the previous button selector display: none; in the CSS to hide it until its usable) + + //Pause Settings + pauseButton: false, //if true, Sequence will use an element with class ".sequence-pause" as the pause button, else specify your own selector. false = don't use an in-built pause button + unpauseDelay: null, //the time to wait before navigating to the next frame when Sequence is unpaused. Note that if an unpauseDelay is not specified, the default is the same as the autoPlayDelay setting + pauseOnHover: true, //pause Sequence when the Sequence container is hovered over + pauseIcon: false, //if true, Sequence will use an element with class ".sequence-pause-icon" as the pause icon, else specify your own selector. false = don't use an in-built pause icon (the pause icon will display when Sequence is paused) + showPauseButtonOnInit: true, //if true, Sequence will make the pause button display: block; once Sequence has loaded (give the pause button selector display: none; in the CSS to hide it until its usable) + + //Pagination Settings + pagination: false, //if true, Sequence will use an element with class ".sequence-pagination" as the paginated navigation, else specify your own selector. false = don't use in-built pagination + showPaginationOnInit: true, //if true, Sequence will make the pagination display: block; once Sequence has loaded (give the pagination selector display: none; in the CSS to hide it until its usable) + + //Preloader Settings + preloader: false, + preloadTheseFrames: [1], //all images in these frames will load before Sequence initiates + preloadTheseImages: [ //specify particular images to load before Sequence initiates + /* Example usage + "images/catEatingSalad.jpg", + "images/meDressedAsBatman.png" + */ + ], + /*Note: You can use preloadTheseFrames and preloadTheseImages together. You might want to load all images in frame 1 and just one big image from frame 2 for example*/ + hideFramesUntilPreloaded: true, + prependPreloadingComplete: true, + hidePreloaderUsingCSS: true, + hidePreloaderDelay: 0, + + //Keyboard settings + keyNavigation: true, //false prevents the following keyboard settings + numericKeysGoToFrames: true, + keyEvents: { + left: "prev", + right: "next" + }, + customKeyEvents: { + /* Example usage + 65: "prev", //a + 68: "next", //d + 83: "prev", //s + 87: "next" //w + */ + }, + + //Touch Swipe Settings + swipeNavigation: true, + swipeThreshold: 20, + swipePreventsDefault: false, //be careful if setting this to true + swipeEvents: { + left: "prev", + right: "next", + up: false, + down: false + }, + + //hashTags Settings + //when using hashTags, please include a reference to Ben Alman's jQuery HashChange plugin above your reference to Sequence.js + + //info: http://benalman.com/projects/jquery-hashchange-plugin/ + //plugin: https://raw.github.com/cowboy/jquery-hashchange/v1.3/jquery.ba-hashchange.min.js + //GitHub: https://github.com/cowboy/jquery-hashchange + hashTags: false, //when a frame is navigated to, change the hashtag to the frames ID + hashDataAttribute: false, //false = the hashTag is taken from a frames ID attribute | true = the hashTag is taken from the data attribute "data-sequence-hash" + hashChangesOnFirstFrame: false, //false = the hashTag won't change for the first frame but will for those after + + //Fallback Theme Settings (For browsers that don't support CSS3 transitions) + fallback: { + theme: "slide", + speed: 500 + } + }; + //END PRIVATE VARIABLES + + $.fn.sequence = function(options) { + return this.each(function() { + if (!$.data(this, 'sequence')) { //prevent multiple initiations on the same element + $.data(this, 'sequence', new Sequence($(this), options, defaults, get)); + } + }); + }; +})(jQuery); \ No newline at end of file diff --git a/public/js/Chart.min.js b/public/js/Chart.min.js new file mode 100644 index 0000000..3a0a2c8 --- /dev/null +++ b/public/js/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
      <% for (var i=0; i
    • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
  • <%if(segments[i].label){%><%=segments[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
      <% for (var i=0; i
    • <%if(segments[i].label){%><%=segments[i].label%><%}%>
    • <%}%>
    '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
  • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
  • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/public/js/bootstrap.min.js b/public/js/bootstrap.min.js new file mode 100644 index 0000000..1765631 --- /dev/null +++ b/public/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/** +* bootstrap.js v3.0.0 by @fat and @mdo +* Copyright 2013 Twitter Inc. +* http://www.apache.org/licenses/LICENSE-2.0 +*/ +if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/public/js/codemirror.js b/public/js/codemirror.js new file mode 100644 index 0000000..d06456b --- /dev/null +++ b/public/js/codemirror.js @@ -0,0 +1,5524 @@ +// CodeMirror is the only global var we claim +window.CodeMirror = (function() { + "use strict"; + + // BROWSER SNIFFING + + // Crude, but necessary to handle a number of hard-to-feature-detect + // bugs and behavior differences. + var gecko = /gecko\/\d/i.test(navigator.userAgent); + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt8 = ie && (document.documentMode == null || document.documentMode < 8); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + var webkit = /WebKit\//.test(navigator.userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent); + var chrome = /Chrome\//.test(navigator.userAgent); + var opera = /Opera\//.test(navigator.userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var khtml = /KHTML\//.test(navigator.userAgent); + var mac_geLion = /Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent); + var phantom = /PhantomJS/.test(navigator.userAgent); + + var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent); + var mac = ios || /Mac/.test(navigator.platform); + var windows = /windows/i.test(navigator.platform); + + var opera_version = opera && navigator.userAgent.match(/Version\/(\d*\.\d*)/); + if (opera_version) opera_version = Number(opera_version[1]); + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || opera && (opera_version == null || opera_version < 12.11)); + var captureMiddleClick = gecko || (ie && !ie_lt9); + + // Optimize some code when these features are not used + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + // CONSTRUCTOR + + function CodeMirror(place, options) { + if (!(this instanceof CodeMirror)) return new CodeMirror(place, options); + + this.options = options = options || {}; + // Determine effective options based on given values and defaults. + for (var opt in defaults) if (!options.hasOwnProperty(opt) && defaults.hasOwnProperty(opt)) + options[opt] = defaults[opt]; + setGuttersForLineNumbers(options); + + var docStart = typeof options.value == "string" ? 0 : options.value.first; + var display = this.display = makeDisplay(place, docStart); + display.wrapper.CodeMirror = this; + updateGutters(this); + if (options.autofocus && !mobile) focusInput(this); + + this.state = {keyMaps: [], + overlays: [], + modeGen: 0, + overwrite: false, focused: false, + suppressEdits: false, pasteIncoming: false, + draggingText: false, + highlight: new Delayed()}; + + themeChanged(this); + if (options.lineWrapping) + this.display.wrapper.className += " CodeMirror-wrap"; + + var doc = options.value; + if (typeof doc == "string") doc = new Doc(options.value, options.mode); + operation(this, attachDoc)(this, doc); + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie) setTimeout(bind(resetInput, this, true), 20); + + registerEventHandlers(this); + // IE throws unspecified error in certain cases, when + // trying to access activeElement before onload + var hasFocus; try { hasFocus = (document.activeElement == display.input); } catch(e) { } + if (hasFocus || (options.autofocus && !mobile)) setTimeout(bind(onFocus, this), 20); + else onBlur(this); + + operation(this, function() { + for (var opt in optionHandlers) + if (optionHandlers.propertyIsEnumerable(opt)) + optionHandlers[opt](this, options[opt], Init); + for (var i = 0; i < initHooks.length; ++i) initHooks[i](this); + })(); + } + + // DISPLAY CONSTRUCTOR + + function makeDisplay(place, docStart) { + var d = {}; + + var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none;"); + if (webkit) input.style.width = "1000px"; + else input.setAttribute("wrap", "off"); + // if border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) input.style.border = "1px solid black"; + input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); + + // Wraps and hides input textarea + d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The actual fake scrollbars. + d.scrollbarH = elt("div", [elt("div", null, null, "height: 1px")], "CodeMirror-hscrollbar"); + d.scrollbarV = elt("div", [elt("div", null, null, "width: 1px")], "CodeMirror-vscrollbar"); + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + // DIVs containing the selection and the actual code + d.lineDiv = elt("div"); + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + // Blinky cursor, and element used to ensure cursor fits at the end of a line + d.cursor = elt("div", "\u00a0", "CodeMirror-cursor"); + // Secondary cursor, shown when on a 'jump' in bi-directional text + d.otherCursor = elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"); + // Used to measure text size + d.measure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = elt("div", [d.measure, d.selectionDiv, d.lineDiv, d.cursor, d.otherCursor], + null, "position: relative; outline: none"); + // Moved around its parent to cover visible view + d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative"); + // Set to the height of the text, causes scrolling + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + // D is needed because behavior of elts with overflow: auto and padding is inconsistent across browsers + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;"); + // Will contain the gutters, if any + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Helper element to properly size the gutter backgrounds + var scrollerInner = elt("div", [d.sizer, d.heightForcer, d.gutters], null, "position: relative; min-height: 100%"); + // Provides scrolling + d.scroller = elt("div", [scrollerInner], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV, + d.scrollbarFiller, d.scroller], "CodeMirror"); + // Work around IE7 z-index bug + if (ie_lt8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (place.appendChild) place.appendChild(d.wrapper); else place(d.wrapper); + + // Needed to hide big blue blinking cursor on Mobile Safari + if (ios) input.style.width = "0px"; + if (!webkit) d.scroller.draggable = true; + // Needed to handle Tab key in KHTML + if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; } + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + else if (ie_lt8) d.scrollbarH.style.minWidth = d.scrollbarV.style.minWidth = "18px"; + + // Current visible range (may be bigger than the view window). + d.viewOffset = d.lastSizeC = 0; + d.showingFrom = d.showingTo = docStart; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // See readInput and resetInput + d.prevInput = ""; + // Set to true when a non-horizontal-scrolling widget is added. As + // an optimization, widget aligning is skipped when d is false. + d.alignWidgets = false; + // Flag that indicates whether we currently expect input to appear + // (after some event like 'keypress' or 'input') and are polling + // intensively. + d.pollingFast = false; + // Self-resetting timeout for the poller + d.poll = new Delayed(); + // True when a drag from the editor is active + d.draggingText = false; + + d.cachedCharWidth = d.cachedTextHeight = null; + d.measureLineCache = []; + d.measureLineCachePos = 0; + + // Tracks when resetInput has punted to just putting a short + // string instead of the (large) selection. + d.inaccurateSelection = false; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + return d; + } + + // STATE UPDATES + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption); + cm.doc.iter(function(line) { + if (line.stateAfter) line.stateAfter = null; + if (line.styles) line.styles = null; + }); + cm.doc.frontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) regChange(cm); + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + cm.display.wrapper.className += " CodeMirror-wrap"; + cm.display.sizer.style.minWidth = ""; + } else { + cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-wrap", ""); + computeMaxLength(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function(){updateScrollbars(cm.display, cm.doc.height);}, 100); + } + + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function(line) { + if (lineIsHidden(cm.doc, line)) + return 0; + else if (wrapping) + return (Math.ceil(line.text.length / perLine) || 1) * th; + else + return th; + }; + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function(line) { + var estHeight = est(line); + if (estHeight != line.height) updateLineHeight(line, estHeight); + }); + } + + function keyMapChanged(cm) { + var style = keyMap[cm.options.keyMap].style; + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") + + (style ? " cm-keymap-" + style : ""); + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + function guttersChanged(cm) { + updateGutters(cm); + regChange(cm); + } + + function updateGutters(cm) { + var gutters = cm.display.gutters, specs = cm.options.gutters; + removeChildren(gutters); + for (var i = 0; i < specs.length; ++i) { + var gutterClass = specs[i]; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)); + if (gutterClass == "CodeMirror-linenumbers") { + cm.display.lineGutter = gElt; + gElt.style.width = (cm.display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = i ? "" : "none"; + } + + function lineLength(doc, line) { + if (line.height == 0) return 0; + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(); + cur = getLine(doc, found.from.line); + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + len -= cur.text.length - found.from.ch; + cur = getLine(doc, found.to.line); + len += cur.text.length - found.to.ch; + } + return len; + } + + function computeMaxLength(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(doc, d.maxLine); + d.maxLineChanged = true; + doc.iter(function(line) { + var len = lineLength(doc, line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // Make sure the gutters options contains the element + // "CodeMirror-linenumbers" when the lineNumbers option is true. + function setGuttersForLineNumbers(options) { + var found = false; + for (var i = 0; i < options.gutters.length; ++i) { + if (options.gutters[i] == "CodeMirror-linenumbers") { + if (options.lineNumbers) found = true; + else options.gutters.splice(i--, 1); + } + } + if (!found && options.lineNumbers) + options.gutters.push("CodeMirror-linenumbers"); + } + + // SCROLLBARS + + // Re-synchronize the fake scrollbars with the actual size of the + // content. Optionally force a scrollTop. + function updateScrollbars(d /* display */, docHeight) { + var totalHeight = docHeight + paddingVert(d); + d.sizer.style.minHeight = d.heightForcer.style.top = totalHeight + "px"; + var scrollHeight = Math.max(totalHeight, d.scroller.scrollHeight); + var needsH = d.scroller.scrollWidth > d.scroller.clientWidth; + var needsV = scrollHeight > d.scroller.clientHeight; + if (needsV) { + d.scrollbarV.style.display = "block"; + d.scrollbarV.style.bottom = needsH ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarV.firstChild.style.height = + (scrollHeight - d.scroller.clientHeight + d.scrollbarV.clientHeight) + "px"; + } else d.scrollbarV.style.display = ""; + if (needsH) { + d.scrollbarH.style.display = "block"; + d.scrollbarH.style.right = needsV ? scrollbarWidth(d.measure) + "px" : "0"; + d.scrollbarH.firstChild.style.width = + (d.scroller.scrollWidth - d.scroller.clientWidth + d.scrollbarH.clientWidth) + "px"; + } else d.scrollbarH.style.display = ""; + if (needsH && needsV) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = scrollbarWidth(d.measure) + "px"; + } else d.scrollbarFiller.style.display = ""; + + if (mac_geLion && scrollbarWidth(d.measure) === 0) + d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = mac_geMountainLion ? "18px" : "12px"; + } + + function visibleLines(display, doc, viewPort) { + var top = display.scroller.scrollTop, height = display.wrapper.clientHeight; + if (typeof viewPort == "number") top = viewPort; + else if (viewPort) {top = viewPort.top; height = viewPort.bottom - viewPort.top;} + top = Math.floor(top - paddingTop(display)); + var bottom = Math.ceil(top + height); + return {from: lineAtHeight(doc, top), to: lineAtHeight(doc, bottom)}; + } + + // LINE NUMBERS + + function alignHorizontally(cm) { + var display = cm.display; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return; + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, l = comp + "px"; + for (var n = display.lineDiv.firstChild; n; n = n.nextSibling) if (n.alignable) { + for (var i = 0, a = n.alignable; i < a.length; ++i) a[i].style.left = l; + } + if (cm.options.fixedGutter) + display.gutters.style.left = (comp + gutterW) + "px"; + } + + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) return false; + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding); + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + return true; + } + return false; + } + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)); + } + function compensateForHScroll(display) { + return getRect(display.scroller).left - getRect(display.sizer).left; + } + + // DISPLAY DRAWING + + function updateDisplay(cm, changes, viewPort) { + var oldFrom = cm.display.showingFrom, oldTo = cm.display.showingTo; + var updated = updateDisplayInner(cm, changes, viewPort); + if (updated) { + signalLater(cm, "update", cm); + if (cm.display.showingFrom != oldFrom || cm.display.showingTo != oldTo) + signalLater(cm, "viewportChange", cm, cm.display.showingFrom, cm.display.showingTo); + } + updateSelection(cm); + updateScrollbars(cm.display, cm.doc.height); + + return updated; + } + + // Uses a set of changes plus the current scroll position to + // determine which DOM updates have to be made, and makes the + // updates. + function updateDisplayInner(cm, changes, viewPort) { + var display = cm.display, doc = cm.doc; + if (!display.wrapper.clientWidth) { + display.showingFrom = display.showingTo = doc.first; + display.viewOffset = 0; + return; + } + + // Compute the new visible window + // If scrollTop is specified, use that to determine which lines + // to render instead of the current scrollbar position. + var visible = visibleLines(display, doc, viewPort); + // Bail out if the visible area is already rendered and nothing changed. + if (changes.length == 0 && + visible.from > display.showingFrom && visible.to < display.showingTo) + return; + + if (maybeUpdateLineNumberWidth(cm)) + changes = [{from: doc.first, to: doc.first + doc.size}]; + var gutterW = display.sizer.style.marginLeft = display.gutters.offsetWidth + "px"; + display.scrollbarH.style.left = cm.options.fixedGutter ? gutterW : "0"; + + // Used to determine which lines need their line numbers updated + var positionsChangedFrom = Infinity; + if (cm.options.lineNumbers) + for (var i = 0; i < changes.length; ++i) + if (changes[i].diff) { positionsChangedFrom = changes[i].from; break; } + + var end = doc.first + doc.size; + var from = Math.max(visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, visible.to + cm.options.viewportMargin); + if (display.showingFrom < from && from - display.showingFrom < 20) from = Math.max(doc.first, display.showingFrom); + if (display.showingTo > to && display.showingTo - to < 20) to = Math.min(end, display.showingTo); + if (sawCollapsedSpans) { + from = lineNo(visualLine(doc, getLine(doc, from))); + while (to < end && lineIsHidden(doc, getLine(doc, to))) ++to; + } + + // Create a range of theoretically intact lines, and punch holes + // in that using the change info. + var intact = [{from: Math.max(display.showingFrom, doc.first), + to: Math.min(display.showingTo, end)}]; + if (intact[0].from >= intact[0].to) intact = []; + else intact = computeIntact(intact, changes); + // When merged lines are present, we might have to reduce the + // intact ranges because changes in continued fragments of the + // intact lines do require the lines to be redrawn. + if (sawCollapsedSpans) + for (var i = 0; i < intact.length; ++i) { + var range = intact[i], merged; + while (merged = collapsedSpanAtEnd(getLine(doc, range.to - 1))) { + var newTo = merged.find().from.line; + if (newTo > range.from) range.to = newTo; + else { intact.splice(i--, 1); break; } + } + } + + // Clip off the parts that won't be visible + var intactLines = 0; + for (var i = 0; i < intact.length; ++i) { + var range = intact[i]; + if (range.from < from) range.from = from; + if (range.to > to) range.to = to; + if (range.from >= range.to) intact.splice(i--, 1); + else intactLines += range.to - range.from; + } + if (intactLines == to - from && from == display.showingFrom && to == display.showingTo) { + updateViewOffset(cm); + return; + } + intact.sort(function(a, b) {return a.from - b.from;}); + + var focused = document.activeElement; + if (intactLines < (to - from) * .7) display.lineDiv.style.display = "none"; + patchDisplay(cm, from, to, intact, positionsChangedFrom); + display.lineDiv.style.display = ""; + if (document.activeElement != focused && focused.offsetHeight) focused.focus(); + + var different = from != display.showingFrom || to != display.showingTo || + display.lastSizeC != display.wrapper.clientHeight; + // This is just a bogus formula that detects when the editor is + // resized or the font size changes. + if (different) display.lastSizeC = display.wrapper.clientHeight; + display.showingFrom = from; display.showingTo = to; + startWorker(cm, 100); + + var prevBottom = display.lineDiv.offsetTop; + for (var node = display.lineDiv.firstChild, height; node; node = node.nextSibling) if (node.lineObj) { + if (ie_lt8) { + var bot = node.offsetTop + node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = getRect(node); + height = box.bottom - box.top; + } + var diff = node.lineObj.height - height; + if (height < 2) height = textHeight(display); + if (diff > .001 || diff < -.001) { + updateLineHeight(node.lineObj, height); + var widgets = node.lineObj.widgets; + if (widgets) for (var i = 0; i < widgets.length; ++i) + widgets[i].height = widgets[i].node.offsetHeight; + } + } + updateViewOffset(cm); + + if (visibleLines(display, doc, viewPort).to > to) + updateDisplayInner(cm, [], viewPort); + return true; + } + + function updateViewOffset(cm) { + var off = cm.display.viewOffset = heightAtLine(cm, getLine(cm.doc, cm.display.showingFrom)); + // Position the mover div to align with the current virtual scroll position + cm.display.mover.style.top = off + "px"; + } + + function computeIntact(intact, changes) { + for (var i = 0, l = changes.length || 0; i < l; ++i) { + var change = changes[i], intact2 = [], diff = change.diff || 0; + for (var j = 0, l2 = intact.length; j < l2; ++j) { + var range = intact[j]; + if (change.to <= range.from && change.diff) { + intact2.push({from: range.from + diff, to: range.to + diff}); + } else if (change.to <= range.from || change.from >= range.to) { + intact2.push(range); + } else { + if (change.from > range.from) + intact2.push({from: range.from, to: change.from}); + if (change.to < range.to) + intact2.push({from: change.to + diff, to: range.to + diff}); + } + } + intact = intact2; + } + return intact; + } + + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + left[cm.options.gutters[i]] = n.offsetLeft; + width[cm.options.gutters[i]] = n.offsetWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth}; + } + + function patchDisplay(cm, from, to, intact, updateNumbersFrom) { + var dims = getDimensions(cm); + var display = cm.display, lineNumbers = cm.options.lineNumbers; + if (!intact.length && (!webkit || !cm.display.currentWheelTarget)) + removeChildren(display.lineDiv); + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + if (webkit && mac && cm.display.currentWheelTarget == node) { + node.style.display = "none"; + node.lineObj = null; + } else { + node.parentNode.removeChild(node); + } + return next; + } + + var nextIntact = intact.shift(), lineN = from; + cm.doc.iter(from, to, function(line) { + if (nextIntact && nextIntact.to == lineN) nextIntact = intact.shift(); + if (lineIsHidden(cm.doc, line)) { + if (line.height != 0) updateLineHeight(line, 0); + if (line.widgets && cur.previousSibling) for (var i = 0; i < line.widgets.length; ++i) + if (line.widgets[i].showIfHidden) { + var prev = cur.previousSibling; + if (/pre/i.test(prev.nodeName)) { + var wrap = elt("div", null, null, "position: relative"); + prev.parentNode.replaceChild(wrap, prev); + wrap.appendChild(prev); + prev = wrap; + } + var wnode = prev.appendChild(elt("div", [line.widgets[i].node], "CodeMirror-linewidget")); + positionLineWidget(line.widgets[i], wnode, prev, dims); + } + } else if (nextIntact && nextIntact.from <= lineN && nextIntact.to > lineN) { + // This line is intact. Skip to the actual node. Update its + // line number if needed. + while (cur.lineObj != line) cur = rm(cur); + if (lineNumbers && updateNumbersFrom <= lineN && cur.lineNumber) + setTextContent(cur.lineNumber, lineNumberFor(cm.options, lineN)); + cur = cur.nextSibling; + } else { + // For lines with widgets, make an attempt to find and reuse + // the existing element, so that widgets aren't needlessly + // removed and re-inserted into the dom + if (line.widgets) for (var j = 0, search = cur, reuse; search && j < 20; ++j, search = search.nextSibling) + if (search.lineObj == line && /div/i.test(search.nodeName)) { reuse = search; break; } + // This line needs to be generated. + var lineNode = buildLineElement(cm, line, lineN, dims, reuse); + if (lineNode != reuse) { + container.insertBefore(lineNode, cur); + } else { + while (cur != reuse) cur = rm(cur); + cur = cur.nextSibling; + } + + lineNode.lineObj = line; + } + ++lineN; + }); + while (cur) cur = rm(cur); + } + + function buildLineElement(cm, line, lineNo, dims, reuse) { + var lineElement = lineContent(cm, line); + var markers = line.gutterMarkers, display = cm.display, wrap; + + if (!cm.options.lineNumbers && !markers && !line.bgClass && !line.wrapClass && !line.widgets) + return lineElement; + + // Lines with gutter elements, widgets or a background class need + // to be wrapped again, and have the extra elements added to the + // wrapper div + + if (reuse) { + reuse.alignable = null; + var isOk = true, widgetsSeen = 0; + for (var n = reuse.firstChild, next; n; n = next) { + next = n.nextSibling; + if (!/\bCodeMirror-linewidget\b/.test(n.className)) { + reuse.removeChild(n); + } else { + for (var i = 0, first = true; i < line.widgets.length; ++i) { + var widget = line.widgets[i], isFirst = false; + if (!widget.above) { isFirst = first; first = false; } + if (widget.node == n.firstChild) { + positionLineWidget(widget, n, reuse, dims); + ++widgetsSeen; + if (isFirst) reuse.insertBefore(lineElement, n); + break; + } + } + if (i == line.widgets.length) { isOk = false; break; } + } + } + if (isOk && widgetsSeen == line.widgets.length) { + wrap = reuse; + reuse.className = line.wrapClass || ""; + } + } + if (!wrap) { + wrap = elt("div", null, line.wrapClass, "position: relative"); + wrap.appendChild(lineElement); + } + // Kludge to make sure the styled element lies behind the selection (by z-index) + if (line.bgClass) + wrap.insertBefore(elt("div", null, line.bgClass + " CodeMirror-linebackground"), wrap.firstChild); + if (cm.options.lineNumbers || markers) { + var gutterWrap = wrap.insertBefore(elt("div", null, null, "position: absolute; left: " + + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"), + wrap.firstChild); + if (cm.options.fixedGutter) (wrap.alignable || (wrap.alignable = [])).push(gutterWrap); + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + wrap.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineNo), + "CodeMirror-linenumber CodeMirror-gutter-elt", + "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + + display.lineNumInnerWidth + "px")); + if (markers) + for (var k = 0; k < cm.options.gutters.length; ++k) { + var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id]; + if (found) + gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); + } + } + if (ie_lt8) wrap.style.zIndex = 2; + if (line.widgets && wrap != reuse) for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + positionLineWidget(widget, node, wrap, dims); + if (widget.above) + wrap.insertBefore(node, cm.options.lineNumbers && line.height != 0 ? gutterWrap : lineElement); + else + wrap.appendChild(node); + signalLater(widget, "redraw"); + } + return wrap; + } + + function positionLineWidget(widget, node, wrap, dims) { + if (widget.noHScroll) { + (wrap.alignable || (wrap.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + } + + // SELECTION / CURSOR + + function updateSelection(cm) { + var display = cm.display; + var collapsed = posEq(cm.doc.sel.from, cm.doc.sel.to); + if (collapsed || cm.options.showCursorWhenSelecting) + updateSelectionCursor(cm); + else + display.cursor.style.display = display.otherCursor.style.display = "none"; + if (!collapsed) + updateSelectionRange(cm); + else + display.selectionDiv.style.display = "none"; + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + var headPos = cursorCoords(cm, cm.doc.sel.head, "div"); + var wrapOff = getRect(display.wrapper), lineOff = getRect(display.lineDiv); + display.inputDiv.style.top = Math.max(0, Math.min(display.wrapper.clientHeight - 20, + headPos.top + lineOff.top - wrapOff.top)) + "px"; + display.inputDiv.style.left = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)) + "px"; + } + + // No selection, plain cursor + function updateSelectionCursor(cm) { + var display = cm.display, pos = cursorCoords(cm, cm.doc.sel.head, "div"); + display.cursor.style.left = pos.left + "px"; + display.cursor.style.top = pos.top + "px"; + display.cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + display.cursor.style.display = ""; + + if (pos.other) { + display.otherCursor.style.display = ""; + display.otherCursor.style.left = pos.other.left + "px"; + display.otherCursor.style.top = pos.other.top + "px"; + display.otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } else { display.otherCursor.style.display = "none"; } + } + + // Highlight selection + function updateSelectionRange(cm) { + var display = cm.display, doc = cm.doc, sel = cm.doc.sel; + var fragment = document.createDocumentFragment(); + var clientWidth = display.lineSpace.offsetWidth, pl = paddingLeft(cm.display); + + function add(left, top, width, bottom) { + if (top < 0) top = 0; + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + + "px; top: " + top + "px; width: " + (width == null ? clientWidth - left : width) + + "px; height: " + (bottom - top) + "px")); + } + + function drawForLine(line, fromArg, toArg, retTop) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length, rVal = retTop ? Infinity : -Infinity; + function coords(ch) { + return charCoords(cm, Pos(line, ch), "div", lineObj); + } + + iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) { + var leftPos = coords(dir == "rtl" ? to - 1 : from); + var rightPos = coords(dir == "rtl" ? from : to - 1); + var left = leftPos.left, right = rightPos.right; + if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part + add(left, leftPos.top, null, leftPos.bottom); + left = pl; + if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top); + } + if (toArg == null && to == lineLen) right = clientWidth; + if (fromArg == null && from == 0) left = pl; + rVal = retTop ? Math.min(rightPos.top, rVal) : Math.max(rightPos.bottom, rVal); + if (left < pl + 1) left = pl; + add(left, rightPos.top, right - left, rightPos.bottom); + }); + return rVal; + } + + if (sel.from.line == sel.to.line) { + drawForLine(sel.from.line, sel.from.ch, sel.to.ch); + } else { + var fromObj = getLine(doc, sel.from.line); + var cur = fromObj, merged, path = [sel.from.line, sel.from.ch], singleLine; + while (merged = collapsedSpanAtEnd(cur)) { + var found = merged.find(); + path.push(found.from.ch, found.to.line, found.to.ch); + if (found.to.line == sel.to.line) { + path.push(sel.to.ch); + singleLine = true; + break; + } + cur = getLine(doc, found.to.line); + } + + // This is a single, merged line + if (singleLine) { + for (var i = 0; i < path.length; i += 3) + drawForLine(path[i], path[i+1], path[i+2]); + } else { + var middleTop, middleBot, toObj = getLine(doc, sel.to.line); + if (sel.from.ch) + // Draw the first line of selection. + middleTop = drawForLine(sel.from.line, sel.from.ch, null, false); + else + // Simply include it in the middle block. + middleTop = heightAtLine(cm, fromObj) - display.viewOffset; + + if (!sel.to.ch) + middleBot = heightAtLine(cm, toObj) - display.viewOffset; + else + middleBot = drawForLine(sel.to.line, collapsedSpanAtStart(toObj) ? null : 0, sel.to.ch, true); + + if (middleTop < middleBot) add(pl, middleTop, null, middleBot); + } + } + + removeChildrenAndAdd(display.selectionDiv, fragment); + display.selectionDiv.style.display = ""; + } + + // Cursor-blinking + function restartBlink(cm) { + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursor.style.visibility = display.otherCursor.style.visibility = ""; + display.blinker = setInterval(function() { + if (!display.cursor.offsetHeight) return; + display.cursor.style.visibility = display.otherCursor.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.mode.startState && cm.doc.frontier < cm.display.showingTo) + cm.state.highlight.set(time, bind(highlightWorker, cm)); + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.frontier < doc.first) doc.frontier = doc.first; + if (doc.frontier >= cm.display.showingTo) return; + var end = +new Date + cm.options.workTime; + var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)); + var changed = [], prevChange; + doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.showingTo + 500), function(line) { + if (doc.frontier >= cm.display.showingFrom) { // Visible + var oldStyles = line.styles; + line.styles = highlightLine(cm, line, state); + var ischange = !oldStyles || oldStyles.length != line.styles.length; + for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]; + if (ischange) { + if (prevChange && prevChange.end == doc.frontier) prevChange.end++; + else changed.push(prevChange = {start: doc.frontier, end: doc.frontier + 1}); + } + line.stateAfter = copyState(doc.mode, state); + } else { + processLine(cm, line, state); + line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null; + } + ++doc.frontier; + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + if (changed.length) + operation(cm, function() { + for (var i = 0; i < changed.length; ++i) + regChange(this, changed[i].start, changed[i].end); + })(); + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n) { + var minindent, minline, doc = cm.doc; + for (var search = n, lim = n - 100; search > lim; --search) { + if (search <= doc.first) return doc.first; + var line = getLine(doc, search - 1); + if (line.stateAfter) return search; + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + + function getStateBefore(cm, n) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) return true; + var pos = findStartLine(cm, n), state = pos > doc.first && getLine(doc, pos-1).stateAfter; + if (!state) state = startState(doc.mode); + else state = copyState(doc.mode, state); + doc.iter(pos, n, function(line) { + processLine(cm, line, state); + var save = pos == n - 1 || pos % 5 == 0 || pos >= display.showingFrom && pos < display.showingTo; + line.stateAfter = save ? copyState(doc.mode, state) : null; + ++pos; + }); + return state; + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop;} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;} + function paddingLeft(display) { + var e = removeChildrenAndAdd(display.measure, elt("pre", null, null, "text-align: left")).appendChild(elt("span", "x")); + return e.offsetLeft; + } + + function measureChar(cm, line, ch, data) { + var dir = -1; + data = data || measureLine(cm, line); + + for (var pos = ch;; pos += dir) { + var r = data[pos]; + if (r) break; + if (dir < 0 && pos == 0) dir = 1; + } + return {left: pos < ch ? r.right : r.left, + right: pos > ch ? r.left : r.right, + top: r.top, bottom: r.bottom}; + } + + function findCachedMeasurement(cm, line) { + var cache = cm.display.measureLineCache; + for (var i = 0; i < cache.length; ++i) { + var memo = cache[i]; + if (memo.text == line.text && memo.markedSpans == line.markedSpans && + cm.display.scroller.clientWidth == memo.width && + memo.classes == line.textClass + "|" + line.bgClass + "|" + line.wrapClass) + return memo.measure; + } + } + + function measureLine(cm, line) { + // First look in the cache + var measure = findCachedMeasurement(cm, line); + if (!measure) { + // Failing that, recompute and store result in cache + measure = measureLineInner(cm, line); + var cache = cm.display.measureLineCache; + var memo = {text: line.text, width: cm.display.scroller.clientWidth, + markedSpans: line.markedSpans, measure: measure, + classes: line.textClass + "|" + line.bgClass + "|" + line.wrapClass}; + if (cache.length == 16) cache[++cm.display.measureLineCachePos % 16] = memo; + else cache.push(memo); + } + return measure; + } + + function measureLineInner(cm, line) { + var display = cm.display, measure = emptyArray(line.text.length); + var pre = lineContent(cm, line, measure); + + // IE does not cache element positions of inline elements between + // calls to getBoundingClientRect. This makes the loop below, + // which gathers the positions of all the characters on the line, + // do an amount of layout work quadratic to the number of + // characters. When line wrapping is off, we try to improve things + // by first subdividing the line into a bunch of inline blocks, so + // that IE can reuse most of the layout information from caches + // for those blocks. This does interfere with line wrapping, so it + // doesn't work when wrapping is on, but in that case the + // situation is slightly better, since IE does cache line-wrapping + // information and only recomputes per-line. + if (ie && !ie_lt8 && !cm.options.lineWrapping && pre.childNodes.length > 100) { + var fragment = document.createDocumentFragment(); + var chunk = 10, n = pre.childNodes.length; + for (var i = 0, chunks = Math.ceil(n / chunk); i < chunks; ++i) { + var wrap = elt("div", null, null, "display: inline-block"); + for (var j = 0; j < chunk && n; ++j) { + wrap.appendChild(pre.firstChild); + --n; + } + fragment.appendChild(wrap); + } + pre.appendChild(fragment); + } + + removeChildrenAndAdd(display.measure, pre); + + var outer = getRect(display.lineDiv); + var vranges = [], data = emptyArray(line.text.length), maxBot = pre.offsetHeight; + // Work around an IE7/8 bug where it will sometimes have randomly + // replaced our pre with a clone at this point. + if (ie_lt9 && display.measure.first != pre) + removeChildrenAndAdd(display.measure, pre); + + for (var i = 0, cur; i < measure.length; ++i) if (cur = measure[i]) { + var size = getRect(cur); + var top = Math.max(0, size.top - outer.top), bot = Math.min(size.bottom - outer.top, maxBot); + for (var j = 0; j < vranges.length; j += 2) { + var rtop = vranges[j], rbot = vranges[j+1]; + if (rtop > bot || rbot < top) continue; + if (rtop <= top && rbot >= bot || + top <= rtop && bot >= rbot || + Math.min(bot, rbot) - Math.max(top, rtop) >= (bot - top) >> 1) { + vranges[j] = Math.min(top, rtop); + vranges[j+1] = Math.max(bot, rbot); + break; + } + } + if (j == vranges.length) vranges.push(top, bot); + var right = size.right; + if (cur.measureRight) right = getRect(cur.measureRight).left; + data[i] = {left: size.left - outer.left, right: right - outer.left, top: j}; + } + for (var i = 0, cur; i < data.length; ++i) if (cur = data[i]) { + var vr = cur.top; + cur.top = vranges[vr]; cur.bottom = vranges[vr+1]; + } + + return data; + } + + function measureLineWidth(cm, line) { + var hasBadSpan = false; + if (line.markedSpans) for (var i = 0; i < line.markedSpans; ++i) { + var sp = line.markedSpans[i]; + if (sp.collapsed && (sp.to == null || sp.to == line.text.length)) hasBadSpan = true; + } + var cached = !hasBadSpan && findCachedMeasurement(cm, line); + if (cached) return measureChar(cm, line, line.text.length, cached).right; + + var pre = lineContent(cm, line); + var end = pre.appendChild(zeroWidthElement(cm.display.measure)); + removeChildrenAndAdd(cm.display.measure, pre); + return getRect(end).right - getRect(cm.display.lineDiv).left; + } + + function clearCaches(cm) { + cm.display.measureLineCache.length = cm.display.measureLineCachePos = 0; + cm.display.cachedCharWidth = cm.display.cachedTextHeight = null; + cm.display.maxLineChanged = true; + cm.display.lineNumChars = null; + } + + // Context is one of "line", "div" (display.lineDiv), "local"/null (editor), or "page" + function intoCoordSystem(cm, lineObj, rect, context) { + if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) { + var size = widgetHeight(lineObj.widgets[i]); + rect.top += size; rect.bottom += size; + } + if (context == "line") return rect; + if (!context) context = "local"; + var yOff = heightAtLine(cm, lineObj); + if (context != "local") yOff -= cm.display.viewOffset; + if (context == "page") { + var lOff = getRect(cm.display.lineSpace); + yOff += lOff.top + (window.pageYOffset || (document.documentElement || document.body).scrollTop); + var xOff = lOff.left + (window.pageXOffset || (document.documentElement || document.body).scrollLeft); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect; + } + + // Context may be "window", "page", "div", or "local"/null + // Result is in "div" coords + function fromCoordSystem(cm, coords, context) { + if (context == "div") return coords; + var left = coords.left, top = coords.top; + if (context == "page") { + left -= window.pageXOffset || (document.documentElement || document.body).scrollLeft; + top -= window.pageYOffset || (document.documentElement || document.body).scrollTop; + } + var lineSpaceBox = getRect(cm.display.lineSpace); + left -= lineSpaceBox.left; + top -= lineSpaceBox.top; + if (context == "local" || !context) { + var editorBox = getRect(cm.display.wrapper); + left += editorBox.left; + top += editorBox.top; + } + return {left: left, top: top}; + } + + function charCoords(cm, pos, context, lineObj) { + if (!lineObj) lineObj = getLine(cm.doc, pos.line); + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch), context); + } + + function cursorCoords(cm, pos, context, lineObj, measurement) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!measurement) measurement = measureLine(cm, lineObj); + function get(ch, right) { + var m = measureChar(cm, lineObj, ch, measurement); + if (right) m.left = m.right; else m.right = m.left; + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj), ch = pos.ch; + if (!order) return get(ch); + var main, other, linedir = order[0].level; + for (var i = 0; i < order.length; ++i) { + var part = order[i], rtl = part.level % 2, nb, here; + if (part.from < ch && part.to > ch) return get(ch, rtl); + var left = rtl ? part.to : part.from, right = rtl ? part.from : part.to; + if (left == ch) { + // IE returns bogus offsets and widths for edges where the + // direction flips, but only for the side with the lower + // level. So we try to use the side with the higher level. + if (i && part.level < (nb = order[i-1]).level) here = get(nb.level % 2 ? nb.from : nb.to - 1, true); + else here = get(rtl && part.from != part.to ? ch - 1 : ch); + if (rtl == linedir) main = here; else other = here; + } else if (right == ch) { + var nb = i < order.length - 1 && order[i+1]; + if (!rtl && nb && nb.from == nb.to) continue; + if (nb && part.level < nb.level) here = get(nb.level % 2 ? nb.to - 1 : nb.from); + else here = get(rtl ? ch : ch - 1, true); + if (rtl == linedir) main = here; else other = here; + } + } + if (linedir && !ch) other = get(order[0].to - 1); + if (!main) return other; + if (other) main.other = other; + return main; + } + + function PosMaybeOutside(line, ch, outside) { + var pos = new Pos(line, ch); + if (outside) pos.outside = true; + return pos; + } + + // Coords must be lineSpace-local + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) return PosMaybeOutside(doc.first, 0, true); + var lineNo = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineNo > last) + return PosMaybeOutside(doc.first + doc.size - 1, getLine(doc, last).text.length, true); + if (x < 0) x = 0; + + for (;;) { + var lineObj = getLine(doc, lineNo); + var found = coordsCharInner(cm, lineObj, lineNo, x, y); + var merged = collapsedSpanAtEnd(lineObj); + var mergedPos = merged && merged.find(); + if (merged && found.ch >= mergedPos.from.ch) + lineNo = mergedPos.to.line; + else + return found; + } + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + var innerOff = y - heightAtLine(cm, lineObj); + var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth; + var measurement = measureLine(cm, lineObj); + + function getX(ch) { + var sp = cursorCoords(cm, Pos(lineNo, ch), "line", + lineObj, measurement); + wrongLine = true; + if (innerOff > sp.bottom) return sp.left - adjust; + else if (innerOff < sp.top) return sp.left + adjust; + else wrongLine = false; + return sp.left; + } + + var bidi = getOrder(lineObj), dist = lineObj.text.length; + var from = lineLeft(lineObj), to = lineRight(lineObj); + var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine; + + if (x > toX) return PosMaybeOutside(lineNo, to, toOutside); + // Do a binary search between these bounds. + for (;;) { + if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { + var after = x - fromX < toX - x, ch = after ? from : to; + while (isExtendingChar.test(lineObj.text.charAt(ch))) ++ch; + var pos = PosMaybeOutside(lineNo, ch, after ? fromOutside : toOutside); + pos.after = after; + return pos; + } + var step = Math.ceil(dist / 2), middle = from + step; + if (bidi) { + middle = from; + for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1); + } + var middleX = getX(middle); + if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist -= step;} + else {from = middle; fromX = middleX; fromOutside = wrongLine; dist = step;} + } + } + + var measureText; + function textHeight(display) { + if (display.cachedTextHeight != null) return display.cachedTextHeight; + if (measureText == null) { + measureText = elt("pre"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) display.cachedTextHeight = height; + removeChildren(display.measure); + return height || 1; + } + + function charWidth(display) { + if (display.cachedCharWidth != null) return display.cachedCharWidth; + var anchor = elt("span", "x"); + var pre = elt("pre", [anchor]); + removeChildrenAndAdd(display.measure, pre); + var width = anchor.offsetWidth; + if (width > 2) display.cachedCharWidth = width; + return width || 10; + } + + // OPERATIONS + + // Operations are used to wrap changes in such a way that each + // change won't have to update the cursor and display (which would + // be awkward, slow, and error-prone), but instead updates are + // batched and then all combined and executed at once. + + var nextOpId = 0; + function startOperation(cm) { + cm.curOp = { + // An array of ranges of lines that have to be updated. See + // updateDisplay. + changes: [], + updateInput: null, + userSelChange: null, + textChanged: null, + selectionChanged: false, + updateMaxLine: false, + updateScrollPos: false, + id: ++nextOpId + }; + if (!delayedCallbackDepth++) delayedCallbacks = []; + } + + function endOperation(cm) { + var op = cm.curOp, doc = cm.doc, display = cm.display; + cm.curOp = null; + + if (op.updateMaxLine) computeMaxLength(cm); + if (display.maxLineChanged && !cm.options.lineWrapping) { + var width = measureLineWidth(cm, display.maxLine); + display.sizer.style.minWidth = Math.max(0, width + 3 + scrollerCutOff) + "px"; + display.maxLineChanged = false; + var maxScrollLeft = Math.max(0, display.sizer.offsetLeft + display.sizer.offsetWidth - display.scroller.clientWidth); + if (maxScrollLeft < doc.scrollLeft && !op.updateScrollPos) + setScrollLeft(cm, Math.min(display.scroller.scrollLeft, maxScrollLeft), true); + } + var newScrollPos, updated; + if (op.updateScrollPos) { + newScrollPos = op.updateScrollPos; + } else if (op.selectionChanged && display.scroller.clientHeight) { // don't rescroll if not visible + var coords = cursorCoords(cm, doc.sel.head); + newScrollPos = calculateScrollPos(cm, coords.left, coords.top, coords.left, coords.bottom); + } + if (op.changes.length || newScrollPos && newScrollPos.scrollTop != null) { + updated = updateDisplay(cm, op.changes, newScrollPos && newScrollPos.scrollTop); + if (cm.display.scroller.offsetHeight) cm.doc.scrollTop = cm.display.scroller.scrollTop; + } + if (!updated && op.selectionChanged) updateSelection(cm); + if (op.updateScrollPos) { + display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = newScrollPos.scrollTop; + display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = newScrollPos.scrollLeft; + alignHorizontally(cm); + } else if (newScrollPos) { + scrollCursorIntoView(cm); + } + if (op.selectionChanged) restartBlink(cm); + + if (cm.state.focused && op.updateInput) + resetInput(cm, op.userSelChange); + + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) for (var i = 0; i < hidden.length; ++i) + if (!hidden[i].lines.length) signal(hidden[i], "hide"); + if (unhidden) for (var i = 0; i < unhidden.length; ++i) + if (unhidden[i].lines.length) signal(unhidden[i], "unhide"); + + var delayed; + if (!--delayedCallbackDepth) { + delayed = delayedCallbacks; + delayedCallbacks = null; + } + if (op.textChanged) + signal(cm, "change", cm, op.textChanged); + if (op.selectionChanged) signal(cm, "cursorActivity", cm); + if (delayed) for (var i = 0; i < delayed.length; ++i) delayed[i](); + } + + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm1, f) { + return function() { + var cm = cm1 || this, withOp = !cm.curOp; + if (withOp) startOperation(cm); + try { var result = f.apply(cm, arguments); } + finally { if (withOp) endOperation(cm); } + return result; + }; + } + function docOperation(f) { + return function() { + var withOp = this.cm && !this.cm.curOp, result; + if (withOp) startOperation(this.cm); + try { result = f.apply(this, arguments); } + finally { if (withOp) endOperation(this.cm); } + return result; + }; + } + function runInOp(cm, f) { + var withOp = !cm.curOp, result; + if (withOp) startOperation(cm); + try { result = f(); } + finally { if (withOp) endOperation(cm); } + return result; + } + + function regChange(cm, from, to, lendiff) { + if (from == null) from = cm.doc.first; + if (to == null) to = cm.doc.first + cm.doc.size; + cm.curOp.changes.push({from: from, to: to, diff: lendiff}); + } + + // INPUT HANDLING + + function slowPoll(cm) { + if (cm.display.pollingFast) return; + cm.display.poll.set(cm.options.pollInterval, function() { + readInput(cm); + if (cm.state.focused) slowPoll(cm); + }); + } + + function fastPoll(cm) { + var missed = false; + cm.display.pollingFast = true; + function p() { + var changed = readInput(cm); + if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);} + else {cm.display.pollingFast = false; slowPoll(cm);} + } + cm.display.poll.set(20, p); + } + + // prevInput is a hack to work with IME. If we reset the textarea + // on every change, that breaks IME. So we look for changes + // compared to the previous content instead. (Modern browsers have + // events that indicate IME taking place, but these are not widely + // supported or compatible enough yet to rely on.) + function readInput(cm) { + var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc, sel = doc.sel; + if (!cm.state.focused || hasSelection(input) || isReadOnly(cm)) return false; + var text = input.value; + if (text == prevInput && posEq(sel.from, sel.to)) return false; + // IE enjoys randomly deselecting our input's text when + // re-focusing. If the selection is gone but the cursor is at the + // start of the input, that's probably what happened. + if (ie && text && input.selectionStart === 0) { + resetInput(cm, true); + return false; + } + var withOp = !cm.curOp; + if (withOp) startOperation(cm); + sel.shift = false; + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput[same] == text[same]) ++same; + var from = sel.from, to = sel.to; + if (same < prevInput.length) + from = Pos(from.line, from.ch - (prevInput.length - same)); + else if (cm.state.overwrite && posEq(from, to) && !cm.state.pasteIncoming) + to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + (text.length - same))); + var updateInput = cm.curOp.updateInput; + makeChange(cm.doc, {from: from, to: to, text: splitLines(text.slice(same)), + origin: cm.state.pasteIncoming ? "paste" : "+input"}, "end"); + + cm.curOp.updateInput = updateInput; + if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = ""; + else cm.display.prevInput = text; + if (withOp) endOperation(cm); + cm.state.pasteIncoming = false; + return true; + } + + function resetInput(cm, user) { + var minimal, selected, doc = cm.doc; + if (!posEq(doc.sel.from, doc.sel.to)) { + cm.display.prevInput = ""; + minimal = hasCopyEvent && + (doc.sel.to.line - doc.sel.from.line > 100 || (selected = cm.getSelection()).length > 1000); + if (minimal) cm.display.input.value = "-"; + else cm.display.input.value = selected || cm.getSelection(); + if (cm.state.focused) selectInput(cm.display.input); + } else if (user) cm.display.prevInput = cm.display.input.value = ""; + cm.display.inaccurateSelection = minimal; + } + + function focusInput(cm) { + if (cm.options.readOnly != "nocursor" && (!mobile || document.activeElement != cm.display.input)) + cm.display.input.focus(); + } + + function isReadOnly(cm) { + return cm.options.readOnly || cm.doc.cantEdit; + } + + // EVENT HANDLERS + + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + on(d.scroller, "dblclick", operation(cm, e_preventDefault)); + on(d.lineSpace, "selectstart", function(e) { + if (!eventInWidget(d, e)) e_preventDefault(e); + }); + // Gecko browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for Gecko. + if (!captureMiddleClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);}); + + on(d.scroller, "scroll", function() { + if (d.scroller.clientHeight) { + setScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + on(d.scrollbarV, "scroll", function() { + if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop); + }); + on(d.scrollbarH, "scroll", function() { + if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft); + }); + + on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);}); + on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);}); + + function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); } + on(d.scrollbarH, "mousedown", reFocus); + on(d.scrollbarV, "mousedown", reFocus); + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + function onResize() { + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = null; + clearCaches(cm); + runInOp(cm, bind(regChange, cm)); + } + on(window, "resize", onResize); + // Above handler holds on to the editor and its data structures. + // Here we poll to unregister it when the editor is no longer in + // the document, so that it can be garbage-collected. + function unregister() { + for (var p = d.wrapper.parentNode; p && p != document.body; p = p.parentNode) {} + if (p) setTimeout(unregister, 5000); + else off(window, "resize", onResize); + } + setTimeout(unregister, 5000); + + on(d.input, "keyup", operation(cm, function(e) { + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + if (e.keyCode == 16) cm.doc.sel.shift = false; + })); + on(d.input, "input", bind(fastPoll, cm)); + on(d.input, "keydown", operation(cm, onKeyDown)); + on(d.input, "keypress", operation(cm, onKeyPress)); + on(d.input, "focus", bind(onFocus, cm)); + on(d.input, "blur", bind(onBlur, cm)); + + function drag_(e) { + if (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e))) return; + e_stop(e); + } + if (cm.options.dragDrop) { + on(d.scroller, "dragstart", function(e){onDragStart(cm, e);}); + on(d.scroller, "dragenter", drag_); + on(d.scroller, "dragover", drag_); + on(d.scroller, "drop", operation(cm, onDrop)); + } + on(d.scroller, "paste", function(e){ + if (eventInWidget(d, e)) return; + focusInput(cm); + fastPoll(cm); + }); + on(d.input, "paste", function() { + cm.state.pasteIncoming = true; + fastPoll(cm); + }); + + function prepareCopy() { + if (d.inaccurateSelection) { + d.prevInput = ""; + d.inaccurateSelection = false; + d.input.value = cm.getSelection(); + selectInput(d.input); + } + } + on(d.input, "cut", prepareCopy); + on(d.input, "copy", prepareCopy); + + // Needed to handle Tab key in KHTML + if (khtml) on(d.sizer, "mouseup", function() { + if (document.activeElement == d.input) d.input.blur(); + focusInput(cm); + }); + } + + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n) return true; + if (/\bCodeMirror-(?:line)?widget\b/.test(n.className) || + n.parentNode == display.sizer && n != display.mover) return true; + } + } + + function posFromMouse(cm, e, liberal) { + var display = cm.display; + if (!liberal) { + var target = e_target(e); + if (target == display.scrollbarH || target == display.scrollbarH.firstChild || + target == display.scrollbarV || target == display.scrollbarV.firstChild || + target == display.scrollbarFiller) return null; + } + var x, y, space = getRect(display.lineSpace); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX; y = e.clientY; } catch (e) { return null; } + return coordsChar(cm, x - space.left, y - space.top); + } + + var lastClick, lastDoubleClick; + function onMouseDown(e) { + var cm = this, display = cm.display, doc = cm.doc, sel = doc.sel; + sel.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + display.scroller.draggable = false; + setTimeout(function(){display.scroller.draggable = true;}, 100); + } + return; + } + if (clickInGutter(cm, e)) return; + var start = posFromMouse(cm, e); + + switch (e_button(e)) { + case 3: + if (captureMiddleClick) onContextMenu.call(cm, cm, e); + return; + case 2: + if (start) extendSelection(cm.doc, start); + setTimeout(bind(focusInput, cm), 20); + e_preventDefault(e); + return; + } + // For button 1, if it was clicked inside the editor + // (posFromMouse returning non-null), we have to adjust the + // selection. + if (!start) {if (e_target(e) == display.scroller) e_preventDefault(e); return;} + + if (!cm.state.focused) onFocus(cm); + + var now = +new Date, type = "single"; + if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) { + type = "triple"; + e_preventDefault(e); + setTimeout(bind(focusInput, cm), 20); + selectLine(cm, start.line); + } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) { + type = "double"; + lastDoubleClick = {time: now, pos: start}; + e_preventDefault(e); + var word = findWordAt(getLine(doc, start.line).text, start); + extendSelection(cm.doc, word.from, word.to); + } else { lastClick = {time: now, pos: start}; } + + var last = start; + if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) && !posEq(sel.from, sel.to) && + !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") { + var dragEnd = operation(cm, function(e2) { + if (webkit) display.scroller.draggable = false; + cm.state.draggingText = false; + off(document, "mouseup", dragEnd); + off(display.scroller, "drop", dragEnd); + if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { + e_preventDefault(e2); + extendSelection(cm.doc, start); + focusInput(cm); + } + }); + // Let the drag handler handle this. + if (webkit) display.scroller.draggable = true; + cm.state.draggingText = dragEnd; + // IE's approach to draggable + if (display.scroller.dragDrop) display.scroller.dragDrop(); + on(document, "mouseup", dragEnd); + on(display.scroller, "drop", dragEnd); + return; + } + e_preventDefault(e); + if (type == "single") extendSelection(cm.doc, clipPos(doc, start)); + + var startstart = sel.from, startend = sel.to; + + function doSelect(cur) { + if (type == "single") { + extendSelection(cm.doc, clipPos(doc, start), cur); + return; + } + + startstart = clipPos(doc, startstart); + startend = clipPos(doc, startend); + if (type == "double") { + var word = findWordAt(getLine(doc, cur.line).text, cur); + if (posLess(cur, startstart)) extendSelection(cm.doc, word.from, startend); + else extendSelection(cm.doc, startstart, word.to); + } else if (type == "triple") { + if (posLess(cur, startstart)) extendSelection(cm.doc, startend, clipPos(doc, Pos(cur.line, 0))); + else extendSelection(cm.doc, startstart, clipPos(doc, Pos(cur.line + 1, 0))); + } + } + + var editorSize = getRect(display.wrapper); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true); + if (!cur) return; + if (!posEq(cur, last)) { + if (!cm.state.focused) onFocus(cm); + last = cur; + doSelect(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150); + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) setTimeout(operation(cm, function() { + if (counter != curCount) return; + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + + function done(e) { + counter = Infinity; + var cur = posFromMouse(cm, e); + if (cur) doSelect(cur); + e_preventDefault(e); + focusInput(cm); + off(document, "mousemove", move); + off(document, "mouseup", up); + } + + var move = operation(cm, function(e) { + if (!ie && !e_button(e)) done(e); + else extend(e); + }); + var up = operation(cm, done); + on(document, "mousemove", move); + on(document, "mouseup", up); + } + + function onDrop(e) { + var cm = this; + if (eventInWidget(cm.display, e) || (cm.options.onDragEvent && cm.options.onDragEvent(cm, addStop(e)))) + return; + e_preventDefault(e); + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || isReadOnly(cm)) return; + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function(file, i) { + var reader = new FileReader; + reader.onload = function() { + text[i] = reader.result; + if (++read == n) { + pos = clipPos(cm.doc, pos); + makeChange(cm.doc, {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"}, "around"); + } + }; + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) loadFile(files[i], i); + } else { + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && !(posLess(pos, cm.doc.sel.from) || posLess(cm.doc.sel.to, pos))) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(bind(focusInput, cm), 20); + return; + } + try { + var text = e.dataTransfer.getData("Text"); + if (text) { + var curFrom = cm.doc.sel.from, curTo = cm.doc.sel.to; + setSelection(cm.doc, pos, pos); + if (cm.state.draggingText) replaceRange(cm.doc, "", curFrom, curTo, "paste"); + cm.replaceSelection(text, null, "paste"); + focusInput(cm); + onFocus(cm); + } + } + catch(e){} + } + } + + function clickInGutter(cm, e) { + var display = cm.display; + try { var mX = e.clientX, mY = e.clientY; } + catch(e) { return false; } + + if (mX >= Math.floor(getRect(display.gutters).right)) return false; + e_preventDefault(e); + if (!hasHandler(cm, "gutterClick")) return true; + + var lineBox = getRect(display.lineDiv); + if (mY > lineBox.bottom) return true; + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.options.gutters.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && getRect(g).right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.options.gutters[i]; + signalLater(cm, "gutterClick", cm, line, gutter, e); + break; + } + } + return true; + } + + function onDragStart(cm, e) { + if (eventInWidget(cm.display, e)) return; + + var txt = cm.getSelection(); + e.dataTransfer.setData("Text", txt); + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + if (opera) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + if (safari) { + if (cm.display.dragImg) { + img = cm.display.dragImg; + } else { + cm.display.dragImg = img; + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + cm.display.wrapper.appendChild(img); + } + } + e.dataTransfer.setDragImage(img, 0, 0); + if (opera) img.parentNode.removeChild(img); + } + } + + function setScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) return; + cm.doc.scrollTop = val; + if (!gecko) updateDisplay(cm, [], val); + if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val; + if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val; + if (gecko) updateDisplay(cm, []); + } + function setScrollLeft(cm, val, isScroller) { + if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return; + val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val; + if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val; + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) wheelPixelsPerUnit = -.53; + else if (gecko) wheelPixelsPerUnit = 15; + else if (chrome) wheelPixelsPerUnit = -.7; + else if (safari) wheelPixelsPerUnit = -1/3; + + function onScrollWheel(cm, e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail; + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail; + else if (dy == null) dy = e.wheelDelta; + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + if (!(dx && scroll.scrollWidth > scroll.clientWidth || + dy && scroll.scrollHeight > scroll.clientHeight)) return; + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + for (var cur = e.target; cur != scroll; cur = cur.parentNode) { + if (cur.lineObj) { + cm.display.currentWheelTarget = cur; + break; + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !opera && wheelPixelsPerUnit != null) { + if (dy) + setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))); + setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))); + e_preventDefault(e); + display.wheelStartX = null; // Abort measurement, if in progress + return; + } + + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) top = Math.max(0, top + pixels - 50); + else bot = Math.min(cm.doc.height, bot + pixels + 50); + updateDisplay(cm, [], {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function() { + if (display.wheelStartX == null) return; + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) return; + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) return false; + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false; + var doc = cm.doc, prevShift = doc.sel.shift, done = false; + try { + if (isReadOnly(cm)) cm.state.suppressEdits = true; + if (dropShift) doc.sel.shift = false; + done = bound(cm) != Pass; + } finally { + doc.sel.shift = prevShift; + cm.state.suppressEdits = false; + } + return done; + } + + function allKeyMaps(cm) { + var maps = cm.state.keyMaps.slice(0); + if (cm.options.extraKeys) maps.push(cm.options.extraKeys); + maps.push(cm.options.keyMap); + return maps; + } + + var maybeTransition; + function handleKeyBinding(cm, e) { + // Handle auto keymap transitions + var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto; + clearTimeout(maybeTransition); + if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() { + if (getKeyMap(cm.options.keyMap) == startMap) + cm.options.keyMap = (next.call ? next.call(null, cm) : next); + }, 50); + + var name = keyName(e, true), handled = false; + if (!name) return false; + var keymaps = allKeyMaps(cm); + + if (e.shiftKey) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);}) + || lookupKey(name, keymaps, function(b) { + if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(cm, b); + }); + } else { + handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); }); + } + if (handled == "stop") handled = false; + + if (handled) { + e_preventDefault(e); + restartBlink(cm); + if (ie_lt9) { e.oldKeyCode = e.keyCode; e.keyCode = 0; } + } + return handled; + } + + function handleCharBinding(cm, e, ch) { + var handled = lookupKey("'" + ch + "'", allKeyMaps(cm), + function(b) { return doHandleBinding(cm, b, true); }); + if (handled) { + e_preventDefault(e); + restartBlink(cm); + } + return handled; + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (!cm.state.focused) onFocus(cm); + if (ie && e.keyCode == 27) { e.returnValue = false; } + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var code = e.keyCode; + // IE does strange things with escape. + cm.doc.sel.shift = code == 16 || e.shiftKey; + // First give onKeyEvent option a chance to handle this. + var handled = handleKeyBinding(cm, e); + if (opera) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + cm.replaceSelection(""); + } + } + + function onKeyPress(e) { + var cm = this; + if (cm.options.onKeyEvent && cm.options.onKeyEvent(cm, addStop(e))) return; + var keyCode = e.keyCode, charCode = e.charCode; + if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;} + if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return; + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + if (this.options.electricChars && this.doc.mode.electricChars && + this.options.smartIndent && !isReadOnly(this) && + this.doc.mode.electricChars.indexOf(ch) > -1) + setTimeout(operation(cm, function() {indentLine(cm, cm.doc.sel.to.line, "smart");}), 75); + if (handleCharBinding(cm, e, ch)) return; + fastPoll(cm); + } + + function onFocus(cm) { + if (cm.options.readOnly == "nocursor") return; + if (!cm.state.focused) { + signal(cm, "focus", cm); + cm.state.focused = true; + if (cm.display.wrapper.className.search(/\bCodeMirror-focused\b/) == -1) + cm.display.wrapper.className += " CodeMirror-focused"; + resetInput(cm, true); + } + slowPoll(cm); + restartBlink(cm); + } + function onBlur(cm) { + if (cm.state.focused) { + signal(cm, "blur", cm); + cm.state.focused = false; + cm.display.wrapper.className = cm.display.wrapper.className.replace(" CodeMirror-focused", ""); + } + clearInterval(cm.display.blinker); + setTimeout(function() {if (!cm.state.focused) cm.doc.sel.shift = false;}, 150); + } + + var detectingSelectAll; + function onContextMenu(cm, e) { + var display = cm.display, sel = cm.doc.sel; + if (eventInWidget(display, e)) return; + + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || opera) return; // Opera is difficult. + if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to)) + operation(cm, setSelection)(cm.doc, pos, pos); + + var oldCSS = display.input.style.cssText; + display.inputDiv.style.position = "absolute"; + display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) + + "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; outline: none;" + + "border-width: 0; outline: none; overflow: hidden; opacity: .05; -ms-opacity: .05; filter: alpha(opacity=5);"; + focusInput(cm); + resetInput(cm, true); + // Adds "Select all" to context menu in FF + if (posEq(sel.from, sel.to)) display.input.value = display.prevInput = " "; + + function rehide() { + display.inputDiv.style.position = "relative"; + display.input.style.cssText = oldCSS; + if (ie_lt9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos; + slowPoll(cm); + + // Try to detect the user choosing select-all + if (display.input.selectionStart != null && (!ie || ie_lt9)) { + clearTimeout(detectingSelectAll); + var extval = display.input.value = " " + (posEq(sel.from, sel.to) ? "" : display.input.value), i = 0; + display.prevInput = " "; + display.input.selectionStart = 1; display.input.selectionEnd = extval.length; + var poll = function(){ + if (display.prevInput == " " && display.input.selectionStart == 0) + operation(cm, commands.selectAll)(cm); + else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500); + else resetInput(cm); + }; + detectingSelectAll = setTimeout(poll, 200); + } + } + + if (captureMiddleClick) { + e_stop(e); + var mouseup = function() { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + } + + // UPDATING + + function changeEnd(change) { + if (!change.text) return change.to; + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); + } + + // Make sure a position will be valid after the given change. + function clipPostChange(doc, change, pos) { + if (!posLess(change.from, pos)) return clipPos(doc, pos); + var diff = (change.text.length - 1) - (change.to.line - change.from.line); + if (pos.line > change.to.line + diff) { + var preLine = pos.line - diff, lastLine = doc.first + doc.size - 1; + if (preLine > lastLine) return Pos(lastLine, getLine(doc, lastLine).text.length); + return clipToLen(pos, getLine(doc, preLine).text.length); + } + if (pos.line == change.to.line + diff) + return clipToLen(pos, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0) + + getLine(doc, change.to.line).text.length - change.to.ch); + var inside = pos.line - change.from.line; + return clipToLen(pos, change.text[inside].length + (inside ? 0 : change.from.ch)); + } + + // Hint can be null|"end"|"start"|"around"|{anchor,head} + function computeSelAfterChange(doc, change, hint) { + if (hint && typeof hint == "object") // Assumed to be {anchor, head} object + return {anchor: clipPostChange(doc, change, hint.anchor), + head: clipPostChange(doc, change, hint.head)}; + + if (hint == "start") return {anchor: change.from, head: change.from}; + + var end = changeEnd(change); + if (hint == "around") return {anchor: change.from, head: end}; + if (hint == "end") return {anchor: end, head: end}; + + // hint is null, leave the selection alone as much as possible + var adjustPos = function(pos) { + if (posLess(pos, change.from)) return pos; + if (!posLess(change.to, pos)) return end; + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) ch += end.ch - change.to.ch; + return Pos(line, ch); + }; + return {anchor: adjustPos(doc.sel.anchor), head: adjustPos(doc.sel.head)}; + } + + function filterChange(doc, change) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + update: function(from, to, text, origin) { + if (from) this.from = clipPos(doc, from); + if (to) this.to = clipPos(doc, to); + if (text) this.text = text; + if (origin !== undefined) this.origin = origin; + }, + cancel: function() { this.canceled = true; } + }; + signal(doc, "beforeChange", doc, obj); + if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj); + + if (obj.canceled) return null; + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}; + } + + // Replace the range from from to to by the strings in replacement. + // change is a {from, to, text [, origin]} object + function makeChange(doc, change, selUpdate, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, selUpdate, ignoreReadOnly); + if (doc.cm.state.suppressEdits) return; + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change); + if (!change) return; + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 1; --i) + makeChangeNoReadonly(doc, {from: split[i].from, to: split[i].to, text: [""]}); + if (split.length) + makeChangeNoReadonly(doc, {from: split[0].from, to: split[0].to, text: change.text}, selUpdate); + } else { + makeChangeNoReadonly(doc, change, selUpdate); + } + } + + function makeChangeNoReadonly(doc, change, selUpdate) { + var selAfter = computeSelAfterChange(doc, change, selUpdate); + addToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function(doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + function makeChangeFromHistory(doc, type) { + if (doc.cm && doc.cm.state.suppressEdits) return; + + var hist = doc.history; + var event = (type == "undo" ? hist.done : hist.undone).pop(); + if (!event) return; + hist.dirtyCounter += type == "undo" ? -1 : 1; + + var anti = {changes: [], anchorBefore: event.anchorAfter, headBefore: event.headAfter, + anchorAfter: event.anchorBefore, headAfter: event.headBefore}; + (type == "undo" ? hist.undone : hist.done).push(anti); + + for (var i = event.changes.length - 1; i >= 0; --i) { + var change = event.changes[i]; + change.origin = type; + anti.changes.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change, null) + : {anchor: event.anchorBefore, head: event.headBefore}; + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + var rebased = []; + + linkedDocs(doc, function(doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + } + } + + function shiftDoc(doc, distance) { + function shiftPos(pos) {return Pos(pos.line + distance, pos.ch);} + doc.first += distance; + if (doc.cm) regChange(doc.cm, doc.first, doc.first, distance); + doc.sel.head = shiftPos(doc.sel.head); doc.sel.anchor = shiftPos(doc.sel.anchor); + doc.sel.from = shiftPos(doc.sel.from); doc.sel.to = shiftPos(doc.sel.to); + } + + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return; + } + if (change.from.line > doc.lastLine()) return; + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) selAfter = computeSelAfterChange(doc, change, null); + if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans, selAfter); + else updateDoc(doc, change, spans, selAfter); + } + + function makeChangeSingleDocInEditor(cm, change, spans, selAfter) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(doc, getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function(line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true; + } + }); + } + + updateDoc(doc, change, spans, selAfter, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function(line) { + var len = lineLength(doc, line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) cm.curOp.updateMaxLine = true; + } + + // Adjust frontier, schedule worker + doc.frontier = Math.min(doc.frontier, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + regChange(cm, from.line, to.line + 1, lendiff); + + if (hasHandler(cm, "change")) { + var changeObj = {from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin}; + if (cm.curOp.textChanged) { + for (var cur = cm.curOp.textChanged; cur.next; cur = cur.next) {} + cur.next = changeObj; + } else cm.curOp.textChanged = changeObj; + } + } + + function replaceRange(doc, code, from, to, origin) { + if (!to) to = from; + if (posLess(to, from)) { var tmp = to; to = from; from = tmp; } + if (typeof code == "string") code = splitLines(code); + makeChange(doc, {from: from, to: to, text: code, origin: origin}, null); + } + + // POSITION OBJECT + + function Pos(line, ch) { + if (!(this instanceof Pos)) return new Pos(line, ch); + this.line = line; this.ch = ch; + } + CodeMirror.Pos = Pos; + + function posEq(a, b) {return a.line == b.line && a.ch == b.ch;} + function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);} + function copyPos(x) {return Pos(x.line, x.ch);} + + // SELECTION + + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));} + function clipPos(doc, pos) { + if (pos.line < doc.first) return Pos(doc.first, 0); + var last = doc.first + doc.size - 1; + if (pos.line > last) return Pos(last, getLine(doc, last).text.length); + return clipToLen(pos, getLine(doc, pos.line).text.length); + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) return Pos(pos.line, linelen); + else if (ch < 0) return Pos(pos.line, 0); + else return pos; + } + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;} + + // If shift is held, this will move the selection anchor. Otherwise, + // it'll set the whole selection. + function extendSelection(doc, pos, other, bias) { + if (doc.sel.shift || doc.sel.extend) { + var anchor = doc.sel.anchor; + if (other) { + var posBefore = posLess(pos, anchor); + if (posBefore != posLess(other, anchor)) { + anchor = pos; + pos = other; + } else if (posBefore != posLess(pos, other)) { + pos = other; + } + } + setSelection(doc, anchor, pos, bias); + } else { + setSelection(doc, pos, other || pos, bias); + } + if (doc.cm) doc.cm.curOp.userSelChange = true; + } + + function filterSelectionChange(doc, anchor, head) { + var obj = {anchor: anchor, head: head}; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj); + obj.anchor = clipPos(doc, obj.anchor); obj.head = clipPos(doc, obj.head); + return obj; + } + + // Update the selection. Last two args are only used by + // updateDoc, since they have to be expressed in the line + // numbers before the update. + function setSelection(doc, anchor, head, bias, checkAtomic) { + if (!checkAtomic && hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { + var filtered = filterSelectionChange(doc, anchor, head); + head = filtered.head; + anchor = filtered.anchor; + } + + var sel = doc.sel; + sel.goalColumn = null; + // Skip over atomic spans. + if (checkAtomic || !posEq(anchor, sel.anchor)) + anchor = skipAtomic(doc, anchor, bias, checkAtomic != "push"); + if (checkAtomic || !posEq(head, sel.head)) + head = skipAtomic(doc, head, bias, checkAtomic != "push"); + + if (posEq(sel.anchor, anchor) && posEq(sel.head, head)) return; + + sel.anchor = anchor; sel.head = head; + var inv = posLess(head, anchor); + sel.from = inv ? head : anchor; + sel.to = inv ? anchor : head; + + if (doc.cm) + doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true; + + signalLater(doc, "cursorActivity", doc); + } + + function reCheckSelection(cm) { + setSelection(cm.doc, cm.doc.sel.from, cm.doc.sel.to, null, "push"); + } + + function skipAtomic(doc, pos, bias, mayClear) { + var flipped = false, curPos = pos; + var dir = bias || 1; + doc.cantEdit = false; + search: for (;;) { + var line = getLine(doc, curPos.line); + if (line.markedSpans) { + for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) && + (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) break; + else {--i; continue;} + } + } + if (!m.atomic) continue; + var newPos = m.find()[dir < 0 ? "from" : "to"]; + if (posEq(newPos, curPos)) { + newPos.ch += dir; + if (newPos.ch < 0) { + if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1)); + else newPos = null; + } else if (newPos.ch > line.text.length) { + if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0); + else newPos = null; + } + if (!newPos) { + if (flipped) { + // Driven in a corner -- no valid cursor position found at all + // -- try again *with* clearing, if we didn't already + if (!mayClear) return skipAtomic(doc, pos, bias, true); + // Otherwise, turn off editing until further notice, and return the start of the doc + doc.cantEdit = true; + return Pos(doc.first, 0); + } + flipped = true; newPos = pos; dir = -dir; + } + } + curPos = newPos; + continue search; + } + } + } + return curPos; + } + } + + // SCROLLING + + function scrollCursorIntoView(cm) { + var coords = scrollPosIntoView(cm, cm.doc.sel.head); + if (!cm.state.focused) return; + var display = cm.display, box = getRect(display.sizer), doScroll = null, pTop = paddingTop(cm.display); + if (coords.top + pTop + box.top < 0) doScroll = true; + else if (coords.bottom + pTop + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false; + if (doScroll != null && !phantom) { + var hidden = display.cursor.style.display == "none"; + if (hidden) { + display.cursor.style.display = ""; + display.cursor.style.left = coords.left + "px"; + display.cursor.style.top = (coords.top - display.viewOffset) + "px"; + } + display.cursor.scrollIntoView(doScroll); + if (hidden) display.cursor.style.display = "none"; + } + } + + function scrollPosIntoView(cm, pos, margin) { + if (margin == null) margin = 0; + for (;;) { + var changed = false, coords = cursorCoords(cm, pos); + var scrollPos = calculateScrollPos(cm, coords.left, coords.top - margin, coords.left, coords.bottom + margin); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + setScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true; + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true; + } + if (!changed) return coords; + } + } + + function scrollIntoView(cm, x1, y1, x2, y2) { + var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2); + if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop); + if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft); + } + + function calculateScrollPos(cm, x1, y1, x2, y2) { + var display = cm.display, pt = paddingTop(display); + y1 += pt; y2 += pt; + var screen = display.scroller.clientHeight - scrollerCutOff, screentop = display.scroller.scrollTop, result = {}; + var docBottom = cm.doc.height + paddingVert(display); + var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10; + if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1); + else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen; + + var screenw = display.scroller.clientWidth - scrollerCutOff, screenleft = display.scroller.scrollLeft; + x1 += display.gutters.offsetWidth; x2 += display.gutters.offsetWidth; + var gutterw = display.gutters.offsetWidth; + var atLeft = x1 < gutterw + 10; + if (x1 < screenleft + gutterw || atLeft) { + if (atLeft) x1 = 0; + result.scrollLeft = Math.max(0, x1 - 10 - gutterw); + } else if (x2 > screenw + screenleft - 3) { + result.scrollLeft = x2 + 10 - screenw; + } + return result; + } + + function updateScrollPos(cm, left, top) { + cm.curOp.updateScrollPos = {scrollLeft: left, scrollTop: top}; + } + + function addToScrollPos(cm, left, top) { + var pos = cm.curOp.updateScrollPos || (cm.curOp.updateScrollPos = {scrollLeft: cm.doc.scrollLeft, scrollTop: cm.doc.scrollTop}); + var scroll = cm.display.scroller; + pos.scrollTop = Math.max(0, Math.min(scroll.scrollHeight - scroll.clientHeight, pos.scrollTop + top)); + pos.scrollLeft = Math.max(0, Math.min(scroll.scrollWidth - scroll.clientWidth, pos.scrollLeft + left)); + } + + // API UTILITIES + + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc; + if (!how) how = "add"; + if (how == "smart") { + if (!cm.doc.mode.indent) how = "prev"; + else var state = getStateBefore(cm, n); + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (how == "smart") { + indentation = cm.doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass) { + if (!aggressive) return; + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize); + else indentation = 0; + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} + if (pos < indentation) indentString += spaceStr(indentation - pos); + + if (indentString != curSpaceString) + replaceRange(cm.doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + } + + function changeLine(cm, handle, op) { + var no = handle, line = handle, doc = cm.doc; + if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle)); + else no = lineNo(handle); + if (no == null) return null; + if (op(line, no)) regChange(cm, no, no + 1); + else return null; + return line; + } + + function findPosH(doc, pos, dir, unit, visually) { + var line = pos.line, ch = pos.ch; + var lineObj = getLine(doc, line); + var possible = true; + function findNextLine() { + var l = line + dir; + if (l < doc.first || l >= doc.first + doc.size) return (possible = false); + line = l; + return lineObj = getLine(doc, l); + } + function moveOnce(boundToLine) { + var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true); + if (next == null) { + if (!boundToLine && findNextLine()) { + if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj); + else ch = dir < 0 ? lineObj.text.length : 0; + } else return (possible = false); + } else ch = next; + return true; + } + + if (unit == "char") moveOnce(); + else if (unit == "column") moveOnce(true); + else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) break; + var cur = lineObj.text.charAt(ch) || "\n"; + var type = isWordChar(cur) ? "w" + : !group ? null + : /\s/.test(cur) ? null + : "p"; + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce();} + break; + } + if (type) sawType = type; + if (dir > 0 && !moveOnce(!first)) break; + } + } + var result = skipAtomic(doc, Pos(line, ch), dir, true); + if (!possible) result.hitSide = true; + return result; + } + + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display)); + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + for (;;) { + var target = coordsChar(cm, x, y); + if (!target.outside) break; + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; } + y += dir * 5; + } + return target; + } + + function findWordAt(line, pos) { + var start = pos.ch, end = pos.ch; + if (line) { + if (pos.after === false || end == line.length) --start; else ++end; + var startChar = line.charAt(start); + var check = isWordChar(startChar) ? isWordChar + : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} + : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);}; + while (start > 0 && check(line.charAt(start - 1))) --start; + while (end < line.length && check(line.charAt(end))) ++end; + } + return {from: Pos(pos.line, start), to: Pos(pos.line, end)}; + } + + function selectLine(cm, line) { + extendSelection(cm.doc, Pos(line, 0), clipPos(cm.doc, Pos(line + 1, 0))); + } + + // PROTOTYPE + + // The publicly visible API. Note that operation(null, f) means + // 'wrap f in an operation, performed on its `this` parameter' + + CodeMirror.prototype = { + focus: function(){window.focus(); focusInput(this); onFocus(this); fastPoll(this);}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") return; + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + operation(this, optionHandlers[option])(this, value, old); + }, + + getOption: function(option) {return this.options[option];}, + getDoc: function() {return this.doc;}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](map); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + if ((typeof map == "string" ? maps[i].name : maps[i]) == map) { + maps.splice(i, 1); + return true; + } + }, + + addOverlay: operation(null, function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) throw new Error("Overlays may not be stateful."); + this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque}); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: operation(null, function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + if (overlays[i].modeSpec == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return; + } + } + }), + + indentLine: operation(null, function(n, dir, aggressive) { + if (typeof dir != "string") { + if (dir == null) dir = this.options.smartIndent ? "smart" : "prev"; + else dir = dir ? "add" : "subtract"; + } + if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive); + }), + indentSelection: operation(null, function(how) { + var sel = this.doc.sel; + if (posEq(sel.from, sel.to)) return indentLine(this, sel.from.line, how); + var e = sel.to.line - (sel.to.ch ? 0 : 1); + for (var i = sel.from.line; i <= e; ++i) indentLine(this, i, how); + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos) { + var doc = this.doc; + pos = clipPos(doc, pos); + var state = getStateBefore(this, pos.line), mode = this.doc.mode; + var line = getLine(doc, pos.line); + var stream = new StringStream(line.text, this.options.tabSize); + while (stream.pos < pos.ch && !stream.eol()) { + stream.start = stream.pos; + var style = mode.token(stream, state); + } + return {start: stream.start, + end: stream.pos, + string: stream.current(), + className: style || null, // Deprecated, use 'type' instead + type: style || null, + state: state}; + }, + + getStateAfter: function(line) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getStateBefore(this, line + 1); + }, + + cursorCoords: function(start, mode) { + var pos, sel = this.doc.sel; + if (start == null) pos = sel.head; + else if (typeof start == "object") pos = clipPos(this.doc, start); + else pos = start ? sel.from : sel.to; + return cursorCoords(this, pos, mode || "page"); + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page"); + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top); + }, + + defaultTextHeight: function() { return textHeight(this.display); }, + defaultCharWidth: function() { return charWidth(this.display); }, + + setGutterMarker: operation(null, function(line, gutterID, value) { + return changeLine(this, line, function(line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) line.gutterMarkers = null; + return true; + }); + }), + + clearGutter: operation(null, function(gutterID) { + var cm = this, doc = cm.doc, i = doc.first; + doc.iter(function(line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + line.gutterMarkers[gutterID] = null; + regChange(cm, i, i + 1); + if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null; + } + ++i; + }); + }), + + addLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + if (!line[prop]) line[prop] = cls; + else if (new RegExp("\\b" + cls + "\\b").test(line[prop])) return false; + else line[prop] += " " + cls; + return true; + }); + }), + + removeLineClass: operation(null, function(handle, where, cls) { + return changeLine(this, handle, function(line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) return false; + else if (cls == null) line[prop] = null; + else { + var upd = cur.replace(new RegExp("^" + cls + "\\b\\s*|\\s*\\b" + cls + "\\b"), ""); + if (upd == cur) return false; + line[prop] = upd || null; + } + return true; + }); + }), + + addLineWidget: operation(null, function(handle, node, options) { + return addLineWidget(this, handle, node, options); + }), + + removeLineWidget: function(widget) { widget.clear(); }, + + lineInfo: function(line) { + if (typeof line == "number") { + if (!isLine(this.doc, line)) return null; + var n = line; + line = getLine(this.doc, line); + if (!line) return null; + } else { + var n = lineNo(line); + if (n == null) return null; + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets}; + }, + + getViewport: function() { return {from: this.display.showingFrom, to: this.display.showingTo};}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + top = pos.top - node.offsetHeight; + else if (pos.bottom + node.offsetHeight <= vspace) + top = pos.bottom; + if (left + node.offsetWidth > hspace) + left = hspace - node.offsetWidth; + } + node.style.top = (top + paddingTop(display)) + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") left = 0; + else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2; + node.style.left = left + "px"; + } + if (scroll) + scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight); + }, + + triggerOnKeyDown: operation(null, onKeyDown), + + execCommand: function(cmd) {return commands[cmd](this);}, + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) break; + } + return cur; + }, + + moveH: operation(null, function(dir, unit) { + var sel = this.doc.sel, pos; + if (sel.shift || sel.extend || posEq(sel.from, sel.to)) + pos = findPosH(this.doc, sel.head, dir, unit, this.options.rtlMoveVisually); + else + pos = dir < 0 ? sel.from : sel.to; + extendSelection(this.doc, pos, pos, dir); + }), + + deleteH: operation(null, function(dir, unit) { + var sel = this.doc.sel; + if (!posEq(sel.from, sel.to)) replaceRange(this.doc, "", sel.from, sel.to, "+delete"); + else replaceRange(this.doc, "", sel.from, findPosH(this.doc, sel.head, dir, unit, false), "+delete"); + this.curOp.userSelChange = true; + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) x = coords.left; + else coords.left = x; + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) break; + } + return cur; + }, + + moveV: operation(null, function(dir, unit) { + var sel = this.doc.sel; + var pos = cursorCoords(this, sel.head, "div"); + if (sel.goalColumn != null) pos.left = sel.goalColumn; + var target = findPosV(this, pos, dir, unit); + + if (unit == "page") addToScrollPos(this, 0, charCoords(this, target, "div").top - pos.top); + extendSelection(this.doc, target, target, dir); + sel.goalColumn = pos.left; + }), + + toggleOverwrite: function() { + if (this.state.overwrite = !this.state.overwrite) + this.display.cursor.className += " CodeMirror-overwrite"; + else + this.display.cursor.className = this.display.cursor.className.replace(" CodeMirror-overwrite", ""); + }, + hasFocus: function() { return this.state.focused; }, + + scrollTo: operation(null, function(x, y) { + updateScrollPos(this, x, y); + }), + getScrollInfo: function() { + var scroller = this.display.scroller, co = scrollerCutOff; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - co, width: scroller.scrollWidth - co, + clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co}; + }, + + scrollIntoView: function(pos, margin) { + if (typeof pos == "number") pos = Pos(pos, 0); + if (!pos || pos.line != null) { + pos = pos ? clipPos(this.doc, pos) : this.doc.sel.head; + scrollPosIntoView(this, pos, margin); + } else { + scrollIntoView(this, pos.left, pos.top - margin, pos.right, pos.bottom + margin); + } + }, + + setSize: function(width, height) { + function interpret(val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + } + if (width != null) this.display.wrapper.style.width = interpret(width); + if (height != null) this.display.wrapper.style.height = interpret(height); + this.refresh(); + }, + + on: function(type, f) {on(this, type, f);}, + off: function(type, f) {off(this, type, f);}, + + operation: function(f){return runInOp(this, f);}, + + refresh: operation(null, function() { + clearCaches(this); + updateScrollPos(this, this.doc.scrollLeft, this.doc.scrollTop); + regChange(this); + }), + + swapDoc: operation(null, function(doc) { + var old = this.doc; + old.cm = null; + attachDoc(this, doc); + clearCaches(this); + updateScrollPos(this, doc.scrollLeft, doc.scrollTop); + return old; + }), + + getInputField: function(){return this.display.input;}, + getWrapperElement: function(){return this.display.wrapper;}, + getScrollerElement: function(){return this.display.scroller;}, + getGutterElement: function(){return this.display.gutters;} + }; + + // OPTION DEFAULTS + + var optionHandlers = CodeMirror.optionHandlers = {}; + + // The default configuration options. + var defaults = CodeMirror.defaults = {}; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) optionHandlers[name] = + notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle; + } + + var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}}; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function(cm, val) { + cm.setValue(val); + }, true); + option("mode", null, function(cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function(cm) { + loadMode(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("electricChars", true); + option("rtlMoveVisually", !windows); + + option("theme", "default", function(cm) { + themeChanged(cm); + guttersChanged(cm); + }, true); + option("keyMap", "default", keyMapChanged); + option("extraKeys", null); + + option("onKeyEvent", null); + option("onDragEvent", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("fixedGutter", true, function(cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("lineNumbers", false, function(cm) { + setGuttersForLineNumbers(cm.options); + guttersChanged(cm); + }, true); + option("firstLineNumber", 1, guttersChanged, true); + option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("readOnly", false, function(cm, val) { + if (val == "nocursor") {onBlur(cm); cm.display.input.blur();} + else if (!val) resetInput(cm, true); + }); + option("dragDrop", true); + + option("cursorBlinkRate", 530); + option("cursorHeight", 1); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true); + option("pollInterval", 100); + option("undoDepth", 40, function(cm, val){cm.doc.history.undoDepth = val;}); + option("viewportMargin", 10, function(cm){cm.refresh();}, true); + + option("tabindex", null, function(cm, val) { + cm.display.input.tabIndex = val || ""; + }); + option("autofocus", null); + + // MODE DEFINITION AND QUERYING + + // Known modes, by name and by MIME + var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {}; + + CodeMirror.defineMode = function(name, mode) { + if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name; + if (arguments.length > 2) { + mode.dependencies = []; + for (var i = 2; i < arguments.length; ++i) mode.dependencies.push(arguments[i]); + } + modes[name] = mode; + }; + + CodeMirror.defineMIME = function(mime, spec) { + mimeModes[mime] = spec; + }; + + CodeMirror.resolveMode = function(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) + spec = mimeModes[spec]; + else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) + return CodeMirror.resolveMode("application/xml"); + if (typeof spec == "string") return {name: spec}; + else return spec || {name: "null"}; + }; + + CodeMirror.getMode = function(options, spec) { + spec = CodeMirror.resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) return CodeMirror.getMode(options, "text/plain"); + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) continue; + if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop]; + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + return modeObj; + }; + + CodeMirror.defineMode("null", function() { + return {token: function(stream) {stream.skipToEnd();}}; + }); + CodeMirror.defineMIME("text/plain", "null"); + + var modeExtensions = CodeMirror.modeExtensions = {}; + CodeMirror.extendMode = function(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + }; + + // EXTENSIONS + + CodeMirror.defineExtension = function(name, func) { + CodeMirror.prototype[name] = func; + }; + + CodeMirror.defineOption = option; + + var initHooks = []; + CodeMirror.defineInitHook = function(f) {initHooks.push(f);}; + + // MODE STATE HANDLING + + // Utility functions for working with state. Exported because modes + // sometimes need to do this. + function copyState(mode, state) { + if (state === true) return state; + if (mode.copyState) return mode.copyState(state); + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) val = val.concat([]); + nstate[n] = val; + } + return nstate; + } + CodeMirror.copyState = copyState; + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + CodeMirror.startState = startState; + + CodeMirror.innerMode = function(mode, state) { + while (mode.innerMode) { + var info = mode.innerMode(state); + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state}; + }; + + // STANDARD COMMANDS + + var commands = CodeMirror.commands = { + selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()));}, + killLine: function(cm) { + var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to); + if (!sel && cm.getLine(from.line).length == from.ch) + cm.replaceRange("", from, Pos(from.line + 1, 0), "+delete"); + else cm.replaceRange("", from, sel ? to : Pos(from.line), "+delete"); + }, + deleteLine: function(cm) { + var l = cm.getCursor().line; + cm.replaceRange("", Pos(l, 0), Pos(l), "+delete"); + }, + undo: function(cm) {cm.undo();}, + redo: function(cm) {cm.redo();}, + goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));}, + goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));}, + goLineStart: function(cm) { + cm.extendSelection(lineStart(cm, cm.getCursor().line)); + }, + goLineStartSmart: function(cm) { + var cur = cm.getCursor(), start = lineStart(cm, cur.line); + var line = cm.getLineHandle(start.line); + var order = getOrder(line); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = cur.line == start.line && cur.ch <= firstNonWS && cur.ch; + cm.extendSelection(Pos(start.line, inWS ? 0 : firstNonWS)); + } else cm.extendSelection(start); + }, + goLineEnd: function(cm) { + cm.extendSelection(lineEnd(cm, cm.getCursor().line)); + }, + goLineRight: function(cm) { + var top = cm.charCoords(cm.getCursor(), "div").top + 5; + cm.extendSelection(cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")); + }, + goLineLeft: function(cm) { + var top = cm.charCoords(cm.getCursor(), "div").top + 5; + cm.extendSelection(cm.coordsChar({left: 0, top: top}, "div")); + }, + goLineUp: function(cm) {cm.moveV(-1, "line");}, + goLineDown: function(cm) {cm.moveV(1, "line");}, + goPageUp: function(cm) {cm.moveV(-1, "page");}, + goPageDown: function(cm) {cm.moveV(1, "page");}, + goCharLeft: function(cm) {cm.moveH(-1, "char");}, + goCharRight: function(cm) {cm.moveH(1, "char");}, + goColumnLeft: function(cm) {cm.moveH(-1, "column");}, + goColumnRight: function(cm) {cm.moveH(1, "column");}, + goWordLeft: function(cm) {cm.moveH(-1, "word");}, + goGroupRight: function(cm) {cm.moveH(1, "group");}, + goGroupLeft: function(cm) {cm.moveH(-1, "group");}, + goWordRight: function(cm) {cm.moveH(1, "word");}, + delCharBefore: function(cm) {cm.deleteH(-1, "char");}, + delCharAfter: function(cm) {cm.deleteH(1, "char");}, + delWordBefore: function(cm) {cm.deleteH(-1, "word");}, + delWordAfter: function(cm) {cm.deleteH(1, "word");}, + delGroupBefore: function(cm) {cm.deleteH(-1, "group");}, + delGroupAfter: function(cm) {cm.deleteH(1, "group");}, + indentAuto: function(cm) {cm.indentSelection("smart");}, + indentMore: function(cm) {cm.indentSelection("add");}, + indentLess: function(cm) {cm.indentSelection("subtract");}, + insertTab: function(cm) {cm.replaceSelection("\t", "end", "+input");}, + defaultTab: function(cm) { + if (cm.somethingSelected()) cm.indentSelection("add"); + else cm.replaceSelection("\t", "end", "+input"); + }, + transposeChars: function(cm) { + var cur = cm.getCursor(), line = cm.getLine(cur.line); + if (cur.ch > 0 && cur.ch < line.length - 1) + cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1), + Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); + }, + newlineAndIndent: function(cm) { + operation(cm, function() { + cm.replaceSelection("\n", "end", "+input"); + cm.indentLine(cm.getCursor().line, null, true); + })(); + }, + toggleOverwrite: function(cm) {cm.toggleOverwrite();} + }; + + // STANDARD KEYMAPS + + var keyMap = CodeMirror.keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite" + }; + // Note that the save and find-related commands aren't defined by + // default. Unknown commands are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + fallthrough: "basic" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", + fallthrough: ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" + }; + + // KEYMAP DISPATCH + + function getKeyMap(val) { + if (typeof val == "string") return keyMap[val]; + else return val; + } + + function lookupKey(name, maps, handle) { + function lookup(map) { + map = getKeyMap(map); + var found = map[name]; + if (found === false) return "stop"; + if (found != null && handle(found)) return true; + if (map.nofallthrough) return "stop"; + + var fallthrough = map.fallthrough; + if (fallthrough == null) return false; + if (Object.prototype.toString.call(fallthrough) != "[object Array]") + return lookup(fallthrough); + for (var i = 0, e = fallthrough.length; i < e; ++i) { + var done = lookup(fallthrough[i]); + if (done) return done; + } + return false; + } + + for (var i = 0; i < maps.length; ++i) { + var done = lookup(maps[i]); + if (done) return done; + } + } + function isModifierKey(event) { + var name = keyNames[event.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + function keyName(event, noShift) { + if (opera && event.keyCode == 34 && event["char"]) return false; + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) return false; + if (event.altKey) name = "Alt-" + name; + if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name; + if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name; + if (!noShift && event.shiftKey) name = "Shift-" + name; + return name; + } + CodeMirror.lookupKey = lookupKey; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.keyName = keyName; + + // FROMTEXTAREA + + CodeMirror.fromTextArea = function(textarea, options) { + if (!options) options = {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabindex) + options.tabindex = textarea.tabindex; + if (!options.placeholder && textarea.placeholder) + options.placeholder = textarea.placeholder; + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = document.body; + // doc.activeElement occasionally throws on IE + try { hasFocus = document.activeElement; } catch(e) {} + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form, realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function() { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + textarea.style.display = "none"; + var cm = CodeMirror(function(node) { + textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, options); + cm.save = save; + cm.getTextArea = function() { return textarea; }; + cm.toTextArea = function() { + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + textarea.form.submit = realSubmit; + } + }; + return cm; + }; + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + // The character stream used by a mode's parser. + function StringStream(string, tabSize) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + } + + StringStream.prototype = { + eol: function() {return this.pos >= this.string.length;}, + sol: function() {return this.pos == 0;}, + peek: function() {return this.string.charAt(this.pos) || undefined;}, + next: function() { + if (this.pos < this.string.length) + return this.string.charAt(this.pos++); + }, + eat: function(match) { + var ch = this.string.charAt(this.pos); + if (typeof match == "string") var ok = ch == match; + else var ok = ch && (match.test ? match.test(ch) : match(ch)); + if (ok) {++this.pos; return ch;} + }, + eatWhile: function(match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start; + }, + eatSpace: function() { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos; + return this.pos > start; + }, + skipToEnd: function() {this.pos = this.string.length;}, + skipTo: function(ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true;} + }, + backUp: function(n) {this.pos -= n;}, + column: function() { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue; + }, + indentation: function() {return countColumn(this.string, null, this.tabSize);}, + match: function(pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;}; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) this.pos += pattern.length; + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) return null; + if (match && consume !== false) this.pos += match[0].length; + return match; + } + }, + current: function(){return this.string.slice(this.start, this.pos);} + }; + CodeMirror.StringStream = StringStream; + + // TEXTMARKERS + + function TextMarker(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + } + CodeMirror.TextMarker = TextMarker; + + TextMarker.prototype.clear = function() { + if (this.explicitlyCleared) return; + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) startOperation(cm); + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.to != null) max = lineNo(line); + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from != null) + min = lineNo(line); + else if (this.collapsed && !lineIsHidden(this.doc, line) && cm) + updateLineHeight(line, textHeight(cm.display)); + } + if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) { + var visual = visualLine(cm.doc, this.lines[i]), len = lineLength(cm.doc, visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } + + if (min != null && cm) regChange(cm, min, max + 1); + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.collapsed && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) reCheckSelection(cm); + } + if (withOp) endOperation(cm); + signalLater(this, "clear"); + }; + + TextMarker.prototype.find = function() { + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null || span.to != null) { + var found = lineNo(line); + if (span.from != null) from = Pos(found, span.from); + if (span.to != null) to = Pos(found, span.to); + } + } + if (this.type == "bookmark") return from; + return from && {from: from, to: to}; + }; + + TextMarker.prototype.getOptions = function(copyWidget) { + var repl = this.replacedWith; + return {className: this.className, + inclusiveLeft: this.inclusiveLeft, inclusiveRight: this.inclusiveRight, + atomic: this.atomic, + collapsed: this.collapsed, + replacedWith: copyWidget ? repl && repl.cloneNode(true) : repl, + readOnly: this.readOnly, + startStyle: this.startStyle, endStyle: this.endStyle}; + }; + + TextMarker.prototype.attachLine = function(line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); + } + this.lines.push(line); + }; + TextMarker.prototype.detachLine = function(line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + + function markText(doc, from, to, options, type) { + if (options && options.shared) return markTextShared(doc, from, to, options, type); + if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type); + + var marker = new TextMarker(doc, type); + if (type == "range" && !posLess(from, to)) return marker; + if (options) copyObj(options, marker); + if (marker.replacedWith) { + marker.collapsed = true; + marker.replacedWith = elt("span", [marker.replacedWith], "CodeMirror-widget"); + } + if (marker.collapsed) sawCollapsedSpans = true; + + if (marker.addToHistory) + addToHistory(doc, {from: from, to: to, origin: "markText"}, + {head: doc.sel.head, anchor: doc.sel.anchor}, NaN); + + var curLine = from.line, size = 0, collapsedAtStart, collapsedAtEnd, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function(line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(doc, line) == cm.display.maxLine) + updateMaxLine = true; + var span = {from: null, to: null, marker: marker}; + size += line.text.length; + if (curLine == from.line) {span.from = from.ch; size -= from.ch;} + if (curLine == to.line) {span.to = to.ch; size -= line.text.length - to.ch;} + if (marker.collapsed) { + if (curLine == to.line) collapsedAtEnd = collapsedSpanAt(line, to.ch); + if (curLine == from.line) collapsedAtStart = collapsedSpanAt(line, from.ch); + else updateLineHeight(line, 0); + } + addMarkedSpan(line, span); + ++curLine; + }); + if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) { + if (lineIsHidden(doc, line)) updateLineHeight(line, 0); + }); + + if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); }); + + if (marker.readOnly) { + sawReadOnlySpans = true; + if (doc.history.done.length || doc.history.undone.length) + doc.clearHistory(); + } + if (marker.collapsed) { + if (collapsedAtStart != collapsedAtEnd) + throw new Error("Inserting collapsed marker overlapping an existing one"); + marker.size = size; + marker.atomic = true; + } + if (cm) { + if (updateMaxLine) cm.curOp.updateMaxLine = true; + if (marker.className || marker.startStyle || marker.endStyle || marker.collapsed) + regChange(cm, from.line, to.line + 1); + if (marker.atomic) reCheckSelection(cm); + } + return marker; + } + + // SHARED TEXTMARKERS + + function SharedTextMarker(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0, me = this; i < markers.length; ++i) { + markers[i].parent = this; + on(markers[i], "clear", function(){me.clear();}); + } + } + CodeMirror.SharedTextMarker = SharedTextMarker; + + SharedTextMarker.prototype.clear = function() { + if (this.explicitlyCleared) return; + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + this.markers[i].clear(); + signalLater(this, "clear"); + }; + SharedTextMarker.prototype.find = function() { + return this.primary.find(); + }; + SharedTextMarker.prototype.getOptions = function(copyWidget) { + var inner = this.primary.getOptions(copyWidget); + inner.shared = true; + return inner; + }; + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.replacedWith; + linkedDocs(doc, function(doc) { + if (widget) options.replacedWith = widget.cloneNode(true); + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + if (doc.linked[i].isParent) return; + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary); + } + + // TEXTMARKER SPANS + + function getMarkedSpanFor(spans, marker) { + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) return span; + } + } + function removeMarkedSpan(spans, span) { + for (var r, i = 0; i < spans.length; ++i) + if (spans[i] != span) (r || (r = [])).push(spans[i]); + return r; + } + function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.attachLine(line); + } + + function markedSpansBefore(old, startCh, isInsert) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || marker.type == "bookmark" && span.from == startCh && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push({from: span.from, + to: endsAfter ? null : span.to, + marker: marker}); + } + } + return nw; + } + + function markedSpansAfter(old, endCh, isInsert) { + if (old) for (var i = 0, nw; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || marker.type == "bookmark" && span.from == endCh && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh, + to: span.to == null ? null : span.to - endCh, + marker: marker}); + } + } + return nw; + } + + function stretchSpansOverChange(doc, change) { + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) return null; + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = posEq(change.from, change.to); + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) span.to = startCh; + else if (sameLine) span.to = found.to == null ? null : found.to + offset; + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i = 0; i < last.length; ++i) { + var span = last[i]; + if (span.to != null) span.to += offset; + if (span.from == null) { + var found = getMarkedSpanFor(first, span.marker); + if (!found) { + span.from = offset; + if (sameLine) (first || (first = [])).push(span); + } + } else { + span.from += offset; + if (sameLine) (first || (first = [])).push(span); + } + } + } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + for (var i = 0; i < first.length; ++i) + if (first[i].to == null) + (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker}); + for (var i = 0; i < gap; ++i) + newMarkers.push(gapMarkers); + newMarkers.push(last); + } + return newMarkers; + } + + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) return stretched; + if (!stretched) return old; + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + if (oldCur[k].marker == span.marker) continue spans; + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old; + } + + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function(line) { + if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + (markers || (markers = [])).push(mark); + } + }); + if (!markers) return null; + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (posLess(p.to, m.from) || posLess(m.to, p.from)) continue; + var newParts = [j, 1]; + if (posLess(p.from, m.from) || !mk.inclusiveLeft && posEq(p.from, m.from)) + newParts.push({from: p.from, to: m.from}); + if (posLess(m.to, p.to) || !mk.inclusiveRight && posEq(p.to, m.to)) + newParts.push({from: m.to, to: p.to}); + parts.splice.apply(parts, newParts); + j += newParts.length - 1; + } + } + return parts; + } + + function collapsedSpanAt(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if ((sp.from == null || sp.from < ch) && + (sp.to == null || sp.to > ch) && + (!found || found.width < sp.marker.width)) + found = sp.marker; + } + return found; + } + function collapsedSpanAtStart(line) { return collapsedSpanAt(line, -1); } + function collapsedSpanAtEnd(line) { return collapsedSpanAt(line, line.text.length + 1); } + + function visualLine(doc, line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + line = getLine(doc, merged.find().from.line); + return line; + } + + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) for (var sp, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) continue; + if (sp.from == null) return true; + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + return true; + } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find().to, endLine = getLine(doc, end.line); + return lineIsHiddenInner(doc, endLine, getMarkedSpanFor(endLine.markedSpans, span.marker)); + } + if (span.marker.inclusiveRight && span.to == line.text.length) + return true; + for (var sp, i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && sp.from == span.to && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) return true; + } + } + + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) return; + for (var i = 0; i < spans.length; ++i) + spans[i].marker.detachLine(line); + line.markedSpans = null; + } + + function attachMarkedSpans(line, spans) { + if (!spans) return; + for (var i = 0; i < spans.length; ++i) + spans[i].marker.attachLine(line); + line.markedSpans = spans; + } + + // LINE WIDGETS + + var LineWidget = CodeMirror.LineWidget = function(cm, node, options) { + for (var opt in options) if (options.hasOwnProperty(opt)) + this[opt] = options[opt]; + this.cm = cm; + this.node = node; + }; + function widgetOperation(f) { + return function() { + var withOp = !this.cm.curOp; + if (withOp) startOperation(this.cm); + try {var result = f.apply(this, arguments);} + finally {if (withOp) endOperation(this.cm);} + return result; + }; + } + LineWidget.prototype.clear = widgetOperation(function() { + var ws = this.line.widgets, no = lineNo(this.line); + if (no == null || !ws) return; + for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1); + if (!ws.length) this.line.widgets = null; + updateLineHeight(this.line, Math.max(0, this.line.height - widgetHeight(this))); + regChange(this.cm, no, no + 1); + }); + LineWidget.prototype.changed = widgetOperation(function() { + var oldH = this.height; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) return; + updateLineHeight(this.line, this.line.height + diff); + var no = lineNo(this.line); + regChange(this.cm, no, no + 1); + }); + + function widgetHeight(widget) { + if (widget.height != null) return widget.height; + if (!widget.node.parentNode || widget.node.parentNode.nodeType != 1) + removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, "position: relative")); + return widget.height = widget.node.offsetHeight; + } + + function addLineWidget(cm, handle, node, options) { + var widget = new LineWidget(cm, node, options); + if (widget.noHScroll) cm.display.alignWidgets = true; + changeLine(cm, handle, function(line) { + (line.widgets || (line.widgets = [])).push(widget); + widget.line = line; + if (!lineIsHidden(cm.doc, line) || widget.showIfHidden) { + var aboveVisible = heightAtLine(cm, line) < cm.display.scroller.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) addToScrollPos(cm, 0, widget.height); + } + return true; + }); + return widget; + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + function makeLine(text, markedSpans, estimateHeight) { + var line = {text: text}; + attachMarkedSpans(line, markedSpans); + line.height = estimateHeight ? estimateHeight(line) : 1; + return line; + } + + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) line.stateAfter = null; + if (line.styles) line.styles = null; + if (line.order != null) line.order = null; + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) updateLineHeight(line, estHeight); + } + + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Run the given mode's parser over a line, update the styles + // array, which contains alternating fragments of text and CSS + // classes. + function runMode(cm, text, mode, state, f) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) flattenSpans = cm.options.flattenSpans; + var curText = "", curStyle = null; + var stream = new StringStream(text, cm.options.tabSize); + if (text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + if (stream.pos > 5000) { + flattenSpans = false; + // Webkit seems to refuse to render text nodes longer than 57444 characters + stream.pos = Math.min(text.length, stream.start + 50000); + style = null; + } + var substr = stream.current(); + stream.start = stream.pos; + if (!flattenSpans || curStyle != style) { + if (curText) f(curText, curStyle); + curText = substr; curStyle = style; + } else curText = curText + substr; + } + if (curText) f(curText, curStyle); + } + + function highlightLine(cm, line, state) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen]; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, state, function(txt, style) {st.push(txt, style);}); + + // Run overlays, adjust style array. + for (var o = 0; o < cm.state.overlays.length; ++o) { + var overlay = cm.state.overlays[o], i = 1; + runMode(cm, line.text, overlay.mode, true, function(txt, style) { + var start = i, len = txt.length; + // Ensure there's a token end at the current position, and that i points at it + while (len) { + var cur = st[i], len_ = cur.length; + if (len_ <= len) { + len -= len_; + } else { + st.splice(i, 1, cur.slice(0, len), st[i+1], cur.slice(len)); + len = 0; + } + i += 2; + } + if (!style) return; + if (overlay.opaque) { + st.splice(start, i - start, txt, style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = cur ? cur + " " + style : style; + } + } + }); + } + + return st; + } + + function getLineStyles(cm, line) { + if (!line.styles || line.styles[0] != cm.state.modeGen) + line.styles = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line))); + return line.styles; + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. + function processLine(cm, line, state) { + var mode = cm.doc.mode; + var stream = new StringStream(line.text, cm.options.tabSize); + if (line.text == "" && mode.blankLine) mode.blankLine(state); + while (!stream.eol() && stream.pos <= 5000) { + mode.token(stream, state); + stream.start = stream.pos; + } + } + + var styleToClassCache = {}; + function styleToClass(style) { + if (!style) return null; + return styleToClassCache[style] || + (styleToClassCache[style] = "cm-" + style.replace(/ +/g, " cm-")); + } + + function lineContent(cm, realLine, measure) { + var merged, line = realLine, lineBefore, sawBefore, simple = true; + while (merged = collapsedSpanAtStart(line)) { + simple = false; + line = getLine(cm.doc, merged.find().from.line); + if (!lineBefore) lineBefore = line; + } + + var builder = {pre: elt("pre"), col: 0, pos: 0, display: !measure, + measure: null, addedOne: false, cm: cm}; + if (line.textClass) builder.pre.className = line.textClass; + + do { + builder.measure = line == realLine && measure; + builder.pos = 0; + builder.addToken = builder.measure ? buildTokenMeasure : buildToken; + if ((ie || webkit) && cm.getOption("lineWrapping")) + builder.addToken = buildTokenSplitSpaces(builder.addToken); + if (measure && sawBefore && line != realLine && !builder.addedOne) { + measure[0] = builder.pre.appendChild(zeroWidthElement(cm.display.measure)); + builder.addedOne = true; + } + var next = insertLineContent(line, builder, getLineStyles(cm, line)); + sawBefore = line == lineBefore; + if (next) { + line = getLine(cm.doc, next.to.line); + simple = false; + } + } while (next); + + if (measure && !builder.addedOne) + measure[0] = builder.pre.appendChild(simple ? elt("span", "\u00a0") : zeroWidthElement(cm.display.measure)); + if (!builder.pre.firstChild && !lineIsHidden(cm.doc, realLine)) + builder.pre.appendChild(document.createTextNode("\u00a0")); + + var order; + // Work around problem with the reported dimensions of single-char + // direction spans on IE (issue #1129). See also the comment in + // cursorCoords. + if (measure && ie && (order = getOrder(line))) { + var l = order.length - 1; + if (order[l].from == order[l].to) --l; + var last = order[l], prev = order[l - 1]; + if (last.from + 1 == last.to && prev && last.level < prev.level) { + var span = measure[builder.pos - 1]; + if (span) span.parentNode.insertBefore(span.measureRight = zeroWidthElement(cm.display.measure), + span.nextSibling); + } + } + + signal(cm, "renderLine", cm, realLine, builder.pre); + return builder.pre; + } + + var tokenSpecialChars = /[\t\u0000-\u0019\u00ad\u200b\u2028\u2029\uFEFF]/g; + function buildToken(builder, text, style, startStyle, endStyle) { + if (!text) return; + if (!tokenSpecialChars.test(text)) { + builder.col += text.length; + var content = document.createTextNode(text); + } else { + var content = document.createDocumentFragment(), pos = 0; + while (true) { + tokenSpecialChars.lastIndex = pos; + var m = tokenSpecialChars.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + content.appendChild(document.createTextNode(text.slice(pos, pos + skipped))); + builder.col += skipped; + } + if (!m) break; + pos += skipped + 1; + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + builder.col += tabWidth; + } else { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + m[0].charCodeAt(0).toString(16); + content.appendChild(token); + builder.col += 1; + } + } + } + if (style || startStyle || endStyle || builder.measure) { + var fullStyle = style || ""; + if (startStyle) fullStyle += startStyle; + if (endStyle) fullStyle += endStyle; + return builder.pre.appendChild(elt("span", [content], fullStyle)); + } + builder.pre.appendChild(content); + } + + function buildTokenMeasure(builder, text, style, startStyle, endStyle) { + var wrapping = builder.cm.options.lineWrapping; + for (var i = 0; i < text.length; ++i) { + var ch = text.charAt(i), start = i == 0; + if (ch >= "\ud800" && ch < "\udbff" && i < text.length - 1) { + ch = text.slice(i, i + 2); + ++i; + } else if (i && wrapping && + spanAffectsWrapping.test(text.slice(i - 1, i + 1))) { + builder.pre.appendChild(elt("wbr")); + } + var span = builder.measure[builder.pos] = + buildToken(builder, ch, style, + start && startStyle, i == text.length - 1 && endStyle); + // In IE single-space nodes wrap differently than spaces + // embedded in larger text nodes, except when set to + // white-space: normal (issue #1268). + if (ie && wrapping && ch == " " && i && !/\s/.test(text.charAt(i - 1)) && + i < text.length - 1 && !/\s/.test(text.charAt(i + 1))) + span.style.whiteSpace = "normal"; + builder.pos += ch.length; + } + if (text.length) builder.addedOne = true; + } + + function buildTokenSplitSpaces(inner) { + function split(old) { + var out = " "; + for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0"; + out += " "; + return out; + } + return function(builder, text, style, startStyle, endStyle) { + return inner(builder, text.replace(/ {3,}/, split), style, startStyle, endStyle); + }; + } + + function buildCollapsedSpan(builder, size, widget) { + if (widget) { + if (!builder.display) widget = widget.cloneNode(true); + builder.pre.appendChild(widget); + if (builder.measure && size) { + builder.measure[builder.pos] = widget; + builder.addedOne = true; + } + } + builder.pos += size; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans; + if (!spans) { + for (var i = 1; i < styles.length; i+=2) + builder.addToken(builder, styles[i], styleToClass(styles[i+1])); + return; + } + + var allText = line.text, len = allText.length; + var pos = 0, i = 1, text = "", style; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = ""; + collapsed = null; nextChange = Infinity; + var foundBookmark = null; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (sp.from <= pos && (sp.to == null || sp.to > pos)) { + if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; } + if (m.className) spanStyle += " " + m.className; + if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle; + if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle; + if (m.collapsed && (!collapsed || collapsed.marker.width < m.width)) + collapsed = sp; + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + if (m.type == "bookmark" && sp.from == pos && m.replacedWith) + foundBookmark = m.replacedWith; + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len : collapsed.to) - pos, + collapsed.from != null && collapsed.marker.replacedWith); + if (collapsed.to == null) return collapsed.marker.find(); + } + if (foundBookmark && !collapsed) buildCollapsedSpan(builder, 0, foundBookmark); + } + if (pos >= len) break; + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : ""); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;} + pos = end; + spanStartStyle = ""; + } + text = styles[i++]; style = styleToClass(styles[i++]); + } + } + } + + // DOCUMENT DATA STRUCTURE + + function updateDoc(doc, change, markedSpans, selAfter, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null;} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // First adjust the line structure + if (from.ch == 0 && to.ch == 0 && lastText == "") { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + for (var i = 0, e = text.length - 1, added = []; i < e; ++i) + added.push(makeLine(text[i], spansFor(i), estimateHeight)); + update(lastLine, lastLine.text, lastSpans); + if (nlines) doc.remove(from.line, nlines); + if (added.length) doc.insert(from.line, added); + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + for (var added = [], i = 1, e = text.length - 1; i < e; ++i) + added.push(makeLine(text[i], spansFor(i), estimateHeight)); + added.push(makeLine(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + for (var i = 1, e = text.length - 1, added = []; i < e; ++i) + added.push(makeLine(text[i], spansFor(i), estimateHeight)); + if (nlines > 1) doc.remove(from.line + 1, nlines - 1); + doc.insert(from.line + 1, added); + } + + signalLater(doc, "change", doc, change); + setSelection(doc, selAfter.anchor, selAfter.head, null, true); + } + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + for (var i = 0, e = lines.length, height = 0; i < e; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length; }, + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + collapse: function(lines) { + lines.splice.apply(lines, [lines.length, 0].concat(this.lines)); + }, + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this; + }, + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + if (op(this.lines[at])) return true; + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0, e = children.length; i < e; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size; }, + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) break; + at = 0; + } else at -= sz; + } + if (this.size - n < 25) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function(lines) { + for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines); + }, + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + while (child.lines.length > 50) { + var spilled = child.lines.splice(child.lines.length - 25, 25); + var newleaf = new LeafChunk(spilled); + child.height -= newleaf.height; + this.children.splice(i + 1, 0, newleaf); + newleaf.parent = this; + } + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + maybeSpill: function() { + if (this.children.length <= 10) return; + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iterN: function(at, n, op) { + for (var i = 0, e = this.children.length; i < e; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) return true; + if ((n -= used) == 0) break; + at = 0; + } else at -= sz; + } + } + }; + + var nextDocId = 0; + var Doc = CodeMirror.Doc = function(text, mode, firstLine) { + if (!(this instanceof Doc)) return new Doc(text, mode, firstLine); + if (firstLine == null) firstLine = 0; + + BranchChunk.call(this, [new LeafChunk([makeLine("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.history = makeHistory(); + this.frontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = {from: start, to: start, head: start, anchor: start, shift: false, extend: false, goalColumn: null}; + this.id = ++nextDocId; + this.modeOption = mode; + + if (typeof text == "string") text = splitLines(text); + updateDoc(this, {from: start, to: start, text: text}, null, {head: start, anchor: start}); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + iter: function(from, to, op) { + if (op) this.iterN(from - this.first, to - from, op); + else this.iterN(this.first, this.first + this.size, from); + }, + + insert: function(at, lines) { + var height = 0; + for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height; + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) return lines; + return lines.join(lineSep || "\n"); + }, + setValue: function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: splitLines(code), origin: "setValue"}, + {head: top, anchor: top}, true); + }, + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) return lines; + return lines.join(lineSep || "\n"); + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;}, + setLine: function(line, text) { + if (isLine(this, line)) + replaceRange(this, text, Pos(line, 0), clipPos(this, Pos(line))); + }, + removeLine: function(line) { + if (line) replaceRange(this, "", clipPos(this, Pos(line - 1)), clipPos(this, Pos(line))); + else replaceRange(this, "", Pos(0, 0), clipPos(this, Pos(1, 0))); + }, + + getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);}, + getLineNumber: function(line) {return lineNo(line);}, + + lineCount: function() {return this.size;}, + firstLine: function() {return this.first;}, + lastLine: function() {return this.first + this.size - 1;}, + + clipPos: function(pos) {return clipPos(this, pos);}, + + getCursor: function(start) { + var sel = this.sel, pos; + if (start == null || start == "head") pos = sel.head; + else if (start == "anchor") pos = sel.anchor; + else if (start == "end" || start === false) pos = sel.to; + else pos = sel.from; + return copyPos(pos); + }, + somethingSelected: function() {return !posEq(this.sel.head, this.sel.anchor);}, + + setCursor: docOperation(function(line, ch, extend) { + var pos = clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line); + if (extend) extendSelection(this, pos); + else setSelection(this, pos, pos); + }), + setSelection: docOperation(function(anchor, head) { + setSelection(this, clipPos(this, anchor), clipPos(this, head || anchor)); + }), + extendSelection: docOperation(function(from, to) { + extendSelection(this, clipPos(this, from), to && clipPos(this, to)); + }), + + getSelection: function(lineSep) {return this.getRange(this.sel.from, this.sel.to, lineSep);}, + replaceSelection: function(code, collapse, origin) { + makeChange(this, {from: this.sel.from, to: this.sel.to, text: splitLines(code), origin: origin}, collapse || "around"); + }, + undo: docOperation(function() {makeChangeFromHistory(this, "undo");}), + redo: docOperation(function() {makeChangeFromHistory(this, "redo");}), + + setExtending: function(val) {this.sel.extend = val;}, + + historySize: function() { + var hist = this.history; + return {undo: hist.done.length, redo: hist.undone.length}; + }, + clearHistory: function() {this.history = makeHistory();}, + + markClean: function() { + this.history.dirtyCounter = 0; + this.history.lastOp = this.history.lastOrigin = null; + }, + isClean: function () {return this.history.dirtyCounter == 0;}, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)}; + }, + setHistory: function(histData) { + var hist = this.history = makeHistory(); + hist.done = histData.done.slice(0); + hist.undone = histData.undone.slice(0); + }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, "range"); + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark"); + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + markers.push(span.marker.parent || span.marker); + } + return markers; + }, + getAllMarks: function() { + var markers = []; + this.iter(function(line) { + var sps = line.markedSpans; + if (sps) for (var i = 0; i < sps.length; ++i) + if (sps[i].from != null) markers.push(sps[i].marker); + }); + return markers; + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first; + this.iter(function(line) { + var sz = line.text.length + 1; + if (sz > off) { ch = off; return true; } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)); + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) return 0; + this.iter(this.first, coords.line, function (line) { + index += line.text.length + 1; + }); + return index; + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = {from: this.sel.from, to: this.sel.to, head: this.sel.head, anchor: this.sel.anchor, + shift: this.sel.shift, extend: false, goalColumn: this.sel.goalColumn}; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc; + }, + + linkedDoc: function(options) { + if (!options) options = {}; + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) from = options.from; + if (options.to != null && options.to < to) to = options.to; + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from); + if (options.sharedHist) copy.history = this.history; + (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + return copy; + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) other = other.doc; + if (this.linked) for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) continue; + this.linked.splice(i, 1); + other.unlinkDoc(this); + break; + } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true); + other.history = makeHistory(); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode;}, + getEditor: function() {return this.cm;} + }); + + Doc.prototype.eachLine = Doc.prototype.iter; + + // The Doc methods that should be available on CodeMirror instances + var dontDelegate = "iter insert remove copy getEditor".split(" "); + for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments);}; + })(Doc.prototype[prop]); + + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) continue; + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) continue; + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } + } + propagate(doc, null, true); + } + + function attachDoc(cm, doc) { + if (doc.cm) throw new Error("This document is already in use."); + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + if (!cm.options.lineWrapping) computeMaxLength(cm); + cm.options.mode = doc.modeOption; + regChange(cm); + } + + // LINE UTILITIES + + function getLine(chunk, n) { + n -= chunk.first; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break; } + n -= sz; + } + } + return chunk.lines[n]; + } + + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function(line) { + var text = line.text; + if (n == end.line) text = text.slice(0, end.ch); + if (n == start.line) text = text.slice(start.ch); + out.push(text); + ++n; + }); + return out; + } + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function(line) { out.push(line.text); }); + return out; + } + + function updateLineHeight(line, height) { + var diff = height - line.height; + for (var n = line; n; n = n.parent) n.height += diff; + } + + function lineNo(line) { + if (line.parent == null) return null; + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) break; + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first; + } + + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i = 0, e = chunk.children.length; i < e; ++i) { + var child = chunk.children[i], ch = child.height; + if (h < ch) { chunk = child; continue outer; } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + for (var i = 0, e = chunk.lines.length; i < e; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) break; + h -= lh; + } + return n + i; + } + + function heightAtLine(cm, lineObj) { + lineObj = visualLine(cm.doc, lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) break; + else h += line.height; + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i = 0; i < p.children.length; ++i) { + var cur = p.children[i]; + if (cur == chunk) break; + else h += cur.height; + } + } + return h; + } + + function getOrder(line) { + var order = line.order; + if (order == null) order = line.order = bidiOrdering(line.text); + return order; + } + + // HISTORY + + function makeHistory() { + return { + // Arrays of history events. Doing something adds an event to + // done and clears undo. Undoing moves events from done to + // undone, redoing moves them in the other direction. + done: [], undone: [], undoDepth: Infinity, + // Used to track when changes can be merged into a single undo + // event + lastTime: 0, lastOp: null, lastOrigin: null, + // Used by the isClean() method + dirtyCounter: 0 + }; + } + + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) { + if (line.markedSpans) + (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; + ++n; + }); + } + + function historyChangeFromChange(doc, change) { + var histChange = {from: change.from, to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true); + return histChange; + } + + function addToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur = lst(hist.done); + + if (cur && + (hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastTime > time - 600) || change.origin.charAt(0) == "*"))) { + // Merge this change into the last event + var last = lst(cur.changes); + if (posEq(change.from, change.to) && posEq(change.from, last.to)) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + cur.anchorAfter = selAfter.anchor; cur.headAfter = selAfter.head; + } else { + // Can not be merged, start a new event. + cur = {changes: [historyChangeFromChange(doc, change)], + anchorBefore: doc.sel.anchor, headBefore: doc.sel.head, + anchorAfter: selAfter.anchor, headAfter: selAfter.head}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) + hist.done.shift(); + if (hist.dirtyCounter < 0) + // The user has made a change after undoing past the last clean state. + // We can never get back to a clean state now until markClean() is called. + hist.dirtyCounter = NaN; + else + hist.dirtyCounter++; + } + hist.lastTime = time; + hist.lastOp = opId; + hist.lastOrigin = change.origin; + } + + function removeClearedSpans(spans) { + if (!spans) return null; + for (var i = 0, out; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); } + else if (out) out.push(spans[i]); + } + return !out ? spans : out.length ? out : null; + } + + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) return null; + for (var i = 0, nw = []; i < change.text.length; ++i) + nw.push(removeClearedSpans(found[i])); + return nw; + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup) { + for (var i = 0, copy = []; i < events.length; ++i) { + var event = events[i], changes = event.changes, newChanges = []; + copy.push({changes: newChanges, anchorBefore: event.anchorBefore, headBefore: event.headBefore, + anchorAfter: event.anchorAfter, headAfter: event.headAfter}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m; + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } + } + } + return copy; + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSel(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + for (var j = 0; j < sub.changes.length; ++j) { + var cur = sub.changes[j]; + if (!sub.copied) { cur.from = copyPos(cur.from); cur.to = copyPos(cur.to); } + if (to < cur.from.line) { + cur.from.line += diff; + cur.to.line += diff; + } else if (from <= cur.to.line) { + ok = false; + break; + } + } + if (!sub.copied) { + sub.anchorBefore = copyPos(sub.anchorBefore); sub.headBefore = copyPos(sub.headBefore); + sub.anchorAfter = copyPos(sub.anchorAfter); sub.readAfter = copyPos(sub.headAfter); + sub.copied = true; + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } else { + rebaseHistSel(sub.anchorBefore); rebaseHistSel(sub.headBefore); + rebaseHistSel(sub.anchorAfter); rebaseHistSel(sub.headAfter); + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // EVENT OPERATORS + + function stopMethod() {e_stop(this);} + // Ensure an event has a stop method. + function addStop(event) { + if (!event.stop) event.stop = stopMethod; + return event; + } + + function e_preventDefault(e) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + function e_stopPropagation(e) { + if (e.stopPropagation) e.stopPropagation(); + else e.cancelBubble = true; + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + CodeMirror.e_stop = e_stop; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + + function e_target(e) {return e.target || e.srcElement;} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) b = 1; + else if (e.button & 2) b = 3; + else if (e.button & 4) b = 2; + } + if (mac && e.ctrlKey && b == 1) b = 3; + return b; + } + + // EVENT HANDLING + + function on(emitter, type, f) { + if (emitter.addEventListener) + emitter.addEventListener(type, f, false); + else if (emitter.attachEvent) + emitter.attachEvent("on" + type, f); + else { + var map = emitter._handlers || (emitter._handlers = {}); + var arr = map[type] || (map[type] = []); + arr.push(f); + } + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) + emitter.removeEventListener(type, f, false); + else if (emitter.detachEvent) + emitter.detachEvent("on" + type, f); + else { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + for (var i = 0; i < arr.length; ++i) + if (arr[i] == f) { arr.splice(i, 1); break; } + } + } + + function signal(emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args); + } + + var delayedCallbacks, delayedCallbackDepth = 0; + function signalLater(emitter, type /*, values...*/) { + var arr = emitter._handlers && emitter._handlers[type]; + if (!arr) return; + var args = Array.prototype.slice.call(arguments, 2); + if (!delayedCallbacks) { + ++delayedCallbackDepth; + delayedCallbacks = []; + setTimeout(fireDelayed, 0); + } + function bnd(f) {return function(){f.apply(null, args);};}; + for (var i = 0; i < arr.length; ++i) + delayedCallbacks.push(bnd(arr[i])); + } + + function fireDelayed() { + --delayedCallbackDepth; + var delayed = delayedCallbacks; + delayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) delayed[i](); + } + + function hasHandler(emitter, type) { + var arr = emitter._handlers && emitter._handlers[type]; + return arr && arr.length > 0; + } + + CodeMirror.on = on; CodeMirror.off = off; CodeMirror.signal = signal; + + // MISC UTILITIES + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerCutOff = 30; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}}; + + function Delayed() {this.id = null;} + Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}}; + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) end = string.length; + } + for (var i = startIndex || 0, n = startValue || 0; i < end; ++i) { + if (string.charAt(i) == "\t") n += tabSize - (n % tabSize); + else ++n; + } + return n; + } + CodeMirror.countColumn = countColumn; + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + spaceStrs.push(lst(spaceStrs) + " "); + return spaceStrs[n]; + } + + function lst(arr) { return arr[arr.length-1]; } + + function selectInput(node) { + if (ios) { // Mobile Safari apparently has a bug where select() is broken. + node.selectionStart = 0; + node.selectionEnd = node.value.length; + } else node.select(); + } + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + function createObj(base, props) { + function Obj() {} + Obj.prototype = base; + var inst = new Obj(); + if (props) copyObj(props, inst); + return inst; + } + + function copyObj(obj, target) { + if (!target) target = {}; + for (var prop in obj) if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; + return target; + } + + function emptyArray(size) { + for (var a = [], i = 0; i < size; ++i) a.push(undefined); + return a; + } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args);}; + } + + var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/; + function isWordChar(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + + function isEmpty(obj) { + for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false; + return true; + } + + var isExtendingChar = /[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F\udc00-\udfff]/; + + // DOM UTILITIES + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") setTextContent(e, content); + else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + e.removeChild(e.firstChild); + return e; + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + + function setTextContent(e, str) { + if (ie_lt9) { + e.innerHTML = ""; + e.appendChild(document.createTextNode(str)); + } else e.textContent = str; + } + + function getRect(node) { + return node.getBoundingClientRect(); + } + CodeMirror.replaceGetRect = function(f) { getRect = f; }; + + // FEATURE DETECTION + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie_lt9) return false; + var div = elt('div'); + return "draggable" in div || "dragDrop" in div; + }(); + + // For a reason I have yet to figure out, some browsers disallow + // word wrapping between certain characters *only* if a new inline + // element is started between them. This makes it hard to reliably + // measure the position of things, since that requires inserting an + // extra span. This terribly fragile set of regexps matches the + // character combinations that suffer from this phenomenon on the + // various browsers. + var spanAffectsWrapping = /^$/; // Won't match any two-character string + if (gecko) spanAffectsWrapping = /$'/; + else if (safari && !/Version\/([6-9]|\d\d)\b/.test(navigator.userAgent)) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/; + else if (webkit) spanAffectsWrapping = /[~!#%&*)=+}\]|\"\.>,:;][({[<]|-[^\-?\.]|\?[\w~`@#$%\^&*(_=+{[|><]/; + + var knownScrollbarWidth; + function scrollbarWidth(measure) { + if (knownScrollbarWidth != null) return knownScrollbarWidth; + var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll"); + removeChildrenAndAdd(measure, test); + if (test.offsetWidth) + knownScrollbarWidth = test.offsetHeight - test.clientHeight; + return knownScrollbarWidth || 0; + } + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !ie_lt8; + } + if (zwspSupported) return elt("span", "\u200b"); + else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) nl = string.length; + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function(string){return string.split(/\r\n?|\n/);}; + CodeMirror.splitLines = splitLines; + + var hasSelection = window.getSelection ? function(te) { + try { return te.selectionStart != te.selectionEnd; } + catch(e) { return false; } + } : function(te) { + try {var range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) return false; + return range.compareEndPoints("StartToEnd", range) != 0; + }; + + var hasCopyEvent = (function() { + var e = elt("div"); + if ("oncopy" in e) return true; + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == 'function'; + })(); + + // KEY NAMING + + var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete", + 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home", + 63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"}; + CodeMirror.keyNames = keyNames; + (function() { + // Number keys + for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i); + // Alphabetic keys + for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i); + // Function keys + for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i; + })(); + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) return f(from, to, "ltr"); + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr"); + } + } + + function bidiLeft(part) { return part.level % 2 ? part.to : part.from; } + function bidiRight(part) { return part.level % 2 ? part.from : part.to; } + + function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; } + function lineRight(line) { + var order = getOrder(line); + if (!order) return line.text.length; + return bidiRight(lst(order)); + } + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(cm.doc, line); + if (visual != line) lineN = lineNo(visual); + var order = getOrder(visual); + var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual); + return Pos(lineN, ch); + } + function lineEnd(cm, lineN) { + var merged, line; + while (merged = collapsedSpanAtEnd(line = getLine(cm.doc, lineN))) + lineN = merged.find().to.line; + var order = getOrder(line); + var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line); + return Pos(lineN, ch); + } + + // This is somewhat involved. It is needed in order to move + // 'visually' through bi-directional text -- i.e., pressing left + // should make the cursor go left, even when in RTL text. The + // tricky part is the 'jumps', where RTL and LTR text touch each + // other. This often requires the cursor offset to move more than + // one unit, in order to visually move one unit. + function moveVisually(line, start, dir, byUnit) { + var bidi = getOrder(line); + if (!bidi) return moveLogically(line, start, dir, byUnit); + var moveOneUnit = byUnit ? function(pos, dir) { + do pos += dir; + while (pos > 0 && isExtendingChar.test(line.text.charAt(pos))); + return pos; + } : function(pos, dir) { return pos + dir; }; + var linedir = bidi[0].level; + for (var i = 0; i < bidi.length; ++i) { + var part = bidi[i], sticky = part.level % 2 == linedir; + if ((part.from < start && part.to > start) || + (sticky && (part.from == start || part.to == start))) break; + } + var target = moveOneUnit(start, part.level % 2 ? -dir : dir); + + while (target != null) { + if (part.level % 2 == linedir) { + if (target < part.from || target > part.to) { + part = bidi[i += dir]; + target = part && (dir > 0 == part.level % 2 ? moveOneUnit(part.to, -1) : moveOneUnit(part.from, 1)); + } else break; + } else { + if (target == bidiLeft(part)) { + part = bidi[--i]; + target = part && bidiRight(part); + } else if (target == bidiRight(part)) { + part = bidi[++i]; + target = part && bidiLeft(part); + } else break; + } + } + + return target < 0 || target > line.text.length ? null : target; + } + + function moveLogically(line, start, dir, byUnit) { + var target = start + dir; + if (byUnit) while (target > 0 && isExtendingChar.test(line.text.charAt(target))) target += dir; + return target < 0 || target > line.text.length ? null : target; + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL"; + // Character types for codepoints 0x600 to 0x6ff + var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr"; + function charType(code) { + if (code <= 0xff) return lowTypes.charAt(code); + else if (0x590 <= code && code <= 0x5f4) return "R"; + else if (0x600 <= code && code <= 0x6ff) return arabicTypes.charAt(code - 0x600); + else if (0x700 <= code && code <= 0x8ac) return "r"; + else return "L"; + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + // Browsers seem to always treat the boundaries of block elements as being L. + var outerType = "L"; + + return function(str) { + if (!bidiRE.test(str)) return false; + var len = str.length, types = []; + for (var i = 0, type; i < len; ++i) + types.push(type = charType(str.charCodeAt(i))); + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i = 0, prev = outerType; i < len; ++i) { + var type = types[i]; + if (type == "m") types[i] = prev; + else prev = type; + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i = 0, cur = outerType; i < len; ++i) { + var type = types[i]; + if (type == "1" && cur == "r") types[i] = "n"; + else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i = 1, prev = types[0]; i < len - 1; ++i) { + var type = types[i]; + if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1"; + else if (type == "," && prev == types[i+1] && + (prev == "1" || prev == "n")) types[i] = prev; + prev = type; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i = 0; i < len; ++i) { + var type = types[i]; + if (type == ",") types[i] = "N"; + else if (type == "%") { + for (var end = i + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i && types[i-1] == "!") || (end < len - 1 && types[end] == "1") ? "1" : "N"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i = 0, cur = outerType; i < len; ++i) { + var type = types[i]; + if (cur == "L" && type == "1") types[i] = "L"; + else if (isStrong.test(type)) cur = type; + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i = 0; i < len; ++i) { + if (isNeutral.test(types[i])) { + for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {} + var before = (i ? types[i-1] : outerType) == "L"; + var after = (end < len - 1 ? types[end] : outerType) == "L"; + var replace = before || after ? "L" : "R"; + for (var j = i; j < end; ++j) types[j] = replace; + i = end - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i = 0; i < len;) { + if (countsAsLeft.test(types[i])) { + var start = i; + for (++i; i < len && countsAsLeft.test(types[i]); ++i) {} + order.push({from: start, to: i, level: 0}); + } else { + var pos = i, at = order.length; + for (++i; i < len && types[i] != "L"; ++i) {} + for (var j = pos; j < i;) { + if (countsAsNum.test(types[j])) { + if (pos < j) order.splice(at, 0, {from: pos, to: j, level: 1}); + var nstart = j; + for (++j; j < i && countsAsNum.test(types[j]); ++j) {} + order.splice(at, 0, {from: nstart, to: j, level: 2}); + pos = j; + } else ++j; + } + if (pos < i) order.splice(at, 0, {from: pos, to: i, level: 1}); + } + } + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift({from: 0, to: m[0].length, level: 0}); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push({from: len - m[0].length, to: len, level: 0}); + } + if (order[0].level != lst(order).level) + order.push({from: len, to: len, level: order[0].level}); + + return order; + }; + })(); + + // THE END + + CodeMirror.version = "3.11 +"; + + return CodeMirror; +})(); diff --git a/public/js/custom.js b/public/js/custom.js new file mode 100755 index 0000000..3ca621b --- /dev/null +++ b/public/js/custom.js @@ -0,0 +1,1146 @@ + + +/*************** COLORS TO BE ERASED WHEN INSTALLING THE THEME ***********/ + +$(document).ready(function() { + + var s = document.createElement("script"); + s.type = "text/javascript"; + s.src = "js-plugin/jquery-cookie/jquery.cookie.js"; + $("body").append(s); + + if($.cookie("css")) { + $("#colors").attr("href",$.cookie("css")); + } + $(".switcher li a").click(function() { + + $("#colors").attr("href",$(this).attr("href")); + $.cookie("css",$(this).attr("href")); + return false; + }); + +}); + +/*************** COLORS TO BE ERASED WHEN INSTALLING THE THEME ***********/ + + +/*************** REPLACE WITH YOUR OWN UA NUMBER ***********/ +var UA = 'XXX'; +/*************** REPLACE WITH YOUR OWN UA NUMBER ***********/ + + +/* +|-------------------------------------------------------------------------- +| DOCUMENT READY +|-------------------------------------------------------------------------- +*/ + +$(document).ready(function() { + /***** form placeholder for IE *****/ + if(!Modernizr.input.placeholder){ + + $('[placeholder]').focus(function() { + var input = $(this); + if (input.val() == input.attr('placeholder')) { + input.val(''); + input.removeClass('placeholder'); + } + }).blur(function() { + var input = $(this); + if (input.val() == '' || input.val() == input.attr('placeholder')) { + input.addClass('placeholder'); + input.val(input.attr('placeholder')); + } + }).blur(); + $('[placeholder]').parents('form').submit(function() { + $(this).find('[placeholder]').each(function() { + var input = $(this); + if (input.val() == input.attr('placeholder')) { + input.val(''); + } + }) + }); + + } + + + + + + + /* + |-------------------------------------------------------------------------- + | BOOTSTRAP ELEMENTS + |-------------------------------------------------------------------------- + */ + + + + + + /* + |-------------------------------------------------------------------------- + | PRETTY PHOTOS + |-------------------------------------------------------------------------- + */ + if( $("a.prettyPhoto").length){ + $("a.prettyPhoto").prettyPhoto({ + animation_speed:'fast', + slideshow:10000, + hideflash: true, + social_tools:false + }); + } + + /* + |-------------------------------------------------------------------------- + | TOOLTIP + |-------------------------------------------------------------------------- + */ + $('.tips').tooltip(); + + /* + |-------------------------------------------------------------------------- + | COLLAPSE + |-------------------------------------------------------------------------- + */ + + + $('.accordion').on('show hide', function(e){ + $(e.target).siblings('.accordion-heading').find('.accordion-toggle i').toggleClass('icon-right-circle icon-down-circle', 200); + }); + + /* + |-------------------------------------------------------------------------- + | CONTACT + |-------------------------------------------------------------------------- + */ + $('.slideContact').click(function(e){ + + if ( $(window).width() >= 800){ + + $('#contact').slideToggle('normal', 'easeInQuad',function(){ + + $('#contactinfoWrapper').css('margin-left', 0); + $('#mapSlideWrapper').css('margin-left', 3000); + $('#contactinfoWrapper').fadeToggle(); + + + }); + $('#closeContact').fadeToggle(); + return false; + + }else{ + + return true; + + } + }); + + + $('#closeContact').click(function(e){ + + + $('#contactinfoWrapper').fadeOut('normal', 'easeInQuad',function(){ + $('#contactinfoWrapper').css('margin-left', 0); + $('#mapSlideWrapper').css('margin-left', 3000); + }); + + $('#contact').slideUp('normal', 'easeOutQuad'); + + $(this).fadeOut(); + + e.preventDefault(); + + }); + + + + + + + /* MAP */ + $('#mapTrigger').click(function(e){ + + + $('#mapSlideWrapper').css('display', 'block'); + initialize('mapWrapper'); + + $('#contactinfoWrapper, #contactinfoWrapperPage').animate({ + marginLeft:'-2000px' + }, 400, function() {}); + + + $('#mapSlideWrapper').animate({ + marginLeft:'15px' + }, 400, function() {}); + + appendBootstrap(); + + e.preventDefault(); + }); + + + $('#mapTriggerLoader').click(function(e){ + + + $('#mapSlideWrapper, #contactinfoWrapperPage').css('display', 'block'); + + $('#contactinfoWrapper, #contactinfoWrapperPage').animate({ + marginLeft:'-2000px' + }, 400, function() {}); + + + $('#mapSlideWrapper').animate({ + marginLeft:'15px' + }, 400, function() {}); + + + appendBootstrap(); + + e.preventDefault(); + }); + + + $('#mapReturn').click(function(e){ + //$('#mapWrapper').css('margin-bottom', '3em'); + + + $('#mapSlideWrapper').animate({ + marginLeft:'3000px' + }, 400, function() {}); + + + $('#contactinfoWrapper, #contactinfoWrapperPage').animate({ + marginLeft:'0' + }, 400, function() { + $('#mapSlideWrapper').css('display', 'none'); + }); + + e.preventDefault(); + }); + + + /* + |-------------------------------------------------------------------------- + | SCROLL (portfolio horizontal) + |-------------------------------------------------------------------------- + */ + if($("div#makeMeScrollable").length){ + $("div#makeMeScrollable").smoothDivScroll({ + + touchScrolling:true, + mousewheelScrolling: "vertical" + }); + + + $('.showInfo').click(function(e){ + + $('.pInfo').find('h3').css('margin-top' , '-400px'); + $('.pInfo').css('display', 'none'); + $(this).next('div').slideDown(300); + $('.showInfo').not($(this)).animate({ + marginTop:0 + }); + $(this).animate({ + marginTop:$(this).width() + }, 300); + $(this).next('div').slideDown(300); + $(this).next('div').children('h3').animate({ + marginTop:-5 + }, 300); + + e.preventDefault(); + + }); + + $('.closeInfo').click(function(e){ + + $(this).parent().slideUp('normal'); + $(this).parent().children('h3').animate({ + marginTop:-400 + }, 200, function() { + $(this).parent().css('display', 'none'); + }); + $(this).parent().parent().find('img').animate({ + marginTop:0 + }); + + e.preventDefault(); + + }); + + } + + /* + |-------------------------------------------------------------------------- + | FLEXSLIDER + |-------------------------------------------------------------------------- + */ + if($('.flexslider').length){ + $('.flexslider').flexslider({ + animation: "slide", + controlNav: true, + directionNav: true, + slideshow: true, + start: function(slider){ + + setTimeout("animateTxt("+slider.currentSlide+", 'off')", 300); + }, + before: function(slider){ + + animateTxt(slider.currentSlide, 'on'); + + }, + after: function(slider){ + setTimeout("animateTxt("+slider.currentSlide+", 'off')", 300); + + } + + }); + + + /* SILDER OVERLAY ON RESIZE */ + $(window).resize(function() { + $('.tramOverlay').height($('.slides li img').height()); + }); + + } + /* + |-------------------------------------------------------------------------- + | SEQUENCE SLIDER + |-------------------------------------------------------------------------- + */ + + if($('#sequence').length){ + var options = { + nextButton: true, + prevButton: true, + pagination: true, + animateStartingFrameIn: true, + autoPlayDelay: 3000, + preloader: true, + preloadTheseFrames: [1], + preloadTheseImages: [ + "images/slider/sequence/tn-model1.png", + "images/slider/sequence/tn-model2.png", + "images/slider/sequence/tn-model3.png" + ] + }; + + var mySequence = $("#sequence").sequence(options).data("sequence"); + } + + + /* + |-------------------------------------------------------------------------- + | DIRECTIONAL ROLLOVER AND HOVER EFFECTS + |-------------------------------------------------------------------------- + */ + + if($('.da-thumbs').length){ + $('.da-thumbs article a').hoverdir(); + } + + + if($('.da-thumbs ').length){ + + $('article a').hover( + function () { + + /*var centerArticle = ($('a section', this).height()/2 - $('a div span', this).outerHeight(true)/2) + 4; + $('a div', this).css('padding-top', centerArticle+'px');*/ + + var fromTop = ($('section img', this).height()/2 - $('.iconLink', this).outerHeight()/2) ; + $('.iconLink', this).css('margin-top', fromTop); + + + if ($.browser.chrome || $.browser.webkit ) { + + $(this).find('section img').css('-webkit-transform', 'scale(1.5) '); + } + else if ($.browser.mozilla){ + + $(this).find('section img').css('-moz-transform', 'scale(1.5) rotate(0.1deg)'); + + }else if($.browser.opera){ + + $(this).find('section img').css('-o-transform', 'scale(1.5)'); + + }else if($.browser.msie){ + + $(this).find('section img').css('-ms-transform', 'scale(1.5)'); + + } + + + + }, + function () { + + if ($.browser.chrome || $.browser.webkit) { + + $(this).find('section img').css('-webkit-transform', 'scale(1) '); + + } else if ($.browser.mozilla){ + + $(this).find('section img').css('-moz-transform', 'scale(1) rotate(0deg)'); + + } else if($.browser.opera){ + + $(this).find('section img').css('-o-transform', 'scale(1)'); + + } else if($.browser.msie){ + + $(this).find('section img').css('-ms-transform', 'scale(1)'); + + } + } + ); +} + + + + /* + |-------------------------------------------------------------------------- + | ROLLOVER BTN + |-------------------------------------------------------------------------- + */ + + $('.socialIcon').hover( + function () { + $(this).stop(true, true).addClass('socialHoverClass', 300); + }, + function () { + $(this).removeClass('socialHoverClass', 300); + }); + + + + + + $('.tabs li, .accordion h2').hover( + function () { + $(this).stop(true, true).addClass('speBtnHover', 300); + }, + function () { + $(this).stop(true, true).removeClass('speBtnHover', 100); + }); + + + + + + /* + |-------------------------------------------------------------------------- + | ALERT + |-------------------------------------------------------------------------- + */ + $('.alert').delegate('button', 'click', function() { + $(this).parent().fadeOut('fast'); + }); + + + /* + |-------------------------------------------------------------------------- + | CLIENT + |-------------------------------------------------------------------------- + */ + + if($('.colorHover').length){ + var array =[]; + $('.colorHover').hover( + + function () { + + array[0] = $(this).attr('src'); + $(this).attr('src', $(this).attr('src').replace('-off', '')); + + }, + + function () { + + $(this).attr('src', array[0]); + + }); + } + + + /* + |-------------------------------------------------------------------------- + | UP AND DOWN & MENU BTNS PORTFOLIO STATIC + |-------------------------------------------------------------------------- + */ + + $('.goDown').click(function(e){ + + var offset = $(this).parents().next('section').offset(); + var variation = ($('.navbar-fixed-top').length)?$('.navbar-fixed-top').outerHeight(true) +20 :90; + var finalPos = offset.top - variation; + + scrollTo(finalPos, 500); + e.preventDefault(); + + }); + + + $('.goUp').click(function(e){ + + var offset = $(this).parents().prev('section').offset(); + var variation = ($('.navbar-fixed-top').length)?$('.navbar-fixed-top').outerHeight(true) +20:90; + var finalPos = offset.top - variation; + + scrollTo(finalPos, 500); + e.preventDefault(); + }); + + + $('.PortfolioStickyMenu ul li a').click(function(e){ + + + var targetId = $(this).attr('href'); + var offset = $(targetId).offset() ; + var variation = ($('.navbar-fixed-top').length)?$('.navbar-fixed-top').outerHeight(true) +20:90; + var finalPos = offset.top - variation; + + scrollTo(finalPos , 500); + e.preventDefault(); + + + }); + + /* + |-------------------------------------------------------------------------- + | CAMERA SLIDER + |-------------------------------------------------------------------------- + */ + if($('.camera_wrap').length){ + + jQuery('.camera_wrap').camera({ + thumbnails: true, + pagination: true, + height:'35%' + }); + + } + + if($('.camera_wrap_nonav').length){ + + jQuery('.camera_wrap_nonav').camera({ + pagination: false, + thumbnails: true, + height:'70%' + }); + + } + if($('.camera_wrap_nothumb').length){ + + jQuery('.camera_wrap_nothumb').camera({ + pagination: true, + thumbnails: false, + height:'40%' + }); + + } + + + +/* +|-------------------------------------------------------------------------- +| SHARRRE +|-------------------------------------------------------------------------- +*/ +if($('#shareme').length){ + $('#shareme').sharrre({ + share: { + googlePlus: true, + facebook: true, + twitter: true + }, + buttons: { + googlePlus: {size: 'tall', annotation:'bubble'}, + facebook: {layout: 'box_count'}, + twitter: {count: 'vertical'}, + }, + enableHover: false, + enableCounter: false, + enableTracking: true, + url:document.location.href +}); +} + + + +//END DOCUMENT READY +}); + + + +/* +|-------------------------------------------------------------------------- +| EVENTS TRIGGER AFTER ALL IMAGES ARE LOADED +|-------------------------------------------------------------------------- +*/ +$(window).load(function() { + + /* + |-------------------------------------------------------------------------- + | RS SLIDER + |-------------------------------------------------------------------------- + */ + if($('.fullwidthbanner').length){ + + $('.fullwidthbanner').css('display', 'block'); + + if(jQuery().revolution) { + + $('.fullwidthbanner').revolution( + { + delay:9000, + startwidth:940, + startheight:432, + + onHoverStop:"on",// Stop Banner Timet at Hover on Slide on/off + + thumbWidth:100,// Thumb With and Height and Amount (only if navigation Type set to thumb !) + thumbHeight:50, + thumbAmount:3, + + hideThumbs:200, + navigationType:"both",//bullet, thumb, none, both (No Shadow in Fullwidth Version !) + navigationArrows:"verticalcentered",//nexttobullets, verticalcentered, none + navigationStyle:"round",//round,square,navbar + + touchenabled:"on",// Enable Swipe Function : on/off + + navOffsetHorizontal:0, + navOffsetVertical:20, + + stopAtSlide:-1,// Stop Timer if Slide "x" has been Reached. If stopAfterLoops set to 0, then it stops already in the first Loop at slide X which defined. -1 means do not stop at any slide. stopAfterLoops has no sinn in this case. + stopAfterLoops:-1,// Stop Timer if All slides has been played "x" times. IT will stop at THe slide which is defined via stopAtSlide:x, if set to -1 slide never stop automatic + + + + fullWidth:"off", + + shadow:0, //0 = no Shadow, 1,2,3 = 3 Different Art of Shadows - (No Shadow in Fullwidth Version !) + + + wrapper:'#sliderWrapperRS', + wrapperheight:500 + + }); + +} + +} + + /* + |-------------------------------------------------------------------------- + | ISOTOPE USAGE FILTERING + |-------------------------------------------------------------------------- + */ + if($('.isotopeWrapper').length){ + + var $container = $('.isotopeWrapper'); + var $resize = $('.isotopeWrapper').attr('id'); + // initialize isotope + + $container.isotope({ + itemSelector: '.isotopeItem', + containerStyle: { overflow: 'visible', position: 'relative'}, + resizable: false, // disable normal resizing + masonry: { + columnWidth: $container.width() / $resize + } + + + + }); + + $('#filter a').click(function(){ + $('#filter a').removeClass('current'); + $(this).addClass('current'); + var selector = $(this).attr('data-filter'); + $container.isotope({ + filter: selector + }); + return false; + }); + + + $(window).smartresize(function(){ + $container.isotope({ + // update columnWidth to a percentage of container width + masonry: { + columnWidth: $container.width() / $resize + } + }); + }); + + $container.delegate('.masoneryBloc a.sizer', 'click', function(){ + var $this = $(this); + var resizeElement = $(this).parent(); + $this.find('div').css('display', 'none'); + if(resizeElement.hasClass('span3')){ + + resizeElement.removeClass('span3'); + resizeElement.addClass('span6'); + $this.find('div>span>i').attr('class', 'icon-minus'); + + }else{ + + resizeElement.addClass('span3'); + resizeElement.removeClass('span6'); + $this.find('div>span>i').attr('class', 'icon-plus'); + + } + + + + + if($(this).parent().children('.hiddenInfo').css('display') == 'block'){ + + $(this).parent().children('.hiddenInfo').css('display', 'none'); + $(this).parent().find('.iconZoom').css('background-position', '217px 702px'); + $(this).parent().find('.mask span').html('Read More'); + + }else{ + + $(this).parent().children('.hiddenInfo').css('display', 'block'); + $(this).parent().find('.iconZoom').css('background-position', '164px 689px'); + $(this).parent().find('.mask span').html('Minimize'); + + } + + $container.isotope('reLayout'); + return false; + }); + } + + + + +//END WINDOW LOAD +}); + + +/* +|-------------------------------------------------------------------------- +| FUNCTIONS +|-------------------------------------------------------------------------- +*/ + + + +/* FLEXSLIDER INNER INFO CUSTOM ANIMATION */ +function animateTxt(curSlide, state){ + + + if(state == 'off'){ + + //change the display state + // $('.slideN'+curSlide).children('.txt').css('display', 'block'); + // $('.slideN'+curSlide).children('.txt').children('h2').css('display', 'block'); + // $('.slideN'+curSlide).children('.txt').children('div').css('display', 'block'); + // $('.slideN'+curSlide).children('.txt').children('a').css('display', 'inline-block'); + // + + $('.slideN'+curSlide).children('.txt').children('h2').css('display', 'none'); + $('.slideN'+curSlide).children('.txt').children('div').css('display', 'none'); + $('.slideN'+curSlide).children('.txt').children('a').css('display', 'none'); + + $('.slideN'+curSlide).children('.txt').fadeIn(200, 'easeInOutQuart', function () { + $('.slideN'+curSlide).children('.txt').children('h2').fadeIn(200, 'easeInOutQuart', function () { + $('.slideN'+curSlide).children('.txt').children('div').fadeIn(200, 'easeInOutQuart', function () { + $('.slideN'+curSlide).children('.txt').children('a').fadeIn(200); + }); + }); + }); + + + + + //the animation + // $('.slideN'+curSlide).children('.txt').children('h2').stop(true, true).animate({ + // marginLeft: 10 + // }, 400, 'easeOutQuad', function() {}).animate({ + // marginLeft: 0 + // }, 200, 'easeOutQuad', function() {}); + + + // $('.slideN'+curSlide).children('.txt').children('div').stop(true, true).delay(10).animate({ + // marginLeft:-10, + // opacity:0.8 + // }, 300, 'easeOutQuad', function() { + + // }).animate({ + // marginLeft: 0, + // opacity:1 + // }, 200, 'easeOutQuad', function() {}); + + // $('.slideN'+curSlide).children('.txt').children('a').stop(true, true).delay(40).animate({ + // marginTop: -10 + // }, 300, 'easeOutQuad', function() {}).animate({ + // marginTop: 0 + // }, 200, 'easeOutQuad', function() {}); + +}else{ + + + //change the display state + $('.slideN'+curSlide).children('.txt').fadeOut(400); + $('.slideN'+curSlide).children('.txt').children('h2').css('display', 'none'); + $('.slideN'+curSlide).children('.txt').children('div').css('display', 'none'); + $('.slideN'+curSlide).children('.txt').children('a').css('display', 'none'); + + //reposition the elements + // $('.slideN'+curSlide).children('.txt').children('h2').css('margin-left', '-3000px'); + // $('.slideN'+curSlide).children('.txt').children('div').css('margin-left', '490px'); + // $('.slideN'+curSlide).children('.txt').children('a').css('margin-top', '230px'); + + } +} + + + + +/* MAIN MENU (submenu slide and setting up of a select box on small screen)*/ +(function() { + + var $mainMenu = $('#mainMenu').children('ul'); + + $mainMenu.on('mouseenter', 'li', function() { + + + var $this = $(this), + + $subMenu = $this.children('ul'); + + + if( $subMenu.length ) $this.addClass('hover').stop(); + else { + if($this.parent().is($(':gt(1)', $mainMenu))){ + $this.addClass('Shover').stop(false, true).hide().fadeIn('slow'); + }else{ + $this.addClass('Shover').stop(false, true); + } + } + + + if($this.parent().is($(':gt(1)', $mainMenu))){ + + $subMenu.css('display', 'block'); + $subMenu.stop(false, true).animate({ + left:144, + opacity:1 + }, 300,'easeOutQuad'); + + + + + }else{ + + $subMenu.stop(false, true).slideDown('fast','easeInQuad'); + + } + + + }).on('mouseleave', 'li', function() { + + + var $nthis = $(this); + if($nthis.parent().is($(':gt(1)', $mainMenu))){ + + $nthis.children('ul').stop(false, true).css('left', 130).css('opacity', 0).css('display', 'none'); + + }else{ + + $nthis.removeClass('hover').removeClass('Shover').children('ul').stop(false, true).hide(); + } + + $subMenu = $nthis.children('ul'); + + if( $subMenu.length ) $nthis.removeClass('hover'); + else $nthis.removeClass('Shover'); + + + }).on('touchend', 'li ul li a', function(e) { + + var el = $(this); + var link = el.attr('href'); + window.location = link; + + }); + + + // ul to select + var optionsList = ''; + $mainMenu.find('li').each(function() { + var $this = $(this), + $anchor = $this.children('a'), + depth = $this.parents('ul').length - 1, + indent = ''; + + if( depth ) { + + + + + while( depth > 0 ) { + + indent += ' - '; + depth--; + if($this.has('ul').length){ + $anchor.addClass('hasSubMenu'); + } + + } + } + + optionsList += ''; + }).end().after(''); + + $('.responsive-nav').on('change', function() { + window.location = $(this).val(); + }); + +})(); + + +/* BACK TO TOP (BTN back to top by Matt Varone)*/ +(function() { + + var defaults = { + sym: '', + min: 50, + inDelay:600, + outDelay:400, + containerID: 'to-top', + containerCLASS: 'iconWrapper', + containerHoverID: 'to-top', + scrollSpeed: 300, + easingType: 'linear' + }, + settings = $.extend(defaults), + containerIDhash = '#' + settings.containerID, + containerHoverIDHash = '#'+settings.containerHoverID; + + $('body').append('
    '+settings.sym+''); + $(containerIDhash).hide().on('click.UItoTop',function(){ + $('html, body').animate({ + scrollTop:0 + }, settings.scrollSpeed, settings.easingType); + $('#'+settings.containerHoverID, this).stop().animate({ + 'opacity': 0 + }, settings.inDelay, settings.easingType); + return false; + }) + //.prepend('') + .hover(function() { + + $(containerHoverIDHash, this).stop().animate({ + 'opacity': 1 + }, 600, 'linear'); + }, function() { + + + $(containerHoverIDHash, this).stop().animate({ + 'opacity': 0 + }, 700, 'linear'); + }); + + $(window).scroll(function() { + var sd = $(window).scrollTop(); + if(typeof document.body.style.maxHeight === "undefined") { + $(containerIDhash).css({ + 'position': 'absolute', + 'top': sd + $(window).height() - 50 + }); + } + if ( sd > settings.min ) + $(containerIDhash).fadeIn(settings.inDelay); + else + $(containerIDhash).fadeOut(settings.Outdelay); + }); + +})(); + + +/* +|-------------------------------------------------------------------------- +| SIDEBAR MENU FOLLOWING WINDOW SCROLL +|-------------------------------------------------------------------------- +*/ + +function scrollTo($position, $animationTime){ + + $('html,body').animate({ + scrollTop: $position + }, $animationTime); + +} + +/* +|-------------------------------------------------------------------------- +| STICKY MENU +|-------------------------------------------------------------------------- +*/ + +$(function() { + $window = $(window); + if( $(".PortfolioStickyMenu").length && $window.width() >= 754) { + var $sidebar = $(".PortfolioStickyMenu"), + + offset = $sidebar.offset(), + topPadding = 90; + + + $window.scroll(function() { + if ($window.scrollTop() > offset.top) { + if(($window.scrollTop() - offset.top + topPadding) <= $('.lastArticle').position().top + $('.lastArticle').height() + 200){ + $sidebar.stop().animate({ + marginTop: $window.scrollTop() - offset.top + topPadding + }); + } + + } else { + $sidebar.stop().animate({ + marginTop: 0 + }); + } + }); + } + +}); + + +/* +|-------------------------------------------------------------------------- +| GOOGLE MAP +|-------------------------------------------------------------------------- +*/ + +function appendBootstrap() { + var script = document.createElement("script"); + script.type = "text/javascript"; + script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize"; + document.body.appendChild(script); +} + + + + +function initialize(id) { + + var image = 'images/icon-map.png'; + + var overlayTitle = 'Agencies'; + + var locations = [ + //point number 1 + ['Madison Square Garden', '4 Pennsylvania Plaza, New York, NY'], + + //point number 2 + ['Best town ever', 'Santa Cruz', 36.986021, -122.02216399999998], + + //point number 3 + ['Located in the Midwestern United States', 'Kansas'], + + //point number 4 + ['I\'ll be there one day', 'Chicago', 41.8781136, -87.62979819999998] + + ]; + + /*** DON'T CHANGE ANYTHING PASSED THIS LINE ***/ + id = (id == undefined) ? 'mapWrapper' : id; + + var map = new google.maps.Map(document.getElementById(id), { + mapTypeId: google.maps.MapTypeId.ROADMAP, + zoom: 14 + + }); + + var myLatlng; + var marker, i; + var bounds = new google.maps.LatLngBounds(); + var infowindow = new google.maps.InfoWindow({ content: "loading..." }); + + for (i = 0; i < locations.length; i++) { + + + if(locations[i][2] != undefined && locations[i][3] != undefined){ + var content = '
    '+locations[i][0]+'
    '+locations[i][1]+'
    '; + (function(content) { + myLatlng = new google.maps.LatLng(locations[i][2], locations[i][3]); + + marker = new google.maps.Marker({ + position: myLatlng, + icon:image, + title: overlayTitle, + map: map + }); + + google.maps.event.addListener(marker, 'click', (function(marker, i) { + return function() { + infowindow.setContent(content); + infowindow.open(map, this); + } + + })(this, i)); + + if(locations.length > 1){ + bounds.extend(myLatlng); + map.fitBounds(bounds); + }else{ + map.setCenter(myLatlng); + } + + })(content); + }else{ + + geocoder = new google.maps.Geocoder(); + var info = locations[i][0]; + var addr = locations[i][1]; + var latLng = locations[i][1]; + + (function(info, addr) { + + geocoder.geocode( { + + 'address': latLng + + }, function(results, status) { + + myLatlng = results[0].geometry.location; + + marker = new google.maps.Marker({ + position: myLatlng, + icon:image, + title: overlayTitle, + map: map + }); + var $content = '
    '+info+'
    '+addr+'
    '; + google.maps.event.addListener(marker, 'click', (function(marker, i) { + return function() { + infowindow.setContent($content); + infowindow.open(map, this); + } + })(this, i)); + + if(locations.length > 1){ + bounds.extend(myLatlng); + map.fitBounds(bounds); + }else{ + map.setCenter(myLatlng); + } + }); +})(info, addr); + +} +} +} + + + + diff --git a/public/js/javascript.js b/public/js/javascript.js new file mode 100644 index 0000000..ff6bb5d --- /dev/null +++ b/public/js/javascript.js @@ -0,0 +1,437 @@ +// TODO actually recognize syntax of TypeScript constructs + +CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var jsonMode = parserConfig.json; + var isTS = parserConfig.typescript; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + var jsKeywords = { + "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C, + "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this") + }; + + // Extend the 'normal' keywords with the TypeScript language extensions + if (isTS) { + var type = {type: "variable", style: "variable-3"}; + var tsKeywords = { + // object-like things + "interface": kw("interface"), + "class": kw("class"), + "extends": kw("extends"), + "constructor": kw("constructor"), + + // scope modifiers + "public": kw("public"), + "private": kw("private"), + "protected": kw("protected"), + "static": kw("static"), + + "super": kw("super"), + + // types + "string": type, "number": type, "bool": type, "any": type + }; + + for (var attr in tsKeywords) { + jsKeywords[attr] = tsKeywords[attr]; + } + } + + return jsKeywords; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^]/; + + function chain(stream, state, f) { + state.tokenize = f; + return f(stream, state); + } + + function nextUntilUnescaped(stream, end) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (next == end && !escaped) + return false; + escaped = !escaped && next == "\\"; + } + return escaped; + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + + function jsTokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") + return chain(stream, state, jsTokenString(ch)); + else if (/[\[\]{}\(\),;\:\.]/.test(ch)) + return ret(ch); + else if (ch == "0" && stream.eat(/x/i)) { + stream.eatWhile(/[\da-f]/i); + return ret("number", "number"); + } + else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { + stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); + return ret("number", "number"); + } + else if (ch == "/") { + if (stream.eat("*")) { + return chain(stream, state, jsTokenComment); + } + else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } + else if (state.lastType == "operator" || state.lastType == "keyword c" || + /^[\[{}\(,;:]$/.test(state.lastType)) { + nextUntilUnescaped(stream, "/"); + stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla + return ret("regexp", "string-2"); + } + else { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + } + else if (ch == "#") { + stream.skipToEnd(); + return ret("error", "error"); + } + else if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return ret("operator", null, stream.current()); + } + else { + stream.eatWhile(/[\w\$_]/); + var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; + return (known && state.lastType != ".") ? ret(known.type, known.style, word) : + ret("variable", "variable", word); + } + } + + function jsTokenString(quote) { + return function(stream, state) { + if (!nextUntilUnescaped(stream, quote)) + state.tokenize = jsTokenBase; + return ret("string", "string"); + }; + } + + function jsTokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = jsTokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function register(varname) { + function inList(list) { + for (var v = list; v; v = v.next) + if (v.name == varname) return true; + return false; + } + var state = cx.state; + if (state.context) { + cx.marked = "def"; + if (inList(state.localVars)) return; + state.localVars = {name: varname, next: state.localVars}; + } else { + if (inList(state.globalVars)) return; + state.globalVars = {name: varname, next: state.globalVars}; + } + } + + // Combinators + + var defaultVars = {name: "this", next: {name: "arguments"}}; + function pushcontext() { + cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; + cx.state.localVars = defaultVars; + } + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + function pushlex(type, info) { + var result = function() { + var state = cx.state; + state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + return function(type) { + if (type == wanted) return cont(); + else if (wanted == ";") return pass(); + else return cont(arguments.callee); + }; + } + + function statement(type) { + if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "{") return cont(pushlex("}"), block, poplex); + if (type == ";") return cont(); + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), + poplex, statement, poplex); + if (type == "variable") return cont(pushlex("stat"), maybelabel); + if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), + block, poplex, poplex); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), + statement, poplex, popcontext); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function expression(type) { + if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); + if (type == "function") return cont(functiondef); + if (type == "keyword c") return cont(maybeexpression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); + if (type == "operator") return cont(expression); + if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator); + if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperator(type, value) { + if (type == "operator") { + if (/\+\+|--/.test(value)) return cont(maybeoperator); + if (value == "?") return cont(expression, expect(":"), expression); + return cont(expression); + } + if (type == ";") return; + if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); + if (type == ".") return cont(property, maybeoperator); + if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperator, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "variable") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + } else if (type == "number" || type == "string") { + cx.marked = type + " property"; + } + if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); + } + function getterSetter(type) { + if (type == ":") return cont(expression); + if (type != "variable") return cont(expect(":"), expression); + cx.marked = "property"; + return cont(functiondef); + } + function commasep(what, end) { + function proceed(type) { + if (type == ",") return cont(what, proceed); + if (type == end) return cont(); + return cont(expect(end)); + } + return function(type) { + if (type == end) return cont(); + else return pass(what, proceed); + }; + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type) { + if (type == ":") return cont(typedef); + return pass(); + } + function typedef(type) { + if (type == "variable"){cx.marked = "variable-3"; return cont();} + return pass(); + } + function vardef1(type, value) { + if (type == "variable") { + register(value); + return isTS ? cont(maybetype, vardef2) : cont(vardef2); + } + return pass(); + } + function vardef2(type, value) { + if (value == "=") return cont(expression, vardef2); + if (type == ",") return cont(vardef1); + } + function forspec1(type) { + if (type == "var") return cont(vardef1, expect(";"), forspec2); + if (type == ";") return cont(forspec2); + if (type == "variable") return cont(formaybein); + return cont(forspec2); + } + function formaybein(_type, value) { + if (value == "in") return cont(expression); + return cont(maybeoperator, forspec2); + } + function forspec2(type, value) { + if (type == ";") return cont(forspec3); + if (value == "in") return cont(expression); + return cont(expression, expect(";"), forspec3); + } + function forspec3(type) { + if (type != ")") cont(expression); + } + function functiondef(type, value) { + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext); + } + function funarg(type, value) { + if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();} + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: jsTokenBase, + lastType: null, + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + globalVars: parserConfig.globalVars, + context: parserConfig.localVars && {vars: parserConfig.localVars}, + indented: 0 + }; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + } + if (stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == jsTokenComment) return CodeMirror.Pass; + if (state.tokenize != jsTokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; + if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? indentUnit : 0); + else if (lexical.info == "switch" && !closing) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricChars: ":{}", + + jsonMode: jsonMode + }; +}); + +CodeMirror.defineMIME("text/javascript", "javascript"); +CodeMirror.defineMIME("text/ecmascript", "javascript"); +CodeMirror.defineMIME("application/javascript", "javascript"); +CodeMirror.defineMIME("application/ecmascript", "javascript"); +CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); +CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); +CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); diff --git a/public/js/jquery.js b/public/js/jquery.js new file mode 100644 index 0000000..006e953 --- /dev/null +++ b/public/js/jquery.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
    a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
    t
    ",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
    ",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("