dawnscanner 1.2.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +4 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +19 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +8 -0
- data/Changelog.md +412 -0
- data/Gemfile +4 -0
- data/KnowledgeBase.md +213 -0
- data/LICENSE.txt +22 -0
- data/README.md +354 -0
- data/Rakefile +250 -0
- data/Roadmap.md +59 -0
- data/bin/dawn +210 -0
- data/certs/paolo_at_codesake_dot_com.pem +21 -0
- data/checksum/.placeholder +0 -0
- data/checksum/codesake-dawn-1.1.0.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.1.0.rc1.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.1.1.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.1.2.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.1.3.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.2.0.gem.sha512 +1 -0
- data/checksum/codesake-dawn-1.2.99.gem.sha512 +1 -0
- data/dawnscanner.gemspec +43 -0
- data/doc/codesake-dawn.yaml.sample +26 -0
- data/doc/dawn_1_0_announcement.md +139 -0
- data/doc/dawn_1_1_announcement.md +67 -0
- data/doc/dawn_1_2_announcement.md +69 -0
- data/features/dawn_complains_about_an_incorrect_command_line.feature.disabled +21 -0
- data/features/dawn_scan_a_secure_sinatra_app.feature.disabled +31 -0
- data/features/dawn_scan_a_vulnerable_sinatra_app.feature.disabled +36 -0
- data/features/step_definition/dawn_steps.rb +19 -0
- data/features/support/env.rb +1 -0
- data/lib/codesake-dawn.rb +12 -0
- data/lib/codesake/dawn/core.rb +175 -0
- data/lib/codesake/dawn/engine.rb +380 -0
- data/lib/codesake/dawn/gemfile_lock.rb +12 -0
- data/lib/codesake/dawn/kb/basic_check.rb +228 -0
- data/lib/codesake/dawn/kb/combo_check.rb +64 -0
- data/lib/codesake/dawn/kb/cve_2004_0755.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2004_0983.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2005_1992.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2005_2337.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2006_1931.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2006_2582.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2006_3694.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2006_4112.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2006_5467.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2006_6303.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2006_6852.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2006_6979.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2007_0469.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2007_5162.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2007_5379.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2007_5380.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2007_5770.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2007_6077.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2007_6612.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2008_1145.rb +40 -0
- data/lib/codesake/dawn/kb/cve_2008_1891.rb +40 -0
- data/lib/codesake/dawn/kb/cve_2008_2376.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2008_2662.rb +35 -0
- data/lib/codesake/dawn/kb/cve_2008_2663.rb +34 -0
- data/lib/codesake/dawn/kb/cve_2008_2664.rb +35 -0
- data/lib/codesake/dawn/kb/cve_2008_2725.rb +33 -0
- data/lib/codesake/dawn/kb/cve_2008_3655.rb +39 -0
- data/lib/codesake/dawn/kb/cve_2008_3657.rb +39 -0
- data/lib/codesake/dawn/kb/cve_2008_3790.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2008_3905.rb +38 -0
- data/lib/codesake/dawn/kb/cve_2008_4094.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2008_4310.rb +103 -0
- data/lib/codesake/dawn/kb/cve_2008_5189.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2008_7248.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2009_4078.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2009_4124.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2009_4214.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2010_1330.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2010_2489.rb +62 -0
- data/lib/codesake/dawn/kb/cve_2010_3933.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2011_0188.rb +69 -0
- data/lib/codesake/dawn/kb/cve_2011_0446.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_0447.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_0739.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_0995.rb +63 -0
- data/lib/codesake/dawn/kb/cve_2011_1004.rb +36 -0
- data/lib/codesake/dawn/kb/cve_2011_1005.rb +33 -0
- data/lib/codesake/dawn/kb/cve_2011_2197.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2011_2686.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2011_2705.rb +34 -0
- data/lib/codesake/dawn/kb/cve_2011_2929.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2011_2930.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_2931.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2011_2932.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2011_3009.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_3186.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2011_3187.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2011_4319.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2011_4815.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2011_5036.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2012_1098.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2012_1099.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_1241.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_2139.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2012_2140.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_2660.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2012_2661.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_2671.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2012_2694.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2012_2695.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_3424.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2012_3463.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_3464.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_3465.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2012_4464.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_4466.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_4481.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2012_4522.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_5370.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_5371.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_5380.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2012_6109.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2012_6134.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2012_6496.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2012_6497.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_0155.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_0156.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_0162.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_0175.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_0183.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_0184.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_0233.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_0256.rb +61 -0
- data/lib/codesake/dawn/kb/cve_2013_0262.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_0263.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_0269.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_0276.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_0277.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_0284.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_0285.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_0333.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_1607.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_1655.rb +67 -0
- data/lib/codesake/dawn/kb/cve_2013_1656.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_1756.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_1800.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_1801.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1802.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1812.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1821.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_1854.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_1855.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_1856.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_1857.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1875.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1898.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1911.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_1933.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1947.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_1948.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_2065.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_2090.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_2105.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_2119.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_2512.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_2513.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_2516.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_2615.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_2616.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_2617.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_3221.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_4164.rb +32 -0
- data/lib/codesake/dawn/kb/cve_2013_4203.rb +27 -0
- data/lib/codesake/dawn/kb/cve_2013_4389.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_4413.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_4457.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_4478.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_4479.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_4489.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_4491.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_4492.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_4562.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_4593.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2013_5647.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_5671.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2013_6414.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_6415.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_6416.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_6417.rb +31 -0
- data/lib/codesake/dawn/kb/cve_2013_6421.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_6459.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2013_6460.rb +55 -0
- data/lib/codesake/dawn/kb/cve_2013_6461.rb +59 -0
- data/lib/codesake/dawn/kb/cve_2013_7086.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2014_0036.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2014_0080.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2014_0081.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2014_0082.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2014_0130.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2014_1233.rb +29 -0
- data/lib/codesake/dawn/kb/cve_2014_1234.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2014_2322.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2014_2525.rb +61 -0
- data/lib/codesake/dawn/kb/cve_2014_2538.rb +28 -0
- data/lib/codesake/dawn/kb/cve_2014_3482.rb +30 -0
- data/lib/codesake/dawn/kb/cve_2014_3483.rb +29 -0
- data/lib/codesake/dawn/kb/dependency_check.rb +86 -0
- data/lib/codesake/dawn/kb/deprecation_check.rb +40 -0
- data/lib/codesake/dawn/kb/not_revised_code.rb +24 -0
- data/lib/codesake/dawn/kb/operating_system_check.rb +98 -0
- data/lib/codesake/dawn/kb/osvdb_105971.rb +31 -0
- data/lib/codesake/dawn/kb/osvdb_108530.rb +29 -0
- data/lib/codesake/dawn/kb/osvdb_108563.rb +30 -0
- data/lib/codesake/dawn/kb/osvdb_108569.rb +30 -0
- data/lib/codesake/dawn/kb/osvdb_108570.rb +29 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet.rb +41 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/check_for_backup_files.rb +22 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/check_for_safe_redirect_and_forward.rb +59 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/command_injection.rb +30 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/csrf.rb +31 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/mass_assignment_in_model.rb +35 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/security_related_headers.rb +38 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/sensitive_files.rb +31 -0
- data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/session_stored_in_database.rb +33 -0
- data/lib/codesake/dawn/kb/pattern_match_check.rb +129 -0
- data/lib/codesake/dawn/kb/ruby_version_check.rb +91 -0
- data/lib/codesake/dawn/kb/simpleform_xss_20131129.rb +30 -0
- data/lib/codesake/dawn/kb/version_check.rb +418 -0
- data/lib/codesake/dawn/knowledge_base.rb +513 -0
- data/lib/codesake/dawn/padrino.rb +82 -0
- data/lib/codesake/dawn/rails.rb +17 -0
- data/lib/codesake/dawn/railtie.rb +9 -0
- data/lib/codesake/dawn/reporter.rb +280 -0
- data/lib/codesake/dawn/sinatra.rb +129 -0
- data/lib/codesake/dawn/tasks.rb +27 -0
- data/lib/codesake/dawn/utils.rb +21 -0
- data/lib/codesake/dawn/version.rb +28 -0
- data/lib/tasks/codesake-dawn_tasks.rake +1 -0
- data/spec/lib/dawn/codesake_core_spec.rb +9 -0
- data/spec/lib/dawn/codesake_knowledgebase_spec.rb +940 -0
- data/spec/lib/dawn/codesake_padrino_engine_disabled.rb +45 -0
- data/spec/lib/dawn/codesake_rails_engine_disabled.rb +12 -0
- data/spec/lib/dawn/codesake_sinatra_engine_disabled.rb +128 -0
- data/spec/lib/kb/codesake_cve_2013_0175_spec.rb +35 -0
- data/spec/lib/kb/codesake_cve_2013_4457_spec.rb +41 -0
- data/spec/lib/kb/codesake_dependency_version_check_spec.rb +76 -0
- data/spec/lib/kb/codesake_deprecation_check_spec.rb +56 -0
- data/spec/lib/kb/codesake_ruby_version_check_spec.rb +40 -0
- data/spec/lib/kb/codesake_version_check_spec.rb +165 -0
- data/spec/lib/kb/cve_2011_2705_spec.rb +35 -0
- data/spec/lib/kb/cve_2011_2930_spec.rb +31 -0
- data/spec/lib/kb/cve_2011_3009_spec.rb +25 -0
- data/spec/lib/kb/cve_2011_3187_spec.rb +24 -0
- data/spec/lib/kb/cve_2011_4319_spec.rb +44 -0
- data/spec/lib/kb/cve_2011_5036_spec.rb +95 -0
- data/spec/lib/kb/cve_2012_1098_spec.rb +36 -0
- data/spec/lib/kb/cve_2012_2139_spec.rb +20 -0
- data/spec/lib/kb/cve_2012_2671_spec.rb +23 -0
- data/spec/lib/kb/cve_2012_6109_spec.rb +112 -0
- data/spec/lib/kb/cve_2013_0162_spec.rb +23 -0
- data/spec/lib/kb/cve_2013_0183_spec.rb +54 -0
- data/spec/lib/kb/cve_2013_0184_spec.rb +115 -0
- data/spec/lib/kb/cve_2013_0256_spec.rb +34 -0
- data/spec/lib/kb/cve_2013_0262_spec.rb +44 -0
- data/spec/lib/kb/cve_2013_0263_spec.rb +11 -0
- data/spec/lib/kb/cve_2013_1607_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_1655_spec.rb +31 -0
- data/spec/lib/kb/cve_2013_1756_spec.rb +23 -0
- data/spec/lib/kb/cve_2013_2090_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_2105_spec.rb +11 -0
- data/spec/lib/kb/cve_2013_2119_spec.rb +27 -0
- data/spec/lib/kb/cve_2013_2512_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_2513_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_2516_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_4203_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_4413_spec.rb +16 -0
- data/spec/lib/kb/cve_2013_4489_spec.rb +63 -0
- data/spec/lib/kb/cve_2013_4593_spec.rb +16 -0
- data/spec/lib/kb/cve_2013_5647_spec.rb +19 -0
- data/spec/lib/kb/cve_2013_5671_spec.rb +27 -0
- data/spec/lib/kb/cve_2013_6416_spec.rb +31 -0
- data/spec/lib/kb/cve_2013_6459_spec.rb +15 -0
- data/spec/lib/kb/cve_2013_7086_spec.rb +22 -0
- data/spec/lib/kb/cve_2014_0036_spec.rb +15 -0
- data/spec/lib/kb/cve_2014_0080_spec.rb +28 -0
- data/spec/lib/kb/cve_2014_0081_spec.rb +68 -0
- data/spec/lib/kb/cve_2014_0082_spec.rb +52 -0
- data/spec/lib/kb/cve_2014_0130_spec.rb +19 -0
- data/spec/lib/kb/cve_2014_1233_spec.rb +15 -0
- data/spec/lib/kb/cve_2014_1234_spec.rb +16 -0
- data/spec/lib/kb/cve_2014_2322_spec.rb +15 -0
- data/spec/lib/kb/cve_2014_2538_spec.rb +15 -0
- data/spec/lib/kb/cve_2014_3482_spec.rb +15 -0
- data/spec/lib/kb/cve_2014_3483_spec.rb +23 -0
- data/spec/lib/kb/osvdb_105971_spec.rb +15 -0
- data/spec/lib/kb/osvdb_108530_spec.rb +22 -0
- data/spec/lib/kb/osvdb_108563_spec.rb +18 -0
- data/spec/lib/kb/osvdb_108569_spec.rb +17 -0
- data/spec/lib/kb/osvdb_108570_spec.rb +17 -0
- data/spec/lib/kb/owasp_ror_cheatsheet_disabled.rb +56 -0
- data/spec/spec_helper.rb +11 -0
- data/support/bootstrap.js +2027 -0
- data/support/bootstrap.min.css +9 -0
- data/support/codesake.css +63 -0
- metadata +659 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The CVE-2014-1234 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::CVE_2014_1234.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "is reported when a paratrooper-newrelic gem version 1.0.1 is detected" do
|
|
9
|
+
@check.dependencies = [{:name=>"paratrooper-newrelic", :version=>"1.0.1"}]
|
|
10
|
+
@check.vuln?.should be_true
|
|
11
|
+
end
|
|
12
|
+
it "is not reported when a paratrooper-newrelic gem version 1.0.2 is detected" do
|
|
13
|
+
@check.dependencies = [{:name=>"paratrooper-newrelic", :version=>"1.0.2"}]
|
|
14
|
+
@check.vuln?.should be_false
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The CVE-2014-2322 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::CVE_2014_2322.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable arabic prawn gem version is found (0.0.1)" do
|
|
8
|
+
@check.dependencies = [{:name=>"Arabic-Prawn", :version=>'0.0.1'}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a sage vulnerable arabic prawn gem version is found (0.0.2)" do
|
|
12
|
+
@check.dependencies = [{:name=>"Arabic-Prawn", :version=>'0.0.2'}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The CVE-2014-2538 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::CVE_2014_2538.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when rack-ssl vulnerable version it has been found (1.3.9)" do
|
|
8
|
+
@check.dependencies = [{:name=>'rack-ssl', :version=>'1.3.9'}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is reported when rack-ssl not vulnerable version it has been found (1.4.0)" do
|
|
12
|
+
@check.dependencies = [{:name=>'rack-ssl', :version=>'1.4.0'}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The CVE-2014-3482 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::CVE_2014_3482.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable version it has been found (3.2.18)" do
|
|
8
|
+
@check.dependencies = [{:name=>"rails", :version=>"3.2.18"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a safe version it has been found (3.2.19)" do
|
|
12
|
+
@check.dependencies = [{:name=>"rails", :version=>"3.2.19"}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The CVE-2014-3483 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::CVE_2014_3483.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a rails gem version 4.0.6 is detected" do
|
|
8
|
+
@check.dependencies = [{:name=>"rails", :version=>"4.0.6"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is reported when a rails gem version 4.1.2 is detected" do
|
|
12
|
+
@check.dependencies = [{:name=>"rails", :version=>"4.1.2"}]
|
|
13
|
+
@check.vuln?.should be_true
|
|
14
|
+
end
|
|
15
|
+
it "is not reported when a rails gem version 4.0.7 is detected" do
|
|
16
|
+
@check.dependencies = [{:name=>"rails", :version=>"4.0.7"}]
|
|
17
|
+
@check.vuln?.should be_false
|
|
18
|
+
end
|
|
19
|
+
it "is not reported when a rails gem version 4.1.3 is detected" do
|
|
20
|
+
@check.dependencies = [{:name=>"rails", :version=>"4.1.3"}]
|
|
21
|
+
@check.vuln?.should be_false
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The OSVDB_105971 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::OSVDB_105971.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable version it has been found (0.4.14)" do
|
|
8
|
+
@check.dependencies = [{:name=>"sfpagent", :version=>"0.4.14"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a safe version it has been found (0.4.15)" do
|
|
12
|
+
@check.dependencies = [{:name=>"sfpagent", :version=>"0.4.15"}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The OSVDB-108530 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::OSVDB_108530.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable version it has been found (1.0.3.rc2)" do
|
|
8
|
+
@check.dependencies = [{:name=>"kajam", :version=>"1.0.3.rc2"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a safe version it has been found (1.0.3)" do
|
|
12
|
+
@check.dependencies = [{:name=>"kajam", :version=>"1.0.3"}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
it "is not reported when a safe version it has been found (1.0.4)" do
|
|
16
|
+
@check.dependencies = [{:name=>"kajam", :version=>"1.0.4"}]
|
|
17
|
+
@check.vuln?.should be_false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "must be filled with CVE identifier"
|
|
21
|
+
it "must be filled with CVSS information"
|
|
22
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The OSVDB-108563 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::OSVDB_108563.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it "is reported when a vulnerable version it has been found (1.0.0)" do
|
|
9
|
+
@check.dependencies = [{:name=>"gyazo", :version=>"1.0.0"}]
|
|
10
|
+
@check.vuln?.should be_true
|
|
11
|
+
end
|
|
12
|
+
it "is not reported when a safe version it has been found (0.4.15)" do
|
|
13
|
+
@check.dependencies = [{:name=>"gyazo", :version=>"1.0.1"}]
|
|
14
|
+
@check.vuln?.should be_false
|
|
15
|
+
end
|
|
16
|
+
it "must be filled with CVE identifier"
|
|
17
|
+
it "must be filled with CVSS information"
|
|
18
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The OSVDB-108569 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::OSVDB_108569.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable backup_checksum gem version it has been found (3.0.23)" do
|
|
8
|
+
@check.dependencies = [{:name=>"backup_checksum", :version=>"3.0.23"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a safe backup_checksum gem version it has been found (3.0.24)" do
|
|
12
|
+
@check.dependencies = [{:name=>"backup_checksum", :version=>"3.0.24"}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
it "must be filled with CVE identifier"
|
|
16
|
+
it "must be filled with CVSS information"
|
|
17
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe "The OSVDB-108570 vulnerability" do
|
|
3
|
+
before(:all) do
|
|
4
|
+
@check = Codesake::Dawn::Kb::OSVDB_108570.new
|
|
5
|
+
# @check.debug = true
|
|
6
|
+
end
|
|
7
|
+
it "is reported when a vulnerable version it has been found (3.0.23)" do
|
|
8
|
+
@check.dependencies = [{:name=>"backup_checksum", :version=>"3.0.23"}]
|
|
9
|
+
@check.vuln?.should be_true
|
|
10
|
+
end
|
|
11
|
+
it "is not reported when a safe version it has been found (0.4.15)" do
|
|
12
|
+
@check.dependencies = [{:name=>"backup_checksum", :version=>"3.0.24"}]
|
|
13
|
+
@check.vuln?.should be_false
|
|
14
|
+
end
|
|
15
|
+
it "must be filled with CVE identifier"
|
|
16
|
+
it "must be filled with CVSS information"
|
|
17
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "The OWASP Ruby on Rails cheatsheet" do
|
|
4
|
+
|
|
5
|
+
before(:all) do
|
|
6
|
+
@engine = Codesake::Dawn::Rails.new("./spec/support/hello_world_3.2.13")
|
|
7
|
+
@applied = @engine.apply("Owasp Ror Cheatsheet")
|
|
8
|
+
owasp_ror = @engine.find_vulnerability_by_name("Owasp Ror Cheatsheet") if @applied
|
|
9
|
+
@vc = []
|
|
10
|
+
@vc = owasp_ror[:vulnerable_checks] unless owasp_ror.nil?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "is correctly applied" do
|
|
14
|
+
@applied.should be_true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "fires up vulnerabilities" do
|
|
18
|
+
@engine.is_vulnerable_to?("Owasp Ror Cheatsheet").should be_true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "says that running operating system commands from a ruby app can be dangerous" do
|
|
22
|
+
ev = @engine.vulnerabilities[0][:vulnerable_checks][0].evidences
|
|
23
|
+
@engine.vulnerabilities[0][:vulnerable_checks][0].should be_an_instance_of(Codesake::Dawn::Kb::OwaspRorCheatSheet::CommandInjection)
|
|
24
|
+
ev[0][:filename].should == "./spec/support/hello_world_3.2.13/app/helpers/application_helper.rb"
|
|
25
|
+
ev[0][:matches].count.should == 4
|
|
26
|
+
ev[0][:matches].should =~ [{:match=>" eval(command)\n", :line=>4}, {:match=>" System(command)\n", :line=>5}, {:match=>" `\#{command}`\n", :line=>6}, {:match=>" Kernel.exec(command)\n", :line=>7}]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "says that methods fetching data must validate parameters form request"
|
|
30
|
+
it "says that applications must filter data to avoid XSS"
|
|
31
|
+
it "says that applications must tune session cookies to have them to expire or to store them in a database" do
|
|
32
|
+
sessions = Codesake::Dawn::Kb::ComboCheck.find_vulnerable_checks_by_class(@vc, Codesake::Dawn::Kb::OwaspRorCheatSheet::SessionStoredInDatabase)
|
|
33
|
+
sessions.should be_nil
|
|
34
|
+
end
|
|
35
|
+
it "says that applications must tune devise parameters"
|
|
36
|
+
it "says that you have to implement some access control to your REST code (e.g. using cancan)"
|
|
37
|
+
it "says that protect_from_forgery must be enabled" do
|
|
38
|
+
forgery = Codesake::Dawn::Kb::ComboCheck.find_vulnerable_checks_by_class(@vc, Codesake::Dawn::Kb::OwaspRorCheatSheet::Csrf)
|
|
39
|
+
forgery.should be_nil
|
|
40
|
+
end
|
|
41
|
+
it "says that your models must take care about not declaring attr_accessor fields to avoid mass assignements" do
|
|
42
|
+
mass_assignment = Codesake::Dawn::Kb::ComboCheck.find_vulnerable_checks_by_class(@vc, Codesake::Dawn::Kb::OwaspRorCheatSheet::MassAssignmentInModel)
|
|
43
|
+
mass_assignment.should_not be_nil
|
|
44
|
+
end
|
|
45
|
+
it "says redirect_to calls in your code must use only_path=true param that lets your code to be safe against forceful browsing"
|
|
46
|
+
it "says that pages passed to render call must not under the user control"
|
|
47
|
+
it "says that applications must implement the same-origin control when handling data"
|
|
48
|
+
it "says that applications must use HTTP headers designed for security" do
|
|
49
|
+
headers = Codesake::Dawn::Kb::ComboCheck.find_vulnerable_checks_by_class(@vc, Codesake::Dawn::Kb::OwaspRorCheatSheet::SecurityRelatedHeaders)
|
|
50
|
+
headers.should_not be_nil
|
|
51
|
+
end
|
|
52
|
+
it "says that you have to perform code reviews to avoid business logic faults. Using codesake dawn is great :-)"
|
|
53
|
+
it "says that you have to manually check your routes to avoid a widespread attack surface."
|
|
54
|
+
it "says that you must not implement your own encryption code, and in case of devise usage using 10 stretches for production is good"
|
|
55
|
+
|
|
56
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,2027 @@
|
|
|
1
|
+
/* ===================================================
|
|
2
|
+
* bootstrap-transition.js v2.1.1
|
|
3
|
+
* http://twitter.github.com/bootstrap/javascript.html#transitions
|
|
4
|
+
* ===================================================
|
|
5
|
+
* Copyright 2012 Twitter, Inc.
|
|
6
|
+
*
|
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
* you may not use this file except in compliance with the License.
|
|
9
|
+
* You may obtain a copy of the License at
|
|
10
|
+
*
|
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
*
|
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
* See the License for the specific language governing permissions and
|
|
17
|
+
* limitations under the License.
|
|
18
|
+
* ========================================================== */
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
!function ($) {
|
|
22
|
+
|
|
23
|
+
$(function () {
|
|
24
|
+
|
|
25
|
+
"use strict"; // jshint ;_;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
|
|
29
|
+
* ======================================================= */
|
|
30
|
+
|
|
31
|
+
$.support.transition = (function () {
|
|
32
|
+
|
|
33
|
+
var transitionEnd = (function () {
|
|
34
|
+
|
|
35
|
+
var el = document.createElement('bootstrap')
|
|
36
|
+
, transEndEventNames = {
|
|
37
|
+
'WebkitTransition' : 'webkitTransitionEnd'
|
|
38
|
+
, 'MozTransition' : 'transitionend'
|
|
39
|
+
, 'OTransition' : 'oTransitionEnd otransitionend'
|
|
40
|
+
, 'transition' : 'transitionend'
|
|
41
|
+
}
|
|
42
|
+
, name
|
|
43
|
+
|
|
44
|
+
for (name in transEndEventNames){
|
|
45
|
+
if (el.style[name] !== undefined) {
|
|
46
|
+
return transEndEventNames[name]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
}())
|
|
51
|
+
|
|
52
|
+
return transitionEnd && {
|
|
53
|
+
end: transitionEnd
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
})()
|
|
57
|
+
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
}(window.jQuery);/* ==========================================================
|
|
61
|
+
* bootstrap-alert.js v2.1.1
|
|
62
|
+
* http://twitter.github.com/bootstrap/javascript.html#alerts
|
|
63
|
+
* ==========================================================
|
|
64
|
+
* Copyright 2012 Twitter, Inc.
|
|
65
|
+
*
|
|
66
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
67
|
+
* you may not use this file except in compliance with the License.
|
|
68
|
+
* You may obtain a copy of the License at
|
|
69
|
+
*
|
|
70
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
71
|
+
*
|
|
72
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
73
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
74
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
75
|
+
* See the License for the specific language governing permissions and
|
|
76
|
+
* limitations under the License.
|
|
77
|
+
* ========================================================== */
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
!function ($) {
|
|
81
|
+
|
|
82
|
+
"use strict"; // jshint ;_;
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
/* ALERT CLASS DEFINITION
|
|
86
|
+
* ====================== */
|
|
87
|
+
|
|
88
|
+
var dismiss = '[data-dismiss="alert"]'
|
|
89
|
+
, Alert = function (el) {
|
|
90
|
+
$(el).on('click', dismiss, this.close)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
Alert.prototype.close = function (e) {
|
|
94
|
+
var $this = $(this)
|
|
95
|
+
, selector = $this.attr('data-target')
|
|
96
|
+
, $parent
|
|
97
|
+
|
|
98
|
+
if (!selector) {
|
|
99
|
+
selector = $this.attr('href')
|
|
100
|
+
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
$parent = $(selector)
|
|
104
|
+
|
|
105
|
+
e && e.preventDefault()
|
|
106
|
+
|
|
107
|
+
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
|
|
108
|
+
|
|
109
|
+
$parent.trigger(e = $.Event('close'))
|
|
110
|
+
|
|
111
|
+
if (e.isDefaultPrevented()) return
|
|
112
|
+
|
|
113
|
+
$parent.removeClass('in')
|
|
114
|
+
|
|
115
|
+
function removeElement() {
|
|
116
|
+
$parent
|
|
117
|
+
.trigger('closed')
|
|
118
|
+
.remove()
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
$.support.transition && $parent.hasClass('fade') ?
|
|
122
|
+
$parent.on($.support.transition.end, removeElement) :
|
|
123
|
+
removeElement()
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
/* ALERT PLUGIN DEFINITION
|
|
128
|
+
* ======================= */
|
|
129
|
+
|
|
130
|
+
$.fn.alert = function (option) {
|
|
131
|
+
return this.each(function () {
|
|
132
|
+
var $this = $(this)
|
|
133
|
+
, data = $this.data('alert')
|
|
134
|
+
if (!data) $this.data('alert', (data = new Alert(this)))
|
|
135
|
+
if (typeof option == 'string') data[option].call($this)
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
$.fn.alert.Constructor = Alert
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
/* ALERT DATA-API
|
|
143
|
+
* ============== */
|
|
144
|
+
|
|
145
|
+
$(function () {
|
|
146
|
+
$('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
}(window.jQuery);/* ============================================================
|
|
150
|
+
* bootstrap-button.js v2.1.1
|
|
151
|
+
* http://twitter.github.com/bootstrap/javascript.html#buttons
|
|
152
|
+
* ============================================================
|
|
153
|
+
* Copyright 2012 Twitter, Inc.
|
|
154
|
+
*
|
|
155
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
156
|
+
* you may not use this file except in compliance with the License.
|
|
157
|
+
* You may obtain a copy of the License at
|
|
158
|
+
*
|
|
159
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
160
|
+
*
|
|
161
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
162
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
163
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
164
|
+
* See the License for the specific language governing permissions and
|
|
165
|
+
* limitations under the License.
|
|
166
|
+
* ============================================================ */
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
!function ($) {
|
|
170
|
+
|
|
171
|
+
"use strict"; // jshint ;_;
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
/* BUTTON PUBLIC CLASS DEFINITION
|
|
175
|
+
* ============================== */
|
|
176
|
+
|
|
177
|
+
var Button = function (element, options) {
|
|
178
|
+
this.$element = $(element)
|
|
179
|
+
this.options = $.extend({}, $.fn.button.defaults, options)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
Button.prototype.setState = function (state) {
|
|
183
|
+
var d = 'disabled'
|
|
184
|
+
, $el = this.$element
|
|
185
|
+
, data = $el.data()
|
|
186
|
+
, val = $el.is('input') ? 'val' : 'html'
|
|
187
|
+
|
|
188
|
+
state = state + 'Text'
|
|
189
|
+
data.resetText || $el.data('resetText', $el[val]())
|
|
190
|
+
|
|
191
|
+
$el[val](data[state] || this.options[state])
|
|
192
|
+
|
|
193
|
+
// push to event loop to allow forms to submit
|
|
194
|
+
setTimeout(function () {
|
|
195
|
+
state == 'loadingText' ?
|
|
196
|
+
$el.addClass(d).attr(d, d) :
|
|
197
|
+
$el.removeClass(d).removeAttr(d)
|
|
198
|
+
}, 0)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
Button.prototype.toggle = function () {
|
|
202
|
+
var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
|
|
203
|
+
|
|
204
|
+
$parent && $parent
|
|
205
|
+
.find('.active')
|
|
206
|
+
.removeClass('active')
|
|
207
|
+
|
|
208
|
+
this.$element.toggleClass('active')
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
/* BUTTON PLUGIN DEFINITION
|
|
213
|
+
* ======================== */
|
|
214
|
+
|
|
215
|
+
$.fn.button = function (option) {
|
|
216
|
+
return this.each(function () {
|
|
217
|
+
var $this = $(this)
|
|
218
|
+
, data = $this.data('button')
|
|
219
|
+
, options = typeof option == 'object' && option
|
|
220
|
+
if (!data) $this.data('button', (data = new Button(this, options)))
|
|
221
|
+
if (option == 'toggle') data.toggle()
|
|
222
|
+
else if (option) data.setState(option)
|
|
223
|
+
})
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
$.fn.button.defaults = {
|
|
227
|
+
loadingText: 'loading...'
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
$.fn.button.Constructor = Button
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
/* BUTTON DATA-API
|
|
234
|
+
* =============== */
|
|
235
|
+
|
|
236
|
+
$(function () {
|
|
237
|
+
$('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
|
|
238
|
+
var $btn = $(e.target)
|
|
239
|
+
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
|
|
240
|
+
$btn.button('toggle')
|
|
241
|
+
})
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
}(window.jQuery);/* ==========================================================
|
|
245
|
+
* bootstrap-carousel.js v2.1.1
|
|
246
|
+
* http://twitter.github.com/bootstrap/javascript.html#carousel
|
|
247
|
+
* ==========================================================
|
|
248
|
+
* Copyright 2012 Twitter, Inc.
|
|
249
|
+
*
|
|
250
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
251
|
+
* you may not use this file except in compliance with the License.
|
|
252
|
+
* You may obtain a copy of the License at
|
|
253
|
+
*
|
|
254
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
255
|
+
*
|
|
256
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
257
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
258
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
259
|
+
* See the License for the specific language governing permissions and
|
|
260
|
+
* limitations under the License.
|
|
261
|
+
* ========================================================== */
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
!function ($) {
|
|
265
|
+
|
|
266
|
+
"use strict"; // jshint ;_;
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
/* CAROUSEL CLASS DEFINITION
|
|
270
|
+
* ========================= */
|
|
271
|
+
|
|
272
|
+
var Carousel = function (element, options) {
|
|
273
|
+
this.$element = $(element)
|
|
274
|
+
this.options = options
|
|
275
|
+
this.options.slide && this.slide(this.options.slide)
|
|
276
|
+
this.options.pause == 'hover' && this.$element
|
|
277
|
+
.on('mouseenter', $.proxy(this.pause, this))
|
|
278
|
+
.on('mouseleave', $.proxy(this.cycle, this))
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
Carousel.prototype = {
|
|
282
|
+
|
|
283
|
+
cycle: function (e) {
|
|
284
|
+
if (!e) this.paused = false
|
|
285
|
+
this.options.interval
|
|
286
|
+
&& !this.paused
|
|
287
|
+
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
|
|
288
|
+
return this
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
, to: function (pos) {
|
|
292
|
+
var $active = this.$element.find('.item.active')
|
|
293
|
+
, children = $active.parent().children()
|
|
294
|
+
, activePos = children.index($active)
|
|
295
|
+
, that = this
|
|
296
|
+
|
|
297
|
+
if (pos > (children.length - 1) || pos < 0) return
|
|
298
|
+
|
|
299
|
+
if (this.sliding) {
|
|
300
|
+
return this.$element.one('slid', function () {
|
|
301
|
+
that.to(pos)
|
|
302
|
+
})
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (activePos == pos) {
|
|
306
|
+
return this.pause().cycle()
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
, pause: function (e) {
|
|
313
|
+
if (!e) this.paused = true
|
|
314
|
+
if (this.$element.find('.next, .prev').length && $.support.transition.end) {
|
|
315
|
+
this.$element.trigger($.support.transition.end)
|
|
316
|
+
this.cycle()
|
|
317
|
+
}
|
|
318
|
+
clearInterval(this.interval)
|
|
319
|
+
this.interval = null
|
|
320
|
+
return this
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
, next: function () {
|
|
324
|
+
if (this.sliding) return
|
|
325
|
+
return this.slide('next')
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
, prev: function () {
|
|
329
|
+
if (this.sliding) return
|
|
330
|
+
return this.slide('prev')
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
, slide: function (type, next) {
|
|
334
|
+
var $active = this.$element.find('.item.active')
|
|
335
|
+
, $next = next || $active[type]()
|
|
336
|
+
, isCycling = this.interval
|
|
337
|
+
, direction = type == 'next' ? 'left' : 'right'
|
|
338
|
+
, fallback = type == 'next' ? 'first' : 'last'
|
|
339
|
+
, that = this
|
|
340
|
+
, e = $.Event('slide', {
|
|
341
|
+
relatedTarget: $next[0]
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
this.sliding = true
|
|
345
|
+
|
|
346
|
+
isCycling && this.pause()
|
|
347
|
+
|
|
348
|
+
$next = $next.length ? $next : this.$element.find('.item')[fallback]()
|
|
349
|
+
|
|
350
|
+
if ($next.hasClass('active')) return
|
|
351
|
+
|
|
352
|
+
if ($.support.transition && this.$element.hasClass('slide')) {
|
|
353
|
+
this.$element.trigger(e)
|
|
354
|
+
if (e.isDefaultPrevented()) return
|
|
355
|
+
$next.addClass(type)
|
|
356
|
+
$next[0].offsetWidth // force reflow
|
|
357
|
+
$active.addClass(direction)
|
|
358
|
+
$next.addClass(direction)
|
|
359
|
+
this.$element.one($.support.transition.end, function () {
|
|
360
|
+
$next.removeClass([type, direction].join(' ')).addClass('active')
|
|
361
|
+
$active.removeClass(['active', direction].join(' '))
|
|
362
|
+
that.sliding = false
|
|
363
|
+
setTimeout(function () { that.$element.trigger('slid') }, 0)
|
|
364
|
+
})
|
|
365
|
+
} else {
|
|
366
|
+
this.$element.trigger(e)
|
|
367
|
+
if (e.isDefaultPrevented()) return
|
|
368
|
+
$active.removeClass('active')
|
|
369
|
+
$next.addClass('active')
|
|
370
|
+
this.sliding = false
|
|
371
|
+
this.$element.trigger('slid')
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
isCycling && this.cycle()
|
|
375
|
+
|
|
376
|
+
return this
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
/* CAROUSEL PLUGIN DEFINITION
|
|
383
|
+
* ========================== */
|
|
384
|
+
|
|
385
|
+
$.fn.carousel = function (option) {
|
|
386
|
+
return this.each(function () {
|
|
387
|
+
var $this = $(this)
|
|
388
|
+
, data = $this.data('carousel')
|
|
389
|
+
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
|
|
390
|
+
, action = typeof option == 'string' ? option : options.slide
|
|
391
|
+
if (!data) $this.data('carousel', (data = new Carousel(this, options)))
|
|
392
|
+
if (typeof option == 'number') data.to(option)
|
|
393
|
+
else if (action) data[action]()
|
|
394
|
+
else if (options.interval) data.cycle()
|
|
395
|
+
})
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
$.fn.carousel.defaults = {
|
|
399
|
+
interval: 5000
|
|
400
|
+
, pause: 'hover'
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
$.fn.carousel.Constructor = Carousel
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
/* CAROUSEL DATA-API
|
|
407
|
+
* ================= */
|
|
408
|
+
|
|
409
|
+
$(function () {
|
|
410
|
+
$('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
|
|
411
|
+
var $this = $(this), href
|
|
412
|
+
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
|
413
|
+
, options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
|
|
414
|
+
$target.carousel(options)
|
|
415
|
+
e.preventDefault()
|
|
416
|
+
})
|
|
417
|
+
})
|
|
418
|
+
|
|
419
|
+
}(window.jQuery);/* =============================================================
|
|
420
|
+
* bootstrap-collapse.js v2.1.1
|
|
421
|
+
* http://twitter.github.com/bootstrap/javascript.html#collapse
|
|
422
|
+
* =============================================================
|
|
423
|
+
* Copyright 2012 Twitter, Inc.
|
|
424
|
+
*
|
|
425
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
426
|
+
* you may not use this file except in compliance with the License.
|
|
427
|
+
* You may obtain a copy of the License at
|
|
428
|
+
*
|
|
429
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
430
|
+
*
|
|
431
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
432
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
433
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
434
|
+
* See the License for the specific language governing permissions and
|
|
435
|
+
* limitations under the License.
|
|
436
|
+
* ============================================================ */
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
!function ($) {
|
|
440
|
+
|
|
441
|
+
"use strict"; // jshint ;_;
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
/* COLLAPSE PUBLIC CLASS DEFINITION
|
|
445
|
+
* ================================ */
|
|
446
|
+
|
|
447
|
+
var Collapse = function (element, options) {
|
|
448
|
+
this.$element = $(element)
|
|
449
|
+
this.options = $.extend({}, $.fn.collapse.defaults, options)
|
|
450
|
+
|
|
451
|
+
if (this.options.parent) {
|
|
452
|
+
this.$parent = $(this.options.parent)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
this.options.toggle && this.toggle()
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
Collapse.prototype = {
|
|
459
|
+
|
|
460
|
+
constructor: Collapse
|
|
461
|
+
|
|
462
|
+
, dimension: function () {
|
|
463
|
+
var hasWidth = this.$element.hasClass('width')
|
|
464
|
+
return hasWidth ? 'width' : 'height'
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
, show: function () {
|
|
468
|
+
var dimension
|
|
469
|
+
, scroll
|
|
470
|
+
, actives
|
|
471
|
+
, hasData
|
|
472
|
+
|
|
473
|
+
if (this.transitioning) return
|
|
474
|
+
|
|
475
|
+
dimension = this.dimension()
|
|
476
|
+
scroll = $.camelCase(['scroll', dimension].join('-'))
|
|
477
|
+
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
|
|
478
|
+
|
|
479
|
+
if (actives && actives.length) {
|
|
480
|
+
hasData = actives.data('collapse')
|
|
481
|
+
if (hasData && hasData.transitioning) return
|
|
482
|
+
actives.collapse('hide')
|
|
483
|
+
hasData || actives.data('collapse', null)
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
this.$element[dimension](0)
|
|
487
|
+
this.transition('addClass', $.Event('show'), 'shown')
|
|
488
|
+
$.support.transition && this.$element[dimension](this.$element[0][scroll])
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
, hide: function () {
|
|
492
|
+
var dimension
|
|
493
|
+
if (this.transitioning) return
|
|
494
|
+
dimension = this.dimension()
|
|
495
|
+
this.reset(this.$element[dimension]())
|
|
496
|
+
this.transition('removeClass', $.Event('hide'), 'hidden')
|
|
497
|
+
this.$element[dimension](0)
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
, reset: function (size) {
|
|
501
|
+
var dimension = this.dimension()
|
|
502
|
+
|
|
503
|
+
this.$element
|
|
504
|
+
.removeClass('collapse')
|
|
505
|
+
[dimension](size || 'auto')
|
|
506
|
+
[0].offsetWidth
|
|
507
|
+
|
|
508
|
+
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
|
|
509
|
+
|
|
510
|
+
return this
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
, transition: function (method, startEvent, completeEvent) {
|
|
514
|
+
var that = this
|
|
515
|
+
, complete = function () {
|
|
516
|
+
if (startEvent.type == 'show') that.reset()
|
|
517
|
+
that.transitioning = 0
|
|
518
|
+
that.$element.trigger(completeEvent)
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
this.$element.trigger(startEvent)
|
|
522
|
+
|
|
523
|
+
if (startEvent.isDefaultPrevented()) return
|
|
524
|
+
|
|
525
|
+
this.transitioning = 1
|
|
526
|
+
|
|
527
|
+
this.$element[method]('in')
|
|
528
|
+
|
|
529
|
+
$.support.transition && this.$element.hasClass('collapse') ?
|
|
530
|
+
this.$element.one($.support.transition.end, complete) :
|
|
531
|
+
complete()
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
, toggle: function () {
|
|
535
|
+
this[this.$element.hasClass('in') ? 'hide' : 'show']()
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
/* COLLAPSIBLE PLUGIN DEFINITION
|
|
542
|
+
* ============================== */
|
|
543
|
+
|
|
544
|
+
$.fn.collapse = function (option) {
|
|
545
|
+
return this.each(function () {
|
|
546
|
+
var $this = $(this)
|
|
547
|
+
, data = $this.data('collapse')
|
|
548
|
+
, options = typeof option == 'object' && option
|
|
549
|
+
if (!data) $this.data('collapse', (data = new Collapse(this, options)))
|
|
550
|
+
if (typeof option == 'string') data[option]()
|
|
551
|
+
})
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
$.fn.collapse.defaults = {
|
|
555
|
+
toggle: true
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
$.fn.collapse.Constructor = Collapse
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
/* COLLAPSIBLE DATA-API
|
|
562
|
+
* ==================== */
|
|
563
|
+
|
|
564
|
+
$(function () {
|
|
565
|
+
$('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
|
|
566
|
+
var $this = $(this), href
|
|
567
|
+
, target = $this.attr('data-target')
|
|
568
|
+
|| e.preventDefault()
|
|
569
|
+
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|
|
570
|
+
, option = $(target).data('collapse') ? 'toggle' : $this.data()
|
|
571
|
+
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
|
|
572
|
+
$(target).collapse(option)
|
|
573
|
+
})
|
|
574
|
+
})
|
|
575
|
+
|
|
576
|
+
}(window.jQuery);/* ============================================================
|
|
577
|
+
* bootstrap-dropdown.js v2.1.1
|
|
578
|
+
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
|
|
579
|
+
* ============================================================
|
|
580
|
+
* Copyright 2012 Twitter, Inc.
|
|
581
|
+
*
|
|
582
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
583
|
+
* you may not use this file except in compliance with the License.
|
|
584
|
+
* You may obtain a copy of the License at
|
|
585
|
+
*
|
|
586
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
587
|
+
*
|
|
588
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
589
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
590
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
591
|
+
* See the License for the specific language governing permissions and
|
|
592
|
+
* limitations under the License.
|
|
593
|
+
* ============================================================ */
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
!function ($) {
|
|
597
|
+
|
|
598
|
+
"use strict"; // jshint ;_;
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
/* DROPDOWN CLASS DEFINITION
|
|
602
|
+
* ========================= */
|
|
603
|
+
|
|
604
|
+
var toggle = '[data-toggle=dropdown]'
|
|
605
|
+
, Dropdown = function (element) {
|
|
606
|
+
var $el = $(element).on('click.dropdown.data-api', this.toggle)
|
|
607
|
+
$('html').on('click.dropdown.data-api', function () {
|
|
608
|
+
$el.parent().removeClass('open')
|
|
609
|
+
})
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
Dropdown.prototype = {
|
|
613
|
+
|
|
614
|
+
constructor: Dropdown
|
|
615
|
+
|
|
616
|
+
, toggle: function (e) {
|
|
617
|
+
var $this = $(this)
|
|
618
|
+
, $parent
|
|
619
|
+
, isActive
|
|
620
|
+
|
|
621
|
+
if ($this.is('.disabled, :disabled')) return
|
|
622
|
+
|
|
623
|
+
$parent = getParent($this)
|
|
624
|
+
|
|
625
|
+
isActive = $parent.hasClass('open')
|
|
626
|
+
|
|
627
|
+
clearMenus()
|
|
628
|
+
|
|
629
|
+
if (!isActive) {
|
|
630
|
+
$parent.toggleClass('open')
|
|
631
|
+
$this.focus()
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return false
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
, keydown: function (e) {
|
|
638
|
+
var $this
|
|
639
|
+
, $items
|
|
640
|
+
, $active
|
|
641
|
+
, $parent
|
|
642
|
+
, isActive
|
|
643
|
+
, index
|
|
644
|
+
|
|
645
|
+
if (!/(38|40|27)/.test(e.keyCode)) return
|
|
646
|
+
|
|
647
|
+
$this = $(this)
|
|
648
|
+
|
|
649
|
+
e.preventDefault()
|
|
650
|
+
e.stopPropagation()
|
|
651
|
+
|
|
652
|
+
if ($this.is('.disabled, :disabled')) return
|
|
653
|
+
|
|
654
|
+
$parent = getParent($this)
|
|
655
|
+
|
|
656
|
+
isActive = $parent.hasClass('open')
|
|
657
|
+
|
|
658
|
+
if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
|
|
659
|
+
|
|
660
|
+
$items = $('[role=menu] li:not(.divider) a', $parent)
|
|
661
|
+
|
|
662
|
+
if (!$items.length) return
|
|
663
|
+
|
|
664
|
+
index = $items.index($items.filter(':focus'))
|
|
665
|
+
|
|
666
|
+
if (e.keyCode == 38 && index > 0) index-- // up
|
|
667
|
+
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
|
|
668
|
+
if (!~index) index = 0
|
|
669
|
+
|
|
670
|
+
$items
|
|
671
|
+
.eq(index)
|
|
672
|
+
.focus()
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
function clearMenus() {
|
|
678
|
+
getParent($(toggle))
|
|
679
|
+
.removeClass('open')
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
function getParent($this) {
|
|
683
|
+
var selector = $this.attr('data-target')
|
|
684
|
+
, $parent
|
|
685
|
+
|
|
686
|
+
if (!selector) {
|
|
687
|
+
selector = $this.attr('href')
|
|
688
|
+
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
$parent = $(selector)
|
|
692
|
+
$parent.length || ($parent = $this.parent())
|
|
693
|
+
|
|
694
|
+
return $parent
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
/* DROPDOWN PLUGIN DEFINITION
|
|
699
|
+
* ========================== */
|
|
700
|
+
|
|
701
|
+
$.fn.dropdown = function (option) {
|
|
702
|
+
return this.each(function () {
|
|
703
|
+
var $this = $(this)
|
|
704
|
+
, data = $this.data('dropdown')
|
|
705
|
+
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
|
|
706
|
+
if (typeof option == 'string') data[option].call($this)
|
|
707
|
+
})
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
$.fn.dropdown.Constructor = Dropdown
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
/* APPLY TO STANDARD DROPDOWN ELEMENTS
|
|
714
|
+
* =================================== */
|
|
715
|
+
|
|
716
|
+
$(function () {
|
|
717
|
+
$('html')
|
|
718
|
+
.on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
|
|
719
|
+
$('body')
|
|
720
|
+
.on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
|
|
721
|
+
.on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
|
|
722
|
+
.on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
|
|
723
|
+
})
|
|
724
|
+
|
|
725
|
+
}(window.jQuery);/* =========================================================
|
|
726
|
+
* bootstrap-modal.js v2.1.1
|
|
727
|
+
* http://twitter.github.com/bootstrap/javascript.html#modals
|
|
728
|
+
* =========================================================
|
|
729
|
+
* Copyright 2012 Twitter, Inc.
|
|
730
|
+
*
|
|
731
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
732
|
+
* you may not use this file except in compliance with the License.
|
|
733
|
+
* You may obtain a copy of the License at
|
|
734
|
+
*
|
|
735
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
736
|
+
*
|
|
737
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
738
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
739
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
740
|
+
* See the License for the specific language governing permissions and
|
|
741
|
+
* limitations under the License.
|
|
742
|
+
* ========================================================= */
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
!function ($) {
|
|
746
|
+
|
|
747
|
+
"use strict"; // jshint ;_;
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
/* MODAL CLASS DEFINITION
|
|
751
|
+
* ====================== */
|
|
752
|
+
|
|
753
|
+
var Modal = function (element, options) {
|
|
754
|
+
this.options = options
|
|
755
|
+
this.$element = $(element)
|
|
756
|
+
.delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
|
|
757
|
+
this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
Modal.prototype = {
|
|
761
|
+
|
|
762
|
+
constructor: Modal
|
|
763
|
+
|
|
764
|
+
, toggle: function () {
|
|
765
|
+
return this[!this.isShown ? 'show' : 'hide']()
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
, show: function () {
|
|
769
|
+
var that = this
|
|
770
|
+
, e = $.Event('show')
|
|
771
|
+
|
|
772
|
+
this.$element.trigger(e)
|
|
773
|
+
|
|
774
|
+
if (this.isShown || e.isDefaultPrevented()) return
|
|
775
|
+
|
|
776
|
+
$('body').addClass('modal-open')
|
|
777
|
+
|
|
778
|
+
this.isShown = true
|
|
779
|
+
|
|
780
|
+
this.escape()
|
|
781
|
+
|
|
782
|
+
this.backdrop(function () {
|
|
783
|
+
var transition = $.support.transition && that.$element.hasClass('fade')
|
|
784
|
+
|
|
785
|
+
if (!that.$element.parent().length) {
|
|
786
|
+
that.$element.appendTo(document.body) //don't move modals dom position
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
that.$element
|
|
790
|
+
.show()
|
|
791
|
+
|
|
792
|
+
if (transition) {
|
|
793
|
+
that.$element[0].offsetWidth // force reflow
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
that.$element
|
|
797
|
+
.addClass('in')
|
|
798
|
+
.attr('aria-hidden', false)
|
|
799
|
+
.focus()
|
|
800
|
+
|
|
801
|
+
that.enforceFocus()
|
|
802
|
+
|
|
803
|
+
transition ?
|
|
804
|
+
that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
|
|
805
|
+
that.$element.trigger('shown')
|
|
806
|
+
|
|
807
|
+
})
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
, hide: function (e) {
|
|
811
|
+
e && e.preventDefault()
|
|
812
|
+
|
|
813
|
+
var that = this
|
|
814
|
+
|
|
815
|
+
e = $.Event('hide')
|
|
816
|
+
|
|
817
|
+
this.$element.trigger(e)
|
|
818
|
+
|
|
819
|
+
if (!this.isShown || e.isDefaultPrevented()) return
|
|
820
|
+
|
|
821
|
+
this.isShown = false
|
|
822
|
+
|
|
823
|
+
$('body').removeClass('modal-open')
|
|
824
|
+
|
|
825
|
+
this.escape()
|
|
826
|
+
|
|
827
|
+
$(document).off('focusin.modal')
|
|
828
|
+
|
|
829
|
+
this.$element
|
|
830
|
+
.removeClass('in')
|
|
831
|
+
.attr('aria-hidden', true)
|
|
832
|
+
|
|
833
|
+
$.support.transition && this.$element.hasClass('fade') ?
|
|
834
|
+
this.hideWithTransition() :
|
|
835
|
+
this.hideModal()
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
, enforceFocus: function () {
|
|
839
|
+
var that = this
|
|
840
|
+
$(document).on('focusin.modal', function (e) {
|
|
841
|
+
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
|
|
842
|
+
that.$element.focus()
|
|
843
|
+
}
|
|
844
|
+
})
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
, escape: function () {
|
|
848
|
+
var that = this
|
|
849
|
+
if (this.isShown && this.options.keyboard) {
|
|
850
|
+
this.$element.on('keyup.dismiss.modal', function ( e ) {
|
|
851
|
+
e.which == 27 && that.hide()
|
|
852
|
+
})
|
|
853
|
+
} else if (!this.isShown) {
|
|
854
|
+
this.$element.off('keyup.dismiss.modal')
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
, hideWithTransition: function () {
|
|
859
|
+
var that = this
|
|
860
|
+
, timeout = setTimeout(function () {
|
|
861
|
+
that.$element.off($.support.transition.end)
|
|
862
|
+
that.hideModal()
|
|
863
|
+
}, 500)
|
|
864
|
+
|
|
865
|
+
this.$element.one($.support.transition.end, function () {
|
|
866
|
+
clearTimeout(timeout)
|
|
867
|
+
that.hideModal()
|
|
868
|
+
})
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
, hideModal: function (that) {
|
|
872
|
+
this.$element
|
|
873
|
+
.hide()
|
|
874
|
+
.trigger('hidden')
|
|
875
|
+
|
|
876
|
+
this.backdrop()
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
, removeBackdrop: function () {
|
|
880
|
+
this.$backdrop.remove()
|
|
881
|
+
this.$backdrop = null
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
, backdrop: function (callback) {
|
|
885
|
+
var that = this
|
|
886
|
+
, animate = this.$element.hasClass('fade') ? 'fade' : ''
|
|
887
|
+
|
|
888
|
+
if (this.isShown && this.options.backdrop) {
|
|
889
|
+
var doAnimate = $.support.transition && animate
|
|
890
|
+
|
|
891
|
+
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
|
|
892
|
+
.appendTo(document.body)
|
|
893
|
+
|
|
894
|
+
if (this.options.backdrop != 'static') {
|
|
895
|
+
this.$backdrop.click($.proxy(this.hide, this))
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
|
|
899
|
+
|
|
900
|
+
this.$backdrop.addClass('in')
|
|
901
|
+
|
|
902
|
+
doAnimate ?
|
|
903
|
+
this.$backdrop.one($.support.transition.end, callback) :
|
|
904
|
+
callback()
|
|
905
|
+
|
|
906
|
+
} else if (!this.isShown && this.$backdrop) {
|
|
907
|
+
this.$backdrop.removeClass('in')
|
|
908
|
+
|
|
909
|
+
$.support.transition && this.$element.hasClass('fade')?
|
|
910
|
+
this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
|
|
911
|
+
this.removeBackdrop()
|
|
912
|
+
|
|
913
|
+
} else if (callback) {
|
|
914
|
+
callback()
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
/* MODAL PLUGIN DEFINITION
|
|
921
|
+
* ======================= */
|
|
922
|
+
|
|
923
|
+
$.fn.modal = function (option) {
|
|
924
|
+
return this.each(function () {
|
|
925
|
+
var $this = $(this)
|
|
926
|
+
, data = $this.data('modal')
|
|
927
|
+
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
|
|
928
|
+
if (!data) $this.data('modal', (data = new Modal(this, options)))
|
|
929
|
+
if (typeof option == 'string') data[option]()
|
|
930
|
+
else if (options.show) data.show()
|
|
931
|
+
})
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
$.fn.modal.defaults = {
|
|
935
|
+
backdrop: true
|
|
936
|
+
, keyboard: true
|
|
937
|
+
, show: true
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
$.fn.modal.Constructor = Modal
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
/* MODAL DATA-API
|
|
944
|
+
* ============== */
|
|
945
|
+
|
|
946
|
+
$(function () {
|
|
947
|
+
$('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
|
|
948
|
+
var $this = $(this)
|
|
949
|
+
, href = $this.attr('href')
|
|
950
|
+
, $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
|
|
951
|
+
, option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
|
|
952
|
+
|
|
953
|
+
e.preventDefault()
|
|
954
|
+
|
|
955
|
+
$target
|
|
956
|
+
.modal(option)
|
|
957
|
+
.one('hide', function () {
|
|
958
|
+
$this.focus()
|
|
959
|
+
})
|
|
960
|
+
})
|
|
961
|
+
})
|
|
962
|
+
|
|
963
|
+
}(window.jQuery);/* ===========================================================
|
|
964
|
+
* bootstrap-tooltip.js v2.1.1
|
|
965
|
+
* http://twitter.github.com/bootstrap/javascript.html#tooltips
|
|
966
|
+
* Inspired by the original jQuery.tipsy by Jason Frame
|
|
967
|
+
* ===========================================================
|
|
968
|
+
* Copyright 2012 Twitter, Inc.
|
|
969
|
+
*
|
|
970
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
971
|
+
* you may not use this file except in compliance with the License.
|
|
972
|
+
* You may obtain a copy of the License at
|
|
973
|
+
*
|
|
974
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
975
|
+
*
|
|
976
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
977
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
978
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
979
|
+
* See the License for the specific language governing permissions and
|
|
980
|
+
* limitations under the License.
|
|
981
|
+
* ========================================================== */
|
|
982
|
+
|
|
983
|
+
|
|
984
|
+
!function ($) {
|
|
985
|
+
|
|
986
|
+
"use strict"; // jshint ;_;
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
/* TOOLTIP PUBLIC CLASS DEFINITION
|
|
990
|
+
* =============================== */
|
|
991
|
+
|
|
992
|
+
var Tooltip = function (element, options) {
|
|
993
|
+
this.init('tooltip', element, options)
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
Tooltip.prototype = {
|
|
997
|
+
|
|
998
|
+
constructor: Tooltip
|
|
999
|
+
|
|
1000
|
+
, init: function (type, element, options) {
|
|
1001
|
+
var eventIn
|
|
1002
|
+
, eventOut
|
|
1003
|
+
|
|
1004
|
+
this.type = type
|
|
1005
|
+
this.$element = $(element)
|
|
1006
|
+
this.options = this.getOptions(options)
|
|
1007
|
+
this.enabled = true
|
|
1008
|
+
|
|
1009
|
+
if (this.options.trigger == 'click') {
|
|
1010
|
+
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
|
|
1011
|
+
} else if (this.options.trigger != 'manual') {
|
|
1012
|
+
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
|
|
1013
|
+
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
|
|
1014
|
+
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
|
|
1015
|
+
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
this.options.selector ?
|
|
1019
|
+
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
|
|
1020
|
+
this.fixTitle()
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
, getOptions: function (options) {
|
|
1024
|
+
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
|
|
1025
|
+
|
|
1026
|
+
if (options.delay && typeof options.delay == 'number') {
|
|
1027
|
+
options.delay = {
|
|
1028
|
+
show: options.delay
|
|
1029
|
+
, hide: options.delay
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
return options
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
, enter: function (e) {
|
|
1037
|
+
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
|
|
1038
|
+
|
|
1039
|
+
if (!self.options.delay || !self.options.delay.show) return self.show()
|
|
1040
|
+
|
|
1041
|
+
clearTimeout(this.timeout)
|
|
1042
|
+
self.hoverState = 'in'
|
|
1043
|
+
this.timeout = setTimeout(function() {
|
|
1044
|
+
if (self.hoverState == 'in') self.show()
|
|
1045
|
+
}, self.options.delay.show)
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
, leave: function (e) {
|
|
1049
|
+
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
|
|
1050
|
+
|
|
1051
|
+
if (this.timeout) clearTimeout(this.timeout)
|
|
1052
|
+
if (!self.options.delay || !self.options.delay.hide) return self.hide()
|
|
1053
|
+
|
|
1054
|
+
self.hoverState = 'out'
|
|
1055
|
+
this.timeout = setTimeout(function() {
|
|
1056
|
+
if (self.hoverState == 'out') self.hide()
|
|
1057
|
+
}, self.options.delay.hide)
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
, show: function () {
|
|
1061
|
+
var $tip
|
|
1062
|
+
, inside
|
|
1063
|
+
, pos
|
|
1064
|
+
, actualWidth
|
|
1065
|
+
, actualHeight
|
|
1066
|
+
, placement
|
|
1067
|
+
, tp
|
|
1068
|
+
|
|
1069
|
+
if (this.hasContent() && this.enabled) {
|
|
1070
|
+
$tip = this.tip()
|
|
1071
|
+
this.setContent()
|
|
1072
|
+
|
|
1073
|
+
if (this.options.animation) {
|
|
1074
|
+
$tip.addClass('fade')
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
placement = typeof this.options.placement == 'function' ?
|
|
1078
|
+
this.options.placement.call(this, $tip[0], this.$element[0]) :
|
|
1079
|
+
this.options.placement
|
|
1080
|
+
|
|
1081
|
+
inside = /in/.test(placement)
|
|
1082
|
+
|
|
1083
|
+
$tip
|
|
1084
|
+
.remove()
|
|
1085
|
+
.css({ top: 0, left: 0, display: 'block' })
|
|
1086
|
+
.appendTo(inside ? this.$element : document.body)
|
|
1087
|
+
|
|
1088
|
+
pos = this.getPosition(inside)
|
|
1089
|
+
|
|
1090
|
+
actualWidth = $tip[0].offsetWidth
|
|
1091
|
+
actualHeight = $tip[0].offsetHeight
|
|
1092
|
+
|
|
1093
|
+
switch (inside ? placement.split(' ')[1] : placement) {
|
|
1094
|
+
case 'bottom':
|
|
1095
|
+
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
|
|
1096
|
+
break
|
|
1097
|
+
case 'top':
|
|
1098
|
+
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
|
|
1099
|
+
break
|
|
1100
|
+
case 'left':
|
|
1101
|
+
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
|
|
1102
|
+
break
|
|
1103
|
+
case 'right':
|
|
1104
|
+
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
|
|
1105
|
+
break
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
$tip
|
|
1109
|
+
.css(tp)
|
|
1110
|
+
.addClass(placement)
|
|
1111
|
+
.addClass('in')
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
, setContent: function () {
|
|
1116
|
+
var $tip = this.tip()
|
|
1117
|
+
, title = this.getTitle()
|
|
1118
|
+
|
|
1119
|
+
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
|
|
1120
|
+
$tip.removeClass('fade in top bottom left right')
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
, hide: function () {
|
|
1124
|
+
var that = this
|
|
1125
|
+
, $tip = this.tip()
|
|
1126
|
+
|
|
1127
|
+
$tip.removeClass('in')
|
|
1128
|
+
|
|
1129
|
+
function removeWithAnimation() {
|
|
1130
|
+
var timeout = setTimeout(function () {
|
|
1131
|
+
$tip.off($.support.transition.end).remove()
|
|
1132
|
+
}, 500)
|
|
1133
|
+
|
|
1134
|
+
$tip.one($.support.transition.end, function () {
|
|
1135
|
+
clearTimeout(timeout)
|
|
1136
|
+
$tip.remove()
|
|
1137
|
+
})
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
$.support.transition && this.$tip.hasClass('fade') ?
|
|
1141
|
+
removeWithAnimation() :
|
|
1142
|
+
$tip.remove()
|
|
1143
|
+
|
|
1144
|
+
return this
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
, fixTitle: function () {
|
|
1148
|
+
var $e = this.$element
|
|
1149
|
+
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
|
|
1150
|
+
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
, hasContent: function () {
|
|
1155
|
+
return this.getTitle()
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
, getPosition: function (inside) {
|
|
1159
|
+
return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
|
|
1160
|
+
width: this.$element[0].offsetWidth
|
|
1161
|
+
, height: this.$element[0].offsetHeight
|
|
1162
|
+
})
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
, getTitle: function () {
|
|
1166
|
+
var title
|
|
1167
|
+
, $e = this.$element
|
|
1168
|
+
, o = this.options
|
|
1169
|
+
|
|
1170
|
+
title = $e.attr('data-original-title')
|
|
1171
|
+
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
|
|
1172
|
+
|
|
1173
|
+
return title
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
, tip: function () {
|
|
1177
|
+
return this.$tip = this.$tip || $(this.options.template)
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
, validate: function () {
|
|
1181
|
+
if (!this.$element[0].parentNode) {
|
|
1182
|
+
this.hide()
|
|
1183
|
+
this.$element = null
|
|
1184
|
+
this.options = null
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
, enable: function () {
|
|
1189
|
+
this.enabled = true
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
, disable: function () {
|
|
1193
|
+
this.enabled = false
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
, toggleEnabled: function () {
|
|
1197
|
+
this.enabled = !this.enabled
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
, toggle: function () {
|
|
1201
|
+
this[this.tip().hasClass('in') ? 'hide' : 'show']()
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
, destroy: function () {
|
|
1205
|
+
this.hide().$element.off('.' + this.type).removeData(this.type)
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
/* TOOLTIP PLUGIN DEFINITION
|
|
1212
|
+
* ========================= */
|
|
1213
|
+
|
|
1214
|
+
$.fn.tooltip = function ( option ) {
|
|
1215
|
+
return this.each(function () {
|
|
1216
|
+
var $this = $(this)
|
|
1217
|
+
, data = $this.data('tooltip')
|
|
1218
|
+
, options = typeof option == 'object' && option
|
|
1219
|
+
if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
|
|
1220
|
+
if (typeof option == 'string') data[option]()
|
|
1221
|
+
})
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
$.fn.tooltip.Constructor = Tooltip
|
|
1225
|
+
|
|
1226
|
+
$.fn.tooltip.defaults = {
|
|
1227
|
+
animation: true
|
|
1228
|
+
, placement: 'top'
|
|
1229
|
+
, selector: false
|
|
1230
|
+
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
|
|
1231
|
+
, trigger: 'hover'
|
|
1232
|
+
, title: ''
|
|
1233
|
+
, delay: 0
|
|
1234
|
+
, html: true
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
}(window.jQuery);
|
|
1238
|
+
/* ===========================================================
|
|
1239
|
+
* bootstrap-popover.js v2.1.1
|
|
1240
|
+
* http://twitter.github.com/bootstrap/javascript.html#popovers
|
|
1241
|
+
* ===========================================================
|
|
1242
|
+
* Copyright 2012 Twitter, Inc.
|
|
1243
|
+
*
|
|
1244
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1245
|
+
* you may not use this file except in compliance with the License.
|
|
1246
|
+
* You may obtain a copy of the License at
|
|
1247
|
+
*
|
|
1248
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1249
|
+
*
|
|
1250
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1251
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1252
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1253
|
+
* See the License for the specific language governing permissions and
|
|
1254
|
+
* limitations under the License.
|
|
1255
|
+
* =========================================================== */
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
!function ($) {
|
|
1259
|
+
|
|
1260
|
+
"use strict"; // jshint ;_;
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
/* POPOVER PUBLIC CLASS DEFINITION
|
|
1264
|
+
* =============================== */
|
|
1265
|
+
|
|
1266
|
+
var Popover = function (element, options) {
|
|
1267
|
+
this.init('popover', element, options)
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
|
|
1272
|
+
========================================== */
|
|
1273
|
+
|
|
1274
|
+
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
|
|
1275
|
+
|
|
1276
|
+
constructor: Popover
|
|
1277
|
+
|
|
1278
|
+
, setContent: function () {
|
|
1279
|
+
var $tip = this.tip()
|
|
1280
|
+
, title = this.getTitle()
|
|
1281
|
+
, content = this.getContent()
|
|
1282
|
+
|
|
1283
|
+
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
|
|
1284
|
+
$tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
|
|
1285
|
+
|
|
1286
|
+
$tip.removeClass('fade top bottom left right in')
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
, hasContent: function () {
|
|
1290
|
+
return this.getTitle() || this.getContent()
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
, getContent: function () {
|
|
1294
|
+
var content
|
|
1295
|
+
, $e = this.$element
|
|
1296
|
+
, o = this.options
|
|
1297
|
+
|
|
1298
|
+
content = $e.attr('data-content')
|
|
1299
|
+
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
|
|
1300
|
+
|
|
1301
|
+
return content
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
, tip: function () {
|
|
1305
|
+
if (!this.$tip) {
|
|
1306
|
+
this.$tip = $(this.options.template)
|
|
1307
|
+
}
|
|
1308
|
+
return this.$tip
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
, destroy: function () {
|
|
1312
|
+
this.hide().$element.off('.' + this.type).removeData(this.type)
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
})
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
/* POPOVER PLUGIN DEFINITION
|
|
1319
|
+
* ======================= */
|
|
1320
|
+
|
|
1321
|
+
$.fn.popover = function (option) {
|
|
1322
|
+
return this.each(function () {
|
|
1323
|
+
var $this = $(this)
|
|
1324
|
+
, data = $this.data('popover')
|
|
1325
|
+
, options = typeof option == 'object' && option
|
|
1326
|
+
if (!data) $this.data('popover', (data = new Popover(this, options)))
|
|
1327
|
+
if (typeof option == 'string') data[option]()
|
|
1328
|
+
})
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
$.fn.popover.Constructor = Popover
|
|
1332
|
+
|
|
1333
|
+
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
|
|
1334
|
+
placement: 'right'
|
|
1335
|
+
, trigger: 'click'
|
|
1336
|
+
, content: ''
|
|
1337
|
+
, template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
|
|
1338
|
+
})
|
|
1339
|
+
|
|
1340
|
+
}(window.jQuery);/* =============================================================
|
|
1341
|
+
* bootstrap-scrollspy.js v2.1.1
|
|
1342
|
+
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
|
|
1343
|
+
* =============================================================
|
|
1344
|
+
* Copyright 2012 Twitter, Inc.
|
|
1345
|
+
*
|
|
1346
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1347
|
+
* you may not use this file except in compliance with the License.
|
|
1348
|
+
* You may obtain a copy of the License at
|
|
1349
|
+
*
|
|
1350
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1351
|
+
*
|
|
1352
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1353
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1354
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1355
|
+
* See the License for the specific language governing permissions and
|
|
1356
|
+
* limitations under the License.
|
|
1357
|
+
* ============================================================== */
|
|
1358
|
+
|
|
1359
|
+
|
|
1360
|
+
!function ($) {
|
|
1361
|
+
|
|
1362
|
+
"use strict"; // jshint ;_;
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
/* SCROLLSPY CLASS DEFINITION
|
|
1366
|
+
* ========================== */
|
|
1367
|
+
|
|
1368
|
+
function ScrollSpy(element, options) {
|
|
1369
|
+
var process = $.proxy(this.process, this)
|
|
1370
|
+
, $element = $(element).is('body') ? $(window) : $(element)
|
|
1371
|
+
, href
|
|
1372
|
+
this.options = $.extend({}, $.fn.scrollspy.defaults, options)
|
|
1373
|
+
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
|
|
1374
|
+
this.selector = (this.options.target
|
|
1375
|
+
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|
|
1376
|
+
|| '') + ' .nav li > a'
|
|
1377
|
+
this.$body = $('body')
|
|
1378
|
+
this.refresh()
|
|
1379
|
+
this.process()
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
ScrollSpy.prototype = {
|
|
1383
|
+
|
|
1384
|
+
constructor: ScrollSpy
|
|
1385
|
+
|
|
1386
|
+
, refresh: function () {
|
|
1387
|
+
var self = this
|
|
1388
|
+
, $targets
|
|
1389
|
+
|
|
1390
|
+
this.offsets = $([])
|
|
1391
|
+
this.targets = $([])
|
|
1392
|
+
|
|
1393
|
+
$targets = this.$body
|
|
1394
|
+
.find(this.selector)
|
|
1395
|
+
.map(function () {
|
|
1396
|
+
var $el = $(this)
|
|
1397
|
+
, href = $el.data('target') || $el.attr('href')
|
|
1398
|
+
, $href = /^#\w/.test(href) && $(href)
|
|
1399
|
+
return ( $href
|
|
1400
|
+
&& $href.length
|
|
1401
|
+
&& [[ $href.position().top, href ]] ) || null
|
|
1402
|
+
})
|
|
1403
|
+
.sort(function (a, b) { return a[0] - b[0] })
|
|
1404
|
+
.each(function () {
|
|
1405
|
+
self.offsets.push(this[0])
|
|
1406
|
+
self.targets.push(this[1])
|
|
1407
|
+
})
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
, process: function () {
|
|
1411
|
+
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
|
|
1412
|
+
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
|
|
1413
|
+
, maxScroll = scrollHeight - this.$scrollElement.height()
|
|
1414
|
+
, offsets = this.offsets
|
|
1415
|
+
, targets = this.targets
|
|
1416
|
+
, activeTarget = this.activeTarget
|
|
1417
|
+
, i
|
|
1418
|
+
|
|
1419
|
+
if (scrollTop >= maxScroll) {
|
|
1420
|
+
return activeTarget != (i = targets.last()[0])
|
|
1421
|
+
&& this.activate ( i )
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
for (i = offsets.length; i--;) {
|
|
1425
|
+
activeTarget != targets[i]
|
|
1426
|
+
&& scrollTop >= offsets[i]
|
|
1427
|
+
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
|
|
1428
|
+
&& this.activate( targets[i] )
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
, activate: function (target) {
|
|
1433
|
+
var active
|
|
1434
|
+
, selector
|
|
1435
|
+
|
|
1436
|
+
this.activeTarget = target
|
|
1437
|
+
|
|
1438
|
+
$(this.selector)
|
|
1439
|
+
.parent('.active')
|
|
1440
|
+
.removeClass('active')
|
|
1441
|
+
|
|
1442
|
+
selector = this.selector
|
|
1443
|
+
+ '[data-target="' + target + '"],'
|
|
1444
|
+
+ this.selector + '[href="' + target + '"]'
|
|
1445
|
+
|
|
1446
|
+
active = $(selector)
|
|
1447
|
+
.parent('li')
|
|
1448
|
+
.addClass('active')
|
|
1449
|
+
|
|
1450
|
+
if (active.parent('.dropdown-menu').length) {
|
|
1451
|
+
active = active.closest('li.dropdown').addClass('active')
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
active.trigger('activate')
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
/* SCROLLSPY PLUGIN DEFINITION
|
|
1461
|
+
* =========================== */
|
|
1462
|
+
|
|
1463
|
+
$.fn.scrollspy = function (option) {
|
|
1464
|
+
return this.each(function () {
|
|
1465
|
+
var $this = $(this)
|
|
1466
|
+
, data = $this.data('scrollspy')
|
|
1467
|
+
, options = typeof option == 'object' && option
|
|
1468
|
+
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
|
|
1469
|
+
if (typeof option == 'string') data[option]()
|
|
1470
|
+
})
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
$.fn.scrollspy.Constructor = ScrollSpy
|
|
1474
|
+
|
|
1475
|
+
$.fn.scrollspy.defaults = {
|
|
1476
|
+
offset: 10
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
/* SCROLLSPY DATA-API
|
|
1481
|
+
* ================== */
|
|
1482
|
+
|
|
1483
|
+
$(window).on('load', function () {
|
|
1484
|
+
$('[data-spy="scroll"]').each(function () {
|
|
1485
|
+
var $spy = $(this)
|
|
1486
|
+
$spy.scrollspy($spy.data())
|
|
1487
|
+
})
|
|
1488
|
+
})
|
|
1489
|
+
|
|
1490
|
+
}(window.jQuery);/* ========================================================
|
|
1491
|
+
* bootstrap-tab.js v2.1.1
|
|
1492
|
+
* http://twitter.github.com/bootstrap/javascript.html#tabs
|
|
1493
|
+
* ========================================================
|
|
1494
|
+
* Copyright 2012 Twitter, Inc.
|
|
1495
|
+
*
|
|
1496
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1497
|
+
* you may not use this file except in compliance with the License.
|
|
1498
|
+
* You may obtain a copy of the License at
|
|
1499
|
+
*
|
|
1500
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1501
|
+
*
|
|
1502
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1503
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1504
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1505
|
+
* See the License for the specific language governing permissions and
|
|
1506
|
+
* limitations under the License.
|
|
1507
|
+
* ======================================================== */
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
!function ($) {
|
|
1511
|
+
|
|
1512
|
+
"use strict"; // jshint ;_;
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
/* TAB CLASS DEFINITION
|
|
1516
|
+
* ==================== */
|
|
1517
|
+
|
|
1518
|
+
var Tab = function (element) {
|
|
1519
|
+
this.element = $(element)
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
Tab.prototype = {
|
|
1523
|
+
|
|
1524
|
+
constructor: Tab
|
|
1525
|
+
|
|
1526
|
+
, show: function () {
|
|
1527
|
+
var $this = this.element
|
|
1528
|
+
, $ul = $this.closest('ul:not(.dropdown-menu)')
|
|
1529
|
+
, selector = $this.attr('data-target')
|
|
1530
|
+
, previous
|
|
1531
|
+
, $target
|
|
1532
|
+
, e
|
|
1533
|
+
|
|
1534
|
+
if (!selector) {
|
|
1535
|
+
selector = $this.attr('href')
|
|
1536
|
+
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
if ( $this.parent('li').hasClass('active') ) return
|
|
1540
|
+
|
|
1541
|
+
previous = $ul.find('.active a').last()[0]
|
|
1542
|
+
|
|
1543
|
+
e = $.Event('show', {
|
|
1544
|
+
relatedTarget: previous
|
|
1545
|
+
})
|
|
1546
|
+
|
|
1547
|
+
$this.trigger(e)
|
|
1548
|
+
|
|
1549
|
+
if (e.isDefaultPrevented()) return
|
|
1550
|
+
|
|
1551
|
+
$target = $(selector)
|
|
1552
|
+
|
|
1553
|
+
this.activate($this.parent('li'), $ul)
|
|
1554
|
+
this.activate($target, $target.parent(), function () {
|
|
1555
|
+
$this.trigger({
|
|
1556
|
+
type: 'shown'
|
|
1557
|
+
, relatedTarget: previous
|
|
1558
|
+
})
|
|
1559
|
+
})
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
, activate: function ( element, container, callback) {
|
|
1563
|
+
var $active = container.find('> .active')
|
|
1564
|
+
, transition = callback
|
|
1565
|
+
&& $.support.transition
|
|
1566
|
+
&& $active.hasClass('fade')
|
|
1567
|
+
|
|
1568
|
+
function next() {
|
|
1569
|
+
$active
|
|
1570
|
+
.removeClass('active')
|
|
1571
|
+
.find('> .dropdown-menu > .active')
|
|
1572
|
+
.removeClass('active')
|
|
1573
|
+
|
|
1574
|
+
element.addClass('active')
|
|
1575
|
+
|
|
1576
|
+
if (transition) {
|
|
1577
|
+
element[0].offsetWidth // reflow for transition
|
|
1578
|
+
element.addClass('in')
|
|
1579
|
+
} else {
|
|
1580
|
+
element.removeClass('fade')
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
if ( element.parent('.dropdown-menu') ) {
|
|
1584
|
+
element.closest('li.dropdown').addClass('active')
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
callback && callback()
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
transition ?
|
|
1591
|
+
$active.one($.support.transition.end, next) :
|
|
1592
|
+
next()
|
|
1593
|
+
|
|
1594
|
+
$active.removeClass('in')
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
/* TAB PLUGIN DEFINITION
|
|
1600
|
+
* ===================== */
|
|
1601
|
+
|
|
1602
|
+
$.fn.tab = function ( option ) {
|
|
1603
|
+
return this.each(function () {
|
|
1604
|
+
var $this = $(this)
|
|
1605
|
+
, data = $this.data('tab')
|
|
1606
|
+
if (!data) $this.data('tab', (data = new Tab(this)))
|
|
1607
|
+
if (typeof option == 'string') data[option]()
|
|
1608
|
+
})
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
$.fn.tab.Constructor = Tab
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
/* TAB DATA-API
|
|
1615
|
+
* ============ */
|
|
1616
|
+
|
|
1617
|
+
$(function () {
|
|
1618
|
+
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
|
|
1619
|
+
e.preventDefault()
|
|
1620
|
+
$(this).tab('show')
|
|
1621
|
+
})
|
|
1622
|
+
})
|
|
1623
|
+
|
|
1624
|
+
}(window.jQuery);/* =============================================================
|
|
1625
|
+
* bootstrap-typeahead.js v2.1.1
|
|
1626
|
+
* http://twitter.github.com/bootstrap/javascript.html#typeahead
|
|
1627
|
+
* =============================================================
|
|
1628
|
+
* Copyright 2012 Twitter, Inc.
|
|
1629
|
+
*
|
|
1630
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1631
|
+
* you may not use this file except in compliance with the License.
|
|
1632
|
+
* You may obtain a copy of the License at
|
|
1633
|
+
*
|
|
1634
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1635
|
+
*
|
|
1636
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1637
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1638
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1639
|
+
* See the License for the specific language governing permissions and
|
|
1640
|
+
* limitations under the License.
|
|
1641
|
+
* ============================================================ */
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
!function($){
|
|
1645
|
+
|
|
1646
|
+
"use strict"; // jshint ;_;
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
/* TYPEAHEAD PUBLIC CLASS DEFINITION
|
|
1650
|
+
* ================================= */
|
|
1651
|
+
|
|
1652
|
+
var Typeahead = function (element, options) {
|
|
1653
|
+
this.$element = $(element)
|
|
1654
|
+
this.options = $.extend({}, $.fn.typeahead.defaults, options)
|
|
1655
|
+
this.matcher = this.options.matcher || this.matcher
|
|
1656
|
+
this.sorter = this.options.sorter || this.sorter
|
|
1657
|
+
this.highlighter = this.options.highlighter || this.highlighter
|
|
1658
|
+
this.updater = this.options.updater || this.updater
|
|
1659
|
+
this.$menu = $(this.options.menu).appendTo('body')
|
|
1660
|
+
this.source = this.options.source
|
|
1661
|
+
this.shown = false
|
|
1662
|
+
this.listen()
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
Typeahead.prototype = {
|
|
1666
|
+
|
|
1667
|
+
constructor: Typeahead
|
|
1668
|
+
|
|
1669
|
+
, select: function () {
|
|
1670
|
+
var val = this.$menu.find('.active').attr('data-value')
|
|
1671
|
+
this.$element
|
|
1672
|
+
.val(this.updater(val))
|
|
1673
|
+
.change()
|
|
1674
|
+
return this.hide()
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
, updater: function (item) {
|
|
1678
|
+
return item
|
|
1679
|
+
}
|
|
1680
|
+
|
|
1681
|
+
, show: function () {
|
|
1682
|
+
var pos = $.extend({}, this.$element.offset(), {
|
|
1683
|
+
height: this.$element[0].offsetHeight
|
|
1684
|
+
})
|
|
1685
|
+
|
|
1686
|
+
this.$menu.css({
|
|
1687
|
+
top: pos.top + pos.height
|
|
1688
|
+
, left: pos.left
|
|
1689
|
+
})
|
|
1690
|
+
|
|
1691
|
+
this.$menu.show()
|
|
1692
|
+
this.shown = true
|
|
1693
|
+
return this
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
, hide: function () {
|
|
1697
|
+
this.$menu.hide()
|
|
1698
|
+
this.shown = false
|
|
1699
|
+
return this
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
, lookup: function (event) {
|
|
1703
|
+
var items
|
|
1704
|
+
|
|
1705
|
+
this.query = this.$element.val()
|
|
1706
|
+
|
|
1707
|
+
if (!this.query || this.query.length < this.options.minLength) {
|
|
1708
|
+
return this.shown ? this.hide() : this
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
|
|
1712
|
+
|
|
1713
|
+
return items ? this.process(items) : this
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
, process: function (items) {
|
|
1717
|
+
var that = this
|
|
1718
|
+
|
|
1719
|
+
items = $.grep(items, function (item) {
|
|
1720
|
+
return that.matcher(item)
|
|
1721
|
+
})
|
|
1722
|
+
|
|
1723
|
+
items = this.sorter(items)
|
|
1724
|
+
|
|
1725
|
+
if (!items.length) {
|
|
1726
|
+
return this.shown ? this.hide() : this
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
return this.render(items.slice(0, this.options.items)).show()
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
, matcher: function (item) {
|
|
1733
|
+
return ~item.toLowerCase().indexOf(this.query.toLowerCase())
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1736
|
+
, sorter: function (items) {
|
|
1737
|
+
var beginswith = []
|
|
1738
|
+
, caseSensitive = []
|
|
1739
|
+
, caseInsensitive = []
|
|
1740
|
+
, item
|
|
1741
|
+
|
|
1742
|
+
while (item = items.shift()) {
|
|
1743
|
+
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
|
|
1744
|
+
else if (~item.indexOf(this.query)) caseSensitive.push(item)
|
|
1745
|
+
else caseInsensitive.push(item)
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
return beginswith.concat(caseSensitive, caseInsensitive)
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
, highlighter: function (item) {
|
|
1752
|
+
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
|
|
1753
|
+
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
|
|
1754
|
+
return '<strong>' + match + '</strong>'
|
|
1755
|
+
})
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
, render: function (items) {
|
|
1759
|
+
var that = this
|
|
1760
|
+
|
|
1761
|
+
items = $(items).map(function (i, item) {
|
|
1762
|
+
i = $(that.options.item).attr('data-value', item)
|
|
1763
|
+
i.find('a').html(that.highlighter(item))
|
|
1764
|
+
return i[0]
|
|
1765
|
+
})
|
|
1766
|
+
|
|
1767
|
+
items.first().addClass('active')
|
|
1768
|
+
this.$menu.html(items)
|
|
1769
|
+
return this
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
, next: function (event) {
|
|
1773
|
+
var active = this.$menu.find('.active').removeClass('active')
|
|
1774
|
+
, next = active.next()
|
|
1775
|
+
|
|
1776
|
+
if (!next.length) {
|
|
1777
|
+
next = $(this.$menu.find('li')[0])
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
next.addClass('active')
|
|
1781
|
+
}
|
|
1782
|
+
|
|
1783
|
+
, prev: function (event) {
|
|
1784
|
+
var active = this.$menu.find('.active').removeClass('active')
|
|
1785
|
+
, prev = active.prev()
|
|
1786
|
+
|
|
1787
|
+
if (!prev.length) {
|
|
1788
|
+
prev = this.$menu.find('li').last()
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
prev.addClass('active')
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
, listen: function () {
|
|
1795
|
+
this.$element
|
|
1796
|
+
.on('blur', $.proxy(this.blur, this))
|
|
1797
|
+
.on('keypress', $.proxy(this.keypress, this))
|
|
1798
|
+
.on('keyup', $.proxy(this.keyup, this))
|
|
1799
|
+
|
|
1800
|
+
if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
|
|
1801
|
+
this.$element.on('keydown', $.proxy(this.keydown, this))
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1804
|
+
this.$menu
|
|
1805
|
+
.on('click', $.proxy(this.click, this))
|
|
1806
|
+
.on('mouseenter', 'li', $.proxy(this.mouseenter, this))
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1809
|
+
, move: function (e) {
|
|
1810
|
+
if (!this.shown) return
|
|
1811
|
+
|
|
1812
|
+
switch(e.keyCode) {
|
|
1813
|
+
case 9: // tab
|
|
1814
|
+
case 13: // enter
|
|
1815
|
+
case 27: // escape
|
|
1816
|
+
e.preventDefault()
|
|
1817
|
+
break
|
|
1818
|
+
|
|
1819
|
+
case 38: // up arrow
|
|
1820
|
+
e.preventDefault()
|
|
1821
|
+
this.prev()
|
|
1822
|
+
break
|
|
1823
|
+
|
|
1824
|
+
case 40: // down arrow
|
|
1825
|
+
e.preventDefault()
|
|
1826
|
+
this.next()
|
|
1827
|
+
break
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1830
|
+
e.stopPropagation()
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
, keydown: function (e) {
|
|
1834
|
+
this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
|
|
1835
|
+
this.move(e)
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
, keypress: function (e) {
|
|
1839
|
+
if (this.suppressKeyPressRepeat) return
|
|
1840
|
+
this.move(e)
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
, keyup: function (e) {
|
|
1844
|
+
switch(e.keyCode) {
|
|
1845
|
+
case 40: // down arrow
|
|
1846
|
+
case 38: // up arrow
|
|
1847
|
+
break
|
|
1848
|
+
|
|
1849
|
+
case 9: // tab
|
|
1850
|
+
case 13: // enter
|
|
1851
|
+
if (!this.shown) return
|
|
1852
|
+
this.select()
|
|
1853
|
+
break
|
|
1854
|
+
|
|
1855
|
+
case 27: // escape
|
|
1856
|
+
if (!this.shown) return
|
|
1857
|
+
this.hide()
|
|
1858
|
+
break
|
|
1859
|
+
|
|
1860
|
+
default:
|
|
1861
|
+
this.lookup()
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1864
|
+
e.stopPropagation()
|
|
1865
|
+
e.preventDefault()
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
, blur: function (e) {
|
|
1869
|
+
var that = this
|
|
1870
|
+
setTimeout(function () { that.hide() }, 150)
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1873
|
+
, click: function (e) {
|
|
1874
|
+
e.stopPropagation()
|
|
1875
|
+
e.preventDefault()
|
|
1876
|
+
this.select()
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
, mouseenter: function (e) {
|
|
1880
|
+
this.$menu.find('.active').removeClass('active')
|
|
1881
|
+
$(e.currentTarget).addClass('active')
|
|
1882
|
+
}
|
|
1883
|
+
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1886
|
+
|
|
1887
|
+
/* TYPEAHEAD PLUGIN DEFINITION
|
|
1888
|
+
* =========================== */
|
|
1889
|
+
|
|
1890
|
+
$.fn.typeahead = function (option) {
|
|
1891
|
+
return this.each(function () {
|
|
1892
|
+
var $this = $(this)
|
|
1893
|
+
, data = $this.data('typeahead')
|
|
1894
|
+
, options = typeof option == 'object' && option
|
|
1895
|
+
if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
|
|
1896
|
+
if (typeof option == 'string') data[option]()
|
|
1897
|
+
})
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
$.fn.typeahead.defaults = {
|
|
1901
|
+
source: []
|
|
1902
|
+
, items: 8
|
|
1903
|
+
, menu: '<ul class="typeahead dropdown-menu"></ul>'
|
|
1904
|
+
, item: '<li><a href="#"></a></li>'
|
|
1905
|
+
, minLength: 1
|
|
1906
|
+
}
|
|
1907
|
+
|
|
1908
|
+
$.fn.typeahead.Constructor = Typeahead
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
/* TYPEAHEAD DATA-API
|
|
1912
|
+
* ================== */
|
|
1913
|
+
|
|
1914
|
+
$(function () {
|
|
1915
|
+
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
|
|
1916
|
+
var $this = $(this)
|
|
1917
|
+
if ($this.data('typeahead')) return
|
|
1918
|
+
e.preventDefault()
|
|
1919
|
+
$this.typeahead($this.data())
|
|
1920
|
+
})
|
|
1921
|
+
})
|
|
1922
|
+
|
|
1923
|
+
}(window.jQuery);
|
|
1924
|
+
/* ==========================================================
|
|
1925
|
+
* bootstrap-affix.js v2.1.1
|
|
1926
|
+
* http://twitter.github.com/bootstrap/javascript.html#affix
|
|
1927
|
+
* ==========================================================
|
|
1928
|
+
* Copyright 2012 Twitter, Inc.
|
|
1929
|
+
*
|
|
1930
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
1931
|
+
* you may not use this file except in compliance with the License.
|
|
1932
|
+
* You may obtain a copy of the License at
|
|
1933
|
+
*
|
|
1934
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
1935
|
+
*
|
|
1936
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
1937
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
1938
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1939
|
+
* See the License for the specific language governing permissions and
|
|
1940
|
+
* limitations under the License.
|
|
1941
|
+
* ========================================================== */
|
|
1942
|
+
|
|
1943
|
+
|
|
1944
|
+
!function ($) {
|
|
1945
|
+
|
|
1946
|
+
"use strict"; // jshint ;_;
|
|
1947
|
+
|
|
1948
|
+
|
|
1949
|
+
/* AFFIX CLASS DEFINITION
|
|
1950
|
+
* ====================== */
|
|
1951
|
+
|
|
1952
|
+
var Affix = function (element, options) {
|
|
1953
|
+
this.options = $.extend({}, $.fn.affix.defaults, options)
|
|
1954
|
+
this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
|
|
1955
|
+
this.$element = $(element)
|
|
1956
|
+
this.checkPosition()
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
Affix.prototype.checkPosition = function () {
|
|
1960
|
+
if (!this.$element.is(':visible')) return
|
|
1961
|
+
|
|
1962
|
+
var scrollHeight = $(document).height()
|
|
1963
|
+
, scrollTop = this.$window.scrollTop()
|
|
1964
|
+
, position = this.$element.offset()
|
|
1965
|
+
, offset = this.options.offset
|
|
1966
|
+
, offsetBottom = offset.bottom
|
|
1967
|
+
, offsetTop = offset.top
|
|
1968
|
+
, reset = 'affix affix-top affix-bottom'
|
|
1969
|
+
, affix
|
|
1970
|
+
|
|
1971
|
+
if (typeof offset != 'object') offsetBottom = offsetTop = offset
|
|
1972
|
+
if (typeof offsetTop == 'function') offsetTop = offset.top()
|
|
1973
|
+
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
|
|
1974
|
+
|
|
1975
|
+
affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
|
|
1976
|
+
false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
|
|
1977
|
+
'bottom' : offsetTop != null && scrollTop <= offsetTop ?
|
|
1978
|
+
'top' : false
|
|
1979
|
+
|
|
1980
|
+
if (this.affixed === affix) return
|
|
1981
|
+
|
|
1982
|
+
this.affixed = affix
|
|
1983
|
+
this.unpin = affix == 'bottom' ? position.top - scrollTop : null
|
|
1984
|
+
|
|
1985
|
+
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
|
|
1986
|
+
}
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
/* AFFIX PLUGIN DEFINITION
|
|
1990
|
+
* ======================= */
|
|
1991
|
+
|
|
1992
|
+
$.fn.affix = function (option) {
|
|
1993
|
+
return this.each(function () {
|
|
1994
|
+
var $this = $(this)
|
|
1995
|
+
, data = $this.data('affix')
|
|
1996
|
+
, options = typeof option == 'object' && option
|
|
1997
|
+
if (!data) $this.data('affix', (data = new Affix(this, options)))
|
|
1998
|
+
if (typeof option == 'string') data[option]()
|
|
1999
|
+
})
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
$.fn.affix.Constructor = Affix
|
|
2003
|
+
|
|
2004
|
+
$.fn.affix.defaults = {
|
|
2005
|
+
offset: 0
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
|
|
2009
|
+
/* AFFIX DATA-API
|
|
2010
|
+
* ============== */
|
|
2011
|
+
|
|
2012
|
+
$(window).on('load', function () {
|
|
2013
|
+
$('[data-spy="affix"]').each(function () {
|
|
2014
|
+
var $spy = $(this)
|
|
2015
|
+
, data = $spy.data()
|
|
2016
|
+
|
|
2017
|
+
data.offset = data.offset || {}
|
|
2018
|
+
|
|
2019
|
+
data.offsetBottom && (data.offset.bottom = data.offsetBottom)
|
|
2020
|
+
data.offsetTop && (data.offset.top = data.offsetTop)
|
|
2021
|
+
|
|
2022
|
+
$spy.affix(data)
|
|
2023
|
+
})
|
|
2024
|
+
})
|
|
2025
|
+
|
|
2026
|
+
|
|
2027
|
+
}(window.jQuery);
|